From 1a206aa1e751196d25915793a2876f2129d08c87 Mon Sep 17 00:00:00 2001 From: Keen Wilson <40321520+keenwilson@users.noreply.github.com> Date: Wed, 14 Jan 2026 10:45:21 -0800 Subject: [PATCH 01/51] fix(auth): improve CLI update flow when login with console session credentials (#8500) ## Problem AWS CLI update process enters an infinite retry loop when outdated CLI is detected (exit code 252), causing continuous failed authentication attempts and poor user experience. ## Solution #### CLI update loop - affects users with outdated CLI - Remove automatic retry loop for AWS CLI updates to prevent infinite recursion - Show warning message when CLI update is attempted, requiring retry - Remove try-catch wrapper: it was swallowing errors and allowing profile activation to proceed despite failed CLI execution, causing invalid credential state 1-need-update 2-run-installer 3-install-successful 4-warning-to-retry #### Testing: - Tested AWS CLI update scenario (exit code 252) with single update attempt and manual retry - Confirmed no infinite loops during installation --- - Treat all work as PUBLIC. Private `feature/x` branches will not be squash-merged at release time. - Your code changes must meet the guidelines in [CONTRIBUTING.md](https://github.com/aws/aws-toolkit-vscode/blob/master/CONTRIBUTING.md#guidelines). - License: I confirm that my contribution is made under the terms of the Apache 2.0 license. --------- Co-authored-by: aws-toolkit-automation <43144436+aws-toolkit-automation@users.noreply.github.com> --- packages/core/src/auth/consoleSessionUtils.ts | 318 +++++++++--------- .../core/src/shared/utilities/cliUtils.ts | 6 +- ...-94b6c83c-8f06-408f-be4a-be7de59ce0df.json | 4 + 3 files changed, 157 insertions(+), 171 deletions(-) create mode 100644 packages/toolkit/.changes/next-release/Bug Fix-94b6c83c-8f06-408f-be4a-be7de59ce0df.json diff --git a/packages/core/src/auth/consoleSessionUtils.ts b/packages/core/src/auth/consoleSessionUtils.ts index e21772b4535..fcda5de6a12 100644 --- a/packages/core/src/auth/consoleSessionUtils.ts +++ b/packages/core/src/auth/consoleSessionUtils.ts @@ -107,191 +107,176 @@ export async function authenticateWithConsoleLogin(profileName?: string, region? } // Execute login with console credentials command - try { - // At this point, profileName and region are guaranteed to be defined - if (!profileName || !region) { - throw new ToolkitError('Profile name and region are required') - } + // At this point, profileName and region are guaranteed to be defined + if (!profileName || !region) { + throw new ToolkitError('Profile name and region are required') + } - logger.info( - `Executing login with console credentials command for profile: ${profileName}, region: ${region}` - ) + logger.info(`Executing login with console credentials command for profile: ${profileName}, region: ${region}`) - const commandArgs = ['login', '--profile', profileName, '--region', region] + const commandArgs = ['login', '--profile', profileName, '--region', region] - // Track if we've shown the URL dialog and if user cancelled - let urlShown = false - let loginUrl: string | undefined - let userCancelled = false + // Track if we've shown the URL dialog and if user cancelled + let urlShown = false + let loginUrl: string | undefined + let userCancelled = false - let loginProcess: ChildProcess | undefined + let loginProcess: ChildProcess | undefined - // Start the process and handle output with cancellation support - const result = await vscode.window.withProgress( - { - location: vscode.ProgressLocation.Notification, - title: localize('AWS.message.progress.consoleLogin', 'Login with console credentials'), - cancellable: true, - }, - async (progress, token) => { - progress.report({ - message: localize( - 'AWS.message.progress.waitingForBrowser', - 'Waiting for browser authentication...' - ), - }) + // Start the process and handle output with cancellation support + const result = await vscode.window.withProgress( + { + location: vscode.ProgressLocation.Notification, + title: localize('AWS.message.progress.consoleLogin', 'Login with console credentials'), + cancellable: true, + }, + async (progress, token) => { + progress.report({ + message: localize( + 'AWS.message.progress.waitingForBrowser', + 'Waiting for browser authentication...' + ), + }) - loginProcess = new ChildProcess(awsCliPath, commandArgs, { - collect: true, - rejectOnErrorCode: false, - onStdout: (text: string) => { - // Enhance the UX by showing AWS Sign-in service (signin.aws.amazon.com) URL in VS Code when we detect it. - const urlMatch = text.match(/(https:\/\/[^\s]+signin\.aws\.amazon\.com[^\s]+)/i) - if (urlMatch && !urlShown) { - loginUrl = urlMatch[1] - urlShown = true + loginProcess = new ChildProcess(awsCliPath, commandArgs, { + collect: true, + rejectOnErrorCode: false, + onStdout: (text: string) => { + // Enhance the UX by showing AWS Sign-in service (signin.aws.amazon.com) URL in VS Code when we detect it. + const urlMatch = text.match(/(https:\/\/[^\s]+signin\.aws\.amazon\.com[^\s]+)/i) + if (urlMatch && !urlShown) { + loginUrl = urlMatch[1] + urlShown = true - // Show URL with Copy button (non-blocking) - const copyUrl = localize('AWS.button.copyUrl', 'Copy URL') - void vscode.window - .showInformationMessage( - localize( - 'AWS.message.info.consoleLogin.browserAuth', - 'Attempting to open your default browser.\nIf the browser does not open, copy the URL:\n\n{0}', - loginUrl - ), - copyUrl - ) - .then(async (selection) => { - if (selection === copyUrl && loginUrl) { - await vscode.env.clipboard.writeText(loginUrl) - void vscode.window.showInformationMessage( - localize( - 'AWS.message.info.urlCopied', - 'AWS Sign-in URL copied to clipboard.' - ) + // Show URL with Copy button (non-blocking) + const copyUrl = localize('AWS.button.copyUrl', 'Copy URL') + void vscode.window + .showInformationMessage( + localize( + 'AWS.message.info.consoleLogin.browserAuth', + 'Attempting to open your default browser.\nIf the browser does not open, copy the URL:\n\n{0}', + loginUrl + ), + copyUrl + ) + .then(async (selection) => { + if (selection === copyUrl && loginUrl) { + await vscode.env.clipboard.writeText(loginUrl) + void vscode.window.showInformationMessage( + localize( + 'AWS.message.info.urlCopied', + 'AWS Sign-in URL copied to clipboard.' ) - } - }) - } - // Check if profile is already configured with a session - const overwriteMatch = text.match( - /Profile .+ is already configured to use session .+\. Do you want to overwrite it to use .+ instead\?/s - ) - if (overwriteMatch) { - const cliMessage = overwriteMatch[0].trim() // Extract the matched string - const overwriteBtn = localize('AWS.generic.overwrite', 'Overwrite') - const cancelBtn = localize('AWS.generic.cancel', 'Cancel') - void vscode.window - .showInformationMessage(cliMessage, overwriteBtn, cancelBtn) - .then(async (selection) => { - if (selection === overwriteBtn && loginProcess) { - // Send "y" to stdin to proceed with overwrite - await loginProcess.send('y\n') - } else if (loginProcess) { - // User cancelled, stop the process - await loginProcess.send('n\n') - userCancelled = true - } - }) - } - }, - }) - - // Handle cancellation - token.onCancellationRequested(() => { - userCancelled = true - loginProcess?.stop() - }) - - return await loginProcess.run() - } - ) + ) + } + }) + } + // Check if profile is already configured with a session + const overwriteMatch = text.match( + /Profile .+ is already configured to use session .+\. Do you want to overwrite it to use .+ instead\?/s + ) + if (overwriteMatch) { + const cliMessage = overwriteMatch[0].trim() // Extract the matched string + const overwriteBtn = localize('AWS.generic.overwrite', 'Overwrite') + const cancelBtn = localize('AWS.generic.cancel', 'Cancel') + void vscode.window + .showInformationMessage(cliMessage, overwriteBtn, cancelBtn) + .then(async (selection) => { + if (selection === overwriteBtn && loginProcess) { + // Send "y" to stdin to proceed with overwrite + await loginProcess.send('y\n') + } else if (loginProcess) { + // User cancelled, stop the process + await loginProcess.send('n\n') + userCancelled = true + } + }) + } + }, + }) - // Check if user cancelled - if (userCancelled) { - void vscode.window.showInformationMessage( - localize('AWS.message.info.consoleLogin.cancelled', 'Login with console credentials was cancelled.') - ) - throw new ToolkitError('User cancelled login with console credentials', { - cancelled: true, + // Handle cancellation + token.onCancellationRequested(() => { + userCancelled = true + loginProcess?.stop() }) + + return await loginProcess.run() } + ) - if (result.exitCode === 0) { - telemetry.aws_consoleLoginCLISuccess.emit({ result: 'Succeeded' }) - // Show generic success message - void vscode.window.showInformationMessage( - localize( - 'AWS.message.success.consoleLogin', - 'Login with console credentials command completed. Profile "{0}" is now available.', - profileName - ) - ) - logger.info('Login with console credentials command completed. Exit code: %d', result.exitCode) - } else if (result.exitCode === 254) { - logger.error( - 'AWS Sign-in service returned an error. Exit code %d: %s', - result.exitCode, - result.stdout || result.stderr + // Check if user cancelled + if (userCancelled) { + void vscode.window.showInformationMessage( + localize('AWS.message.info.consoleLogin.cancelled', 'Login with console credentials was cancelled.') + ) + throw new ToolkitError('User cancelled login with console credentials', { + cancelled: true, + }) + } + + if (result.exitCode === 0) { + telemetry.aws_consoleLoginCLISuccess.emit({ result: 'Succeeded' }) + // Show generic success message + void vscode.window.showInformationMessage( + localize( + 'AWS.message.success.consoleLogin', + 'Login with console credentials command completed. Profile "{0}" is now available.', + profileName ) - void vscode.window.showErrorMessage( - localize( - 'AWS.message.error.consoleLogin.signinServiceError', - 'Unable to sign in with console credentials in "{0}". Please try another region.', - region - ) + ) + logger.info('Login with console credentials command completed. Exit code: %d', result.exitCode) + } else if (result.exitCode === 254) { + logger.error( + 'AWS Sign-in service returned an error. Exit code %d: %s', + result.exitCode, + result.stdout || result.stderr + ) + void vscode.window.showErrorMessage( + localize( + 'AWS.message.error.consoleLogin.signinServiceError', + 'Unable to sign in with console credentials in "{0}". Please try another region.', + region ) - throw new ToolkitError('AWS Sign-in service returned an error', { - code: 'SigninServiceError', - details: { - exitCode: result.exitCode, - }, - }) - } else if (result.exitCode === 252) { - // AWS CLI is outdated, attempt to update - try { - await updateAwsCli() - // Retry the login command after successful update - return await authenticateWithConsoleLogin(profileName, region) - } catch (err) { - if (CancellationError.isUserCancelled(err)) { - throw new ToolkitError('User cancelled updating AWS CLI', { - cancelled: true, - }) - } - logger.error('Failed to update AWS CLI: %O', err) - throw ToolkitError.chain(err, 'AWS CLI update failed') + ) + throw new ToolkitError('AWS Sign-in service returned an error', { + code: 'SigninServiceError', + details: { + exitCode: result.exitCode, + }, + }) + } else if (result.exitCode === 252) { + // AWS CLI is outdated, attempt to update + try { + await updateAwsCli() + } catch (err) { + if (CancellationError.isUserCancelled(err)) { + throw new ToolkitError('User cancelled updating AWS CLI', { + cancelled: true, + }) } - } else { - // Show generic error message - void vscode.window.showErrorMessage( - localize('AWS.message.error.consoleLogin.commandFailed', 'Login with console credentials failed.') - ) - logger.error( - 'Login with console credentials command failed with exit code %d: %s', - result.exitCode, - result.stdout || result.stderr - ) - throw new ToolkitError('Login with console credentials command failed with exit code', { - code: 'CommandFailed', - details: { - exitCode: result.exitCode, - }, - }) + logger.error('Failed to update AWS CLI: %O', err) + throw ToolkitError.chain(err, 'AWS CLI update failed') } - } catch (error) { - logger.error('Error executing login with console credentials command: %O', error) + // If we reach here, update attempt completed + const message = 'AWS CLI installer has started. After installation completes, try logging in again.' + void vscode.window.showWarningMessage(message) + throw new ToolkitError(message, { cancelled: true }) + } else { + // Show generic error message void vscode.window.showErrorMessage( localize( - 'AWS.message.error.consoleLogin.executionFailed', - 'Failed to execute login with console credentials command: {0}', - error instanceof Error ? error.message : String(error) + 'AWS.message.error.consoleLogin.commandFailed', + `Login using console credentials with 'aws login' command failed with exit code ${result.exitCode}` ) ) - throw new ToolkitError('Failed to execute login with console credentials command', { - code: 'ExecutionFailed', - cause: error as Error, + logger.error( + 'Login with console credentials command failed with exit code %d: %s', + result.exitCode, + result.stdout || result.stderr + ) + throw new ToolkitError(`Login with console credentials command failed with exit code ${result.exitCode}`, { + code: 'CommandFailed', }) } @@ -333,9 +318,10 @@ export async function authenticateWithConsoleLogin(profileName?: string, region? code: 'MissingConnection', }) } + // Don't call useConnection() - let credentials be fetched naturally when needed await Auth.instance.updateConnectionState(connectionId, 'valid') - } catch (error) { + } catch (error: any) { logger.error('Failed to activate profile: %O', error) void vscode.window.showErrorMessage( localize( diff --git a/packages/core/src/shared/utilities/cliUtils.ts b/packages/core/src/shared/utilities/cliUtils.ts index 70175358de7..67615ef0374 100644 --- a/packages/core/src/shared/utilities/cliUtils.ts +++ b/packages/core/src/shared/utilities/cliUtils.ts @@ -569,10 +569,7 @@ export async function getOrInstallCli(cli: AwsClis, confirm: boolean, popup: boo */ export async function updateAwsCli(): Promise { const selection = await vscode.window.showInformationMessage( - localize( - 'AWS.cli.updateCliPrompt', - 'Using console credentials requires updating the AWS CLI to the latest version.' - ), + localize('AWS.cli.updateCliPrompt', 'Console credentials require AWS CLI version 2.32.0 or newer. Update now?'), { modal: true }, 'Update' ) @@ -582,7 +579,6 @@ export async function updateAwsCli(): Promise { } const result = await installCli('aws-cli', false) - void vscode.window.showInformationMessage(localize('AWS.cli.updateSuccess', 'AWS CLI was successfully updated.')) return result } diff --git a/packages/toolkit/.changes/next-release/Bug Fix-94b6c83c-8f06-408f-be4a-be7de59ce0df.json b/packages/toolkit/.changes/next-release/Bug Fix-94b6c83c-8f06-408f-be4a-be7de59ce0df.json new file mode 100644 index 00000000000..234c30b749e --- /dev/null +++ b/packages/toolkit/.changes/next-release/Bug Fix-94b6c83c-8f06-408f-be4a-be7de59ce0df.json @@ -0,0 +1,4 @@ +{ + "type": "Bug Fix", + "description": "AWS CLI update process could enter an infinite retry loop when outdated CLI is detected during console login. The Toolkit now attempts the update once and prompts users to manually reload and retry, preventing continuous failed authentication attempts." +} From 817d16b037a7a3c844df06452610062558562086 Mon Sep 17 00:00:00 2001 From: Keyu Wu Date: Wed, 14 Jan 2026 16:07:55 -0800 Subject: [PATCH 02/51] deps(smus): Upgrade sdk v2 to sdk v3 - SQLWorkbench (#8407) # Summary This PR migrates the SQLWorkbench custom API client from the deprecated AWS SDK v2 generator pattern to standalone AWS SDK v3-compatible packages. This migration is required as part of the broader AWS Toolkit repository migration from SDK v2 to v3. # Problem The AWS Toolkit VSCode repository is deprecating the centralized generateServiceClient.ts script that generates TypeScript clients from service JSON definitions. The SageMaker Unified Studio (SMUS) team currently uses this v2 generator for SQLWorkbench. # Solution * Created standalone package @amzn/sql-workbench-client * Updated imports to use new standalone package * Migrated from SDK v2 .promise() pattern to SDK v3 Command pattern (client.send(command)) * Updated credential handling to use credential provider function for auto-refresh support * Replaced local type definitions with SDK-provided types (DatabaseConnectionConfiguration, ParentResource, Resource, etc.) * Removed dependency for SQLWorkbench on the deprecated generateServiceClient.ts script * Updated unit tests to mock SDK v3 send method instead of v2 .promise() pattern --- - Treat all work as PUBLIC. Private `feature/x` branches will not be squash-merged at release time. - Your code changes must meet the guidelines in [CONTRIBUTING.md](https://github.com/aws/aws-toolkit-vscode/blob/master/CONTRIBUTING.md#guidelines). - License: I confirm that my contribution is made under the terms of the Apache 2.0 license. Co-authored-by: invictus <149003065+ashishrp-aws@users.noreply.github.com> --- package-lock.json | 1095 +++++++++ packages/core/package.json | 1 + .../scripts/build/generateServiceClient.ts | 4 - .../explorer/nodes/redshiftStrategy.ts | 10 +- .../shared/client/sqlWorkbenchClient.ts | 154 +- .../shared/client/sqlworkbench.json | 2102 ----------------- .../shared/client/sqlWorkbenchClient.test.ts | 80 +- src.gen/@amzn/sql-workbench-client/3.0.0.tgz | Bin 0 -> 89474 bytes 8 files changed, 1209 insertions(+), 2237 deletions(-) delete mode 100644 packages/core/src/sagemakerunifiedstudio/shared/client/sqlworkbench.json create mode 100644 src.gen/@amzn/sql-workbench-client/3.0.0.tgz diff --git a/package-lock.json b/package-lock.json index 2c908ca7186..49bcfaa33c9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2123,6 +2123,1100 @@ "uuid": "dist/bin/uuid" } }, + "node_modules/@amzn/sql-workbench-client": { + "name": "@amzn/sqlworkbench-client", + "version": "3.0.0", + "resolved": "file:src.gen/@amzn/sql-workbench-client/3.0.0.tgz", + "integrity": "sha512-k2sBdb9RhB9A7G1Mz+Jit0r+d8zxBSKxgjlPMavuWmafEIOZlARfM942VX3wtHfrZXfVzpY3cgt3Q5LlElm0YQ==", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.922.0", + "@aws-sdk/credential-provider-node": "3.922.0", + "@aws-sdk/middleware-host-header": "3.922.0", + "@aws-sdk/middleware-logger": "3.922.0", + "@aws-sdk/middleware-recursion-detection": "3.922.0", + "@aws-sdk/middleware-user-agent": "3.922.0", + "@aws-sdk/region-config-resolver": "3.922.0", + "@aws-sdk/types": "3.922.0", + "@aws-sdk/util-endpoints": "3.922.0", + "@aws-sdk/util-user-agent-browser": "3.922.0", + "@aws-sdk/util-user-agent-node": "3.922.0", + "@smithy/config-resolver": "^4.4.2", + "@smithy/core": "^3.17.2", + "@smithy/fetch-http-handler": "^5.3.5", + "@smithy/hash-node": "^4.2.4", + "@smithy/invalid-dependency": "^4.2.4", + "@smithy/middleware-content-length": "^4.2.4", + "@smithy/middleware-endpoint": "^4.3.6", + "@smithy/middleware-retry": "^4.4.6", + "@smithy/middleware-serde": "^4.2.4", + "@smithy/middleware-stack": "^4.2.4", + "@smithy/node-config-provider": "^4.3.4", + "@smithy/node-http-handler": "^4.4.4", + "@smithy/protocol-http": "^5.3.4", + "@smithy/smithy-client": "^4.9.2", + "@smithy/types": "^4.8.1", + "@smithy/url-parser": "^4.2.4", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-body-length-node": "^4.2.1", + "@smithy/util-defaults-mode-browser": "^4.3.5", + "@smithy/util-defaults-mode-node": "^4.2.8", + "@smithy/util-endpoints": "^3.2.4", + "@smithy/util-middleware": "^4.2.4", + "@smithy/util-retry": "^4.2.4", + "@smithy/util-stream": "^4.5.5", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/sql-workbench-client/node_modules/@aws-sdk/client-sso": { + "version": "3.922.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.922.0.tgz", + "integrity": "sha512-jdHs7uy7cSpiMvrxhYmqHyJxgK7hyqw4plG8OQ4YTBpq0SbfAxdoOuOkwJ1IVUUQho4otR1xYYjiX/8e8J8qwQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.922.0", + "@aws-sdk/middleware-host-header": "3.922.0", + "@aws-sdk/middleware-logger": "3.922.0", + "@aws-sdk/middleware-recursion-detection": "3.922.0", + "@aws-sdk/middleware-user-agent": "3.922.0", + "@aws-sdk/region-config-resolver": "3.922.0", + "@aws-sdk/types": "3.922.0", + "@aws-sdk/util-endpoints": "3.922.0", + "@aws-sdk/util-user-agent-browser": "3.922.0", + "@aws-sdk/util-user-agent-node": "3.922.0", + "@smithy/config-resolver": "^4.4.1", + "@smithy/core": "^3.17.2", + "@smithy/fetch-http-handler": "^5.3.5", + "@smithy/hash-node": "^4.2.4", + "@smithy/invalid-dependency": "^4.2.4", + "@smithy/middleware-content-length": "^4.2.4", + "@smithy/middleware-endpoint": "^4.3.6", + "@smithy/middleware-retry": "^4.4.6", + "@smithy/middleware-serde": "^4.2.4", + "@smithy/middleware-stack": "^4.2.4", + "@smithy/node-config-provider": "^4.3.4", + "@smithy/node-http-handler": "^4.4.4", + "@smithy/protocol-http": "^5.3.4", + "@smithy/smithy-client": "^4.9.2", + "@smithy/types": "^4.8.1", + "@smithy/url-parser": "^4.2.4", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-body-length-node": "^4.2.1", + "@smithy/util-defaults-mode-browser": "^4.3.5", + "@smithy/util-defaults-mode-node": "^4.2.7", + "@smithy/util-endpoints": "^3.2.4", + "@smithy/util-middleware": "^4.2.4", + "@smithy/util-retry": "^4.2.4", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/sql-workbench-client/node_modules/@aws-sdk/core": { + "version": "3.922.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.922.0.tgz", + "integrity": "sha512-EvfP4cqJfpO3L2v5vkIlTkMesPtRwWlMfsaW6Tpfm7iYfBOuTi6jx60pMDMTyJNVfh6cGmXwh/kj1jQdR+w99Q==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.922.0", + "@aws-sdk/xml-builder": "3.921.0", + "@smithy/core": "^3.17.2", + "@smithy/node-config-provider": "^4.3.4", + "@smithy/property-provider": "^4.2.4", + "@smithy/protocol-http": "^5.3.4", + "@smithy/signature-v4": "^5.3.4", + "@smithy/smithy-client": "^4.9.2", + "@smithy/types": "^4.8.1", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-middleware": "^4.2.4", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/sql-workbench-client/node_modules/@aws-sdk/credential-provider-env": { + "version": "3.922.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.922.0.tgz", + "integrity": "sha512-WikGQpKkROJSK3D3E7odPjZ8tU7WJp5/TgGdRuZw3izsHUeH48xMv6IznafpRTmvHcjAbDQj4U3CJZNAzOK/OQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.922.0", + "@aws-sdk/types": "3.922.0", + "@smithy/property-provider": "^4.2.4", + "@smithy/types": "^4.8.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/sql-workbench-client/node_modules/@aws-sdk/credential-provider-http": { + "version": "3.922.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.922.0.tgz", + "integrity": "sha512-i72DgHMK7ydAEqdzU0Duqh60Q8W59EZmRJ73y0Y5oFmNOqnYsAI+UXyOoCsubp+Dkr6+yOwAn1gPt1XGE9Aowg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.922.0", + "@aws-sdk/types": "3.922.0", + "@smithy/fetch-http-handler": "^5.3.5", + "@smithy/node-http-handler": "^4.4.4", + "@smithy/property-provider": "^4.2.4", + "@smithy/protocol-http": "^5.3.4", + "@smithy/smithy-client": "^4.9.2", + "@smithy/types": "^4.8.1", + "@smithy/util-stream": "^4.5.5", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/sql-workbench-client/node_modules/@aws-sdk/credential-provider-ini": { + "version": "3.922.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.922.0.tgz", + "integrity": "sha512-bVF+pI5UCLNkvbiZr/t2fgTtv84s8FCdOGAPxQiQcw5qOZywNuuCCY3wIIchmQr6GJr8YFkEp5LgDCac5EC5aQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.922.0", + "@aws-sdk/credential-provider-env": "3.922.0", + "@aws-sdk/credential-provider-http": "3.922.0", + "@aws-sdk/credential-provider-process": "3.922.0", + "@aws-sdk/credential-provider-sso": "3.922.0", + "@aws-sdk/credential-provider-web-identity": "3.922.0", + "@aws-sdk/nested-clients": "3.922.0", + "@aws-sdk/types": "3.922.0", + "@smithy/credential-provider-imds": "^4.2.4", + "@smithy/property-provider": "^4.2.4", + "@smithy/shared-ini-file-loader": "^4.3.4", + "@smithy/types": "^4.8.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/sql-workbench-client/node_modules/@aws-sdk/credential-provider-node": { + "version": "3.922.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.922.0.tgz", + "integrity": "sha512-agCwaD6mBihToHkjycL8ObIS2XOnWypWZZWhJSoWyHwFrhEKz1zGvgylK9Dc711oUfU+zU6J8e0JPKNJMNb3BQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.922.0", + "@aws-sdk/credential-provider-http": "3.922.0", + "@aws-sdk/credential-provider-ini": "3.922.0", + "@aws-sdk/credential-provider-process": "3.922.0", + "@aws-sdk/credential-provider-sso": "3.922.0", + "@aws-sdk/credential-provider-web-identity": "3.922.0", + "@aws-sdk/types": "3.922.0", + "@smithy/credential-provider-imds": "^4.2.4", + "@smithy/property-provider": "^4.2.4", + "@smithy/shared-ini-file-loader": "^4.3.4", + "@smithy/types": "^4.8.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/sql-workbench-client/node_modules/@aws-sdk/credential-provider-process": { + "version": "3.922.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.922.0.tgz", + "integrity": "sha512-1DZOYezT6okslpvMW7oA2q+y17CJd4fxjNFH0jtThfswdh9CtG62+wxenqO+NExttq0UMaKisrkZiVrYQBTShw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.922.0", + "@aws-sdk/types": "3.922.0", + "@smithy/property-provider": "^4.2.4", + "@smithy/shared-ini-file-loader": "^4.3.4", + "@smithy/types": "^4.8.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/sql-workbench-client/node_modules/@aws-sdk/credential-provider-sso": { + "version": "3.922.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.922.0.tgz", + "integrity": "sha512-nbD3G3hShTYxLCkKMqLkLPtKwAAfxdY/k9jHtZmVBFXek2T6tQrqZHKxlAu+fd23Ga4/Aik7DLQQx1RA1a5ipg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/client-sso": "3.922.0", + "@aws-sdk/core": "3.922.0", + "@aws-sdk/token-providers": "3.922.0", + "@aws-sdk/types": "3.922.0", + "@smithy/property-provider": "^4.2.4", + "@smithy/shared-ini-file-loader": "^4.3.4", + "@smithy/types": "^4.8.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/sql-workbench-client/node_modules/@aws-sdk/credential-provider-web-identity": { + "version": "3.922.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.922.0.tgz", + "integrity": "sha512-wjGIhgMHGGQfQTdFaJphNOKyAL8wZs6znJdHADPVURmgR+EWLyN/0fDO1u7wx8xaLMZpbHIFWBEvf9TritR/cQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.922.0", + "@aws-sdk/nested-clients": "3.922.0", + "@aws-sdk/types": "3.922.0", + "@smithy/property-provider": "^4.2.4", + "@smithy/shared-ini-file-loader": "^4.3.4", + "@smithy/types": "^4.8.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/sql-workbench-client/node_modules/@aws-sdk/middleware-host-header": { + "version": "3.922.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.922.0.tgz", + "integrity": "sha512-HPquFgBnq/KqKRVkiuCt97PmWbKtxQ5iUNLEc6FIviqOoZTmaYG3EDsIbuFBz9C4RHJU4FKLmHL2bL3FEId6AA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.922.0", + "@smithy/protocol-http": "^5.3.4", + "@smithy/types": "^4.8.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/sql-workbench-client/node_modules/@aws-sdk/middleware-logger": { + "version": "3.922.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.922.0.tgz", + "integrity": "sha512-AkvYO6b80FBm5/kk2E636zNNcNgjztNNUxpqVx+huyGn9ZqGTzS4kLqW2hO6CBe5APzVtPCtiQsXL24nzuOlAg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.922.0", + "@smithy/types": "^4.8.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/sql-workbench-client/node_modules/@aws-sdk/middleware-recursion-detection": { + "version": "3.922.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.922.0.tgz", + "integrity": "sha512-TtSCEDonV/9R0VhVlCpxZbp/9sxQvTTRKzIf8LxW3uXpby6Wl8IxEciBJlxmSkoqxh542WRcko7NYODlvL/gDA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.922.0", + "@aws/lambda-invoke-store": "^0.1.1", + "@smithy/protocol-http": "^5.3.4", + "@smithy/types": "^4.8.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/sql-workbench-client/node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.922.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.922.0.tgz", + "integrity": "sha512-N4Qx/9KP3oVQBJOrSghhz8iZFtUC2NNeSZt88hpPhbqAEAtuX8aD8OzVcpnAtrwWqy82Yd2YTxlkqMGkgqnBsQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.922.0", + "@aws-sdk/types": "3.922.0", + "@aws-sdk/util-endpoints": "3.922.0", + "@smithy/core": "^3.17.2", + "@smithy/protocol-http": "^5.3.4", + "@smithy/types": "^4.8.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/sql-workbench-client/node_modules/@aws-sdk/nested-clients": { + "version": "3.922.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.922.0.tgz", + "integrity": "sha512-uYvKCF1TGh/MuJ4TMqmUM0Csuao02HawcseG4LUDyxdUsd/EFuxalWq1Cx4fKZQ2K8F504efZBjctMAMNY+l7A==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.922.0", + "@aws-sdk/middleware-host-header": "3.922.0", + "@aws-sdk/middleware-logger": "3.922.0", + "@aws-sdk/middleware-recursion-detection": "3.922.0", + "@aws-sdk/middleware-user-agent": "3.922.0", + "@aws-sdk/region-config-resolver": "3.922.0", + "@aws-sdk/types": "3.922.0", + "@aws-sdk/util-endpoints": "3.922.0", + "@aws-sdk/util-user-agent-browser": "3.922.0", + "@aws-sdk/util-user-agent-node": "3.922.0", + "@smithy/config-resolver": "^4.4.1", + "@smithy/core": "^3.17.2", + "@smithy/fetch-http-handler": "^5.3.5", + "@smithy/hash-node": "^4.2.4", + "@smithy/invalid-dependency": "^4.2.4", + "@smithy/middleware-content-length": "^4.2.4", + "@smithy/middleware-endpoint": "^4.3.6", + "@smithy/middleware-retry": "^4.4.6", + "@smithy/middleware-serde": "^4.2.4", + "@smithy/middleware-stack": "^4.2.4", + "@smithy/node-config-provider": "^4.3.4", + "@smithy/node-http-handler": "^4.4.4", + "@smithy/protocol-http": "^5.3.4", + "@smithy/smithy-client": "^4.9.2", + "@smithy/types": "^4.8.1", + "@smithy/url-parser": "^4.2.4", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-body-length-node": "^4.2.1", + "@smithy/util-defaults-mode-browser": "^4.3.5", + "@smithy/util-defaults-mode-node": "^4.2.7", + "@smithy/util-endpoints": "^3.2.4", + "@smithy/util-middleware": "^4.2.4", + "@smithy/util-retry": "^4.2.4", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/sql-workbench-client/node_modules/@aws-sdk/region-config-resolver": { + "version": "3.922.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.922.0.tgz", + "integrity": "sha512-44Y/rNNwhngR2KHp6gkx//TOr56/hx6s4l+XLjOqH7EBCHL7XhnrT1y92L+DLiroVr1tCSmO8eHQwBv0Y2+mvw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.922.0", + "@smithy/config-resolver": "^4.4.1", + "@smithy/node-config-provider": "^4.3.4", + "@smithy/types": "^4.8.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/sql-workbench-client/node_modules/@aws-sdk/token-providers": { + "version": "3.922.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.922.0.tgz", + "integrity": "sha512-/inmPnjZE0ZBE16zaCowAvouSx05FJ7p6BQYuzlJ8vxEU0sS0Hf8fvhuiRnN9V9eDUPIBY+/5EjbMWygXL4wlQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.922.0", + "@aws-sdk/nested-clients": "3.922.0", + "@aws-sdk/types": "3.922.0", + "@smithy/property-provider": "^4.2.4", + "@smithy/shared-ini-file-loader": "^4.3.4", + "@smithy/types": "^4.8.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/sql-workbench-client/node_modules/@aws-sdk/types": { + "version": "3.922.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.922.0.tgz", + "integrity": "sha512-eLA6XjVobAUAMivvM7DBL79mnHyrm+32TkXNWZua5mnxF+6kQCfblKKJvxMZLGosO53/Ex46ogim8IY5Nbqv2w==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.8.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/sql-workbench-client/node_modules/@aws-sdk/util-endpoints": { + "version": "3.922.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.922.0.tgz", + "integrity": "sha512-4ZdQCSuNMY8HMlR1YN4MRDdXuKd+uQTeKIr5/pIM+g3TjInZoj8imvXudjcrFGA63UF3t92YVTkBq88mg58RXQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.922.0", + "@smithy/types": "^4.8.1", + "@smithy/url-parser": "^4.2.4", + "@smithy/util-endpoints": "^3.2.4", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/sql-workbench-client/node_modules/@aws-sdk/util-user-agent-browser": { + "version": "3.922.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.922.0.tgz", + "integrity": "sha512-qOJAERZ3Plj1st7M4Q5henl5FRpE30uLm6L9edZqZXGR6c7ry9jzexWamWVpQ4H4xVAVmiO9dIEBAfbq4mduOA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.922.0", + "@smithy/types": "^4.8.1", + "bowser": "^2.11.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@amzn/sql-workbench-client/node_modules/@aws-sdk/util-user-agent-node": { + "version": "3.922.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.922.0.tgz", + "integrity": "sha512-NrPe/Rsr5kcGunkog0eBV+bY0inkRELsD2SacC4lQZvZiXf8VJ2Y7j+Yq1tB+h+FPLsdt3v9wItIvDf/laAm0Q==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/middleware-user-agent": "3.922.0", + "@aws-sdk/types": "3.922.0", + "@smithy/node-config-provider": "^4.3.4", + "@smithy/types": "^4.8.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "aws-crt": ">=1.0.0" + }, + "peerDependenciesMeta": { + "aws-crt": { + "optional": true + } + } + }, + "node_modules/@amzn/sql-workbench-client/node_modules/@aws-sdk/xml-builder": { + "version": "3.921.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.921.0.tgz", + "integrity": "sha512-LVHg0jgjyicKKvpNIEMXIMr1EBViESxcPkqfOlT+X1FkmUMTNZEEVF18tOJg4m4hV5vxtkWcqtr4IEeWa1C41Q==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.8.1", + "fast-xml-parser": "5.2.5", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/sql-workbench-client/node_modules/@aws/lambda-invoke-store": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@aws/lambda-invoke-store/-/lambda-invoke-store-0.1.1.tgz", + "integrity": "sha512-RcLam17LdlbSOSp9VxmUu1eI6Mwxp+OwhD2QhiSNmNCzoDb0EeUXTD2n/WbcnrAYMGlmf05th6QYq23VqvJqpA==", + "license": "Apache-2.0", + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/sql-workbench-client/node_modules/@smithy/abort-controller": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.2.5.tgz", + "integrity": "sha512-j7HwVkBw68YW8UmFRcjZOmssE77Rvk0GWAIN1oFBhsaovQmZWYCIcGa9/pwRB0ExI8Sk9MWNALTjftjHZea7VA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/sql-workbench-client/node_modules/@smithy/config-resolver": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.4.3.tgz", + "integrity": "sha512-ezHLe1tKLUxDJo2LHtDuEDyWXolw8WGOR92qb4bQdWq/zKenO5BvctZGrVJBK08zjezSk7bmbKFOXIVyChvDLw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/node-config-provider": "^4.3.5", + "@smithy/types": "^4.9.0", + "@smithy/util-config-provider": "^4.2.0", + "@smithy/util-endpoints": "^3.2.5", + "@smithy/util-middleware": "^4.2.5", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/sql-workbench-client/node_modules/@smithy/core": { + "version": "3.18.7", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.18.7.tgz", + "integrity": "sha512-axG9MvKhMWOhFbvf5y2DuyTxQueO0dkedY9QC3mAfndLosRI/9LJv8WaL0mw7ubNhsO4IuXX9/9dYGPFvHrqlw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/middleware-serde": "^4.2.6", + "@smithy/protocol-http": "^5.3.5", + "@smithy/types": "^4.9.0", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-middleware": "^4.2.5", + "@smithy/util-stream": "^4.5.6", + "@smithy/util-utf8": "^4.2.0", + "@smithy/uuid": "^1.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/sql-workbench-client/node_modules/@smithy/credential-provider-imds": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.2.5.tgz", + "integrity": "sha512-BZwotjoZWn9+36nimwm/OLIcVe+KYRwzMjfhd4QT7QxPm9WY0HiOV8t/Wlh+HVUif0SBVV7ksq8//hPaBC/okQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/node-config-provider": "^4.3.5", + "@smithy/property-provider": "^4.2.5", + "@smithy/types": "^4.9.0", + "@smithy/url-parser": "^4.2.5", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/sql-workbench-client/node_modules/@smithy/fetch-http-handler": { + "version": "5.3.6", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.3.6.tgz", + "integrity": "sha512-3+RG3EA6BBJ/ofZUeTFJA7mHfSYrZtQIrDP9dI8Lf7X6Jbos2jptuLrAAteDiFVrmbEmLSuRG/bUKzfAXk7dhg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/protocol-http": "^5.3.5", + "@smithy/querystring-builder": "^4.2.5", + "@smithy/types": "^4.9.0", + "@smithy/util-base64": "^4.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/sql-workbench-client/node_modules/@smithy/hash-node": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.2.5.tgz", + "integrity": "sha512-DpYX914YOfA3UDT9CN1BM787PcHfWRBB43fFGCYrZFUH0Jv+5t8yYl+Pd5PW4+QzoGEDvn5d5QIO4j2HyYZQSA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "@smithy/util-buffer-from": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/sql-workbench-client/node_modules/@smithy/invalid-dependency": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.2.5.tgz", + "integrity": "sha512-2L2erASEro1WC5nV+plwIMxrTXpvpfzl4e+Nre6vBVRR2HKeGGcvpJyyL3/PpiSg+cJG2KpTmZmq934Olb6e5A==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/sql-workbench-client/node_modules/@smithy/is-array-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-4.2.0.tgz", + "integrity": "sha512-DZZZBvC7sjcYh4MazJSGiWMI2L7E0oCiRHREDzIxi/M2LY79/21iXt6aPLHge82wi5LsuRF5A06Ds3+0mlh6CQ==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/sql-workbench-client/node_modules/@smithy/middleware-content-length": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.2.5.tgz", + "integrity": "sha512-Y/RabVa5vbl5FuHYV2vUCwvh/dqzrEY/K2yWPSqvhFUwIY0atLqO4TienjBXakoy4zrKAMCZwg+YEqmH7jaN7A==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/protocol-http": "^5.3.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/sql-workbench-client/node_modules/@smithy/middleware-endpoint": { + "version": "4.3.14", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.3.14.tgz", + "integrity": "sha512-v0q4uTKgBM8dsqGjqsabZQyH85nFaTnFcgpWU1uydKFsdyyMzfvOkNum9G7VK+dOP01vUnoZxIeRiJ6uD0kjIg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/core": "^3.18.7", + "@smithy/middleware-serde": "^4.2.6", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/shared-ini-file-loader": "^4.4.0", + "@smithy/types": "^4.9.0", + "@smithy/url-parser": "^4.2.5", + "@smithy/util-middleware": "^4.2.5", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/sql-workbench-client/node_modules/@smithy/middleware-retry": { + "version": "4.4.14", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.4.14.tgz", + "integrity": "sha512-Z2DG8Ej7FyWG1UA+7HceINtSLzswUgs2np3sZX0YBBxCt+CXG4QUxv88ZDS3+2/1ldW7LqtSY1UO/6VQ1pND8Q==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/node-config-provider": "^4.3.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/service-error-classification": "^4.2.5", + "@smithy/smithy-client": "^4.9.10", + "@smithy/types": "^4.9.0", + "@smithy/util-middleware": "^4.2.5", + "@smithy/util-retry": "^4.2.5", + "@smithy/uuid": "^1.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/sql-workbench-client/node_modules/@smithy/middleware-serde": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.2.6.tgz", + "integrity": "sha512-VkLoE/z7e2g8pirwisLz8XJWedUSY8my/qrp81VmAdyrhi94T+riBfwP+AOEEFR9rFTSonC/5D2eWNmFabHyGQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/protocol-http": "^5.3.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/sql-workbench-client/node_modules/@smithy/middleware-stack": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.2.5.tgz", + "integrity": "sha512-bYrutc+neOyWxtZdbB2USbQttZN0mXaOyYLIsaTbJhFsfpXyGWUxJpEuO1rJ8IIJm2qH4+xJT0mxUSsEDTYwdQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/sql-workbench-client/node_modules/@smithy/node-config-provider": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.3.5.tgz", + "integrity": "sha512-UTurh1C4qkVCtqggI36DGbLB2Kv8UlcFdMXDcWMbqVY2uRg0XmT9Pb4Vj6oSQ34eizO1fvR0RnFV4Axw4IrrAg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/property-provider": "^4.2.5", + "@smithy/shared-ini-file-loader": "^4.4.0", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/sql-workbench-client/node_modules/@smithy/node-http-handler": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.4.5.tgz", + "integrity": "sha512-CMnzM9R2WqlqXQGtIlsHMEZfXKJVTIrqCNoSd/QpAyp+Dw0a1Vps13l6ma1fH8g7zSPNsA59B/kWgeylFuA/lw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/abort-controller": "^4.2.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/querystring-builder": "^4.2.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/sql-workbench-client/node_modules/@smithy/property-provider": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.2.5.tgz", + "integrity": "sha512-8iLN1XSE1rl4MuxvQ+5OSk/Zb5El7NJZ1td6Tn+8dQQHIjp59Lwl6bd0+nzw6SKm2wSSriH2v/I9LPzUic7EOg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/sql-workbench-client/node_modules/@smithy/protocol-http": { + "version": "5.3.5", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.3.5.tgz", + "integrity": "sha512-RlaL+sA0LNMp03bf7XPbFmT5gN+w3besXSWMkA8rcmxLSVfiEXElQi4O2IWwPfxzcHkxqrwBFMbngB8yx/RvaQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/sql-workbench-client/node_modules/@smithy/querystring-builder": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.2.5.tgz", + "integrity": "sha512-y98otMI1saoajeik2kLfGyRp11e5U/iJYH/wLCh3aTV/XutbGT9nziKGkgCaMD1ghK7p6htHMm6b6scl9JRUWg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "@smithy/util-uri-escape": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/sql-workbench-client/node_modules/@smithy/querystring-parser": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.2.5.tgz", + "integrity": "sha512-031WCTdPYgiQRYNPXznHXof2YM0GwL6SeaSyTH/P72M1Vz73TvCNH2Nq8Iu2IEPq9QP2yx0/nrw5YmSeAi/AjQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/sql-workbench-client/node_modules/@smithy/service-error-classification": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.2.5.tgz", + "integrity": "sha512-8fEvK+WPE3wUAcDvqDQG1Vk3ANLR8Px979te96m84CbKAjBVf25rPYSzb4xU4hlTyho7VhOGnh5i62D/JVF0JQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/sql-workbench-client/node_modules/@smithy/shared-ini-file-loader": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.4.0.tgz", + "integrity": "sha512-5WmZ5+kJgJDjwXXIzr1vDTG+RhF9wzSODQBfkrQ2VVkYALKGvZX1lgVSxEkgicSAFnFhPj5rudJV0zoinqS0bA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/sql-workbench-client/node_modules/@smithy/signature-v4": { + "version": "5.3.5", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.3.5.tgz", + "integrity": "sha512-xSUfMu1FT7ccfSXkoLl/QRQBi2rOvi3tiBZU2Tdy3I6cgvZ6SEi9QNey+lqps/sJRnogIS+lq+B1gxxbra2a/w==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^4.2.0", + "@smithy/protocol-http": "^5.3.5", + "@smithy/types": "^4.9.0", + "@smithy/util-hex-encoding": "^4.2.0", + "@smithy/util-middleware": "^4.2.5", + "@smithy/util-uri-escape": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/sql-workbench-client/node_modules/@smithy/smithy-client": { + "version": "4.9.10", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.9.10.tgz", + "integrity": "sha512-Jaoz4Jw1QYHc1EFww/E6gVtNjhoDU+gwRKqXP6C3LKYqqH2UQhP8tMP3+t/ePrhaze7fhLE8vS2q6vVxBANFTQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/core": "^3.18.7", + "@smithy/middleware-endpoint": "^4.3.14", + "@smithy/middleware-stack": "^4.2.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/types": "^4.9.0", + "@smithy/util-stream": "^4.5.6", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/sql-workbench-client/node_modules/@smithy/types": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.9.0.tgz", + "integrity": "sha512-MvUbdnXDTwykR8cB1WZvNNwqoWVaTRA0RLlLmf/cIFNMM2cKWz01X4Ly6SMC4Kks30r8tT3Cty0jmeWfiuyHTA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/sql-workbench-client/node_modules/@smithy/url-parser": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.2.5.tgz", + "integrity": "sha512-VaxMGsilqFnK1CeBX+LXnSuaMx4sTL/6znSZh2829txWieazdVxr54HmiyTsIbpOTLcf5nYpq9lpzmwRdxj6rQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/querystring-parser": "^4.2.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/sql-workbench-client/node_modules/@smithy/util-base64": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-4.3.0.tgz", + "integrity": "sha512-GkXZ59JfyxsIwNTWFnjmFEI8kZpRNIBfxKjv09+nkAWPt/4aGaEWMM04m4sxgNVWkbt2MdSvE3KF/PfX4nFedQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/sql-workbench-client/node_modules/@smithy/util-body-length-browser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-4.2.0.tgz", + "integrity": "sha512-Fkoh/I76szMKJnBXWPdFkQJl2r9SjPt3cMzLdOB6eJ4Pnpas8hVoWPYemX/peO0yrrvldgCUVJqOAjUrOLjbxg==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/sql-workbench-client/node_modules/@smithy/util-body-length-node": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-4.2.1.tgz", + "integrity": "sha512-h53dz/pISVrVrfxV1iqXlx5pRg3V2YWFcSQyPyXZRrZoZj4R4DeWRDo1a7dd3CPTcFi3kE+98tuNyD2axyZReA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/sql-workbench-client/node_modules/@smithy/util-buffer-from": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-4.2.0.tgz", + "integrity": "sha512-kAY9hTKulTNevM2nlRtxAG2FQ3B2OR6QIrPY3zE5LqJy1oxzmgBGsHLWTcNhWXKchgA0WHW+mZkQrng/pgcCew==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/sql-workbench-client/node_modules/@smithy/util-config-provider": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-4.2.0.tgz", + "integrity": "sha512-YEjpl6XJ36FTKmD+kRJJWYvrHeUvm5ykaUS5xK+6oXffQPHeEM4/nXlZPe+Wu0lsgRUcNZiliYNh/y7q9c2y6Q==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/sql-workbench-client/node_modules/@smithy/util-defaults-mode-browser": { + "version": "4.3.13", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.3.13.tgz", + "integrity": "sha512-hlVLdAGrVfyNei+pKIgqDTxfu/ZI2NSyqj4IDxKd5bIsIqwR/dSlkxlPaYxFiIaDVrBy0he8orsFy+Cz119XvA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/property-provider": "^4.2.5", + "@smithy/smithy-client": "^4.9.10", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/sql-workbench-client/node_modules/@smithy/util-defaults-mode-node": { + "version": "4.2.16", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.2.16.tgz", + "integrity": "sha512-F1t22IUiJLHrxW9W1CQ6B9PN+skZ9cqSuzB18Eh06HrJPbjsyZ7ZHecAKw80DQtyGTRcVfeukKaCRYebFwclbg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/config-resolver": "^4.4.3", + "@smithy/credential-provider-imds": "^4.2.5", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/property-provider": "^4.2.5", + "@smithy/smithy-client": "^4.9.10", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/sql-workbench-client/node_modules/@smithy/util-endpoints": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.2.5.tgz", + "integrity": "sha512-3O63AAWu2cSNQZp+ayl9I3NapW1p1rR5mlVHcF6hAB1dPZUQFfRPYtplWX/3xrzWthPGj5FqB12taJJCfH6s8A==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/node-config-provider": "^4.3.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/sql-workbench-client/node_modules/@smithy/util-hex-encoding": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-4.2.0.tgz", + "integrity": "sha512-CCQBwJIvXMLKxVbO88IukazJD9a4kQ9ZN7/UMGBjBcJYvatpWk+9g870El4cB8/EJxfe+k+y0GmR9CAzkF+Nbw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/sql-workbench-client/node_modules/@smithy/util-middleware": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.2.5.tgz", + "integrity": "sha512-6Y3+rvBF7+PZOc40ybeZMcGln6xJGVeY60E7jy9Mv5iKpMJpHgRE6dKy9ScsVxvfAYuEX4Q9a65DQX90KaQ3bA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/sql-workbench-client/node_modules/@smithy/util-retry": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.2.5.tgz", + "integrity": "sha512-GBj3+EZBbN4NAqJ/7pAhsXdfzdlznOh8PydUijy6FpNIMnHPSMO2/rP4HKu+UFeikJxShERk528oy7GT79YiJg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/service-error-classification": "^4.2.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/sql-workbench-client/node_modules/@smithy/util-stream": { + "version": "4.5.6", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.5.6.tgz", + "integrity": "sha512-qWw/UM59TiaFrPevefOZ8CNBKbYEP6wBAIlLqxn3VAIo9rgnTNc4ASbVrqDmhuwI87usnjhdQrxodzAGFFzbRQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/fetch-http-handler": "^5.3.6", + "@smithy/node-http-handler": "^4.4.5", + "@smithy/types": "^4.9.0", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-buffer-from": "^4.2.0", + "@smithy/util-hex-encoding": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/sql-workbench-client/node_modules/@smithy/util-uri-escape": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-4.2.0.tgz", + "integrity": "sha512-igZpCKV9+E/Mzrpq6YacdTQ0qTiLm85gD6N/IrmyDvQFA4UnU3d5g3m8tMT/6zG/vVkWSU+VxeUyGonL62DuxA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/sql-workbench-client/node_modules/@smithy/util-utf8": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.2.0.tgz", + "integrity": "sha512-zBPfuzoI8xyBtR2P6WQj63Rz8i3AmfAaJLuNG8dWsfvPe8lO4aCPYLn879mEgHndZH1zQ2oXmG8O1GGzzaoZiw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/sql-workbench-client/node_modules/fast-xml-parser": { + "version": "5.2.5", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.2.5.tgz", + "integrity": "sha512-pfX9uG9Ki0yekDHx2SiuRIyFdyAr1kMIMitPvb0YBo8SUfKvia7w7FIyd/l6av85pFYRhZscS75MwMnbvY+hcQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "dependencies": { + "strnum": "^2.1.0" + }, + "bin": { + "fxparser": "src/cli/cli.js" + } + }, + "node_modules/@amzn/sql-workbench-client/node_modules/strnum": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.1.1.tgz", + "integrity": "sha512-7ZvoFTiCnGxBtDqJ//Cu6fWtZtc7Y3x+QOirG15wztbdngGSkht27o2pyGWrVy0b4WAy3jbKmnoK6g5VlVNUUw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT" + }, "node_modules/@aws-crypto/crc32": { "version": "5.2.0", "license": "Apache-2.0", @@ -42573,6 +43667,7 @@ "@amzn/codewhisperer-streaming": "file:../../src.gen/@amzn/codewhisperer-streaming", "@amzn/glue-catalog-client": "file:../../src.gen/@amzn/glue-catalog-client/0.0.1.tgz", "@amzn/sagemaker-client": "file:../../src.gen/@amzn/sagemaker-client/1.0.0.tgz", + "@amzn/sql-workbench-client": "file:../../src.gen/@amzn/sql-workbench-client/3.0.0.tgz", "@aws-sdk/client-accessanalyzer": "^3.888.0", "@aws-sdk/client-api-gateway": "<3.731.0", "@aws-sdk/client-apprunner": "<3.731.0", diff --git a/packages/core/package.json b/packages/core/package.json index 7d0d08721b3..bd924aabbda 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -582,6 +582,7 @@ "@amzn/codewhisperer-streaming": "file:../../src.gen/@amzn/codewhisperer-streaming", "@amzn/sagemaker-client": "file:../../src.gen/@amzn/sagemaker-client/1.0.0.tgz", "@amzn/glue-catalog-client": "file:../../src.gen/@amzn/glue-catalog-client/0.0.1.tgz", + "@amzn/sql-workbench-client": "file:../../src.gen/@amzn/sql-workbench-client/3.0.0.tgz", "@aws-sdk/client-accessanalyzer": "^3.888.0", "@aws-sdk/client-api-gateway": "<3.731.0", "@aws-sdk/client-apprunner": "<3.731.0", diff --git a/packages/core/scripts/build/generateServiceClient.ts b/packages/core/scripts/build/generateServiceClient.ts index 6e6829fd1ec..35bb6cd4d61 100644 --- a/packages/core/scripts/build/generateServiceClient.ts +++ b/packages/core/scripts/build/generateServiceClient.ts @@ -241,10 +241,6 @@ void (async () => { serviceJsonPath: 'src/codewhisperer/client/user-service-2.json', serviceName: 'CodeWhispererUserClient', }, - { - serviceJsonPath: 'src/sagemakerunifiedstudio/shared/client/sqlworkbench.json', - serviceName: 'SQLWorkbench', - }, { serviceJsonPath: 'src/sagemakerunifiedstudio/shared/client/datazonecustomclient.json', serviceName: 'DataZoneCustomClient', diff --git a/packages/core/src/sagemakerunifiedstudio/explorer/nodes/redshiftStrategy.ts b/packages/core/src/sagemakerunifiedstudio/explorer/nodes/redshiftStrategy.ts index 45d82c44ecd..a183bf69e71 100644 --- a/packages/core/src/sagemakerunifiedstudio/explorer/nodes/redshiftStrategy.ts +++ b/packages/core/src/sagemakerunifiedstudio/explorer/nodes/redshiftStrategy.ts @@ -441,9 +441,15 @@ function createSchemaNode(schemaName: string, connectionConfig: ConnectionConfig // Get schema objects // Make sure we're using the correct database in the connection config + const databaseName = parent.data.path?.database || connectionConfig.database + if (!databaseName) { + logger.error('Database name is required but was not found in path or connection config') + return [createErrorItem('Database name is missing', 'schema-contents', node.id) as RedshiftNode] + } + const schemaConnectionConfig = { ...connectionConfig, - database: parent.data.path?.database || connectionConfig.database, + database: databaseName, } // Create request params object for logging @@ -458,7 +464,7 @@ function createSchemaNode(schemaName: string, connectionConfig: ConnectionConfig parentType: ResourceType.SCHEMA, }, { - parentId: schemaConnectionConfig.database, + parentId: databaseName, parentType: ResourceType.DATABASE, }, ], diff --git a/packages/core/src/sagemakerunifiedstudio/shared/client/sqlWorkbenchClient.ts b/packages/core/src/sagemakerunifiedstudio/shared/client/sqlWorkbenchClient.ts index 76527d1d622..d9d3d853b80 100644 --- a/packages/core/src/sagemakerunifiedstudio/shared/client/sqlWorkbenchClient.ts +++ b/packages/core/src/sagemakerunifiedstudio/shared/client/sqlWorkbenchClient.ts @@ -3,40 +3,28 @@ * SPDX-License-Identifier: Apache-2.0 */ -import { Service } from 'aws-sdk' -import { ServiceConfigurationOptions } from 'aws-sdk/lib/service' -import globals from '../../../shared/extensionGlobals' import { getLogger } from '../../../shared/logger/logger' -import * as SQLWorkbench from './sqlworkbench' -import apiConfig = require('./sqlworkbench.json') +import { + SQLWorkbench, + GetResourcesCommand, + ExecuteQueryCommand, + GetResourcesRequest, + GetResourcesResponse, + ExecuteQueryRequest, + DatabaseConnectionConfiguration, + ParentResource, + DatabaseIntegrationConnectionAuthenticationTypes, +} from '@amzn/sql-workbench-client' import { v4 as uuidv4 } from 'uuid' import { getRedshiftTypeFromHost } from '../../explorer/nodes/utils' -import { DatabaseIntegrationConnectionAuthenticationTypes, RedshiftType } from '../../explorer/nodes/types' +import { RedshiftType } from '../../explorer/nodes/types' import { ConnectionCredentialsProvider } from '../../auth/providers/connectionCredentialsProvider' -import { adaptConnectionCredentialsProvider } from './credentialsAdapter' /** * Connection configuration for SQL Workbench + * This is an alias for the SDK's DatabaseConnectionConfiguration type */ -export interface ConnectionConfig { - id: string - type: string - databaseType: string - connectableResourceIdentifier: string - connectableResourceType: string - database: string - auth?: { - secretArn?: string - } -} - -/** - * Resource parent information - */ -export interface ParentResource { - parentId: string - parentType: string -} +export type ConnectionConfig = DatabaseConnectionConfiguration /** * Gets a SQL Workbench ARN @@ -89,7 +77,7 @@ export async function createRedshiftConnectionConfig( } // Determine auth type based on the provided parameters - let authType: string + let authType: DatabaseIntegrationConnectionAuthenticationTypes if (secretArn) { authType = DatabaseIntegrationConnectionAuthenticationTypes.SECRET @@ -118,11 +106,7 @@ export async function createRedshiftConnectionConfig( } // Add auth object for SECRET authentication type - if ( - (authType as DatabaseIntegrationConnectionAuthenticationTypes) === - DatabaseIntegrationConnectionAuthenticationTypes.SECRET && - secretArn - ) { + if (authType === DatabaseIntegrationConnectionAuthenticationTypes.SECRET && secretArn) { connectionConfig.auth = { secretArn } } @@ -177,7 +161,7 @@ export class SQLWorkbenchClient { /** * Gets resources from SQL Workbench * @param params Request parameters - * @returns Raw response from getResources API + * @returns Response containing resources and optional next token */ public async getResources(params: { connection: ConnectionConfig @@ -187,13 +171,13 @@ export class SQLWorkbenchClient { parents?: ParentResource[] pageToken?: string forceRefresh?: boolean - }): Promise { + }): Promise { try { this.logger.info(`SQLWorkbenchClient: Getting resources in region ${this.region}`) const sqlClient = await this.getSQLClient() - const requestParams = { + const requestParams: GetResourcesRequest = { connection: params.connection, type: params.resourceType, maxItems: params.maxItems || 100, @@ -203,13 +187,9 @@ export class SQLWorkbenchClient { accountSettings: {}, } - // Call the GetResources API - const response = await sqlClient.getResources(requestParams).promise() - - return { - resources: response.resources || [], - nextToken: response.nextToken, - } + // Call the GetResources API using SDK v3 Command pattern + const command = new GetResourcesCommand(requestParams) + return await sqlClient.send(command) } catch (err) { this.logger.error('SQLWorkbenchClient: Failed to get resources: %s', err as Error) throw err @@ -228,26 +208,27 @@ export class SQLWorkbenchClient { const sqlClient = await this.getSQLClient() - // Call the ExecuteQuery API - const response = await sqlClient - .executeQuery({ - connection: connectionConfig as any, - databaseType: 'REDSHIFT', - accountSettings: {}, - executionContext: [ - { - parentType: 'DATABASE', - parentId: connectionConfig.database || '', - }, - ], - query, - queryExecutionType: 'NO_SESSION', - queryResponseDeliveryType: 'ASYNC', - maxItems: 100, - ignoreHistory: true, - tabId: 'data_explorer', - }) - .promise() + const requestParams: ExecuteQueryRequest = { + connection: connectionConfig, + databaseType: 'REDSHIFT', + accountSettings: {}, + executionContext: [ + { + parentType: 'DATABASE', + parentId: connectionConfig.database || '', + }, + ], + query, + queryExecutionType: 'NO_SESSION', + queryResponseDeliveryType: 'ASYNC', + maxItems: 100, + ignoreHistory: true, + tabId: 'data_explorer', + } + + // Call the ExecuteQuery API using SDK v3 Command pattern + const command = new ExecuteQueryCommand(requestParams) + const response = await sqlClient.send(command) // Log the response this.logger.info( @@ -261,9 +242,6 @@ export class SQLWorkbenchClient { } } - /** - * Gets the SQL client, initializing it if necessary - */ /** * Gets the SQL Workbench endpoint URL for the given region * @param region AWS region @@ -273,6 +251,9 @@ export class SQLWorkbenchClient { return `https://api-v2.sqlworkbench.${region}.amazonaws.com` } + /** + * Gets the SQL client, initializing it if necessary + */ private async getSQLClient(): Promise { if (!this.sqlClient) { try { @@ -281,30 +262,27 @@ export class SQLWorkbenchClient { this.logger.info(`Using SQL Workbench endpoint: ${endpoint}`) if (this.connectionCredentialsProvider) { - // Create client with provided credentials - this.sqlClient = (await globals.sdkClientBuilder.createAwsService( - Service, - { - apiConfig: apiConfig, - region: this.region, - endpoint: endpoint, - credentialProvider: adaptConnectionCredentialsProvider(this.connectionCredentialsProvider), - } as ServiceConfigurationOptions, - undefined, - false - )) as SQLWorkbench + // Create client with credential provider function for auto-refresh + const awsCredentialProvider = async () => { + const credentials = await this.connectionCredentialsProvider!.getCredentials() + return { + accessKeyId: credentials.accessKeyId, + secretAccessKey: credentials.secretAccessKey, + sessionToken: credentials.sessionToken, + expiration: credentials.expiration, + } + } + this.sqlClient = new SQLWorkbench({ + region: this.region, + endpoint: endpoint, + credentials: awsCredentialProvider, + }) } else { - // Use the SDK client builder for default credentials - this.sqlClient = (await globals.sdkClientBuilder.createAwsService( - Service, - { - apiConfig: apiConfig, - region: this.region, - endpoint: endpoint, - } as ServiceConfigurationOptions, - undefined, - false - )) as SQLWorkbench + // Use default credentials + this.sqlClient = new SQLWorkbench({ + region: this.region, + endpoint: endpoint, + }) } this.logger.debug('SQLWorkbenchClient: Successfully created SQL client') diff --git a/packages/core/src/sagemakerunifiedstudio/shared/client/sqlworkbench.json b/packages/core/src/sagemakerunifiedstudio/shared/client/sqlworkbench.json deleted file mode 100644 index e403ec34a88..00000000000 --- a/packages/core/src/sagemakerunifiedstudio/shared/client/sqlworkbench.json +++ /dev/null @@ -1,2102 +0,0 @@ -{ - "version": "2.0", - "metadata": { - "apiVersion": "2024-02-12", - "auth": ["aws.auth#sigv4"], - "endpointPrefix": "sqlworkbench", - "protocol": "rest-json", - "protocols": ["rest-json"], - "serviceFullName": "AmazonSQLWorkbench", - "serviceId": "SQLWorkbench", - "signatureVersion": "v4", - "signingName": "sqlworkbench", - "uid": "sqlworkbench-2024-02-12" - }, - "operations": { - "CancelQueries": { - "name": "CancelQueries", - "http": { - "method": "POST", - "requestUri": "/database/cancelQueries", - "responseCode": 200 - }, - "input": { "shape": "CancelQueriesRequest" }, - "output": { "shape": "CancelQueriesResponse" }, - "errors": [ - { "shape": "ThrottlingException" }, - { "shape": "BadRequestError" }, - { "shape": "ResourceNotFoundException" }, - { "shape": "ServiceQuotaExceededException" }, - { "shape": "AccessDeniedException" }, - { "shape": "ConflictException" }, - { "shape": "InternalServerError" }, - { "shape": "ValidationException" } - ] - }, - "CreateConnection": { - "name": "CreateConnection", - "http": { - "method": "PUT", - "requestUri": "/connections", - "responseCode": 200 - }, - "input": { "shape": "CreateConnectionRequest" }, - "output": { "shape": "CreateConnectionResponse" }, - "errors": [ - { "shape": "ThrottlingException" }, - { "shape": "ResourceNotFoundException" }, - { "shape": "ServiceQuotaExceededException" }, - { "shape": "AccessDeniedException" }, - { "shape": "ConflictException" }, - { "shape": "InternalServerError" }, - { "shape": "ValidationException" } - ] - }, - "DeleteConnection": { - "name": "DeleteConnection", - "http": { - "method": "DELETE", - "requestUri": "/connections/{connectionId}", - "responseCode": 200 - }, - "input": { "shape": "DeleteConnectionRequest" }, - "output": { "shape": "DeleteConnectionResponse" }, - "errors": [ - { "shape": "ThrottlingException" }, - { "shape": "ResourceNotFoundException" }, - { "shape": "ServiceQuotaExceededException" }, - { "shape": "AccessDeniedException" }, - { "shape": "ConflictException" }, - { "shape": "InternalServerError" }, - { "shape": "ValidationException" } - ] - }, - "ExecuteQuery": { - "name": "ExecuteQuery", - "http": { - "method": "POST", - "requestUri": "/database/executeQuery", - "responseCode": 200 - }, - "input": { "shape": "ExecuteQueryRequest" }, - "output": { "shape": "ExecuteQueryResponse" }, - "errors": [ - { "shape": "ThrottlingException" }, - { "shape": "BadRequestError" }, - { "shape": "ResourceNotFoundException" }, - { "shape": "ServiceQuotaExceededException" }, - { "shape": "AccessDeniedException" }, - { "shape": "ConflictException" }, - { "shape": "InternalServerError" }, - { "shape": "ValidationException" } - ] - }, - "ExportQueryResults": { - "name": "ExportQueryResults", - "http": { - "method": "POST", - "requestUri": "/database/exportResults", - "responseCode": 200 - }, - "input": { "shape": "ExportQueryResultsRequest" }, - "output": { "shape": "ExportQueryResultsResponse" }, - "errors": [ - { "shape": "ThrottlingException" }, - { "shape": "BadRequestError" }, - { "shape": "ResourceNotFoundException" }, - { "shape": "ServiceQuotaExceededException" }, - { "shape": "AccessDeniedException" }, - { "shape": "ConflictException" }, - { "shape": "InternalServerError" }, - { "shape": "ValidationException" } - ] - }, - "GetConnectableResources": { - "name": "GetConnectableResources", - "http": { - "method": "POST", - "requestUri": "/database/getConnectableResources", - "responseCode": 200 - }, - "input": { "shape": "GetConnectableResourcesRequest" }, - "output": { "shape": "GetConnectableResourcesResponse" }, - "errors": [ - { "shape": "ThrottlingException" }, - { "shape": "BadRequestError" }, - { "shape": "ResourceNotFoundException" }, - { "shape": "ServiceQuotaExceededException" }, - { "shape": "AccessDeniedException" }, - { "shape": "ConflictException" }, - { "shape": "InternalServerError" }, - { "shape": "ValidationException" } - ] - }, - "GetConnection": { - "name": "GetConnection", - "http": { - "method": "GET", - "requestUri": "/connections/{connectionId}", - "responseCode": 200 - }, - "input": { "shape": "GetConnectionRequest" }, - "output": { "shape": "GetConnectionResponse" }, - "errors": [ - { "shape": "ThrottlingException" }, - { "shape": "ResourceNotFoundException" }, - { "shape": "ServiceQuotaExceededException" }, - { "shape": "AccessDeniedException" }, - { "shape": "ConflictException" }, - { "shape": "InternalServerError" }, - { "shape": "ValidationException" } - ] - }, - "GetDatabaseConfigurations": { - "name": "GetDatabaseConfigurations", - "http": { - "method": "POST", - "requestUri": "/database/configurations", - "responseCode": 200 - }, - "input": { "shape": "GetDatabaseConfigurationsRequest" }, - "output": { "shape": "GetDatabaseConfigurationsResponse" }, - "errors": [ - { "shape": "ThrottlingException" }, - { "shape": "BadRequestError" }, - { "shape": "ResourceNotFoundException" }, - { "shape": "ServiceQuotaExceededException" }, - { "shape": "AccessDeniedException" }, - { "shape": "ConflictException" }, - { "shape": "InternalServerError" }, - { "shape": "ValidationException" } - ] - }, - "GetQueryExecutionHistory": { - "name": "GetQueryExecutionHistory", - "http": { - "method": "POST", - "requestUri": "/queryExecutionHistory/details", - "responseCode": 200 - }, - "input": { "shape": "GetQueryExecutionHistoryRequest" }, - "output": { "shape": "GetQueryExecutionHistoryResponse" }, - "errors": [ - { "shape": "ThrottlingException" }, - { "shape": "BadRequestError" }, - { "shape": "ResourceNotFoundException" }, - { "shape": "ServiceQuotaExceededException" }, - { "shape": "AccessDeniedException" }, - { "shape": "ConflictException" }, - { "shape": "InternalServerError" }, - { "shape": "ValidationException" } - ] - }, - "GetQueryResult": { - "name": "GetQueryResult", - "http": { - "method": "POST", - "requestUri": "/database/getQueryResults", - "responseCode": 200 - }, - "input": { "shape": "GetQueryResultRequest" }, - "output": { "shape": "GetQueryResultResponse" }, - "errors": [ - { "shape": "ThrottlingException" }, - { "shape": "BadRequestError" }, - { "shape": "ResourceNotFoundException" }, - { "shape": "ServiceQuotaExceededException" }, - { "shape": "AccessDeniedException" }, - { "shape": "ConflictException" }, - { "shape": "InternalServerError" }, - { "shape": "ValidationException" } - ] - }, - "GetResources": { - "name": "GetResources", - "http": { - "method": "POST", - "requestUri": "/database/getResources", - "responseCode": 200 - }, - "input": { "shape": "GetResourcesRequest" }, - "output": { "shape": "GetResourcesResponse" }, - "errors": [ - { "shape": "ThrottlingException" }, - { "shape": "BadRequestError" }, - { "shape": "ResourceNotFoundException" }, - { "shape": "ServiceQuotaExceededException" }, - { "shape": "AccessDeniedException" }, - { "shape": "ConflictException" }, - { "shape": "InternalServerError" }, - { "shape": "ValidationException" } - ] - }, - "GetTabStates": { - "name": "GetTabStates", - "http": { - "method": "POST", - "requestUri": "/tab/state", - "responseCode": 200 - }, - "input": { "shape": "GetTabStatesRequest" }, - "output": { "shape": "GetTabStatesResponse" }, - "errors": [ - { "shape": "ThrottlingException" }, - { "shape": "BadRequestError" }, - { "shape": "ResourceNotFoundException" }, - { "shape": "ServiceQuotaExceededException" }, - { "shape": "AccessDeniedException" }, - { "shape": "ConflictException" }, - { "shape": "InternalServerError" }, - { "shape": "ValidationException" } - ] - }, - "ListQueryExecutionHistory": { - "name": "ListQueryExecutionHistory", - "http": { - "method": "POST", - "requestUri": "/queryExecutionHistory/list", - "responseCode": 200 - }, - "input": { "shape": "ListQueryExecutionHistoryRequest" }, - "output": { "shape": "ListQueryExecutionHistoryResponse" }, - "errors": [ - { "shape": "ThrottlingException" }, - { "shape": "BadRequestError" }, - { "shape": "ResourceNotFoundException" }, - { "shape": "ServiceQuotaExceededException" }, - { "shape": "AccessDeniedException" }, - { "shape": "ConflictException" }, - { "shape": "InternalServerError" }, - { "shape": "ValidationException" } - ] - }, - "ListTagsForResource": { - "name": "ListTagsForResource", - "http": { - "method": "GET", - "requestUri": "/tags/{resourceArn}", - "responseCode": 200 - }, - "input": { "shape": "ListTagsForResourceRequest" }, - "output": { "shape": "ListTagsForResourceResponse" }, - "errors": [ - { "shape": "BadRequestError" }, - { "shape": "ThrottlingException" }, - { "shape": "ResourceNotFoundException" }, - { "shape": "ServiceQuotaExceededException" }, - { "shape": "AccessDeniedException" }, - { "shape": "ConflictException" }, - { "shape": "InternalServerError" }, - { "shape": "ValidationException" } - ] - }, - "PollQueryExecutionEvents": { - "name": "PollQueryExecutionEvents", - "http": { - "method": "POST", - "requestUri": "/database/pollQueryExecutionEvents", - "responseCode": 200 - }, - "input": { "shape": "PollQueryExecutionEventsRequest" }, - "output": { "shape": "PollQueryExecutionEventsResponse" }, - "errors": [ - { "shape": "ThrottlingException" }, - { "shape": "BadRequestError" }, - { "shape": "ResourceNotFoundException" }, - { "shape": "ServiceQuotaExceededException" }, - { "shape": "AccessDeniedException" }, - { "shape": "ConflictException" }, - { "shape": "InternalServerError" }, - { "shape": "ValidationException" } - ] - }, - "TagResource": { - "name": "TagResource", - "http": { - "method": "POST", - "requestUri": "/tags/{resourceArn}", - "responseCode": 204 - }, - "input": { "shape": "TagResourceRequest" }, - "output": { "shape": "TagResourceResponse" }, - "errors": [ - { "shape": "BadRequestError" }, - { "shape": "ThrottlingException" }, - { "shape": "ResourceNotFoundException" }, - { "shape": "ServiceQuotaExceededException" }, - { "shape": "AccessDeniedException" }, - { "shape": "ConflictException" }, - { "shape": "InternalServerError" }, - { "shape": "ValidationException" } - ] - }, - "UntagResource": { - "name": "UntagResource", - "http": { - "method": "DELETE", - "requestUri": "/tags/{resourceArn}", - "responseCode": 204 - }, - "input": { "shape": "UntagResourceRequest" }, - "output": { "shape": "UntagResourceResponse" }, - "errors": [ - { "shape": "BadRequestError" }, - { "shape": "ThrottlingException" }, - { "shape": "ResourceNotFoundException" }, - { "shape": "ServiceQuotaExceededException" }, - { "shape": "AccessDeniedException" }, - { "shape": "ConflictException" }, - { "shape": "InternalServerError" }, - { "shape": "ValidationException" } - ], - "idempotent": true - }, - "UpdateConnection": { - "name": "UpdateConnection", - "http": { - "method": "POST", - "requestUri": "/connections", - "responseCode": 200 - }, - "input": { "shape": "UpdateConnectionRequest" }, - "output": { "shape": "UpdateConnectionResponse" }, - "errors": [ - { "shape": "ThrottlingException" }, - { "shape": "ResourceNotFoundException" }, - { "shape": "ServiceQuotaExceededException" }, - { "shape": "AccessDeniedException" }, - { "shape": "ConflictException" }, - { "shape": "InternalServerError" }, - { "shape": "ValidationException" } - ] - }, - "VerifyResourcesExistForTagris": { - "name": "VerifyResourcesExistForTagris", - "http": { - "method": "POST", - "requestUri": "/verifyResourcesExistForTagris", - "responseCode": 200 - }, - "input": { "shape": "TagrisVerifyResourcesExistInput" }, - "output": { "shape": "TagrisVerifyResourcesExistOutput" }, - "errors": [ - { "shape": "ThrottlingException" }, - { "shape": "InternalServerError" }, - { "shape": "TagrisInvalidParameterException" }, - { "shape": "TagrisAccessDeniedException" }, - { "shape": "TagrisInvalidArnException" }, - { "shape": "ResourceNotFoundException" }, - { "shape": "TagrisInternalServiceException" }, - { "shape": "ServiceQuotaExceededException" }, - { "shape": "AccessDeniedException" }, - { "shape": "TagrisPartialResourcesExistResultsException" }, - { "shape": "TagrisThrottledException" }, - { "shape": "ConflictException" }, - { "shape": "ValidationException" } - ] - } - }, - "shapes": { - "AccessDeniedException": { - "type": "structure", - "required": ["message"], - "members": { - "message": { "shape": "String" }, - "code": { "shape": "ErrorCode" } - }, - "error": { - "httpStatusCode": 403, - "senderFault": true - }, - "exception": true - }, - "AckIds": { - "type": "list", - "member": { "shape": "AckIdsMemberString" } - }, - "AckIdsMemberString": { - "type": "string", - "max": 100, - "min": 0 - }, - "Arn": { - "type": "string", - "max": 1011, - "min": 20 - }, - "AvailableConnectionConfigurationOptions": { - "type": "list", - "member": { "shape": "AvailableConnectionConfigurationOptionsMemberString" } - }, - "AvailableConnectionConfigurationOptionsMemberString": { - "type": "string", - "max": 50, - "min": 0 - }, - "BadRequestError": { - "type": "structure", - "required": ["message"], - "members": { - "message": { "shape": "String" }, - "code": { "shape": "ErrorCode" } - }, - "error": { - "httpStatusCode": 400, - "senderFault": true - }, - "exception": true - }, - "Boolean": { - "type": "boolean", - "box": true - }, - "CancelQueriesRequest": { - "type": "structure", - "required": ["queryExecutionIds", "databaseType"], - "members": { - "sqlworkbenchSource": { - "shape": "SqlworkbenchSource", - "location": "header", - "locationName": "sqlworkbench-source" - }, - "accountSettings": { "shape": "DatabaseConnectionAccountSettings" }, - "queryExecutionIds": { "shape": "CancelQueriesRequestQueryExecutionIdsList" }, - "databaseType": { - "shape": "DatabaseType", - "location": "querystring", - "locationName": "databaseType" - } - } - }, - "CancelQueriesRequestQueryExecutionIdsList": { - "type": "list", - "member": { "shape": "CancelQueriesRequestQueryExecutionIdsListMemberString" }, - "max": 100, - "min": 1 - }, - "CancelQueriesRequestQueryExecutionIdsListMemberString": { - "type": "string", - "max": 100, - "min": 1 - }, - "CancelQueriesResponse": { - "type": "structure", - "required": ["cancelQueryResponses"], - "members": { - "cancelQueryResponses": { "shape": "CancelQueryResponses" } - } - }, - "CancelQueryResponse": { - "type": "structure", - "required": ["queryExecutionId"], - "members": { - "queryExecutionId": { "shape": "CancelQueryResponseQueryExecutionIdString" }, - "queryCancellationStatus": { "shape": "QueryCancellationStatus" } - } - }, - "CancelQueryResponseQueryExecutionIdString": { - "type": "string", - "max": 1000, - "min": 0 - }, - "CancelQueryResponses": { - "type": "list", - "member": { "shape": "CancelQueryResponse" } - }, - "ChildObjectTypes": { - "type": "list", - "member": { "shape": "ChildObjectTypesMemberString" } - }, - "ChildObjectTypesMemberString": { - "type": "string", - "max": 50, - "min": 0 - }, - "Columns": { - "type": "list", - "member": { "shape": "QueryResultCellValue" } - }, - "ConflictException": { - "type": "structure", - "required": ["message"], - "members": { - "message": { "shape": "String" }, - "code": { "shape": "ErrorCode" } - }, - "error": { - "httpStatusCode": 409, - "senderFault": true - }, - "exception": true - }, - "ConnectableResource": { - "type": "structure", - "required": ["displayName", "identifier", "childObjectTypes", "availableConnectionConfigurationOptions"], - "members": { - "displayName": { "shape": "ResourceDisplayName" }, - "identifier": { "shape": "ResourceIdentifier" }, - "type": { "shape": "ConnectableResourceTypeString" }, - "unavailable": { "shape": "Boolean" }, - "tooltipTranslationKey": { "shape": "ConnectableResourceTooltipTranslationKeyString" }, - "childObjectTypes": { "shape": "ChildObjectTypes" }, - "availableConnectionConfigurationOptions": { "shape": "AvailableConnectionConfigurationOptions" } - } - }, - "ConnectableResourceTooltipTranslationKeyString": { - "type": "string", - "max": 50, - "min": 0 - }, - "ConnectableResourceTypeString": { - "type": "string", - "max": 50, - "min": 0 - }, - "ConnectableResourceTypes": { - "type": "list", - "member": { "shape": "ConnectableResourceTypesMemberString" } - }, - "ConnectableResourceTypesMemberString": { - "type": "string", - "max": 50, - "min": 0 - }, - "ConnectableResources": { - "type": "list", - "member": { "shape": "ConnectableResource" } - }, - "Connection": { - "type": "structure", - "members": { - "id": { - "shape": "String", - "documentation": "

Id of the connection

" - }, - "name": { - "shape": "ConnectionName", - "documentation": "

Name of the connection

" - }, - "authenticationType": { - "shape": "ConnectionAuthenticationTypes", - "documentation": "

Number representing the type of authentication to use (2 = IAM, 3 = Username and Password). Today we only support the types 2 and 3

" - }, - "secretArn": { - "shape": "String", - "documentation": "

Secret that is linked to this connection

" - }, - "databaseName": { - "shape": "DatabaseName", - "documentation": "

Name of the database where the query is run

" - }, - "clusterId": { - "shape": "String", - "documentation": "

Id of the cluster of the connection

" - }, - "dbUser": { - "shape": "DbUser", - "documentation": "

User of the database

" - }, - "isServerless": { "shape": "Boolean" }, - "isProd": { "shape": "String" }, - "isEnabled": { "shape": "String" }, - "userSettings": { "shape": "UserSettings" }, - "recordDate": { "shape": "String" }, - "updatedDate": { "shape": "String" }, - "tags": { "shape": "Tags" }, - "databaseType": { "shape": "DatabaseType" }, - "connectableResourceType": { "shape": "String" }, - "connectableResourceIdentifier": { "shape": "ResourceIdentifier" } - } - }, - "ConnectionAuthenticationTypes": { - "type": "string", - "enum": ["2", "3", "4", "5", "6", "7", "8"], - "sensitive": true - }, - "ConnectionName": { - "type": "string", - "sensitive": true - }, - "ConnectionProperties": { - "type": "map", - "key": { "shape": "ConnectionPropertyKey" }, - "value": { "shape": "ConnectionPropertyValue" }, - "max": 50, - "min": 1 - }, - "ConnectionPropertyKey": { - "type": "string", - "max": 1000, - "min": 1 - }, - "ConnectionPropertyValue": { - "type": "string", - "max": 1000, - "min": 0 - }, - "CreateConnectionRequest": { - "type": "structure", - "required": ["name", "databaseName", "authenticationType"], - "members": { - "sqlworkbenchSource": { - "shape": "SqlworkbenchSource", - "location": "header", - "locationName": "sqlworkbench-source" - }, - "name": { - "shape": "CreateConnectionRequestNameString", - "documentation": "

Name of the connection

" - }, - "databaseName": { - "shape": "CreateConnectionRequestDatabaseNameString", - "documentation": "

Name of the database used for this connection

" - }, - "authenticationType": { - "shape": "CreateConnectionRequestAuthenticationTypeEnum", - "documentation": "

Number representing the type of authentication to use (2 = IAM, 3 = Username and Password, 4 = Federated connection)

" - }, - "isProd": { "shape": "CreateConnectionRequestIsProdString" }, - "userSettings": { "shape": "UserSettings" }, - "secretArn": { - "shape": "CreateConnectionRequestSecretArnString", - "documentation": "

secretArn for redshift cluster

" - }, - "clusterId": { - "shape": "CreateConnectionRequestClusterIdString", - "documentation": "

Id of the cluster used for this connection

" - }, - "isServerless": { - "shape": "Boolean", - "documentation": "

Is serverless connection

" - }, - "dbUser": { - "shape": "DbUser", - "documentation": "

User of the database used for this connection

" - }, - "isStoreNewSecret": { "shape": "CreateConnectionRequestIsStoreNewSecretString" }, - "username": { - "shape": "DbUser", - "documentation": "

Username used in the Username_Password connection type

" - }, - "password": { - "shape": "CreateConnectionRequestPasswordString", - "documentation": "

Password of the user used for this connection

" - }, - "tags": { "shape": "Tags" }, - "host": { - "shape": "CreateConnectionRequestHostString", - "documentation": "

Host address used for creating secret for Username_Password connection type

" - }, - "secretName": { "shape": "CreateConnectionRequestSecretNameString" }, - "description": { "shape": "CreateConnectionRequestDescriptionString" }, - "databaseType": { "shape": "DatabaseType" }, - "connectableResourceIdentifier": { - "shape": "CreateConnectionRequestConnectableResourceIdentifierString", - "documentation": "

Id of the connectable resource used for this connection

" - }, - "connectableResourceType": { - "shape": "CreateConnectionRequestConnectableResourceTypeString", - "documentation": "

Type of the connectable resource used for this connection

" - } - } - }, - "CreateConnectionRequestAuthenticationTypeEnum": { - "type": "string", - "enum": ["2", "3", "4", "5", "6", "7", "8"], - "max": 1, - "min": 1, - "sensitive": true - }, - "CreateConnectionRequestClusterIdString": { - "type": "string", - "max": 63, - "min": 1 - }, - "CreateConnectionRequestConnectableResourceIdentifierString": { - "type": "string", - "max": 63, - "min": 1, - "sensitive": true - }, - "CreateConnectionRequestConnectableResourceTypeString": { - "type": "string", - "max": 63, - "min": 1 - }, - "CreateConnectionRequestDatabaseNameString": { - "type": "string", - "max": 64, - "min": 1, - "sensitive": true - }, - "CreateConnectionRequestDescriptionString": { - "type": "string", - "max": 1000, - "min": 0 - }, - "CreateConnectionRequestHostString": { - "type": "string", - "max": 1000, - "min": 0 - }, - "CreateConnectionRequestIsProdString": { - "type": "string", - "max": 1000, - "min": 0 - }, - "CreateConnectionRequestIsStoreNewSecretString": { - "type": "string", - "max": 1000, - "min": 0 - }, - "CreateConnectionRequestNameString": { - "type": "string", - "max": 512, - "min": 1, - "sensitive": true - }, - "CreateConnectionRequestPasswordString": { - "type": "string", - "max": 64, - "min": 8, - "sensitive": true - }, - "CreateConnectionRequestSecretArnString": { - "type": "string", - "max": 1000, - "min": 1 - }, - "CreateConnectionRequestSecretNameString": { - "type": "string", - "max": 1000, - "min": 0 - }, - "CreateConnectionResponse": { - "type": "structure", - "members": { - "data": { "shape": "Connection" } - } - }, - "DatabaseAuthenticationMethod": { - "type": "string", - "enum": ["USERNAME_PASSWORD", "TEMPORARY_CREDENTIALS_WITH_IAM"] - }, - "DatabaseAuthenticationMethods": { - "type": "list", - "member": { "shape": "DatabaseAuthenticationMethod" } - }, - "DatabaseAuthenticationOption": { - "type": "structure", - "required": ["connectableResourceType", "authenticationMethods"], - "members": { - "connectableResourceType": { "shape": "String" }, - "authenticationMethods": { "shape": "DatabaseAuthenticationMethods" } - } - }, - "DatabaseAuthenticationOptions": { - "type": "list", - "member": { "shape": "DatabaseAuthenticationOption" } - }, - "DatabaseConfiguration": { - "type": "structure", - "required": [ - "databaseType", - "authenticationOptions", - "connectableResourceTypes", - "sessionSupported", - "eventAcknowledgementSupported", - "appendingLimitToQuerySupported", - "queryStatsSupported" - ], - "members": { - "databaseType": { "shape": "DatabaseType" }, - "authenticationOptions": { "shape": "DatabaseAuthenticationOptions" }, - "connectableResourceTypes": { "shape": "ConnectableResourceTypes" }, - "sessionSupported": { "shape": "Boolean" }, - "eventAcknowledgementSupported": { "shape": "Boolean" }, - "appendingLimitToQuerySupported": { "shape": "Boolean" }, - "queryStatsSupported": { "shape": "Boolean" } - } - }, - "DatabaseConfigurations": { - "type": "list", - "member": { "shape": "DatabaseConfiguration" } - }, - "DatabaseConnectionAccountSettings": { - "type": "structure", - "members": { - "masterKeyArn": { "shape": "KmsKeyArn" } - } - }, - "DatabaseConnectionConfiguration": { - "type": "structure", - "required": ["id", "type", "databaseType", "connectableResourceIdentifier", "connectableResourceType"], - "members": { - "id": { "shape": "DatabaseConnectionConfigurationIdString" }, - "type": { "shape": "DatabaseIntegrationConnectionAuthenticationTypes" }, - "auth": { "shape": "DatabaseConnectionConfigurationAuth" }, - "databaseType": { "shape": "DatabaseType" }, - "connectableResourceIdentifier": { "shape": "ResourceIdentifier" }, - "connectableResourceType": { "shape": "DatabaseConnectionConfigurationConnectableResourceTypeString" }, - "database": { "shape": "DatabaseName" } - } - }, - "DatabaseConnectionConfigurationAuth": { - "type": "structure", - "members": { - "secretArn": { "shape": "SecretKeyArn" }, - "username": { "shape": "DatabaseConnectionConfigurationAuthUsernameString" }, - "password": { "shape": "DatabaseConnectionConfigurationAuthPasswordString" } - } - }, - "DatabaseConnectionConfigurationAuthPasswordString": { - "type": "string", - "max": 1000, - "min": 0, - "sensitive": true - }, - "DatabaseConnectionConfigurationAuthUsernameString": { - "type": "string", - "max": 1000, - "min": 0, - "sensitive": true - }, - "DatabaseConnectionConfigurationConnectableResourceTypeString": { - "type": "string", - "max": 50, - "min": 0 - }, - "DatabaseConnectionConfigurationIdString": { - "type": "string", - "max": 2048, - "min": 32 - }, - "DatabaseIntegrationConnectionAuthenticationTypes": { - "type": "string", - "enum": ["4", "5", "6", "8"], - "sensitive": true - }, - "DatabaseName": { - "type": "string", - "max": 150, - "min": 0, - "sensitive": true - }, - "DatabaseType": { - "type": "string", - "enum": ["REDSHIFT", "ATHENA"] - }, - "DbUser": { - "type": "string", - "max": 127, - "min": 1, - "pattern": "[a-zA-Z0-9_][a-zA-Z_0-9+.@$-]*", - "sensitive": true - }, - "DeleteConnectionRequest": { - "type": "structure", - "required": ["connectionId"], - "members": { - "sqlworkbenchSource": { - "shape": "SqlworkbenchSource", - "location": "header", - "locationName": "sqlworkbench-source" - }, - "connectionId": { - "shape": "DeleteConnectionRequestConnectionIdString", - "documentation": "

Id of connection to delete

", - "location": "uri", - "locationName": "connectionId" - } - } - }, - "DeleteConnectionRequestConnectionIdString": { - "type": "string", - "max": 1000, - "min": 1 - }, - "DeleteConnectionResponse": { - "type": "structure", - "members": {} - }, - "ErrorCode": { - "type": "string", - "enum": ["QUERY_EXECUTION_NOT_FOUND", "QUERY_EXECUTION_ACCESS_DENIED"] - }, - "ExecuteQueryRequest": { - "type": "structure", - "required": ["query", "queryExecutionType", "queryResponseDeliveryType", "maxItems"], - "members": { - "sqlworkbenchSource": { - "shape": "SqlworkbenchSource", - "location": "header", - "locationName": "sqlworkbench-source" - }, - "connectionId": { "shape": "ExecuteQueryRequestConnectionIdString" }, - "databaseType": { - "shape": "DatabaseType", - "location": "querystring", - "locationName": "databaseType" - }, - "connection": { "shape": "DatabaseConnectionConfiguration" }, - "accountSettings": { "shape": "DatabaseConnectionAccountSettings" }, - "tabId": { "shape": "ExecuteQueryRequestTabIdString" }, - "executionContext": { "shape": "ExecuteQueryRequestExecutionContextList" }, - "query": { "shape": "ExecuteQueryRequestQueryString" }, - "queryExecutionType": { "shape": "QueryExecutionType" }, - "sessionId": { "shape": "ExecuteQueryRequestSessionIdString" }, - "queryResponseDeliveryType": { "shape": "QueryResponseDeliveryType" }, - "maxItems": { "shape": "ExecuteQueryRequestMaxItemsInteger" }, - "limitQueryResults": { "shape": "ExecuteQueryRequestLimitQueryResultsInteger" }, - "isExplain": { "shape": "Boolean" }, - "ignoreHistory": { "shape": "Boolean" }, - "timeoutMillis": { "shape": "ExecuteQueryRequestTimeoutMillisInteger" } - } - }, - "ExecuteQueryRequestConnectionIdString": { - "type": "string", - "max": 2048, - "min": 32 - }, - "ExecuteQueryRequestExecutionContextList": { - "type": "list", - "member": { "shape": "ParentResource" }, - "max": 100, - "min": 0 - }, - "ExecuteQueryRequestLimitQueryResultsInteger": { - "type": "integer", - "box": true, - "max": 1000, - "min": 0 - }, - "ExecuteQueryRequestMaxItemsInteger": { - "type": "integer", - "box": true, - "max": 100, - "min": 20 - }, - "ExecuteQueryRequestQueryString": { - "type": "string", - "max": 1000000, - "min": 0, - "sensitive": true - }, - "ExecuteQueryRequestSessionIdString": { - "type": "string", - "max": 100, - "min": 0 - }, - "ExecuteQueryRequestTabIdString": { - "type": "string", - "max": 100, - "min": 1 - }, - "ExecuteQueryRequestTimeoutMillisInteger": { - "type": "integer", - "box": true, - "max": 120000, - "min": 0 - }, - "ExecuteQueryResponse": { - "type": "structure", - "required": ["queryExecutions"], - "members": { - "sessionId": { "shape": "ExecuteQueryResponseSessionIdString" }, - "queryExecutions": { "shape": "QueryExecutions" }, - "statusCode": { - "shape": "statusCode", - "location": "statusCode" - } - } - }, - "ExecuteQueryResponseSessionIdString": { - "type": "string", - "max": 100, - "min": 0 - }, - "ExportQueryResultsRequest": { - "type": "structure", - "required": ["queryExecutionId", "databaseType"], - "members": { - "sqlworkbenchSource": { - "shape": "SqlworkbenchSource", - "location": "header", - "locationName": "sqlworkbench-source" - }, - "accountSettings": { "shape": "DatabaseConnectionAccountSettings" }, - "queryExecutionId": { "shape": "ExportQueryResultsRequestQueryExecutionIdString" }, - "databaseType": { - "shape": "DatabaseType", - "location": "querystring", - "locationName": "databaseType" - }, - "fileType": { "shape": "FileType" } - } - }, - "ExportQueryResultsRequestQueryExecutionIdString": { - "type": "string", - "max": 100, - "min": 1 - }, - "ExportQueryResultsResponse": { - "type": "structure", - "required": ["queryResult", "contentType", "fileName"], - "members": { - "queryResult": { "shape": "StreamingBlob" }, - "contentType": { - "shape": "String", - "location": "header", - "locationName": "Content-Type" - }, - "fileName": { - "shape": "String", - "location": "header", - "locationName": "Content-Disposition" - } - }, - "payload": "queryResult" - }, - "FileType": { - "type": "string", - "enum": ["JSON", "CSV"] - }, - "FullQueryText": { - "type": "string", - "max": 1000000, - "min": 0, - "sensitive": true - }, - "GetConnectableResourcesRequest": { - "type": "structure", - "required": ["type", "maxItems", "databaseType"], - "members": { - "sqlworkbenchSource": { - "shape": "SqlworkbenchSource", - "location": "header", - "locationName": "sqlworkbench-source" - }, - "accountSettings": { "shape": "DatabaseConnectionAccountSettings" }, - "type": { "shape": "GetConnectableResourcesRequestTypeString" }, - "maxItems": { "shape": "GetConnectableResourcesRequestMaxItemsInteger" }, - "pageToken": { "shape": "PageToken" }, - "databaseType": { - "shape": "DatabaseType", - "location": "querystring", - "locationName": "databaseType" - } - } - }, - "GetConnectableResourcesRequestMaxItemsInteger": { - "type": "integer", - "box": true, - "max": 50, - "min": 20 - }, - "GetConnectableResourcesRequestTypeString": { - "type": "string", - "max": 150, - "min": 0 - }, - "GetConnectableResourcesResponse": { - "type": "structure", - "required": ["connectableResources"], - "members": { - "connectableResources": { "shape": "ConnectableResources" }, - "nextToken": { "shape": "String" } - } - }, - "GetConnectionRequest": { - "type": "structure", - "required": ["connectionId"], - "members": { - "sqlworkbenchSource": { - "shape": "SqlworkbenchSource", - "location": "header", - "locationName": "sqlworkbench-source" - }, - "connectionId": { - "shape": "GetConnectionRequestConnectionIdString", - "documentation": "

Id of connection to delete

", - "location": "uri", - "locationName": "connectionId" - } - } - }, - "GetConnectionRequestConnectionIdString": { - "type": "string", - "max": 1000, - "min": 1 - }, - "GetConnectionResponse": { - "type": "structure", - "members": { - "data": { "shape": "Connection" } - } - }, - "GetDatabaseConfigurationsRequest": { - "type": "structure", - "members": { - "sqlworkbenchSource": { - "shape": "SqlworkbenchSource", - "location": "header", - "locationName": "sqlworkbench-source" - }, - "accountSettings": { "shape": "DatabaseConnectionAccountSettings" } - } - }, - "GetDatabaseConfigurationsResponse": { - "type": "structure", - "members": { - "configurations": { "shape": "DatabaseConfigurations" } - } - }, - "GetQueryExecutionHistoryRequest": { - "type": "structure", - "required": ["queryExecutionId"], - "members": { - "sqlworkbenchSource": { - "shape": "SqlworkbenchSource", - "location": "header", - "locationName": "sqlworkbench-source" - }, - "queryExecutionId": { "shape": "GetQueryExecutionHistoryRequestQueryExecutionIdString" }, - "accountSettings": { "shape": "DatabaseConnectionAccountSettings" } - } - }, - "GetQueryExecutionHistoryRequestQueryExecutionIdString": { - "type": "string", - "max": 100, - "min": 1 - }, - "GetQueryExecutionHistoryResponse": { - "type": "structure", - "members": { - "id": { "shape": "String" }, - "querySourceId": { "shape": "String" }, - "queryStartTime": { "shape": "Long" }, - "queryEndTime": { "shape": "Long" }, - "status": { "shape": "QueryExecutionStatus" }, - "queryText": { "shape": "FullQueryText" }, - "serializedMetadata": { "shape": "SerializedMetadata" }, - "serializedQueryStats": { "shape": "SerializedQueryStats" }, - "databaseType": { "shape": "DatabaseType" } - } - }, - "GetQueryResultRequest": { - "type": "structure", - "required": ["queryExecutionId", "databaseType"], - "members": { - "sqlworkbenchSource": { - "shape": "SqlworkbenchSource", - "location": "header", - "locationName": "sqlworkbench-source" - }, - "queryExecutionId": { "shape": "GetQueryResultRequestQueryExecutionIdString" }, - "accountSettings": { "shape": "DatabaseConnectionAccountSettings" }, - "pageToken": { "shape": "PageToken" }, - "databaseType": { - "shape": "DatabaseType", - "location": "querystring", - "locationName": "databaseType" - }, - "pageSize": { "shape": "GetQueryResultRequestPageSizeInteger" } - } - }, - "GetQueryResultRequestPageSizeInteger": { - "type": "integer", - "box": true, - "min": 0 - }, - "GetQueryResultRequestQueryExecutionIdString": { - "type": "string", - "max": 100, - "min": 1 - }, - "GetQueryResultResponse": { - "type": "structure", - "members": { - "queryResult": { "shape": "QueryResult" }, - "nextToken": { "shape": "String" }, - "previousToken": { "shape": "String" } - } - }, - "GetResourcesRequest": { - "type": "structure", - "required": ["parents", "type", "maxItems"], - "members": { - "sqlworkbenchSource": { - "shape": "SqlworkbenchSource", - "location": "header", - "locationName": "sqlworkbench-source" - }, - "connectionId": { "shape": "GetResourcesRequestConnectionIdString" }, - "databaseType": { - "shape": "DatabaseType", - "location": "querystring", - "locationName": "databaseType" - }, - "connection": { "shape": "DatabaseConnectionConfiguration" }, - "accountSettings": { "shape": "DatabaseConnectionAccountSettings" }, - "parents": { "shape": "ParentResources" }, - "type": { "shape": "GetResourcesRequestTypeString" }, - "maxItems": { "shape": "GetResourcesRequestMaxItemsInteger" }, - "pageToken": { "shape": "PageToken" }, - "forceRefresh": { "shape": "Boolean" }, - "forceRefreshRecursive": { "shape": "Boolean" } - } - }, - "GetResourcesRequestConnectionIdString": { - "type": "string", - "max": 2048, - "min": 32 - }, - "GetResourcesRequestMaxItemsInteger": { - "type": "integer", - "box": true, - "max": 100, - "min": 20 - }, - "GetResourcesRequestTypeString": { - "type": "string", - "max": 150, - "min": 0 - }, - "GetResourcesResponse": { - "type": "structure", - "members": { - "resources": { "shape": "Resources" }, - "nextToken": { "shape": "String" }, - "statusCode": { - "shape": "statusCode", - "location": "statusCode" - }, - "connectionProperties": { "shape": "ConnectionProperties" } - } - }, - "GetTabStatesRequest": { - "type": "structure", - "required": ["tabId"], - "members": { - "sqlworkbenchSource": { - "shape": "SqlworkbenchSource", - "location": "header", - "locationName": "sqlworkbench-source" - }, - "accountSettings": { "shape": "DatabaseConnectionAccountSettings" }, - "tabId": { "shape": "String" } - } - }, - "GetTabStatesResponse": { - "type": "structure", - "required": ["queryExecutionStates"], - "members": { - "queryExecutionStates": { "shape": "QueryExecutionStates" }, - "sessionId": { "shape": "String" } - } - }, - "Integer": { - "type": "integer", - "box": true - }, - "InternalServerError": { - "type": "structure", - "required": ["message"], - "members": { - "message": { "shape": "String" }, - "code": { "shape": "ErrorCode" } - }, - "error": { "httpStatusCode": 500 }, - "exception": true, - "fault": true - }, - "KmsKeyArn": { - "type": "string", - "max": 1000, - "min": 0, - "pattern": "arn:.*" - }, - "ListQueryExecutionHistoryRequest": { - "type": "structure", - "required": ["maxItems"], - "members": { - "sqlworkbenchSource": { - "shape": "SqlworkbenchSource", - "location": "header", - "locationName": "sqlworkbench-source" - }, - "maxItems": { "shape": "ListQueryExecutionHistoryRequestMaxItemsInteger" }, - "accountSettings": { "shape": "DatabaseConnectionAccountSettings" }, - "pageToken": { "shape": "ListQueryExecutionHistoryRequestPageTokenString" }, - "querySourceId": { "shape": "ListQueryExecutionHistoryRequestQuerySourceIdString" }, - "databaseType": { "shape": "DatabaseType" }, - "status": { "shape": "QueryExecutionStatus" }, - "startTime": { "shape": "QueryHistoryTimestamp" }, - "endTime": { "shape": "QueryHistoryTimestamp" }, - "containsText": { "shape": "ListQueryExecutionHistoryRequestContainsTextString" } - } - }, - "ListQueryExecutionHistoryRequestContainsTextString": { - "type": "string", - "max": 100, - "min": 0 - }, - "ListQueryExecutionHistoryRequestMaxItemsInteger": { - "type": "integer", - "box": true, - "max": 100, - "min": 1 - }, - "ListQueryExecutionHistoryRequestPageTokenString": { - "type": "string", - "max": 10000, - "min": 0 - }, - "ListQueryExecutionHistoryRequestQuerySourceIdString": { - "type": "string", - "max": 100, - "min": 0 - }, - "ListQueryExecutionHistoryResponse": { - "type": "structure", - "required": ["items"], - "members": { - "items": { "shape": "QueryExecutionHistoryPreviews" }, - "nextToken": { "shape": "ListQueryExecutionHistoryResponseNextTokenString" } - } - }, - "ListQueryExecutionHistoryResponseNextTokenString": { - "type": "string", - "max": 1000, - "min": 0 - }, - "ListTagsForResourceRequest": { - "type": "structure", - "required": ["resourceArn"], - "members": { - "sqlworkbenchSource": { - "shape": "SqlworkbenchSource", - "location": "header", - "locationName": "sqlworkbench-source" - }, - "resourceArn": { - "shape": "Arn", - "location": "uri", - "locationName": "resourceArn" - } - } - }, - "ListTagsForResourceResponse": { - "type": "structure", - "required": ["tags"], - "members": { - "tags": { "shape": "Tags" } - } - }, - "Long": { - "type": "long", - "box": true - }, - "PageToken": { - "type": "string", - "max": 1000, - "min": 0 - }, - "ParentResource": { - "type": "structure", - "required": ["parentId", "parentType"], - "members": { - "parentId": { "shape": "ParentResourceParentIdString" }, - "parentType": { "shape": "ParentResourceParentTypeString" } - } - }, - "ParentResourceParentIdString": { - "type": "string", - "max": 1000, - "min": 1, - "sensitive": true - }, - "ParentResourceParentTypeString": { - "type": "string", - "max": 100, - "min": 1 - }, - "ParentResources": { - "type": "list", - "member": { "shape": "ParentResource" } - }, - "PollQueryExecutionEventsRequest": { - "type": "structure", - "required": ["queryExecutionIds", "databaseType"], - "members": { - "sqlworkbenchSource": { - "shape": "SqlworkbenchSource", - "location": "header", - "locationName": "sqlworkbench-source" - }, - "queryExecutionIds": { "shape": "PollQueryExecutionEventsRequestQueryExecutionIdsList" }, - "accountSettings": { "shape": "DatabaseConnectionAccountSettings" }, - "databaseType": { - "shape": "DatabaseType", - "location": "querystring", - "locationName": "databaseType" - }, - "ackIds": { "shape": "AckIds" } - } - }, - "PollQueryExecutionEventsRequestQueryExecutionIdsList": { - "type": "list", - "member": { "shape": "PollQueryExecutionEventsRequestQueryExecutionIdsListMemberString" }, - "max": 100, - "min": 1 - }, - "PollQueryExecutionEventsRequestQueryExecutionIdsListMemberString": { - "type": "string", - "max": 100, - "min": 1 - }, - "PollQueryExecutionEventsResponse": { - "type": "structure", - "members": { - "events": { "shape": "QueryExecutionEvents" } - } - }, - "QueryCancellationStatus": { - "type": "string", - "enum": ["CANCELLED", "DOES_NOT_EXISTS", "ALREADY_FINISHED", "CANCELLATION_FAILED"] - }, - "QueryExecution": { - "type": "structure", - "required": ["queryExecutionId"], - "members": { - "queryExecutionStatus": { "shape": "QueryExecutionStatus" }, - "queryExecutionId": { "shape": "QueryExecutionQueryExecutionIdString" }, - "queryResult": { "shape": "QueryResult" }, - "queryText": { "shape": "QueryText" } - } - }, - "QueryExecutionEvent": { - "type": "structure", - "required": ["queryExecutionEventType", "queryExecutionId"], - "members": { - "queryExecutionEventType": { "shape": "QueryExecutionEventType" }, - "queryExecutionId": { "shape": "QueryExecutionEventQueryExecutionIdString" }, - "queryExecutionStatus": { "shape": "QueryExecutionStatus" }, - "queryResult": { "shape": "QueryResult" }, - "nextToken": { "shape": "String" }, - "ackId": { "shape": "String" } - } - }, - "QueryExecutionEventQueryExecutionIdString": { - "type": "string", - "max": 100, - "min": 0 - }, - "QueryExecutionEventType": { - "type": "string", - "enum": ["QUERY_EXECUTION_STATUS", "QUERY_EXECUTION_RESULT"] - }, - "QueryExecutionEvents": { - "type": "list", - "member": { "shape": "QueryExecutionEvent" } - }, - "QueryExecutionHistoryPreview": { - "type": "structure", - "members": { - "id": { "shape": "String" }, - "querySourceId": { "shape": "String" }, - "queryStartTime": { "shape": "Long" }, - "queryEndTime": { "shape": "Long" }, - "status": { "shape": "QueryExecutionStatus" }, - "queryTextPreview": { "shape": "QueryTextPreview" }, - "serializedMetadata": { "shape": "SerializedMetadata" }, - "databaseType": { "shape": "DatabaseType" } - } - }, - "QueryExecutionHistoryPreviews": { - "type": "list", - "member": { "shape": "QueryExecutionHistoryPreview" } - }, - "QueryExecutionQueryExecutionIdString": { - "type": "string", - "max": 100, - "min": 0 - }, - "QueryExecutionState": { - "type": "structure", - "required": ["queryExecutionId", "status", "databaseType"], - "members": { - "queryExecutionId": { "shape": "String" }, - "status": { "shape": "String" }, - "databaseType": { "shape": "DatabaseType" } - } - }, - "QueryExecutionStates": { - "type": "list", - "member": { "shape": "QueryExecutionState" } - }, - "QueryExecutionStatus": { - "type": "string", - "enum": ["SCHEDULED", "RUNNING", "FAILED", "CANCELLED", "FINISHED"] - }, - "QueryExecutionType": { - "type": "string", - "enum": ["PERSIST_SESSION", "NO_SESSION"] - }, - "QueryExecutionWarning": { - "type": "structure", - "members": { - "message": { "shape": "QueryExecutionWarningMessage" }, - "level": { "shape": "QueryExecutionWarningLevel" } - } - }, - "QueryExecutionWarningLevel": { - "type": "string", - "enum": ["INFO", "WARNING"] - }, - "QueryExecutionWarningMessage": { - "type": "string", - "max": 1000, - "min": 0, - "sensitive": true - }, - "QueryExecutionWarnings": { - "type": "list", - "member": { "shape": "QueryExecutionWarning" } - }, - "QueryExecutions": { - "type": "list", - "member": { "shape": "QueryExecution" } - }, - "QueryHistoryTimestamp": { - "type": "long", - "box": true - }, - "QueryResponseDeliveryType": { - "type": "string", - "enum": ["SYNC", "ASYNC"] - }, - "QueryResult": { - "type": "structure", - "members": { - "queryExecutionStatus": { "shape": "QueryExecutionStatus" }, - "headers": { "shape": "QueryResultHeaders" }, - "rows": { "shape": "Rows" }, - "affectedRows": { "shape": "Integer" }, - "totalRowCount": { "shape": "Integer" }, - "elapsedTime": { "shape": "Long" }, - "errorMessage": { "shape": "QueryResultErrorMessage" }, - "errorPosition": { "shape": "Integer" }, - "queryResultWarningCode": { "shape": "QueryResultQueryResultWarningCodeString" }, - "warnings": { "shape": "QueryExecutionWarnings" }, - "queryExecutionId": { "shape": "String" }, - "sessionId": { "shape": "String" }, - "queryText": { "shape": "QueryText" }, - "statementType": { "shape": "StatementType" }, - "serializedMetadata": { "shape": "SerializedMetadata" }, - "connectionProperties": { "shape": "ConnectionProperties" } - } - }, - "QueryResultCellType": { - "type": "string", - "enum": ["STRING", "BOOLEAN", "INTEGER", "BIG_INTEGER", "FLOAT", "BIG_DECIMAL", "DATE", "TIME", "DATETIME"] - }, - "QueryResultCellValue": { - "type": "string", - "sensitive": true - }, - "QueryResultErrorMessage": { - "type": "string", - "max": 1000, - "min": 0, - "sensitive": true - }, - "QueryResultHeader": { - "type": "structure", - "required": ["displayName", "type"], - "members": { - "displayName": { "shape": "QueryResultHeaderDisplayName" }, - "type": { "shape": "QueryResultCellType" } - } - }, - "QueryResultHeaderDisplayName": { - "type": "string", - "sensitive": true - }, - "QueryResultHeaders": { - "type": "list", - "member": { "shape": "QueryResultHeader" } - }, - "QueryResultQueryResultWarningCodeString": { - "type": "string", - "max": 100, - "min": 0 - }, - "QueryText": { - "type": "string", - "sensitive": true - }, - "QueryTextPreview": { - "type": "string", - "max": 150, - "min": 0, - "sensitive": true - }, - "Resource": { - "type": "structure", - "required": ["displayName", "identifier", "childObjectTypes"], - "members": { - "displayName": { "shape": "ResourceDisplayName" }, - "identifier": { "shape": "ResourceIdentifier" }, - "type": { "shape": "ResourceTypeString" }, - "unavailable": { "shape": "Boolean" }, - "tooltipTranslationKey": { "shape": "ResourceTooltipTranslationKeyString" }, - "childObjectTypes": { "shape": "ChildObjectTypes" }, - "allowedActions": { "shape": "ResourceActions" }, - "resourceMetadata": { "shape": "ResourceMetadataItems" } - } - }, - "ResourceAction": { - "type": "string", - "enum": ["Drop", "Truncate", "GenerateDefinition", "GenerateSelectQuery"] - }, - "ResourceActions": { - "type": "list", - "member": { "shape": "ResourceAction" } - }, - "ResourceDisplayName": { - "type": "string", - "max": 150, - "min": 0, - "sensitive": true - }, - "ResourceIdentifier": { - "type": "string", - "max": 150, - "min": 0, - "sensitive": true - }, - "ResourceMetadata": { - "type": "structure", - "members": { - "key": { "shape": "String" }, - "value": { "shape": "String" } - } - }, - "ResourceMetadataItems": { - "type": "list", - "member": { "shape": "ResourceMetadata" } - }, - "ResourceNotFoundException": { - "type": "structure", - "required": ["message"], - "members": { - "message": { "shape": "String" }, - "code": { "shape": "ErrorCode" } - }, - "error": { - "httpStatusCode": 404, - "senderFault": true - }, - "exception": true - }, - "ResourceTooltipTranslationKeyString": { - "type": "string", - "max": 50, - "min": 0 - }, - "ResourceTypeString": { - "type": "string", - "max": 50, - "min": 0 - }, - "Resources": { - "type": "list", - "member": { "shape": "Resource" } - }, - "Row": { - "type": "structure", - "members": { - "row": { "shape": "Columns" } - } - }, - "Rows": { - "type": "list", - "member": { "shape": "Row" } - }, - "SecretKeyArn": { - "type": "string", - "max": 1000, - "min": 0, - "pattern": "arn:.*" - }, - "SerializedMetadata": { - "type": "string", - "max": 1000000, - "min": 0, - "sensitive": true - }, - "SerializedQueryStats": { - "type": "string", - "max": 1000000, - "min": 0, - "sensitive": true - }, - "ServiceQuotaExceededException": { - "type": "structure", - "required": ["message"], - "members": { - "message": { "shape": "String" }, - "code": { "shape": "ErrorCode" } - }, - "error": { - "httpStatusCode": 402, - "senderFault": true - }, - "exception": true - }, - "SqlworkbenchSource": { - "type": "string", - "enum": ["SUS", "RQEV2"] - }, - "StatementType": { - "type": "string", - "enum": ["DQL", "DML", "DDL", "DCL", "Utility"] - }, - "StreamingBlob": { - "type": "blob", - "streaming": true - }, - "String": { "type": "string" }, - "TagKey": { - "type": "string", - "max": 128, - "min": 1, - "pattern": "([\\p{L}\\p{Z}\\p{N}_.:/=+\\-@]*)" - }, - "TagKeyList": { - "type": "list", - "member": { "shape": "TagKey" }, - "max": 6500, - "min": 1 - }, - "TagResourceRequest": { - "type": "structure", - "required": ["resourceArn", "tags"], - "members": { - "sqlworkbenchSource": { - "shape": "SqlworkbenchSource", - "location": "header", - "locationName": "sqlworkbench-source" - }, - "resourceArn": { - "shape": "Arn", - "location": "uri", - "locationName": "resourceArn" - }, - "tags": { "shape": "Tags" } - } - }, - "TagResourceResponse": { - "type": "structure", - "members": {} - }, - "TagValue": { - "type": "string", - "max": 256, - "min": 0, - "pattern": "([\\p{L}\\p{Z}\\p{N}_.:/=+\\-@]*)" - }, - "TagrisAccessDeniedException": { - "type": "structure", - "members": { - "message": { "shape": "TagrisExceptionMessage" } - }, - "exception": true - }, - "TagrisAccountId": { - "type": "string", - "max": 12, - "min": 12 - }, - "TagrisAmazonResourceName": { - "type": "string", - "max": 1011, - "min": 1 - }, - "TagrisExceptionMessage": { - "type": "string", - "max": 2048, - "min": 0 - }, - "TagrisInternalId": { - "type": "string", - "max": 64, - "min": 0 - }, - "TagrisInternalServiceException": { - "type": "structure", - "members": { - "message": { "shape": "TagrisExceptionMessage" } - }, - "exception": true, - "fault": true - }, - "TagrisInvalidArnException": { - "type": "structure", - "members": { - "message": { "shape": "TagrisExceptionMessage" }, - "sweepListItem": { "shape": "TagrisSweepListItem" } - }, - "exception": true - }, - "TagrisInvalidParameterException": { - "type": "structure", - "members": { - "message": { "shape": "TagrisExceptionMessage" } - }, - "exception": true - }, - "TagrisPartialResourcesExistResultsException": { - "type": "structure", - "members": { - "message": { "shape": "TagrisExceptionMessage" }, - "resourceExistenceInformation": { "shape": "TagrisSweepListResult" } - }, - "exception": true - }, - "TagrisStatus": { - "type": "string", - "enum": ["ACTIVE", "NOT_ACTIVE"] - }, - "TagrisSweepList": { - "type": "list", - "member": { "shape": "TagrisSweepListItem" } - }, - "TagrisSweepListItem": { - "type": "structure", - "members": { - "TagrisAccountId": { "shape": "TagrisAccountId" }, - "TagrisAmazonResourceName": { "shape": "TagrisAmazonResourceName" }, - "TagrisInternalId": { "shape": "TagrisInternalId" }, - "TagrisVersion": { "shape": "TagrisVersion" } - } - }, - "TagrisSweepListResult": { - "type": "map", - "key": { "shape": "TagrisAmazonResourceName" }, - "value": { "shape": "TagrisStatus" } - }, - "TagrisThrottledException": { - "type": "structure", - "members": { - "message": { "shape": "TagrisExceptionMessage" } - }, - "exception": true - }, - "TagrisVerifyResourcesExistInput": { - "type": "structure", - "required": ["TagrisSweepList"], - "members": { - "TagrisSweepList": { "shape": "TagrisSweepList" } - } - }, - "TagrisVerifyResourcesExistOutput": { - "type": "structure", - "required": ["TagrisSweepListResult"], - "members": { - "TagrisSweepListResult": { "shape": "TagrisSweepListResult" } - } - }, - "TagrisVersion": { "type": "long" }, - "Tags": { - "type": "map", - "key": { "shape": "TagKey" }, - "value": { "shape": "TagValue" }, - "max": 50, - "min": 1 - }, - "ThrottlingException": { - "type": "structure", - "required": ["message"], - "members": { - "message": { "shape": "String" }, - "code": { "shape": "ErrorCode" } - }, - "error": { - "httpStatusCode": 429, - "senderFault": true - }, - "exception": true - }, - "UntagResourceRequest": { - "type": "structure", - "required": ["resourceArn", "tagKeys"], - "members": { - "sqlworkbenchSource": { - "shape": "SqlworkbenchSource", - "location": "header", - "locationName": "sqlworkbench-source" - }, - "resourceArn": { - "shape": "Arn", - "location": "uri", - "locationName": "resourceArn" - }, - "tagKeys": { - "shape": "TagKeyList", - "location": "querystring", - "locationName": "tagKeys" - } - } - }, - "UntagResourceResponse": { - "type": "structure", - "members": {} - }, - "UpdateConnectionRequest": { - "type": "structure", - "required": ["id", "authenticationType"], - "members": { - "sqlworkbenchSource": { - "shape": "SqlworkbenchSource", - "location": "header", - "locationName": "sqlworkbench-source" - }, - "id": { - "shape": "UpdateConnectionRequestIdString", - "documentation": "

Id of the connection to update

" - }, - "name": { - "shape": "UpdateConnectionRequestNameString", - "documentation": "

Name of the connection

" - }, - "databaseName": { - "shape": "UpdateConnectionRequestDatabaseNameString", - "documentation": "

Name of the database used for this connection

" - }, - "authenticationType": { - "shape": "UpdateConnectionRequestAuthenticationTypeEnum", - "documentation": "

Number representing the type of authentication to use (2 = IAM, 3 = Username and Password, 4 = Federated connection)

" - }, - "secretArn": { - "shape": "UpdateConnectionRequestSecretArnString", - "documentation": "

secretArn for redshift cluster

" - }, - "clusterId": { - "shape": "UpdateConnectionRequestClusterIdString", - "documentation": "

Id of the cluster used for this connection

" - }, - "isServerless": { - "shape": "Boolean", - "documentation": "

Is serverless connection

" - }, - "dbUser": { - "shape": "DbUser", - "documentation": "

User of the database used for this connection

" - }, - "username": { - "shape": "DbUser", - "documentation": "

Username used in the Username_Password connection type

" - }, - "password": { - "shape": "UpdateConnectionRequestPasswordString", - "documentation": "

Password of the user used for this connection

" - }, - "host": { - "shape": "String", - "documentation": "

Host address used for creating secret for Username_Password connection type

" - }, - "databaseType": { "shape": "DatabaseType" }, - "connectableResourceIdentifier": { - "shape": "UpdateConnectionRequestConnectableResourceIdentifierString", - "documentation": "

Id of the connectable resource used for this connection

" - }, - "connectableResourceType": { - "shape": "UpdateConnectionRequestConnectableResourceTypeString", - "documentation": "

Type of the connectable resource used for this connection

" - } - } - }, - "UpdateConnectionRequestAuthenticationTypeEnum": { - "type": "string", - "enum": ["2", "3", "4", "5", "6", "7", "8"], - "max": 1, - "min": 1, - "sensitive": true - }, - "UpdateConnectionRequestClusterIdString": { - "type": "string", - "max": 63, - "min": 1 - }, - "UpdateConnectionRequestConnectableResourceIdentifierString": { - "type": "string", - "max": 63, - "min": 1, - "sensitive": true - }, - "UpdateConnectionRequestConnectableResourceTypeString": { - "type": "string", - "max": 63, - "min": 1 - }, - "UpdateConnectionRequestDatabaseNameString": { - "type": "string", - "max": 64, - "min": 1, - "sensitive": true - }, - "UpdateConnectionRequestIdString": { - "type": "string", - "max": 2048, - "min": 32 - }, - "UpdateConnectionRequestNameString": { - "type": "string", - "max": 512, - "min": 1, - "sensitive": true - }, - "UpdateConnectionRequestPasswordString": { - "type": "string", - "max": 64, - "min": 8, - "sensitive": true - }, - "UpdateConnectionRequestSecretArnString": { - "type": "string", - "max": 1000, - "min": 1 - }, - "UpdateConnectionResponse": { - "type": "structure", - "members": { - "data": { "shape": "Connection" } - } - }, - "UserSettings": { - "type": "string", - "sensitive": true - }, - "ValidationException": { - "type": "structure", - "required": ["message"], - "members": { - "message": { "shape": "String" }, - "code": { "shape": "ErrorCode" } - }, - "error": { - "httpStatusCode": 400, - "senderFault": true - }, - "exception": true - }, - "statusCode": { - "type": "integer", - "box": true, - "max": 500, - "min": 100 - } - } -} diff --git a/packages/core/src/test/sagemakerunifiedstudio/shared/client/sqlWorkbenchClient.test.ts b/packages/core/src/test/sagemakerunifiedstudio/shared/client/sqlWorkbenchClient.test.ts index e4b1dc50a85..7533b15ded1 100644 --- a/packages/core/src/test/sagemakerunifiedstudio/shared/client/sqlWorkbenchClient.test.ts +++ b/packages/core/src/test/sagemakerunifiedstudio/shared/client/sqlWorkbenchClient.test.ts @@ -11,36 +11,23 @@ import { createRedshiftConnectionConfig, } from '../../../../sagemakerunifiedstudio/shared/client/sqlWorkbenchClient' import { STSClient } from '@aws-sdk/client-sts' -import globals from '../../../../shared/extensionGlobals' import { ConnectionCredentialsProvider } from '../../../../sagemakerunifiedstudio/auth/providers/connectionCredentialsProvider' +import { + DatabaseIntegrationConnectionAuthenticationTypes, + SQLWorkbench, + GetResourcesCommand, + ExecuteQueryCommand, +} from '@amzn/sql-workbench-client' describe('SQLWorkbenchClient', function () { let sandbox: sinon.SinonSandbox - let mockSqlClient: any - let mockSdkClientBuilder: any + let sendStub: sinon.SinonStub beforeEach(function () { sandbox = sinon.createSandbox() - mockSqlClient = { - getResources: sandbox.stub().returns({ - promise: sandbox.stub().resolves({ - resources: [{ name: 'test-resource' }], - nextToken: 'next-token', - }), - }), - executeQuery: sandbox.stub().returns({ - promise: sandbox.stub().resolves({ - queryExecutions: [{ queryExecutionId: 'test-execution-id' }], - }), - }), - } - - mockSdkClientBuilder = { - createAwsService: sandbox.stub().resolves(mockSqlClient), - } - - sandbox.stub(globals, 'sdkClientBuilder').value(mockSdkClientBuilder) + // Mock SDK v3 send method + sendStub = sandbox.stub(SQLWorkbench.prototype, 'send') }) afterEach(function () { @@ -83,11 +70,17 @@ describe('SQLWorkbenchClient', function () { describe('getResources', function () { it('should get resources with connection', async function () { + // Mock the send method to return expected response + sendStub.resolves({ + resources: [{ displayName: 'test-resource' }], + nextToken: 'next-token', + }) + const client = SQLWorkbenchClient.getInstance('us-east-1') const connectionConfig = { - id: 'test-id', - type: 'test-type', - databaseType: 'REDSHIFT', + id: 'arn:aws:sqlworkbench:us-east-1:123456789012:connection/test-uuid-1234', + type: DatabaseIntegrationConnectionAuthenticationTypes.FEDERATED, + databaseType: 'REDSHIFT' as const, connectableResourceIdentifier: 'test-identifier', connectableResourceType: 'CLUSTER', database: 'test-db', @@ -99,15 +92,15 @@ describe('SQLWorkbenchClient', function () { maxItems: 50, }) - assert.deepStrictEqual(result.resources, [{ name: 'test-resource' }]) + assert.deepStrictEqual(result.resources, [{ displayName: 'test-resource' }]) assert.strictEqual(result.nextToken, 'next-token') + assert.ok(sendStub.calledOnce) + assert.ok(sendStub.firstCall.args[0] instanceof GetResourcesCommand) }) it('should handle API errors', async function () { const error = new Error('API Error') - mockSqlClient.getResources.returns({ - promise: sandbox.stub().rejects(error), - }) + sendStub.rejects(error) const client = SQLWorkbenchClient.getInstance('us-east-1') @@ -115,9 +108,9 @@ describe('SQLWorkbenchClient', function () { async () => await client.getResources({ connection: { - id: '', - type: '', - databaseType: '', + id: 'arn:aws:sqlworkbench:us-east-1:123456789012:connection/test-uuid-1234', + type: DatabaseIntegrationConnectionAuthenticationTypes.FEDERATED, + databaseType: 'REDSHIFT' as const, connectableResourceIdentifier: '', connectableResourceType: '', database: '', @@ -131,11 +124,16 @@ describe('SQLWorkbenchClient', function () { describe('executeQuery', function () { it('should execute query successfully', async function () { + // Mock the send method to return expected response + sendStub.resolves({ + queryExecutions: [{ queryExecutionId: 'test-execution-id' }], + }) + const client = SQLWorkbenchClient.getInstance('us-east-1') const connectionConfig = { - id: 'test-id', - type: 'test-type', - databaseType: 'REDSHIFT', + id: 'arn:aws:sqlworkbench:us-east-1:123456789012:connection/test-uuid-1234', + type: DatabaseIntegrationConnectionAuthenticationTypes.FEDERATED, + databaseType: 'REDSHIFT' as const, connectableResourceIdentifier: 'test-identifier', connectableResourceType: 'CLUSTER', database: 'test-db', @@ -144,19 +142,19 @@ describe('SQLWorkbenchClient', function () { const result = await client.executeQuery(connectionConfig, 'SELECT 1') assert.strictEqual(result, 'test-execution-id') + assert.ok(sendStub.calledOnce) + assert.ok(sendStub.firstCall.args[0] instanceof ExecuteQueryCommand) }) it('should handle query execution errors', async function () { const error = new Error('Query Error') - mockSqlClient.executeQuery.returns({ - promise: sandbox.stub().rejects(error), - }) + sendStub.rejects(error) const client = SQLWorkbenchClient.getInstance('us-east-1') const connectionConfig = { - id: 'test-id', - type: 'test-type', - databaseType: 'REDSHIFT', + id: 'arn:aws:sqlworkbench:us-east-1:123456789012:connection/test-uuid-1234', + type: DatabaseIntegrationConnectionAuthenticationTypes.FEDERATED, + databaseType: 'REDSHIFT' as const, connectableResourceIdentifier: 'test-identifier', connectableResourceType: 'CLUSTER', database: 'test-db', diff --git a/src.gen/@amzn/sql-workbench-client/3.0.0.tgz b/src.gen/@amzn/sql-workbench-client/3.0.0.tgz new file mode 100644 index 0000000000000000000000000000000000000000..eab84f8a353168dad10c3eaf8d52e4673fb425fc GIT binary patch literal 89474 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�{>l7Z*N= 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 ay`Qi|Yk%yI{jonw`160J)~22Sq7eY#DnOtB literal 0 HcmV?d00001 From 36b72705e917064f6c0513bdd7a882a5e55b3f0d Mon Sep 17 00:00:00 2001 From: Keyu Wu Date: Wed, 14 Jan 2026 16:09:04 -0800 Subject: [PATCH 03/51] fix(sagemaker): Fix incorrect space status due to case-sensitive API (#8490) ## Description This PR fixes a bug where space status was incorrectly displayed for spaces with mixed-case names. ## Problem The SageMaker ListApps API's SpaceNameEquals filter is case-sensitive, but space names in SMUS (SageMaker Unified Studio) can have mixed case. When a space name contained uppercase characters, the API would not find the matching app, causing incorrect status display in the UI. ## Solution Added listAppsForDomainMatchSpaceIgnoreCase method with an optimization: If the space name is all lowercase, uses the efficient listAppForSpace method with SpaceNameEquals filter (server-side filtering) Otherwise, fetches all apps via listAppsForDomain and performs case-insensitive client-side matching ## Changes * packages/core/src/shared/clients/sagemaker.ts: Added listAppsForDomainMatchSpaceIgnoreCase method * packages/core/src/awsService/sagemaker/sagemakerSpace.ts: Updated updateSpaceAppStatus() to use the new method ## Technical Notes: Why Batch Polling Optimization Was Not Implemented Goal: Since listAppsForDomainMatchSpaceIgnoreCase fetches all apps in a domain (for case-insensitive matching), ideally we could reuse this single API response to update multiple spaces in the same domain simultaneously, reducing redundant API calls during polling. Why It's Difficult: Per-Space Update Architecture: The current updateSpaceAppStatus() method is designed to update a single space. It's called individually for each space by the PollingSet timer. Shared Method for Different Use Cases: The same updateSpaceAppStatus() method serves two purposes: Initial status refresh: Triggered by user action (e.g., clicking "Connect"). Requires real-time data to correctly determine if the space should be added to the polling set. Periodic polling updates: Triggered by PollingSet timer. Could potentially use shared/batched data. Real-time Data Requirement: When a user triggers an action, the initial refresh must return real-time data. If the status is stale, the space might not be added to the polling set, causing the UI to not update properly after user actions. Refactoring Scope: To properly implement batch updates, we would need to separate the initial refresh logic from polling update logic, which is a significant architectural change beyond the scope of this bug fix. --- - Treat all work as PUBLIC. Private `feature/x` branches will not be squash-merged at release time. - Your code changes must meet the guidelines in [CONTRIBUTING.md](https://github.com/aws/aws-toolkit-vscode/blob/master/CONTRIBUTING.md#guidelines). - License: I confirm that my contribution is made under the terms of the Apache 2.0 license. Co-authored-by: invictus <149003065+ashishrp-aws@users.noreply.github.com> --- .../awsService/sagemaker/sagemakerSpace.ts | 5 +- packages/core/src/shared/clients/sagemaker.ts | 22 +++++ .../explorer/sagemakerSpaceNode.test.ts | 6 +- .../sagemaker/sagemakerSpace.test.ts | 14 +-- .../shared/clients/sagemakerClient.test.ts | 86 +++++++++++++++++++ 5 files changed, 122 insertions(+), 11 deletions(-) diff --git a/packages/core/src/awsService/sagemaker/sagemakerSpace.ts b/packages/core/src/awsService/sagemaker/sagemakerSpace.ts index f4bcfdd952f..21adb3695bc 100644 --- a/packages/core/src/awsService/sagemaker/sagemakerSpace.ts +++ b/packages/core/src/awsService/sagemaker/sagemakerSpace.ts @@ -117,7 +117,10 @@ export class SagemakerSpace { // get app using ListApps API, with given DomainId and SpaceName const app = this.spaceApp.DomainId && this.spaceApp.SpaceName - ? await this.client.listAppForSpace(this.spaceApp.DomainId, this.spaceApp.SpaceName) + ? await this.client.listAppsForDomainMatchSpaceIgnoreCase( + this.spaceApp.DomainId, + this.spaceApp.SpaceName + ) : undefined if (!app) { logger.error( diff --git a/packages/core/src/shared/clients/sagemaker.ts b/packages/core/src/shared/clients/sagemaker.ts index 3b68c86cfda..ead34d71849 100644 --- a/packages/core/src/shared/clients/sagemaker.ts +++ b/packages/core/src/shared/clients/sagemaker.ts @@ -152,6 +152,28 @@ export class SagemakerClient extends ClientWrapper { return appsList[0] // At most one App for one SagemakerSpace } + public async listAppsForDomain(domainId: string): Promise { + return this.listApps({ DomainIdEquals: domainId }).flatten().promise() + } + + /** + * Search for an app by space name from the domain's app list (case-insensitive). + * If space name is all lowercase, uses the more efficient SpaceNameEquals filter. + * Otherwise, fetches all apps in the domain and performs case-insensitive matching. + */ + public async listAppsForDomainMatchSpaceIgnoreCase( + domainId: string, + spaceName: string + ): Promise { + // If space name is all lowercase, use the efficient SpaceNameEquals filter + if (spaceName === spaceName.toLowerCase()) { + return this.listAppForSpace(domainId, spaceName) + } + // Otherwise, fetch all apps and do case-insensitive matching + const apps = await this.listAppsForDomain(domainId) + return apps.find((app) => app.SpaceName?.toLowerCase() === spaceName.toLowerCase()) + } + public async startSpace(spaceName: string, domainId: string, skipInstanceTypePrompts: boolean = false) { let spaceDetails: DescribeSpaceCommandOutput diff --git a/packages/core/src/test/awsService/sagemaker/explorer/sagemakerSpaceNode.test.ts b/packages/core/src/test/awsService/sagemaker/explorer/sagemakerSpaceNode.test.ts index 5289dea266d..7619c0f37bb 100644 --- a/packages/core/src/test/awsService/sagemaker/explorer/sagemakerSpaceNode.test.ts +++ b/packages/core/src/test/awsService/sagemaker/explorer/sagemakerSpaceNode.test.ts @@ -113,12 +113,12 @@ describe('SagemakerSpaceNode', function () { const describeSpaceStub = sinon.stub(SagemakerClient.prototype, 'describeSpace') describeSpaceStub.resolves({ SpaceName: 'TestSpace', Status: 'InService', $metadata: {} }) - const listAppForSpaceStub = sinon.stub(SagemakerClient.prototype, 'listAppForSpace') - listAppForSpaceStub.resolves({ AppName: 'TestApp', Status: 'InService' }) + const listAppsMatchSpaceStub = sinon.stub(SagemakerClient.prototype, 'listAppsForDomainMatchSpaceIgnoreCase') + listAppsMatchSpaceStub.resolves({ AppName: 'TestApp', Status: 'InService' }) await testSpaceAppNode.updateSpaceAppStatus() sinon.assert.calledOnce(describeSpaceStub) - sinon.assert.calledOnce(listAppForSpaceStub) + sinon.assert.calledOnce(listAppsMatchSpaceStub) }) }) diff --git a/packages/core/src/test/awsService/sagemaker/sagemakerSpace.test.ts b/packages/core/src/test/awsService/sagemaker/sagemakerSpace.test.ts index 12db8b9c6f6..61536b804de 100644 --- a/packages/core/src/test/awsService/sagemaker/sagemakerSpace.test.ts +++ b/packages/core/src/test/awsService/sagemaker/sagemakerSpace.test.ts @@ -63,7 +63,7 @@ describe('SagemakerSpace', function () { mockClient.describeSpace.resolves(mockDescribeSpaceResponse) mockClient.describeApp.resolves(mockDescribeAppResponse) - mockClient.listAppForSpace.resolves(mockDescribeAppResponse) + mockClient.listAppsForDomainMatchSpaceIgnoreCase.resolves(mockDescribeAppResponse) const space = new SagemakerSpace(mockClient as any, 'us-east-1', mockSpaceApp) const updateSpaceSpy = sinon.spy(space, 'updateSpace') @@ -108,7 +108,7 @@ describe('SagemakerSpace', function () { Status: 'InService', $metadata: { requestId: 'test-request-id' }, } - mockClient.listAppForSpace.resolves(mockDescribeAppResponse) + mockClient.listAppsForDomainMatchSpaceIgnoreCase.resolves(mockDescribeAppResponse) mockClient.describeSpace.resolves(mockDescribeSpaceResponse) const space = new SagemakerSpace(mockClient as any, 'us-east-1', mockSpaceApp) @@ -126,7 +126,7 @@ describe('SagemakerSpace', function () { assert.strictEqual(updateSpaceArgs.SpaceSharingSettingsSummary, undefined) }) - it('should update app status using listAppForSpace', async function () { + it('should update app status using listAppsForDomainMatchSpaceIgnoreCase', async function () { const mockDescribeSpaceResponse = { SpaceName: 'test-space', Status: 'InService', @@ -141,7 +141,7 @@ describe('SagemakerSpace', function () { } mockClient.describeSpace.resolves(mockDescribeSpaceResponse) - mockClient.listAppForSpace.resolves(mockAppFromList) + mockClient.listAppsForDomainMatchSpaceIgnoreCase.resolves(mockAppFromList) // Create space without App.AppName const spaceWithoutAppName: SagemakerSpaceApp = { @@ -152,9 +152,9 @@ describe('SagemakerSpace', function () { const space = new SagemakerSpace(mockClient as any, 'us-east-1', spaceWithoutAppName) await space.updateSpaceAppStatus() - // Verify listAppForSpace was called instead of describeApp - assert.ok(mockClient.listAppForSpace.calledOnce) - assert.ok(mockClient.listAppForSpace.calledWith('test-domain', 'test-space')) + // Verify listAppsForDomainMatchSpaceIgnoreCase was called instead of describeApp + assert.ok(mockClient.listAppsForDomainMatchSpaceIgnoreCase.calledOnce) + assert.ok(mockClient.listAppsForDomainMatchSpaceIgnoreCase.calledWith('test-domain', 'test-space')) assert.ok(mockClient.describeApp.notCalled) }) }) diff --git a/packages/core/src/test/shared/clients/sagemakerClient.test.ts b/packages/core/src/test/shared/clients/sagemakerClient.test.ts index f99b8ed82e2..c4eb824b748 100644 --- a/packages/core/src/test/shared/clients/sagemakerClient.test.ts +++ b/packages/core/src/test/shared/clients/sagemakerClient.test.ts @@ -209,6 +209,92 @@ describe('SagemakerClient.listAppForSpace', function () { }) }) +describe('SagemakerClient.listAppsForDomainMatchSpaceIgnoreCase', function () { + const region = 'test-region' + let client: SagemakerClient + let listAppForSpaceStub: sinon.SinonStub + let listAppsForDomainStub: sinon.SinonStub + + beforeEach(function () { + client = new SagemakerClient(region) + listAppForSpaceStub = sinon.stub(client, 'listAppForSpace') + listAppsForDomainStub = sinon.stub(client, 'listAppsForDomain') + }) + + afterEach(function () { + sinon.restore() + }) + + it('uses efficient listAppForSpace when space name is all lowercase', async function () { + const expectedApp: AppDetails = { AppName: 'app1', DomainId: 'domain1', SpaceName: 'myspace' } + listAppForSpaceStub.resolves(expectedApp) + + const result = await client.listAppsForDomainMatchSpaceIgnoreCase('domain1', 'myspace') + + assert.strictEqual(result, expectedApp) + sinon.assert.calledOnceWithExactly(listAppForSpaceStub, 'domain1', 'myspace') + sinon.assert.notCalled(listAppsForDomainStub) + }) + + it('fetches all apps and does case-insensitive match when space name has uppercase', async function () { + const apps: AppDetails[] = [ + { AppName: 'app1', DomainId: 'domain1', SpaceName: 'MySpace' }, + { AppName: 'app2', DomainId: 'domain1', SpaceName: 'OtherSpace' }, + ] + listAppsForDomainStub.resolves(apps) + + const result = await client.listAppsForDomainMatchSpaceIgnoreCase('domain1', 'MySpace') + + assert.strictEqual(result?.AppName, 'app1') + sinon.assert.calledOnceWithExactly(listAppsForDomainStub, 'domain1') + sinon.assert.notCalled(listAppForSpaceStub) + }) + + it('matches space name case-insensitively (lowercase query, uppercase in API)', async function () { + const apps: AppDetails[] = [{ AppName: 'app1', DomainId: 'domain1', SpaceName: 'MYSPACE' }] + listAppsForDomainStub.resolves(apps) + + // Query with mixed case triggers case-insensitive path + const result = await client.listAppsForDomainMatchSpaceIgnoreCase('domain1', 'MySpace') + + assert.strictEqual(result?.AppName, 'app1') + }) + + it('matches space name case-insensitively (uppercase query, lowercase in API)', async function () { + const apps: AppDetails[] = [{ AppName: 'app1', DomainId: 'domain1', SpaceName: 'myspace' }] + listAppsForDomainStub.resolves(apps) + + const result = await client.listAppsForDomainMatchSpaceIgnoreCase('domain1', 'MYSPACE') + + assert.strictEqual(result?.AppName, 'app1') + }) + + it('returns undefined when no matching app found (case-insensitive path)', async function () { + const apps: AppDetails[] = [{ AppName: 'app1', DomainId: 'domain1', SpaceName: 'OtherSpace' }] + listAppsForDomainStub.resolves(apps) + + const result = await client.listAppsForDomainMatchSpaceIgnoreCase('domain1', 'MySpace') + + assert.strictEqual(result, undefined) + }) + + it('returns undefined when domain has no apps (case-insensitive path)', async function () { + listAppsForDomainStub.resolves([]) + + const result = await client.listAppsForDomainMatchSpaceIgnoreCase('domain1', 'MySpace') + + assert.strictEqual(result, undefined) + }) + + it('returns undefined when listAppForSpace returns undefined (lowercase path)', async function () { + listAppForSpaceStub.resolves(undefined) + + const result = await client.listAppsForDomainMatchSpaceIgnoreCase('domain1', 'myspace') + + assert.strictEqual(result, undefined) + }) +}) + describe('SagemakerClient.waitForAppInService', function () { const region = 'test-region' let client: SagemakerClient From b698a4f9cfa4d75168500f8d15edaf2317b0a1d6 Mon Sep 17 00:00:00 2001 From: aws-ajangg Date: Wed, 14 Jan 2026 16:11:02 -0800 Subject: [PATCH 04/51] fix(sagemaker): singleton window bug (#8385) ## Problem - When user connects to space, it creates a duplicate window for the same space ## Solution - Assign unique identifier to workspace. This will open same external window when connecting to same workspace. ## Notes - Test cases added in separate pr with unit tests - Retested locally for most recent changes with new vsix --- - Treat all work as PUBLIC. Private `feature/x` branches will not be squash-merged at release time. - Your code changes must meet the guidelines in [CONTRIBUTING.md](https://github.com/aws/aws-toolkit-vscode/blob/master/CONTRIBUTING.md#guidelines). - License: I confirm that my contribution is made under the terms of the Apache 2.0 license. --- .../core/src/awsService/sagemaker/commands.ts | 71 +++++++++++++++++-- .../core/src/awsService/sagemaker/model.ts | 2 +- .../src/awsService/sagemaker/uriHandlers.ts | 4 +- .../core/src/shared/clients/kubectlClient.ts | 20 +++++- 4 files changed, 87 insertions(+), 10 deletions(-) diff --git a/packages/core/src/awsService/sagemaker/commands.ts b/packages/core/src/awsService/sagemaker/commands.ts index c0160fa19ba..dd67ee04804 100644 --- a/packages/core/src/awsService/sagemaker/commands.ts +++ b/packages/core/src/awsService/sagemaker/commands.ts @@ -30,6 +30,7 @@ import { } from './constants' import { SagemakerUnifiedStudioSpaceNode } from '../../sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioSpaceNode' import { node } from 'webpack' +import { parse } from '@aws-sdk/util-arn-parser' const localize = nls.loadMessageBundle() @@ -99,7 +100,7 @@ export async function deeplinkConnect( appType?: string, workspaceName?: string, namespace?: string, - eksClusterArn?: string, + clusterArn?: string, isSMUS: boolean = false ) { getLogger().debug( @@ -117,11 +118,11 @@ export async function deeplinkConnect( appType: ${appType}, workspaceName: ${workspaceName}, namespace: ${namespace}, - eksClusterArn: ${eksClusterArn}` + clusterArn: ${clusterArn}` ) getLogger().info( - `sm:deeplinkConnect: domain: ${domain}, appType: ${appType}, workspaceName: ${workspaceName}, namespace: ${namespace}, eksClusterArn: ${eksClusterArn}` + `sm:deeplinkConnect: domain: ${domain}, appType: ${appType}, workspaceName: ${workspaceName}, namespace: ${namespace}, clusterArn: ${clusterArn}` ) if (isRemoteWorkspace()) { @@ -131,8 +132,13 @@ export async function deeplinkConnect( try { let connectionType = 'sm_dl' - if (domain === '') { + if (!domain && clusterArn && workspaceName && namespace) { + const { accountId, region, clusterName } = parseArn(clusterArn) connectionType = 'sm_hp' + const proposedSession = `${workspaceName}_${namespace}_${clusterName}_${region}_${accountId}` + session = isValidSshHostname(proposedSession) + ? proposedSession + : createValidSshSession(workspaceName, namespace, clusterName, region, accountId) } const remoteEnv = await prepareDevEnvConnection( connectionIdentifier, @@ -178,6 +184,63 @@ export async function deeplinkConnect( } } +function parseArn(arn: string): { accountId: string; region: string; clusterName: string } { + try { + const parsed = parse(arn) + if (!parsed.service) { + throw new Error('Invalid service') + } + const clusterName = parsed.resource.split('/')[1] + if (!clusterName) { + throw new Error('Invalid cluster name') + } + return { + accountId: parsed.accountId, + clusterName, + region: parsed.region, + } + } catch (error) { + throw new Error('Invalid cluster ARN') + } +} + +/** + * Validates and sanitizes session names for SSH hostname compliance + */ +function createValidSshSession( + workspaceName: string, + namespace: string, + clusterName: string, + region: string, + accountId: string +): string { + const sanitize = (str: string, maxLength: number): string => + str + .toLowerCase() + .replace(/[^a-z0-9.-]/g, '') + .replace(/^-+|-+$/g, '') + .substring(0, maxLength) + + const components = [ + sanitize(workspaceName, 63), // K8s limit + sanitize(namespace, 63), // K8s limit + sanitize(clusterName, 63), // HP cluster limit + sanitize(region, 16), // Longest AWS region limit + sanitize(accountId, 12), // Fixed + ].filter((c) => c.length > 0) + // Total: 63 + 63 + 63 + 16 + 12 + 4 separators + 3 chars for hostname header = 224 < 253 (max limit) + + const session = components.join('_').substring(0, 224) + return session +} + +/** + * Validates if a string meets SSH hostname naming convention + */ +function isValidSshHostname(label: string): boolean { + return /^[a-z0-9]([a-z0-9.-_]{0,222}[a-z0-9])?$/.test(label) +} + export async function stopSpace( node: SagemakerSpaceNode | SagemakerUnifiedStudioSpaceNode, ctx: vscode.ExtensionContext, diff --git a/packages/core/src/awsService/sagemaker/model.ts b/packages/core/src/awsService/sagemaker/model.ts index b1fc5259fc8..bebbac31a0d 100644 --- a/packages/core/src/awsService/sagemaker/model.ts +++ b/packages/core/src/awsService/sagemaker/model.ts @@ -209,7 +209,7 @@ export async function prepareDevEnvConnection( const hyperPodEnv: NodeJS.ProcessEnv = { AWS_REGION: region, - SESSION_ID: session || '', + SESSION_ID: hostname || '', STREAM_URL: decodedWsUrl, TOKEN: decodedToken, AWS_SSM_CLI: ssm, diff --git a/packages/core/src/awsService/sagemaker/uriHandlers.ts b/packages/core/src/awsService/sagemaker/uriHandlers.ts index 411fe5a789c..6a189698472 100644 --- a/packages/core/src/awsService/sagemaker/uriHandlers.ts +++ b/packages/core/src/awsService/sagemaker/uriHandlers.ts @@ -38,7 +38,7 @@ export function register(ctx: ExtContext) { undefined, params.workspaceName, params.namespace, - params.eksClusterArn + params.clusterArn ) }) } @@ -51,7 +51,7 @@ export function register(ctx: ExtContext) { export function parseHyperpodConnectParams(query: SearchParams) { const requiredParams = query.getFromKeysOrThrow('sessionId', 'streamUrl', 'sessionToken', 'cell-number') - const optionalParams = query.getFromKeys('workspaceName', 'namespace', 'eksClusterArn') + const optionalParams = query.getFromKeys('workspaceName', 'namespace', 'clusterArn') return { ...requiredParams, ...optionalParams } } export function parseConnectParams(query: SearchParams) { diff --git a/packages/core/src/shared/clients/kubectlClient.ts b/packages/core/src/shared/clients/kubectlClient.ts index a374927bda4..a04f8111faf 100644 --- a/packages/core/src/shared/clients/kubectlClient.ts +++ b/packages/core/src/shared/clients/kubectlClient.ts @@ -35,9 +35,11 @@ export interface HyperpodCluster { export class KubectlClient { private kubeConfig: k8s.KubeConfig private k8sApi: k8s.CustomObjectsApi + private hyperpodCluster: HyperpodCluster public constructor(eksCluster: Cluster, hyperpodCluster: HyperpodCluster) { this.kubeConfig = new k8s.KubeConfig() + this.hyperpodCluster = hyperpodCluster this.loadKubeConfig(eksCluster, hyperpodCluster) this.k8sApi = this.kubeConfig.makeApiClient(k8s.CustomObjectsApi) } @@ -256,10 +258,22 @@ export class KubectlClient { const presignedUrl = body.status?.workspaceConnectionUrl const connectionType = body.status?.workspaceConnectionType - getLogger().info(`Connection Type: ${connectionType}`) - getLogger().info(`Presigned URL: ${presignedUrl}`) + if (!presignedUrl) { + throw new Error('No workspace connection URL returned') + } + + const url = new URL(presignedUrl) - return { type: connectionType || 'vscode-remote', url: presignedUrl } + // If eksClusterArn exists, remove it and add clusterArn instead + if (url.searchParams.has('eksClusterArn') && this.hyperpodCluster.clusterArn) { + url.searchParams.delete('eksClusterArn') + url.searchParams.set('clusterArn', this.hyperpodCluster.clusterArn) + } + + const modifiedUrl = url.toString() + getLogger().info(`Connection Type: ${connectionType}`) + getLogger().info(`Modified Presigned URL: ${modifiedUrl}`) + return { type: connectionType || 'vscode-remote', url: modifiedUrl } } catch (error) { getLogger().error(`[Hyperpod] Failed to create workspace connection: ${error}`) throw new Error( From a4eb4a4fcab78339186c4e978fd738c5fc59409d Mon Sep 17 00:00:00 2001 From: Keyu Wu Date: Wed, 14 Jan 2026 16:48:17 -0800 Subject: [PATCH 05/51] deps(smus): Upgrade sdk v2 to sdk v3 - DataZoneCustomClient (#8411) # Summary This PR migrates the DataZone custom API client from the deprecated AWS SDK v2 generator pattern to standalone AWS SDK v3-compatible packages. This migration is required as part of the broader AWS Toolkit repository migration from SDK v2 to v3. The AWS Toolkit VSCode repository is deprecating the centralized generateServiceClient.ts script that generates TypeScript clients from service JSON definitions. The SageMaker Unified Studio (SMUS) team currently uses this v2 generator for DataZone Custom API. # Solution * Created standalone package @amzn/datazone-custom-client with SDK v3 patterns * Updated DataZoneCustomClientHelper to use SDK v3 client initialization and Command pattern * Migrated from client.methodName().promise() to client.send(new Command()) pattern * Updated credential provider to use SDK v3 async credential provider function * Updated imports to use new standalone package types and commands * Updated test files to mock SDK v3 send() method instead of v2 .promise() pattern * Removed dependency for DataZone Custom API on the deprecated generateServiceClient.ts script --- - Treat all work as PUBLIC. Private `feature/x` branches will not be squash-merged at release time. - Your code changes must meet the guidelines in [CONTRIBUTING.md](https://github.com/aws/aws-toolkit-vscode/blob/master/CONTRIBUTING.md#guidelines). - License: I confirm that my contribution is made under the terms of the Apache 2.0 license. Co-authored-by: Laxman Reddy <141967714+laileni-aws@users.noreply.github.com> Co-authored-by: invictus <149003065+ashishrp-aws@users.noreply.github.com> --- package-lock.json | 1087 +++++++++++++++++ packages/core/package.json | 1 + .../scripts/build/generateServiceClient.ts | 4 - .../client/datazoneCustomClientHelper.ts | 122 +- .../shared/client/datazonecustomclient.json | 919 -------------- .../client/datazoneCustomClientHelper.test.ts | 130 +- .../@amzn/datazone-custom-client/3.0.0.tgz | Bin 0 -> 46241 bytes 7 files changed, 1211 insertions(+), 1052 deletions(-) delete mode 100644 packages/core/src/sagemakerunifiedstudio/shared/client/datazonecustomclient.json create mode 100644 src.gen/@amzn/datazone-custom-client/3.0.0.tgz diff --git a/package-lock.json b/package-lock.json index 49bcfaa33c9..fdd6828d97e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -71,6 +71,1092 @@ "resolved": "src.gen/@amzn/codewhisperer-streaming", "link": true }, + "node_modules/@amzn/datazone-custom-client": { + "version": "3.0.0", + "resolved": "file:src.gen/@amzn/datazone-custom-client/3.0.0.tgz", + "integrity": "sha512-3JnzcanwZmNsppGXfwZLotqYjF0h2jv7yDfm0ld5sIZZXdBBNNZbGULwP6YZmtVFkjaTUK8DAcjROmm90X7FXg==", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.901.0", + "@aws-sdk/credential-provider-node": "3.901.0", + "@aws-sdk/middleware-host-header": "3.901.0", + "@aws-sdk/middleware-logger": "3.901.0", + "@aws-sdk/middleware-recursion-detection": "3.901.0", + "@aws-sdk/middleware-user-agent": "3.901.0", + "@aws-sdk/region-config-resolver": "3.901.0", + "@aws-sdk/types": "3.901.0", + "@aws-sdk/util-endpoints": "3.901.0", + "@aws-sdk/util-user-agent-browser": "3.901.0", + "@aws-sdk/util-user-agent-node": "3.901.0", + "@smithy/config-resolver": "^4.3.0", + "@smithy/core": "^3.14.0", + "@smithy/fetch-http-handler": "^5.3.0", + "@smithy/hash-node": "^4.2.0", + "@smithy/invalid-dependency": "^4.2.0", + "@smithy/middleware-content-length": "^4.2.0", + "@smithy/middleware-endpoint": "^4.3.0", + "@smithy/middleware-retry": "^4.4.0", + "@smithy/middleware-serde": "^4.2.0", + "@smithy/middleware-stack": "^4.2.0", + "@smithy/node-config-provider": "^4.3.0", + "@smithy/node-http-handler": "^4.3.0", + "@smithy/protocol-http": "^5.3.0", + "@smithy/smithy-client": "^4.7.0", + "@smithy/types": "^4.6.0", + "@smithy/url-parser": "^4.2.0", + "@smithy/util-base64": "^4.2.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-body-length-node": "^4.2.0", + "@smithy/util-defaults-mode-browser": "^4.2.0", + "@smithy/util-defaults-mode-node": "^4.2.0", + "@smithy/util-endpoints": "^3.2.0", + "@smithy/util-middleware": "^4.2.0", + "@smithy/util-retry": "^4.2.0", + "@smithy/util-stream": "^4.4.0", + "@smithy/util-utf8": "^4.2.0", + "@smithy/uuid": "^1.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/datazone-custom-client/node_modules/@aws-sdk/client-sso": { + "version": "3.901.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.901.0.tgz", + "integrity": "sha512-sGyDjjkJ7ppaE+bAKL/Q5IvVCxtoyBIzN+7+hWTS/mUxWJ9EOq9238IqmVIIK6sYNIzEf9yhobfMARasPYVTNg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.901.0", + "@aws-sdk/middleware-host-header": "3.901.0", + "@aws-sdk/middleware-logger": "3.901.0", + "@aws-sdk/middleware-recursion-detection": "3.901.0", + "@aws-sdk/middleware-user-agent": "3.901.0", + "@aws-sdk/region-config-resolver": "3.901.0", + "@aws-sdk/types": "3.901.0", + "@aws-sdk/util-endpoints": "3.901.0", + "@aws-sdk/util-user-agent-browser": "3.901.0", + "@aws-sdk/util-user-agent-node": "3.901.0", + "@smithy/config-resolver": "^4.3.0", + "@smithy/core": "^3.14.0", + "@smithy/fetch-http-handler": "^5.3.0", + "@smithy/hash-node": "^4.2.0", + "@smithy/invalid-dependency": "^4.2.0", + "@smithy/middleware-content-length": "^4.2.0", + "@smithy/middleware-endpoint": "^4.3.0", + "@smithy/middleware-retry": "^4.4.0", + "@smithy/middleware-serde": "^4.2.0", + "@smithy/middleware-stack": "^4.2.0", + "@smithy/node-config-provider": "^4.3.0", + "@smithy/node-http-handler": "^4.3.0", + "@smithy/protocol-http": "^5.3.0", + "@smithy/smithy-client": "^4.7.0", + "@smithy/types": "^4.6.0", + "@smithy/url-parser": "^4.2.0", + "@smithy/util-base64": "^4.2.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-body-length-node": "^4.2.0", + "@smithy/util-defaults-mode-browser": "^4.2.0", + "@smithy/util-defaults-mode-node": "^4.2.0", + "@smithy/util-endpoints": "^3.2.0", + "@smithy/util-middleware": "^4.2.0", + "@smithy/util-retry": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/datazone-custom-client/node_modules/@aws-sdk/core": { + "version": "3.901.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.901.0.tgz", + "integrity": "sha512-brKAc3y64tdhyuEf+OPIUln86bRTqkLgb9xkd6kUdIeA5+qmp/N6amItQz+RN4k4O3kqkCPYnAd3LonTKluobw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.901.0", + "@aws-sdk/xml-builder": "3.901.0", + "@smithy/core": "^3.14.0", + "@smithy/node-config-provider": "^4.3.0", + "@smithy/property-provider": "^4.2.0", + "@smithy/protocol-http": "^5.3.0", + "@smithy/signature-v4": "^5.3.0", + "@smithy/smithy-client": "^4.7.0", + "@smithy/types": "^4.6.0", + "@smithy/util-base64": "^4.2.0", + "@smithy/util-middleware": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/datazone-custom-client/node_modules/@aws-sdk/credential-provider-env": { + "version": "3.901.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.901.0.tgz", + "integrity": "sha512-5hAdVl3tBuARh3zX5MLJ1P/d+Kr5kXtDU3xm1pxUEF4xt2XkEEpwiX5fbkNkz2rbh3BCt2gOHsAbh6b3M7n+DA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.901.0", + "@aws-sdk/types": "3.901.0", + "@smithy/property-provider": "^4.2.0", + "@smithy/types": "^4.6.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/datazone-custom-client/node_modules/@aws-sdk/credential-provider-http": { + "version": "3.901.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.901.0.tgz", + "integrity": "sha512-Ggr7+0M6QZEsrqRkK7iyJLf4LkIAacAxHz9c4dm9hnDdU7vqrlJm6g73IxMJXWN1bIV7IxfpzB11DsRrB/oNjQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.901.0", + "@aws-sdk/types": "3.901.0", + "@smithy/fetch-http-handler": "^5.3.0", + "@smithy/node-http-handler": "^4.3.0", + "@smithy/property-provider": "^4.2.0", + "@smithy/protocol-http": "^5.3.0", + "@smithy/smithy-client": "^4.7.0", + "@smithy/types": "^4.6.0", + "@smithy/util-stream": "^4.4.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/datazone-custom-client/node_modules/@aws-sdk/credential-provider-ini": { + "version": "3.901.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.901.0.tgz", + "integrity": "sha512-zxadcDS0hNJgv8n4hFYJNOXyfjaNE1vvqIiF/JzZSQpSSYXzCd+WxXef5bQh+W3giDtRUmkvP5JLbamEFjZKyw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.901.0", + "@aws-sdk/credential-provider-env": "3.901.0", + "@aws-sdk/credential-provider-http": "3.901.0", + "@aws-sdk/credential-provider-process": "3.901.0", + "@aws-sdk/credential-provider-sso": "3.901.0", + "@aws-sdk/credential-provider-web-identity": "3.901.0", + "@aws-sdk/nested-clients": "3.901.0", + "@aws-sdk/types": "3.901.0", + "@smithy/credential-provider-imds": "^4.2.0", + "@smithy/property-provider": "^4.2.0", + "@smithy/shared-ini-file-loader": "^4.3.0", + "@smithy/types": "^4.6.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/datazone-custom-client/node_modules/@aws-sdk/credential-provider-node": { + "version": "3.901.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.901.0.tgz", + "integrity": "sha512-dPuFzMF7L1s/lQyT3wDxqLe82PyTH+5o1jdfseTEln64LJMl0ZMWaKX/C1UFNDxaTd35Cgt1bDbjjAWHMiKSFQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.901.0", + "@aws-sdk/credential-provider-http": "3.901.0", + "@aws-sdk/credential-provider-ini": "3.901.0", + "@aws-sdk/credential-provider-process": "3.901.0", + "@aws-sdk/credential-provider-sso": "3.901.0", + "@aws-sdk/credential-provider-web-identity": "3.901.0", + "@aws-sdk/types": "3.901.0", + "@smithy/credential-provider-imds": "^4.2.0", + "@smithy/property-provider": "^4.2.0", + "@smithy/shared-ini-file-loader": "^4.3.0", + "@smithy/types": "^4.6.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/datazone-custom-client/node_modules/@aws-sdk/credential-provider-process": { + "version": "3.901.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.901.0.tgz", + "integrity": "sha512-/IWgmgM3Cl1wTdJA5HqKMAojxLkYchh5kDuphApxKhupLu6Pu0JBOHU8A5GGeFvOycyaVwosod6zDduINZxe+A==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.901.0", + "@aws-sdk/types": "3.901.0", + "@smithy/property-provider": "^4.2.0", + "@smithy/shared-ini-file-loader": "^4.3.0", + "@smithy/types": "^4.6.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/datazone-custom-client/node_modules/@aws-sdk/credential-provider-sso": { + "version": "3.901.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.901.0.tgz", + "integrity": "sha512-SjmqZQHmqFSET7+6xcZgtH7yEyh5q53LN87GqwYlJZ6KJ5oNw11acUNEhUOL1xTSJEvaWqwTIkS2zqrzLcM9bw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/client-sso": "3.901.0", + "@aws-sdk/core": "3.901.0", + "@aws-sdk/token-providers": "3.901.0", + "@aws-sdk/types": "3.901.0", + "@smithy/property-provider": "^4.2.0", + "@smithy/shared-ini-file-loader": "^4.3.0", + "@smithy/types": "^4.6.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/datazone-custom-client/node_modules/@aws-sdk/credential-provider-web-identity": { + "version": "3.901.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.901.0.tgz", + "integrity": "sha512-NYjy/6NLxH9m01+pfpB4ql8QgAorJcu8tw69kzHwUd/ql6wUDTbC7HcXqtKlIwWjzjgj2BKL7j6SyFapgCuafA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.901.0", + "@aws-sdk/nested-clients": "3.901.0", + "@aws-sdk/types": "3.901.0", + "@smithy/property-provider": "^4.2.0", + "@smithy/shared-ini-file-loader": "^4.3.0", + "@smithy/types": "^4.6.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/datazone-custom-client/node_modules/@aws-sdk/middleware-host-header": { + "version": "3.901.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.901.0.tgz", + "integrity": "sha512-yWX7GvRmqBtbNnUW7qbre3GvZmyYwU0WHefpZzDTYDoNgatuYq6LgUIQ+z5C04/kCRoFkAFrHag8a3BXqFzq5A==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.901.0", + "@smithy/protocol-http": "^5.3.0", + "@smithy/types": "^4.6.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/datazone-custom-client/node_modules/@aws-sdk/middleware-logger": { + "version": "3.901.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.901.0.tgz", + "integrity": "sha512-UoHebjE7el/tfRo8/CQTj91oNUm+5Heus5/a4ECdmWaSCHCS/hXTsU3PTTHAY67oAQR8wBLFPfp3mMvXjB+L2A==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.901.0", + "@smithy/types": "^4.6.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/datazone-custom-client/node_modules/@aws-sdk/middleware-recursion-detection": { + "version": "3.901.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.901.0.tgz", + "integrity": "sha512-Wd2t8qa/4OL0v/oDpCHHYkgsXJr8/ttCxrvCKAt0H1zZe2LlRhY9gpDVKqdertfHrHDj786fOvEQA28G1L75Dg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.901.0", + "@aws/lambda-invoke-store": "^0.0.1", + "@smithy/protocol-http": "^5.3.0", + "@smithy/types": "^4.6.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/datazone-custom-client/node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.901.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.901.0.tgz", + "integrity": "sha512-Zby4F03fvD9xAgXGPywyk4bC1jCbnyubMEYChLYohD+x20ULQCf+AimF/Btn7YL+hBpzh1+RmqmvZcx+RgwgNQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.901.0", + "@aws-sdk/types": "3.901.0", + "@aws-sdk/util-endpoints": "3.901.0", + "@smithy/core": "^3.14.0", + "@smithy/protocol-http": "^5.3.0", + "@smithy/types": "^4.6.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/datazone-custom-client/node_modules/@aws-sdk/nested-clients": { + "version": "3.901.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.901.0.tgz", + "integrity": "sha512-feAAAMsVwctk2Tms40ONybvpfJPLCmSdI+G+OTrNpizkGLNl6ik2Ng2RzxY6UqOfN8abqKP/DOUj1qYDRDG8ag==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.901.0", + "@aws-sdk/middleware-host-header": "3.901.0", + "@aws-sdk/middleware-logger": "3.901.0", + "@aws-sdk/middleware-recursion-detection": "3.901.0", + "@aws-sdk/middleware-user-agent": "3.901.0", + "@aws-sdk/region-config-resolver": "3.901.0", + "@aws-sdk/types": "3.901.0", + "@aws-sdk/util-endpoints": "3.901.0", + "@aws-sdk/util-user-agent-browser": "3.901.0", + "@aws-sdk/util-user-agent-node": "3.901.0", + "@smithy/config-resolver": "^4.3.0", + "@smithy/core": "^3.14.0", + "@smithy/fetch-http-handler": "^5.3.0", + "@smithy/hash-node": "^4.2.0", + "@smithy/invalid-dependency": "^4.2.0", + "@smithy/middleware-content-length": "^4.2.0", + "@smithy/middleware-endpoint": "^4.3.0", + "@smithy/middleware-retry": "^4.4.0", + "@smithy/middleware-serde": "^4.2.0", + "@smithy/middleware-stack": "^4.2.0", + "@smithy/node-config-provider": "^4.3.0", + "@smithy/node-http-handler": "^4.3.0", + "@smithy/protocol-http": "^5.3.0", + "@smithy/smithy-client": "^4.7.0", + "@smithy/types": "^4.6.0", + "@smithy/url-parser": "^4.2.0", + "@smithy/util-base64": "^4.2.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-body-length-node": "^4.2.0", + "@smithy/util-defaults-mode-browser": "^4.2.0", + "@smithy/util-defaults-mode-node": "^4.2.0", + "@smithy/util-endpoints": "^3.2.0", + "@smithy/util-middleware": "^4.2.0", + "@smithy/util-retry": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/datazone-custom-client/node_modules/@aws-sdk/region-config-resolver": { + "version": "3.901.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.901.0.tgz", + "integrity": "sha512-7F0N888qVLHo4CSQOsnkZ4QAp8uHLKJ4v3u09Ly5k4AEStrSlFpckTPyUx6elwGL+fxGjNE2aakK8vEgzzCV0A==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.901.0", + "@smithy/node-config-provider": "^4.3.0", + "@smithy/types": "^4.6.0", + "@smithy/util-config-provider": "^4.2.0", + "@smithy/util-middleware": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/datazone-custom-client/node_modules/@aws-sdk/token-providers": { + "version": "3.901.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.901.0.tgz", + "integrity": "sha512-pJEr1Ggbc/uVTDqp9IbNu9hdr0eQf3yZix3s4Nnyvmg4xmJSGAlbPC9LrNr5u3CDZoc8Z9CuLrvbP4MwYquNpQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.901.0", + "@aws-sdk/nested-clients": "3.901.0", + "@aws-sdk/types": "3.901.0", + "@smithy/property-provider": "^4.2.0", + "@smithy/shared-ini-file-loader": "^4.3.0", + "@smithy/types": "^4.6.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/datazone-custom-client/node_modules/@aws-sdk/types": { + "version": "3.901.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.901.0.tgz", + "integrity": "sha512-FfEM25hLEs4LoXsLXQ/q6X6L4JmKkKkbVFpKD4mwfVHtRVQG6QxJiCPcrkcPISquiy6esbwK2eh64TWbiD60cg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.6.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/datazone-custom-client/node_modules/@aws-sdk/util-endpoints": { + "version": "3.901.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.901.0.tgz", + "integrity": "sha512-5nZP3hGA8FHEtKvEQf4Aww5QZOkjLW1Z+NixSd+0XKfHvA39Ah5sZboScjLx0C9kti/K3OGW1RCx5K9Zc3bZqg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.901.0", + "@smithy/types": "^4.6.0", + "@smithy/url-parser": "^4.2.0", + "@smithy/util-endpoints": "^3.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/datazone-custom-client/node_modules/@aws-sdk/util-user-agent-browser": { + "version": "3.901.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.901.0.tgz", + "integrity": "sha512-Ntb6V/WFI21Ed4PDgL/8NSfoZQQf9xzrwNgiwvnxgAl/KvAvRBgQtqj5gHsDX8Nj2YmJuVoHfH9BGjL9VQ4WNg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.901.0", + "@smithy/types": "^4.6.0", + "bowser": "^2.11.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@amzn/datazone-custom-client/node_modules/@aws-sdk/util-user-agent-node": { + "version": "3.901.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.901.0.tgz", + "integrity": "sha512-l59KQP5TY7vPVUfEURc7P5BJKuNg1RSsAKBQW7LHLECXjLqDUbo2SMLrexLBEoArSt6E8QOrIN0C8z/0Xk0jYw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/middleware-user-agent": "3.901.0", + "@aws-sdk/types": "3.901.0", + "@smithy/node-config-provider": "^4.3.0", + "@smithy/types": "^4.6.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "aws-crt": ">=1.0.0" + }, + "peerDependenciesMeta": { + "aws-crt": { + "optional": true + } + } + }, + "node_modules/@amzn/datazone-custom-client/node_modules/@aws-sdk/xml-builder": { + "version": "3.901.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.901.0.tgz", + "integrity": "sha512-pxFCkuAP7Q94wMTNPAwi6hEtNrp/BdFf+HOrIEeFQsk4EoOmpKY3I6S+u6A9Wg295J80Kh74LqDWM22ux3z6Aw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.6.0", + "fast-xml-parser": "5.2.5", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/datazone-custom-client/node_modules/@smithy/abort-controller": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.2.5.tgz", + "integrity": "sha512-j7HwVkBw68YW8UmFRcjZOmssE77Rvk0GWAIN1oFBhsaovQmZWYCIcGa9/pwRB0ExI8Sk9MWNALTjftjHZea7VA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/datazone-custom-client/node_modules/@smithy/config-resolver": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.4.3.tgz", + "integrity": "sha512-ezHLe1tKLUxDJo2LHtDuEDyWXolw8WGOR92qb4bQdWq/zKenO5BvctZGrVJBK08zjezSk7bmbKFOXIVyChvDLw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/node-config-provider": "^4.3.5", + "@smithy/types": "^4.9.0", + "@smithy/util-config-provider": "^4.2.0", + "@smithy/util-endpoints": "^3.2.5", + "@smithy/util-middleware": "^4.2.5", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/datazone-custom-client/node_modules/@smithy/core": { + "version": "3.18.7", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.18.7.tgz", + "integrity": "sha512-axG9MvKhMWOhFbvf5y2DuyTxQueO0dkedY9QC3mAfndLosRI/9LJv8WaL0mw7ubNhsO4IuXX9/9dYGPFvHrqlw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/middleware-serde": "^4.2.6", + "@smithy/protocol-http": "^5.3.5", + "@smithy/types": "^4.9.0", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-middleware": "^4.2.5", + "@smithy/util-stream": "^4.5.6", + "@smithy/util-utf8": "^4.2.0", + "@smithy/uuid": "^1.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/datazone-custom-client/node_modules/@smithy/credential-provider-imds": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.2.5.tgz", + "integrity": "sha512-BZwotjoZWn9+36nimwm/OLIcVe+KYRwzMjfhd4QT7QxPm9WY0HiOV8t/Wlh+HVUif0SBVV7ksq8//hPaBC/okQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/node-config-provider": "^4.3.5", + "@smithy/property-provider": "^4.2.5", + "@smithy/types": "^4.9.0", + "@smithy/url-parser": "^4.2.5", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/datazone-custom-client/node_modules/@smithy/fetch-http-handler": { + "version": "5.3.6", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.3.6.tgz", + "integrity": "sha512-3+RG3EA6BBJ/ofZUeTFJA7mHfSYrZtQIrDP9dI8Lf7X6Jbos2jptuLrAAteDiFVrmbEmLSuRG/bUKzfAXk7dhg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/protocol-http": "^5.3.5", + "@smithy/querystring-builder": "^4.2.5", + "@smithy/types": "^4.9.0", + "@smithy/util-base64": "^4.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/datazone-custom-client/node_modules/@smithy/hash-node": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.2.5.tgz", + "integrity": "sha512-DpYX914YOfA3UDT9CN1BM787PcHfWRBB43fFGCYrZFUH0Jv+5t8yYl+Pd5PW4+QzoGEDvn5d5QIO4j2HyYZQSA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "@smithy/util-buffer-from": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/datazone-custom-client/node_modules/@smithy/invalid-dependency": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.2.5.tgz", + "integrity": "sha512-2L2erASEro1WC5nV+plwIMxrTXpvpfzl4e+Nre6vBVRR2HKeGGcvpJyyL3/PpiSg+cJG2KpTmZmq934Olb6e5A==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/datazone-custom-client/node_modules/@smithy/is-array-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-4.2.0.tgz", + "integrity": "sha512-DZZZBvC7sjcYh4MazJSGiWMI2L7E0oCiRHREDzIxi/M2LY79/21iXt6aPLHge82wi5LsuRF5A06Ds3+0mlh6CQ==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/datazone-custom-client/node_modules/@smithy/middleware-content-length": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.2.5.tgz", + "integrity": "sha512-Y/RabVa5vbl5FuHYV2vUCwvh/dqzrEY/K2yWPSqvhFUwIY0atLqO4TienjBXakoy4zrKAMCZwg+YEqmH7jaN7A==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/protocol-http": "^5.3.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/datazone-custom-client/node_modules/@smithy/middleware-endpoint": { + "version": "4.3.14", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.3.14.tgz", + "integrity": "sha512-v0q4uTKgBM8dsqGjqsabZQyH85nFaTnFcgpWU1uydKFsdyyMzfvOkNum9G7VK+dOP01vUnoZxIeRiJ6uD0kjIg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/core": "^3.18.7", + "@smithy/middleware-serde": "^4.2.6", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/shared-ini-file-loader": "^4.4.0", + "@smithy/types": "^4.9.0", + "@smithy/url-parser": "^4.2.5", + "@smithy/util-middleware": "^4.2.5", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/datazone-custom-client/node_modules/@smithy/middleware-retry": { + "version": "4.4.14", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.4.14.tgz", + "integrity": "sha512-Z2DG8Ej7FyWG1UA+7HceINtSLzswUgs2np3sZX0YBBxCt+CXG4QUxv88ZDS3+2/1ldW7LqtSY1UO/6VQ1pND8Q==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/node-config-provider": "^4.3.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/service-error-classification": "^4.2.5", + "@smithy/smithy-client": "^4.9.10", + "@smithy/types": "^4.9.0", + "@smithy/util-middleware": "^4.2.5", + "@smithy/util-retry": "^4.2.5", + "@smithy/uuid": "^1.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/datazone-custom-client/node_modules/@smithy/middleware-serde": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.2.6.tgz", + "integrity": "sha512-VkLoE/z7e2g8pirwisLz8XJWedUSY8my/qrp81VmAdyrhi94T+riBfwP+AOEEFR9rFTSonC/5D2eWNmFabHyGQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/protocol-http": "^5.3.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/datazone-custom-client/node_modules/@smithy/middleware-stack": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.2.5.tgz", + "integrity": "sha512-bYrutc+neOyWxtZdbB2USbQttZN0mXaOyYLIsaTbJhFsfpXyGWUxJpEuO1rJ8IIJm2qH4+xJT0mxUSsEDTYwdQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/datazone-custom-client/node_modules/@smithy/node-config-provider": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.3.5.tgz", + "integrity": "sha512-UTurh1C4qkVCtqggI36DGbLB2Kv8UlcFdMXDcWMbqVY2uRg0XmT9Pb4Vj6oSQ34eizO1fvR0RnFV4Axw4IrrAg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/property-provider": "^4.2.5", + "@smithy/shared-ini-file-loader": "^4.4.0", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/datazone-custom-client/node_modules/@smithy/node-http-handler": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.4.5.tgz", + "integrity": "sha512-CMnzM9R2WqlqXQGtIlsHMEZfXKJVTIrqCNoSd/QpAyp+Dw0a1Vps13l6ma1fH8g7zSPNsA59B/kWgeylFuA/lw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/abort-controller": "^4.2.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/querystring-builder": "^4.2.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/datazone-custom-client/node_modules/@smithy/property-provider": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.2.5.tgz", + "integrity": "sha512-8iLN1XSE1rl4MuxvQ+5OSk/Zb5El7NJZ1td6Tn+8dQQHIjp59Lwl6bd0+nzw6SKm2wSSriH2v/I9LPzUic7EOg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/datazone-custom-client/node_modules/@smithy/protocol-http": { + "version": "5.3.5", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.3.5.tgz", + "integrity": "sha512-RlaL+sA0LNMp03bf7XPbFmT5gN+w3besXSWMkA8rcmxLSVfiEXElQi4O2IWwPfxzcHkxqrwBFMbngB8yx/RvaQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/datazone-custom-client/node_modules/@smithy/querystring-builder": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.2.5.tgz", + "integrity": "sha512-y98otMI1saoajeik2kLfGyRp11e5U/iJYH/wLCh3aTV/XutbGT9nziKGkgCaMD1ghK7p6htHMm6b6scl9JRUWg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "@smithy/util-uri-escape": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/datazone-custom-client/node_modules/@smithy/querystring-parser": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.2.5.tgz", + "integrity": "sha512-031WCTdPYgiQRYNPXznHXof2YM0GwL6SeaSyTH/P72M1Vz73TvCNH2Nq8Iu2IEPq9QP2yx0/nrw5YmSeAi/AjQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/datazone-custom-client/node_modules/@smithy/service-error-classification": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.2.5.tgz", + "integrity": "sha512-8fEvK+WPE3wUAcDvqDQG1Vk3ANLR8Px979te96m84CbKAjBVf25rPYSzb4xU4hlTyho7VhOGnh5i62D/JVF0JQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/datazone-custom-client/node_modules/@smithy/shared-ini-file-loader": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.4.0.tgz", + "integrity": "sha512-5WmZ5+kJgJDjwXXIzr1vDTG+RhF9wzSODQBfkrQ2VVkYALKGvZX1lgVSxEkgicSAFnFhPj5rudJV0zoinqS0bA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/datazone-custom-client/node_modules/@smithy/signature-v4": { + "version": "5.3.5", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.3.5.tgz", + "integrity": "sha512-xSUfMu1FT7ccfSXkoLl/QRQBi2rOvi3tiBZU2Tdy3I6cgvZ6SEi9QNey+lqps/sJRnogIS+lq+B1gxxbra2a/w==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^4.2.0", + "@smithy/protocol-http": "^5.3.5", + "@smithy/types": "^4.9.0", + "@smithy/util-hex-encoding": "^4.2.0", + "@smithy/util-middleware": "^4.2.5", + "@smithy/util-uri-escape": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/datazone-custom-client/node_modules/@smithy/smithy-client": { + "version": "4.9.10", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.9.10.tgz", + "integrity": "sha512-Jaoz4Jw1QYHc1EFww/E6gVtNjhoDU+gwRKqXP6C3LKYqqH2UQhP8tMP3+t/ePrhaze7fhLE8vS2q6vVxBANFTQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/core": "^3.18.7", + "@smithy/middleware-endpoint": "^4.3.14", + "@smithy/middleware-stack": "^4.2.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/types": "^4.9.0", + "@smithy/util-stream": "^4.5.6", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/datazone-custom-client/node_modules/@smithy/types": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.9.0.tgz", + "integrity": "sha512-MvUbdnXDTwykR8cB1WZvNNwqoWVaTRA0RLlLmf/cIFNMM2cKWz01X4Ly6SMC4Kks30r8tT3Cty0jmeWfiuyHTA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/datazone-custom-client/node_modules/@smithy/url-parser": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.2.5.tgz", + "integrity": "sha512-VaxMGsilqFnK1CeBX+LXnSuaMx4sTL/6znSZh2829txWieazdVxr54HmiyTsIbpOTLcf5nYpq9lpzmwRdxj6rQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/querystring-parser": "^4.2.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/datazone-custom-client/node_modules/@smithy/util-base64": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-4.3.0.tgz", + "integrity": "sha512-GkXZ59JfyxsIwNTWFnjmFEI8kZpRNIBfxKjv09+nkAWPt/4aGaEWMM04m4sxgNVWkbt2MdSvE3KF/PfX4nFedQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/datazone-custom-client/node_modules/@smithy/util-body-length-browser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-4.2.0.tgz", + "integrity": "sha512-Fkoh/I76szMKJnBXWPdFkQJl2r9SjPt3cMzLdOB6eJ4Pnpas8hVoWPYemX/peO0yrrvldgCUVJqOAjUrOLjbxg==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/datazone-custom-client/node_modules/@smithy/util-body-length-node": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-4.2.1.tgz", + "integrity": "sha512-h53dz/pISVrVrfxV1iqXlx5pRg3V2YWFcSQyPyXZRrZoZj4R4DeWRDo1a7dd3CPTcFi3kE+98tuNyD2axyZReA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/datazone-custom-client/node_modules/@smithy/util-buffer-from": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-4.2.0.tgz", + "integrity": "sha512-kAY9hTKulTNevM2nlRtxAG2FQ3B2OR6QIrPY3zE5LqJy1oxzmgBGsHLWTcNhWXKchgA0WHW+mZkQrng/pgcCew==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/datazone-custom-client/node_modules/@smithy/util-config-provider": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-4.2.0.tgz", + "integrity": "sha512-YEjpl6XJ36FTKmD+kRJJWYvrHeUvm5ykaUS5xK+6oXffQPHeEM4/nXlZPe+Wu0lsgRUcNZiliYNh/y7q9c2y6Q==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/datazone-custom-client/node_modules/@smithy/util-defaults-mode-browser": { + "version": "4.3.13", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.3.13.tgz", + "integrity": "sha512-hlVLdAGrVfyNei+pKIgqDTxfu/ZI2NSyqj4IDxKd5bIsIqwR/dSlkxlPaYxFiIaDVrBy0he8orsFy+Cz119XvA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/property-provider": "^4.2.5", + "@smithy/smithy-client": "^4.9.10", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/datazone-custom-client/node_modules/@smithy/util-defaults-mode-node": { + "version": "4.2.16", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.2.16.tgz", + "integrity": "sha512-F1t22IUiJLHrxW9W1CQ6B9PN+skZ9cqSuzB18Eh06HrJPbjsyZ7ZHecAKw80DQtyGTRcVfeukKaCRYebFwclbg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/config-resolver": "^4.4.3", + "@smithy/credential-provider-imds": "^4.2.5", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/property-provider": "^4.2.5", + "@smithy/smithy-client": "^4.9.10", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/datazone-custom-client/node_modules/@smithy/util-endpoints": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.2.5.tgz", + "integrity": "sha512-3O63AAWu2cSNQZp+ayl9I3NapW1p1rR5mlVHcF6hAB1dPZUQFfRPYtplWX/3xrzWthPGj5FqB12taJJCfH6s8A==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/node-config-provider": "^4.3.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/datazone-custom-client/node_modules/@smithy/util-hex-encoding": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-4.2.0.tgz", + "integrity": "sha512-CCQBwJIvXMLKxVbO88IukazJD9a4kQ9ZN7/UMGBjBcJYvatpWk+9g870El4cB8/EJxfe+k+y0GmR9CAzkF+Nbw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/datazone-custom-client/node_modules/@smithy/util-middleware": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.2.5.tgz", + "integrity": "sha512-6Y3+rvBF7+PZOc40ybeZMcGln6xJGVeY60E7jy9Mv5iKpMJpHgRE6dKy9ScsVxvfAYuEX4Q9a65DQX90KaQ3bA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/datazone-custom-client/node_modules/@smithy/util-retry": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.2.5.tgz", + "integrity": "sha512-GBj3+EZBbN4NAqJ/7pAhsXdfzdlznOh8PydUijy6FpNIMnHPSMO2/rP4HKu+UFeikJxShERk528oy7GT79YiJg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/service-error-classification": "^4.2.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/datazone-custom-client/node_modules/@smithy/util-stream": { + "version": "4.5.6", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.5.6.tgz", + "integrity": "sha512-qWw/UM59TiaFrPevefOZ8CNBKbYEP6wBAIlLqxn3VAIo9rgnTNc4ASbVrqDmhuwI87usnjhdQrxodzAGFFzbRQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/fetch-http-handler": "^5.3.6", + "@smithy/node-http-handler": "^4.4.5", + "@smithy/types": "^4.9.0", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-buffer-from": "^4.2.0", + "@smithy/util-hex-encoding": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/datazone-custom-client/node_modules/@smithy/util-uri-escape": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-4.2.0.tgz", + "integrity": "sha512-igZpCKV9+E/Mzrpq6YacdTQ0qTiLm85gD6N/IrmyDvQFA4UnU3d5g3m8tMT/6zG/vVkWSU+VxeUyGonL62DuxA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/datazone-custom-client/node_modules/@smithy/util-utf8": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.2.0.tgz", + "integrity": "sha512-zBPfuzoI8xyBtR2P6WQj63Rz8i3AmfAaJLuNG8dWsfvPe8lO4aCPYLn879mEgHndZH1zQ2oXmG8O1GGzzaoZiw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/datazone-custom-client/node_modules/fast-xml-parser": { + "version": "5.2.5", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.2.5.tgz", + "integrity": "sha512-pfX9uG9Ki0yekDHx2SiuRIyFdyAr1kMIMitPvb0YBo8SUfKvia7w7FIyd/l6av85pFYRhZscS75MwMnbvY+hcQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "dependencies": { + "strnum": "^2.1.0" + }, + "bin": { + "fxparser": "src/cli/cli.js" + } + }, + "node_modules/@amzn/datazone-custom-client/node_modules/strnum": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.1.1.tgz", + "integrity": "sha512-7ZvoFTiCnGxBtDqJ//Cu6fWtZtc7Y3x+QOirG15wztbdngGSkht27o2pyGWrVy0b4WAy3jbKmnoK6g5VlVNUUw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT" + }, "node_modules/@amzn/glue-catalog-client": { "version": "0.0.1", "resolved": "file:src.gen/@amzn/glue-catalog-client/0.0.1.tgz", @@ -43665,6 +44751,7 @@ "dependencies": { "@amzn/amazon-q-developer-streaming-client": "file:../../src.gen/@amzn/amazon-q-developer-streaming-client", "@amzn/codewhisperer-streaming": "file:../../src.gen/@amzn/codewhisperer-streaming", + "@amzn/datazone-custom-client": "file:../../src.gen/@amzn/datazone-custom-client/3.0.0.tgz", "@amzn/glue-catalog-client": "file:../../src.gen/@amzn/glue-catalog-client/0.0.1.tgz", "@amzn/sagemaker-client": "file:../../src.gen/@amzn/sagemaker-client/1.0.0.tgz", "@amzn/sql-workbench-client": "file:../../src.gen/@amzn/sql-workbench-client/3.0.0.tgz", diff --git a/packages/core/package.json b/packages/core/package.json index bd924aabbda..b86854eda31 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -582,6 +582,7 @@ "@amzn/codewhisperer-streaming": "file:../../src.gen/@amzn/codewhisperer-streaming", "@amzn/sagemaker-client": "file:../../src.gen/@amzn/sagemaker-client/1.0.0.tgz", "@amzn/glue-catalog-client": "file:../../src.gen/@amzn/glue-catalog-client/0.0.1.tgz", + "@amzn/datazone-custom-client": "file:../../src.gen/@amzn/datazone-custom-client/3.0.0.tgz", "@amzn/sql-workbench-client": "file:../../src.gen/@amzn/sql-workbench-client/3.0.0.tgz", "@aws-sdk/client-accessanalyzer": "^3.888.0", "@aws-sdk/client-api-gateway": "<3.731.0", diff --git a/packages/core/scripts/build/generateServiceClient.ts b/packages/core/scripts/build/generateServiceClient.ts index 35bb6cd4d61..5d1854527b9 100644 --- a/packages/core/scripts/build/generateServiceClient.ts +++ b/packages/core/scripts/build/generateServiceClient.ts @@ -241,10 +241,6 @@ void (async () => { serviceJsonPath: 'src/codewhisperer/client/user-service-2.json', serviceName: 'CodeWhispererUserClient', }, - { - serviceJsonPath: 'src/sagemakerunifiedstudio/shared/client/datazonecustomclient.json', - serviceName: 'DataZoneCustomClient', - }, ] await generateServiceClients(serviceClientDefinitions) })() diff --git a/packages/core/src/sagemakerunifiedstudio/shared/client/datazoneCustomClientHelper.ts b/packages/core/src/sagemakerunifiedstudio/shared/client/datazoneCustomClientHelper.ts index 684bddf2e08..01c06195b2d 100644 --- a/packages/core/src/sagemakerunifiedstudio/shared/client/datazoneCustomClientHelper.ts +++ b/packages/core/src/sagemakerunifiedstudio/shared/client/datazoneCustomClientHelper.ts @@ -4,12 +4,21 @@ */ import { getLogger } from '../../../shared/logger/logger' -import apiConfig = require('./datazonecustomclient.json') -import globals from '../../../shared/extensionGlobals' -import { Service } from 'aws-sdk' -import { ServiceConfigurationOptions } from 'aws-sdk/lib/service' -import * as DataZoneCustomClient from './datazonecustomclient' -import { adaptConnectionCredentialsProvider } from './credentialsAdapter' +import { + DataZone, + DataZoneClientConfig, + ListDomainsCommand, + GetDomainCommand, + SearchGroupProfilesCommand, + SearchUserProfilesCommand, + DomainSummary, + DomainStatus, + GetDomainOutput, + GroupProfileSummary, + UserProfileSummary, + GroupSearchType, + UserSearchType, +} from '@amzn/datazone-custom-client' import { CredentialsProvider } from '../../../auth/providers/credentials' import { ToolkitError } from '../../../shared/errors' import { SmusUtils, isIamDomain } from '../smusUtils' @@ -30,7 +39,7 @@ export const DataZoneErrorCode = { * Helper client for interacting with AWS DataZone Custom API */ export class DataZoneCustomClientHelper { - private datazoneCustomClient: DataZoneCustomClient | undefined + private datazoneCustomClient: DataZone | undefined private static instances = new Map() private readonly logger = getLogger('smus') @@ -91,33 +100,38 @@ export class DataZoneCustomClientHelper { /** * Gets the DataZone client, initializing it if necessary */ - private async getDataZoneCustomClient(): Promise { + private async getDataZoneCustomClient(): Promise { if (!this.datazoneCustomClient) { try { this.logger.info('DataZoneCustomClientHelper: Creating authenticated DataZone client') - // Use user setting for endpoint if provided, otherwise use default + // Create credential provider function for auto-refresh + const awsCredentialProvider = async () => { + const credentials = await this.credentialProvider.getCredentials() + return { + accessKeyId: credentials.accessKeyId, + secretAccessKey: credentials.secretAccessKey, + sessionToken: credentials.sessionToken, + expiration: credentials.expiration, + } + } + + // Use user setting for endpoint if provided, otherwise use default api.aws endpoint + // Note: The SDK v3 ruleset incorrectly uses amazonaws.com suffix, but DataZone uses api.aws const devSettings = DevSettings.instance const customEndpoint = devSettings.get('endpoints', {})['datazone'] const endpoint = customEndpoint || `https://datazone.${this.region}.api.aws` + this.logger.info( + `DataZoneCustomClientHelper: Using DataZone endpoint: ${endpoint}${customEndpoint ? ' (custom)' : ' (default)'}` + ) - if (customEndpoint) { - this.logger.debug( - `DataZoneCustomClientHelper: Using custom DataZone endpoint from settings: ${endpoint}` - ) + const clientConfig: DataZoneClientConfig = { + region: this.region, + credentials: awsCredentialProvider, + endpoint: endpoint, } - this.datazoneCustomClient = (await globals.sdkClientBuilder.createAwsService( - Service, - { - apiConfig: apiConfig, - endpoint: endpoint, - region: this.region, - credentialProvider: adaptConnectionCredentialsProvider(this.credentialProvider), - } as ServiceConfigurationOptions, - undefined, - false - )) as DataZoneCustomClient + this.datazoneCustomClient = new DataZone(clientConfig) this.logger.info('DataZoneCustomClientHelper: Successfully created authenticated DataZone client') } catch (err) { @@ -137,20 +151,19 @@ export class DataZoneCustomClientHelper { maxResults?: number status?: string nextToken?: string - }): Promise<{ domains: DataZoneCustomClient.Types.DomainSummary[]; nextToken?: string }> { + }): Promise<{ domains: DomainSummary[]; nextToken?: string }> { try { this.logger.info(`DataZoneCustomClientHelper: Listing domains in region ${this.region}`) const datazoneCustomClient = await this.getDataZoneCustomClient() // Call DataZone API to list domains with pagination - const response = await datazoneCustomClient - .listDomains({ - maxResults: options?.maxResults, - status: options?.status, - nextToken: options?.nextToken, - }) - .promise() + const command = new ListDomainsCommand({ + maxResults: options?.maxResults, + status: options?.status as DomainStatus, + nextToken: options?.nextToken, + }) + const response = await datazoneCustomClient.send(command) const domains = response.items || [] @@ -172,9 +185,9 @@ export class DataZoneCustomClientHelper { * @param options Options for listing domains (excluding nextToken which is handled internally) * @returns Promise resolving to an array of all DataZone domains */ - public async fetchAllDomains(options?: { status?: string }): Promise { + public async fetchAllDomains(options?: { status?: string }): Promise { try { - let allDomains: DataZoneCustomClient.Types.DomainSummary[] = [] + let allDomains: DomainSummary[] = [] let nextToken: string | undefined do { const maxResultsPerPage = 25 @@ -199,7 +212,7 @@ export class DataZoneCustomClientHelper { * Gets the domain with IAM authentication mode using pagination with early termination * @returns Promise resolving to the DataZone domain or undefined if not found */ - public async getIamDomain(): Promise { + public async getIamDomain(): Promise { const logger = getLogger('smus') try { @@ -259,17 +272,16 @@ export class DataZoneCustomClientHelper { * @param domainId The ID of the domain to retrieve * @returns Promise resolving to the GetDomainOutput */ - public async getDomain(domainId: string): Promise { + public async getDomain(domainId: string): Promise { try { this.logger.debug(`DataZoneCustomClientHelper: Getting domain with ID: ${domainId}`) const datazoneCustomClient = await this.getDataZoneCustomClient() - const response = await datazoneCustomClient - .getDomain({ - identifier: domainId, - }) - .promise() + const command = new GetDomainCommand({ + identifier: domainId, + }) + const response = await datazoneCustomClient.send(command) this.logger.debug(`DataZoneCustomClientHelper: Successfully retrieved domain: ${domainId}`) return response @@ -293,7 +305,7 @@ export class DataZoneCustomClientHelper { maxResults?: number nextToken?: string } - ): Promise<{ items: DataZoneCustomClient.Types.GroupProfileSummary[]; nextToken?: string }> { + ): Promise<{ items: GroupProfileSummary[]; nextToken?: string }> { try { this.logger.debug( `DataZoneCustomClientHelper: Searching group profiles in domain ${domainIdentifier} with groupType: ${options?.groupType}, searchText: ${options?.searchText}` @@ -301,17 +313,15 @@ export class DataZoneCustomClientHelper { const datazoneCustomClient = await this.getDataZoneCustomClient() - // Build the request parameters - const params: DataZoneCustomClient.Types.SearchGroupProfilesInput = { + // Call DataZone API to search group profiles + const command = new SearchGroupProfilesCommand({ domainIdentifier, - groupType: options?.groupType as DataZoneCustomClient.Types.GroupSearchType, + groupType: options?.groupType as GroupSearchType, searchText: options?.searchText, maxResults: options?.maxResults, nextToken: options?.nextToken, - } - - // Call DataZone API to search group profiles - const response = await datazoneCustomClient.searchGroupProfiles(params).promise() + }) + const response = await datazoneCustomClient.send(command) const items = response.items || [] @@ -342,7 +352,7 @@ export class DataZoneCustomClientHelper { maxResults?: number nextToken?: string } - ): Promise<{ items: DataZoneCustomClient.Types.UserProfileSummary[]; nextToken?: string }> { + ): Promise<{ items: UserProfileSummary[]; nextToken?: string }> { try { this.logger.debug( `DataZoneCustomClientHelper: Searching user profiles in domain ${domainIdentifier} with userType: ${options.userType}, searchText: ${options.searchText}` @@ -350,17 +360,15 @@ export class DataZoneCustomClientHelper { const datazoneCustomClient = await this.getDataZoneCustomClient() - // Build the request parameters - const params: DataZoneCustomClient.Types.SearchUserProfilesInput = { + // Call DataZone API to search user profiles + const command = new SearchUserProfilesCommand({ domainIdentifier, - userType: options.userType as DataZoneCustomClient.Types.UserSearchType, + userType: options.userType as UserSearchType, searchText: options.searchText, maxResults: options.maxResults, nextToken: options.nextToken, - } - - // Call DataZone API to search user profiles - const response = await datazoneCustomClient.searchUserProfiles(params).promise() + }) + const response = await datazoneCustomClient.send(command) const items = response.items || [] diff --git a/packages/core/src/sagemakerunifiedstudio/shared/client/datazonecustomclient.json b/packages/core/src/sagemakerunifiedstudio/shared/client/datazonecustomclient.json deleted file mode 100644 index 8414d3340b8..00000000000 --- a/packages/core/src/sagemakerunifiedstudio/shared/client/datazonecustomclient.json +++ /dev/null @@ -1,919 +0,0 @@ -{ - "version": "2.0", - "metadata": { - "apiVersion": "2018-05-10", - "auth": ["aws.auth#sigv4"], - "endpointPrefix": "datazone", - "protocol": "rest-json", - "protocols": ["rest-json"], - "serviceFullName": "Amazon DataZone", - "serviceId": "DataZone", - "signatureVersion": "v4", - "signingName": "datazone", - "uid": "datazone-2018-05-10" - }, - "operations": { - "GetDomain": { - "name": "GetDomain", - "http": { - "method": "GET", - "requestUri": "/v2/domains/{identifier}", - "responseCode": 200 - }, - "input": { - "shape": "GetDomainInput" - }, - "output": { - "shape": "GetDomainOutput" - }, - "errors": [ - { - "shape": "InternalServerException" - }, - { - "shape": "ResourceNotFoundException" - }, - { - "shape": "AccessDeniedException" - }, - { - "shape": "ThrottlingException" - }, - { - "shape": "ServiceQuotaExceededException" - }, - { - "shape": "ValidationException" - }, - { - "shape": "UnauthorizedException" - } - ], - "readonly": true - }, - "ListDomains": { - "name": "ListDomains", - "http": { - "method": "GET", - "requestUri": "/v2/domains", - "responseCode": 200 - }, - "input": { - "shape": "ListDomainsInput" - }, - "output": { - "shape": "ListDomainsOutput" - }, - "errors": [ - { - "shape": "InternalServerException" - }, - { - "shape": "ResourceNotFoundException" - }, - { - "shape": "AccessDeniedException" - }, - { - "shape": "ThrottlingException" - }, - { - "shape": "ServiceQuotaExceededException" - }, - { - "shape": "ConflictException" - }, - { - "shape": "ValidationException" - }, - { - "shape": "UnauthorizedException" - } - ], - "readonly": true - }, - "SearchGroupProfiles": { - "name": "SearchGroupProfiles", - "http": { - "method": "POST", - "requestUri": "/v2/domains/{domainIdentifier}/search-group-profiles", - "responseCode": 200 - }, - "input": { - "shape": "SearchGroupProfilesInput" - }, - "output": { - "shape": "SearchGroupProfilesOutput" - }, - "errors": [ - { - "shape": "InternalServerException" - }, - { - "shape": "ResourceNotFoundException" - }, - { - "shape": "AccessDeniedException" - }, - { - "shape": "ThrottlingException" - }, - { - "shape": "ConflictException" - }, - { - "shape": "ValidationException" - }, - { - "shape": "UnauthorizedException" - } - ] - }, - "SearchUserProfiles": { - "name": "SearchUserProfiles", - "http": { - "method": "POST", - "requestUri": "/v2/domains/{domainIdentifier}/search-user-profiles", - "responseCode": 200 - }, - "input": { - "shape": "SearchUserProfilesInput" - }, - "output": { - "shape": "SearchUserProfilesOutput" - }, - "errors": [ - { - "shape": "InternalServerException" - }, - { - "shape": "ResourceNotFoundException" - }, - { - "shape": "AccessDeniedException" - }, - { - "shape": "ThrottlingException" - }, - { - "shape": "ConflictException" - }, - { - "shape": "ValidationException" - }, - { - "shape": "UnauthorizedException" - } - ] - } - }, - "shapes": { - "GetDomainInput": { - "type": "structure", - "required": ["identifier"], - "members": { - "identifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "identifier" - } - } - }, - "DomainId": { - "type": "string", - "pattern": "dzd[-_][a-zA-Z0-9_-]{1,36}" - }, - "GetDomainOutput": { - "type": "structure", - "required": ["id", "status"], - "members": { - "id": { - "shape": "DomainId" - }, - "rootDomainUnitId": { - "shape": "DomainUnitId" - }, - "name": { - "shape": "String" - }, - "description": { - "shape": "String" - }, - "singleSignOn": { - "shape": "SingleSignOn" - }, - "domainExecutionRole": { - "shape": "RoleArn" - }, - "arn": { - "shape": "String" - }, - "kmsKeyIdentifier": { - "shape": "KmsKeyArn" - }, - "status": { - "shape": "DomainStatus" - }, - "failureReasons": { - "shape": "FailureReasonsList" - }, - "portalUrl": { - "shape": "String" - }, - "createdAt": { - "shape": "CreatedAt" - }, - "lastUpdatedAt": { - "shape": "UpdatedAt" - }, - "tags": { - "shape": "Tags" - }, - "provisionStatus": { - "shape": "ProvisionStatus", - "internalonly": true - }, - "domainVersion": { - "shape": "DomainVersion" - }, - "domainServiceRole": { - "shape": "RoleArn", - "deprecated": true, - "internalonly": true - }, - "serviceRole": { - "shape": "RoleArn" - }, - "supportedDomainVersions": { - "shape": "SupportedDomainVersions", - "internalonly": true - }, - "iamSignIns": { - "shape": "IamSignIns", - "internalonly": true - }, - "preferences": { - "shape": "Preferences", - "internalonly": true - } - } - }, - "DomainUnitId": { - "type": "string", - "max": 256, - "min": 1, - "pattern": "[a-z0-9_\\-]+" - }, - "String": { - "type": "string" - }, - "SingleSignOn": { - "type": "structure", - "members": { - "type": { - "shape": "AuthType" - }, - "userAssignment": { - "shape": "UserAssignment" - }, - "idcInstanceArn": { - "shape": "SingleSignOnIdcInstanceArnString" - }, - "ssoUrl": { - "shape": "String", - "internalonly": true - }, - "idcApplicationArn": { - "shape": "String", - "internalonly": true - } - } - }, - "AuthType": { - "type": "string", - "enum": ["IAM_IDC", "DISABLED", "SAML"] - }, - "UserAssignment": { - "type": "string", - "enum": ["AUTOMATIC", "MANUAL"] - }, - "SingleSignOnIdcInstanceArnString": { - "type": "string", - "pattern": ".*arn:(aws|aws-us-gov|aws-cn|aws-iso|aws-iso-b):sso:::instance/(sso)?ins-[a-zA-Z0-9-.]{16}.*" - }, - "RoleArn": { - "type": "string", - "pattern": "arn:aws[^:]*:iam::\\d{12}:role(/[a-zA-Z0-9+=,.@_-]+)*/[a-zA-Z0-9+=,.@_-]+" - }, - "KmsKeyArn": { - "type": "string", - "max": 1024, - "min": 1, - "pattern": "arn:aws(|-cn|-us-gov):kms:[a-zA-Z0-9-]*:[0-9]{12}:key/[a-zA-Z0-9-]{36}" - }, - "DomainStatus": { - "type": "string", - "enum": ["CREATING", "AVAILABLE", "CREATION_FAILED", "DELETING", "DELETED", "DELETION_FAILED"] - }, - "FailureReasonsList": { - "type": "list", - "member": { - "shape": "FailureReason" - } - }, - "FailureReason": { - "type": "structure", - "members": { - "code": { - "shape": "String" - }, - "message": { - "shape": "String" - } - } - }, - "CreatedAt": { - "type": "timestamp" - }, - "UpdatedAt": { - "type": "timestamp" - }, - "Tags": { - "type": "map", - "key": { - "shape": "TagKey" - }, - "value": { - "shape": "TagValue" - } - }, - "TagKey": { - "type": "string", - "max": 128, - "min": 1, - "pattern": "[\\w \\.:/=+@-]+" - }, - "TagValue": { - "type": "string", - "max": 256, - "min": 0, - "pattern": "[\\w \\.:/=+@-]*" - }, - "ProvisionStatus": { - "type": "string", - "enum": [ - "PROVISIONING", - "PROVISIONING_PROJECT_PROFILES", - "PROVISIONING_MODEL_ASSETS", - "PROVISION_FAILED", - "PROVISION_COMPLETE" - ] - }, - "DomainVersion": { - "type": "string", - "enum": ["V1", "V2"] - }, - "SupportedDomainVersions": { - "type": "list", - "member": { - "shape": "DomainVersion" - } - }, - "IamSignIns": { - "type": "list", - "member": { - "shape": "IamSignIn" - }, - "internalonly": true - }, - "IamSignIn": { - "type": "string", - "enum": ["IAM_ROLE", "IAM_USER"], - "internalonly": true - }, - "Preferences": { - "type": "map", - "key": { - "shape": "PreferenceKey" - }, - "value": { - "shape": "PreferenceValue" - }, - "max": 10, - "min": 0 - }, - "PreferenceKey": { - "type": "string", - "max": 128, - "min": 1, - "pattern": "[\\w \\.:/=+@-]+" - }, - "PreferenceValue": { - "type": "string", - "max": 256, - "min": 0, - "pattern": "[\\w \\.:/=+@-]*" - }, - "InternalServerException": { - "type": "structure", - "required": ["message"], - "members": { - "message": { - "shape": "ErrorMessage" - } - }, - "error": { - "httpStatusCode": 500 - }, - "exception": true, - "fault": true, - "retryable": { - "throttling": false - } - }, - "ErrorMessage": { - "type": "string" - }, - "ResourceNotFoundException": { - "type": "structure", - "required": ["message"], - "members": { - "message": { - "shape": "ErrorMessage" - } - }, - "error": { - "httpStatusCode": 404, - "senderFault": true - }, - "exception": true - }, - "AccessDeniedException": { - "type": "structure", - "required": ["message"], - "members": { - "message": { - "shape": "ErrorMessage" - } - }, - "error": { - "httpStatusCode": 403, - "senderFault": true - }, - "exception": true - }, - "ThrottlingException": { - "type": "structure", - "required": ["message"], - "members": { - "message": { - "shape": "ErrorMessage" - } - }, - "error": { - "httpStatusCode": 429, - "senderFault": true - }, - "exception": true, - "retryable": { - "throttling": false - } - }, - "ServiceQuotaExceededException": { - "type": "structure", - "required": ["message"], - "members": { - "message": { - "shape": "ErrorMessage" - } - }, - "error": { - "httpStatusCode": 402, - "senderFault": true - }, - "exception": true - }, - "ValidationException": { - "type": "structure", - "required": ["message"], - "members": { - "message": { - "shape": "ErrorMessage" - } - }, - "error": { - "httpStatusCode": 400, - "senderFault": true - }, - "exception": true - }, - "UnauthorizedException": { - "type": "structure", - "required": ["message"], - "members": { - "message": { - "shape": "ErrorMessage" - } - }, - "error": { - "httpStatusCode": 401, - "senderFault": true - }, - "exception": true - }, - "ListDomainsInput": { - "type": "structure", - "members": { - "status": { - "shape": "DomainStatus", - "location": "querystring", - "locationName": "status" - }, - "maxResults": { - "shape": "MaxResultsForListDomains", - "location": "querystring", - "locationName": "maxResults" - }, - "nextToken": { - "shape": "PaginationToken", - "location": "querystring", - "locationName": "nextToken" - } - } - }, - "MaxResultsForListDomains": { - "type": "integer", - "box": true, - "max": 25, - "min": 1 - }, - "PaginationToken": { - "type": "string", - "max": 8192, - "min": 1 - }, - "ListDomainsOutput": { - "type": "structure", - "required": ["items"], - "members": { - "items": { - "shape": "DomainSummaries" - }, - "domains": { - "shape": "DomainSummaries", - "internalonly": true - }, - "nextToken": { - "shape": "PaginationToken" - } - } - }, - "DomainSummaries": { - "type": "list", - "member": { - "shape": "DomainSummary" - } - }, - "DomainSummary": { - "type": "structure", - "required": ["id", "name", "arn", "managedAccountId", "status", "createdAt"], - "members": { - "id": { - "shape": "DomainId" - }, - "name": { - "shape": "DomainName" - }, - "description": { - "shape": "DomainDescription" - }, - "arn": { - "shape": "String" - }, - "managedAccountId": { - "shape": "String" - }, - "status": { - "shape": "DomainStatus" - }, - "portalUrl": { - "shape": "String" - }, - "createdAt": { - "shape": "CreatedAt" - }, - "lastUpdatedAt": { - "shape": "UpdatedAt" - }, - "domainVersion": { - "shape": "DomainVersion" - }, - "iamSignIns": { - "shape": "IamSignIns", - "internalonly": true - }, - "preferences": { - "shape": "Preferences", - "internalonly": true - } - } - }, - "DomainName": { - "type": "string", - "sensitive": true - }, - "DomainDescription": { - "type": "string", - "sensitive": true - }, - "ConflictException": { - "type": "structure", - "required": ["message"], - "members": { - "message": { - "shape": "ErrorMessage" - }, - "reason": { - "shape": "ConflictReason" - }, - "details": { - "shape": "ConflictDetails" - } - }, - "error": { - "httpStatusCode": 409, - "senderFault": true - }, - "exception": true - }, - "ConflictReason": { - "type": "string", - "enum": ["RESOURCE_LOCKED"] - }, - "ConflictDetails": { - "type": "structure", - "members": { - "lock": { - "shape": "LockDetails" - } - }, - "union": true - }, - "LockDetails": { - "type": "structure", - "required": ["lockedBy", "lockedAt", "lockExpiresAt"], - "members": { - "lockedBy": { - "shape": "String" - }, - "lockedAt": { - "shape": "Timestamp" - }, - "lockExpiresAt": { - "shape": "Timestamp" - } - } - }, - "Timestamp": { - "type": "timestamp" - }, - "SearchGroupProfilesInput": { - "type": "structure", - "required": ["domainIdentifier", "groupType"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "groupType": { - "shape": "GroupSearchType" - }, - "searchText": { - "shape": "GroupSearchText" - }, - "maxResults": { - "shape": "MaxResults" - }, - "nextToken": { - "shape": "PaginationToken" - } - } - }, - "GroupSearchType": { - "type": "string", - "enum": ["SSO_GROUP", "DATAZONE_SSO_GROUP", "IAM_ROLE_SESSION_GROUP"] - }, - "GroupSearchText": { - "type": "string", - "max": 1024, - "min": 0, - "sensitive": true - }, - "MaxResults": { - "type": "integer", - "box": true, - "max": 50, - "min": 1 - }, - "SearchGroupProfilesOutput": { - "type": "structure", - "members": { - "items": { - "shape": "GroupProfileSummaries" - }, - "nextToken": { - "shape": "PaginationToken" - } - } - }, - "GroupProfileSummaries": { - "type": "list", - "member": { - "shape": "GroupProfileSummary" - } - }, - "GroupProfileSummary": { - "type": "structure", - "members": { - "domainId": { - "shape": "DomainId" - }, - "id": { - "shape": "GroupProfileId" - }, - "status": { - "shape": "GroupProfileStatus" - }, - "groupName": { - "shape": "GroupProfileName" - }, - "rolePrincipalArn": { - "shape": "String", - "internalonly": true - }, - "rolePrincipalId": { - "shape": "String", - "internalonly": true - } - } - }, - "GroupProfileId": { - "type": "string", - "pattern": "([0-9a-f]{10}-|)[A-Fa-f0-9]{8}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{12}" - }, - "GroupProfileStatus": { - "type": "string", - "enum": ["ASSIGNED", "NOT_ASSIGNED"] - }, - "GroupProfileName": { - "type": "string", - "max": 1024, - "min": 1, - "pattern": "[a-zA-Z_0-9+=,.@-]+", - "sensitive": true - }, - "SearchUserProfilesInput": { - "type": "structure", - "required": ["domainIdentifier", "userType"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "userType": { - "shape": "UserSearchType" - }, - "searchText": { - "shape": "UserSearchText" - }, - "maxResults": { - "shape": "MaxResults" - }, - "nextToken": { - "shape": "PaginationToken" - } - } - }, - "UserSearchType": { - "type": "string", - "enum": ["SSO_USER", "DATAZONE_USER", "DATAZONE_SSO_USER", "DATAZONE_IAM_USER"] - }, - "UserSearchText": { - "type": "string", - "max": 1024, - "min": 0, - "sensitive": true - }, - "SearchUserProfilesOutput": { - "type": "structure", - "members": { - "items": { - "shape": "UserProfileSummaries" - }, - "nextToken": { - "shape": "PaginationToken" - } - } - }, - "UserProfileSummaries": { - "type": "list", - "member": { - "shape": "UserProfileSummary" - } - }, - "UserProfileSummary": { - "type": "structure", - "members": { - "domainId": { - "shape": "DomainId" - }, - "id": { - "shape": "UserProfileId" - }, - "type": { - "shape": "UserProfileType" - }, - "status": { - "shape": "UserProfileStatus" - }, - "details": { - "shape": "UserProfileDetails" - } - } - }, - "UserProfileId": { - "type": "string", - "pattern": "([0-9a-f]{10}-|)[A-Fa-f0-9]{8}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{12}" - }, - "UserProfileType": { - "type": "string", - "enum": ["IAM", "SSO", "SAML"] - }, - "UserProfileStatus": { - "type": "string", - "enum": ["ASSIGNED", "NOT_ASSIGNED", "ACTIVATED", "DEACTIVATED", "ARCHIVED"] - }, - "UserProfileDetails": { - "type": "structure", - "members": { - "iam": { - "shape": "IamUserProfileDetails" - }, - "sso": { - "shape": "SsoUserProfileDetails" - } - }, - "union": true - }, - "IamUserProfileDetails": { - "type": "structure", - "members": { - "arn": { - "shape": "String" - }, - "principalId": { - "shape": "String" - } - } - }, - "SsoUserProfileDetails": { - "type": "structure", - "members": { - "username": { - "shape": "UserProfileName" - }, - "firstName": { - "shape": "FirstName" - }, - "lastName": { - "shape": "LastName" - }, - "email": { - "shape": "String", - "internalonly": true - }, - "userId": { - "shape": "String", - "internalonly": true - } - } - }, - "UserProfileName": { - "type": "string", - "max": 1024, - "min": 1, - "pattern": "[a-zA-Z_0-9+=,.@-]+", - "sensitive": true - }, - "FirstName": { - "type": "string", - "sensitive": true - }, - "LastName": { - "type": "string", - "sensitive": true - } - } -} diff --git a/packages/core/src/test/sagemakerunifiedstudio/shared/client/datazoneCustomClientHelper.test.ts b/packages/core/src/test/sagemakerunifiedstudio/shared/client/datazoneCustomClientHelper.test.ts index 59dfd0c7d97..4cb806f104c 100644 --- a/packages/core/src/test/sagemakerunifiedstudio/shared/client/datazoneCustomClientHelper.test.ts +++ b/packages/core/src/test/sagemakerunifiedstudio/shared/client/datazoneCustomClientHelper.test.ts @@ -6,9 +6,15 @@ import * as assert from 'assert' import * as sinon from 'sinon' import { DataZoneCustomClientHelper } from '../../../../sagemakerunifiedstudio/shared/client/datazoneCustomClientHelper' -import * as DataZoneCustomClient from '../../../../sagemakerunifiedstudio/shared/client/datazonecustomclient' +import { + DomainSummary, + ListDomainsCommand, + GetDomainCommand, + SearchGroupProfilesCommand, + SearchUserProfilesCommand, +} from '@amzn/datazone-custom-client' -type DataZoneDomain = DataZoneCustomClient.Types.DomainSummary +type DataZoneDomain = DomainSummary describe('DataZoneCustomClientHelper', () => { let client: DataZoneCustomClientHelper @@ -103,9 +109,7 @@ describe('DataZoneCustomClientHelper', () => { } const mockDataZoneClient = { - listDomains: sinon.stub().returns({ - promise: () => Promise.resolve(mockResponse), - }), + send: sinon.stub().withArgs(sinon.match.instanceOf(ListDomainsCommand)).resolves(mockResponse), } sinon.stub(client as any, 'getDataZoneCustomClient').resolves(mockDataZoneClient) @@ -124,6 +128,12 @@ describe('DataZoneCustomClientHelper', () => { assert.strictEqual(result.nextToken, 'next-token') assert.ok(result.domains[0].createdAt instanceof Date) assert.ok(result.domains[0].lastUpdatedAt instanceof Date) + + // Verify API was called with correct command type and parameters + assert.ok(mockDataZoneClient.send.calledOnce) + const command = mockDataZoneClient.send.firstCall.args[0] + assert.strictEqual(command.input.maxResults, 10) + assert.strictEqual(command.input.status, 'AVAILABLE') }) it('should handle empty results', async () => { @@ -133,9 +143,7 @@ describe('DataZoneCustomClientHelper', () => { } const mockDataZoneClient = { - listDomains: sinon.stub().returns({ - promise: () => Promise.resolve(mockResponse), - }), + send: sinon.stub().withArgs(sinon.match.instanceOf(ListDomainsCommand)).resolves(mockResponse), } sinon.stub(client as any, 'getDataZoneCustomClient').resolves(mockDataZoneClient) @@ -369,9 +377,7 @@ describe('DataZoneCustomClientHelper', () => { preferences: { DOMAIN_MODE: 'EXPRESS' }, } const mockDataZoneClient = { - getDomain: sinon.stub().returns({ - promise: () => Promise.resolve(mockResponse), - }), + send: sinon.stub().withArgs(sinon.match.instanceOf(GetDomainCommand)).resolves(mockResponse), } sinon.stub(client as any, 'getDataZoneCustomClient').resolves(mockDataZoneClient) @@ -387,11 +393,10 @@ describe('DataZoneCustomClientHelper', () => { assert.strictEqual(result.domainVersion, '1.0') assert.deepStrictEqual(result.preferences, { DOMAIN_MODE: 'EXPRESS' }) - // Verify the API was called with correct parameters - assert.ok(mockDataZoneClient.getDomain.calledOnce) - assert.deepStrictEqual(mockDataZoneClient.getDomain.firstCall.args[0], { - identifier: mockDomainId, - }) + // Verify the API was called with correct command type and parameters + assert.ok(mockDataZoneClient.send.calledOnce) + const command = mockDataZoneClient.send.firstCall.args[0] + assert.strictEqual(command.input.identifier, mockDomainId) }) it('should handle API errors when getting domain', async () => { @@ -399,9 +404,7 @@ describe('DataZoneCustomClientHelper', () => { const error = new Error('Domain not found') const mockDataZoneClient = { - getDomain: sinon.stub().returns({ - promise: () => Promise.reject(error), - }), + send: sinon.stub().withArgs(sinon.match.instanceOf(GetDomainCommand)).rejects(error), } sinon.stub(client as any, 'getDataZoneCustomClient').resolves(mockDataZoneClient) @@ -409,10 +412,9 @@ describe('DataZoneCustomClientHelper', () => { await assert.rejects(() => client.getDomain(mockDomainId), error) // Verify the API was called with correct parameters - assert.ok(mockDataZoneClient.getDomain.calledOnce) - assert.deepStrictEqual(mockDataZoneClient.getDomain.firstCall.args[0], { - identifier: mockDomainId, - }) + assert.ok(mockDataZoneClient.send.calledOnce) + const command = mockDataZoneClient.send.firstCall.args[0] + assert.strictEqual(command.input.identifier, mockDomainId) }) }) @@ -425,7 +427,7 @@ describe('DataZoneCustomClientHelper', () => { { domainId: mockDomainId, id: 'gp_profile1', - status: 'ACTIVATED', + status: 'ASSIGNED', groupName: 'AdminGroup', rolePrincipalArn: 'arn:aws:iam::123456789012:role/AdminRole', rolePrincipalId: 'AIDAI123456789EXAMPLE', @@ -433,7 +435,7 @@ describe('DataZoneCustomClientHelper', () => { { domainId: mockDomainId, id: 'gp_profile2', - status: 'ACTIVATED', + status: 'ASSIGNED', groupName: 'DeveloperGroup', rolePrincipalArn: 'arn:aws:iam::123456789012:role/DeveloperRole', rolePrincipalId: 'AIDAI987654321EXAMPLE', @@ -443,9 +445,7 @@ describe('DataZoneCustomClientHelper', () => { } const mockDataZoneClient = { - searchGroupProfiles: sinon.stub().returns({ - promise: () => Promise.resolve(mockResponse), - }), + send: sinon.stub().withArgs(sinon.match.instanceOf(SearchGroupProfilesCommand)).resolves(mockResponse), } sinon.stub(client as any, 'getDataZoneCustomClient').resolves(mockDataZoneClient) @@ -461,12 +461,12 @@ describe('DataZoneCustomClientHelper', () => { assert.strictEqual(result.items[1].id, 'gp_profile2') assert.strictEqual(result.nextToken, 'next-token') - // Verify API was called with correct parameters - assert.ok(mockDataZoneClient.searchGroupProfiles.calledOnce) - const callArgs = mockDataZoneClient.searchGroupProfiles.firstCall.args[0] - assert.strictEqual(callArgs.domainIdentifier, mockDomainId) - assert.strictEqual(callArgs.groupType, 'IAM_ROLE_SESSION_GROUP') - assert.strictEqual(callArgs.maxResults, 50) + // Verify API was called with correct command type and parameters + assert.ok(mockDataZoneClient.send.calledOnce) + const command = mockDataZoneClient.send.firstCall.args[0] + assert.strictEqual(command.input.domainIdentifier, mockDomainId) + assert.strictEqual(command.input.groupType, 'IAM_ROLE_SESSION_GROUP') + assert.strictEqual(command.input.maxResults, 50) }) it('should handle empty results', async () => { @@ -476,9 +476,7 @@ describe('DataZoneCustomClientHelper', () => { } const mockDataZoneClient = { - searchGroupProfiles: sinon.stub().returns({ - promise: () => Promise.resolve(mockResponse), - }), + send: sinon.stub().withArgs(sinon.match.instanceOf(SearchGroupProfilesCommand)).resolves(mockResponse), } sinon.stub(client as any, 'getDataZoneCustomClient').resolves(mockDataZoneClient) @@ -492,9 +490,7 @@ describe('DataZoneCustomClientHelper', () => { it('should handle API errors', async () => { const error = new Error('API Error') const mockDataZoneClient = { - searchGroupProfiles: sinon.stub().returns({ - promise: () => Promise.reject(error), - }), + send: sinon.stub().withArgs(sinon.match.instanceOf(SearchGroupProfilesCommand)).rejects(error), } sinon.stub(client as any, 'getDataZoneCustomClient').resolves(mockDataZoneClient) @@ -508,7 +504,7 @@ describe('DataZoneCustomClientHelper', () => { { domainId: mockDomainId, id: 'gp_profile3', - status: 'ACTIVATED', + status: 'ASSIGNED', groupName: 'TestGroup', rolePrincipalArn: 'arn:aws:iam::123456789012:role/TestRole', rolePrincipalId: 'AIDAI111111111EXAMPLE', @@ -518,9 +514,7 @@ describe('DataZoneCustomClientHelper', () => { } const mockDataZoneClient = { - searchGroupProfiles: sinon.stub().returns({ - promise: () => Promise.resolve(mockResponse), - }), + send: sinon.stub().withArgs(sinon.match.instanceOf(SearchGroupProfilesCommand)).resolves(mockResponse), } sinon.stub(client as any, 'getDataZoneCustomClient').resolves(mockDataZoneClient) @@ -532,9 +526,11 @@ describe('DataZoneCustomClientHelper', () => { assert.strictEqual(result.items.length, 1) assert.strictEqual(result.nextToken, undefined) - // Verify nextToken was passed - const callArgs = mockDataZoneClient.searchGroupProfiles.firstCall.args[0] - assert.strictEqual(callArgs.nextToken, 'previous-token') + // Verify send was called with correct command type and parameters + assert.ok(mockDataZoneClient.send.calledOnce) + const command = mockDataZoneClient.send.firstCall.args[0] + assert.strictEqual(command.input.domainIdentifier, mockDomainId) + assert.strictEqual(command.input.nextToken, 'previous-token') }) }) @@ -573,9 +569,7 @@ describe('DataZoneCustomClientHelper', () => { } const mockDataZoneClient = { - searchUserProfiles: sinon.stub().returns({ - promise: () => Promise.resolve(mockResponse), - }), + send: sinon.stub().withArgs(sinon.match.instanceOf(SearchUserProfilesCommand)).resolves(mockResponse), } sinon.stub(client as any, 'getDataZoneCustomClient').resolves(mockDataZoneClient) @@ -591,12 +585,12 @@ describe('DataZoneCustomClientHelper', () => { assert.strictEqual(result.items[1].id, 'up_user2') assert.strictEqual(result.nextToken, 'next-token') - // Verify API was called with correct parameters - assert.ok(mockDataZoneClient.searchUserProfiles.calledOnce) - const callArgs = mockDataZoneClient.searchUserProfiles.firstCall.args[0] - assert.strictEqual(callArgs.domainIdentifier, mockDomainId) - assert.strictEqual(callArgs.userType, 'DATAZONE_IAM_USER') - assert.strictEqual(callArgs.maxResults, 50) + // Verify API was called with correct command type and parameters + assert.ok(mockDataZoneClient.send.calledOnce) + const command = mockDataZoneClient.send.firstCall.args[0] + assert.strictEqual(command.input.domainIdentifier, mockDomainId) + assert.strictEqual(command.input.userType, 'DATAZONE_IAM_USER') + assert.strictEqual(command.input.maxResults, 50) }) it('should handle SSO user profiles', async () => { @@ -620,9 +614,7 @@ describe('DataZoneCustomClientHelper', () => { } const mockDataZoneClient = { - searchUserProfiles: sinon.stub().returns({ - promise: () => Promise.resolve(mockResponse), - }), + send: sinon.stub().withArgs(sinon.match.instanceOf(SearchUserProfilesCommand)).resolves(mockResponse), } sinon.stub(client as any, 'getDataZoneCustomClient').resolves(mockDataZoneClient) @@ -643,9 +635,7 @@ describe('DataZoneCustomClientHelper', () => { } const mockDataZoneClient = { - searchUserProfiles: sinon.stub().returns({ - promise: () => Promise.resolve(mockResponse), - }), + send: sinon.stub().withArgs(sinon.match.instanceOf(SearchUserProfilesCommand)).resolves(mockResponse), } sinon.stub(client as any, 'getDataZoneCustomClient').resolves(mockDataZoneClient) @@ -661,9 +651,7 @@ describe('DataZoneCustomClientHelper', () => { it('should handle API errors', async () => { const error = new Error('API Error') const mockDataZoneClient = { - searchUserProfiles: sinon.stub().returns({ - promise: () => Promise.reject(error), - }), + send: sinon.stub().withArgs(sinon.match.instanceOf(SearchUserProfilesCommand)).rejects(error), } sinon.stub(client as any, 'getDataZoneCustomClient').resolves(mockDataZoneClient) @@ -689,7 +677,7 @@ describe('DataZoneCustomClientHelper', () => { { id: 'gp_profile1', rolePrincipalArn: mockRoleArn, - status: 'ACTIVATED', + status: 'ASSIGNED', }, ], nextToken: undefined, @@ -710,7 +698,7 @@ describe('DataZoneCustomClientHelper', () => { { id: 'gp_profile1', rolePrincipalArn: 'arn:aws:iam::123456789012:role/OtherRole', - status: 'ACTIVATED', + status: 'ASSIGNED', }, ], nextToken: undefined, @@ -861,10 +849,8 @@ describe('DataZoneCustomClientHelper', () => { items: [ { id: 'up_user1', - status: 'ACTIVATED', - details: { - // No iam field - }, + status: 'ASSIGNED', + details: undefined, }, ], nextToken: undefined, @@ -947,7 +933,7 @@ describe('DataZoneCustomClientHelper', () => { { id: mockGroupProfileId, rolePrincipalArn: mockRoleArn, - status: 'ACTIVATED', + status: 'ASSIGNED', }, ], nextToken: undefined, diff --git a/src.gen/@amzn/datazone-custom-client/3.0.0.tgz b/src.gen/@amzn/datazone-custom-client/3.0.0.tgz new file mode 100644 index 0000000000000000000000000000000000000000..5fd87b8fe4229be94ce747ce7f4608374d981b12 GIT binary patch literal 46241 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 Qe&~PyKQ0P<3ILo40D4d0hX4Qo literal 0 HcmV?d00001 From 78fb3fd59bab150e4e8ed77a302e2e15c6ff62c6 Mon Sep 17 00:00:00 2001 From: Laxman Reddy <141967714+laileni-aws@users.noreply.github.com> Date: Thu, 15 Jan 2026 14:33:31 -0800 Subject: [PATCH 06/51] build(amazonq): merge release candidate version rc-20260115 (#8503) This merges the released changes for rc-20260115 into main. --- - Treat all work as PUBLIC. Private `feature/x` branches will not be squash-merged at release time. - Your code changes must meet the guidelines in [CONTRIBUTING.md](https://github.com/aws/aws-toolkit-vscode/blob/master/CONTRIBUTING.md#guidelines). - License: I confirm that my contribution is made under the terms of the Apache 2.0 license. --------- Co-authored-by: aws-toolkit-automation <> --- package-lock.json | 2 +- packages/toolkit/.changes/3.93.0.json | 10 ++++++++++ .../Bug Fix-94b6c83c-8f06-408f-be4a-be7de59ce0df.json | 4 ---- packages/toolkit/CHANGELOG.md | 4 ++++ packages/toolkit/package.json | 2 +- 5 files changed, 16 insertions(+), 6 deletions(-) create mode 100644 packages/toolkit/.changes/3.93.0.json delete mode 100644 packages/toolkit/.changes/next-release/Bug Fix-94b6c83c-8f06-408f-be4a-be7de59ce0df.json diff --git a/package-lock.json b/package-lock.json index fdd6828d97e..b144b43e595 100644 --- a/package-lock.json +++ b/package-lock.json @@ -47029,7 +47029,7 @@ }, "packages/toolkit": { "name": "aws-toolkit-vscode", - "version": "3.93.0-SNAPSHOT", + "version": "3.94.0-SNAPSHOT", "license": "Apache-2.0", "dependencies": { "aws-core-vscode": "file:../core/" diff --git a/packages/toolkit/.changes/3.93.0.json b/packages/toolkit/.changes/3.93.0.json new file mode 100644 index 00000000000..d656c4afcc5 --- /dev/null +++ b/packages/toolkit/.changes/3.93.0.json @@ -0,0 +1,10 @@ +{ + "date": "2026-01-15", + "version": "3.93.0", + "entries": [ + { + "type": "Bug Fix", + "description": "AWS CLI update process could enter an infinite retry loop when outdated CLI is detected during console login. The Toolkit now attempts the update once and prompts users to manually reload and retry, preventing continuous failed authentication attempts." + } + ] +} \ No newline at end of file diff --git a/packages/toolkit/.changes/next-release/Bug Fix-94b6c83c-8f06-408f-be4a-be7de59ce0df.json b/packages/toolkit/.changes/next-release/Bug Fix-94b6c83c-8f06-408f-be4a-be7de59ce0df.json deleted file mode 100644 index 234c30b749e..00000000000 --- a/packages/toolkit/.changes/next-release/Bug Fix-94b6c83c-8f06-408f-be4a-be7de59ce0df.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "type": "Bug Fix", - "description": "AWS CLI update process could enter an infinite retry loop when outdated CLI is detected during console login. The Toolkit now attempts the update once and prompts users to manually reload and retry, preventing continuous failed authentication attempts." -} diff --git a/packages/toolkit/CHANGELOG.md b/packages/toolkit/CHANGELOG.md index 4fe4a84b838..95ca0e98298 100644 --- a/packages/toolkit/CHANGELOG.md +++ b/packages/toolkit/CHANGELOG.md @@ -1,3 +1,7 @@ +## 3.93.0 2026-01-15 + +- **Bug Fix** AWS CLI update process could enter an infinite retry loop when outdated CLI is detected during console login. The Toolkit now attempts the update once and prompts users to manually reload and retry, preventing continuous failed authentication attempts. + ## 3.92.0 2026-01-08 - Miscellaneous non-user-facing changes diff --git a/packages/toolkit/package.json b/packages/toolkit/package.json index 728d9844ccc..b84194b2e9c 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.93.0-SNAPSHOT", + "version": "3.94.0-SNAPSHOT", "extensionKind": [ "workspace" ], From 1984af18ba34b15a98ffa4ee06d9fddaf1bdceda Mon Sep 17 00:00:00 2001 From: aws-ajangg Date: Thu, 22 Jan 2026 12:33:22 -0800 Subject: [PATCH 07/51] fix(sagemaker): revert presign url changes (#8506) ## Problem - workspace connection is currently failing via presigned url due to change of attributes ## Solution - reverting change and using eks cluster attr for hostname ## Testing - updated unit tests - tested locally with new vsix --- - Treat all work as PUBLIC. Private `feature/x` branches will not be squash-merged at release time. - Your code changes must meet the guidelines in [CONTRIBUTING.md](https://github.com/aws/aws-toolkit-vscode/blob/master/CONTRIBUTING.md#guidelines). - License: I confirm that my contribution is made under the terms of the Apache 2.0 license. --- .../core/src/awsService/sagemaker/commands.ts | 21 ++++++++----------- .../src/awsService/sagemaker/uriHandlers.ts | 4 ++-- .../core/src/shared/clients/kubectlClient.ts | 15 ++----------- 3 files changed, 13 insertions(+), 27 deletions(-) diff --git a/packages/core/src/awsService/sagemaker/commands.ts b/packages/core/src/awsService/sagemaker/commands.ts index dd67ee04804..62c0940c017 100644 --- a/packages/core/src/awsService/sagemaker/commands.ts +++ b/packages/core/src/awsService/sagemaker/commands.ts @@ -100,7 +100,7 @@ export async function deeplinkConnect( appType?: string, workspaceName?: string, namespace?: string, - clusterArn?: string, + eksClusterArn?: string, isSMUS: boolean = false ) { getLogger().debug( @@ -118,11 +118,7 @@ export async function deeplinkConnect( appType: ${appType}, workspaceName: ${workspaceName}, namespace: ${namespace}, - clusterArn: ${clusterArn}` - ) - - getLogger().info( - `sm:deeplinkConnect: domain: ${domain}, appType: ${appType}, workspaceName: ${workspaceName}, namespace: ${namespace}, clusterArn: ${clusterArn}` + eksClusterArn: ${eksClusterArn}` ) if (isRemoteWorkspace()) { @@ -132,8 +128,8 @@ export async function deeplinkConnect( try { let connectionType = 'sm_dl' - if (!domain && clusterArn && workspaceName && namespace) { - const { accountId, region, clusterName } = parseArn(clusterArn) + if (!domain && eksClusterArn && workspaceName && namespace) { + const { accountId, region, clusterName } = parseArn(eksClusterArn) connectionType = 'sm_hp' const proposedSession = `${workspaceName}_${namespace}_${clusterName}_${region}_${accountId}` session = isValidSshHostname(proposedSession) @@ -224,13 +220,14 @@ function createValidSshSession( const components = [ sanitize(workspaceName, 63), // K8s limit sanitize(namespace, 63), // K8s limit - sanitize(clusterName, 63), // HP cluster limit + sanitize(clusterName, 100), // EKS limit sanitize(region, 16), // Longest AWS region limit sanitize(accountId, 12), // Fixed ].filter((c) => c.length > 0) - // Total: 63 + 63 + 63 + 16 + 12 + 4 separators + 3 chars for hostname header = 224 < 253 (max limit) + // Total: 63 + 63 + 100 + 16 + 12 + 4 separators + 3 chars for hostname header = 261 > 253 (max limit) + // If all attributes max out char limit, then accountId will be truncated to the first 4 char. - const session = components.join('_').substring(0, 224) + const session = components.join('_').substring(0, 253) return session } @@ -238,7 +235,7 @@ function createValidSshSession( * Validates if a string meets SSH hostname naming convention */ function isValidSshHostname(label: string): boolean { - return /^[a-z0-9]([a-z0-9.-_]{0,222}[a-z0-9])?$/.test(label) + return /^[a-z0-9]([a-z0-9.-_]{0,251}[a-z0-9])?$/.test(label) } export async function stopSpace( diff --git a/packages/core/src/awsService/sagemaker/uriHandlers.ts b/packages/core/src/awsService/sagemaker/uriHandlers.ts index 6a189698472..411fe5a789c 100644 --- a/packages/core/src/awsService/sagemaker/uriHandlers.ts +++ b/packages/core/src/awsService/sagemaker/uriHandlers.ts @@ -38,7 +38,7 @@ export function register(ctx: ExtContext) { undefined, params.workspaceName, params.namespace, - params.clusterArn + params.eksClusterArn ) }) } @@ -51,7 +51,7 @@ export function register(ctx: ExtContext) { export function parseHyperpodConnectParams(query: SearchParams) { const requiredParams = query.getFromKeysOrThrow('sessionId', 'streamUrl', 'sessionToken', 'cell-number') - const optionalParams = query.getFromKeys('workspaceName', 'namespace', 'clusterArn') + const optionalParams = query.getFromKeys('workspaceName', 'namespace', 'eksClusterArn') return { ...requiredParams, ...optionalParams } } export function parseConnectParams(query: SearchParams) { diff --git a/packages/core/src/shared/clients/kubectlClient.ts b/packages/core/src/shared/clients/kubectlClient.ts index a04f8111faf..e4fe11c6545 100644 --- a/packages/core/src/shared/clients/kubectlClient.ts +++ b/packages/core/src/shared/clients/kubectlClient.ts @@ -35,11 +35,9 @@ export interface HyperpodCluster { export class KubectlClient { private kubeConfig: k8s.KubeConfig private k8sApi: k8s.CustomObjectsApi - private hyperpodCluster: HyperpodCluster public constructor(eksCluster: Cluster, hyperpodCluster: HyperpodCluster) { this.kubeConfig = new k8s.KubeConfig() - this.hyperpodCluster = hyperpodCluster this.loadKubeConfig(eksCluster, hyperpodCluster) this.k8sApi = this.kubeConfig.makeApiClient(k8s.CustomObjectsApi) } @@ -262,18 +260,9 @@ export class KubectlClient { throw new Error('No workspace connection URL returned') } - const url = new URL(presignedUrl) - - // If eksClusterArn exists, remove it and add clusterArn instead - if (url.searchParams.has('eksClusterArn') && this.hyperpodCluster.clusterArn) { - url.searchParams.delete('eksClusterArn') - url.searchParams.set('clusterArn', this.hyperpodCluster.clusterArn) - } - - const modifiedUrl = url.toString() getLogger().info(`Connection Type: ${connectionType}`) - getLogger().info(`Modified Presigned URL: ${modifiedUrl}`) - return { type: connectionType || 'vscode-remote', url: modifiedUrl } + getLogger().info(`Presigned URL: ${presignedUrl}`) + return { type: connectionType || 'vscode-remote', url: presignedUrl } } catch (error) { getLogger().error(`[Hyperpod] Failed to create workspace connection: ${error}`) throw new Error( From 97997280fdfbd2d0a4bbd0e5dedc76919968744d Mon Sep 17 00:00:00 2001 From: Keen Wilson <40321520+keenwilson@users.noreply.github.com> Date: Thu, 22 Jan 2026 12:35:02 -0800 Subject: [PATCH 08/51] fix(auth): prompt window reload for stale console session credentials (#8514) ## Problem Console session credentials fail to work properly in two scenarios: 1. After token refresh or profile overwrite: Users encounter "Your session has expired" errors even after successfully running aws login, requiring manual VS Code restart without clear guidance (reported in #8488) 2. Immediate connection use after CLI login: When users try to use a connection immediately after aws login completes, the credential provider was created before the CLI wrote the new login session to disk, causing authentication failures ## Solution - Enhanced makeConsoleSessionCredentialsProvider() to detect stale credential scenarios and prompt for window reload final-2-after-succeeds - Added user-friendly messages showing identity ARN after successful login final-1-before-retry - Improved inline documentation explaining AWS CLI vs SDK credential handling differences - Added handling for does not contain login_session error when provider is created too early - Removed try-catch wrapper when verifying that connection exists after CLI succeeds ## Tradeoffs Reloading the VS Code window is a heavier UX, but it is the only deterministic way to fully reinitialize credential providers and avoid using stale credentials. Reloading guarantees that all in0memory credential providers, Auth state, and AWS SDK clients are fully reinitialized. This avoids subtle, hard-to-debug states where credentials appear refreshed on disk but stale credentials are still used at runtime. The reload is user-initiated via confirmation, not automatic. For future direction, this needs a supported Auth/provider reset mechanism to refresh credentials without requiring a window reload. ## Testing 1. Run `npm run compile` to verify build. 2. Run `npm run package`. Manual verification of end-to-end flow - Verified token refresh flow prompts for reload and works after reload - Tested immediate connection use after aws login triggers appropriate reload prompt - Confirmed profile overwrite scenarios handle credential refresh correctly --- - Treat all work as PUBLIC. Private `feature/x` branches will not be squash-merged at release time. - Your code changes must meet the guidelines in [CONTRIBUTING.md](https://github.com/aws/aws-toolkit-vscode/blob/master/CONTRIBUTING.md#guidelines). - License: I confirm that my contribution is made under the terms of the Apache 2.0 license. --- packages/core/src/auth/consoleSessionUtils.ts | 73 +++------ .../providers/sharedCredentialsProvider.ts | 151 ++++++++++++------ .../webview/vue/toolkit/backend_toolkit.ts | 9 ++ .../sharedCredentialsProvider.test.ts | 122 +++++++++++++- ...-d54f0a97-febc-4b81-8956-0e0f3d9936a3.json | 4 + 5 files changed, 258 insertions(+), 101 deletions(-) create mode 100644 packages/toolkit/.changes/next-release/Bug Fix-d54f0a97-febc-4b81-8956-0e0f3d9936a3.json diff --git a/packages/core/src/auth/consoleSessionUtils.ts b/packages/core/src/auth/consoleSessionUtils.ts index fcda5de6a12..e05396de6a8 100644 --- a/packages/core/src/auth/consoleSessionUtils.ts +++ b/packages/core/src/auth/consoleSessionUtils.ts @@ -217,14 +217,6 @@ export async function authenticateWithConsoleLogin(profileName?: string, region? if (result.exitCode === 0) { telemetry.aws_consoleLoginCLISuccess.emit({ result: 'Succeeded' }) - // Show generic success message - void vscode.window.showInformationMessage( - localize( - 'AWS.message.success.consoleLogin', - 'Login with console credentials command completed. Profile "{0}" is now available.', - profileName - ) - ) logger.info('Login with console credentials command completed. Exit code: %d', result.exitCode) } else if (result.exitCode === 254) { logger.error( @@ -291,49 +283,36 @@ export async function authenticateWithConsoleLogin(profileName?: string, region? code: 'ConsoleLoginConfigError', }) } + // Show success message after seeing newly created session in the disk + void vscode.window.showInformationMessage( + `Profile "${profileName}" ready with credentials from ${profile.login_session} console session` + ) - // Activate the newly created profile - try { - logger.info(`Activating profile: ${profileName}`) - // Connection ID format is "profile:profileName" - const credentialsId: CredentialsId = { - credentialSource: 'profile', - credentialTypeId: profileName, - } - const connectionId = asString(credentialsId) - // Invalidate cached credentials to force fresh fetch - getLogger().info(`Invalidated cached credentials for ${connectionId}`) - globals.loginManager.store.invalidateCredentials(credentialsId) - logger.info(`Looking for connection with ID: ${connectionId}`) - - const connection = await Auth.instance.getConnection({ id: connectionId }) - if (connection === undefined) { - // Log available connections for debugging - const availableConnections = await Auth.instance.listConnections() - logger.error( - 'Connection not found. Available connections: %O', - availableConnections.map((c) => c.id) - ) - throw new ToolkitError(`Failed to get connection from profile: ${connectionId}`, { - code: 'MissingConnection', - }) - } + logger.info(`Activating profile: ${profileName}`) + const credentialsId: CredentialsId = { + credentialSource: 'profile', + credentialTypeId: profileName, + } + const connectionId = asString(credentialsId) + // Invalidate cached credentials to force fresh fetch + getLogger().info(`Invalidated cached credentials for ${connectionId}`) + globals.loginManager.store.invalidateCredentials(credentialsId) + logger.info(`Looking for connection with ID: ${connectionId}`) - // Don't call useConnection() - let credentials be fetched naturally when needed - await Auth.instance.updateConnectionState(connectionId, 'valid') - } catch (error: any) { - logger.error('Failed to activate profile: %O', error) - void vscode.window.showErrorMessage( - localize( - 'AWS.message.error.consoleLogin.profileActivationFailed', - 'Failed to activate profile: {0}', - error instanceof Error ? error.message : String(error) - ) + // Make sure that connection exists before letting other part use connection + const connection = await Auth.instance.getConnection({ id: connectionId }) + if (connection === undefined) { + // Log available connections for debugging + const availableConnections = await Auth.instance.listConnections() + logger.error( + 'Connection not found. Available connections: %O', + availableConnections.map((c) => c.id) ) - throw new ToolkitError('Failed to activate profile', { - code: 'ProfileActivationFailed', - cause: error as Error, + throw new ToolkitError(`Failed to get connection from profile: ${connectionId}`, { + code: 'MissingConnection', }) } + // Don't call useConnection() - let credentials be fetched naturally when needed + await Auth.instance.updateConnectionState(connectionId, 'valid') }) } diff --git a/packages/core/src/auth/providers/sharedCredentialsProvider.ts b/packages/core/src/auth/providers/sharedCredentialsProvider.ts index 19baa7d5dd1..c74eca406d8 100644 --- a/packages/core/src/auth/providers/sharedCredentialsProvider.ts +++ b/packages/core/src/auth/providers/sharedCredentialsProvider.ts @@ -11,6 +11,7 @@ import { ParsedIniData } from '@smithy/types' import { chain } from '@aws-sdk/property-provider' import { fromInstanceMetadata, fromContainerMetadata } from '@smithy/credential-provider-imds' import { fromEnv } from '@aws-sdk/credential-provider-env' +import * as localizedText from '../../shared/localizedText' import { getLogger } from '../../shared/logger/logger' import { getStringHash } from '../../shared/utilities/textUtilities' import { getMfaTokenFromUser, resolveProviderWithCancel } from '../credentials/utils' @@ -59,6 +60,96 @@ function isSsoProfile(profile: Profile): boolean { ) } +export async function handleInvalidConsoleCredentials( + error: Error, + profileName: string, + region: string +): Promise { + getLogger().error('Console login authentication failed for profile %s in region %s: %O', profileName, region, error) + + // Indicates that a VS Code window reload is required to reinitialize credential providers + // and avoid using stale console session credentials when login cache and in-memory state diverge. + let requiresVscodeReloadForCredentials = false + if ( + error.message.includes('Your session has expired') || + error.message.includes('Failed to load a token for session') || + error.message.includes('Failed to load token from') + ) { + requiresVscodeReloadForCredentials = true + // Ask for user confirmation before refreshing + const response = await vscode.window.showInformationMessage( + `Unable to use your console credentials for profile "${profileName}". Would you like to retry?`, + localizedText.retry, + localizedText.cancel + ) + + if (response !== localizedText.retry) { + throw ToolkitError.chain(error, 'User cancelled console credentials token refresh.', { + code: 'LoginSessionRefreshCancelled', + cancelled: true, + }) + } + + getLogger().info('Re-authenticating using console credentials for profile %s', profileName) + // Execute the console login command with the existing profile and region + try { + await vscode.commands.executeCommand('aws.toolkit.auth.consoleLogin', profileName, region) + } catch (_) { + void vscode.window.showErrorMessage( + `Unable to refresh your AWS credentials. Please run 'aws login --profile ${profileName}' in your terminal, then reload VS Code to continue.` + ) + } + } + + if (error.message.includes('does not contain login_session')) { + // The credential provider was created before the CLI wrote the new login session to disk. + // This happens when you run console login and immediately try to use the connection. + // A window reload is needed to pick up the newly created session. + requiresVscodeReloadForCredentials = true + } + + if (requiresVscodeReloadForCredentials) { + getLogger().info( + `Reloading window to sync with updated credentials cache using connection for profile: ${profileName}` + ) + const reloadResponse = await vscode.window.showInformationMessage( + `Credentials for "${profileName}" were updated. A window reload is required to apply them. Save your work before continuing. Reload now?`, + localizedText.yes, + localizedText.no + ) + if (reloadResponse === localizedText.yes) { + // At this point, the console credential cache on disk has been updated (via AWS CLI login), + // but the in-memory credential providers used by the Toolkit / AWS SDK were already + // constructed earlier and continue to reference stale credentials. + // + // Notes on behavior: + // - Console credentials are read once when the provider is created and are not reloaded + // dynamically at runtime. + // - Removing or recreating connections/profiles does not rebuild the underlying provider. + // - Filesystem watchers may detect cache changes, but provider instances still hold + // the originally loaded credentials. + // - Attempting to swap providers at runtime can introduce incompatibilities between + // legacy credential shims and AWS SDK v3 providers. + // + // Authentication flow (simplified): + // aws login (CLI) -> writes ~/.aws/login/cache + // Toolkit -> constructs credential provider (snapshots credentials in memory) + // SDK calls -> continue using in-memory credentials until provider is reinitialized + // + // A VS Code window reload is the only safe and deterministic way to fully reinitialize + // credential providers and ensure the updated console session credentials are used. + await vscode.commands.executeCommand('workbench.action.reloadWindow') + } + throw ToolkitError.chain(error, 'Console credentials require window reload', { + code: 'FromLoginCredentialProviderError', + }) + } + + throw ToolkitError.chain(error, 'Console credentials error', { + code: 'FromLoginCredentialProviderError', + }) +} + /** * Represents one profile from the AWS Shared Credentials files. */ @@ -400,6 +491,10 @@ export class SharedCredentialsProvider implements CredentialsProvider { const baseProvider = fromLoginCredentials({ profile: this.profileName, clientConfig: { + // Console session profiles created by 'aws login' may not have a region property + // The AWS CLI's philosophy is to treat global options like --region as per-invocation overrides + // rather than persistent configuration, minimizing what gets permanently stored in profiles + // and deferring configuration decisions until the actual command execution. region: defaultRegion, }, }) @@ -407,60 +502,10 @@ export class SharedCredentialsProvider implements CredentialsProvider { try { return await baseProvider() } catch (error) { - getLogger().error( - 'Console login authentication failed for profile %s in region %s: %O', - this.profileName, - defaultRegion, - error - ) - - if ( - error instanceof Error && - (error.message.includes('Your session has expired') || - error.message.includes('Failed to load a token for session') || - error.message.includes('Failed to load token from')) - ) { - // Ask for user confirmation before refreshing - const response = await vscode.window.showInformationMessage( - `Unable to use your console credentials for profile "${this.profileName}". Would you like to refresh it?`, - 'Refresh', - 'Cancel' - ) - - if (response !== 'Refresh') { - throw ToolkitError.chain(error, 'User cancelled console credentials token refresh.', { - code: 'LoginSessionRefreshCancelled', - cancelled: true, - }) - } - - getLogger().info('Re-authenticating using console credentials for profile %s', this.profileName) - // Execute the console login command with the existing profile and region - try { - await vscode.commands.executeCommand( - 'aws.toolkit.auth.consoleLogin', - this.profileName, - defaultRegion - ) - } catch (reAuthError) { - throw ToolkitError.chain( - reAuthError, - `Failed to refresh credentials for profile ${this.profileName}. Run 'aws login --profile ${this.profileName}' to authenticate.`, - { code: 'LoginSessionReAuthError' } - ) - } - - getLogger().info( - 'Authentication completed for profile %s, refreshing credentials...', - this.profileName - ) - - // Use the same provider instance but get fresh credentials - return await baseProvider() + if (error instanceof Error) { + await handleInvalidConsoleCredentials(error, this.profileName, defaultRegion) } - throw ToolkitError.chain(error, `Failed to get console credentials`, { - code: 'FromLoginCredentialProviderError', - }) + throw error } } } diff --git a/packages/core/src/login/webview/vue/toolkit/backend_toolkit.ts b/packages/core/src/login/webview/vue/toolkit/backend_toolkit.ts index 10a6c98a3c9..aea498071cb 100644 --- a/packages/core/src/login/webview/vue/toolkit/backend_toolkit.ts +++ b/packages/core/src/login/webview/vue/toolkit/backend_toolkit.ts @@ -21,6 +21,7 @@ import { CodeCatalystAuthenticationProvider } from '../../../../codecatalyst/aut import { AuthError, AuthFlowState } from '../types' import { setContext } from '../../../../shared/vscode/setContext' import { builderIdStartUrl } from '../../../../auth/sso/constants' +import { CredentialsId, asString } from '../../../../auth/providers/credentials' import { RegionProfile } from '../../../../codewhisperer/models/model' import { ProfileSwitchIntent } from '../../../../codewhisperer/region/regionProfileManager' import globals from '../../../../shared/extensionGlobals' @@ -93,6 +94,14 @@ export class ToolkitLoginWebview extends CommonAuthWebview { // Execute AWS CLI login command await vscode.commands.executeCommand('aws.toolkit.auth.consoleLogin', profileName, region) + // Use profile as active connection + const credentialsId: CredentialsId = { + credentialSource: 'profile', + credentialTypeId: profileName, + } + const connectionId = asString(credentialsId) + await Auth.instance.useConnection({ id: connectionId }) + // Hide auth view and show resource explorer await setContext('aws.explorer.showAuthView', false) await this.showResourceExplorer() diff --git a/packages/core/src/test/auth/providers/sharedCredentialsProvider.test.ts b/packages/core/src/test/auth/providers/sharedCredentialsProvider.test.ts index 71abe8f86b2..92a0d58466a 100644 --- a/packages/core/src/test/auth/providers/sharedCredentialsProvider.test.ts +++ b/packages/core/src/test/auth/providers/sharedCredentialsProvider.test.ts @@ -4,13 +4,20 @@ */ import assert from 'assert' -import { SharedCredentialsProvider } from '../../../auth/providers/sharedCredentialsProvider' +import { + SharedCredentialsProvider, + handleInvalidConsoleCredentials, +} from '../../../auth/providers/sharedCredentialsProvider' import { createTestSections } from '../../credentials/testUtil' import { DefaultStsClient } from '../../../shared/clients/stsClient' import { oneDay } from '../../../shared/datetime' import sinon from 'sinon' import { SsoAccessTokenProvider } from '../../../auth/sso/ssoAccessTokenProvider' import { SsoClient } from '../../../auth/sso/clients' +import * as vscode from 'vscode' +import * as localizedText from '../../../shared/localizedText' +import { ToolkitError } from '../../../shared/errors' +import { getTestWindow } from '../../shared/vscode/window' describe('SharedCredentialsProvider - Role Chaining with SSO', function () { let sandbox: sinon.SinonSandbox @@ -212,4 +219,117 @@ describe('SharedCredentialsProvider - Console Session', function () { assert.notStrictEqual(provider.validate(), undefined) assert.strictEqual(await provider.isAvailable(), false) }) + + describe('SharedCredentialsProvider - Console Session - handleInvalidConsoleCredentials', function () { + let sandbox: sinon.SinonSandbox + + beforeEach(function () { + sandbox = sinon.createSandbox() + }) + + afterEach(function () { + sandbox.restore() + }) + + it('throws error with expired session message and user cancels retry', async function () { + const error = new Error('Your session has expired') + getTestWindow().onDidShowMessage((m) => m.selectItem(localizedText.cancel)) + + await assert.rejects( + () => handleInvalidConsoleCredentials(error, 'test-profile', 'us-east-1'), + (err: ToolkitError) => { + assert.strictEqual(err.code, 'LoginSessionRefreshCancelled') + assert.strictEqual(err.cancelled, true) + return true + } + ) + }) + + it('executes console login and prompts reload when user retries expired session', async function () { + const error = new Error('Your session has expired') + let messageCount = 0 + getTestWindow().onDidShowMessage((m) => { + messageCount++ + m.selectItem(messageCount === 1 ? localizedText.retry : localizedText.yes) + }) + const executeCommandStub = sandbox.stub(vscode.commands, 'executeCommand') + + await assert.rejects(() => handleInvalidConsoleCredentials(error, 'test-profile', 'us-east-1')) + + assert.ok(executeCommandStub.calledWith('aws.toolkit.auth.consoleLogin', 'test-profile', 'us-east-1')) + assert.ok(executeCommandStub.calledWith('workbench.action.reloadWindow')) + }) + + it('handles failed token load error and prompts reload', async function () { + const error = new Error('Failed to load a token for session') + let messageCount = 0 + getTestWindow().onDidShowMessage((m) => { + messageCount++ + m.selectItem(messageCount === 1 ? localizedText.retry : localizedText.no) + }) + sandbox.stub(vscode.commands, 'executeCommand') + + await assert.rejects( + () => handleInvalidConsoleCredentials(error, 'test-profile', 'us-east-1'), + (err: ToolkitError) => { + assert.strictEqual(err.code, 'FromLoginCredentialProviderError') + return true + } + ) + }) + + it('handles missing login_session error and prompts reload', async function () { + const error = new Error('does not contain login_session') + getTestWindow().onDidShowMessage((m) => m.selectItem(localizedText.yes)) + const executeCommandStub = sandbox.stub(vscode.commands, 'executeCommand') + + await assert.rejects(() => handleInvalidConsoleCredentials(error, 'test-profile', 'us-east-1')) + + assert.ok(executeCommandStub.calledWith('workbench.action.reloadWindow')) + }) + + it('shows error message when console login command fails', async function () { + const error = new Error('Your session has expired') + getTestWindow().onDidShowMessage((m) => { + if (m.items.length > 0) { + m.selectItem(m.message.includes('retry') ? localizedText.retry : localizedText.yes) + } + }) + const executeCommandStub = sandbox.stub(vscode.commands, 'executeCommand') + executeCommandStub.withArgs('aws.toolkit.auth.consoleLogin').rejects(new Error('Login failed')) + + await assert.rejects(() => handleInvalidConsoleCredentials(error, 'test-profile', 'us-east-1')) + + const errorMessage = getTestWindow().shownMessages.find((m) => m.message.includes('aws login --profile')) + assert.ok(errorMessage) + }) + + it('does not prompt reload for non-session errors', async function () { + const error = new Error('Some other error') + + await assert.rejects( + () => handleInvalidConsoleCredentials(error, 'test-profile', 'us-east-1'), + (err: ToolkitError) => { + assert.strictEqual(err.code, 'FromLoginCredentialProviderError') + return true + } + ) + + assert.strictEqual(getTestWindow().shownMessages.length, 0) + }) + + it('handles Failed to load token from error message', async function () { + const error = new Error('Failed to load token from cache') + let messageCount = 0 + getTestWindow().onDidShowMessage((m) => { + messageCount++ + m.selectItem(messageCount === 1 ? localizedText.retry : localizedText.no) + }) + sandbox.stub(vscode.commands, 'executeCommand') + + await assert.rejects(() => handleInvalidConsoleCredentials(error, 'test-profile', 'us-east-1')) + + assert.strictEqual(messageCount, 2) + }) + }) }) diff --git a/packages/toolkit/.changes/next-release/Bug Fix-d54f0a97-febc-4b81-8956-0e0f3d9936a3.json b/packages/toolkit/.changes/next-release/Bug Fix-d54f0a97-febc-4b81-8956-0e0f3d9936a3.json new file mode 100644 index 00000000000..4742b23eab9 --- /dev/null +++ b/packages/toolkit/.changes/next-release/Bug Fix-d54f0a97-febc-4b81-8956-0e0f3d9936a3.json @@ -0,0 +1,4 @@ +{ + "type": "Bug Fix", + "description": "Console session credentials now prompt for window reload when stale, eliminating manual VS Code restarts after token refresh or profile updates (#8488)" +} From a2849d0adbfd6aedc86e1213b1f34145e1d270af Mon Sep 17 00:00:00 2001 From: Laxman Reddy <141967714+laileni-aws@users.noreply.github.com> Date: Thu, 22 Jan 2026 12:45:14 -0800 Subject: [PATCH 09/51] fix(amazonq): remove /dev amazonq settings (#8510) ## Problem - This setting is no longer used. image ## Solution - Removing /dev amazonq settings --- - Treat all work as PUBLIC. Private `feature/x` branches will not be squash-merged at release time. - Your code changes must meet the guidelines in [CONTRIBUTING.md](https://github.com/aws/aws-toolkit-vscode/blob/master/CONTRIBUTING.md#guidelines). - License: I confirm that my contribution is made under the terms of the Apache 2.0 license. --- packages/amazonq/package.json | 5 ----- packages/core/package.nls.json | 1 - .../src/codewhisperer/util/codewhispererSettings.ts | 13 ------------- packages/core/src/shared/settings-amazonq.gen.ts | 1 - 4 files changed, 20 deletions(-) diff --git a/packages/amazonq/package.json b/packages/amazonq/package.json index 9619a7053db..41967c77ccb 100644 --- a/packages/amazonq/package.json +++ b/packages/amazonq/package.json @@ -148,11 +148,6 @@ "markdownDescription": "%AWS.configuration.description.amazonq%", "default": true }, - "amazonQ.allowFeatureDevelopmentToRunCodeAndTests": { - "markdownDescription": "%AWS.configuration.description.featureDevelopment.allowRunningCodeAndTests%", - "type": "object", - "default": {} - }, "amazonQ.importRecommendationForInlineCodeSuggestions": { "type": "boolean", "description": "%AWS.configuration.description.amazonq.importRecommendation%", diff --git a/packages/core/package.nls.json b/packages/core/package.nls.json index 8c758424fbf..bdddca69ae8 100644 --- a/packages/core/package.nls.json +++ b/packages/core/package.nls.json @@ -20,7 +20,6 @@ "AWS.configuration.description.suppressPrompts": "Prompts which ask for confirmation. Checking an item suppresses the prompt.", "AWS.configuration.enableCodeLenses": "Enable SAM hints in source code and template.yaml files", "AWS.configuration.description.resources.enabledResources": "AWS resources to display in the 'Resources' portion of the explorer.", - "AWS.configuration.description.featureDevelopment.allowRunningCodeAndTests": "Allow /dev to run code and test commands", "AWS.configuration.description.experiments": "Try experimental features and give feedback. Note that experimental features may be removed at any time.\n * `jsonResourceModification` - Enables basic create, update, and delete support for cloud resources via the JSON Resources explorer component.", "AWS.stepFunctions.publishStateMachine.error.invalidYAML": "Cannot publish invalid YAML file", "AWS.stepFunctions.publishStateMachine.info.creating": "Creating state machine '{0}' in {1}...", diff --git a/packages/core/src/codewhisperer/util/codewhispererSettings.ts b/packages/core/src/codewhisperer/util/codewhispererSettings.ts index 80f5d1f2a0d..3233f86c3a1 100644 --- a/packages/core/src/codewhisperer/util/codewhispererSettings.ts +++ b/packages/core/src/codewhisperer/util/codewhispererSettings.ts @@ -16,7 +16,6 @@ const description = { workspaceIndexMaxFileSize: Number, workspaceIndexCacheDirPath: String, workspaceIndexIgnoreFilePatterns: ArrayConstructor(String), - allowFeatureDevelopmentToRunCodeAndTests: Object, ignoredSecurityIssues: ArrayConstructor(String), } @@ -74,18 +73,6 @@ export class CodeWhispererSettings extends fromExtensionManifest('amazonQ', desc return this.get('workspaceIndexIgnoreFilePatterns', []) } - public getAutoBuildSetting(): { [key: string]: boolean } { - return this.get('allowFeatureDevelopmentToRunCodeAndTests', {}) - } - - public async updateAutoBuildSetting(projectName: string, setting: boolean) { - const projects = this.getAutoBuildSetting() - - projects[projectName] = setting - - await this.update('allowFeatureDevelopmentToRunCodeAndTests', projects) - } - public getIgnoredSecurityIssues(): string[] { return this.get('ignoredSecurityIssues', []) } diff --git a/packages/core/src/shared/settings-amazonq.gen.ts b/packages/core/src/shared/settings-amazonq.gen.ts index 2ca8481b55e..10abc54dcb0 100644 --- a/packages/core/src/shared/settings-amazonq.gen.ts +++ b/packages/core/src/shared/settings-amazonq.gen.ts @@ -26,7 +26,6 @@ export const amazonqSettings = { "amazonQSelectDeveloperProfile": {} }, "amazonQ.showCodeWithReferences": {}, - "amazonQ.allowFeatureDevelopmentToRunCodeAndTests": {}, "amazonQ.importRecommendationForInlineCodeSuggestions": {}, "amazonQ.shareContentWithAWS": {}, "amazonQ.workspaceIndex": {}, From 53f02cf6102b08da9b04c1e4523a322f2fa9b2d7 Mon Sep 17 00:00:00 2001 From: invictus <149003065+ashishrp-aws@users.noreply.github.com> Date: Thu, 22 Jan 2026 17:47:20 -0800 Subject: [PATCH 10/51] build(amazonq): merge release candidate version rc-20260122 (#8526) This merges the released changes for rc-20260122 into main. MCM-XXX --- - Treat all work as PUBLIC. Private `feature/x` branches will not be squash-merged at release time. - Your code changes must meet the guidelines in [CONTRIBUTING.md](https://github.com/aws/aws-toolkit-vscode/blob/master/CONTRIBUTING.md#guidelines). - License: I confirm that my contribution is made under the terms of the Apache 2.0 license. --------- Co-authored-by: aws-toolkit-automation <> --- package-lock.json | 4 ++-- packages/amazonq/.changes/1.108.0.json | 5 +++++ packages/amazonq/CHANGELOG.md | 4 ++++ packages/amazonq/package.json | 2 +- packages/toolkit/.changes/3.94.0.json | 10 ++++++++++ .../Bug Fix-d54f0a97-febc-4b81-8956-0e0f3d9936a3.json | 4 ---- packages/toolkit/CHANGELOG.md | 4 ++++ packages/toolkit/package.json | 2 +- 8 files changed, 27 insertions(+), 8 deletions(-) create mode 100644 packages/amazonq/.changes/1.108.0.json create mode 100644 packages/toolkit/.changes/3.94.0.json delete mode 100644 packages/toolkit/.changes/next-release/Bug Fix-d54f0a97-febc-4b81-8956-0e0f3d9936a3.json diff --git a/package-lock.json b/package-lock.json index b144b43e595..f2d88cb38fd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -44733,7 +44733,7 @@ }, "packages/amazonq": { "name": "amazon-q-vscode", - "version": "1.108.0-SNAPSHOT", + "version": "1.109.0-SNAPSHOT", "license": "Apache-2.0", "dependencies": { "aws-core-vscode": "file:../core/" @@ -47029,7 +47029,7 @@ }, "packages/toolkit": { "name": "aws-toolkit-vscode", - "version": "3.94.0-SNAPSHOT", + "version": "3.95.0-SNAPSHOT", "license": "Apache-2.0", "dependencies": { "aws-core-vscode": "file:../core/" diff --git a/packages/amazonq/.changes/1.108.0.json b/packages/amazonq/.changes/1.108.0.json new file mode 100644 index 00000000000..d76f3af4605 --- /dev/null +++ b/packages/amazonq/.changes/1.108.0.json @@ -0,0 +1,5 @@ +{ + "date": "2026-01-23", + "version": "1.108.0", + "entries": [] +} \ No newline at end of file diff --git a/packages/amazonq/CHANGELOG.md b/packages/amazonq/CHANGELOG.md index 4583523540b..0d5a0cdfc65 100644 --- a/packages/amazonq/CHANGELOG.md +++ b/packages/amazonq/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.108.0 2026-01-23 + +- Miscellaneous non-user-facing changes + ## 1.107.0 2026-01-08 - Miscellaneous non-user-facing changes diff --git a/packages/amazonq/package.json b/packages/amazonq/package.json index 41967c77ccb..46d79c04a19 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 software development.", - "version": "1.108.0-SNAPSHOT", + "version": "1.109.0-SNAPSHOT", "extensionKind": [ "workspace" ], diff --git a/packages/toolkit/.changes/3.94.0.json b/packages/toolkit/.changes/3.94.0.json new file mode 100644 index 00000000000..fec7ce9dbb1 --- /dev/null +++ b/packages/toolkit/.changes/3.94.0.json @@ -0,0 +1,10 @@ +{ + "date": "2026-01-23", + "version": "3.94.0", + "entries": [ + { + "type": "Bug Fix", + "description": "Console session credentials now prompt for window reload when stale, eliminating manual VS Code restarts after token refresh or profile updates (#8488)" + } + ] +} \ No newline at end of file diff --git a/packages/toolkit/.changes/next-release/Bug Fix-d54f0a97-febc-4b81-8956-0e0f3d9936a3.json b/packages/toolkit/.changes/next-release/Bug Fix-d54f0a97-febc-4b81-8956-0e0f3d9936a3.json deleted file mode 100644 index 4742b23eab9..00000000000 --- a/packages/toolkit/.changes/next-release/Bug Fix-d54f0a97-febc-4b81-8956-0e0f3d9936a3.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "type": "Bug Fix", - "description": "Console session credentials now prompt for window reload when stale, eliminating manual VS Code restarts after token refresh or profile updates (#8488)" -} diff --git a/packages/toolkit/CHANGELOG.md b/packages/toolkit/CHANGELOG.md index 95ca0e98298..c5471d57869 100644 --- a/packages/toolkit/CHANGELOG.md +++ b/packages/toolkit/CHANGELOG.md @@ -1,3 +1,7 @@ +## 3.94.0 2026-01-23 + +- **Bug Fix** Console session credentials now prompt for window reload when stale, eliminating manual VS Code restarts after token refresh or profile updates (#8488) + ## 3.93.0 2026-01-15 - **Bug Fix** AWS CLI update process could enter an infinite retry loop when outdated CLI is detected during console login. The Toolkit now attempts the update once and prompts users to manually reload and retry, preventing continuous failed authentication attempts. diff --git a/packages/toolkit/package.json b/packages/toolkit/package.json index b84194b2e9c..f3b965dd6b2 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.94.0-SNAPSHOT", + "version": "3.95.0-SNAPSHOT", "extensionKind": [ "workspace" ], From e9cc11ac10a374cc57c60543c54b4e0f81a0f578 Mon Sep 17 00:00:00 2001 From: Keen Wilson <40321520+keenwilson@users.noreply.github.com> Date: Mon, 26 Jan 2026 10:53:31 -0800 Subject: [PATCH 11/51] fix(auth): show actual AWS CLI path in update success message (#8519) ## Problem After updating AWS CLI for console credentials, the success message didn't show users which AWS CLI installation the Toolkit was actually using. This made it unclear whether the update was successful or if multiple CLI installations existed on the system. This is particularly problematic for users who encountered repeated update prompts during console credentials authentication, as they can't verify if the correct CLI version is being used. ## Solution - Added child process execution to run the OS-specific command (which on Unix/macOS, where on Windows) after CLI update - Retrieved the actual AWS CLI path that the Toolkit uses for console credentials - Updated the success message to display: 'AWS CLI updated successfully to "{path}"' This helps users immediately verify the CLI installation location and confirms which CLI binary the Toolkit will use for console login. ### Notes We make a display message clearer that this is about what the Toolkit will be used going forward, not necessarily what the installer was just installed. This helps distinguish between: - What the installer just updated/installed - What the Toolkit will actually use (which could be a different installation if multiple exist) cli-1-detect-need-to-update cli-2-installer-proceeds cli-3-show-path-in-message --- - Treat all work as PUBLIC. Private `feature/x` branches will not be squash-merged at release time. - Your code changes must meet the guidelines in [CONTRIBUTING.md](https://github.com/aws/aws-toolkit-vscode/blob/master/CONTRIBUTING.md#guidelines). - License: I confirm that my contribution is made under the terms of the Apache 2.0 license. --------- Co-authored-by: invictus <149003065+ashishrp-aws@users.noreply.github.com> --- .../src/shared/telemetry/vscodeTelemetry.json | 3 +- .../core/src/shared/utilities/cliUtils.ts | 32 ++++++- .../test/shared/utilities/cliUtils.test.ts | 85 ++++++++++++++++++- ...-b1fd8c29-a44d-46a5-8b88-8dcdc2e4dab3.json | 4 + 4 files changed, 121 insertions(+), 3 deletions(-) create mode 100644 packages/toolkit/.changes/next-release/Bug Fix-b1fd8c29-a44d-46a5-8b88-8dcdc2e4dab3.json diff --git a/packages/core/src/shared/telemetry/vscodeTelemetry.json b/packages/core/src/shared/telemetry/vscodeTelemetry.json index 29aaec12ed1..a54d3ae460f 100644 --- a/packages/core/src/shared/telemetry/vscodeTelemetry.json +++ b/packages/core/src/shared/telemetry/vscodeTelemetry.json @@ -11,7 +11,8 @@ "aws-cli", "sam-cli", "docker", - "finch" + "finch", + "path-resolver" ] }, { diff --git a/packages/core/src/shared/utilities/cliUtils.ts b/packages/core/src/shared/utilities/cliUtils.ts index 67615ef0374..1f785d056f4 100644 --- a/packages/core/src/shared/utilities/cliUtils.ts +++ b/packages/core/src/shared/utilities/cliUtils.ts @@ -55,7 +55,10 @@ interface Cli { exec?: string } -export type AwsClis = Extract +export type AwsClis = Extract< + ToolId, + 'session-manager-plugin' | 'aws-cli' | 'sam-cli' | 'docker' | 'finch' | 'path-resolver' +> /** * CLIs and their full filenames and download paths for their respective OSes @@ -185,6 +188,15 @@ export const awsClis: { [cli in AwsClis]: Cli } = { manualInstallLink: 'https://runfinch.com/docs/getting-started/installation/', exec: 'finch', }, + 'path-resolver': { + command: { + windows: ['where'], + unix: ['which'], + }, + source: {}, // OS utilities used to locate files and executables + name: 'Path resolver', + manualInstallLink: '', + }, } /** @@ -579,6 +591,24 @@ export async function updateAwsCli(): Promise { } const result = await installCli('aws-cli', false) + + // Get the which/ where command, run it to find the AWS CLI path, and display it to the user + const whichCommands = getOsCommands(awsClis['path-resolver']) + if (whichCommands && whichCommands.length > 0) { + const whichCmd = whichCommands[0] + const cliExec = awsClis['aws-cli'].exec + if (cliExec) { + getLogger().info(`Running "${whichCmd} ${cliExec}" to find AWS CLI path`) + const whichResult = await new ChildProcess(whichCmd, [cliExec]).run() + if (whichResult.exitCode === 0 && whichResult.stdout) { + const cliPath = whichResult.stdout.trim().split('\n')[0] + const cliInUseMessage = `Toolkit is using AWS CLI at "${cliPath}".` + getLogger().info(cliInUseMessage) + void vscode.window.showInformationMessage(cliInUseMessage) + } + } + } + return result } diff --git a/packages/core/src/test/shared/utilities/cliUtils.test.ts b/packages/core/src/test/shared/utilities/cliUtils.test.ts index 9fa7270abb1..5bda7de2647 100644 --- a/packages/core/src/test/shared/utilities/cliUtils.test.ts +++ b/packages/core/src/test/shared/utilities/cliUtils.test.ts @@ -5,16 +5,25 @@ import assert from 'assert' import * as path from 'path' -import { installCli } from '../../../shared/utilities/cliUtils' +import sinon from 'sinon' +import { installCli, updateAwsCli } from '../../../shared/utilities/cliUtils' import globals from '../../../shared/extensionGlobals' import { ChildProcess } from '../../../shared/utilities/processUtils' import { SeverityLevel } from '../vscode/message' import { assertTelemetryCurried } from '../../testUtil' import { getTestWindow } from '../../shared/vscode/window' import { fs } from '../../../shared' +import { getOpenExternalStub } from '../../globalSetup.test' describe('cliUtils', async function () { + let sandbox: sinon.SinonSandbox + + beforeEach(function () { + sandbox = sinon.createSandbox() + }) + afterEach(async function () { + sandbox.restore() await fs.delete(path.join(globals.context.globalStorageUri.fsPath, 'tools'), { recursive: true, force: true }) }) @@ -61,4 +70,78 @@ describe('cliUtils', async function () { }) }) }) + + describe('updateAwsCli', function () { + it('cancels when user does not confirm update', async function () { + getTestWindow().onDidShowMessage((m) => m.close()) + + await assert.rejects(() => updateAwsCli(), /cancelled/) + }) + + it('installs CLI and shows path when user confirms', async function () { + let messageCount = 0 + getTestWindow().onDidShowMessage((m) => { + messageCount++ + if (messageCount === 1 && m.items.some((i) => i.title === 'Update')) { + m.selectItem('Update') + } else if (m.message.includes('not supported')) { + // Toolkit shows "Auto install of AWS CLI is not supported on your platform" + // with "Install manually..." button. We close this message to simulate the user dismissing it. + m.close() + } + }) + sandbox.stub(ChildProcess.prototype, 'run').resolves({ + exitCode: 0, + stdout: '/usr/local/bin/aws\n', + stderr: '', + } as any) + + if (process.platform === 'linux') { + await assert.rejects(() => updateAwsCli(), /cancelled/) + } else { + const result = await updateAwsCli() + assert.ok(result) + const messages = getTestWindow().shownMessages + assert.ok(messages.some((m) => m.message.includes('/usr/local/bin/aws'))) + } + }) + + it('opens manual install link when user selects "Install manually" on Linux', async function () { + let messageCount = 0 + const openExternalStub = getOpenExternalStub().resolves(true) + + getTestWindow().onDidShowMessage((m) => { + messageCount++ + if (messageCount === 1 && m.items.some((i) => i.title === 'Update')) { + m.selectItem('Update') + } else if (m.message.includes('not supported')) { + // Linux: no installer source defined, so auto-install shows "not supported" message. + // Simulate user clicking "Install manually..." button + const manualInstallButton = m.items.find((i) => i.title === 'Install manually...') + if (manualInstallButton) { + m.selectItem(manualInstallButton.title) + } + } + }) + + if (process.platform === 'linux') { + await assert.rejects(() => updateAwsCli(), /cancelled/) + + // Verify the manual install link was opened + assert.ok(openExternalStub.calledOnce) + const openedUrl = openExternalStub.firstCall.args.toString() + assert.ok(openedUrl.includes('getting-started-install.html')) + } else { + // Non-Linux platforms should succeed (existing behavior) + sandbox.stub(ChildProcess.prototype, 'run').resolves({ + exitCode: 0, + stdout: '/usr/local/bin/aws', + stderr: '', + } as any) + + const result = await updateAwsCli() + assert.ok(result) + } + }) + }) }) diff --git a/packages/toolkit/.changes/next-release/Bug Fix-b1fd8c29-a44d-46a5-8b88-8dcdc2e4dab3.json b/packages/toolkit/.changes/next-release/Bug Fix-b1fd8c29-a44d-46a5-8b88-8dcdc2e4dab3.json new file mode 100644 index 00000000000..1c61937efa4 --- /dev/null +++ b/packages/toolkit/.changes/next-release/Bug Fix-b1fd8c29-a44d-46a5-8b88-8dcdc2e4dab3.json @@ -0,0 +1,4 @@ +{ + "type": "Bug Fix", + "description": "AWS CLI update success message now shows the actual CLI installation path that the Toolkit uses for console credentials." +} From 8b4d0888ad811ea07ea20814962f67df316175c9 Mon Sep 17 00:00:00 2001 From: kzr Date: Wed, 28 Jan 2026 11:34:20 -0800 Subject: [PATCH 12/51] fix(smus): Look for profile in both config and credentials files when adding region to profile (#8522) ## Problem - If a user picks a profile that does not have region entry from the config file, smus tries to update the profile with selected region. But smus is only looking for the profile in credentials file. ## Solution - Look for profile in both config and credentials files when adding region to profile - Use shared parsing method to handle profiles with `profile` prefix ## Test Updating profile with `profile` prefix in config file before ``` [profile configWithProfilePrefix] AWS_ACCESS_KEY_ID=xyz AWS_SECRET_ACCESS_KEY=xyz AWS_SESSION_TOKEN=xyz ``` after ``` [profile configWithProfilePrefix] AWS_ACCESS_KEY_ID=xyz AWS_SECRET_ACCESS_KEY=xyz AWS_SESSION_TOKEN=xyz region = ap-east-1 ``` --- - Treat all work as PUBLIC. Private `feature/x` branches will not be squash-merged at release time. - Your code changes must meet the guidelines in [CONTRIBUTING.md](https://github.com/aws/aws-toolkit-vscode/blob/master/CONTRIBUTING.md#guidelines). - License: I confirm that my contribution is made under the terms of the Apache 2.0 license. Co-authored-by: kzr-at-amazon Co-authored-by: invictus <149003065+ashishrp-aws@users.noreply.github.com> --- .../auth/ui/iamProfileSelection.ts | 120 +++++++++------- .../auth/ui/iamProfileSelection.test.ts | 136 ++++++++++++++++++ 2 files changed, 208 insertions(+), 48 deletions(-) diff --git a/packages/core/src/sagemakerunifiedstudio/auth/ui/iamProfileSelection.ts b/packages/core/src/sagemakerunifiedstudio/auth/ui/iamProfileSelection.ts index fd61fc70f50..963f67a1127 100644 --- a/packages/core/src/sagemakerunifiedstudio/auth/ui/iamProfileSelection.ts +++ b/packages/core/src/sagemakerunifiedstudio/auth/ui/iamProfileSelection.ts @@ -5,9 +5,10 @@ import * as vscode from 'vscode' import * as path from 'path' +import * as os from 'os' import { getLogger } from '../../../shared/logger/logger' import { ToolkitError } from '../../../shared/errors' -import { loadSharedCredentialsProfiles } from '../../../auth/credentials/sharedCredentials' +import { loadSharedCredentialsProfiles, parseIni } from '../../../auth/credentials/sharedCredentials' import { getCredentialsFilename, getConfigFilename } from '../../../auth/credentials/sharedCredentialsFile' import { SmusErrorCodes, DataZoneServiceId } from '../../shared/smusUtils' import globals from '../../../shared/extensionGlobals' @@ -1189,7 +1190,7 @@ export class SmusIamProfileSelector { } // Parse the file line by line to handle profile replacement properly - const lines = content.split('\n') + const lines = content.split(os.EOL) const newLines: string[] = [] let inTargetProfile = false let profileFound = false @@ -1230,7 +1231,7 @@ export class SmusIamProfileSelector { } // Update content with the new lines - content = newLines.join('\n') + content = newLines.join(os.EOL) // Write back to file await fs.writeFile(credentialsPath, content) @@ -1245,62 +1246,85 @@ export class SmusIamProfileSelector { try { logger.debug(`Updating profile ${profileName} with region ${region}`) - const credentialsPath = getCredentialsFilename() + // Check both config and credential files + const filepathsToCheck = [getCredentialsFilename(), getConfigFilename()] - if (!(await fs.existsFile(credentialsPath))) { - throw new ToolkitError('Credentials file not found', { code: 'CredentialsFileNotFound' }) - } + let profileUpdated = false - // Read the current credentials file - const content = await fs.readFileText(credentialsPath) + for (const filePath of filepathsToCheck) { + // File does not exist, try next file + if (!(await fs.existsFile(filePath))) { + continue + } - // Find the profile section - const profileSectionRegex = new RegExp(`^\\[${profileName}\\]$`, 'm') - const profileMatch = content.match(profileSectionRegex) + const content = await fs.readFileText(filePath) + const sections = parseIni(content, vscode.Uri.file(filePath)) - if (!profileMatch) { - throw new ToolkitError(`Profile ${profileName} not found in credentials file`, { - code: 'ProfileNotFound', - }) - } + // Find the profile section in this file + const profileSection = sections.find( + (section) => section.type === 'profile' && section.name === profileName + ) - // Find the next profile section or end of file - const profileStartIndex = profileMatch.index! - const nextProfileMatch = content.slice(profileStartIndex + 1).match(/^\[.*\]$/m) - const profileEndIndex = nextProfileMatch ? profileStartIndex + 1 + nextProfileMatch.index! : content.length - - // Extract the profile section - const profileSection = content.slice(profileStartIndex, profileEndIndex) - - // Check if region already exists in the profile - let updatedProfileSection: string - - if (this.regionLinePattern.test(profileSection)) { - // Replace existing region - updatedProfileSection = profileSection.replace(this.regionLinePattern, `region = ${region}`) - } else { - // Add region to the profile (before any empty lines at the end) - const lines = profileSection.split('\n') - // Find the last non-empty line index (compatible with older JS versions) - let lastNonEmptyIndex = -1 - for (let i = lines.length - 1; i >= 0; i--) { - if (lines[i].trim() !== '') { - lastNonEmptyIndex = i + // Profile not in this file, try next file + if (!profileSection) { + continue + } + + // Find the profile section boundaries using the startLines from parsed section + const profileStartLine = profileSection.startLines[0] + const lines = content.split(os.EOL) + + // Find the next profile section or end of file + let profileEndLine = lines.length + for (let i = profileStartLine + 1; i < lines.length; i++) { + if (lines[i].match(/^\s*\[([^\[\]]+)]\s*$/)) { + profileEndLine = i break } } - lines.splice(lastNonEmptyIndex + 1, 0, `region = ${region}`) - updatedProfileSection = lines.join('\n') - } - // Replace the profile section in the content - const updatedContent = - content.slice(0, profileStartIndex) + updatedProfileSection + content.slice(profileEndIndex) + // Extract the profile section lines + const profileLines = lines.slice(profileStartLine, profileEndLine) + + // Check if region already exists in the profile + const regionLineIndex = profileLines.findIndex((line) => this.regionLinePattern.test(line)) - // Write back to file - await fs.writeFile(credentialsPath, updatedContent) + if (regionLineIndex !== -1) { + // Replace existing region + profileLines[regionLineIndex] = `region = ${region}` + } else { + // Add region to the profile (after the last non-empty line) + let lastNonEmptyIndex = -1 + for (let i = profileLines.length - 1; i >= 0; i--) { + if (profileLines[i].trim() !== '') { + lastNonEmptyIndex = i + break + } + } + profileLines.splice(lastNonEmptyIndex + 1, 0, `region = ${region}`) + } + + // Reconstruct the file content + const updatedLines = [ + ...lines.slice(0, profileStartLine), + ...profileLines, + ...lines.slice(profileEndLine), + ] + const updatedContent = updatedLines.join(os.EOL) - logger.debug(`Successfully updated profile ${profileName} with region ${region}`) + // Write back to file + await fs.writeFile(filePath, updatedContent) + + logger.debug(`Successfully updated profile ${profileName} with region ${region} in ${filePath}`) + profileUpdated = true + break + } + + if (!profileUpdated) { + throw new ToolkitError(`Profile ${profileName} not found in credentials or config file`, { + code: 'ProfileNotFound', + }) + } } catch (error) { logger.error('Failed to update profile region: %s', error) throw new ToolkitError(`Failed to update profile region: ${(error as Error).message}`, { diff --git a/packages/core/src/test/sagemakerunifiedstudio/auth/ui/iamProfileSelection.test.ts b/packages/core/src/test/sagemakerunifiedstudio/auth/ui/iamProfileSelection.test.ts index 2a56b2baf0c..ffcec8f2249 100644 --- a/packages/core/src/test/sagemakerunifiedstudio/auth/ui/iamProfileSelection.test.ts +++ b/packages/core/src/test/sagemakerunifiedstudio/auth/ui/iamProfileSelection.test.ts @@ -4,7 +4,13 @@ */ import assert from 'assert' +import * as path from 'path' +import * as os from 'os' +import * as sinon from 'sinon' import { SmusIamProfileSelector } from '../../../../sagemakerunifiedstudio/auth/ui/iamProfileSelection' +import { makeTemporaryToolkitFolder } from '../../../../shared/filesystemUtilities' +import { fs } from '../../../../shared' +import { EnvironmentVariables } from '../../../../shared/environmentVariables' describe('SmusIamProfileSelector', function () { describe('showRegionSelection', function () { @@ -18,4 +24,134 @@ describe('SmusIamProfileSelector', function () { assert.strictEqual(typeof SmusIamProfileSelector.showIamProfileSelection, 'function') }) }) + + describe('updateProfileRegion', function () { + let tempFolder: string + let credentialsPath: string + let configPath: string + + beforeEach(async function () { + tempFolder = await makeTemporaryToolkitFolder() + credentialsPath = path.join(tempFolder, 'credentials') + configPath = path.join(tempFolder, 'config') + + // Stub environment variables to use temp files + sinon.stub(process, 'env').value({ + AWS_SHARED_CREDENTIALS_FILE: credentialsPath, + AWS_CONFIG_FILE: configPath, + } as EnvironmentVariables) + }) + + afterEach(async function () { + await fs.delete(tempFolder, { recursive: true }) + sinon.restore() + }) + + it('should update region in credentials file when profile exists there', async function () { + // Create credentials file with a profile without region + const credentialsContent = [ + '[test-profile]', + 'aws_access_key_id = XYZ', + 'aws_secret_access_key = XYZ', + '', + ].join(os.EOL) + await fs.writeFile(credentialsPath, credentialsContent) + + // Call the private method using bracket notation + await (SmusIamProfileSelector as any).updateProfileRegion('test-profile', 'us-west-2') + + // Verify the region was added + const updatedContent = await fs.readFileText(credentialsPath) + assert.ok(updatedContent.includes('region = us-west-2')) + assert.ok(updatedContent.includes('[test-profile]')) + assert.ok(updatedContent.includes('aws_access_key_id = XYZ')) + }) + + it('should update region in config file when profile exists there', async function () { + // Create config file with a profile without region + const configContent = ['[profile test-profile]', 'output = json', ''].join(os.EOL) + await fs.writeFile(configPath, configContent) + + // Call the private method + await (SmusIamProfileSelector as any).updateProfileRegion('test-profile', 'eu-west-1') + + // Verify the region was added + const updatedContent = await fs.readFileText(configPath) + assert.ok(updatedContent.includes('region = eu-west-1')) + assert.ok(updatedContent.includes('[profile test-profile]')) + assert.ok(updatedContent.includes('output = json')) + }) + + it('should handle multiple profiles in credentials file', async function () { + // Create credentials file with multiple profiles + const credentialsContent = [ + '[default]', + 'aws_access_key_id = XYZ', + 'aws_secret_access_key = XYZ', + '', + '[test-profile]', + 'aws_access_key_id = XYZ', + 'aws_secret_access_key = XYZ', + '', + '[another-profile]', + 'aws_access_key_id = XYZ', + 'aws_secret_access_key = XYZ', + '', + ].join(os.EOL) + await fs.writeFile(credentialsPath, credentialsContent) + + // Update the region for test-profile + await (SmusIamProfileSelector as any).updateProfileRegion('test-profile', 'us-west-2') + + // Verify the region was added only to test-profile + const updatedContent = await fs.readFileText(credentialsPath) + const lines = updatedContent.split(os.EOL) + + // Find test-profile section + const testProfileIndex = lines.findIndex((line) => line.includes('[test-profile]')) + const anotherProfileIndex = lines.findIndex((line) => line.includes('[another-profile]')) + + // Check that region is between test-profile and another-profile + const testProfileSection = lines.slice(testProfileIndex, anotherProfileIndex).join(os.EOL) + assert.ok(testProfileSection.includes('region = us-west-2')) + + // Check that other profiles are unchanged + assert.ok(updatedContent.includes('[default]')) + assert.ok(updatedContent.includes('[another-profile]')) + }) + + it('should throw error when profile does not exist in either file', async function () { + // Create both files without the target profile + const credentialsContent = ['[default]', 'aws_access_key_id = XYZ', 'aws_secret_access_key = XYZ'].join( + os.EOL + ) + const configContent = ['[profile default]', 'region = us-east-1'].join(os.EOL) + await fs.writeFile(credentialsPath, credentialsContent) + await fs.writeFile(configPath, configContent) + + // Attempt to update non-existent profile + await assert.rejects( + async () => { + await (SmusIamProfileSelector as any).updateProfileRegion('non-existent-profile', 'us-west-2') + }, + (error: Error) => { + assert.ok(error.message.includes('not found')) + return true + } + ) + }) + + it('should throw error when neither file exists', async function () { + // Attempt to update profile + await assert.rejects( + async () => { + await (SmusIamProfileSelector as any).updateProfileRegion('test-profile', 'us-west-2') + }, + (error: Error) => { + assert.ok(error.message.includes('not found')) + return true + } + ) + }) + }) }) From 5cbfa60a27c63d005b5c7377dddc13c3b5c0a00a Mon Sep 17 00:00:00 2001 From: licjun Date: Wed, 28 Jan 2026 17:13:17 -0800 Subject: [PATCH 13/51] deps(lambda): upgrade sdk lambda client to 3.953.0 (#8531) ## Problem Toolkit is using an older Lambda SDK (3.731, latest 3.9xx) due to compatibility issues. This caused new fields introduced in LMI/DAR to be not available in local types and need to be manually bypassed. see: https://github.com/aws/aws-toolkit-vscode/pull/8392/file, we need to update lambda SDK to latest version and resolve all the compatibility issues Below is the compatibility issue when trying to upgrade sdk lambda client ``` npm error src/shared/clients/lambdaClient.ts(327,9): error TS2741: Property 'config' is missing in type 'AwsClient' but required in type 'LambdaClient'. npm error src/shared/clients/lambdaClient.ts(328,13): error TS2419: Types of construct signatures are incompatible. npm error Type 'new (...[configuration]: [] | [LambdaClientConfig]) => LambdaClient' is not assignable to type 'new (o: AwsClientOptions) => AwsClient'. npm error Construct signature return types 'LambdaClient' and 'AwsClient' are incompatible. npm error The types of 'middlewareStack.add' are incompatible between these types. npm error Type '{ (middleware: InitializeMiddleware, options?: (InitializeHandlerOptions & AbsoluteLocation) | undefined): void; (middleware: SerializeMiddleware<...>, options: SerializeHandlerOptions & AbsoluteLocation): void; (middleware: BuildMiddleware<...>, options: BuildHandlerOptions & ...' is not assignable to type '{ (middleware: InitializeMiddleware, options?: (InitializeHandlerOptions & AbsoluteLocation) | undefined): void; (middleware: SerializeMiddleware<...>, options: SerializeHandlerOptions & AbsoluteLocation): void; (middleware: BuildMiddleware<...>, options: BuildHandlerOptions & AbsoluteLocation):...'. npm error Types of parameters 'middleware' and 'middleware' are incompatible. npm error Types of parameters 'context' and 'context' are incompatible. npm error Type 'import("/Users/ruojiazh/proj/aws-toolkit-vscode/node_modules/@aws-sdk/middleware-host-header/node_modules/@smithy/types/dist-types/middleware").HandlerExecutionContext' is not assignable to type 'import("/Users/ruojiazh/proj/aws-toolkit-vscode/node_modules/@smithy/types/dist-types/middleware").HandlerExecutionContext'. npm error Types of property '[SMITHY_CONTEXT_KEY]' are incompatible. npm error Type '{ [key: string]: unknown; service?: string | undefined; operation?: string | undefined; commandInstance?: import("/Users/ruojiazh/proj/aws-toolkit-vscode/node_modules/@aws-sdk/middleware-host-header/node_modules/@smithy/types/dist-types/command").Command | undefined; selectedHttpAuthScheme?:...' is not assignable to type '{ [key: string]: unknown; service?: string | undefined; operation?: string | undefined; commandInstance?: import("/Users/ruojiazh/proj/aws-toolkit-vscode/node_modules/@smithy/types/dist-types/command").Command | undefined; selectedHttpAuthScheme?: import("/Users/ruojiazh/proj/aws-toolkit-vsc...'. npm error Type '{ [key: string]: unknown; service?: string | undefined; operation?: string | undefined; commandInstance?: import("/Users/ruojiazh/proj/aws-toolkit-vscode/node_modules/@aws-sdk/middleware-host-header/node_modules/@smithy/types/dist-types/command").Command | undefined; selectedHttpAuthScheme?:...' is not assignable to type '{ [key: string]: unknown; service?: string | undefined; operation?: string | undefined; commandInstance?: import("/Users/ruojiazh/proj/aws-toolkit-vscode/node_modules/@smithy/types/dist-types/command").Command | undefined; selectedHttpAuthScheme?: import("/Users/ruojiazh/proj/aws-toolkit-vsc...'. npm error Types of property 'commandInstance' are incompatible. npm error Type 'import("/Users/ruojiazh/proj/aws-toolkit-vscode/node_modules/@aws-sdk/middleware-host-header/node_modules/@smithy/types/dist-types/command").Command | undefined' is not assignable to type 'import("/Users/ruojiazh/proj/aws-toolkit-vscode/node_modules/@smithy/types/dist-types/command").Command | undefined'. npm error Type 'import("/Users/ruojiazh/proj/aws-toolkit-vscode/node_modules/@aws-sdk/middleware-host-header/node_modules/@smithy/types/dist-types/command").Command' is not assignable to type 'import("/Users/ruojiazh/proj/aws-toolkit-vscode/node_modules/@smithy/types/dist-types/command").Command'. npm error The types of 'middlewareStack.add' are incompatible between these types. npm error Type '{ (middleware: import("/Users/ruojiazh/proj/aws-toolkit-vscode/node_modules/@aws-sdk/middleware-host-header/node_modules/@smithy/types/dist-types/middleware").InitializeMiddleware, options?: (import("/Users/ruojiazh/proj/aws-toolkit-vscode/node_modules/@aws-sdk/middleware-host-header/node_modules/@smithy/t...' is not assignable to type '{ (middleware: import("/Users/ruojiazh/proj/aws-toolkit-vscode/node_modules/@smithy/types/dist-types/middleware").InitializeMiddleware, options?: (import("/Users/ruojiazh/proj/aws-toolkit-vscode/node_modules/@smithy/types/dist-types/middleware").InitializeHandlerOptions & import("/Users/ruojiazh/proj/aws-t...'. npm error Types of parameters 'options' and 'options' are incompatible. npm error Type 'SerializeHandlerOptions & AbsoluteLocation' is not assignable to type '(InitializeHandlerOptions & AbsoluteLocation) | undefined'. npm error Type 'SerializeHandlerOptions & AbsoluteLocation' is not assignable to type 'InitializeHandlerOptions & AbsoluteLocation'. npm error Type 'SerializeHandlerOptions & AbsoluteLocation' is not assignable to type 'InitializeHandlerOptions'. npm error Types of property 'step' are incompatible. npm error Type '"serialize"' is not assignable to type '"initialize"'. ``` ## Reason for Compatibility Error Upgrading @aws-sdk/client-lambda to version 3.953.0+ (which uses Smithy v4) causes TypeScript compilation errors due to module path conflicts. The toolkit's awsClientBuilderV3 uses Smithy v3 types, while the new Lambda client uses Smithy v4 types. Even though the types are structurally identical, TypeScript treats them as incompatible because they're imported from different module paths. ## Solution Added type assertions (as any and as LambdaSdkClient) in lambdaClient.ts to bypass TypeScript's type checking when creating the Lambda client. This allows the new SDK version to work while maintaining runtime compatibility. No new tests are required for the lambdaClient.ts changes because there is no behavior change - The type assertions don't change runtime behavior, only bypass compile-time type checking. The Lambda client functions identically before and after. --- - Treat all work as PUBLIC. Private `feature/x` branches will not be squash-merged at release time. - Your code changes must meet the guidelines in [CONTRIBUTING.md](https://github.com/aws/aws-toolkit-vscode/blob/master/CONTRIBUTING.md#guidelines). - License: I confirm that my contribution is made under the terms of the Apache 2.0 license. Co-authored-by: Chengjun Li <> --- package-lock.json | 13584 ++++++++++------ packages/core/package.json | 2 +- .../core/src/shared/clients/lambdaClient.ts | 4 +- 3 files changed, 8581 insertions(+), 5009 deletions(-) diff --git a/package-lock.json b/package-lock.json index f2d88cb38fd..e670e359273 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17514,695 +17514,710 @@ } }, "node_modules/@aws-sdk/client-lambda": { - "version": "3.637.0", + "version": "3.975.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-lambda/-/client-lambda-3.975.0.tgz", + "integrity": "sha512-55+/Ku+fd1HY3TVKep/4GqgiR65p09/Xfgebknx8mqy18lTohO/8VFn7AusoZGOVypfRv3yVuYktCvINBBrkKw==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.637.0", - "@aws-sdk/client-sts": "3.637.0", - "@aws-sdk/core": "3.635.0", - "@aws-sdk/credential-provider-node": "3.637.0", - "@aws-sdk/middleware-host-header": "3.620.0", - "@aws-sdk/middleware-logger": "3.609.0", - "@aws-sdk/middleware-recursion-detection": "3.620.0", - "@aws-sdk/middleware-user-agent": "3.637.0", - "@aws-sdk/region-config-resolver": "3.614.0", - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.637.0", - "@aws-sdk/util-user-agent-browser": "3.609.0", - "@aws-sdk/util-user-agent-node": "3.614.0", - "@smithy/config-resolver": "^3.0.5", - "@smithy/core": "^2.4.0", - "@smithy/eventstream-serde-browser": "^3.0.6", - "@smithy/eventstream-serde-config-resolver": "^3.0.3", - "@smithy/eventstream-serde-node": "^3.0.5", - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/hash-node": "^3.0.3", - "@smithy/invalid-dependency": "^3.0.3", - "@smithy/middleware-content-length": "^3.0.5", - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-retry": "^3.0.15", - "@smithy/middleware-serde": "^3.0.3", - "@smithy/middleware-stack": "^3.0.3", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.2.0", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.15", - "@smithy/util-defaults-mode-node": "^3.0.15", - "@smithy/util-endpoints": "^2.0.5", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-retry": "^3.0.3", - "@smithy/util-stream": "^3.1.3", - "@smithy/util-utf8": "^3.0.0", - "@smithy/util-waiter": "^3.1.2", + "@aws-sdk/core": "^3.973.1", + "@aws-sdk/credential-provider-node": "^3.972.1", + "@aws-sdk/middleware-host-header": "^3.972.1", + "@aws-sdk/middleware-logger": "^3.972.1", + "@aws-sdk/middleware-recursion-detection": "^3.972.1", + "@aws-sdk/middleware-user-agent": "^3.972.2", + "@aws-sdk/region-config-resolver": "^3.972.1", + "@aws-sdk/types": "^3.973.0", + "@aws-sdk/util-endpoints": "3.972.0", + "@aws-sdk/util-user-agent-browser": "^3.972.1", + "@aws-sdk/util-user-agent-node": "^3.972.1", + "@smithy/config-resolver": "^4.4.6", + "@smithy/core": "^3.21.1", + "@smithy/eventstream-serde-browser": "^4.2.8", + "@smithy/eventstream-serde-config-resolver": "^4.3.8", + "@smithy/eventstream-serde-node": "^4.2.8", + "@smithy/fetch-http-handler": "^5.3.9", + "@smithy/hash-node": "^4.2.8", + "@smithy/invalid-dependency": "^4.2.8", + "@smithy/middleware-content-length": "^4.2.8", + "@smithy/middleware-endpoint": "^4.4.11", + "@smithy/middleware-retry": "^4.4.27", + "@smithy/middleware-serde": "^4.2.9", + "@smithy/middleware-stack": "^4.2.8", + "@smithy/node-config-provider": "^4.3.8", + "@smithy/node-http-handler": "^4.4.8", + "@smithy/protocol-http": "^5.3.8", + "@smithy/smithy-client": "^4.10.12", + "@smithy/types": "^4.12.0", + "@smithy/url-parser": "^4.2.8", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-body-length-node": "^4.2.1", + "@smithy/util-defaults-mode-browser": "^4.3.26", + "@smithy/util-defaults-mode-node": "^4.2.29", + "@smithy/util-endpoints": "^3.2.8", + "@smithy/util-middleware": "^4.2.8", + "@smithy/util-retry": "^4.2.8", + "@smithy/util-stream": "^4.5.10", + "@smithy/util-utf8": "^4.2.0", + "@smithy/util-waiter": "^4.2.8", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=20.0.0" } }, "node_modules/@aws-sdk/client-lambda/node_modules/@aws-sdk/types": { - "version": "3.609.0", + "version": "3.973.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.973.1.tgz", + "integrity": "sha512-DwHBiMNOB468JiX6+i34c+THsKHErYUdNQ3HexeXZvVn4zouLjgaS4FejiGSi2HyBuzuyHg7SuOPmjSvoU9NRg==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^3.3.0", + "@smithy/types": "^4.12.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=20.0.0" } }, - "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/fetch-http-handler": { - "version": "3.2.4", + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/abort-controller": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.2.8.tgz", + "integrity": "sha512-peuVfkYHAmS5ybKxWcfraK7WBBP0J+rkfUcbHJJKQ4ir3UAUNQI+Y4Vt/PqSzGqgloJ5O1dk7+WzNL8wcCSXbw==", "license": "Apache-2.0", "dependencies": { - "@smithy/protocol-http": "^4.1.0", - "@smithy/querystring-builder": "^3.0.3", - "@smithy/types": "^3.3.0", - "@smithy/util-base64": "^3.0.0", + "@smithy/types": "^4.12.0", "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/is-array-buffer": { - "version": "3.0.0", + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/config-resolver": { + "version": "4.4.6", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.4.6.tgz", + "integrity": "sha512-qJpzYC64kaj3S0fueiu3kXm8xPrR3PcXDPEgnaNMRn0EjNSZFoFjvbUp0YUDsRhN1CB90EnHJtbxWKevnH99UQ==", "license": "Apache-2.0", "dependencies": { + "@smithy/node-config-provider": "^4.3.8", + "@smithy/types": "^4.12.0", + "@smithy/util-config-provider": "^4.2.0", + "@smithy/util-endpoints": "^3.2.8", + "@smithy/util-middleware": "^4.2.8", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/util-utf8": { - "version": "3.0.0", + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/core": { + "version": "3.21.1", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.21.1.tgz", + "integrity": "sha512-NUH8R4O6FkN8HKMojzbGg/5pNjsfTjlMmeFclyPfPaXXUrbr5TzhWgbf7t92wfrpCHRgpjyz7ffASIS3wX28aA==", "license": "Apache-2.0", "dependencies": { - "@smithy/util-buffer-from": "^3.0.0", + "@smithy/middleware-serde": "^4.2.9", + "@smithy/protocol-http": "^5.3.8", + "@smithy/types": "^4.12.0", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-middleware": "^4.2.8", + "@smithy/util-stream": "^4.5.10", + "@smithy/util-utf8": "^4.2.0", + "@smithy/uuid": "^1.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/util-utf8/node_modules/@smithy/util-buffer-from": { - "version": "3.0.0", + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/credential-provider-imds": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.2.8.tgz", + "integrity": "sha512-FNT0xHS1c/CPN8upqbMFP83+ul5YgdisfCfkZ86Jh2NSmnqw/AJ6x5pEogVCTVvSm7j9MopRU89bmDelxuDMYw==", "license": "Apache-2.0", "dependencies": { - "@smithy/is-array-buffer": "^3.0.0", + "@smithy/node-config-provider": "^4.3.8", + "@smithy/property-provider": "^4.2.8", + "@smithy/types": "^4.12.0", + "@smithy/url-parser": "^4.2.8", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-redshift": { - "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-redshift/-/client-redshift-3.693.0.tgz", - "integrity": "sha512-k+4emXXK7iOOYjTAU+Erj5RVxu68Hi6iI48h5r8iNMhWRUMqUq346tK5qkD4C4x9SzJu5j0WgPWpVUiHu8ufDw==", + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/eventstream-codec": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-4.2.8.tgz", + "integrity": "sha512-jS/O5Q14UsufqoGhov7dHLOPCzkYJl9QDzusI2Psh4wyYx/izhzvX9P4D69aTxcdfVhEPhjK+wYyn/PzLjKbbw==", "license": "Apache-2.0", "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.693.0", - "@aws-sdk/client-sts": "3.693.0", - "@aws-sdk/core": "3.693.0", - "@aws-sdk/credential-provider-node": "3.693.0", - "@aws-sdk/middleware-host-header": "3.693.0", - "@aws-sdk/middleware-logger": "3.693.0", - "@aws-sdk/middleware-recursion-detection": "3.693.0", - "@aws-sdk/middleware-user-agent": "3.693.0", - "@aws-sdk/region-config-resolver": "3.693.0", - "@aws-sdk/types": "3.692.0", - "@aws-sdk/util-endpoints": "3.693.0", - "@aws-sdk/util-user-agent-browser": "3.693.0", - "@aws-sdk/util-user-agent-node": "3.693.0", - "@smithy/config-resolver": "^3.0.11", - "@smithy/core": "^2.5.2", - "@smithy/fetch-http-handler": "^4.1.0", - "@smithy/hash-node": "^3.0.9", - "@smithy/invalid-dependency": "^3.0.9", - "@smithy/middleware-content-length": "^3.0.11", - "@smithy/middleware-endpoint": "^3.2.2", - "@smithy/middleware-retry": "^3.0.26", - "@smithy/middleware-serde": "^3.0.9", - "@smithy/middleware-stack": "^3.0.9", - "@smithy/node-config-provider": "^3.1.10", - "@smithy/node-http-handler": "^3.3.0", - "@smithy/protocol-http": "^4.1.6", - "@smithy/smithy-client": "^3.4.3", - "@smithy/types": "^3.7.0", - "@smithy/url-parser": "^3.0.9", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.26", - "@smithy/util-defaults-mode-node": "^3.0.26", - "@smithy/util-endpoints": "^2.1.5", - "@smithy/util-middleware": "^3.0.9", - "@smithy/util-retry": "^3.0.9", - "@smithy/util-utf8": "^3.0.0", - "@smithy/util-waiter": "^3.1.8", + "@aws-crypto/crc32": "5.2.0", + "@smithy/types": "^4.12.0", + "@smithy/util-hex-encoding": "^4.2.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-redshift-data": { - "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-redshift-data/-/client-redshift-data-3.693.0.tgz", - "integrity": "sha512-uG5LdlXz80KcauRIucMdiRSQJ2WutewQRHpcTQW4vFUf/kEhUha5fD9FMn+/eJ1NFA2N8hv64vhpzGvu7EiP6Q==", + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/eventstream-serde-browser": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-4.2.8.tgz", + "integrity": "sha512-MTfQT/CRQz5g24ayXdjg53V0mhucZth4PESoA5IhvaWVDTOQLfo8qI9vzqHcPsdd2v6sqfTYqF5L/l+pea5Uyw==", "license": "Apache-2.0", "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.693.0", - "@aws-sdk/client-sts": "3.693.0", - "@aws-sdk/core": "3.693.0", - "@aws-sdk/credential-provider-node": "3.693.0", - "@aws-sdk/middleware-host-header": "3.693.0", - "@aws-sdk/middleware-logger": "3.693.0", - "@aws-sdk/middleware-recursion-detection": "3.693.0", - "@aws-sdk/middleware-user-agent": "3.693.0", - "@aws-sdk/region-config-resolver": "3.693.0", - "@aws-sdk/types": "3.692.0", - "@aws-sdk/util-endpoints": "3.693.0", - "@aws-sdk/util-user-agent-browser": "3.693.0", - "@aws-sdk/util-user-agent-node": "3.693.0", - "@smithy/config-resolver": "^3.0.11", - "@smithy/core": "^2.5.2", - "@smithy/fetch-http-handler": "^4.1.0", - "@smithy/hash-node": "^3.0.9", - "@smithy/invalid-dependency": "^3.0.9", - "@smithy/middleware-content-length": "^3.0.11", - "@smithy/middleware-endpoint": "^3.2.2", - "@smithy/middleware-retry": "^3.0.26", - "@smithy/middleware-serde": "^3.0.9", - "@smithy/middleware-stack": "^3.0.9", - "@smithy/node-config-provider": "^3.1.10", - "@smithy/node-http-handler": "^3.3.0", - "@smithy/protocol-http": "^4.1.6", - "@smithy/smithy-client": "^3.4.3", - "@smithy/types": "^3.7.0", - "@smithy/url-parser": "^3.0.9", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.26", - "@smithy/util-defaults-mode-node": "^3.0.26", - "@smithy/util-endpoints": "^2.1.5", - "@smithy/util-middleware": "^3.0.9", - "@smithy/util-retry": "^3.0.9", - "@smithy/util-utf8": "^3.0.0", - "@types/uuid": "^9.0.1", - "tslib": "^2.6.2", - "uuid": "^9.0.1" + "@smithy/eventstream-serde-universal": "^4.2.8", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-redshift-data/node_modules/@aws-sdk/client-sso": { - "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.693.0.tgz", - "integrity": "sha512-QEynrBC26x6TG9ZMzApR/kZ3lmt4lEIs2D+cHuDxt6fDGzahBUsQFBwJqhizzsM97JJI5YvmJhmihoYjdSSaXA==", + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/eventstream-serde-config-resolver": { + "version": "4.3.8", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-4.3.8.tgz", + "integrity": "sha512-ah12+luBiDGzBruhu3efNy1IlbwSEdNiw8fOZksoKoWW1ZHvO/04MQsdnws/9Aj+5b0YXSSN2JXKy/ClIsW8MQ==", "license": "Apache-2.0", "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.693.0", - "@aws-sdk/middleware-host-header": "3.693.0", - "@aws-sdk/middleware-logger": "3.693.0", - "@aws-sdk/middleware-recursion-detection": "3.693.0", - "@aws-sdk/middleware-user-agent": "3.693.0", - "@aws-sdk/region-config-resolver": "3.693.0", - "@aws-sdk/types": "3.692.0", - "@aws-sdk/util-endpoints": "3.693.0", - "@aws-sdk/util-user-agent-browser": "3.693.0", - "@aws-sdk/util-user-agent-node": "3.693.0", - "@smithy/config-resolver": "^3.0.11", - "@smithy/core": "^2.5.2", - "@smithy/fetch-http-handler": "^4.1.0", - "@smithy/hash-node": "^3.0.9", - "@smithy/invalid-dependency": "^3.0.9", - "@smithy/middleware-content-length": "^3.0.11", - "@smithy/middleware-endpoint": "^3.2.2", - "@smithy/middleware-retry": "^3.0.26", - "@smithy/middleware-serde": "^3.0.9", - "@smithy/middleware-stack": "^3.0.9", - "@smithy/node-config-provider": "^3.1.10", - "@smithy/node-http-handler": "^3.3.0", - "@smithy/protocol-http": "^4.1.6", - "@smithy/smithy-client": "^3.4.3", - "@smithy/types": "^3.7.0", - "@smithy/url-parser": "^3.0.9", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.26", - "@smithy/util-defaults-mode-node": "^3.0.26", - "@smithy/util-endpoints": "^2.1.5", - "@smithy/util-middleware": "^3.0.9", - "@smithy/util-retry": "^3.0.9", - "@smithy/util-utf8": "^3.0.0", + "@smithy/types": "^4.12.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-redshift-data/node_modules/@aws-sdk/client-sso-oidc": { - "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.693.0.tgz", - "integrity": "sha512-UEDbYlYtK/e86OOMyFR4zEPyenIxDzO2DRdz3fwVW7RzZ94wfmSwBh/8skzPTuY1G7sI064cjHW0b0QG01Sdtg==", + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/eventstream-serde-node": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-node/-/eventstream-serde-node-4.2.8.tgz", + "integrity": "sha512-cYpCpp29z6EJHa5T9WL0KAlq3SOKUQkcgSoeRfRVwjGgSFl7Uh32eYGt7IDYCX20skiEdRffyDpvF2efEZPC0A==", "license": "Apache-2.0", "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.693.0", - "@aws-sdk/credential-provider-node": "3.693.0", - "@aws-sdk/middleware-host-header": "3.693.0", - "@aws-sdk/middleware-logger": "3.693.0", - "@aws-sdk/middleware-recursion-detection": "3.693.0", - "@aws-sdk/middleware-user-agent": "3.693.0", - "@aws-sdk/region-config-resolver": "3.693.0", - "@aws-sdk/types": "3.692.0", - "@aws-sdk/util-endpoints": "3.693.0", - "@aws-sdk/util-user-agent-browser": "3.693.0", - "@aws-sdk/util-user-agent-node": "3.693.0", - "@smithy/config-resolver": "^3.0.11", - "@smithy/core": "^2.5.2", - "@smithy/fetch-http-handler": "^4.1.0", - "@smithy/hash-node": "^3.0.9", - "@smithy/invalid-dependency": "^3.0.9", - "@smithy/middleware-content-length": "^3.0.11", - "@smithy/middleware-endpoint": "^3.2.2", - "@smithy/middleware-retry": "^3.0.26", - "@smithy/middleware-serde": "^3.0.9", - "@smithy/middleware-stack": "^3.0.9", - "@smithy/node-config-provider": "^3.1.10", - "@smithy/node-http-handler": "^3.3.0", - "@smithy/protocol-http": "^4.1.6", - "@smithy/smithy-client": "^3.4.3", - "@smithy/types": "^3.7.0", - "@smithy/url-parser": "^3.0.9", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.26", - "@smithy/util-defaults-mode-node": "^3.0.26", - "@smithy/util-endpoints": "^2.1.5", - "@smithy/util-middleware": "^3.0.9", - "@smithy/util-retry": "^3.0.9", - "@smithy/util-utf8": "^3.0.0", + "@smithy/eventstream-serde-universal": "^4.2.8", + "@smithy/types": "^4.12.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/eventstream-serde-universal": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-4.2.8.tgz", + "integrity": "sha512-iJ6YNJd0bntJYnX6s52NC4WFYcZeKrPUr1Kmmr5AwZcwCSzVpS7oavAmxMR7pMq7V+D1G4s9F5NJK0xwOsKAlQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/eventstream-codec": "^4.2.8", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" }, - "peerDependencies": { - "@aws-sdk/client-sts": "^3.693.0" + "engines": { + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-redshift-data/node_modules/@aws-sdk/client-sts": { - "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.693.0.tgz", - "integrity": "sha512-4S2y7VEtvdnjJX4JPl4kDQlslxXEZFnC50/UXVUYSt/AMc5A/GgspFNA5FVz4E3Gwpfobbf23hR2NBF8AGvYoQ==", + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/fetch-http-handler": { + "version": "5.3.9", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.3.9.tgz", + "integrity": "sha512-I4UhmcTYXBrct03rwzQX1Y/iqQlzVQaPxWjCjula++5EmWq9YGBrx6bbGqluGc1f0XEfhSkiY4jhLgbsJUMKRA==", "license": "Apache-2.0", "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.693.0", - "@aws-sdk/core": "3.693.0", - "@aws-sdk/credential-provider-node": "3.693.0", - "@aws-sdk/middleware-host-header": "3.693.0", - "@aws-sdk/middleware-logger": "3.693.0", - "@aws-sdk/middleware-recursion-detection": "3.693.0", - "@aws-sdk/middleware-user-agent": "3.693.0", - "@aws-sdk/region-config-resolver": "3.693.0", - "@aws-sdk/types": "3.692.0", - "@aws-sdk/util-endpoints": "3.693.0", - "@aws-sdk/util-user-agent-browser": "3.693.0", - "@aws-sdk/util-user-agent-node": "3.693.0", - "@smithy/config-resolver": "^3.0.11", - "@smithy/core": "^2.5.2", - "@smithy/fetch-http-handler": "^4.1.0", - "@smithy/hash-node": "^3.0.9", - "@smithy/invalid-dependency": "^3.0.9", - "@smithy/middleware-content-length": "^3.0.11", - "@smithy/middleware-endpoint": "^3.2.2", - "@smithy/middleware-retry": "^3.0.26", - "@smithy/middleware-serde": "^3.0.9", - "@smithy/middleware-stack": "^3.0.9", - "@smithy/node-config-provider": "^3.1.10", - "@smithy/node-http-handler": "^3.3.0", - "@smithy/protocol-http": "^4.1.6", - "@smithy/smithy-client": "^3.4.3", - "@smithy/types": "^3.7.0", - "@smithy/url-parser": "^3.0.9", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.26", - "@smithy/util-defaults-mode-node": "^3.0.26", - "@smithy/util-endpoints": "^2.1.5", - "@smithy/util-middleware": "^3.0.9", - "@smithy/util-retry": "^3.0.9", - "@smithy/util-utf8": "^3.0.0", + "@smithy/protocol-http": "^5.3.8", + "@smithy/querystring-builder": "^4.2.8", + "@smithy/types": "^4.12.0", + "@smithy/util-base64": "^4.3.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-redshift-data/node_modules/@aws-sdk/core": { - "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.693.0.tgz", - "integrity": "sha512-v6Z/kWmLFqRLDPEwl9hJGhtTgIFHjZugSfF1Yqffdxf4n1AWgtHS7qSegakuMyN5pP4K2tvUD8qHJ+gGe2Bw2A==", + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/hash-node": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.2.8.tgz", + "integrity": "sha512-7ZIlPbmaDGxVoxErDZnuFG18WekhbA/g2/i97wGj+wUBeS6pcUeAym8u4BXh/75RXWhgIJhyC11hBzig6MljwA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.692.0", - "@smithy/core": "^2.5.2", - "@smithy/node-config-provider": "^3.1.10", - "@smithy/property-provider": "^3.1.9", - "@smithy/protocol-http": "^4.1.6", - "@smithy/signature-v4": "^4.2.2", - "@smithy/smithy-client": "^3.4.3", - "@smithy/types": "^3.7.0", - "@smithy/util-middleware": "^3.0.9", - "fast-xml-parser": "4.4.1", + "@smithy/types": "^4.12.0", + "@smithy/util-buffer-from": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-redshift-data/node_modules/@aws-sdk/credential-provider-http": { - "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.693.0.tgz", - "integrity": "sha512-sL8MvwNJU7ZpD7/d2VVb3by1GknIJUxzTIgYtVkDVA/ojo+KRQSSHxcj0EWWXF5DTSh2Tm+LrEug3y1ZyKHsDA==", + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/invalid-dependency": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.2.8.tgz", + "integrity": "sha512-N9iozRybwAQ2dn9Fot9kI6/w9vos2oTXLhtK7ovGqwZjlOcxu6XhPlpLpC+INsxktqHinn5gS2DXDjDF2kG5sQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.693.0", - "@aws-sdk/types": "3.692.0", - "@smithy/fetch-http-handler": "^4.1.0", - "@smithy/node-http-handler": "^3.3.0", - "@smithy/property-provider": "^3.1.9", - "@smithy/protocol-http": "^4.1.6", - "@smithy/smithy-client": "^3.4.3", - "@smithy/types": "^3.7.0", - "@smithy/util-stream": "^3.3.0", + "@smithy/types": "^4.12.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-redshift-data/node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.693.0.tgz", - "integrity": "sha512-kvaa4mXhCCOuW7UQnBhYqYfgWmwy7WSBSDClutwSLPZvgrhYj2l16SD2lN4IfYdxARYMJJ1lFYp3/jJG/9Yk4Q==", + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/is-array-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-4.2.0.tgz", + "integrity": "sha512-DZZZBvC7sjcYh4MazJSGiWMI2L7E0oCiRHREDzIxi/M2LY79/21iXt6aPLHge82wi5LsuRF5A06Ds3+0mlh6CQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.693.0", - "@aws-sdk/credential-provider-env": "3.693.0", - "@aws-sdk/credential-provider-http": "3.693.0", - "@aws-sdk/credential-provider-process": "3.693.0", - "@aws-sdk/credential-provider-sso": "3.693.0", - "@aws-sdk/credential-provider-web-identity": "3.693.0", - "@aws-sdk/types": "3.692.0", - "@smithy/credential-provider-imds": "^3.2.6", - "@smithy/property-provider": "^3.1.9", - "@smithy/shared-ini-file-loader": "^3.1.10", - "@smithy/types": "^3.7.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sts": "^3.693.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-redshift-data/node_modules/@aws-sdk/credential-provider-node": { - "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.693.0.tgz", - "integrity": "sha512-42WMsBjTNnjYxYuM3qD/Nq+8b7UdMopUq5OduMDxoM3mFTV6PXMMnfI4Z1TNnR4tYRvPXAnuNltF6xmjKbSJRA==", + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/middleware-content-length": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.2.8.tgz", + "integrity": "sha512-RO0jeoaYAB1qBRhfVyq0pMgBoUK34YEJxVxyjOWYZiOKOq2yMZ4MnVXMZCUDenpozHue207+9P5ilTV1zeda0A==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/credential-provider-env": "3.693.0", - "@aws-sdk/credential-provider-http": "3.693.0", - "@aws-sdk/credential-provider-ini": "3.693.0", - "@aws-sdk/credential-provider-process": "3.693.0", - "@aws-sdk/credential-provider-sso": "3.693.0", - "@aws-sdk/credential-provider-web-identity": "3.693.0", - "@aws-sdk/types": "3.692.0", - "@smithy/credential-provider-imds": "^3.2.6", - "@smithy/property-provider": "^3.1.9", - "@smithy/shared-ini-file-loader": "^3.1.10", - "@smithy/types": "^3.7.0", + "@smithy/protocol-http": "^5.3.8", + "@smithy/types": "^4.12.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-redshift-data/node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.693.0.tgz", - "integrity": "sha512-479UlJxY+BFjj3pJFYUNC0DCMrykuG7wBAXfsvZqQxKUa83DnH5Q1ID/N2hZLkxjGd4ZW0AC3lTOMxFelGzzpQ==", + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/middleware-endpoint": { + "version": "4.4.11", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.4.11.tgz", + "integrity": "sha512-/WqsrycweGGfb9sSzME4CrsuayjJF6BueBmkKlcbeU5q18OhxRrvvKlmfw3tpDsK5ilx2XUJvoukwxHB0nHs/Q==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/client-sso": "3.693.0", - "@aws-sdk/core": "3.693.0", - "@aws-sdk/token-providers": "3.693.0", - "@aws-sdk/types": "3.692.0", - "@smithy/property-provider": "^3.1.9", - "@smithy/shared-ini-file-loader": "^3.1.10", - "@smithy/types": "^3.7.0", + "@smithy/core": "^3.21.1", + "@smithy/middleware-serde": "^4.2.9", + "@smithy/node-config-provider": "^4.3.8", + "@smithy/shared-ini-file-loader": "^4.4.3", + "@smithy/types": "^4.12.0", + "@smithy/url-parser": "^4.2.8", + "@smithy/util-middleware": "^4.2.8", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-redshift-data/node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.693.0.tgz", - "integrity": "sha512-8LB210Pr6VeCiSb2hIra+sAH4KUBLyGaN50axHtIgufVK8jbKIctTZcVY5TO9Se+1107TsruzeXS7VeqVdJfFA==", + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/middleware-retry": { + "version": "4.4.27", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.4.27.tgz", + "integrity": "sha512-xFUYCGRVsfgiN5EjsJJSzih9+yjStgMTCLANPlf0LVQkPDYCe0hz97qbdTZosFOiYlGBlHYityGRxrQ/hxhfVQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.693.0", - "@aws-sdk/types": "3.692.0", - "@smithy/property-provider": "^3.1.9", - "@smithy/types": "^3.7.0", + "@smithy/node-config-provider": "^4.3.8", + "@smithy/protocol-http": "^5.3.8", + "@smithy/service-error-classification": "^4.2.8", + "@smithy/smithy-client": "^4.10.12", + "@smithy/types": "^4.12.0", + "@smithy/util-middleware": "^4.2.8", + "@smithy/util-retry": "^4.2.8", + "@smithy/uuid": "^1.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sts": "^3.693.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-redshift-data/node_modules/@aws-sdk/middleware-host-header": { - "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.693.0.tgz", - "integrity": "sha512-BCki6sAZ5jYwIN/t3ElCiwerHad69ipHwPsDCxJQyeiOnJ8HG+lEpnVIfrnI8A0fLQNSF3Gtx6ahfBpKiv1Oug==", + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/middleware-serde": { + "version": "4.2.9", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.2.9.tgz", + "integrity": "sha512-eMNiej0u/snzDvlqRGSN3Vl0ESn3838+nKyVfF2FKNXFbi4SERYT6PR392D39iczngbqqGG0Jl1DlCnp7tBbXQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.692.0", - "@smithy/protocol-http": "^4.1.6", - "@smithy/types": "^3.7.0", + "@smithy/protocol-http": "^5.3.8", + "@smithy/types": "^4.12.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-redshift-data/node_modules/@aws-sdk/middleware-logger": { - "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.693.0.tgz", - "integrity": "sha512-dXnXDPr+wIiJ1TLADACI1g9pkSB21KkMIko2u4CJ2JCBoxi5IqeTnVoa6YcC8GdFNVRl+PorZ3Zqfmf1EOTC6w==", + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/middleware-stack": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.2.8.tgz", + "integrity": "sha512-w6LCfOviTYQjBctOKSwy6A8FIkQy7ICvglrZFl6Bw4FmcQ1Z420fUtIhxaUZZshRe0VCq4kvDiPiXrPZAe8oRA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.692.0", - "@smithy/types": "^3.7.0", + "@smithy/types": "^4.12.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-redshift-data/node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.693.0.tgz", - "integrity": "sha512-0LDmM+VxXp0u3rG0xQRWD/q6Ubi7G8I44tBPahevD5CaiDZTkmNTrVUf0VEJgVe0iCKBppACMBDkLB0/ETqkFw==", + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/node-config-provider": { + "version": "4.3.8", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.3.8.tgz", + "integrity": "sha512-aFP1ai4lrbVlWjfpAfRSL8KFcnJQYfTl5QxLJXY32vghJrDuFyPZ6LtUL+JEGYiFRG1PfPLHLoxj107ulncLIg==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.692.0", - "@smithy/protocol-http": "^4.1.6", - "@smithy/types": "^3.7.0", + "@smithy/property-provider": "^4.2.8", + "@smithy/shared-ini-file-loader": "^4.4.3", + "@smithy/types": "^4.12.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-redshift-data/node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.693.0.tgz", - "integrity": "sha512-/KUq/KEpFFbQmNmpp7SpAtFAdViquDfD2W0QcG07zYBfz9MwE2ig48ALynXm5sMpRmnG7sJXjdvPtTsSVPfkiw==", + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/node-http-handler": { + "version": "4.4.8", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.4.8.tgz", + "integrity": "sha512-q9u+MSbJVIJ1QmJ4+1u+cERXkrhuILCBDsJUBAW1MPE6sFonbCNaegFuwW9ll8kh5UdyY3jOkoOGlc7BesoLpg==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.693.0", - "@aws-sdk/types": "3.692.0", - "@aws-sdk/util-endpoints": "3.693.0", - "@smithy/core": "^2.5.2", - "@smithy/protocol-http": "^4.1.6", - "@smithy/types": "^3.7.0", + "@smithy/abort-controller": "^4.2.8", + "@smithy/protocol-http": "^5.3.8", + "@smithy/querystring-builder": "^4.2.8", + "@smithy/types": "^4.12.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-redshift-data/node_modules/@aws-sdk/region-config-resolver": { - "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.693.0.tgz", - "integrity": "sha512-YLUkMsUY0GLW/nfwlZ69cy1u07EZRmsv8Z9m0qW317/EZaVx59hcvmcvb+W4bFqj5E8YImTjoGfE4cZ0F9mkyw==", + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/property-provider": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.2.8.tgz", + "integrity": "sha512-EtCTbyIveCKeOXDSWSdze3k612yCPq1YbXsbqX3UHhkOSW8zKsM9NOJG5gTIya0vbY2DIaieG8pKo1rITHYL0w==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.692.0", - "@smithy/node-config-provider": "^3.1.10", - "@smithy/types": "^3.7.0", - "@smithy/util-config-provider": "^3.0.0", - "@smithy/util-middleware": "^3.0.9", + "@smithy/types": "^4.12.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-redshift-data/node_modules/@aws-sdk/token-providers": { - "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.693.0.tgz", - "integrity": "sha512-nDBTJMk1l/YmFULGfRbToOA2wjf+FkQT4dMgYCv+V9uSYsMzQj8A7Tha2dz9yv4vnQgYaEiErQ8d7HVyXcVEoA==", + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/protocol-http": { + "version": "5.3.8", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.3.8.tgz", + "integrity": "sha512-QNINVDhxpZ5QnP3aviNHQFlRogQZDfYlCkQT+7tJnErPQbDhysondEjhikuANxgMsZrkGeiAxXy4jguEGsDrWQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.692.0", - "@smithy/property-provider": "^3.1.9", - "@smithy/shared-ini-file-loader": "^3.1.10", - "@smithy/types": "^3.7.0", + "@smithy/types": "^4.12.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sso-oidc": "^3.693.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-redshift-data/node_modules/@aws-sdk/util-endpoints": { - "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.693.0.tgz", - "integrity": "sha512-eo4F6DRQ/kxS3gxJpLRv+aDNy76DxQJL5B3DPzpr9Vkq0ygVoi4GT5oIZLVaAVIJmi6k5qq9dLsYZfWLUxJJSg==", + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/querystring-builder": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.2.8.tgz", + "integrity": "sha512-Xr83r31+DrE8CP3MqPgMJl+pQlLLmOfiEUnoyAlGzzJIrEsbKsPy1hqH0qySaQm4oWrCBlUqRt+idEgunKB+iw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.692.0", - "@smithy/types": "^3.7.0", - "@smithy/util-endpoints": "^2.1.5", + "@smithy/types": "^4.12.0", + "@smithy/util-uri-escape": "^4.2.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-redshift-data/node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.693.0.tgz", - "integrity": "sha512-6EUfuKOujtddy18OLJUaXfKBgs+UcbZ6N/3QV4iOkubCUdeM1maIqs++B9bhCbWeaeF5ORizJw5FTwnyNjE/mw==", + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/querystring-parser": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.2.8.tgz", + "integrity": "sha512-vUurovluVy50CUlazOiXkPq40KGvGWSdmusa3130MwrR1UNnNgKAlj58wlOe61XSHRpUfIIh6cE0zZ8mzKaDPA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.692.0", - "@smithy/types": "^3.7.0", - "bowser": "^2.11.0", + "@smithy/types": "^4.12.0", "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-redshift-data/node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.693.0.tgz", - "integrity": "sha512-td0OVX8m5ZKiXtecIDuzY3Y3UZIzvxEr57Hp21NOwieqKCG2UeyQWWeGPv0FQaU7dpTkvFmVNI+tx9iB8V/Nhg==", + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/service-error-classification": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.2.8.tgz", + "integrity": "sha512-mZ5xddodpJhEt3RkCjbmUQuXUOaPNTkbMGR0bcS8FE0bJDLMZlhmpgrvPNCYglVw5rsYTpSnv19womw9WWXKQQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/middleware-user-agent": "3.693.0", - "@aws-sdk/types": "3.692.0", - "@smithy/node-config-provider": "^3.1.10", - "@smithy/types": "^3.7.0", - "tslib": "^2.6.2" + "@smithy/types": "^4.12.0" }, "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "aws-crt": ">=1.0.0" - }, - "peerDependenciesMeta": { - "aws-crt": { - "optional": true - } + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-redshift-data/node_modules/@smithy/is-array-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-3.0.0.tgz", - "integrity": "sha512-+Fsu6Q6C4RSJiy81Y8eApjEB5gVtM+oFKTffg+jSuwtvomJJrhUJBu2zS8wjXSgH/g1MKEWrzyChTBe6clb5FQ==", + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/shared-ini-file-loader": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.4.3.tgz", + "integrity": "sha512-DfQjxXQnzC5UbCUPeC3Ie8u+rIWZTvuDPAGU/BxzrOGhRvgUanaP68kDZA+jaT3ZI+djOf+4dERGlm9mWfFDrg==", "license": "Apache-2.0", "dependencies": { + "@smithy/types": "^4.12.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-redshift-data/node_modules/@smithy/util-buffer-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-3.0.0.tgz", - "integrity": "sha512-aEOHCgq5RWFbP+UDPvPot26EJHjOC+bRgse5A8V3FSShqd5E5UN4qc7zkwsvJPPAVsf73QwYcHN1/gt/rtLwQA==", + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/smithy-client": { + "version": "4.10.12", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.10.12.tgz", + "integrity": "sha512-VKO/HKoQ5OrSHW6AJUmEnUKeXI1/5LfCwO9cwyao7CmLvGnZeM1i36Lyful3LK1XU7HwTVieTqO1y2C/6t3qtA==", "license": "Apache-2.0", "dependencies": { - "@smithy/is-array-buffer": "^3.0.0", + "@smithy/core": "^3.21.1", + "@smithy/middleware-endpoint": "^4.4.11", + "@smithy/middleware-stack": "^4.2.8", + "@smithy/protocol-http": "^5.3.8", + "@smithy/types": "^4.12.0", + "@smithy/util-stream": "^4.5.10", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-redshift-data/node_modules/@smithy/util-utf8": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-3.0.0.tgz", - "integrity": "sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==", + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/types": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.12.0.tgz", + "integrity": "sha512-9YcuJVTOBDjg9LWo23Qp0lTQ3D7fQsQtwle0jVfpbUHy9qBwCEgKuVH4FqFB3VYu0nwdHKiEMA+oXz7oV8X1kw==", "license": "Apache-2.0", "dependencies": { - "@smithy/util-buffer-from": "^3.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-redshift-serverless": { + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/url-parser": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.2.8.tgz", + "integrity": "sha512-NQho9U68TGMEU639YkXnVMV3GEFFULmmaWdlu1E9qzyIePOHsoSnagTGSDv1Zi8DCNN6btxOSdgmy5E/hsZwhA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/querystring-parser": "^4.2.8", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/util-base64": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-4.3.0.tgz", + "integrity": "sha512-GkXZ59JfyxsIwNTWFnjmFEI8kZpRNIBfxKjv09+nkAWPt/4aGaEWMM04m4sxgNVWkbt2MdSvE3KF/PfX4nFedQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/util-body-length-browser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-4.2.0.tgz", + "integrity": "sha512-Fkoh/I76szMKJnBXWPdFkQJl2r9SjPt3cMzLdOB6eJ4Pnpas8hVoWPYemX/peO0yrrvldgCUVJqOAjUrOLjbxg==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/util-body-length-node": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-4.2.1.tgz", + "integrity": "sha512-h53dz/pISVrVrfxV1iqXlx5pRg3V2YWFcSQyPyXZRrZoZj4R4DeWRDo1a7dd3CPTcFi3kE+98tuNyD2axyZReA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/util-buffer-from": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-4.2.0.tgz", + "integrity": "sha512-kAY9hTKulTNevM2nlRtxAG2FQ3B2OR6QIrPY3zE5LqJy1oxzmgBGsHLWTcNhWXKchgA0WHW+mZkQrng/pgcCew==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/util-config-provider": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-4.2.0.tgz", + "integrity": "sha512-YEjpl6XJ36FTKmD+kRJJWYvrHeUvm5ykaUS5xK+6oXffQPHeEM4/nXlZPe+Wu0lsgRUcNZiliYNh/y7q9c2y6Q==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/util-defaults-mode-browser": { + "version": "4.3.26", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.3.26.tgz", + "integrity": "sha512-vva0dzYUTgn7DdE0uaha10uEdAgmdLnNFowKFjpMm6p2R0XDk5FHPX3CBJLzWQkQXuEprsb0hGz9YwbicNWhjw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/property-provider": "^4.2.8", + "@smithy/smithy-client": "^4.10.12", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/util-defaults-mode-node": { + "version": "4.2.29", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.2.29.tgz", + "integrity": "sha512-c6D7IUBsZt/aNnTBHMTf+OVh+h/JcxUUgfTcIJaWRe6zhOum1X+pNKSZtZ+7fbOn5I99XVFtmrnXKv8yHHErTQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/config-resolver": "^4.4.6", + "@smithy/credential-provider-imds": "^4.2.8", + "@smithy/node-config-provider": "^4.3.8", + "@smithy/property-provider": "^4.2.8", + "@smithy/smithy-client": "^4.10.12", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/util-endpoints": { + "version": "3.2.8", + "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.2.8.tgz", + "integrity": "sha512-8JaVTn3pBDkhZgHQ8R0epwWt+BqPSLCjdjXXusK1onwJlRuN69fbvSK66aIKKO7SwVFM6x2J2ox5X8pOaWcUEw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/node-config-provider": "^4.3.8", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/util-hex-encoding": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-4.2.0.tgz", + "integrity": "sha512-CCQBwJIvXMLKxVbO88IukazJD9a4kQ9ZN7/UMGBjBcJYvatpWk+9g870El4cB8/EJxfe+k+y0GmR9CAzkF+Nbw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/util-middleware": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.2.8.tgz", + "integrity": "sha512-PMqfeJxLcNPMDgvPbbLl/2Vpin+luxqTGPpW3NAQVLbRrFRzTa4rNAASYeIGjRV9Ytuhzny39SpyU04EQreF+A==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/util-retry": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.2.8.tgz", + "integrity": "sha512-CfJqwvoRY0kTGe5AkQokpURNCT1u/MkRzMTASWMPPo2hNSnKtF1D45dQl3DE2LKLr4m+PW9mCeBMJr5mCAVThg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/service-error-classification": "^4.2.8", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/util-stream": { + "version": "4.5.10", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.5.10.tgz", + "integrity": "sha512-jbqemy51UFSZSp2y0ZmRfckmrzuKww95zT9BYMmuJ8v3altGcqjwoV1tzpOwuHaKrwQrCjIzOib499ymr2f98g==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/fetch-http-handler": "^5.3.9", + "@smithy/node-http-handler": "^4.4.8", + "@smithy/types": "^4.12.0", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-buffer-from": "^4.2.0", + "@smithy/util-hex-encoding": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/util-uri-escape": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-4.2.0.tgz", + "integrity": "sha512-igZpCKV9+E/Mzrpq6YacdTQ0qTiLm85gD6N/IrmyDvQFA4UnU3d5g3m8tMT/6zG/vVkWSU+VxeUyGonL62DuxA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/util-utf8": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.2.0.tgz", + "integrity": "sha512-zBPfuzoI8xyBtR2P6WQj63Rz8i3AmfAaJLuNG8dWsfvPe8lO4aCPYLn879mEgHndZH1zQ2oXmG8O1GGzzaoZiw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/util-waiter": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-4.2.8.tgz", + "integrity": "sha512-n+lahlMWk+aejGuax7DPWtqav8HYnWxQwR+LCG2BgCUmaGcTe9qZCFsmw8TMg9iG75HOwhrJCX9TCJRLH+Yzqg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/abort-controller": "^4.2.8", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-redshift": { "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-redshift-serverless/-/client-redshift-serverless-3.693.0.tgz", - "integrity": "sha512-m6Bhw0Xx/x0KGKP9N7c+Jqs5VT6nkZbfwO+QTxllggsuNfAzGwluCw1hoY++/MQ9oFtioEu+ud7xWOlTIK8w/A==", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-redshift/-/client-redshift-3.693.0.tgz", + "integrity": "sha512-k+4emXXK7iOOYjTAU+Erj5RVxu68Hi6iI48h5r8iNMhWRUMqUq346tK5qkD4C4x9SzJu5j0WgPWpVUiHu8ufDw==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", @@ -18245,13 +18260,68 @@ "@smithy/util-middleware": "^3.0.9", "@smithy/util-retry": "^3.0.9", "@smithy/util-utf8": "^3.0.0", + "@smithy/util-waiter": "^3.1.8", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-redshift-serverless/node_modules/@aws-sdk/client-sso": { + "node_modules/@aws-sdk/client-redshift-data": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-redshift-data/-/client-redshift-data-3.693.0.tgz", + "integrity": "sha512-uG5LdlXz80KcauRIucMdiRSQJ2WutewQRHpcTQW4vFUf/kEhUha5fD9FMn+/eJ1NFA2N8hv64vhpzGvu7EiP6Q==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/client-sso-oidc": "3.693.0", + "@aws-sdk/client-sts": "3.693.0", + "@aws-sdk/core": "3.693.0", + "@aws-sdk/credential-provider-node": "3.693.0", + "@aws-sdk/middleware-host-header": "3.693.0", + "@aws-sdk/middleware-logger": "3.693.0", + "@aws-sdk/middleware-recursion-detection": "3.693.0", + "@aws-sdk/middleware-user-agent": "3.693.0", + "@aws-sdk/region-config-resolver": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@aws-sdk/util-endpoints": "3.693.0", + "@aws-sdk/util-user-agent-browser": "3.693.0", + "@aws-sdk/util-user-agent-node": "3.693.0", + "@smithy/config-resolver": "^3.0.11", + "@smithy/core": "^2.5.2", + "@smithy/fetch-http-handler": "^4.1.0", + "@smithy/hash-node": "^3.0.9", + "@smithy/invalid-dependency": "^3.0.9", + "@smithy/middleware-content-length": "^3.0.11", + "@smithy/middleware-endpoint": "^3.2.2", + "@smithy/middleware-retry": "^3.0.26", + "@smithy/middleware-serde": "^3.0.9", + "@smithy/middleware-stack": "^3.0.9", + "@smithy/node-config-provider": "^3.1.10", + "@smithy/node-http-handler": "^3.3.0", + "@smithy/protocol-http": "^4.1.6", + "@smithy/smithy-client": "^3.4.3", + "@smithy/types": "^3.7.0", + "@smithy/url-parser": "^3.0.9", + "@smithy/util-base64": "^3.0.0", + "@smithy/util-body-length-browser": "^3.0.0", + "@smithy/util-body-length-node": "^3.0.0", + "@smithy/util-defaults-mode-browser": "^3.0.26", + "@smithy/util-defaults-mode-node": "^3.0.26", + "@smithy/util-endpoints": "^2.1.5", + "@smithy/util-middleware": "^3.0.9", + "@smithy/util-retry": "^3.0.9", + "@smithy/util-utf8": "^3.0.0", + "@types/uuid": "^9.0.1", + "tslib": "^2.6.2", + "uuid": "^9.0.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-redshift-data/node_modules/@aws-sdk/client-sso": { "version": "3.693.0", "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.693.0.tgz", "integrity": "sha512-QEynrBC26x6TG9ZMzApR/kZ3lmt4lEIs2D+cHuDxt6fDGzahBUsQFBwJqhizzsM97JJI5YvmJhmihoYjdSSaXA==", @@ -18300,7 +18370,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-redshift-serverless/node_modules/@aws-sdk/client-sso-oidc": { + "node_modules/@aws-sdk/client-redshift-data/node_modules/@aws-sdk/client-sso-oidc": { "version": "3.693.0", "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.693.0.tgz", "integrity": "sha512-UEDbYlYtK/e86OOMyFR4zEPyenIxDzO2DRdz3fwVW7RzZ94wfmSwBh/8skzPTuY1G7sI064cjHW0b0QG01Sdtg==", @@ -18353,7 +18423,7 @@ "@aws-sdk/client-sts": "^3.693.0" } }, - "node_modules/@aws-sdk/client-redshift-serverless/node_modules/@aws-sdk/client-sts": { + "node_modules/@aws-sdk/client-redshift-data/node_modules/@aws-sdk/client-sts": { "version": "3.693.0", "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.693.0.tgz", "integrity": "sha512-4S2y7VEtvdnjJX4JPl4kDQlslxXEZFnC50/UXVUYSt/AMc5A/GgspFNA5FVz4E3Gwpfobbf23hR2NBF8AGvYoQ==", @@ -18404,7 +18474,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-redshift-serverless/node_modules/@aws-sdk/core": { + "node_modules/@aws-sdk/client-redshift-data/node_modules/@aws-sdk/core": { "version": "3.693.0", "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.693.0.tgz", "integrity": "sha512-v6Z/kWmLFqRLDPEwl9hJGhtTgIFHjZugSfF1Yqffdxf4n1AWgtHS7qSegakuMyN5pP4K2tvUD8qHJ+gGe2Bw2A==", @@ -18426,7 +18496,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-redshift-serverless/node_modules/@aws-sdk/credential-provider-http": { + "node_modules/@aws-sdk/client-redshift-data/node_modules/@aws-sdk/credential-provider-http": { "version": "3.693.0", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.693.0.tgz", "integrity": "sha512-sL8MvwNJU7ZpD7/d2VVb3by1GknIJUxzTIgYtVkDVA/ojo+KRQSSHxcj0EWWXF5DTSh2Tm+LrEug3y1ZyKHsDA==", @@ -18447,7 +18517,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-redshift-serverless/node_modules/@aws-sdk/credential-provider-ini": { + "node_modules/@aws-sdk/client-redshift-data/node_modules/@aws-sdk/credential-provider-ini": { "version": "3.693.0", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.693.0.tgz", "integrity": "sha512-kvaa4mXhCCOuW7UQnBhYqYfgWmwy7WSBSDClutwSLPZvgrhYj2l16SD2lN4IfYdxARYMJJ1lFYp3/jJG/9Yk4Q==", @@ -18473,7 +18543,7 @@ "@aws-sdk/client-sts": "^3.693.0" } }, - "node_modules/@aws-sdk/client-redshift-serverless/node_modules/@aws-sdk/credential-provider-node": { + "node_modules/@aws-sdk/client-redshift-data/node_modules/@aws-sdk/credential-provider-node": { "version": "3.693.0", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.693.0.tgz", "integrity": "sha512-42WMsBjTNnjYxYuM3qD/Nq+8b7UdMopUq5OduMDxoM3mFTV6PXMMnfI4Z1TNnR4tYRvPXAnuNltF6xmjKbSJRA==", @@ -18496,7 +18566,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-redshift-serverless/node_modules/@aws-sdk/credential-provider-sso": { + "node_modules/@aws-sdk/client-redshift-data/node_modules/@aws-sdk/credential-provider-sso": { "version": "3.693.0", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.693.0.tgz", "integrity": "sha512-479UlJxY+BFjj3pJFYUNC0DCMrykuG7wBAXfsvZqQxKUa83DnH5Q1ID/N2hZLkxjGd4ZW0AC3lTOMxFelGzzpQ==", @@ -18515,7 +18585,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-redshift-serverless/node_modules/@aws-sdk/credential-provider-web-identity": { + "node_modules/@aws-sdk/client-redshift-data/node_modules/@aws-sdk/credential-provider-web-identity": { "version": "3.693.0", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.693.0.tgz", "integrity": "sha512-8LB210Pr6VeCiSb2hIra+sAH4KUBLyGaN50axHtIgufVK8jbKIctTZcVY5TO9Se+1107TsruzeXS7VeqVdJfFA==", @@ -18534,7 +18604,7 @@ "@aws-sdk/client-sts": "^3.693.0" } }, - "node_modules/@aws-sdk/client-redshift-serverless/node_modules/@aws-sdk/middleware-host-header": { + "node_modules/@aws-sdk/client-redshift-data/node_modules/@aws-sdk/middleware-host-header": { "version": "3.693.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.693.0.tgz", "integrity": "sha512-BCki6sAZ5jYwIN/t3ElCiwerHad69ipHwPsDCxJQyeiOnJ8HG+lEpnVIfrnI8A0fLQNSF3Gtx6ahfBpKiv1Oug==", @@ -18549,7 +18619,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-redshift-serverless/node_modules/@aws-sdk/middleware-logger": { + "node_modules/@aws-sdk/client-redshift-data/node_modules/@aws-sdk/middleware-logger": { "version": "3.693.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.693.0.tgz", "integrity": "sha512-dXnXDPr+wIiJ1TLADACI1g9pkSB21KkMIko2u4CJ2JCBoxi5IqeTnVoa6YcC8GdFNVRl+PorZ3Zqfmf1EOTC6w==", @@ -18563,7 +18633,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-redshift-serverless/node_modules/@aws-sdk/middleware-recursion-detection": { + "node_modules/@aws-sdk/client-redshift-data/node_modules/@aws-sdk/middleware-recursion-detection": { "version": "3.693.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.693.0.tgz", "integrity": "sha512-0LDmM+VxXp0u3rG0xQRWD/q6Ubi7G8I44tBPahevD5CaiDZTkmNTrVUf0VEJgVe0iCKBppACMBDkLB0/ETqkFw==", @@ -18578,7 +18648,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-redshift-serverless/node_modules/@aws-sdk/middleware-user-agent": { + "node_modules/@aws-sdk/client-redshift-data/node_modules/@aws-sdk/middleware-user-agent": { "version": "3.693.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.693.0.tgz", "integrity": "sha512-/KUq/KEpFFbQmNmpp7SpAtFAdViquDfD2W0QcG07zYBfz9MwE2ig48ALynXm5sMpRmnG7sJXjdvPtTsSVPfkiw==", @@ -18596,7 +18666,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-redshift-serverless/node_modules/@aws-sdk/region-config-resolver": { + "node_modules/@aws-sdk/client-redshift-data/node_modules/@aws-sdk/region-config-resolver": { "version": "3.693.0", "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.693.0.tgz", "integrity": "sha512-YLUkMsUY0GLW/nfwlZ69cy1u07EZRmsv8Z9m0qW317/EZaVx59hcvmcvb+W4bFqj5E8YImTjoGfE4cZ0F9mkyw==", @@ -18613,7 +18683,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-redshift-serverless/node_modules/@aws-sdk/token-providers": { + "node_modules/@aws-sdk/client-redshift-data/node_modules/@aws-sdk/token-providers": { "version": "3.693.0", "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.693.0.tgz", "integrity": "sha512-nDBTJMk1l/YmFULGfRbToOA2wjf+FkQT4dMgYCv+V9uSYsMzQj8A7Tha2dz9yv4vnQgYaEiErQ8d7HVyXcVEoA==", @@ -18632,7 +18702,7 @@ "@aws-sdk/client-sso-oidc": "^3.693.0" } }, - "node_modules/@aws-sdk/client-redshift-serverless/node_modules/@aws-sdk/util-endpoints": { + "node_modules/@aws-sdk/client-redshift-data/node_modules/@aws-sdk/util-endpoints": { "version": "3.693.0", "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.693.0.tgz", "integrity": "sha512-eo4F6DRQ/kxS3gxJpLRv+aDNy76DxQJL5B3DPzpr9Vkq0ygVoi4GT5oIZLVaAVIJmi6k5qq9dLsYZfWLUxJJSg==", @@ -18647,7 +18717,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-redshift-serverless/node_modules/@aws-sdk/util-user-agent-browser": { + "node_modules/@aws-sdk/client-redshift-data/node_modules/@aws-sdk/util-user-agent-browser": { "version": "3.693.0", "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.693.0.tgz", "integrity": "sha512-6EUfuKOujtddy18OLJUaXfKBgs+UcbZ6N/3QV4iOkubCUdeM1maIqs++B9bhCbWeaeF5ORizJw5FTwnyNjE/mw==", @@ -18659,7 +18729,7 @@ "tslib": "^2.6.2" } }, - "node_modules/@aws-sdk/client-redshift-serverless/node_modules/@aws-sdk/util-user-agent-node": { + "node_modules/@aws-sdk/client-redshift-data/node_modules/@aws-sdk/util-user-agent-node": { "version": "3.693.0", "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.693.0.tgz", "integrity": "sha512-td0OVX8m5ZKiXtecIDuzY3Y3UZIzvxEr57Hp21NOwieqKCG2UeyQWWeGPv0FQaU7dpTkvFmVNI+tx9iB8V/Nhg==", @@ -18683,7 +18753,7 @@ } } }, - "node_modules/@aws-sdk/client-redshift-serverless/node_modules/@smithy/is-array-buffer": { + "node_modules/@aws-sdk/client-redshift-data/node_modules/@smithy/is-array-buffer": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-3.0.0.tgz", "integrity": "sha512-+Fsu6Q6C4RSJiy81Y8eApjEB5gVtM+oFKTffg+jSuwtvomJJrhUJBu2zS8wjXSgH/g1MKEWrzyChTBe6clb5FQ==", @@ -18695,7 +18765,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-redshift-serverless/node_modules/@smithy/util-buffer-from": { + "node_modules/@aws-sdk/client-redshift-data/node_modules/@smithy/util-buffer-from": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-3.0.0.tgz", "integrity": "sha512-aEOHCgq5RWFbP+UDPvPot26EJHjOC+bRgse5A8V3FSShqd5E5UN4qc7zkwsvJPPAVsf73QwYcHN1/gt/rtLwQA==", @@ -18708,7 +18778,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-redshift-serverless/node_modules/@smithy/util-utf8": { + "node_modules/@aws-sdk/client-redshift-data/node_modules/@smithy/util-utf8": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-3.0.0.tgz", "integrity": "sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==", @@ -18721,7 +18791,59 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-redshift/node_modules/@aws-sdk/client-sso": { + "node_modules/@aws-sdk/client-redshift-serverless": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-redshift-serverless/-/client-redshift-serverless-3.693.0.tgz", + "integrity": "sha512-m6Bhw0Xx/x0KGKP9N7c+Jqs5VT6nkZbfwO+QTxllggsuNfAzGwluCw1hoY++/MQ9oFtioEu+ud7xWOlTIK8w/A==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/client-sso-oidc": "3.693.0", + "@aws-sdk/client-sts": "3.693.0", + "@aws-sdk/core": "3.693.0", + "@aws-sdk/credential-provider-node": "3.693.0", + "@aws-sdk/middleware-host-header": "3.693.0", + "@aws-sdk/middleware-logger": "3.693.0", + "@aws-sdk/middleware-recursion-detection": "3.693.0", + "@aws-sdk/middleware-user-agent": "3.693.0", + "@aws-sdk/region-config-resolver": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@aws-sdk/util-endpoints": "3.693.0", + "@aws-sdk/util-user-agent-browser": "3.693.0", + "@aws-sdk/util-user-agent-node": "3.693.0", + "@smithy/config-resolver": "^3.0.11", + "@smithy/core": "^2.5.2", + "@smithy/fetch-http-handler": "^4.1.0", + "@smithy/hash-node": "^3.0.9", + "@smithy/invalid-dependency": "^3.0.9", + "@smithy/middleware-content-length": "^3.0.11", + "@smithy/middleware-endpoint": "^3.2.2", + "@smithy/middleware-retry": "^3.0.26", + "@smithy/middleware-serde": "^3.0.9", + "@smithy/middleware-stack": "^3.0.9", + "@smithy/node-config-provider": "^3.1.10", + "@smithy/node-http-handler": "^3.3.0", + "@smithy/protocol-http": "^4.1.6", + "@smithy/smithy-client": "^3.4.3", + "@smithy/types": "^3.7.0", + "@smithy/url-parser": "^3.0.9", + "@smithy/util-base64": "^3.0.0", + "@smithy/util-body-length-browser": "^3.0.0", + "@smithy/util-body-length-node": "^3.0.0", + "@smithy/util-defaults-mode-browser": "^3.0.26", + "@smithy/util-defaults-mode-node": "^3.0.26", + "@smithy/util-endpoints": "^2.1.5", + "@smithy/util-middleware": "^3.0.9", + "@smithy/util-retry": "^3.0.9", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-redshift-serverless/node_modules/@aws-sdk/client-sso": { "version": "3.693.0", "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.693.0.tgz", "integrity": "sha512-QEynrBC26x6TG9ZMzApR/kZ3lmt4lEIs2D+cHuDxt6fDGzahBUsQFBwJqhizzsM97JJI5YvmJhmihoYjdSSaXA==", @@ -18770,7 +18892,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-redshift/node_modules/@aws-sdk/client-sso-oidc": { + "node_modules/@aws-sdk/client-redshift-serverless/node_modules/@aws-sdk/client-sso-oidc": { "version": "3.693.0", "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.693.0.tgz", "integrity": "sha512-UEDbYlYtK/e86OOMyFR4zEPyenIxDzO2DRdz3fwVW7RzZ94wfmSwBh/8skzPTuY1G7sI064cjHW0b0QG01Sdtg==", @@ -18823,7 +18945,7 @@ "@aws-sdk/client-sts": "^3.693.0" } }, - "node_modules/@aws-sdk/client-redshift/node_modules/@aws-sdk/client-sts": { + "node_modules/@aws-sdk/client-redshift-serverless/node_modules/@aws-sdk/client-sts": { "version": "3.693.0", "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.693.0.tgz", "integrity": "sha512-4S2y7VEtvdnjJX4JPl4kDQlslxXEZFnC50/UXVUYSt/AMc5A/GgspFNA5FVz4E3Gwpfobbf23hR2NBF8AGvYoQ==", @@ -18874,7 +18996,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-redshift/node_modules/@aws-sdk/core": { + "node_modules/@aws-sdk/client-redshift-serverless/node_modules/@aws-sdk/core": { "version": "3.693.0", "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.693.0.tgz", "integrity": "sha512-v6Z/kWmLFqRLDPEwl9hJGhtTgIFHjZugSfF1Yqffdxf4n1AWgtHS7qSegakuMyN5pP4K2tvUD8qHJ+gGe2Bw2A==", @@ -18896,7 +19018,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-redshift/node_modules/@aws-sdk/credential-provider-http": { + "node_modules/@aws-sdk/client-redshift-serverless/node_modules/@aws-sdk/credential-provider-http": { "version": "3.693.0", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.693.0.tgz", "integrity": "sha512-sL8MvwNJU7ZpD7/d2VVb3by1GknIJUxzTIgYtVkDVA/ojo+KRQSSHxcj0EWWXF5DTSh2Tm+LrEug3y1ZyKHsDA==", @@ -18917,7 +19039,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-redshift/node_modules/@aws-sdk/credential-provider-ini": { + "node_modules/@aws-sdk/client-redshift-serverless/node_modules/@aws-sdk/credential-provider-ini": { "version": "3.693.0", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.693.0.tgz", "integrity": "sha512-kvaa4mXhCCOuW7UQnBhYqYfgWmwy7WSBSDClutwSLPZvgrhYj2l16SD2lN4IfYdxARYMJJ1lFYp3/jJG/9Yk4Q==", @@ -18943,7 +19065,7 @@ "@aws-sdk/client-sts": "^3.693.0" } }, - "node_modules/@aws-sdk/client-redshift/node_modules/@aws-sdk/credential-provider-node": { + "node_modules/@aws-sdk/client-redshift-serverless/node_modules/@aws-sdk/credential-provider-node": { "version": "3.693.0", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.693.0.tgz", "integrity": "sha512-42WMsBjTNnjYxYuM3qD/Nq+8b7UdMopUq5OduMDxoM3mFTV6PXMMnfI4Z1TNnR4tYRvPXAnuNltF6xmjKbSJRA==", @@ -18966,7 +19088,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-redshift/node_modules/@aws-sdk/credential-provider-sso": { + "node_modules/@aws-sdk/client-redshift-serverless/node_modules/@aws-sdk/credential-provider-sso": { "version": "3.693.0", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.693.0.tgz", "integrity": "sha512-479UlJxY+BFjj3pJFYUNC0DCMrykuG7wBAXfsvZqQxKUa83DnH5Q1ID/N2hZLkxjGd4ZW0AC3lTOMxFelGzzpQ==", @@ -18985,7 +19107,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-redshift/node_modules/@aws-sdk/credential-provider-web-identity": { + "node_modules/@aws-sdk/client-redshift-serverless/node_modules/@aws-sdk/credential-provider-web-identity": { "version": "3.693.0", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.693.0.tgz", "integrity": "sha512-8LB210Pr6VeCiSb2hIra+sAH4KUBLyGaN50axHtIgufVK8jbKIctTZcVY5TO9Se+1107TsruzeXS7VeqVdJfFA==", @@ -19004,7 +19126,7 @@ "@aws-sdk/client-sts": "^3.693.0" } }, - "node_modules/@aws-sdk/client-redshift/node_modules/@aws-sdk/middleware-host-header": { + "node_modules/@aws-sdk/client-redshift-serverless/node_modules/@aws-sdk/middleware-host-header": { "version": "3.693.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.693.0.tgz", "integrity": "sha512-BCki6sAZ5jYwIN/t3ElCiwerHad69ipHwPsDCxJQyeiOnJ8HG+lEpnVIfrnI8A0fLQNSF3Gtx6ahfBpKiv1Oug==", @@ -19019,7 +19141,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-redshift/node_modules/@aws-sdk/middleware-logger": { + "node_modules/@aws-sdk/client-redshift-serverless/node_modules/@aws-sdk/middleware-logger": { "version": "3.693.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.693.0.tgz", "integrity": "sha512-dXnXDPr+wIiJ1TLADACI1g9pkSB21KkMIko2u4CJ2JCBoxi5IqeTnVoa6YcC8GdFNVRl+PorZ3Zqfmf1EOTC6w==", @@ -19033,7 +19155,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-redshift/node_modules/@aws-sdk/middleware-recursion-detection": { + "node_modules/@aws-sdk/client-redshift-serverless/node_modules/@aws-sdk/middleware-recursion-detection": { "version": "3.693.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.693.0.tgz", "integrity": "sha512-0LDmM+VxXp0u3rG0xQRWD/q6Ubi7G8I44tBPahevD5CaiDZTkmNTrVUf0VEJgVe0iCKBppACMBDkLB0/ETqkFw==", @@ -19048,7 +19170,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-redshift/node_modules/@aws-sdk/middleware-user-agent": { + "node_modules/@aws-sdk/client-redshift-serverless/node_modules/@aws-sdk/middleware-user-agent": { "version": "3.693.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.693.0.tgz", "integrity": "sha512-/KUq/KEpFFbQmNmpp7SpAtFAdViquDfD2W0QcG07zYBfz9MwE2ig48ALynXm5sMpRmnG7sJXjdvPtTsSVPfkiw==", @@ -19066,7 +19188,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-redshift/node_modules/@aws-sdk/region-config-resolver": { + "node_modules/@aws-sdk/client-redshift-serverless/node_modules/@aws-sdk/region-config-resolver": { "version": "3.693.0", "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.693.0.tgz", "integrity": "sha512-YLUkMsUY0GLW/nfwlZ69cy1u07EZRmsv8Z9m0qW317/EZaVx59hcvmcvb+W4bFqj5E8YImTjoGfE4cZ0F9mkyw==", @@ -19083,7 +19205,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-redshift/node_modules/@aws-sdk/token-providers": { + "node_modules/@aws-sdk/client-redshift-serverless/node_modules/@aws-sdk/token-providers": { "version": "3.693.0", "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.693.0.tgz", "integrity": "sha512-nDBTJMk1l/YmFULGfRbToOA2wjf+FkQT4dMgYCv+V9uSYsMzQj8A7Tha2dz9yv4vnQgYaEiErQ8d7HVyXcVEoA==", @@ -19102,7 +19224,7 @@ "@aws-sdk/client-sso-oidc": "^3.693.0" } }, - "node_modules/@aws-sdk/client-redshift/node_modules/@aws-sdk/util-endpoints": { + "node_modules/@aws-sdk/client-redshift-serverless/node_modules/@aws-sdk/util-endpoints": { "version": "3.693.0", "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.693.0.tgz", "integrity": "sha512-eo4F6DRQ/kxS3gxJpLRv+aDNy76DxQJL5B3DPzpr9Vkq0ygVoi4GT5oIZLVaAVIJmi6k5qq9dLsYZfWLUxJJSg==", @@ -19117,7 +19239,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-redshift/node_modules/@aws-sdk/util-user-agent-browser": { + "node_modules/@aws-sdk/client-redshift-serverless/node_modules/@aws-sdk/util-user-agent-browser": { "version": "3.693.0", "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.693.0.tgz", "integrity": "sha512-6EUfuKOujtddy18OLJUaXfKBgs+UcbZ6N/3QV4iOkubCUdeM1maIqs++B9bhCbWeaeF5ORizJw5FTwnyNjE/mw==", @@ -19129,7 +19251,7 @@ "tslib": "^2.6.2" } }, - "node_modules/@aws-sdk/client-redshift/node_modules/@aws-sdk/util-user-agent-node": { + "node_modules/@aws-sdk/client-redshift-serverless/node_modules/@aws-sdk/util-user-agent-node": { "version": "3.693.0", "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.693.0.tgz", "integrity": "sha512-td0OVX8m5ZKiXtecIDuzY3Y3UZIzvxEr57Hp21NOwieqKCG2UeyQWWeGPv0FQaU7dpTkvFmVNI+tx9iB8V/Nhg==", @@ -19153,7 +19275,7 @@ } } }, - "node_modules/@aws-sdk/client-redshift/node_modules/@smithy/is-array-buffer": { + "node_modules/@aws-sdk/client-redshift-serverless/node_modules/@smithy/is-array-buffer": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-3.0.0.tgz", "integrity": "sha512-+Fsu6Q6C4RSJiy81Y8eApjEB5gVtM+oFKTffg+jSuwtvomJJrhUJBu2zS8wjXSgH/g1MKEWrzyChTBe6clb5FQ==", @@ -19165,7 +19287,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-redshift/node_modules/@smithy/util-buffer-from": { + "node_modules/@aws-sdk/client-redshift-serverless/node_modules/@smithy/util-buffer-from": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-3.0.0.tgz", "integrity": "sha512-aEOHCgq5RWFbP+UDPvPot26EJHjOC+bRgse5A8V3FSShqd5E5UN4qc7zkwsvJPPAVsf73QwYcHN1/gt/rtLwQA==", @@ -19178,7 +19300,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-redshift/node_modules/@smithy/util-utf8": { + "node_modules/@aws-sdk/client-redshift-serverless/node_modules/@smithy/util-utf8": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-3.0.0.tgz", "integrity": "sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==", @@ -19191,45 +19313,29 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-s3": { + "node_modules/@aws-sdk/client-redshift/node_modules/@aws-sdk/client-sso": { "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.693.0.tgz", + "integrity": "sha512-QEynrBC26x6TG9ZMzApR/kZ3lmt4lEIs2D+cHuDxt6fDGzahBUsQFBwJqhizzsM97JJI5YvmJhmihoYjdSSaXA==", "license": "Apache-2.0", "dependencies": { - "@aws-crypto/sha1-browser": "5.2.0", "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.693.0", - "@aws-sdk/client-sts": "3.693.0", "@aws-sdk/core": "3.693.0", - "@aws-sdk/credential-provider-node": "3.693.0", - "@aws-sdk/middleware-bucket-endpoint": "3.693.0", - "@aws-sdk/middleware-expect-continue": "3.693.0", - "@aws-sdk/middleware-flexible-checksums": "3.693.0", "@aws-sdk/middleware-host-header": "3.693.0", - "@aws-sdk/middleware-location-constraint": "3.693.0", "@aws-sdk/middleware-logger": "3.693.0", "@aws-sdk/middleware-recursion-detection": "3.693.0", - "@aws-sdk/middleware-sdk-s3": "3.693.0", - "@aws-sdk/middleware-ssec": "3.693.0", "@aws-sdk/middleware-user-agent": "3.693.0", "@aws-sdk/region-config-resolver": "3.693.0", - "@aws-sdk/signature-v4-multi-region": "3.693.0", "@aws-sdk/types": "3.692.0", "@aws-sdk/util-endpoints": "3.693.0", "@aws-sdk/util-user-agent-browser": "3.693.0", "@aws-sdk/util-user-agent-node": "3.693.0", - "@aws-sdk/xml-builder": "3.693.0", "@smithy/config-resolver": "^3.0.11", "@smithy/core": "^2.5.2", - "@smithy/eventstream-serde-browser": "^3.0.12", - "@smithy/eventstream-serde-config-resolver": "^3.0.9", - "@smithy/eventstream-serde-node": "^3.0.11", "@smithy/fetch-http-handler": "^4.1.0", - "@smithy/hash-blob-browser": "^3.1.8", "@smithy/hash-node": "^3.0.9", - "@smithy/hash-stream-node": "^3.1.8", "@smithy/invalid-dependency": "^3.0.9", - "@smithy/md5-js": "^3.0.9", "@smithy/middleware-content-length": "^3.0.11", "@smithy/middleware-endpoint": "^3.2.2", "@smithy/middleware-retry": "^3.0.26", @@ -19249,622 +19355,755 @@ "@smithy/util-endpoints": "^2.1.5", "@smithy/util-middleware": "^3.0.9", "@smithy/util-retry": "^3.0.9", - "@smithy/util-stream": "^3.3.0", "@smithy/util-utf8": "^3.0.0", - "@smithy/util-waiter": "^3.1.8", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-s3-control": { - "version": "3.859.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3-control/-/client-s3-control-3.859.0.tgz", - "integrity": "sha512-vzhOtDH4BCdn30+Crg1QxGXbhZIh4Ia84/qNx2EtupkM2UrO6uaZ91qGl175QWU4TcG+mlf/yA/bvrwenhbF6w==", + "node_modules/@aws-sdk/client-redshift/node_modules/@aws-sdk/client-sso-oidc": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.693.0.tgz", + "integrity": "sha512-UEDbYlYtK/e86OOMyFR4zEPyenIxDzO2DRdz3fwVW7RzZ94wfmSwBh/8skzPTuY1G7sI064cjHW0b0QG01Sdtg==", + "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.858.0", - "@aws-sdk/credential-provider-node": "3.859.0", - "@aws-sdk/middleware-bucket-endpoint": "3.840.0", - "@aws-sdk/middleware-host-header": "3.840.0", - "@aws-sdk/middleware-logger": "3.840.0", - "@aws-sdk/middleware-recursion-detection": "3.840.0", - "@aws-sdk/middleware-sdk-s3-control": "3.848.0", - "@aws-sdk/middleware-user-agent": "3.858.0", - "@aws-sdk/region-config-resolver": "3.840.0", - "@aws-sdk/types": "3.840.0", - "@aws-sdk/util-endpoints": "3.848.0", - "@aws-sdk/util-user-agent-browser": "3.840.0", - "@aws-sdk/util-user-agent-node": "3.858.0", - "@aws-sdk/xml-builder": "3.821.0", - "@smithy/config-resolver": "^4.1.4", - "@smithy/core": "^3.7.2", - "@smithy/fetch-http-handler": "^5.1.0", - "@smithy/hash-blob-browser": "^4.0.4", - "@smithy/hash-node": "^4.0.4", - "@smithy/hash-stream-node": "^4.0.4", - "@smithy/invalid-dependency": "^4.0.4", - "@smithy/md5-js": "^4.0.4", - "@smithy/middleware-apply-body-checksum": "^4.1.2", - "@smithy/middleware-content-length": "^4.0.4", - "@smithy/middleware-endpoint": "^4.1.17", - "@smithy/middleware-retry": "^4.1.18", - "@smithy/middleware-serde": "^4.0.8", - "@smithy/middleware-stack": "^4.0.4", - "@smithy/node-config-provider": "^4.1.3", - "@smithy/node-http-handler": "^4.1.0", - "@smithy/protocol-http": "^5.1.2", - "@smithy/smithy-client": "^4.4.9", - "@smithy/types": "^4.3.1", - "@smithy/url-parser": "^4.0.4", - "@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.25", - "@smithy/util-defaults-mode-node": "^4.0.25", - "@smithy/util-endpoints": "^3.0.6", - "@smithy/util-middleware": "^4.0.4", - "@smithy/util-retry": "^4.0.6", - "@smithy/util-utf8": "^4.0.0", - "@types/uuid": "^9.0.1", - "tslib": "^2.6.2", - "uuid": "^9.0.1" + "@aws-sdk/core": "3.693.0", + "@aws-sdk/credential-provider-node": "3.693.0", + "@aws-sdk/middleware-host-header": "3.693.0", + "@aws-sdk/middleware-logger": "3.693.0", + "@aws-sdk/middleware-recursion-detection": "3.693.0", + "@aws-sdk/middleware-user-agent": "3.693.0", + "@aws-sdk/region-config-resolver": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@aws-sdk/util-endpoints": "3.693.0", + "@aws-sdk/util-user-agent-browser": "3.693.0", + "@aws-sdk/util-user-agent-node": "3.693.0", + "@smithy/config-resolver": "^3.0.11", + "@smithy/core": "^2.5.2", + "@smithy/fetch-http-handler": "^4.1.0", + "@smithy/hash-node": "^3.0.9", + "@smithy/invalid-dependency": "^3.0.9", + "@smithy/middleware-content-length": "^3.0.11", + "@smithy/middleware-endpoint": "^3.2.2", + "@smithy/middleware-retry": "^3.0.26", + "@smithy/middleware-serde": "^3.0.9", + "@smithy/middleware-stack": "^3.0.9", + "@smithy/node-config-provider": "^3.1.10", + "@smithy/node-http-handler": "^3.3.0", + "@smithy/protocol-http": "^4.1.6", + "@smithy/smithy-client": "^3.4.3", + "@smithy/types": "^3.7.0", + "@smithy/url-parser": "^3.0.9", + "@smithy/util-base64": "^3.0.0", + "@smithy/util-body-length-browser": "^3.0.0", + "@smithy/util-body-length-node": "^3.0.0", + "@smithy/util-defaults-mode-browser": "^3.0.26", + "@smithy/util-defaults-mode-node": "^3.0.26", + "@smithy/util-endpoints": "^2.1.5", + "@smithy/util-middleware": "^3.0.9", + "@smithy/util-retry": "^3.0.9", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sts": "^3.693.0" } }, - "node_modules/@aws-sdk/client-s3-control/node_modules/@aws-sdk/client-sso": { - "version": "3.858.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.858.0.tgz", - "integrity": "sha512-iXuZQs4KH6a3Pwnt0uORalzAZ5EXRPr3lBYAsdNwkP8OYyoUz5/TE3BLyw7ceEh0rj4QKGNnNALYo1cDm0EV8w==", + "node_modules/@aws-sdk/client-redshift/node_modules/@aws-sdk/client-sts": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.693.0.tgz", + "integrity": "sha512-4S2y7VEtvdnjJX4JPl4kDQlslxXEZFnC50/UXVUYSt/AMc5A/GgspFNA5FVz4E3Gwpfobbf23hR2NBF8AGvYoQ==", + "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.858.0", - "@aws-sdk/middleware-host-header": "3.840.0", - "@aws-sdk/middleware-logger": "3.840.0", - "@aws-sdk/middleware-recursion-detection": "3.840.0", - "@aws-sdk/middleware-user-agent": "3.858.0", - "@aws-sdk/region-config-resolver": "3.840.0", - "@aws-sdk/types": "3.840.0", - "@aws-sdk/util-endpoints": "3.848.0", - "@aws-sdk/util-user-agent-browser": "3.840.0", - "@aws-sdk/util-user-agent-node": "3.858.0", - "@smithy/config-resolver": "^4.1.4", - "@smithy/core": "^3.7.2", - "@smithy/fetch-http-handler": "^5.1.0", - "@smithy/hash-node": "^4.0.4", - "@smithy/invalid-dependency": "^4.0.4", - "@smithy/middleware-content-length": "^4.0.4", - "@smithy/middleware-endpoint": "^4.1.17", - "@smithy/middleware-retry": "^4.1.18", - "@smithy/middleware-serde": "^4.0.8", - "@smithy/middleware-stack": "^4.0.4", - "@smithy/node-config-provider": "^4.1.3", - "@smithy/node-http-handler": "^4.1.0", - "@smithy/protocol-http": "^5.1.2", - "@smithy/smithy-client": "^4.4.9", - "@smithy/types": "^4.3.1", - "@smithy/url-parser": "^4.0.4", - "@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.25", - "@smithy/util-defaults-mode-node": "^4.0.25", - "@smithy/util-endpoints": "^3.0.6", - "@smithy/util-middleware": "^4.0.4", - "@smithy/util-retry": "^4.0.6", - "@smithy/util-utf8": "^4.0.0", + "@aws-sdk/client-sso-oidc": "3.693.0", + "@aws-sdk/core": "3.693.0", + "@aws-sdk/credential-provider-node": "3.693.0", + "@aws-sdk/middleware-host-header": "3.693.0", + "@aws-sdk/middleware-logger": "3.693.0", + "@aws-sdk/middleware-recursion-detection": "3.693.0", + "@aws-sdk/middleware-user-agent": "3.693.0", + "@aws-sdk/region-config-resolver": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@aws-sdk/util-endpoints": "3.693.0", + "@aws-sdk/util-user-agent-browser": "3.693.0", + "@aws-sdk/util-user-agent-node": "3.693.0", + "@smithy/config-resolver": "^3.0.11", + "@smithy/core": "^2.5.2", + "@smithy/fetch-http-handler": "^4.1.0", + "@smithy/hash-node": "^3.0.9", + "@smithy/invalid-dependency": "^3.0.9", + "@smithy/middleware-content-length": "^3.0.11", + "@smithy/middleware-endpoint": "^3.2.2", + "@smithy/middleware-retry": "^3.0.26", + "@smithy/middleware-serde": "^3.0.9", + "@smithy/middleware-stack": "^3.0.9", + "@smithy/node-config-provider": "^3.1.10", + "@smithy/node-http-handler": "^3.3.0", + "@smithy/protocol-http": "^4.1.6", + "@smithy/smithy-client": "^3.4.3", + "@smithy/types": "^3.7.0", + "@smithy/url-parser": "^3.0.9", + "@smithy/util-base64": "^3.0.0", + "@smithy/util-body-length-browser": "^3.0.0", + "@smithy/util-body-length-node": "^3.0.0", + "@smithy/util-defaults-mode-browser": "^3.0.26", + "@smithy/util-defaults-mode-node": "^3.0.26", + "@smithy/util-endpoints": "^2.1.5", + "@smithy/util-middleware": "^3.0.9", + "@smithy/util-retry": "^3.0.9", + "@smithy/util-utf8": "^3.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-s3-control/node_modules/@aws-sdk/core": { - "version": "3.858.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.858.0.tgz", - "integrity": "sha512-iWm4QLAS+/XMlnecIU1Y33qbBr1Ju+pmWam3xVCPlY4CSptKpVY+2hXOnmg9SbHAX9C005fWhrIn51oDd00c9A==", + "node_modules/@aws-sdk/client-redshift/node_modules/@aws-sdk/core": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.693.0.tgz", + "integrity": "sha512-v6Z/kWmLFqRLDPEwl9hJGhtTgIFHjZugSfF1Yqffdxf4n1AWgtHS7qSegakuMyN5pP4K2tvUD8qHJ+gGe2Bw2A==", + "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.840.0", - "@aws-sdk/xml-builder": "3.821.0", - "@smithy/core": "^3.7.2", - "@smithy/node-config-provider": "^4.1.3", - "@smithy/property-provider": "^4.0.4", - "@smithy/protocol-http": "^5.1.2", - "@smithy/signature-v4": "^5.1.2", - "@smithy/smithy-client": "^4.4.9", - "@smithy/types": "^4.3.1", - "@smithy/util-base64": "^4.0.0", - "@smithy/util-body-length-browser": "^4.0.0", - "@smithy/util-middleware": "^4.0.4", - "@smithy/util-utf8": "^4.0.0", - "fast-xml-parser": "5.2.5", + "@aws-sdk/types": "3.692.0", + "@smithy/core": "^2.5.2", + "@smithy/node-config-provider": "^3.1.10", + "@smithy/property-provider": "^3.1.9", + "@smithy/protocol-http": "^4.1.6", + "@smithy/signature-v4": "^4.2.2", + "@smithy/smithy-client": "^3.4.3", + "@smithy/types": "^3.7.0", + "@smithy/util-middleware": "^3.0.9", + "fast-xml-parser": "4.4.1", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-s3-control/node_modules/@aws-sdk/credential-provider-env": { - "version": "3.858.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.858.0.tgz", - "integrity": "sha512-kZsGyh2BoSRguzlcGtzdLhw/l/n3KYAC+/l/H0SlsOq3RLHF6tO/cRdsLnwoix2bObChHUp03cex63o1gzdx/Q==", + "node_modules/@aws-sdk/client-redshift/node_modules/@aws-sdk/credential-provider-http": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.693.0.tgz", + "integrity": "sha512-sL8MvwNJU7ZpD7/d2VVb3by1GknIJUxzTIgYtVkDVA/ojo+KRQSSHxcj0EWWXF5DTSh2Tm+LrEug3y1ZyKHsDA==", + "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.858.0", - "@aws-sdk/types": "3.840.0", - "@smithy/property-provider": "^4.0.4", - "@smithy/types": "^4.3.1", + "@aws-sdk/core": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@smithy/fetch-http-handler": "^4.1.0", + "@smithy/node-http-handler": "^3.3.0", + "@smithy/property-provider": "^3.1.9", + "@smithy/protocol-http": "^4.1.6", + "@smithy/smithy-client": "^3.4.3", + "@smithy/types": "^3.7.0", + "@smithy/util-stream": "^3.3.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-s3-control/node_modules/@aws-sdk/credential-provider-http": { - "version": "3.858.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.858.0.tgz", - "integrity": "sha512-GDnfYl3+NPJQ7WQQYOXEA489B212NinpcIDD7rpsB6IWUPo8yDjT5NceK4uUkIR3MFpNCGt9zd/z6NNLdB2fuQ==", + "node_modules/@aws-sdk/client-redshift/node_modules/@aws-sdk/credential-provider-ini": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.693.0.tgz", + "integrity": "sha512-kvaa4mXhCCOuW7UQnBhYqYfgWmwy7WSBSDClutwSLPZvgrhYj2l16SD2lN4IfYdxARYMJJ1lFYp3/jJG/9Yk4Q==", + "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.858.0", - "@aws-sdk/types": "3.840.0", - "@smithy/fetch-http-handler": "^5.1.0", - "@smithy/node-http-handler": "^4.1.0", - "@smithy/property-provider": "^4.0.4", - "@smithy/protocol-http": "^5.1.2", - "@smithy/smithy-client": "^4.4.9", - "@smithy/types": "^4.3.1", - "@smithy/util-stream": "^4.2.3", + "@aws-sdk/core": "3.693.0", + "@aws-sdk/credential-provider-env": "3.693.0", + "@aws-sdk/credential-provider-http": "3.693.0", + "@aws-sdk/credential-provider-process": "3.693.0", + "@aws-sdk/credential-provider-sso": "3.693.0", + "@aws-sdk/credential-provider-web-identity": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@smithy/credential-provider-imds": "^3.2.6", + "@smithy/property-provider": "^3.1.9", + "@smithy/shared-ini-file-loader": "^3.1.10", + "@smithy/types": "^3.7.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sts": "^3.693.0" } }, - "node_modules/@aws-sdk/client-s3-control/node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.859.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.859.0.tgz", - "integrity": "sha512-KsccE1T88ZDNhsABnqbQj014n5JMDilAroUErFbGqu5/B3sXqUsYmG54C/BjvGTRUFfzyttK9lB9P9h6ddQ8Cw==", + "node_modules/@aws-sdk/client-redshift/node_modules/@aws-sdk/credential-provider-node": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.693.0.tgz", + "integrity": "sha512-42WMsBjTNnjYxYuM3qD/Nq+8b7UdMopUq5OduMDxoM3mFTV6PXMMnfI4Z1TNnR4tYRvPXAnuNltF6xmjKbSJRA==", + "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.858.0", - "@aws-sdk/credential-provider-env": "3.858.0", - "@aws-sdk/credential-provider-http": "3.858.0", - "@aws-sdk/credential-provider-process": "3.858.0", - "@aws-sdk/credential-provider-sso": "3.859.0", - "@aws-sdk/credential-provider-web-identity": "3.858.0", - "@aws-sdk/nested-clients": "3.858.0", - "@aws-sdk/types": "3.840.0", - "@smithy/credential-provider-imds": "^4.0.6", - "@smithy/property-provider": "^4.0.4", - "@smithy/shared-ini-file-loader": "^4.0.4", - "@smithy/types": "^4.3.1", + "@aws-sdk/credential-provider-env": "3.693.0", + "@aws-sdk/credential-provider-http": "3.693.0", + "@aws-sdk/credential-provider-ini": "3.693.0", + "@aws-sdk/credential-provider-process": "3.693.0", + "@aws-sdk/credential-provider-sso": "3.693.0", + "@aws-sdk/credential-provider-web-identity": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@smithy/credential-provider-imds": "^3.2.6", + "@smithy/property-provider": "^3.1.9", + "@smithy/shared-ini-file-loader": "^3.1.10", + "@smithy/types": "^3.7.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-s3-control/node_modules/@aws-sdk/credential-provider-node": { - "version": "3.859.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.859.0.tgz", - "integrity": "sha512-ZRDB2xU5aSyTR/jDcli30tlycu6RFvQngkZhBs9Zoh2BiYXrfh2MMuoYuZk+7uD6D53Q2RIEldDHR9A/TPlRuA==", + "node_modules/@aws-sdk/client-redshift/node_modules/@aws-sdk/credential-provider-sso": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.693.0.tgz", + "integrity": "sha512-479UlJxY+BFjj3pJFYUNC0DCMrykuG7wBAXfsvZqQxKUa83DnH5Q1ID/N2hZLkxjGd4ZW0AC3lTOMxFelGzzpQ==", + "license": "Apache-2.0", "dependencies": { - "@aws-sdk/credential-provider-env": "3.858.0", - "@aws-sdk/credential-provider-http": "3.858.0", - "@aws-sdk/credential-provider-ini": "3.859.0", - "@aws-sdk/credential-provider-process": "3.858.0", - "@aws-sdk/credential-provider-sso": "3.859.0", - "@aws-sdk/credential-provider-web-identity": "3.858.0", - "@aws-sdk/types": "3.840.0", - "@smithy/credential-provider-imds": "^4.0.6", - "@smithy/property-provider": "^4.0.4", - "@smithy/shared-ini-file-loader": "^4.0.4", - "@smithy/types": "^4.3.1", + "@aws-sdk/client-sso": "3.693.0", + "@aws-sdk/core": "3.693.0", + "@aws-sdk/token-providers": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@smithy/property-provider": "^3.1.9", + "@smithy/shared-ini-file-loader": "^3.1.10", + "@smithy/types": "^3.7.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-s3-control/node_modules/@aws-sdk/credential-provider-process": { - "version": "3.858.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.858.0.tgz", - "integrity": "sha512-l5LJWZJMRaZ+LhDjtupFUKEC5hAjgvCRrOvV5T60NCUBOy0Ozxa7Sgx3x+EOwiruuoh3Cn9O+RlbQlJX6IfZIw==", + "node_modules/@aws-sdk/client-redshift/node_modules/@aws-sdk/credential-provider-web-identity": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.693.0.tgz", + "integrity": "sha512-8LB210Pr6VeCiSb2hIra+sAH4KUBLyGaN50axHtIgufVK8jbKIctTZcVY5TO9Se+1107TsruzeXS7VeqVdJfFA==", + "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.858.0", - "@aws-sdk/types": "3.840.0", - "@smithy/property-provider": "^4.0.4", - "@smithy/shared-ini-file-loader": "^4.0.4", - "@smithy/types": "^4.3.1", + "@aws-sdk/core": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@smithy/property-provider": "^3.1.9", + "@smithy/types": "^3.7.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sts": "^3.693.0" } }, - "node_modules/@aws-sdk/client-s3-control/node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.859.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.859.0.tgz", - "integrity": "sha512-BwAqmWIivhox5YlFRjManFF8GoTvEySPk6vsJNxDsmGsabY+OQovYxFIYxRCYiHzH7SFjd4Lcd+riJOiXNsvRw==", + "node_modules/@aws-sdk/client-redshift/node_modules/@aws-sdk/middleware-host-header": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.693.0.tgz", + "integrity": "sha512-BCki6sAZ5jYwIN/t3ElCiwerHad69ipHwPsDCxJQyeiOnJ8HG+lEpnVIfrnI8A0fLQNSF3Gtx6ahfBpKiv1Oug==", + "license": "Apache-2.0", "dependencies": { - "@aws-sdk/client-sso": "3.858.0", - "@aws-sdk/core": "3.858.0", - "@aws-sdk/token-providers": "3.859.0", - "@aws-sdk/types": "3.840.0", - "@smithy/property-provider": "^4.0.4", - "@smithy/shared-ini-file-loader": "^4.0.4", - "@smithy/types": "^4.3.1", + "@aws-sdk/types": "3.692.0", + "@smithy/protocol-http": "^4.1.6", + "@smithy/types": "^3.7.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-s3-control/node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.858.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.858.0.tgz", - "integrity": "sha512-8iULWsH83iZDdUuiDsRb83M0NqIlXjlDbJUIddVsIrfWp4NmanKw77SV6yOZ66nuJjPsn9j7RDb9bfEPCy5SWA==", + "node_modules/@aws-sdk/client-redshift/node_modules/@aws-sdk/middleware-logger": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.693.0.tgz", + "integrity": "sha512-dXnXDPr+wIiJ1TLADACI1g9pkSB21KkMIko2u4CJ2JCBoxi5IqeTnVoa6YcC8GdFNVRl+PorZ3Zqfmf1EOTC6w==", + "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.858.0", - "@aws-sdk/nested-clients": "3.858.0", - "@aws-sdk/types": "3.840.0", - "@smithy/property-provider": "^4.0.4", - "@smithy/types": "^4.3.1", + "@aws-sdk/types": "3.692.0", + "@smithy/types": "^3.7.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-s3-control/node_modules/@aws-sdk/middleware-bucket-endpoint": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.840.0.tgz", - "integrity": "sha512-+gkQNtPwcSMmlwBHFd4saVVS11In6ID1HczNzpM3MXKXRBfSlbZJbCt6wN//AZ8HMklZEik4tcEOG0qa9UY8SQ==", + "node_modules/@aws-sdk/client-redshift/node_modules/@aws-sdk/middleware-recursion-detection": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.693.0.tgz", + "integrity": "sha512-0LDmM+VxXp0u3rG0xQRWD/q6Ubi7G8I44tBPahevD5CaiDZTkmNTrVUf0VEJgVe0iCKBppACMBDkLB0/ETqkFw==", + "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.840.0", - "@aws-sdk/util-arn-parser": "3.804.0", - "@smithy/node-config-provider": "^4.1.3", - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", - "@smithy/util-config-provider": "^4.0.0", + "@aws-sdk/types": "3.692.0", + "@smithy/protocol-http": "^4.1.6", + "@smithy/types": "^3.7.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-s3-control/node_modules/@aws-sdk/middleware-host-header": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.840.0.tgz", - "integrity": "sha512-ub+hXJAbAje94+Ya6c6eL7sYujoE8D4Bumu1NUI8TXjUhVVn0HzVWQjpRLshdLsUp1AW7XyeJaxyajRaJQ8+Xg==", + "node_modules/@aws-sdk/client-redshift/node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.693.0.tgz", + "integrity": "sha512-/KUq/KEpFFbQmNmpp7SpAtFAdViquDfD2W0QcG07zYBfz9MwE2ig48ALynXm5sMpRmnG7sJXjdvPtTsSVPfkiw==", + "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.840.0", - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", + "@aws-sdk/core": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@aws-sdk/util-endpoints": "3.693.0", + "@smithy/core": "^2.5.2", + "@smithy/protocol-http": "^4.1.6", + "@smithy/types": "^3.7.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-s3-control/node_modules/@aws-sdk/middleware-logger": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.840.0.tgz", - "integrity": "sha512-lSV8FvjpdllpGaRspywss4CtXV8M7NNNH+2/j86vMH+YCOZ6fu2T/TyFd/tHwZ92vDfHctWkRbQxg0bagqwovA==", + "node_modules/@aws-sdk/client-redshift/node_modules/@aws-sdk/region-config-resolver": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.693.0.tgz", + "integrity": "sha512-YLUkMsUY0GLW/nfwlZ69cy1u07EZRmsv8Z9m0qW317/EZaVx59hcvmcvb+W4bFqj5E8YImTjoGfE4cZ0F9mkyw==", + "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.840.0", - "@smithy/types": "^4.3.1", + "@aws-sdk/types": "3.692.0", + "@smithy/node-config-provider": "^3.1.10", + "@smithy/types": "^3.7.0", + "@smithy/util-config-provider": "^3.0.0", + "@smithy/util-middleware": "^3.0.9", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-s3-control/node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.840.0.tgz", - "integrity": "sha512-Gu7lGDyfddyhIkj1Z1JtrY5NHb5+x/CRiB87GjaSrKxkDaydtX2CU977JIABtt69l9wLbcGDIQ+W0uJ5xPof7g==", + "node_modules/@aws-sdk/client-redshift/node_modules/@aws-sdk/token-providers": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.693.0.tgz", + "integrity": "sha512-nDBTJMk1l/YmFULGfRbToOA2wjf+FkQT4dMgYCv+V9uSYsMzQj8A7Tha2dz9yv4vnQgYaEiErQ8d7HVyXcVEoA==", + "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.840.0", - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", + "@aws-sdk/types": "3.692.0", + "@smithy/property-provider": "^3.1.9", + "@smithy/shared-ini-file-loader": "^3.1.10", + "@smithy/types": "^3.7.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/client-s3-control/node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.858.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.858.0.tgz", - "integrity": "sha512-pC3FT/sRZ6n5NyXiTVu9dpf1D9j3YbJz3XmeOOwJqO/Mib2PZyIQktvNMPgwaC5KMVB1zWqS5bmCwxpMOnq0UQ==", - "dependencies": { - "@aws-sdk/core": "3.858.0", - "@aws-sdk/types": "3.840.0", - "@aws-sdk/util-endpoints": "3.848.0", - "@smithy/core": "^3.7.2", - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", - "tslib": "^2.6.2" + "node": ">=16.0.0" }, - "engines": { - "node": ">=18.0.0" + "peerDependencies": { + "@aws-sdk/client-sso-oidc": "^3.693.0" } }, - "node_modules/@aws-sdk/client-s3-control/node_modules/@aws-sdk/nested-clients": { - "version": "3.858.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.858.0.tgz", - "integrity": "sha512-ChdIj80T2whoWbovmO7o8ICmhEB2S9q4Jes9MBnKAPm69PexcJAK2dQC8yI4/iUP8b3+BHZoUPrYLWjBxIProQ==", + "node_modules/@aws-sdk/client-redshift/node_modules/@aws-sdk/util-endpoints": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.693.0.tgz", + "integrity": "sha512-eo4F6DRQ/kxS3gxJpLRv+aDNy76DxQJL5B3DPzpr9Vkq0ygVoi4GT5oIZLVaAVIJmi6k5qq9dLsYZfWLUxJJSg==", + "license": "Apache-2.0", "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.858.0", - "@aws-sdk/middleware-host-header": "3.840.0", - "@aws-sdk/middleware-logger": "3.840.0", - "@aws-sdk/middleware-recursion-detection": "3.840.0", - "@aws-sdk/middleware-user-agent": "3.858.0", - "@aws-sdk/region-config-resolver": "3.840.0", - "@aws-sdk/types": "3.840.0", - "@aws-sdk/util-endpoints": "3.848.0", - "@aws-sdk/util-user-agent-browser": "3.840.0", - "@aws-sdk/util-user-agent-node": "3.858.0", - "@smithy/config-resolver": "^4.1.4", - "@smithy/core": "^3.7.2", - "@smithy/fetch-http-handler": "^5.1.0", - "@smithy/hash-node": "^4.0.4", - "@smithy/invalid-dependency": "^4.0.4", - "@smithy/middleware-content-length": "^4.0.4", - "@smithy/middleware-endpoint": "^4.1.17", - "@smithy/middleware-retry": "^4.1.18", - "@smithy/middleware-serde": "^4.0.8", - "@smithy/middleware-stack": "^4.0.4", - "@smithy/node-config-provider": "^4.1.3", - "@smithy/node-http-handler": "^4.1.0", - "@smithy/protocol-http": "^5.1.2", - "@smithy/smithy-client": "^4.4.9", - "@smithy/types": "^4.3.1", - "@smithy/url-parser": "^4.0.4", - "@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.25", - "@smithy/util-defaults-mode-node": "^4.0.25", - "@smithy/util-endpoints": "^3.0.6", - "@smithy/util-middleware": "^4.0.4", - "@smithy/util-retry": "^4.0.6", - "@smithy/util-utf8": "^4.0.0", + "@aws-sdk/types": "3.692.0", + "@smithy/types": "^3.7.0", + "@smithy/util-endpoints": "^2.1.5", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-s3-control/node_modules/@aws-sdk/region-config-resolver": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.840.0.tgz", - "integrity": "sha512-Qjnxd/yDv9KpIMWr90ZDPtRj0v75AqGC92Lm9+oHXZ8p1MjG5JE2CW0HL8JRgK9iKzgKBL7pPQRXI8FkvEVfrA==", + "node_modules/@aws-sdk/client-redshift/node_modules/@aws-sdk/util-user-agent-browser": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.693.0.tgz", + "integrity": "sha512-6EUfuKOujtddy18OLJUaXfKBgs+UcbZ6N/3QV4iOkubCUdeM1maIqs++B9bhCbWeaeF5ORizJw5FTwnyNjE/mw==", + "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.840.0", - "@smithy/node-config-provider": "^4.1.3", - "@smithy/types": "^4.3.1", - "@smithy/util-config-provider": "^4.0.0", - "@smithy/util-middleware": "^4.0.4", + "@aws-sdk/types": "3.692.0", + "@smithy/types": "^3.7.0", + "bowser": "^2.11.0", "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-s3-control/node_modules/@aws-sdk/token-providers": { - "version": "3.859.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.859.0.tgz", - "integrity": "sha512-6P2wlvm9KBWOvRNn0Pt8RntnXg8fzOb5kEShvWsOsAocZeqKNaYbihum5/Onq1ZPoVtkdb++8eWDocDnM4k85Q==", + "node_modules/@aws-sdk/client-redshift/node_modules/@aws-sdk/util-user-agent-node": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.693.0.tgz", + "integrity": "sha512-td0OVX8m5ZKiXtecIDuzY3Y3UZIzvxEr57Hp21NOwieqKCG2UeyQWWeGPv0FQaU7dpTkvFmVNI+tx9iB8V/Nhg==", + "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.858.0", - "@aws-sdk/nested-clients": "3.858.0", - "@aws-sdk/types": "3.840.0", - "@smithy/property-provider": "^4.0.4", - "@smithy/shared-ini-file-loader": "^4.0.4", - "@smithy/types": "^4.3.1", + "@aws-sdk/middleware-user-agent": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@smithy/node-config-provider": "^3.1.10", + "@smithy/types": "^3.7.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" + }, + "peerDependencies": { + "aws-crt": ">=1.0.0" + }, + "peerDependenciesMeta": { + "aws-crt": { + "optional": true + } } }, - "node_modules/@aws-sdk/client-s3-control/node_modules/@aws-sdk/types": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.840.0.tgz", - "integrity": "sha512-xliuHaUFZxEx1NSXeLLZ9Dyu6+EJVQKEoD+yM+zqUo3YDZ7medKJWY6fIOKiPX/N7XbLdBYwajb15Q7IL8KkeA==", + "node_modules/@aws-sdk/client-redshift/node_modules/@smithy/is-array-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-3.0.0.tgz", + "integrity": "sha512-+Fsu6Q6C4RSJiy81Y8eApjEB5gVtM+oFKTffg+jSuwtvomJJrhUJBu2zS8wjXSgH/g1MKEWrzyChTBe6clb5FQ==", + "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-s3-control/node_modules/@aws-sdk/util-arn-parser": { - "version": "3.804.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.804.0.tgz", - "integrity": "sha512-wmBJqn1DRXnZu3b4EkE6CWnoWMo1ZMvlfkqU5zPz67xx1GMaXlDCchFvKAXMjk4jn/L1O3tKnoFDNsoLV1kgNQ==", + "node_modules/@aws-sdk/client-redshift/node_modules/@smithy/util-buffer-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-3.0.0.tgz", + "integrity": "sha512-aEOHCgq5RWFbP+UDPvPot26EJHjOC+bRgse5A8V3FSShqd5E5UN4qc7zkwsvJPPAVsf73QwYcHN1/gt/rtLwQA==", + "license": "Apache-2.0", "dependencies": { + "@smithy/is-array-buffer": "^3.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-s3-control/node_modules/@aws-sdk/util-endpoints": { - "version": "3.848.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.848.0.tgz", - "integrity": "sha512-fY/NuFFCq/78liHvRyFKr+aqq1aA/uuVSANjzr5Ym8c+9Z3HRPE9OrExAHoMrZ6zC8tHerQwlsXYYH5XZ7H+ww==", + "node_modules/@aws-sdk/client-redshift/node_modules/@smithy/util-utf8": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-3.0.0.tgz", + "integrity": "sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==", + "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.840.0", - "@smithy/types": "^4.3.1", - "@smithy/url-parser": "^4.0.4", - "@smithy/util-endpoints": "^3.0.6", + "@smithy/util-buffer-from": "^3.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-s3-control/node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.840.0.tgz", - "integrity": "sha512-JdyZM3EhhL4PqwFpttZu1afDpPJCCc3eyZOLi+srpX11LsGj6sThf47TYQN75HT1CarZ7cCdQHGzP2uy3/xHfQ==", + "node_modules/@aws-sdk/client-s3": { + "version": "3.693.0", + "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.840.0", - "@smithy/types": "^4.3.1", - "bowser": "^2.11.0", + "@aws-crypto/sha1-browser": "5.2.0", + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/client-sso-oidc": "3.693.0", + "@aws-sdk/client-sts": "3.693.0", + "@aws-sdk/core": "3.693.0", + "@aws-sdk/credential-provider-node": "3.693.0", + "@aws-sdk/middleware-bucket-endpoint": "3.693.0", + "@aws-sdk/middleware-expect-continue": "3.693.0", + "@aws-sdk/middleware-flexible-checksums": "3.693.0", + "@aws-sdk/middleware-host-header": "3.693.0", + "@aws-sdk/middleware-location-constraint": "3.693.0", + "@aws-sdk/middleware-logger": "3.693.0", + "@aws-sdk/middleware-recursion-detection": "3.693.0", + "@aws-sdk/middleware-sdk-s3": "3.693.0", + "@aws-sdk/middleware-ssec": "3.693.0", + "@aws-sdk/middleware-user-agent": "3.693.0", + "@aws-sdk/region-config-resolver": "3.693.0", + "@aws-sdk/signature-v4-multi-region": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@aws-sdk/util-endpoints": "3.693.0", + "@aws-sdk/util-user-agent-browser": "3.693.0", + "@aws-sdk/util-user-agent-node": "3.693.0", + "@aws-sdk/xml-builder": "3.693.0", + "@smithy/config-resolver": "^3.0.11", + "@smithy/core": "^2.5.2", + "@smithy/eventstream-serde-browser": "^3.0.12", + "@smithy/eventstream-serde-config-resolver": "^3.0.9", + "@smithy/eventstream-serde-node": "^3.0.11", + "@smithy/fetch-http-handler": "^4.1.0", + "@smithy/hash-blob-browser": "^3.1.8", + "@smithy/hash-node": "^3.0.9", + "@smithy/hash-stream-node": "^3.1.8", + "@smithy/invalid-dependency": "^3.0.9", + "@smithy/md5-js": "^3.0.9", + "@smithy/middleware-content-length": "^3.0.11", + "@smithy/middleware-endpoint": "^3.2.2", + "@smithy/middleware-retry": "^3.0.26", + "@smithy/middleware-serde": "^3.0.9", + "@smithy/middleware-stack": "^3.0.9", + "@smithy/node-config-provider": "^3.1.10", + "@smithy/node-http-handler": "^3.3.0", + "@smithy/protocol-http": "^4.1.6", + "@smithy/smithy-client": "^3.4.3", + "@smithy/types": "^3.7.0", + "@smithy/url-parser": "^3.0.9", + "@smithy/util-base64": "^3.0.0", + "@smithy/util-body-length-browser": "^3.0.0", + "@smithy/util-body-length-node": "^3.0.0", + "@smithy/util-defaults-mode-browser": "^3.0.26", + "@smithy/util-defaults-mode-node": "^3.0.26", + "@smithy/util-endpoints": "^2.1.5", + "@smithy/util-middleware": "^3.0.9", + "@smithy/util-retry": "^3.0.9", + "@smithy/util-stream": "^3.3.0", + "@smithy/util-utf8": "^3.0.0", + "@smithy/util-waiter": "^3.1.8", "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-s3-control/node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.858.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.858.0.tgz", - "integrity": "sha512-T1m05QlN8hFpx5/5duMjS8uFSK5e6EXP45HQRkZULVkL3DK+jMaxsnh3KLl5LjUoHn/19M4HM0wNUBhYp4Y2Yw==", + "node_modules/@aws-sdk/client-s3-control": { + "version": "3.859.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3-control/-/client-s3-control-3.859.0.tgz", + "integrity": "sha512-vzhOtDH4BCdn30+Crg1QxGXbhZIh4Ia84/qNx2EtupkM2UrO6uaZ91qGl175QWU4TcG+mlf/yA/bvrwenhbF6w==", "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.858.0", + "@aws-sdk/credential-provider-node": "3.859.0", + "@aws-sdk/middleware-bucket-endpoint": "3.840.0", + "@aws-sdk/middleware-host-header": "3.840.0", + "@aws-sdk/middleware-logger": "3.840.0", + "@aws-sdk/middleware-recursion-detection": "3.840.0", + "@aws-sdk/middleware-sdk-s3-control": "3.848.0", "@aws-sdk/middleware-user-agent": "3.858.0", + "@aws-sdk/region-config-resolver": "3.840.0", "@aws-sdk/types": "3.840.0", + "@aws-sdk/util-endpoints": "3.848.0", + "@aws-sdk/util-user-agent-browser": "3.840.0", + "@aws-sdk/util-user-agent-node": "3.858.0", + "@aws-sdk/xml-builder": "3.821.0", + "@smithy/config-resolver": "^4.1.4", + "@smithy/core": "^3.7.2", + "@smithy/fetch-http-handler": "^5.1.0", + "@smithy/hash-blob-browser": "^4.0.4", + "@smithy/hash-node": "^4.0.4", + "@smithy/hash-stream-node": "^4.0.4", + "@smithy/invalid-dependency": "^4.0.4", + "@smithy/md5-js": "^4.0.4", + "@smithy/middleware-apply-body-checksum": "^4.1.2", + "@smithy/middleware-content-length": "^4.0.4", + "@smithy/middleware-endpoint": "^4.1.17", + "@smithy/middleware-retry": "^4.1.18", + "@smithy/middleware-serde": "^4.0.8", + "@smithy/middleware-stack": "^4.0.4", "@smithy/node-config-provider": "^4.1.3", + "@smithy/node-http-handler": "^4.1.0", + "@smithy/protocol-http": "^5.1.2", + "@smithy/smithy-client": "^4.4.9", "@smithy/types": "^4.3.1", - "tslib": "^2.6.2" + "@smithy/url-parser": "^4.0.4", + "@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.25", + "@smithy/util-defaults-mode-node": "^4.0.25", + "@smithy/util-endpoints": "^3.0.6", + "@smithy/util-middleware": "^4.0.4", + "@smithy/util-retry": "^4.0.6", + "@smithy/util-utf8": "^4.0.0", + "@types/uuid": "^9.0.1", + "tslib": "^2.6.2", + "uuid": "^9.0.1" }, "engines": { "node": ">=18.0.0" - }, - "peerDependencies": { - "aws-crt": ">=1.0.0" - }, - "peerDependenciesMeta": { - "aws-crt": { - "optional": true - } } }, - "node_modules/@aws-sdk/client-s3-control/node_modules/@aws-sdk/xml-builder": { - "version": "3.821.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.821.0.tgz", - "integrity": "sha512-DIIotRnefVL6DiaHtO6/21DhJ4JZnnIwdNbpwiAhdt/AVbttcE4yw925gsjur0OGv5BTYXQXU3YnANBYnZjuQA==", + "node_modules/@aws-sdk/client-s3-control/node_modules/@aws-sdk/client-sso": { + "version": "3.858.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.858.0.tgz", + "integrity": "sha512-iXuZQs4KH6a3Pwnt0uORalzAZ5EXRPr3lBYAsdNwkP8OYyoUz5/TE3BLyw7ceEh0rj4QKGNnNALYo1cDm0EV8w==", "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.858.0", + "@aws-sdk/middleware-host-header": "3.840.0", + "@aws-sdk/middleware-logger": "3.840.0", + "@aws-sdk/middleware-recursion-detection": "3.840.0", + "@aws-sdk/middleware-user-agent": "3.858.0", + "@aws-sdk/region-config-resolver": "3.840.0", + "@aws-sdk/types": "3.840.0", + "@aws-sdk/util-endpoints": "3.848.0", + "@aws-sdk/util-user-agent-browser": "3.840.0", + "@aws-sdk/util-user-agent-node": "3.858.0", + "@smithy/config-resolver": "^4.1.4", + "@smithy/core": "^3.7.2", + "@smithy/fetch-http-handler": "^5.1.0", + "@smithy/hash-node": "^4.0.4", + "@smithy/invalid-dependency": "^4.0.4", + "@smithy/middleware-content-length": "^4.0.4", + "@smithy/middleware-endpoint": "^4.1.17", + "@smithy/middleware-retry": "^4.1.18", + "@smithy/middleware-serde": "^4.0.8", + "@smithy/middleware-stack": "^4.0.4", + "@smithy/node-config-provider": "^4.1.3", + "@smithy/node-http-handler": "^4.1.0", + "@smithy/protocol-http": "^5.1.2", + "@smithy/smithy-client": "^4.4.9", "@smithy/types": "^4.3.1", + "@smithy/url-parser": "^4.0.4", + "@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.25", + "@smithy/util-defaults-mode-node": "^4.0.25", + "@smithy/util-endpoints": "^3.0.6", + "@smithy/util-middleware": "^4.0.4", + "@smithy/util-retry": "^4.0.6", + "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/abort-controller": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.0.4.tgz", - "integrity": "sha512-gJnEjZMvigPDQWHrW3oPrFhQtkrgqBkyjj3pCIdF3A5M6vsZODG93KNlfJprv6bp4245bdT32fsHK4kkH3KYDA==", + "node_modules/@aws-sdk/client-s3-control/node_modules/@aws-sdk/core": { + "version": "3.858.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.858.0.tgz", + "integrity": "sha512-iWm4QLAS+/XMlnecIU1Y33qbBr1Ju+pmWam3xVCPlY4CSptKpVY+2hXOnmg9SbHAX9C005fWhrIn51oDd00c9A==", "dependencies": { + "@aws-sdk/types": "3.840.0", + "@aws-sdk/xml-builder": "3.821.0", + "@smithy/core": "^3.7.2", + "@smithy/node-config-provider": "^4.1.3", + "@smithy/property-provider": "^4.0.4", + "@smithy/protocol-http": "^5.1.2", + "@smithy/signature-v4": "^5.1.2", + "@smithy/smithy-client": "^4.4.9", "@smithy/types": "^4.3.1", + "@smithy/util-base64": "^4.0.0", + "@smithy/util-body-length-browser": "^4.0.0", + "@smithy/util-middleware": "^4.0.4", + "@smithy/util-utf8": "^4.0.0", + "fast-xml-parser": "5.2.5", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/chunked-blob-reader": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader/-/chunked-blob-reader-5.0.0.tgz", - "integrity": "sha512-+sKqDBQqb036hh4NPaUiEkYFkTUGYzRsn3EuFhyfQfMy6oGHEUJDurLP9Ufb5dasr/XiAmPNMr6wa9afjQB+Gw==", + "node_modules/@aws-sdk/client-s3-control/node_modules/@aws-sdk/credential-provider-env": { + "version": "3.858.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.858.0.tgz", + "integrity": "sha512-kZsGyh2BoSRguzlcGtzdLhw/l/n3KYAC+/l/H0SlsOq3RLHF6tO/cRdsLnwoix2bObChHUp03cex63o1gzdx/Q==", "dependencies": { + "@aws-sdk/core": "3.858.0", + "@aws-sdk/types": "3.840.0", + "@smithy/property-provider": "^4.0.4", + "@smithy/types": "^4.3.1", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/chunked-blob-reader-native": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader-native/-/chunked-blob-reader-native-4.0.0.tgz", - "integrity": "sha512-R9wM2yPmfEMsUmlMlIgSzOyICs0x9uu7UTHoccMyt7BWw8shcGM8HqB355+BZCPBcySvbTYMs62EgEQkNxz2ig==", + "node_modules/@aws-sdk/client-s3-control/node_modules/@aws-sdk/credential-provider-http": { + "version": "3.858.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.858.0.tgz", + "integrity": "sha512-GDnfYl3+NPJQ7WQQYOXEA489B212NinpcIDD7rpsB6IWUPo8yDjT5NceK4uUkIR3MFpNCGt9zd/z6NNLdB2fuQ==", "dependencies": { - "@smithy/util-base64": "^4.0.0", + "@aws-sdk/core": "3.858.0", + "@aws-sdk/types": "3.840.0", + "@smithy/fetch-http-handler": "^5.1.0", + "@smithy/node-http-handler": "^4.1.0", + "@smithy/property-provider": "^4.0.4", + "@smithy/protocol-http": "^5.1.2", + "@smithy/smithy-client": "^4.4.9", + "@smithy/types": "^4.3.1", + "@smithy/util-stream": "^4.2.3", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/config-resolver": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.1.4.tgz", - "integrity": "sha512-prmU+rDddxHOH0oNcwemL+SwnzcG65sBF2yXRO7aeXIn/xTlq2pX7JLVbkBnVLowHLg4/OL4+jBmv9hVrVGS+w==", + "node_modules/@aws-sdk/client-s3-control/node_modules/@aws-sdk/credential-provider-ini": { + "version": "3.859.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.859.0.tgz", + "integrity": "sha512-KsccE1T88ZDNhsABnqbQj014n5JMDilAroUErFbGqu5/B3sXqUsYmG54C/BjvGTRUFfzyttK9lB9P9h6ddQ8Cw==", "dependencies": { - "@smithy/node-config-provider": "^4.1.3", + "@aws-sdk/core": "3.858.0", + "@aws-sdk/credential-provider-env": "3.858.0", + "@aws-sdk/credential-provider-http": "3.858.0", + "@aws-sdk/credential-provider-process": "3.858.0", + "@aws-sdk/credential-provider-sso": "3.859.0", + "@aws-sdk/credential-provider-web-identity": "3.858.0", + "@aws-sdk/nested-clients": "3.858.0", + "@aws-sdk/types": "3.840.0", + "@smithy/credential-provider-imds": "^4.0.6", + "@smithy/property-provider": "^4.0.4", + "@smithy/shared-ini-file-loader": "^4.0.4", "@smithy/types": "^4.3.1", - "@smithy/util-config-provider": "^4.0.0", - "@smithy/util-middleware": "^4.0.4", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/core": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.7.2.tgz", - "integrity": "sha512-JoLw59sT5Bm8SAjFCYZyuCGxK8y3vovmoVbZWLDPTH5XpPEIwpFd9m90jjVMwoypDuB/SdVgje5Y4T7w50lJaw==", + "node_modules/@aws-sdk/client-s3-control/node_modules/@aws-sdk/credential-provider-node": { + "version": "3.859.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.859.0.tgz", + "integrity": "sha512-ZRDB2xU5aSyTR/jDcli30tlycu6RFvQngkZhBs9Zoh2BiYXrfh2MMuoYuZk+7uD6D53Q2RIEldDHR9A/TPlRuA==", "dependencies": { - "@smithy/middleware-serde": "^4.0.8", - "@smithy/protocol-http": "^5.1.2", + "@aws-sdk/credential-provider-env": "3.858.0", + "@aws-sdk/credential-provider-http": "3.858.0", + "@aws-sdk/credential-provider-ini": "3.859.0", + "@aws-sdk/credential-provider-process": "3.858.0", + "@aws-sdk/credential-provider-sso": "3.859.0", + "@aws-sdk/credential-provider-web-identity": "3.858.0", + "@aws-sdk/types": "3.840.0", + "@smithy/credential-provider-imds": "^4.0.6", + "@smithy/property-provider": "^4.0.4", + "@smithy/shared-ini-file-loader": "^4.0.4", "@smithy/types": "^4.3.1", - "@smithy/util-base64": "^4.0.0", - "@smithy/util-body-length-browser": "^4.0.0", - "@smithy/util-middleware": "^4.0.4", - "@smithy/util-stream": "^4.2.3", - "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/credential-provider-imds": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.0.6.tgz", - "integrity": "sha512-hKMWcANhUiNbCJouYkZ9V3+/Qf9pteR1dnwgdyzR09R4ODEYx8BbUysHwRSyex4rZ9zapddZhLFTnT4ZijR4pw==", + "node_modules/@aws-sdk/client-s3-control/node_modules/@aws-sdk/credential-provider-process": { + "version": "3.858.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.858.0.tgz", + "integrity": "sha512-l5LJWZJMRaZ+LhDjtupFUKEC5hAjgvCRrOvV5T60NCUBOy0Ozxa7Sgx3x+EOwiruuoh3Cn9O+RlbQlJX6IfZIw==", "dependencies": { - "@smithy/node-config-provider": "^4.1.3", + "@aws-sdk/core": "3.858.0", + "@aws-sdk/types": "3.840.0", "@smithy/property-provider": "^4.0.4", + "@smithy/shared-ini-file-loader": "^4.0.4", "@smithy/types": "^4.3.1", - "@smithy/url-parser": "^4.0.4", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/fetch-http-handler": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.1.0.tgz", - "integrity": "sha512-mADw7MS0bYe2OGKkHYMaqarOXuDwRbO6ArD91XhHcl2ynjGCFF+hvqf0LyQcYxkA1zaWjefSkU7Ne9mqgApSgQ==", + "node_modules/@aws-sdk/client-s3-control/node_modules/@aws-sdk/credential-provider-sso": { + "version": "3.859.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.859.0.tgz", + "integrity": "sha512-BwAqmWIivhox5YlFRjManFF8GoTvEySPk6vsJNxDsmGsabY+OQovYxFIYxRCYiHzH7SFjd4Lcd+riJOiXNsvRw==", "dependencies": { - "@smithy/protocol-http": "^5.1.2", - "@smithy/querystring-builder": "^4.0.4", + "@aws-sdk/client-sso": "3.858.0", + "@aws-sdk/core": "3.858.0", + "@aws-sdk/token-providers": "3.859.0", + "@aws-sdk/types": "3.840.0", + "@smithy/property-provider": "^4.0.4", + "@smithy/shared-ini-file-loader": "^4.0.4", "@smithy/types": "^4.3.1", - "@smithy/util-base64": "^4.0.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/hash-blob-browser": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/hash-blob-browser/-/hash-blob-browser-4.0.4.tgz", - "integrity": "sha512-WszRiACJiQV3QG6XMV44i5YWlkrlsM5Yxgz4jvsksuu7LDXA6wAtypfPajtNTadzpJy3KyJPoWehYpmZGKUFIQ==", + "node_modules/@aws-sdk/client-s3-control/node_modules/@aws-sdk/credential-provider-web-identity": { + "version": "3.858.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.858.0.tgz", + "integrity": "sha512-8iULWsH83iZDdUuiDsRb83M0NqIlXjlDbJUIddVsIrfWp4NmanKw77SV6yOZ66nuJjPsn9j7RDb9bfEPCy5SWA==", "dependencies": { - "@smithy/chunked-blob-reader": "^5.0.0", - "@smithy/chunked-blob-reader-native": "^4.0.0", + "@aws-sdk/core": "3.858.0", + "@aws-sdk/nested-clients": "3.858.0", + "@aws-sdk/types": "3.840.0", + "@smithy/property-provider": "^4.0.4", "@smithy/types": "^4.3.1", "tslib": "^2.6.2" }, @@ -19872,38 +20111,43 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/hash-node": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.0.4.tgz", - "integrity": "sha512-qnbTPUhCVnCgBp4z4BUJUhOEkVwxiEi1cyFM+Zj6o+aY8OFGxUQleKWq8ltgp3dujuhXojIvJWdoqpm6dVO3lQ==", + "node_modules/@aws-sdk/client-s3-control/node_modules/@aws-sdk/middleware-bucket-endpoint": { + "version": "3.840.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.840.0.tgz", + "integrity": "sha512-+gkQNtPwcSMmlwBHFd4saVVS11In6ID1HczNzpM3MXKXRBfSlbZJbCt6wN//AZ8HMklZEik4tcEOG0qa9UY8SQ==", "dependencies": { + "@aws-sdk/types": "3.840.0", + "@aws-sdk/util-arn-parser": "3.804.0", + "@smithy/node-config-provider": "^4.1.3", + "@smithy/protocol-http": "^5.1.2", "@smithy/types": "^4.3.1", - "@smithy/util-buffer-from": "^4.0.0", - "@smithy/util-utf8": "^4.0.0", + "@smithy/util-config-provider": "^4.0.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/hash-stream-node": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/hash-stream-node/-/hash-stream-node-4.0.4.tgz", - "integrity": "sha512-wHo0d8GXyVmpmMh/qOR0R7Y46/G1y6OR8U+bSTB4ppEzRxd1xVAQ9xOE9hOc0bSjhz0ujCPAbfNLkLrpa6cevg==", + "node_modules/@aws-sdk/client-s3-control/node_modules/@aws-sdk/middleware-host-header": { + "version": "3.840.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.840.0.tgz", + "integrity": "sha512-ub+hXJAbAje94+Ya6c6eL7sYujoE8D4Bumu1NUI8TXjUhVVn0HzVWQjpRLshdLsUp1AW7XyeJaxyajRaJQ8+Xg==", "dependencies": { + "@aws-sdk/types": "3.840.0", + "@smithy/protocol-http": "^5.1.2", "@smithy/types": "^4.3.1", - "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/invalid-dependency": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.0.4.tgz", - "integrity": "sha512-bNYMi7WKTJHu0gn26wg8OscncTt1t2b8KcsZxvOv56XA6cyXtOAAAaNP7+m45xfppXfOatXF3Sb1MNsLUgVLTw==", + "node_modules/@aws-sdk/client-s3-control/node_modules/@aws-sdk/middleware-logger": { + "version": "3.840.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.840.0.tgz", + "integrity": "sha512-lSV8FvjpdllpGaRspywss4CtXV8M7NNNH+2/j86vMH+YCOZ6fu2T/TyFd/tHwZ92vDfHctWkRbQxg0bagqwovA==", "dependencies": { + "@aws-sdk/types": "3.840.0", "@smithy/types": "^4.3.1", "tslib": "^2.6.2" }, @@ -19911,35 +20155,29 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/is-array-buffer": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-4.0.0.tgz", - "integrity": "sha512-saYhF8ZZNoJDTvJBEWgeBccCg+yvp1CX+ed12yORU3NilJScfc6gfch2oVb4QgxZrGUx3/ZJlb+c/dJbyupxlw==", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/md5-js": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/md5-js/-/md5-js-4.0.4.tgz", - "integrity": "sha512-uGLBVqcOwrLvGh/v/jw423yWHq/ofUGK1W31M2TNspLQbUV1Va0F5kTxtirkoHawODAZcjXTSGi7JwbnPcDPJg==", + "node_modules/@aws-sdk/client-s3-control/node_modules/@aws-sdk/middleware-recursion-detection": { + "version": "3.840.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.840.0.tgz", + "integrity": "sha512-Gu7lGDyfddyhIkj1Z1JtrY5NHb5+x/CRiB87GjaSrKxkDaydtX2CU977JIABtt69l9wLbcGDIQ+W0uJ5xPof7g==", "dependencies": { + "@aws-sdk/types": "3.840.0", + "@smithy/protocol-http": "^5.1.2", "@smithy/types": "^4.3.1", - "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/middleware-content-length": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.0.4.tgz", - "integrity": "sha512-F7gDyfI2BB1Kc+4M6rpuOLne5LOcEknH1n6UQB69qv+HucXBR1rkzXBnQTB2q46sFy1PM/zuSJOB532yc8bg3w==", + "node_modules/@aws-sdk/client-s3-control/node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.858.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.858.0.tgz", + "integrity": "sha512-pC3FT/sRZ6n5NyXiTVu9dpf1D9j3YbJz3XmeOOwJqO/Mib2PZyIQktvNMPgwaC5KMVB1zWqS5bmCwxpMOnq0UQ==", "dependencies": { + "@aws-sdk/core": "3.858.0", + "@aws-sdk/types": "3.840.0", + "@aws-sdk/util-endpoints": "3.848.0", + "@smithy/core": "^3.7.2", "@smithy/protocol-http": "^5.1.2", "@smithy/types": "^4.3.1", "tslib": "^2.6.2" @@ -19948,49 +20186,80 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/middleware-endpoint": { - "version": "4.1.17", - "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.1.17.tgz", - "integrity": "sha512-S3hSGLKmHG1m35p/MObQCBCdRsrpbPU8B129BVzRqRfDvQqPMQ14iO4LyRw+7LNizYc605COYAcjqgawqi+6jA==", + "node_modules/@aws-sdk/client-s3-control/node_modules/@aws-sdk/nested-clients": { + "version": "3.858.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.858.0.tgz", + "integrity": "sha512-ChdIj80T2whoWbovmO7o8ICmhEB2S9q4Jes9MBnKAPm69PexcJAK2dQC8yI4/iUP8b3+BHZoUPrYLWjBxIProQ==", "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.858.0", + "@aws-sdk/middleware-host-header": "3.840.0", + "@aws-sdk/middleware-logger": "3.840.0", + "@aws-sdk/middleware-recursion-detection": "3.840.0", + "@aws-sdk/middleware-user-agent": "3.858.0", + "@aws-sdk/region-config-resolver": "3.840.0", + "@aws-sdk/types": "3.840.0", + "@aws-sdk/util-endpoints": "3.848.0", + "@aws-sdk/util-user-agent-browser": "3.840.0", + "@aws-sdk/util-user-agent-node": "3.858.0", + "@smithy/config-resolver": "^4.1.4", "@smithy/core": "^3.7.2", + "@smithy/fetch-http-handler": "^5.1.0", + "@smithy/hash-node": "^4.0.4", + "@smithy/invalid-dependency": "^4.0.4", + "@smithy/middleware-content-length": "^4.0.4", + "@smithy/middleware-endpoint": "^4.1.17", + "@smithy/middleware-retry": "^4.1.18", "@smithy/middleware-serde": "^4.0.8", + "@smithy/middleware-stack": "^4.0.4", "@smithy/node-config-provider": "^4.1.3", - "@smithy/shared-ini-file-loader": "^4.0.4", + "@smithy/node-http-handler": "^4.1.0", + "@smithy/protocol-http": "^5.1.2", + "@smithy/smithy-client": "^4.4.9", "@smithy/types": "^4.3.1", "@smithy/url-parser": "^4.0.4", + "@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.25", + "@smithy/util-defaults-mode-node": "^4.0.25", + "@smithy/util-endpoints": "^3.0.6", "@smithy/util-middleware": "^4.0.4", + "@smithy/util-retry": "^4.0.6", + "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/middleware-retry": { - "version": "4.1.18", - "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.1.18.tgz", - "integrity": "sha512-bYLZ4DkoxSsPxpdmeapvAKy7rM5+25gR7PGxq2iMiecmbrRGBHj9s75N74Ylg+aBiw9i5jIowC/cLU2NR0qH8w==", + "node_modules/@aws-sdk/client-s3-control/node_modules/@aws-sdk/region-config-resolver": { + "version": "3.840.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.840.0.tgz", + "integrity": "sha512-Qjnxd/yDv9KpIMWr90ZDPtRj0v75AqGC92Lm9+oHXZ8p1MjG5JE2CW0HL8JRgK9iKzgKBL7pPQRXI8FkvEVfrA==", "dependencies": { + "@aws-sdk/types": "3.840.0", "@smithy/node-config-provider": "^4.1.3", - "@smithy/protocol-http": "^5.1.2", - "@smithy/service-error-classification": "^4.0.6", - "@smithy/smithy-client": "^4.4.9", "@smithy/types": "^4.3.1", + "@smithy/util-config-provider": "^4.0.0", "@smithy/util-middleware": "^4.0.4", - "@smithy/util-retry": "^4.0.6", - "tslib": "^2.6.2", - "uuid": "^9.0.1" + "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/middleware-serde": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.0.8.tgz", - "integrity": "sha512-iSSl7HJoJaGyMIoNn2B7czghOVwJ9nD7TMvLhMWeSB5vt0TnEYyRRqPJu/TqW76WScaNvYYB8nRoiBHR9S1Ddw==", + "node_modules/@aws-sdk/client-s3-control/node_modules/@aws-sdk/token-providers": { + "version": "3.859.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.859.0.tgz", + "integrity": "sha512-6P2wlvm9KBWOvRNn0Pt8RntnXg8fzOb5kEShvWsOsAocZeqKNaYbihum5/Onq1ZPoVtkdb++8eWDocDnM4k85Q==", "dependencies": { - "@smithy/protocol-http": "^5.1.2", + "@aws-sdk/core": "3.858.0", + "@aws-sdk/nested-clients": "3.858.0", + "@aws-sdk/types": "3.840.0", + "@smithy/property-provider": "^4.0.4", + "@smithy/shared-ini-file-loader": "^4.0.4", "@smithy/types": "^4.3.1", "tslib": "^2.6.2" }, @@ -19998,10 +20267,10 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/middleware-stack": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.0.4.tgz", - "integrity": "sha512-kagK5ggDrBUCCzI93ft6DjteNSfY8Ulr83UtySog/h09lTIOAJ/xUSObutanlPT0nhoHAkpmW9V5K8oPyLh+QA==", + "node_modules/@aws-sdk/client-s3-control/node_modules/@aws-sdk/types": { + "version": "3.840.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.840.0.tgz", + "integrity": "sha512-xliuHaUFZxEx1NSXeLLZ9Dyu6+EJVQKEoD+yM+zqUo3YDZ7medKJWY6fIOKiPX/N7XbLdBYwajb15Q7IL8KkeA==", "dependencies": { "@smithy/types": "^4.3.1", "tslib": "^2.6.2" @@ -20010,76 +20279,82 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/node-config-provider": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.1.3.tgz", - "integrity": "sha512-HGHQr2s59qaU1lrVH6MbLlmOBxadtzTsoO4c+bF5asdgVik3I8o7JIOzoeqWc5MjVa+vD36/LWE0iXKpNqooRw==", + "node_modules/@aws-sdk/client-s3-control/node_modules/@aws-sdk/util-arn-parser": { + "version": "3.804.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.804.0.tgz", + "integrity": "sha512-wmBJqn1DRXnZu3b4EkE6CWnoWMo1ZMvlfkqU5zPz67xx1GMaXlDCchFvKAXMjk4jn/L1O3tKnoFDNsoLV1kgNQ==", "dependencies": { - "@smithy/property-provider": "^4.0.4", - "@smithy/shared-ini-file-loader": "^4.0.4", - "@smithy/types": "^4.3.1", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/node-http-handler": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.1.0.tgz", - "integrity": "sha512-vqfSiHz2v8b3TTTrdXi03vNz1KLYYS3bhHCDv36FYDqxT7jvTll1mMnCrkD+gOvgwybuunh/2VmvOMqwBegxEg==", + "node_modules/@aws-sdk/client-s3-control/node_modules/@aws-sdk/util-endpoints": { + "version": "3.848.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.848.0.tgz", + "integrity": "sha512-fY/NuFFCq/78liHvRyFKr+aqq1aA/uuVSANjzr5Ym8c+9Z3HRPE9OrExAHoMrZ6zC8tHerQwlsXYYH5XZ7H+ww==", "dependencies": { - "@smithy/abort-controller": "^4.0.4", - "@smithy/protocol-http": "^5.1.2", - "@smithy/querystring-builder": "^4.0.4", + "@aws-sdk/types": "3.840.0", "@smithy/types": "^4.3.1", + "@smithy/url-parser": "^4.0.4", + "@smithy/util-endpoints": "^3.0.6", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/property-provider": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.4.tgz", - "integrity": "sha512-qHJ2sSgu4FqF4U/5UUp4DhXNmdTrgmoAai6oQiM+c5RZ/sbDwJ12qxB1M6FnP+Tn/ggkPZf9ccn4jqKSINaquw==", + "node_modules/@aws-sdk/client-s3-control/node_modules/@aws-sdk/util-user-agent-browser": { + "version": "3.840.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.840.0.tgz", + "integrity": "sha512-JdyZM3EhhL4PqwFpttZu1afDpPJCCc3eyZOLi+srpX11LsGj6sThf47TYQN75HT1CarZ7cCdQHGzP2uy3/xHfQ==", "dependencies": { + "@aws-sdk/types": "3.840.0", "@smithy/types": "^4.3.1", + "bowser": "^2.11.0", "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/protocol-http": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.1.2.tgz", - "integrity": "sha512-rOG5cNLBXovxIrICSBm95dLqzfvxjEmuZx4KK3hWwPFHGdW3lxY0fZNXfv2zebfRO7sJZ5pKJYHScsqopeIWtQ==", + "node_modules/@aws-sdk/client-s3-control/node_modules/@aws-sdk/util-user-agent-node": { + "version": "3.858.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.858.0.tgz", + "integrity": "sha512-T1m05QlN8hFpx5/5duMjS8uFSK5e6EXP45HQRkZULVkL3DK+jMaxsnh3KLl5LjUoHn/19M4HM0wNUBhYp4Y2Yw==", "dependencies": { + "@aws-sdk/middleware-user-agent": "3.858.0", + "@aws-sdk/types": "3.840.0", + "@smithy/node-config-provider": "^4.1.3", "@smithy/types": "^4.3.1", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" + }, + "peerDependencies": { + "aws-crt": ">=1.0.0" + }, + "peerDependenciesMeta": { + "aws-crt": { + "optional": true + } } }, - "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/querystring-builder": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.0.4.tgz", - "integrity": "sha512-SwREZcDnEYoh9tLNgMbpop+UTGq44Hl9tdj3rf+yeLcfH7+J8OXEBaMc2kDxtyRHu8BhSg9ADEx0gFHvpJgU8w==", + "node_modules/@aws-sdk/client-s3-control/node_modules/@aws-sdk/xml-builder": { + "version": "3.821.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.821.0.tgz", + "integrity": "sha512-DIIotRnefVL6DiaHtO6/21DhJ4JZnnIwdNbpwiAhdt/AVbttcE4yw925gsjur0OGv5BTYXQXU3YnANBYnZjuQA==", "dependencies": { "@smithy/types": "^4.3.1", - "@smithy/util-uri-escape": "^4.0.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/querystring-parser": { + "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/abort-controller": { "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.0.4.tgz", - "integrity": "sha512-6yZf53i/qB8gRHH/l2ZwUG5xgkPgQF15/KxH0DdXMDHjesA9MeZje/853ifkSY0x4m5S+dfDZ+c4x439PF0M2w==", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.0.4.tgz", + "integrity": "sha512-gJnEjZMvigPDQWHrW3oPrFhQtkrgqBkyjj3pCIdF3A5M6vsZODG93KNlfJprv6bp4245bdT32fsHK4kkH3KYDA==", "dependencies": { "@smithy/types": "^4.3.1", "tslib": "^2.6.2" @@ -20088,40 +20363,56 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/service-error-classification": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.0.6.tgz", - "integrity": "sha512-RRoTDL//7xi4tn5FrN2NzH17jbgmnKidUqd4KvquT0954/i6CXXkh1884jBiunq24g9cGtPBEXlU40W6EpNOOg==", + "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/chunked-blob-reader": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader/-/chunked-blob-reader-5.0.0.tgz", + "integrity": "sha512-+sKqDBQqb036hh4NPaUiEkYFkTUGYzRsn3EuFhyfQfMy6oGHEUJDurLP9Ufb5dasr/XiAmPNMr6wa9afjQB+Gw==", "dependencies": { - "@smithy/types": "^4.3.1" + "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/shared-ini-file-loader": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.4.tgz", - "integrity": "sha512-63X0260LoFBjrHifPDs+nM9tV0VMkOTl4JRMYNuKh/f5PauSjowTfvF3LogfkWdcPoxsA9UjqEOgjeYIbhb7Nw==", + "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/chunked-blob-reader-native": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader-native/-/chunked-blob-reader-native-4.0.0.tgz", + "integrity": "sha512-R9wM2yPmfEMsUmlMlIgSzOyICs0x9uu7UTHoccMyt7BWw8shcGM8HqB355+BZCPBcySvbTYMs62EgEQkNxz2ig==", + "dependencies": { + "@smithy/util-base64": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/config-resolver": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.1.4.tgz", + "integrity": "sha512-prmU+rDddxHOH0oNcwemL+SwnzcG65sBF2yXRO7aeXIn/xTlq2pX7JLVbkBnVLowHLg4/OL4+jBmv9hVrVGS+w==", "dependencies": { + "@smithy/node-config-provider": "^4.1.3", "@smithy/types": "^4.3.1", + "@smithy/util-config-provider": "^4.0.0", + "@smithy/util-middleware": "^4.0.4", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/signature-v4": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.1.2.tgz", - "integrity": "sha512-d3+U/VpX7a60seHziWnVZOHuEgJlclufjkS6zhXvxcJgkJq4UWdH5eOBLzHRMx6gXjsdT9h6lfpmLzbrdupHgQ==", + "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/core": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.7.2.tgz", + "integrity": "sha512-JoLw59sT5Bm8SAjFCYZyuCGxK8y3vovmoVbZWLDPTH5XpPEIwpFd9m90jjVMwoypDuB/SdVgje5Y4T7w50lJaw==", "dependencies": { - "@smithy/is-array-buffer": "^4.0.0", + "@smithy/middleware-serde": "^4.0.8", "@smithy/protocol-http": "^5.1.2", "@smithy/types": "^4.3.1", - "@smithy/util-hex-encoding": "^4.0.0", + "@smithy/util-base64": "^4.0.0", + "@smithy/util-body-length-browser": "^4.0.0", "@smithy/util-middleware": "^4.0.4", - "@smithy/util-uri-escape": "^4.0.0", + "@smithy/util-stream": "^4.2.3", "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" }, @@ -20129,40 +20420,43 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/smithy-client": { - "version": "4.4.9", - "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.4.9.tgz", - "integrity": "sha512-mbMg8mIUAWwMmb74LoYiArP04zWElPzDoA1jVOp3or0cjlDMgoS6WTC3QXK0Vxoc9I4zdrX0tq6qsOmaIoTWEQ==", + "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/credential-provider-imds": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.0.6.tgz", + "integrity": "sha512-hKMWcANhUiNbCJouYkZ9V3+/Qf9pteR1dnwgdyzR09R4ODEYx8BbUysHwRSyex4rZ9zapddZhLFTnT4ZijR4pw==", "dependencies": { - "@smithy/core": "^3.7.2", - "@smithy/middleware-endpoint": "^4.1.17", - "@smithy/middleware-stack": "^4.0.4", - "@smithy/protocol-http": "^5.1.2", + "@smithy/node-config-provider": "^4.1.3", + "@smithy/property-provider": "^4.0.4", "@smithy/types": "^4.3.1", - "@smithy/util-stream": "^4.2.3", + "@smithy/url-parser": "^4.0.4", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/types": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.1.tgz", - "integrity": "sha512-UqKOQBL2x6+HWl3P+3QqFD4ncKq0I8Nuz9QItGv5WuKuMHuuwlhvqcZCoXGfc+P1QmfJE7VieykoYYmrOoFJxA==", + "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/fetch-http-handler": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.1.0.tgz", + "integrity": "sha512-mADw7MS0bYe2OGKkHYMaqarOXuDwRbO6ArD91XhHcl2ynjGCFF+hvqf0LyQcYxkA1zaWjefSkU7Ne9mqgApSgQ==", "dependencies": { + "@smithy/protocol-http": "^5.1.2", + "@smithy/querystring-builder": "^4.0.4", + "@smithy/types": "^4.3.1", + "@smithy/util-base64": "^4.0.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/url-parser": { + "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/hash-blob-browser": { "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.0.4.tgz", - "integrity": "sha512-eMkc144MuN7B0TDA4U2fKs+BqczVbk3W+qIvcoCY6D1JY3hnAdCuhCZODC+GAeaxj0p6Jroz4+XMUn3PCxQQeQ==", + "resolved": "https://registry.npmjs.org/@smithy/hash-blob-browser/-/hash-blob-browser-4.0.4.tgz", + "integrity": "sha512-WszRiACJiQV3QG6XMV44i5YWlkrlsM5Yxgz4jvsksuu7LDXA6wAtypfPajtNTadzpJy3KyJPoWehYpmZGKUFIQ==", "dependencies": { - "@smithy/querystring-parser": "^4.0.4", + "@smithy/chunked-blob-reader": "^5.0.0", + "@smithy/chunked-blob-reader-native": "^4.0.0", "@smithy/types": "^4.3.1", "tslib": "^2.6.2" }, @@ -20170,11 +20464,12 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/util-base64": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-4.0.0.tgz", - "integrity": "sha512-CvHfCmO2mchox9kjrtzoHkWHxjHZzaFojLc8quxXY7WAAMAg43nuxwv95tATVgQFNDwd4M9S1qFzj40Ul41Kmg==", + "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/hash-node": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.0.4.tgz", + "integrity": "sha512-qnbTPUhCVnCgBp4z4BUJUhOEkVwxiEi1cyFM+Zj6o+aY8OFGxUQleKWq8ltgp3dujuhXojIvJWdoqpm6dVO3lQ==", "dependencies": { + "@smithy/types": "^4.3.1", "@smithy/util-buffer-from": "^4.0.0", "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" @@ -20183,111 +20478,122 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/util-body-length-browser": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-4.0.0.tgz", - "integrity": "sha512-sNi3DL0/k64/LO3A256M+m3CDdG6V7WKWHdAiBBMUN8S3hK3aMPhwnPik2A/a2ONN+9doY9UxaLfgqsIRg69QA==", + "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/hash-stream-node": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@smithy/hash-stream-node/-/hash-stream-node-4.0.4.tgz", + "integrity": "sha512-wHo0d8GXyVmpmMh/qOR0R7Y46/G1y6OR8U+bSTB4ppEzRxd1xVAQ9xOE9hOc0bSjhz0ujCPAbfNLkLrpa6cevg==", "dependencies": { + "@smithy/types": "^4.3.1", + "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/util-body-length-node": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-4.0.0.tgz", - "integrity": "sha512-q0iDP3VsZzqJyje8xJWEJCNIu3lktUGVoSy1KB0UWym2CL1siV3artm+u1DFYTLejpsrdGyCSWBdGNjJzfDPjg==", + "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/invalid-dependency": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.0.4.tgz", + "integrity": "sha512-bNYMi7WKTJHu0gn26wg8OscncTt1t2b8KcsZxvOv56XA6cyXtOAAAaNP7+m45xfppXfOatXF3Sb1MNsLUgVLTw==", "dependencies": { + "@smithy/types": "^4.3.1", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/util-buffer-from": { + "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/is-array-buffer": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-4.0.0.tgz", - "integrity": "sha512-9TOQ7781sZvddgO8nxueKi3+yGvkY35kotA0Y6BWRajAv8jjmigQ1sBwz0UX47pQMYXJPahSKEKYFgt+rXdcug==", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-4.0.0.tgz", + "integrity": "sha512-saYhF8ZZNoJDTvJBEWgeBccCg+yvp1CX+ed12yORU3NilJScfc6gfch2oVb4QgxZrGUx3/ZJlb+c/dJbyupxlw==", "dependencies": { - "@smithy/is-array-buffer": "^4.0.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/util-config-provider": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-4.0.0.tgz", - "integrity": "sha512-L1RBVzLyfE8OXH+1hsJ8p+acNUSirQnWQ6/EgpchV88G6zGBTDPdXiiExei6Z1wR2RxYvxY/XLw6AMNCCt8H3w==", + "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/md5-js": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@smithy/md5-js/-/md5-js-4.0.4.tgz", + "integrity": "sha512-uGLBVqcOwrLvGh/v/jw423yWHq/ofUGK1W31M2TNspLQbUV1Va0F5kTxtirkoHawODAZcjXTSGi7JwbnPcDPJg==", "dependencies": { + "@smithy/types": "^4.3.1", + "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/util-defaults-mode-browser": { - "version": "4.0.25", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.0.25.tgz", - "integrity": "sha512-pxEWsxIsOPLfKNXvpgFHBGFC3pKYKUFhrud1kyooO9CJai6aaKDHfT10Mi5iiipPXN/JhKAu3qX9o75+X85OdQ==", + "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/middleware-content-length": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.0.4.tgz", + "integrity": "sha512-F7gDyfI2BB1Kc+4M6rpuOLne5LOcEknH1n6UQB69qv+HucXBR1rkzXBnQTB2q46sFy1PM/zuSJOB532yc8bg3w==", "dependencies": { - "@smithy/property-provider": "^4.0.4", - "@smithy/smithy-client": "^4.4.9", + "@smithy/protocol-http": "^5.1.2", "@smithy/types": "^4.3.1", - "bowser": "^2.11.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/util-defaults-mode-node": { - "version": "4.0.25", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.0.25.tgz", - "integrity": "sha512-+w4n4hKFayeCyELZLfsSQG5mCC3TwSkmRHv4+el5CzFU8ToQpYGhpV7mrRzqlwKkntlPilT1HJy1TVeEvEjWOQ==", + "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/middleware-endpoint": { + "version": "4.1.17", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.1.17.tgz", + "integrity": "sha512-S3hSGLKmHG1m35p/MObQCBCdRsrpbPU8B129BVzRqRfDvQqPMQ14iO4LyRw+7LNizYc605COYAcjqgawqi+6jA==", "dependencies": { - "@smithy/config-resolver": "^4.1.4", - "@smithy/credential-provider-imds": "^4.0.6", + "@smithy/core": "^3.7.2", + "@smithy/middleware-serde": "^4.0.8", "@smithy/node-config-provider": "^4.1.3", - "@smithy/property-provider": "^4.0.4", - "@smithy/smithy-client": "^4.4.9", + "@smithy/shared-ini-file-loader": "^4.0.4", "@smithy/types": "^4.3.1", + "@smithy/url-parser": "^4.0.4", + "@smithy/util-middleware": "^4.0.4", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/util-endpoints": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.0.6.tgz", - "integrity": "sha512-YARl3tFL3WgPuLzljRUnrS2ngLiUtkwhQtj8PAL13XZSyUiNLQxwG3fBBq3QXFqGFUXepIN73pINp3y8c2nBmA==", + "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/middleware-retry": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.1.18.tgz", + "integrity": "sha512-bYLZ4DkoxSsPxpdmeapvAKy7rM5+25gR7PGxq2iMiecmbrRGBHj9s75N74Ylg+aBiw9i5jIowC/cLU2NR0qH8w==", "dependencies": { "@smithy/node-config-provider": "^4.1.3", + "@smithy/protocol-http": "^5.1.2", + "@smithy/service-error-classification": "^4.0.6", + "@smithy/smithy-client": "^4.4.9", "@smithy/types": "^4.3.1", - "tslib": "^2.6.2" + "@smithy/util-middleware": "^4.0.4", + "@smithy/util-retry": "^4.0.6", + "tslib": "^2.6.2", + "uuid": "^9.0.1" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/util-hex-encoding": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-4.0.0.tgz", - "integrity": "sha512-Yk5mLhHtfIgW2W2WQZWSg5kuMZCVbvhFmC7rV4IO2QqnZdbEFPmQnCcGMAX2z/8Qj3B9hYYNjZOhWym+RwhePw==", + "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/middleware-serde": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.0.8.tgz", + "integrity": "sha512-iSSl7HJoJaGyMIoNn2B7czghOVwJ9nD7TMvLhMWeSB5vt0TnEYyRRqPJu/TqW76WScaNvYYB8nRoiBHR9S1Ddw==", "dependencies": { + "@smithy/protocol-http": "^5.1.2", + "@smithy/types": "^4.3.1", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/util-middleware": { + "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/middleware-stack": { "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.0.4.tgz", - "integrity": "sha512-9MLKmkBmf4PRb0ONJikCbCwORACcil6gUWojwARCClT7RmLzF04hUR4WdRprIXal7XVyrddadYNfp2eF3nrvtQ==", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.0.4.tgz", + "integrity": "sha512-kagK5ggDrBUCCzI93ft6DjteNSfY8Ulr83UtySog/h09lTIOAJ/xUSObutanlPT0nhoHAkpmW9V5K8oPyLh+QA==", "dependencies": { "@smithy/types": "^4.3.1", "tslib": "^2.6.2" @@ -20296,12 +20602,13 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/util-retry": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.0.6.tgz", - "integrity": "sha512-+YekoF2CaSMv6zKrA6iI/N9yva3Gzn4L6n35Luydweu5MMPYpiGZlWqehPHDHyNbnyaYlz/WJyYAZnC+loBDZg==", + "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/node-config-provider": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.1.3.tgz", + "integrity": "sha512-HGHQr2s59qaU1lrVH6MbLlmOBxadtzTsoO4c+bF5asdgVik3I8o7JIOzoeqWc5MjVa+vD36/LWE0iXKpNqooRw==", "dependencies": { - "@smithy/service-error-classification": "^4.0.6", + "@smithy/property-provider": "^4.0.4", + "@smithy/shared-ini-file-loader": "^4.0.4", "@smithy/types": "^4.3.1", "tslib": "^2.6.2" }, @@ -20309,562 +20616,362 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/util-stream": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.2.3.tgz", - "integrity": "sha512-cQn412DWHHFNKrQfbHY8vSFI3nTROY1aIKji9N0tpp8gUABRilr7wdf8fqBbSlXresobM+tQFNk6I+0LXK/YZg==", + "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/node-http-handler": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.1.0.tgz", + "integrity": "sha512-vqfSiHz2v8b3TTTrdXi03vNz1KLYYS3bhHCDv36FYDqxT7jvTll1mMnCrkD+gOvgwybuunh/2VmvOMqwBegxEg==", "dependencies": { - "@smithy/fetch-http-handler": "^5.1.0", - "@smithy/node-http-handler": "^4.1.0", + "@smithy/abort-controller": "^4.0.4", + "@smithy/protocol-http": "^5.1.2", + "@smithy/querystring-builder": "^4.0.4", "@smithy/types": "^4.3.1", - "@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", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-s3-control/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==", + "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/property-provider": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.4.tgz", + "integrity": "sha512-qHJ2sSgu4FqF4U/5UUp4DhXNmdTrgmoAai6oQiM+c5RZ/sbDwJ12qxB1M6FnP+Tn/ggkPZf9ccn4jqKSINaquw==", "dependencies": { + "@smithy/types": "^4.3.1", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/util-utf8": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.0.0.tgz", - "integrity": "sha512-b+zebfKCfRdgNJDknHCob3O7FpeYQN6ZG6YLExMcasDHsCXlsXCEuiPZeLnJLpwa5dvPetGlnGCiMHuLwGvFow==", - "dependencies": { - "@smithy/util-buffer-from": "^4.0.0", + "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/protocol-http": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.1.2.tgz", + "integrity": "sha512-rOG5cNLBXovxIrICSBm95dLqzfvxjEmuZx4KK3hWwPFHGdW3lxY0fZNXfv2zebfRO7sJZ5pKJYHScsqopeIWtQ==", + "dependencies": { + "@smithy/types": "^4.3.1", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-s3-control/node_modules/fast-xml-parser": { - "version": "5.2.5", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.2.5.tgz", - "integrity": "sha512-pfX9uG9Ki0yekDHx2SiuRIyFdyAr1kMIMitPvb0YBo8SUfKvia7w7FIyd/l6av85pFYRhZscS75MwMnbvY+hcQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - } - ], + "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/querystring-builder": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.0.4.tgz", + "integrity": "sha512-SwREZcDnEYoh9tLNgMbpop+UTGq44Hl9tdj3rf+yeLcfH7+J8OXEBaMc2kDxtyRHu8BhSg9ADEx0gFHvpJgU8w==", "dependencies": { - "strnum": "^2.1.0" + "@smithy/types": "^4.3.1", + "@smithy/util-uri-escape": "^4.0.0", + "tslib": "^2.6.2" }, - "bin": { - "fxparser": "src/cli/cli.js" + "engines": { + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-s3-control/node_modules/strnum": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.1.1.tgz", - "integrity": "sha512-7ZvoFTiCnGxBtDqJ//Cu6fWtZtc7Y3x+QOirG15wztbdngGSkht27o2pyGWrVy0b4WAy3jbKmnoK6g5VlVNUUw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - } - ] - }, - "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/client-sso": { - "version": "3.693.0", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/querystring-parser": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.0.4.tgz", + "integrity": "sha512-6yZf53i/qB8gRHH/l2ZwUG5xgkPgQF15/KxH0DdXMDHjesA9MeZje/853ifkSY0x4m5S+dfDZ+c4x439PF0M2w==", "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.693.0", - "@aws-sdk/middleware-host-header": "3.693.0", - "@aws-sdk/middleware-logger": "3.693.0", - "@aws-sdk/middleware-recursion-detection": "3.693.0", - "@aws-sdk/middleware-user-agent": "3.693.0", - "@aws-sdk/region-config-resolver": "3.693.0", - "@aws-sdk/types": "3.692.0", - "@aws-sdk/util-endpoints": "3.693.0", - "@aws-sdk/util-user-agent-browser": "3.693.0", - "@aws-sdk/util-user-agent-node": "3.693.0", - "@smithy/config-resolver": "^3.0.11", - "@smithy/core": "^2.5.2", - "@smithy/fetch-http-handler": "^4.1.0", - "@smithy/hash-node": "^3.0.9", - "@smithy/invalid-dependency": "^3.0.9", - "@smithy/middleware-content-length": "^3.0.11", - "@smithy/middleware-endpoint": "^3.2.2", - "@smithy/middleware-retry": "^3.0.26", - "@smithy/middleware-serde": "^3.0.9", - "@smithy/middleware-stack": "^3.0.9", - "@smithy/node-config-provider": "^3.1.10", - "@smithy/node-http-handler": "^3.3.0", - "@smithy/protocol-http": "^4.1.6", - "@smithy/smithy-client": "^3.4.3", - "@smithy/types": "^3.7.0", - "@smithy/url-parser": "^3.0.9", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.26", - "@smithy/util-defaults-mode-node": "^3.0.26", - "@smithy/util-endpoints": "^2.1.5", - "@smithy/util-middleware": "^3.0.9", - "@smithy/util-retry": "^3.0.9", - "@smithy/util-utf8": "^3.0.0", + "@smithy/types": "^4.3.1", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/client-sso-oidc": { - "version": "3.693.0", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/service-error-classification": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.0.6.tgz", + "integrity": "sha512-RRoTDL//7xi4tn5FrN2NzH17jbgmnKidUqd4KvquT0954/i6CXXkh1884jBiunq24g9cGtPBEXlU40W6EpNOOg==", "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.693.0", - "@aws-sdk/credential-provider-node": "3.693.0", - "@aws-sdk/middleware-host-header": "3.693.0", - "@aws-sdk/middleware-logger": "3.693.0", - "@aws-sdk/middleware-recursion-detection": "3.693.0", - "@aws-sdk/middleware-user-agent": "3.693.0", - "@aws-sdk/region-config-resolver": "3.693.0", - "@aws-sdk/types": "3.692.0", - "@aws-sdk/util-endpoints": "3.693.0", - "@aws-sdk/util-user-agent-browser": "3.693.0", - "@aws-sdk/util-user-agent-node": "3.693.0", - "@smithy/config-resolver": "^3.0.11", - "@smithy/core": "^2.5.2", - "@smithy/fetch-http-handler": "^4.1.0", - "@smithy/hash-node": "^3.0.9", - "@smithy/invalid-dependency": "^3.0.9", - "@smithy/middleware-content-length": "^3.0.11", - "@smithy/middleware-endpoint": "^3.2.2", - "@smithy/middleware-retry": "^3.0.26", - "@smithy/middleware-serde": "^3.0.9", - "@smithy/middleware-stack": "^3.0.9", - "@smithy/node-config-provider": "^3.1.10", - "@smithy/node-http-handler": "^3.3.0", - "@smithy/protocol-http": "^4.1.6", - "@smithy/smithy-client": "^3.4.3", - "@smithy/types": "^3.7.0", - "@smithy/url-parser": "^3.0.9", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.26", - "@smithy/util-defaults-mode-node": "^3.0.26", - "@smithy/util-endpoints": "^2.1.5", - "@smithy/util-middleware": "^3.0.9", - "@smithy/util-retry": "^3.0.9", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" + "@smithy/types": "^4.3.1" }, "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sts": "^3.693.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/client-sts": { - "version": "3.693.0", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/shared-ini-file-loader": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.4.tgz", + "integrity": "sha512-63X0260LoFBjrHifPDs+nM9tV0VMkOTl4JRMYNuKh/f5PauSjowTfvF3LogfkWdcPoxsA9UjqEOgjeYIbhb7Nw==", "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.693.0", - "@aws-sdk/core": "3.693.0", - "@aws-sdk/credential-provider-node": "3.693.0", - "@aws-sdk/middleware-host-header": "3.693.0", - "@aws-sdk/middleware-logger": "3.693.0", - "@aws-sdk/middleware-recursion-detection": "3.693.0", - "@aws-sdk/middleware-user-agent": "3.693.0", - "@aws-sdk/region-config-resolver": "3.693.0", - "@aws-sdk/types": "3.692.0", - "@aws-sdk/util-endpoints": "3.693.0", - "@aws-sdk/util-user-agent-browser": "3.693.0", - "@aws-sdk/util-user-agent-node": "3.693.0", - "@smithy/config-resolver": "^3.0.11", - "@smithy/core": "^2.5.2", - "@smithy/fetch-http-handler": "^4.1.0", - "@smithy/hash-node": "^3.0.9", - "@smithy/invalid-dependency": "^3.0.9", - "@smithy/middleware-content-length": "^3.0.11", - "@smithy/middleware-endpoint": "^3.2.2", - "@smithy/middleware-retry": "^3.0.26", - "@smithy/middleware-serde": "^3.0.9", - "@smithy/middleware-stack": "^3.0.9", - "@smithy/node-config-provider": "^3.1.10", - "@smithy/node-http-handler": "^3.3.0", - "@smithy/protocol-http": "^4.1.6", - "@smithy/smithy-client": "^3.4.3", - "@smithy/types": "^3.7.0", - "@smithy/url-parser": "^3.0.9", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.26", - "@smithy/util-defaults-mode-node": "^3.0.26", - "@smithy/util-endpoints": "^2.1.5", - "@smithy/util-middleware": "^3.0.9", - "@smithy/util-retry": "^3.0.9", - "@smithy/util-utf8": "^3.0.0", + "@smithy/types": "^4.3.1", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/core": { - "version": "3.693.0", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/signature-v4": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.1.2.tgz", + "integrity": "sha512-d3+U/VpX7a60seHziWnVZOHuEgJlclufjkS6zhXvxcJgkJq4UWdH5eOBLzHRMx6gXjsdT9h6lfpmLzbrdupHgQ==", "dependencies": { - "@aws-sdk/types": "3.692.0", - "@smithy/core": "^2.5.2", - "@smithy/node-config-provider": "^3.1.10", - "@smithy/property-provider": "^3.1.9", - "@smithy/protocol-http": "^4.1.6", - "@smithy/signature-v4": "^4.2.2", - "@smithy/smithy-client": "^3.4.3", - "@smithy/types": "^3.7.0", - "@smithy/util-middleware": "^3.0.9", - "fast-xml-parser": "4.4.1", + "@smithy/is-array-buffer": "^4.0.0", + "@smithy/protocol-http": "^5.1.2", + "@smithy/types": "^4.3.1", + "@smithy/util-hex-encoding": "^4.0.0", + "@smithy/util-middleware": "^4.0.4", + "@smithy/util-uri-escape": "^4.0.0", + "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/credential-provider-http": { - "version": "3.693.0", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/smithy-client": { + "version": "4.4.9", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.4.9.tgz", + "integrity": "sha512-mbMg8mIUAWwMmb74LoYiArP04zWElPzDoA1jVOp3or0cjlDMgoS6WTC3QXK0Vxoc9I4zdrX0tq6qsOmaIoTWEQ==", "dependencies": { - "@aws-sdk/core": "3.693.0", - "@aws-sdk/types": "3.692.0", - "@smithy/fetch-http-handler": "^4.1.0", - "@smithy/node-http-handler": "^3.3.0", - "@smithy/property-provider": "^3.1.9", - "@smithy/protocol-http": "^4.1.6", - "@smithy/smithy-client": "^3.4.3", - "@smithy/types": "^3.7.0", - "@smithy/util-stream": "^3.3.0", + "@smithy/core": "^3.7.2", + "@smithy/middleware-endpoint": "^4.1.17", + "@smithy/middleware-stack": "^4.0.4", + "@smithy/protocol-http": "^5.1.2", + "@smithy/types": "^4.3.1", + "@smithy/util-stream": "^4.2.3", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.693.0", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/types": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.1.tgz", + "integrity": "sha512-UqKOQBL2x6+HWl3P+3QqFD4ncKq0I8Nuz9QItGv5WuKuMHuuwlhvqcZCoXGfc+P1QmfJE7VieykoYYmrOoFJxA==", "dependencies": { - "@aws-sdk/core": "3.693.0", - "@aws-sdk/credential-provider-env": "3.693.0", - "@aws-sdk/credential-provider-http": "3.693.0", - "@aws-sdk/credential-provider-process": "3.693.0", - "@aws-sdk/credential-provider-sso": "3.693.0", - "@aws-sdk/credential-provider-web-identity": "3.693.0", - "@aws-sdk/types": "3.692.0", - "@smithy/credential-provider-imds": "^3.2.6", - "@smithy/property-provider": "^3.1.9", - "@smithy/shared-ini-file-loader": "^3.1.10", - "@smithy/types": "^3.7.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sts": "^3.693.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/credential-provider-node": { - "version": "3.693.0", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/url-parser": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.0.4.tgz", + "integrity": "sha512-eMkc144MuN7B0TDA4U2fKs+BqczVbk3W+qIvcoCY6D1JY3hnAdCuhCZODC+GAeaxj0p6Jroz4+XMUn3PCxQQeQ==", "dependencies": { - "@aws-sdk/credential-provider-env": "3.693.0", - "@aws-sdk/credential-provider-http": "3.693.0", - "@aws-sdk/credential-provider-ini": "3.693.0", - "@aws-sdk/credential-provider-process": "3.693.0", - "@aws-sdk/credential-provider-sso": "3.693.0", - "@aws-sdk/credential-provider-web-identity": "3.693.0", - "@aws-sdk/types": "3.692.0", - "@smithy/credential-provider-imds": "^3.2.6", - "@smithy/property-provider": "^3.1.9", - "@smithy/shared-ini-file-loader": "^3.1.10", - "@smithy/types": "^3.7.0", + "@smithy/querystring-parser": "^4.0.4", + "@smithy/types": "^4.3.1", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.693.0", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/util-base64": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-4.0.0.tgz", + "integrity": "sha512-CvHfCmO2mchox9kjrtzoHkWHxjHZzaFojLc8quxXY7WAAMAg43nuxwv95tATVgQFNDwd4M9S1qFzj40Ul41Kmg==", "dependencies": { - "@aws-sdk/client-sso": "3.693.0", - "@aws-sdk/core": "3.693.0", - "@aws-sdk/token-providers": "3.693.0", - "@aws-sdk/types": "3.692.0", - "@smithy/property-provider": "^3.1.9", - "@smithy/shared-ini-file-loader": "^3.1.10", - "@smithy/types": "^3.7.0", + "@smithy/util-buffer-from": "^4.0.0", + "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.693.0", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/util-body-length-browser": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-4.0.0.tgz", + "integrity": "sha512-sNi3DL0/k64/LO3A256M+m3CDdG6V7WKWHdAiBBMUN8S3hK3aMPhwnPik2A/a2ONN+9doY9UxaLfgqsIRg69QA==", "dependencies": { - "@aws-sdk/core": "3.693.0", - "@aws-sdk/types": "3.692.0", - "@smithy/property-provider": "^3.1.9", - "@smithy/types": "^3.7.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sts": "^3.693.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/middleware-host-header": { - "version": "3.693.0", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/util-body-length-node": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-4.0.0.tgz", + "integrity": "sha512-q0iDP3VsZzqJyje8xJWEJCNIu3lktUGVoSy1KB0UWym2CL1siV3artm+u1DFYTLejpsrdGyCSWBdGNjJzfDPjg==", "dependencies": { - "@aws-sdk/types": "3.692.0", - "@smithy/protocol-http": "^4.1.6", - "@smithy/types": "^3.7.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/middleware-logger": { - "version": "3.693.0", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/util-buffer-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-4.0.0.tgz", + "integrity": "sha512-9TOQ7781sZvddgO8nxueKi3+yGvkY35kotA0Y6BWRajAv8jjmigQ1sBwz0UX47pQMYXJPahSKEKYFgt+rXdcug==", "dependencies": { - "@aws-sdk/types": "3.692.0", - "@smithy/types": "^3.7.0", + "@smithy/is-array-buffer": "^4.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.693.0", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/util-config-provider": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-4.0.0.tgz", + "integrity": "sha512-L1RBVzLyfE8OXH+1hsJ8p+acNUSirQnWQ6/EgpchV88G6zGBTDPdXiiExei6Z1wR2RxYvxY/XLw6AMNCCt8H3w==", "dependencies": { - "@aws-sdk/types": "3.692.0", - "@smithy/protocol-http": "^4.1.6", - "@smithy/types": "^3.7.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.693.0", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/util-defaults-mode-browser": { + "version": "4.0.25", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.0.25.tgz", + "integrity": "sha512-pxEWsxIsOPLfKNXvpgFHBGFC3pKYKUFhrud1kyooO9CJai6aaKDHfT10Mi5iiipPXN/JhKAu3qX9o75+X85OdQ==", "dependencies": { - "@aws-sdk/core": "3.693.0", - "@aws-sdk/types": "3.692.0", - "@aws-sdk/util-endpoints": "3.693.0", - "@smithy/core": "^2.5.2", - "@smithy/protocol-http": "^4.1.6", - "@smithy/types": "^3.7.0", + "@smithy/property-provider": "^4.0.4", + "@smithy/smithy-client": "^4.4.9", + "@smithy/types": "^4.3.1", + "bowser": "^2.11.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/region-config-resolver": { - "version": "3.693.0", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/util-defaults-mode-node": { + "version": "4.0.25", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.0.25.tgz", + "integrity": "sha512-+w4n4hKFayeCyELZLfsSQG5mCC3TwSkmRHv4+el5CzFU8ToQpYGhpV7mrRzqlwKkntlPilT1HJy1TVeEvEjWOQ==", "dependencies": { - "@aws-sdk/types": "3.692.0", - "@smithy/node-config-provider": "^3.1.10", - "@smithy/types": "^3.7.0", - "@smithy/util-config-provider": "^3.0.0", - "@smithy/util-middleware": "^3.0.9", + "@smithy/config-resolver": "^4.1.4", + "@smithy/credential-provider-imds": "^4.0.6", + "@smithy/node-config-provider": "^4.1.3", + "@smithy/property-provider": "^4.0.4", + "@smithy/smithy-client": "^4.4.9", + "@smithy/types": "^4.3.1", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/token-providers": { - "version": "3.693.0", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/util-endpoints": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.0.6.tgz", + "integrity": "sha512-YARl3tFL3WgPuLzljRUnrS2ngLiUtkwhQtj8PAL13XZSyUiNLQxwG3fBBq3QXFqGFUXepIN73pINp3y8c2nBmA==", "dependencies": { - "@aws-sdk/types": "3.692.0", - "@smithy/property-provider": "^3.1.9", - "@smithy/shared-ini-file-loader": "^3.1.10", - "@smithy/types": "^3.7.0", + "@smithy/node-config-provider": "^4.1.3", + "@smithy/types": "^4.3.1", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sso-oidc": "^3.693.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/util-endpoints": { - "version": "3.693.0", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/util-hex-encoding": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-4.0.0.tgz", + "integrity": "sha512-Yk5mLhHtfIgW2W2WQZWSg5kuMZCVbvhFmC7rV4IO2QqnZdbEFPmQnCcGMAX2z/8Qj3B9hYYNjZOhWym+RwhePw==", "dependencies": { - "@aws-sdk/types": "3.692.0", - "@smithy/types": "^3.7.0", - "@smithy/util-endpoints": "^2.1.5", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.693.0", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/util-middleware": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.0.4.tgz", + "integrity": "sha512-9MLKmkBmf4PRb0ONJikCbCwORACcil6gUWojwARCClT7RmLzF04hUR4WdRprIXal7XVyrddadYNfp2eF3nrvtQ==", "dependencies": { - "@aws-sdk/types": "3.692.0", - "@smithy/types": "^3.7.0", - "bowser": "^2.11.0", + "@smithy/types": "^4.3.1", "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.693.0", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/util-retry": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.0.6.tgz", + "integrity": "sha512-+YekoF2CaSMv6zKrA6iI/N9yva3Gzn4L6n35Luydweu5MMPYpiGZlWqehPHDHyNbnyaYlz/WJyYAZnC+loBDZg==", "dependencies": { - "@aws-sdk/middleware-user-agent": "3.693.0", - "@aws-sdk/types": "3.692.0", - "@smithy/node-config-provider": "^3.1.10", - "@smithy/types": "^3.7.0", + "@smithy/service-error-classification": "^4.0.6", + "@smithy/types": "^4.3.1", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "aws-crt": ">=1.0.0" - }, - "peerDependenciesMeta": { - "aws-crt": { - "optional": true - } + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-s3/node_modules/@smithy/is-array-buffer": { - "version": "3.0.0", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/util-stream": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.2.3.tgz", + "integrity": "sha512-cQn412DWHHFNKrQfbHY8vSFI3nTROY1aIKji9N0tpp8gUABRilr7wdf8fqBbSlXresobM+tQFNk6I+0LXK/YZg==", "dependencies": { + "@smithy/fetch-http-handler": "^5.1.0", + "@smithy/node-http-handler": "^4.1.0", + "@smithy/types": "^4.3.1", + "@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", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-s3/node_modules/@smithy/util-buffer-from": { - "version": "3.0.0", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-s3-control/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==", "dependencies": { - "@smithy/is-array-buffer": "^3.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-s3/node_modules/@smithy/util-utf8": { - "version": "3.0.0", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/util-utf8": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.0.0.tgz", + "integrity": "sha512-b+zebfKCfRdgNJDknHCob3O7FpeYQN6ZG6YLExMcasDHsCXlsXCEuiPZeLnJLpwa5dvPetGlnGCiMHuLwGvFow==", "dependencies": { - "@smithy/util-buffer-from": "^3.0.0", + "@smithy/util-buffer-from": "^4.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-sagemaker": { - "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sagemaker/-/client-sagemaker-3.693.0.tgz", - "integrity": "sha512-iInrrb7V9f0CRBiVCaaxCbpoBRQ5BqxX4elRYI6gE/pSDD2tPqmRfm4reahMtTUcKg1jaSGuvqJLfOpp0HTozQ==", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-s3-control/node_modules/fast-xml-parser": { + "version": "5.2.5", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.2.5.tgz", + "integrity": "sha512-pfX9uG9Ki0yekDHx2SiuRIyFdyAr1kMIMitPvb0YBo8SUfKvia7w7FIyd/l6av85pFYRhZscS75MwMnbvY+hcQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.693.0", - "@aws-sdk/client-sts": "3.693.0", - "@aws-sdk/core": "3.693.0", - "@aws-sdk/credential-provider-node": "3.693.0", - "@aws-sdk/middleware-host-header": "3.693.0", - "@aws-sdk/middleware-logger": "3.693.0", - "@aws-sdk/middleware-recursion-detection": "3.693.0", - "@aws-sdk/middleware-user-agent": "3.693.0", - "@aws-sdk/region-config-resolver": "3.693.0", - "@aws-sdk/types": "3.692.0", - "@aws-sdk/util-endpoints": "3.693.0", - "@aws-sdk/util-user-agent-browser": "3.693.0", - "@aws-sdk/util-user-agent-node": "3.693.0", - "@smithy/config-resolver": "^3.0.11", - "@smithy/core": "^2.5.2", - "@smithy/fetch-http-handler": "^4.1.0", - "@smithy/hash-node": "^3.0.9", - "@smithy/invalid-dependency": "^3.0.9", - "@smithy/middleware-content-length": "^3.0.11", - "@smithy/middleware-endpoint": "^3.2.2", - "@smithy/middleware-retry": "^3.0.26", - "@smithy/middleware-serde": "^3.0.9", - "@smithy/middleware-stack": "^3.0.9", - "@smithy/node-config-provider": "^3.1.10", - "@smithy/node-http-handler": "^3.3.0", - "@smithy/protocol-http": "^4.1.6", - "@smithy/smithy-client": "^3.4.3", - "@smithy/types": "^3.7.0", - "@smithy/url-parser": "^3.0.9", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.26", - "@smithy/util-defaults-mode-node": "^3.0.26", - "@smithy/util-endpoints": "^2.1.5", - "@smithy/util-middleware": "^3.0.9", - "@smithy/util-retry": "^3.0.9", - "@smithy/util-utf8": "^3.0.0", - "@smithy/util-waiter": "^3.1.8", - "@types/uuid": "^9.0.1", - "tslib": "^2.6.2", - "uuid": "^9.0.1" + "strnum": "^2.1.0" }, - "engines": { - "node": ">=16.0.0" + "bin": { + "fxparser": "src/cli/cli.js" } }, - "node_modules/@aws-sdk/client-sagemaker/node_modules/@aws-sdk/client-sso": { + "node_modules/@aws-sdk/client-s3-control/node_modules/strnum": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.1.1.tgz", + "integrity": "sha512-7ZvoFTiCnGxBtDqJ//Cu6fWtZtc7Y3x+QOirG15wztbdngGSkht27o2pyGWrVy0b4WAy3jbKmnoK6g5VlVNUUw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ] + }, + "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/client-sso": { "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.693.0.tgz", - "integrity": "sha512-QEynrBC26x6TG9ZMzApR/kZ3lmt4lEIs2D+cHuDxt6fDGzahBUsQFBwJqhizzsM97JJI5YvmJhmihoYjdSSaXA==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", @@ -20910,10 +21017,8 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sagemaker/node_modules/@aws-sdk/client-sso-oidc": { + "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/client-sso-oidc": { "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.693.0.tgz", - "integrity": "sha512-UEDbYlYtK/e86OOMyFR4zEPyenIxDzO2DRdz3fwVW7RzZ94wfmSwBh/8skzPTuY1G7sI064cjHW0b0QG01Sdtg==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", @@ -20963,10 +21068,8 @@ "@aws-sdk/client-sts": "^3.693.0" } }, - "node_modules/@aws-sdk/client-sagemaker/node_modules/@aws-sdk/client-sts": { + "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/client-sts": { "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.693.0.tgz", - "integrity": "sha512-4S2y7VEtvdnjJX4JPl4kDQlslxXEZFnC50/UXVUYSt/AMc5A/GgspFNA5FVz4E3Gwpfobbf23hR2NBF8AGvYoQ==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", @@ -21014,10 +21117,8 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sagemaker/node_modules/@aws-sdk/core": { + "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/core": { "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.693.0.tgz", - "integrity": "sha512-v6Z/kWmLFqRLDPEwl9hJGhtTgIFHjZugSfF1Yqffdxf4n1AWgtHS7qSegakuMyN5pP4K2tvUD8qHJ+gGe2Bw2A==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "3.692.0", @@ -21036,10 +21137,8 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sagemaker/node_modules/@aws-sdk/credential-provider-http": { + "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/credential-provider-http": { "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.693.0.tgz", - "integrity": "sha512-sL8MvwNJU7ZpD7/d2VVb3by1GknIJUxzTIgYtVkDVA/ojo+KRQSSHxcj0EWWXF5DTSh2Tm+LrEug3y1ZyKHsDA==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/core": "3.693.0", @@ -21057,10 +21156,8 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sagemaker/node_modules/@aws-sdk/credential-provider-ini": { + "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/credential-provider-ini": { "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.693.0.tgz", - "integrity": "sha512-kvaa4mXhCCOuW7UQnBhYqYfgWmwy7WSBSDClutwSLPZvgrhYj2l16SD2lN4IfYdxARYMJJ1lFYp3/jJG/9Yk4Q==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/core": "3.693.0", @@ -21083,10 +21180,8 @@ "@aws-sdk/client-sts": "^3.693.0" } }, - "node_modules/@aws-sdk/client-sagemaker/node_modules/@aws-sdk/credential-provider-node": { + "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/credential-provider-node": { "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.693.0.tgz", - "integrity": "sha512-42WMsBjTNnjYxYuM3qD/Nq+8b7UdMopUq5OduMDxoM3mFTV6PXMMnfI4Z1TNnR4tYRvPXAnuNltF6xmjKbSJRA==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/credential-provider-env": "3.693.0", @@ -21106,10 +21201,8 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sagemaker/node_modules/@aws-sdk/credential-provider-sso": { + "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/credential-provider-sso": { "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.693.0.tgz", - "integrity": "sha512-479UlJxY+BFjj3pJFYUNC0DCMrykuG7wBAXfsvZqQxKUa83DnH5Q1ID/N2hZLkxjGd4ZW0AC3lTOMxFelGzzpQ==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/client-sso": "3.693.0", @@ -21125,10 +21218,8 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sagemaker/node_modules/@aws-sdk/credential-provider-web-identity": { + "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/credential-provider-web-identity": { "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.693.0.tgz", - "integrity": "sha512-8LB210Pr6VeCiSb2hIra+sAH4KUBLyGaN50axHtIgufVK8jbKIctTZcVY5TO9Se+1107TsruzeXS7VeqVdJfFA==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/core": "3.693.0", @@ -21144,10 +21235,8 @@ "@aws-sdk/client-sts": "^3.693.0" } }, - "node_modules/@aws-sdk/client-sagemaker/node_modules/@aws-sdk/middleware-host-header": { + "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/middleware-host-header": { "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.693.0.tgz", - "integrity": "sha512-BCki6sAZ5jYwIN/t3ElCiwerHad69ipHwPsDCxJQyeiOnJ8HG+lEpnVIfrnI8A0fLQNSF3Gtx6ahfBpKiv1Oug==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "3.692.0", @@ -21159,10 +21248,8 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sagemaker/node_modules/@aws-sdk/middleware-logger": { + "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/middleware-logger": { "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.693.0.tgz", - "integrity": "sha512-dXnXDPr+wIiJ1TLADACI1g9pkSB21KkMIko2u4CJ2JCBoxi5IqeTnVoa6YcC8GdFNVRl+PorZ3Zqfmf1EOTC6w==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "3.692.0", @@ -21173,10 +21260,8 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sagemaker/node_modules/@aws-sdk/middleware-recursion-detection": { + "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/middleware-recursion-detection": { "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.693.0.tgz", - "integrity": "sha512-0LDmM+VxXp0u3rG0xQRWD/q6Ubi7G8I44tBPahevD5CaiDZTkmNTrVUf0VEJgVe0iCKBppACMBDkLB0/ETqkFw==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "3.692.0", @@ -21188,10 +21273,8 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sagemaker/node_modules/@aws-sdk/middleware-user-agent": { + "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/middleware-user-agent": { "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.693.0.tgz", - "integrity": "sha512-/KUq/KEpFFbQmNmpp7SpAtFAdViquDfD2W0QcG07zYBfz9MwE2ig48ALynXm5sMpRmnG7sJXjdvPtTsSVPfkiw==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/core": "3.693.0", @@ -21206,10 +21289,8 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sagemaker/node_modules/@aws-sdk/region-config-resolver": { + "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/region-config-resolver": { "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.693.0.tgz", - "integrity": "sha512-YLUkMsUY0GLW/nfwlZ69cy1u07EZRmsv8Z9m0qW317/EZaVx59hcvmcvb+W4bFqj5E8YImTjoGfE4cZ0F9mkyw==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "3.692.0", @@ -21223,10 +21304,8 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sagemaker/node_modules/@aws-sdk/token-providers": { + "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/token-providers": { "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.693.0.tgz", - "integrity": "sha512-nDBTJMk1l/YmFULGfRbToOA2wjf+FkQT4dMgYCv+V9uSYsMzQj8A7Tha2dz9yv4vnQgYaEiErQ8d7HVyXcVEoA==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "3.692.0", @@ -21242,10 +21321,8 @@ "@aws-sdk/client-sso-oidc": "^3.693.0" } }, - "node_modules/@aws-sdk/client-sagemaker/node_modules/@aws-sdk/util-endpoints": { + "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/util-endpoints": { "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.693.0.tgz", - "integrity": "sha512-eo4F6DRQ/kxS3gxJpLRv+aDNy76DxQJL5B3DPzpr9Vkq0ygVoi4GT5oIZLVaAVIJmi6k5qq9dLsYZfWLUxJJSg==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "3.692.0", @@ -21257,10 +21334,8 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sagemaker/node_modules/@aws-sdk/util-user-agent-browser": { + "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/util-user-agent-browser": { "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.693.0.tgz", - "integrity": "sha512-6EUfuKOujtddy18OLJUaXfKBgs+UcbZ6N/3QV4iOkubCUdeM1maIqs++B9bhCbWeaeF5ORizJw5FTwnyNjE/mw==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "3.692.0", @@ -21269,10 +21344,8 @@ "tslib": "^2.6.2" } }, - "node_modules/@aws-sdk/client-sagemaker/node_modules/@aws-sdk/util-user-agent-node": { + "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/util-user-agent-node": { "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.693.0.tgz", - "integrity": "sha512-td0OVX8m5ZKiXtecIDuzY3Y3UZIzvxEr57Hp21NOwieqKCG2UeyQWWeGPv0FQaU7dpTkvFmVNI+tx9iB8V/Nhg==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/middleware-user-agent": "3.693.0", @@ -21293,10 +21366,8 @@ } } }, - "node_modules/@aws-sdk/client-sagemaker/node_modules/@smithy/is-array-buffer": { + "node_modules/@aws-sdk/client-s3/node_modules/@smithy/is-array-buffer": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-3.0.0.tgz", - "integrity": "sha512-+Fsu6Q6C4RSJiy81Y8eApjEB5gVtM+oFKTffg+jSuwtvomJJrhUJBu2zS8wjXSgH/g1MKEWrzyChTBe6clb5FQ==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -21305,10 +21376,8 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sagemaker/node_modules/@smithy/util-buffer-from": { + "node_modules/@aws-sdk/client-s3/node_modules/@smithy/util-buffer-from": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-3.0.0.tgz", - "integrity": "sha512-aEOHCgq5RWFbP+UDPvPot26EJHjOC+bRgse5A8V3FSShqd5E5UN4qc7zkwsvJPPAVsf73QwYcHN1/gt/rtLwQA==", "license": "Apache-2.0", "dependencies": { "@smithy/is-array-buffer": "^3.0.0", @@ -21318,10 +21387,8 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sagemaker/node_modules/@smithy/util-utf8": { + "node_modules/@aws-sdk/client-s3/node_modules/@smithy/util-utf8": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-3.0.0.tgz", - "integrity": "sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==", "license": "Apache-2.0", "dependencies": { "@smithy/util-buffer-from": "^3.0.0", @@ -21331,10 +21398,10 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sfn": { + "node_modules/@aws-sdk/client-sagemaker": { "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sfn/-/client-sfn-3.693.0.tgz", - "integrity": "sha512-B2K3aXGnP7eD1ITEIx4kO43l1N5OLqHdLW4AUbwoopwU5qzicc9jADrthXpGxymJI8AhJz9T2WtLmceBU2EpNg==", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sagemaker/-/client-sagemaker-3.693.0.tgz", + "integrity": "sha512-iInrrb7V9f0CRBiVCaaxCbpoBRQ5BqxX4elRYI6gE/pSDD2tPqmRfm4reahMtTUcKg1jaSGuvqJLfOpp0HTozQ==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", @@ -21377,6 +21444,7 @@ "@smithy/util-middleware": "^3.0.9", "@smithy/util-retry": "^3.0.9", "@smithy/util-utf8": "^3.0.0", + "@smithy/util-waiter": "^3.1.8", "@types/uuid": "^9.0.1", "tslib": "^2.6.2", "uuid": "^9.0.1" @@ -21385,7 +21453,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sfn/node_modules/@aws-sdk/client-sso": { + "node_modules/@aws-sdk/client-sagemaker/node_modules/@aws-sdk/client-sso": { "version": "3.693.0", "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.693.0.tgz", "integrity": "sha512-QEynrBC26x6TG9ZMzApR/kZ3lmt4lEIs2D+cHuDxt6fDGzahBUsQFBwJqhizzsM97JJI5YvmJhmihoYjdSSaXA==", @@ -21434,7 +21502,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sfn/node_modules/@aws-sdk/client-sso-oidc": { + "node_modules/@aws-sdk/client-sagemaker/node_modules/@aws-sdk/client-sso-oidc": { "version": "3.693.0", "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.693.0.tgz", "integrity": "sha512-UEDbYlYtK/e86OOMyFR4zEPyenIxDzO2DRdz3fwVW7RzZ94wfmSwBh/8skzPTuY1G7sI064cjHW0b0QG01Sdtg==", @@ -21487,7 +21555,7 @@ "@aws-sdk/client-sts": "^3.693.0" } }, - "node_modules/@aws-sdk/client-sfn/node_modules/@aws-sdk/client-sts": { + "node_modules/@aws-sdk/client-sagemaker/node_modules/@aws-sdk/client-sts": { "version": "3.693.0", "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.693.0.tgz", "integrity": "sha512-4S2y7VEtvdnjJX4JPl4kDQlslxXEZFnC50/UXVUYSt/AMc5A/GgspFNA5FVz4E3Gwpfobbf23hR2NBF8AGvYoQ==", @@ -21538,7 +21606,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sfn/node_modules/@aws-sdk/core": { + "node_modules/@aws-sdk/client-sagemaker/node_modules/@aws-sdk/core": { "version": "3.693.0", "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.693.0.tgz", "integrity": "sha512-v6Z/kWmLFqRLDPEwl9hJGhtTgIFHjZugSfF1Yqffdxf4n1AWgtHS7qSegakuMyN5pP4K2tvUD8qHJ+gGe2Bw2A==", @@ -21560,7 +21628,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sfn/node_modules/@aws-sdk/credential-provider-http": { + "node_modules/@aws-sdk/client-sagemaker/node_modules/@aws-sdk/credential-provider-http": { "version": "3.693.0", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.693.0.tgz", "integrity": "sha512-sL8MvwNJU7ZpD7/d2VVb3by1GknIJUxzTIgYtVkDVA/ojo+KRQSSHxcj0EWWXF5DTSh2Tm+LrEug3y1ZyKHsDA==", @@ -21581,7 +21649,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sfn/node_modules/@aws-sdk/credential-provider-ini": { + "node_modules/@aws-sdk/client-sagemaker/node_modules/@aws-sdk/credential-provider-ini": { "version": "3.693.0", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.693.0.tgz", "integrity": "sha512-kvaa4mXhCCOuW7UQnBhYqYfgWmwy7WSBSDClutwSLPZvgrhYj2l16SD2lN4IfYdxARYMJJ1lFYp3/jJG/9Yk4Q==", @@ -21607,7 +21675,7 @@ "@aws-sdk/client-sts": "^3.693.0" } }, - "node_modules/@aws-sdk/client-sfn/node_modules/@aws-sdk/credential-provider-node": { + "node_modules/@aws-sdk/client-sagemaker/node_modules/@aws-sdk/credential-provider-node": { "version": "3.693.0", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.693.0.tgz", "integrity": "sha512-42WMsBjTNnjYxYuM3qD/Nq+8b7UdMopUq5OduMDxoM3mFTV6PXMMnfI4Z1TNnR4tYRvPXAnuNltF6xmjKbSJRA==", @@ -21630,7 +21698,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sfn/node_modules/@aws-sdk/credential-provider-sso": { + "node_modules/@aws-sdk/client-sagemaker/node_modules/@aws-sdk/credential-provider-sso": { "version": "3.693.0", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.693.0.tgz", "integrity": "sha512-479UlJxY+BFjj3pJFYUNC0DCMrykuG7wBAXfsvZqQxKUa83DnH5Q1ID/N2hZLkxjGd4ZW0AC3lTOMxFelGzzpQ==", @@ -21649,7 +21717,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sfn/node_modules/@aws-sdk/credential-provider-web-identity": { + "node_modules/@aws-sdk/client-sagemaker/node_modules/@aws-sdk/credential-provider-web-identity": { "version": "3.693.0", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.693.0.tgz", "integrity": "sha512-8LB210Pr6VeCiSb2hIra+sAH4KUBLyGaN50axHtIgufVK8jbKIctTZcVY5TO9Se+1107TsruzeXS7VeqVdJfFA==", @@ -21668,7 +21736,7 @@ "@aws-sdk/client-sts": "^3.693.0" } }, - "node_modules/@aws-sdk/client-sfn/node_modules/@aws-sdk/middleware-host-header": { + "node_modules/@aws-sdk/client-sagemaker/node_modules/@aws-sdk/middleware-host-header": { "version": "3.693.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.693.0.tgz", "integrity": "sha512-BCki6sAZ5jYwIN/t3ElCiwerHad69ipHwPsDCxJQyeiOnJ8HG+lEpnVIfrnI8A0fLQNSF3Gtx6ahfBpKiv1Oug==", @@ -21683,7 +21751,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sfn/node_modules/@aws-sdk/middleware-logger": { + "node_modules/@aws-sdk/client-sagemaker/node_modules/@aws-sdk/middleware-logger": { "version": "3.693.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.693.0.tgz", "integrity": "sha512-dXnXDPr+wIiJ1TLADACI1g9pkSB21KkMIko2u4CJ2JCBoxi5IqeTnVoa6YcC8GdFNVRl+PorZ3Zqfmf1EOTC6w==", @@ -21697,7 +21765,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sfn/node_modules/@aws-sdk/middleware-recursion-detection": { + "node_modules/@aws-sdk/client-sagemaker/node_modules/@aws-sdk/middleware-recursion-detection": { "version": "3.693.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.693.0.tgz", "integrity": "sha512-0LDmM+VxXp0u3rG0xQRWD/q6Ubi7G8I44tBPahevD5CaiDZTkmNTrVUf0VEJgVe0iCKBppACMBDkLB0/ETqkFw==", @@ -21712,7 +21780,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sfn/node_modules/@aws-sdk/middleware-user-agent": { + "node_modules/@aws-sdk/client-sagemaker/node_modules/@aws-sdk/middleware-user-agent": { "version": "3.693.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.693.0.tgz", "integrity": "sha512-/KUq/KEpFFbQmNmpp7SpAtFAdViquDfD2W0QcG07zYBfz9MwE2ig48ALynXm5sMpRmnG7sJXjdvPtTsSVPfkiw==", @@ -21730,7 +21798,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sfn/node_modules/@aws-sdk/region-config-resolver": { + "node_modules/@aws-sdk/client-sagemaker/node_modules/@aws-sdk/region-config-resolver": { "version": "3.693.0", "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.693.0.tgz", "integrity": "sha512-YLUkMsUY0GLW/nfwlZ69cy1u07EZRmsv8Z9m0qW317/EZaVx59hcvmcvb+W4bFqj5E8YImTjoGfE4cZ0F9mkyw==", @@ -21747,7 +21815,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sfn/node_modules/@aws-sdk/token-providers": { + "node_modules/@aws-sdk/client-sagemaker/node_modules/@aws-sdk/token-providers": { "version": "3.693.0", "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.693.0.tgz", "integrity": "sha512-nDBTJMk1l/YmFULGfRbToOA2wjf+FkQT4dMgYCv+V9uSYsMzQj8A7Tha2dz9yv4vnQgYaEiErQ8d7HVyXcVEoA==", @@ -21766,7 +21834,7 @@ "@aws-sdk/client-sso-oidc": "^3.693.0" } }, - "node_modules/@aws-sdk/client-sfn/node_modules/@aws-sdk/util-endpoints": { + "node_modules/@aws-sdk/client-sagemaker/node_modules/@aws-sdk/util-endpoints": { "version": "3.693.0", "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.693.0.tgz", "integrity": "sha512-eo4F6DRQ/kxS3gxJpLRv+aDNy76DxQJL5B3DPzpr9Vkq0ygVoi4GT5oIZLVaAVIJmi6k5qq9dLsYZfWLUxJJSg==", @@ -21781,7 +21849,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sfn/node_modules/@aws-sdk/util-user-agent-browser": { + "node_modules/@aws-sdk/client-sagemaker/node_modules/@aws-sdk/util-user-agent-browser": { "version": "3.693.0", "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.693.0.tgz", "integrity": "sha512-6EUfuKOujtddy18OLJUaXfKBgs+UcbZ6N/3QV4iOkubCUdeM1maIqs++B9bhCbWeaeF5ORizJw5FTwnyNjE/mw==", @@ -21793,7 +21861,7 @@ "tslib": "^2.6.2" } }, - "node_modules/@aws-sdk/client-sfn/node_modules/@aws-sdk/util-user-agent-node": { + "node_modules/@aws-sdk/client-sagemaker/node_modules/@aws-sdk/util-user-agent-node": { "version": "3.693.0", "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.693.0.tgz", "integrity": "sha512-td0OVX8m5ZKiXtecIDuzY3Y3UZIzvxEr57Hp21NOwieqKCG2UeyQWWeGPv0FQaU7dpTkvFmVNI+tx9iB8V/Nhg==", @@ -21817,7 +21885,7 @@ } } }, - "node_modules/@aws-sdk/client-sfn/node_modules/@smithy/is-array-buffer": { + "node_modules/@aws-sdk/client-sagemaker/node_modules/@smithy/is-array-buffer": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-3.0.0.tgz", "integrity": "sha512-+Fsu6Q6C4RSJiy81Y8eApjEB5gVtM+oFKTffg+jSuwtvomJJrhUJBu2zS8wjXSgH/g1MKEWrzyChTBe6clb5FQ==", @@ -21829,7 +21897,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sfn/node_modules/@smithy/util-buffer-from": { + "node_modules/@aws-sdk/client-sagemaker/node_modules/@smithy/util-buffer-from": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-3.0.0.tgz", "integrity": "sha512-aEOHCgq5RWFbP+UDPvPot26EJHjOC+bRgse5A8V3FSShqd5E5UN4qc7zkwsvJPPAVsf73QwYcHN1/gt/rtLwQA==", @@ -21842,7 +21910,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sfn/node_modules/@smithy/util-utf8": { + "node_modules/@aws-sdk/client-sagemaker/node_modules/@smithy/util-utf8": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-3.0.0.tgz", "integrity": "sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==", @@ -21855,8 +21923,10 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-ssm": { + "node_modules/@aws-sdk/client-sfn": { "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sfn/-/client-sfn-3.693.0.tgz", + "integrity": "sha512-B2K3aXGnP7eD1ITEIx4kO43l1N5OLqHdLW4AUbwoopwU5qzicc9jADrthXpGxymJI8AhJz9T2WtLmceBU2EpNg==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", @@ -21899,7 +21969,6 @@ "@smithy/util-middleware": "^3.0.9", "@smithy/util-retry": "^3.0.9", "@smithy/util-utf8": "^3.0.0", - "@smithy/util-waiter": "^3.1.8", "@types/uuid": "^9.0.1", "tslib": "^2.6.2", "uuid": "^9.0.1" @@ -21908,8 +21977,10 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/client-sso": { + "node_modules/@aws-sdk/client-sfn/node_modules/@aws-sdk/client-sso": { "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.693.0.tgz", + "integrity": "sha512-QEynrBC26x6TG9ZMzApR/kZ3lmt4lEIs2D+cHuDxt6fDGzahBUsQFBwJqhizzsM97JJI5YvmJhmihoYjdSSaXA==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", @@ -21955,8 +22026,10 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/client-sso-oidc": { + "node_modules/@aws-sdk/client-sfn/node_modules/@aws-sdk/client-sso-oidc": { "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.693.0.tgz", + "integrity": "sha512-UEDbYlYtK/e86OOMyFR4zEPyenIxDzO2DRdz3fwVW7RzZ94wfmSwBh/8skzPTuY1G7sI064cjHW0b0QG01Sdtg==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", @@ -22006,8 +22079,10 @@ "@aws-sdk/client-sts": "^3.693.0" } }, - "node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/client-sts": { + "node_modules/@aws-sdk/client-sfn/node_modules/@aws-sdk/client-sts": { "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.693.0.tgz", + "integrity": "sha512-4S2y7VEtvdnjJX4JPl4kDQlslxXEZFnC50/UXVUYSt/AMc5A/GgspFNA5FVz4E3Gwpfobbf23hR2NBF8AGvYoQ==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", @@ -22055,8 +22130,10 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/core": { + "node_modules/@aws-sdk/client-sfn/node_modules/@aws-sdk/core": { "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.693.0.tgz", + "integrity": "sha512-v6Z/kWmLFqRLDPEwl9hJGhtTgIFHjZugSfF1Yqffdxf4n1AWgtHS7qSegakuMyN5pP4K2tvUD8qHJ+gGe2Bw2A==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "3.692.0", @@ -22075,8 +22152,10 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/credential-provider-http": { + "node_modules/@aws-sdk/client-sfn/node_modules/@aws-sdk/credential-provider-http": { "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.693.0.tgz", + "integrity": "sha512-sL8MvwNJU7ZpD7/d2VVb3by1GknIJUxzTIgYtVkDVA/ojo+KRQSSHxcj0EWWXF5DTSh2Tm+LrEug3y1ZyKHsDA==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/core": "3.693.0", @@ -22094,8 +22173,10 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/credential-provider-ini": { + "node_modules/@aws-sdk/client-sfn/node_modules/@aws-sdk/credential-provider-ini": { "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.693.0.tgz", + "integrity": "sha512-kvaa4mXhCCOuW7UQnBhYqYfgWmwy7WSBSDClutwSLPZvgrhYj2l16SD2lN4IfYdxARYMJJ1lFYp3/jJG/9Yk4Q==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/core": "3.693.0", @@ -22112,810 +22193,4192 @@ "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sts": "^3.693.0" + "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sts": "^3.693.0" + } + }, + "node_modules/@aws-sdk/client-sfn/node_modules/@aws-sdk/credential-provider-node": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.693.0.tgz", + "integrity": "sha512-42WMsBjTNnjYxYuM3qD/Nq+8b7UdMopUq5OduMDxoM3mFTV6PXMMnfI4Z1TNnR4tYRvPXAnuNltF6xmjKbSJRA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.693.0", + "@aws-sdk/credential-provider-http": "3.693.0", + "@aws-sdk/credential-provider-ini": "3.693.0", + "@aws-sdk/credential-provider-process": "3.693.0", + "@aws-sdk/credential-provider-sso": "3.693.0", + "@aws-sdk/credential-provider-web-identity": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@smithy/credential-provider-imds": "^3.2.6", + "@smithy/property-provider": "^3.1.9", + "@smithy/shared-ini-file-loader": "^3.1.10", + "@smithy/types": "^3.7.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-sfn/node_modules/@aws-sdk/credential-provider-sso": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.693.0.tgz", + "integrity": "sha512-479UlJxY+BFjj3pJFYUNC0DCMrykuG7wBAXfsvZqQxKUa83DnH5Q1ID/N2hZLkxjGd4ZW0AC3lTOMxFelGzzpQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/client-sso": "3.693.0", + "@aws-sdk/core": "3.693.0", + "@aws-sdk/token-providers": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@smithy/property-provider": "^3.1.9", + "@smithy/shared-ini-file-loader": "^3.1.10", + "@smithy/types": "^3.7.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-sfn/node_modules/@aws-sdk/credential-provider-web-identity": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.693.0.tgz", + "integrity": "sha512-8LB210Pr6VeCiSb2hIra+sAH4KUBLyGaN50axHtIgufVK8jbKIctTZcVY5TO9Se+1107TsruzeXS7VeqVdJfFA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@smithy/property-provider": "^3.1.9", + "@smithy/types": "^3.7.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sts": "^3.693.0" + } + }, + "node_modules/@aws-sdk/client-sfn/node_modules/@aws-sdk/middleware-host-header": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.693.0.tgz", + "integrity": "sha512-BCki6sAZ5jYwIN/t3ElCiwerHad69ipHwPsDCxJQyeiOnJ8HG+lEpnVIfrnI8A0fLQNSF3Gtx6ahfBpKiv1Oug==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.692.0", + "@smithy/protocol-http": "^4.1.6", + "@smithy/types": "^3.7.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-sfn/node_modules/@aws-sdk/middleware-logger": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.693.0.tgz", + "integrity": "sha512-dXnXDPr+wIiJ1TLADACI1g9pkSB21KkMIko2u4CJ2JCBoxi5IqeTnVoa6YcC8GdFNVRl+PorZ3Zqfmf1EOTC6w==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.692.0", + "@smithy/types": "^3.7.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-sfn/node_modules/@aws-sdk/middleware-recursion-detection": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.693.0.tgz", + "integrity": "sha512-0LDmM+VxXp0u3rG0xQRWD/q6Ubi7G8I44tBPahevD5CaiDZTkmNTrVUf0VEJgVe0iCKBppACMBDkLB0/ETqkFw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.692.0", + "@smithy/protocol-http": "^4.1.6", + "@smithy/types": "^3.7.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-sfn/node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.693.0.tgz", + "integrity": "sha512-/KUq/KEpFFbQmNmpp7SpAtFAdViquDfD2W0QcG07zYBfz9MwE2ig48ALynXm5sMpRmnG7sJXjdvPtTsSVPfkiw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@aws-sdk/util-endpoints": "3.693.0", + "@smithy/core": "^2.5.2", + "@smithy/protocol-http": "^4.1.6", + "@smithy/types": "^3.7.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-sfn/node_modules/@aws-sdk/region-config-resolver": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.693.0.tgz", + "integrity": "sha512-YLUkMsUY0GLW/nfwlZ69cy1u07EZRmsv8Z9m0qW317/EZaVx59hcvmcvb+W4bFqj5E8YImTjoGfE4cZ0F9mkyw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.692.0", + "@smithy/node-config-provider": "^3.1.10", + "@smithy/types": "^3.7.0", + "@smithy/util-config-provider": "^3.0.0", + "@smithy/util-middleware": "^3.0.9", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-sfn/node_modules/@aws-sdk/token-providers": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.693.0.tgz", + "integrity": "sha512-nDBTJMk1l/YmFULGfRbToOA2wjf+FkQT4dMgYCv+V9uSYsMzQj8A7Tha2dz9yv4vnQgYaEiErQ8d7HVyXcVEoA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.692.0", + "@smithy/property-provider": "^3.1.9", + "@smithy/shared-ini-file-loader": "^3.1.10", + "@smithy/types": "^3.7.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sso-oidc": "^3.693.0" + } + }, + "node_modules/@aws-sdk/client-sfn/node_modules/@aws-sdk/util-endpoints": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.693.0.tgz", + "integrity": "sha512-eo4F6DRQ/kxS3gxJpLRv+aDNy76DxQJL5B3DPzpr9Vkq0ygVoi4GT5oIZLVaAVIJmi6k5qq9dLsYZfWLUxJJSg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.692.0", + "@smithy/types": "^3.7.0", + "@smithy/util-endpoints": "^2.1.5", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-sfn/node_modules/@aws-sdk/util-user-agent-browser": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.693.0.tgz", + "integrity": "sha512-6EUfuKOujtddy18OLJUaXfKBgs+UcbZ6N/3QV4iOkubCUdeM1maIqs++B9bhCbWeaeF5ORizJw5FTwnyNjE/mw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.692.0", + "@smithy/types": "^3.7.0", + "bowser": "^2.11.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-sdk/client-sfn/node_modules/@aws-sdk/util-user-agent-node": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.693.0.tgz", + "integrity": "sha512-td0OVX8m5ZKiXtecIDuzY3Y3UZIzvxEr57Hp21NOwieqKCG2UeyQWWeGPv0FQaU7dpTkvFmVNI+tx9iB8V/Nhg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/middleware-user-agent": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@smithy/node-config-provider": "^3.1.10", + "@smithy/types": "^3.7.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "aws-crt": ">=1.0.0" + }, + "peerDependenciesMeta": { + "aws-crt": { + "optional": true + } + } + }, + "node_modules/@aws-sdk/client-sfn/node_modules/@smithy/is-array-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-3.0.0.tgz", + "integrity": "sha512-+Fsu6Q6C4RSJiy81Y8eApjEB5gVtM+oFKTffg+jSuwtvomJJrhUJBu2zS8wjXSgH/g1MKEWrzyChTBe6clb5FQ==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-sfn/node_modules/@smithy/util-buffer-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-3.0.0.tgz", + "integrity": "sha512-aEOHCgq5RWFbP+UDPvPot26EJHjOC+bRgse5A8V3FSShqd5E5UN4qc7zkwsvJPPAVsf73QwYcHN1/gt/rtLwQA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-sfn/node_modules/@smithy/util-utf8": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-3.0.0.tgz", + "integrity": "sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-ssm": { + "version": "3.693.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/client-sso-oidc": "3.693.0", + "@aws-sdk/client-sts": "3.693.0", + "@aws-sdk/core": "3.693.0", + "@aws-sdk/credential-provider-node": "3.693.0", + "@aws-sdk/middleware-host-header": "3.693.0", + "@aws-sdk/middleware-logger": "3.693.0", + "@aws-sdk/middleware-recursion-detection": "3.693.0", + "@aws-sdk/middleware-user-agent": "3.693.0", + "@aws-sdk/region-config-resolver": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@aws-sdk/util-endpoints": "3.693.0", + "@aws-sdk/util-user-agent-browser": "3.693.0", + "@aws-sdk/util-user-agent-node": "3.693.0", + "@smithy/config-resolver": "^3.0.11", + "@smithy/core": "^2.5.2", + "@smithy/fetch-http-handler": "^4.1.0", + "@smithy/hash-node": "^3.0.9", + "@smithy/invalid-dependency": "^3.0.9", + "@smithy/middleware-content-length": "^3.0.11", + "@smithy/middleware-endpoint": "^3.2.2", + "@smithy/middleware-retry": "^3.0.26", + "@smithy/middleware-serde": "^3.0.9", + "@smithy/middleware-stack": "^3.0.9", + "@smithy/node-config-provider": "^3.1.10", + "@smithy/node-http-handler": "^3.3.0", + "@smithy/protocol-http": "^4.1.6", + "@smithy/smithy-client": "^3.4.3", + "@smithy/types": "^3.7.0", + "@smithy/url-parser": "^3.0.9", + "@smithy/util-base64": "^3.0.0", + "@smithy/util-body-length-browser": "^3.0.0", + "@smithy/util-body-length-node": "^3.0.0", + "@smithy/util-defaults-mode-browser": "^3.0.26", + "@smithy/util-defaults-mode-node": "^3.0.26", + "@smithy/util-endpoints": "^2.1.5", + "@smithy/util-middleware": "^3.0.9", + "@smithy/util-retry": "^3.0.9", + "@smithy/util-utf8": "^3.0.0", + "@smithy/util-waiter": "^3.1.8", + "@types/uuid": "^9.0.1", + "tslib": "^2.6.2", + "uuid": "^9.0.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/client-sso": { + "version": "3.693.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.693.0", + "@aws-sdk/middleware-host-header": "3.693.0", + "@aws-sdk/middleware-logger": "3.693.0", + "@aws-sdk/middleware-recursion-detection": "3.693.0", + "@aws-sdk/middleware-user-agent": "3.693.0", + "@aws-sdk/region-config-resolver": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@aws-sdk/util-endpoints": "3.693.0", + "@aws-sdk/util-user-agent-browser": "3.693.0", + "@aws-sdk/util-user-agent-node": "3.693.0", + "@smithy/config-resolver": "^3.0.11", + "@smithy/core": "^2.5.2", + "@smithy/fetch-http-handler": "^4.1.0", + "@smithy/hash-node": "^3.0.9", + "@smithy/invalid-dependency": "^3.0.9", + "@smithy/middleware-content-length": "^3.0.11", + "@smithy/middleware-endpoint": "^3.2.2", + "@smithy/middleware-retry": "^3.0.26", + "@smithy/middleware-serde": "^3.0.9", + "@smithy/middleware-stack": "^3.0.9", + "@smithy/node-config-provider": "^3.1.10", + "@smithy/node-http-handler": "^3.3.0", + "@smithy/protocol-http": "^4.1.6", + "@smithy/smithy-client": "^3.4.3", + "@smithy/types": "^3.7.0", + "@smithy/url-parser": "^3.0.9", + "@smithy/util-base64": "^3.0.0", + "@smithy/util-body-length-browser": "^3.0.0", + "@smithy/util-body-length-node": "^3.0.0", + "@smithy/util-defaults-mode-browser": "^3.0.26", + "@smithy/util-defaults-mode-node": "^3.0.26", + "@smithy/util-endpoints": "^2.1.5", + "@smithy/util-middleware": "^3.0.9", + "@smithy/util-retry": "^3.0.9", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/client-sso-oidc": { + "version": "3.693.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.693.0", + "@aws-sdk/credential-provider-node": "3.693.0", + "@aws-sdk/middleware-host-header": "3.693.0", + "@aws-sdk/middleware-logger": "3.693.0", + "@aws-sdk/middleware-recursion-detection": "3.693.0", + "@aws-sdk/middleware-user-agent": "3.693.0", + "@aws-sdk/region-config-resolver": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@aws-sdk/util-endpoints": "3.693.0", + "@aws-sdk/util-user-agent-browser": "3.693.0", + "@aws-sdk/util-user-agent-node": "3.693.0", + "@smithy/config-resolver": "^3.0.11", + "@smithy/core": "^2.5.2", + "@smithy/fetch-http-handler": "^4.1.0", + "@smithy/hash-node": "^3.0.9", + "@smithy/invalid-dependency": "^3.0.9", + "@smithy/middleware-content-length": "^3.0.11", + "@smithy/middleware-endpoint": "^3.2.2", + "@smithy/middleware-retry": "^3.0.26", + "@smithy/middleware-serde": "^3.0.9", + "@smithy/middleware-stack": "^3.0.9", + "@smithy/node-config-provider": "^3.1.10", + "@smithy/node-http-handler": "^3.3.0", + "@smithy/protocol-http": "^4.1.6", + "@smithy/smithy-client": "^3.4.3", + "@smithy/types": "^3.7.0", + "@smithy/url-parser": "^3.0.9", + "@smithy/util-base64": "^3.0.0", + "@smithy/util-body-length-browser": "^3.0.0", + "@smithy/util-body-length-node": "^3.0.0", + "@smithy/util-defaults-mode-browser": "^3.0.26", + "@smithy/util-defaults-mode-node": "^3.0.26", + "@smithy/util-endpoints": "^2.1.5", + "@smithy/util-middleware": "^3.0.9", + "@smithy/util-retry": "^3.0.9", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sts": "^3.693.0" + } + }, + "node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/client-sts": { + "version": "3.693.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/client-sso-oidc": "3.693.0", + "@aws-sdk/core": "3.693.0", + "@aws-sdk/credential-provider-node": "3.693.0", + "@aws-sdk/middleware-host-header": "3.693.0", + "@aws-sdk/middleware-logger": "3.693.0", + "@aws-sdk/middleware-recursion-detection": "3.693.0", + "@aws-sdk/middleware-user-agent": "3.693.0", + "@aws-sdk/region-config-resolver": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@aws-sdk/util-endpoints": "3.693.0", + "@aws-sdk/util-user-agent-browser": "3.693.0", + "@aws-sdk/util-user-agent-node": "3.693.0", + "@smithy/config-resolver": "^3.0.11", + "@smithy/core": "^2.5.2", + "@smithy/fetch-http-handler": "^4.1.0", + "@smithy/hash-node": "^3.0.9", + "@smithy/invalid-dependency": "^3.0.9", + "@smithy/middleware-content-length": "^3.0.11", + "@smithy/middleware-endpoint": "^3.2.2", + "@smithy/middleware-retry": "^3.0.26", + "@smithy/middleware-serde": "^3.0.9", + "@smithy/middleware-stack": "^3.0.9", + "@smithy/node-config-provider": "^3.1.10", + "@smithy/node-http-handler": "^3.3.0", + "@smithy/protocol-http": "^4.1.6", + "@smithy/smithy-client": "^3.4.3", + "@smithy/types": "^3.7.0", + "@smithy/url-parser": "^3.0.9", + "@smithy/util-base64": "^3.0.0", + "@smithy/util-body-length-browser": "^3.0.0", + "@smithy/util-body-length-node": "^3.0.0", + "@smithy/util-defaults-mode-browser": "^3.0.26", + "@smithy/util-defaults-mode-node": "^3.0.26", + "@smithy/util-endpoints": "^2.1.5", + "@smithy/util-middleware": "^3.0.9", + "@smithy/util-retry": "^3.0.9", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/core": { + "version": "3.693.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.692.0", + "@smithy/core": "^2.5.2", + "@smithy/node-config-provider": "^3.1.10", + "@smithy/property-provider": "^3.1.9", + "@smithy/protocol-http": "^4.1.6", + "@smithy/signature-v4": "^4.2.2", + "@smithy/smithy-client": "^3.4.3", + "@smithy/types": "^3.7.0", + "@smithy/util-middleware": "^3.0.9", + "fast-xml-parser": "4.4.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/credential-provider-http": { + "version": "3.693.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@smithy/fetch-http-handler": "^4.1.0", + "@smithy/node-http-handler": "^3.3.0", + "@smithy/property-provider": "^3.1.9", + "@smithy/protocol-http": "^4.1.6", + "@smithy/smithy-client": "^3.4.3", + "@smithy/types": "^3.7.0", + "@smithy/util-stream": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/credential-provider-ini": { + "version": "3.693.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.693.0", + "@aws-sdk/credential-provider-env": "3.693.0", + "@aws-sdk/credential-provider-http": "3.693.0", + "@aws-sdk/credential-provider-process": "3.693.0", + "@aws-sdk/credential-provider-sso": "3.693.0", + "@aws-sdk/credential-provider-web-identity": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@smithy/credential-provider-imds": "^3.2.6", + "@smithy/property-provider": "^3.1.9", + "@smithy/shared-ini-file-loader": "^3.1.10", + "@smithy/types": "^3.7.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sts": "^3.693.0" + } + }, + "node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/credential-provider-node": { + "version": "3.693.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.693.0", + "@aws-sdk/credential-provider-http": "3.693.0", + "@aws-sdk/credential-provider-ini": "3.693.0", + "@aws-sdk/credential-provider-process": "3.693.0", + "@aws-sdk/credential-provider-sso": "3.693.0", + "@aws-sdk/credential-provider-web-identity": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@smithy/credential-provider-imds": "^3.2.6", + "@smithy/property-provider": "^3.1.9", + "@smithy/shared-ini-file-loader": "^3.1.10", + "@smithy/types": "^3.7.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/credential-provider-sso": { + "version": "3.693.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/client-sso": "3.693.0", + "@aws-sdk/core": "3.693.0", + "@aws-sdk/token-providers": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@smithy/property-provider": "^3.1.9", + "@smithy/shared-ini-file-loader": "^3.1.10", + "@smithy/types": "^3.7.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/credential-provider-web-identity": { + "version": "3.693.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@smithy/property-provider": "^3.1.9", + "@smithy/types": "^3.7.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sts": "^3.693.0" + } + }, + "node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/middleware-host-header": { + "version": "3.693.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.692.0", + "@smithy/protocol-http": "^4.1.6", + "@smithy/types": "^3.7.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/middleware-logger": { + "version": "3.693.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.692.0", + "@smithy/types": "^3.7.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/middleware-recursion-detection": { + "version": "3.693.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.692.0", + "@smithy/protocol-http": "^4.1.6", + "@smithy/types": "^3.7.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.693.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@aws-sdk/util-endpoints": "3.693.0", + "@smithy/core": "^2.5.2", + "@smithy/protocol-http": "^4.1.6", + "@smithy/types": "^3.7.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/region-config-resolver": { + "version": "3.693.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.692.0", + "@smithy/node-config-provider": "^3.1.10", + "@smithy/types": "^3.7.0", + "@smithy/util-config-provider": "^3.0.0", + "@smithy/util-middleware": "^3.0.9", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/token-providers": { + "version": "3.693.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.692.0", + "@smithy/property-provider": "^3.1.9", + "@smithy/shared-ini-file-loader": "^3.1.10", + "@smithy/types": "^3.7.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sso-oidc": "^3.693.0" + } + }, + "node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/util-endpoints": { + "version": "3.693.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.692.0", + "@smithy/types": "^3.7.0", + "@smithy/util-endpoints": "^2.1.5", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/util-user-agent-browser": { + "version": "3.693.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.692.0", + "@smithy/types": "^3.7.0", + "bowser": "^2.11.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/util-user-agent-node": { + "version": "3.693.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/middleware-user-agent": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@smithy/node-config-provider": "^3.1.10", + "@smithy/types": "^3.7.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "aws-crt": ">=1.0.0" + }, + "peerDependenciesMeta": { + "aws-crt": { + "optional": true + } + } + }, + "node_modules/@aws-sdk/client-ssm/node_modules/@smithy/is-array-buffer": { + "version": "3.0.0", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-ssm/node_modules/@smithy/util-buffer-from": { + "version": "3.0.0", + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-ssm/node_modules/@smithy/util-utf8": { + "version": "3.0.0", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-sso": { + "version": "3.975.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.975.0.tgz", + "integrity": "sha512-HpgJuleH7P6uILxzJKQOmlHdwaCY+xYC6VgRDzlwVEqU/HXjo4m2gOAyjUbpXlBOCWfGgMUzfBlNJ9z3MboqEQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "^3.973.1", + "@aws-sdk/middleware-host-header": "^3.972.1", + "@aws-sdk/middleware-logger": "^3.972.1", + "@aws-sdk/middleware-recursion-detection": "^3.972.1", + "@aws-sdk/middleware-user-agent": "^3.972.2", + "@aws-sdk/region-config-resolver": "^3.972.1", + "@aws-sdk/types": "^3.973.0", + "@aws-sdk/util-endpoints": "3.972.0", + "@aws-sdk/util-user-agent-browser": "^3.972.1", + "@aws-sdk/util-user-agent-node": "^3.972.1", + "@smithy/config-resolver": "^4.4.6", + "@smithy/core": "^3.21.1", + "@smithy/fetch-http-handler": "^5.3.9", + "@smithy/hash-node": "^4.2.8", + "@smithy/invalid-dependency": "^4.2.8", + "@smithy/middleware-content-length": "^4.2.8", + "@smithy/middleware-endpoint": "^4.4.11", + "@smithy/middleware-retry": "^4.4.27", + "@smithy/middleware-serde": "^4.2.9", + "@smithy/middleware-stack": "^4.2.8", + "@smithy/node-config-provider": "^4.3.8", + "@smithy/node-http-handler": "^4.4.8", + "@smithy/protocol-http": "^5.3.8", + "@smithy/smithy-client": "^4.10.12", + "@smithy/types": "^4.12.0", + "@smithy/url-parser": "^4.2.8", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-body-length-node": "^4.2.1", + "@smithy/util-defaults-mode-browser": "^4.3.26", + "@smithy/util-defaults-mode-node": "^4.2.29", + "@smithy/util-endpoints": "^3.2.8", + "@smithy/util-middleware": "^4.2.8", + "@smithy/util-retry": "^4.2.8", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/client-sso/node_modules/@aws-sdk/types": { + "version": "3.973.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.973.1.tgz", + "integrity": "sha512-DwHBiMNOB468JiX6+i34c+THsKHErYUdNQ3HexeXZvVn4zouLjgaS4FejiGSi2HyBuzuyHg7SuOPmjSvoU9NRg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/abort-controller": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.2.8.tgz", + "integrity": "sha512-peuVfkYHAmS5ybKxWcfraK7WBBP0J+rkfUcbHJJKQ4ir3UAUNQI+Y4Vt/PqSzGqgloJ5O1dk7+WzNL8wcCSXbw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/config-resolver": { + "version": "4.4.6", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.4.6.tgz", + "integrity": "sha512-qJpzYC64kaj3S0fueiu3kXm8xPrR3PcXDPEgnaNMRn0EjNSZFoFjvbUp0YUDsRhN1CB90EnHJtbxWKevnH99UQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/node-config-provider": "^4.3.8", + "@smithy/types": "^4.12.0", + "@smithy/util-config-provider": "^4.2.0", + "@smithy/util-endpoints": "^3.2.8", + "@smithy/util-middleware": "^4.2.8", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/core": { + "version": "3.21.1", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.21.1.tgz", + "integrity": "sha512-NUH8R4O6FkN8HKMojzbGg/5pNjsfTjlMmeFclyPfPaXXUrbr5TzhWgbf7t92wfrpCHRgpjyz7ffASIS3wX28aA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/middleware-serde": "^4.2.9", + "@smithy/protocol-http": "^5.3.8", + "@smithy/types": "^4.12.0", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-middleware": "^4.2.8", + "@smithy/util-stream": "^4.5.10", + "@smithy/util-utf8": "^4.2.0", + "@smithy/uuid": "^1.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/credential-provider-imds": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.2.8.tgz", + "integrity": "sha512-FNT0xHS1c/CPN8upqbMFP83+ul5YgdisfCfkZ86Jh2NSmnqw/AJ6x5pEogVCTVvSm7j9MopRU89bmDelxuDMYw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/node-config-provider": "^4.3.8", + "@smithy/property-provider": "^4.2.8", + "@smithy/types": "^4.12.0", + "@smithy/url-parser": "^4.2.8", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/fetch-http-handler": { + "version": "5.3.9", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.3.9.tgz", + "integrity": "sha512-I4UhmcTYXBrct03rwzQX1Y/iqQlzVQaPxWjCjula++5EmWq9YGBrx6bbGqluGc1f0XEfhSkiY4jhLgbsJUMKRA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/protocol-http": "^5.3.8", + "@smithy/querystring-builder": "^4.2.8", + "@smithy/types": "^4.12.0", + "@smithy/util-base64": "^4.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/hash-node": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.2.8.tgz", + "integrity": "sha512-7ZIlPbmaDGxVoxErDZnuFG18WekhbA/g2/i97wGj+wUBeS6pcUeAym8u4BXh/75RXWhgIJhyC11hBzig6MljwA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.12.0", + "@smithy/util-buffer-from": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/invalid-dependency": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.2.8.tgz", + "integrity": "sha512-N9iozRybwAQ2dn9Fot9kI6/w9vos2oTXLhtK7ovGqwZjlOcxu6XhPlpLpC+INsxktqHinn5gS2DXDjDF2kG5sQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/is-array-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-4.2.0.tgz", + "integrity": "sha512-DZZZBvC7sjcYh4MazJSGiWMI2L7E0oCiRHREDzIxi/M2LY79/21iXt6aPLHge82wi5LsuRF5A06Ds3+0mlh6CQ==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/middleware-content-length": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.2.8.tgz", + "integrity": "sha512-RO0jeoaYAB1qBRhfVyq0pMgBoUK34YEJxVxyjOWYZiOKOq2yMZ4MnVXMZCUDenpozHue207+9P5ilTV1zeda0A==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/protocol-http": "^5.3.8", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/middleware-endpoint": { + "version": "4.4.11", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.4.11.tgz", + "integrity": "sha512-/WqsrycweGGfb9sSzME4CrsuayjJF6BueBmkKlcbeU5q18OhxRrvvKlmfw3tpDsK5ilx2XUJvoukwxHB0nHs/Q==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/core": "^3.21.1", + "@smithy/middleware-serde": "^4.2.9", + "@smithy/node-config-provider": "^4.3.8", + "@smithy/shared-ini-file-loader": "^4.4.3", + "@smithy/types": "^4.12.0", + "@smithy/url-parser": "^4.2.8", + "@smithy/util-middleware": "^4.2.8", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/middleware-retry": { + "version": "4.4.27", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.4.27.tgz", + "integrity": "sha512-xFUYCGRVsfgiN5EjsJJSzih9+yjStgMTCLANPlf0LVQkPDYCe0hz97qbdTZosFOiYlGBlHYityGRxrQ/hxhfVQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/node-config-provider": "^4.3.8", + "@smithy/protocol-http": "^5.3.8", + "@smithy/service-error-classification": "^4.2.8", + "@smithy/smithy-client": "^4.10.12", + "@smithy/types": "^4.12.0", + "@smithy/util-middleware": "^4.2.8", + "@smithy/util-retry": "^4.2.8", + "@smithy/uuid": "^1.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/middleware-serde": { + "version": "4.2.9", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.2.9.tgz", + "integrity": "sha512-eMNiej0u/snzDvlqRGSN3Vl0ESn3838+nKyVfF2FKNXFbi4SERYT6PR392D39iczngbqqGG0Jl1DlCnp7tBbXQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/protocol-http": "^5.3.8", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/middleware-stack": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.2.8.tgz", + "integrity": "sha512-w6LCfOviTYQjBctOKSwy6A8FIkQy7ICvglrZFl6Bw4FmcQ1Z420fUtIhxaUZZshRe0VCq4kvDiPiXrPZAe8oRA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/node-config-provider": { + "version": "4.3.8", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.3.8.tgz", + "integrity": "sha512-aFP1ai4lrbVlWjfpAfRSL8KFcnJQYfTl5QxLJXY32vghJrDuFyPZ6LtUL+JEGYiFRG1PfPLHLoxj107ulncLIg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/property-provider": "^4.2.8", + "@smithy/shared-ini-file-loader": "^4.4.3", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/node-http-handler": { + "version": "4.4.8", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.4.8.tgz", + "integrity": "sha512-q9u+MSbJVIJ1QmJ4+1u+cERXkrhuILCBDsJUBAW1MPE6sFonbCNaegFuwW9ll8kh5UdyY3jOkoOGlc7BesoLpg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/abort-controller": "^4.2.8", + "@smithy/protocol-http": "^5.3.8", + "@smithy/querystring-builder": "^4.2.8", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/property-provider": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.2.8.tgz", + "integrity": "sha512-EtCTbyIveCKeOXDSWSdze3k612yCPq1YbXsbqX3UHhkOSW8zKsM9NOJG5gTIya0vbY2DIaieG8pKo1rITHYL0w==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/protocol-http": { + "version": "5.3.8", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.3.8.tgz", + "integrity": "sha512-QNINVDhxpZ5QnP3aviNHQFlRogQZDfYlCkQT+7tJnErPQbDhysondEjhikuANxgMsZrkGeiAxXy4jguEGsDrWQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/querystring-builder": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.2.8.tgz", + "integrity": "sha512-Xr83r31+DrE8CP3MqPgMJl+pQlLLmOfiEUnoyAlGzzJIrEsbKsPy1hqH0qySaQm4oWrCBlUqRt+idEgunKB+iw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.12.0", + "@smithy/util-uri-escape": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/querystring-parser": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.2.8.tgz", + "integrity": "sha512-vUurovluVy50CUlazOiXkPq40KGvGWSdmusa3130MwrR1UNnNgKAlj58wlOe61XSHRpUfIIh6cE0zZ8mzKaDPA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/service-error-classification": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.2.8.tgz", + "integrity": "sha512-mZ5xddodpJhEt3RkCjbmUQuXUOaPNTkbMGR0bcS8FE0bJDLMZlhmpgrvPNCYglVw5rsYTpSnv19womw9WWXKQQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.12.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/shared-ini-file-loader": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.4.3.tgz", + "integrity": "sha512-DfQjxXQnzC5UbCUPeC3Ie8u+rIWZTvuDPAGU/BxzrOGhRvgUanaP68kDZA+jaT3ZI+djOf+4dERGlm9mWfFDrg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/smithy-client": { + "version": "4.10.12", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.10.12.tgz", + "integrity": "sha512-VKO/HKoQ5OrSHW6AJUmEnUKeXI1/5LfCwO9cwyao7CmLvGnZeM1i36Lyful3LK1XU7HwTVieTqO1y2C/6t3qtA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/core": "^3.21.1", + "@smithy/middleware-endpoint": "^4.4.11", + "@smithy/middleware-stack": "^4.2.8", + "@smithy/protocol-http": "^5.3.8", + "@smithy/types": "^4.12.0", + "@smithy/util-stream": "^4.5.10", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/types": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.12.0.tgz", + "integrity": "sha512-9YcuJVTOBDjg9LWo23Qp0lTQ3D7fQsQtwle0jVfpbUHy9qBwCEgKuVH4FqFB3VYu0nwdHKiEMA+oXz7oV8X1kw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/url-parser": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.2.8.tgz", + "integrity": "sha512-NQho9U68TGMEU639YkXnVMV3GEFFULmmaWdlu1E9qzyIePOHsoSnagTGSDv1Zi8DCNN6btxOSdgmy5E/hsZwhA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/querystring-parser": "^4.2.8", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/util-base64": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-4.3.0.tgz", + "integrity": "sha512-GkXZ59JfyxsIwNTWFnjmFEI8kZpRNIBfxKjv09+nkAWPt/4aGaEWMM04m4sxgNVWkbt2MdSvE3KF/PfX4nFedQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/util-body-length-browser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-4.2.0.tgz", + "integrity": "sha512-Fkoh/I76szMKJnBXWPdFkQJl2r9SjPt3cMzLdOB6eJ4Pnpas8hVoWPYemX/peO0yrrvldgCUVJqOAjUrOLjbxg==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/util-body-length-node": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-4.2.1.tgz", + "integrity": "sha512-h53dz/pISVrVrfxV1iqXlx5pRg3V2YWFcSQyPyXZRrZoZj4R4DeWRDo1a7dd3CPTcFi3kE+98tuNyD2axyZReA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/util-buffer-from": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-4.2.0.tgz", + "integrity": "sha512-kAY9hTKulTNevM2nlRtxAG2FQ3B2OR6QIrPY3zE5LqJy1oxzmgBGsHLWTcNhWXKchgA0WHW+mZkQrng/pgcCew==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/util-config-provider": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-4.2.0.tgz", + "integrity": "sha512-YEjpl6XJ36FTKmD+kRJJWYvrHeUvm5ykaUS5xK+6oXffQPHeEM4/nXlZPe+Wu0lsgRUcNZiliYNh/y7q9c2y6Q==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/util-defaults-mode-browser": { + "version": "4.3.26", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.3.26.tgz", + "integrity": "sha512-vva0dzYUTgn7DdE0uaha10uEdAgmdLnNFowKFjpMm6p2R0XDk5FHPX3CBJLzWQkQXuEprsb0hGz9YwbicNWhjw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/property-provider": "^4.2.8", + "@smithy/smithy-client": "^4.10.12", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/util-defaults-mode-node": { + "version": "4.2.29", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.2.29.tgz", + "integrity": "sha512-c6D7IUBsZt/aNnTBHMTf+OVh+h/JcxUUgfTcIJaWRe6zhOum1X+pNKSZtZ+7fbOn5I99XVFtmrnXKv8yHHErTQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/config-resolver": "^4.4.6", + "@smithy/credential-provider-imds": "^4.2.8", + "@smithy/node-config-provider": "^4.3.8", + "@smithy/property-provider": "^4.2.8", + "@smithy/smithy-client": "^4.10.12", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/util-endpoints": { + "version": "3.2.8", + "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.2.8.tgz", + "integrity": "sha512-8JaVTn3pBDkhZgHQ8R0epwWt+BqPSLCjdjXXusK1onwJlRuN69fbvSK66aIKKO7SwVFM6x2J2ox5X8pOaWcUEw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/node-config-provider": "^4.3.8", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/util-hex-encoding": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-4.2.0.tgz", + "integrity": "sha512-CCQBwJIvXMLKxVbO88IukazJD9a4kQ9ZN7/UMGBjBcJYvatpWk+9g870El4cB8/EJxfe+k+y0GmR9CAzkF+Nbw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/util-middleware": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.2.8.tgz", + "integrity": "sha512-PMqfeJxLcNPMDgvPbbLl/2Vpin+luxqTGPpW3NAQVLbRrFRzTa4rNAASYeIGjRV9Ytuhzny39SpyU04EQreF+A==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/util-retry": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.2.8.tgz", + "integrity": "sha512-CfJqwvoRY0kTGe5AkQokpURNCT1u/MkRzMTASWMPPo2hNSnKtF1D45dQl3DE2LKLr4m+PW9mCeBMJr5mCAVThg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/service-error-classification": "^4.2.8", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/util-stream": { + "version": "4.5.10", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.5.10.tgz", + "integrity": "sha512-jbqemy51UFSZSp2y0ZmRfckmrzuKww95zT9BYMmuJ8v3altGcqjwoV1tzpOwuHaKrwQrCjIzOib499ymr2f98g==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/fetch-http-handler": "^5.3.9", + "@smithy/node-http-handler": "^4.4.8", + "@smithy/types": "^4.12.0", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-buffer-from": "^4.2.0", + "@smithy/util-hex-encoding": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/util-uri-escape": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-4.2.0.tgz", + "integrity": "sha512-igZpCKV9+E/Mzrpq6YacdTQ0qTiLm85gD6N/IrmyDvQFA4UnU3d5g3m8tMT/6zG/vVkWSU+VxeUyGonL62DuxA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/util-utf8": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.2.0.tgz", + "integrity": "sha512-zBPfuzoI8xyBtR2P6WQj63Rz8i3AmfAaJLuNG8dWsfvPe8lO4aCPYLn879mEgHndZH1zQ2oXmG8O1GGzzaoZiw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/core": { + "version": "3.973.2", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.973.2.tgz", + "integrity": "sha512-XwOjX86CNtmhO/Tx2vmNt1tT1yda045LXVm453w9crrkl7oyDEWV3ASg2xNi6hCPWbx1BXtLKJduQiGZnmHXrg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.973.1", + "@aws-sdk/xml-builder": "^3.972.2", + "@smithy/core": "^3.21.1", + "@smithy/node-config-provider": "^4.3.8", + "@smithy/property-provider": "^4.2.8", + "@smithy/protocol-http": "^5.3.8", + "@smithy/signature-v4": "^5.3.8", + "@smithy/smithy-client": "^4.10.12", + "@smithy/types": "^4.12.0", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-middleware": "^4.2.8", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/core/node_modules/@aws-sdk/types": { + "version": "3.973.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.973.1.tgz", + "integrity": "sha512-DwHBiMNOB468JiX6+i34c+THsKHErYUdNQ3HexeXZvVn4zouLjgaS4FejiGSi2HyBuzuyHg7SuOPmjSvoU9NRg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/core/node_modules/@aws-sdk/xml-builder": { + "version": "3.972.2", + "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.972.2.tgz", + "integrity": "sha512-jGOOV/bV1DhkkUhHiZ3/1GZ67cZyOXaDb7d1rYD6ZiXf5V9tBNOcgqXwRRPvrCbYaFRa1pPMFb3ZjqjWpR3YfA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.12.0", + "fast-xml-parser": "5.2.5", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/core/node_modules/@smithy/abort-controller": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.2.8.tgz", + "integrity": "sha512-peuVfkYHAmS5ybKxWcfraK7WBBP0J+rkfUcbHJJKQ4ir3UAUNQI+Y4Vt/PqSzGqgloJ5O1dk7+WzNL8wcCSXbw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/core/node_modules/@smithy/core": { + "version": "3.21.1", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.21.1.tgz", + "integrity": "sha512-NUH8R4O6FkN8HKMojzbGg/5pNjsfTjlMmeFclyPfPaXXUrbr5TzhWgbf7t92wfrpCHRgpjyz7ffASIS3wX28aA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/middleware-serde": "^4.2.9", + "@smithy/protocol-http": "^5.3.8", + "@smithy/types": "^4.12.0", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-middleware": "^4.2.8", + "@smithy/util-stream": "^4.5.10", + "@smithy/util-utf8": "^4.2.0", + "@smithy/uuid": "^1.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/core/node_modules/@smithy/fetch-http-handler": { + "version": "5.3.9", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.3.9.tgz", + "integrity": "sha512-I4UhmcTYXBrct03rwzQX1Y/iqQlzVQaPxWjCjula++5EmWq9YGBrx6bbGqluGc1f0XEfhSkiY4jhLgbsJUMKRA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/protocol-http": "^5.3.8", + "@smithy/querystring-builder": "^4.2.8", + "@smithy/types": "^4.12.0", + "@smithy/util-base64": "^4.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/core/node_modules/@smithy/is-array-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-4.2.0.tgz", + "integrity": "sha512-DZZZBvC7sjcYh4MazJSGiWMI2L7E0oCiRHREDzIxi/M2LY79/21iXt6aPLHge82wi5LsuRF5A06Ds3+0mlh6CQ==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/core/node_modules/@smithy/middleware-endpoint": { + "version": "4.4.11", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.4.11.tgz", + "integrity": "sha512-/WqsrycweGGfb9sSzME4CrsuayjJF6BueBmkKlcbeU5q18OhxRrvvKlmfw3tpDsK5ilx2XUJvoukwxHB0nHs/Q==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/core": "^3.21.1", + "@smithy/middleware-serde": "^4.2.9", + "@smithy/node-config-provider": "^4.3.8", + "@smithy/shared-ini-file-loader": "^4.4.3", + "@smithy/types": "^4.12.0", + "@smithy/url-parser": "^4.2.8", + "@smithy/util-middleware": "^4.2.8", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/core/node_modules/@smithy/middleware-serde": { + "version": "4.2.9", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.2.9.tgz", + "integrity": "sha512-eMNiej0u/snzDvlqRGSN3Vl0ESn3838+nKyVfF2FKNXFbi4SERYT6PR392D39iczngbqqGG0Jl1DlCnp7tBbXQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/protocol-http": "^5.3.8", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/core/node_modules/@smithy/middleware-stack": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.2.8.tgz", + "integrity": "sha512-w6LCfOviTYQjBctOKSwy6A8FIkQy7ICvglrZFl6Bw4FmcQ1Z420fUtIhxaUZZshRe0VCq4kvDiPiXrPZAe8oRA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/core/node_modules/@smithy/node-config-provider": { + "version": "4.3.8", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.3.8.tgz", + "integrity": "sha512-aFP1ai4lrbVlWjfpAfRSL8KFcnJQYfTl5QxLJXY32vghJrDuFyPZ6LtUL+JEGYiFRG1PfPLHLoxj107ulncLIg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/property-provider": "^4.2.8", + "@smithy/shared-ini-file-loader": "^4.4.3", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/core/node_modules/@smithy/node-http-handler": { + "version": "4.4.8", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.4.8.tgz", + "integrity": "sha512-q9u+MSbJVIJ1QmJ4+1u+cERXkrhuILCBDsJUBAW1MPE6sFonbCNaegFuwW9ll8kh5UdyY3jOkoOGlc7BesoLpg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/abort-controller": "^4.2.8", + "@smithy/protocol-http": "^5.3.8", + "@smithy/querystring-builder": "^4.2.8", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/core/node_modules/@smithy/property-provider": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.2.8.tgz", + "integrity": "sha512-EtCTbyIveCKeOXDSWSdze3k612yCPq1YbXsbqX3UHhkOSW8zKsM9NOJG5gTIya0vbY2DIaieG8pKo1rITHYL0w==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/core/node_modules/@smithy/protocol-http": { + "version": "5.3.8", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.3.8.tgz", + "integrity": "sha512-QNINVDhxpZ5QnP3aviNHQFlRogQZDfYlCkQT+7tJnErPQbDhysondEjhikuANxgMsZrkGeiAxXy4jguEGsDrWQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/core/node_modules/@smithy/querystring-builder": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.2.8.tgz", + "integrity": "sha512-Xr83r31+DrE8CP3MqPgMJl+pQlLLmOfiEUnoyAlGzzJIrEsbKsPy1hqH0qySaQm4oWrCBlUqRt+idEgunKB+iw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.12.0", + "@smithy/util-uri-escape": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/core/node_modules/@smithy/querystring-parser": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.2.8.tgz", + "integrity": "sha512-vUurovluVy50CUlazOiXkPq40KGvGWSdmusa3130MwrR1UNnNgKAlj58wlOe61XSHRpUfIIh6cE0zZ8mzKaDPA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/core/node_modules/@smithy/shared-ini-file-loader": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.4.3.tgz", + "integrity": "sha512-DfQjxXQnzC5UbCUPeC3Ie8u+rIWZTvuDPAGU/BxzrOGhRvgUanaP68kDZA+jaT3ZI+djOf+4dERGlm9mWfFDrg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/core/node_modules/@smithy/signature-v4": { + "version": "5.3.8", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.3.8.tgz", + "integrity": "sha512-6A4vdGj7qKNRF16UIcO8HhHjKW27thsxYci+5r/uVRkdcBEkOEiY8OMPuydLX4QHSrJqGHPJzPRwwVTqbLZJhg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^4.2.0", + "@smithy/protocol-http": "^5.3.8", + "@smithy/types": "^4.12.0", + "@smithy/util-hex-encoding": "^4.2.0", + "@smithy/util-middleware": "^4.2.8", + "@smithy/util-uri-escape": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/core/node_modules/@smithy/smithy-client": { + "version": "4.10.12", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.10.12.tgz", + "integrity": "sha512-VKO/HKoQ5OrSHW6AJUmEnUKeXI1/5LfCwO9cwyao7CmLvGnZeM1i36Lyful3LK1XU7HwTVieTqO1y2C/6t3qtA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/core": "^3.21.1", + "@smithy/middleware-endpoint": "^4.4.11", + "@smithy/middleware-stack": "^4.2.8", + "@smithy/protocol-http": "^5.3.8", + "@smithy/types": "^4.12.0", + "@smithy/util-stream": "^4.5.10", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/core/node_modules/@smithy/types": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.12.0.tgz", + "integrity": "sha512-9YcuJVTOBDjg9LWo23Qp0lTQ3D7fQsQtwle0jVfpbUHy9qBwCEgKuVH4FqFB3VYu0nwdHKiEMA+oXz7oV8X1kw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/core/node_modules/@smithy/url-parser": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.2.8.tgz", + "integrity": "sha512-NQho9U68TGMEU639YkXnVMV3GEFFULmmaWdlu1E9qzyIePOHsoSnagTGSDv1Zi8DCNN6btxOSdgmy5E/hsZwhA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/querystring-parser": "^4.2.8", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/core/node_modules/@smithy/util-base64": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-4.3.0.tgz", + "integrity": "sha512-GkXZ59JfyxsIwNTWFnjmFEI8kZpRNIBfxKjv09+nkAWPt/4aGaEWMM04m4sxgNVWkbt2MdSvE3KF/PfX4nFedQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/core/node_modules/@smithy/util-body-length-browser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-4.2.0.tgz", + "integrity": "sha512-Fkoh/I76szMKJnBXWPdFkQJl2r9SjPt3cMzLdOB6eJ4Pnpas8hVoWPYemX/peO0yrrvldgCUVJqOAjUrOLjbxg==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/core/node_modules/@smithy/util-buffer-from": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-4.2.0.tgz", + "integrity": "sha512-kAY9hTKulTNevM2nlRtxAG2FQ3B2OR6QIrPY3zE5LqJy1oxzmgBGsHLWTcNhWXKchgA0WHW+mZkQrng/pgcCew==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/core/node_modules/@smithy/util-hex-encoding": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-4.2.0.tgz", + "integrity": "sha512-CCQBwJIvXMLKxVbO88IukazJD9a4kQ9ZN7/UMGBjBcJYvatpWk+9g870El4cB8/EJxfe+k+y0GmR9CAzkF+Nbw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/core/node_modules/@smithy/util-middleware": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.2.8.tgz", + "integrity": "sha512-PMqfeJxLcNPMDgvPbbLl/2Vpin+luxqTGPpW3NAQVLbRrFRzTa4rNAASYeIGjRV9Ytuhzny39SpyU04EQreF+A==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/core/node_modules/@smithy/util-stream": { + "version": "4.5.10", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.5.10.tgz", + "integrity": "sha512-jbqemy51UFSZSp2y0ZmRfckmrzuKww95zT9BYMmuJ8v3altGcqjwoV1tzpOwuHaKrwQrCjIzOib499ymr2f98g==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/fetch-http-handler": "^5.3.9", + "@smithy/node-http-handler": "^4.4.8", + "@smithy/types": "^4.12.0", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-buffer-from": "^4.2.0", + "@smithy/util-hex-encoding": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/core/node_modules/@smithy/util-uri-escape": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-4.2.0.tgz", + "integrity": "sha512-igZpCKV9+E/Mzrpq6YacdTQ0qTiLm85gD6N/IrmyDvQFA4UnU3d5g3m8tMT/6zG/vVkWSU+VxeUyGonL62DuxA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/core/node_modules/@smithy/util-utf8": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.2.0.tgz", + "integrity": "sha512-zBPfuzoI8xyBtR2P6WQj63Rz8i3AmfAaJLuNG8dWsfvPe8lO4aCPYLn879mEgHndZH1zQ2oXmG8O1GGzzaoZiw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/core/node_modules/fast-xml-parser": { + "version": "5.2.5", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.2.5.tgz", + "integrity": "sha512-pfX9uG9Ki0yekDHx2SiuRIyFdyAr1kMIMitPvb0YBo8SUfKvia7w7FIyd/l6av85pFYRhZscS75MwMnbvY+hcQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "dependencies": { + "strnum": "^2.1.0" + }, + "bin": { + "fxparser": "src/cli/cli.js" + } + }, + "node_modules/@aws-sdk/core/node_modules/strnum": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.1.2.tgz", + "integrity": "sha512-l63NF9y/cLROq/yqKXSLtcMeeyOfnSQlfMSlzFt/K73oIaD8DGaQWd7Z34X9GPiKqP5rbSh84Hl4bOlLcjiSrQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT" + }, + "node_modules/@aws-sdk/credential-provider-cognito-identity": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.936.0.tgz", + "integrity": "sha512-+aSC59yiD4M5RcYp9Gx3iwX/n4hO3ZWA2Mxmkzmt9gYFBbJ9umx2LpBdrV64y57AtOvfGeo0h7PAXniIufagxw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/client-cognito-identity": "3.936.0", + "@aws-sdk/types": "3.936.0", + "@smithy/property-provider": "^4.2.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@aws-sdk/client-cognito-identity": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.936.0.tgz", + "integrity": "sha512-AkJZ426y0G8Lsyi9p7mWudacMKeo8XLZOfxUmeThMkDa3GxGQ1y6BTrOj6ZcvqQ1Hz7Abb3QWPC+EMqhu1Lncw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.936.0", + "@aws-sdk/credential-provider-node": "3.936.0", + "@aws-sdk/middleware-host-header": "3.936.0", + "@aws-sdk/middleware-logger": "3.936.0", + "@aws-sdk/middleware-recursion-detection": "3.936.0", + "@aws-sdk/middleware-user-agent": "3.936.0", + "@aws-sdk/region-config-resolver": "3.936.0", + "@aws-sdk/types": "3.936.0", + "@aws-sdk/util-endpoints": "3.936.0", + "@aws-sdk/util-user-agent-browser": "3.936.0", + "@aws-sdk/util-user-agent-node": "3.936.0", + "@smithy/config-resolver": "^4.4.3", + "@smithy/core": "^3.18.5", + "@smithy/fetch-http-handler": "^5.3.6", + "@smithy/hash-node": "^4.2.5", + "@smithy/invalid-dependency": "^4.2.5", + "@smithy/middleware-content-length": "^4.2.5", + "@smithy/middleware-endpoint": "^4.3.12", + "@smithy/middleware-retry": "^4.4.12", + "@smithy/middleware-serde": "^4.2.6", + "@smithy/middleware-stack": "^4.2.5", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/node-http-handler": "^4.4.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/smithy-client": "^4.9.8", + "@smithy/types": "^4.9.0", + "@smithy/url-parser": "^4.2.5", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-body-length-node": "^4.2.1", + "@smithy/util-defaults-mode-browser": "^4.3.11", + "@smithy/util-defaults-mode-node": "^4.2.14", + "@smithy/util-endpoints": "^3.2.5", + "@smithy/util-middleware": "^4.2.5", + "@smithy/util-retry": "^4.2.5", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@aws-sdk/client-sso": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.936.0.tgz", + "integrity": "sha512-0G73S2cDqYwJVvqL08eakj79MZG2QRaB56Ul8/Ps9oQxllr7DMI1IQ/N3j3xjxgpq/U36pkoFZ8aK1n7Sbr3IQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.936.0", + "@aws-sdk/middleware-host-header": "3.936.0", + "@aws-sdk/middleware-logger": "3.936.0", + "@aws-sdk/middleware-recursion-detection": "3.936.0", + "@aws-sdk/middleware-user-agent": "3.936.0", + "@aws-sdk/region-config-resolver": "3.936.0", + "@aws-sdk/types": "3.936.0", + "@aws-sdk/util-endpoints": "3.936.0", + "@aws-sdk/util-user-agent-browser": "3.936.0", + "@aws-sdk/util-user-agent-node": "3.936.0", + "@smithy/config-resolver": "^4.4.3", + "@smithy/core": "^3.18.5", + "@smithy/fetch-http-handler": "^5.3.6", + "@smithy/hash-node": "^4.2.5", + "@smithy/invalid-dependency": "^4.2.5", + "@smithy/middleware-content-length": "^4.2.5", + "@smithy/middleware-endpoint": "^4.3.12", + "@smithy/middleware-retry": "^4.4.12", + "@smithy/middleware-serde": "^4.2.6", + "@smithy/middleware-stack": "^4.2.5", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/node-http-handler": "^4.4.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/smithy-client": "^4.9.8", + "@smithy/types": "^4.9.0", + "@smithy/url-parser": "^4.2.5", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-body-length-node": "^4.2.1", + "@smithy/util-defaults-mode-browser": "^4.3.11", + "@smithy/util-defaults-mode-node": "^4.2.14", + "@smithy/util-endpoints": "^3.2.5", + "@smithy/util-middleware": "^4.2.5", + "@smithy/util-retry": "^4.2.5", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@aws-sdk/core": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.936.0.tgz", + "integrity": "sha512-eGJ2ySUMvgtOziHhDRDLCrj473RJoL4J1vPjVM3NrKC/fF3/LoHjkut8AAnKmrW6a2uTzNKubigw8dEnpmpERw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.936.0", + "@aws-sdk/xml-builder": "3.930.0", + "@smithy/core": "^3.18.5", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/property-provider": "^4.2.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/signature-v4": "^5.3.5", + "@smithy/smithy-client": "^4.9.8", + "@smithy/types": "^4.9.0", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-middleware": "^4.2.5", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@aws-sdk/credential-provider-env": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.936.0.tgz", + "integrity": "sha512-dKajFuaugEA5i9gCKzOaVy9uTeZcApE+7Z5wdcZ6j40523fY1a56khDAUYkCfwqa7sHci4ccmxBkAo+fW1RChA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.936.0", + "@aws-sdk/types": "3.936.0", + "@smithy/property-provider": "^4.2.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@aws-sdk/credential-provider-http": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.936.0.tgz", + "integrity": "sha512-5FguODLXG1tWx/x8fBxH+GVrk7Hey2LbXV5h9SFzYCx/2h50URBm0+9hndg0Rd23+xzYe14F6SI9HA9c1sPnjg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.936.0", + "@aws-sdk/types": "3.936.0", + "@smithy/fetch-http-handler": "^5.3.6", + "@smithy/node-http-handler": "^4.4.5", + "@smithy/property-provider": "^4.2.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/smithy-client": "^4.9.8", + "@smithy/types": "^4.9.0", + "@smithy/util-stream": "^4.5.6", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@aws-sdk/credential-provider-ini": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.936.0.tgz", + "integrity": "sha512-TbUv56ERQQujoHcLMcfL0Q6bVZfYF83gu/TjHkVkdSlHPOIKaG/mhE2XZSQzXv1cud6LlgeBbfzVAxJ+HPpffg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.936.0", + "@aws-sdk/credential-provider-env": "3.936.0", + "@aws-sdk/credential-provider-http": "3.936.0", + "@aws-sdk/credential-provider-login": "3.936.0", + "@aws-sdk/credential-provider-process": "3.936.0", + "@aws-sdk/credential-provider-sso": "3.936.0", + "@aws-sdk/credential-provider-web-identity": "3.936.0", + "@aws-sdk/nested-clients": "3.936.0", + "@aws-sdk/types": "3.936.0", + "@smithy/credential-provider-imds": "^4.2.5", + "@smithy/property-provider": "^4.2.5", + "@smithy/shared-ini-file-loader": "^4.4.0", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@aws-sdk/credential-provider-node": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.936.0.tgz", + "integrity": "sha512-rk/2PCtxX9xDsQW8p5Yjoca3StqmQcSfkmD7nQ61AqAHL1YgpSQWqHE+HjfGGiHDYKG7PvE33Ku2GyA7lEIJAw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.936.0", + "@aws-sdk/credential-provider-http": "3.936.0", + "@aws-sdk/credential-provider-ini": "3.936.0", + "@aws-sdk/credential-provider-process": "3.936.0", + "@aws-sdk/credential-provider-sso": "3.936.0", + "@aws-sdk/credential-provider-web-identity": "3.936.0", + "@aws-sdk/types": "3.936.0", + "@smithy/credential-provider-imds": "^4.2.5", + "@smithy/property-provider": "^4.2.5", + "@smithy/shared-ini-file-loader": "^4.4.0", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@aws-sdk/credential-provider-process": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.936.0.tgz", + "integrity": "sha512-GpA4AcHb96KQK2PSPUyvChvrsEKiLhQ5NWjeef2IZ3Jc8JoosiedYqp6yhZR+S8cTysuvx56WyJIJc8y8OTrLA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.936.0", + "@aws-sdk/types": "3.936.0", + "@smithy/property-provider": "^4.2.5", + "@smithy/shared-ini-file-loader": "^4.4.0", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@aws-sdk/credential-provider-sso": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.936.0.tgz", + "integrity": "sha512-wHlEAJJvtnSyxTfNhN98JcU4taA1ED2JvuI2eePgawqBwS/Tzi0mhED1lvNIaWOkjfLd+nHALwszGrtJwEq4yQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/client-sso": "3.936.0", + "@aws-sdk/core": "3.936.0", + "@aws-sdk/token-providers": "3.936.0", + "@aws-sdk/types": "3.936.0", + "@smithy/property-provider": "^4.2.5", + "@smithy/shared-ini-file-loader": "^4.4.0", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@aws-sdk/credential-provider-web-identity": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.936.0.tgz", + "integrity": "sha512-v3qHAuoODkoRXsAF4RG+ZVO6q2P9yYBT4GMpMEfU9wXVNn7AIfwZgTwzSUfnjNiGva5BKleWVpRpJ9DeuLFbUg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.936.0", + "@aws-sdk/nested-clients": "3.936.0", + "@aws-sdk/types": "3.936.0", + "@smithy/property-provider": "^4.2.5", + "@smithy/shared-ini-file-loader": "^4.4.0", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@aws-sdk/middleware-host-header": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.936.0.tgz", + "integrity": "sha512-tAaObaAnsP1XnLGndfkGWFuzrJYuk9W0b/nLvol66t8FZExIAf/WdkT2NNAWOYxljVs++oHnyHBCxIlaHrzSiw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.936.0", + "@smithy/protocol-http": "^5.3.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@aws-sdk/middleware-logger": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.936.0.tgz", + "integrity": "sha512-aPSJ12d3a3Ea5nyEnLbijCaaYJT2QjQ9iW+zGh5QcZYXmOGWbKVyPSxmVOboZQG+c1M8t6d2O7tqrwzIq8L8qw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.936.0", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@aws-sdk/middleware-recursion-detection": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.936.0.tgz", + "integrity": "sha512-l4aGbHpXM45YNgXggIux1HgsCVAvvBoqHPkqLnqMl9QVapfuSTjJHfDYDsx1Xxct6/m7qSMUzanBALhiaGO2fA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.936.0", + "@aws/lambda-invoke-store": "^0.2.0", + "@smithy/protocol-http": "^5.3.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.936.0.tgz", + "integrity": "sha512-YB40IPa7K3iaYX0lSnV9easDOLPLh+fJyUDF3BH8doX4i1AOSsYn86L4lVldmOaSX+DwiaqKHpvk4wPBdcIPWw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.936.0", + "@aws-sdk/types": "3.936.0", + "@aws-sdk/util-endpoints": "3.936.0", + "@smithy/core": "^3.18.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@aws-sdk/nested-clients": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.936.0.tgz", + "integrity": "sha512-eyj2tz1XmDSLSZQ5xnB7cLTVKkSJnYAEoNDSUNhzWPxrBDYeJzIbatecOKceKCU8NBf8gWWZCK/CSY0mDxMO0A==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.936.0", + "@aws-sdk/middleware-host-header": "3.936.0", + "@aws-sdk/middleware-logger": "3.936.0", + "@aws-sdk/middleware-recursion-detection": "3.936.0", + "@aws-sdk/middleware-user-agent": "3.936.0", + "@aws-sdk/region-config-resolver": "3.936.0", + "@aws-sdk/types": "3.936.0", + "@aws-sdk/util-endpoints": "3.936.0", + "@aws-sdk/util-user-agent-browser": "3.936.0", + "@aws-sdk/util-user-agent-node": "3.936.0", + "@smithy/config-resolver": "^4.4.3", + "@smithy/core": "^3.18.5", + "@smithy/fetch-http-handler": "^5.3.6", + "@smithy/hash-node": "^4.2.5", + "@smithy/invalid-dependency": "^4.2.5", + "@smithy/middleware-content-length": "^4.2.5", + "@smithy/middleware-endpoint": "^4.3.12", + "@smithy/middleware-retry": "^4.4.12", + "@smithy/middleware-serde": "^4.2.6", + "@smithy/middleware-stack": "^4.2.5", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/node-http-handler": "^4.4.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/smithy-client": "^4.9.8", + "@smithy/types": "^4.9.0", + "@smithy/url-parser": "^4.2.5", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-body-length-node": "^4.2.1", + "@smithy/util-defaults-mode-browser": "^4.3.11", + "@smithy/util-defaults-mode-node": "^4.2.14", + "@smithy/util-endpoints": "^3.2.5", + "@smithy/util-middleware": "^4.2.5", + "@smithy/util-retry": "^4.2.5", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@aws-sdk/region-config-resolver": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.936.0.tgz", + "integrity": "sha512-wOKhzzWsshXGduxO4pqSiNyL9oUtk4BEvjWm9aaq6Hmfdoydq6v6t0rAGHWPjFwy9z2haovGRi3C8IxdMB4muw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.936.0", + "@smithy/config-resolver": "^4.4.3", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@aws-sdk/token-providers": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.936.0.tgz", + "integrity": "sha512-vvw8+VXk0I+IsoxZw0mX9TMJawUJvEsg3EF7zcCSetwhNPAU8Xmlhv7E/sN/FgSmm7b7DsqKoW6rVtQiCs1PWQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.936.0", + "@aws-sdk/nested-clients": "3.936.0", + "@aws-sdk/types": "3.936.0", + "@smithy/property-provider": "^4.2.5", + "@smithy/shared-ini-file-loader": "^4.4.0", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@aws-sdk/types": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.936.0.tgz", + "integrity": "sha512-uz0/VlMd2pP5MepdrHizd+T+OKfyK4r3OA9JI+L/lPKg0YFQosdJNCKisr6o70E3dh8iMpFYxF1UN/4uZsyARg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@aws-sdk/util-endpoints": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.936.0.tgz", + "integrity": "sha512-0Zx3Ntdpu+z9Wlm7JKUBOzS9EunwKAb4KdGUQQxDqh5Lc3ta5uBoub+FgmVuzwnmBu9U1Os8UuwVTH0Lgu+P5w==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.936.0", + "@smithy/types": "^4.9.0", + "@smithy/url-parser": "^4.2.5", + "@smithy/util-endpoints": "^3.2.5", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@aws-sdk/util-user-agent-browser": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.936.0.tgz", + "integrity": "sha512-eZ/XF6NxMtu+iCma58GRNRxSq4lHo6zHQLOZRIeL/ghqYJirqHdenMOwrzPettj60KWlv827RVebP9oNVrwZbw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.936.0", + "@smithy/types": "^4.9.0", + "bowser": "^2.11.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@aws-sdk/util-user-agent-node": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.936.0.tgz", + "integrity": "sha512-XOEc7PF9Op00pWV2AYCGDSu5iHgYjIO53Py2VUQTIvP7SRCaCsXmA33mjBvC2Ms6FhSyWNa4aK4naUGIz0hQcw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/middleware-user-agent": "3.936.0", + "@aws-sdk/types": "3.936.0", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "aws-crt": ">=1.0.0" + }, + "peerDependenciesMeta": { + "aws-crt": { + "optional": true + } + } + }, + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@aws-sdk/xml-builder": { + "version": "3.930.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.930.0.tgz", + "integrity": "sha512-YIfkD17GocxdmlUVc3ia52QhcWuRIUJonbF8A2CYfcWNV3HzvAqpcPeC0bYUhkK+8e8YO1ARnLKZQE0TlwzorA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "fast-xml-parser": "5.2.5", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@aws/lambda-invoke-store": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@aws/lambda-invoke-store/-/lambda-invoke-store-0.2.1.tgz", + "integrity": "sha512-sIyFcoPZkTtNu9xFeEoynMef3bPJIAbOfUh+ueYcfhVl6xm2VRtMcMclSxmZCMnHHd4hlYKJeq/aggmBEWynww==", + "license": "Apache-2.0", + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@smithy/abort-controller": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.2.5.tgz", + "integrity": "sha512-j7HwVkBw68YW8UmFRcjZOmssE77Rvk0GWAIN1oFBhsaovQmZWYCIcGa9/pwRB0ExI8Sk9MWNALTjftjHZea7VA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@smithy/config-resolver": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.4.3.tgz", + "integrity": "sha512-ezHLe1tKLUxDJo2LHtDuEDyWXolw8WGOR92qb4bQdWq/zKenO5BvctZGrVJBK08zjezSk7bmbKFOXIVyChvDLw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/node-config-provider": "^4.3.5", + "@smithy/types": "^4.9.0", + "@smithy/util-config-provider": "^4.2.0", + "@smithy/util-endpoints": "^3.2.5", + "@smithy/util-middleware": "^4.2.5", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@smithy/core": { + "version": "3.18.5", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.18.5.tgz", + "integrity": "sha512-6gnIz3h+PEPQGDj8MnRSjDvKBah042jEoPgjFGJ4iJLBE78L4lY/n98x14XyPF4u3lN179Ub/ZKFY5za9GeLQw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/middleware-serde": "^4.2.6", + "@smithy/protocol-http": "^5.3.5", + "@smithy/types": "^4.9.0", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-middleware": "^4.2.5", + "@smithy/util-stream": "^4.5.6", + "@smithy/util-utf8": "^4.2.0", + "@smithy/uuid": "^1.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@smithy/credential-provider-imds": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.2.5.tgz", + "integrity": "sha512-BZwotjoZWn9+36nimwm/OLIcVe+KYRwzMjfhd4QT7QxPm9WY0HiOV8t/Wlh+HVUif0SBVV7ksq8//hPaBC/okQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/node-config-provider": "^4.3.5", + "@smithy/property-provider": "^4.2.5", + "@smithy/types": "^4.9.0", + "@smithy/url-parser": "^4.2.5", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@smithy/fetch-http-handler": { + "version": "5.3.6", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.3.6.tgz", + "integrity": "sha512-3+RG3EA6BBJ/ofZUeTFJA7mHfSYrZtQIrDP9dI8Lf7X6Jbos2jptuLrAAteDiFVrmbEmLSuRG/bUKzfAXk7dhg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/protocol-http": "^5.3.5", + "@smithy/querystring-builder": "^4.2.5", + "@smithy/types": "^4.9.0", + "@smithy/util-base64": "^4.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@smithy/hash-node": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.2.5.tgz", + "integrity": "sha512-DpYX914YOfA3UDT9CN1BM787PcHfWRBB43fFGCYrZFUH0Jv+5t8yYl+Pd5PW4+QzoGEDvn5d5QIO4j2HyYZQSA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "@smithy/util-buffer-from": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@smithy/invalid-dependency": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.2.5.tgz", + "integrity": "sha512-2L2erASEro1WC5nV+plwIMxrTXpvpfzl4e+Nre6vBVRR2HKeGGcvpJyyL3/PpiSg+cJG2KpTmZmq934Olb6e5A==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@smithy/is-array-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-4.2.0.tgz", + "integrity": "sha512-DZZZBvC7sjcYh4MazJSGiWMI2L7E0oCiRHREDzIxi/M2LY79/21iXt6aPLHge82wi5LsuRF5A06Ds3+0mlh6CQ==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@smithy/middleware-content-length": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.2.5.tgz", + "integrity": "sha512-Y/RabVa5vbl5FuHYV2vUCwvh/dqzrEY/K2yWPSqvhFUwIY0atLqO4TienjBXakoy4zrKAMCZwg+YEqmH7jaN7A==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/protocol-http": "^5.3.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@smithy/middleware-endpoint": { + "version": "4.3.12", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.3.12.tgz", + "integrity": "sha512-9pAX/H+VQPzNbouhDhkW723igBMLgrI8OtX+++M7iKJgg/zY/Ig3i1e6seCcx22FWhE6Q/S61BRdi2wXBORT+A==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/core": "^3.18.5", + "@smithy/middleware-serde": "^4.2.6", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/shared-ini-file-loader": "^4.4.0", + "@smithy/types": "^4.9.0", + "@smithy/url-parser": "^4.2.5", + "@smithy/util-middleware": "^4.2.5", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@smithy/middleware-retry": { + "version": "4.4.12", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.4.12.tgz", + "integrity": "sha512-S4kWNKFowYd0lID7/DBqWHOQxmxlsf0jBaos9chQZUWTVOjSW1Ogyh8/ib5tM+agFDJ/TCxuCTvrnlc+9cIBcQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/node-config-provider": "^4.3.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/service-error-classification": "^4.2.5", + "@smithy/smithy-client": "^4.9.8", + "@smithy/types": "^4.9.0", + "@smithy/util-middleware": "^4.2.5", + "@smithy/util-retry": "^4.2.5", + "@smithy/uuid": "^1.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@smithy/middleware-serde": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.2.6.tgz", + "integrity": "sha512-VkLoE/z7e2g8pirwisLz8XJWedUSY8my/qrp81VmAdyrhi94T+riBfwP+AOEEFR9rFTSonC/5D2eWNmFabHyGQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/protocol-http": "^5.3.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@smithy/middleware-stack": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.2.5.tgz", + "integrity": "sha512-bYrutc+neOyWxtZdbB2USbQttZN0mXaOyYLIsaTbJhFsfpXyGWUxJpEuO1rJ8IIJm2qH4+xJT0mxUSsEDTYwdQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@smithy/node-config-provider": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.3.5.tgz", + "integrity": "sha512-UTurh1C4qkVCtqggI36DGbLB2Kv8UlcFdMXDcWMbqVY2uRg0XmT9Pb4Vj6oSQ34eizO1fvR0RnFV4Axw4IrrAg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/property-provider": "^4.2.5", + "@smithy/shared-ini-file-loader": "^4.4.0", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@smithy/node-http-handler": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.4.5.tgz", + "integrity": "sha512-CMnzM9R2WqlqXQGtIlsHMEZfXKJVTIrqCNoSd/QpAyp+Dw0a1Vps13l6ma1fH8g7zSPNsA59B/kWgeylFuA/lw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/abort-controller": "^4.2.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/querystring-builder": "^4.2.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@smithy/property-provider": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.2.5.tgz", + "integrity": "sha512-8iLN1XSE1rl4MuxvQ+5OSk/Zb5El7NJZ1td6Tn+8dQQHIjp59Lwl6bd0+nzw6SKm2wSSriH2v/I9LPzUic7EOg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@smithy/protocol-http": { + "version": "5.3.5", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.3.5.tgz", + "integrity": "sha512-RlaL+sA0LNMp03bf7XPbFmT5gN+w3besXSWMkA8rcmxLSVfiEXElQi4O2IWwPfxzcHkxqrwBFMbngB8yx/RvaQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@smithy/querystring-builder": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.2.5.tgz", + "integrity": "sha512-y98otMI1saoajeik2kLfGyRp11e5U/iJYH/wLCh3aTV/XutbGT9nziKGkgCaMD1ghK7p6htHMm6b6scl9JRUWg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "@smithy/util-uri-escape": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@smithy/querystring-parser": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.2.5.tgz", + "integrity": "sha512-031WCTdPYgiQRYNPXznHXof2YM0GwL6SeaSyTH/P72M1Vz73TvCNH2Nq8Iu2IEPq9QP2yx0/nrw5YmSeAi/AjQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@smithy/service-error-classification": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.2.5.tgz", + "integrity": "sha512-8fEvK+WPE3wUAcDvqDQG1Vk3ANLR8Px979te96m84CbKAjBVf25rPYSzb4xU4hlTyho7VhOGnh5i62D/JVF0JQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@smithy/shared-ini-file-loader": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.4.0.tgz", + "integrity": "sha512-5WmZ5+kJgJDjwXXIzr1vDTG+RhF9wzSODQBfkrQ2VVkYALKGvZX1lgVSxEkgicSAFnFhPj5rudJV0zoinqS0bA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@smithy/signature-v4": { + "version": "5.3.5", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.3.5.tgz", + "integrity": "sha512-xSUfMu1FT7ccfSXkoLl/QRQBi2rOvi3tiBZU2Tdy3I6cgvZ6SEi9QNey+lqps/sJRnogIS+lq+B1gxxbra2a/w==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^4.2.0", + "@smithy/protocol-http": "^5.3.5", + "@smithy/types": "^4.9.0", + "@smithy/util-hex-encoding": "^4.2.0", + "@smithy/util-middleware": "^4.2.5", + "@smithy/util-uri-escape": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@smithy/smithy-client": { + "version": "4.9.8", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.9.8.tgz", + "integrity": "sha512-8xgq3LgKDEFoIrLWBho/oYKyWByw9/corz7vuh1upv7ZBm0ZMjGYBhbn6v643WoIqA9UTcx5A5htEp/YatUwMA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/core": "^3.18.5", + "@smithy/middleware-endpoint": "^4.3.12", + "@smithy/middleware-stack": "^4.2.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/types": "^4.9.0", + "@smithy/util-stream": "^4.5.6", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@smithy/types": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.9.0.tgz", + "integrity": "sha512-MvUbdnXDTwykR8cB1WZvNNwqoWVaTRA0RLlLmf/cIFNMM2cKWz01X4Ly6SMC4Kks30r8tT3Cty0jmeWfiuyHTA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@smithy/url-parser": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.2.5.tgz", + "integrity": "sha512-VaxMGsilqFnK1CeBX+LXnSuaMx4sTL/6znSZh2829txWieazdVxr54HmiyTsIbpOTLcf5nYpq9lpzmwRdxj6rQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/querystring-parser": "^4.2.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@smithy/util-base64": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-4.3.0.tgz", + "integrity": "sha512-GkXZ59JfyxsIwNTWFnjmFEI8kZpRNIBfxKjv09+nkAWPt/4aGaEWMM04m4sxgNVWkbt2MdSvE3KF/PfX4nFedQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@smithy/util-body-length-browser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-4.2.0.tgz", + "integrity": "sha512-Fkoh/I76szMKJnBXWPdFkQJl2r9SjPt3cMzLdOB6eJ4Pnpas8hVoWPYemX/peO0yrrvldgCUVJqOAjUrOLjbxg==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@smithy/util-body-length-node": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-4.2.1.tgz", + "integrity": "sha512-h53dz/pISVrVrfxV1iqXlx5pRg3V2YWFcSQyPyXZRrZoZj4R4DeWRDo1a7dd3CPTcFi3kE+98tuNyD2axyZReA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@smithy/util-buffer-from": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-4.2.0.tgz", + "integrity": "sha512-kAY9hTKulTNevM2nlRtxAG2FQ3B2OR6QIrPY3zE5LqJy1oxzmgBGsHLWTcNhWXKchgA0WHW+mZkQrng/pgcCew==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@smithy/util-config-provider": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-4.2.0.tgz", + "integrity": "sha512-YEjpl6XJ36FTKmD+kRJJWYvrHeUvm5ykaUS5xK+6oXffQPHeEM4/nXlZPe+Wu0lsgRUcNZiliYNh/y7q9c2y6Q==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@smithy/util-defaults-mode-browser": { + "version": "4.3.11", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.3.11.tgz", + "integrity": "sha512-yHv+r6wSQXEXTPVCIQTNmXVWs7ekBTpMVErjqZoWkYN75HIFN5y9+/+sYOejfAuvxWGvgzgxbTHa/oz61YTbKw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/property-provider": "^4.2.5", + "@smithy/smithy-client": "^4.9.8", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@smithy/util-defaults-mode-node": { + "version": "4.2.14", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.2.14.tgz", + "integrity": "sha512-ljZN3iRvaJUgulfvobIuG97q1iUuCMrvXAlkZ4msY+ZuVHQHDIqn7FKZCEj+bx8omz6kF5yQXms/xhzjIO5XiA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/config-resolver": "^4.4.3", + "@smithy/credential-provider-imds": "^4.2.5", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/property-provider": "^4.2.5", + "@smithy/smithy-client": "^4.9.8", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@smithy/util-endpoints": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.2.5.tgz", + "integrity": "sha512-3O63AAWu2cSNQZp+ayl9I3NapW1p1rR5mlVHcF6hAB1dPZUQFfRPYtplWX/3xrzWthPGj5FqB12taJJCfH6s8A==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/node-config-provider": "^4.3.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@smithy/util-hex-encoding": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-4.2.0.tgz", + "integrity": "sha512-CCQBwJIvXMLKxVbO88IukazJD9a4kQ9ZN7/UMGBjBcJYvatpWk+9g870El4cB8/EJxfe+k+y0GmR9CAzkF+Nbw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@smithy/util-middleware": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.2.5.tgz", + "integrity": "sha512-6Y3+rvBF7+PZOc40ybeZMcGln6xJGVeY60E7jy9Mv5iKpMJpHgRE6dKy9ScsVxvfAYuEX4Q9a65DQX90KaQ3bA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@smithy/util-retry": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.2.5.tgz", + "integrity": "sha512-GBj3+EZBbN4NAqJ/7pAhsXdfzdlznOh8PydUijy6FpNIMnHPSMO2/rP4HKu+UFeikJxShERk528oy7GT79YiJg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/service-error-classification": "^4.2.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@smithy/util-stream": { + "version": "4.5.6", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.5.6.tgz", + "integrity": "sha512-qWw/UM59TiaFrPevefOZ8CNBKbYEP6wBAIlLqxn3VAIo9rgnTNc4ASbVrqDmhuwI87usnjhdQrxodzAGFFzbRQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/fetch-http-handler": "^5.3.6", + "@smithy/node-http-handler": "^4.4.5", + "@smithy/types": "^4.9.0", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-buffer-from": "^4.2.0", + "@smithy/util-hex-encoding": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@smithy/util-uri-escape": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-4.2.0.tgz", + "integrity": "sha512-igZpCKV9+E/Mzrpq6YacdTQ0qTiLm85gD6N/IrmyDvQFA4UnU3d5g3m8tMT/6zG/vVkWSU+VxeUyGonL62DuxA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@smithy/util-utf8": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.2.0.tgz", + "integrity": "sha512-zBPfuzoI8xyBtR2P6WQj63Rz8i3AmfAaJLuNG8dWsfvPe8lO4aCPYLn879mEgHndZH1zQ2oXmG8O1GGzzaoZiw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/fast-xml-parser": { + "version": "5.2.5", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.2.5.tgz", + "integrity": "sha512-pfX9uG9Ki0yekDHx2SiuRIyFdyAr1kMIMitPvb0YBo8SUfKvia7w7FIyd/l6av85pFYRhZscS75MwMnbvY+hcQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "dependencies": { + "strnum": "^2.1.0" + }, + "bin": { + "fxparser": "src/cli/cli.js" + } + }, + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/strnum": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.1.1.tgz", + "integrity": "sha512-7ZvoFTiCnGxBtDqJ//Cu6fWtZtc7Y3x+QOirG15wztbdngGSkht27o2pyGWrVy0b4WAy3jbKmnoK6g5VlVNUUw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT" + }, + "node_modules/@aws-sdk/credential-provider-env": { + "version": "3.693.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@smithy/property-provider": "^3.1.9", + "@smithy/types": "^3.7.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-env/node_modules/@aws-sdk/core": { + "version": "3.693.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.692.0", + "@smithy/core": "^2.5.2", + "@smithy/node-config-provider": "^3.1.10", + "@smithy/property-provider": "^3.1.9", + "@smithy/protocol-http": "^4.1.6", + "@smithy/signature-v4": "^4.2.2", + "@smithy/smithy-client": "^3.4.3", + "@smithy/types": "^3.7.0", + "@smithy/util-middleware": "^3.0.9", + "fast-xml-parser": "4.4.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-http": { + "version": "3.972.3", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.972.3.tgz", + "integrity": "sha512-IbBGWhaxiEl64fznwh5PDEB0N7YJEAvK5b6nRtPVUKdKAHlOPgo6B9XB8mqWDs8Ct0oF/E34ZLiq2U0L5xDkrg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.973.2", + "@aws-sdk/types": "^3.973.1", + "@smithy/fetch-http-handler": "^5.3.9", + "@smithy/node-http-handler": "^4.4.8", + "@smithy/property-provider": "^4.2.8", + "@smithy/protocol-http": "^5.3.8", + "@smithy/smithy-client": "^4.10.12", + "@smithy/types": "^4.12.0", + "@smithy/util-stream": "^4.5.10", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-http/node_modules/@aws-sdk/types": { + "version": "3.973.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.973.1.tgz", + "integrity": "sha512-DwHBiMNOB468JiX6+i34c+THsKHErYUdNQ3HexeXZvVn4zouLjgaS4FejiGSi2HyBuzuyHg7SuOPmjSvoU9NRg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/abort-controller": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.2.8.tgz", + "integrity": "sha512-peuVfkYHAmS5ybKxWcfraK7WBBP0J+rkfUcbHJJKQ4ir3UAUNQI+Y4Vt/PqSzGqgloJ5O1dk7+WzNL8wcCSXbw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/core": { + "version": "3.21.1", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.21.1.tgz", + "integrity": "sha512-NUH8R4O6FkN8HKMojzbGg/5pNjsfTjlMmeFclyPfPaXXUrbr5TzhWgbf7t92wfrpCHRgpjyz7ffASIS3wX28aA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/middleware-serde": "^4.2.9", + "@smithy/protocol-http": "^5.3.8", + "@smithy/types": "^4.12.0", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-middleware": "^4.2.8", + "@smithy/util-stream": "^4.5.10", + "@smithy/util-utf8": "^4.2.0", + "@smithy/uuid": "^1.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/fetch-http-handler": { + "version": "5.3.9", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.3.9.tgz", + "integrity": "sha512-I4UhmcTYXBrct03rwzQX1Y/iqQlzVQaPxWjCjula++5EmWq9YGBrx6bbGqluGc1f0XEfhSkiY4jhLgbsJUMKRA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/protocol-http": "^5.3.8", + "@smithy/querystring-builder": "^4.2.8", + "@smithy/types": "^4.12.0", + "@smithy/util-base64": "^4.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/is-array-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-4.2.0.tgz", + "integrity": "sha512-DZZZBvC7sjcYh4MazJSGiWMI2L7E0oCiRHREDzIxi/M2LY79/21iXt6aPLHge82wi5LsuRF5A06Ds3+0mlh6CQ==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/middleware-endpoint": { + "version": "4.4.11", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.4.11.tgz", + "integrity": "sha512-/WqsrycweGGfb9sSzME4CrsuayjJF6BueBmkKlcbeU5q18OhxRrvvKlmfw3tpDsK5ilx2XUJvoukwxHB0nHs/Q==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/core": "^3.21.1", + "@smithy/middleware-serde": "^4.2.9", + "@smithy/node-config-provider": "^4.3.8", + "@smithy/shared-ini-file-loader": "^4.4.3", + "@smithy/types": "^4.12.0", + "@smithy/url-parser": "^4.2.8", + "@smithy/util-middleware": "^4.2.8", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/middleware-serde": { + "version": "4.2.9", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.2.9.tgz", + "integrity": "sha512-eMNiej0u/snzDvlqRGSN3Vl0ESn3838+nKyVfF2FKNXFbi4SERYT6PR392D39iczngbqqGG0Jl1DlCnp7tBbXQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/protocol-http": "^5.3.8", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/middleware-stack": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.2.8.tgz", + "integrity": "sha512-w6LCfOviTYQjBctOKSwy6A8FIkQy7ICvglrZFl6Bw4FmcQ1Z420fUtIhxaUZZshRe0VCq4kvDiPiXrPZAe8oRA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/node-config-provider": { + "version": "4.3.8", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.3.8.tgz", + "integrity": "sha512-aFP1ai4lrbVlWjfpAfRSL8KFcnJQYfTl5QxLJXY32vghJrDuFyPZ6LtUL+JEGYiFRG1PfPLHLoxj107ulncLIg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/property-provider": "^4.2.8", + "@smithy/shared-ini-file-loader": "^4.4.3", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/node-http-handler": { + "version": "4.4.8", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.4.8.tgz", + "integrity": "sha512-q9u+MSbJVIJ1QmJ4+1u+cERXkrhuILCBDsJUBAW1MPE6sFonbCNaegFuwW9ll8kh5UdyY3jOkoOGlc7BesoLpg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/abort-controller": "^4.2.8", + "@smithy/protocol-http": "^5.3.8", + "@smithy/querystring-builder": "^4.2.8", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/property-provider": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.2.8.tgz", + "integrity": "sha512-EtCTbyIveCKeOXDSWSdze3k612yCPq1YbXsbqX3UHhkOSW8zKsM9NOJG5gTIya0vbY2DIaieG8pKo1rITHYL0w==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/protocol-http": { + "version": "5.3.8", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.3.8.tgz", + "integrity": "sha512-QNINVDhxpZ5QnP3aviNHQFlRogQZDfYlCkQT+7tJnErPQbDhysondEjhikuANxgMsZrkGeiAxXy4jguEGsDrWQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/querystring-builder": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.2.8.tgz", + "integrity": "sha512-Xr83r31+DrE8CP3MqPgMJl+pQlLLmOfiEUnoyAlGzzJIrEsbKsPy1hqH0qySaQm4oWrCBlUqRt+idEgunKB+iw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.12.0", + "@smithy/util-uri-escape": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/querystring-parser": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.2.8.tgz", + "integrity": "sha512-vUurovluVy50CUlazOiXkPq40KGvGWSdmusa3130MwrR1UNnNgKAlj58wlOe61XSHRpUfIIh6cE0zZ8mzKaDPA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/shared-ini-file-loader": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.4.3.tgz", + "integrity": "sha512-DfQjxXQnzC5UbCUPeC3Ie8u+rIWZTvuDPAGU/BxzrOGhRvgUanaP68kDZA+jaT3ZI+djOf+4dERGlm9mWfFDrg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/smithy-client": { + "version": "4.10.12", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.10.12.tgz", + "integrity": "sha512-VKO/HKoQ5OrSHW6AJUmEnUKeXI1/5LfCwO9cwyao7CmLvGnZeM1i36Lyful3LK1XU7HwTVieTqO1y2C/6t3qtA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/core": "^3.21.1", + "@smithy/middleware-endpoint": "^4.4.11", + "@smithy/middleware-stack": "^4.2.8", + "@smithy/protocol-http": "^5.3.8", + "@smithy/types": "^4.12.0", + "@smithy/util-stream": "^4.5.10", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/types": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.12.0.tgz", + "integrity": "sha512-9YcuJVTOBDjg9LWo23Qp0lTQ3D7fQsQtwle0jVfpbUHy9qBwCEgKuVH4FqFB3VYu0nwdHKiEMA+oXz7oV8X1kw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/url-parser": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.2.8.tgz", + "integrity": "sha512-NQho9U68TGMEU639YkXnVMV3GEFFULmmaWdlu1E9qzyIePOHsoSnagTGSDv1Zi8DCNN6btxOSdgmy5E/hsZwhA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/querystring-parser": "^4.2.8", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/util-base64": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-4.3.0.tgz", + "integrity": "sha512-GkXZ59JfyxsIwNTWFnjmFEI8kZpRNIBfxKjv09+nkAWPt/4aGaEWMM04m4sxgNVWkbt2MdSvE3KF/PfX4nFedQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/util-body-length-browser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-4.2.0.tgz", + "integrity": "sha512-Fkoh/I76szMKJnBXWPdFkQJl2r9SjPt3cMzLdOB6eJ4Pnpas8hVoWPYemX/peO0yrrvldgCUVJqOAjUrOLjbxg==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/util-buffer-from": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-4.2.0.tgz", + "integrity": "sha512-kAY9hTKulTNevM2nlRtxAG2FQ3B2OR6QIrPY3zE5LqJy1oxzmgBGsHLWTcNhWXKchgA0WHW+mZkQrng/pgcCew==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/util-hex-encoding": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-4.2.0.tgz", + "integrity": "sha512-CCQBwJIvXMLKxVbO88IukazJD9a4kQ9ZN7/UMGBjBcJYvatpWk+9g870El4cB8/EJxfe+k+y0GmR9CAzkF+Nbw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/util-middleware": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.2.8.tgz", + "integrity": "sha512-PMqfeJxLcNPMDgvPbbLl/2Vpin+luxqTGPpW3NAQVLbRrFRzTa4rNAASYeIGjRV9Ytuhzny39SpyU04EQreF+A==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/util-stream": { + "version": "4.5.10", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.5.10.tgz", + "integrity": "sha512-jbqemy51UFSZSp2y0ZmRfckmrzuKww95zT9BYMmuJ8v3altGcqjwoV1tzpOwuHaKrwQrCjIzOib499ymr2f98g==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/fetch-http-handler": "^5.3.9", + "@smithy/node-http-handler": "^4.4.8", + "@smithy/types": "^4.12.0", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-buffer-from": "^4.2.0", + "@smithy/util-hex-encoding": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/util-uri-escape": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-4.2.0.tgz", + "integrity": "sha512-igZpCKV9+E/Mzrpq6YacdTQ0qTiLm85gD6N/IrmyDvQFA4UnU3d5g3m8tMT/6zG/vVkWSU+VxeUyGonL62DuxA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/util-utf8": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.2.0.tgz", + "integrity": "sha512-zBPfuzoI8xyBtR2P6WQj63Rz8i3AmfAaJLuNG8dWsfvPe8lO4aCPYLn879mEgHndZH1zQ2oXmG8O1GGzzaoZiw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "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", + "@aws-sdk/credential-provider-http": "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/nested-clients": "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-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", + "@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" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "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", + "@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-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", + "@smithy/property-provider": "^4.0.1", + "@smithy/types": "^4.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "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", + "@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-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", + "@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-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", + "@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-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", + "@smithy/types": "^4.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "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", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/credential-provider-node": { - "version": "3.693.0", + "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/credential-provider-env": "3.693.0", - "@aws-sdk/credential-provider-http": "3.693.0", - "@aws-sdk/credential-provider-ini": "3.693.0", - "@aws-sdk/credential-provider-process": "3.693.0", - "@aws-sdk/credential-provider-sso": "3.693.0", - "@aws-sdk/credential-provider-web-identity": "3.693.0", - "@aws-sdk/types": "3.692.0", - "@smithy/credential-provider-imds": "^3.2.6", - "@smithy/property-provider": "^3.1.9", - "@smithy/shared-ini-file-loader": "^3.1.10", - "@smithy/types": "^3.7.0", + "@aws-sdk/types": "3.734.0", + "@smithy/protocol-http": "^5.0.1", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.693.0", + "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/client-sso": "3.693.0", - "@aws-sdk/core": "3.693.0", - "@aws-sdk/token-providers": "3.693.0", - "@aws-sdk/types": "3.692.0", - "@smithy/property-provider": "^3.1.9", - "@smithy/shared-ini-file-loader": "^3.1.10", - "@smithy/types": "^3.7.0", + "@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": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.693.0", + "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/core": "3.693.0", - "@aws-sdk/types": "3.692.0", - "@smithy/property-provider": "^3.1.9", - "@smithy/types": "^3.7.0", + "@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": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sts": "^3.693.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/middleware-host-header": { - "version": "3.693.0", + "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/types": "3.692.0", - "@smithy/protocol-http": "^4.1.6", - "@smithy/types": "^3.7.0", + "@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": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/middleware-logger": { - "version": "3.693.0", + "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-sdk/types": { + "version": "3.734.0", "license": "Apache-2.0", + "peer": true, "dependencies": { - "@aws-sdk/types": "3.692.0", - "@smithy/types": "^3.7.0", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.693.0", + "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.692.0", - "@smithy/protocol-http": "^4.1.6", - "@smithy/types": "^3.7.0", + "@aws-sdk/types": "3.734.0", + "@smithy/types": "^4.1.0", + "@smithy/util-endpoints": "^3.0.1", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.693.0", + "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/core": "3.693.0", - "@aws-sdk/types": "3.692.0", - "@aws-sdk/util-endpoints": "3.693.0", - "@smithy/core": "^2.5.2", - "@smithy/protocol-http": "^4.1.6", - "@smithy/types": "^3.7.0", + "@aws-sdk/types": "3.734.0", + "@smithy/types": "^4.1.0", + "bowser": "^2.11.0", + "tslib": "^2.6.2" + } + }, + "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", + "@smithy/node-config-provider": "^4.0.1", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" + }, + "peerDependencies": { + "aws-crt": ">=1.0.0" + }, + "peerDependenciesMeta": { + "aws-crt": { + "optional": true + } } }, - "node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/region-config-resolver": { - "version": "3.693.0", + "node_modules/@aws-sdk/credential-provider-ini/node_modules/@smithy/abort-controller": { + "version": "4.0.1", "license": "Apache-2.0", + "peer": true, "dependencies": { - "@aws-sdk/types": "3.692.0", - "@smithy/node-config-provider": "^3.1.10", - "@smithy/types": "^3.7.0", - "@smithy/util-config-provider": "^3.0.0", - "@smithy/util-middleware": "^3.0.9", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/token-providers": { - "version": "3.693.0", + "node_modules/@aws-sdk/credential-provider-ini/node_modules/@smithy/config-resolver": { + "version": "4.0.1", "license": "Apache-2.0", + "peer": true, "dependencies": { - "@aws-sdk/types": "3.692.0", - "@smithy/property-provider": "^3.1.9", - "@smithy/shared-ini-file-loader": "^3.1.10", - "@smithy/types": "^3.7.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": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sso-oidc": "^3.693.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/util-endpoints": { - "version": "3.693.0", + "node_modules/@aws-sdk/credential-provider-ini/node_modules/@smithy/core": { + "version": "3.1.5", "license": "Apache-2.0", + "peer": true, "dependencies": { - "@aws-sdk/types": "3.692.0", - "@smithy/types": "^3.7.0", - "@smithy/util-endpoints": "^2.1.5", + "@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": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.693.0", + "node_modules/@aws-sdk/credential-provider-ini/node_modules/@smithy/credential-provider-imds": { + "version": "4.0.1", "license": "Apache-2.0", + "peer": true, "dependencies": { - "@aws-sdk/types": "3.692.0", - "@smithy/types": "^3.7.0", - "bowser": "^2.11.0", + "@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-sdk/client-ssm/node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.693.0", + "node_modules/@aws-sdk/credential-provider-ini/node_modules/@smithy/fetch-http-handler": { + "version": "5.0.1", "license": "Apache-2.0", + "peer": true, "dependencies": { - "@aws-sdk/middleware-user-agent": "3.693.0", - "@aws-sdk/types": "3.692.0", - "@smithy/node-config-provider": "^3.1.10", - "@smithy/types": "^3.7.0", + "@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": ">=16.0.0" - }, - "peerDependencies": { - "aws-crt": ">=1.0.0" - }, - "peerDependenciesMeta": { - "aws-crt": { - "optional": true - } + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-ssm/node_modules/@smithy/is-array-buffer": { - "version": "3.0.0", + "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", + "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-ssm/node_modules/@smithy/util-buffer-from": { - "version": "3.0.0", + "node_modules/@aws-sdk/credential-provider-ini/node_modules/@smithy/invalid-dependency": { + "version": "4.0.1", "license": "Apache-2.0", + "peer": true, "dependencies": { - "@smithy/is-array-buffer": "^3.0.0", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-ssm/node_modules/@smithy/util-utf8": { - "version": "3.0.0", + "node_modules/@aws-sdk/credential-provider-ini/node_modules/@smithy/is-array-buffer": { + "version": "4.0.0", "license": "Apache-2.0", + "peer": true, "dependencies": { - "@smithy/util-buffer-from": "^3.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-sso": { - "version": "3.637.0", + "node_modules/@aws-sdk/credential-provider-ini/node_modules/@smithy/middleware-content-length": { + "version": "4.0.1", "license": "Apache-2.0", + "peer": true, "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.635.0", - "@aws-sdk/middleware-host-header": "3.620.0", - "@aws-sdk/middleware-logger": "3.609.0", - "@aws-sdk/middleware-recursion-detection": "3.620.0", - "@aws-sdk/middleware-user-agent": "3.637.0", - "@aws-sdk/region-config-resolver": "3.614.0", - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.637.0", - "@aws-sdk/util-user-agent-browser": "3.609.0", - "@aws-sdk/util-user-agent-node": "3.614.0", - "@smithy/config-resolver": "^3.0.5", - "@smithy/core": "^2.4.0", - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/hash-node": "^3.0.3", - "@smithy/invalid-dependency": "^3.0.3", - "@smithy/middleware-content-length": "^3.0.5", - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-retry": "^3.0.15", - "@smithy/middleware-serde": "^3.0.3", - "@smithy/middleware-stack": "^3.0.3", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.2.0", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.15", - "@smithy/util-defaults-mode-node": "^3.0.15", - "@smithy/util-endpoints": "^2.0.5", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-retry": "^3.0.3", - "@smithy/util-utf8": "^3.0.0", + "@smithy/protocol-http": "^5.0.1", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-sso-oidc": { - "version": "3.637.0", + "node_modules/@aws-sdk/credential-provider-ini/node_modules/@smithy/middleware-endpoint": { + "version": "4.0.6", "license": "Apache-2.0", + "peer": true, "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.635.0", - "@aws-sdk/credential-provider-node": "3.637.0", - "@aws-sdk/middleware-host-header": "3.620.0", - "@aws-sdk/middleware-logger": "3.609.0", - "@aws-sdk/middleware-recursion-detection": "3.620.0", - "@aws-sdk/middleware-user-agent": "3.637.0", - "@aws-sdk/region-config-resolver": "3.614.0", - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.637.0", - "@aws-sdk/util-user-agent-browser": "3.609.0", - "@aws-sdk/util-user-agent-node": "3.614.0", - "@smithy/config-resolver": "^3.0.5", - "@smithy/core": "^2.4.0", - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/hash-node": "^3.0.3", - "@smithy/invalid-dependency": "^3.0.3", - "@smithy/middleware-content-length": "^3.0.5", - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-retry": "^3.0.15", - "@smithy/middleware-serde": "^3.0.3", - "@smithy/middleware-stack": "^3.0.3", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.2.0", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.15", - "@smithy/util-defaults-mode-node": "^3.0.15", - "@smithy/util-endpoints": "^2.0.5", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-retry": "^3.0.3", - "@smithy/util-utf8": "^3.0.0", + "@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": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sts": "^3.637.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/types": { - "version": "3.609.0", + "node_modules/@aws-sdk/credential-provider-ini/node_modules/@smithy/middleware-retry": { + "version": "4.0.7", "license": "Apache-2.0", + "peer": true, "dependencies": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" + "@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": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/fetch-http-handler": { - "version": "3.2.4", + "node_modules/@aws-sdk/credential-provider-ini/node_modules/@smithy/middleware-serde": { + "version": "4.0.2", "license": "Apache-2.0", + "peer": true, "dependencies": { - "@smithy/protocol-http": "^4.1.0", - "@smithy/querystring-builder": "^3.0.3", - "@smithy/types": "^3.3.0", - "@smithy/util-base64": "^3.0.0", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/is-array-buffer": { - "version": "3.0.0", + "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" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/util-utf8": { - "version": "3.0.0", + "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/util-buffer-from": "^3.0.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": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/util-utf8/node_modules/@smithy/util-buffer-from": { - "version": "3.0.0", + "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/is-array-buffer": "^3.0.0", + "@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": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-sso/node_modules/@aws-sdk/types": { - "version": "3.609.0", + "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": "^3.3.0", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-sso/node_modules/@smithy/fetch-http-handler": { - "version": "3.2.4", + "node_modules/@aws-sdk/credential-provider-ini/node_modules/@smithy/protocol-http": { + "version": "5.0.1", "license": "Apache-2.0", + "peer": true, "dependencies": { - "@smithy/protocol-http": "^4.1.0", - "@smithy/querystring-builder": "^3.0.3", - "@smithy/types": "^3.3.0", - "@smithy/util-base64": "^3.0.0", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-sso/node_modules/@smithy/is-array-buffer": { - "version": "3.0.0", + "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", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-sso/node_modules/@smithy/util-utf8": { - "version": "3.0.0", + "node_modules/@aws-sdk/credential-provider-ini/node_modules/@smithy/querystring-parser": { + "version": "4.0.1", "license": "Apache-2.0", + "peer": true, "dependencies": { - "@smithy/util-buffer-from": "^3.0.0", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-sso/node_modules/@smithy/util-utf8/node_modules/@smithy/util-buffer-from": { - "version": "3.0.0", + "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/is-array-buffer": "^3.0.0", - "tslib": "^2.6.2" + "@smithy/types": "^4.1.0" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-sts": { - "version": "3.637.0", + "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": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.637.0", - "@aws-sdk/core": "3.635.0", - "@aws-sdk/credential-provider-node": "3.637.0", - "@aws-sdk/middleware-host-header": "3.620.0", - "@aws-sdk/middleware-logger": "3.609.0", - "@aws-sdk/middleware-recursion-detection": "3.620.0", - "@aws-sdk/middleware-user-agent": "3.637.0", - "@aws-sdk/region-config-resolver": "3.614.0", - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.637.0", - "@aws-sdk/util-user-agent-browser": "3.609.0", - "@aws-sdk/util-user-agent-node": "3.614.0", - "@smithy/config-resolver": "^3.0.5", - "@smithy/core": "^2.4.0", - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/hash-node": "^3.0.3", - "@smithy/invalid-dependency": "^3.0.3", - "@smithy/middleware-content-length": "^3.0.5", - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-retry": "^3.0.15", - "@smithy/middleware-serde": "^3.0.3", - "@smithy/middleware-stack": "^3.0.3", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.2.0", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.15", - "@smithy/util-defaults-mode-node": "^3.0.15", - "@smithy/util-endpoints": "^2.0.5", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-retry": "^3.0.3", - "@smithy/util-utf8": "^3.0.0", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-sts/node_modules/@aws-sdk/types": { - "version": "3.609.0", + "node_modules/@aws-sdk/credential-provider-ini/node_modules/@smithy/signature-v4": { + "version": "5.0.1", "license": "Apache-2.0", + "peer": true, "dependencies": { - "@smithy/types": "^3.3.0", + "@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": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-sts/node_modules/@smithy/fetch-http-handler": { - "version": "3.2.4", + "node_modules/@aws-sdk/credential-provider-ini/node_modules/@smithy/smithy-client": { + "version": "4.1.6", "license": "Apache-2.0", + "peer": true, "dependencies": { - "@smithy/protocol-http": "^4.1.0", - "@smithy/querystring-builder": "^3.0.3", - "@smithy/types": "^3.3.0", - "@smithy/util-base64": "^3.0.0", + "@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-sdk/client-sts/node_modules/@smithy/is-array-buffer": { - "version": "3.0.0", + "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" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-sts/node_modules/@smithy/util-utf8": { - "version": "3.0.0", + "node_modules/@aws-sdk/credential-provider-ini/node_modules/@smithy/url-parser": { + "version": "4.0.1", "license": "Apache-2.0", + "peer": true, "dependencies": { - "@smithy/util-buffer-from": "^3.0.0", + "@smithy/querystring-parser": "^4.0.1", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-sts/node_modules/@smithy/util-utf8/node_modules/@smithy/util-buffer-from": { - "version": "3.0.0", + "node_modules/@aws-sdk/credential-provider-ini/node_modules/@smithy/util-base64": { + "version": "4.0.0", "license": "Apache-2.0", + "peer": true, "dependencies": { - "@smithy/is-array-buffer": "^3.0.0", + "@smithy/util-buffer-from": "^4.0.0", + "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/core": { - "version": "3.635.0", + "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": { - "@smithy/core": "^2.4.0", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/property-provider": "^3.1.3", - "@smithy/protocol-http": "^4.1.0", - "@smithy/signature-v4": "^4.1.0", - "@smithy/smithy-client": "^3.2.0", - "@smithy/types": "^3.3.0", - "@smithy/util-middleware": "^3.0.3", - "fast-xml-parser": "4.4.1", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-cognito-identity": { - "version": "3.936.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.936.0.tgz", - "integrity": "sha512-+aSC59yiD4M5RcYp9Gx3iwX/n4hO3ZWA2Mxmkzmt9gYFBbJ9umx2LpBdrV64y57AtOvfGeo0h7PAXniIufagxw==", + "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": { - "@aws-sdk/client-cognito-identity": "3.936.0", - "@aws-sdk/types": "3.936.0", - "@smithy/property-provider": "^4.2.5", - "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@aws-sdk/client-cognito-identity": { - "version": "3.936.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.936.0.tgz", - "integrity": "sha512-AkJZ426y0G8Lsyi9p7mWudacMKeo8XLZOfxUmeThMkDa3GxGQ1y6BTrOj6ZcvqQ1Hz7Abb3QWPC+EMqhu1Lncw==", + "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" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-ini/node_modules/@smithy/util-config-provider": { + "version": "4.0.0", + "license": "Apache-2.0", + "peer": true, "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.936.0", - "@aws-sdk/credential-provider-node": "3.936.0", - "@aws-sdk/middleware-host-header": "3.936.0", - "@aws-sdk/middleware-logger": "3.936.0", - "@aws-sdk/middleware-recursion-detection": "3.936.0", - "@aws-sdk/middleware-user-agent": "3.936.0", - "@aws-sdk/region-config-resolver": "3.936.0", - "@aws-sdk/types": "3.936.0", - "@aws-sdk/util-endpoints": "3.936.0", - "@aws-sdk/util-user-agent-browser": "3.936.0", - "@aws-sdk/util-user-agent-node": "3.936.0", - "@smithy/config-resolver": "^4.4.3", - "@smithy/core": "^3.18.5", - "@smithy/fetch-http-handler": "^5.3.6", - "@smithy/hash-node": "^4.2.5", - "@smithy/invalid-dependency": "^4.2.5", - "@smithy/middleware-content-length": "^4.2.5", - "@smithy/middleware-endpoint": "^4.3.12", - "@smithy/middleware-retry": "^4.4.12", - "@smithy/middleware-serde": "^4.2.6", - "@smithy/middleware-stack": "^4.2.5", - "@smithy/node-config-provider": "^4.3.5", - "@smithy/node-http-handler": "^4.4.5", - "@smithy/protocol-http": "^5.3.5", - "@smithy/smithy-client": "^4.9.8", - "@smithy/types": "^4.9.0", - "@smithy/url-parser": "^4.2.5", - "@smithy/util-base64": "^4.3.0", - "@smithy/util-body-length-browser": "^4.2.0", - "@smithy/util-body-length-node": "^4.2.1", - "@smithy/util-defaults-mode-browser": "^4.3.11", - "@smithy/util-defaults-mode-node": "^4.2.14", - "@smithy/util-endpoints": "^3.2.5", - "@smithy/util-middleware": "^4.2.5", - "@smithy/util-retry": "^4.2.5", - "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@aws-sdk/client-sso": { - "version": "3.936.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.936.0.tgz", - "integrity": "sha512-0G73S2cDqYwJVvqL08eakj79MZG2QRaB56Ul8/Ps9oQxllr7DMI1IQ/N3j3xjxgpq/U36pkoFZ8aK1n7Sbr3IQ==", + "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": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.936.0", - "@aws-sdk/middleware-host-header": "3.936.0", - "@aws-sdk/middleware-logger": "3.936.0", - "@aws-sdk/middleware-recursion-detection": "3.936.0", - "@aws-sdk/middleware-user-agent": "3.936.0", - "@aws-sdk/region-config-resolver": "3.936.0", - "@aws-sdk/types": "3.936.0", - "@aws-sdk/util-endpoints": "3.936.0", - "@aws-sdk/util-user-agent-browser": "3.936.0", - "@aws-sdk/util-user-agent-node": "3.936.0", - "@smithy/config-resolver": "^4.4.3", - "@smithy/core": "^3.18.5", - "@smithy/fetch-http-handler": "^5.3.6", - "@smithy/hash-node": "^4.2.5", - "@smithy/invalid-dependency": "^4.2.5", - "@smithy/middleware-content-length": "^4.2.5", - "@smithy/middleware-endpoint": "^4.3.12", - "@smithy/middleware-retry": "^4.4.12", - "@smithy/middleware-serde": "^4.2.6", - "@smithy/middleware-stack": "^4.2.5", - "@smithy/node-config-provider": "^4.3.5", - "@smithy/node-http-handler": "^4.4.5", - "@smithy/protocol-http": "^5.3.5", - "@smithy/smithy-client": "^4.9.8", - "@smithy/types": "^4.9.0", - "@smithy/url-parser": "^4.2.5", - "@smithy/util-base64": "^4.3.0", - "@smithy/util-body-length-browser": "^4.2.0", - "@smithy/util-body-length-node": "^4.2.1", - "@smithy/util-defaults-mode-browser": "^4.3.11", - "@smithy/util-defaults-mode-node": "^4.2.14", - "@smithy/util-endpoints": "^3.2.5", - "@smithy/util-middleware": "^4.2.5", - "@smithy/util-retry": "^4.2.5", - "@smithy/util-utf8": "^4.2.0", + "@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-sdk/credential-provider-cognito-identity/node_modules/@aws-sdk/core": { - "version": "3.936.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.936.0.tgz", - "integrity": "sha512-eGJ2ySUMvgtOziHhDRDLCrj473RJoL4J1vPjVM3NrKC/fF3/LoHjkut8AAnKmrW6a2uTzNKubigw8dEnpmpERw==", + "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": { - "@aws-sdk/types": "3.936.0", - "@aws-sdk/xml-builder": "3.930.0", - "@smithy/core": "^3.18.5", - "@smithy/node-config-provider": "^4.3.5", - "@smithy/property-provider": "^4.2.5", - "@smithy/protocol-http": "^5.3.5", - "@smithy/signature-v4": "^5.3.5", - "@smithy/smithy-client": "^4.9.8", - "@smithy/types": "^4.9.0", - "@smithy/util-base64": "^4.3.0", - "@smithy/util-middleware": "^4.2.5", - "@smithy/util-utf8": "^4.2.0", + "@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" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@aws-sdk/credential-provider-env": { - "version": "3.936.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.936.0.tgz", - "integrity": "sha512-dKajFuaugEA5i9gCKzOaVy9uTeZcApE+7Z5wdcZ6j40523fY1a56khDAUYkCfwqa7sHci4ccmxBkAo+fW1RChA==", + "node_modules/@aws-sdk/credential-provider-ini/node_modules/@smithy/util-endpoints": { + "version": "3.0.1", "license": "Apache-2.0", + "peer": true, "dependencies": { - "@aws-sdk/core": "3.936.0", - "@aws-sdk/types": "3.936.0", - "@smithy/property-provider": "^4.2.5", - "@smithy/types": "^4.9.0", + "@smithy/node-config-provider": "^4.0.1", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@aws-sdk/credential-provider-http": { - "version": "3.936.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.936.0.tgz", - "integrity": "sha512-5FguODLXG1tWx/x8fBxH+GVrk7Hey2LbXV5h9SFzYCx/2h50URBm0+9hndg0Rd23+xzYe14F6SI9HA9c1sPnjg==", + "node_modules/@aws-sdk/credential-provider-ini/node_modules/@smithy/util-hex-encoding": { + "version": "4.0.0", "license": "Apache-2.0", + "peer": true, "dependencies": { - "@aws-sdk/core": "3.936.0", - "@aws-sdk/types": "3.936.0", - "@smithy/fetch-http-handler": "^5.3.6", - "@smithy/node-http-handler": "^4.4.5", - "@smithy/property-provider": "^4.2.5", - "@smithy/protocol-http": "^5.3.5", - "@smithy/smithy-client": "^4.9.8", - "@smithy/types": "^4.9.0", - "@smithy/util-stream": "^4.5.6", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.936.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.936.0.tgz", - "integrity": "sha512-TbUv56ERQQujoHcLMcfL0Q6bVZfYF83gu/TjHkVkdSlHPOIKaG/mhE2XZSQzXv1cud6LlgeBbfzVAxJ+HPpffg==", + "node_modules/@aws-sdk/credential-provider-ini/node_modules/@smithy/util-middleware": { + "version": "4.0.1", "license": "Apache-2.0", + "peer": true, "dependencies": { - "@aws-sdk/core": "3.936.0", - "@aws-sdk/credential-provider-env": "3.936.0", - "@aws-sdk/credential-provider-http": "3.936.0", - "@aws-sdk/credential-provider-login": "3.936.0", - "@aws-sdk/credential-provider-process": "3.936.0", - "@aws-sdk/credential-provider-sso": "3.936.0", - "@aws-sdk/credential-provider-web-identity": "3.936.0", - "@aws-sdk/nested-clients": "3.936.0", - "@aws-sdk/types": "3.936.0", - "@smithy/credential-provider-imds": "^4.2.5", - "@smithy/property-provider": "^4.2.5", - "@smithy/shared-ini-file-loader": "^4.4.0", - "@smithy/types": "^4.9.0", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@aws-sdk/credential-provider-node": { - "version": "3.936.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.936.0.tgz", - "integrity": "sha512-rk/2PCtxX9xDsQW8p5Yjoca3StqmQcSfkmD7nQ61AqAHL1YgpSQWqHE+HjfGGiHDYKG7PvE33Ku2GyA7lEIJAw==", + "node_modules/@aws-sdk/credential-provider-ini/node_modules/@smithy/util-retry": { + "version": "4.0.1", "license": "Apache-2.0", + "peer": true, "dependencies": { - "@aws-sdk/credential-provider-env": "3.936.0", - "@aws-sdk/credential-provider-http": "3.936.0", - "@aws-sdk/credential-provider-ini": "3.936.0", - "@aws-sdk/credential-provider-process": "3.936.0", - "@aws-sdk/credential-provider-sso": "3.936.0", - "@aws-sdk/credential-provider-web-identity": "3.936.0", - "@aws-sdk/types": "3.936.0", - "@smithy/credential-provider-imds": "^4.2.5", - "@smithy/property-provider": "^4.2.5", - "@smithy/shared-ini-file-loader": "^4.4.0", - "@smithy/types": "^4.9.0", + "@smithy/service-error-classification": "^4.0.1", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@aws-sdk/credential-provider-process": { - "version": "3.936.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.936.0.tgz", - "integrity": "sha512-GpA4AcHb96KQK2PSPUyvChvrsEKiLhQ5NWjeef2IZ3Jc8JoosiedYqp6yhZR+S8cTysuvx56WyJIJc8y8OTrLA==", + "node_modules/@aws-sdk/credential-provider-ini/node_modules/@smithy/util-stream": { + "version": "4.1.2", "license": "Apache-2.0", + "peer": true, "dependencies": { - "@aws-sdk/core": "3.936.0", - "@aws-sdk/types": "3.936.0", - "@smithy/property-provider": "^4.2.5", - "@smithy/shared-ini-file-loader": "^4.4.0", - "@smithy/types": "^4.9.0", + "@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", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@aws-sdk/credential-provider-sso": { + "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" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "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" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-login": { "version": "3.936.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.936.0.tgz", - "integrity": "sha512-wHlEAJJvtnSyxTfNhN98JcU4taA1ED2JvuI2eePgawqBwS/Tzi0mhED1lvNIaWOkjfLd+nHALwszGrtJwEq4yQ==", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-login/-/credential-provider-login-3.936.0.tgz", + "integrity": "sha512-8DVrdRqPyUU66gfV7VZNToh56ZuO5D6agWrkLQE/xbLJOm2RbeRgh6buz7CqV8ipRd6m+zCl9mM4F3osQLZn8Q==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/client-sso": "3.936.0", "@aws-sdk/core": "3.936.0", - "@aws-sdk/token-providers": "3.936.0", + "@aws-sdk/nested-clients": "3.936.0", "@aws-sdk/types": "3.936.0", "@smithy/property-provider": "^4.2.5", + "@smithy/protocol-http": "^5.3.5", "@smithy/shared-ini-file-loader": "^4.4.0", "@smithy/types": "^4.9.0", "tslib": "^2.6.2" @@ -22924,25 +26387,31 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@aws-sdk/credential-provider-web-identity": { + "node_modules/@aws-sdk/credential-provider-login/node_modules/@aws-sdk/core": { "version": "3.936.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.936.0.tgz", - "integrity": "sha512-v3qHAuoODkoRXsAF4RG+ZVO6q2P9yYBT4GMpMEfU9wXVNn7AIfwZgTwzSUfnjNiGva5BKleWVpRpJ9DeuLFbUg==", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.936.0.tgz", + "integrity": "sha512-eGJ2ySUMvgtOziHhDRDLCrj473RJoL4J1vPjVM3NrKC/fF3/LoHjkut8AAnKmrW6a2uTzNKubigw8dEnpmpERw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.936.0", - "@aws-sdk/nested-clients": "3.936.0", "@aws-sdk/types": "3.936.0", + "@aws-sdk/xml-builder": "3.930.0", + "@smithy/core": "^3.18.5", + "@smithy/node-config-provider": "^4.3.5", "@smithy/property-provider": "^4.2.5", - "@smithy/shared-ini-file-loader": "^4.4.0", + "@smithy/protocol-http": "^5.3.5", + "@smithy/signature-v4": "^5.3.5", + "@smithy/smithy-client": "^4.9.8", "@smithy/types": "^4.9.0", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-middleware": "^4.2.5", + "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@aws-sdk/middleware-host-header": { + "node_modules/@aws-sdk/credential-provider-login/node_modules/@aws-sdk/middleware-host-header": { "version": "3.936.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.936.0.tgz", "integrity": "sha512-tAaObaAnsP1XnLGndfkGWFuzrJYuk9W0b/nLvol66t8FZExIAf/WdkT2NNAWOYxljVs++oHnyHBCxIlaHrzSiw==", @@ -22957,7 +26426,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@aws-sdk/middleware-logger": { + "node_modules/@aws-sdk/credential-provider-login/node_modules/@aws-sdk/middleware-logger": { "version": "3.936.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.936.0.tgz", "integrity": "sha512-aPSJ12d3a3Ea5nyEnLbijCaaYJT2QjQ9iW+zGh5QcZYXmOGWbKVyPSxmVOboZQG+c1M8t6d2O7tqrwzIq8L8qw==", @@ -22971,7 +26440,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@aws-sdk/middleware-recursion-detection": { + "node_modules/@aws-sdk/credential-provider-login/node_modules/@aws-sdk/middleware-recursion-detection": { "version": "3.936.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.936.0.tgz", "integrity": "sha512-l4aGbHpXM45YNgXggIux1HgsCVAvvBoqHPkqLnqMl9QVapfuSTjJHfDYDsx1Xxct6/m7qSMUzanBALhiaGO2fA==", @@ -22987,7 +26456,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@aws-sdk/middleware-user-agent": { + "node_modules/@aws-sdk/credential-provider-login/node_modules/@aws-sdk/middleware-user-agent": { "version": "3.936.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.936.0.tgz", "integrity": "sha512-YB40IPa7K3iaYX0lSnV9easDOLPLh+fJyUDF3BH8doX4i1AOSsYn86L4lVldmOaSX+DwiaqKHpvk4wPBdcIPWw==", @@ -23005,7 +26474,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@aws-sdk/nested-clients": { + "node_modules/@aws-sdk/credential-provider-login/node_modules/@aws-sdk/nested-clients": { "version": "3.936.0", "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.936.0.tgz", "integrity": "sha512-eyj2tz1XmDSLSZQ5xnB7cLTVKkSJnYAEoNDSUNhzWPxrBDYeJzIbatecOKceKCU8NBf8gWWZCK/CSY0mDxMO0A==", @@ -23054,7 +26523,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@aws-sdk/region-config-resolver": { + "node_modules/@aws-sdk/credential-provider-login/node_modules/@aws-sdk/region-config-resolver": { "version": "3.936.0", "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.936.0.tgz", "integrity": "sha512-wOKhzzWsshXGduxO4pqSiNyL9oUtk4BEvjWm9aaq6Hmfdoydq6v6t0rAGHWPjFwy9z2haovGRi3C8IxdMB4muw==", @@ -23070,25 +26539,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@aws-sdk/token-providers": { - "version": "3.936.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.936.0.tgz", - "integrity": "sha512-vvw8+VXk0I+IsoxZw0mX9TMJawUJvEsg3EF7zcCSetwhNPAU8Xmlhv7E/sN/FgSmm7b7DsqKoW6rVtQiCs1PWQ==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/core": "3.936.0", - "@aws-sdk/nested-clients": "3.936.0", - "@aws-sdk/types": "3.936.0", - "@smithy/property-provider": "^4.2.5", - "@smithy/shared-ini-file-loader": "^4.4.0", - "@smithy/types": "^4.9.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@aws-sdk/types": { + "node_modules/@aws-sdk/credential-provider-login/node_modules/@aws-sdk/types": { "version": "3.936.0", "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.936.0.tgz", "integrity": "sha512-uz0/VlMd2pP5MepdrHizd+T+OKfyK4r3OA9JI+L/lPKg0YFQosdJNCKisr6o70E3dh8iMpFYxF1UN/4uZsyARg==", @@ -23101,7 +26552,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@aws-sdk/util-endpoints": { + "node_modules/@aws-sdk/credential-provider-login/node_modules/@aws-sdk/util-endpoints": { "version": "3.936.0", "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.936.0.tgz", "integrity": "sha512-0Zx3Ntdpu+z9Wlm7JKUBOzS9EunwKAb4KdGUQQxDqh5Lc3ta5uBoub+FgmVuzwnmBu9U1Os8UuwVTH0Lgu+P5w==", @@ -23117,7 +26568,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@aws-sdk/util-user-agent-browser": { + "node_modules/@aws-sdk/credential-provider-login/node_modules/@aws-sdk/util-user-agent-browser": { "version": "3.936.0", "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.936.0.tgz", "integrity": "sha512-eZ/XF6NxMtu+iCma58GRNRxSq4lHo6zHQLOZRIeL/ghqYJirqHdenMOwrzPettj60KWlv827RVebP9oNVrwZbw==", @@ -23129,7 +26580,7 @@ "tslib": "^2.6.2" } }, - "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@aws-sdk/util-user-agent-node": { + "node_modules/@aws-sdk/credential-provider-login/node_modules/@aws-sdk/util-user-agent-node": { "version": "3.936.0", "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.936.0.tgz", "integrity": "sha512-XOEc7PF9Op00pWV2AYCGDSu5iHgYjIO53Py2VUQTIvP7SRCaCsXmA33mjBvC2Ms6FhSyWNa4aK4naUGIz0hQcw==", @@ -23153,7 +26604,7 @@ } } }, - "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@aws-sdk/xml-builder": { + "node_modules/@aws-sdk/credential-provider-login/node_modules/@aws-sdk/xml-builder": { "version": "3.930.0", "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.930.0.tgz", "integrity": "sha512-YIfkD17GocxdmlUVc3ia52QhcWuRIUJonbF8A2CYfcWNV3HzvAqpcPeC0bYUhkK+8e8YO1ARnLKZQE0TlwzorA==", @@ -23167,16 +26618,16 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@aws/lambda-invoke-store": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@aws/lambda-invoke-store/-/lambda-invoke-store-0.2.1.tgz", - "integrity": "sha512-sIyFcoPZkTtNu9xFeEoynMef3bPJIAbOfUh+ueYcfhVl6xm2VRtMcMclSxmZCMnHHd4hlYKJeq/aggmBEWynww==", + "node_modules/@aws-sdk/credential-provider-login/node_modules/@aws/lambda-invoke-store": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@aws/lambda-invoke-store/-/lambda-invoke-store-0.2.0.tgz", + "integrity": "sha512-D1jAmAZQYMoPiacfgNf7AWhg3DFN3Wq/vQv3WINt9znwjzHp2x+WzdJFxxj7xZL7V1U79As6G8f7PorMYWBKsQ==", "license": "Apache-2.0", "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@smithy/abort-controller": { + "node_modules/@aws-sdk/credential-provider-login/node_modules/@smithy/abort-controller": { "version": "4.2.5", "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.2.5.tgz", "integrity": "sha512-j7HwVkBw68YW8UmFRcjZOmssE77Rvk0GWAIN1oFBhsaovQmZWYCIcGa9/pwRB0ExI8Sk9MWNALTjftjHZea7VA==", @@ -23189,7 +26640,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@smithy/config-resolver": { + "node_modules/@aws-sdk/credential-provider-login/node_modules/@smithy/config-resolver": { "version": "4.4.3", "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.4.3.tgz", "integrity": "sha512-ezHLe1tKLUxDJo2LHtDuEDyWXolw8WGOR92qb4bQdWq/zKenO5BvctZGrVJBK08zjezSk7bmbKFOXIVyChvDLw==", @@ -23206,7 +26657,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@smithy/core": { + "node_modules/@aws-sdk/credential-provider-login/node_modules/@smithy/core": { "version": "3.18.5", "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.18.5.tgz", "integrity": "sha512-6gnIz3h+PEPQGDj8MnRSjDvKBah042jEoPgjFGJ4iJLBE78L4lY/n98x14XyPF4u3lN179Ub/ZKFY5za9GeLQw==", @@ -23227,7 +26678,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@smithy/credential-provider-imds": { + "node_modules/@aws-sdk/credential-provider-login/node_modules/@smithy/credential-provider-imds": { "version": "4.2.5", "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.2.5.tgz", "integrity": "sha512-BZwotjoZWn9+36nimwm/OLIcVe+KYRwzMjfhd4QT7QxPm9WY0HiOV8t/Wlh+HVUif0SBVV7ksq8//hPaBC/okQ==", @@ -23243,7 +26694,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@smithy/fetch-http-handler": { + "node_modules/@aws-sdk/credential-provider-login/node_modules/@smithy/fetch-http-handler": { "version": "5.3.6", "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.3.6.tgz", "integrity": "sha512-3+RG3EA6BBJ/ofZUeTFJA7mHfSYrZtQIrDP9dI8Lf7X6Jbos2jptuLrAAteDiFVrmbEmLSuRG/bUKzfAXk7dhg==", @@ -23259,7 +26710,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@smithy/hash-node": { + "node_modules/@aws-sdk/credential-provider-login/node_modules/@smithy/hash-node": { "version": "4.2.5", "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.2.5.tgz", "integrity": "sha512-DpYX914YOfA3UDT9CN1BM787PcHfWRBB43fFGCYrZFUH0Jv+5t8yYl+Pd5PW4+QzoGEDvn5d5QIO4j2HyYZQSA==", @@ -23274,7 +26725,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@smithy/invalid-dependency": { + "node_modules/@aws-sdk/credential-provider-login/node_modules/@smithy/invalid-dependency": { "version": "4.2.5", "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.2.5.tgz", "integrity": "sha512-2L2erASEro1WC5nV+plwIMxrTXpvpfzl4e+Nre6vBVRR2HKeGGcvpJyyL3/PpiSg+cJG2KpTmZmq934Olb6e5A==", @@ -23287,7 +26738,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@smithy/is-array-buffer": { + "node_modules/@aws-sdk/credential-provider-login/node_modules/@smithy/is-array-buffer": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-4.2.0.tgz", "integrity": "sha512-DZZZBvC7sjcYh4MazJSGiWMI2L7E0oCiRHREDzIxi/M2LY79/21iXt6aPLHge82wi5LsuRF5A06Ds3+0mlh6CQ==", @@ -23299,7 +26750,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@smithy/middleware-content-length": { + "node_modules/@aws-sdk/credential-provider-login/node_modules/@smithy/middleware-content-length": { "version": "4.2.5", "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.2.5.tgz", "integrity": "sha512-Y/RabVa5vbl5FuHYV2vUCwvh/dqzrEY/K2yWPSqvhFUwIY0atLqO4TienjBXakoy4zrKAMCZwg+YEqmH7jaN7A==", @@ -23313,7 +26764,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@smithy/middleware-endpoint": { + "node_modules/@aws-sdk/credential-provider-login/node_modules/@smithy/middleware-endpoint": { "version": "4.3.12", "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.3.12.tgz", "integrity": "sha512-9pAX/H+VQPzNbouhDhkW723igBMLgrI8OtX+++M7iKJgg/zY/Ig3i1e6seCcx22FWhE6Q/S61BRdi2wXBORT+A==", @@ -23332,7 +26783,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@smithy/middleware-retry": { + "node_modules/@aws-sdk/credential-provider-login/node_modules/@smithy/middleware-retry": { "version": "4.4.12", "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.4.12.tgz", "integrity": "sha512-S4kWNKFowYd0lID7/DBqWHOQxmxlsf0jBaos9chQZUWTVOjSW1Ogyh8/ib5tM+agFDJ/TCxuCTvrnlc+9cIBcQ==", @@ -23352,7 +26803,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@smithy/middleware-serde": { + "node_modules/@aws-sdk/credential-provider-login/node_modules/@smithy/middleware-serde": { "version": "4.2.6", "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.2.6.tgz", "integrity": "sha512-VkLoE/z7e2g8pirwisLz8XJWedUSY8my/qrp81VmAdyrhi94T+riBfwP+AOEEFR9rFTSonC/5D2eWNmFabHyGQ==", @@ -23366,7 +26817,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@smithy/middleware-stack": { + "node_modules/@aws-sdk/credential-provider-login/node_modules/@smithy/middleware-stack": { "version": "4.2.5", "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.2.5.tgz", "integrity": "sha512-bYrutc+neOyWxtZdbB2USbQttZN0mXaOyYLIsaTbJhFsfpXyGWUxJpEuO1rJ8IIJm2qH4+xJT0mxUSsEDTYwdQ==", @@ -23379,7 +26830,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@smithy/node-config-provider": { + "node_modules/@aws-sdk/credential-provider-login/node_modules/@smithy/node-config-provider": { "version": "4.3.5", "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.3.5.tgz", "integrity": "sha512-UTurh1C4qkVCtqggI36DGbLB2Kv8UlcFdMXDcWMbqVY2uRg0XmT9Pb4Vj6oSQ34eizO1fvR0RnFV4Axw4IrrAg==", @@ -23394,7 +26845,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@smithy/node-http-handler": { + "node_modules/@aws-sdk/credential-provider-login/node_modules/@smithy/node-http-handler": { "version": "4.4.5", "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.4.5.tgz", "integrity": "sha512-CMnzM9R2WqlqXQGtIlsHMEZfXKJVTIrqCNoSd/QpAyp+Dw0a1Vps13l6ma1fH8g7zSPNsA59B/kWgeylFuA/lw==", @@ -23410,7 +26861,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@smithy/property-provider": { + "node_modules/@aws-sdk/credential-provider-login/node_modules/@smithy/property-provider": { "version": "4.2.5", "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.2.5.tgz", "integrity": "sha512-8iLN1XSE1rl4MuxvQ+5OSk/Zb5El7NJZ1td6Tn+8dQQHIjp59Lwl6bd0+nzw6SKm2wSSriH2v/I9LPzUic7EOg==", @@ -23423,7 +26874,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@smithy/protocol-http": { + "node_modules/@aws-sdk/credential-provider-login/node_modules/@smithy/protocol-http": { "version": "5.3.5", "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.3.5.tgz", "integrity": "sha512-RlaL+sA0LNMp03bf7XPbFmT5gN+w3besXSWMkA8rcmxLSVfiEXElQi4O2IWwPfxzcHkxqrwBFMbngB8yx/RvaQ==", @@ -23436,7 +26887,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@smithy/querystring-builder": { + "node_modules/@aws-sdk/credential-provider-login/node_modules/@smithy/querystring-builder": { "version": "4.2.5", "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.2.5.tgz", "integrity": "sha512-y98otMI1saoajeik2kLfGyRp11e5U/iJYH/wLCh3aTV/XutbGT9nziKGkgCaMD1ghK7p6htHMm6b6scl9JRUWg==", @@ -23450,7 +26901,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@smithy/querystring-parser": { + "node_modules/@aws-sdk/credential-provider-login/node_modules/@smithy/querystring-parser": { "version": "4.2.5", "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.2.5.tgz", "integrity": "sha512-031WCTdPYgiQRYNPXznHXof2YM0GwL6SeaSyTH/P72M1Vz73TvCNH2Nq8Iu2IEPq9QP2yx0/nrw5YmSeAi/AjQ==", @@ -23463,7 +26914,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@smithy/service-error-classification": { + "node_modules/@aws-sdk/credential-provider-login/node_modules/@smithy/service-error-classification": { "version": "4.2.5", "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.2.5.tgz", "integrity": "sha512-8fEvK+WPE3wUAcDvqDQG1Vk3ANLR8Px979te96m84CbKAjBVf25rPYSzb4xU4hlTyho7VhOGnh5i62D/JVF0JQ==", @@ -23475,7 +26926,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@smithy/shared-ini-file-loader": { + "node_modules/@aws-sdk/credential-provider-login/node_modules/@smithy/shared-ini-file-loader": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.4.0.tgz", "integrity": "sha512-5WmZ5+kJgJDjwXXIzr1vDTG+RhF9wzSODQBfkrQ2VVkYALKGvZX1lgVSxEkgicSAFnFhPj5rudJV0zoinqS0bA==", @@ -23488,7 +26939,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@smithy/signature-v4": { + "node_modules/@aws-sdk/credential-provider-login/node_modules/@smithy/signature-v4": { "version": "5.3.5", "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.3.5.tgz", "integrity": "sha512-xSUfMu1FT7ccfSXkoLl/QRQBi2rOvi3tiBZU2Tdy3I6cgvZ6SEi9QNey+lqps/sJRnogIS+lq+B1gxxbra2a/w==", @@ -23507,7 +26958,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@smithy/smithy-client": { + "node_modules/@aws-sdk/credential-provider-login/node_modules/@smithy/smithy-client": { "version": "4.9.8", "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.9.8.tgz", "integrity": "sha512-8xgq3LgKDEFoIrLWBho/oYKyWByw9/corz7vuh1upv7ZBm0ZMjGYBhbn6v643WoIqA9UTcx5A5htEp/YatUwMA==", @@ -23525,7 +26976,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@smithy/types": { + "node_modules/@aws-sdk/credential-provider-login/node_modules/@smithy/types": { "version": "4.9.0", "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.9.0.tgz", "integrity": "sha512-MvUbdnXDTwykR8cB1WZvNNwqoWVaTRA0RLlLmf/cIFNMM2cKWz01X4Ly6SMC4Kks30r8tT3Cty0jmeWfiuyHTA==", @@ -23537,7 +26988,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@smithy/url-parser": { + "node_modules/@aws-sdk/credential-provider-login/node_modules/@smithy/url-parser": { "version": "4.2.5", "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.2.5.tgz", "integrity": "sha512-VaxMGsilqFnK1CeBX+LXnSuaMx4sTL/6znSZh2829txWieazdVxr54HmiyTsIbpOTLcf5nYpq9lpzmwRdxj6rQ==", @@ -23551,7 +27002,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@smithy/util-base64": { + "node_modules/@aws-sdk/credential-provider-login/node_modules/@smithy/util-base64": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-4.3.0.tgz", "integrity": "sha512-GkXZ59JfyxsIwNTWFnjmFEI8kZpRNIBfxKjv09+nkAWPt/4aGaEWMM04m4sxgNVWkbt2MdSvE3KF/PfX4nFedQ==", @@ -23565,7 +27016,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@smithy/util-body-length-browser": { + "node_modules/@aws-sdk/credential-provider-login/node_modules/@smithy/util-body-length-browser": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-4.2.0.tgz", "integrity": "sha512-Fkoh/I76szMKJnBXWPdFkQJl2r9SjPt3cMzLdOB6eJ4Pnpas8hVoWPYemX/peO0yrrvldgCUVJqOAjUrOLjbxg==", @@ -23577,7 +27028,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@smithy/util-body-length-node": { + "node_modules/@aws-sdk/credential-provider-login/node_modules/@smithy/util-body-length-node": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-4.2.1.tgz", "integrity": "sha512-h53dz/pISVrVrfxV1iqXlx5pRg3V2YWFcSQyPyXZRrZoZj4R4DeWRDo1a7dd3CPTcFi3kE+98tuNyD2axyZReA==", @@ -23589,7 +27040,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@smithy/util-buffer-from": { + "node_modules/@aws-sdk/credential-provider-login/node_modules/@smithy/util-buffer-from": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-4.2.0.tgz", "integrity": "sha512-kAY9hTKulTNevM2nlRtxAG2FQ3B2OR6QIrPY3zE5LqJy1oxzmgBGsHLWTcNhWXKchgA0WHW+mZkQrng/pgcCew==", @@ -23602,7 +27053,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@smithy/util-config-provider": { + "node_modules/@aws-sdk/credential-provider-login/node_modules/@smithy/util-config-provider": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-4.2.0.tgz", "integrity": "sha512-YEjpl6XJ36FTKmD+kRJJWYvrHeUvm5ykaUS5xK+6oXffQPHeEM4/nXlZPe+Wu0lsgRUcNZiliYNh/y7q9c2y6Q==", @@ -23614,7 +27065,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@smithy/util-defaults-mode-browser": { + "node_modules/@aws-sdk/credential-provider-login/node_modules/@smithy/util-defaults-mode-browser": { "version": "4.3.11", "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.3.11.tgz", "integrity": "sha512-yHv+r6wSQXEXTPVCIQTNmXVWs7ekBTpMVErjqZoWkYN75HIFN5y9+/+sYOejfAuvxWGvgzgxbTHa/oz61YTbKw==", @@ -23629,7 +27080,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@smithy/util-defaults-mode-node": { + "node_modules/@aws-sdk/credential-provider-login/node_modules/@smithy/util-defaults-mode-node": { "version": "4.2.14", "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.2.14.tgz", "integrity": "sha512-ljZN3iRvaJUgulfvobIuG97q1iUuCMrvXAlkZ4msY+ZuVHQHDIqn7FKZCEj+bx8omz6kF5yQXms/xhzjIO5XiA==", @@ -23647,7 +27098,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@smithy/util-endpoints": { + "node_modules/@aws-sdk/credential-provider-login/node_modules/@smithy/util-endpoints": { "version": "3.2.5", "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.2.5.tgz", "integrity": "sha512-3O63AAWu2cSNQZp+ayl9I3NapW1p1rR5mlVHcF6hAB1dPZUQFfRPYtplWX/3xrzWthPGj5FqB12taJJCfH6s8A==", @@ -23661,7 +27112,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@smithy/util-hex-encoding": { + "node_modules/@aws-sdk/credential-provider-login/node_modules/@smithy/util-hex-encoding": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-4.2.0.tgz", "integrity": "sha512-CCQBwJIvXMLKxVbO88IukazJD9a4kQ9ZN7/UMGBjBcJYvatpWk+9g870El4cB8/EJxfe+k+y0GmR9CAzkF+Nbw==", @@ -23673,7 +27124,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@smithy/util-middleware": { + "node_modules/@aws-sdk/credential-provider-login/node_modules/@smithy/util-middleware": { "version": "4.2.5", "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.2.5.tgz", "integrity": "sha512-6Y3+rvBF7+PZOc40ybeZMcGln6xJGVeY60E7jy9Mv5iKpMJpHgRE6dKy9ScsVxvfAYuEX4Q9a65DQX90KaQ3bA==", @@ -23686,7 +27137,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@smithy/util-retry": { + "node_modules/@aws-sdk/credential-provider-login/node_modules/@smithy/util-retry": { "version": "4.2.5", "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.2.5.tgz", "integrity": "sha512-GBj3+EZBbN4NAqJ/7pAhsXdfzdlznOh8PydUijy6FpNIMnHPSMO2/rP4HKu+UFeikJxShERk528oy7GT79YiJg==", @@ -23700,7 +27151,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@smithy/util-stream": { + "node_modules/@aws-sdk/credential-provider-login/node_modules/@smithy/util-stream": { "version": "4.5.6", "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.5.6.tgz", "integrity": "sha512-qWw/UM59TiaFrPevefOZ8CNBKbYEP6wBAIlLqxn3VAIo9rgnTNc4ASbVrqDmhuwI87usnjhdQrxodzAGFFzbRQ==", @@ -23719,7 +27170,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@smithy/util-uri-escape": { + "node_modules/@aws-sdk/credential-provider-login/node_modules/@smithy/util-uri-escape": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-4.2.0.tgz", "integrity": "sha512-igZpCKV9+E/Mzrpq6YacdTQ0qTiLm85gD6N/IrmyDvQFA4UnU3d5g3m8tMT/6zG/vVkWSU+VxeUyGonL62DuxA==", @@ -23731,831 +27182,758 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@smithy/util-utf8": { + "node_modules/@aws-sdk/credential-provider-login/node_modules/@smithy/util-utf8": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.2.0.tgz", - "integrity": "sha512-zBPfuzoI8xyBtR2P6WQj63Rz8i3AmfAaJLuNG8dWsfvPe8lO4aCPYLn879mEgHndZH1zQ2oXmG8O1GGzzaoZiw==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/util-buffer-from": "^4.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/fast-xml-parser": { - "version": "5.2.5", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.2.5.tgz", - "integrity": "sha512-pfX9uG9Ki0yekDHx2SiuRIyFdyAr1kMIMitPvb0YBo8SUfKvia7w7FIyd/l6av85pFYRhZscS75MwMnbvY+hcQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - } - ], - "license": "MIT", - "dependencies": { - "strnum": "^2.1.0" - }, - "bin": { - "fxparser": "src/cli/cli.js" - } - }, - "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/strnum": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.1.1.tgz", - "integrity": "sha512-7ZvoFTiCnGxBtDqJ//Cu6fWtZtc7Y3x+QOirG15wztbdngGSkht27o2pyGWrVy0b4WAy3jbKmnoK6g5VlVNUUw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - } - ], - "license": "MIT" - }, - "node_modules/@aws-sdk/credential-provider-env": { - "version": "3.693.0", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/core": "3.693.0", - "@aws-sdk/types": "3.692.0", - "@smithy/property-provider": "^3.1.9", - "@smithy/types": "^3.7.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-env/node_modules/@aws-sdk/core": { - "version": "3.693.0", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.692.0", - "@smithy/core": "^2.5.2", - "@smithy/node-config-provider": "^3.1.10", - "@smithy/property-provider": "^3.1.9", - "@smithy/protocol-http": "^4.1.6", - "@smithy/signature-v4": "^4.2.2", - "@smithy/smithy-client": "^3.4.3", - "@smithy/types": "^3.7.0", - "@smithy/util-middleware": "^3.0.9", - "fast-xml-parser": "4.4.1", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-http": { - "version": "3.635.0", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/property-provider": "^3.1.3", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.2.0", - "@smithy/types": "^3.3.0", - "@smithy/util-stream": "^3.1.3", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-http/node_modules/@aws-sdk/types": { - "version": "3.609.0", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/fetch-http-handler": { - "version": "3.2.4", - "license": "Apache-2.0", - "dependencies": { - "@smithy/protocol-http": "^4.1.0", - "@smithy/querystring-builder": "^3.0.3", - "@smithy/types": "^3.3.0", - "@smithy/util-base64": "^3.0.0", - "tslib": "^2.6.2" - } - }, - "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", - "@aws-sdk/credential-provider-http": "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/nested-clients": "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-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", - "@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", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.2.0.tgz", + "integrity": "sha512-zBPfuzoI8xyBtR2P6WQj63Rz8i3AmfAaJLuNG8dWsfvPe8lO4aCPYLn879mEgHndZH1zQ2oXmG8O1GGzzaoZiw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^4.2.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-sdk/core": { - "version": "3.758.0", + "node_modules/@aws-sdk/credential-provider-login/node_modules/fast-xml-parser": { + "version": "5.2.5", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.2.5.tgz", + "integrity": "sha512-pfX9uG9Ki0yekDHx2SiuRIyFdyAr1kMIMitPvb0YBo8SUfKvia7w7FIyd/l6av85pFYRhZscS75MwMnbvY+hcQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "dependencies": { + "strnum": "^2.1.0" + }, + "bin": { + "fxparser": "src/cli/cli.js" + } + }, + "node_modules/@aws-sdk/credential-provider-login/node_modules/strnum": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.1.1.tgz", + "integrity": "sha512-7ZvoFTiCnGxBtDqJ//Cu6fWtZtc7Y3x+QOirG15wztbdngGSkht27o2pyGWrVy0b4WAy3jbKmnoK6g5VlVNUUw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT" + }, + "node_modules/@aws-sdk/credential-provider-node": { + "version": "3.972.2", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.972.2.tgz", + "integrity": "sha512-Lz1J5IZdTjLYTVIcDP5DVDgi1xlgsF3p1cnvmbfKbjCRhQpftN2e2J4NFfRRvPD54W9+bZ8l5VipPXtTYK7aEg==", "license": "Apache-2.0", - "peer": true, "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", + "@aws-sdk/credential-provider-env": "^3.972.2", + "@aws-sdk/credential-provider-http": "^3.972.3", + "@aws-sdk/credential-provider-ini": "^3.972.2", + "@aws-sdk/credential-provider-process": "^3.972.2", + "@aws-sdk/credential-provider-sso": "^3.972.2", + "@aws-sdk/credential-provider-web-identity": "^3.972.2", + "@aws-sdk/types": "^3.973.1", + "@smithy/credential-provider-imds": "^4.2.8", + "@smithy/property-provider": "^4.2.8", + "@smithy/shared-ini-file-loader": "^4.4.3", + "@smithy/types": "^4.12.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=20.0.0" } }, - "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-sdk/credential-provider-env": { - "version": "3.758.0", + "node_modules/@aws-sdk/credential-provider-node/node_modules/@aws-sdk/credential-provider-env": { + "version": "3.972.2", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.972.2.tgz", + "integrity": "sha512-wzH1EdrZsytG1xN9UHaK12J9+kfrnd2+c8y0LVoS4O4laEjPoie1qVK3k8/rZe7KOtvULzyMnO3FT4Krr9Z0Dg==", "license": "Apache-2.0", - "peer": true, "dependencies": { - "@aws-sdk/core": "3.758.0", - "@aws-sdk/types": "3.734.0", - "@smithy/property-provider": "^4.0.1", - "@smithy/types": "^4.1.0", + "@aws-sdk/core": "^3.973.2", + "@aws-sdk/types": "^3.973.1", + "@smithy/property-provider": "^4.2.8", + "@smithy/types": "^4.12.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=20.0.0" } }, - "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-sdk/credential-provider-http": { - "version": "3.758.0", + "node_modules/@aws-sdk/credential-provider-node/node_modules/@aws-sdk/credential-provider-ini": { + "version": "3.972.2", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.972.2.tgz", + "integrity": "sha512-Jrb8sLm6k8+L7520irBrvCtdLxNtrG7arIxe9TCeMJt/HxqMGJdbIjw8wILzkEHLMIi4MecF2FbXCln7OT1Tag==", "license": "Apache-2.0", - "peer": true, "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", + "@aws-sdk/core": "^3.973.2", + "@aws-sdk/credential-provider-env": "^3.972.2", + "@aws-sdk/credential-provider-http": "^3.972.3", + "@aws-sdk/credential-provider-login": "^3.972.2", + "@aws-sdk/credential-provider-process": "^3.972.2", + "@aws-sdk/credential-provider-sso": "^3.972.2", + "@aws-sdk/credential-provider-web-identity": "^3.972.2", + "@aws-sdk/nested-clients": "3.975.0", + "@aws-sdk/types": "^3.973.1", + "@smithy/credential-provider-imds": "^4.2.8", + "@smithy/property-provider": "^4.2.8", + "@smithy/shared-ini-file-loader": "^4.4.3", + "@smithy/types": "^4.12.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=20.0.0" } }, - "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-sdk/credential-provider-process": { - "version": "3.758.0", + "node_modules/@aws-sdk/credential-provider-node/node_modules/@aws-sdk/credential-provider-login": { + "version": "3.972.2", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-login/-/credential-provider-login-3.972.2.tgz", + "integrity": "sha512-mlaw2aiI3DrimW85ZMn3g7qrtHueidS58IGytZ+mbFpsYLK5wMjCAKZQtt7VatLMtSBG/dn/EY4njbnYXIDKeQ==", "license": "Apache-2.0", - "peer": true, "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", + "@aws-sdk/core": "^3.973.2", + "@aws-sdk/nested-clients": "3.975.0", + "@aws-sdk/types": "^3.973.1", + "@smithy/property-provider": "^4.2.8", + "@smithy/protocol-http": "^5.3.8", + "@smithy/shared-ini-file-loader": "^4.4.3", + "@smithy/types": "^4.12.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=20.0.0" } }, - "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.758.0", + "node_modules/@aws-sdk/credential-provider-node/node_modules/@aws-sdk/credential-provider-process": { + "version": "3.972.2", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.972.2.tgz", + "integrity": "sha512-NLKLTT7jnUe9GpQAVkPTJO+cs2FjlQDt5fArIYS7h/Iw/CvamzgGYGFRVD2SE05nOHCMwafUSi42If8esGFV+g==", "license": "Apache-2.0", - "peer": true, "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", + "@aws-sdk/core": "^3.973.2", + "@aws-sdk/types": "^3.973.1", + "@smithy/property-provider": "^4.2.8", + "@smithy/shared-ini-file-loader": "^4.4.3", + "@smithy/types": "^4.12.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=20.0.0" } }, - "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-sdk/middleware-host-header": { - "version": "3.734.0", + "node_modules/@aws-sdk/credential-provider-node/node_modules/@aws-sdk/credential-provider-web-identity": { + "version": "3.972.2", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.972.2.tgz", + "integrity": "sha512-x9DAiN9Qz+NjJ99ltDiVQ8d511M/tuF/9MFbe2jUgo7HZhD6+x4S3iT1YcP07ndwDUjmzKGmeOEgE24k4qvfdg==", "license": "Apache-2.0", - "peer": true, "dependencies": { - "@aws-sdk/types": "3.734.0", - "@smithy/protocol-http": "^5.0.1", - "@smithy/types": "^4.1.0", + "@aws-sdk/core": "^3.973.2", + "@aws-sdk/nested-clients": "3.975.0", + "@aws-sdk/types": "^3.973.1", + "@smithy/property-provider": "^4.2.8", + "@smithy/shared-ini-file-loader": "^4.4.3", + "@smithy/types": "^4.12.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=20.0.0" } }, - "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-sdk/middleware-logger": { - "version": "3.734.0", + "node_modules/@aws-sdk/credential-provider-node/node_modules/@aws-sdk/nested-clients": { + "version": "3.975.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.975.0.tgz", + "integrity": "sha512-OkeFHPlQj2c/Y5bQGkX14pxhDWUGUFt3LRHhjcDKsSCw6lrxKcxN3WFZN0qbJwKNydP+knL5nxvfgKiCLpTLRA==", "license": "Apache-2.0", - "peer": true, "dependencies": { - "@aws-sdk/types": "3.734.0", - "@smithy/types": "^4.1.0", + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "^3.973.1", + "@aws-sdk/middleware-host-header": "^3.972.1", + "@aws-sdk/middleware-logger": "^3.972.1", + "@aws-sdk/middleware-recursion-detection": "^3.972.1", + "@aws-sdk/middleware-user-agent": "^3.972.2", + "@aws-sdk/region-config-resolver": "^3.972.1", + "@aws-sdk/types": "^3.973.0", + "@aws-sdk/util-endpoints": "3.972.0", + "@aws-sdk/util-user-agent-browser": "^3.972.1", + "@aws-sdk/util-user-agent-node": "^3.972.1", + "@smithy/config-resolver": "^4.4.6", + "@smithy/core": "^3.21.1", + "@smithy/fetch-http-handler": "^5.3.9", + "@smithy/hash-node": "^4.2.8", + "@smithy/invalid-dependency": "^4.2.8", + "@smithy/middleware-content-length": "^4.2.8", + "@smithy/middleware-endpoint": "^4.4.11", + "@smithy/middleware-retry": "^4.4.27", + "@smithy/middleware-serde": "^4.2.9", + "@smithy/middleware-stack": "^4.2.8", + "@smithy/node-config-provider": "^4.3.8", + "@smithy/node-http-handler": "^4.4.8", + "@smithy/protocol-http": "^5.3.8", + "@smithy/smithy-client": "^4.10.12", + "@smithy/types": "^4.12.0", + "@smithy/url-parser": "^4.2.8", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-body-length-node": "^4.2.1", + "@smithy/util-defaults-mode-browser": "^4.3.26", + "@smithy/util-defaults-mode-node": "^4.2.29", + "@smithy/util-endpoints": "^3.2.8", + "@smithy/util-middleware": "^4.2.8", + "@smithy/util-retry": "^4.2.8", + "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=20.0.0" } }, - "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.734.0", + "node_modules/@aws-sdk/credential-provider-node/node_modules/@aws-sdk/types": { + "version": "3.973.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.973.1.tgz", + "integrity": "sha512-DwHBiMNOB468JiX6+i34c+THsKHErYUdNQ3HexeXZvVn4zouLjgaS4FejiGSi2HyBuzuyHg7SuOPmjSvoU9NRg==", "license": "Apache-2.0", - "peer": true, "dependencies": { - "@aws-sdk/types": "3.734.0", - "@smithy/protocol-http": "^5.0.1", - "@smithy/types": "^4.1.0", + "@smithy/types": "^4.12.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=20.0.0" } }, - "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.758.0", + "node_modules/@aws-sdk/credential-provider-node/node_modules/@smithy/abort-controller": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.2.8.tgz", + "integrity": "sha512-peuVfkYHAmS5ybKxWcfraK7WBBP0J+rkfUcbHJJKQ4ir3UAUNQI+Y4Vt/PqSzGqgloJ5O1dk7+WzNL8wcCSXbw==", "license": "Apache-2.0", - "peer": true, "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", + "@smithy/types": "^4.12.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-sdk/region-config-resolver": { - "version": "3.734.0", + "node_modules/@aws-sdk/credential-provider-node/node_modules/@smithy/config-resolver": { + "version": "4.4.6", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.4.6.tgz", + "integrity": "sha512-qJpzYC64kaj3S0fueiu3kXm8xPrR3PcXDPEgnaNMRn0EjNSZFoFjvbUp0YUDsRhN1CB90EnHJtbxWKevnH99UQ==", "license": "Apache-2.0", - "peer": true, "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", + "@smithy/node-config-provider": "^4.3.8", + "@smithy/types": "^4.12.0", + "@smithy/util-config-provider": "^4.2.0", + "@smithy/util-endpoints": "^3.2.8", + "@smithy/util-middleware": "^4.2.8", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-sdk/token-providers": { - "version": "3.758.0", + "node_modules/@aws-sdk/credential-provider-node/node_modules/@smithy/core": { + "version": "3.21.1", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.21.1.tgz", + "integrity": "sha512-NUH8R4O6FkN8HKMojzbGg/5pNjsfTjlMmeFclyPfPaXXUrbr5TzhWgbf7t92wfrpCHRgpjyz7ffASIS3wX28aA==", "license": "Apache-2.0", - "peer": true, "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", + "@smithy/middleware-serde": "^4.2.9", + "@smithy/protocol-http": "^5.3.8", + "@smithy/types": "^4.12.0", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-middleware": "^4.2.8", + "@smithy/util-stream": "^4.5.10", + "@smithy/util-utf8": "^4.2.0", + "@smithy/uuid": "^1.1.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-sdk/types": { - "version": "3.734.0", + "node_modules/@aws-sdk/credential-provider-node/node_modules/@smithy/credential-provider-imds": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.2.8.tgz", + "integrity": "sha512-FNT0xHS1c/CPN8upqbMFP83+ul5YgdisfCfkZ86Jh2NSmnqw/AJ6x5pEogVCTVvSm7j9MopRU89bmDelxuDMYw==", "license": "Apache-2.0", - "peer": true, "dependencies": { - "@smithy/types": "^4.1.0", + "@smithy/node-config-provider": "^4.3.8", + "@smithy/property-provider": "^4.2.8", + "@smithy/types": "^4.12.0", + "@smithy/url-parser": "^4.2.8", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-sdk/util-endpoints": { - "version": "3.743.0", + "node_modules/@aws-sdk/credential-provider-node/node_modules/@smithy/fetch-http-handler": { + "version": "5.3.9", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.3.9.tgz", + "integrity": "sha512-I4UhmcTYXBrct03rwzQX1Y/iqQlzVQaPxWjCjula++5EmWq9YGBrx6bbGqluGc1f0XEfhSkiY4jhLgbsJUMKRA==", "license": "Apache-2.0", - "peer": true, "dependencies": { - "@aws-sdk/types": "3.734.0", - "@smithy/types": "^4.1.0", - "@smithy/util-endpoints": "^3.0.1", + "@smithy/protocol-http": "^5.3.8", + "@smithy/querystring-builder": "^4.2.8", + "@smithy/types": "^4.12.0", + "@smithy/util-base64": "^4.3.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.734.0", + "node_modules/@aws-sdk/credential-provider-node/node_modules/@smithy/hash-node": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.2.8.tgz", + "integrity": "sha512-7ZIlPbmaDGxVoxErDZnuFG18WekhbA/g2/i97wGj+wUBeS6pcUeAym8u4BXh/75RXWhgIJhyC11hBzig6MljwA==", "license": "Apache-2.0", - "peer": true, "dependencies": { - "@aws-sdk/types": "3.734.0", - "@smithy/types": "^4.1.0", - "bowser": "^2.11.0", + "@smithy/types": "^4.12.0", + "@smithy/util-buffer-from": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.758.0", + "node_modules/@aws-sdk/credential-provider-node/node_modules/@smithy/invalid-dependency": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.2.8.tgz", + "integrity": "sha512-N9iozRybwAQ2dn9Fot9kI6/w9vos2oTXLhtK7ovGqwZjlOcxu6XhPlpLpC+INsxktqHinn5gS2DXDjDF2kG5sQ==", "license": "Apache-2.0", - "peer": true, "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", + "@smithy/types": "^4.12.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" - }, - "peerDependencies": { - "aws-crt": ">=1.0.0" - }, - "peerDependenciesMeta": { - "aws-crt": { - "optional": true - } } }, - "node_modules/@aws-sdk/credential-provider-ini/node_modules/@smithy/abort-controller": { - "version": "4.0.1", + "node_modules/@aws-sdk/credential-provider-node/node_modules/@smithy/is-array-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-4.2.0.tgz", + "integrity": "sha512-DZZZBvC7sjcYh4MazJSGiWMI2L7E0oCiRHREDzIxi/M2LY79/21iXt6aPLHge82wi5LsuRF5A06Ds3+0mlh6CQ==", "license": "Apache-2.0", - "peer": true, "dependencies": { - "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-ini/node_modules/@smithy/config-resolver": { - "version": "4.0.1", + "node_modules/@aws-sdk/credential-provider-node/node_modules/@smithy/middleware-content-length": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.2.8.tgz", + "integrity": "sha512-RO0jeoaYAB1qBRhfVyq0pMgBoUK34YEJxVxyjOWYZiOKOq2yMZ4MnVXMZCUDenpozHue207+9P5ilTV1zeda0A==", "license": "Apache-2.0", - "peer": true, "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", + "@smithy/protocol-http": "^5.3.8", + "@smithy/types": "^4.12.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-ini/node_modules/@smithy/core": { - "version": "3.1.5", + "node_modules/@aws-sdk/credential-provider-node/node_modules/@smithy/middleware-endpoint": { + "version": "4.4.11", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.4.11.tgz", + "integrity": "sha512-/WqsrycweGGfb9sSzME4CrsuayjJF6BueBmkKlcbeU5q18OhxRrvvKlmfw3tpDsK5ilx2XUJvoukwxHB0nHs/Q==", "license": "Apache-2.0", - "peer": true, "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", + "@smithy/core": "^3.21.1", + "@smithy/middleware-serde": "^4.2.9", + "@smithy/node-config-provider": "^4.3.8", + "@smithy/shared-ini-file-loader": "^4.4.3", + "@smithy/types": "^4.12.0", + "@smithy/url-parser": "^4.2.8", + "@smithy/util-middleware": "^4.2.8", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-ini/node_modules/@smithy/credential-provider-imds": { - "version": "4.0.1", + "node_modules/@aws-sdk/credential-provider-node/node_modules/@smithy/middleware-retry": { + "version": "4.4.27", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.4.27.tgz", + "integrity": "sha512-xFUYCGRVsfgiN5EjsJJSzih9+yjStgMTCLANPlf0LVQkPDYCe0hz97qbdTZosFOiYlGBlHYityGRxrQ/hxhfVQ==", "license": "Apache-2.0", - "peer": true, "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", + "@smithy/node-config-provider": "^4.3.8", + "@smithy/protocol-http": "^5.3.8", + "@smithy/service-error-classification": "^4.2.8", + "@smithy/smithy-client": "^4.10.12", + "@smithy/types": "^4.12.0", + "@smithy/util-middleware": "^4.2.8", + "@smithy/util-retry": "^4.2.8", + "@smithy/uuid": "^1.1.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-ini/node_modules/@smithy/fetch-http-handler": { - "version": "5.0.1", + "node_modules/@aws-sdk/credential-provider-node/node_modules/@smithy/middleware-serde": { + "version": "4.2.9", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.2.9.tgz", + "integrity": "sha512-eMNiej0u/snzDvlqRGSN3Vl0ESn3838+nKyVfF2FKNXFbi4SERYT6PR392D39iczngbqqGG0Jl1DlCnp7tBbXQ==", "license": "Apache-2.0", - "peer": true, "dependencies": { - "@smithy/protocol-http": "^5.0.1", - "@smithy/querystring-builder": "^4.0.1", - "@smithy/types": "^4.1.0", - "@smithy/util-base64": "^4.0.0", + "@smithy/protocol-http": "^5.3.8", + "@smithy/types": "^4.12.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-ini/node_modules/@smithy/hash-node": { - "version": "4.0.1", + "node_modules/@aws-sdk/credential-provider-node/node_modules/@smithy/middleware-stack": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.2.8.tgz", + "integrity": "sha512-w6LCfOviTYQjBctOKSwy6A8FIkQy7ICvglrZFl6Bw4FmcQ1Z420fUtIhxaUZZshRe0VCq4kvDiPiXrPZAe8oRA==", "license": "Apache-2.0", - "peer": true, "dependencies": { - "@smithy/types": "^4.1.0", - "@smithy/util-buffer-from": "^4.0.0", - "@smithy/util-utf8": "^4.0.0", + "@smithy/types": "^4.12.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-ini/node_modules/@smithy/invalid-dependency": { - "version": "4.0.1", + "node_modules/@aws-sdk/credential-provider-node/node_modules/@smithy/node-config-provider": { + "version": "4.3.8", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.3.8.tgz", + "integrity": "sha512-aFP1ai4lrbVlWjfpAfRSL8KFcnJQYfTl5QxLJXY32vghJrDuFyPZ6LtUL+JEGYiFRG1PfPLHLoxj107ulncLIg==", "license": "Apache-2.0", - "peer": true, "dependencies": { - "@smithy/types": "^4.1.0", + "@smithy/property-provider": "^4.2.8", + "@smithy/shared-ini-file-loader": "^4.4.3", + "@smithy/types": "^4.12.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-ini/node_modules/@smithy/is-array-buffer": { - "version": "4.0.0", + "node_modules/@aws-sdk/credential-provider-node/node_modules/@smithy/node-http-handler": { + "version": "4.4.8", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.4.8.tgz", + "integrity": "sha512-q9u+MSbJVIJ1QmJ4+1u+cERXkrhuILCBDsJUBAW1MPE6sFonbCNaegFuwW9ll8kh5UdyY3jOkoOGlc7BesoLpg==", "license": "Apache-2.0", - "peer": true, "dependencies": { + "@smithy/abort-controller": "^4.2.8", + "@smithy/protocol-http": "^5.3.8", + "@smithy/querystring-builder": "^4.2.8", + "@smithy/types": "^4.12.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-ini/node_modules/@smithy/middleware-content-length": { - "version": "4.0.1", + "node_modules/@aws-sdk/credential-provider-node/node_modules/@smithy/property-provider": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.2.8.tgz", + "integrity": "sha512-EtCTbyIveCKeOXDSWSdze3k612yCPq1YbXsbqX3UHhkOSW8zKsM9NOJG5gTIya0vbY2DIaieG8pKo1rITHYL0w==", "license": "Apache-2.0", - "peer": true, "dependencies": { - "@smithy/protocol-http": "^5.0.1", - "@smithy/types": "^4.1.0", + "@smithy/types": "^4.12.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-ini/node_modules/@smithy/middleware-endpoint": { - "version": "4.0.6", + "node_modules/@aws-sdk/credential-provider-node/node_modules/@smithy/protocol-http": { + "version": "5.3.8", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.3.8.tgz", + "integrity": "sha512-QNINVDhxpZ5QnP3aviNHQFlRogQZDfYlCkQT+7tJnErPQbDhysondEjhikuANxgMsZrkGeiAxXy4jguEGsDrWQ==", "license": "Apache-2.0", - "peer": true, "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", + "@smithy/types": "^4.12.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-ini/node_modules/@smithy/middleware-retry": { - "version": "4.0.7", + "node_modules/@aws-sdk/credential-provider-node/node_modules/@smithy/querystring-builder": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.2.8.tgz", + "integrity": "sha512-Xr83r31+DrE8CP3MqPgMJl+pQlLLmOfiEUnoyAlGzzJIrEsbKsPy1hqH0qySaQm4oWrCBlUqRt+idEgunKB+iw==", "license": "Apache-2.0", - "peer": true, "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" + "@smithy/types": "^4.12.0", + "@smithy/util-uri-escape": "^4.2.0", + "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-ini/node_modules/@smithy/middleware-serde": { - "version": "4.0.2", + "node_modules/@aws-sdk/credential-provider-node/node_modules/@smithy/querystring-parser": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.2.8.tgz", + "integrity": "sha512-vUurovluVy50CUlazOiXkPq40KGvGWSdmusa3130MwrR1UNnNgKAlj58wlOe61XSHRpUfIIh6cE0zZ8mzKaDPA==", "license": "Apache-2.0", - "peer": true, "dependencies": { - "@smithy/types": "^4.1.0", + "@smithy/types": "^4.12.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-ini/node_modules/@smithy/middleware-stack": { - "version": "4.0.1", + "node_modules/@aws-sdk/credential-provider-node/node_modules/@smithy/service-error-classification": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.2.8.tgz", + "integrity": "sha512-mZ5xddodpJhEt3RkCjbmUQuXUOaPNTkbMGR0bcS8FE0bJDLMZlhmpgrvPNCYglVw5rsYTpSnv19womw9WWXKQQ==", "license": "Apache-2.0", - "peer": true, "dependencies": { - "@smithy/types": "^4.1.0", - "tslib": "^2.6.2" + "@smithy/types": "^4.12.0" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-ini/node_modules/@smithy/node-config-provider": { - "version": "4.0.1", + "node_modules/@aws-sdk/credential-provider-node/node_modules/@smithy/shared-ini-file-loader": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.4.3.tgz", + "integrity": "sha512-DfQjxXQnzC5UbCUPeC3Ie8u+rIWZTvuDPAGU/BxzrOGhRvgUanaP68kDZA+jaT3ZI+djOf+4dERGlm9mWfFDrg==", "license": "Apache-2.0", - "peer": true, "dependencies": { - "@smithy/property-provider": "^4.0.1", - "@smithy/shared-ini-file-loader": "^4.0.1", - "@smithy/types": "^4.1.0", + "@smithy/types": "^4.12.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-ini/node_modules/@smithy/node-http-handler": { - "version": "4.0.3", + "node_modules/@aws-sdk/credential-provider-node/node_modules/@smithy/smithy-client": { + "version": "4.10.12", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.10.12.tgz", + "integrity": "sha512-VKO/HKoQ5OrSHW6AJUmEnUKeXI1/5LfCwO9cwyao7CmLvGnZeM1i36Lyful3LK1XU7HwTVieTqO1y2C/6t3qtA==", "license": "Apache-2.0", - "peer": true, "dependencies": { - "@smithy/abort-controller": "^4.0.1", - "@smithy/protocol-http": "^5.0.1", - "@smithy/querystring-builder": "^4.0.1", - "@smithy/types": "^4.1.0", + "@smithy/core": "^3.21.1", + "@smithy/middleware-endpoint": "^4.4.11", + "@smithy/middleware-stack": "^4.2.8", + "@smithy/protocol-http": "^5.3.8", + "@smithy/types": "^4.12.0", + "@smithy/util-stream": "^4.5.10", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-ini/node_modules/@smithy/property-provider": { - "version": "4.0.1", + "node_modules/@aws-sdk/credential-provider-node/node_modules/@smithy/types": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.12.0.tgz", + "integrity": "sha512-9YcuJVTOBDjg9LWo23Qp0lTQ3D7fQsQtwle0jVfpbUHy9qBwCEgKuVH4FqFB3VYu0nwdHKiEMA+oXz7oV8X1kw==", "license": "Apache-2.0", - "peer": true, "dependencies": { - "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-ini/node_modules/@smithy/protocol-http": { - "version": "5.0.1", + "node_modules/@aws-sdk/credential-provider-node/node_modules/@smithy/url-parser": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.2.8.tgz", + "integrity": "sha512-NQho9U68TGMEU639YkXnVMV3GEFFULmmaWdlu1E9qzyIePOHsoSnagTGSDv1Zi8DCNN6btxOSdgmy5E/hsZwhA==", "license": "Apache-2.0", - "peer": true, "dependencies": { - "@smithy/types": "^4.1.0", + "@smithy/querystring-parser": "^4.2.8", + "@smithy/types": "^4.12.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-ini/node_modules/@smithy/querystring-builder": { - "version": "4.0.1", + "node_modules/@aws-sdk/credential-provider-node/node_modules/@smithy/util-base64": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-4.3.0.tgz", + "integrity": "sha512-GkXZ59JfyxsIwNTWFnjmFEI8kZpRNIBfxKjv09+nkAWPt/4aGaEWMM04m4sxgNVWkbt2MdSvE3KF/PfX4nFedQ==", "license": "Apache-2.0", - "peer": true, "dependencies": { - "@smithy/types": "^4.1.0", - "@smithy/util-uri-escape": "^4.0.0", + "@smithy/util-buffer-from": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-ini/node_modules/@smithy/querystring-parser": { - "version": "4.0.1", + "node_modules/@aws-sdk/credential-provider-node/node_modules/@smithy/util-body-length-browser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-4.2.0.tgz", + "integrity": "sha512-Fkoh/I76szMKJnBXWPdFkQJl2r9SjPt3cMzLdOB6eJ4Pnpas8hVoWPYemX/peO0yrrvldgCUVJqOAjUrOLjbxg==", "license": "Apache-2.0", - "peer": true, "dependencies": { - "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-ini/node_modules/@smithy/service-error-classification": { - "version": "4.0.1", + "node_modules/@aws-sdk/credential-provider-node/node_modules/@smithy/util-body-length-node": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-4.2.1.tgz", + "integrity": "sha512-h53dz/pISVrVrfxV1iqXlx5pRg3V2YWFcSQyPyXZRrZoZj4R4DeWRDo1a7dd3CPTcFi3kE+98tuNyD2axyZReA==", "license": "Apache-2.0", - "peer": true, "dependencies": { - "@smithy/types": "^4.1.0" + "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-ini/node_modules/@smithy/shared-ini-file-loader": { - "version": "4.0.1", + "node_modules/@aws-sdk/credential-provider-node/node_modules/@smithy/util-buffer-from": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-4.2.0.tgz", + "integrity": "sha512-kAY9hTKulTNevM2nlRtxAG2FQ3B2OR6QIrPY3zE5LqJy1oxzmgBGsHLWTcNhWXKchgA0WHW+mZkQrng/pgcCew==", "license": "Apache-2.0", - "peer": true, "dependencies": { - "@smithy/types": "^4.1.0", + "@smithy/is-array-buffer": "^4.2.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-ini/node_modules/@smithy/signature-v4": { - "version": "5.0.1", + "node_modules/@aws-sdk/credential-provider-node/node_modules/@smithy/util-config-provider": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-4.2.0.tgz", + "integrity": "sha512-YEjpl6XJ36FTKmD+kRJJWYvrHeUvm5ykaUS5xK+6oXffQPHeEM4/nXlZPe+Wu0lsgRUcNZiliYNh/y7q9c2y6Q==", "license": "Apache-2.0", - "peer": true, "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-sdk/credential-provider-ini/node_modules/@smithy/smithy-client": { - "version": "4.1.6", + "node_modules/@aws-sdk/credential-provider-node/node_modules/@smithy/util-defaults-mode-browser": { + "version": "4.3.26", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.3.26.tgz", + "integrity": "sha512-vva0dzYUTgn7DdE0uaha10uEdAgmdLnNFowKFjpMm6p2R0XDk5FHPX3CBJLzWQkQXuEprsb0hGz9YwbicNWhjw==", "license": "Apache-2.0", - "peer": true, "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", + "@smithy/property-provider": "^4.2.8", + "@smithy/smithy-client": "^4.10.12", + "@smithy/types": "^4.12.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-ini/node_modules/@smithy/types": { - "version": "4.1.0", + "node_modules/@aws-sdk/credential-provider-node/node_modules/@smithy/util-defaults-mode-node": { + "version": "4.2.29", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.2.29.tgz", + "integrity": "sha512-c6D7IUBsZt/aNnTBHMTf+OVh+h/JcxUUgfTcIJaWRe6zhOum1X+pNKSZtZ+7fbOn5I99XVFtmrnXKv8yHHErTQ==", "license": "Apache-2.0", - "peer": true, "dependencies": { + "@smithy/config-resolver": "^4.4.6", + "@smithy/credential-provider-imds": "^4.2.8", + "@smithy/node-config-provider": "^4.3.8", + "@smithy/property-provider": "^4.2.8", + "@smithy/smithy-client": "^4.10.12", + "@smithy/types": "^4.12.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-ini/node_modules/@smithy/url-parser": { - "version": "4.0.1", + "node_modules/@aws-sdk/credential-provider-node/node_modules/@smithy/util-endpoints": { + "version": "3.2.8", + "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.2.8.tgz", + "integrity": "sha512-8JaVTn3pBDkhZgHQ8R0epwWt+BqPSLCjdjXXusK1onwJlRuN69fbvSK66aIKKO7SwVFM6x2J2ox5X8pOaWcUEw==", "license": "Apache-2.0", - "peer": true, "dependencies": { - "@smithy/querystring-parser": "^4.0.1", - "@smithy/types": "^4.1.0", + "@smithy/node-config-provider": "^4.3.8", + "@smithy/types": "^4.12.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-ini/node_modules/@smithy/util-base64": { - "version": "4.0.0", + "node_modules/@aws-sdk/credential-provider-node/node_modules/@smithy/util-hex-encoding": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-4.2.0.tgz", + "integrity": "sha512-CCQBwJIvXMLKxVbO88IukazJD9a4kQ9ZN7/UMGBjBcJYvatpWk+9g870El4cB8/EJxfe+k+y0GmR9CAzkF+Nbw==", "license": "Apache-2.0", - "peer": true, "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-sdk/credential-provider-ini/node_modules/@smithy/util-body-length-browser": { - "version": "4.0.0", + "node_modules/@aws-sdk/credential-provider-node/node_modules/@smithy/util-middleware": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.2.8.tgz", + "integrity": "sha512-PMqfeJxLcNPMDgvPbbLl/2Vpin+luxqTGPpW3NAQVLbRrFRzTa4rNAASYeIGjRV9Ytuhzny39SpyU04EQreF+A==", "license": "Apache-2.0", - "peer": true, "dependencies": { + "@smithy/types": "^4.12.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-ini/node_modules/@smithy/util-body-length-node": { - "version": "4.0.0", + "node_modules/@aws-sdk/credential-provider-node/node_modules/@smithy/util-retry": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.2.8.tgz", + "integrity": "sha512-CfJqwvoRY0kTGe5AkQokpURNCT1u/MkRzMTASWMPPo2hNSnKtF1D45dQl3DE2LKLr4m+PW9mCeBMJr5mCAVThg==", "license": "Apache-2.0", - "peer": true, "dependencies": { + "@smithy/service-error-classification": "^4.2.8", + "@smithy/types": "^4.12.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-ini/node_modules/@smithy/util-buffer-from": { - "version": "4.0.0", + "node_modules/@aws-sdk/credential-provider-node/node_modules/@smithy/util-stream": { + "version": "4.5.10", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.5.10.tgz", + "integrity": "sha512-jbqemy51UFSZSp2y0ZmRfckmrzuKww95zT9BYMmuJ8v3altGcqjwoV1tzpOwuHaKrwQrCjIzOib499ymr2f98g==", "license": "Apache-2.0", - "peer": true, "dependencies": { - "@smithy/is-array-buffer": "^4.0.0", + "@smithy/fetch-http-handler": "^5.3.9", + "@smithy/node-http-handler": "^4.4.8", + "@smithy/types": "^4.12.0", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-buffer-from": "^4.2.0", + "@smithy/util-hex-encoding": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-ini/node_modules/@smithy/util-config-provider": { - "version": "4.0.0", + "node_modules/@aws-sdk/credential-provider-node/node_modules/@smithy/util-uri-escape": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-4.2.0.tgz", + "integrity": "sha512-igZpCKV9+E/Mzrpq6YacdTQ0qTiLm85gD6N/IrmyDvQFA4UnU3d5g3m8tMT/6zG/vVkWSU+VxeUyGonL62DuxA==", "license": "Apache-2.0", - "peer": true, "dependencies": { "tslib": "^2.6.2" }, @@ -24563,109 +27941,117 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-ini/node_modules/@smithy/util-defaults-mode-browser": { - "version": "4.0.7", + "node_modules/@aws-sdk/credential-provider-node/node_modules/@smithy/util-utf8": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.2.0.tgz", + "integrity": "sha512-zBPfuzoI8xyBtR2P6WQj63Rz8i3AmfAaJLuNG8dWsfvPe8lO4aCPYLn879mEgHndZH1zQ2oXmG8O1GGzzaoZiw==", "license": "Apache-2.0", - "peer": true, "dependencies": { - "@smithy/property-provider": "^4.0.1", - "@smithy/smithy-client": "^4.1.6", - "@smithy/types": "^4.1.0", - "bowser": "^2.11.0", + "@smithy/util-buffer-from": "^4.2.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-ini/node_modules/@smithy/util-defaults-mode-node": { - "version": "4.0.7", + "node_modules/@aws-sdk/credential-provider-process": { + "version": "3.693.0", "license": "Apache-2.0", - "peer": true, "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", + "@aws-sdk/core": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@smithy/property-provider": "^3.1.9", + "@smithy/shared-ini-file-loader": "^3.1.10", + "@smithy/types": "^3.7.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/credential-provider-ini/node_modules/@smithy/util-endpoints": { - "version": "3.0.1", + "node_modules/@aws-sdk/credential-provider-process/node_modules/@aws-sdk/core": { + "version": "3.693.0", "license": "Apache-2.0", - "peer": true, "dependencies": { - "@smithy/node-config-provider": "^4.0.1", - "@smithy/types": "^4.1.0", + "@aws-sdk/types": "3.692.0", + "@smithy/core": "^2.5.2", + "@smithy/node-config-provider": "^3.1.10", + "@smithy/property-provider": "^3.1.9", + "@smithy/protocol-http": "^4.1.6", + "@smithy/signature-v4": "^4.2.2", + "@smithy/smithy-client": "^3.4.3", + "@smithy/types": "^3.7.0", + "@smithy/util-middleware": "^3.0.9", + "fast-xml-parser": "4.4.1", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/credential-provider-ini/node_modules/@smithy/util-hex-encoding": { - "version": "4.0.0", + "node_modules/@aws-sdk/credential-provider-sso": { + "version": "3.972.2", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.972.2.tgz", + "integrity": "sha512-YpwDn8g3gCGUl61cCV0sRxP2pFIwg+ZsMfWQ/GalSyjXtRkctCMFA+u0yPb/Q4uTfNEiya1Y4nm0C5rIHyPW5Q==", "license": "Apache-2.0", - "peer": true, "dependencies": { + "@aws-sdk/client-sso": "3.975.0", + "@aws-sdk/core": "^3.973.2", + "@aws-sdk/token-providers": "3.975.0", + "@aws-sdk/types": "^3.973.1", + "@smithy/property-provider": "^4.2.8", + "@smithy/shared-ini-file-loader": "^4.4.3", + "@smithy/types": "^4.12.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=20.0.0" } }, - "node_modules/@aws-sdk/credential-provider-ini/node_modules/@smithy/util-middleware": { - "version": "4.0.1", + "node_modules/@aws-sdk/credential-provider-sso/node_modules/@aws-sdk/types": { + "version": "3.973.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.973.1.tgz", + "integrity": "sha512-DwHBiMNOB468JiX6+i34c+THsKHErYUdNQ3HexeXZvVn4zouLjgaS4FejiGSi2HyBuzuyHg7SuOPmjSvoU9NRg==", "license": "Apache-2.0", - "peer": true, "dependencies": { - "@smithy/types": "^4.1.0", + "@smithy/types": "^4.12.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=20.0.0" } }, - "node_modules/@aws-sdk/credential-provider-ini/node_modules/@smithy/util-retry": { - "version": "4.0.1", + "node_modules/@aws-sdk/credential-provider-sso/node_modules/@smithy/property-provider": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.2.8.tgz", + "integrity": "sha512-EtCTbyIveCKeOXDSWSdze3k612yCPq1YbXsbqX3UHhkOSW8zKsM9NOJG5gTIya0vbY2DIaieG8pKo1rITHYL0w==", "license": "Apache-2.0", - "peer": true, "dependencies": { - "@smithy/service-error-classification": "^4.0.1", - "@smithy/types": "^4.1.0", + "@smithy/types": "^4.12.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-ini/node_modules/@smithy/util-stream": { - "version": "4.1.2", + "node_modules/@aws-sdk/credential-provider-sso/node_modules/@smithy/shared-ini-file-loader": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.4.3.tgz", + "integrity": "sha512-DfQjxXQnzC5UbCUPeC3Ie8u+rIWZTvuDPAGU/BxzrOGhRvgUanaP68kDZA+jaT3ZI+djOf+4dERGlm9mWfFDrg==", "license": "Apache-2.0", - "peer": true, "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.12.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-ini/node_modules/@smithy/util-uri-escape": { - "version": "4.0.0", + "node_modules/@aws-sdk/credential-provider-sso/node_modules/@smithy/types": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.12.0.tgz", + "integrity": "sha512-9YcuJVTOBDjg9LWo23Qp0lTQ3D7fQsQtwle0jVfpbUHy9qBwCEgKuVH4FqFB3VYu0nwdHKiEMA+oXz7oV8X1kw==", "license": "Apache-2.0", - "peer": true, "dependencies": { "tslib": "^2.6.2" }, @@ -24673,393 +28059,319 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-ini/node_modules/@smithy/util-utf8": { - "version": "4.0.0", + "node_modules/@aws-sdk/credential-provider-web-identity": { + "version": "3.758.0", "license": "Apache-2.0", "peer": true, "dependencies": { - "@smithy/util-buffer-from": "^4.0.0", + "@aws-sdk/core": "3.758.0", + "@aws-sdk/nested-clients": "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-sdk/credential-provider-login": { - "version": "3.936.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-login/-/credential-provider-login-3.936.0.tgz", - "integrity": "sha512-8DVrdRqPyUU66gfV7VZNToh56ZuO5D6agWrkLQE/xbLJOm2RbeRgh6buz7CqV8ipRd6m+zCl9mM4F3osQLZn8Q==", + "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/core": "3.936.0", - "@aws-sdk/nested-clients": "3.936.0", - "@aws-sdk/types": "3.936.0", - "@smithy/property-provider": "^4.2.5", - "@smithy/protocol-http": "^5.3.5", - "@smithy/shared-ini-file-loader": "^4.4.0", - "@smithy/types": "^4.9.0", + "@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-sdk/credential-provider-login/node_modules/@aws-sdk/core": { - "version": "3.936.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.936.0.tgz", - "integrity": "sha512-eGJ2ySUMvgtOziHhDRDLCrj473RJoL4J1vPjVM3NrKC/fF3/LoHjkut8AAnKmrW6a2uTzNKubigw8dEnpmpERw==", + "node_modules/@aws-sdk/credential-provider-web-identity/node_modules/@aws-sdk/types": { + "version": "3.734.0", "license": "Apache-2.0", + "peer": true, "dependencies": { - "@aws-sdk/types": "3.936.0", - "@aws-sdk/xml-builder": "3.930.0", - "@smithy/core": "^3.18.5", - "@smithy/node-config-provider": "^4.3.5", - "@smithy/property-provider": "^4.2.5", - "@smithy/protocol-http": "^5.3.5", - "@smithy/signature-v4": "^5.3.5", - "@smithy/smithy-client": "^4.9.8", - "@smithy/types": "^4.9.0", - "@smithy/util-base64": "^4.3.0", - "@smithy/util-middleware": "^4.2.5", - "@smithy/util-utf8": "^4.2.0", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-login/node_modules/@aws-sdk/middleware-host-header": { - "version": "3.936.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.936.0.tgz", - "integrity": "sha512-tAaObaAnsP1XnLGndfkGWFuzrJYuk9W0b/nLvol66t8FZExIAf/WdkT2NNAWOYxljVs++oHnyHBCxIlaHrzSiw==", + "node_modules/@aws-sdk/credential-provider-web-identity/node_modules/@smithy/abort-controller": { + "version": "4.0.1", "license": "Apache-2.0", + "peer": true, "dependencies": { - "@aws-sdk/types": "3.936.0", - "@smithy/protocol-http": "^5.3.5", - "@smithy/types": "^4.9.0", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-login/node_modules/@aws-sdk/middleware-logger": { - "version": "3.936.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.936.0.tgz", - "integrity": "sha512-aPSJ12d3a3Ea5nyEnLbijCaaYJT2QjQ9iW+zGh5QcZYXmOGWbKVyPSxmVOboZQG+c1M8t6d2O7tqrwzIq8L8qw==", + "node_modules/@aws-sdk/credential-provider-web-identity/node_modules/@smithy/core": { + "version": "3.1.5", "license": "Apache-2.0", + "peer": true, "dependencies": { - "@aws-sdk/types": "3.936.0", - "@smithy/types": "^4.9.0", + "@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-sdk/credential-provider-login/node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.936.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.936.0.tgz", - "integrity": "sha512-l4aGbHpXM45YNgXggIux1HgsCVAvvBoqHPkqLnqMl9QVapfuSTjJHfDYDsx1Xxct6/m7qSMUzanBALhiaGO2fA==", + "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": { - "@aws-sdk/types": "3.936.0", - "@aws/lambda-invoke-store": "^0.2.0", - "@smithy/protocol-http": "^5.3.5", - "@smithy/types": "^4.9.0", + "@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-sdk/credential-provider-login/node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.936.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.936.0.tgz", - "integrity": "sha512-YB40IPa7K3iaYX0lSnV9easDOLPLh+fJyUDF3BH8doX4i1AOSsYn86L4lVldmOaSX+DwiaqKHpvk4wPBdcIPWw==", + "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": { - "@aws-sdk/core": "3.936.0", - "@aws-sdk/types": "3.936.0", - "@aws-sdk/util-endpoints": "3.936.0", - "@smithy/core": "^3.18.5", - "@smithy/protocol-http": "^5.3.5", - "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-login/node_modules/@aws-sdk/nested-clients": { - "version": "3.936.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.936.0.tgz", - "integrity": "sha512-eyj2tz1XmDSLSZQ5xnB7cLTVKkSJnYAEoNDSUNhzWPxrBDYeJzIbatecOKceKCU8NBf8gWWZCK/CSY0mDxMO0A==", + "node_modules/@aws-sdk/credential-provider-web-identity/node_modules/@smithy/middleware-endpoint": { + "version": "4.0.6", "license": "Apache-2.0", + "peer": true, "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.936.0", - "@aws-sdk/middleware-host-header": "3.936.0", - "@aws-sdk/middleware-logger": "3.936.0", - "@aws-sdk/middleware-recursion-detection": "3.936.0", - "@aws-sdk/middleware-user-agent": "3.936.0", - "@aws-sdk/region-config-resolver": "3.936.0", - "@aws-sdk/types": "3.936.0", - "@aws-sdk/util-endpoints": "3.936.0", - "@aws-sdk/util-user-agent-browser": "3.936.0", - "@aws-sdk/util-user-agent-node": "3.936.0", - "@smithy/config-resolver": "^4.4.3", - "@smithy/core": "^3.18.5", - "@smithy/fetch-http-handler": "^5.3.6", - "@smithy/hash-node": "^4.2.5", - "@smithy/invalid-dependency": "^4.2.5", - "@smithy/middleware-content-length": "^4.2.5", - "@smithy/middleware-endpoint": "^4.3.12", - "@smithy/middleware-retry": "^4.4.12", - "@smithy/middleware-serde": "^4.2.6", - "@smithy/middleware-stack": "^4.2.5", - "@smithy/node-config-provider": "^4.3.5", - "@smithy/node-http-handler": "^4.4.5", - "@smithy/protocol-http": "^5.3.5", - "@smithy/smithy-client": "^4.9.8", - "@smithy/types": "^4.9.0", - "@smithy/url-parser": "^4.2.5", - "@smithy/util-base64": "^4.3.0", - "@smithy/util-body-length-browser": "^4.2.0", - "@smithy/util-body-length-node": "^4.2.1", - "@smithy/util-defaults-mode-browser": "^4.3.11", - "@smithy/util-defaults-mode-node": "^4.2.14", - "@smithy/util-endpoints": "^3.2.5", - "@smithy/util-middleware": "^4.2.5", - "@smithy/util-retry": "^4.2.5", - "@smithy/util-utf8": "^4.2.0", + "@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-sdk/credential-provider-login/node_modules/@aws-sdk/region-config-resolver": { - "version": "3.936.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.936.0.tgz", - "integrity": "sha512-wOKhzzWsshXGduxO4pqSiNyL9oUtk4BEvjWm9aaq6Hmfdoydq6v6t0rAGHWPjFwy9z2haovGRi3C8IxdMB4muw==", + "node_modules/@aws-sdk/credential-provider-web-identity/node_modules/@smithy/middleware-serde": { + "version": "4.0.2", "license": "Apache-2.0", + "peer": true, "dependencies": { - "@aws-sdk/types": "3.936.0", - "@smithy/config-resolver": "^4.4.3", - "@smithy/node-config-provider": "^4.3.5", - "@smithy/types": "^4.9.0", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-login/node_modules/@aws-sdk/types": { - "version": "3.936.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.936.0.tgz", - "integrity": "sha512-uz0/VlMd2pP5MepdrHizd+T+OKfyK4r3OA9JI+L/lPKg0YFQosdJNCKisr6o70E3dh8iMpFYxF1UN/4uZsyARg==", + "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.9.0", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-login/node_modules/@aws-sdk/util-endpoints": { - "version": "3.936.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.936.0.tgz", - "integrity": "sha512-0Zx3Ntdpu+z9Wlm7JKUBOzS9EunwKAb4KdGUQQxDqh5Lc3ta5uBoub+FgmVuzwnmBu9U1Os8UuwVTH0Lgu+P5w==", + "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": { - "@aws-sdk/types": "3.936.0", - "@smithy/types": "^4.9.0", - "@smithy/url-parser": "^4.2.5", - "@smithy/util-endpoints": "^3.2.5", + "@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-sdk/credential-provider-login/node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.936.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.936.0.tgz", - "integrity": "sha512-eZ/XF6NxMtu+iCma58GRNRxSq4lHo6zHQLOZRIeL/ghqYJirqHdenMOwrzPettj60KWlv827RVebP9oNVrwZbw==", + "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": { - "@aws-sdk/types": "3.936.0", - "@smithy/types": "^4.9.0", - "bowser": "^2.11.0", + "@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-sdk/credential-provider-login/node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.936.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.936.0.tgz", - "integrity": "sha512-XOEc7PF9Op00pWV2AYCGDSu5iHgYjIO53Py2VUQTIvP7SRCaCsXmA33mjBvC2Ms6FhSyWNa4aK4naUGIz0hQcw==", + "node_modules/@aws-sdk/credential-provider-web-identity/node_modules/@smithy/property-provider": { + "version": "4.0.1", "license": "Apache-2.0", + "peer": true, "dependencies": { - "@aws-sdk/middleware-user-agent": "3.936.0", - "@aws-sdk/types": "3.936.0", - "@smithy/node-config-provider": "^4.3.5", - "@smithy/types": "^4.9.0", + "@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-sdk/credential-provider-login/node_modules/@aws-sdk/xml-builder": { - "version": "3.930.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.930.0.tgz", - "integrity": "sha512-YIfkD17GocxdmlUVc3ia52QhcWuRIUJonbF8A2CYfcWNV3HzvAqpcPeC0bYUhkK+8e8YO1ARnLKZQE0TlwzorA==", + "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.9.0", - "fast-xml-parser": "5.2.5", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-login/node_modules/@aws/lambda-invoke-store": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@aws/lambda-invoke-store/-/lambda-invoke-store-0.2.0.tgz", - "integrity": "sha512-D1jAmAZQYMoPiacfgNf7AWhg3DFN3Wq/vQv3WINt9znwjzHp2x+WzdJFxxj7xZL7V1U79As6G8f7PorMYWBKsQ==", + "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", + "tslib": "^2.6.2" + }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-login/node_modules/@smithy/abort-controller": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.2.5.tgz", - "integrity": "sha512-j7HwVkBw68YW8UmFRcjZOmssE77Rvk0GWAIN1oFBhsaovQmZWYCIcGa9/pwRB0ExI8Sk9MWNALTjftjHZea7VA==", + "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.9.0", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-login/node_modules/@smithy/config-resolver": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.4.3.tgz", - "integrity": "sha512-ezHLe1tKLUxDJo2LHtDuEDyWXolw8WGOR92qb4bQdWq/zKenO5BvctZGrVJBK08zjezSk7bmbKFOXIVyChvDLw==", + "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/node-config-provider": "^4.3.5", - "@smithy/types": "^4.9.0", - "@smithy/util-config-provider": "^4.2.0", - "@smithy/util-endpoints": "^3.2.5", - "@smithy/util-middleware": "^4.2.5", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-login/node_modules/@smithy/core": { - "version": "3.18.5", - "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.18.5.tgz", - "integrity": "sha512-6gnIz3h+PEPQGDj8MnRSjDvKBah042jEoPgjFGJ4iJLBE78L4lY/n98x14XyPF4u3lN179Ub/ZKFY5za9GeLQw==", + "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/middleware-serde": "^4.2.6", - "@smithy/protocol-http": "^5.3.5", - "@smithy/types": "^4.9.0", - "@smithy/util-base64": "^4.3.0", - "@smithy/util-body-length-browser": "^4.2.0", - "@smithy/util-middleware": "^4.2.5", - "@smithy/util-stream": "^4.5.6", - "@smithy/util-utf8": "^4.2.0", - "@smithy/uuid": "^1.1.0", + "@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-sdk/credential-provider-login/node_modules/@smithy/credential-provider-imds": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.2.5.tgz", - "integrity": "sha512-BZwotjoZWn9+36nimwm/OLIcVe+KYRwzMjfhd4QT7QxPm9WY0HiOV8t/Wlh+HVUif0SBVV7ksq8//hPaBC/okQ==", + "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/node-config-provider": "^4.3.5", - "@smithy/property-provider": "^4.2.5", - "@smithy/types": "^4.9.0", - "@smithy/url-parser": "^4.2.5", + "@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-sdk/credential-provider-login/node_modules/@smithy/fetch-http-handler": { - "version": "5.3.6", - "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.3.6.tgz", - "integrity": "sha512-3+RG3EA6BBJ/ofZUeTFJA7mHfSYrZtQIrDP9dI8Lf7X6Jbos2jptuLrAAteDiFVrmbEmLSuRG/bUKzfAXk7dhg==", + "node_modules/@aws-sdk/credential-provider-web-identity/node_modules/@smithy/types": { + "version": "4.1.0", "license": "Apache-2.0", + "peer": true, "dependencies": { - "@smithy/protocol-http": "^5.3.5", - "@smithy/querystring-builder": "^4.2.5", - "@smithy/types": "^4.9.0", - "@smithy/util-base64": "^4.3.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-login/node_modules/@smithy/hash-node": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.2.5.tgz", - "integrity": "sha512-DpYX914YOfA3UDT9CN1BM787PcHfWRBB43fFGCYrZFUH0Jv+5t8yYl+Pd5PW4+QzoGEDvn5d5QIO4j2HyYZQSA==", + "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/types": "^4.9.0", - "@smithy/util-buffer-from": "^4.2.0", - "@smithy/util-utf8": "^4.2.0", + "@smithy/querystring-parser": "^4.0.1", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-login/node_modules/@smithy/invalid-dependency": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.2.5.tgz", - "integrity": "sha512-2L2erASEro1WC5nV+plwIMxrTXpvpfzl4e+Nre6vBVRR2HKeGGcvpJyyL3/PpiSg+cJG2KpTmZmq934Olb6e5A==", + "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/types": "^4.9.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-sdk/credential-provider-login/node_modules/@smithy/is-array-buffer": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-4.2.0.tgz", - "integrity": "sha512-DZZZBvC7sjcYh4MazJSGiWMI2L7E0oCiRHREDzIxi/M2LY79/21iXt6aPLHge82wi5LsuRF5A06Ds3+0mlh6CQ==", + "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" }, @@ -25067,110 +28379,106 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-login/node_modules/@smithy/middleware-content-length": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.2.5.tgz", - "integrity": "sha512-Y/RabVa5vbl5FuHYV2vUCwvh/dqzrEY/K2yWPSqvhFUwIY0atLqO4TienjBXakoy4zrKAMCZwg+YEqmH7jaN7A==", + "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/protocol-http": "^5.3.5", - "@smithy/types": "^4.9.0", + "@smithy/is-array-buffer": "^4.0.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-login/node_modules/@smithy/middleware-endpoint": { - "version": "4.3.12", - "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.3.12.tgz", - "integrity": "sha512-9pAX/H+VQPzNbouhDhkW723igBMLgrI8OtX+++M7iKJgg/zY/Ig3i1e6seCcx22FWhE6Q/S61BRdi2wXBORT+A==", + "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": { - "@smithy/core": "^3.18.5", - "@smithy/middleware-serde": "^4.2.6", - "@smithy/node-config-provider": "^4.3.5", - "@smithy/shared-ini-file-loader": "^4.4.0", - "@smithy/types": "^4.9.0", - "@smithy/url-parser": "^4.2.5", - "@smithy/util-middleware": "^4.2.5", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-login/node_modules/@smithy/middleware-retry": { - "version": "4.4.12", - "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.4.12.tgz", - "integrity": "sha512-S4kWNKFowYd0lID7/DBqWHOQxmxlsf0jBaos9chQZUWTVOjSW1Ogyh8/ib5tM+agFDJ/TCxuCTvrnlc+9cIBcQ==", + "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/node-config-provider": "^4.3.5", - "@smithy/protocol-http": "^5.3.5", - "@smithy/service-error-classification": "^4.2.5", - "@smithy/smithy-client": "^4.9.8", - "@smithy/types": "^4.9.0", - "@smithy/util-middleware": "^4.2.5", - "@smithy/util-retry": "^4.2.5", - "@smithy/uuid": "^1.1.0", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-login/node_modules/@smithy/middleware-serde": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.2.6.tgz", - "integrity": "sha512-VkLoE/z7e2g8pirwisLz8XJWedUSY8my/qrp81VmAdyrhi94T+riBfwP+AOEEFR9rFTSonC/5D2eWNmFabHyGQ==", + "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/protocol-http": "^5.3.5", - "@smithy/types": "^4.9.0", + "@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", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-login/node_modules/@smithy/middleware-stack": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.2.5.tgz", - "integrity": "sha512-bYrutc+neOyWxtZdbB2USbQttZN0mXaOyYLIsaTbJhFsfpXyGWUxJpEuO1rJ8IIJm2qH4+xJT0mxUSsEDTYwdQ==", + "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": { - "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-login/node_modules/@smithy/node-config-provider": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.3.5.tgz", - "integrity": "sha512-UTurh1C4qkVCtqggI36DGbLB2Kv8UlcFdMXDcWMbqVY2uRg0XmT9Pb4Vj6oSQ34eizO1fvR0RnFV4Axw4IrrAg==", + "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/property-provider": "^4.2.5", - "@smithy/shared-ini-file-loader": "^4.4.0", - "@smithy/types": "^4.9.0", + "@smithy/util-buffer-from": "^4.0.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-login/node_modules/@smithy/node-http-handler": { - "version": "4.4.5", - "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.4.5.tgz", - "integrity": "sha512-CMnzM9R2WqlqXQGtIlsHMEZfXKJVTIrqCNoSd/QpAyp+Dw0a1Vps13l6ma1fH8g7zSPNsA59B/kWgeylFuA/lw==", + "node_modules/@aws-sdk/credential-providers": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.936.0.tgz", + "integrity": "sha512-RWiX6wuReeEU7/P7apGwWMNO7nrai/CXmMMaho3+pJW7i6ImosgsjSe5tetdv1r4djOtM1b4J4WAbHPKJUahUg==", "license": "Apache-2.0", "dependencies": { - "@smithy/abort-controller": "^4.2.5", - "@smithy/protocol-http": "^5.3.5", - "@smithy/querystring-builder": "^4.2.5", + "@aws-sdk/client-cognito-identity": "3.936.0", + "@aws-sdk/core": "3.936.0", + "@aws-sdk/credential-provider-cognito-identity": "3.936.0", + "@aws-sdk/credential-provider-env": "3.936.0", + "@aws-sdk/credential-provider-http": "3.936.0", + "@aws-sdk/credential-provider-ini": "3.936.0", + "@aws-sdk/credential-provider-login": "3.936.0", + "@aws-sdk/credential-provider-node": "3.936.0", + "@aws-sdk/credential-provider-process": "3.936.0", + "@aws-sdk/credential-provider-sso": "3.936.0", + "@aws-sdk/credential-provider-web-identity": "3.936.0", + "@aws-sdk/nested-clients": "3.936.0", + "@aws-sdk/types": "3.936.0", + "@smithy/config-resolver": "^4.4.3", + "@smithy/core": "^3.18.5", + "@smithy/credential-provider-imds": "^4.2.5", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/property-provider": "^4.2.5", "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, @@ -25178,52 +28486,138 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-login/node_modules/@smithy/property-provider": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.2.5.tgz", - "integrity": "sha512-8iLN1XSE1rl4MuxvQ+5OSk/Zb5El7NJZ1td6Tn+8dQQHIjp59Lwl6bd0+nzw6SKm2wSSriH2v/I9LPzUic7EOg==", + "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/client-cognito-identity": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.936.0.tgz", + "integrity": "sha512-AkJZ426y0G8Lsyi9p7mWudacMKeo8XLZOfxUmeThMkDa3GxGQ1y6BTrOj6ZcvqQ1Hz7Abb3QWPC+EMqhu1Lncw==", "license": "Apache-2.0", "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.936.0", + "@aws-sdk/credential-provider-node": "3.936.0", + "@aws-sdk/middleware-host-header": "3.936.0", + "@aws-sdk/middleware-logger": "3.936.0", + "@aws-sdk/middleware-recursion-detection": "3.936.0", + "@aws-sdk/middleware-user-agent": "3.936.0", + "@aws-sdk/region-config-resolver": "3.936.0", + "@aws-sdk/types": "3.936.0", + "@aws-sdk/util-endpoints": "3.936.0", + "@aws-sdk/util-user-agent-browser": "3.936.0", + "@aws-sdk/util-user-agent-node": "3.936.0", + "@smithy/config-resolver": "^4.4.3", + "@smithy/core": "^3.18.5", + "@smithy/fetch-http-handler": "^5.3.6", + "@smithy/hash-node": "^4.2.5", + "@smithy/invalid-dependency": "^4.2.5", + "@smithy/middleware-content-length": "^4.2.5", + "@smithy/middleware-endpoint": "^4.3.12", + "@smithy/middleware-retry": "^4.4.12", + "@smithy/middleware-serde": "^4.2.6", + "@smithy/middleware-stack": "^4.2.5", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/node-http-handler": "^4.4.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/smithy-client": "^4.9.8", "@smithy/types": "^4.9.0", + "@smithy/url-parser": "^4.2.5", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-body-length-node": "^4.2.1", + "@smithy/util-defaults-mode-browser": "^4.3.11", + "@smithy/util-defaults-mode-node": "^4.2.14", + "@smithy/util-endpoints": "^3.2.5", + "@smithy/util-middleware": "^4.2.5", + "@smithy/util-retry": "^4.2.5", + "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-login/node_modules/@smithy/protocol-http": { - "version": "5.3.5", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.3.5.tgz", - "integrity": "sha512-RlaL+sA0LNMp03bf7XPbFmT5gN+w3besXSWMkA8rcmxLSVfiEXElQi4O2IWwPfxzcHkxqrwBFMbngB8yx/RvaQ==", + "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/client-sso": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.936.0.tgz", + "integrity": "sha512-0G73S2cDqYwJVvqL08eakj79MZG2QRaB56Ul8/Ps9oQxllr7DMI1IQ/N3j3xjxgpq/U36pkoFZ8aK1n7Sbr3IQ==", "license": "Apache-2.0", "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.936.0", + "@aws-sdk/middleware-host-header": "3.936.0", + "@aws-sdk/middleware-logger": "3.936.0", + "@aws-sdk/middleware-recursion-detection": "3.936.0", + "@aws-sdk/middleware-user-agent": "3.936.0", + "@aws-sdk/region-config-resolver": "3.936.0", + "@aws-sdk/types": "3.936.0", + "@aws-sdk/util-endpoints": "3.936.0", + "@aws-sdk/util-user-agent-browser": "3.936.0", + "@aws-sdk/util-user-agent-node": "3.936.0", + "@smithy/config-resolver": "^4.4.3", + "@smithy/core": "^3.18.5", + "@smithy/fetch-http-handler": "^5.3.6", + "@smithy/hash-node": "^4.2.5", + "@smithy/invalid-dependency": "^4.2.5", + "@smithy/middleware-content-length": "^4.2.5", + "@smithy/middleware-endpoint": "^4.3.12", + "@smithy/middleware-retry": "^4.4.12", + "@smithy/middleware-serde": "^4.2.6", + "@smithy/middleware-stack": "^4.2.5", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/node-http-handler": "^4.4.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/smithy-client": "^4.9.8", "@smithy/types": "^4.9.0", + "@smithy/url-parser": "^4.2.5", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-body-length-node": "^4.2.1", + "@smithy/util-defaults-mode-browser": "^4.3.11", + "@smithy/util-defaults-mode-node": "^4.2.14", + "@smithy/util-endpoints": "^3.2.5", + "@smithy/util-middleware": "^4.2.5", + "@smithy/util-retry": "^4.2.5", + "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-login/node_modules/@smithy/querystring-builder": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.2.5.tgz", - "integrity": "sha512-y98otMI1saoajeik2kLfGyRp11e5U/iJYH/wLCh3aTV/XutbGT9nziKGkgCaMD1ghK7p6htHMm6b6scl9JRUWg==", + "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/core": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.936.0.tgz", + "integrity": "sha512-eGJ2ySUMvgtOziHhDRDLCrj473RJoL4J1vPjVM3NrKC/fF3/LoHjkut8AAnKmrW6a2uTzNKubigw8dEnpmpERw==", "license": "Apache-2.0", "dependencies": { + "@aws-sdk/types": "3.936.0", + "@aws-sdk/xml-builder": "3.930.0", + "@smithy/core": "^3.18.5", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/property-provider": "^4.2.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/signature-v4": "^5.3.5", + "@smithy/smithy-client": "^4.9.8", "@smithy/types": "^4.9.0", - "@smithy/util-uri-escape": "^4.2.0", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-middleware": "^4.2.5", + "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-login/node_modules/@smithy/querystring-parser": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.2.5.tgz", - "integrity": "sha512-031WCTdPYgiQRYNPXznHXof2YM0GwL6SeaSyTH/P72M1Vz73TvCNH2Nq8Iu2IEPq9QP2yx0/nrw5YmSeAi/AjQ==", + "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/credential-provider-env": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.936.0.tgz", + "integrity": "sha512-dKajFuaugEA5i9gCKzOaVy9uTeZcApE+7Z5wdcZ6j40523fY1a56khDAUYkCfwqa7sHci4ccmxBkAo+fW1RChA==", "license": "Apache-2.0", "dependencies": { + "@aws-sdk/core": "3.936.0", + "@aws-sdk/types": "3.936.0", + "@smithy/property-provider": "^4.2.5", "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, @@ -25231,87 +28625,104 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-login/node_modules/@smithy/service-error-classification": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.2.5.tgz", - "integrity": "sha512-8fEvK+WPE3wUAcDvqDQG1Vk3ANLR8Px979te96m84CbKAjBVf25rPYSzb4xU4hlTyho7VhOGnh5i62D/JVF0JQ==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.9.0" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-login/node_modules/@smithy/shared-ini-file-loader": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.4.0.tgz", - "integrity": "sha512-5WmZ5+kJgJDjwXXIzr1vDTG+RhF9wzSODQBfkrQ2VVkYALKGvZX1lgVSxEkgicSAFnFhPj5rudJV0zoinqS0bA==", + "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/credential-provider-http": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.936.0.tgz", + "integrity": "sha512-5FguODLXG1tWx/x8fBxH+GVrk7Hey2LbXV5h9SFzYCx/2h50URBm0+9hndg0Rd23+xzYe14F6SI9HA9c1sPnjg==", "license": "Apache-2.0", "dependencies": { + "@aws-sdk/core": "3.936.0", + "@aws-sdk/types": "3.936.0", + "@smithy/fetch-http-handler": "^5.3.6", + "@smithy/node-http-handler": "^4.4.5", + "@smithy/property-provider": "^4.2.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/smithy-client": "^4.9.8", "@smithy/types": "^4.9.0", + "@smithy/util-stream": "^4.5.6", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-login/node_modules/@smithy/signature-v4": { - "version": "5.3.5", - "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.3.5.tgz", - "integrity": "sha512-xSUfMu1FT7ccfSXkoLl/QRQBi2rOvi3tiBZU2Tdy3I6cgvZ6SEi9QNey+lqps/sJRnogIS+lq+B1gxxbra2a/w==", + "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/credential-provider-ini": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.936.0.tgz", + "integrity": "sha512-TbUv56ERQQujoHcLMcfL0Q6bVZfYF83gu/TjHkVkdSlHPOIKaG/mhE2XZSQzXv1cud6LlgeBbfzVAxJ+HPpffg==", "license": "Apache-2.0", "dependencies": { - "@smithy/is-array-buffer": "^4.2.0", - "@smithy/protocol-http": "^5.3.5", + "@aws-sdk/core": "3.936.0", + "@aws-sdk/credential-provider-env": "3.936.0", + "@aws-sdk/credential-provider-http": "3.936.0", + "@aws-sdk/credential-provider-login": "3.936.0", + "@aws-sdk/credential-provider-process": "3.936.0", + "@aws-sdk/credential-provider-sso": "3.936.0", + "@aws-sdk/credential-provider-web-identity": "3.936.0", + "@aws-sdk/nested-clients": "3.936.0", + "@aws-sdk/types": "3.936.0", + "@smithy/credential-provider-imds": "^4.2.5", + "@smithy/property-provider": "^4.2.5", + "@smithy/shared-ini-file-loader": "^4.4.0", "@smithy/types": "^4.9.0", - "@smithy/util-hex-encoding": "^4.2.0", - "@smithy/util-middleware": "^4.2.5", - "@smithy/util-uri-escape": "^4.2.0", - "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-login/node_modules/@smithy/smithy-client": { - "version": "4.9.8", - "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.9.8.tgz", - "integrity": "sha512-8xgq3LgKDEFoIrLWBho/oYKyWByw9/corz7vuh1upv7ZBm0ZMjGYBhbn6v643WoIqA9UTcx5A5htEp/YatUwMA==", + "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/credential-provider-node": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.936.0.tgz", + "integrity": "sha512-rk/2PCtxX9xDsQW8p5Yjoca3StqmQcSfkmD7nQ61AqAHL1YgpSQWqHE+HjfGGiHDYKG7PvE33Ku2GyA7lEIJAw==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.18.5", - "@smithy/middleware-endpoint": "^4.3.12", - "@smithy/middleware-stack": "^4.2.5", - "@smithy/protocol-http": "^5.3.5", + "@aws-sdk/credential-provider-env": "3.936.0", + "@aws-sdk/credential-provider-http": "3.936.0", + "@aws-sdk/credential-provider-ini": "3.936.0", + "@aws-sdk/credential-provider-process": "3.936.0", + "@aws-sdk/credential-provider-sso": "3.936.0", + "@aws-sdk/credential-provider-web-identity": "3.936.0", + "@aws-sdk/types": "3.936.0", + "@smithy/credential-provider-imds": "^4.2.5", + "@smithy/property-provider": "^4.2.5", + "@smithy/shared-ini-file-loader": "^4.4.0", "@smithy/types": "^4.9.0", - "@smithy/util-stream": "^4.5.6", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-login/node_modules/@smithy/types": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.9.0.tgz", - "integrity": "sha512-MvUbdnXDTwykR8cB1WZvNNwqoWVaTRA0RLlLmf/cIFNMM2cKWz01X4Ly6SMC4Kks30r8tT3Cty0jmeWfiuyHTA==", + "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/credential-provider-process": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.936.0.tgz", + "integrity": "sha512-GpA4AcHb96KQK2PSPUyvChvrsEKiLhQ5NWjeef2IZ3Jc8JoosiedYqp6yhZR+S8cTysuvx56WyJIJc8y8OTrLA==", "license": "Apache-2.0", "dependencies": { + "@aws-sdk/core": "3.936.0", + "@aws-sdk/types": "3.936.0", + "@smithy/property-provider": "^4.2.5", + "@smithy/shared-ini-file-loader": "^4.4.0", + "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-login/node_modules/@smithy/url-parser": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.2.5.tgz", - "integrity": "sha512-VaxMGsilqFnK1CeBX+LXnSuaMx4sTL/6znSZh2829txWieazdVxr54HmiyTsIbpOTLcf5nYpq9lpzmwRdxj6rQ==", + "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/credential-provider-sso": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.936.0.tgz", + "integrity": "sha512-wHlEAJJvtnSyxTfNhN98JcU4taA1ED2JvuI2eePgawqBwS/Tzi0mhED1lvNIaWOkjfLd+nHALwszGrtJwEq4yQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/querystring-parser": "^4.2.5", + "@aws-sdk/client-sso": "3.936.0", + "@aws-sdk/core": "3.936.0", + "@aws-sdk/token-providers": "3.936.0", + "@aws-sdk/types": "3.936.0", + "@smithy/property-provider": "^4.2.5", + "@smithy/shared-ini-file-loader": "^4.4.0", "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, @@ -25319,95 +28730,145 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-login/node_modules/@smithy/util-base64": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-4.3.0.tgz", - "integrity": "sha512-GkXZ59JfyxsIwNTWFnjmFEI8kZpRNIBfxKjv09+nkAWPt/4aGaEWMM04m4sxgNVWkbt2MdSvE3KF/PfX4nFedQ==", + "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/credential-provider-web-identity": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.936.0.tgz", + "integrity": "sha512-v3qHAuoODkoRXsAF4RG+ZVO6q2P9yYBT4GMpMEfU9wXVNn7AIfwZgTwzSUfnjNiGva5BKleWVpRpJ9DeuLFbUg==", "license": "Apache-2.0", "dependencies": { - "@smithy/util-buffer-from": "^4.2.0", - "@smithy/util-utf8": "^4.2.0", + "@aws-sdk/core": "3.936.0", + "@aws-sdk/nested-clients": "3.936.0", + "@aws-sdk/types": "3.936.0", + "@smithy/property-provider": "^4.2.5", + "@smithy/shared-ini-file-loader": "^4.4.0", + "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-login/node_modules/@smithy/util-body-length-browser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-4.2.0.tgz", - "integrity": "sha512-Fkoh/I76szMKJnBXWPdFkQJl2r9SjPt3cMzLdOB6eJ4Pnpas8hVoWPYemX/peO0yrrvldgCUVJqOAjUrOLjbxg==", + "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/middleware-host-header": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.936.0.tgz", + "integrity": "sha512-tAaObaAnsP1XnLGndfkGWFuzrJYuk9W0b/nLvol66t8FZExIAf/WdkT2NNAWOYxljVs++oHnyHBCxIlaHrzSiw==", "license": "Apache-2.0", "dependencies": { + "@aws-sdk/types": "3.936.0", + "@smithy/protocol-http": "^5.3.5", + "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-login/node_modules/@smithy/util-body-length-node": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-4.2.1.tgz", - "integrity": "sha512-h53dz/pISVrVrfxV1iqXlx5pRg3V2YWFcSQyPyXZRrZoZj4R4DeWRDo1a7dd3CPTcFi3kE+98tuNyD2axyZReA==", + "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/middleware-logger": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.936.0.tgz", + "integrity": "sha512-aPSJ12d3a3Ea5nyEnLbijCaaYJT2QjQ9iW+zGh5QcZYXmOGWbKVyPSxmVOboZQG+c1M8t6d2O7tqrwzIq8L8qw==", "license": "Apache-2.0", "dependencies": { + "@aws-sdk/types": "3.936.0", + "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-login/node_modules/@smithy/util-buffer-from": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-4.2.0.tgz", - "integrity": "sha512-kAY9hTKulTNevM2nlRtxAG2FQ3B2OR6QIrPY3zE5LqJy1oxzmgBGsHLWTcNhWXKchgA0WHW+mZkQrng/pgcCew==", + "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/middleware-recursion-detection": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.936.0.tgz", + "integrity": "sha512-l4aGbHpXM45YNgXggIux1HgsCVAvvBoqHPkqLnqMl9QVapfuSTjJHfDYDsx1Xxct6/m7qSMUzanBALhiaGO2fA==", "license": "Apache-2.0", "dependencies": { - "@smithy/is-array-buffer": "^4.2.0", + "@aws-sdk/types": "3.936.0", + "@aws/lambda-invoke-store": "^0.2.0", + "@smithy/protocol-http": "^5.3.5", + "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-login/node_modules/@smithy/util-config-provider": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-4.2.0.tgz", - "integrity": "sha512-YEjpl6XJ36FTKmD+kRJJWYvrHeUvm5ykaUS5xK+6oXffQPHeEM4/nXlZPe+Wu0lsgRUcNZiliYNh/y7q9c2y6Q==", + "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.936.0.tgz", + "integrity": "sha512-YB40IPa7K3iaYX0lSnV9easDOLPLh+fJyUDF3BH8doX4i1AOSsYn86L4lVldmOaSX+DwiaqKHpvk4wPBdcIPWw==", "license": "Apache-2.0", "dependencies": { + "@aws-sdk/core": "3.936.0", + "@aws-sdk/types": "3.936.0", + "@aws-sdk/util-endpoints": "3.936.0", + "@smithy/core": "^3.18.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-login/node_modules/@smithy/util-defaults-mode-browser": { - "version": "4.3.11", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.3.11.tgz", - "integrity": "sha512-yHv+r6wSQXEXTPVCIQTNmXVWs7ekBTpMVErjqZoWkYN75HIFN5y9+/+sYOejfAuvxWGvgzgxbTHa/oz61YTbKw==", + "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/nested-clients": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.936.0.tgz", + "integrity": "sha512-eyj2tz1XmDSLSZQ5xnB7cLTVKkSJnYAEoNDSUNhzWPxrBDYeJzIbatecOKceKCU8NBf8gWWZCK/CSY0mDxMO0A==", "license": "Apache-2.0", "dependencies": { - "@smithy/property-provider": "^4.2.5", + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.936.0", + "@aws-sdk/middleware-host-header": "3.936.0", + "@aws-sdk/middleware-logger": "3.936.0", + "@aws-sdk/middleware-recursion-detection": "3.936.0", + "@aws-sdk/middleware-user-agent": "3.936.0", + "@aws-sdk/region-config-resolver": "3.936.0", + "@aws-sdk/types": "3.936.0", + "@aws-sdk/util-endpoints": "3.936.0", + "@aws-sdk/util-user-agent-browser": "3.936.0", + "@aws-sdk/util-user-agent-node": "3.936.0", + "@smithy/config-resolver": "^4.4.3", + "@smithy/core": "^3.18.5", + "@smithy/fetch-http-handler": "^5.3.6", + "@smithy/hash-node": "^4.2.5", + "@smithy/invalid-dependency": "^4.2.5", + "@smithy/middleware-content-length": "^4.2.5", + "@smithy/middleware-endpoint": "^4.3.12", + "@smithy/middleware-retry": "^4.4.12", + "@smithy/middleware-serde": "^4.2.6", + "@smithy/middleware-stack": "^4.2.5", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/node-http-handler": "^4.4.5", + "@smithy/protocol-http": "^5.3.5", "@smithy/smithy-client": "^4.9.8", "@smithy/types": "^4.9.0", + "@smithy/url-parser": "^4.2.5", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-body-length-node": "^4.2.1", + "@smithy/util-defaults-mode-browser": "^4.3.11", + "@smithy/util-defaults-mode-node": "^4.2.14", + "@smithy/util-endpoints": "^3.2.5", + "@smithy/util-middleware": "^4.2.5", + "@smithy/util-retry": "^4.2.5", + "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-login/node_modules/@smithy/util-defaults-mode-node": { - "version": "4.2.14", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.2.14.tgz", - "integrity": "sha512-ljZN3iRvaJUgulfvobIuG97q1iUuCMrvXAlkZ4msY+ZuVHQHDIqn7FKZCEj+bx8omz6kF5yQXms/xhzjIO5XiA==", + "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/region-config-resolver": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.936.0.tgz", + "integrity": "sha512-wOKhzzWsshXGduxO4pqSiNyL9oUtk4BEvjWm9aaq6Hmfdoydq6v6t0rAGHWPjFwy9z2haovGRi3C8IxdMB4muw==", "license": "Apache-2.0", "dependencies": { + "@aws-sdk/types": "3.936.0", "@smithy/config-resolver": "^4.4.3", - "@smithy/credential-provider-imds": "^4.2.5", "@smithy/node-config-provider": "^4.3.5", - "@smithy/property-provider": "^4.2.5", - "@smithy/smithy-client": "^4.9.8", "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, @@ -25415,13 +28876,17 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-login/node_modules/@smithy/util-endpoints": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.2.5.tgz", - "integrity": "sha512-3O63AAWu2cSNQZp+ayl9I3NapW1p1rR5mlVHcF6hAB1dPZUQFfRPYtplWX/3xrzWthPGj5FqB12taJJCfH6s8A==", + "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/token-providers": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.936.0.tgz", + "integrity": "sha512-vvw8+VXk0I+IsoxZw0mX9TMJawUJvEsg3EF7zcCSetwhNPAU8Xmlhv7E/sN/FgSmm7b7DsqKoW6rVtQiCs1PWQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/node-config-provider": "^4.3.5", + "@aws-sdk/core": "3.936.0", + "@aws-sdk/nested-clients": "3.936.0", + "@aws-sdk/types": "3.936.0", + "@smithy/property-provider": "^4.2.5", + "@smithy/shared-ini-file-loader": "^4.4.0", "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, @@ -25429,555 +28894,525 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-login/node_modules/@smithy/util-hex-encoding": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-4.2.0.tgz", - "integrity": "sha512-CCQBwJIvXMLKxVbO88IukazJD9a4kQ9ZN7/UMGBjBcJYvatpWk+9g870El4cB8/EJxfe+k+y0GmR9CAzkF+Nbw==", + "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/types": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.936.0.tgz", + "integrity": "sha512-uz0/VlMd2pP5MepdrHizd+T+OKfyK4r3OA9JI+L/lPKg0YFQosdJNCKisr6o70E3dh8iMpFYxF1UN/4uZsyARg==", "license": "Apache-2.0", "dependencies": { + "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-login/node_modules/@smithy/util-middleware": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.2.5.tgz", - "integrity": "sha512-6Y3+rvBF7+PZOc40ybeZMcGln6xJGVeY60E7jy9Mv5iKpMJpHgRE6dKy9ScsVxvfAYuEX4Q9a65DQX90KaQ3bA==", + "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/util-endpoints": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.936.0.tgz", + "integrity": "sha512-0Zx3Ntdpu+z9Wlm7JKUBOzS9EunwKAb4KdGUQQxDqh5Lc3ta5uBoub+FgmVuzwnmBu9U1Os8UuwVTH0Lgu+P5w==", "license": "Apache-2.0", "dependencies": { + "@aws-sdk/types": "3.936.0", "@smithy/types": "^4.9.0", + "@smithy/url-parser": "^4.2.5", + "@smithy/util-endpoints": "^3.2.5", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-login/node_modules/@smithy/util-retry": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.2.5.tgz", - "integrity": "sha512-GBj3+EZBbN4NAqJ/7pAhsXdfzdlznOh8PydUijy6FpNIMnHPSMO2/rP4HKu+UFeikJxShERk528oy7GT79YiJg==", + "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/util-user-agent-browser": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.936.0.tgz", + "integrity": "sha512-eZ/XF6NxMtu+iCma58GRNRxSq4lHo6zHQLOZRIeL/ghqYJirqHdenMOwrzPettj60KWlv827RVebP9oNVrwZbw==", "license": "Apache-2.0", "dependencies": { - "@smithy/service-error-classification": "^4.2.5", + "@aws-sdk/types": "3.936.0", "@smithy/types": "^4.9.0", + "bowser": "^2.11.0", "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-login/node_modules/@smithy/util-stream": { - "version": "4.5.6", - "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.5.6.tgz", - "integrity": "sha512-qWw/UM59TiaFrPevefOZ8CNBKbYEP6wBAIlLqxn3VAIo9rgnTNc4ASbVrqDmhuwI87usnjhdQrxodzAGFFzbRQ==", + "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/util-user-agent-node": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.936.0.tgz", + "integrity": "sha512-XOEc7PF9Op00pWV2AYCGDSu5iHgYjIO53Py2VUQTIvP7SRCaCsXmA33mjBvC2Ms6FhSyWNa4aK4naUGIz0hQcw==", "license": "Apache-2.0", "dependencies": { - "@smithy/fetch-http-handler": "^5.3.6", - "@smithy/node-http-handler": "^4.4.5", + "@aws-sdk/middleware-user-agent": "3.936.0", + "@aws-sdk/types": "3.936.0", + "@smithy/node-config-provider": "^4.3.5", "@smithy/types": "^4.9.0", - "@smithy/util-base64": "^4.3.0", - "@smithy/util-buffer-from": "^4.2.0", - "@smithy/util-hex-encoding": "^4.2.0", - "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" + }, + "peerDependencies": { + "aws-crt": ">=1.0.0" + }, + "peerDependenciesMeta": { + "aws-crt": { + "optional": true + } } }, - "node_modules/@aws-sdk/credential-provider-login/node_modules/@smithy/util-uri-escape": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-4.2.0.tgz", - "integrity": "sha512-igZpCKV9+E/Mzrpq6YacdTQ0qTiLm85gD6N/IrmyDvQFA4UnU3d5g3m8tMT/6zG/vVkWSU+VxeUyGonL62DuxA==", + "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/xml-builder": { + "version": "3.930.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.930.0.tgz", + "integrity": "sha512-YIfkD17GocxdmlUVc3ia52QhcWuRIUJonbF8A2CYfcWNV3HzvAqpcPeC0bYUhkK+8e8YO1ARnLKZQE0TlwzorA==", "license": "Apache-2.0", "dependencies": { + "@smithy/types": "^4.9.0", + "fast-xml-parser": "5.2.5", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-login/node_modules/@smithy/util-utf8": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.2.0.tgz", - "integrity": "sha512-zBPfuzoI8xyBtR2P6WQj63Rz8i3AmfAaJLuNG8dWsfvPe8lO4aCPYLn879mEgHndZH1zQ2oXmG8O1GGzzaoZiw==", + "node_modules/@aws-sdk/credential-providers/node_modules/@aws/lambda-invoke-store": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@aws/lambda-invoke-store/-/lambda-invoke-store-0.2.1.tgz", + "integrity": "sha512-sIyFcoPZkTtNu9xFeEoynMef3bPJIAbOfUh+ueYcfhVl6xm2VRtMcMclSxmZCMnHHd4hlYKJeq/aggmBEWynww==", "license": "Apache-2.0", - "dependencies": { - "@smithy/util-buffer-from": "^4.2.0", - "tslib": "^2.6.2" - }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-login/node_modules/fast-xml-parser": { - "version": "5.2.5", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.2.5.tgz", - "integrity": "sha512-pfX9uG9Ki0yekDHx2SiuRIyFdyAr1kMIMitPvb0YBo8SUfKvia7w7FIyd/l6av85pFYRhZscS75MwMnbvY+hcQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - } - ], - "license": "MIT", - "dependencies": { - "strnum": "^2.1.0" - }, - "bin": { - "fxparser": "src/cli/cli.js" - } - }, - "node_modules/@aws-sdk/credential-provider-login/node_modules/strnum": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.1.1.tgz", - "integrity": "sha512-7ZvoFTiCnGxBtDqJ//Cu6fWtZtc7Y3x+QOirG15wztbdngGSkht27o2pyGWrVy0b4WAy3jbKmnoK6g5VlVNUUw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - } - ], - "license": "MIT" - }, - "node_modules/@aws-sdk/credential-provider-node": { - "version": "3.637.0", + "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/abort-controller": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.2.5.tgz", + "integrity": "sha512-j7HwVkBw68YW8UmFRcjZOmssE77Rvk0GWAIN1oFBhsaovQmZWYCIcGa9/pwRB0ExI8Sk9MWNALTjftjHZea7VA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/credential-provider-env": "3.620.1", - "@aws-sdk/credential-provider-http": "3.635.0", - "@aws-sdk/credential-provider-ini": "3.637.0", - "@aws-sdk/credential-provider-process": "3.620.1", - "@aws-sdk/credential-provider-sso": "3.637.0", - "@aws-sdk/credential-provider-web-identity": "3.621.0", - "@aws-sdk/types": "3.609.0", - "@smithy/credential-provider-imds": "^3.2.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", + "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-node/node_modules/@aws-sdk/credential-provider-env": { - "version": "3.620.1", + "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/config-resolver": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.4.3.tgz", + "integrity": "sha512-ezHLe1tKLUxDJo2LHtDuEDyWXolw8WGOR92qb4bQdWq/zKenO5BvctZGrVJBK08zjezSk7bmbKFOXIVyChvDLw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/types": "^3.3.0", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/types": "^4.9.0", + "@smithy/util-config-provider": "^4.2.0", + "@smithy/util-endpoints": "^3.2.5", + "@smithy/util-middleware": "^4.2.5", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-node/node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.637.0", + "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/core": { + "version": "3.18.5", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.18.5.tgz", + "integrity": "sha512-6gnIz3h+PEPQGDj8MnRSjDvKBah042jEoPgjFGJ4iJLBE78L4lY/n98x14XyPF4u3lN179Ub/ZKFY5za9GeLQw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/credential-provider-env": "3.620.1", - "@aws-sdk/credential-provider-http": "3.635.0", - "@aws-sdk/credential-provider-process": "3.620.1", - "@aws-sdk/credential-provider-sso": "3.637.0", - "@aws-sdk/credential-provider-web-identity": "3.621.0", - "@aws-sdk/types": "3.609.0", - "@smithy/credential-provider-imds": "^3.2.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", + "@smithy/middleware-serde": "^4.2.6", + "@smithy/protocol-http": "^5.3.5", + "@smithy/types": "^4.9.0", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-middleware": "^4.2.5", + "@smithy/util-stream": "^4.5.6", + "@smithy/util-utf8": "^4.2.0", + "@smithy/uuid": "^1.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sts": "^3.637.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-node/node_modules/@aws-sdk/credential-provider-process": { - "version": "3.620.1", + "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/credential-provider-imds": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.2.5.tgz", + "integrity": "sha512-BZwotjoZWn9+36nimwm/OLIcVe+KYRwzMjfhd4QT7QxPm9WY0HiOV8t/Wlh+HVUif0SBVV7ksq8//hPaBC/okQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/property-provider": "^4.2.5", + "@smithy/types": "^4.9.0", + "@smithy/url-parser": "^4.2.5", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-node/node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.621.0", + "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/fetch-http-handler": { + "version": "5.3.6", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.3.6.tgz", + "integrity": "sha512-3+RG3EA6BBJ/ofZUeTFJA7mHfSYrZtQIrDP9dI8Lf7X6Jbos2jptuLrAAteDiFVrmbEmLSuRG/bUKzfAXk7dhg==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/types": "^3.3.0", + "@smithy/protocol-http": "^5.3.5", + "@smithy/querystring-builder": "^4.2.5", + "@smithy/types": "^4.9.0", + "@smithy/util-base64": "^4.3.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sts": "^3.621.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-node/node_modules/@aws-sdk/types": { - "version": "3.609.0", + "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/hash-node": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.2.5.tgz", + "integrity": "sha512-DpYX914YOfA3UDT9CN1BM787PcHfWRBB43fFGCYrZFUH0Jv+5t8yYl+Pd5PW4+QzoGEDvn5d5QIO4j2HyYZQSA==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^3.3.0", + "@smithy/types": "^4.9.0", + "@smithy/util-buffer-from": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-process": { - "version": "3.693.0", + "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/invalid-dependency": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.2.5.tgz", + "integrity": "sha512-2L2erASEro1WC5nV+plwIMxrTXpvpfzl4e+Nre6vBVRR2HKeGGcvpJyyL3/PpiSg+cJG2KpTmZmq934Olb6e5A==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.693.0", - "@aws-sdk/types": "3.692.0", - "@smithy/property-provider": "^3.1.9", - "@smithy/shared-ini-file-loader": "^3.1.10", - "@smithy/types": "^3.7.0", + "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-process/node_modules/@aws-sdk/core": { - "version": "3.693.0", + "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/is-array-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-4.2.0.tgz", + "integrity": "sha512-DZZZBvC7sjcYh4MazJSGiWMI2L7E0oCiRHREDzIxi/M2LY79/21iXt6aPLHge82wi5LsuRF5A06Ds3+0mlh6CQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.692.0", - "@smithy/core": "^2.5.2", - "@smithy/node-config-provider": "^3.1.10", - "@smithy/property-provider": "^3.1.9", - "@smithy/protocol-http": "^4.1.6", - "@smithy/signature-v4": "^4.2.2", - "@smithy/smithy-client": "^3.4.3", - "@smithy/types": "^3.7.0", - "@smithy/util-middleware": "^3.0.9", - "fast-xml-parser": "4.4.1", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.637.0", + "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/middleware-content-length": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.2.5.tgz", + "integrity": "sha512-Y/RabVa5vbl5FuHYV2vUCwvh/dqzrEY/K2yWPSqvhFUwIY0atLqO4TienjBXakoy4zrKAMCZwg+YEqmH7jaN7A==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/client-sso": "3.637.0", - "@aws-sdk/token-providers": "3.614.0", - "@aws-sdk/types": "3.609.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", + "@smithy/protocol-http": "^5.3.5", + "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-sso/node_modules/@aws-sdk/types": { - "version": "3.609.0", + "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/middleware-endpoint": { + "version": "4.3.12", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.3.12.tgz", + "integrity": "sha512-9pAX/H+VQPzNbouhDhkW723igBMLgrI8OtX+++M7iKJgg/zY/Ig3i1e6seCcx22FWhE6Q/S61BRdi2wXBORT+A==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^3.3.0", + "@smithy/core": "^3.18.5", + "@smithy/middleware-serde": "^4.2.6", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/shared-ini-file-loader": "^4.4.0", + "@smithy/types": "^4.9.0", + "@smithy/url-parser": "^4.2.5", + "@smithy/util-middleware": "^4.2.5", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.758.0", + "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/middleware-retry": { + "version": "4.4.12", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.4.12.tgz", + "integrity": "sha512-S4kWNKFowYd0lID7/DBqWHOQxmxlsf0jBaos9chQZUWTVOjSW1Ogyh8/ib5tM+agFDJ/TCxuCTvrnlc+9cIBcQ==", "license": "Apache-2.0", - "peer": true, "dependencies": { - "@aws-sdk/core": "3.758.0", - "@aws-sdk/nested-clients": "3.758.0", - "@aws-sdk/types": "3.734.0", - "@smithy/property-provider": "^4.0.1", - "@smithy/types": "^4.1.0", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/service-error-classification": "^4.2.5", + "@smithy/smithy-client": "^4.9.8", + "@smithy/types": "^4.9.0", + "@smithy/util-middleware": "^4.2.5", + "@smithy/util-retry": "^4.2.5", + "@smithy/uuid": "^1.1.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-web-identity/node_modules/@aws-sdk/core": { - "version": "3.758.0", + "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/middleware-serde": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.2.6.tgz", + "integrity": "sha512-VkLoE/z7e2g8pirwisLz8XJWedUSY8my/qrp81VmAdyrhi94T+riBfwP+AOEEFR9rFTSonC/5D2eWNmFabHyGQ==", "license": "Apache-2.0", - "peer": true, "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", + "@smithy/protocol-http": "^5.3.5", + "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-web-identity/node_modules/@aws-sdk/types": { - "version": "3.734.0", + "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/middleware-stack": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.2.5.tgz", + "integrity": "sha512-bYrutc+neOyWxtZdbB2USbQttZN0mXaOyYLIsaTbJhFsfpXyGWUxJpEuO1rJ8IIJm2qH4+xJT0mxUSsEDTYwdQ==", "license": "Apache-2.0", - "peer": true, "dependencies": { - "@smithy/types": "^4.1.0", + "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-web-identity/node_modules/@smithy/abort-controller": { - "version": "4.0.1", + "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/node-config-provider": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.3.5.tgz", + "integrity": "sha512-UTurh1C4qkVCtqggI36DGbLB2Kv8UlcFdMXDcWMbqVY2uRg0XmT9Pb4Vj6oSQ34eizO1fvR0RnFV4Axw4IrrAg==", "license": "Apache-2.0", - "peer": true, "dependencies": { - "@smithy/types": "^4.1.0", + "@smithy/property-provider": "^4.2.5", + "@smithy/shared-ini-file-loader": "^4.4.0", + "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-web-identity/node_modules/@smithy/core": { - "version": "3.1.5", + "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/node-http-handler": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.4.5.tgz", + "integrity": "sha512-CMnzM9R2WqlqXQGtIlsHMEZfXKJVTIrqCNoSd/QpAyp+Dw0a1Vps13l6ma1fH8g7zSPNsA59B/kWgeylFuA/lw==", "license": "Apache-2.0", - "peer": true, "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", + "@smithy/abort-controller": "^4.2.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/querystring-builder": "^4.2.5", + "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-web-identity/node_modules/@smithy/fetch-http-handler": { - "version": "5.0.1", + "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/property-provider": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.2.5.tgz", + "integrity": "sha512-8iLN1XSE1rl4MuxvQ+5OSk/Zb5El7NJZ1td6Tn+8dQQHIjp59Lwl6bd0+nzw6SKm2wSSriH2v/I9LPzUic7EOg==", "license": "Apache-2.0", - "peer": true, "dependencies": { - "@smithy/protocol-http": "^5.0.1", - "@smithy/querystring-builder": "^4.0.1", - "@smithy/types": "^4.1.0", - "@smithy/util-base64": "^4.0.0", + "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-web-identity/node_modules/@smithy/is-array-buffer": { - "version": "4.0.0", + "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/protocol-http": { + "version": "5.3.5", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.3.5.tgz", + "integrity": "sha512-RlaL+sA0LNMp03bf7XPbFmT5gN+w3besXSWMkA8rcmxLSVfiEXElQi4O2IWwPfxzcHkxqrwBFMbngB8yx/RvaQ==", "license": "Apache-2.0", - "peer": true, "dependencies": { + "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-web-identity/node_modules/@smithy/middleware-endpoint": { - "version": "4.0.6", + "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/querystring-builder": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.2.5.tgz", + "integrity": "sha512-y98otMI1saoajeik2kLfGyRp11e5U/iJYH/wLCh3aTV/XutbGT9nziKGkgCaMD1ghK7p6htHMm6b6scl9JRUWg==", "license": "Apache-2.0", - "peer": true, "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", + "@smithy/types": "^4.9.0", + "@smithy/util-uri-escape": "^4.2.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-web-identity/node_modules/@smithy/middleware-serde": { - "version": "4.0.2", + "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/querystring-parser": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.2.5.tgz", + "integrity": "sha512-031WCTdPYgiQRYNPXznHXof2YM0GwL6SeaSyTH/P72M1Vz73TvCNH2Nq8Iu2IEPq9QP2yx0/nrw5YmSeAi/AjQ==", "license": "Apache-2.0", - "peer": true, "dependencies": { - "@smithy/types": "^4.1.0", + "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-web-identity/node_modules/@smithy/middleware-stack": { - "version": "4.0.1", + "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/service-error-classification": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.2.5.tgz", + "integrity": "sha512-8fEvK+WPE3wUAcDvqDQG1Vk3ANLR8Px979te96m84CbKAjBVf25rPYSzb4xU4hlTyho7VhOGnh5i62D/JVF0JQ==", "license": "Apache-2.0", - "peer": true, "dependencies": { - "@smithy/types": "^4.1.0", - "tslib": "^2.6.2" + "@smithy/types": "^4.9.0" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-web-identity/node_modules/@smithy/node-config-provider": { - "version": "4.0.1", + "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/shared-ini-file-loader": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.4.0.tgz", + "integrity": "sha512-5WmZ5+kJgJDjwXXIzr1vDTG+RhF9wzSODQBfkrQ2VVkYALKGvZX1lgVSxEkgicSAFnFhPj5rudJV0zoinqS0bA==", "license": "Apache-2.0", - "peer": true, "dependencies": { - "@smithy/property-provider": "^4.0.1", - "@smithy/shared-ini-file-loader": "^4.0.1", - "@smithy/types": "^4.1.0", + "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-web-identity/node_modules/@smithy/node-http-handler": { - "version": "4.0.3", + "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/signature-v4": { + "version": "5.3.5", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.3.5.tgz", + "integrity": "sha512-xSUfMu1FT7ccfSXkoLl/QRQBi2rOvi3tiBZU2Tdy3I6cgvZ6SEi9QNey+lqps/sJRnogIS+lq+B1gxxbra2a/w==", "license": "Apache-2.0", - "peer": true, "dependencies": { - "@smithy/abort-controller": "^4.0.1", - "@smithy/protocol-http": "^5.0.1", - "@smithy/querystring-builder": "^4.0.1", - "@smithy/types": "^4.1.0", + "@smithy/is-array-buffer": "^4.2.0", + "@smithy/protocol-http": "^5.3.5", + "@smithy/types": "^4.9.0", + "@smithy/util-hex-encoding": "^4.2.0", + "@smithy/util-middleware": "^4.2.5", + "@smithy/util-uri-escape": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-web-identity/node_modules/@smithy/property-provider": { - "version": "4.0.1", + "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/smithy-client": { + "version": "4.9.8", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.9.8.tgz", + "integrity": "sha512-8xgq3LgKDEFoIrLWBho/oYKyWByw9/corz7vuh1upv7ZBm0ZMjGYBhbn6v643WoIqA9UTcx5A5htEp/YatUwMA==", "license": "Apache-2.0", - "peer": true, "dependencies": { - "@smithy/types": "^4.1.0", + "@smithy/core": "^3.18.5", + "@smithy/middleware-endpoint": "^4.3.12", + "@smithy/middleware-stack": "^4.2.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/types": "^4.9.0", + "@smithy/util-stream": "^4.5.6", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-web-identity/node_modules/@smithy/protocol-http": { - "version": "5.0.1", + "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/types": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.9.0.tgz", + "integrity": "sha512-MvUbdnXDTwykR8cB1WZvNNwqoWVaTRA0RLlLmf/cIFNMM2cKWz01X4Ly6SMC4Kks30r8tT3Cty0jmeWfiuyHTA==", "license": "Apache-2.0", - "peer": true, "dependencies": { - "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-web-identity/node_modules/@smithy/querystring-builder": { - "version": "4.0.1", + "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/url-parser": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.2.5.tgz", + "integrity": "sha512-VaxMGsilqFnK1CeBX+LXnSuaMx4sTL/6znSZh2829txWieazdVxr54HmiyTsIbpOTLcf5nYpq9lpzmwRdxj6rQ==", "license": "Apache-2.0", - "peer": true, "dependencies": { - "@smithy/types": "^4.1.0", - "@smithy/util-uri-escape": "^4.0.0", + "@smithy/querystring-parser": "^4.2.5", + "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-web-identity/node_modules/@smithy/querystring-parser": { - "version": "4.0.1", + "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/util-base64": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-4.3.0.tgz", + "integrity": "sha512-GkXZ59JfyxsIwNTWFnjmFEI8kZpRNIBfxKjv09+nkAWPt/4aGaEWMM04m4sxgNVWkbt2MdSvE3KF/PfX4nFedQ==", "license": "Apache-2.0", - "peer": true, "dependencies": { - "@smithy/types": "^4.1.0", + "@smithy/util-buffer-from": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-web-identity/node_modules/@smithy/shared-ini-file-loader": { - "version": "4.0.1", + "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/util-body-length-browser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-4.2.0.tgz", + "integrity": "sha512-Fkoh/I76szMKJnBXWPdFkQJl2r9SjPt3cMzLdOB6eJ4Pnpas8hVoWPYemX/peO0yrrvldgCUVJqOAjUrOLjbxg==", "license": "Apache-2.0", - "peer": true, "dependencies": { - "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-web-identity/node_modules/@smithy/signature-v4": { - "version": "5.0.1", + "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/util-body-length-node": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-4.2.1.tgz", + "integrity": "sha512-h53dz/pISVrVrfxV1iqXlx5pRg3V2YWFcSQyPyXZRrZoZj4R4DeWRDo1a7dd3CPTcFi3kE+98tuNyD2axyZReA==", "license": "Apache-2.0", - "peer": true, "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-sdk/credential-provider-web-identity/node_modules/@smithy/smithy-client": { - "version": "4.1.6", + "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/util-buffer-from": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-4.2.0.tgz", + "integrity": "sha512-kAY9hTKulTNevM2nlRtxAG2FQ3B2OR6QIrPY3zE5LqJy1oxzmgBGsHLWTcNhWXKchgA0WHW+mZkQrng/pgcCew==", "license": "Apache-2.0", - "peer": true, "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", + "@smithy/is-array-buffer": "^4.2.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-web-identity/node_modules/@smithy/types": { - "version": "4.1.0", + "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/util-config-provider": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-4.2.0.tgz", + "integrity": "sha512-YEjpl6XJ36FTKmD+kRJJWYvrHeUvm5ykaUS5xK+6oXffQPHeEM4/nXlZPe+Wu0lsgRUcNZiliYNh/y7q9c2y6Q==", "license": "Apache-2.0", - "peer": true, "dependencies": { "tslib": "^2.6.2" }, @@ -25985,100 +29420,116 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-web-identity/node_modules/@smithy/url-parser": { - "version": "4.0.1", + "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/util-defaults-mode-browser": { + "version": "4.3.11", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.3.11.tgz", + "integrity": "sha512-yHv+r6wSQXEXTPVCIQTNmXVWs7ekBTpMVErjqZoWkYN75HIFN5y9+/+sYOejfAuvxWGvgzgxbTHa/oz61YTbKw==", "license": "Apache-2.0", - "peer": true, "dependencies": { - "@smithy/querystring-parser": "^4.0.1", - "@smithy/types": "^4.1.0", + "@smithy/property-provider": "^4.2.5", + "@smithy/smithy-client": "^4.9.8", + "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-web-identity/node_modules/@smithy/util-base64": { - "version": "4.0.0", + "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/util-defaults-mode-node": { + "version": "4.2.14", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.2.14.tgz", + "integrity": "sha512-ljZN3iRvaJUgulfvobIuG97q1iUuCMrvXAlkZ4msY+ZuVHQHDIqn7FKZCEj+bx8omz6kF5yQXms/xhzjIO5XiA==", "license": "Apache-2.0", - "peer": true, "dependencies": { - "@smithy/util-buffer-from": "^4.0.0", - "@smithy/util-utf8": "^4.0.0", + "@smithy/config-resolver": "^4.4.3", + "@smithy/credential-provider-imds": "^4.2.5", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/property-provider": "^4.2.5", + "@smithy/smithy-client": "^4.9.8", + "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-web-identity/node_modules/@smithy/util-body-length-browser": { - "version": "4.0.0", + "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/util-endpoints": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.2.5.tgz", + "integrity": "sha512-3O63AAWu2cSNQZp+ayl9I3NapW1p1rR5mlVHcF6hAB1dPZUQFfRPYtplWX/3xrzWthPGj5FqB12taJJCfH6s8A==", "license": "Apache-2.0", - "peer": true, "dependencies": { + "@smithy/node-config-provider": "^4.3.5", + "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-web-identity/node_modules/@smithy/util-buffer-from": { - "version": "4.0.0", + "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/util-hex-encoding": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-4.2.0.tgz", + "integrity": "sha512-CCQBwJIvXMLKxVbO88IukazJD9a4kQ9ZN7/UMGBjBcJYvatpWk+9g870El4cB8/EJxfe+k+y0GmR9CAzkF+Nbw==", "license": "Apache-2.0", - "peer": true, "dependencies": { - "@smithy/is-array-buffer": "^4.0.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-web-identity/node_modules/@smithy/util-hex-encoding": { - "version": "4.0.0", + "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/util-middleware": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.2.5.tgz", + "integrity": "sha512-6Y3+rvBF7+PZOc40ybeZMcGln6xJGVeY60E7jy9Mv5iKpMJpHgRE6dKy9ScsVxvfAYuEX4Q9a65DQX90KaQ3bA==", "license": "Apache-2.0", - "peer": true, "dependencies": { + "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-web-identity/node_modules/@smithy/util-middleware": { - "version": "4.0.1", + "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/util-retry": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.2.5.tgz", + "integrity": "sha512-GBj3+EZBbN4NAqJ/7pAhsXdfzdlznOh8PydUijy6FpNIMnHPSMO2/rP4HKu+UFeikJxShERk528oy7GT79YiJg==", "license": "Apache-2.0", - "peer": true, "dependencies": { - "@smithy/types": "^4.1.0", + "@smithy/service-error-classification": "^4.2.5", + "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-web-identity/node_modules/@smithy/util-stream": { - "version": "4.1.2", + "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/util-stream": { + "version": "4.5.6", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.5.6.tgz", + "integrity": "sha512-qWw/UM59TiaFrPevefOZ8CNBKbYEP6wBAIlLqxn3VAIo9rgnTNc4ASbVrqDmhuwI87usnjhdQrxodzAGFFzbRQ==", "license": "Apache-2.0", - "peer": true, "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/fetch-http-handler": "^5.3.6", + "@smithy/node-http-handler": "^4.4.5", + "@smithy/types": "^4.9.0", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-buffer-from": "^4.2.0", + "@smithy/util-hex-encoding": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-web-identity/node_modules/@smithy/util-uri-escape": { - "version": "4.0.0", + "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/util-uri-escape": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-4.2.0.tgz", + "integrity": "sha512-igZpCKV9+E/Mzrpq6YacdTQ0qTiLm85gD6N/IrmyDvQFA4UnU3d5g3m8tMT/6zG/vVkWSU+VxeUyGonL62DuxA==", "license": "Apache-2.0", - "peer": true, "dependencies": { "tslib": "^2.6.2" }, @@ -26086,661 +29537,545 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-web-identity/node_modules/@smithy/util-utf8": { - "version": "4.0.0", + "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/util-utf8": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.2.0.tgz", + "integrity": "sha512-zBPfuzoI8xyBtR2P6WQj63Rz8i3AmfAaJLuNG8dWsfvPe8lO4aCPYLn879mEgHndZH1zQ2oXmG8O1GGzzaoZiw==", "license": "Apache-2.0", - "peer": true, "dependencies": { - "@smithy/util-buffer-from": "^4.0.0", + "@smithy/util-buffer-from": "^4.2.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-providers": { - "version": "3.936.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.936.0.tgz", - "integrity": "sha512-RWiX6wuReeEU7/P7apGwWMNO7nrai/CXmMMaho3+pJW7i6ImosgsjSe5tetdv1r4djOtM1b4J4WAbHPKJUahUg==", - "license": "Apache-2.0", + "node_modules/@aws-sdk/credential-providers/node_modules/fast-xml-parser": { + "version": "5.2.5", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.2.5.tgz", + "integrity": "sha512-pfX9uG9Ki0yekDHx2SiuRIyFdyAr1kMIMitPvb0YBo8SUfKvia7w7FIyd/l6av85pFYRhZscS75MwMnbvY+hcQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", "dependencies": { - "@aws-sdk/client-cognito-identity": "3.936.0", - "@aws-sdk/core": "3.936.0", - "@aws-sdk/credential-provider-cognito-identity": "3.936.0", - "@aws-sdk/credential-provider-env": "3.936.0", - "@aws-sdk/credential-provider-http": "3.936.0", - "@aws-sdk/credential-provider-ini": "3.936.0", - "@aws-sdk/credential-provider-login": "3.936.0", - "@aws-sdk/credential-provider-node": "3.936.0", - "@aws-sdk/credential-provider-process": "3.936.0", - "@aws-sdk/credential-provider-sso": "3.936.0", - "@aws-sdk/credential-provider-web-identity": "3.936.0", - "@aws-sdk/nested-clients": "3.936.0", - "@aws-sdk/types": "3.936.0", - "@smithy/config-resolver": "^4.4.3", - "@smithy/core": "^3.18.5", - "@smithy/credential-provider-imds": "^4.2.5", - "@smithy/node-config-provider": "^4.3.5", - "@smithy/property-provider": "^4.2.5", - "@smithy/types": "^4.9.0", - "tslib": "^2.6.2" + "strnum": "^2.1.0" }, - "engines": { - "node": ">=18.0.0" + "bin": { + "fxparser": "src/cli/cli.js" } }, - "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/client-cognito-identity": { - "version": "3.936.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.936.0.tgz", - "integrity": "sha512-AkJZ426y0G8Lsyi9p7mWudacMKeo8XLZOfxUmeThMkDa3GxGQ1y6BTrOj6ZcvqQ1Hz7Abb3QWPC+EMqhu1Lncw==", + "node_modules/@aws-sdk/credential-providers/node_modules/strnum": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.1.1.tgz", + "integrity": "sha512-7ZvoFTiCnGxBtDqJ//Cu6fWtZtc7Y3x+QOirG15wztbdngGSkht27o2pyGWrVy0b4WAy3jbKmnoK6g5VlVNUUw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT" + }, + "node_modules/@aws-sdk/lib-storage": { + "version": "3.693.0", "license": "Apache-2.0", "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.936.0", - "@aws-sdk/credential-provider-node": "3.936.0", - "@aws-sdk/middleware-host-header": "3.936.0", - "@aws-sdk/middleware-logger": "3.936.0", - "@aws-sdk/middleware-recursion-detection": "3.936.0", - "@aws-sdk/middleware-user-agent": "3.936.0", - "@aws-sdk/region-config-resolver": "3.936.0", - "@aws-sdk/types": "3.936.0", - "@aws-sdk/util-endpoints": "3.936.0", - "@aws-sdk/util-user-agent-browser": "3.936.0", - "@aws-sdk/util-user-agent-node": "3.936.0", - "@smithy/config-resolver": "^4.4.3", - "@smithy/core": "^3.18.5", - "@smithy/fetch-http-handler": "^5.3.6", - "@smithy/hash-node": "^4.2.5", - "@smithy/invalid-dependency": "^4.2.5", - "@smithy/middleware-content-length": "^4.2.5", - "@smithy/middleware-endpoint": "^4.3.12", - "@smithy/middleware-retry": "^4.4.12", - "@smithy/middleware-serde": "^4.2.6", - "@smithy/middleware-stack": "^4.2.5", - "@smithy/node-config-provider": "^4.3.5", - "@smithy/node-http-handler": "^4.4.5", - "@smithy/protocol-http": "^5.3.5", - "@smithy/smithy-client": "^4.9.8", - "@smithy/types": "^4.9.0", - "@smithy/url-parser": "^4.2.5", - "@smithy/util-base64": "^4.3.0", - "@smithy/util-body-length-browser": "^4.2.0", - "@smithy/util-body-length-node": "^4.2.1", - "@smithy/util-defaults-mode-browser": "^4.3.11", - "@smithy/util-defaults-mode-node": "^4.2.14", - "@smithy/util-endpoints": "^3.2.5", - "@smithy/util-middleware": "^4.2.5", - "@smithy/util-retry": "^4.2.5", - "@smithy/util-utf8": "^4.2.0", + "@smithy/abort-controller": "^3.1.7", + "@smithy/middleware-endpoint": "^3.2.2", + "@smithy/smithy-client": "^3.4.3", + "buffer": "5.6.0", + "events": "3.3.0", + "stream-browserify": "3.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-s3": "^3.693.0" } }, - "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/client-sso": { - "version": "3.936.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.936.0.tgz", - "integrity": "sha512-0G73S2cDqYwJVvqL08eakj79MZG2QRaB56Ul8/Ps9oQxllr7DMI1IQ/N3j3xjxgpq/U36pkoFZ8aK1n7Sbr3IQ==", - "license": "Apache-2.0", + "node_modules/@aws-sdk/lib-storage/node_modules/buffer": { + "version": "5.6.0", + "license": "MIT", "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.936.0", - "@aws-sdk/middleware-host-header": "3.936.0", - "@aws-sdk/middleware-logger": "3.936.0", - "@aws-sdk/middleware-recursion-detection": "3.936.0", - "@aws-sdk/middleware-user-agent": "3.936.0", - "@aws-sdk/region-config-resolver": "3.936.0", - "@aws-sdk/types": "3.936.0", - "@aws-sdk/util-endpoints": "3.936.0", - "@aws-sdk/util-user-agent-browser": "3.936.0", - "@aws-sdk/util-user-agent-node": "3.936.0", - "@smithy/config-resolver": "^4.4.3", - "@smithy/core": "^3.18.5", - "@smithy/fetch-http-handler": "^5.3.6", - "@smithy/hash-node": "^4.2.5", - "@smithy/invalid-dependency": "^4.2.5", - "@smithy/middleware-content-length": "^4.2.5", - "@smithy/middleware-endpoint": "^4.3.12", - "@smithy/middleware-retry": "^4.4.12", - "@smithy/middleware-serde": "^4.2.6", - "@smithy/middleware-stack": "^4.2.5", - "@smithy/node-config-provider": "^4.3.5", - "@smithy/node-http-handler": "^4.4.5", - "@smithy/protocol-http": "^5.3.5", - "@smithy/smithy-client": "^4.9.8", - "@smithy/types": "^4.9.0", - "@smithy/url-parser": "^4.2.5", - "@smithy/util-base64": "^4.3.0", - "@smithy/util-body-length-browser": "^4.2.0", - "@smithy/util-body-length-node": "^4.2.1", - "@smithy/util-defaults-mode-browser": "^4.3.11", - "@smithy/util-defaults-mode-node": "^4.2.14", - "@smithy/util-endpoints": "^3.2.5", - "@smithy/util-middleware": "^4.2.5", - "@smithy/util-retry": "^4.2.5", - "@smithy/util-utf8": "^4.2.0", + "base64-js": "^1.0.2", + "ieee754": "^1.1.4" + } + }, + "node_modules/@aws-sdk/lib-storage/node_modules/events": { + "version": "3.3.0", + "license": "MIT", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/@aws-sdk/middleware-bucket-endpoint": { + "version": "3.693.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.692.0", + "@aws-sdk/util-arn-parser": "3.693.0", + "@smithy/node-config-provider": "^3.1.10", + "@smithy/protocol-http": "^4.1.6", + "@smithy/types": "^3.7.0", + "@smithy/util-config-provider": "^3.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/core": { - "version": "3.936.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.936.0.tgz", - "integrity": "sha512-eGJ2ySUMvgtOziHhDRDLCrj473RJoL4J1vPjVM3NrKC/fF3/LoHjkut8AAnKmrW6a2uTzNKubigw8dEnpmpERw==", + "node_modules/@aws-sdk/middleware-expect-continue": { + "version": "3.693.0", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.936.0", - "@aws-sdk/xml-builder": "3.930.0", - "@smithy/core": "^3.18.5", - "@smithy/node-config-provider": "^4.3.5", - "@smithy/property-provider": "^4.2.5", - "@smithy/protocol-http": "^5.3.5", - "@smithy/signature-v4": "^5.3.5", - "@smithy/smithy-client": "^4.9.8", - "@smithy/types": "^4.9.0", - "@smithy/util-base64": "^4.3.0", - "@smithy/util-middleware": "^4.2.5", - "@smithy/util-utf8": "^4.2.0", + "@aws-sdk/types": "3.692.0", + "@smithy/protocol-http": "^4.1.6", + "@smithy/types": "^3.7.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/credential-provider-env": { - "version": "3.936.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.936.0.tgz", - "integrity": "sha512-dKajFuaugEA5i9gCKzOaVy9uTeZcApE+7Z5wdcZ6j40523fY1a56khDAUYkCfwqa7sHci4ccmxBkAo+fW1RChA==", + "node_modules/@aws-sdk/middleware-flexible-checksums": { + "version": "3.693.0", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.936.0", - "@aws-sdk/types": "3.936.0", - "@smithy/property-provider": "^4.2.5", - "@smithy/types": "^4.9.0", + "@aws-crypto/crc32": "5.2.0", + "@aws-crypto/crc32c": "5.2.0", + "@aws-crypto/util": "5.2.0", + "@aws-sdk/core": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@smithy/is-array-buffer": "^3.0.0", + "@smithy/node-config-provider": "^3.1.10", + "@smithy/protocol-http": "^4.1.6", + "@smithy/types": "^3.7.0", + "@smithy/util-middleware": "^3.0.9", + "@smithy/util-stream": "^3.3.0", + "@smithy/util-utf8": "^3.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/credential-provider-http": { - "version": "3.936.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.936.0.tgz", - "integrity": "sha512-5FguODLXG1tWx/x8fBxH+GVrk7Hey2LbXV5h9SFzYCx/2h50URBm0+9hndg0Rd23+xzYe14F6SI9HA9c1sPnjg==", + "node_modules/@aws-sdk/middleware-flexible-checksums/node_modules/@aws-sdk/core": { + "version": "3.693.0", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.936.0", - "@aws-sdk/types": "3.936.0", - "@smithy/fetch-http-handler": "^5.3.6", - "@smithy/node-http-handler": "^4.4.5", - "@smithy/property-provider": "^4.2.5", - "@smithy/protocol-http": "^5.3.5", - "@smithy/smithy-client": "^4.9.8", - "@smithy/types": "^4.9.0", - "@smithy/util-stream": "^4.5.6", + "@aws-sdk/types": "3.692.0", + "@smithy/core": "^2.5.2", + "@smithy/node-config-provider": "^3.1.10", + "@smithy/property-provider": "^3.1.9", + "@smithy/protocol-http": "^4.1.6", + "@smithy/signature-v4": "^4.2.2", + "@smithy/smithy-client": "^3.4.3", + "@smithy/types": "^3.7.0", + "@smithy/util-middleware": "^3.0.9", + "fast-xml-parser": "4.4.1", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.936.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.936.0.tgz", - "integrity": "sha512-TbUv56ERQQujoHcLMcfL0Q6bVZfYF83gu/TjHkVkdSlHPOIKaG/mhE2XZSQzXv1cud6LlgeBbfzVAxJ+HPpffg==", + "node_modules/@aws-sdk/middleware-flexible-checksums/node_modules/@smithy/is-array-buffer": { + "version": "3.0.0", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.936.0", - "@aws-sdk/credential-provider-env": "3.936.0", - "@aws-sdk/credential-provider-http": "3.936.0", - "@aws-sdk/credential-provider-login": "3.936.0", - "@aws-sdk/credential-provider-process": "3.936.0", - "@aws-sdk/credential-provider-sso": "3.936.0", - "@aws-sdk/credential-provider-web-identity": "3.936.0", - "@aws-sdk/nested-clients": "3.936.0", - "@aws-sdk/types": "3.936.0", - "@smithy/credential-provider-imds": "^4.2.5", - "@smithy/property-provider": "^4.2.5", - "@smithy/shared-ini-file-loader": "^4.4.0", - "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/credential-provider-node": { - "version": "3.936.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.936.0.tgz", - "integrity": "sha512-rk/2PCtxX9xDsQW8p5Yjoca3StqmQcSfkmD7nQ61AqAHL1YgpSQWqHE+HjfGGiHDYKG7PvE33Ku2GyA7lEIJAw==", + "node_modules/@aws-sdk/middleware-flexible-checksums/node_modules/@smithy/util-buffer-from": { + "version": "3.0.0", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/credential-provider-env": "3.936.0", - "@aws-sdk/credential-provider-http": "3.936.0", - "@aws-sdk/credential-provider-ini": "3.936.0", - "@aws-sdk/credential-provider-process": "3.936.0", - "@aws-sdk/credential-provider-sso": "3.936.0", - "@aws-sdk/credential-provider-web-identity": "3.936.0", - "@aws-sdk/types": "3.936.0", - "@smithy/credential-provider-imds": "^4.2.5", - "@smithy/property-provider": "^4.2.5", - "@smithy/shared-ini-file-loader": "^4.4.0", - "@smithy/types": "^4.9.0", + "@smithy/is-array-buffer": "^3.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/credential-provider-process": { - "version": "3.936.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.936.0.tgz", - "integrity": "sha512-GpA4AcHb96KQK2PSPUyvChvrsEKiLhQ5NWjeef2IZ3Jc8JoosiedYqp6yhZR+S8cTysuvx56WyJIJc8y8OTrLA==", + "node_modules/@aws-sdk/middleware-flexible-checksums/node_modules/@smithy/util-utf8": { + "version": "3.0.0", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.936.0", - "@aws-sdk/types": "3.936.0", - "@smithy/property-provider": "^4.2.5", - "@smithy/shared-ini-file-loader": "^4.4.0", - "@smithy/types": "^4.9.0", + "@smithy/util-buffer-from": "^3.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.936.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.936.0.tgz", - "integrity": "sha512-wHlEAJJvtnSyxTfNhN98JcU4taA1ED2JvuI2eePgawqBwS/Tzi0mhED1lvNIaWOkjfLd+nHALwszGrtJwEq4yQ==", + "node_modules/@aws-sdk/middleware-host-header": { + "version": "3.972.2", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.972.2.tgz", + "integrity": "sha512-42hZ8jEXT2uR6YybCzNq9OomqHPw43YIfRfz17biZjMQA4jKSQUaHIl6VvqO2Ddl5904pXg2Yd/ku78S0Ikgog==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/client-sso": "3.936.0", - "@aws-sdk/core": "3.936.0", - "@aws-sdk/token-providers": "3.936.0", - "@aws-sdk/types": "3.936.0", - "@smithy/property-provider": "^4.2.5", - "@smithy/shared-ini-file-loader": "^4.4.0", - "@smithy/types": "^4.9.0", + "@aws-sdk/types": "^3.973.1", + "@smithy/protocol-http": "^5.3.8", + "@smithy/types": "^4.12.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=20.0.0" } }, - "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.936.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.936.0.tgz", - "integrity": "sha512-v3qHAuoODkoRXsAF4RG+ZVO6q2P9yYBT4GMpMEfU9wXVNn7AIfwZgTwzSUfnjNiGva5BKleWVpRpJ9DeuLFbUg==", + "node_modules/@aws-sdk/middleware-host-header/node_modules/@aws-sdk/types": { + "version": "3.973.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.973.1.tgz", + "integrity": "sha512-DwHBiMNOB468JiX6+i34c+THsKHErYUdNQ3HexeXZvVn4zouLjgaS4FejiGSi2HyBuzuyHg7SuOPmjSvoU9NRg==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.936.0", - "@aws-sdk/nested-clients": "3.936.0", - "@aws-sdk/types": "3.936.0", - "@smithy/property-provider": "^4.2.5", - "@smithy/shared-ini-file-loader": "^4.4.0", - "@smithy/types": "^4.9.0", + "@smithy/types": "^4.12.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=20.0.0" } }, - "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/middleware-host-header": { - "version": "3.936.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.936.0.tgz", - "integrity": "sha512-tAaObaAnsP1XnLGndfkGWFuzrJYuk9W0b/nLvol66t8FZExIAf/WdkT2NNAWOYxljVs++oHnyHBCxIlaHrzSiw==", + "node_modules/@aws-sdk/middleware-host-header/node_modules/@smithy/protocol-http": { + "version": "5.3.8", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.3.8.tgz", + "integrity": "sha512-QNINVDhxpZ5QnP3aviNHQFlRogQZDfYlCkQT+7tJnErPQbDhysondEjhikuANxgMsZrkGeiAxXy4jguEGsDrWQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.936.0", - "@smithy/protocol-http": "^5.3.5", - "@smithy/types": "^4.9.0", + "@smithy/types": "^4.12.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/middleware-logger": { - "version": "3.936.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.936.0.tgz", - "integrity": "sha512-aPSJ12d3a3Ea5nyEnLbijCaaYJT2QjQ9iW+zGh5QcZYXmOGWbKVyPSxmVOboZQG+c1M8t6d2O7tqrwzIq8L8qw==", + "node_modules/@aws-sdk/middleware-host-header/node_modules/@smithy/types": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.12.0.tgz", + "integrity": "sha512-9YcuJVTOBDjg9LWo23Qp0lTQ3D7fQsQtwle0jVfpbUHy9qBwCEgKuVH4FqFB3VYu0nwdHKiEMA+oXz7oV8X1kw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.936.0", - "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.936.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.936.0.tgz", - "integrity": "sha512-l4aGbHpXM45YNgXggIux1HgsCVAvvBoqHPkqLnqMl9QVapfuSTjJHfDYDsx1Xxct6/m7qSMUzanBALhiaGO2fA==", + "node_modules/@aws-sdk/middleware-location-constraint": { + "version": "3.693.0", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.936.0", - "@aws/lambda-invoke-store": "^0.2.0", - "@smithy/protocol-http": "^5.3.5", - "@smithy/types": "^4.9.0", + "@aws-sdk/types": "3.692.0", + "@smithy/types": "^3.7.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.936.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.936.0.tgz", - "integrity": "sha512-YB40IPa7K3iaYX0lSnV9easDOLPLh+fJyUDF3BH8doX4i1AOSsYn86L4lVldmOaSX+DwiaqKHpvk4wPBdcIPWw==", + "node_modules/@aws-sdk/middleware-logger": { + "version": "3.972.2", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.972.2.tgz", + "integrity": "sha512-iUzdXKOgi4JVDDEG/VvoNw50FryRCEm0qAudw12DcZoiNJWl0rN6SYVLcL1xwugMfQncCXieK5UBlG6mhH7iYA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.936.0", - "@aws-sdk/types": "3.936.0", - "@aws-sdk/util-endpoints": "3.936.0", - "@smithy/core": "^3.18.5", - "@smithy/protocol-http": "^5.3.5", - "@smithy/types": "^4.9.0", + "@aws-sdk/types": "^3.973.1", + "@smithy/types": "^4.12.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=20.0.0" } }, - "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/nested-clients": { - "version": "3.936.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.936.0.tgz", - "integrity": "sha512-eyj2tz1XmDSLSZQ5xnB7cLTVKkSJnYAEoNDSUNhzWPxrBDYeJzIbatecOKceKCU8NBf8gWWZCK/CSY0mDxMO0A==", + "node_modules/@aws-sdk/middleware-logger/node_modules/@aws-sdk/types": { + "version": "3.973.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.973.1.tgz", + "integrity": "sha512-DwHBiMNOB468JiX6+i34c+THsKHErYUdNQ3HexeXZvVn4zouLjgaS4FejiGSi2HyBuzuyHg7SuOPmjSvoU9NRg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/middleware-logger/node_modules/@smithy/types": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.12.0.tgz", + "integrity": "sha512-9YcuJVTOBDjg9LWo23Qp0lTQ3D7fQsQtwle0jVfpbUHy9qBwCEgKuVH4FqFB3VYu0nwdHKiEMA+oXz7oV8X1kw==", "license": "Apache-2.0", "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.936.0", - "@aws-sdk/middleware-host-header": "3.936.0", - "@aws-sdk/middleware-logger": "3.936.0", - "@aws-sdk/middleware-recursion-detection": "3.936.0", - "@aws-sdk/middleware-user-agent": "3.936.0", - "@aws-sdk/region-config-resolver": "3.936.0", - "@aws-sdk/types": "3.936.0", - "@aws-sdk/util-endpoints": "3.936.0", - "@aws-sdk/util-user-agent-browser": "3.936.0", - "@aws-sdk/util-user-agent-node": "3.936.0", - "@smithy/config-resolver": "^4.4.3", - "@smithy/core": "^3.18.5", - "@smithy/fetch-http-handler": "^5.3.6", - "@smithy/hash-node": "^4.2.5", - "@smithy/invalid-dependency": "^4.2.5", - "@smithy/middleware-content-length": "^4.2.5", - "@smithy/middleware-endpoint": "^4.3.12", - "@smithy/middleware-retry": "^4.4.12", - "@smithy/middleware-serde": "^4.2.6", - "@smithy/middleware-stack": "^4.2.5", - "@smithy/node-config-provider": "^4.3.5", - "@smithy/node-http-handler": "^4.4.5", - "@smithy/protocol-http": "^5.3.5", - "@smithy/smithy-client": "^4.9.8", - "@smithy/types": "^4.9.0", - "@smithy/url-parser": "^4.2.5", - "@smithy/util-base64": "^4.3.0", - "@smithy/util-body-length-browser": "^4.2.0", - "@smithy/util-body-length-node": "^4.2.1", - "@smithy/util-defaults-mode-browser": "^4.3.11", - "@smithy/util-defaults-mode-node": "^4.2.14", - "@smithy/util-endpoints": "^3.2.5", - "@smithy/util-middleware": "^4.2.5", - "@smithy/util-retry": "^4.2.5", - "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/region-config-resolver": { - "version": "3.936.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.936.0.tgz", - "integrity": "sha512-wOKhzzWsshXGduxO4pqSiNyL9oUtk4BEvjWm9aaq6Hmfdoydq6v6t0rAGHWPjFwy9z2haovGRi3C8IxdMB4muw==", + "node_modules/@aws-sdk/middleware-recursion-detection": { + "version": "3.972.2", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.972.2.tgz", + "integrity": "sha512-/mzlyzJDtngNFd/rAYvqx29a2d0VuiYKN84Y/Mu9mGw7cfMOCyRK+896tb9wV6MoPRHUX7IXuKCIL8nzz2Pz5A==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.936.0", - "@smithy/config-resolver": "^4.4.3", - "@smithy/node-config-provider": "^4.3.5", - "@smithy/types": "^4.9.0", + "@aws-sdk/types": "^3.973.1", + "@aws/lambda-invoke-store": "^0.2.2", + "@smithy/protocol-http": "^5.3.8", + "@smithy/types": "^4.12.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=20.0.0" } }, - "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/token-providers": { - "version": "3.936.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.936.0.tgz", - "integrity": "sha512-vvw8+VXk0I+IsoxZw0mX9TMJawUJvEsg3EF7zcCSetwhNPAU8Xmlhv7E/sN/FgSmm7b7DsqKoW6rVtQiCs1PWQ==", + "node_modules/@aws-sdk/middleware-recursion-detection/node_modules/@aws-sdk/types": { + "version": "3.973.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.973.1.tgz", + "integrity": "sha512-DwHBiMNOB468JiX6+i34c+THsKHErYUdNQ3HexeXZvVn4zouLjgaS4FejiGSi2HyBuzuyHg7SuOPmjSvoU9NRg==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.936.0", - "@aws-sdk/nested-clients": "3.936.0", - "@aws-sdk/types": "3.936.0", - "@smithy/property-provider": "^4.2.5", - "@smithy/shared-ini-file-loader": "^4.4.0", - "@smithy/types": "^4.9.0", + "@smithy/types": "^4.12.0", "tslib": "^2.6.2" }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/middleware-recursion-detection/node_modules/@aws/lambda-invoke-store": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@aws/lambda-invoke-store/-/lambda-invoke-store-0.2.3.tgz", + "integrity": "sha512-oLvsaPMTBejkkmHhjf09xTgk71mOqyr/409NKhRIL08If7AhVfUsJhVsx386uJaqNd42v9kWamQ9lFbkoC2dYw==", + "license": "Apache-2.0", "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/types": { - "version": "3.936.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.936.0.tgz", - "integrity": "sha512-uz0/VlMd2pP5MepdrHizd+T+OKfyK4r3OA9JI+L/lPKg0YFQosdJNCKisr6o70E3dh8iMpFYxF1UN/4uZsyARg==", + "node_modules/@aws-sdk/middleware-recursion-detection/node_modules/@smithy/protocol-http": { + "version": "5.3.8", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.3.8.tgz", + "integrity": "sha512-QNINVDhxpZ5QnP3aviNHQFlRogQZDfYlCkQT+7tJnErPQbDhysondEjhikuANxgMsZrkGeiAxXy4jguEGsDrWQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.9.0", + "@smithy/types": "^4.12.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/util-endpoints": { - "version": "3.936.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.936.0.tgz", - "integrity": "sha512-0Zx3Ntdpu+z9Wlm7JKUBOzS9EunwKAb4KdGUQQxDqh5Lc3ta5uBoub+FgmVuzwnmBu9U1Os8UuwVTH0Lgu+P5w==", + "node_modules/@aws-sdk/middleware-recursion-detection/node_modules/@smithy/types": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.12.0.tgz", + "integrity": "sha512-9YcuJVTOBDjg9LWo23Qp0lTQ3D7fQsQtwle0jVfpbUHy9qBwCEgKuVH4FqFB3VYu0nwdHKiEMA+oXz7oV8X1kw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.936.0", - "@smithy/types": "^4.9.0", - "@smithy/url-parser": "^4.2.5", - "@smithy/util-endpoints": "^3.2.5", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.936.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.936.0.tgz", - "integrity": "sha512-eZ/XF6NxMtu+iCma58GRNRxSq4lHo6zHQLOZRIeL/ghqYJirqHdenMOwrzPettj60KWlv827RVebP9oNVrwZbw==", + "node_modules/@aws-sdk/middleware-sdk-api-gateway": { + "version": "3.693.0", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.936.0", - "@smithy/types": "^4.9.0", - "bowser": "^2.11.0", + "@aws-sdk/types": "3.692.0", + "@smithy/protocol-http": "^4.1.6", + "@smithy/types": "^3.7.0", "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.936.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.936.0.tgz", - "integrity": "sha512-XOEc7PF9Op00pWV2AYCGDSu5iHgYjIO53Py2VUQTIvP7SRCaCsXmA33mjBvC2Ms6FhSyWNa4aK4naUGIz0hQcw==", + "node_modules/@aws-sdk/middleware-sdk-ec2": { + "version": "3.693.0", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/middleware-user-agent": "3.936.0", - "@aws-sdk/types": "3.936.0", - "@smithy/node-config-provider": "^4.3.5", - "@smithy/types": "^4.9.0", + "@aws-sdk/types": "3.692.0", + "@aws-sdk/util-format-url": "3.693.0", + "@smithy/middleware-endpoint": "^3.2.2", + "@smithy/protocol-http": "^4.1.6", + "@smithy/signature-v4": "^4.2.2", + "@smithy/smithy-client": "^3.4.3", + "@smithy/types": "^3.7.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/middleware-sdk-s3": { + "version": "3.693.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@aws-sdk/util-arn-parser": "3.693.0", + "@smithy/core": "^2.5.2", + "@smithy/node-config-provider": "^3.1.10", + "@smithy/protocol-http": "^4.1.6", + "@smithy/signature-v4": "^4.2.2", + "@smithy/smithy-client": "^3.4.3", + "@smithy/types": "^3.7.0", + "@smithy/util-config-provider": "^3.0.0", + "@smithy/util-middleware": "^3.0.9", + "@smithy/util-stream": "^3.3.0", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" }, - "peerDependencies": { - "aws-crt": ">=1.0.0" + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/middleware-sdk-s3-control": { + "version": "3.848.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3-control/-/middleware-sdk-s3-control-3.848.0.tgz", + "integrity": "sha512-1zozD+IKFzFE9RLOCBOGPjhi+jUj0bLxf0ntqBMBJKX9Cf5zqvVuck7mCY19+m0/B+GuSAoiQm2yPV6dcgN17g==", + "dependencies": { + "@aws-sdk/middleware-bucket-endpoint": "3.840.0", + "@aws-sdk/types": "3.840.0", + "@aws-sdk/util-arn-parser": "3.804.0", + "@aws-sdk/util-endpoints": "3.848.0", + "@smithy/protocol-http": "^5.1.2", + "@smithy/types": "^4.3.1", + "@smithy/util-endpoints": "^3.0.6", + "tslib": "^2.6.2" }, - "peerDependenciesMeta": { - "aws-crt": { - "optional": true - } + "engines": { + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/xml-builder": { - "version": "3.930.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.930.0.tgz", - "integrity": "sha512-YIfkD17GocxdmlUVc3ia52QhcWuRIUJonbF8A2CYfcWNV3HzvAqpcPeC0bYUhkK+8e8YO1ARnLKZQE0TlwzorA==", - "license": "Apache-2.0", + "node_modules/@aws-sdk/middleware-sdk-s3-control/node_modules/@aws-sdk/middleware-bucket-endpoint": { + "version": "3.840.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.840.0.tgz", + "integrity": "sha512-+gkQNtPwcSMmlwBHFd4saVVS11In6ID1HczNzpM3MXKXRBfSlbZJbCt6wN//AZ8HMklZEik4tcEOG0qa9UY8SQ==", "dependencies": { - "@smithy/types": "^4.9.0", - "fast-xml-parser": "5.2.5", + "@aws-sdk/types": "3.840.0", + "@aws-sdk/util-arn-parser": "3.804.0", + "@smithy/node-config-provider": "^4.1.3", + "@smithy/protocol-http": "^5.1.2", + "@smithy/types": "^4.3.1", + "@smithy/util-config-provider": "^4.0.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-providers/node_modules/@aws/lambda-invoke-store": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@aws/lambda-invoke-store/-/lambda-invoke-store-0.2.1.tgz", - "integrity": "sha512-sIyFcoPZkTtNu9xFeEoynMef3bPJIAbOfUh+ueYcfhVl6xm2VRtMcMclSxmZCMnHHd4hlYKJeq/aggmBEWynww==", - "license": "Apache-2.0", + "node_modules/@aws-sdk/middleware-sdk-s3-control/node_modules/@aws-sdk/types": { + "version": "3.840.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.840.0.tgz", + "integrity": "sha512-xliuHaUFZxEx1NSXeLLZ9Dyu6+EJVQKEoD+yM+zqUo3YDZ7medKJWY6fIOKiPX/N7XbLdBYwajb15Q7IL8KkeA==", + "dependencies": { + "@smithy/types": "^4.3.1", + "tslib": "^2.6.2" + }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/abort-controller": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.2.5.tgz", - "integrity": "sha512-j7HwVkBw68YW8UmFRcjZOmssE77Rvk0GWAIN1oFBhsaovQmZWYCIcGa9/pwRB0ExI8Sk9MWNALTjftjHZea7VA==", - "license": "Apache-2.0", + "node_modules/@aws-sdk/middleware-sdk-s3-control/node_modules/@aws-sdk/util-arn-parser": { + "version": "3.804.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.804.0.tgz", + "integrity": "sha512-wmBJqn1DRXnZu3b4EkE6CWnoWMo1ZMvlfkqU5zPz67xx1GMaXlDCchFvKAXMjk4jn/L1O3tKnoFDNsoLV1kgNQ==", "dependencies": { - "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/config-resolver": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.4.3.tgz", - "integrity": "sha512-ezHLe1tKLUxDJo2LHtDuEDyWXolw8WGOR92qb4bQdWq/zKenO5BvctZGrVJBK08zjezSk7bmbKFOXIVyChvDLw==", - "license": "Apache-2.0", + "node_modules/@aws-sdk/middleware-sdk-s3-control/node_modules/@aws-sdk/util-endpoints": { + "version": "3.848.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.848.0.tgz", + "integrity": "sha512-fY/NuFFCq/78liHvRyFKr+aqq1aA/uuVSANjzr5Ym8c+9Z3HRPE9OrExAHoMrZ6zC8tHerQwlsXYYH5XZ7H+ww==", "dependencies": { - "@smithy/node-config-provider": "^4.3.5", - "@smithy/types": "^4.9.0", - "@smithy/util-config-provider": "^4.2.0", - "@smithy/util-endpoints": "^3.2.5", - "@smithy/util-middleware": "^4.2.5", + "@aws-sdk/types": "3.840.0", + "@smithy/types": "^4.3.1", + "@smithy/url-parser": "^4.0.4", + "@smithy/util-endpoints": "^3.0.6", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/core": { - "version": "3.18.5", - "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.18.5.tgz", - "integrity": "sha512-6gnIz3h+PEPQGDj8MnRSjDvKBah042jEoPgjFGJ4iJLBE78L4lY/n98x14XyPF4u3lN179Ub/ZKFY5za9GeLQw==", - "license": "Apache-2.0", + "node_modules/@aws-sdk/middleware-sdk-s3-control/node_modules/@smithy/node-config-provider": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.1.3.tgz", + "integrity": "sha512-HGHQr2s59qaU1lrVH6MbLlmOBxadtzTsoO4c+bF5asdgVik3I8o7JIOzoeqWc5MjVa+vD36/LWE0iXKpNqooRw==", "dependencies": { - "@smithy/middleware-serde": "^4.2.6", - "@smithy/protocol-http": "^5.3.5", - "@smithy/types": "^4.9.0", - "@smithy/util-base64": "^4.3.0", - "@smithy/util-body-length-browser": "^4.2.0", - "@smithy/util-middleware": "^4.2.5", - "@smithy/util-stream": "^4.5.6", - "@smithy/util-utf8": "^4.2.0", - "@smithy/uuid": "^1.1.0", + "@smithy/property-provider": "^4.0.4", + "@smithy/shared-ini-file-loader": "^4.0.4", + "@smithy/types": "^4.3.1", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/credential-provider-imds": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.2.5.tgz", - "integrity": "sha512-BZwotjoZWn9+36nimwm/OLIcVe+KYRwzMjfhd4QT7QxPm9WY0HiOV8t/Wlh+HVUif0SBVV7ksq8//hPaBC/okQ==", - "license": "Apache-2.0", + "node_modules/@aws-sdk/middleware-sdk-s3-control/node_modules/@smithy/property-provider": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.4.tgz", + "integrity": "sha512-qHJ2sSgu4FqF4U/5UUp4DhXNmdTrgmoAai6oQiM+c5RZ/sbDwJ12qxB1M6FnP+Tn/ggkPZf9ccn4jqKSINaquw==", "dependencies": { - "@smithy/node-config-provider": "^4.3.5", - "@smithy/property-provider": "^4.2.5", - "@smithy/types": "^4.9.0", - "@smithy/url-parser": "^4.2.5", + "@smithy/types": "^4.3.1", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/fetch-http-handler": { - "version": "5.3.6", - "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.3.6.tgz", - "integrity": "sha512-3+RG3EA6BBJ/ofZUeTFJA7mHfSYrZtQIrDP9dI8Lf7X6Jbos2jptuLrAAteDiFVrmbEmLSuRG/bUKzfAXk7dhg==", - "license": "Apache-2.0", + "node_modules/@aws-sdk/middleware-sdk-s3-control/node_modules/@smithy/protocol-http": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.1.2.tgz", + "integrity": "sha512-rOG5cNLBXovxIrICSBm95dLqzfvxjEmuZx4KK3hWwPFHGdW3lxY0fZNXfv2zebfRO7sJZ5pKJYHScsqopeIWtQ==", "dependencies": { - "@smithy/protocol-http": "^5.3.5", - "@smithy/querystring-builder": "^4.2.5", - "@smithy/types": "^4.9.0", - "@smithy/util-base64": "^4.3.0", + "@smithy/types": "^4.3.1", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/hash-node": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.2.5.tgz", - "integrity": "sha512-DpYX914YOfA3UDT9CN1BM787PcHfWRBB43fFGCYrZFUH0Jv+5t8yYl+Pd5PW4+QzoGEDvn5d5QIO4j2HyYZQSA==", - "license": "Apache-2.0", + "node_modules/@aws-sdk/middleware-sdk-s3-control/node_modules/@smithy/querystring-parser": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.0.4.tgz", + "integrity": "sha512-6yZf53i/qB8gRHH/l2ZwUG5xgkPgQF15/KxH0DdXMDHjesA9MeZje/853ifkSY0x4m5S+dfDZ+c4x439PF0M2w==", "dependencies": { - "@smithy/types": "^4.9.0", - "@smithy/util-buffer-from": "^4.2.0", - "@smithy/util-utf8": "^4.2.0", + "@smithy/types": "^4.3.1", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/invalid-dependency": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.2.5.tgz", - "integrity": "sha512-2L2erASEro1WC5nV+plwIMxrTXpvpfzl4e+Nre6vBVRR2HKeGGcvpJyyL3/PpiSg+cJG2KpTmZmq934Olb6e5A==", - "license": "Apache-2.0", + "node_modules/@aws-sdk/middleware-sdk-s3-control/node_modules/@smithy/shared-ini-file-loader": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.4.tgz", + "integrity": "sha512-63X0260LoFBjrHifPDs+nM9tV0VMkOTl4JRMYNuKh/f5PauSjowTfvF3LogfkWdcPoxsA9UjqEOgjeYIbhb7Nw==", "dependencies": { - "@smithy/types": "^4.9.0", + "@smithy/types": "^4.3.1", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/is-array-buffer": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-4.2.0.tgz", - "integrity": "sha512-DZZZBvC7sjcYh4MazJSGiWMI2L7E0oCiRHREDzIxi/M2LY79/21iXt6aPLHge82wi5LsuRF5A06Ds3+0mlh6CQ==", - "license": "Apache-2.0", + "node_modules/@aws-sdk/middleware-sdk-s3-control/node_modules/@smithy/types": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.1.tgz", + "integrity": "sha512-UqKOQBL2x6+HWl3P+3QqFD4ncKq0I8Nuz9QItGv5WuKuMHuuwlhvqcZCoXGfc+P1QmfJE7VieykoYYmrOoFJxA==", "dependencies": { "tslib": "^2.6.2" }, @@ -26748,893 +30083,921 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/middleware-content-length": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.2.5.tgz", - "integrity": "sha512-Y/RabVa5vbl5FuHYV2vUCwvh/dqzrEY/K2yWPSqvhFUwIY0atLqO4TienjBXakoy4zrKAMCZwg+YEqmH7jaN7A==", - "license": "Apache-2.0", + "node_modules/@aws-sdk/middleware-sdk-s3-control/node_modules/@smithy/url-parser": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.0.4.tgz", + "integrity": "sha512-eMkc144MuN7B0TDA4U2fKs+BqczVbk3W+qIvcoCY6D1JY3hnAdCuhCZODC+GAeaxj0p6Jroz4+XMUn3PCxQQeQ==", "dependencies": { - "@smithy/protocol-http": "^5.3.5", - "@smithy/types": "^4.9.0", + "@smithy/querystring-parser": "^4.0.4", + "@smithy/types": "^4.3.1", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/middleware-endpoint": { - "version": "4.3.12", - "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.3.12.tgz", - "integrity": "sha512-9pAX/H+VQPzNbouhDhkW723igBMLgrI8OtX+++M7iKJgg/zY/Ig3i1e6seCcx22FWhE6Q/S61BRdi2wXBORT+A==", - "license": "Apache-2.0", + "node_modules/@aws-sdk/middleware-sdk-s3-control/node_modules/@smithy/util-config-provider": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-4.0.0.tgz", + "integrity": "sha512-L1RBVzLyfE8OXH+1hsJ8p+acNUSirQnWQ6/EgpchV88G6zGBTDPdXiiExei6Z1wR2RxYvxY/XLw6AMNCCt8H3w==", "dependencies": { - "@smithy/core": "^3.18.5", - "@smithy/middleware-serde": "^4.2.6", - "@smithy/node-config-provider": "^4.3.5", - "@smithy/shared-ini-file-loader": "^4.4.0", - "@smithy/types": "^4.9.0", - "@smithy/url-parser": "^4.2.5", - "@smithy/util-middleware": "^4.2.5", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/middleware-retry": { - "version": "4.4.12", - "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.4.12.tgz", - "integrity": "sha512-S4kWNKFowYd0lID7/DBqWHOQxmxlsf0jBaos9chQZUWTVOjSW1Ogyh8/ib5tM+agFDJ/TCxuCTvrnlc+9cIBcQ==", - "license": "Apache-2.0", + "node_modules/@aws-sdk/middleware-sdk-s3-control/node_modules/@smithy/util-endpoints": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.0.6.tgz", + "integrity": "sha512-YARl3tFL3WgPuLzljRUnrS2ngLiUtkwhQtj8PAL13XZSyUiNLQxwG3fBBq3QXFqGFUXepIN73pINp3y8c2nBmA==", "dependencies": { - "@smithy/node-config-provider": "^4.3.5", - "@smithy/protocol-http": "^5.3.5", - "@smithy/service-error-classification": "^4.2.5", - "@smithy/smithy-client": "^4.9.8", - "@smithy/types": "^4.9.0", - "@smithy/util-middleware": "^4.2.5", - "@smithy/util-retry": "^4.2.5", - "@smithy/uuid": "^1.1.0", + "@smithy/node-config-provider": "^4.1.3", + "@smithy/types": "^4.3.1", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/middleware-serde": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.2.6.tgz", - "integrity": "sha512-VkLoE/z7e2g8pirwisLz8XJWedUSY8my/qrp81VmAdyrhi94T+riBfwP+AOEEFR9rFTSonC/5D2eWNmFabHyGQ==", + "node_modules/@aws-sdk/middleware-sdk-s3/node_modules/@aws-sdk/core": { + "version": "3.693.0", "license": "Apache-2.0", "dependencies": { - "@smithy/protocol-http": "^5.3.5", - "@smithy/types": "^4.9.0", + "@aws-sdk/types": "3.692.0", + "@smithy/core": "^2.5.2", + "@smithy/node-config-provider": "^3.1.10", + "@smithy/property-provider": "^3.1.9", + "@smithy/protocol-http": "^4.1.6", + "@smithy/signature-v4": "^4.2.2", + "@smithy/smithy-client": "^3.4.3", + "@smithy/types": "^3.7.0", + "@smithy/util-middleware": "^3.0.9", + "fast-xml-parser": "4.4.1", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/middleware-stack": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.2.5.tgz", - "integrity": "sha512-bYrutc+neOyWxtZdbB2USbQttZN0mXaOyYLIsaTbJhFsfpXyGWUxJpEuO1rJ8IIJm2qH4+xJT0mxUSsEDTYwdQ==", + "node_modules/@aws-sdk/middleware-sdk-s3/node_modules/@smithy/is-array-buffer": { + "version": "3.0.0", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/node-config-provider": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.3.5.tgz", - "integrity": "sha512-UTurh1C4qkVCtqggI36DGbLB2Kv8UlcFdMXDcWMbqVY2uRg0XmT9Pb4Vj6oSQ34eizO1fvR0RnFV4Axw4IrrAg==", + "node_modules/@aws-sdk/middleware-sdk-s3/node_modules/@smithy/util-buffer-from": { + "version": "3.0.0", "license": "Apache-2.0", "dependencies": { - "@smithy/property-provider": "^4.2.5", - "@smithy/shared-ini-file-loader": "^4.4.0", - "@smithy/types": "^4.9.0", + "@smithy/is-array-buffer": "^3.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/node-http-handler": { - "version": "4.4.5", - "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.4.5.tgz", - "integrity": "sha512-CMnzM9R2WqlqXQGtIlsHMEZfXKJVTIrqCNoSd/QpAyp+Dw0a1Vps13l6ma1fH8g7zSPNsA59B/kWgeylFuA/lw==", + "node_modules/@aws-sdk/middleware-sdk-s3/node_modules/@smithy/util-utf8": { + "version": "3.0.0", "license": "Apache-2.0", "dependencies": { - "@smithy/abort-controller": "^4.2.5", - "@smithy/protocol-http": "^5.3.5", - "@smithy/querystring-builder": "^4.2.5", - "@smithy/types": "^4.9.0", + "@smithy/util-buffer-from": "^3.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/property-provider": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.2.5.tgz", - "integrity": "sha512-8iLN1XSE1rl4MuxvQ+5OSk/Zb5El7NJZ1td6Tn+8dQQHIjp59Lwl6bd0+nzw6SKm2wSSriH2v/I9LPzUic7EOg==", - "license": "Apache-2.0", + "node_modules/@aws-sdk/middleware-sdk-sts": { + "version": "3.363.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.363.0.tgz", + "integrity": "sha512-1yy2Ac50FO8BrODaw5bPWvVrRhaVLqXTFH6iHB+dJLPUkwtY5zLM3Mp+9Ilm7kME+r7oIB1wuO6ZB1Lf4ZszIw==", "dependencies": { - "@smithy/types": "^4.9.0", - "tslib": "^2.6.2" + "@aws-sdk/middleware-signing": "3.363.0", + "@aws-sdk/types": "3.357.0", + "@smithy/types": "^1.1.0", + "tslib": "^2.5.0" }, "engines": { - "node": ">=18.0.0" + "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/protocol-http": { - "version": "5.3.5", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.3.5.tgz", - "integrity": "sha512-RlaL+sA0LNMp03bf7XPbFmT5gN+w3besXSWMkA8rcmxLSVfiEXElQi4O2IWwPfxzcHkxqrwBFMbngB8yx/RvaQ==", - "license": "Apache-2.0", + "node_modules/@aws-sdk/middleware-sdk-sts/node_modules/@aws-sdk/types": { + "version": "3.357.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.357.0.tgz", + "integrity": "sha512-/riCRaXg3p71BeWnShrai0y0QTdXcouPSM0Cn1olZbzTf7s71aLEewrc96qFrL70XhY4XvnxMpqQh+r43XIL3g==", "dependencies": { - "@smithy/types": "^4.9.0", - "tslib": "^2.6.2" + "tslib": "^2.5.0" }, "engines": { - "node": ">=18.0.0" + "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/querystring-builder": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.2.5.tgz", - "integrity": "sha512-y98otMI1saoajeik2kLfGyRp11e5U/iJYH/wLCh3aTV/XutbGT9nziKGkgCaMD1ghK7p6htHMm6b6scl9JRUWg==", - "license": "Apache-2.0", + "node_modules/@aws-sdk/middleware-sdk-sts/node_modules/@smithy/types": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-1.2.0.tgz", + "integrity": "sha512-z1r00TvBqF3dh4aHhya7nz1HhvCg4TRmw51fjMrh5do3h+ngSstt/yKlNbHeb9QxJmFbmN8KEVSWgb1bRvfEoA==", "dependencies": { - "@smithy/types": "^4.9.0", - "@smithy/util-uri-escape": "^4.2.0", - "tslib": "^2.6.2" + "tslib": "^2.5.0" }, "engines": { - "node": ">=18.0.0" + "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/querystring-parser": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.2.5.tgz", - "integrity": "sha512-031WCTdPYgiQRYNPXznHXof2YM0GwL6SeaSyTH/P72M1Vz73TvCNH2Nq8Iu2IEPq9QP2yx0/nrw5YmSeAi/AjQ==", - "license": "Apache-2.0", + "node_modules/@aws-sdk/middleware-signing": { + "version": "3.363.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.363.0.tgz", + "integrity": "sha512-/7qia715pt9JKYIPDGu22WmdZxD8cfF/5xB+1kmILg7ZtjO0pPuTaCNJ7xiIuFd7Dn7JXp5lop08anX/GOhNRQ==", "dependencies": { - "@smithy/types": "^4.9.0", - "tslib": "^2.6.2" + "@aws-sdk/types": "3.357.0", + "@smithy/property-provider": "^1.0.1", + "@smithy/protocol-http": "^1.1.0", + "@smithy/signature-v4": "^1.0.1", + "@smithy/types": "^1.1.0", + "@smithy/util-middleware": "^1.0.1", + "tslib": "^2.5.0" }, "engines": { - "node": ">=18.0.0" + "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/service-error-classification": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.2.5.tgz", - "integrity": "sha512-8fEvK+WPE3wUAcDvqDQG1Vk3ANLR8Px979te96m84CbKAjBVf25rPYSzb4xU4hlTyho7VhOGnh5i62D/JVF0JQ==", - "license": "Apache-2.0", + "node_modules/@aws-sdk/middleware-signing/node_modules/@aws-crypto/crc32": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-3.0.0.tgz", + "integrity": "sha512-IzSgsrxUcsrejQbPVilIKy16kAT52EwB6zSaI+M3xxIhKh5+aldEyvI+z6erM7TCLB2BJsFrtHjp6/4/sr+3dA==", "dependencies": { - "@smithy/types": "^4.9.0" - }, - "engines": { - "node": ">=18.0.0" + "@aws-crypto/util": "^3.0.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^1.11.1" } }, - "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/shared-ini-file-loader": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.4.0.tgz", - "integrity": "sha512-5WmZ5+kJgJDjwXXIzr1vDTG+RhF9wzSODQBfkrQ2VVkYALKGvZX1lgVSxEkgicSAFnFhPj5rudJV0zoinqS0bA==", - "license": "Apache-2.0", + "node_modules/@aws-sdk/middleware-signing/node_modules/@aws-crypto/crc32/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@aws-sdk/middleware-signing/node_modules/@aws-crypto/util": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-3.0.0.tgz", + "integrity": "sha512-2OJlpeJpCR48CC8r+uKVChzs9Iungj9wkZrl8Z041DWEWvyIHILYKCPNzJghKsivj+S3mLo6BVc7mBNzdxA46w==", "dependencies": { - "@smithy/types": "^4.9.0", - "tslib": "^2.6.2" + "@aws-sdk/types": "^3.222.0", + "@aws-sdk/util-utf8-browser": "^3.0.0", + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-sdk/middleware-signing/node_modules/@aws-crypto/util/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@aws-sdk/middleware-signing/node_modules/@aws-sdk/types": { + "version": "3.357.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.357.0.tgz", + "integrity": "sha512-/riCRaXg3p71BeWnShrai0y0QTdXcouPSM0Cn1olZbzTf7s71aLEewrc96qFrL70XhY4XvnxMpqQh+r43XIL3g==", + "dependencies": { + "tslib": "^2.5.0" }, "engines": { - "node": ">=18.0.0" + "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/signature-v4": { - "version": "5.3.5", - "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.3.5.tgz", - "integrity": "sha512-xSUfMu1FT7ccfSXkoLl/QRQBi2rOvi3tiBZU2Tdy3I6cgvZ6SEi9QNey+lqps/sJRnogIS+lq+B1gxxbra2a/w==", - "license": "Apache-2.0", + "node_modules/@aws-sdk/middleware-signing/node_modules/@smithy/eventstream-codec": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-1.1.0.tgz", + "integrity": "sha512-3tEbUb8t8an226jKB6V/Q2XU/J53lCwCzULuBPEaF4JjSh+FlCMp7TmogE/Aij5J9DwlsZ4VAD/IRDuQ/0ZtMw==", "dependencies": { - "@smithy/is-array-buffer": "^4.2.0", - "@smithy/protocol-http": "^5.3.5", - "@smithy/types": "^4.9.0", - "@smithy/util-hex-encoding": "^4.2.0", - "@smithy/util-middleware": "^4.2.5", - "@smithy/util-uri-escape": "^4.2.0", - "@smithy/util-utf8": "^4.2.0", - "tslib": "^2.6.2" + "@aws-crypto/crc32": "3.0.0", + "@smithy/types": "^1.2.0", + "@smithy/util-hex-encoding": "^1.1.0", + "tslib": "^2.5.0" + } + }, + "node_modules/@aws-sdk/middleware-signing/node_modules/@smithy/is-array-buffer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-1.1.0.tgz", + "integrity": "sha512-twpQ/n+3OWZJ7Z+xu43MJErmhB/WO/mMTnqR6PwWQShvSJ/emx5d1N59LQZk6ZpTAeuRWrc+eHhkzTp9NFjNRQ==", + "dependencies": { + "tslib": "^2.5.0" }, "engines": { - "node": ">=18.0.0" + "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/smithy-client": { - "version": "4.9.8", - "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.9.8.tgz", - "integrity": "sha512-8xgq3LgKDEFoIrLWBho/oYKyWByw9/corz7vuh1upv7ZBm0ZMjGYBhbn6v643WoIqA9UTcx5A5htEp/YatUwMA==", - "license": "Apache-2.0", + "node_modules/@aws-sdk/middleware-signing/node_modules/@smithy/property-provider": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-1.2.0.tgz", + "integrity": "sha512-qlJd9gT751i4T0t/hJAyNGfESfi08Fek8QiLcysoKPgR05qHhG0OYhlaCJHhpXy4ECW0lHyjvFM1smrCLIXVfw==", "dependencies": { - "@smithy/core": "^3.18.5", - "@smithy/middleware-endpoint": "^4.3.12", - "@smithy/middleware-stack": "^4.2.5", - "@smithy/protocol-http": "^5.3.5", - "@smithy/types": "^4.9.0", - "@smithy/util-stream": "^4.5.6", - "tslib": "^2.6.2" + "@smithy/types": "^1.2.0", + "tslib": "^2.5.0" }, "engines": { - "node": ">=18.0.0" + "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/types": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.9.0.tgz", - "integrity": "sha512-MvUbdnXDTwykR8cB1WZvNNwqoWVaTRA0RLlLmf/cIFNMM2cKWz01X4Ly6SMC4Kks30r8tT3Cty0jmeWfiuyHTA==", - "license": "Apache-2.0", + "node_modules/@aws-sdk/middleware-signing/node_modules/@smithy/protocol-http": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-1.2.0.tgz", + "integrity": "sha512-GfGfruksi3nXdFok5RhgtOnWe5f6BndzYfmEXISD+5gAGdayFGpjWu5pIqIweTudMtse20bGbc+7MFZXT1Tb8Q==", "dependencies": { - "tslib": "^2.6.2" + "@smithy/types": "^1.2.0", + "tslib": "^2.5.0" }, "engines": { - "node": ">=18.0.0" + "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/url-parser": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.2.5.tgz", - "integrity": "sha512-VaxMGsilqFnK1CeBX+LXnSuaMx4sTL/6znSZh2829txWieazdVxr54HmiyTsIbpOTLcf5nYpq9lpzmwRdxj6rQ==", - "license": "Apache-2.0", + "node_modules/@aws-sdk/middleware-signing/node_modules/@smithy/signature-v4": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-1.1.0.tgz", + "integrity": "sha512-fDo3m7YqXBs7neciOePPd/X9LPm5QLlDMdIC4m1H6dgNLnXfLMFNIxEfPyohGA8VW9Wn4X8lygnPSGxDZSmp0Q==", "dependencies": { - "@smithy/querystring-parser": "^4.2.5", - "@smithy/types": "^4.9.0", - "tslib": "^2.6.2" + "@smithy/eventstream-codec": "^1.1.0", + "@smithy/is-array-buffer": "^1.1.0", + "@smithy/types": "^1.2.0", + "@smithy/util-hex-encoding": "^1.1.0", + "@smithy/util-middleware": "^1.1.0", + "@smithy/util-uri-escape": "^1.1.0", + "@smithy/util-utf8": "^1.1.0", + "tslib": "^2.5.0" }, "engines": { - "node": ">=18.0.0" + "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/util-base64": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-4.3.0.tgz", - "integrity": "sha512-GkXZ59JfyxsIwNTWFnjmFEI8kZpRNIBfxKjv09+nkAWPt/4aGaEWMM04m4sxgNVWkbt2MdSvE3KF/PfX4nFedQ==", - "license": "Apache-2.0", + "node_modules/@aws-sdk/middleware-signing/node_modules/@smithy/types": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-1.2.0.tgz", + "integrity": "sha512-z1r00TvBqF3dh4aHhya7nz1HhvCg4TRmw51fjMrh5do3h+ngSstt/yKlNbHeb9QxJmFbmN8KEVSWgb1bRvfEoA==", "dependencies": { - "@smithy/util-buffer-from": "^4.2.0", - "@smithy/util-utf8": "^4.2.0", - "tslib": "^2.6.2" + "tslib": "^2.5.0" }, "engines": { - "node": ">=18.0.0" + "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/util-body-length-browser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-4.2.0.tgz", - "integrity": "sha512-Fkoh/I76szMKJnBXWPdFkQJl2r9SjPt3cMzLdOB6eJ4Pnpas8hVoWPYemX/peO0yrrvldgCUVJqOAjUrOLjbxg==", - "license": "Apache-2.0", + "node_modules/@aws-sdk/middleware-signing/node_modules/@smithy/util-buffer-from": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-1.1.0.tgz", + "integrity": "sha512-9m6NXE0ww+ra5HKHCHig20T+FAwxBAm7DIdwc/767uGWbRcY720ybgPacQNB96JMOI7xVr/CDa3oMzKmW4a+kw==", "dependencies": { - "tslib": "^2.6.2" + "@smithy/is-array-buffer": "^1.1.0", + "tslib": "^2.5.0" }, "engines": { - "node": ">=18.0.0" + "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/util-body-length-node": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-4.2.1.tgz", - "integrity": "sha512-h53dz/pISVrVrfxV1iqXlx5pRg3V2YWFcSQyPyXZRrZoZj4R4DeWRDo1a7dd3CPTcFi3kE+98tuNyD2axyZReA==", - "license": "Apache-2.0", + "node_modules/@aws-sdk/middleware-signing/node_modules/@smithy/util-hex-encoding": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-1.1.0.tgz", + "integrity": "sha512-7UtIE9eH0u41zpB60Jzr0oNCQ3hMJUabMcKRUVjmyHTXiWDE4vjSqN6qlih7rCNeKGbioS7f/y2Jgym4QZcKFg==", "dependencies": { - "tslib": "^2.6.2" + "tslib": "^2.5.0" }, "engines": { - "node": ">=18.0.0" + "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/util-buffer-from": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-4.2.0.tgz", - "integrity": "sha512-kAY9hTKulTNevM2nlRtxAG2FQ3B2OR6QIrPY3zE5LqJy1oxzmgBGsHLWTcNhWXKchgA0WHW+mZkQrng/pgcCew==", - "license": "Apache-2.0", + "node_modules/@aws-sdk/middleware-signing/node_modules/@smithy/util-middleware": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-1.1.0.tgz", + "integrity": "sha512-6hhckcBqVgjWAqLy2vqlPZ3rfxLDhFWEmM7oLh2POGvsi7j0tHkbN7w4DFhuBExVJAbJ/qqxqZdRY6Fu7/OezQ==", "dependencies": { - "@smithy/is-array-buffer": "^4.2.0", - "tslib": "^2.6.2" + "tslib": "^2.5.0" }, "engines": { - "node": ">=18.0.0" + "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/util-config-provider": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-4.2.0.tgz", - "integrity": "sha512-YEjpl6XJ36FTKmD+kRJJWYvrHeUvm5ykaUS5xK+6oXffQPHeEM4/nXlZPe+Wu0lsgRUcNZiliYNh/y7q9c2y6Q==", - "license": "Apache-2.0", + "node_modules/@aws-sdk/middleware-signing/node_modules/@smithy/util-uri-escape": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-1.1.0.tgz", + "integrity": "sha512-/jL/V1xdVRt5XppwiaEU8Etp5WHZj609n0xMTuehmCqdoOFbId1M+aEeDWZsQ+8JbEB/BJ6ynY2SlYmOaKtt8w==", "dependencies": { - "tslib": "^2.6.2" + "tslib": "^2.5.0" }, "engines": { - "node": ">=18.0.0" + "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/util-defaults-mode-browser": { - "version": "4.3.11", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.3.11.tgz", - "integrity": "sha512-yHv+r6wSQXEXTPVCIQTNmXVWs7ekBTpMVErjqZoWkYN75HIFN5y9+/+sYOejfAuvxWGvgzgxbTHa/oz61YTbKw==", - "license": "Apache-2.0", + "node_modules/@aws-sdk/middleware-signing/node_modules/@smithy/util-utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-1.1.0.tgz", + "integrity": "sha512-p/MYV+JmqmPyjdgyN2UxAeYDj9cBqCjp0C/NsTWnnjoZUVqoeZ6IrW915L9CAKWVECgv9lVQGc4u/yz26/bI1A==", "dependencies": { - "@smithy/property-provider": "^4.2.5", - "@smithy/smithy-client": "^4.9.8", - "@smithy/types": "^4.9.0", - "tslib": "^2.6.2" + "@smithy/util-buffer-from": "^1.1.0", + "tslib": "^2.5.0" }, "engines": { - "node": ">=18.0.0" + "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/util-defaults-mode-node": { - "version": "4.2.14", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.2.14.tgz", - "integrity": "sha512-ljZN3iRvaJUgulfvobIuG97q1iUuCMrvXAlkZ4msY+ZuVHQHDIqn7FKZCEj+bx8omz6kF5yQXms/xhzjIO5XiA==", + "node_modules/@aws-sdk/middleware-ssec": { + "version": "3.693.0", "license": "Apache-2.0", "dependencies": { - "@smithy/config-resolver": "^4.4.3", - "@smithy/credential-provider-imds": "^4.2.5", - "@smithy/node-config-provider": "^4.3.5", - "@smithy/property-provider": "^4.2.5", - "@smithy/smithy-client": "^4.9.8", - "@smithy/types": "^4.9.0", + "@aws-sdk/types": "3.692.0", + "@smithy/types": "^3.7.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/util-endpoints": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.2.5.tgz", - "integrity": "sha512-3O63AAWu2cSNQZp+ayl9I3NapW1p1rR5mlVHcF6hAB1dPZUQFfRPYtplWX/3xrzWthPGj5FqB12taJJCfH6s8A==", + "node_modules/@aws-sdk/middleware-stack": { + "version": "3.342.0", "license": "Apache-2.0", "dependencies": { - "@smithy/node-config-provider": "^4.3.5", - "@smithy/types": "^4.9.0", - "tslib": "^2.6.2" + "tslib": "^2.5.0" }, "engines": { - "node": ">=18.0.0" + "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/util-hex-encoding": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-4.2.0.tgz", - "integrity": "sha512-CCQBwJIvXMLKxVbO88IukazJD9a4kQ9ZN7/UMGBjBcJYvatpWk+9g870El4cB8/EJxfe+k+y0GmR9CAzkF+Nbw==", + "node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.972.3", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.972.3.tgz", + "integrity": "sha512-zq6aTiO/BiAIOA8EH8nB+wYvvnZ14Md9Gomm5DDhParshVEVglAyNPO5ADK4ZXFQbftIoO+Vgcvf4gewW/+iYQ==", "license": "Apache-2.0", "dependencies": { + "@aws-sdk/core": "^3.973.2", + "@aws-sdk/types": "^3.973.1", + "@aws-sdk/util-endpoints": "3.972.0", + "@smithy/core": "^3.21.1", + "@smithy/protocol-http": "^5.3.8", + "@smithy/types": "^4.12.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=20.0.0" } }, - "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/util-middleware": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.2.5.tgz", - "integrity": "sha512-6Y3+rvBF7+PZOc40ybeZMcGln6xJGVeY60E7jy9Mv5iKpMJpHgRE6dKy9ScsVxvfAYuEX4Q9a65DQX90KaQ3bA==", + "node_modules/@aws-sdk/middleware-user-agent/node_modules/@aws-sdk/types": { + "version": "3.973.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.973.1.tgz", + "integrity": "sha512-DwHBiMNOB468JiX6+i34c+THsKHErYUdNQ3HexeXZvVn4zouLjgaS4FejiGSi2HyBuzuyHg7SuOPmjSvoU9NRg==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.9.0", + "@smithy/types": "^4.12.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=20.0.0" } }, - "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/util-retry": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.2.5.tgz", - "integrity": "sha512-GBj3+EZBbN4NAqJ/7pAhsXdfzdlznOh8PydUijy6FpNIMnHPSMO2/rP4HKu+UFeikJxShERk528oy7GT79YiJg==", + "node_modules/@aws-sdk/middleware-user-agent/node_modules/@smithy/abort-controller": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.2.8.tgz", + "integrity": "sha512-peuVfkYHAmS5ybKxWcfraK7WBBP0J+rkfUcbHJJKQ4ir3UAUNQI+Y4Vt/PqSzGqgloJ5O1dk7+WzNL8wcCSXbw==", "license": "Apache-2.0", "dependencies": { - "@smithy/service-error-classification": "^4.2.5", - "@smithy/types": "^4.9.0", + "@smithy/types": "^4.12.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/util-stream": { - "version": "4.5.6", - "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.5.6.tgz", - "integrity": "sha512-qWw/UM59TiaFrPevefOZ8CNBKbYEP6wBAIlLqxn3VAIo9rgnTNc4ASbVrqDmhuwI87usnjhdQrxodzAGFFzbRQ==", + "node_modules/@aws-sdk/middleware-user-agent/node_modules/@smithy/core": { + "version": "3.21.1", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.21.1.tgz", + "integrity": "sha512-NUH8R4O6FkN8HKMojzbGg/5pNjsfTjlMmeFclyPfPaXXUrbr5TzhWgbf7t92wfrpCHRgpjyz7ffASIS3wX28aA==", "license": "Apache-2.0", "dependencies": { - "@smithy/fetch-http-handler": "^5.3.6", - "@smithy/node-http-handler": "^4.4.5", - "@smithy/types": "^4.9.0", + "@smithy/middleware-serde": "^4.2.9", + "@smithy/protocol-http": "^5.3.8", + "@smithy/types": "^4.12.0", "@smithy/util-base64": "^4.3.0", - "@smithy/util-buffer-from": "^4.2.0", - "@smithy/util-hex-encoding": "^4.2.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-middleware": "^4.2.8", + "@smithy/util-stream": "^4.5.10", "@smithy/util-utf8": "^4.2.0", + "@smithy/uuid": "^1.1.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/util-uri-escape": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-4.2.0.tgz", - "integrity": "sha512-igZpCKV9+E/Mzrpq6YacdTQ0qTiLm85gD6N/IrmyDvQFA4UnU3d5g3m8tMT/6zG/vVkWSU+VxeUyGonL62DuxA==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/util-utf8": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.2.0.tgz", - "integrity": "sha512-zBPfuzoI8xyBtR2P6WQj63Rz8i3AmfAaJLuNG8dWsfvPe8lO4aCPYLn879mEgHndZH1zQ2oXmG8O1GGzzaoZiw==", + "node_modules/@aws-sdk/middleware-user-agent/node_modules/@smithy/fetch-http-handler": { + "version": "5.3.9", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.3.9.tgz", + "integrity": "sha512-I4UhmcTYXBrct03rwzQX1Y/iqQlzVQaPxWjCjula++5EmWq9YGBrx6bbGqluGc1f0XEfhSkiY4jhLgbsJUMKRA==", "license": "Apache-2.0", "dependencies": { - "@smithy/util-buffer-from": "^4.2.0", + "@smithy/protocol-http": "^5.3.8", + "@smithy/querystring-builder": "^4.2.8", + "@smithy/types": "^4.12.0", + "@smithy/util-base64": "^4.3.0", "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/credential-providers/node_modules/fast-xml-parser": { - "version": "5.2.5", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.2.5.tgz", - "integrity": "sha512-pfX9uG9Ki0yekDHx2SiuRIyFdyAr1kMIMitPvb0YBo8SUfKvia7w7FIyd/l6av85pFYRhZscS75MwMnbvY+hcQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - } - ], - "license": "MIT", - "dependencies": { - "strnum": "^2.1.0" - }, - "bin": { - "fxparser": "src/cli/cli.js" - } - }, - "node_modules/@aws-sdk/credential-providers/node_modules/strnum": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.1.1.tgz", - "integrity": "sha512-7ZvoFTiCnGxBtDqJ//Cu6fWtZtc7Y3x+QOirG15wztbdngGSkht27o2pyGWrVy0b4WAy3jbKmnoK6g5VlVNUUw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - } - ], - "license": "MIT" + }, + "engines": { + "node": ">=18.0.0" + } }, - "node_modules/@aws-sdk/lib-storage": { - "version": "3.693.0", + "node_modules/@aws-sdk/middleware-user-agent/node_modules/@smithy/is-array-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-4.2.0.tgz", + "integrity": "sha512-DZZZBvC7sjcYh4MazJSGiWMI2L7E0oCiRHREDzIxi/M2LY79/21iXt6aPLHge82wi5LsuRF5A06Ds3+0mlh6CQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/abort-controller": "^3.1.7", - "@smithy/middleware-endpoint": "^3.2.2", - "@smithy/smithy-client": "^3.4.3", - "buffer": "5.6.0", - "events": "3.3.0", - "stream-browserify": "3.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/middleware-user-agent/node_modules/@smithy/middleware-serde": { + "version": "4.2.9", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.2.9.tgz", + "integrity": "sha512-eMNiej0u/snzDvlqRGSN3Vl0ESn3838+nKyVfF2FKNXFbi4SERYT6PR392D39iczngbqqGG0Jl1DlCnp7tBbXQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/protocol-http": "^5.3.8", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" }, - "peerDependencies": { - "@aws-sdk/client-s3": "^3.693.0" + "engines": { + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/lib-storage/node_modules/buffer": { - "version": "5.6.0", - "license": "MIT", + "node_modules/@aws-sdk/middleware-user-agent/node_modules/@smithy/node-http-handler": { + "version": "4.4.8", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.4.8.tgz", + "integrity": "sha512-q9u+MSbJVIJ1QmJ4+1u+cERXkrhuILCBDsJUBAW1MPE6sFonbCNaegFuwW9ll8kh5UdyY3jOkoOGlc7BesoLpg==", + "license": "Apache-2.0", "dependencies": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4" + "@smithy/abort-controller": "^4.2.8", + "@smithy/protocol-http": "^5.3.8", + "@smithy/querystring-builder": "^4.2.8", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/lib-storage/node_modules/events": { - "version": "3.3.0", - "license": "MIT", + "node_modules/@aws-sdk/middleware-user-agent/node_modules/@smithy/protocol-http": { + "version": "5.3.8", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.3.8.tgz", + "integrity": "sha512-QNINVDhxpZ5QnP3aviNHQFlRogQZDfYlCkQT+7tJnErPQbDhysondEjhikuANxgMsZrkGeiAxXy4jguEGsDrWQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, "engines": { - "node": ">=0.8.x" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/middleware-bucket-endpoint": { - "version": "3.693.0", + "node_modules/@aws-sdk/middleware-user-agent/node_modules/@smithy/querystring-builder": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.2.8.tgz", + "integrity": "sha512-Xr83r31+DrE8CP3MqPgMJl+pQlLLmOfiEUnoyAlGzzJIrEsbKsPy1hqH0qySaQm4oWrCBlUqRt+idEgunKB+iw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.692.0", - "@aws-sdk/util-arn-parser": "3.693.0", - "@smithy/node-config-provider": "^3.1.10", - "@smithy/protocol-http": "^4.1.6", - "@smithy/types": "^3.7.0", - "@smithy/util-config-provider": "^3.0.0", + "@smithy/types": "^4.12.0", + "@smithy/util-uri-escape": "^4.2.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/middleware-expect-continue": { - "version": "3.693.0", + "node_modules/@aws-sdk/middleware-user-agent/node_modules/@smithy/types": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.12.0.tgz", + "integrity": "sha512-9YcuJVTOBDjg9LWo23Qp0lTQ3D7fQsQtwle0jVfpbUHy9qBwCEgKuVH4FqFB3VYu0nwdHKiEMA+oXz7oV8X1kw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.692.0", - "@smithy/protocol-http": "^4.1.6", - "@smithy/types": "^3.7.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/middleware-flexible-checksums": { - "version": "3.693.0", + "node_modules/@aws-sdk/middleware-user-agent/node_modules/@smithy/util-base64": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-4.3.0.tgz", + "integrity": "sha512-GkXZ59JfyxsIwNTWFnjmFEI8kZpRNIBfxKjv09+nkAWPt/4aGaEWMM04m4sxgNVWkbt2MdSvE3KF/PfX4nFedQ==", "license": "Apache-2.0", "dependencies": { - "@aws-crypto/crc32": "5.2.0", - "@aws-crypto/crc32c": "5.2.0", - "@aws-crypto/util": "5.2.0", - "@aws-sdk/core": "3.693.0", - "@aws-sdk/types": "3.692.0", - "@smithy/is-array-buffer": "^3.0.0", - "@smithy/node-config-provider": "^3.1.10", - "@smithy/protocol-http": "^4.1.6", - "@smithy/types": "^3.7.0", - "@smithy/util-middleware": "^3.0.9", - "@smithy/util-stream": "^3.3.0", - "@smithy/util-utf8": "^3.0.0", + "@smithy/util-buffer-from": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/middleware-flexible-checksums/node_modules/@aws-sdk/core": { - "version": "3.693.0", + "node_modules/@aws-sdk/middleware-user-agent/node_modules/@smithy/util-body-length-browser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-4.2.0.tgz", + "integrity": "sha512-Fkoh/I76szMKJnBXWPdFkQJl2r9SjPt3cMzLdOB6eJ4Pnpas8hVoWPYemX/peO0yrrvldgCUVJqOAjUrOLjbxg==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.692.0", - "@smithy/core": "^2.5.2", - "@smithy/node-config-provider": "^3.1.10", - "@smithy/property-provider": "^3.1.9", - "@smithy/protocol-http": "^4.1.6", - "@smithy/signature-v4": "^4.2.2", - "@smithy/smithy-client": "^3.4.3", - "@smithy/types": "^3.7.0", - "@smithy/util-middleware": "^3.0.9", - "fast-xml-parser": "4.4.1", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/middleware-flexible-checksums/node_modules/@smithy/is-array-buffer": { - "version": "3.0.0", + "node_modules/@aws-sdk/middleware-user-agent/node_modules/@smithy/util-buffer-from": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-4.2.0.tgz", + "integrity": "sha512-kAY9hTKulTNevM2nlRtxAG2FQ3B2OR6QIrPY3zE5LqJy1oxzmgBGsHLWTcNhWXKchgA0WHW+mZkQrng/pgcCew==", "license": "Apache-2.0", "dependencies": { + "@smithy/is-array-buffer": "^4.2.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/middleware-flexible-checksums/node_modules/@smithy/util-buffer-from": { - "version": "3.0.0", + "node_modules/@aws-sdk/middleware-user-agent/node_modules/@smithy/util-hex-encoding": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-4.2.0.tgz", + "integrity": "sha512-CCQBwJIvXMLKxVbO88IukazJD9a4kQ9ZN7/UMGBjBcJYvatpWk+9g870El4cB8/EJxfe+k+y0GmR9CAzkF+Nbw==", "license": "Apache-2.0", "dependencies": { - "@smithy/is-array-buffer": "^3.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/middleware-flexible-checksums/node_modules/@smithy/util-utf8": { - "version": "3.0.0", + "node_modules/@aws-sdk/middleware-user-agent/node_modules/@smithy/util-middleware": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.2.8.tgz", + "integrity": "sha512-PMqfeJxLcNPMDgvPbbLl/2Vpin+luxqTGPpW3NAQVLbRrFRzTa4rNAASYeIGjRV9Ytuhzny39SpyU04EQreF+A==", "license": "Apache-2.0", "dependencies": { - "@smithy/util-buffer-from": "^3.0.0", + "@smithy/types": "^4.12.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/middleware-host-header": { - "version": "3.620.0", + "node_modules/@aws-sdk/middleware-user-agent/node_modules/@smithy/util-stream": { + "version": "4.5.10", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.5.10.tgz", + "integrity": "sha512-jbqemy51UFSZSp2y0ZmRfckmrzuKww95zT9BYMmuJ8v3altGcqjwoV1tzpOwuHaKrwQrCjIzOib499ymr2f98g==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/protocol-http": "^4.1.0", - "@smithy/types": "^3.3.0", + "@smithy/fetch-http-handler": "^5.3.9", + "@smithy/node-http-handler": "^4.4.8", + "@smithy/types": "^4.12.0", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-buffer-from": "^4.2.0", + "@smithy/util-hex-encoding": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/middleware-host-header/node_modules/@aws-sdk/types": { - "version": "3.609.0", + "node_modules/@aws-sdk/middleware-user-agent/node_modules/@smithy/util-uri-escape": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-4.2.0.tgz", + "integrity": "sha512-igZpCKV9+E/Mzrpq6YacdTQ0qTiLm85gD6N/IrmyDvQFA4UnU3d5g3m8tMT/6zG/vVkWSU+VxeUyGonL62DuxA==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^3.3.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/middleware-location-constraint": { - "version": "3.693.0", + "node_modules/@aws-sdk/middleware-user-agent/node_modules/@smithy/util-utf8": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.2.0.tgz", + "integrity": "sha512-zBPfuzoI8xyBtR2P6WQj63Rz8i3AmfAaJLuNG8dWsfvPe8lO4aCPYLn879mEgHndZH1zQ2oXmG8O1GGzzaoZiw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.692.0", - "@smithy/types": "^3.7.0", + "@smithy/util-buffer-from": "^4.2.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/middleware-logger": { - "version": "3.609.0", + "node_modules/@aws-sdk/nested-clients": { + "version": "3.758.0", "license": "Apache-2.0", + "peer": true, "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/types": "^3.3.0", + "@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" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/middleware-logger/node_modules/@aws-sdk/types": { - "version": "3.609.0", + "node_modules/@aws-sdk/nested-clients/node_modules/@aws-sdk/core": { + "version": "3.758.0", "license": "Apache-2.0", + "peer": true, "dependencies": { - "@smithy/types": "^3.3.0", + "@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": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.620.0", + "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.609.0", - "@smithy/protocol-http": "^4.1.0", - "@smithy/types": "^3.3.0", + "@aws-sdk/types": "3.734.0", + "@smithy/protocol-http": "^5.0.1", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/middleware-recursion-detection/node_modules/@aws-sdk/types": { - "version": "3.609.0", + "node_modules/@aws-sdk/nested-clients/node_modules/@aws-sdk/middleware-logger": { + "version": "3.734.0", "license": "Apache-2.0", + "peer": true, "dependencies": { - "@smithy/types": "^3.3.0", + "@aws-sdk/types": "3.734.0", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/middleware-sdk-api-gateway": { - "version": "3.693.0", + "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.692.0", - "@smithy/protocol-http": "^4.1.6", - "@smithy/types": "^3.7.0", + "@aws-sdk/types": "3.734.0", + "@smithy/protocol-http": "^5.0.1", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/middleware-sdk-ec2": { - "version": "3.693.0", + "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/types": "3.692.0", - "@aws-sdk/util-format-url": "3.693.0", - "@smithy/middleware-endpoint": "^3.2.2", - "@smithy/protocol-http": "^4.1.6", - "@smithy/signature-v4": "^4.2.2", - "@smithy/smithy-client": "^3.4.3", - "@smithy/types": "^3.7.0", + "@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": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/middleware-sdk-s3": { - "version": "3.693.0", + "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/core": "3.693.0", - "@aws-sdk/types": "3.692.0", - "@aws-sdk/util-arn-parser": "3.693.0", - "@smithy/core": "^2.5.2", - "@smithy/node-config-provider": "^3.1.10", - "@smithy/protocol-http": "^4.1.6", - "@smithy/signature-v4": "^4.2.2", - "@smithy/smithy-client": "^3.4.3", - "@smithy/types": "^3.7.0", - "@smithy/util-config-provider": "^3.0.0", - "@smithy/util-middleware": "^3.0.9", - "@smithy/util-stream": "^3.3.0", - "@smithy/util-utf8": "^3.0.0", + "@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": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/middleware-sdk-s3-control": { - "version": "3.848.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3-control/-/middleware-sdk-s3-control-3.848.0.tgz", - "integrity": "sha512-1zozD+IKFzFE9RLOCBOGPjhi+jUj0bLxf0ntqBMBJKX9Cf5zqvVuck7mCY19+m0/B+GuSAoiQm2yPV6dcgN17g==", + "node_modules/@aws-sdk/nested-clients/node_modules/@aws-sdk/types": { + "version": "3.734.0", + "license": "Apache-2.0", + "peer": true, "dependencies": { - "@aws-sdk/middleware-bucket-endpoint": "3.840.0", - "@aws-sdk/types": "3.840.0", - "@aws-sdk/util-arn-parser": "3.804.0", - "@aws-sdk/util-endpoints": "3.848.0", - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", - "@smithy/util-endpoints": "^3.0.6", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/middleware-sdk-s3-control/node_modules/@aws-sdk/middleware-bucket-endpoint": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.840.0.tgz", - "integrity": "sha512-+gkQNtPwcSMmlwBHFd4saVVS11In6ID1HczNzpM3MXKXRBfSlbZJbCt6wN//AZ8HMklZEik4tcEOG0qa9UY8SQ==", + "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.840.0", - "@aws-sdk/util-arn-parser": "3.804.0", - "@smithy/node-config-provider": "^4.1.3", - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", - "@smithy/util-config-provider": "^4.0.0", + "@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-sdk/middleware-sdk-s3-control/node_modules/@aws-sdk/types": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.840.0.tgz", - "integrity": "sha512-xliuHaUFZxEx1NSXeLLZ9Dyu6+EJVQKEoD+yM+zqUo3YDZ7medKJWY6fIOKiPX/N7XbLdBYwajb15Q7IL8KkeA==", + "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": { - "@smithy/types": "^4.3.1", + "@aws-sdk/types": "3.734.0", + "@smithy/types": "^4.1.0", + "bowser": "^2.11.0", + "tslib": "^2.6.2" + } + }, + "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", + "@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-sdk/middleware-sdk-s3-control/node_modules/@aws-sdk/util-arn-parser": { - "version": "3.804.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.804.0.tgz", - "integrity": "sha512-wmBJqn1DRXnZu3b4EkE6CWnoWMo1ZMvlfkqU5zPz67xx1GMaXlDCchFvKAXMjk4jn/L1O3tKnoFDNsoLV1kgNQ==", + "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" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/middleware-sdk-s3-control/node_modules/@aws-sdk/util-endpoints": { - "version": "3.848.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.848.0.tgz", - "integrity": "sha512-fY/NuFFCq/78liHvRyFKr+aqq1aA/uuVSANjzr5Ym8c+9Z3HRPE9OrExAHoMrZ6zC8tHerQwlsXYYH5XZ7H+ww==", + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/config-resolver": { + "version": "4.0.1", + "license": "Apache-2.0", + "peer": true, "dependencies": { - "@aws-sdk/types": "3.840.0", - "@smithy/types": "^4.3.1", - "@smithy/url-parser": "^4.0.4", - "@smithy/util-endpoints": "^3.0.6", + "@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-sdk/middleware-sdk-s3-control/node_modules/@smithy/node-config-provider": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.1.3.tgz", - "integrity": "sha512-HGHQr2s59qaU1lrVH6MbLlmOBxadtzTsoO4c+bF5asdgVik3I8o7JIOzoeqWc5MjVa+vD36/LWE0iXKpNqooRw==", + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/core": { + "version": "3.1.5", + "license": "Apache-2.0", + "peer": true, "dependencies": { - "@smithy/property-provider": "^4.0.4", - "@smithy/shared-ini-file-loader": "^4.0.4", - "@smithy/types": "^4.3.1", + "@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-sdk/middleware-sdk-s3-control/node_modules/@smithy/property-provider": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.4.tgz", - "integrity": "sha512-qHJ2sSgu4FqF4U/5UUp4DhXNmdTrgmoAai6oQiM+c5RZ/sbDwJ12qxB1M6FnP+Tn/ggkPZf9ccn4jqKSINaquw==", + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/credential-provider-imds": { + "version": "4.0.1", + "license": "Apache-2.0", + "peer": true, "dependencies": { - "@smithy/types": "^4.3.1", + "@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-sdk/middleware-sdk-s3-control/node_modules/@smithy/protocol-http": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.1.2.tgz", - "integrity": "sha512-rOG5cNLBXovxIrICSBm95dLqzfvxjEmuZx4KK3hWwPFHGdW3lxY0fZNXfv2zebfRO7sJZ5pKJYHScsqopeIWtQ==", + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/fetch-http-handler": { + "version": "5.0.1", + "license": "Apache-2.0", + "peer": true, "dependencies": { - "@smithy/types": "^4.3.1", + "@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-sdk/middleware-sdk-s3-control/node_modules/@smithy/querystring-parser": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.0.4.tgz", - "integrity": "sha512-6yZf53i/qB8gRHH/l2ZwUG5xgkPgQF15/KxH0DdXMDHjesA9MeZje/853ifkSY0x4m5S+dfDZ+c4x439PF0M2w==", + "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.3.1", + "@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-sdk/middleware-sdk-s3-control/node_modules/@smithy/shared-ini-file-loader": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.4.tgz", - "integrity": "sha512-63X0260LoFBjrHifPDs+nM9tV0VMkOTl4JRMYNuKh/f5PauSjowTfvF3LogfkWdcPoxsA9UjqEOgjeYIbhb7Nw==", + "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.3.1", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/middleware-sdk-s3-control/node_modules/@smithy/types": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.1.tgz", - "integrity": "sha512-UqKOQBL2x6+HWl3P+3QqFD4ncKq0I8Nuz9QItGv5WuKuMHuuwlhvqcZCoXGfc+P1QmfJE7VieykoYYmrOoFJxA==", + "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" }, @@ -27642,409 +31005,390 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/middleware-sdk-s3-control/node_modules/@smithy/url-parser": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.0.4.tgz", - "integrity": "sha512-eMkc144MuN7B0TDA4U2fKs+BqczVbk3W+qIvcoCY6D1JY3hnAdCuhCZODC+GAeaxj0p6Jroz4+XMUn3PCxQQeQ==", + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/middleware-content-length": { + "version": "4.0.1", + "license": "Apache-2.0", + "peer": true, "dependencies": { - "@smithy/querystring-parser": "^4.0.4", - "@smithy/types": "^4.3.1", + "@smithy/protocol-http": "^5.0.1", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/middleware-sdk-s3-control/node_modules/@smithy/util-config-provider": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-4.0.0.tgz", - "integrity": "sha512-L1RBVzLyfE8OXH+1hsJ8p+acNUSirQnWQ6/EgpchV88G6zGBTDPdXiiExei6Z1wR2RxYvxY/XLw6AMNCCt8H3w==", + "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", + "@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-sdk/middleware-sdk-s3-control/node_modules/@smithy/util-endpoints": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.0.6.tgz", - "integrity": "sha512-YARl3tFL3WgPuLzljRUnrS2ngLiUtkwhQtj8PAL13XZSyUiNLQxwG3fBBq3QXFqGFUXepIN73pINp3y8c2nBmA==", + "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.1.3", - "@smithy/types": "^4.3.1", - "tslib": "^2.6.2" + "@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-sdk/middleware-sdk-s3/node_modules/@aws-sdk/core": { - "version": "3.693.0", + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/middleware-serde": { + "version": "4.0.2", "license": "Apache-2.0", + "peer": true, "dependencies": { - "@aws-sdk/types": "3.692.0", - "@smithy/core": "^2.5.2", - "@smithy/node-config-provider": "^3.1.10", - "@smithy/property-provider": "^3.1.9", - "@smithy/protocol-http": "^4.1.6", - "@smithy/signature-v4": "^4.2.2", - "@smithy/smithy-client": "^3.4.3", - "@smithy/types": "^3.7.0", - "@smithy/util-middleware": "^3.0.9", - "fast-xml-parser": "4.4.1", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/middleware-sdk-s3/node_modules/@smithy/is-array-buffer": { - "version": "3.0.0", + "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" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/middleware-sdk-s3/node_modules/@smithy/util-buffer-from": { - "version": "3.0.0", + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/node-config-provider": { + "version": "4.0.1", "license": "Apache-2.0", + "peer": true, "dependencies": { - "@smithy/is-array-buffer": "^3.0.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": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/middleware-sdk-s3/node_modules/@smithy/util-utf8": { - "version": "3.0.0", + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/node-http-handler": { + "version": "4.0.3", "license": "Apache-2.0", + "peer": true, "dependencies": { - "@smithy/util-buffer-from": "^3.0.0", + "@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": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/middleware-sdk-sts": { - "version": "3.363.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.363.0.tgz", - "integrity": "sha512-1yy2Ac50FO8BrODaw5bPWvVrRhaVLqXTFH6iHB+dJLPUkwtY5zLM3Mp+9Ilm7kME+r7oIB1wuO6ZB1Lf4ZszIw==", + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/property-provider": { + "version": "4.0.1", + "license": "Apache-2.0", + "peer": true, "dependencies": { - "@aws-sdk/middleware-signing": "3.363.0", - "@aws-sdk/types": "3.357.0", - "@smithy/types": "^1.1.0", - "tslib": "^2.5.0" + "@smithy/types": "^4.1.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/middleware-sdk-sts/node_modules/@aws-sdk/types": { - "version": "3.357.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.357.0.tgz", - "integrity": "sha512-/riCRaXg3p71BeWnShrai0y0QTdXcouPSM0Cn1olZbzTf7s71aLEewrc96qFrL70XhY4XvnxMpqQh+r43XIL3g==", + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/protocol-http": { + "version": "5.0.1", + "license": "Apache-2.0", + "peer": true, "dependencies": { - "tslib": "^2.5.0" + "@smithy/types": "^4.1.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/middleware-sdk-sts/node_modules/@smithy/types": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-1.2.0.tgz", - "integrity": "sha512-z1r00TvBqF3dh4aHhya7nz1HhvCg4TRmw51fjMrh5do3h+ngSstt/yKlNbHeb9QxJmFbmN8KEVSWgb1bRvfEoA==", + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/querystring-builder": { + "version": "4.0.1", + "license": "Apache-2.0", + "peer": true, "dependencies": { - "tslib": "^2.5.0" + "@smithy/types": "^4.1.0", + "@smithy/util-uri-escape": "^4.0.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/middleware-signing": { - "version": "3.363.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.363.0.tgz", - "integrity": "sha512-/7qia715pt9JKYIPDGu22WmdZxD8cfF/5xB+1kmILg7ZtjO0pPuTaCNJ7xiIuFd7Dn7JXp5lop08anX/GOhNRQ==", + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/querystring-parser": { + "version": "4.0.1", + "license": "Apache-2.0", + "peer": true, "dependencies": { - "@aws-sdk/types": "3.357.0", - "@smithy/property-provider": "^1.0.1", - "@smithy/protocol-http": "^1.1.0", - "@smithy/signature-v4": "^1.0.1", - "@smithy/types": "^1.1.0", - "@smithy/util-middleware": "^1.0.1", - "tslib": "^2.5.0" + "@smithy/types": "^4.1.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/middleware-signing/node_modules/@aws-crypto/crc32": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-3.0.0.tgz", - "integrity": "sha512-IzSgsrxUcsrejQbPVilIKy16kAT52EwB6zSaI+M3xxIhKh5+aldEyvI+z6erM7TCLB2BJsFrtHjp6/4/sr+3dA==", - "dependencies": { - "@aws-crypto/util": "^3.0.0", - "@aws-sdk/types": "^3.222.0", - "tslib": "^1.11.1" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/middleware-signing/node_modules/@aws-crypto/crc32/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, - "node_modules/@aws-sdk/middleware-signing/node_modules/@aws-crypto/util": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-3.0.0.tgz", - "integrity": "sha512-2OJlpeJpCR48CC8r+uKVChzs9Iungj9wkZrl8Z041DWEWvyIHILYKCPNzJghKsivj+S3mLo6BVc7mBNzdxA46w==", + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/service-error-classification": { + "version": "4.0.1", + "license": "Apache-2.0", + "peer": true, "dependencies": { - "@aws-sdk/types": "^3.222.0", - "@aws-sdk/util-utf8-browser": "^3.0.0", - "tslib": "^1.11.1" + "@smithy/types": "^4.1.0" + }, + "engines": { + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/middleware-signing/node_modules/@aws-crypto/util/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, - "node_modules/@aws-sdk/middleware-signing/node_modules/@aws-sdk/types": { - "version": "3.357.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.357.0.tgz", - "integrity": "sha512-/riCRaXg3p71BeWnShrai0y0QTdXcouPSM0Cn1olZbzTf7s71aLEewrc96qFrL70XhY4XvnxMpqQh+r43XIL3g==", + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/shared-ini-file-loader": { + "version": "4.0.1", + "license": "Apache-2.0", + "peer": true, "dependencies": { - "tslib": "^2.5.0" + "@smithy/types": "^4.1.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/middleware-signing/node_modules/@smithy/eventstream-codec": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-1.1.0.tgz", - "integrity": "sha512-3tEbUb8t8an226jKB6V/Q2XU/J53lCwCzULuBPEaF4JjSh+FlCMp7TmogE/Aij5J9DwlsZ4VAD/IRDuQ/0ZtMw==", + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/signature-v4": { + "version": "5.0.1", + "license": "Apache-2.0", + "peer": true, "dependencies": { - "@aws-crypto/crc32": "3.0.0", - "@smithy/types": "^1.2.0", - "@smithy/util-hex-encoding": "^1.1.0", - "tslib": "^2.5.0" + "@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-sdk/middleware-signing/node_modules/@smithy/is-array-buffer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-1.1.0.tgz", - "integrity": "sha512-twpQ/n+3OWZJ7Z+xu43MJErmhB/WO/mMTnqR6PwWQShvSJ/emx5d1N59LQZk6ZpTAeuRWrc+eHhkzTp9NFjNRQ==", + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/smithy-client": { + "version": "4.1.6", + "license": "Apache-2.0", + "peer": true, "dependencies": { - "tslib": "^2.5.0" + "@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": ">=14.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/middleware-signing/node_modules/@smithy/property-provider": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-1.2.0.tgz", - "integrity": "sha512-qlJd9gT751i4T0t/hJAyNGfESfi08Fek8QiLcysoKPgR05qHhG0OYhlaCJHhpXy4ECW0lHyjvFM1smrCLIXVfw==", + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/types": { + "version": "4.1.0", + "license": "Apache-2.0", + "peer": true, "dependencies": { - "@smithy/types": "^1.2.0", - "tslib": "^2.5.0" + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/middleware-signing/node_modules/@smithy/protocol-http": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-1.2.0.tgz", - "integrity": "sha512-GfGfruksi3nXdFok5RhgtOnWe5f6BndzYfmEXISD+5gAGdayFGpjWu5pIqIweTudMtse20bGbc+7MFZXT1Tb8Q==", + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/url-parser": { + "version": "4.0.1", + "license": "Apache-2.0", + "peer": true, "dependencies": { - "@smithy/types": "^1.2.0", - "tslib": "^2.5.0" + "@smithy/querystring-parser": "^4.0.1", + "@smithy/types": "^4.1.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/middleware-signing/node_modules/@smithy/signature-v4": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-1.1.0.tgz", - "integrity": "sha512-fDo3m7YqXBs7neciOePPd/X9LPm5QLlDMdIC4m1H6dgNLnXfLMFNIxEfPyohGA8VW9Wn4X8lygnPSGxDZSmp0Q==", + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/util-base64": { + "version": "4.0.0", + "license": "Apache-2.0", + "peer": true, "dependencies": { - "@smithy/eventstream-codec": "^1.1.0", - "@smithy/is-array-buffer": "^1.1.0", - "@smithy/types": "^1.2.0", - "@smithy/util-hex-encoding": "^1.1.0", - "@smithy/util-middleware": "^1.1.0", - "@smithy/util-uri-escape": "^1.1.0", - "@smithy/util-utf8": "^1.1.0", - "tslib": "^2.5.0" + "@smithy/util-buffer-from": "^4.0.0", + "@smithy/util-utf8": "^4.0.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/middleware-signing/node_modules/@smithy/types": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-1.2.0.tgz", - "integrity": "sha512-z1r00TvBqF3dh4aHhya7nz1HhvCg4TRmw51fjMrh5do3h+ngSstt/yKlNbHeb9QxJmFbmN8KEVSWgb1bRvfEoA==", + "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.5.0" + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/middleware-signing/node_modules/@smithy/util-buffer-from": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-1.1.0.tgz", - "integrity": "sha512-9m6NXE0ww+ra5HKHCHig20T+FAwxBAm7DIdwc/767uGWbRcY720ybgPacQNB96JMOI7xVr/CDa3oMzKmW4a+kw==", + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/util-body-length-node": { + "version": "4.0.0", + "license": "Apache-2.0", + "peer": true, "dependencies": { - "@smithy/is-array-buffer": "^1.1.0", - "tslib": "^2.5.0" + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/middleware-signing/node_modules/@smithy/util-hex-encoding": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-1.1.0.tgz", - "integrity": "sha512-7UtIE9eH0u41zpB60Jzr0oNCQ3hMJUabMcKRUVjmyHTXiWDE4vjSqN6qlih7rCNeKGbioS7f/y2Jgym4QZcKFg==", + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/util-buffer-from": { + "version": "4.0.0", + "license": "Apache-2.0", + "peer": true, "dependencies": { - "tslib": "^2.5.0" + "@smithy/is-array-buffer": "^4.0.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/middleware-signing/node_modules/@smithy/util-middleware": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-1.1.0.tgz", - "integrity": "sha512-6hhckcBqVgjWAqLy2vqlPZ3rfxLDhFWEmM7oLh2POGvsi7j0tHkbN7w4DFhuBExVJAbJ/qqxqZdRY6Fu7/OezQ==", + "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.5.0" + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/middleware-signing/node_modules/@smithy/util-uri-escape": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-1.1.0.tgz", - "integrity": "sha512-/jL/V1xdVRt5XppwiaEU8Etp5WHZj609n0xMTuehmCqdoOFbId1M+aEeDWZsQ+8JbEB/BJ6ynY2SlYmOaKtt8w==", + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/util-defaults-mode-browser": { + "version": "4.0.7", + "license": "Apache-2.0", + "peer": true, "dependencies": { - "tslib": "^2.5.0" + "@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": ">=14.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/middleware-signing/node_modules/@smithy/util-utf8": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-1.1.0.tgz", - "integrity": "sha512-p/MYV+JmqmPyjdgyN2UxAeYDj9cBqCjp0C/NsTWnnjoZUVqoeZ6IrW915L9CAKWVECgv9lVQGc4u/yz26/bI1A==", + "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/util-buffer-from": "^1.1.0", - "tslib": "^2.5.0" + "@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" }, "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/middleware-ssec": { - "version": "3.693.0", + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/util-endpoints": { + "version": "3.0.1", "license": "Apache-2.0", + "peer": true, "dependencies": { - "@aws-sdk/types": "3.692.0", - "@smithy/types": "^3.7.0", + "@smithy/node-config-provider": "^4.0.1", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/middleware-stack": { - "version": "3.342.0", + "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.5.0" + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.637.0", + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/util-middleware": { + "version": "4.0.1", "license": "Apache-2.0", + "peer": true, "dependencies": { - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.637.0", - "@smithy/protocol-http": "^4.1.0", - "@smithy/types": "^3.3.0", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/middleware-user-agent/node_modules/@aws-sdk/types": { - "version": "3.609.0", + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/util-retry": { + "version": "4.0.1", "license": "Apache-2.0", + "peer": true, "dependencies": { - "@smithy/types": "^3.3.0", + "@smithy/service-error-classification": "^4.0.1", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/nested-clients": { - "version": "3.758.0", + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/util-stream": { + "version": "4.1.2", "license": "Apache-2.0", "peer": true, "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-buffer-from": "^4.0.0", + "@smithy/util-hex-encoding": "^4.0.0", "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" }, @@ -28052,558 +31396,686 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/nested-clients/node_modules/@aws-sdk/core": { - "version": "3.758.0", + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/util-uri-escape": { + "version": "4.0.0", "license": "Apache-2.0", "peer": true, "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-sdk/nested-clients/node_modules/@aws-sdk/middleware-host-header": { - "version": "3.734.0", + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/util-utf8": { + "version": "4.0.0", "license": "Apache-2.0", "peer": true, "dependencies": { - "@aws-sdk/types": "3.734.0", - "@smithy/protocol-http": "^5.0.1", - "@smithy/types": "^4.1.0", + "@smithy/util-buffer-from": "^4.0.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/nested-clients/node_modules/@aws-sdk/middleware-logger": { - "version": "3.734.0", + "node_modules/@aws-sdk/property-provider": { + "version": "3.46.0", "license": "Apache-2.0", - "peer": true, "dependencies": { - "@aws-sdk/types": "3.734.0", - "@smithy/types": "^4.1.0", + "@aws-sdk/types": "3.46.0", + "tslib": "^2.3.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/@aws-sdk/property-provider/node_modules/@aws-sdk/types": { + "version": "3.46.0", + "license": "Apache-2.0", + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/@aws-sdk/protocol-http": { + "version": "3.370.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.370.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/protocol-http/node_modules/@aws-sdk/types": { + "version": "3.370.0", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^1.1.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/protocol-http/node_modules/@smithy/types": { + "version": "1.2.0", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/region-config-resolver": { + "version": "3.972.2", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.972.2.tgz", + "integrity": "sha512-/7vRBsfmiOlg2X67EdKrzzQGw5/SbkXb7ALHQmlQLkZh8qNgvS2G2dDC6NtF3hzFlpP3j2k+KIEtql/6VrI6JA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.973.1", + "@smithy/config-resolver": "^4.4.6", + "@smithy/node-config-provider": "^4.3.8", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/region-config-resolver/node_modules/@aws-sdk/types": { + "version": "3.973.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.973.1.tgz", + "integrity": "sha512-DwHBiMNOB468JiX6+i34c+THsKHErYUdNQ3HexeXZvVn4zouLjgaS4FejiGSi2HyBuzuyHg7SuOPmjSvoU9NRg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/region-config-resolver/node_modules/@smithy/config-resolver": { + "version": "4.4.6", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.4.6.tgz", + "integrity": "sha512-qJpzYC64kaj3S0fueiu3kXm8xPrR3PcXDPEgnaNMRn0EjNSZFoFjvbUp0YUDsRhN1CB90EnHJtbxWKevnH99UQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/node-config-provider": "^4.3.8", + "@smithy/types": "^4.12.0", + "@smithy/util-config-provider": "^4.2.0", + "@smithy/util-endpoints": "^3.2.8", + "@smithy/util-middleware": "^4.2.8", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/nested-clients/node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.734.0", + "node_modules/@aws-sdk/region-config-resolver/node_modules/@smithy/node-config-provider": { + "version": "4.3.8", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.3.8.tgz", + "integrity": "sha512-aFP1ai4lrbVlWjfpAfRSL8KFcnJQYfTl5QxLJXY32vghJrDuFyPZ6LtUL+JEGYiFRG1PfPLHLoxj107ulncLIg==", "license": "Apache-2.0", - "peer": true, "dependencies": { - "@aws-sdk/types": "3.734.0", - "@smithy/protocol-http": "^5.0.1", - "@smithy/types": "^4.1.0", + "@smithy/property-provider": "^4.2.8", + "@smithy/shared-ini-file-loader": "^4.4.3", + "@smithy/types": "^4.12.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/nested-clients/node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.758.0", + "node_modules/@aws-sdk/region-config-resolver/node_modules/@smithy/property-provider": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.2.8.tgz", + "integrity": "sha512-EtCTbyIveCKeOXDSWSdze3k612yCPq1YbXsbqX3UHhkOSW8zKsM9NOJG5gTIya0vbY2DIaieG8pKo1rITHYL0w==", "license": "Apache-2.0", - "peer": true, "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", + "@smithy/types": "^4.12.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/nested-clients/node_modules/@aws-sdk/region-config-resolver": { - "version": "3.734.0", + "node_modules/@aws-sdk/region-config-resolver/node_modules/@smithy/shared-ini-file-loader": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.4.3.tgz", + "integrity": "sha512-DfQjxXQnzC5UbCUPeC3Ie8u+rIWZTvuDPAGU/BxzrOGhRvgUanaP68kDZA+jaT3ZI+djOf+4dERGlm9mWfFDrg==", "license": "Apache-2.0", - "peer": true, "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", + "@smithy/types": "^4.12.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/nested-clients/node_modules/@aws-sdk/types": { - "version": "3.734.0", + "node_modules/@aws-sdk/region-config-resolver/node_modules/@smithy/types": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.12.0.tgz", + "integrity": "sha512-9YcuJVTOBDjg9LWo23Qp0lTQ3D7fQsQtwle0jVfpbUHy9qBwCEgKuVH4FqFB3VYu0nwdHKiEMA+oXz7oV8X1kw==", "license": "Apache-2.0", - "peer": true, "dependencies": { - "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/nested-clients/node_modules/@aws-sdk/util-endpoints": { - "version": "3.743.0", + "node_modules/@aws-sdk/region-config-resolver/node_modules/@smithy/util-config-provider": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-4.2.0.tgz", + "integrity": "sha512-YEjpl6XJ36FTKmD+kRJJWYvrHeUvm5ykaUS5xK+6oXffQPHeEM4/nXlZPe+Wu0lsgRUcNZiliYNh/y7q9c2y6Q==", "license": "Apache-2.0", - "peer": true, "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-sdk/nested-clients/node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.734.0", + "node_modules/@aws-sdk/region-config-resolver/node_modules/@smithy/util-endpoints": { + "version": "3.2.8", + "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.2.8.tgz", + "integrity": "sha512-8JaVTn3pBDkhZgHQ8R0epwWt+BqPSLCjdjXXusK1onwJlRuN69fbvSK66aIKKO7SwVFM6x2J2ox5X8pOaWcUEw==", "license": "Apache-2.0", - "peer": true, "dependencies": { - "@aws-sdk/types": "3.734.0", - "@smithy/types": "^4.1.0", - "bowser": "^2.11.0", + "@smithy/node-config-provider": "^4.3.8", + "@smithy/types": "^4.12.0", "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/nested-clients/node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.758.0", + "node_modules/@aws-sdk/region-config-resolver/node_modules/@smithy/util-middleware": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.2.8.tgz", + "integrity": "sha512-PMqfeJxLcNPMDgvPbbLl/2Vpin+luxqTGPpW3NAQVLbRrFRzTa4rNAASYeIGjRV9Ytuhzny39SpyU04EQreF+A==", "license": "Apache-2.0", - "peer": true, "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", + "@smithy/types": "^4.12.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" - }, - "peerDependencies": { - "aws-crt": ">=1.0.0" - }, - "peerDependenciesMeta": { - "aws-crt": { - "optional": true - } } }, - "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/abort-controller": { - "version": "4.0.1", + "node_modules/@aws-sdk/s3-request-presigner": { + "version": "3.693.0", "license": "Apache-2.0", - "peer": true, "dependencies": { - "@smithy/types": "^4.1.0", + "@aws-sdk/signature-v4-multi-region": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@aws-sdk/util-format-url": "3.693.0", + "@smithy/middleware-endpoint": "^3.2.2", + "@smithy/protocol-http": "^4.1.6", + "@smithy/smithy-client": "^3.4.3", + "@smithy/types": "^3.7.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/config-resolver": { - "version": "4.0.1", + "node_modules/@aws-sdk/signature-v4-multi-region": { + "version": "3.693.0", "license": "Apache-2.0", - "peer": true, "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", + "@aws-sdk/middleware-sdk-s3": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@smithy/protocol-http": "^4.1.6", + "@smithy/signature-v4": "^4.2.2", + "@smithy/types": "^3.7.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/core": { - "version": "3.1.5", + "node_modules/@aws-sdk/smithy-client": { + "version": "3.342.0", "license": "Apache-2.0", - "peer": true, "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" + "@aws-sdk/middleware-stack": "3.342.0", + "@aws-sdk/types": "3.342.0", + "tslib": "^2.5.0" }, "engines": { - "node": ">=18.0.0" + "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/credential-provider-imds": { - "version": "4.0.1", + "node_modules/@aws-sdk/smithy-client/node_modules/@aws-sdk/types": { + "version": "3.342.0", "license": "Apache-2.0", - "peer": true, "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" + "tslib": "^2.5.0" }, "engines": { - "node": ">=18.0.0" + "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/fetch-http-handler": { - "version": "5.0.1", + "node_modules/@aws-sdk/token-providers": { + "version": "3.975.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.975.0.tgz", + "integrity": "sha512-AWQt64hkVbDQ+CmM09wnvSk2mVyH4iRROkmYkr3/lmUtFNbE2L/fnw26sckZnUcFCsHPqbkQrcsZAnTcBLbH4w==", "license": "Apache-2.0", - "peer": true, "dependencies": { - "@smithy/protocol-http": "^5.0.1", - "@smithy/querystring-builder": "^4.0.1", - "@smithy/types": "^4.1.0", - "@smithy/util-base64": "^4.0.0", + "@aws-sdk/core": "^3.973.1", + "@aws-sdk/nested-clients": "3.975.0", + "@aws-sdk/types": "^3.973.0", + "@smithy/property-provider": "^4.2.8", + "@smithy/shared-ini-file-loader": "^4.4.3", + "@smithy/types": "^4.12.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=20.0.0" } }, - "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/hash-node": { - "version": "4.0.1", + "node_modules/@aws-sdk/token-providers/node_modules/@aws-sdk/nested-clients": { + "version": "3.975.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.975.0.tgz", + "integrity": "sha512-OkeFHPlQj2c/Y5bQGkX14pxhDWUGUFt3LRHhjcDKsSCw6lrxKcxN3WFZN0qbJwKNydP+knL5nxvfgKiCLpTLRA==", "license": "Apache-2.0", - "peer": true, "dependencies": { - "@smithy/types": "^4.1.0", - "@smithy/util-buffer-from": "^4.0.0", - "@smithy/util-utf8": "^4.0.0", + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "^3.973.1", + "@aws-sdk/middleware-host-header": "^3.972.1", + "@aws-sdk/middleware-logger": "^3.972.1", + "@aws-sdk/middleware-recursion-detection": "^3.972.1", + "@aws-sdk/middleware-user-agent": "^3.972.2", + "@aws-sdk/region-config-resolver": "^3.972.1", + "@aws-sdk/types": "^3.973.0", + "@aws-sdk/util-endpoints": "3.972.0", + "@aws-sdk/util-user-agent-browser": "^3.972.1", + "@aws-sdk/util-user-agent-node": "^3.972.1", + "@smithy/config-resolver": "^4.4.6", + "@smithy/core": "^3.21.1", + "@smithy/fetch-http-handler": "^5.3.9", + "@smithy/hash-node": "^4.2.8", + "@smithy/invalid-dependency": "^4.2.8", + "@smithy/middleware-content-length": "^4.2.8", + "@smithy/middleware-endpoint": "^4.4.11", + "@smithy/middleware-retry": "^4.4.27", + "@smithy/middleware-serde": "^4.2.9", + "@smithy/middleware-stack": "^4.2.8", + "@smithy/node-config-provider": "^4.3.8", + "@smithy/node-http-handler": "^4.4.8", + "@smithy/protocol-http": "^5.3.8", + "@smithy/smithy-client": "^4.10.12", + "@smithy/types": "^4.12.0", + "@smithy/url-parser": "^4.2.8", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-body-length-node": "^4.2.1", + "@smithy/util-defaults-mode-browser": "^4.3.26", + "@smithy/util-defaults-mode-node": "^4.2.29", + "@smithy/util-endpoints": "^3.2.8", + "@smithy/util-middleware": "^4.2.8", + "@smithy/util-retry": "^4.2.8", + "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=20.0.0" } }, - "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/invalid-dependency": { - "version": "4.0.1", + "node_modules/@aws-sdk/token-providers/node_modules/@aws-sdk/types": { + "version": "3.973.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.973.1.tgz", + "integrity": "sha512-DwHBiMNOB468JiX6+i34c+THsKHErYUdNQ3HexeXZvVn4zouLjgaS4FejiGSi2HyBuzuyHg7SuOPmjSvoU9NRg==", "license": "Apache-2.0", - "peer": true, "dependencies": { - "@smithy/types": "^4.1.0", + "@smithy/types": "^4.12.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=20.0.0" } }, - "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/is-array-buffer": { - "version": "4.0.0", + "node_modules/@aws-sdk/token-providers/node_modules/@smithy/abort-controller": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.2.8.tgz", + "integrity": "sha512-peuVfkYHAmS5ybKxWcfraK7WBBP0J+rkfUcbHJJKQ4ir3UAUNQI+Y4Vt/PqSzGqgloJ5O1dk7+WzNL8wcCSXbw==", "license": "Apache-2.0", - "peer": true, "dependencies": { + "@smithy/types": "^4.12.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/middleware-content-length": { - "version": "4.0.1", + "node_modules/@aws-sdk/token-providers/node_modules/@smithy/config-resolver": { + "version": "4.4.6", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.4.6.tgz", + "integrity": "sha512-qJpzYC64kaj3S0fueiu3kXm8xPrR3PcXDPEgnaNMRn0EjNSZFoFjvbUp0YUDsRhN1CB90EnHJtbxWKevnH99UQ==", "license": "Apache-2.0", - "peer": true, "dependencies": { - "@smithy/protocol-http": "^5.0.1", - "@smithy/types": "^4.1.0", + "@smithy/node-config-provider": "^4.3.8", + "@smithy/types": "^4.12.0", + "@smithy/util-config-provider": "^4.2.0", + "@smithy/util-endpoints": "^3.2.8", + "@smithy/util-middleware": "^4.2.8", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/middleware-endpoint": { - "version": "4.0.6", + "node_modules/@aws-sdk/token-providers/node_modules/@smithy/core": { + "version": "3.21.1", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.21.1.tgz", + "integrity": "sha512-NUH8R4O6FkN8HKMojzbGg/5pNjsfTjlMmeFclyPfPaXXUrbr5TzhWgbf7t92wfrpCHRgpjyz7ffASIS3wX28aA==", "license": "Apache-2.0", - "peer": true, "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", + "@smithy/middleware-serde": "^4.2.9", + "@smithy/protocol-http": "^5.3.8", + "@smithy/types": "^4.12.0", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-middleware": "^4.2.8", + "@smithy/util-stream": "^4.5.10", + "@smithy/util-utf8": "^4.2.0", + "@smithy/uuid": "^1.1.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/middleware-retry": { - "version": "4.0.7", + "node_modules/@aws-sdk/token-providers/node_modules/@smithy/credential-provider-imds": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.2.8.tgz", + "integrity": "sha512-FNT0xHS1c/CPN8upqbMFP83+ul5YgdisfCfkZ86Jh2NSmnqw/AJ6x5pEogVCTVvSm7j9MopRU89bmDelxuDMYw==", "license": "Apache-2.0", - "peer": true, "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" + "@smithy/node-config-provider": "^4.3.8", + "@smithy/property-provider": "^4.2.8", + "@smithy/types": "^4.12.0", + "@smithy/url-parser": "^4.2.8", + "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/middleware-serde": { - "version": "4.0.2", + "node_modules/@aws-sdk/token-providers/node_modules/@smithy/fetch-http-handler": { + "version": "5.3.9", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.3.9.tgz", + "integrity": "sha512-I4UhmcTYXBrct03rwzQX1Y/iqQlzVQaPxWjCjula++5EmWq9YGBrx6bbGqluGc1f0XEfhSkiY4jhLgbsJUMKRA==", "license": "Apache-2.0", - "peer": true, "dependencies": { - "@smithy/types": "^4.1.0", + "@smithy/protocol-http": "^5.3.8", + "@smithy/querystring-builder": "^4.2.8", + "@smithy/types": "^4.12.0", + "@smithy/util-base64": "^4.3.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/middleware-stack": { - "version": "4.0.1", + "node_modules/@aws-sdk/token-providers/node_modules/@smithy/hash-node": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.2.8.tgz", + "integrity": "sha512-7ZIlPbmaDGxVoxErDZnuFG18WekhbA/g2/i97wGj+wUBeS6pcUeAym8u4BXh/75RXWhgIJhyC11hBzig6MljwA==", "license": "Apache-2.0", - "peer": true, "dependencies": { - "@smithy/types": "^4.1.0", + "@smithy/types": "^4.12.0", + "@smithy/util-buffer-from": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/node-config-provider": { - "version": "4.0.1", + "node_modules/@aws-sdk/token-providers/node_modules/@smithy/invalid-dependency": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.2.8.tgz", + "integrity": "sha512-N9iozRybwAQ2dn9Fot9kI6/w9vos2oTXLhtK7ovGqwZjlOcxu6XhPlpLpC+INsxktqHinn5gS2DXDjDF2kG5sQ==", "license": "Apache-2.0", - "peer": true, "dependencies": { - "@smithy/property-provider": "^4.0.1", - "@smithy/shared-ini-file-loader": "^4.0.1", - "@smithy/types": "^4.1.0", + "@smithy/types": "^4.12.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/node-http-handler": { - "version": "4.0.3", + "node_modules/@aws-sdk/token-providers/node_modules/@smithy/is-array-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-4.2.0.tgz", + "integrity": "sha512-DZZZBvC7sjcYh4MazJSGiWMI2L7E0oCiRHREDzIxi/M2LY79/21iXt6aPLHge82wi5LsuRF5A06Ds3+0mlh6CQ==", "license": "Apache-2.0", - "peer": true, "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-sdk/nested-clients/node_modules/@smithy/property-provider": { - "version": "4.0.1", + "node_modules/@aws-sdk/token-providers/node_modules/@smithy/middleware-content-length": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.2.8.tgz", + "integrity": "sha512-RO0jeoaYAB1qBRhfVyq0pMgBoUK34YEJxVxyjOWYZiOKOq2yMZ4MnVXMZCUDenpozHue207+9P5ilTV1zeda0A==", "license": "Apache-2.0", - "peer": true, "dependencies": { - "@smithy/types": "^4.1.0", + "@smithy/protocol-http": "^5.3.8", + "@smithy/types": "^4.12.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/protocol-http": { - "version": "5.0.1", + "node_modules/@aws-sdk/token-providers/node_modules/@smithy/middleware-endpoint": { + "version": "4.4.11", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.4.11.tgz", + "integrity": "sha512-/WqsrycweGGfb9sSzME4CrsuayjJF6BueBmkKlcbeU5q18OhxRrvvKlmfw3tpDsK5ilx2XUJvoukwxHB0nHs/Q==", "license": "Apache-2.0", - "peer": true, "dependencies": { - "@smithy/types": "^4.1.0", + "@smithy/core": "^3.21.1", + "@smithy/middleware-serde": "^4.2.9", + "@smithy/node-config-provider": "^4.3.8", + "@smithy/shared-ini-file-loader": "^4.4.3", + "@smithy/types": "^4.12.0", + "@smithy/url-parser": "^4.2.8", + "@smithy/util-middleware": "^4.2.8", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/querystring-builder": { - "version": "4.0.1", + "node_modules/@aws-sdk/token-providers/node_modules/@smithy/middleware-retry": { + "version": "4.4.27", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.4.27.tgz", + "integrity": "sha512-xFUYCGRVsfgiN5EjsJJSzih9+yjStgMTCLANPlf0LVQkPDYCe0hz97qbdTZosFOiYlGBlHYityGRxrQ/hxhfVQ==", "license": "Apache-2.0", - "peer": true, "dependencies": { - "@smithy/types": "^4.1.0", - "@smithy/util-uri-escape": "^4.0.0", + "@smithy/node-config-provider": "^4.3.8", + "@smithy/protocol-http": "^5.3.8", + "@smithy/service-error-classification": "^4.2.8", + "@smithy/smithy-client": "^4.10.12", + "@smithy/types": "^4.12.0", + "@smithy/util-middleware": "^4.2.8", + "@smithy/util-retry": "^4.2.8", + "@smithy/uuid": "^1.1.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/querystring-parser": { - "version": "4.0.1", + "node_modules/@aws-sdk/token-providers/node_modules/@smithy/middleware-serde": { + "version": "4.2.9", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.2.9.tgz", + "integrity": "sha512-eMNiej0u/snzDvlqRGSN3Vl0ESn3838+nKyVfF2FKNXFbi4SERYT6PR392D39iczngbqqGG0Jl1DlCnp7tBbXQ==", "license": "Apache-2.0", - "peer": true, "dependencies": { - "@smithy/types": "^4.1.0", + "@smithy/protocol-http": "^5.3.8", + "@smithy/types": "^4.12.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/service-error-classification": { - "version": "4.0.1", + "node_modules/@aws-sdk/token-providers/node_modules/@smithy/middleware-stack": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.2.8.tgz", + "integrity": "sha512-w6LCfOviTYQjBctOKSwy6A8FIkQy7ICvglrZFl6Bw4FmcQ1Z420fUtIhxaUZZshRe0VCq4kvDiPiXrPZAe8oRA==", "license": "Apache-2.0", - "peer": true, "dependencies": { - "@smithy/types": "^4.1.0" + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/shared-ini-file-loader": { - "version": "4.0.1", + "node_modules/@aws-sdk/token-providers/node_modules/@smithy/node-config-provider": { + "version": "4.3.8", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.3.8.tgz", + "integrity": "sha512-aFP1ai4lrbVlWjfpAfRSL8KFcnJQYfTl5QxLJXY32vghJrDuFyPZ6LtUL+JEGYiFRG1PfPLHLoxj107ulncLIg==", "license": "Apache-2.0", - "peer": true, "dependencies": { - "@smithy/types": "^4.1.0", + "@smithy/property-provider": "^4.2.8", + "@smithy/shared-ini-file-loader": "^4.4.3", + "@smithy/types": "^4.12.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/signature-v4": { - "version": "5.0.1", + "node_modules/@aws-sdk/token-providers/node_modules/@smithy/node-http-handler": { + "version": "4.4.8", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.4.8.tgz", + "integrity": "sha512-q9u+MSbJVIJ1QmJ4+1u+cERXkrhuILCBDsJUBAW1MPE6sFonbCNaegFuwW9ll8kh5UdyY3jOkoOGlc7BesoLpg==", "license": "Apache-2.0", - "peer": true, "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", + "@smithy/abort-controller": "^4.2.8", + "@smithy/protocol-http": "^5.3.8", + "@smithy/querystring-builder": "^4.2.8", + "@smithy/types": "^4.12.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/smithy-client": { - "version": "4.1.6", + "node_modules/@aws-sdk/token-providers/node_modules/@smithy/property-provider": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.2.8.tgz", + "integrity": "sha512-EtCTbyIveCKeOXDSWSdze3k612yCPq1YbXsbqX3UHhkOSW8zKsM9NOJG5gTIya0vbY2DIaieG8pKo1rITHYL0w==", "license": "Apache-2.0", - "peer": true, "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", + "@smithy/types": "^4.12.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/types": { - "version": "4.1.0", + "node_modules/@aws-sdk/token-providers/node_modules/@smithy/protocol-http": { + "version": "5.3.8", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.3.8.tgz", + "integrity": "sha512-QNINVDhxpZ5QnP3aviNHQFlRogQZDfYlCkQT+7tJnErPQbDhysondEjhikuANxgMsZrkGeiAxXy4jguEGsDrWQ==", "license": "Apache-2.0", - "peer": true, "dependencies": { + "@smithy/types": "^4.12.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/url-parser": { - "version": "4.0.1", + "node_modules/@aws-sdk/token-providers/node_modules/@smithy/querystring-builder": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.2.8.tgz", + "integrity": "sha512-Xr83r31+DrE8CP3MqPgMJl+pQlLLmOfiEUnoyAlGzzJIrEsbKsPy1hqH0qySaQm4oWrCBlUqRt+idEgunKB+iw==", "license": "Apache-2.0", - "peer": true, "dependencies": { - "@smithy/querystring-parser": "^4.0.1", - "@smithy/types": "^4.1.0", + "@smithy/types": "^4.12.0", + "@smithy/util-uri-escape": "^4.2.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/util-base64": { - "version": "4.0.0", + "node_modules/@aws-sdk/token-providers/node_modules/@smithy/querystring-parser": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.2.8.tgz", + "integrity": "sha512-vUurovluVy50CUlazOiXkPq40KGvGWSdmusa3130MwrR1UNnNgKAlj58wlOe61XSHRpUfIIh6cE0zZ8mzKaDPA==", "license": "Apache-2.0", - "peer": true, "dependencies": { - "@smithy/util-buffer-from": "^4.0.0", - "@smithy/util-utf8": "^4.0.0", + "@smithy/types": "^4.12.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/util-body-length-browser": { - "version": "4.0.0", + "node_modules/@aws-sdk/token-providers/node_modules/@smithy/service-error-classification": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.2.8.tgz", + "integrity": "sha512-mZ5xddodpJhEt3RkCjbmUQuXUOaPNTkbMGR0bcS8FE0bJDLMZlhmpgrvPNCYglVw5rsYTpSnv19womw9WWXKQQ==", "license": "Apache-2.0", - "peer": true, "dependencies": { - "tslib": "^2.6.2" + "@smithy/types": "^4.12.0" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/util-body-length-node": { - "version": "4.0.0", + "node_modules/@aws-sdk/token-providers/node_modules/@smithy/shared-ini-file-loader": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.4.3.tgz", + "integrity": "sha512-DfQjxXQnzC5UbCUPeC3Ie8u+rIWZTvuDPAGU/BxzrOGhRvgUanaP68kDZA+jaT3ZI+djOf+4dERGlm9mWfFDrg==", "license": "Apache-2.0", - "peer": true, "dependencies": { + "@smithy/types": "^4.12.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/util-buffer-from": { - "version": "4.0.0", + "node_modules/@aws-sdk/token-providers/node_modules/@smithy/smithy-client": { + "version": "4.10.12", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.10.12.tgz", + "integrity": "sha512-VKO/HKoQ5OrSHW6AJUmEnUKeXI1/5LfCwO9cwyao7CmLvGnZeM1i36Lyful3LK1XU7HwTVieTqO1y2C/6t3qtA==", "license": "Apache-2.0", - "peer": true, "dependencies": { - "@smithy/is-array-buffer": "^4.0.0", + "@smithy/core": "^3.21.1", + "@smithy/middleware-endpoint": "^4.4.11", + "@smithy/middleware-stack": "^4.2.8", + "@smithy/protocol-http": "^5.3.8", + "@smithy/types": "^4.12.0", + "@smithy/util-stream": "^4.5.10", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/util-config-provider": { - "version": "4.0.0", + "node_modules/@aws-sdk/token-providers/node_modules/@smithy/types": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.12.0.tgz", + "integrity": "sha512-9YcuJVTOBDjg9LWo23Qp0lTQ3D7fQsQtwle0jVfpbUHy9qBwCEgKuVH4FqFB3VYu0nwdHKiEMA+oXz7oV8X1kw==", "license": "Apache-2.0", - "peer": true, "dependencies": { "tslib": "^2.6.2" }, @@ -28611,55 +32083,51 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/util-defaults-mode-browser": { - "version": "4.0.7", + "node_modules/@aws-sdk/token-providers/node_modules/@smithy/url-parser": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.2.8.tgz", + "integrity": "sha512-NQho9U68TGMEU639YkXnVMV3GEFFULmmaWdlu1E9qzyIePOHsoSnagTGSDv1Zi8DCNN6btxOSdgmy5E/hsZwhA==", "license": "Apache-2.0", - "peer": true, "dependencies": { - "@smithy/property-provider": "^4.0.1", - "@smithy/smithy-client": "^4.1.6", - "@smithy/types": "^4.1.0", - "bowser": "^2.11.0", + "@smithy/querystring-parser": "^4.2.8", + "@smithy/types": "^4.12.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/util-defaults-mode-node": { - "version": "4.0.7", + "node_modules/@aws-sdk/token-providers/node_modules/@smithy/util-base64": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-4.3.0.tgz", + "integrity": "sha512-GkXZ59JfyxsIwNTWFnjmFEI8kZpRNIBfxKjv09+nkAWPt/4aGaEWMM04m4sxgNVWkbt2MdSvE3KF/PfX4nFedQ==", "license": "Apache-2.0", - "peer": true, "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", + "@smithy/util-buffer-from": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/util-endpoints": { - "version": "3.0.1", + "node_modules/@aws-sdk/token-providers/node_modules/@smithy/util-body-length-browser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-4.2.0.tgz", + "integrity": "sha512-Fkoh/I76szMKJnBXWPdFkQJl2r9SjPt3cMzLdOB6eJ4Pnpas8hVoWPYemX/peO0yrrvldgCUVJqOAjUrOLjbxg==", "license": "Apache-2.0", - "peer": true, "dependencies": { - "@smithy/node-config-provider": "^4.0.1", - "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/util-hex-encoding": { - "version": "4.0.0", + "node_modules/@aws-sdk/token-providers/node_modules/@smithy/util-body-length-node": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-4.2.1.tgz", + "integrity": "sha512-h53dz/pISVrVrfxV1iqXlx5pRg3V2YWFcSQyPyXZRrZoZj4R4DeWRDo1a7dd3CPTcFi3kE+98tuNyD2axyZReA==", "license": "Apache-2.0", - "peer": true, "dependencies": { "tslib": "^2.6.2" }, @@ -28667,273 +32135,303 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/util-middleware": { - "version": "4.0.1", + "node_modules/@aws-sdk/token-providers/node_modules/@smithy/util-buffer-from": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-4.2.0.tgz", + "integrity": "sha512-kAY9hTKulTNevM2nlRtxAG2FQ3B2OR6QIrPY3zE5LqJy1oxzmgBGsHLWTcNhWXKchgA0WHW+mZkQrng/pgcCew==", "license": "Apache-2.0", - "peer": true, "dependencies": { - "@smithy/types": "^4.1.0", + "@smithy/is-array-buffer": "^4.2.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/util-retry": { - "version": "4.0.1", + "node_modules/@aws-sdk/token-providers/node_modules/@smithy/util-config-provider": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-4.2.0.tgz", + "integrity": "sha512-YEjpl6XJ36FTKmD+kRJJWYvrHeUvm5ykaUS5xK+6oXffQPHeEM4/nXlZPe+Wu0lsgRUcNZiliYNh/y7q9c2y6Q==", "license": "Apache-2.0", - "peer": true, "dependencies": { - "@smithy/service-error-classification": "^4.0.1", - "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/util-stream": { - "version": "4.1.2", + "node_modules/@aws-sdk/token-providers/node_modules/@smithy/util-defaults-mode-browser": { + "version": "4.3.26", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.3.26.tgz", + "integrity": "sha512-vva0dzYUTgn7DdE0uaha10uEdAgmdLnNFowKFjpMm6p2R0XDk5FHPX3CBJLzWQkQXuEprsb0hGz9YwbicNWhjw==", "license": "Apache-2.0", - "peer": true, "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/property-provider": "^4.2.8", + "@smithy/smithy-client": "^4.10.12", + "@smithy/types": "^4.12.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/util-uri-escape": { - "version": "4.0.0", + "node_modules/@aws-sdk/token-providers/node_modules/@smithy/util-defaults-mode-node": { + "version": "4.2.29", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.2.29.tgz", + "integrity": "sha512-c6D7IUBsZt/aNnTBHMTf+OVh+h/JcxUUgfTcIJaWRe6zhOum1X+pNKSZtZ+7fbOn5I99XVFtmrnXKv8yHHErTQ==", "license": "Apache-2.0", - "peer": true, "dependencies": { + "@smithy/config-resolver": "^4.4.6", + "@smithy/credential-provider-imds": "^4.2.8", + "@smithy/node-config-provider": "^4.3.8", + "@smithy/property-provider": "^4.2.8", + "@smithy/smithy-client": "^4.10.12", + "@smithy/types": "^4.12.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/util-utf8": { - "version": "4.0.0", + "node_modules/@aws-sdk/token-providers/node_modules/@smithy/util-endpoints": { + "version": "3.2.8", + "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.2.8.tgz", + "integrity": "sha512-8JaVTn3pBDkhZgHQ8R0epwWt+BqPSLCjdjXXusK1onwJlRuN69fbvSK66aIKKO7SwVFM6x2J2ox5X8pOaWcUEw==", "license": "Apache-2.0", - "peer": true, "dependencies": { - "@smithy/util-buffer-from": "^4.0.0", + "@smithy/node-config-provider": "^4.3.8", + "@smithy/types": "^4.12.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/property-provider": { - "version": "3.46.0", + "node_modules/@aws-sdk/token-providers/node_modules/@smithy/util-hex-encoding": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-4.2.0.tgz", + "integrity": "sha512-CCQBwJIvXMLKxVbO88IukazJD9a4kQ9ZN7/UMGBjBcJYvatpWk+9g870El4cB8/EJxfe+k+y0GmR9CAzkF+Nbw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.46.0", - "tslib": "^2.3.0" + "tslib": "^2.6.2" }, "engines": { - "node": ">= 12.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/property-provider/node_modules/@aws-sdk/types": { - "version": "3.46.0", + "node_modules/@aws-sdk/token-providers/node_modules/@smithy/util-middleware": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.2.8.tgz", + "integrity": "sha512-PMqfeJxLcNPMDgvPbbLl/2Vpin+luxqTGPpW3NAQVLbRrFRzTa4rNAASYeIGjRV9Ytuhzny39SpyU04EQreF+A==", "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, "engines": { - "node": ">= 12.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/protocol-http": { - "version": "3.370.0", + "node_modules/@aws-sdk/token-providers/node_modules/@smithy/util-retry": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.2.8.tgz", + "integrity": "sha512-CfJqwvoRY0kTGe5AkQokpURNCT1u/MkRzMTASWMPPo2hNSnKtF1D45dQl3DE2LKLr4m+PW9mCeBMJr5mCAVThg==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.370.0", - "tslib": "^2.5.0" + "@smithy/service-error-classification": "^4.2.8", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/protocol-http/node_modules/@aws-sdk/types": { - "version": "3.370.0", + "node_modules/@aws-sdk/token-providers/node_modules/@smithy/util-stream": { + "version": "4.5.10", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.5.10.tgz", + "integrity": "sha512-jbqemy51UFSZSp2y0ZmRfckmrzuKww95zT9BYMmuJ8v3altGcqjwoV1tzpOwuHaKrwQrCjIzOib499ymr2f98g==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^1.1.0", - "tslib": "^2.5.0" + "@smithy/fetch-http-handler": "^5.3.9", + "@smithy/node-http-handler": "^4.4.8", + "@smithy/types": "^4.12.0", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-buffer-from": "^4.2.0", + "@smithy/util-hex-encoding": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/protocol-http/node_modules/@smithy/types": { - "version": "1.2.0", + "node_modules/@aws-sdk/token-providers/node_modules/@smithy/util-uri-escape": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-4.2.0.tgz", + "integrity": "sha512-igZpCKV9+E/Mzrpq6YacdTQ0qTiLm85gD6N/IrmyDvQFA4UnU3d5g3m8tMT/6zG/vVkWSU+VxeUyGonL62DuxA==", "license": "Apache-2.0", "dependencies": { - "tslib": "^2.5.0" + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/region-config-resolver": { - "version": "3.614.0", + "node_modules/@aws-sdk/token-providers/node_modules/@smithy/util-utf8": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.2.0.tgz", + "integrity": "sha512-zBPfuzoI8xyBtR2P6WQj63Rz8i3AmfAaJLuNG8dWsfvPe8lO4aCPYLn879mEgHndZH1zQ2oXmG8O1GGzzaoZiw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/types": "^3.3.0", - "@smithy/util-config-provider": "^3.0.0", - "@smithy/util-middleware": "^3.0.3", + "@smithy/util-buffer-from": "^4.2.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/region-config-resolver/node_modules/@aws-sdk/types": { - "version": "3.609.0", + "node_modules/@aws-sdk/types": { + "version": "3.692.0", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^3.3.0", + "@smithy/types": "^3.7.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/s3-request-presigner": { + "node_modules/@aws-sdk/util-arn-parser": { "version": "3.693.0", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/signature-v4-multi-region": "3.693.0", - "@aws-sdk/types": "3.692.0", - "@aws-sdk/util-format-url": "3.693.0", - "@smithy/middleware-endpoint": "^3.2.2", - "@smithy/protocol-http": "^4.1.6", - "@smithy/smithy-client": "^3.4.3", - "@smithy/types": "^3.7.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/signature-v4-multi-region": { - "version": "3.693.0", + "node_modules/@aws-sdk/util-endpoints": { + "version": "3.972.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.972.0.tgz", + "integrity": "sha512-6JHsl1V/a1ZW8D8AFfd4R52fwZPnZ5H4U6DS8m/bWT8qad72NvbOFAC7U2cDtFs2TShqUO3TEiX/EJibtY3ijg==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/middleware-sdk-s3": "3.693.0", - "@aws-sdk/types": "3.692.0", - "@smithy/protocol-http": "^4.1.6", - "@smithy/signature-v4": "^4.2.2", - "@smithy/types": "^3.7.0", + "@aws-sdk/types": "3.972.0", + "@smithy/types": "^4.12.0", + "@smithy/url-parser": "^4.2.8", + "@smithy/util-endpoints": "^3.2.8", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=20.0.0" } }, - "node_modules/@aws-sdk/smithy-client": { - "version": "3.342.0", + "node_modules/@aws-sdk/util-endpoints/node_modules/@aws-sdk/types": { + "version": "3.972.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.972.0.tgz", + "integrity": "sha512-U7xBIbLSetONxb2bNzHyDgND3oKGoIfmknrEVnoEU4GUSs+0augUOIn9DIWGUO2ETcRFdsRUnmx9KhPT9Ojbug==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/middleware-stack": "3.342.0", - "@aws-sdk/types": "3.342.0", - "tslib": "^2.5.0" + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=20.0.0" } }, - "node_modules/@aws-sdk/smithy-client/node_modules/@aws-sdk/types": { - "version": "3.342.0", + "node_modules/@aws-sdk/util-endpoints/node_modules/@smithy/node-config-provider": { + "version": "4.3.8", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.3.8.tgz", + "integrity": "sha512-aFP1ai4lrbVlWjfpAfRSL8KFcnJQYfTl5QxLJXY32vghJrDuFyPZ6LtUL+JEGYiFRG1PfPLHLoxj107ulncLIg==", "license": "Apache-2.0", "dependencies": { - "tslib": "^2.5.0" + "@smithy/property-provider": "^4.2.8", + "@smithy/shared-ini-file-loader": "^4.4.3", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/token-providers": { - "version": "3.614.0", + "node_modules/@aws-sdk/util-endpoints/node_modules/@smithy/property-provider": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.2.8.tgz", + "integrity": "sha512-EtCTbyIveCKeOXDSWSdze3k612yCPq1YbXsbqX3UHhkOSW8zKsM9NOJG5gTIya0vbY2DIaieG8pKo1rITHYL0w==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", + "@smithy/types": "^4.12.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sso-oidc": "^3.614.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/token-providers/node_modules/@aws-sdk/types": { - "version": "3.609.0", + "node_modules/@aws-sdk/util-endpoints/node_modules/@smithy/querystring-parser": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.2.8.tgz", + "integrity": "sha512-vUurovluVy50CUlazOiXkPq40KGvGWSdmusa3130MwrR1UNnNgKAlj58wlOe61XSHRpUfIIh6cE0zZ8mzKaDPA==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^3.3.0", + "@smithy/types": "^4.12.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/types": { - "version": "3.692.0", + "node_modules/@aws-sdk/util-endpoints/node_modules/@smithy/shared-ini-file-loader": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.4.3.tgz", + "integrity": "sha512-DfQjxXQnzC5UbCUPeC3Ie8u+rIWZTvuDPAGU/BxzrOGhRvgUanaP68kDZA+jaT3ZI+djOf+4dERGlm9mWfFDrg==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^3.7.0", + "@smithy/types": "^4.12.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/util-arn-parser": { - "version": "3.693.0", + "node_modules/@aws-sdk/util-endpoints/node_modules/@smithy/types": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.12.0.tgz", + "integrity": "sha512-9YcuJVTOBDjg9LWo23Qp0lTQ3D7fQsQtwle0jVfpbUHy9qBwCEgKuVH4FqFB3VYu0nwdHKiEMA+oXz7oV8X1kw==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/util-endpoints": { - "version": "3.637.0", + "node_modules/@aws-sdk/util-endpoints/node_modules/@smithy/url-parser": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.2.8.tgz", + "integrity": "sha512-NQho9U68TGMEU639YkXnVMV3GEFFULmmaWdlu1E9qzyIePOHsoSnagTGSDv1Zi8DCNN6btxOSdgmy5E/hsZwhA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/types": "^3.3.0", - "@smithy/util-endpoints": "^2.0.5", + "@smithy/querystring-parser": "^4.2.8", + "@smithy/types": "^4.12.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/util-endpoints/node_modules/@aws-sdk/types": { - "version": "3.609.0", + "node_modules/@aws-sdk/util-endpoints/node_modules/@smithy/util-endpoints": { + "version": "3.2.8", + "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.2.8.tgz", + "integrity": "sha512-8JaVTn3pBDkhZgHQ8R0epwWt+BqPSLCjdjXXusK1onwJlRuN69fbvSK66aIKKO7SwVFM6x2J2ox5X8pOaWcUEw==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^3.3.0", + "@smithy/node-config-provider": "^4.3.8", + "@smithy/types": "^4.12.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@aws-sdk/util-format-url": { @@ -28960,37 +32458,56 @@ } }, "node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.609.0", + "version": "3.972.2", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.972.2.tgz", + "integrity": "sha512-gz76bUyebPZRxIsBHJUd/v+yiyFzm9adHbr8NykP2nm+z/rFyvQneOHajrUejtmnc5tTBeaDPL4X25TnagRk4A==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/types": "^3.3.0", + "@aws-sdk/types": "^3.973.1", + "@smithy/types": "^4.12.0", "bowser": "^2.11.0", "tslib": "^2.6.2" } }, "node_modules/@aws-sdk/util-user-agent-browser/node_modules/@aws-sdk/types": { - "version": "3.609.0", + "version": "3.973.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.973.1.tgz", + "integrity": "sha512-DwHBiMNOB468JiX6+i34c+THsKHErYUdNQ3HexeXZvVn4zouLjgaS4FejiGSi2HyBuzuyHg7SuOPmjSvoU9NRg==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^3.3.0", + "@smithy/types": "^4.12.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/util-user-agent-browser/node_modules/@smithy/types": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.12.0.tgz", + "integrity": "sha512-9YcuJVTOBDjg9LWo23Qp0lTQ3D7fQsQtwle0jVfpbUHy9qBwCEgKuVH4FqFB3VYu0nwdHKiEMA+oXz7oV8X1kw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, "node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.614.0", + "version": "3.972.2", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.972.2.tgz", + "integrity": "sha512-vnxOc4C6AR7hVbwyFo1YuH0GB6dgJlWt8nIOOJpnzJAWJPkUMPJ9Zv2lnKsSU7TTZbhP2hEO8OZ4PYH59XFv8Q==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/types": "^3.3.0", + "@aws-sdk/middleware-user-agent": "^3.972.3", + "@aws-sdk/types": "^3.973.1", + "@smithy/node-config-provider": "^4.3.8", + "@smithy/types": "^4.12.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=20.0.0" }, "peerDependencies": { "aws-crt": ">=1.0.0" @@ -29002,14 +32519,69 @@ } }, "node_modules/@aws-sdk/util-user-agent-node/node_modules/@aws-sdk/types": { - "version": "3.609.0", + "version": "3.973.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.973.1.tgz", + "integrity": "sha512-DwHBiMNOB468JiX6+i34c+THsKHErYUdNQ3HexeXZvVn4zouLjgaS4FejiGSi2HyBuzuyHg7SuOPmjSvoU9NRg==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^3.3.0", + "@smithy/types": "^4.12.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/util-user-agent-node/node_modules/@smithy/node-config-provider": { + "version": "4.3.8", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.3.8.tgz", + "integrity": "sha512-aFP1ai4lrbVlWjfpAfRSL8KFcnJQYfTl5QxLJXY32vghJrDuFyPZ6LtUL+JEGYiFRG1PfPLHLoxj107ulncLIg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/property-provider": "^4.2.8", + "@smithy/shared-ini-file-loader": "^4.4.3", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/util-user-agent-node/node_modules/@smithy/property-provider": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.2.8.tgz", + "integrity": "sha512-EtCTbyIveCKeOXDSWSdze3k612yCPq1YbXsbqX3UHhkOSW8zKsM9NOJG5gTIya0vbY2DIaieG8pKo1rITHYL0w==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/util-user-agent-node/node_modules/@smithy/shared-ini-file-loader": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.4.3.tgz", + "integrity": "sha512-DfQjxXQnzC5UbCUPeC3Ie8u+rIWZTvuDPAGU/BxzrOGhRvgUanaP68kDZA+jaT3ZI+djOf+4dERGlm9mWfFDrg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/util-user-agent-node/node_modules/@smithy/types": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.12.0.tgz", + "integrity": "sha512-9YcuJVTOBDjg9LWo23Qp0lTQ3D7fQsQtwle0jVfpbUHy9qBwCEgKuVH4FqFB3VYu0nwdHKiEMA+oXz7oV8X1kw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, "node_modules/@aws-sdk/util-utf8-browser": { @@ -44774,7 +48346,7 @@ "@aws-sdk/client-iam": "<3.731.0", "@aws-sdk/client-iot": "~3.693.0", "@aws-sdk/client-iotsecuretunneling": "~3.693.0", - "@aws-sdk/client-lambda": "<3.731.0", + "@aws-sdk/client-lambda": "^3.953.0", "@aws-sdk/client-redshift": "~3.693.0", "@aws-sdk/client-redshift-data": "~3.693.0", "@aws-sdk/client-redshift-serverless": "~3.693.0", diff --git a/packages/core/package.json b/packages/core/package.json index b86854eda31..fe520f2407e 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -603,7 +603,7 @@ "@aws-sdk/client-iam": "<3.731.0", "@aws-sdk/client-iot": "~3.693.0", "@aws-sdk/client-iotsecuretunneling": "~3.693.0", - "@aws-sdk/client-lambda": "<3.731.0", + "@aws-sdk/client-lambda": "^3.953.0", "@aws-sdk/client-redshift": "~3.693.0", "@aws-sdk/client-redshift-data": "~3.693.0", "@aws-sdk/client-redshift-serverless": "~3.693.0", diff --git a/packages/core/src/shared/clients/lambdaClient.ts b/packages/core/src/shared/clients/lambdaClient.ts index 11ce274c448..f12bc71c864 100644 --- a/packages/core/src/shared/clients/lambdaClient.ts +++ b/packages/core/src/shared/clients/lambdaClient.ts @@ -324,7 +324,7 @@ export class DefaultLambdaClient { private async createSdkClient(): Promise { return globals.sdkClientBuilderV3.createAwsService({ - serviceClient: LambdaSdkClient, + serviceClient: LambdaSdkClient as any, userAgent: !this.userAgent, clientOptions: { customUserAgent: this.userAgent, @@ -333,7 +333,7 @@ export class DefaultLambdaClient { requestTimeout: this.defaultTimeoutInMs, }), }, - }) + }) as LambdaSdkClient } } From 8dccd293f9cc03d4ceb6436e412559cd8bfc8999 Mon Sep 17 00:00:00 2001 From: Keen Wilson <40321520+keenwilson@users.noreply.github.com> Date: Thu, 29 Jan 2026 10:58:37 -0800 Subject: [PATCH 14/51] fix(lambda): add console credential fallback for Lambda URI handler (#8537) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Problem - Users without pre-configured credentials encounter authentication errors when opening Lambda functions from console - Credential mismatches between console account and local profile cause errors even when function is accessible in console: - `ResourceNotFoundException` when function exists in console account but not in local profile account - `AccessDeniedException` when local credentials lack `lambda:GetFunction` permission but console credentials have access ## Solution - Add `setupConsoleConnection()` to encapsulate browser-based AWS CLI `aws login` authentication and use the new connection - Add `getFunctionWithFallback()` to retrieve Lambda configuration with automatic console login fallback - Integrate fallback into `openLambdaFolderForEdit()` to handle missing credentials and credential mismatches - Improve error handling to distinguish credential mismatches and resource access issues - Handle `ResourceNotFoundException` by showing account-specific error message before fallback - Handle `AccessDeniedException` by showing permission error message before fallback ### Screenshots #### Show warning message when Lambda GetFunction API returns ResourceNotFoundException, then automatically proceed with console login flow Screenshot 2026-01-29 at 12 29 00 AM #### Show warning message when Lambda GetFunction API returns AccessDeniedException, then automatically proceed with console login flow Screenshot 2026-01-29 at 12 28 07 AM ## Background The Lambda `load-function` URI handler enables a seamless workflow where users can click "Open in Visual Studio Code" from the AWS Lambda console to view, edit, and deploy their Lambda functions directly in their preferred IDE. This feature downloads the function code locally, opens it in VS Code, and allows users to make changes and deploy updates back to AWS—all without leaving their development environment. ## Testing - [X] Tested with no local credentials configured - [X] Tested credential mismatch scenarios: - ResourceNotFoundException (function in console account but not local profile account) - AccessDeniedException (local credentials lack permission, console credentials have access) - [X] Tested user cancellation flow - [X] Test with SSO connection active --- - Treat all work as PUBLIC. Private `feature/x` branches will not be squash-merged at release time. - Your code changes must meet the guidelines in [CONTRIBUTING.md](https://github.com/aws/aws-toolkit-vscode/blob/master/CONTRIBUTING.md#guidelines). - License: I confirm that my contribution is made under the terms of the Apache 2.0 license. --- packages/core/src/auth/consoleSessionUtils.ts | 13 +- .../providers/sharedCredentialsProvider.ts | 2 +- packages/core/src/auth/utils.ts | 31 ++++- .../core/src/lambda/commands/editLambda.ts | 69 +++++++++- packages/core/src/lambda/uriHandlers.ts | 18 ++- .../webview/vue/toolkit/backend_toolkit.ts | 14 +- .../core/src/shared/clients/lambdaClient.ts | 1 + packages/core/src/test/auth/utils.test.ts | 60 +++++++++ .../test/lambda/commands/editLambda.test.ts | 127 ++++++++++++++++++ .../core/src/test/lambda/uriHandlers.test.ts | 38 +++++- .../login/webview/vue/backend_toolkit.test.ts | 27 ++++ ...-e136b0bf-a7f0-45bb-b6b6-5901c7ad04c0.json | 4 + 12 files changed, 374 insertions(+), 30 deletions(-) create mode 100644 packages/core/src/test/auth/utils.test.ts create mode 100644 packages/toolkit/.changes/next-release/Bug Fix-e136b0bf-a7f0-45bb-b6b6-5901c7ad04c0.json diff --git a/packages/core/src/auth/consoleSessionUtils.ts b/packages/core/src/auth/consoleSessionUtils.ts index e05396de6a8..dd9cb62c9a5 100644 --- a/packages/core/src/auth/consoleSessionUtils.ts +++ b/packages/core/src/auth/consoleSessionUtils.ts @@ -16,8 +16,8 @@ import { CancellationError } from '../shared/utilities/timeoutUtils' import { ToolkitError } from '../shared/errors' import { telemetry } from '../shared/telemetry/telemetry' import { Auth } from './auth' -import { CredentialsId, asString } from './providers/credentials' import { createRegionPrompter } from '../shared/ui/common/region' +import { getConnectionIdFromProfile } from './utils' /** * @description Authenticates with AWS using browser-based login via AWS CLI. @@ -289,14 +289,13 @@ export async function authenticateWithConsoleLogin(profileName?: string, region? ) logger.info(`Activating profile: ${profileName}`) - const credentialsId: CredentialsId = { - credentialSource: 'profile', - credentialTypeId: profileName, - } - const connectionId = asString(credentialsId) + const connectionId = getConnectionIdFromProfile(profileName) // Invalidate cached credentials to force fresh fetch getLogger().info(`Invalidated cached credentials for ${connectionId}`) - globals.loginManager.store.invalidateCredentials(credentialsId) + globals.loginManager.store.invalidateCredentials({ + credentialSource: 'profile', + credentialTypeId: profileName, + }) logger.info(`Looking for connection with ID: ${connectionId}`) // Make sure that connection exists before letting other part use connection diff --git a/packages/core/src/auth/providers/sharedCredentialsProvider.ts b/packages/core/src/auth/providers/sharedCredentialsProvider.ts index c74eca406d8..bb0fb9c106c 100644 --- a/packages/core/src/auth/providers/sharedCredentialsProvider.ts +++ b/packages/core/src/auth/providers/sharedCredentialsProvider.ts @@ -113,7 +113,7 @@ export async function handleInvalidConsoleCredentials( `Reloading window to sync with updated credentials cache using connection for profile: ${profileName}` ) const reloadResponse = await vscode.window.showInformationMessage( - `Credentials for "${profileName}" were updated. A window reload is required to apply them. Save your work before continuing. Reload now?`, + `Credentials for profile "${profileName}" were updated. A window reload is required to apply them. Save your work before continuing. Reload now?`, localizedText.yes, localizedText.no ) diff --git a/packages/core/src/auth/utils.ts b/packages/core/src/auth/utils.ts index 28e2bc1123e..82a79283954 100644 --- a/packages/core/src/auth/utils.ts +++ b/packages/core/src/auth/utils.ts @@ -15,7 +15,7 @@ import { createQuickPick, DataQuickPickItem, showQuickPick } from '../shared/ui/ import { isValidResponse } from '../shared/wizards/wizard' import { CancellationError } from '../shared/utilities/timeoutUtils' import { formatError, ToolkitError } from '../shared/errors' -import { asString } from './providers/credentials' +import { CredentialsId, asString } from './providers/credentials' import { TreeNode } from '../shared/treeview/resourceTreeDataProvider' import { createInputBox } from '../shared/ui/inputPrompter' import { CredentialSourceId, telemetry } from '../shared/telemetry/telemetry' @@ -899,3 +899,32 @@ export function isLocalStackConnection(): boolean { globals.globalState.tryGet('aws.toolkit.externalConnection', String, undefined) === localStackConnectionString ) } + +/** + * Constructs a credentials ID from a profile name. + * + * @param profileName - Profile name + * @returns Credentials ID string + */ +export function getConnectionIdFromProfile(profileName: string): string { + const credentialsId: CredentialsId = { + credentialSource: 'profile', + credentialTypeId: profileName, + } + return asString(credentialsId) +} + +/** + * Sets up and activates a console connection via browser login. + * Prompts user to log in via browser, creates a profile-based connection, and sets it as active. + * + * @param profileName - Profile name (typically Lambda function name) + * @param region - AWS region + * @throws Error if console login fails or user cancels + */ +export async function setupConsoleConnection(profileName: string, region: string): Promise { + getLogger().info('Auth: Sets up a connection via browser login for profile: %s, region: %s', profileName, region) + await vscode.commands.executeCommand('aws.toolkit.auth.consoleLogin', profileName, region) + const connectionId = getConnectionIdFromProfile(profileName) + await Auth.instance.useConnection({ id: connectionId }) +} diff --git a/packages/core/src/lambda/commands/editLambda.ts b/packages/core/src/lambda/commands/editLambda.ts index 5ea8169d280..83552999a5c 100644 --- a/packages/core/src/lambda/commands/editLambda.ts +++ b/packages/core/src/lambda/commands/editLambda.ts @@ -4,6 +4,7 @@ */ import * as vscode from 'vscode' import * as nls from 'vscode-nls' +import { GetFunctionCommandOutput } from '@aws-sdk/client-lambda' import { LambdaFunctionNode } from '../explorer/lambdaFunctionNode' import { downloadLambdaInLocation, openLambdaFile } from './downloadLambda' import { LambdaFunction, runUploadDirectory } from './uploadLambda' @@ -24,6 +25,8 @@ import { telemetry } from '../../shared/telemetry/telemetry' import { ToolkitError } from '../../shared/errors' import { getFunctionWithCredentials } from '../../shared/clients/lambdaClient' import { getLogger } from '../../shared/logger/logger' +import { showViewLogsMessage } from '../../shared/utilities/messages' +import { setupConsoleConnection, getIAMConnection } from '../../auth/utils' const localize = nls.loadMessageBundle() @@ -118,8 +121,9 @@ export async function deployFromTemp(lambda: LambdaFunction, projectUri: vscode. await vscode.workspace.saveAll() try { await runUploadDirectory(lambda, 'zip', projectUri) - } catch { - throw new ToolkitError('Failed to deploy Lambda function', { code: 'deployFailure' }) + } catch (error) { + // Chain error to preserve root cause for troubleshooting deployment failures + throw ToolkitError.chain(error, 'Failed to deploy Lambda function', { code: 'deployFailure' }) } await setFunctionInfo(lambda, { lastDeployed: globals.clock.Date.now(), @@ -225,14 +229,67 @@ export async function editLambda(lambda: LambdaFunction, source?: 'workspace' | }) } +/** + * Retrieves Lambda function configuration with automatic fallback to console credentials. + * Handles credential mismatches (ResourceNotFoundException, AccessDeniedException). + * + * Three scenarios: + * 1. No connection exists → Set up console first, try once, if it fails don't retry (because we already used console) + * 2. Connection exists → Try it first, if it fails with credential error, fall back to console + * 3. Connection exists and fails → Retry with console, if that fails, throw (no second retry) + * + * @param name - Lambda function name + * @param region - AWS region + * @returns Lambda function information with a link to download the deployment package + */ +export async function getFunctionWithFallback(name: string, region: string): Promise { + const activeConnection = await getIAMConnection({ prompt: false }) + // Tracks if we've already attempted console credentials + let calledConsoleLogin = false + + // If no connection, create console connection before first attempt + if (!activeConnection) { + await setupConsoleConnection(name, region) + calledConsoleLogin = true + } + + try { + return await getFunctionWithCredentials(region, name) + } catch (error: any) { + // Detect credential mismatches (ResourceNotFoundException, AccessDeniedException) + let message: string | undefined + if (error.name === 'ResourceNotFoundException') { + message = localize('AWS.lambda.open.functionNotFound', 'Function not found in current account.') + } else if (error.name === 'AccessDeniedException') { + message = localize('AWS.lambda.open.accessDenied', 'Local credentials lack permission to access function.') + } + + if (message) { + void showViewLogsMessage(message, 'warn') + getLogger().warn(message) + } + + if (calledConsoleLogin) { + // Skip retry if we just created console connection - error is not due to credential mismatch + throw ToolkitError.chain(error, 'Failed to get Lambda function with console credentials. Retry skipped.') + } else { + // Retry once with console credentials + await setupConsoleConnection(name, region) + return await getFunctionWithCredentials(region, name) + } + } +} + +/** + * Opens a Lambda function for editing in VS Code. + * Retrieves IAM credentials (with console fallback), downloads function code, and opens it in a new workspace. + * Note: IAM credentials are required to interact with AWS resources, even for SSO users. + */ export async function openLambdaFolderForEdit(name: string, region: string) { const downloadLocation = getTempLocation(name, region) - // Do all authentication work before opening workspace to avoid race condition - const getFunctionOutput = await getFunctionWithCredentials(region, name) + const getFunctionOutput = await getFunctionWithFallback(name, region) const configuration = getFunctionOutput.Configuration - - // Download and set up Lambda code before opening workspace await editLambda( { name, diff --git a/packages/core/src/lambda/uriHandlers.ts b/packages/core/src/lambda/uriHandlers.ts index 8ae1d7b8c35..ee80928b703 100644 --- a/packages/core/src/lambda/uriHandlers.ts +++ b/packages/core/src/lambda/uriHandlers.ts @@ -11,10 +11,24 @@ import { openLambdaFolderForEdit } from './commands/editLambda' import { showConfirmationMessage } from '../shared/utilities/messages' import globals from '../shared/extensionGlobals' import { telemetry } from '../shared/telemetry/telemetry' -import { ToolkitError } from '../shared/errors' +import { ToolkitError, isUserCancelledError } from '../shared/errors' const localize = nls.loadMessageBundle() +export function handleLambdaUriError(e: unknown, functionName: string, region: string): never { + // Classify cancellations for telemetry metrics + const message = e instanceof Error ? e.message.toLowerCase() : '' + const isCancellation = isUserCancelledError(e) || message.includes('canceled') || message.includes('cancelled') + + if (isCancellation) { + throw ToolkitError.chain(e, 'User cancelled operation', { cancelled: true }) + } + + // Handle other errors + void vscode.window.showErrorMessage(`Unable to open function ${functionName} in region ${region}: ${e}`) + throw ToolkitError.chain(e, 'Failed to open Lambda function') +} + export function registerLambdaUriHandler() { async function openFunctionHandler(params: ReturnType) { await telemetry.lambda_uriHandler.run(async () => { @@ -34,7 +48,7 @@ export function registerLambdaUriHandler() { } await openLambdaFolderForEdit(params.functionName, params.region) } catch (e) { - throw new ToolkitError(`Unable to get function ${params.functionName} in region ${params.region}: ${e}`) + handleLambdaUriError(e, params.functionName, params.region) } }) } diff --git a/packages/core/src/login/webview/vue/toolkit/backend_toolkit.ts b/packages/core/src/login/webview/vue/toolkit/backend_toolkit.ts index aea498071cb..01a782ab6a1 100644 --- a/packages/core/src/login/webview/vue/toolkit/backend_toolkit.ts +++ b/packages/core/src/login/webview/vue/toolkit/backend_toolkit.ts @@ -4,7 +4,7 @@ */ import * as vscode from 'vscode' -import { tryAddCredentials } from '../../../../auth/utils' +import { setupConsoleConnection, tryAddCredentials } from '../../../../auth/utils' import { getLogger } from '../../../../shared/logger/logger' import { CommonAuthWebview } from '../backend' import { @@ -21,7 +21,6 @@ import { CodeCatalystAuthenticationProvider } from '../../../../codecatalyst/aut import { AuthError, AuthFlowState } from '../types' import { setContext } from '../../../../shared/vscode/setContext' import { builderIdStartUrl } from '../../../../auth/sso/constants' -import { CredentialsId, asString } from '../../../../auth/providers/credentials' import { RegionProfile } from '../../../../codewhisperer/models/model' import { ProfileSwitchIntent } from '../../../../codewhisperer/region/regionProfileManager' import globals from '../../../../shared/extensionGlobals' @@ -91,16 +90,7 @@ export class ToolkitLoginWebview extends CommonAuthWebview { getLogger().debug(`called startConsoleCredentialSetup()`) const runAuth = async () => { try { - // Execute AWS CLI login command - await vscode.commands.executeCommand('aws.toolkit.auth.consoleLogin', profileName, region) - - // Use profile as active connection - const credentialsId: CredentialsId = { - credentialSource: 'profile', - credentialTypeId: profileName, - } - const connectionId = asString(credentialsId) - await Auth.instance.useConnection({ id: connectionId }) + await setupConsoleConnection(profileName, region) // Hide auth view and show resource explorer await setContext('aws.explorer.showAuthView', false) diff --git a/packages/core/src/shared/clients/lambdaClient.ts b/packages/core/src/shared/clients/lambdaClient.ts index f12bc71c864..7a0f77d858d 100644 --- a/packages/core/src/shared/clients/lambdaClient.ts +++ b/packages/core/src/shared/clients/lambdaClient.ts @@ -349,6 +349,7 @@ export async function getFunctionWithCredentials(region: string, name: string): const credentials = connection.type === 'iam' ? await connection.getCredentials() : fromSSO({ profile: connection.id }) + const client = new LambdaSdkClient({ region, credentials }) const command = new GetFunctionCommand({ FunctionName: name }) diff --git a/packages/core/src/test/auth/utils.test.ts b/packages/core/src/test/auth/utils.test.ts new file mode 100644 index 00000000000..d1ac5c586d0 --- /dev/null +++ b/packages/core/src/test/auth/utils.test.ts @@ -0,0 +1,60 @@ +/*! + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +import assert from 'assert' +import * as sinon from 'sinon' +import * as vscode from 'vscode' +import { Auth } from '../../auth/auth' +import { ToolkitError } from '../../shared/errors' +import * as authUtils from '../../auth/utils' + +describe('getConnectionIdFromProfile', function () { + it('constructs connection ID from profile name', function () { + const result = authUtils.getConnectionIdFromProfile('my-profile') + assert.strictEqual(result, 'profile:my-profile') + }) + + it('handles profile names with special characters', function () { + const result = authUtils.getConnectionIdFromProfile('my-profile-123') + assert.strictEqual(result, 'profile:my-profile-123') + }) +}) + +describe('setupConsoleConnection', function () { + let sandbox: sinon.SinonSandbox + + beforeEach(function () { + sandbox = sinon.createSandbox() + }) + + afterEach(function () { + sandbox.restore() + }) + + it('creates connection after successful console login', async function () { + const executeCommandStub = sandbox.stub(vscode.commands, 'executeCommand').resolves() + const useConnectionStub = sandbox.stub(Auth.instance, 'useConnection').resolves() + + await authUtils.setupConsoleConnection('test-profile', 'us-east-1') + + assert.ok(executeCommandStub.calledOnceWith('aws.toolkit.auth.consoleLogin', 'test-profile', 'us-east-1')) + assert.ok(useConnectionStub.calledOnceWith({ id: 'profile:test-profile' })) + }) + + it('throws error when useConnection fails', async function () { + sandbox.stub(vscode.commands, 'executeCommand').resolves() + const error = new Error('useConnection failed') + sandbox.stub(Auth.instance, 'useConnection').rejects(error) + + await assert.rejects(() => authUtils.setupConsoleConnection('test-profile', 'us-east-1'), error) + }) + + it('throws error when console login command fails', async function () { + const error = new ToolkitError('Console login failed') + sandbox.stub(vscode.commands, 'executeCommand').rejects(error) + + await assert.rejects(() => authUtils.setupConsoleConnection('test-profile', 'us-east-1'), error) + }) +}) diff --git a/packages/core/src/test/lambda/commands/editLambda.test.ts b/packages/core/src/test/lambda/commands/editLambda.test.ts index 44d874c14fe..ec9bbffb97a 100644 --- a/packages/core/src/test/lambda/commands/editLambda.test.ts +++ b/packages/core/src/test/lambda/commands/editLambda.test.ts @@ -14,6 +14,7 @@ import { getReadme, deleteFilesInFolder, overwriteChangesForEdit, + getFunctionWithFallback, } from '../../../lambda/commands/editLambda' import { LambdaFunction } from '../../../lambda/commands/uploadLambda' import * as downloadLambda from '../../../lambda/commands/downloadLambda' @@ -25,6 +26,8 @@ import { LambdaFunctionNodeDecorationProvider } from '../../../lambda/explorer/l import path from 'path' import globals from '../../../shared/extensionGlobals' import { lambdaTempPath } from '../../../lambda/utils' +import * as lambdaClient from '../../../shared/clients/lambdaClient' +import * as authUtils from '../../../auth/utils' describe('editLambda', function () { let mockLambda: LambdaFunction @@ -305,3 +308,127 @@ describe('editLambda', function () { }) }) }) + +describe('getFunctionWithFallback', function () { + let getFunctionWithCredentialsStub: sinon.SinonStub + let setupConsoleConnectionStub: sinon.SinonStub + let showViewLogsMessageStub: sinon.SinonStub + let getIAMConnectionStub: sinon.SinonStub + const mockFunction = { Configuration: { FunctionName: 'test' } } + const mockConnection = { + type: 'iam' as const, + id: 'profile:test', + label: 'profile:test', + getCredentials: sinon.stub().resolves({}), + } + + beforeEach(function () { + getFunctionWithCredentialsStub = sinon.stub(lambdaClient, 'getFunctionWithCredentials') + getIAMConnectionStub = sinon.stub(authUtils, 'getIAMConnection') + setupConsoleConnectionStub = sinon.stub(authUtils, 'setupConsoleConnection') + showViewLogsMessageStub = sinon.stub(messages, 'showViewLogsMessage') + }) + + afterEach(function () { + sinon.restore() + }) + + it('returns function when active connection exists and is valid', async function () { + getFunctionWithCredentialsStub.resolves(mockFunction) + getIAMConnectionStub.resolves(mockConnection) + + const result = await getFunctionWithFallback('test-function', 'us-east-1') + + assert.strictEqual(result, mockFunction) + assert(setupConsoleConnectionStub.notCalled) + }) + + it('creates console connection when no active connection exists', async function () { + getFunctionWithCredentialsStub.resolves(mockFunction) + getIAMConnectionStub.resolves(undefined) + setupConsoleConnectionStub.resolves() + + const result = await getFunctionWithFallback('test-function', 'us-east-1') + + assert.strictEqual(result, mockFunction) + assert(setupConsoleConnectionStub.calledOnce) + assert(setupConsoleConnectionStub.calledWith('test-function', 'us-east-1')) + }) + + it('does not retry when console connection was just created and fails', async function () { + const error = new Error('Console creds not working') + error.name = 'Error' + getFunctionWithCredentialsStub.rejects(error) + getIAMConnectionStub.resolves(undefined) + setupConsoleConnectionStub.resolves() + + await assert.rejects( + () => getFunctionWithFallback('test-function', 'us-east-1'), + (err: Error) => + err.message.includes('Failed to get Lambda function with console credentials. Retry skipped.') + ) + + assert(setupConsoleConnectionStub.calledOnce) + assert(showViewLogsMessageStub.notCalled) + }) + + it('retries with console credentials on ResourceNotFoundException with existing connection', async function () { + const error = new Error('Function not found') + error.name = 'ResourceNotFoundException' + getFunctionWithCredentialsStub.onFirstCall().rejects(error) + getFunctionWithCredentialsStub.onSecondCall().resolves(mockFunction) + const mockConnection = { + type: 'iam' as const, + id: 'profile:test', + label: 'profile:test', + getCredentials: sinon.stub().resolves({ accountId: '123456789' }), + } + getIAMConnectionStub.resolves(mockConnection) + + const result = await getFunctionWithFallback('test-function', 'us-east-1') + + assert.strictEqual(result, mockFunction) + assert(setupConsoleConnectionStub.calledOnce) + assert(setupConsoleConnectionStub.calledWith('test-function', 'us-east-1')) + assert(showViewLogsMessageStub.called) + assert.ok(showViewLogsMessageStub.firstCall.args[0].includes('Function not found')) + }) + + it('retries with console credentials on AccessDeniedException with existing connection', async function () { + const error = new Error('User not authorized to perform: lambda:GetFunction on resource') + error.name = 'AccessDeniedException' + getFunctionWithCredentialsStub.onFirstCall().rejects(error) + getFunctionWithCredentialsStub.onSecondCall().resolves(mockFunction) + const mockConnection = { + type: 'iam' as const, + id: 'profile:test', + label: 'profile:test', + getCredentials: sinon.stub().resolves({ accountId: '987654321' }), + } + getIAMConnectionStub.resolves(mockConnection) + + const result = await getFunctionWithFallback('test-function', 'us-east-2') + + assert.strictEqual(result, mockFunction) + assert(setupConsoleConnectionStub.calledOnce) + assert(setupConsoleConnectionStub.calledWith('test-function', 'us-east-2')) + assert(showViewLogsMessageStub.called) + assert.ok(showViewLogsMessageStub.firstCall.args[0].includes('Local credentials lack permission')) + }) + + it('throws error when setupConsoleConnection fails', async function () { + const setupError = new Error('Console setup failed') + getIAMConnectionStub.resolves(undefined) + setupConsoleConnectionStub.rejects(setupError) + + await assert.rejects( + () => getFunctionWithFallback('test-function', 'us-east-1'), + (err: Error) => err.message.includes('Console setup failed') + ) + + // Verify setupConsoleConnection was called only once (in the initial setup) + assert(setupConsoleConnectionStub.calledOnce) + // Verify getFunctionWithCredentials was never called since setup failed + assert(getFunctionWithCredentialsStub.notCalled) + }) +}) diff --git a/packages/core/src/test/lambda/uriHandlers.test.ts b/packages/core/src/test/lambda/uriHandlers.test.ts index f3e8ae7c368..2131e3d057c 100644 --- a/packages/core/src/test/lambda/uriHandlers.test.ts +++ b/packages/core/src/test/lambda/uriHandlers.test.ts @@ -5,8 +5,10 @@ import assert from 'assert' import { SearchParams } from '../../shared/vscode/uriHandler' -import { parseOpenParams } from '../../lambda/uriHandlers' +import { handleLambdaUriError, parseOpenParams } from '../../lambda/uriHandlers' import { globals } from '../../shared' +import { ToolkitError } from '../../shared/errors' +import { CancellationError } from '../../shared/utilities/timeoutUtils' describe('Lambda URI Handler', function () { describe('load-function', function () { @@ -33,4 +35,38 @@ describe('Lambda URI Handler', function () { assert.deepEqual(parseOpenParams(query), valid) }) }) + + describe('handleLambdaUriError', function () { + it('throws cancelled error for CancellationError', function () { + const error = new CancellationError('user') + assert.throws( + () => handleLambdaUriError(error, 'test-fn', 'us-east-1'), + (e: ToolkitError) => e.cancelled === true + ) + }) + + it('throws cancelled error for "canceled" message', function () { + const error = new Error('Canceled') // vscode reload window + assert.throws( + () => handleLambdaUriError(error, 'test-fn', 'us-east-1'), + (e: ToolkitError) => e.cancelled === true + ) + }) + + it('throws cancelled error for "cancelled" message', function () { + const error = new Error('Timeout token cancelled') + assert.throws( + () => handleLambdaUriError(error, 'test-fn', 'us-east-1'), + (e: ToolkitError) => e.cancelled === true + ) + }) + + it('throws non-cancelled error for other errors', function () { + const error = new Error('Unable to get function') + assert.throws( + () => handleLambdaUriError(error, 'test-fn', 'us-east-1'), + (e: ToolkitError) => e.cancelled !== true + ) + }) + }) }) diff --git a/packages/core/src/test/login/webview/vue/backend_toolkit.test.ts b/packages/core/src/test/login/webview/vue/backend_toolkit.test.ts index 1294a2d0574..a65448412b2 100644 --- a/packages/core/src/test/login/webview/vue/backend_toolkit.test.ts +++ b/packages/core/src/test/login/webview/vue/backend_toolkit.test.ts @@ -120,4 +120,31 @@ describe('Toolkit Login', function () { authEnabledFeatures: 'awsExplorer', }) }) + + it('signs in with console credentials and emits telemetry', async function () { + const stub = sandbox.stub(authUtils, 'setupConsoleConnection').resolves() + await backend.startConsoleCredentialSetup(profileName, region) + + assert.ok(stub.calledOnceWith(profileName, region)) + assertTelemetry('auth_addConnection', { + result: 'Succeeded', + credentialSourceId: 'consoleCredentials', + authEnabledFeatures: 'awsExplorer', + }) + }) + + it('returns error when console credential setup fails', async function () { + const error = new Error('Console login failed') + sandbox.stub(authUtils, 'setupConsoleConnection').rejects(error) + + const result = await backend.startConsoleCredentialSetup(profileName, region) + + assert.strictEqual(result?.id, backend.id) + assert.strictEqual(result?.text, 'Console login failed') + assertTelemetry('auth_addConnection', { + result: 'Failed', + credentialSourceId: 'consoleCredentials', + authEnabledFeatures: 'awsExplorer', + }) + }) }) diff --git a/packages/toolkit/.changes/next-release/Bug Fix-e136b0bf-a7f0-45bb-b6b6-5901c7ad04c0.json b/packages/toolkit/.changes/next-release/Bug Fix-e136b0bf-a7f0-45bb-b6b6-5901c7ad04c0.json new file mode 100644 index 00000000000..e4f4733df2b --- /dev/null +++ b/packages/toolkit/.changes/next-release/Bug Fix-e136b0bf-a7f0-45bb-b6b6-5901c7ad04c0.json @@ -0,0 +1,4 @@ +{ + "type": "Bug Fix", + "description": "Opening Lambda functions from AWS Console now works with missing or mismatched local credentials" +} From 44f4ed61412ee57a1212d908b71263b647d3c1fd Mon Sep 17 00:00:00 2001 From: Laxman Reddy <141967714+laileni-aws@users.noreply.github.com> Date: Thu, 29 Jan 2026 11:35:30 -0800 Subject: [PATCH 15/51] fix(amazonq): Enabling fix all feature for warning (#8516) ## Problem - `Amazon Q: Fix all Errors` feature does not work on warning issues. ## Solution - If user click on `Amazon Q: Fix all Issue` feature from warning issue, Q should fix both errors and warnings. - If user click on `Amazon Q: Fix all Issue` feature from error issue, Q should fix only errors. --- - Treat all work as PUBLIC. Private `feature/x` branches will not be squash-merged at release time. - Your code changes must meet the guidelines in [CONTRIBUTING.md](https://github.com/aws/aws-toolkit-vscode/blob/master/CONTRIBUTING.md#guidelines). - License: I confirm that my contribution is made under the terms of the Apache 2.0 license. --- ...-687c5f52-a383-4515-bfba-f3bd4a0741b6.json | 4 ++++ .../lsp/chat/autoDebug/codeActionsProvider.ts | 19 +++++++++++---- .../src/lsp/chat/autoDebug/commands.ts | 13 ++++++----- .../src/lsp/chat/autoDebug/controller.ts | 23 +++++++++++-------- 4 files changed, 39 insertions(+), 20 deletions(-) create mode 100644 packages/amazonq/.changes/next-release/Bug Fix-687c5f52-a383-4515-bfba-f3bd4a0741b6.json diff --git a/packages/amazonq/.changes/next-release/Bug Fix-687c5f52-a383-4515-bfba-f3bd4a0741b6.json b/packages/amazonq/.changes/next-release/Bug Fix-687c5f52-a383-4515-bfba-f3bd4a0741b6.json new file mode 100644 index 00000000000..f255652f0ad --- /dev/null +++ b/packages/amazonq/.changes/next-release/Bug Fix-687c5f52-a383-4515-bfba-f3bd4a0741b6.json @@ -0,0 +1,4 @@ +{ + "type": "Bug Fix", + "description": "Amazon Q: \"Fix All Issues\" now includes warnings when triggered from a warning diagnostic" +} diff --git a/packages/amazonq/src/lsp/chat/autoDebug/codeActionsProvider.ts b/packages/amazonq/src/lsp/chat/autoDebug/codeActionsProvider.ts index aed926eaacf..c2aedb94769 100644 --- a/packages/amazonq/src/lsp/chat/autoDebug/codeActionsProvider.ts +++ b/packages/amazonq/src/lsp/chat/autoDebug/codeActionsProvider.ts @@ -53,8 +53,16 @@ export class AutoDebugCodeActionsProvider implements vscode.CodeActionProvider, // Add "Fix with Amazon Q" action actions.push(this.createFixWithQAction(document, range, diagnostics)) - // Add "Fix All with Amazon Q" action - actions.push(this.createFixAllWithQAction(document)) + // Check if any diagnostic is error or warning to show "Fix All Issues" + const hasErrorOrWarning = diagnostics.some( + (d) => + d.severity === vscode.DiagnosticSeverity.Error || d.severity === vscode.DiagnosticSeverity.Warning + ) + if (hasErrorOrWarning) { + // If triggered from warning, include warnings; if from error, only errors + const hasWarning = diagnostics.some((d) => d.severity === vscode.DiagnosticSeverity.Warning) + actions.push(this.createFixAllWithQAction(document, hasWarning)) + } // Add "Explain Problem" action actions.push(this.createExplainProblemAction(document, range, diagnostics)) @@ -84,12 +92,13 @@ export class AutoDebugCodeActionsProvider implements vscode.CodeActionProvider, return action } - private createFixAllWithQAction(document: vscode.TextDocument): vscode.CodeAction { - const action = new vscode.CodeAction('Amazon Q: Fix All Errors', vscode.CodeActionKind.QuickFix) + private createFixAllWithQAction(document: vscode.TextDocument, includeWarnings: boolean): vscode.CodeAction { + const action = new vscode.CodeAction('Amazon Q: Fix All Issues', vscode.CodeActionKind.QuickFix) action.command = { command: 'amazonq.02.fixAllWithQ', - title: 'Amazon Q: Fix All Errors', + title: 'Amazon Q: Fix All Issues', + arguments: [includeWarnings], } return action diff --git a/packages/amazonq/src/lsp/chat/autoDebug/commands.ts b/packages/amazonq/src/lsp/chat/autoDebug/commands.ts index ecdbf80d1e0..ef320fc70e9 100644 --- a/packages/amazonq/src/lsp/chat/autoDebug/commands.ts +++ b/packages/amazonq/src/lsp/chat/autoDebug/commands.ts @@ -38,10 +38,10 @@ export class AutoDebugCommands implements vscode.Disposable { Commands.register( { id: 'amazonq.02.fixAllWithQ', - name: 'Amazon Q: Fix All Errors', + name: 'Amazon Q: Fix All Issues', }, - async () => { - await this.fixAllWithAmazonQ() + async (includeWarnings?: boolean) => { + await this.fixAllWithAmazonQ(includeWarnings) } ), @@ -124,9 +124,10 @@ export class AutoDebugCommands implements vscode.Disposable { } /** - * Fix All with Amazon Q - processes all errors in the current file + * Fix All with Amazon Q - processes issues in the current file + * @param includeWarnings - if true, fix errors and warnings; if false, fix only errors */ - private async fixAllWithAmazonQ(): Promise { + private async fixAllWithAmazonQ(includeWarnings: boolean = false): Promise { autoDebugTelemetry.recordCommandInvocation('fixAllWithQ') await this.executeWithErrorHandling( @@ -139,7 +140,7 @@ export class AutoDebugCommands implements vscode.Disposable { if (!saved) { throw new Error('Failed to save document') } - const problemCount = await this.controller.fixAllProblemsInFile(10) // 10 errors per batch + const problemCount = await this.controller.fixAllProblemsInFile(includeWarnings) autoDebugTelemetry.recordCommandSuccess('fixAllWithQ', problemCount) }, 'Fix All with Amazon Q', diff --git a/packages/amazonq/src/lsp/chat/autoDebug/controller.ts b/packages/amazonq/src/lsp/chat/autoDebug/controller.ts index 66dcc83b21d..4c294cff5e0 100644 --- a/packages/amazonq/src/lsp/chat/autoDebug/controller.ts +++ b/packages/amazonq/src/lsp/chat/autoDebug/controller.ts @@ -75,11 +75,14 @@ export class AutoDebugController implements vscode.Disposable { } /** - * Filter diagnostics to only errors and apply source filtering + * Filter diagnostics by severity and apply source filtering */ - private filterErrorDiagnostics(diagnostics: vscode.Diagnostic[]): vscode.Diagnostic[] { + private filterDiagnostics(diagnostics: vscode.Diagnostic[], includeWarnings: boolean = false): vscode.Diagnostic[] { return diagnostics.filter((d) => { - if (d.severity !== vscode.DiagnosticSeverity.Error) { + // Filter by severity: errors always, warnings only if includeWarnings + const isError = d.severity === vscode.DiagnosticSeverity.Error + const isWarning = d.severity === vscode.DiagnosticSeverity.Warning + if (!isError && !(includeWarnings && isWarning)) { return false } // Apply source filtering @@ -108,9 +111,11 @@ export class AutoDebugController implements vscode.Disposable { } /** - * Fix with Amazon Q - sends up to 15 error messages one time when user clicks the button + * Fix with Amazon Q - sends up to maxProblems issues when user clicks the button + * @param includeWarnings - if true, fix both errors and warnings; if false, fix only errors + * @param maxProblems - maximum number of problems to fix (default 10) */ - public async fixAllProblemsInFile(maxProblems: number = 15): Promise { + public async fixAllProblemsInFile(includeWarnings: boolean = false, maxProblems: number = 10): Promise { try { const editor = vscode.window.activeTextEditor if (!editor) { @@ -120,13 +125,13 @@ export class AutoDebugController implements vscode.Disposable { // Get all diagnostics for the current file const allDiagnostics = vscode.languages.getDiagnostics(editor.document.uri) - const errorDiagnostics = this.filterErrorDiagnostics(allDiagnostics) - if (errorDiagnostics.length === 0) { + const filteredDiagnostics = this.filterDiagnostics(allDiagnostics, includeWarnings) + if (filteredDiagnostics.length === 0) { return 0 } - // Take up to maxProblems errors (15 by default) - const diagnosticsToFix = errorDiagnostics.slice(0, maxProblems) + // Take up to maxProblems + const diagnosticsToFix = filteredDiagnostics.slice(0, maxProblems) const result = await this.getProblemsFromDiagnostics(undefined, diagnosticsToFix) if (!result) { return 0 From 8f7235f7935f1a124b27b0b2f818c140c282e4aa Mon Sep 17 00:00:00 2001 From: chungjac Date: Thu, 29 Jan 2026 15:46:50 -0800 Subject: [PATCH 16/51] build(amazonq): merge release candidate version rc-20260129 (#8543) This merges the released changes for rc-20260129 into main. MCM-143408862 --------- Co-authored-by: aws-toolkit-automation <> --- package-lock.json | 4 ++-- packages/amazonq/.changes/1.109.0.json | 10 ++++++++++ ...g Fix-687c5f52-a383-4515-bfba-f3bd4a0741b6.json | 4 ---- packages/amazonq/CHANGELOG.md | 4 ++++ packages/amazonq/package.json | 2 +- packages/toolkit/.changes/3.95.0.json | 14 ++++++++++++++ ...g Fix-b1fd8c29-a44d-46a5-8b88-8dcdc2e4dab3.json | 4 ---- ...g Fix-e136b0bf-a7f0-45bb-b6b6-5901c7ad04c0.json | 4 ---- packages/toolkit/CHANGELOG.md | 5 +++++ packages/toolkit/package.json | 2 +- 10 files changed, 37 insertions(+), 16 deletions(-) create mode 100644 packages/amazonq/.changes/1.109.0.json delete mode 100644 packages/amazonq/.changes/next-release/Bug Fix-687c5f52-a383-4515-bfba-f3bd4a0741b6.json create mode 100644 packages/toolkit/.changes/3.95.0.json delete mode 100644 packages/toolkit/.changes/next-release/Bug Fix-b1fd8c29-a44d-46a5-8b88-8dcdc2e4dab3.json delete mode 100644 packages/toolkit/.changes/next-release/Bug Fix-e136b0bf-a7f0-45bb-b6b6-5901c7ad04c0.json diff --git a/package-lock.json b/package-lock.json index e670e359273..ac86fe675d2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -48305,7 +48305,7 @@ }, "packages/amazonq": { "name": "amazon-q-vscode", - "version": "1.109.0-SNAPSHOT", + "version": "1.110.0-SNAPSHOT", "license": "Apache-2.0", "dependencies": { "aws-core-vscode": "file:../core/" @@ -50601,7 +50601,7 @@ }, "packages/toolkit": { "name": "aws-toolkit-vscode", - "version": "3.95.0-SNAPSHOT", + "version": "3.96.0-SNAPSHOT", "license": "Apache-2.0", "dependencies": { "aws-core-vscode": "file:../core/" diff --git a/packages/amazonq/.changes/1.109.0.json b/packages/amazonq/.changes/1.109.0.json new file mode 100644 index 00000000000..b089881ab17 --- /dev/null +++ b/packages/amazonq/.changes/1.109.0.json @@ -0,0 +1,10 @@ +{ + "date": "2026-01-29", + "version": "1.109.0", + "entries": [ + { + "type": "Bug Fix", + "description": "Amazon Q: \"Fix All Issues\" now includes warnings when triggered from a warning diagnostic" + } + ] +} \ No newline at end of file diff --git a/packages/amazonq/.changes/next-release/Bug Fix-687c5f52-a383-4515-bfba-f3bd4a0741b6.json b/packages/amazonq/.changes/next-release/Bug Fix-687c5f52-a383-4515-bfba-f3bd4a0741b6.json deleted file mode 100644 index f255652f0ad..00000000000 --- a/packages/amazonq/.changes/next-release/Bug Fix-687c5f52-a383-4515-bfba-f3bd4a0741b6.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "type": "Bug Fix", - "description": "Amazon Q: \"Fix All Issues\" now includes warnings when triggered from a warning diagnostic" -} diff --git a/packages/amazonq/CHANGELOG.md b/packages/amazonq/CHANGELOG.md index 0d5a0cdfc65..6c363472020 100644 --- a/packages/amazonq/CHANGELOG.md +++ b/packages/amazonq/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.109.0 2026-01-29 + +- **Bug Fix** Amazon Q: "Fix All Issues" now includes warnings when triggered from a warning diagnostic + ## 1.108.0 2026-01-23 - Miscellaneous non-user-facing changes diff --git a/packages/amazonq/package.json b/packages/amazonq/package.json index 46d79c04a19..d59db19269c 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 software development.", - "version": "1.109.0-SNAPSHOT", + "version": "1.110.0-SNAPSHOT", "extensionKind": [ "workspace" ], diff --git a/packages/toolkit/.changes/3.95.0.json b/packages/toolkit/.changes/3.95.0.json new file mode 100644 index 00000000000..2a64273a356 --- /dev/null +++ b/packages/toolkit/.changes/3.95.0.json @@ -0,0 +1,14 @@ +{ + "date": "2026-01-29", + "version": "3.95.0", + "entries": [ + { + "type": "Bug Fix", + "description": "AWS CLI update success message now shows the actual CLI installation path that the Toolkit uses for console credentials." + }, + { + "type": "Bug Fix", + "description": "Opening Lambda functions from AWS Console now works with missing or mismatched local credentials" + } + ] +} \ No newline at end of file diff --git a/packages/toolkit/.changes/next-release/Bug Fix-b1fd8c29-a44d-46a5-8b88-8dcdc2e4dab3.json b/packages/toolkit/.changes/next-release/Bug Fix-b1fd8c29-a44d-46a5-8b88-8dcdc2e4dab3.json deleted file mode 100644 index 1c61937efa4..00000000000 --- a/packages/toolkit/.changes/next-release/Bug Fix-b1fd8c29-a44d-46a5-8b88-8dcdc2e4dab3.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "type": "Bug Fix", - "description": "AWS CLI update success message now shows the actual CLI installation path that the Toolkit uses for console credentials." -} diff --git a/packages/toolkit/.changes/next-release/Bug Fix-e136b0bf-a7f0-45bb-b6b6-5901c7ad04c0.json b/packages/toolkit/.changes/next-release/Bug Fix-e136b0bf-a7f0-45bb-b6b6-5901c7ad04c0.json deleted file mode 100644 index e4f4733df2b..00000000000 --- a/packages/toolkit/.changes/next-release/Bug Fix-e136b0bf-a7f0-45bb-b6b6-5901c7ad04c0.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "type": "Bug Fix", - "description": "Opening Lambda functions from AWS Console now works with missing or mismatched local credentials" -} diff --git a/packages/toolkit/CHANGELOG.md b/packages/toolkit/CHANGELOG.md index c5471d57869..87016bb8be3 100644 --- a/packages/toolkit/CHANGELOG.md +++ b/packages/toolkit/CHANGELOG.md @@ -1,3 +1,8 @@ +## 3.95.0 2026-01-29 + +- **Bug Fix** AWS CLI update success message now shows the actual CLI installation path that the Toolkit uses for console credentials. +- **Bug Fix** Opening Lambda functions from AWS Console now works with missing or mismatched local credentials + ## 3.94.0 2026-01-23 - **Bug Fix** Console session credentials now prompt for window reload when stale, eliminating manual VS Code restarts after token refresh or profile updates (#8488) diff --git a/packages/toolkit/package.json b/packages/toolkit/package.json index f3b965dd6b2..f3facda6d4f 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.95.0-SNAPSHOT", + "version": "3.96.0-SNAPSHOT", "extensionKind": [ "workspace" ], From d908b6e02bf459ae7b81b5947988caf03e4d7236 Mon Sep 17 00:00:00 2001 From: licjun Date: Fri, 30 Jan 2026 10:14:49 -0800 Subject: [PATCH 17/51] feat(lambda): add conditional Tenant ID field to Local Invoke panel (#8520) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add support for multi-tenant Lambda functions by introducing a Tenant ID input field in the Local Invoke configuration panel. The field appears conditionally when the SAM template contains TenancyConfig (either at function-level or in Globals section). The tenant ID value is saved in launch.json and passed to SAM CLI when invoking Lambda functions locally. Screenshot 2026-01-29 at 10 16 29 AM --------- Co-authored-by: Chengjun Li <> --- .../next-release/tenant-id-local-invoke.json | 4 +++ packages/core/package.nls.json | 1 + .../appBuilder/explorer/samProject.ts | 2 ++ .../vue/configEditor/samInvokeBackend.ts | 2 ++ .../vue/configEditor/samInvokeComponent.vue | 15 +++++++++ .../vue/configEditor/samInvokeFrontend.ts | 2 ++ .../src/shared/sam/cli/samCliLocalInvoke.ts | 3 ++ .../debugger/awsSamDebugConfiguration.gen.ts | 4 +++ .../core/src/shared/sam/localLambdaRunner.ts | 1 + .../appBuilder/explorer/samProject.test.ts | 24 ++++++++++++++ .../shared/sam/cli/samCliLocalInvoke.test.ts | 6 ++++ .../core/src/test/shared/sam/samTestUtils.ts | 31 +++++++++++++++++++ packages/toolkit/package.json | 4 +++ 13 files changed, 99 insertions(+) create mode 100644 .changes/next-release/tenant-id-local-invoke.json diff --git a/.changes/next-release/tenant-id-local-invoke.json b/.changes/next-release/tenant-id-local-invoke.json new file mode 100644 index 00000000000..e50f3768bac --- /dev/null +++ b/.changes/next-release/tenant-id-local-invoke.json @@ -0,0 +1,4 @@ +{ + "type": "Feature", + "description": "Add conditional Tenant ID field to Local Invoke panel for multi-tenant Lambda functions. The field appears when SAM template contains TenancyConfig and passes the value to SAM CLI as --tenant-id argument." +} diff --git a/packages/core/package.nls.json b/packages/core/package.nls.json index bdddca69ae8..9595d269ffd 100644 --- a/packages/core/package.nls.json +++ b/packages/core/package.nls.json @@ -59,6 +59,7 @@ "AWS.configuration.description.awssam.debug.memoryMb": "The amount of memory (in Mb) the Lambda function has access to.", "AWS.configuration.description.awssam.debug.runtime": "The Lambda Function's runtime", "AWS.configuration.description.awssam.debug.timeout": "The amount of time (in seconds) that Lambda allows a function to run before stopping it.", + "AWS.configuration.description.awssam.debug.tenantId": "Tenant ID for multi-tenant Lambda functions", "AWS.configuration.description.awssam.debug.aws": "AWS connection details", "AWS.configuration.description.awssam.debug.credentials": "The AWS credentials provider and name to use during the invocation. Example: credential profile \"default\" would be entered as `profile:default`.", "AWS.configuration.description.awssam.debug.credentials.cn": "The Amazon credentials provider and name to use during the invocation. Example: credential profile \"default\" would be entered as `profile:default`.", diff --git a/packages/core/src/awsService/appBuilder/explorer/samProject.ts b/packages/core/src/awsService/appBuilder/explorer/samProject.ts index eedf19ccdc5..445995a2872 100644 --- a/packages/core/src/awsService/appBuilder/explorer/samProject.ts +++ b/packages/core/src/awsService/appBuilder/explorer/samProject.ts @@ -41,6 +41,7 @@ export interface FunctionResourceEntity extends BaseResourceEntity { } CapacityProviderConfig?: string Architectures?: string + TenancyConfig?: string } export interface CapacityProviderResourceEntity extends BaseResourceEntity { @@ -123,6 +124,7 @@ function createResourceEntity(logicalId: string, resource: any, template: any): CapacityProviderConfig: resource.Properties?.CapacityProviderConfig ?? template?.Globals?.Function?.CapacityProviderConfig, Architectures: resource.Properties?.Architectures?.[0] ?? template?.Globals?.Function?.Architectures?.[0], + TenancyConfig: resource.Properties?.TenancyConfig ?? template?.Globals?.Function?.TenancyConfig, } return functionEntity } diff --git a/packages/core/src/lambda/vue/configEditor/samInvokeBackend.ts b/packages/core/src/lambda/vue/configEditor/samInvokeBackend.ts index 2f00d8a4373..1f653e814dc 100644 --- a/packages/core/src/lambda/vue/configEditor/samInvokeBackend.ts +++ b/packages/core/src/lambda/vue/configEditor/samInvokeBackend.ts @@ -48,6 +48,7 @@ export interface ResourceData { runtime: string stackName: string source: string + hasTenancyConfig?: boolean environment?: { Variables: Record } @@ -456,6 +457,7 @@ export async function registerSamDebugInvokeVueCommand( stackName: resource.stackName ?? '', environment: resource.resource.Environment, source: source, + hasTenancyConfig: !!resource.resource.TenancyConfig, }) await telemetry.sam_openConfigUi.run(async (span) => { telemetry.record({ source: 'AppBuilderDebugger' }), diff --git a/packages/core/src/lambda/vue/configEditor/samInvokeComponent.vue b/packages/core/src/lambda/vue/configEditor/samInvokeComponent.vue index e7d09c584c9..9a106378419 100644 --- a/packages/core/src/lambda/vue/configEditor/samInvokeComponent.vue +++ b/packages/core/src/lambda/vue/configEditor/samInvokeComponent.vue @@ -97,6 +97,21 @@ +
+ + + Tenant ID from data: {{ launchConfig.lambda.tenantId }} +
+
diff --git a/packages/core/src/lambda/vue/remoteInvoke/remoteInvokeFrontend.ts b/packages/core/src/lambda/vue/remoteInvoke/remoteInvokeFrontend.ts index a99b6ac075e..7c44e87e56e 100644 --- a/packages/core/src/lambda/vue/remoteInvoke/remoteInvokeFrontend.ts +++ b/packages/core/src/lambda/vue/remoteInvoke/remoteInvokeFrontend.ts @@ -62,6 +62,7 @@ export default defineComponent({ payloadData: { sampleText: '{}', }, + tenantId: undefined, } }, @@ -291,7 +292,8 @@ export default defineComponent({ await client.invokeLambda( this.payloadData.sampleText, this.initialData.Source, - this.debugState.remoteDebuggingEnabled + this.debugState.remoteDebuggingEnabled, + this.tenantId ) await this.syncStateFromWorkspace() }, diff --git a/packages/core/src/shared/clients/lambdaClient.ts b/packages/core/src/shared/clients/lambdaClient.ts index 7a0f77d858d..f0d6fce8c48 100644 --- a/packages/core/src/shared/clients/lambdaClient.ts +++ b/packages/core/src/shared/clients/lambdaClient.ts @@ -66,20 +66,22 @@ export class DefaultLambdaClient { ) } - public async invoke( - name: string, - payload?: BlobPayloadInputTypes, - version?: string, - logtype: 'Tail' | 'None' = 'Tail' - ): Promise { + public async invoke(params: { + name: string + payload?: BlobPayloadInputTypes + version?: string + tenantId?: string + logtype?: 'Tail' | 'None' + }): Promise { const sdkClient = await this.createSdkClient() const response = await sdkClient.send( new InvokeCommand({ - FunctionName: name, - LogType: logtype, - Payload: payload, - Qualifier: version, + FunctionName: params.name, + LogType: params.logtype ?? 'Tail', + Payload: params.payload, + Qualifier: params.version, + TenantId: params.tenantId, }) ) diff --git a/packages/core/src/test/lambda/vue/remoteInvoke/invokeLambda.test.ts b/packages/core/src/test/lambda/vue/remoteInvoke/invokeLambda.test.ts index c39238304f3..5f08fea1a5f 100644 --- a/packages/core/src/test/lambda/vue/remoteInvoke/invokeLambda.test.ts +++ b/packages/core/src/test/lambda/vue/remoteInvoke/invokeLambda.test.ts @@ -69,22 +69,38 @@ describe('RemoteInvokeWebview', () => { }) }) describe('invokeLambda', () => { - it('invokes Lambda function successfully', async () => { - const input = '{"key": "value"}' - const mockResponse = { + let mockResponse: InvocationResponse + let appendedLines: string[] + + beforeEach(() => { + mockResponse = { LogResult: Buffer.from('Test log').toString('base64'), Payload: new TextEncoder().encode('{"result": "success"}'), } satisfies InvocationResponse - client.invoke.resolves(mockResponse) - const appendedLines: string[] = [] + appendedLines = [] outputChannel.appendLine = (line: string) => { appendedLines.push(line) } + }) + + it('invokes Lambda function successfully', async () => { + const input = '{"key": "value"}' + client.invoke.resolves(mockResponse) await remoteInvokeWebview.invokeLambda(input) assert(client.invoke.calledOnce) - assert(client.invoke.calledWith(data.FunctionArn, input, sinon.match.any, 'Tail')) + assert( + client.invoke.calledWith( + sinon.match({ + name: data.FunctionArn, + payload: input, + version: sinon.match.any, + tenantId: sinon.match.any, + logtype: 'Tail', + }) + ) + ) assert.deepStrictEqual(appendedLines, [ 'Loading response...', 'Invocation result for arn:aws:lambda:us-west-2:123456789012:function:testFunction', @@ -97,16 +113,12 @@ describe('RemoteInvokeWebview', () => { ]) }) it('handles Lambda invocation with no payload', async () => { - const mockResponse = { + mockResponse = { LogResult: Buffer.from('Test log').toString('base64'), Payload: new TextEncoder().encode(''), } satisfies InvocationResponse client.invoke.resolves(mockResponse) - const appendedLines: string[] = [] - outputChannel.appendLine = (line: string) => { - appendedLines.push(line) - } await remoteInvokeWebview.invokeLambda('') @@ -122,17 +134,12 @@ describe('RemoteInvokeWebview', () => { ]) }) it('handles Lambda invocation with undefined LogResult', async () => { - const mockResponse = { + mockResponse = { Payload: new TextEncoder().encode('{"result": "success"}'), } satisfies InvocationResponse client.invoke.resolves(mockResponse) - const appendedLines: string[] = [] - outputChannel.appendLine = (line: string) => { - appendedLines.push(line) - } - await remoteInvokeWebview.invokeLambda('{}') assert.deepStrictEqual(appendedLines, [ @@ -928,5 +935,30 @@ describe('RemoteInvokeWebview', () => { // opens in side panel assert.deepStrictEqual(createWebviewPanelArgs[2], { viewColumn: vscode.ViewColumn.Beside }) }) + + it('should check TenancyConfig when function has it', async () => { + const functionNodeWithTenancy = { + ...mockFunctionNode, + configuration: { + ...mockFunctionNode.configuration, + TenancyConfig: { TenantIsolationMode: 'PER_TENANT' }, + }, + } + + const webview = new RemoteInvokeWebview(outputChannel, client as any, client as any, { + ...data, + LambdaFunctionNode: functionNodeWithTenancy as any, + }) + + const initialData = webview.init() + assert.ok(initialData.LambdaFunctionNode?.configuration?.TenancyConfig) + }) + + it('should check TenancyConfig when function does not have it', async () => { + const webview = new RemoteInvokeWebview(outputChannel, client as any, client as any, data) + + const initialData = webview.init() + assert.strictEqual(initialData.LambdaFunctionNode?.configuration?.TenancyConfig, undefined) + }) }) }) diff --git a/packages/core/src/test/lambda/vue/remoteInvoke/invokeLambdaDebugging.test.ts b/packages/core/src/test/lambda/vue/remoteInvoke/invokeLambdaDebugging.test.ts index 79f7863cd09..0d642c28200 100644 --- a/packages/core/src/test/lambda/vue/remoteInvoke/invokeLambdaDebugging.test.ts +++ b/packages/core/src/test/lambda/vue/remoteInvoke/invokeLambdaDebugging.test.ts @@ -386,7 +386,15 @@ describe('RemoteInvokeWebview - Debugging Functionality', () => { await remoteInvokeWebview.invokeLambda('{"test": "input"}', 'test', true) - assert(client.invoke.calledWith(data.FunctionArn, '{"test": "input"}', 'v1')) + assert( + client.invoke.calledWith( + sinon.match({ + name: data.FunctionArn, + payload: '{"test": "input"}', + version: 'v1', + }) + ) + ) assert(focusStub.calledWith('workbench.action.focusFirstEditorGroup')) }) @@ -509,7 +517,15 @@ describe('RemoteInvokeWebview - Debugging Functionality', () => { await remoteInvokeWebview.invokeLambda('{"debugInput": "test"}', 'integration-test', true) // Verify invocation was called with correct parameters - assert(client.invoke.calledWith(data.FunctionArn, '{"debugInput": "test"}', '$LATEST')) + assert( + client.invoke.calledWith( + sinon.match({ + name: data.FunctionArn, + payload: '{"debugInput": "test"}', + version: '$LATEST', + }) + ) + ) // 3. Stop debugging await remoteInvokeWebview.stopDebugging() @@ -570,7 +586,15 @@ describe('RemoteInvokeWebview - Debugging Functionality', () => { await remoteInvokeWebview.invokeLambda('{"versionInput": "test"}', 'version-test', true) // Should invoke with version qualifier - assert(client.invoke.calledWith(data.FunctionArn, '{"versionInput": "test"}', 'v1')) + assert( + client.invoke.calledWith( + sinon.match({ + name: data.FunctionArn, + payload: '{"versionInput": "test"}', + version: 'v1', + }) + ) + ) // Stop debugging await remoteInvokeWebview.stopDebugging() diff --git a/packages/core/src/test/lambda/vue/remoteInvoke/remoteInvoke.test.ts b/packages/core/src/test/lambda/vue/remoteInvoke/remoteInvoke.test.ts index 29527de6ed7..f007bd20d8f 100644 --- a/packages/core/src/test/lambda/vue/remoteInvoke/remoteInvoke.test.ts +++ b/packages/core/src/test/lambda/vue/remoteInvoke/remoteInvoke.test.ts @@ -40,12 +40,14 @@ describe('RemoteInvokeWebview', function () { name: string data: any expectedQualifier: string | undefined + expectedTenantId: string | undefined expectedLogType: 'Tail' | 'None' }[] = [ { name: 'should invoke with a simple payload', data: mockData, expectedQualifier: undefined, + expectedTenantId: undefined, expectedLogType: 'Tail', }, { @@ -61,6 +63,7 @@ describe('RemoteInvokeWebview', function () { }, }, expectedQualifier: undefined, + expectedTenantId: undefined, expectedLogType: 'None', }, { @@ -76,6 +79,7 @@ describe('RemoteInvokeWebview', function () { }, }, expectedQualifier: '$LATEST', + expectedTenantId: undefined, expectedLogType: 'Tail', }, { @@ -94,6 +98,7 @@ describe('RemoteInvokeWebview', function () { }, }, expectedQualifier: '$LATEST.PUBLISHED', + expectedTenantId: undefined, expectedLogType: 'None', }, ] @@ -106,14 +111,47 @@ describe('RemoteInvokeWebview', function () { sinon.assert.calledOnce(client.invoke) sinon.assert.calledWith( client.invoke, - scenario.data.FunctionArn, - input, - scenario.expectedQualifier, - scenario.expectedLogType + sinon.match({ + name: scenario.data.FunctionArn, + payload: input, + version: scenario.expectedQualifier, + tenantId: scenario.expectedTenantId, + logtype: scenario.expectedLogType, + }) ) }) } + it('should invoke multi-tenant function with tenant ID', async function () { + const tenantId = 'test-tenant-123' + const multiTenantData = { + FunctionArn: 'arn:aws:lambda:us-west-2:123456789012:function:my-function', + LambdaFunctionNode: { + configuration: { + TenancyConfig: { + TenantIsolationMode: 'PER_TENANT', + }, + }, + }, + } as any + + const remoteInvokeWebview = new RemoteInvokeWebview(outputChannel, client, client, multiTenantData) + client.invoke.resolves(mockResponse) + await remoteInvokeWebview.invokeLambda(input, undefined, false, tenantId) + + sinon.assert.calledOnce(client.invoke) + sinon.assert.calledWith( + client.invoke, + sinon.match({ + name: multiTenantData.FunctionArn, + payload: input, + version: undefined, + tenantId: tenantId, + logtype: 'Tail', + }) + ) + }) + const mockEvent = { name: 'TestEvent', arn: 'arn:aws:lambda:us-west-2:123456789012:function:myFunction', From 342f2a9461a6ccf579e5cfcdb2a4d39bdfd7e3f3 Mon Sep 17 00:00:00 2001 From: Laxman Reddy <141967714+laileni-aws@users.noreply.github.com> Date: Wed, 11 Feb 2026 12:19:56 -0800 Subject: [PATCH 20/51] fix(amazonq): adding change log (#8574) ## Notes: - Adding change log for https://github.com/aws/language-servers/pull/2610 --- - Treat all work as PUBLIC. Private `feature/x` branches will not be squash-merged at release time. - Your code changes must meet the guidelines in [CONTRIBUTING.md](https://github.com/aws/aws-toolkit-vscode/blob/master/CONTRIBUTING.md#guidelines). - License: I confirm that my contribution is made under the terms of the Apache 2.0 license. --- .../Bug Fix-44470ad8-e5a1-4388-8801-4236467932e7.json | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 packages/amazonq/.changes/next-release/Bug Fix-44470ad8-e5a1-4388-8801-4236467932e7.json diff --git a/packages/amazonq/.changes/next-release/Bug Fix-44470ad8-e5a1-4388-8801-4236467932e7.json b/packages/amazonq/.changes/next-release/Bug Fix-44470ad8-e5a1-4388-8801-4236467932e7.json new file mode 100644 index 00000000000..64c8afd1e77 --- /dev/null +++ b/packages/amazonq/.changes/next-release/Bug Fix-44470ad8-e5a1-4388-8801-4236467932e7.json @@ -0,0 +1,4 @@ +{ + "type": "Bug Fix", + "description": "Amazon Q Chat: Fix chat history restoration to display rich UI elements and persist user preferences" +} From 6e373097b9166b0b2fabb25f0548f28f1cf82644 Mon Sep 17 00:00:00 2001 From: Bhargav Date: Wed, 11 Feb 2026 14:50:15 -0800 Subject: [PATCH 21/51] feat(smus): Add domain caching for IdC login (#8564) **Description** Added a local cache that will list the last 10 recently used domains during login. The data is stored in the memento storage, which is VSCode's SQLite DB abstraction for storing metadata for extensions. **Motivation** Better UX for login for customers who use multiple domains **Testing Done** Tested locally and also added unit tests ## Problem ## Solution --- - Treat all work as PUBLIC. Private `feature/x` branches will not be squash-merged at release time. - Your code changes must meet the guidelines in [CONTRIBUTING.md](https://github.com/aws/aws-toolkit-vscode/blob/master/CONTRIBUTING.md#guidelines). - License: I confirm that my contribution is made under the terms of the Apache 2.0 license. Co-authored-by: Bhargava Varadharajan --- .../auth/authenticationOrchestrator.ts | 127 ++++++--- .../auth/ui/ssoAuthentication.ts | 89 ++++-- .../authenticationPreferences.ts | 0 .../auth/utils/domainCache.ts | 150 ++++++++++ .../nodes/sageMakerUnifiedStudioRootNode.ts | 4 +- packages/core/src/shared/globalState.ts | 1 + .../auth/authenticationOrchestrator.test.ts | 79 ++++++ .../authenticationPreferences.test.ts | 2 +- .../auth/utils/domainCache.test.ts | 263 ++++++++++++++++++ 9 files changed, 660 insertions(+), 55 deletions(-) rename packages/core/src/sagemakerunifiedstudio/auth/{preferences => utils}/authenticationPreferences.ts (100%) create mode 100644 packages/core/src/sagemakerunifiedstudio/auth/utils/domainCache.ts rename packages/core/src/test/sagemakerunifiedstudio/auth/{preferences => utils}/authenticationPreferences.test.ts (99%) create mode 100644 packages/core/src/test/sagemakerunifiedstudio/auth/utils/domainCache.test.ts diff --git a/packages/core/src/sagemakerunifiedstudio/auth/authenticationOrchestrator.ts b/packages/core/src/sagemakerunifiedstudio/auth/authenticationOrchestrator.ts index 208f7ccd95c..fb36ade95f1 100644 --- a/packages/core/src/sagemakerunifiedstudio/auth/authenticationOrchestrator.ts +++ b/packages/core/src/sagemakerunifiedstudio/auth/authenticationOrchestrator.ts @@ -8,6 +8,7 @@ import { getLogger } from '../../shared/logger/logger' import { ToolkitError } from '../../shared/errors' import { SmusErrorCodes } from '../shared/smusUtils' import { SmusAuthenticationProvider } from './providers/smusAuthenticationProvider' +import { CredentialsProvider } from '../../auth/providers/credentials' import { SmusSsoAuthenticationUI } from './ui/ssoAuthentication' import { @@ -16,9 +17,10 @@ import { IamProfileEditingInProgress, IamProfileBackNavigation, } from './ui/iamProfileSelection' -import { SmusAuthenticationPreferencesManager } from './preferences/authenticationPreferences' +import { SmusAuthenticationPreferencesManager } from './utils/authenticationPreferences' import { DataZoneCustomClientHelper } from '../shared/client/datazoneCustomClientHelper' import { recordAuthTelemetry } from '../shared/telemetry' +import { updateRecentDomains, removeDomainFromCache } from './utils/domainCache' export type SmusAuthenticationMethod = 'sso' | 'iam' @@ -49,14 +51,12 @@ export class SmusAuthenticationOrchestrator { existingProfileName?: string, existingRegion?: string ): Promise { - const logger = this.logger - try { let profileSelection: IamProfileSelection | IamProfileEditingInProgress | IamProfileBackNavigation // If profile and region are provided, skip profile selection (re-authentication case) if (existingProfileName && existingRegion) { - logger.debug( + this.logger.debug( `Auth: Re-authenticating with existing profile: ${existingProfileName}, region: ${existingRegion}` ) profileSelection = { @@ -71,29 +71,29 @@ export class SmusAuthenticationOrchestrator { // Handle different result types if ('isBack' in profileSelection) { // User chose to go back to authentication method selection - logger.debug('User chose to go back to authentication method selection') + this.logger.debug('User chose to go back to authentication method selection') return { status: 'BACK' } } if ('isEditing' in profileSelection) { // User chose to edit credentials or is in editing mode - logger.debug('User is editing credentials') + this.logger.debug('User is editing credentials') return { status: 'EDITING' } } // At this point, we have a profile selected - logger.debug(`Selected profile: ${profileSelection.profileName}, region: ${profileSelection.region}`) + this.logger.debug(`Selected profile: ${profileSelection.profileName}, region: ${profileSelection.region}`) // Validate the selected profile const validation = await authProvider.validateIamProfile(profileSelection.profileName) if (!validation.isValid) { - logger.debug(`Profile validation failed: ${validation.error}`) + this.logger.debug(`Profile validation failed: ${validation.error}`) return { status: 'INVALID_PROFILE', error: validation.error || 'Profile validation failed' } } // Discover IAM-based domain using IAM credential. If IAM-based domain is not present, we should throw an appropriate error // and exit - logger.debug('Discovering IAM-based domain using IAM credentials') + this.logger.debug('Discovering IAM-based domain using IAM credentials') const domainUrl = await this.findSmusIamDomain( authProvider, @@ -121,7 +121,7 @@ export class SmusAuthenticationOrchestrator { }) } - logger.info( + this.logger.info( `Successfully connected with IAM profile ${profileSelection.profileName} in region ${profileSelection.region} to IAM-based domain` ) @@ -129,22 +129,22 @@ export class SmusAuthenticationOrchestrator { const domainId = connection.domainId const region = authProvider.getDomainRegion() - logger.info(`Connected to SageMaker Unified Studio domain: ${domainId} in region ${region}`) + this.logger.info(`Connected to SageMaker Unified Studio domain: ${domainId} in region ${region}`) await this.recordAuthTelemetry(span, authProvider, domainId, region) // Refresh the tree view to show authenticated state try { await vscode.commands.executeCommand('aws.smus.rootView.refresh') } catch (refreshErr) { - logger.debug(`Failed to refresh views after login: ${(refreshErr as Error).message}`) + this.logger.debug(`Failed to refresh views after login: ${(refreshErr as Error).message}`) } // After successful IAM authentication (IAM mode), automatically open project picker - logger.debug('IAM authentication successful, opening project picker') + this.logger.debug('IAM authentication successful, opening project picker') try { await vscode.commands.executeCommand('aws.smus.switchProject') } catch (pickerErr) { - logger.debug(`Failed to open project picker: ${(pickerErr as Error).message}`) + this.logger.debug(`Failed to open project picker: ${(pickerErr as Error).message}`) } // Ask to remember authentication method preference (non-blocking) @@ -158,11 +158,11 @@ export class SmusAuthenticationOrchestrator { error instanceof ToolkitError && (error.code === SmusErrorCodes.UserCancelled || error.code === SmusErrorCodes.IamDomainNotFound) ) { - logger.debug('IAM authentication cancelled by user or failed due to customer error') + this.logger.debug('IAM authentication cancelled by user or failed due to customer error') throw error // Re-throw to be handled by the main loop } else { // Log the error for actual failures - logger.error('IAM authentication failed: %s', (error as Error).message) + this.logger.error('IAM authentication failed: %s', (error as Error).message) throw error } } @@ -176,23 +176,22 @@ export class SmusAuthenticationOrchestrator { span: any, context: vscode.ExtensionContext ): Promise { - const logger = this.logger - logger.debug('Starting SSO authentication flow') + this.logger.debug('Starting SSO authentication flow') // Show domain URL input dialog with back button support const domainUrl = await SmusSsoAuthenticationUI.showDomainUrlInput() - logger.debug(`Domain URL input result: ${domainUrl ? 'provided' : 'cancelled or back'}`) + this.logger.debug(`Domain URL input result: ${domainUrl ? 'provided' : 'cancelled or back'}`) if (domainUrl === 'BACK') { // User wants to go back to authentication method selection - logger.debug('User chose to go back from domain URL input') + this.logger.debug('User chose to go back from domain URL input') return { status: 'BACK' } } if (!domainUrl) { // User cancelled - logger.debug('User cancelled domain URL input') + this.logger.debug('User cancelled domain URL input') throw new ToolkitError('User cancelled domain URL input', { cancelled: true, code: SmusErrorCodes.UserCancelled, @@ -213,9 +212,40 @@ export class SmusAuthenticationOrchestrator { const domainId = connection.domainId const region = authProvider.getDomainRegion() // Use the auth provider method that handles both connection types - logger.info(`Connected to SageMaker Unified Studio domain: ${domainId} in region ${region}`) + this.logger.info(`Connected to SageMaker Unified Studio domain: ${domainId} in region ${region}`) await this.recordAuthTelemetry(span, authProvider, domainId, region) + // Update domain cache after successful authentication with domain name + try { + // Try to fetch domain name from DataZone + let domainName: string | undefined + try { + this.logger.debug(`Fetching domain name for domain ID: ${domainId} in region: ${region}`) + + // Get DataZone client helper instance + const datazoneHelper = DataZoneCustomClientHelper.getInstance( + (await authProvider.getDerCredentialsProvider()) as CredentialsProvider, + region + ) + + // Fetch domain information + const domainInfo = await datazoneHelper.getDomain(domainId) + domainName = domainInfo.name + + this.logger.debug(`Successfully fetched domain name: ${domainName}`) + } catch (fetchErr) { + // If we can't fetch the domain name, that's okay - we'll cache without it + this.logger.warn(`Failed to fetch domain name from DataZone: ${(fetchErr as Error).message}`) + } + + // Update cache with domain URL and optional name + await updateRecentDomains(domainUrl, domainName) + this.logger.debug(`Updated domain cache with: ${domainUrl}${domainName ? ` (${domainName})` : ''}`) + } catch (cacheErr) { + // Cache failures should not block authentication flow + this.logger.warn(`Failed to update domain cache: ${(cacheErr as Error).message}`) + } + // Ask to remember authentication method preference await this.askToRememberAuthMethod(context, 'sso') @@ -223,16 +253,19 @@ export class SmusAuthenticationOrchestrator { try { await vscode.commands.executeCommand('aws.smus.rootView.refresh') } catch (refreshErr) { - logger.debug(`Failed to refresh views after login: ${(refreshErr as Error).message}`) + this.logger.debug(`Failed to refresh views after login: ${(refreshErr as Error).message}`) } return { status: 'SUCCESS' } } catch (connectionErr) { + // Handle authentication errors and update cache accordingly + await this.handleAuthenticationError(domainUrl, connectionErr as Error) + // Clear the status bar message vscode.window.setStatusBarMessage('Connection to SageMaker Unified Studio Failed') // Log the error and re-throw to be handled by the outer catch block - logger.error('Connection failed: %s', (connectionErr as Error).message) + this.logger.error('Connection failed: %s', (connectionErr as Error).message) throw new ToolkitError('Connection failed.', { cause: connectionErr as Error, code: (connectionErr as Error).name, @@ -240,6 +273,32 @@ export class SmusAuthenticationOrchestrator { } } + /** + * Handles authentication errors and updates domain cache accordingly + * @param domainUrl The domain URL that failed authentication + * @param error The error that occurred during authentication + */ + private static async handleAuthenticationError(domainUrl: string, error: Error): Promise { + const errorCode = (error as any).code + + // Check if failure is due to invalid URL format + if (errorCode === SmusErrorCodes.InvalidDomainUrl) { + // Validation error - remove from cache + try { + await removeDomainFromCache(domainUrl) + this.logger.info(`Removed invalid domain from cache: ${domainUrl}`) + } catch (cacheErr) { + this.logger.warn(`Failed to remove domain from cache: ${(cacheErr as Error).message}`) + } + } else if (errorCode === SmusErrorCodes.ApiTimeout || errorCode === SmusErrorCodes.FailedToConnect) { + // Network error - keep in cache for retry + this.logger.warn(`Network error for domain ${domainUrl}, keeping in cache for retry`) + } else { + // Authentication error or other errors - keep in cache + this.logger.warn(`Authentication failed for domain ${domainUrl}, keeping in cache`) + } + } + /** * Asks the user if they want to remember their authentication method choice after successful login */ @@ -247,8 +306,6 @@ export class SmusAuthenticationOrchestrator { context: vscode.ExtensionContext, method: SmusAuthenticationMethod ): Promise { - const logger = this.logger - try { const methodName = method === 'sso' ? 'SSO Authentication' : 'IAM Credential Profile' @@ -259,13 +316,13 @@ export class SmusAuthenticationOrchestrator { ) if (result === 'Yes') { - logger.debug(`Saving user preference: ${method}`) + this.logger.debug(`Saving user preference: ${method}`) await SmusAuthenticationPreferencesManager.setPreferredMethod(context, method, true) - logger.debug(`Preference saved successfully`) + this.logger.debug(`Preference saved successfully`) } } catch (error) { // Not a hard failure, so not throwing error - logger.warn('Error asking to remember auth method: %s', error) + this.logger.warn('Error asking to remember auth method: %s', error) } } @@ -281,10 +338,8 @@ export class SmusAuthenticationOrchestrator { profileName: string, region: string ): Promise { - const logger = this.logger - try { - logger.debug(`Finding IAM-based domain in region ${region} using profile ${profileName}`) + this.logger.debug(`Finding IAM-based domain in region ${region} using profile ${profileName}`) // Get DataZoneCustomClientHelper instance const datazoneCustomClientHelper = DataZoneCustomClientHelper.getInstance( @@ -296,19 +351,19 @@ export class SmusAuthenticationOrchestrator { const iamDomain = await datazoneCustomClientHelper.getIamDomain() if (!iamDomain) { - logger.warn(`No IAM-based domain found in region ${region}`) + this.logger.warn(`No IAM-based domain found in region ${region}`) return undefined } - logger.debug(`Found IAM-based domain: ${iamDomain.name} (${iamDomain.id})`) + this.logger.debug(`Found IAM-based domain: ${iamDomain.name} (${iamDomain.id})`) // Construct domain URL from the IAM-based domain const domainUrl = iamDomain.portalUrl || `https://${iamDomain.id}.sagemaker.${region}.on.aws/` - logger.info(`Discovered IAM-based domain URL: ${domainUrl}`) + this.logger.info(`Discovered IAM-based domain URL: ${domainUrl}`) return domainUrl } catch (error) { - logger.error(`Failed to find IAM-based domain: %s`, error) + this.logger.error(`Failed to find IAM-based domain: %s`, error) throw new ToolkitError(`Failed to find IAM-based domain: ${(error as Error).message}`, { code: SmusErrorCodes.ApiTimeout, cause: error instanceof Error ? error : undefined, diff --git a/packages/core/src/sagemakerunifiedstudio/auth/ui/ssoAuthentication.ts b/packages/core/src/sagemakerunifiedstudio/auth/ui/ssoAuthentication.ts index 2d2efaa15f8..374d657ba9e 100644 --- a/packages/core/src/sagemakerunifiedstudio/auth/ui/ssoAuthentication.ts +++ b/packages/core/src/sagemakerunifiedstudio/auth/ui/ssoAuthentication.ts @@ -5,6 +5,7 @@ import * as vscode from 'vscode' import { SmusUtils } from '../../shared/smusUtils' +import { getRecentDomains, removeDomainFromCache, formatTimestamp } from '../utils/domainCache' /** * SSO authentication UI components for SMUS @@ -17,7 +18,7 @@ export class SmusSsoAuthenticationUI { return new Promise((resolve) => { const quickPick = vscode.window.createQuickPick() quickPick.title = 'SageMaker Unified Studio Authentication' - quickPick.placeholder = 'Enter your SageMaker Unified Studio Domain URL' + quickPick.placeholder = 'Select a recent domain or enter a new domain URL' quickPick.canSelectMany = false quickPick.ignoreFocusOut = true @@ -25,14 +26,43 @@ export class SmusSsoAuthenticationUI { const backButton = vscode.QuickInputButtons.Back quickPick.buttons = [backButton] - // Start with placeholder item - quickPick.items = [ - { - label: '$(globe) Enter Domain URL', - description: 'e.g., https://dzd_xxxxxxxxx.sagemaker.region.on.aws', - detail: 'Type your SageMaker Unified Studio domain URL above', - }, - ] + // Create delete button for items + const deleteButton: vscode.QuickInputButton = { + iconPath: new vscode.ThemeIcon('trash'), + tooltip: 'Delete this domain', + } + + // Function to build items list + const buildItemsList = () => { + const cachedDomains = getRecentDomains() + const items: vscode.QuickPickItem[] = [] + + // Add cached domains as clickable items with delete button + for (const domain of cachedDomains) { + // Use domain name if available, otherwise use domain ID + const displayName = domain.domainName || domain.domainId + + items.push({ + label: `$(globe) ${displayName} (${domain.region})`, + description: domain.domainId, + detail: `Last used: ${formatTimestamp(domain.lastUsedTimestamp)}`, + alwaysShow: true, + buttons: [deleteButton], + }) + } + + return { items, cachedDomains } + } + + // Initial load + let cachedDomains: ReturnType + const refreshItems = () => { + const result = buildItemsList() + cachedDomains = result.cachedDomains + quickPick.items = result.items + } + + refreshItems() let isCompleted = false @@ -44,15 +74,42 @@ export class SmusSsoAuthenticationUI { } }) + quickPick.onDidTriggerItemButton(async (event) => { + if (event.button === deleteButton) { + // Find the domain to delete + const itemToDelete = event.item + const domainToDelete = cachedDomains.find((d) => itemToDelete.description === d.domainId) + + if (domainToDelete) { + // Remove from cache + await removeDomainFromCache(domainToDelete.domainUrl) + + // Refresh the list + refreshItems() + } + } + }) + + quickPick.onDidChangeSelection((items) => { + if (items.length > 0) { + const selected = items[0] + + // Check if user selected a cached domain (match by domain ID in description) + const cachedDomain = cachedDomains.find((d) => selected.description === d.domainId) + + if (cachedDomain) { + // User clicked a cached domain - use it immediately + isCompleted = true + quickPick.dispose() + resolve(cachedDomain.domainUrl) + } + } + }) + quickPick.onDidChangeValue((value) => { if (!value) { - quickPick.items = [ - { - label: '$(globe) Enter Domain URL', - description: 'e.g., https://dzd_xxxxxxxxx.sagemaker.region.on.aws', - detail: 'Type your SageMaker Unified Studio domain URL above', - }, - ] + // Reset to initial items when input is cleared + refreshItems() return } diff --git a/packages/core/src/sagemakerunifiedstudio/auth/preferences/authenticationPreferences.ts b/packages/core/src/sagemakerunifiedstudio/auth/utils/authenticationPreferences.ts similarity index 100% rename from packages/core/src/sagemakerunifiedstudio/auth/preferences/authenticationPreferences.ts rename to packages/core/src/sagemakerunifiedstudio/auth/utils/authenticationPreferences.ts diff --git a/packages/core/src/sagemakerunifiedstudio/auth/utils/domainCache.ts b/packages/core/src/sagemakerunifiedstudio/auth/utils/domainCache.ts new file mode 100644 index 00000000000..8abfeb8a557 --- /dev/null +++ b/packages/core/src/sagemakerunifiedstudio/auth/utils/domainCache.ts @@ -0,0 +1,150 @@ +/*! + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +import globals from '../../../shared/extensionGlobals' +import { getLogger } from '../../../shared/logger/logger' +import { SmusUtils } from '../../shared/smusUtils' + +const logger = getLogger('smus') + +/** + * Domain cache utility for SageMaker Unified Studio (SMUS) authentication. + * + * This module provides functionality to cache recently used + * domain URLs, eliminating the need for users to manually re-enter their domain + * URL on each authentication attempt. + */ + +/** + * Represents a cached domain entry with metadata + */ +export interface DomainCacheEntry { + /** Full domain URL (e.g., "https://dzd_abc123.sagemaker.us-east-1.on.aws") */ + domainUrl: string + /** Extracted domain ID (e.g., "dzd_abc123") */ + domainId: string + /** AWS region (e.g., "us-east-1") */ + region: string + /** User-friendly domain name from DataZone GetDomain API (optional) */ + domainName?: string + /** ISO 8601 timestamp of when domain was last used */ + lastUsedTimestamp: string +} + +/** + * Storage key for domain cache in globalState + */ +export const domainCacheKey = 'aws.smus.recentDomains' + +/** + * Maximum number of domains to cache + */ +export const maxCachedDomains = 10 + +/** + * Storage structure for domain cache + */ +interface DomainCacheStorage { + domains: DomainCacheEntry[] +} + +/** + * Gets recently used domain URLs from cache + * @returns Array of domain entries, ordered from most recent to oldest (max 10) + */ +export function getRecentDomains(): DomainCacheEntry[] { + const cache = globals.globalState.tryGet(domainCacheKey, Object, { domains: [] }) + return cache.domains || [] +} + +/** + * Adds or updates a domain in the cache + * If domain already exists, updates its timestamp and moves to front + * If cache is full (10 entries), removes oldest entry + * @param domainUrl The domain URL to cache + * @param domainName Optional user-friendly domain name from DataZone + */ +export async function updateRecentDomains(domainUrl: string, domainName?: string): Promise { + try { + const domains = getRecentDomains() + + // Extract domain metadata using SmusUtils + const { domainId, region } = SmusUtils.extractDomainInfoFromUrl(domainUrl) + + if (!domainId) { + throw new Error('Invalid domain URL: could not extract domain ID') + } + + // Create new entry with current timestamp + const newEntry: DomainCacheEntry = { + domainUrl, + domainId, + region, + domainName, + lastUsedTimestamp: new Date().toISOString(), + } + + // Remove existing entry with same URL if present + const filteredDomains = domains.filter((d) => d.domainUrl !== domainUrl) + + // Add new entry at the front + const updatedDomains = [newEntry, ...filteredDomains] + + // Trim array to max 10 entries + const trimmedDomains = updatedDomains.slice(0, maxCachedDomains) + + // Save to globalState + await globals.globalState.update(domainCacheKey, { domains: trimmedDomains }) + } catch (err) { + logger.warn('unable to update domain cache: %s', err) + } +} + +/** + * Removes a domain from the cache + * Used when a domain fails validation or becomes inaccessible + * @param domainUrl The domain URL to remove + */ +export async function removeDomainFromCache(domainUrl: string): Promise { + try { + const domains = getRecentDomains() + const filteredDomains = domains.filter((d) => d.domainUrl !== domainUrl) + await globals.globalState.update(domainCacheKey, { domains: filteredDomains }) + } catch (err) { + logger.warn('unable to remove domain from cache: %s', err) + } +} + +/** + * Formats a timestamp for display in QuickPick + * @param isoTimestamp ISO 8601 timestamp string + * @returns Human-readable relative time (e.g., "2 hours ago", "Yesterday") + */ +export function formatTimestamp(isoTimestamp: string): string { + const date = new Date(isoTimestamp) + const now = new Date() + const diffMs = now.getTime() - date.getTime() + const diffMins = Math.floor(diffMs / 60000) + const diffHours = Math.floor(diffMs / 3600000) + const diffDays = Math.floor(diffMs / 86400000) + + if (diffMins < 1) { + return 'Just now' + } + if (diffMins < 60) { + return `${diffMins} minute${diffMins > 1 ? 's' : ''} ago` + } + if (diffHours < 24) { + return `${diffHours} hour${diffHours > 1 ? 's' : ''} ago` + } + if (diffDays === 1) { + return 'Yesterday' + } + if (diffDays < 7) { + return `${diffDays} days ago` + } + + return date.toLocaleDateString() +} diff --git a/packages/core/src/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioRootNode.ts b/packages/core/src/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioRootNode.ts index d03ab98145f..6ae24599026 100644 --- a/packages/core/src/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioRootNode.ts +++ b/packages/core/src/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioRootNode.ts @@ -242,7 +242,7 @@ export const smusLoginCommand = Commands.declare('aws.smus.login', (context: vsc // Import authentication method selection components const { SmusAuthenticationMethodSelector } = await import('../../auth/ui/authenticationMethodSelection.js') const { SmusAuthenticationPreferencesManager } = await import( - '../../auth/preferences/authenticationPreferences.js' + '../../auth/utils/authenticationPreferences.js' ) // Check for preferred authentication method @@ -389,7 +389,7 @@ export const smusSignOutCommand = Commands.declare( // Clear connection-specific preferences on sign out (but keep auth method preference) const { SmusAuthenticationPreferencesManager } = await import( - '../../auth/preferences/authenticationPreferences.js' + '../../auth/utils/authenticationPreferences.js' ) await SmusAuthenticationPreferencesManager.clearConnectionPreferences(context) } diff --git a/packages/core/src/shared/globalState.ts b/packages/core/src/shared/globalState.ts index 9e68836cbf1..31e4c5dbf75 100644 --- a/packages/core/src/shared/globalState.ts +++ b/packages/core/src/shared/globalState.ts @@ -49,6 +49,7 @@ export type globalKey = | 'aws.toolkit.lsp.manifest' | 'aws.amazonq.customization.overrideV2' | 'aws.smus.authenticationPreferences' + | 'aws.smus.recentDomains' | 'aws.amazonq.regionProfiles' | 'aws.amazonq.regionProfiles.cache' // Deprecated/legacy names. New keys should start with "aws.". diff --git a/packages/core/src/test/sagemakerunifiedstudio/auth/authenticationOrchestrator.test.ts b/packages/core/src/test/sagemakerunifiedstudio/auth/authenticationOrchestrator.test.ts index 095922dfc6f..28da3cd5d62 100644 --- a/packages/core/src/test/sagemakerunifiedstudio/auth/authenticationOrchestrator.test.ts +++ b/packages/core/src/test/sagemakerunifiedstudio/auth/authenticationOrchestrator.test.ts @@ -4,7 +4,10 @@ */ import * as assert from 'assert' +import * as sinon from 'sinon' import { SmusAuthenticationOrchestrator } from '../../../sagemakerunifiedstudio/auth/authenticationOrchestrator' +import * as domainCache from '../../../sagemakerunifiedstudio/auth/utils/domainCache' +import { SmusErrorCodes } from '../../../sagemakerunifiedstudio/shared/smusUtils' describe('SmusAuthenticationOrchestrator', function () { // Note: Due to AWS Toolkit test framework restrictions on mocking vscode.window, @@ -41,6 +44,82 @@ describe('SmusAuthenticationOrchestrator', function () { }) }) + describe('handleAuthenticationErrorForCache', function () { + let removeDomainStub: sinon.SinonStub + + beforeEach(function () { + removeDomainStub = sinon.stub(domainCache, 'removeDomainFromCache').resolves() + }) + + afterEach(function () { + sinon.restore() + }) + + it('should remove domain from cache for InvalidDomainUrl error', async function () { + const testDomainUrl = 'https://dzd_test123.sagemaker.us-east-1.on.aws' + const error = new Error('Invalid domain URL') as any + error.code = SmusErrorCodes.InvalidDomainUrl + + // Access the private method via reflection for testing + await (SmusAuthenticationOrchestrator as any).handleAuthenticationError(testDomainUrl, error) + + assert.ok(removeDomainStub.calledOnce, 'removeDomainFromCache should be called once') + assert.ok( + removeDomainStub.calledWith(testDomainUrl), + 'removeDomainFromCache should be called with correct domain URL' + ) + }) + + it('should NOT remove domain from cache for ApiTimeout error', async function () { + const testDomainUrl = 'https://dzd_test123.sagemaker.us-east-1.on.aws' + const error = new Error('API timeout') as any + error.code = SmusErrorCodes.ApiTimeout + + // Access the private method via reflection for testing + await (SmusAuthenticationOrchestrator as any).handleAuthenticationError(testDomainUrl, error) + + assert.ok(removeDomainStub.notCalled, 'removeDomainFromCache should NOT be called for ApiTimeout') + }) + + it('should NOT remove domain from cache for FailedToConnect error', async function () { + const testDomainUrl = 'https://dzd_test123.sagemaker.us-east-1.on.aws' + const error = new Error('Failed to connect') as any + error.code = SmusErrorCodes.FailedToConnect + + // Access the private method via reflection for testing + await (SmusAuthenticationOrchestrator as any).handleAuthenticationError(testDomainUrl, error) + + assert.ok(removeDomainStub.notCalled, 'removeDomainFromCache should NOT be called for FailedToConnect') + }) + + it('should NOT remove domain from cache for other authentication errors', async function () { + const testDomainUrl = 'https://dzd_test123.sagemaker.us-east-1.on.aws' + const error = new Error('Authentication failed') as any + error.code = SmusErrorCodes.SmusLoginFailed + + // Access the private method via reflection for testing + await (SmusAuthenticationOrchestrator as any).handleAuthenticationError(testDomainUrl, error) + + assert.ok( + removeDomainStub.notCalled, + 'removeDomainFromCache should NOT be called for other authentication errors' + ) + }) + + it('should NOT remove domain from cache for errors without error code', async function () { + const testDomainUrl = 'https://dzd_test123.sagemaker.us-east-1.on.aws' + const error = new Error('Generic error') + + // Access the private method via reflection for testing + await (SmusAuthenticationOrchestrator as any).handleAuthenticationError(testDomainUrl, error) + + assert.ok( + removeDomainStub.notCalled, + 'removeDomainFromCache should NOT be called for errors without error code' + ) + }) + }) + describe('return types', function () { it('should handle SUCCESS and BACK return types correctly', function () { // Test that the return types are properly defined for both methods diff --git a/packages/core/src/test/sagemakerunifiedstudio/auth/preferences/authenticationPreferences.test.ts b/packages/core/src/test/sagemakerunifiedstudio/auth/utils/authenticationPreferences.test.ts similarity index 99% rename from packages/core/src/test/sagemakerunifiedstudio/auth/preferences/authenticationPreferences.test.ts rename to packages/core/src/test/sagemakerunifiedstudio/auth/utils/authenticationPreferences.test.ts index 06549830934..a3789dfabc9 100644 --- a/packages/core/src/test/sagemakerunifiedstudio/auth/preferences/authenticationPreferences.test.ts +++ b/packages/core/src/test/sagemakerunifiedstudio/auth/utils/authenticationPreferences.test.ts @@ -9,7 +9,7 @@ import { SmusAuthenticationPreferencesManager, SmusAuthenticationPreferences, SmusIamProfileConfig, -} from '../../../../sagemakerunifiedstudio/auth/preferences/authenticationPreferences' +} from '../../../../sagemakerunifiedstudio/auth/utils/authenticationPreferences' import { globals } from '../../../../shared' describe('SmusAuthenticationPreferencesManager', function () { diff --git a/packages/core/src/test/sagemakerunifiedstudio/auth/utils/domainCache.test.ts b/packages/core/src/test/sagemakerunifiedstudio/auth/utils/domainCache.test.ts new file mode 100644 index 00000000000..e544ba4a610 --- /dev/null +++ b/packages/core/src/test/sagemakerunifiedstudio/auth/utils/domainCache.test.ts @@ -0,0 +1,263 @@ +/*! + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +import * as assert from 'assert' +import * as sinon from 'sinon' +import { + getRecentDomains, + updateRecentDomains, + removeDomainFromCache, + formatTimestamp, + DomainCacheEntry, + domainCacheKey, + maxCachedDomains, +} from '../../../../sagemakerunifiedstudio/auth/utils/domainCache' +import globals from '../../../../shared/extensionGlobals' +import { SmusUtils } from '../../../../sagemakerunifiedstudio/shared/smusUtils' + +describe('Domain Cache', function () { + let sandbox: sinon.SinonSandbox + let globalStateStub: sinon.SinonStubbedInstance + + beforeEach(function () { + sandbox = sinon.createSandbox() + globalStateStub = { + tryGet: sandbox.stub(), + update: sandbox.stub().resolves(), + } as any + sandbox.stub(globals, 'globalState').value(globalStateStub) + }) + + afterEach(function () { + sandbox.restore() + }) + + describe('getRecentDomains', function () { + it('should return empty array when no cache exists', function () { + globalStateStub.tryGet.returns({ domains: [] }) + + const result = getRecentDomains() + + assert.strictEqual(result.length, 0) + assert.ok(globalStateStub.tryGet.calledWith(domainCacheKey)) + }) + + it('should return cached domains', function () { + const mockDomains: DomainCacheEntry[] = [ + { + domainUrl: 'https://dzd_abc123.sagemaker.us-east-1.on.aws', + domainId: 'dzd_abc123', + region: 'us-east-1', + domainName: 'Test Domain', + lastUsedTimestamp: new Date().toISOString(), + }, + ] + globalStateStub.tryGet.returns({ domains: mockDomains }) + + const result = getRecentDomains() + + assert.strictEqual(result.length, 1) + assert.strictEqual(result[0].domainId, 'dzd_abc123') + assert.strictEqual(result[0].domainName, 'Test Domain') + }) + }) + + describe('updateRecentDomains', function () { + beforeEach(function () { + globalStateStub.tryGet.returns({ domains: [] }) + sandbox.stub(SmusUtils, 'extractDomainInfoFromUrl').returns({ + domainId: 'dzd_abc123', + region: 'us-east-1', + }) + }) + + it('should add new domain to empty cache', async function () { + const domainUrl = 'https://dzd_abc123.sagemaker.us-east-1.on.aws' + + await updateRecentDomains(domainUrl, 'Test Domain') + + assert.ok(globalStateStub.update.calledOnce) + const updateCall = globalStateStub.update.getCall(0) + assert.strictEqual(updateCall.args[0], domainCacheKey) + + const savedData = updateCall.args[1] + assert.strictEqual(savedData.domains.length, 1) + assert.strictEqual(savedData.domains[0].domainUrl, domainUrl) + assert.strictEqual(savedData.domains[0].domainId, 'dzd_abc123') + assert.strictEqual(savedData.domains[0].region, 'us-east-1') + assert.strictEqual(savedData.domains[0].domainName, 'Test Domain') + assert.ok(savedData.domains[0].lastUsedTimestamp) + }) + + it('should add domain without name', async function () { + const domainUrl = 'https://dzd_abc123.sagemaker.us-east-1.on.aws' + + await updateRecentDomains(domainUrl) + + const updateCall = globalStateStub.update.getCall(0) + const savedData = updateCall.args[1] + assert.strictEqual(savedData.domains[0].domainName, undefined) + }) + + it('should move existing domain to front and update timestamp', async function () { + const existingDomain: DomainCacheEntry = { + domainUrl: 'https://dzd_abc123.sagemaker.us-east-1.on.aws', + domainId: 'dzd_abc123', + region: 'us-east-1', + lastUsedTimestamp: '2024-01-01T00:00:00.000Z', + } + const otherDomain: DomainCacheEntry = { + domainUrl: 'https://dzd_xyz789.sagemaker.us-west-2.on.aws', + domainId: 'dzd_xyz789', + region: 'us-west-2', + lastUsedTimestamp: '2024-01-02T00:00:00.000Z', + } + globalStateStub.tryGet.returns({ domains: [otherDomain, existingDomain] }) + + await updateRecentDomains(existingDomain.domainUrl, 'Updated Name') + + const updateCall = globalStateStub.update.getCall(0) + const savedData = updateCall.args[1] + assert.strictEqual(savedData.domains.length, 2) + assert.strictEqual(savedData.domains[0].domainUrl, existingDomain.domainUrl) + assert.strictEqual(savedData.domains[0].domainName, 'Updated Name') + assert.notStrictEqual(savedData.domains[0].lastUsedTimestamp, existingDomain.lastUsedTimestamp) + assert.strictEqual(savedData.domains[1].domainUrl, otherDomain.domainUrl) + }) + + it('should limit cache to maxCachedDomains entries', async function () { + const existingDomains: DomainCacheEntry[] = [] + for (let i = 0; i < maxCachedDomains; i++) { + existingDomains.push({ + domainUrl: `https://dzd_test${i}.sagemaker.us-east-1.on.aws`, + domainId: `dzd_test${i}`, + region: 'us-east-1', + lastUsedTimestamp: new Date(Date.now() - i * 1000).toISOString(), + }) + } + globalStateStub.tryGet.returns({ domains: existingDomains }) + + const newDomainUrl = 'https://dzd_new.sagemaker.us-east-1.on.aws' + sandbox.restore() + sandbox = sinon.createSandbox() + sandbox.stub(globals, 'globalState').value(globalStateStub) + sandbox.stub(SmusUtils, 'extractDomainInfoFromUrl').returns({ + domainId: 'dzd_new', + region: 'us-east-1', + }) + + await updateRecentDomains(newDomainUrl) + + const updateCall = globalStateStub.update.getCall(0) + const savedData = updateCall.args[1] + assert.strictEqual(savedData.domains.length, maxCachedDomains) + assert.strictEqual(savedData.domains[0].domainId, 'dzd_new') + // The last domain should be the oldest one that wasn't evicted + assert.strictEqual( + savedData.domains[savedData.domains.length - 1].domainId, + `dzd_test${maxCachedDomains - 2}` as string + ) + }) + + it('should handle invalid domain URL gracefully', async function () { + sandbox.restore() + sandbox = sinon.createSandbox() + sandbox.stub(globals, 'globalState').value(globalStateStub) + sandbox.stub(SmusUtils, 'extractDomainInfoFromUrl').returns({ + domainId: '', + region: 'us-east-1', + }) + + await updateRecentDomains('invalid-url') + + assert.ok(globalStateStub.update.notCalled) + }) + }) + + describe('removeDomainFromCache', function () { + it('should remove domain from cache', async function () { + const domainToRemove: DomainCacheEntry = { + domainUrl: 'https://dzd_abc123.sagemaker.us-east-1.on.aws', + domainId: 'dzd_abc123', + region: 'us-east-1', + lastUsedTimestamp: new Date().toISOString(), + } + const domainToKeep: DomainCacheEntry = { + domainUrl: 'https://dzd_xyz789.sagemaker.us-west-2.on.aws', + domainId: 'dzd_xyz789', + region: 'us-west-2', + lastUsedTimestamp: new Date().toISOString(), + } + globalStateStub.tryGet.returns({ domains: [domainToRemove, domainToKeep] }) + + await removeDomainFromCache(domainToRemove.domainUrl) + + const updateCall = globalStateStub.update.getCall(0) + const savedData = updateCall.args[1] + assert.strictEqual(savedData.domains.length, 1) + assert.strictEqual(savedData.domains[0].domainUrl, domainToKeep.domainUrl) + }) + it('should handle empty cache', async function () { + globalStateStub.tryGet.returns({ domains: [] }) + + await removeDomainFromCache('https://dzd_abc123.sagemaker.us-east-1.on.aws') + + const updateCall = globalStateStub.update.getCall(0) + const savedData = updateCall.args[1] + assert.strictEqual(savedData.domains.length, 0) + }) + }) + + describe('formatTimestamp', function () { + it('should return "Just now" for very recent timestamps', function () { + const now = new Date().toISOString() + const result = formatTimestamp(now) + assert.strictEqual(result, 'Just now') + }) + + it('should return minutes ago for timestamps within an hour', function () { + const fiveMinutesAgo = new Date(Date.now() - 5 * 60 * 1000).toISOString() + const result = formatTimestamp(fiveMinutesAgo) + assert.strictEqual(result, '5 minutes ago') + }) + + it('should return singular minute for 1 minute ago', function () { + const oneMinuteAgo = new Date(Date.now() - 1 * 60 * 1000).toISOString() + const result = formatTimestamp(oneMinuteAgo) + assert.strictEqual(result, '1 minute ago') + }) + + it('should return hours ago for timestamps within a day', function () { + const twoHoursAgo = new Date(Date.now() - 2 * 60 * 60 * 1000).toISOString() + const result = formatTimestamp(twoHoursAgo) + assert.strictEqual(result, '2 hours ago') + }) + + it('should return singular hour for 1 hour ago', function () { + const oneHourAgo = new Date(Date.now() - 1 * 60 * 60 * 1000).toISOString() + const result = formatTimestamp(oneHourAgo) + assert.strictEqual(result, '1 hour ago') + }) + + it('should return "Yesterday" for timestamps 1 day ago', function () { + const yesterday = new Date(Date.now() - 24 * 60 * 60 * 1000).toISOString() + const result = formatTimestamp(yesterday) + assert.strictEqual(result, 'Yesterday') + }) + + it('should return days ago for timestamps within a week', function () { + const threeDaysAgo = new Date(Date.now() - 3 * 24 * 60 * 60 * 1000).toISOString() + const result = formatTimestamp(threeDaysAgo) + assert.strictEqual(result, '3 days ago') + }) + + it('should return localized date for timestamps older than a week', function () { + const twoWeeksAgo = new Date(Date.now() - 14 * 24 * 60 * 60 * 1000).toISOString() + const result = formatTimestamp(twoWeeksAgo) + const expectedDate = new Date(twoWeeksAgo).toLocaleDateString() + assert.strictEqual(result, expectedDate) + }) + }) +}) From f57fef6c1eb091bf8d99cf557ded20a0c4557125 Mon Sep 17 00:00:00 2001 From: Aseem sharma <198968351+aseemxs@users.noreply.github.com> Date: Mon, 16 Feb 2026 16:38:14 -0800 Subject: [PATCH 22/51] build(amazonq): merge release candidate version rc-20260212 (#8581) This merges the released changes for rc-20260212 into main. MCM-144328882 --- - Treat all work as PUBLIC. Private `feature/x` branches will not be squash-merged at release time. - Your code changes must meet the guidelines in [CONTRIBUTING.md](https://github.com/aws/aws-toolkit-vscode/blob/master/CONTRIBUTING.md#guidelines). - License: I confirm that my contribution is made under the terms of the Apache 2.0 license. --------- Co-authored-by: aws-toolkit-automation <> --- package-lock.json | 35 +++++++++++-------- packages/amazonq/.changes/1.110.0.json | 10 ++++++ ...-44470ad8-e5a1-4388-8801-4236467932e7.json | 4 --- packages/amazonq/CHANGELOG.md | 4 +++ packages/amazonq/package.json | 2 +- packages/toolkit/.changes/3.96.0.json | 5 +++ packages/toolkit/CHANGELOG.md | 4 +++ packages/toolkit/package.json | 2 +- 8 files changed, 46 insertions(+), 20 deletions(-) create mode 100644 packages/amazonq/.changes/1.110.0.json delete mode 100644 packages/amazonq/.changes/next-release/Bug Fix-44470ad8-e5a1-4388-8801-4236467932e7.json create mode 100644 packages/toolkit/.changes/3.96.0.json diff --git a/package-lock.json b/package-lock.json index ac86fe675d2..ae5fc495f56 100644 --- a/package-lock.json +++ b/package-lock.json @@ -33157,9 +33157,10 @@ } }, "node_modules/@eslint/js": { - "version": "8.56.0", + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", + "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", "dev": true, - "license": "MIT", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } @@ -33172,11 +33173,13 @@ } }, "node_modules/@humanwhocodes/config-array": { - "version": "0.11.14", + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", + "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", + "deprecated": "Use @eslint/config-array instead", "dev": true, - "license": "Apache-2.0", "dependencies": { - "@humanwhocodes/object-schema": "^2.0.2", + "@humanwhocodes/object-schema": "^2.0.3", "debug": "^4.3.1", "minimatch": "^3.0.5" }, @@ -33197,9 +33200,11 @@ } }, "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.2", - "dev": true, - "license": "BSD-3-Clause" + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "deprecated": "Use @eslint/object-schema instead", + "dev": true }, "node_modules/@iarna/toml": { "version": "2.2.5", @@ -39145,15 +39150,17 @@ } }, "node_modules/eslint": { - "version": "8.56.0", + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", + "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", + "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", "dev": true, - "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.56.0", - "@humanwhocodes/config-array": "^0.11.13", + "@eslint/js": "8.57.1", + "@humanwhocodes/config-array": "^0.13.0", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "@ungap/structured-clone": "^1.2.0", @@ -48305,7 +48312,7 @@ }, "packages/amazonq": { "name": "amazon-q-vscode", - "version": "1.110.0-SNAPSHOT", + "version": "1.111.0-SNAPSHOT", "license": "Apache-2.0", "dependencies": { "aws-core-vscode": "file:../core/" @@ -50601,7 +50608,7 @@ }, "packages/toolkit": { "name": "aws-toolkit-vscode", - "version": "3.96.0-SNAPSHOT", + "version": "3.97.0-SNAPSHOT", "license": "Apache-2.0", "dependencies": { "aws-core-vscode": "file:../core/" diff --git a/packages/amazonq/.changes/1.110.0.json b/packages/amazonq/.changes/1.110.0.json new file mode 100644 index 00000000000..9c5972a9fc0 --- /dev/null +++ b/packages/amazonq/.changes/1.110.0.json @@ -0,0 +1,10 @@ +{ + "date": "2026-02-16", + "version": "1.110.0", + "entries": [ + { + "type": "Bug Fix", + "description": "Amazon Q Chat: Fix chat history restoration to display rich UI elements and persist user preferences" + } + ] +} \ No newline at end of file diff --git a/packages/amazonq/.changes/next-release/Bug Fix-44470ad8-e5a1-4388-8801-4236467932e7.json b/packages/amazonq/.changes/next-release/Bug Fix-44470ad8-e5a1-4388-8801-4236467932e7.json deleted file mode 100644 index 64c8afd1e77..00000000000 --- a/packages/amazonq/.changes/next-release/Bug Fix-44470ad8-e5a1-4388-8801-4236467932e7.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "type": "Bug Fix", - "description": "Amazon Q Chat: Fix chat history restoration to display rich UI elements and persist user preferences" -} diff --git a/packages/amazonq/CHANGELOG.md b/packages/amazonq/CHANGELOG.md index 6c363472020..6cc2c6c5f5d 100644 --- a/packages/amazonq/CHANGELOG.md +++ b/packages/amazonq/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.110.0 2026-02-16 + +- **Bug Fix** Amazon Q Chat: Fix chat history restoration to display rich UI elements and persist user preferences + ## 1.109.0 2026-01-29 - **Bug Fix** Amazon Q: "Fix All Issues" now includes warnings when triggered from a warning diagnostic diff --git a/packages/amazonq/package.json b/packages/amazonq/package.json index d59db19269c..6266e108333 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 software development.", - "version": "1.110.0-SNAPSHOT", + "version": "1.111.0-SNAPSHOT", "extensionKind": [ "workspace" ], diff --git a/packages/toolkit/.changes/3.96.0.json b/packages/toolkit/.changes/3.96.0.json new file mode 100644 index 00000000000..410a9c4b255 --- /dev/null +++ b/packages/toolkit/.changes/3.96.0.json @@ -0,0 +1,5 @@ +{ + "date": "2026-02-13", + "version": "3.96.0", + "entries": [] +} \ No newline at end of file diff --git a/packages/toolkit/CHANGELOG.md b/packages/toolkit/CHANGELOG.md index 87016bb8be3..438e7f2fd40 100644 --- a/packages/toolkit/CHANGELOG.md +++ b/packages/toolkit/CHANGELOG.md @@ -1,3 +1,7 @@ +## 3.96.0 2026-02-13 + +- Miscellaneous non-user-facing changes + ## 3.95.0 2026-01-29 - **Bug Fix** AWS CLI update success message now shows the actual CLI installation path that the Toolkit uses for console credentials. diff --git a/packages/toolkit/package.json b/packages/toolkit/package.json index a88c15f0ed6..98ad0c00baf 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.96.0-SNAPSHOT", + "version": "3.97.0-SNAPSHOT", "extensionKind": [ "workspace" ], From 3d160d16afe38b6fb2f9c08f58901467d76a6f27 Mon Sep 17 00:00:00 2001 From: Will Lo <96078566+Will-ShaoHua@users.noreply.github.com> Date: Fri, 20 Feb 2026 10:47:39 -0800 Subject: [PATCH 23/51] fix(amazonq): inline chat feature doesnt work with kiro subscription (#8586) ## Problem ## Solution `includePlatform` will append a platform surfix `Visual-Studil-Code` --- - Treat all work as PUBLIC. Private `feature/x` branches will not be squash-merged at release time. - Your code changes must meet the guidelines in [CONTRIBUTING.md](https://github.com/aws/aws-toolkit-vscode/blob/master/CONTRIBUTING.md#guidelines). - License: I confirm that my contribution is made under the terms of the Apache 2.0 license. --- packages/core/src/shared/clients/codewhispererChatClient.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core/src/shared/clients/codewhispererChatClient.ts b/packages/core/src/shared/clients/codewhispererChatClient.ts index 93b7b3bceb4..1556e1e2a19 100644 --- a/packages/core/src/shared/clients/codewhispererChatClient.ts +++ b/packages/core/src/shared/clients/codewhispererChatClient.ts @@ -16,7 +16,7 @@ export async function createCodeWhispererChatStreamingClient(): Promise 500 + attempt ** 10), }) return streamingClient From 91120f23f108080cc6f0940fc4ced3c56c22c141 Mon Sep 17 00:00:00 2001 From: Arkaprava De Date: Fri, 20 Feb 2026 14:20:18 -0800 Subject: [PATCH 24/51] feat(sagemaker): Adding support for Cursor IDE (#8384) ## Description This PR adds support for Cursor IDE by dynamically detecting the editor and using the appropriate Remote SSH extension. ## Changes - Detect Cursor IDE and use appropriate Remote SSH extension (`anysphere.remote-ssh` for Cursor vs `ms-vscode-remote.remote-ssh` for VS Code) - Refactor `VSCODE_EXTENSION_ID.remotessh` to include both `id` and `minVersion` properties - Update all references to use `remotessh.id` instead of direct string access - Remove deprecated `vscodeExtensionMinVersion` object ## Testing - Tested with Cursor IDE - Existing VS Code functionality remains unchanged --------- Co-authored-by: Arkaprava De Co-authored-by: Newton Der Co-authored-by: invictus <149003065+ashishrp-aws@users.noreply.github.com> Co-authored-by: msgupta Co-authored-by: Newton Der --- packages/amazonq/test/e2e/index.ts | 4 +- packages/amazonq/test/unit/index.ts | 4 +- packages/amazonq/test/web/testRunner.ts | 6 +- .../core/scripts/test/launchTestUtilities.ts | 28 ++++----- .../sagemaker/detached-server/server.ts | 23 ++++--- packages/core/src/shared/extensionIds.ts | 37 ++++++++++++ packages/core/src/shared/extensions.ts | 42 ++++++++----- packages/core/src/shared/remoteSession.ts | 20 ++++--- packages/core/src/shared/utilities/index.ts | 1 + .../core/src/shared/utilities/pathFind.ts | 30 ++++++---- packages/core/src/shared/vscode/env.ts | 60 +++++++++++++++++++ .../awsService/sagemaker/uriHandlers.test.ts | 4 +- .../src/test/codecatalyst/uriHandlers.test.ts | 8 ++- .../test/shared/utilities/vscodeUtils.test.ts | 6 +- .../src/testE2E/codecatalyst/client.test.ts | 2 +- .../toolkit/test/e2e/cloudformation/index.ts | 4 +- packages/toolkit/test/e2e/index.ts | 4 +- packages/toolkit/test/integ/index.ts | 4 +- packages/toolkit/test/unit/index.ts | 10 ++-- 19 files changed, 213 insertions(+), 84 deletions(-) create mode 100644 packages/core/src/shared/extensionIds.ts diff --git a/packages/amazonq/test/e2e/index.ts b/packages/amazonq/test/e2e/index.ts index 065a2cd8bc8..2242ad2f212 100644 --- a/packages/amazonq/test/e2e/index.ts +++ b/packages/amazonq/test/e2e/index.ts @@ -4,10 +4,10 @@ */ import { runTests } from 'aws-core-vscode/test' -import { VSCODE_EXTENSION_ID } from 'aws-core-vscode/utils' +import { VSCODE_EXTENSION_ID_CONSTANTS } from 'aws-core-vscode/utils' export function run(): Promise { - return runTests(process.env.TEST_DIR ?? 'test/e2e', VSCODE_EXTENSION_ID.amazonq, [ + return runTests(process.env.TEST_DIR ?? 'test/e2e', VSCODE_EXTENSION_ID_CONSTANTS.amazonq, [ '../../core/dist/src/testInteg/globalSetup.test.ts', ]) } diff --git a/packages/amazonq/test/unit/index.ts b/packages/amazonq/test/unit/index.ts index cc1ad0d22ca..92c8e82624f 100644 --- a/packages/amazonq/test/unit/index.ts +++ b/packages/amazonq/test/unit/index.ts @@ -4,10 +4,10 @@ */ import { runTests } from 'aws-core-vscode/test' -import { VSCODE_EXTENSION_ID } from 'aws-core-vscode/utils' +import { VSCODE_EXTENSION_ID_CONSTANTS } from 'aws-core-vscode/utils' export function run(): Promise { - return runTests(process.env.TEST_DIR ?? ['test/unit'], VSCODE_EXTENSION_ID.amazonq, [ + return runTests(process.env.TEST_DIR ?? ['test/unit'], VSCODE_EXTENSION_ID_CONSTANTS.amazonq, [ '../../core/dist/src/test/globalSetup.test.ts', ]) } diff --git a/packages/amazonq/test/web/testRunner.ts b/packages/amazonq/test/web/testRunner.ts index 1d0726be98b..0505032fd3c 100644 --- a/packages/amazonq/test/web/testRunner.ts +++ b/packages/amazonq/test/web/testRunner.ts @@ -7,7 +7,7 @@ * The following was influenced by this guide: https://code.visualstudio.com/api/extension-guides/web-extensions */ -import { VSCODE_EXTENSION_ID } from 'aws-core-vscode/utils' +import { VSCODE_EXTENSION_ID_CONSTANTS } from 'aws-core-vscode/utils' import 'mocha' // Imports mocha for the browser, defining the `mocha` global. import * as vscode from 'vscode' @@ -47,12 +47,12 @@ function gatherTestFiles() { * So this function ensures the extension has fully activated. */ async function activateExtension() { - const extId = VSCODE_EXTENSION_ID.amazonq + const extId = VSCODE_EXTENSION_ID_CONSTANTS.amazonq const ext = vscode.extensions.getExtension(extId) if (!ext) { throw new Error(`Extension '${extId}' not found, can't activate it to run tests.`) } - await vscode.extensions.getExtension(VSCODE_EXTENSION_ID.amazonq)?.activate() + await vscode.extensions.getExtension(VSCODE_EXTENSION_ID_CONSTANTS.amazonq)?.activate() } function runMochaTests(resolve: (value: void | PromiseLike) => void, reject: (reason?: any) => void) { diff --git a/packages/core/scripts/test/launchTestUtilities.ts b/packages/core/scripts/test/launchTestUtilities.ts index 6f8b420fd8a..a633bee57db 100644 --- a/packages/core/scripts/test/launchTestUtilities.ts +++ b/packages/core/scripts/test/launchTestUtilities.ts @@ -8,7 +8,7 @@ import packageJson from '../../package.json' import { downloadAndUnzipVSCode, resolveCliArgsFromVSCodeExecutablePath } from '@vscode/test-electron' import { join, resolve } from 'path' import { runTests } from '@vscode/test-electron' -import { VSCODE_EXTENSION_ID } from '../../src/shared/extensions' +import { VSCODE_EXTENSION_ID_CONSTANTS } from '../../src/shared/extensionIds' import { TestOptions } from '@vscode/test-electron/out/runTest' const envvarVscodeTestVersion = 'VSCODE_TEST_VERSION' @@ -79,14 +79,14 @@ async function getVSCodeCliArgs(params: { if (params.suite === 'integration' || params.suite === 'e2e') { disableExtensionsArgs = await getCliArgsToDisableExtensions(params.vsCodeExecutablePath, { except: [ - VSCODE_EXTENSION_ID.python, - VSCODE_EXTENSION_ID.yaml, - VSCODE_EXTENSION_ID.jupyter, - VSCODE_EXTENSION_ID.go, - VSCODE_EXTENSION_ID.java, - VSCODE_EXTENSION_ID.javadebug, - VSCODE_EXTENSION_ID.git, - VSCODE_EXTENSION_ID.remotessh, + VSCODE_EXTENSION_ID_CONSTANTS.python, + VSCODE_EXTENSION_ID_CONSTANTS.yaml, + VSCODE_EXTENSION_ID_CONSTANTS.jupyter, + VSCODE_EXTENSION_ID_CONSTANTS.go, + VSCODE_EXTENSION_ID_CONSTANTS.java, + VSCODE_EXTENSION_ID_CONSTANTS.javadebug, + VSCODE_EXTENSION_ID_CONSTANTS.git, + VSCODE_EXTENSION_ID_CONSTANTS.remotessh.id, ], }) disableWorkspaceTrustArg = [disableWorkspaceTrust] @@ -160,11 +160,11 @@ async function setupVSCodeTestInstance(suite: SuiteName): Promise { // Only certain test suites require specific vscode extensions to be installed if (suite === 'e2e' || suite === 'integration') { - await installVSCodeExtension(vsCodeExecutablePath, VSCODE_EXTENSION_ID.python) - await installVSCodeExtension(vsCodeExecutablePath, VSCODE_EXTENSION_ID.yaml) - await installVSCodeExtension(vsCodeExecutablePath, VSCODE_EXTENSION_ID.go) - await installVSCodeExtension(vsCodeExecutablePath, VSCODE_EXTENSION_ID.java) - await installVSCodeExtension(vsCodeExecutablePath, VSCODE_EXTENSION_ID.javadebug) + await installVSCodeExtension(vsCodeExecutablePath, VSCODE_EXTENSION_ID_CONSTANTS.python) + await installVSCodeExtension(vsCodeExecutablePath, VSCODE_EXTENSION_ID_CONSTANTS.yaml) + await installVSCodeExtension(vsCodeExecutablePath, VSCODE_EXTENSION_ID_CONSTANTS.go) + await installVSCodeExtension(vsCodeExecutablePath, VSCODE_EXTENSION_ID_CONSTANTS.java) + await installVSCodeExtension(vsCodeExecutablePath, VSCODE_EXTENSION_ID_CONSTANTS.javadebug) } console.log('VS Code Test instance has been set up') diff --git a/packages/core/src/awsService/sagemaker/detached-server/server.ts b/packages/core/src/awsService/sagemaker/detached-server/server.ts index e785516146c..ccbb81897fc 100644 --- a/packages/core/src/awsService/sagemaker/detached-server/server.ts +++ b/packages/core/src/awsService/sagemaker/detached-server/server.ts @@ -17,6 +17,16 @@ import { execFile } from 'child_process' const pollInterval = 30 * 60 * 100 // 30 minutes +/** + * Generic IDE process patterns for detection across all VS Code forks + * Supports: VS Code, Cursor, Kiro, Windsurf, and other forks + */ +const IDE_PROCESS_PATTERNS = { + windows: /Code\.exe|Cursor\.exe|Kiro\.exe|Windsurf\.exe/i, + darwin: /(Visual Studio Code( - Insiders)?|Cursor|Kiro|Windsurf)\.app\/Contents\/MacOS\/Electron/, + linux: /^(code(-insiders)?|cursor|kiro|windsurf|electron)$/i, +} + const server = http.createServer((req: IncomingMessage, res: ServerResponse) => { const parsedUrl = url.parse(req.url || '', true) @@ -62,12 +72,13 @@ function checkVSCodeWindows(): Promise { const platform = os.platform() if (platform === 'win32') { - execFile('tasklist', ['/FI', 'IMAGENAME eq Code.exe'], (err, stdout) => { + // Check for any VS Code fork process + execFile('tasklist', [], (err, stdout) => { if (err) { resolve(false) return } - resolve(/Code\.exe/i.test(stdout)) + resolve(IDE_PROCESS_PATTERNS.windows.test(stdout)) }) } else if (platform === 'darwin') { execFile('ps', ['aux'], (err, stdout) => { @@ -76,9 +87,7 @@ function checkVSCodeWindows(): Promise { return } - const found = stdout - .split('\n') - .some((line) => /Visual Studio Code( - Insiders)?\.app\/Contents\/MacOS\/Electron/.test(line)) + const found = stdout.split('\n').some((line) => IDE_PROCESS_PATTERNS.darwin.test(line)) resolve(found) }) } else { @@ -88,7 +97,7 @@ function checkVSCodeWindows(): Promise { return } - const found = stdout.split('\n').some((line) => /^(code(-insiders)?|electron)$/i.test(line.trim())) + const found = stdout.split('\n').some((line) => IDE_PROCESS_PATTERNS.linux.test(line.trim())) resolve(found) }) } @@ -99,7 +108,7 @@ async function monitorVSCodeAndExit() { while (true) { const found = await checkVSCodeWindows() if (!found) { - console.log('No VSCode windows found. Shutting down detached server.') + console.log('No IDE windows found. Shutting down detached server.') process.exit(0) } await new Promise((r) => setTimeout(r, pollInterval)) diff --git a/packages/core/src/shared/extensionIds.ts b/packages/core/src/shared/extensionIds.ts new file mode 100644 index 00000000000..97703ad81b6 --- /dev/null +++ b/packages/core/src/shared/extensionIds.ts @@ -0,0 +1,37 @@ +/*! + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +// eslint-disable-next-line @typescript-eslint/naming-convention +export const VSCODE_REMOTE_SSH_EXTENSION = { + cursor: { + id: 'anysphere.remote-ssh', + minVersion: '1.0.2', + }, + vscode: { + id: 'ms-vscode-remote.remote-ssh', + minVersion: '0.74.0', + }, +} as const + +/** + * Extension IDs that don't require runtime vscode access. + * Safe to import in test environments. + */ +// eslint-disable-next-line @typescript-eslint/naming-convention +export const VSCODE_EXTENSION_ID_CONSTANTS = { + awstoolkit: 'amazonwebservices.aws-toolkit-vscode', + amazonq: 'amazonwebservices.amazon-q-vscode', + python: 'ms-python.python', + // python depends on jupyter plugin + jupyter: 'ms-toolsai.jupyter', + yaml: 'redhat.vscode-yaml', + go: 'golang.go', + java: 'redhat.java', + javadebug: 'vscjava.vscode-java-debug', + dotnet: 'ms-dotnettools.csdevkit', + git: 'vscode.git', + // default to VSCode in test environment + remotessh: VSCODE_REMOTE_SSH_EXTENSION.vscode, +} as const diff --git a/packages/core/src/shared/extensions.ts b/packages/core/src/shared/extensions.ts index cd14a9f5996..3c287389474 100644 --- a/packages/core/src/shared/extensions.ts +++ b/packages/core/src/shared/extensions.ts @@ -10,27 +10,37 @@ import { TelemetryService } from './telemetry/telemetryService' import { CredentialsStore } from '../auth/credentials/store' import { SamCliContext } from './sam/cli/samCliContext' import { UriHandler } from './vscode/uriHandler' +import { VSCODE_EXTENSION_ID_CONSTANTS, VSCODE_REMOTE_SSH_EXTENSION } from './extensionIds' +// Determine the remote SSH extension based on the editor +const getRemoteSshExtension = () => { + const appName = vscode?.env?.appName?.toLowerCase() + if (!appName) { + return VSCODE_REMOTE_SSH_EXTENSION.vscode + } + + // Check each IDE key in the extension map + for (const key of Object.keys(VSCODE_REMOTE_SSH_EXTENSION)) { + if (appName.includes(key)) { + return VSCODE_REMOTE_SSH_EXTENSION[key as keyof typeof VSCODE_REMOTE_SSH_EXTENSION] + } + } + + return VSCODE_REMOTE_SSH_EXTENSION.vscode +} + +// For actual use in IDE, not test environment // eslint-disable-next-line @typescript-eslint/naming-convention export const VSCODE_EXTENSION_ID = { - awstoolkit: 'amazonwebservices.aws-toolkit-vscode', - amazonq: 'amazonwebservices.amazon-q-vscode', - python: 'ms-python.python', - // python depends on jupyter plugin - jupyter: 'ms-toolsai.jupyter', - yaml: 'redhat.vscode-yaml', - go: 'golang.go', - java: 'redhat.java', - javadebug: 'vscjava.vscode-java-debug', - dotnet: 'ms-dotnettools.csdevkit', - git: 'vscode.git', - remotessh: 'ms-vscode-remote.remote-ssh', -} as const - -export const vscodeExtensionMinVersion = { - remotessh: '0.74.0', + ...VSCODE_EXTENSION_ID_CONSTANTS, + get remotessh(): { readonly id: string; readonly minVersion: string } { + return getRemoteSshExtension() + }, } +// Re-export for backward compatibility +export { VSCODE_REMOTE_SSH_EXTENSION } + /** @deprecated Use `extensionGlobals.ts:globals` instead. */ export interface ExtContext { extensionContext: vscode.ExtensionContext diff --git a/packages/core/src/shared/remoteSession.ts b/packages/core/src/shared/remoteSession.ts index b45bdb3ca9c..a6009ca7fea 100644 --- a/packages/core/src/shared/remoteSession.ts +++ b/packages/core/src/shared/remoteSession.ts @@ -7,11 +7,12 @@ import * as vscode from 'vscode' import * as nls from 'vscode-nls' const localize = nls.loadMessageBundle() +import { getIdeInfo } from './vscode/env' import { Settings } from '../shared/settings' import { showConfirmationMessage, showMessageWithCancel } from './utilities/messages' import { CancellationError, Timeout } from './utilities/timeoutUtils' import { isExtensionInstalled, showInstallExtensionMsg } from './utilities/vsCodeUtils' -import { VSCODE_EXTENSION_ID, vscodeExtensionMinVersion } from './extensions' +import { VSCODE_EXTENSION_ID } from './extensions' import { Err, Result } from '../shared/utilities/result' import { ToolkitError, UnknownError } from './errors' import { getLogger } from './logger/logger' @@ -31,7 +32,7 @@ export enum RemoteSessionError { } export interface MissingTool { - readonly name: 'code' | 'ssm' | 'ssh' + readonly name: string readonly reason?: string } @@ -108,19 +109,19 @@ export async function ensureDependencies(): Promise { - if (!isExtensionInstalled(VSCODE_EXTENSION_ID.remotessh, vscodeExtensionMinVersion.remotessh)) { + if (!isExtensionInstalled(VSCODE_EXTENSION_ID.remotessh.id, VSCODE_EXTENSION_ID.remotessh.minVersion)) { showInstallExtensionMsg( - VSCODE_EXTENSION_ID.remotessh, + VSCODE_EXTENSION_ID.remotessh.id, 'Remote SSH', 'Connecting to Dev Environment', - vscodeExtensionMinVersion.remotessh + VSCODE_EXTENSION_ID.remotessh.minVersion ) - if (isExtensionInstalled(VSCODE_EXTENSION_ID.remotessh)) { + if (isExtensionInstalled(VSCODE_EXTENSION_ID.remotessh.id)) { throw new ToolkitError('Remote SSH extension version is too low', { cancelled: true, code: RemoteSessionError.ExtensionVersionTooLow, - details: { expected: vscodeExtensionMinVersion.remotessh }, + details: { expected: VSCODE_EXTENSION_ID.remotessh.minVersion }, }) } else { throw new ToolkitError('Remote SSH extension not installed', { @@ -146,8 +147,11 @@ async function ensureSsmCli() { export async function ensureTools() { const [vsc, ssh, ssm] = await Promise.all([getVscodeCliPath(), findSshPath(), ensureSsmCli()]) + const ideInfo = getIdeInfo() + const cliName = ideInfo.cliName + const missing: MissingTool[] = [] - pushIf(missing, vsc === undefined, { name: 'code' }) + pushIf(missing, vsc === undefined, { name: cliName }) pushIf(missing, ssh === undefined, { name: 'ssh' }) if (ssm.isErr()) { diff --git a/packages/core/src/shared/utilities/index.ts b/packages/core/src/shared/utilities/index.ts index e86f941456d..cedf04d49b3 100644 --- a/packages/core/src/shared/utilities/index.ts +++ b/packages/core/src/shared/utilities/index.ts @@ -5,6 +5,7 @@ export { isExtensionInstalled, isExtensionActive } from './vsCodeUtils' export { VSCODE_EXTENSION_ID } from '../extensions' +export { VSCODE_EXTENSION_ID_CONSTANTS } from '../extensionIds' export * from './functionUtils' export * as messageUtils from './messages' export * as CommentUtils from './commentUtils' diff --git a/packages/core/src/shared/utilities/pathFind.ts b/packages/core/src/shared/utilities/pathFind.ts index a0eea9e38ae..018b4feaa76 100644 --- a/packages/core/src/shared/utilities/pathFind.ts +++ b/packages/core/src/shared/utilities/pathFind.ts @@ -12,6 +12,7 @@ import { Settings } from '../settings' import { getLogger } from '../logger/logger' import { mergeResolvedShellPath } from '../env/resolveEnv' import { matchesPattern } from './textUtilities' +import { getIdeInfo } from '../vscode/env' /** Full path to VSCode CLI. */ let vscPath: string @@ -52,7 +53,7 @@ export async function tryRun( } /** - * Gets the fullpath to `code` (VSCode CLI), or falls back to "code" (not + * Gets the fullpath to the IDE CLI (code, cursor, kiro, windsurf, etc.), or falls back to the CLI name (not * absolute) if it works. * * @see https://github.com/microsoft/vscode-test/blob/4bdccd4c386813a8158b0f9b96f31cbbecbb3374/lib/util.ts#L133 @@ -62,27 +63,30 @@ export async function getVscodeCliPath(): Promise { return vscPath } + const ideInfo = getIdeInfo() + const cliName = ideInfo.cliName || 'code' + const vscExe = process.argv0 // https://github.com/microsoft/vscode-test/blob/4bdccd4c386813a8158b0f9b96f31cbbecbb3374/lib/util.ts#L133 const vscs = [ // Special case for flatpak (steamdeck). #V896741845 // https://github.com/flathub/com.visualstudio.code/blob/master/code.sh - '/app/bin/code', + `/app/bin/${cliName}`, // Note: macOS does not have a separate "code-insiders" binary. - path.resolve(`${vscode.env.appRoot}/bin/code`), // macOS - path.resolve(`${vscode.env.appRoot}/../../bin/code`), // Windows - path.resolve(`${vscode.env.appRoot}/../../bin/code-insiders`), // Windows + path.resolve(`${vscode.env.appRoot}/bin/${cliName}`), // macOS + path.resolve(`${vscode.env.appRoot}/../../bin/${cliName}`), // Windows + path.resolve(`${vscode.env.appRoot}/../../bin/${cliName}-insiders`), // Windows // Linux example "appRoot": vscode-linux-x64-1.42.0/VSCode-linux-x64/resources/app - path.resolve(`${vscode.env.appRoot}/code`), - path.resolve(vscExe, '../bin/code-insiders'), - path.resolve(vscExe, '../bin/code'), - path.resolve(vscExe, '../../bin/code-insiders'), - path.resolve(vscExe, '../../bin/code'), - '/usr/bin/code', - 'code', // $PATH + path.resolve(`${vscode.env.appRoot}/${cliName}`), + path.resolve(vscExe, `../bin/${cliName}-insiders`), + path.resolve(vscExe, `../bin/${cliName}`), + path.resolve(vscExe, `../../bin/${cliName}-insiders`), + path.resolve(vscExe, `../../bin/${cliName}`), + `/usr/bin/${cliName}`, + cliName, // $PATH ] for (const vsc of vscs) { - if (!vsc || (vsc !== 'code' && !(await fs.exists(vsc)))) { + if (!vsc || (vsc !== cliName && !(await fs.exists(vsc)))) { continue } if (await tryRun(vsc, ['--version'])) { diff --git a/packages/core/src/shared/vscode/env.ts b/packages/core/src/shared/vscode/env.ts index 1ddb042e415..0c0364699fe 100644 --- a/packages/core/src/shared/vscode/env.ts +++ b/packages/core/src/shared/vscode/env.ts @@ -396,3 +396,63 @@ export async function getMachineId(): Promise { // TODO: check exit code. return (await proc.run()).stdout.trim() ?? 'unknown-host' } + +/** + * Detects the current IDE information (name, CLI command, process patterns) + * Supports VS Code, Cursor, Kiro, Windsurf, and other forks + */ +export function getIdeInfo(): { + name: string + cliName: string + processPatterns: { + windows: RegExp + darwin: RegExp + linux: RegExp + } +} { + const appName = vscode?.env?.appName?.toLowerCase() || '' + + // Detect IDE based on app name + if (appName.includes('cursor')) { + return { + name: 'Cursor', + cliName: 'cursor', + processPatterns: { + windows: /Cursor\.exe/i, + darwin: /Cursor\.app\/Contents\/MacOS\/Electron/, + linux: /^cursor$/i, + }, + } + } else if (appName.includes('kiro')) { + return { + name: 'Kiro', + cliName: 'kiro', + processPatterns: { + windows: /Kiro\.exe/i, + darwin: /Kiro\.app\/Contents\/MacOS\/Electron/, + linux: /^kiro$/i, + }, + } + } else if (appName.includes('windsurf')) { + return { + name: 'Windsurf', + cliName: 'windsurf', + processPatterns: { + windows: /Windsurf\.exe/i, + darwin: /Windsurf\.app\/Contents\/MacOS\/Electron/, + linux: /^windsurf$/i, + }, + } + } + + // Default to VS Code (including insiders) + return { + name: 'VS Code', + cliName: 'code', + processPatterns: { + windows: /Code\.exe/i, + darwin: /Visual Studio Code( - Insiders)?\.app\/Contents\/MacOS\/Electron/, + linux: /^(code(-insiders)?|electron)$/i, + }, + } +} diff --git a/packages/core/src/test/awsService/sagemaker/uriHandlers.test.ts b/packages/core/src/test/awsService/sagemaker/uriHandlers.test.ts index 3c6a7d2d612..b77de9817e5 100644 --- a/packages/core/src/test/awsService/sagemaker/uriHandlers.test.ts +++ b/packages/core/src/test/awsService/sagemaker/uriHandlers.test.ts @@ -7,14 +7,14 @@ import * as sinon from 'sinon' import * as vscode from 'vscode' import assert from 'assert' import { UriHandler } from '../../../shared/vscode/uriHandler' -import { VSCODE_EXTENSION_ID } from '../../../shared/extensions' +import { VSCODE_EXTENSION_ID_CONSTANTS } from '../../../shared/extensionIds' import { register } from '../../../awsService/sagemaker/uriHandlers' function createConnectUri(params: { [key: string]: string }): vscode.Uri { const query = Object.entries(params) .map(([k, v]) => `${encodeURIComponent(k)}=${encodeURIComponent(v)}`) .join('&') - return vscode.Uri.parse(`vscode://${VSCODE_EXTENSION_ID.awstoolkit}/connect/sagemaker?${query}`) + return vscode.Uri.parse(`vscode://${VSCODE_EXTENSION_ID_CONSTANTS.awstoolkit}/connect/sagemaker?${query}`) } describe('SageMaker URI handler', function () { diff --git a/packages/core/src/test/codecatalyst/uriHandlers.test.ts b/packages/core/src/test/codecatalyst/uriHandlers.test.ts index 8e5ed9adf3a..0526c8ff344 100644 --- a/packages/core/src/test/codecatalyst/uriHandlers.test.ts +++ b/packages/core/src/test/codecatalyst/uriHandlers.test.ts @@ -8,7 +8,7 @@ import * as vscode from 'vscode' import assert from 'assert' import { register } from '../../codecatalyst/uriHandlers' import { UriHandler } from '../../shared/vscode/uriHandler' -import { VSCODE_EXTENSION_ID } from '../../shared/extensions' +import { VSCODE_EXTENSION_ID_CONSTANTS } from '../../shared/extensionIds' import { CodeCatalystClient } from '../../shared/clients/codecatalystClient' import { SeverityLevel } from '../shared/vscode/message' import { getTestWindow } from '../shared/vscode/window' @@ -18,14 +18,16 @@ import { builderIdStartUrl } from '../../auth/sso/constants' type Stub any> = sinon.SinonStub, ReturnType> function createCloneUri(target: string): vscode.Uri { - return vscode.Uri.parse(`vscode://${VSCODE_EXTENSION_ID.awstoolkit}/clone?url=${encodeURIComponent(target)}`) + return vscode.Uri.parse( + `vscode://${VSCODE_EXTENSION_ID_CONSTANTS.awstoolkit}/clone?url=${encodeURIComponent(target)}` + ) } function createConnectUri(params: { [key: string]: any }): vscode.Uri { const encoded = Object.entries(params) .map(([k, v]) => `${encodeURIComponent(k)}=${encodeURIComponent(v)}`) .join('&') - return vscode.Uri.parse(`vscode://${VSCODE_EXTENSION_ID.awstoolkit}/connect/codecatalyst?${encoded}`) + return vscode.Uri.parse(`vscode://${VSCODE_EXTENSION_ID_CONSTANTS.awstoolkit}/connect/codecatalyst?${encoded}`) } // Tests involving `UriHandler` should _not_ couple the URI paths to the implementation. diff --git a/packages/core/src/test/shared/utilities/vscodeUtils.test.ts b/packages/core/src/test/shared/utilities/vscodeUtils.test.ts index 450a378589f..5ce1bde0c8d 100644 --- a/packages/core/src/test/shared/utilities/vscodeUtils.test.ts +++ b/packages/core/src/test/shared/utilities/vscodeUtils.test.ts @@ -4,7 +4,7 @@ */ import assert from 'assert' -import { VSCODE_EXTENSION_ID } from '../../../shared/extensions' +import { VSCODE_EXTENSION_ID_CONSTANTS } from '../../../shared/extensionIds' import * as vscodeUtil from '../../../shared/utilities/vsCodeUtils' import * as vscode from 'vscode' import { getExcludePattern } from '../../../shared/fs/watchedFiles' @@ -18,8 +18,8 @@ describe('vscodeUtils', async function () { assert.deepStrictEqual(vscodeUtil.isExtensionActive('invalid.extension'), false) - await vscodeUtil.activateExtension(VSCODE_EXTENSION_ID.awstoolkit, false) - assert.deepStrictEqual(vscodeUtil.isExtensionActive(VSCODE_EXTENSION_ID.awstoolkit), true) + await vscodeUtil.activateExtension(VSCODE_EXTENSION_ID_CONSTANTS.awstoolkit, false) + assert.deepStrictEqual(vscodeUtil.isExtensionActive(VSCODE_EXTENSION_ID_CONSTANTS.awstoolkit), true) }) it('globDirPatterns()', async function () { diff --git a/packages/core/src/testE2E/codecatalyst/client.test.ts b/packages/core/src/testE2E/codecatalyst/client.test.ts index 84e9309120c..00f1d946d16 100644 --- a/packages/core/src/testE2E/codecatalyst/client.test.ts +++ b/packages/core/src/testE2E/codecatalyst/client.test.ts @@ -202,7 +202,7 @@ describe('Test how this codebase uses the CodeCatalyst API', function () { }) it('prompts to install the ssh extension if not available', async function () { - if (isExtensionInstalled(VSCODE_EXTENSION_ID.remotessh)) { + if (isExtensionInstalled(VSCODE_EXTENSION_ID.remotessh.id)) { skipTest(this, 'remote ssh already installed') } diff --git a/packages/toolkit/test/e2e/cloudformation/index.ts b/packages/toolkit/test/e2e/cloudformation/index.ts index 8431e84ed08..7d583e0ad39 100644 --- a/packages/toolkit/test/e2e/cloudformation/index.ts +++ b/packages/toolkit/test/e2e/cloudformation/index.ts @@ -4,12 +4,12 @@ */ import { runTests } from 'aws-core-vscode/test' -import { VSCODE_EXTENSION_ID } from 'aws-core-vscode/utils' +import { VSCODE_EXTENSION_ID_CONSTANTS } from 'aws-core-vscode/utils' export function run(): Promise { return runTests( process.env.TEST_DIR ?? ['../../core/dist/src/testE2E/cloudformation'], - VSCODE_EXTENSION_ID.awstoolkit, + VSCODE_EXTENSION_ID_CONSTANTS.awstoolkit, ['../../core/dist/src/testInteg/globalSetup.test.ts'] ) } diff --git a/packages/toolkit/test/e2e/index.ts b/packages/toolkit/test/e2e/index.ts index e6c624889c6..2d7c0471cb6 100644 --- a/packages/toolkit/test/e2e/index.ts +++ b/packages/toolkit/test/e2e/index.ts @@ -4,12 +4,12 @@ */ import { runTests } from 'aws-core-vscode/test' -import { VSCODE_EXTENSION_ID } from 'aws-core-vscode/utils' +import { VSCODE_EXTENSION_ID_CONSTANTS } from 'aws-core-vscode/utils' export function run(): Promise { return runTests( process.env.TEST_DIR ?? ['test/e2e', '../../core/dist/src/testE2E'], - VSCODE_EXTENSION_ID.awstoolkit, + VSCODE_EXTENSION_ID_CONSTANTS.awstoolkit, ['../../core/dist/src/testInteg/globalSetup.test.ts'] ) } diff --git a/packages/toolkit/test/integ/index.ts b/packages/toolkit/test/integ/index.ts index 1bad70fe545..9d750399761 100644 --- a/packages/toolkit/test/integ/index.ts +++ b/packages/toolkit/test/integ/index.ts @@ -4,12 +4,12 @@ */ import { runTests } from 'aws-core-vscode/test' -import { VSCODE_EXTENSION_ID } from 'aws-core-vscode/utils' +import { VSCODE_EXTENSION_ID_CONSTANTS } from 'aws-core-vscode/utils' export function run(): Promise { return runTests( process.env.TEST_DIR ?? ['test/integ', '../../core/dist/src/testInteg'], - VSCODE_EXTENSION_ID.awstoolkit, + VSCODE_EXTENSION_ID_CONSTANTS.awstoolkit, ['../../core/dist/src/testInteg/globalSetup.test.ts'] ) } diff --git a/packages/toolkit/test/unit/index.ts b/packages/toolkit/test/unit/index.ts index 998953c7fd4..efb8af8000a 100644 --- a/packages/toolkit/test/unit/index.ts +++ b/packages/toolkit/test/unit/index.ts @@ -4,10 +4,12 @@ */ import { runTests } from 'aws-core-vscode/test' -import { VSCODE_EXTENSION_ID } from 'aws-core-vscode/utils' +import { VSCODE_EXTENSION_ID_CONSTANTS } from 'aws-core-vscode/utils' export function run(): Promise { - return runTests(process.env.TEST_DIR ?? ['test/unit', '../../core/dist/src/test'], VSCODE_EXTENSION_ID.awstoolkit, [ - '../../core/dist/src/test/globalSetup.test.ts', - ]) + return runTests( + process.env.TEST_DIR ?? ['test/unit', '../../core/dist/src/test'], + VSCODE_EXTENSION_ID_CONSTANTS.awstoolkit, + ['../../core/dist/src/test/globalSetup.test.ts'] + ) } From 0abd58274b6952c3b89b76d37daab9ee1a71f9b2 Mon Sep 17 00:00:00 2001 From: Keen Wilson <40321520+keenwilson@users.noreply.github.com> Date: Fri, 20 Feb 2026 15:30:27 -0800 Subject: [PATCH 25/51] fix(auth): prevent connection usage when console login is cancelled or fails (#8580) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Problem - https://github.com/aws/aws-toolkit-vscode/pull/8537 introduced setupConsoleConnection() and getFunctionWithFallback() to handle authentication fallback for Lambda console-to-IDE transitions. - When developers click "Open in VSCode" and their local AWS profile is invalid, toolkit automatically triggers browser-based console login as a fallback. However, console login requires prerequisites that not all developers can complete. When developers cancel console login, the CLI never writes the connection profile to disk. The Toolkit then attempts to use this non-existent connection, resulting in "Connection does not exist" errors. problem-before-the-fix-connection-does-not-exist ## Solution - Verify connection exists in `setupConsoleConnection()` after "aws.toolkit.auth.consoleLogin" completes - Show warning message with link to [prerequisites documentation](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-sign-in.html#cli-configure-sign-in-prerequisites) when connection verification fails - Throw ToolkitError to halt execution and prevent downstream connection usage update-message-with-learnmore click-learnmore-show-dialog ### Background The Lambda load-function URI handler enables a seamless workflow where users can click "Open in Visual Studio Code" from the AWS Lambda console to view, edit, and deploy their Lambda functions directly in their preferred IDE. This feature downloads the function code locally, opens it in VS Code, and allows users to make changes and deploy updates back to AWS—all without leaving their development environment. --- - Treat all work as PUBLIC. Private `feature/x` branches will not be squash-merged at release time. - Your code changes must meet the guidelines in [CONTRIBUTING.md](https://github.com/aws/aws-toolkit-vscode/blob/master/CONTRIBUTING.md#guidelines). - License: I confirm that my contribution is made under the terms of the Apache 2.0 license. --- packages/core/src/auth/utils.ts | 15 ++++++++++++ packages/core/src/shared/constants.ts | 3 ++- packages/core/src/test/auth/utils.test.ts | 24 +++++++++++++++++++ ...-726900f0-c604-49ba-85ca-d35d454ffa9d.json | 4 ++++ 4 files changed, 45 insertions(+), 1 deletion(-) create mode 100644 packages/toolkit/.changes/next-release/Bug Fix-726900f0-c604-49ba-85ca-d35d454ffa9d.json diff --git a/packages/core/src/auth/utils.ts b/packages/core/src/auth/utils.ts index 82a79283954..d72abdff343 100644 --- a/packages/core/src/auth/utils.ts +++ b/packages/core/src/auth/utils.ts @@ -10,6 +10,7 @@ const localize = nls.loadMessageBundle() import * as vscode from 'vscode' import * as localizedText from '../shared/localizedText' +import { consoleSessionHelpUrl } from '../shared/constants' import { codicon, getIcon } from '../shared/icons' import { createQuickPick, DataQuickPickItem, showQuickPick } from '../shared/ui/pickerPrompter' import { isValidResponse } from '../shared/wizards/wizard' @@ -926,5 +927,19 @@ export async function setupConsoleConnection(profileName: string, region: string getLogger().info('Auth: Sets up a connection via browser login for profile: %s, region: %s', profileName, region) await vscode.commands.executeCommand('aws.toolkit.auth.consoleLogin', profileName, region) const connectionId = getConnectionIdFromProfile(profileName) + // Verify connection was actually created before trying to use it. + // The telemetry wrapper around the console login command catches and logs errors but returns undefined + // instead of re-throwing them. When users cancel (userCancelled=true), the command completes without error, + // so we must check if the connection exists before attempting to use it to avoid confusing downstream errors. + const connection = await Auth.instance.getConnection({ id: connectionId }) + if (!connection) { + const message = 'Unable to connect to AWS. Console login was cancelled or did not complete successfully.' + void vscode.window.showWarningMessage(message, localizedText.learnMore).then((selection) => { + if (selection === localizedText.learnMore) { + void vscode.env.openExternal(vscode.Uri.parse(consoleSessionHelpUrl)) + } + }) + throw new ToolkitError(message, { cancelled: true }) + } await Auth.instance.useConnection({ id: connectionId }) } diff --git a/packages/core/src/shared/constants.ts b/packages/core/src/shared/constants.ts index 95d2aaac309..86a8b3d5e5f 100644 --- a/packages/core/src/shared/constants.ts +++ b/packages/core/src/shared/constants.ts @@ -43,7 +43,8 @@ export const credentialHelpUrl: string = 'https://docs.aws.amazon.com/toolkit-for-vscode/latest/userguide/setup-credentials.html' export const ssoCredentialsHelpUrl: string = 'https://docs.aws.amazon.com/toolkit-for-vscode/latest/userguide/sso-credentials.html' - +export const consoleSessionHelpUrl: string = + 'https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-sign-in.html#cli-configure-sign-in-prerequisites' export const supportedLambdaRuntimesUrl: string = 'https://docs.aws.amazon.com/lambda/latest/dg/runtime-support-policy.html' export const createUrlForLambdaFunctionUrl = 'https://docs.aws.amazon.com/lambda/latest/dg/urls-configuration.html' diff --git a/packages/core/src/test/auth/utils.test.ts b/packages/core/src/test/auth/utils.test.ts index d1ac5c586d0..4a1c5fcefe5 100644 --- a/packages/core/src/test/auth/utils.test.ts +++ b/packages/core/src/test/auth/utils.test.ts @@ -9,6 +9,7 @@ import * as vscode from 'vscode' import { Auth } from '../../auth/auth' import { ToolkitError } from '../../shared/errors' import * as authUtils from '../../auth/utils' +import { getTestWindow } from '../shared/vscode/window' describe('getConnectionIdFromProfile', function () { it('constructs connection ID from profile name', function () { @@ -35,16 +36,39 @@ describe('setupConsoleConnection', function () { it('creates connection after successful console login', async function () { const executeCommandStub = sandbox.stub(vscode.commands, 'executeCommand').resolves() + const getConnectionStub = sandbox + .stub(Auth.instance, 'getConnection') + .resolves({ id: 'profile:test-profile' } as any) const useConnectionStub = sandbox.stub(Auth.instance, 'useConnection').resolves() await authUtils.setupConsoleConnection('test-profile', 'us-east-1') assert.ok(executeCommandStub.calledOnceWith('aws.toolkit.auth.consoleLogin', 'test-profile', 'us-east-1')) + assert.ok(getConnectionStub.calledOnceWith({ id: 'profile:test-profile' })) assert.ok(useConnectionStub.calledOnceWith({ id: 'profile:test-profile' })) }) + it('throws error when connection was not created', async function () { + sandbox.stub(vscode.commands, 'executeCommand').resolves() + sandbox.stub(Auth.instance, 'getConnection').resolves(undefined) + getTestWindow().onDidShowMessage((m) => m.close()) + + await assert.rejects( + () => authUtils.setupConsoleConnection('test-profile', 'us-east-1'), + (err: ToolkitError) => { + assert.strictEqual( + err.message, + 'Unable to connect to AWS. Console login was cancelled or did not complete successfully.' + ) + assert.strictEqual(err.cancelled, true) + return true + } + ) + }) + it('throws error when useConnection fails', async function () { sandbox.stub(vscode.commands, 'executeCommand').resolves() + sandbox.stub(Auth.instance, 'getConnection').resolves({ id: 'profile:test-profile' } as any) const error = new Error('useConnection failed') sandbox.stub(Auth.instance, 'useConnection').rejects(error) diff --git a/packages/toolkit/.changes/next-release/Bug Fix-726900f0-c604-49ba-85ca-d35d454ffa9d.json b/packages/toolkit/.changes/next-release/Bug Fix-726900f0-c604-49ba-85ca-d35d454ffa9d.json new file mode 100644 index 00000000000..add6f1eae01 --- /dev/null +++ b/packages/toolkit/.changes/next-release/Bug Fix-726900f0-c604-49ba-85ca-d35d454ffa9d.json @@ -0,0 +1,4 @@ +{ + "type": "Bug Fix", + "description": "Lamdbda: Console-to-IDE transition shows \"Connection does not exist\" error when console login is cancelled or fail." +} From 747f18cfcb10711ddd39cdd342af18bb37b63e53 Mon Sep 17 00:00:00 2001 From: msgupta-amazon Date: Mon, 23 Feb 2026 15:00:45 -0800 Subject: [PATCH 26/51] feat(sagemaker): Reconnection toolkit (#8485) ##Problem Right now, we don't support reconnection from toolkit for hyperpod spaces. ##Solution This PR will add the reconnection functionality which leads to seamless user experience. The duplicate check is failing but we need that code at 2 places, one for initial connection and in detached-server so that when the user closes the main window, detached server is able to provide the seamless user experience. ##Notes Tested the unit test cases and reconnection use cases end to end locally. --- - Treat all work as PUBLIC. Private `feature/x` branches will not be squash-merged at release time. - Your code changes must meet the guidelines in [CONTRIBUTING.md](https://github.com/aws/aws-toolkit-vscode/blob/master/CONTRIBUTING.md#guidelines). - License: I confirm that my contribution is made under the terms of the Apache 2.0 license. --------- Co-authored-by: msgupta Co-authored-by: Laxman Reddy <141967714+laileni-aws@users.noreply.github.com> Co-authored-by: invictus <149003065+ashishrp-aws@users.noreply.github.com> --- packages/core/resources/hyperpod_connect | 160 ++++++++++++-- packages/core/resources/hyperpod_connect.ps1 | 135 ++++++++++++ .../core/src/awsService/sagemaker/commands.ts | 5 +- .../detached-server/hyperpodMappingUtils.ts | 133 ++++++++++++ .../detached-server/kubectlClientStub.ts | 122 +++++++++++ .../routes/getHyperpodSession.ts | 205 ++++++++++++++++++ .../sagemaker/detached-server/server.ts | 12 +- .../sagemaker/detached-server/utils.ts | 3 +- .../awsService/sagemaker/hyperpodCommands.ts | 76 ++++++- .../sagemaker/hyperpodConnectionMonitor.ts | 142 ++++++++++++ .../sagemaker/hyperpodReconnection.ts | 94 ++++++++ .../src/awsService/sagemaker/hyperpodUtils.ts | 53 +++++ .../core/src/awsService/sagemaker/model.ts | 74 ++++++- .../core/src/shared/clients/kubectlClient.ts | 10 +- .../core/src/shared/utilities/cliUtils.ts | 11 +- .../hyperpodConnectionMonitor.test.ts | 75 +++++++ .../hyperpod/hyperpodReconnection.test.ts | 149 +++++++++++++ ...-8dac03d9-ef57-4018-a360-1f8a818b47ad.json | 4 + 18 files changed, 1413 insertions(+), 50 deletions(-) create mode 100644 packages/core/resources/hyperpod_connect.ps1 create mode 100644 packages/core/src/awsService/sagemaker/detached-server/hyperpodMappingUtils.ts create mode 100644 packages/core/src/awsService/sagemaker/detached-server/kubectlClientStub.ts create mode 100644 packages/core/src/awsService/sagemaker/detached-server/routes/getHyperpodSession.ts create mode 100644 packages/core/src/awsService/sagemaker/hyperpodConnectionMonitor.ts create mode 100644 packages/core/src/awsService/sagemaker/hyperpodReconnection.ts create mode 100644 packages/core/src/awsService/sagemaker/hyperpodUtils.ts create mode 100644 packages/core/src/test/awsService/hyperpod/hyperpodConnectionMonitor.test.ts create mode 100644 packages/core/src/test/awsService/hyperpod/hyperpodReconnection.test.ts create mode 100644 packages/toolkit/.changes/next-release/Feature-8dac03d9-ef57-4018-a360-1f8a818b47ad.json diff --git a/packages/core/resources/hyperpod_connect b/packages/core/resources/hyperpod_connect index 3360f24bacb..ef304030cef 100644 --- a/packages/core/resources/hyperpod_connect +++ b/packages/core/resources/hyperpod_connect @@ -6,25 +6,15 @@ # HyperPod is AWS's managed service for distributed machine learning training at scale. # # OVERVIEW: -# The script acts as a wrapper around the AWS SSM CLI to create a secure session tunnel to a HyperPod -# compute instance. It validates required parameters, logs the connection attempt, and executes the -# SSM StartSession command with HyperPod-specific connection details. -# -# REQUIRED ENVIRONMENT VARIABLES: -# AWS_REGION - AWS region where the HyperPod cluster is located (e.g., us-west-2) -# AWS_SSM_CLI - Path to the AWS SSM CLI executable -# STREAM_URL - WebSocket stream URL for the HyperPod session connection -# TOKEN - Authentication token for the HyperPod session -# SESSION_ID - Unique identifier for the HyperPod session +# The script always gets fresh credentials from the reconnection manager and uses them to establish +# a secure session tunnel to a HyperPod compute instance. # # OPTIONAL ENVIRONMENT VARIABLES: # LOG_FILE_LOCATION - Path to log file (default: /tmp/hyperpod_connect.log) # DEBUG_LOG - Enable debug logging (default: 0) # # USAGE: -# AWS_REGION=us-west-2 AWS_SSM_CLI=/usr/local/bin/session-manager-plugin \ -# STREAM_URL=wss://... TOKEN=abc123... SESSION_ID=session-xyz \ -# ./hyperpod_connect +# ./hyperpod_connect hp_demo1 # # SECURITY NOTE: # This script handles sensitive authentication tokens. Ensure proper file permissions @@ -57,6 +47,28 @@ _require() { _log "$1=$2" } +_url_encode() { + python3 -c "import sys, urllib.parse; print(urllib.parse.quote(sys.argv[1]))" "$1" +} + +_resolve_connection_key() { + local DEVSPACE_NAME=$1 + local PROFILES_FILE="$HOME/.aws/.hyperpod-space-profiles" + + [ ! -f "$PROFILES_FILE" ] && echo "$DEVSPACE_NAME" && return + + python3 -c " +import json +try: + with open('$PROFILES_FILE', 'r') as f: + profiles = json.load(f) + matches = sorted([k for k in profiles.keys() if k.endswith(':$DEVSPACE_NAME')]) + print(matches[0] if matches else '$DEVSPACE_NAME') +except: + print('$DEVSPACE_NAME') +" 2>/dev/null +} + _hyperpod() { # Function inputs local AWS_SSM_CLI=$1 @@ -68,19 +80,129 @@ _hyperpod() { exec "$AWS_SSM_CLI" "{\"streamUrl\":\"$STREAM_URL\",\"tokenValue\":\"$TOKEN\",\"sessionId\":\"$SESSION_ID\"}" "$AWS_REGION" "StartSession" } +_get_fresh_credentials() { + local CONNECTION_KEY=$1 + + _log "Getting fresh credentials for connection key: $CONNECTION_KEY" + + # Read server info to get port + if [ -z "$SAGEMAKER_LOCAL_SERVER_FILE_PATH" ]; then + _log "Error: SAGEMAKER_LOCAL_SERVER_FILE_PATH environment variable is not set" + exit 1 + fi + + if [ ! -f "$SAGEMAKER_LOCAL_SERVER_FILE_PATH" ]; then + _log "Error: Server info file not found: $SAGEMAKER_LOCAL_SERVER_FILE_PATH" + exit 1 + fi + + local PORT=$(jq -r '.port' "$SAGEMAKER_LOCAL_SERVER_FILE_PATH") + if [ -z "$PORT" ] || [ "$PORT" == "null" ]; then + _log "Error: 'port' field is missing or invalid in $SAGEMAKER_LOCAL_SERVER_FILE_PATH" + exit 1 + fi + + # Call API to get fresh credentials using the determined connection key + local API_URL + if [[ "$CONNECTION_KEY" =~ ^[^:]+:[^:]+:[^:]+$ ]]; then + # Use full connection key for precise lookup (preferred) + API_URL="http://localhost:$PORT/get_hyperpod_session?connection_key=$(_url_encode "$CONNECTION_KEY")" + elif [ -n "$CLUSTER_NAME" ] && [ -n "$NAMESPACE" ]; then + # Use individual parameters if available + API_URL="http://localhost:$PORT/get_hyperpod_session?devspace_name=$(_url_encode "$DEVSPACE_NAME")&namespace=$(_url_encode "$NAMESPACE")&cluster_name=$(_url_encode "$CLUSTER_NAME")" + else + # Fallback for legacy format + API_URL="http://localhost:$PORT/get_hyperpod_session?connection_key=$(_url_encode "$CONNECTION_KEY")" + fi + API_RESPONSE=$(curl -s "$API_URL") + + if [ $? -ne 0 ] || [ -z "$API_RESPONSE" ]; then + _log "Error: Failed to get credentials from API" + exit 1 + fi + + # Parse JSON once and check for error response + read -r STATUS ERROR_MSG CONNECTION_URL < <(echo "$API_RESPONSE" | python3 -c "import sys, json; data=json.load(sys.stdin); print(data.get('status', 'success'), data.get('message', ''), data.get('connection', {}).get('url', ''))" 2>/dev/null) || { + _log "Error: Failed to parse API response JSON" + exit 1 + } + if [ "$STATUS" = "error" ]; then + _log "Error from API: ${ERROR_MSG:-Unknown error}" + exit 1 + fi + + _log "Fresh credentials obtained from API" +} + _main() { # Set defaults for missing environment variables DEBUG_LOG=${DEBUG_LOG:-0} LOG_FILE_LOCATION=${LOG_FILE_LOCATION:-/tmp/hyperpod_connect.log} + if [ $# -ne 1 ]; then + _log "Usage: $0 hp_" + exit 1 + fi + + # Extract devspace name, cluster name, and namespace from hostname + # New format: hp_{cluster_name}_{namespace}_{space_name}_{region}_{account_id} + # Old format: hp_{devspace} (for backward compatibility) + if [[ "$1" =~ ^hp_([^_]+)_([^_]+)_([^_]+)_([^_]+)_([^_]+)$ ]]; then + # New format: cluster_namespace_space_region_account + CLUSTER_NAME="${BASH_REMATCH[1]}" + NAMESPACE="${BASH_REMATCH[2]}" + DEVSPACE_NAME="${BASH_REMATCH[3]}" + # Construct the expected connection key (cluster:namespace:devspace) + CONNECTION_KEY="${CLUSTER_NAME}:${NAMESPACE}:${DEVSPACE_NAME}" + else + # Old format or fallback - extract devspace name only + DEVSPACE_NAME=$(echo "$1" | sed 's/hp_//') + CLUSTER_NAME="" + NAMESPACE="" + CONNECTION_KEY="" + fi + + # For new format, we already have the connection key constructed from hostname + # For old format, look up the connection key from the hyperpod profiles file + [ -z "$CONNECTION_KEY" ] && CONNECTION_KEY=$(_resolve_connection_key "$DEVSPACE_NAME") + + if [ -z "$CONNECTION_KEY" ]; then + _log "Error: Could not determine connection key for devspace: $DEVSPACE_NAME" + exit 1 + fi + _log "==============================================================================" - _require AWS_REGION "${AWS_REGION:-}" - _require AWS_SSM_CLI "${AWS_SSM_CLI:-}" - _require SESSION_ID "${SESSION_ID:-}" - _require_nolog STREAM_URL "${STREAM_URL:-}" - _require_nolog TOKEN "${TOKEN:-}" + _log "Connecting to HyperPod devspace: $DEVSPACE_NAME (connection key: $CONNECTION_KEY)" + + # Always get fresh credentials (CONNECTION_URL is set by _get_fresh_credentials) + _get_fresh_credentials "$CONNECTION_KEY" + + if [[ "$CONNECTION_URL" =~ ^wss:// ]]; then + # Presigned URL format - extract session ID from path and token from cell-number param + SESSION_ID=$(echo "$CONNECTION_URL" | python3 -c "import sys, urllib.parse; url=sys.stdin.read().strip(); path=urllib.parse.urlparse(url).path; session_id=path.split('/')[-1] if path else ''; print(session_id)" 2>/dev/null) + TOKEN=$(echo "$CONNECTION_URL" | python3 -c "import sys, urllib.parse; url=sys.stdin.read().strip(); params=urllib.parse.parse_qs(urllib.parse.urlparse(url).query); print(params.get('cell-number', [''])[0])" 2>/dev/null) + STREAM_URL="$CONNECTION_URL" + else + # Kubectl format - extract from query params + SESSION_ID=$(echo "$CONNECTION_URL" | python3 -c "import sys, urllib.parse; url=sys.stdin.read().strip(); params=urllib.parse.parse_qs(urllib.parse.urlparse(url).query); print(params.get('sessionId', [''])[0])" 2>/dev/null) + TOKEN=$(echo "$CONNECTION_URL" | python3 -c "import sys, urllib.parse; url=sys.stdin.read().strip(); params=urllib.parse.parse_qs(urllib.parse.urlparse(url).query); print(params.get('sessionToken', [''])[0])" 2>/dev/null) + STREAM_URL=$(echo "$CONNECTION_URL" | python3 -c "import sys, urllib.parse; url=sys.stdin.read().strip(); params=urllib.parse.parse_qs(urllib.parse.urlparse(url).query); print(params.get('streamUrl', [''])[0])" 2>/dev/null) + fi + + # Extract region from stream URL + AWS_REGION=$(echo "$STREAM_URL" | grep -o '\.[a-z0-9-]*\.amazonaws\.com' | sed 's/^\.//;s/\.amazonaws\.com$//') + AWS_SSM_CLI="${AWS_SSM_CLI:-session-manager-plugin}" + + # Validate required parameters (SESSION_ID, STREAM_URL, TOKEN are fetched from API, not validated here) + _require AWS_REGION "${AWS_REGION}" + _require AWS_SSM_CLI "${AWS_SSM_CLI}" + + if [ -z "${SESSION_ID}" ] || [ -z "${STREAM_URL}" ] || [ -z "${TOKEN}" ]; then + _log "Error: Failed to retrieve valid session credentials from API" + exit 1 + fi _hyperpod "$AWS_SSM_CLI" "$AWS_REGION" "$STREAM_URL" "$TOKEN" "$SESSION_ID" } -_main \ No newline at end of file +_main "$@" diff --git a/packages/core/resources/hyperpod_connect.ps1 b/packages/core/resources/hyperpod_connect.ps1 new file mode 100644 index 00000000000..fb53c2527bb --- /dev/null +++ b/packages/core/resources/hyperpod_connect.ps1 @@ -0,0 +1,135 @@ +# HyperPod Connection Script (PowerShell) +# +# This script establishes a connection to an AWS SageMaker HyperPod instance using AWS Systems Manager (SSM). + +param( + [Parameter(Mandatory=$true)] + [string]$HostName +) + +$ErrorActionPreference = "Stop" + +$DebugLog = $env:DEBUG_LOG -eq "1" +$LogFileLocation = if ($env:LOG_FILE_LOCATION) { $env:LOG_FILE_LOCATION } else { "$env:TEMP\hyperpod_connect.log" } + +function Write-Log { + param([string]$Message) + $timestamp = Get-Date -Format "yyyy/MM/dd HH:mm:ss" + "$timestamp $Message" | Out-File -FilePath $LogFileLocation -Append -Encoding utf8 +} + +function Get-FreshCredentials { + param([string]$ConnectionKey) + + Write-Log "Getting fresh credentials for connection key: $ConnectionKey" + + # Read server info to get port + $serverInfoFile = "$env:APPDATA\Code\User\globalStorage\amazonwebservices.aws-toolkit-vscode\sagemaker-local-server-info.json" + if (-not (Test-Path $serverInfoFile)) { + Write-Log "Error: Server info file not found: $serverInfoFile" + exit 1 + } + + $serverInfo = Get-Content $serverInfoFile | ConvertFrom-Json + $port = $serverInfo.port + + if (-not $port) { + Write-Log "Error: Could not extract port from server info file" + exit 1 + } + + # Call API to get fresh credentials + $apiUrl = "http://localhost:$port/get_hyperpod_session?connection_key=$ConnectionKey" + + try { + $response = Invoke-RestMethod -Uri $apiUrl -Method Get + Write-Log "Fresh credentials obtained from API" + return $response + } catch { + Write-Log "Error: Failed to get credentials from API: $_" + exit 1 + } +} + +function Main { + Write-Log "==============================================================================" + + # Parse hostname format: hp_{cluster_name}_{namespace}_{space_name}_{region}_{account_id} + if ($HostName -match '^hp_([^_]+)_([^_]+)_([^_]+)_([^_]+)_([^_]+)$') { + $clusterName = $Matches[1] + $namespace = $Matches[2] + $devspaceName = $Matches[3] + $connectionKey = "${clusterName}:${namespace}:${devspaceName}" + } else { + # Old format fallback + $devspaceName = $HostName -replace '^hp_', '' + $profilesFile = "$env:USERPROFILE\.aws\.hyperpod-space-profiles" + + if (Test-Path $profilesFile) { + $profiles = Get-Content $profilesFile | ConvertFrom-Json + $matches = $profiles.PSObject.Properties.Name | Where-Object { $_ -match ":$devspaceName$" } | Sort-Object + $connectionKey = if ($matches) { $matches[0] } else { $devspaceName } + } else { + $connectionKey = $devspaceName + } + } + + if (-not $connectionKey) { + Write-Log "Error: Could not determine connection key for devspace: $devspaceName" + exit 1 + } + + Write-Log "Connecting to HyperPod devspace: $devspaceName (connection key: $connectionKey)" + + # Get fresh credentials + $apiResponse = Get-FreshCredentials -ConnectionKey $connectionKey + + # Parse connection URL + $connectionUrl = [System.Web.HttpUtility]::HtmlDecode($apiResponse.connection.url) + $uri = [System.Uri]$connectionUrl + $queryParams = [System.Web.HttpUtility]::ParseQueryString($uri.Query) + + $sessionId = $queryParams['sessionId'] + $token = $queryParams['sessionToken'] -replace ' ', '+' + $streamUrl = [System.Web.HttpUtility]::UrlDecode($queryParams['streamUrl']) -replace ' ', '+' + + # Add cell-number if present (and fix spaces) + $cellNumber = $queryParams['cell-number'] + if ($cellNumber) { + $cellNumberDecoded = [System.Web.HttpUtility]::UrlDecode($cellNumber) -replace ' ', '+' + $streamUrl += "&cell-number=$cellNumberDecoded" + } + + # Extract region from stream URL + if ($streamUrl -match '\.([a-z0-9-]+)\.amazonaws\.com') { + $awsRegion = $Matches[1] + } else { + Write-Log "Error: Could not extract region from stream URL" + exit 1 + } + + # Find session-manager-plugin + $awsSsmCli = $env:AWS_SSM_CLI + if (-not $awsSsmCli) { + # Try bundled version first + $bundledPath = "$env:APPDATA\Code\User\globalStorage\amazonwebservices.aws-toolkit-vscode\tools\Amazon\sessionmanagerplugin\bin\session-manager-plugin.exe" + if (Test-Path $bundledPath) { + $awsSsmCli = $bundledPath + } else { + # Fallback to PATH + $awsSsmCli = "session-manager-plugin" + } + } + + Write-Log "AWS_REGION=$awsRegion" + Write-Log "AWS_SSM_CLI=$awsSsmCli" + Write-Log "SESSION_ID=$sessionId" + + # Execute session-manager-plugin with proper JSON escaping (same as Studio script) + & $awsSsmCli "{\`"streamUrl\`":\`"${streamUrl}\`",\`"tokenValue\`":\`"${token}\`",\`"sessionId\`":\`"${sessionId}\`"}" "$awsRegion" "StartSession" +} + +# Load required assembly for URL decoding +Add-Type -AssemblyName System.Web + +Main \ No newline at end of file diff --git a/packages/core/src/awsService/sagemaker/commands.ts b/packages/core/src/awsService/sagemaker/commands.ts index 62c0940c017..5b898ebb30a 100644 --- a/packages/core/src/awsService/sagemaker/commands.ts +++ b/packages/core/src/awsService/sagemaker/commands.ts @@ -146,7 +146,10 @@ export async function deeplinkConnect( wsUrl, token, domain, - appType + appType, + workspaceName, + undefined, + namespace ) try { diff --git a/packages/core/src/awsService/sagemaker/detached-server/hyperpodMappingUtils.ts b/packages/core/src/awsService/sagemaker/detached-server/hyperpodMappingUtils.ts new file mode 100644 index 00000000000..3eb706a12c8 --- /dev/null +++ b/packages/core/src/awsService/sagemaker/detached-server/hyperpodMappingUtils.ts @@ -0,0 +1,133 @@ +/*! + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +import { promises as fs } from 'fs' // eslint-disable-line no-restricted-imports +import os from 'os' +import { join } from 'path' + +export interface HyperpodSpaceMapping { + namespace: string + clusterArn: string + clusterName: string + eksClusterName: string + endpoint?: string + certificateAuthorityData?: string + region?: string + accountId?: string + wsUrl?: string + token?: string +} + +export interface HyperpodMappings { + [connectionKey: string]: HyperpodSpaceMapping +} + +export const hyperpodMappingFilePath = join(os.homedir(), '.aws', '.hyperpod-space-profiles') +const tempFilePath = `${hyperpodMappingFilePath}.tmp` + +let isWriting = false +const writeQueue: Array<() => Promise> = [] + +export async function readHyperpodMapping(): Promise { + try { + const content = await fs.readFile(hyperpodMappingFilePath, 'utf-8') + return JSON.parse(content) + } catch (err: any) { + if (err.code === 'ENOENT') { + return {} + } + throw new Error(`Failed to read HyperPod mapping file: ${err.message}`) + } +} + +export async function writeHyperpodMapping(mapping: HyperpodMappings): Promise { + return new Promise((resolve, reject) => { + const writeOperation = async () => { + try { + const uniqueTempPath = `${tempFilePath}.${process.pid}.${Date.now()}` + const json = JSON.stringify(mapping, undefined, 2) + await fs.writeFile(uniqueTempPath, json) + await fs.rename(uniqueTempPath, hyperpodMappingFilePath) + resolve() + } catch (err: any) { + reject(new Error(`Failed to write HyperPod mapping file: ${err.message}`)) + } + } + + writeQueue.push(writeOperation) + void processWriteQueue() + }) +} + +export function createConnectionKey(devspaceName: string, namespace: string, clusterName: string): string { + if (devspaceName.includes(':') || namespace.includes(':') || clusterName.includes(':')) { + throw new Error('Connection key parameters cannot contain colon characters') + } + return `${clusterName}:${namespace}:${devspaceName}` +} + +export async function storeHyperpodConnection( + devspaceName: string, + namespace: string, + clusterArn: string, + clusterName: string, + eksClusterName: string, + endpoint?: string, + certificateAuthorityData?: string, + region?: string, + wsUrl?: string, + token?: string +): Promise { + const mapping = await readHyperpodMapping() + const connectionKey = createConnectionKey(devspaceName, namespace, clusterName) + const accountId = clusterArn.split(':')[4] + mapping[connectionKey] = { + namespace, + clusterArn, + clusterName, + eksClusterName, + endpoint, + certificateAuthorityData, + region, + accountId, + wsUrl, + token, + } + await writeHyperpodMapping(mapping) +} + +export async function getStoredConnections(): Promise { + return await readHyperpodMapping() +} + +export async function getHyperpodConnection(connectionKey: string): Promise { + const mapping = await readHyperpodMapping() + return mapping[connectionKey] +} + +export async function getHyperpodConnectionByDetails( + devspaceName: string, + namespace: string, + clusterName: string +): Promise { + const connectionKey = createConnectionKey(devspaceName, namespace, clusterName) + return getHyperpodConnection(connectionKey) +} + +async function processWriteQueue() { + if (isWriting || writeQueue.length === 0) { + return + } + + isWriting = true + try { + while (writeQueue.length > 0) { + const writeOperation = writeQueue.shift()! + await writeOperation() + } + } finally { + isWriting = false + } +} diff --git a/packages/core/src/awsService/sagemaker/detached-server/kubectlClientStub.ts b/packages/core/src/awsService/sagemaker/detached-server/kubectlClientStub.ts new file mode 100644 index 00000000000..e75a256cf7e --- /dev/null +++ b/packages/core/src/awsService/sagemaker/detached-server/kubectlClientStub.ts @@ -0,0 +1,122 @@ +/*! + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +import * as k8s from '@kubernetes/client-node' + +export interface HyperpodDevSpace { + name: string + namespace: string + cluster: string + group: string + version: string + plural: string + status: string + appType: string + creator: string + accessType: string +} + +export interface HyperpodCluster { + clusterName: string + clusterArn: string + status: string + regionCode: string +} + +export class KubectlClient { + private kubeConfig: k8s.KubeConfig + private k8sApi: k8s.CustomObjectsApi + private eksCluster: any + + constructor(eksCluster: any, hyperpodCluster: HyperpodCluster) { + this.eksCluster = eksCluster + this.kubeConfig = new k8s.KubeConfig() + this.loadKubeConfig(eksCluster, hyperpodCluster) + this.k8sApi = this.kubeConfig.makeApiClient(k8s.CustomObjectsApi) + } + + getEksCluster(): any { + return this.eksCluster + } + + private loadKubeConfig(eksCluster: any, hyperpodCluster: HyperpodCluster): void { + if (eksCluster.name && eksCluster.endpoint) { + this.kubeConfig.loadFromOptions({ + clusters: [ + { + name: eksCluster.name, + server: eksCluster.endpoint, + caData: eksCluster.certificateAuthority?.data, + skipTLSVerify: false, + }, + ], + users: [ + { + name: eksCluster.name, + exec: { + apiVersion: 'client.authentication.k8s.io/v1beta1', + command: 'aws', + args: [ + 'eks', + 'get-token', + '--cluster-name', + eksCluster.name, + '--region', + hyperpodCluster.regionCode, + ], + interactiveMode: 'Never', + }, + }, + ], + contexts: [ + { + name: eksCluster.name, + cluster: eksCluster.name, + user: eksCluster.name, + }, + ], + currentContext: eksCluster.name, + }) + } + } + + async createWorkspaceConnection(devSpace: HyperpodDevSpace): Promise<{ type: string; url: string }> { + try { + const group = 'connection.workspace.jupyter.org' + const version = 'v1alpha1' + const plural = 'workspaceconnections' + + const workspaceConnection = { + apiVersion: `${group}/${version}`, + kind: 'WorkspaceConnection', + metadata: { + namespace: devSpace.namespace, + }, + spec: { + workspaceName: devSpace.name, + workspaceConnectionType: 'vscode-remote', + }, + } + + const response = await this.k8sApi.createNamespacedCustomObject( + group, + version, + devSpace.namespace, + plural, + workspaceConnection + ) + + const body = response.body as any + const presignedUrl = body.status?.workspaceConnectionUrl + const connectionType = body.status?.workspaceConnectionType + + return { type: connectionType || 'vscode-remote', url: presignedUrl } + } catch (error) { + throw new Error( + `Failed to create workspace connection: ${error instanceof Error ? error.message : String(error)}` + ) + } + } +} diff --git a/packages/core/src/awsService/sagemaker/detached-server/routes/getHyperpodSession.ts b/packages/core/src/awsService/sagemaker/detached-server/routes/getHyperpodSession.ts new file mode 100644 index 00000000000..cb4491e900c --- /dev/null +++ b/packages/core/src/awsService/sagemaker/detached-server/routes/getHyperpodSession.ts @@ -0,0 +1,205 @@ +/*! + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +/* eslint-disable aws-toolkits/no-console-log */ +/* eslint-disable no-restricted-imports */ +import { IncomingMessage, ServerResponse } from 'http' +import url from 'url' +import { parse } from '@aws-sdk/util-arn-parser' +import { getHyperpodConnection, storeHyperpodConnection } from '../hyperpodMappingUtils' +import { KubectlClient, HyperpodDevSpace, HyperpodCluster } from '../kubectlClientStub' +import { execFile } from 'child_process' +import { promisify } from 'util' + +const execFileAsync = promisify(execFile) + +export async function handleGetHyperpodSession(req: IncomingMessage, res: ServerResponse): Promise { + const parsedUrl = url.parse(req.url || '', true) + const connectionKey = parsedUrl.query.connection_key + const devspaceName = parsedUrl.query.devspace_name + const namespace = parsedUrl.query.namespace + const clusterName = parsedUrl.query.cluster_name + + try { + let lookupKey: string + + if (connectionKey) { + lookupKey = Array.isArray(connectionKey) ? connectionKey[0] : connectionKey + } else if (devspaceName && namespace && clusterName) { + const devspaceStr = Array.isArray(devspaceName) ? devspaceName[0] : devspaceName + const namespaceStr = Array.isArray(namespace) ? namespace[0] : namespace + const clusterStr = Array.isArray(clusterName) ? clusterName[0] : clusterName + lookupKey = `${clusterStr}:${namespaceStr}:${devspaceStr}` + } else if (devspaceName) { + lookupKey = Array.isArray(devspaceName) ? devspaceName[0] : devspaceName + } else { + res.writeHead(400, { 'Content-Type': 'application/json' }) + res.end( + JSON.stringify({ + status: 'error', + message: 'connection_key or (devspace_name + namespace + cluster_name) required', + }) + ) + return + } + + const connectionInfo = await getHyperpodConnection(lookupKey) + if (!connectionInfo) { + res.writeHead(404, { 'Content-Type': 'application/json' }) + res.end(JSON.stringify({ status: 'error', message: 'Connection info not found' })) + return + } + + // Validate required fields + if (!connectionInfo.clusterArn || !connectionInfo.clusterName || !connectionInfo.namespace) { + res.writeHead(400, { 'Content-Type': 'application/json' }) + res.end(JSON.stringify({ status: 'error', message: 'Incomplete connection info: missing required fields' })) + return + } + + const keyParts = lookupKey.split(':') + const actualDevspaceName = keyParts.length === 3 ? keyParts[2] : String(devspaceName || lookupKey) + + // Check if we have EKS cluster details for kubectl-based reconnection + const hasKubectlDetails = !!(connectionInfo.endpoint && connectionInfo.certificateAuthorityData) + + // If this is a presigned URL connection without kubectl details, + // try to fetch EKS cluster details and generate fresh credentials + if (connectionInfo.wsUrl && !hasKubectlDetails) { + try { + // Attempt to fetch EKS cluster details using AWS CLI + const region = connectionInfo.region || parse(connectionInfo.clusterArn).region + const { stdout } = await execFileAsync('aws', [ + 'eks', + 'describe-cluster', + '--name', + connectionInfo.eksClusterName, + '--region', + region, + '--output', + 'json', + ]) + + const clusterData = JSON.parse(stdout) + const endpoint = clusterData.cluster?.endpoint + const certData = clusterData.cluster?.certificateAuthority?.data + + if (endpoint && certData) { + // Update stored connection with EKS details for future use + await storeHyperpodConnection( + actualDevspaceName, + connectionInfo.namespace, + connectionInfo.clusterArn, + connectionInfo.clusterName, + connectionInfo.eksClusterName, + endpoint, + certData, + region, + connectionInfo.wsUrl, + connectionInfo.token + ) + + // Now proceed with kubectl-based fresh credential generation + connectionInfo.endpoint = endpoint + connectionInfo.certificateAuthorityData = certData + } else { + throw new Error('EKS cluster details incomplete') + } + } catch (error) { + // If fetching EKS details fails, return stored URL as fallback + // This will fail if the presigned URL has expired + res.writeHead(200, { 'Content-Type': 'application/json' }) + res.end( + JSON.stringify({ + status: 'success', + connection: { + type: 'vscode-remote', + url: connectionInfo.wsUrl, + }, + devspace: actualDevspaceName, + timestamp: Date.now(), + warning: `Using cached presigned URL. Fresh credential generation failed: ${error instanceof Error ? error.message : String(error)}`, + }) + ) + return + } + } + + // For kubectl-based connections (left panel), always generate fresh credentials + + // Parse region from ARN - handle both standard and cluster ARN formats + let region: string + try { + region = parse(connectionInfo.clusterArn).region + } catch (error) { + // Fallback: extract region from ARN string directly + // ARN format: arn:aws:sagemaker:region:account:cluster/cluster-id + const arnParts = connectionInfo.clusterArn.split(':') + if (arnParts.length >= 4) { + region = arnParts[3] + } else { + throw new Error(`Invalid SageMaker ARN format: "${connectionInfo.clusterArn}"`) + } + } + const hyperpodCluster: HyperpodCluster = { + clusterName: connectionInfo.clusterName, + clusterArn: connectionInfo.clusterArn, + status: 'Active', + regionCode: region, + } + + const eksCluster = { + name: connectionInfo.eksClusterName, + arn: connectionInfo.clusterArn, + endpoint: connectionInfo.endpoint, + certificateAuthority: { + data: connectionInfo.certificateAuthorityData, + }, + } + + // Validate EKS cluster has required fields for kubectl connection + if (!eksCluster.endpoint || !eksCluster.certificateAuthority.data) { + res.writeHead(400, { 'Content-Type': 'application/json' }) + res.end( + JSON.stringify({ + status: 'error', + message: + 'Cannot generate fresh credentials: EKS cluster endpoint and certificate are missing. This connection was established via presigned URL. The presigned URL may have expired. Please reconnect from AWS Explorer or the console.', + }) + ) + return + } + + const kubectlClient = new KubectlClient(eksCluster, hyperpodCluster) + + const devSpace: HyperpodDevSpace = { + name: actualDevspaceName, + namespace: connectionInfo.namespace, + cluster: connectionInfo.clusterName, + group: 'workspace.jupyter.org', + version: 'v1alpha1', + plural: 'workspaces', + status: 'Running', + appType: '', + creator: '', + accessType: '', + } + + const workspaceConnection = await kubectlClient.createWorkspaceConnection(devSpace) + + res.writeHead(200, { 'Content-Type': 'application/json' }) + res.end( + JSON.stringify({ + status: 'success', + connection: workspaceConnection, + devspace: actualDevspaceName, + timestamp: Date.now(), + }) + ) + } catch (error: any) { + res.writeHead(500, { 'Content-Type': 'application/json' }) + res.end(JSON.stringify({ status: 'error', message: error.message })) + } +} diff --git a/packages/core/src/awsService/sagemaker/detached-server/server.ts b/packages/core/src/awsService/sagemaker/detached-server/server.ts index ccbb81897fc..5bc466f9f9f 100644 --- a/packages/core/src/awsService/sagemaker/detached-server/server.ts +++ b/packages/core/src/awsService/sagemaker/detached-server/server.ts @@ -10,6 +10,7 @@ import http, { IncomingMessage, ServerResponse } from 'http' import { handleGetSession } from './routes/getSession' import { handleGetSessionAsync } from './routes/getSessionAsync' import { handleRefreshToken } from './routes/refreshToken' +import { handleGetHyperpodSession } from './routes/getHyperpodSession' import url from 'url' import * as os from 'os' import fs from 'fs' @@ -21,7 +22,7 @@ const pollInterval = 30 * 60 * 100 // 30 minutes * Generic IDE process patterns for detection across all VS Code forks * Supports: VS Code, Cursor, Kiro, Windsurf, and other forks */ -const IDE_PROCESS_PATTERNS = { +const ideProcessPatterns = { windows: /Code\.exe|Cursor\.exe|Kiro\.exe|Windsurf\.exe/i, darwin: /(Visual Studio Code( - Insiders)?|Cursor|Kiro|Windsurf)\.app\/Contents\/MacOS\/Electron/, linux: /^(code(-insiders)?|cursor|kiro|windsurf|electron)$/i, @@ -37,6 +38,8 @@ const server = http.createServer((req: IncomingMessage, res: ServerResponse) => return handleGetSessionAsync(req, res) case '/refresh_token': return handleRefreshToken(req, res) + case '/get_hyperpod_session': + return handleGetHyperpodSession(req, res) default: res.writeHead(404, { 'Content-Type': 'text/plain' }) res.end(`Not Found: ${req.url}`) @@ -72,13 +75,12 @@ function checkVSCodeWindows(): Promise { const platform = os.platform() if (platform === 'win32') { - // Check for any VS Code fork process execFile('tasklist', [], (err, stdout) => { if (err) { resolve(false) return } - resolve(IDE_PROCESS_PATTERNS.windows.test(stdout)) + resolve(ideProcessPatterns.windows.test(stdout)) }) } else if (platform === 'darwin') { execFile('ps', ['aux'], (err, stdout) => { @@ -87,7 +89,7 @@ function checkVSCodeWindows(): Promise { return } - const found = stdout.split('\n').some((line) => IDE_PROCESS_PATTERNS.darwin.test(line)) + const found = stdout.split('\n').some((line) => ideProcessPatterns.darwin.test(line)) resolve(found) }) } else { @@ -97,7 +99,7 @@ function checkVSCodeWindows(): Promise { return } - const found = stdout.split('\n').some((line) => IDE_PROCESS_PATTERNS.linux.test(line.trim())) + const found = stdout.split('\n').some((line) => ideProcessPatterns.linux.test(line.trim())) resolve(found) }) } diff --git a/packages/core/src/awsService/sagemaker/detached-server/utils.ts b/packages/core/src/awsService/sagemaker/detached-server/utils.ts index fdbd1da1ab2..380a943244a 100644 --- a/packages/core/src/awsService/sagemaker/detached-server/utils.ts +++ b/packages/core/src/awsService/sagemaker/detached-server/utils.ts @@ -59,6 +59,7 @@ export async function readServerInfo(): Promise { * Parses a SageMaker ARN to extract region, account ID, and space name. * Supports formats like: * arn:aws:sagemaker:::space// + * arn:aws:sagemaker:::cluster/ * or sm_lc_arn:aws:sagemaker:::space__d-xxxx__ * * If the input is prefixed with an identifier (e.g. "sagemaker-user@"), the function will strip it. @@ -69,7 +70,7 @@ export async function readServerInfo(): Promise { */ export function parseArn(arn: string): { region: string; accountId: string; spaceName: string } { const cleanedArn = arn.includes('@') ? arn.split('@')[1] : arn - const regex = /^arn:aws:sagemaker:(?[^:]+):(?\d+):space[/:].+$/i + const regex = /^arn:aws:sagemaker:(?[^:]+):(?\d+):(space|cluster)[/:].+$/i const match = cleanedArn.match(regex) if (!match?.groups) { diff --git a/packages/core/src/awsService/sagemaker/hyperpodCommands.ts b/packages/core/src/awsService/sagemaker/hyperpodCommands.ts index 454bcc49c1d..3ec93380a98 100644 --- a/packages/core/src/awsService/sagemaker/hyperpodCommands.ts +++ b/packages/core/src/awsService/sagemaker/hyperpodCommands.ts @@ -11,6 +11,13 @@ import { SagemakerDevSpaceNode } from './explorer/sagemakerDevSpaceNode' import { showConfirmationMessage } from '../../shared/utilities/messages' import { SagemakerConstants } from './explorer/constants' import { SagemakerHyperpodNode } from './explorer/sagemakerHyperpodNode' +import { createConnectionKey, storeHyperpodConnection } from './detached-server/hyperpodMappingUtils' +import { HyperpodReconnectionManager } from './hyperpodReconnection' +import { HyperpodConnectionMonitor } from './hyperpodConnectionMonitor' +import { startLocalServer, prepareDevEnvConnection } from './model' +import { startVscodeRemote } from '../../shared/extensions/ssh' +import globals from '../../shared/extensionGlobals' +import { clearSSHHostKey } from './hyperpodUtils' const localize = nls.loadMessageBundle() @@ -56,10 +63,71 @@ export async function connectToHyperPodDevSpace(node: SagemakerDevSpaceNode): Pr logger.error(`No kubectlClient available for cluster: ${node.hpCluster.clusterName}`) return } - const response = await kubectlClient.createWorkspaceConnection(node.devSpace) - getLogger().debug(`HyperPod connection response: &O`, response) - await vscode.env.openExternal(vscode.Uri.parse(response.url)) - void vscode.window.showInformationMessage(`Started connection to HyperPod dev space: ${node.devSpace.name}`) + + const connectionKey = createConnectionKey( + node.devSpace.name, + node.devSpace.namespace, + node.hpCluster.clusterName + ) + + try { + await startLocalServer(globals.context) + + const eksCluster = kubectlClient.getEksCluster() + if (!eksCluster?.endpoint || !eksCluster?.certificateAuthority?.data) { + throw new Error('EKS cluster information is required but not available') + } + await storeHyperpodConnection( + node.devSpace.name, + node.devSpace.namespace, + node.hpCluster.clusterArn, + node.hpCluster.clusterName, + node.devSpace.cluster, + eksCluster.endpoint, + eksCluster.certificateAuthority.data, + node.regionCode + ) + + const reconnectionManager = HyperpodReconnectionManager.getInstance() + reconnectionManager.scheduleReconnection(connectionKey) + + const connectionMonitor = HyperpodConnectionMonitor.getInstance() + connectionMonitor.startMonitoring(connectionKey) + } catch (error) { + getLogger().warn(`Failed to store HyperPod connection info: ${error}`) + } + + await clearSSHHostKey(connectionKey, node.regionCode, node.hpCluster.clusterArn.split(':')[4]) + + const remoteEnv = await prepareDevEnvConnection( + '', + globals.context, + 'sm_hp', + false, + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + node.devSpace.name, + node.hpCluster.clusterName, + node.devSpace.namespace, + node.regionCode, + node.hpCluster.clusterArn + ) + + await startVscodeRemote( + remoteEnv.SessionProcess, + remoteEnv.hostname, + '/home/sagemaker-user', + remoteEnv.vscPath, + 'sagemaker-user' + ) + + void vscode.window.showInformationMessage( + `Connected to HyperPod dev space: ${node.devSpace.name} (${node.devSpace.namespace})` + ) } catch (error) { logger.error(`Failed to connect to HyperPod dev space: ${error}`) void vscode.window.showErrorMessage( diff --git a/packages/core/src/awsService/sagemaker/hyperpodConnectionMonitor.ts b/packages/core/src/awsService/sagemaker/hyperpodConnectionMonitor.ts new file mode 100644 index 00000000000..2713e4a0894 --- /dev/null +++ b/packages/core/src/awsService/sagemaker/hyperpodConnectionMonitor.ts @@ -0,0 +1,142 @@ +/*! + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +import { ChildProcess } from '../../shared/utilities/processUtils' +import { getLogger } from '../../shared/logger/logger' +import { HyperpodReconnectionManager } from './hyperpodReconnection' +import { getHyperpodConnection } from './detached-server/hyperpodMappingUtils' + +interface ConnectionState { + connectionKey: string + lastHealthCheck: number + reconnectAttempts: number +} + +export class HyperpodConnectionMonitor { + private static instance: HyperpodConnectionMonitor + private connections = new Map() + private healthCheckInterval?: NodeJS.Timeout + + static getInstance(): HyperpodConnectionMonitor { + if (!HyperpodConnectionMonitor.instance) { + HyperpodConnectionMonitor.instance = new HyperpodConnectionMonitor() + } + return HyperpodConnectionMonitor.instance + } + + startMonitoring(connectionKey: string): void { + const keyParts = connectionKey.split(':') + if (keyParts.length !== 3) { + getLogger().warn( + `Connection key ${connectionKey} does not follow expected format (cluster:namespace:devspace). Monitoring may be unreliable.` + ) + } + + this.connections.set(connectionKey, { + connectionKey, + lastHealthCheck: Date.now(), + reconnectAttempts: 0, + }) + + if (!this.healthCheckInterval) { + this.healthCheckInterval = setInterval(() => { + void this.performHealthChecks() + }, 30000) + } + } + + stopMonitoring(connectionKey: string): void { + this.connections.delete(connectionKey) + + if (this.connections.size === 0 && this.healthCheckInterval) { + clearInterval(this.healthCheckInterval) + this.healthCheckInterval = undefined + } + } + + private async performHealthChecks(): Promise { + for (const [connectionKey, state] of this.connections) { + try { + const hasActiveProcesses = await this.checkActiveProcesses(connectionKey) + if (hasActiveProcesses) { + state.lastHealthCheck = Date.now() + state.reconnectAttempts = 0 + } else { + await this.handleDisconnection(connectionKey, state) + } + } catch (error) { + await this.handleDisconnection(connectionKey, state) + } + } + } + + private async checkActiveProcesses(connectionKey: string): Promise { + try { + const keyParts = connectionKey.split(':') + const connectionMapping = await getHyperpodConnection(connectionKey) + + let hostPattern: string + if (keyParts.length === 3 && connectionMapping?.region && connectionMapping?.accountId) { + // New format: hp_____ + hostPattern = `hp_${keyParts[0]}_${keyParts[1]}_${keyParts[2]}_${connectionMapping.region}_${connectionMapping.accountId}` + } else { + hostPattern = `hp_${connectionKey.replace(/:/g, '_')}` + } + + const isWindows = process.platform === 'win32' + + if (isWindows) { + const tasklistCheck = new ChildProcess('tasklist', ['/FI', 'IMAGENAME eq ssh.exe', '/FO', 'CSV', '/NH']) + const result = await tasklistCheck.run() + return result.exitCode === 0 && result.stdout.includes('ssh.exe') + } else { + const sshCheck = new ChildProcess('pgrep', ['-f', `ssh.*${hostPattern}`]) + const ssmCheck = new ChildProcess('pgrep', ['-f', 'session-manager-plugin']) + + const [sshResult, ssmResult] = await Promise.allSettled([sshCheck.run(), ssmCheck.run()]) + + const hasSsh = sshResult.status === 'fulfilled' && sshResult.value.exitCode === 0 + const hasSSM = ssmResult.status === 'fulfilled' && ssmResult.value.exitCode === 0 + + return hasSsh || hasSSM + } + } catch { + return false + } + } + + private async handleDisconnection(connectionKey: string, state: ConnectionState): Promise { + if (state.reconnectAttempts >= 3) { + getLogger().error(`Max reconnection attempts reached for ${connectionKey}. Stopping monitoring.`) + this.stopMonitoring(connectionKey) + return + } + + state.reconnectAttempts++ + getLogger().warn( + `Connection lost for ${connectionKey}, refreshing credentials (attempt ${state.reconnectAttempts})` + ) + + try { + await HyperpodReconnectionManager.getInstance().refreshCredentials(connectionKey) + state.reconnectAttempts = 0 + state.lastHealthCheck = Date.now() + } catch (error) { + getLogger().error(`Failed to refresh credentials for ${connectionKey}: ${error}`) + + if (error instanceof Error && error.message?.includes('Connection mapping not found')) { + getLogger().error(`Connection mapping missing for ${connectionKey}. Stopping monitoring.`) + this.stopMonitoring(connectionKey) + } + } + } + + dispose(): void { + if (this.healthCheckInterval) { + clearInterval(this.healthCheckInterval) + } + this.connections.clear() + } +} diff --git a/packages/core/src/awsService/sagemaker/hyperpodReconnection.ts b/packages/core/src/awsService/sagemaker/hyperpodReconnection.ts new file mode 100644 index 00000000000..505050db512 --- /dev/null +++ b/packages/core/src/awsService/sagemaker/hyperpodReconnection.ts @@ -0,0 +1,94 @@ +/*! + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +import { getLogger } from '../../shared/logger/logger' +import { promises as fs } from 'fs' // eslint-disable-line no-restricted-imports +import * as vscode from 'vscode' +import globals from '../../shared/extensionGlobals' +import { clearSSHHostKey } from './hyperpodUtils' +import { getHyperpodConnection } from './detached-server/hyperpodMappingUtils' + +export class HyperpodReconnectionManager { + private static instance: HyperpodReconnectionManager + private timers = new Map() + + static getInstance(): HyperpodReconnectionManager { + if (!HyperpodReconnectionManager.instance) { + HyperpodReconnectionManager.instance = new HyperpodReconnectionManager() + } + return HyperpodReconnectionManager.instance + } + + scheduleReconnection(connectionKey: string, intervalMinutes: number = 12): void { + this.clearReconnection(connectionKey) + + const timer = setInterval( + () => { + this.refreshCredentials(connectionKey).catch((error) => { + getLogger().error(`Credential refresh failed for ${connectionKey}: ${error}`) + if (error.message?.includes('Connection mapping not found')) { + this.clearReconnection(connectionKey) + } + }) + }, + intervalMinutes * 60 * 1000 + ) + + this.timers.set(connectionKey, timer) + } + + clearReconnection(connectionKey: string): void { + const timer = this.timers.get(connectionKey) + if (timer) { + clearInterval(timer) + this.timers.delete(connectionKey) + } + } + + async refreshCredentials(connectionKey: string): Promise { + try { + const connectionMapping = await getHyperpodConnection(connectionKey) + await clearSSHHostKey(connectionKey, connectionMapping?.region, connectionMapping?.accountId) + + const serverInfoPath = vscode.Uri.joinPath( + globals.context.globalStorageUri, + 'sagemaker-local-server-info.json' + ).fsPath + + const serverInfoContent = await fs.readFile(serverInfoPath, 'utf8') + const serverInfo = JSON.parse(serverInfoContent) + + const keyParts = connectionKey.split(':') + if (keyParts.length !== 3) { + getLogger().warn( + `Using legacy connection key format: ${connectionKey}. This may cause issues with multiple namespaces.` + ) + } + + const port = parseInt(serverInfo.port, 10) + if (isNaN(port) || port < 1 || port > 65535) { + throw new Error('Invalid port number in server info') + } + + const apiUrl = `http://localhost:${port}/get_hyperpod_session?connection_key=${encodeURIComponent(connectionKey)}` + const response = await fetch(apiUrl) + + if (!response.ok) { + if (response.status === 404) { + throw new Error(`Connection mapping not found for ${connectionKey}. Please reconnect manually.`) + } + throw new Error(`API call failed: ${response.status} - ${response.statusText}`) + } + + const data = await response.json() + if (data.status !== 'success') { + throw new Error(data.message || 'Unknown API error') + } + } catch (error) { + getLogger().error(`Failed to refresh credentials for ${connectionKey}: ${error}`) + throw error + } + } +} diff --git a/packages/core/src/awsService/sagemaker/hyperpodUtils.ts b/packages/core/src/awsService/sagemaker/hyperpodUtils.ts new file mode 100644 index 00000000000..d0b67567a75 --- /dev/null +++ b/packages/core/src/awsService/sagemaker/hyperpodUtils.ts @@ -0,0 +1,53 @@ +/*! + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +import { ChildProcess } from '../../shared/utilities/processUtils' +import { getLogger } from '../../shared/logger/logger' +import { promises as fs } from 'fs' // eslint-disable-line no-restricted-imports +import path from 'path' +import os from 'os' + +export async function clearSSHHostKey(connectionKey: string, region?: string, accountId?: string): Promise { + const keyParts = connectionKey.split(':') + let hostKey: string + if (keyParts.length === 3 && region && accountId) { + // New format: hp_____ + hostKey = `hp_${keyParts[0]}_${keyParts[1]}_${keyParts[2]}_${region}_${accountId}` + } else { + hostKey = `hp_${connectionKey.replace(/:/g, '_')}` + } + + try { + const sshKeygen = new ChildProcess('ssh-keygen', ['-R', hostKey]) + await sshKeygen.run() + getLogger().debug(`Cleared SSH host key for ${hostKey}`) + } catch (error) { + // Fallback: manually edit known_hosts if ssh-keygen fails + getLogger().debug(`SSH host key cleanup with ssh-keygen failed, trying manual cleanup: ${error}`) + try { + const knownHostsPath = path.join(os.homedir(), '.ssh', 'known_hosts') + const content = await fs.readFile(knownHostsPath, 'utf8') + const lines = content.split('\n') + const filteredLines = lines.filter((line) => !line.startsWith(hostKey)) + await fs.writeFile(knownHostsPath, filteredLines.join('\n')) + getLogger().debug(`Manually cleared SSH host key for ${hostKey}`) + } catch (fallbackError) { + getLogger().debug(`Manual SSH host key cleanup also failed (non-critical): ${fallbackError}`) + } + } +} + +export async function clearAllHyperpodSSHKeys(): Promise { + try { + const knownHostsPath = path.join(os.homedir(), '.ssh', 'known_hosts') + const content = await fs.readFile(knownHostsPath, 'utf8') + const lines = content.split('\n') + const filteredLines = lines.filter((line) => !line.includes('hp_')) + await fs.writeFile(knownHostsPath, filteredLines.join('\n')) + getLogger().debug('Cleared all HyperPod SSH host keys') + } catch (error) { + getLogger().debug(`Failed to clear all HyperPod SSH keys: ${error}`) + } +} diff --git a/packages/core/src/awsService/sagemaker/model.ts b/packages/core/src/awsService/sagemaker/model.ts index bebbac31a0d..a1393a8e9a7 100644 --- a/packages/core/src/awsService/sagemaker/model.ts +++ b/packages/core/src/awsService/sagemaker/model.ts @@ -17,6 +17,7 @@ import _ from 'lodash' import { fs } from '../../shared/fs/fs' import * as nodefs from 'fs' import { getSmSsmEnv, spawnDetachedServer } from './utils' +import { parseArn } from './detached-server/utils' import { getLogger } from '../../shared/logger/logger' import { DevSettings } from '../../shared/settings' import { ToolkitError } from '../../shared/errors' @@ -25,6 +26,9 @@ import { sleep } from '../../shared/utilities/timeoutUtils' import { SagemakerUnifiedStudioSpaceNode } from '../../sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioSpaceNode' import { SshConfigError, SshConfigErrorMessage } from './constants' import globals from '../../shared/extensionGlobals' +import { HyperpodConnectionMonitor } from './hyperpodConnectionMonitor' +import { HyperpodReconnectionManager } from './hyperpodReconnection' +import { createConnectionKey } from './detached-server/hyperpodMappingUtils' const logger = getLogger('sagemaker') @@ -37,19 +41,32 @@ class HyperPodSshConfig extends SshConfig { } protected override createSSHConfigSection(proxyCommand: string): string { + const isWindows = process.platform === 'win32' + const quotedPath = isWindows ? `"${this.hyperpodConnectPath}"` : `'${this.hyperpodConnectPath}'` + const hostParam = isWindows ? '"%h"' : "'%h'" + const proxyCmd = isWindows + ? `powershell.exe -ExecutionPolicy Bypass -File ${quotedPath} ${hostParam}` + : `${quotedPath} ${hostParam}` + return ` # Created by AWS Toolkit for VSCode. https://github.com/aws/aws-toolkit-vscode Host hp_* ForwardAgent yes AddKeysToAgent yes StrictHostKeyChecking accept-new - ProxyCommand '${this.hyperpodConnectPath}' '%h' + ProxyCommand ${proxyCmd} IdentitiesOnly yes ` } public override async ensureValid() { - const proxyCommand = `'${this.hyperpodConnectPath}' '%h'` + const isWindows = process.platform === 'win32' + const quotedPath = isWindows ? `"${this.hyperpodConnectPath}"` : `'${this.hyperpodConnectPath}'` + const hostParam = isWindows ? '"%h"' : "'%h'" + const proxyCommand = isWindows + ? `powershell.exe -ExecutionPolicy Bypass -File ${quotedPath} ${hostParam}` + : `${quotedPath} ${hostParam}` + const verifyHost = await this.verifySSHHost(proxyCommand) if (verifyHost.isErr()) { return verifyHost @@ -101,7 +118,12 @@ export async function prepareDevEnvConnection( wsUrl?: string, token?: string, domain?: string, - appType?: string + appType?: string, + devspaceName?: string, + clusterName?: string, + namespace?: string, + region?: string, + clusterArn?: string ) { const remoteLogger = configureRemoteConnectionLogger() const { ssm, vsc, ssh } = (await ensureDependencies()).unwrap() @@ -119,7 +141,13 @@ export async function prepareDevEnvConnection( const hostnamePrefix = connectionType let hostname: string if (connectionType === 'sm_hp') { - hostname = `hp_${session}` + const clusterPart = clusterName || 'unknown' + const namespacePart = namespace || 'default' + const devspacePart = devspaceName || session || 'unknown' + const regionPart = + region || (clusterArn ? parseArn(clusterArn).region : wsUrl ? extractRegionFromStreamUrl(wsUrl) : 'unknown') + const accountPart = clusterArn ? parseArn(clusterArn).accountId : 'unknown' + hostname = `hp_${clusterPart}_${namespacePart}_${devspacePart}_${regionPart}_${accountPart}` } else { hostname = `${hostnamePrefix}_${spaceArn.replace(/\//g, '__').replace(/:/g, '_._')}` } @@ -134,21 +162,25 @@ export async function prepareDevEnvConnection( await persistSSMConnection(spaceArn, domain ?? '', session, wsUrl, token, appType, isSMUS) } - // HyperPod doesn't need the local server (only for SageMaker Studio) - if (connectionType !== 'sm_hp') { - await startLocalServer(ctx) - } + await startLocalServer(ctx) await removeKnownHost(hostname) - const hyperpodConnectPath = path.join(ctx.globalStorageUri.fsPath, 'hyperpod_connect') + const hyperpodConnectPath = path.join( + ctx.globalStorageUri.fsPath, + process.platform === 'win32' ? 'hyperpod_connect.ps1' : 'hyperpod_connect' + ) // Copy hyperpod_connect script if needed if (connectionType === 'sm_hp') { - const sourceScriptPath = ctx.asAbsolutePath('resources/hyperpod_connect') + const sourceScriptPath = ctx.asAbsolutePath( + process.platform === 'win32' ? 'resources/hyperpod_connect.ps1' : 'resources/hyperpod_connect' + ) if (!(await fs.existsFile(hyperpodConnectPath))) { try { await fs.copy(sourceScriptPath, hyperpodConnectPath) - await fs.chmod(hyperpodConnectPath, 0o755) + if (process.platform !== 'win32') { + await fs.chmod(hyperpodConnectPath, 0o755) + } logger.info(`Copied hyperpod_connect script to ${hyperpodConnectPath}`) } catch (err) { logger.error(`Failed to copy hyperpod_connect script: ${err}`) @@ -215,6 +247,10 @@ export async function prepareDevEnvConnection( AWS_SSM_CLI: ssm, DEBUG_LOG: '1', LOG_FILE_LOCATION: logFileLocation, + SAGEMAKER_LOCAL_SERVER_FILE_PATH: path.join( + ctx.globalStorageUri.fsPath, + 'sagemaker-local-server-info.json' + ), } // Add AWS credentials @@ -259,6 +295,22 @@ export async function prepareDevEnvConnection( rejectOnErrorCode: true, }) + // Start connection monitoring for HyperPod connections + if (connectionType === 'sm_hp' && devspaceName && clusterName && namespace) { + try { + const connectionKey = createConnectionKey(devspaceName, namespace, clusterName) + const connectionMonitor = HyperpodConnectionMonitor.getInstance() + connectionMonitor.startMonitoring(connectionKey) + + const reconnectionManager = HyperpodReconnectionManager.getInstance() + reconnectionManager.scheduleReconnection(connectionKey) + + getLogger().info(`Started monitoring and reconnection for HyperPod space: ${connectionKey}`) + } catch (error) { + getLogger().warn(`Failed to start HyperPod monitoring: ${error}`) + } + } + return { hostname, envProvider, diff --git a/packages/core/src/shared/clients/kubectlClient.ts b/packages/core/src/shared/clients/kubectlClient.ts index e4fe11c6545..faee64dc1fa 100644 --- a/packages/core/src/shared/clients/kubectlClient.ts +++ b/packages/core/src/shared/clients/kubectlClient.ts @@ -35,13 +35,19 @@ export interface HyperpodCluster { export class KubectlClient { private kubeConfig: k8s.KubeConfig private k8sApi: k8s.CustomObjectsApi + private eksCluster: Cluster - public constructor(eksCluster: Cluster, hyperpodCluster: HyperpodCluster) { + public constructor(eksCluster: Cluster, _hyperpodCluster: HyperpodCluster) { + this.eksCluster = eksCluster this.kubeConfig = new k8s.KubeConfig() - this.loadKubeConfig(eksCluster, hyperpodCluster) + this.loadKubeConfig(eksCluster, _hyperpodCluster) this.k8sApi = this.kubeConfig.makeApiClient(k8s.CustomObjectsApi) } + getEksCluster(): Cluster { + return this.eksCluster + } + async getSpacesForCluster(eksCluster: Cluster): Promise { try { const group = 'workspace.jupyter.org' diff --git a/packages/core/src/shared/utilities/cliUtils.ts b/packages/core/src/shared/utilities/cliUtils.ts index 1f785d056f4..768cc44d805 100644 --- a/packages/core/src/shared/utilities/cliUtils.ts +++ b/packages/core/src/shared/utilities/cliUtils.ts @@ -55,16 +55,13 @@ interface Cli { exec?: string } -export type AwsClis = Extract< - ToolId, - 'session-manager-plugin' | 'aws-cli' | 'sam-cli' | 'docker' | 'finch' | 'path-resolver' -> +export type AwsClis = Extract /** * CLIs and their full filenames and download paths for their respective OSes * TODO: Add SAM? Other CLIs? */ -export const awsClis: { [cli in AwsClis]: Cli } = { +export const awsClis: { [cli in AwsClis]: Cli } & { pathResolver: Cli } = { 'session-manager-plugin': { command: { unix: [path.join('sessionmanagerplugin', 'bin', 'session-manager-plugin')], @@ -188,7 +185,7 @@ export const awsClis: { [cli in AwsClis]: Cli } = { manualInstallLink: 'https://runfinch.com/docs/getting-started/installation/', exec: 'finch', }, - 'path-resolver': { + pathResolver: { command: { windows: ['where'], unix: ['which'], @@ -593,7 +590,7 @@ export async function updateAwsCli(): Promise { const result = await installCli('aws-cli', false) // Get the which/ where command, run it to find the AWS CLI path, and display it to the user - const whichCommands = getOsCommands(awsClis['path-resolver']) + const whichCommands = getOsCommands(awsClis.pathResolver) if (whichCommands && whichCommands.length > 0) { const whichCmd = whichCommands[0] const cliExec = awsClis['aws-cli'].exec diff --git a/packages/core/src/test/awsService/hyperpod/hyperpodConnectionMonitor.test.ts b/packages/core/src/test/awsService/hyperpod/hyperpodConnectionMonitor.test.ts new file mode 100644 index 00000000000..76807fb0704 --- /dev/null +++ b/packages/core/src/test/awsService/hyperpod/hyperpodConnectionMonitor.test.ts @@ -0,0 +1,75 @@ +/*! + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +import * as sinon from 'sinon' +import assert from 'assert' +import { HyperpodConnectionMonitor } from '../../../awsService/sagemaker/hyperpodConnectionMonitor' +import { HyperpodReconnectionManager } from '../../../awsService/sagemaker/hyperpodReconnection' + +describe('HyperpodConnectionMonitor', function () { + let sandbox: sinon.SinonSandbox + let clock: sinon.SinonFakeTimers + let monitor: HyperpodConnectionMonitor + + beforeEach(function () { + sandbox = sinon.createSandbox() + clock = sandbox.useFakeTimers() + monitor = createMonitor() + }) + + afterEach(function () { + monitor.dispose() + clock.restore() + sandbox.restore() + }) + + it('refreshes credentials immediately after a disconnection is detected', async function () { + const reconnectStub = sandbox.stub().resolves() + sandbox.stub(HyperpodReconnectionManager, 'getInstance').returns({ + reconnectToHyperpod: reconnectStub, + } as any) + + monitor.startMonitoring('hp-devspace') + + await (monitor as any).handleDisconnection('hp-devspace', 'process_exit') + + assert.strictEqual(reconnectStub.calledOnce, true) + assert.ok( + reconnectStub.calledWithExactly('hp-devspace'), + 'expected monitor to request immediate credential refresh' + ) + + const state = (monitor as any).connections.get('hp-devspace') + assert.ok(state, 'connection state should still exist') + assert.strictEqual(state.reconnectAttempts, 0, 'state should reset after successful refresh') + }) + + it('retries credential refresh with exponential backoff and stops at the limit', async function () { + const reconnectStub = sandbox.stub().rejects(new Error('network down')) + const managerStub = { + reconnectToHyperpod: reconnectStub, + } + sandbox.stub(HyperpodReconnectionManager, 'getInstance').returns(managerStub as any) + + monitor.startMonitoring('hp-devspace') + + await (monitor as any).handleDisconnection('hp-devspace', 'network_lost') + await clock.tickAsync(1000) + await clock.tickAsync(2000) + await clock.tickAsync(4000) + + assert.strictEqual(reconnectStub.callCount, 4, 'should attempt initial call plus three retries') + const state = (monitor as any).connections.get('hp-devspace') + assert.ok(state, 'connection state should still exist') + assert.strictEqual(state.retryTimer, undefined, 'no retry timer should remain after hitting retry cap') + }) + + function createMonitor() { + const instance = new HyperpodConnectionMonitor() + sandbox.stub(instance as any, 'startHealthChecks').callsFake(() => {}) + sandbox.stub(instance as any, 'setupEventListeners').callsFake(() => {}) + return instance + } +}) diff --git a/packages/core/src/test/awsService/hyperpod/hyperpodReconnection.test.ts b/packages/core/src/test/awsService/hyperpod/hyperpodReconnection.test.ts new file mode 100644 index 00000000000..56868f38bd4 --- /dev/null +++ b/packages/core/src/test/awsService/hyperpod/hyperpodReconnection.test.ts @@ -0,0 +1,149 @@ +/*! + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +import * as sinon from 'sinon' +import assert from 'assert' +import { promises as fsPromises } from 'fs' // eslint-disable-line no-restricted-imports +import { HyperpodReconnectionManager } from '../../../awsService/sagemaker/hyperpodReconnection' + +describe('HyperpodReconnectionManager', function () { + const devspaceName = 'test-space' + const serverInfo = JSON.stringify({ port: 8080 }) + + const createSuccessResponse = () => ({ + ok: true, + status: 200, + statusText: 'OK', + json: async () => ({ status: 'success' }), + }) + + let sandbox: sinon.SinonSandbox + let manager: HyperpodReconnectionManager + let fetchStub: sinon.SinonStub + let readStub: sinon.SinonStub + let clock: sinon.SinonFakeTimers + + beforeEach(function () { + sandbox = sinon.createSandbox() + clock = sandbox.useFakeTimers() + manager = HyperpodReconnectionManager.getInstance() + fetchStub = sandbox.stub(globalThis as any, 'fetch') + readStub = sandbox.stub(fsPromises, 'readFile') + manager.clearReconnection(devspaceName) + }) + + afterEach(function () { + sandbox.restore() + manager.clearReconnection(devspaceName) + }) + + it('returns singleton instance', function () { + assert.strictEqual( + HyperpodReconnectionManager.getInstance(), + HyperpodReconnectionManager.getInstance(), + 'expected singleton instance to be reused' + ) + }) + + describe('scheduleReconnection', function () { + beforeEach(function () { + readStub.resolves(serverInfo) + fetchStub.resolves(createSuccessResponse()) + }) + + it('schedules with default 15-minute interval', async function () { + const intervalSpy = sandbox.spy(clock, 'setInterval') + + manager.scheduleReconnection(devspaceName) + + sinon.assert.calledOnce(intervalSpy) + assert.strictEqual(intervalSpy.firstCall.args[1], 15 * 60 * 1000) + }) + + it('schedules with custom interval', async function () { + manager.scheduleReconnection(devspaceName, 0.01) + + await clock.tickAsync(600) + + sinon.assert.calledOnce(fetchStub) + }) + + it('clears existing timer before scheduling new one', async function () { + const clearIntervalSpy = sandbox.spy(clock, 'clearInterval') + + manager.scheduleReconnection(devspaceName, 0.02) + manager.scheduleReconnection(devspaceName, 0.01) + + sinon.assert.calledOnce(clearIntervalSpy) + + await clock.tickAsync(1200) + sinon.assert.callCount(fetchStub, 2) + }) + }) + + describe('clearReconnection', function () { + it('prevents scheduled calls', async function () { + readStub.resolves(serverInfo) + fetchStub.resolves(createSuccessResponse()) + + manager.scheduleReconnection(devspaceName, 0.005) + manager.clearReconnection(devspaceName) + + await clock.tickAsync(1000) + + sinon.assert.notCalled(fetchStub) + }) + + it('handles non-existent timer gracefully', function () { + assert.doesNotThrow(() => manager.clearReconnection('unknown')) + }) + }) + + describe('refreshCredentials', function () { + it('successfully refreshes credentials', async function () { + readStub.resolves(serverInfo) + fetchStub.resolves(createSuccessResponse()) + + await manager.refreshCredentials(devspaceName) + + sinon.assert.calledOnce(readStub) + sinon.assert.calledOnceWithExactly( + fetchStub, + 'http://localhost:8080/get_hyperpod_session?connection_key=test-space' + ) + }) + + it('throws on file read error', async function () { + readStub.rejects(new Error('File not found')) + + await assert.rejects(manager.refreshCredentials(devspaceName), /File not found/) + }) + + it('throws on API failure', async function () { + readStub.resolves(serverInfo) + fetchStub.resolves({ ok: false, status: 500, statusText: 'Server Error' } as any) + + await assert.rejects(manager.refreshCredentials(devspaceName), /API call failed: 500/) + }) + + it('throws on API error response', async function () { + readStub.resolves(serverInfo) + fetchStub.resolves({ + ok: true, + status: 200, + statusText: 'OK', + json: async () => ({ status: 'error', message: 'Auth failed' }), + } as any) + + await assert.rejects(manager.refreshCredentials(devspaceName), /Auth failed/) + }) + + it('throws on malformed JSON', async function () { + readStub.resolves('invalid json') + + await assert.rejects(manager.refreshCredentials(devspaceName), /Unexpected token/) + }) + }) +}) diff --git a/packages/toolkit/.changes/next-release/Feature-8dac03d9-ef57-4018-a360-1f8a818b47ad.json b/packages/toolkit/.changes/next-release/Feature-8dac03d9-ef57-4018-a360-1f8a818b47ad.json new file mode 100644 index 00000000000..d0dfd166d76 --- /dev/null +++ b/packages/toolkit/.changes/next-release/Feature-8dac03d9-ef57-4018-a360-1f8a818b47ad.json @@ -0,0 +1,4 @@ +{ + "type": "Feature", + "description": "This update enhances HyperPod Space connectivity in the Toolkit by adding reconnection support. In the event of a connection disruption, users can now seamlessly reconnect to their existing session and resume work without losing in-progress changes." +} From 939bfb5ccefd8aba31523df525fb90edecfd3629 Mon Sep 17 00:00:00 2001 From: Ziwei Ba Date: Tue, 24 Feb 2026 10:26:22 -0800 Subject: [PATCH 27/51] feat(sagemaker): Merge SageMaker SSH Kiro integration (#8589) ## Problem SageMaker Studio currently supports the ability for customers to connect their local VS Code IDE to SageMaker Spaces from the AWS Toolkit extension, but this is not supported for the Kiro IDE due to the Remote SSH extension for VS Code not being supported. ## Solution Merge staged feature enhancement which allows SageMaker Studio customers to connect to Spaces from the Kiro IDE. This includes the sagemaker-ssh-kiro sidecar extension as a scoped-down replacement for the Remote SSH for specifically SageMaker use cases, which will be installed on-demand with user consent when needed during the remote access ingress. This PR includes a changelog entry. --- - Treat all work as PUBLIC. Private `feature/x` branches will not be squash-merged at release time. - Your code changes must meet the guidelines in [CONTRIBUTING.md](https://github.com/aws/aws-toolkit-vscode/blob/master/CONTRIBUTING.md#guidelines). - License: I confirm that my contribution is made under the terms of the Apache 2.0 license. --------- Co-authored-by: aws-ides-bot Co-authored-by: aws-toolkit-automation <43144436+aws-toolkit-automation@users.noreply.github.com> Co-authored-by: Bhargav Co-authored-by: Bhargava Varadharajan Co-authored-by: kzr Co-authored-by: Laxman Reddy <141967714+laileni-aws@users.noreply.github.com> Co-authored-by: Sherry Lu Co-authored-by: Sherry Lu <75588211+XiaoxuanLu@users.noreply.github.com> Co-authored-by: Dylan Ross <90357952+dylanraws@users.noreply.github.com> Co-authored-by: zulil <31738836+liuzulin@users.noreply.github.com> Co-authored-by: Zulin Liu Co-authored-by: Bhavya Sharma Co-authored-by: David <60020664+dhasani23@users.noreply.github.com> Co-authored-by: David Hasani Co-authored-by: Arkaprava De Co-authored-by: Arkaprava De Co-authored-by: Keyu Wu Co-authored-by: chungjac Co-authored-by: aws-asolidu Co-authored-by: Newton Der Co-authored-by: Newton Der Co-authored-by: Will Lo <96078566+Will-ShaoHua@users.noreply.github.com> Co-authored-by: Boyu Co-authored-by: atontb <104926752+atonaamz@users.noreply.github.com> Co-authored-by: Richard Li <742829+rli@users.noreply.github.com> Co-authored-by: Shruti Sinha <44882001+shruti0085@users.noreply.github.com> Co-authored-by: Roger Zhang Co-authored-by: Tai Lai Co-authored-by: invictus <149003065+ashishrp-aws@users.noreply.github.com> Co-authored-by: BlakeLazarine Co-authored-by: Blake Lazarine Co-authored-by: tobixlea Co-authored-by: seshubaws <116689586+seshubaws@users.noreply.github.com> Co-authored-by: Keen Wilson <40321520+keenwilson@users.noreply.github.com> Co-authored-by: Bhavya Sharma Co-authored-by: satyaki <208557303+satyakigh@users.noreply.github.com> Co-authored-by: Chris Mendoza Co-authored-by: Kevin DeJong Co-authored-by: Akila Tennakoon Co-authored-by: Akila Tennakoon Co-authored-by: Deep Furiya <79759607+deepfuriya@users.noreply.github.com> Co-authored-by: Deep Furiya Co-authored-by: vicheey <181402101+vicheey@users.noreply.github.com> Co-authored-by: Renato Valenzuela <37676028+valerena@users.noreply.github.com> Co-authored-by: Aseem sharma <198968351+aseemxs@users.noreply.github.com> Co-authored-by: Reed Hamilton Co-authored-by: Zeeshan Ahmed <37942674+Zee2413@users.noreply.github.com> Co-authored-by: kzr-at-amazon Co-authored-by: Ziwei Ba --- .gitignore | 1 + LICENSE-THIRD-PARTY | 819 +++++++++--------- aws-toolkit-vscode.code-workspace | 3 + package-lock.json | 92 ++ .../core/resources/smus-context-template.md | 132 +++ .../core/src/awsService/sagemaker/commands.ts | 45 +- .../sagemaker/detached-server/errorPage.ts | 6 +- .../sagemaker/detached-server/server.ts | 45 +- .../core/src/awsService/sagemaker/model.ts | 179 ++-- .../sagemaker/sagemakerSshKiroUtils.ts | 170 ++++ .../bootstrapAgentContext.ts | 90 ++ .../explorer/activation.ts | 4 + .../shared/constants.ts | 19 + packages/core/src/shared/extensionIds.ts | 1 + .../core/src/shared/extensionUtilities.ts | 14 +- packages/core/src/shared/remoteSession.ts | 15 +- .../core/src/shared/utilities/pathFind.ts | 73 +- packages/core/src/shared/vscode/constants.ts | 1 + .../test/awsService/sagemaker/model.test.ts | 64 +- .../sagemaker/sagemakerSshKiroUtils.test.ts | 304 +++++++ .../bootstrapAgentContext.test.ts | 155 ++++ .../explorer/activation.test.ts | 27 + packages/sagemaker-ssh-kiro/CHANGELOG.md | 12 + packages/sagemaker-ssh-kiro/README.md | 3 + .../sagemaker-ssh-kiro/aws-icon-256x256.png | Bin 0 -> 10466 bytes packages/sagemaker-ssh-kiro/package.json | 117 +++ .../scripts/build/copyFiles.ts | 62 ++ .../sagemaker-ssh-kiro/src/authResolver.ts | 347 ++++++++ .../src/common/disposable.ts | 46 + .../sagemaker-ssh-kiro/src/common/logger.ts | 20 + .../sagemaker-ssh-kiro/src/common/ports.ts | 138 +++ .../src/common/promiseUtils.ts | 22 + .../src/common/streamUtils.ts | 33 + packages/sagemaker-ssh-kiro/src/extension.ts | 40 + .../sagemaker-ssh-kiro/src/serverConfig.ts | 44 + .../sagemaker-ssh-kiro/src/serverSetup.ts | 450 ++++++++++ .../sagemaker-ssh-kiro/src/sshConnection.ts | 348 ++++++++ packages/sagemaker-ssh-kiro/tsconfig.json | 11 + .../vscode.proposed.resolvers.d.ts | 475 ++++++++++ packages/sagemaker-ssh-kiro/webpack.config.js | 40 + ...-17b786cd-7705-4696-add5-21558550f99b.json | 4 + ...-a04fc1f1-b60a-4d3b-ad39-ef4067f9483e.json | 4 + packages/toolkit/package.json | 3 +- packages/toolkit/scripts/build/copyFiles.ts | 22 + 44 files changed, 3980 insertions(+), 520 deletions(-) create mode 100644 packages/core/resources/smus-context-template.md create mode 100644 packages/core/src/awsService/sagemaker/sagemakerSshKiroUtils.ts create mode 100644 packages/core/src/sagemakerunifiedstudio/bootstrapAgentContext.ts create mode 100644 packages/core/src/sagemakerunifiedstudio/shared/constants.ts create mode 100644 packages/core/src/test/awsService/sagemaker/sagemakerSshKiroUtils.test.ts create mode 100644 packages/core/src/test/sagemakerunifiedstudio/bootstrapAgentContext.test.ts create mode 100644 packages/sagemaker-ssh-kiro/CHANGELOG.md create mode 100644 packages/sagemaker-ssh-kiro/README.md create mode 100644 packages/sagemaker-ssh-kiro/aws-icon-256x256.png create mode 100644 packages/sagemaker-ssh-kiro/package.json create mode 100644 packages/sagemaker-ssh-kiro/scripts/build/copyFiles.ts create mode 100644 packages/sagemaker-ssh-kiro/src/authResolver.ts create mode 100644 packages/sagemaker-ssh-kiro/src/common/disposable.ts create mode 100644 packages/sagemaker-ssh-kiro/src/common/logger.ts create mode 100644 packages/sagemaker-ssh-kiro/src/common/ports.ts create mode 100644 packages/sagemaker-ssh-kiro/src/common/promiseUtils.ts create mode 100644 packages/sagemaker-ssh-kiro/src/common/streamUtils.ts create mode 100644 packages/sagemaker-ssh-kiro/src/extension.ts create mode 100644 packages/sagemaker-ssh-kiro/src/serverConfig.ts create mode 100644 packages/sagemaker-ssh-kiro/src/serverSetup.ts create mode 100644 packages/sagemaker-ssh-kiro/src/sshConnection.ts create mode 100644 packages/sagemaker-ssh-kiro/tsconfig.json create mode 100644 packages/sagemaker-ssh-kiro/vscode.proposed.resolvers.d.ts create mode 100644 packages/sagemaker-ssh-kiro/webpack.config.js create mode 100644 packages/toolkit/.changes/next-release/Feature-17b786cd-7705-4696-add5-21558550f99b.json create mode 100644 packages/toolkit/.changes/next-release/Feature-a04fc1f1-b60a-4d3b-ad39-ef4067f9483e.json diff --git a/.gitignore b/.gitignore index 8a8b0fbe406..b7cad7ddd13 100644 --- a/.gitignore +++ b/.gitignore @@ -47,6 +47,7 @@ packages/toolkit/package.nls.json packages/toolkit/resources packages/amazonq/package.nls.json packages/amazonq/resources +packages/sagemaker-ssh-kiro/resources # Icons packages/*/resources/fonts/aws-toolkit-icons.woff diff --git a/LICENSE-THIRD-PARTY b/LICENSE-THIRD-PARTY index 873fd158694..518423005a7 100644 --- a/LICENSE-THIRD-PARTY +++ b/LICENSE-THIRD-PARTY @@ -2846,320 +2846,320 @@ @protobufjs/aspromise 1.1.2 -Copyright (c) 2016, Daniel Wirtz All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - -* Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. -* Neither the name of its author, nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +Copyright (c) 2016, Daniel Wirtz All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +* Neither the name of its author, nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ****************************** @protobufjs/base64 1.1.2 -Copyright (c) 2016, Daniel Wirtz All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - -* Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. -* Neither the name of its author, nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +Copyright (c) 2016, Daniel Wirtz All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +* Neither the name of its author, nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ****************************** @protobufjs/codegen 2.0.4 -Copyright (c) 2016, Daniel Wirtz All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - -* Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. -* Neither the name of its author, nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +Copyright (c) 2016, Daniel Wirtz All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +* Neither the name of its author, nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ****************************** @protobufjs/eventemitter 1.1.0 -Copyright (c) 2016, Daniel Wirtz All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - -* Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. -* Neither the name of its author, nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +Copyright (c) 2016, Daniel Wirtz All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +* Neither the name of its author, nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ****************************** @protobufjs/fetch 1.1.0 -Copyright (c) 2016, Daniel Wirtz All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - -* Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. -* Neither the name of its author, nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +Copyright (c) 2016, Daniel Wirtz All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +* Neither the name of its author, nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ****************************** @protobufjs/float 1.0.2 -Copyright (c) 2016, Daniel Wirtz All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - -* Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. -* Neither the name of its author, nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +Copyright (c) 2016, Daniel Wirtz All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +* Neither the name of its author, nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ****************************** @protobufjs/inquire 1.1.0 -Copyright (c) 2016, Daniel Wirtz All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - -* Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. -* Neither the name of its author, nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +Copyright (c) 2016, Daniel Wirtz All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +* Neither the name of its author, nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ****************************** @protobufjs/path 1.1.2 -Copyright (c) 2016, Daniel Wirtz All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - -* Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. -* Neither the name of its author, nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +Copyright (c) 2016, Daniel Wirtz All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +* Neither the name of its author, nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ****************************** @protobufjs/pool 1.1.0 -Copyright (c) 2016, Daniel Wirtz All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - -* Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. -* Neither the name of its author, nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +Copyright (c) 2016, Daniel Wirtz All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +* Neither the name of its author, nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ****************************** @protobufjs/utf8 1.1.0 -Copyright (c) 2016, Daniel Wirtz All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - -* Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. -* Neither the name of its author, nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +Copyright (c) 2016, Daniel Wirtz All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +* Neither the name of its author, nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ****************************** @@ -4929,13 +4929,13 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. color-name 1.1.4 -The MIT License (MIT) -Copyright (c) 2015 Dmitry Ivanov - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - +The MIT License (MIT) +Copyright (c) 2015 Dmitry Ivanov + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ****************************** @@ -7345,27 +7345,27 @@ IN THE SOFTWARE. registry-js 1.16.1 -MIT License - -Copyright (c) 2017 GitHub Desktop - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. +MIT License + +Copyright (c) 2017 GitHub Desktop + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. ****************************** @@ -8166,17 +8166,17 @@ THE SOFTWARE. tslib 2.8.1 -Copyright (c) Microsoft Corporation. - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH -REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY -AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, -INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM -LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR -OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +Copyright (c) Microsoft Corporation. + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ****************************** @@ -8243,61 +8243,88 @@ END OF TERMS AND CONDITIONS typescript 4.9.5 -Apache License - -Version 2.0, January 2004 - -http://www.apache.org/licenses/ - -TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - -1. Definitions. - -"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. - -"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. - -"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. - -"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. - -"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. - -"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. - -"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). - -"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. - -"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." - -"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. - -2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. - -3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. - -4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: - -You must give any other recipients of the Work or Derivative Works a copy of this License; and - -You must cause any modified files to carry prominent notices stating that You changed the files; and - -You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and - -If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. - -5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. - -6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. - -7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. - -8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. - -9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. - -END OF TERMS AND CONDITIONS +Apache License + +Version 2.0, January 2004 + +http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + +"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. + +"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. + +"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + +"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. + +"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + +"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. + +"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). + +"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + +"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." + +"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: + +You must give any other recipients of the Work or Derivative Works a copy of this License; and + +You must cause any modified files to carry prominent notices stating that You changed the files; and + +You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and + +If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + + +****************************** + +unbox-primitive +1.0.2 +MIT License + +Copyright (c) 2019 Jordan Harband + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. ****************************** @@ -8607,27 +8634,27 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. win-ca 3.5.1 -MIT License - -Copyright (c) 2020 Stas Ukolov - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. +MIT License + +Copyright (c) 2020 Stas Ukolov + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. ****************************** @@ -8695,27 +8722,27 @@ IN THE SOFTWARE. xmlbuilder 11.0.1 -The MIT License (MIT) - -Copyright (c) 2013 Ozgur Ozcitak - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. +The MIT License (MIT) + +Copyright (c) 2013 Ozgur Ozcitak + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. ****************************** diff --git a/aws-toolkit-vscode.code-workspace b/aws-toolkit-vscode.code-workspace index f03aafae2fe..a0b64cc44ad 100644 --- a/aws-toolkit-vscode.code-workspace +++ b/aws-toolkit-vscode.code-workspace @@ -12,6 +12,9 @@ { "path": "packages/amazonq", }, + { + "path": "packages/sagemaker-ssh-kiro", + }, ], "settings": { "typescript.tsdk": "node_modules/typescript/lib", diff --git a/package-lock.json b/package-lock.json index ae5fc495f56..12b025a4be7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -35382,6 +35382,33 @@ "@types/node": "*" } }, + "node_modules/@types/ssh2": { + "version": "1.15.5", + "resolved": "https://registry.npmjs.org/@types/ssh2/-/ssh2-1.15.5.tgz", + "integrity": "sha512-N1ASjp/nXH3ovBHddRJpli4ozpk6UdDYIX4RJWFa9L1YKnzdhTlVmiGHm4DZnj/jLbqZpes4aeR30EFGQtvhQQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "^18.11.18" + } + }, + "node_modules/@types/ssh2/node_modules/@types/node": { + "version": "18.19.129", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.129.tgz", + "integrity": "sha512-hrmi5jWt2w60ayox3iIXwpMEnfUvOLJCRtrOPbHtH15nTjvO7uhnelvrdAs0dO0/zl5DZ3ZbahiaXEVb54ca/A==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/ssh2/node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/stream-buffers": { "version": "3.0.7", "dev": true, @@ -37383,6 +37410,15 @@ "version": "1.0.3", "license": "MIT" }, + "node_modules/buildcheck": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/buildcheck/-/buildcheck-0.0.6.tgz", + "integrity": "sha512-8f9ZJCUXyT1M35Jx7MkBgmBMo3oHTTBIPLiY9xyL0pl3T5RwcPEY8cUHr5LBNfu/fk6c2T4DJZuVM/8ZZT2D2A==", + "optional": true, + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/builtin-modules": { "version": "3.3.0", "dev": true, @@ -38195,6 +38231,20 @@ "node": ">=4" } }, + "node_modules/cpu-features": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/cpu-features/-/cpu-features-0.0.10.tgz", + "integrity": "sha512-9IkYqtX3YHPCzoVg1Py+o9057a3i0fp7S530UWokCSaFVTc7CwXPRiOjRjBQQ18ZCNafx78YfnG+HALxtVmOGA==", + "hasInstallScript": true, + "optional": true, + "dependencies": { + "buildcheck": "~0.0.6", + "nan": "^2.19.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/create-ecdh": { "version": "4.0.4", "license": "MIT", @@ -43084,6 +43134,13 @@ "thenify-all": "^1.0.0" } }, + "node_modules/nan": { + "version": "2.23.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.23.0.tgz", + "integrity": "sha512-1UxuyYGdoQHcGg87Lkqm3FzefucTa0NAiOcuRsDmysep3c1LVCRK2krrUDafMWtjSG04htvAmvg96+SDknOmgQ==", + "license": "MIT", + "optional": true + }, "node_modules/nanoid": { "version": "3.3.3", "dev": true, @@ -45176,6 +45233,10 @@ "version": "2.1.2", "license": "MIT" }, + "node_modules/sagemaker-ssh-kiro": { + "resolved": "packages/sagemaker-ssh-kiro", + "link": true + }, "node_modules/sanitize-html": { "version": "2.13.0", "license": "MIT", @@ -45760,6 +45821,23 @@ "version": "1.0.3", "license": "BSD-3-Clause" }, + "node_modules/ssh2": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/ssh2/-/ssh2-1.17.0.tgz", + "integrity": "sha512-wPldCk3asibAjQ/kziWQQt1Wh3PgDFpC0XpwclzKcdT1vql6KeYxf5LIt4nlFkUeR8WuphYMKqUA56X4rjbfgQ==", + "hasInstallScript": true, + "dependencies": { + "asn1": "^0.2.6", + "bcrypt-pbkdf": "^1.0.2" + }, + "engines": { + "node": ">=10.16.0" + }, + "optionalDependencies": { + "cpu-features": "~0.0.10", + "nan": "^2.23.0" + } + }, "node_modules/sshpk": { "version": "1.18.0", "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz", @@ -50606,6 +50684,20 @@ "assert": "^2.1.0" } }, + "packages/sagemaker-ssh-kiro": { + "version": "0.2.0", + "license": "Apache-2.0", + "dependencies": { + "ssh2": "^1.17.0" + }, + "devDependencies": { + "@types/ssh2": "^1.15.0" + }, + "engines": { + "npm": "^10.1.0", + "vscode": "^1.83.0" + } + }, "packages/toolkit": { "name": "aws-toolkit-vscode", "version": "3.97.0-SNAPSHOT", diff --git a/packages/core/resources/smus-context-template.md b/packages/core/resources/smus-context-template.md new file mode 100644 index 00000000000..a3e21950096 --- /dev/null +++ b/packages/core/resources/smus-context-template.md @@ -0,0 +1,132 @@ +--- +inclusion: always +--- + +# SageMaker Unified Studio Space Context + +This workspace is running on an Amazon SageMaker Unified Studio Space. + +## Environment +- Operating system: Ubuntu-based SageMaker Distribution +- User: sagemaker-user +- Home directory: /home/sagemaker-user +- AWS credentials are available via the container credentials provider (AWS_CONTAINER_CREDENTIALS_RELATIVE_URI) +- Do NOT hardcode AWS credentials; use the default credential chain (e.g., boto3.Session()) + +## Project Info +- ~/README.md contains project-specific configuration such as connection names and available compute resources. +- ~/shared/README.md contains shared project data catalog and storage information. +Refer to these files when you need details about the project's connections, databases, or S3 paths. + +## Project Library (`sagemaker_studio`) +The `sagemaker_studio` package is pre-installed and provides access to project resources. + +### Project +```python +from sagemaker_studio import Project +project = Project() + +project.id +project.name +project.iam_role # project IAM role ARN +project.kms_key_arn # project KMS key ARN (if configured) +project.mlflow_tracking_server_arn # MLflow ARN (if configured) +project.s3.root # project S3 root path +``` + +### Connections +```python +project.connections # list all connections +project.connection() # default IAM connection +project.connection("redshift") # named connection +conn.name, conn.id, conn.iam_role +conn.physical_endpoints[0].host # endpoint host +conn.data # all connection properties +conn.secret # credentials (dict or string) +conn.create_client() # boto3 client with connection credentials +conn.create_client("glue") # boto3 client for specific service +``` + +### Catalogs, Databases, and Tables +```python +catalog = project.connection().catalog() # default catalog +catalog = project.connection().catalog("catalog_id") +catalog.databases # list databases +db = catalog.database("my_db") +db.tables # list tables +table = db.table("my_table") +table.columns # list columns (name, type) +``` + +### SQL Utilities +```python +from sagemaker_studio import sqlutils + +# DuckDB (local, no connection needed) +result = sqlutils.sql("SELECT * FROM my_df WHERE id > 1") + +# Athena +result = sqlutils.sql("SELECT * FROM orders", connection_name="project.athena") + +# Redshift +result = sqlutils.sql("SELECT * FROM products", connection_name="project.redshift") + +# Parameterized queries +result = sqlutils.sql( + "SELECT * FROM orders WHERE status = :status", + parameters={"status": "completed"}, + connection_name="project.redshift" +) + +# Get SQLAlchemy engine +engine = sqlutils.get_engine(connection_name="project.redshift") +``` + +### DataFrame Utilities +```python +from sagemaker_studio import dataframeutils +import pandas as pd + +# Read from catalog table +df = pd.read_catalog_table(database="my_db", table="my_table") + +# Write to catalog table +df.to_catalog_table(database="my_db", table="my_table") + +# S3 Tables catalog +df = pd.read_catalog_table( + database="my_db", table="my_table", + catalog="s3tablescatalog/my_catalog" +) +``` + +### Spark Utilities +```python +from sagemaker_studio import sparkutils + +# Initialize Spark Connect session +spark = sparkutils.init() +spark = sparkutils.init(connection_name="my_spark_connection") + +# Get Spark options for JDBC connections +options = sparkutils.get_spark_options("my_redshift_connection") +df = spark.read.format("jdbc").options(**options).option("dbtable", "my_table").load() +``` + +## Compute Options +- **Local Python**: Runs directly on the Space instance. Use for single-machine Python, ML, and AI workloads. +- **Apache Spark (AWS Glue / Amazon EMR)**: Use `%%pyspark`, `%%scalaspark`, or `%%sql` cell magics in notebooks. Default Spark connection is `project.spark.compatibility`. +- **SQL (Athena)**: Use `%%sql project.athena` for Trino SQL queries via Amazon Athena. +- **SQL (Redshift)**: Use `%%sql project.redshift` if a Redshift connection is available. + +## Code Patterns +- Use `sagemaker_studio.Project()` for project-aware sessions and resource discovery +- Reference data using S3 URIs in s3://bucket/prefix format +- Write Spark DataFrames to the project catalog: `df.write.saveAsTable(f"{database}.table_name", format='parquet', mode='overwrite')` +- SQL query results are available as DataFrames in subsequent cells via the `_` variable +- Use `sqlutils.sql()` for programmatic SQL execution against any connection +- Use `pd.read_catalog_table()` / `df.to_catalog_table()` for pandas catalog I/O + +## MCP Server Configuration +- When configuring MCP servers, pass AWS credentials via environment variable expansion: + "AWS_CONTAINER_CREDENTIALS_RELATIVE_URI": "${AWS_CONTAINER_CREDENTIALS_RELATIVE_URI}" diff --git a/packages/core/src/awsService/sagemaker/commands.ts b/packages/core/src/awsService/sagemaker/commands.ts index 5b898ebb30a..fa7ef62b5e5 100644 --- a/packages/core/src/awsService/sagemaker/commands.ts +++ b/packages/core/src/awsService/sagemaker/commands.ts @@ -13,13 +13,18 @@ import { getLogger } from '../../shared/logger/logger' import { SagemakerSpaceNode, tryRefreshNode } from './explorer/sagemakerSpaceNode' import { isRemoteWorkspace } from '../../shared/vscode/env' import _ from 'lodash' -import { prepareDevEnvConnection, tryRemoteConnection } from './model' +import { + prepareDevEnvConnection, + startRemoteViaSageMakerSshKiro, + tryRemoteConnection, + useSageMakerSshKiroExtension, +} from './model' +import { ensureSageMakerSshKiroExtension } from './sagemakerSshKiroUtils' import { ExtContext } from '../../shared/extensions' import { SagemakerClient } from '../../shared/clients/sagemaker' import { AccessDeniedException } from '@amzn/sagemaker-client' import { ToolkitError, isUserCancelledError } from '../../shared/errors' import { showConfirmationMessage } from '../../shared/utilities/messages' -import { RemoteSessionError } from '../../shared/remoteSession' import { ConnectFromRemoteWorkspaceMessage, InstanceTypeInsufficientMemory, @@ -113,11 +118,11 @@ export async function deeplinkConnect( ) getLogger().info( - `sm:deeplinkConnect: - domain: ${domain}, - appType: ${appType}, - workspaceName: ${workspaceName}, - namespace: ${namespace}, + `sm:deeplinkConnect: + domain: ${domain}, + appType: ${appType}, + workspaceName: ${workspaceName}, + namespace: ${namespace}, eksClusterArn: ${eksClusterArn}` ) @@ -153,13 +158,21 @@ export async function deeplinkConnect( ) try { - await startVscodeRemote( - remoteEnv.SessionProcess, - remoteEnv.hostname, - '/home/sagemaker-user', - remoteEnv.vscPath, - 'sagemaker-user' - ) + const path = '/home/sagemaker-user' + const username = 'sagemaker-user' + + if (useSageMakerSshKiroExtension()) { + await ensureSageMakerSshKiroExtension(ctx.extensionContext) + await startRemoteViaSageMakerSshKiro( + remoteEnv.SessionProcess, + remoteEnv.hostname, + path, + remoteEnv.vscPath, + username + ) + } else { + await startVscodeRemote(remoteEnv.SessionProcess, remoteEnv.hostname, path, remoteEnv.vscPath, username) + } } catch (remoteErr: any) { throw new ToolkitError( `Failed to establish remote connection: ${remoteErr.message}. Check Remote-SSH logs for details.`, @@ -174,9 +187,9 @@ export async function deeplinkConnect( isSMUS ) - if (![RemoteSessionError.MissingExtension, RemoteSessionError.ExtensionVersionTooLow].includes(err.code)) { + if (!isUserCancelledError(err)) { void vscode.window.showErrorMessage( - `Remote connection failed: ${err.message || 'Unknown error'}. Check Output > Log (Window) for details.` + `Remote connection failed: ${err?.message || 'Unknown error'}. Check Output > Log (Window) for details.` ) throw err } diff --git a/packages/core/src/awsService/sagemaker/detached-server/errorPage.ts b/packages/core/src/awsService/sagemaker/detached-server/errorPage.ts index d1c88ca3fec..dc916dda31b 100644 --- a/packages/core/src/awsService/sagemaker/detached-server/errorPage.ts +++ b/packages/core/src/awsService/sagemaker/detached-server/errorPage.ts @@ -79,12 +79,12 @@ export const ErrorText = { 'Your session has expired. Update the credentials associated with the IAM profile or use a valid IAM profile, then try again.', }, [ExceptionType.INTERNAL_FAILURE]: { - Title: 'Failed to connect remotely to VSCode', - Text: 'Unable to establish remote connection to VSCode. This could be due to several factors. Please try again by clicking the VSCode button. If the problem persists, please contact your admin.', + Title: 'Failed to connect remotely to the Space', + Text: 'Unable to establish remote connection to the Space. This could be due to several factors. Please try again by clicking the connect button. If the problem persists, please contact your admin.', }, [ExceptionType.RESOURCE_LIMIT_EXCEEDED]: { Title: 'Connection limit reached', - Text: 'You have 10 active remote connections to this space. Stop an existing connection to start a new one.', + Text: 'You have 10 active remote connections to this space. Stop an existing connection to start a new one. If the problem persists, try restarting the Space.', }, [ExceptionType.THROTTLING]: { Title: 'Too many connection attempts', diff --git a/packages/core/src/awsService/sagemaker/detached-server/server.ts b/packages/core/src/awsService/sagemaker/detached-server/server.ts index 5bc466f9f9f..35c5d2a7aa4 100644 --- a/packages/core/src/awsService/sagemaker/detached-server/server.ts +++ b/packages/core/src/awsService/sagemaker/detached-server/server.ts @@ -53,6 +53,9 @@ server.listen(0, '127.0.0.1', async () => { const pid = process.pid console.log(`Detached server listening on http://127.0.0.1:${port} (pid: ${pid})`) + const parentIdeType = process.env.PARENT_IDE_TYPE + + console.log(`Parent IDE type: ${parentIdeType}`) const filePath = process.env.SAGEMAKER_LOCAL_SERVER_FILE_PATH if (!filePath) { @@ -73,15 +76,27 @@ server.listen(0, '127.0.0.1', async () => { function checkVSCodeWindows(): Promise { return new Promise((resolve) => { const platform = os.platform() + const parentIdeType = process.env.PARENT_IDE_TYPE if (platform === 'win32') { - execFile('tasklist', [], (err, stdout) => { - if (err) { - resolve(false) - return - } - resolve(ideProcessPatterns.windows.test(stdout)) - }) + if (parentIdeType === 'kiro') { + execFile('tasklist', ['/FI', 'IMAGENAME eq kiro.exe'], (err, stdout) => { + if (err) { + resolve(false) + return + } + resolve(/kiro\.exe/i.test(stdout)) + }) + } else { + // Check for any VS Code fork process + execFile('tasklist', [], (err, stdout) => { + if (err) { + resolve(false) + return + } + resolve(ideProcessPatterns.windows.test(stdout)) + }) + } } else if (platform === 'darwin') { execFile('ps', ['aux'], (err, stdout) => { if (err) { @@ -89,7 +104,13 @@ function checkVSCodeWindows(): Promise { return } - const found = stdout.split('\n').some((line) => ideProcessPatterns.darwin.test(line)) + let found = false + if (parentIdeType === 'kiro') { + found = stdout.split('\n').some((line) => /kiro\.app\/Contents\/MacOS\/Electron/i.test(line)) + } else { + // Default to VSCode + found = stdout.split('\n').some((line) => ideProcessPatterns.darwin.test(line)) + } resolve(found) }) } else { @@ -99,7 +120,13 @@ function checkVSCodeWindows(): Promise { return } - const found = stdout.split('\n').some((line) => ideProcessPatterns.linux.test(line.trim())) + let found = false + if (parentIdeType === 'kiro') { + found = stdout.split('\n').some((line) => /^kiro(-insiders)?$/i.test(line.trim())) + } else { + // Default to VSCode + found = stdout.split('\n').some((line) => ideProcessPatterns.linux.test(line.trim())) + } resolve(found) }) } diff --git a/packages/core/src/awsService/sagemaker/model.ts b/packages/core/src/awsService/sagemaker/model.ts index a1393a8e9a7..1b1bc7a0cc1 100644 --- a/packages/core/src/awsService/sagemaker/model.ts +++ b/packages/core/src/awsService/sagemaker/model.ts @@ -8,7 +8,7 @@ import * as vscode from 'vscode' import { getSshConfigPath, sshAgentSocketVariable, startSshAgent, startVscodeRemote } from '../../shared/extensions/ssh' import { createBoundProcess, ensureDependencies } from '../../shared/remoteSession' -import { SshConfig } from '../../shared/sshConfig' +import { ensureConnectScript, SshConfig } from '../../shared/sshConfig' import { Result } from '../../shared/utilities/result' import * as path from 'path' import { persistLocalCredentials, persistSmusProjectCreds, persistSSMConnection } from './credentialMapping' @@ -24,6 +24,10 @@ import { ToolkitError } from '../../shared/errors' import { SagemakerSpaceNode } from './explorer/sagemakerSpaceNode' import { sleep } from '../../shared/utilities/timeoutUtils' import { SagemakerUnifiedStudioSpaceNode } from '../../sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioSpaceNode' +import { isKiro } from '../../shared/extensionUtilities' +import { getIdeType } from '../../shared/extensionUtilities' +import { ChildProcess } from '../../shared/utilities/processUtils' +import { ensureSageMakerSshKiroExtension } from './sagemakerSshKiroUtils' import { SshConfigError, SshConfigErrorMessage } from './constants' import globals from '../../shared/extensionGlobals' import { HyperpodConnectionMonitor } from './hyperpodConnectionMonitor' @@ -80,18 +84,29 @@ export async function tryRemoteConnection( ctx: vscode.ExtensionContext, progress: vscode.Progress<{ message?: string; increment?: number }> ) { + if (useSageMakerSshKiroExtension()) { + await ensureSageMakerSshKiroExtension(ctx) + } + + const path = '/home/sagemaker-user' + const username = 'sagemaker-user' const spaceArn = (await node.getSpaceArn()) as string const isSMUS = node instanceof SagemakerUnifiedStudioSpaceNode const remoteEnv = await prepareDevEnvConnection(spaceArn, ctx, 'sm_lc', isSMUS, node) + try { progress.report({ message: 'Opening remote session' }) - await startVscodeRemote( - remoteEnv.SessionProcess, - remoteEnv.hostname, - '/home/sagemaker-user', - remoteEnv.vscPath, - 'sagemaker-user' - ) + if (useSageMakerSshKiroExtension()) { + await startRemoteViaSageMakerSshKiro( + remoteEnv.SessionProcess, + remoteEnv.hostname, + path, + remoteEnv.vscPath, + username + ) + } else { + await startVscodeRemote(remoteEnv.SessionProcess, remoteEnv.hostname, path, remoteEnv.vscPath, username) + } } catch (err) { getLogger().info( `sm:OpenRemoteConnect: Unable to connect to target space with arn: ${await node.getAppArn()} error: ${err}` @@ -126,16 +141,21 @@ export async function prepareDevEnvConnection( clusterArn?: string ) { const remoteLogger = configureRemoteConnectionLogger() - const { ssm, vsc, ssh } = (await ensureDependencies()).unwrap() - - // Check timeout setting for remote SSH connections - const remoteSshConfig = vscode.workspace.getConfiguration('remote.SSH') - const current = remoteSshConfig.get('connectTimeout') - if (typeof current === 'number' && current < 120) { - await remoteSshConfig.update('connectTimeout', 120, vscode.ConfigurationTarget.Global) - void vscode.window.showInformationMessage( - 'Updated "remote.SSH.connectTimeout" to 120 seconds to improve stability.' - ) + // Skip Remote SSH extension check in Kiro since it uses embedded SageMaker SSH Kiro extension + const { ssm, vsc, ssh } = ( + await ensureDependencies({ skipRemoteSshCheck: useSageMakerSshKiroExtension() }) + ).unwrap() + + if (!useSageMakerSshKiroExtension()) { + // Check timeout setting for remote SSH connections + const remoteSshConfig = vscode.workspace.getConfiguration('remote.SSH') + const current = remoteSshConfig.get('connectTimeout') + if (typeof current === 'number' && current < 120) { + await remoteSshConfig.update('connectTimeout', 120, vscode.ConfigurationTarget.Global) + void vscode.window.showInformationMessage( + 'Updated "remote.SSH.connectTimeout" to 120 seconds to improve stability.' + ) + } } const hostnamePrefix = connectionType @@ -161,65 +181,73 @@ export async function prepareDevEnvConnection( } else if (connectionType === 'sm_dl') { await persistSSMConnection(spaceArn, domain ?? '', session, wsUrl, token, appType, isSMUS) } - await startLocalServer(ctx) - await removeKnownHost(hostname) - const hyperpodConnectPath = path.join( - ctx.globalStorageUri.fsPath, - process.platform === 'win32' ? 'hyperpod_connect.ps1' : 'hyperpod_connect' - ) + if (useSageMakerSshKiroExtension()) { + // Skip SSH Config and known host changes when using the SageMaker SSH + // Kiro uses the embedded SageMaker SSH Kiro extension which handles SSH connections differently + const scriptResult = await ensureConnectScript('sagemaker_connect') + if (scriptResult.isErr()) { + throw scriptResult + } + } else { + await removeKnownHost(hostname) - // Copy hyperpod_connect script if needed - if (connectionType === 'sm_hp') { - const sourceScriptPath = ctx.asAbsolutePath( - process.platform === 'win32' ? 'resources/hyperpod_connect.ps1' : 'resources/hyperpod_connect' + const hyperpodConnectPath = path.join( + ctx.globalStorageUri.fsPath, + process.platform === 'win32' ? 'hyperpod_connect.ps1' : 'hyperpod_connect' ) - if (!(await fs.existsFile(hyperpodConnectPath))) { - try { - await fs.copy(sourceScriptPath, hyperpodConnectPath) - if (process.platform !== 'win32') { - await fs.chmod(hyperpodConnectPath, 0o755) + + // Copy hyperpod_connect script if needed + if (connectionType === 'sm_hp') { + const sourceScriptPath = ctx.asAbsolutePath( + process.platform === 'win32' ? 'resources/hyperpod_connect.ps1' : 'resources/hyperpod_connect' + ) + if (!(await fs.existsFile(hyperpodConnectPath))) { + try { + await fs.copy(sourceScriptPath, hyperpodConnectPath) + if (process.platform !== 'win32') { + await fs.chmod(hyperpodConnectPath, 0o755) + } + logger.info(`Copied hyperpod_connect script to ${hyperpodConnectPath}`) + } catch (err) { + logger.error(`Failed to copy hyperpod_connect script: ${err}`) } - logger.info(`Copied hyperpod_connect script to ${hyperpodConnectPath}`) - } catch (err) { - logger.error(`Failed to copy hyperpod_connect script: ${err}`) } - } - } - const sshConfig = - connectionType === 'sm_hp' - ? new HyperPodSshConfig(ssh, hyperpodConnectPath) - : new SshConfig(ssh, 'sm_', 'sagemaker_connect') - const config = await sshConfig.ensureValid() - if (config.isErr()) { - const err = config.err() - logger.error(`sagemaker: failed to add ssh config section: ${err.message}`) - - if (err instanceof ToolkitError && err.code === 'SshCheckFailed') { - const sshConfigPath = getSshConfigPath() - const openConfigButton = 'Open SSH Config' - const resp = await vscode.window.showErrorMessage( - SshConfigErrorMessage(), - { modal: true, detail: err.message }, - openConfigButton - ) + const sshConfig = + connectionType === 'sm_hp' + ? new HyperPodSshConfig(ssh, hyperpodConnectPath) + : new SshConfig(ssh, 'sm_', 'sagemaker_connect') + const config = await sshConfig.ensureValid() + if (config.isErr()) { + const err = config.err() + const logPrefix = connectionType === 'sm_hp' ? 'hyperpod' : 'sagemaker' + logger.error(`${logPrefix}: failed to add ssh config section: ${err.message}`) + + if (err instanceof ToolkitError && err.code === 'SshCheckFailed') { + const sshConfigPath = getSshConfigPath() + const openConfigButton = 'Open SSH Config' + const resp = await vscode.window.showErrorMessage( + SshConfigErrorMessage(), + { modal: true, detail: err.message }, + openConfigButton + ) + + if (resp === openConfigButton) { + void vscode.window.showTextDocument(vscode.Uri.file(sshConfigPath)) + } + + // Throw error to stop the connection flow + // User is already notified via modal above, downstream handlers check the error code + throw new ToolkitError('Unable to connect: SSH configuration contains errors', { + code: SshConfigError, + }) + } - if (resp === openConfigButton) { - void vscode.window.showTextDocument(vscode.Uri.file(sshConfigPath)) + throw err } - - // Throw error to stop the connection flow - // User is already notified via modal above, downstream handlers check the error code - throw new ToolkitError('Unable to connect: SSH configuration contains errors', { - code: SshConfigError, - }) } - - const logPrefix = connectionType === 'sm_hp' ? 'hyperpod' : 'sagemaker' - logger.error(`${logPrefix}: failed to add ssh config section: ${err.message}`) - throw err } // set envirionment variables @@ -347,6 +375,7 @@ export async function startLocalServer(ctx: vscode.ExtensionContext) { ...process.env, SAGEMAKER_ENDPOINT: customEndpoint, SAGEMAKER_LOCAL_SERVER_FILE_PATH: infoFilePath, + PARENT_IDE_TYPE: getIdeType(), }, }) @@ -444,3 +473,19 @@ export async function removeKnownHost(hostname: string): Promise { } } } + +export function useSageMakerSshKiroExtension(): boolean { + return isKiro() +} + +export async function startRemoteViaSageMakerSshKiro( + ProcessClass: typeof ChildProcess, + hostname: string, + targetDirectory: string, + vscPath: string, + user?: string +): Promise { + const userAt = user ? `${user}@` : '' + const workspaceUri = `vscode-remote://sagemaker-ssh-kiro+${userAt}${hostname}${targetDirectory}` + await new ProcessClass(vscPath, ['--folder-uri', workspaceUri]).run() +} diff --git a/packages/core/src/awsService/sagemaker/sagemakerSshKiroUtils.ts b/packages/core/src/awsService/sagemaker/sagemakerSshKiroUtils.ts new file mode 100644 index 00000000000..f06c11780f8 --- /dev/null +++ b/packages/core/src/awsService/sagemaker/sagemakerSshKiroUtils.ts @@ -0,0 +1,170 @@ +/*! + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +import { VSCODE_EXTENSION_ID } from '../../shared/extensions' + +import { glob } from 'glob' +import * as path from 'path' +import * as semver from 'semver' +import * as vscode from 'vscode' +import { ToolkitError } from '../../shared/errors' +import fs from '../../shared/fs/fs' +import { getLogger } from '../../shared/logger/logger' +import { showConfirmationMessage } from '../../shared/utilities/messages' + +const logger = getLogger('sagemaker') + +const pluginTechnicalName = 'sagemaker-ssh-kiro' +const pluginDisplayName = 'Amazon SageMaker SSH Plugin for Kiro' +const minKiroVersion = '0.8.0' + +let updatedExtensionToVersion: string +let vscodeProductJson: any + +async function getEditorProductJson() { + if (!vscodeProductJson) { + const productJsonPath = path.join(vscode.env.appRoot, 'product.json') + logger.info(`Reading vscode product.json at ${productJsonPath}`) + const productJsonStr = await fs.readFileText(productJsonPath) + vscodeProductJson = JSON.parse(productJsonStr) + } + + return vscodeProductJson +} + +export async function getKiroVersion(): Promise { + return (await getEditorProductJson()).version +} + +/** + * Finds the embedded SageMaker SSH Kiro extension VSIX file and extracts its version. + */ +export async function findEmbeddedSageMakerSshKiroExtension( + ctx: vscode.ExtensionContext +): Promise<{ path: string; version: string }> { + const resourcesDir = ctx.asAbsolutePath('resources') + + try { + // Use forward slashes for glob pattern + const globPattern = path.join(resourcesDir, 'sagemaker-ssh-kiro-*.vsix').replace(/\\/g, '/') + const matches = await glob(globPattern) + if (matches.length === 0) { + throw new ToolkitError(`The ${pluginTechnicalName} extension VSIX file not found in: ${resourcesDir}.`) + } + + if (matches.length > 1) { + // Multiple files could only happen if we built the toolkit extension incorrectly or if the user modified the extension directory. + throw new ToolkitError( + `Unexpectedly found multiple (${matches.length}) ${pluginTechnicalName} extension VSIX files in: ${resourcesDir}` + ) + } + + const filePath = matches[0] + const fileName = path.basename(filePath) + const versionMatch = fileName.match(/^sagemaker-ssh-kiro-(.+)\.vsix$/) + + if (!versionMatch) { + throw new ToolkitError(`Failed to extract version number from VSIX filename: ${fileName}`) + } + + const version = versionMatch[1] + logger.info(`Found the ${pluginTechnicalName} extension VSIX file: ${fileName} (version ${version})`) + return { path: filePath, version } + } catch (error) { + if (error instanceof ToolkitError) { + throw error + } + throw new ToolkitError( + `An error occurred while searching for the ${pluginTechnicalName} extension VSIX file: ${error}` + ) + } +} + +/** + * Ensures the SageMaker SSH Kiro extension is installed and up-to-date. + */ +export async function ensureSageMakerSshKiroExtension(ctx: vscode.ExtensionContext): Promise { + const kiroVersion = await getKiroVersion() + + if (semver.lt(kiroVersion, minKiroVersion)) { + throw new ToolkitError( + `SageMaker remote access requires Kiro version ${minKiroVersion} or higher (current: ${kiroVersion}). Update Kiro to continue.` + ) + } + + logger.info(`Kiro version ${kiroVersion} meets minimum requirement (${minKiroVersion})`) + + // Find the embedded extension file and extract its version + const { path: embeddedPath, version: embeddedVersion } = await findEmbeddedSageMakerSshKiroExtension(ctx) + + // Check if extension is already installed with the correct version + const installedExtension = vscode.extensions.getExtension(VSCODE_EXTENSION_ID.sagemakerSshKiro) + const installedVersion = updatedExtensionToVersion ?? installedExtension?.packageJSON.version + + if (installedVersion) { + if (installedVersion === embeddedVersion) { + logger.info( + `The ${pluginTechnicalName} extension is already installed with expected version ${embeddedVersion}.` + ) + return + } else { + logger.info( + `The ${pluginTechnicalName} extension is installed with version ${installedVersion}, but expected version ${embeddedVersion}` + ) + } + } else { + logger.info( + `The ${pluginTechnicalName} extension is not installed. Attempting to install version ${embeddedVersion}...` + ) + } + + // Determine if this is an update or new installation + const isUpdate = installedVersion !== undefined + + // Prompt user for confirmation + const actionText = isUpdate ? 'update' : 'install' + const confirmButtonText = isUpdate ? 'Update' : 'Install' + const installOrUpdateQuestion = isUpdate + ? `update from version ${installedVersion} to ${embeddedVersion}` + : `install version ${embeddedVersion}` + + const ok = await showConfirmationMessage({ + prompt: `The ${pluginDisplayName} needs to be ${isUpdate ? 'updated' : 'installed'} to connect to the Space. Would you like to ${installOrUpdateQuestion}?`, + confirm: confirmButtonText, + }) + + if (!ok) { + void vscode.window.showInformationMessage( + `Aborted connecting to the Space because you declined to ${actionText} the ${pluginDisplayName}.` + ) + const cancellationErrorMessage = `User declined to ${actionText} the ${pluginTechnicalName} extension (version ${embeddedVersion}).` + logger.info(cancellationErrorMessage) + throw new ToolkitError(cancellationErrorMessage, { cancelled: true }) + } + + logger.info(`Installing the ${pluginTechnicalName} extension (version ${embeddedVersion}) from: ${embeddedPath}`) + + // Install the extension + await vscode.commands.executeCommand('workbench.extensions.installExtension', vscode.Uri.file(embeddedPath)) + + if (isUpdate) { + // After the extension is updated, calls to `vscode.extensions.getExtension` will not reflect the change unless + // the user restarts their extension host which would be disruptive as it would interrupt this entire flow, so + // we need to remember the version that we updated to, or else we will prompt the user to update the extension + // for every space connection attempt. Even if the current extension host is still running an older version of + // the extension, the new remote workspace window will have a new extension host process so it will always take + // the most recently installed version. + updatedExtensionToVersion = embeddedVersion + } + + logger.info(`Installed the ${pluginTechnicalName} extension (version ${embeddedVersion}).`) + + // Show success notification + const successMessage = isUpdate + ? `${pluginDisplayName} updated to version ${embeddedVersion}` + : `${pluginDisplayName} installed (version ${embeddedVersion})` + + void vscode.window.showInformationMessage(successMessage) +} diff --git a/packages/core/src/sagemakerunifiedstudio/bootstrapAgentContext.ts b/packages/core/src/sagemakerunifiedstudio/bootstrapAgentContext.ts new file mode 100644 index 00000000000..63df3bcfce7 --- /dev/null +++ b/packages/core/src/sagemakerunifiedstudio/bootstrapAgentContext.ts @@ -0,0 +1,90 @@ +/*! + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +import * as path from 'path' +import * as vscode from 'vscode' +import fs from '../shared/fs/fs' +import { getLogger } from '../shared/logger/logger' +import { agentsFile, contextFile, importStatement, notificationMessage, promptMessage } from './shared/constants' + +function notifyContextUpdated(): void { + void vscode.window.showInformationMessage(notificationMessage) +} + +async function promptUserToAddSmusContext(): Promise { + const choice = await vscode.window.showInformationMessage(promptMessage, 'Yes', 'No') + return choice === 'Yes' +} + +/** + * Creates or updates ~/smus-context.md with SageMaker Unified Studio context, + * and ensures ~/AGENTS.md imports it. + * + * Behavior: + * - If AGENTS.md doesn't exist, prompts the user. If accepted, creates both files. + * - If AGENTS.md exists with the import, silently updates smus-context.md. + * - If AGENTS.md exists without the import, and smus-context.md already exists, + * silently updates smus-context.md (user removed the import, respect that). + * - If AGENTS.md exists without the import, and smus-context.md doesn't exist, + * prompts the user. If accepted, creates smus-context.md and adds the import. + * If declined, does nothing. + * + * Failures are logged but do not throw. + */ +export async function createAgentsFile(ctx: vscode.ExtensionContext): Promise { + const logger = getLogger('smus') + + try { + const templatePath = ctx.asAbsolutePath(path.join('resources', 'smus-context-template.md')) + const content = await fs.readFileText(templatePath) + + const contextFileExists = await fs.existsFile(contextFile) + const agentsFileExists = await fs.existsFile(agentsFile) + + if (!agentsFileExists) { + if (!(await promptUserToAddSmusContext())) { + logger.info('User declined adding SageMaker context') + return + } + await fs.writeFile(contextFile, content) + await fs.writeFile(agentsFile, importStatement + '\n') + logger.info(`Created ${contextFile} and ${agentsFile}`) + notifyContextUpdated() + return + } + + const agentsContent = await fs.readFileText(agentsFile) + + if (agentsContent.includes(importStatement)) { + // Already imported — just update the context file + await fs.writeFile(contextFile, content) + logger.info(`Updated ${contextFile}`) + return + } + + if (contextFileExists) { + // smus-context.md exists but isn't imported — user removed it, respect that + // Still update the context file in case they reference it elsewhere + await fs.writeFile(contextFile, content) + logger.info(`Updated ${contextFile}, skipping AGENTS.md (user removed import)`) + notifyContextUpdated() + return + } + + // AGENTS.md exists, no import, no smus-context.md — prompt + if (!(await promptUserToAddSmusContext())) { + logger.info('User declined adding SageMaker context') + return + } + + await fs.writeFile(contextFile, content) + const separator = agentsContent.endsWith('\n') ? '\n' : '\n\n' + await fs.writeFile(agentsFile, agentsContent + separator + importStatement + '\n') + logger.info(`Created ${contextFile} and added import to ${agentsFile}`) + notifyContextUpdated() + } catch (err) { + logger.warn(`Failed to create/update AGENTS.md: ${err}`) + } +} diff --git a/packages/core/src/sagemakerunifiedstudio/explorer/activation.ts b/packages/core/src/sagemakerunifiedstudio/explorer/activation.ts index 2b05e7be278..29ac980a7a7 100644 --- a/packages/core/src/sagemakerunifiedstudio/explorer/activation.ts +++ b/packages/core/src/sagemakerunifiedstudio/explorer/activation.ts @@ -21,6 +21,7 @@ import { isSmusIamConnection } from '../auth/model' import { setupUserActivityMonitoring } from '../../awsService/sagemaker/sagemakerSpace' import { telemetry } from '../../shared/telemetry/telemetry' import { isSageMaker } from '../../shared/extensionUtilities' +import { createAgentsFile } from '../bootstrapAgentContext' import { recordSpaceTelemetry } from '../shared/telemetry' import { DataZoneClient } from '../shared/client/datazoneClient' import { handleCredExpiredError } from '../shared/credentialExpiryHandler' @@ -165,6 +166,9 @@ export async function activate(extensionContext: vscode.ExtensionContext): Promi logger.error(`Error in UserActivityMonitoring: ${error}`) throw error } + + // Create AGENTS.md to provide SageMaker-specific context for AI code generation + await createAgentsFile(extensionContext) } else { logger.info('Not in SageMaker Unified Studio remote environment, skipping user activity monitoring') } diff --git a/packages/core/src/sagemakerunifiedstudio/shared/constants.ts b/packages/core/src/sagemakerunifiedstudio/shared/constants.ts new file mode 100644 index 00000000000..e1bb387bfe8 --- /dev/null +++ b/packages/core/src/sagemakerunifiedstudio/shared/constants.ts @@ -0,0 +1,19 @@ +/*! + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +import * as path from 'path' +import * as os from 'os' + +const homeDir = os.homedir() + +export const agentsFile = path.join(homeDir, 'AGENTS.md') +export const contextFile = path.join(homeDir, 'smus-context.md') + +// Text for agent context +export const importStatement = + '## Importing file for SageMaker Unified Studio context\n\n@smus-context.md [SageMaker Unified Studio Context](smus-context.md)' +export const notificationMessage = 'Added SageMaker Unified Studio context.' +export const promptMessage = + 'Would you like to add SageMaker Unified Studio context to your AGENTS.md file? This will help AI agents get context about your SageMaker Unified Studio space.' diff --git a/packages/core/src/shared/extensionIds.ts b/packages/core/src/shared/extensionIds.ts index 97703ad81b6..2373b98a3f6 100644 --- a/packages/core/src/shared/extensionIds.ts +++ b/packages/core/src/shared/extensionIds.ts @@ -34,4 +34,5 @@ export const VSCODE_EXTENSION_ID_CONSTANTS = { git: 'vscode.git', // default to VSCode in test environment remotessh: VSCODE_REMOTE_SSH_EXTENSION.vscode, + sagemakerSshKiro: 'amazonwebservices.sagemaker-ssh-kiro', } as const diff --git a/packages/core/src/shared/extensionUtilities.ts b/packages/core/src/shared/extensionUtilities.ts index b8b5780c612..ca77f01b504 100644 --- a/packages/core/src/shared/extensionUtilities.ts +++ b/packages/core/src/shared/extensionUtilities.ts @@ -25,6 +25,7 @@ import { import { cloud9Appname, cloud9CnAppname, + kiroAppname, sageMakerAppname, sageMakerUnifiedStudio, vscodeAppname, @@ -71,7 +72,7 @@ let computeRegion: string | undefined = notInitialized let serviceName: string = notInitialized let isSMUS: boolean = false -export function getIdeType(): 'vscode' | 'cloud9' | 'sagemaker' | 'unknown' { +export function getIdeType(): 'vscode' | 'cloud9' | 'sagemaker' | 'kiro' | 'unknown' { if (vscode.env.appName === cloud9Appname || vscode.env.appName === cloud9CnAppname) { return 'cloud9' } @@ -80,6 +81,10 @@ export function getIdeType(): 'vscode' | 'cloud9' | 'sagemaker' | 'unknown' { return 'sagemaker' } + if (vscode.env.appName?.includes(kiroAppname)) { + return 'kiro' + } + // Theia doesn't necessarily have all env properties // so we should be defensive and assume appName is nullable. if (vscode.env.appName?.startsWith(vscodeAppname)) { @@ -183,6 +188,13 @@ export function isCloud9(flavor: 'classic' | 'codecatalyst' | 'any' = 'any'): bo return (flavor === 'classic' && !codecat) || (flavor === 'codecatalyst' && codecat) } +/** + * Determines if the current system is the Kiro IDE. + */ +export function isKiro(): boolean { + return getIdeType() === 'kiro' +} + /** * * @param appName to identify the proper SM instance diff --git a/packages/core/src/shared/remoteSession.ts b/packages/core/src/shared/remoteSession.ts index a6009ca7fea..502160f742d 100644 --- a/packages/core/src/shared/remoteSession.ts +++ b/packages/core/src/shared/remoteSession.ts @@ -93,11 +93,16 @@ export interface VscodeRemoteConnection { readonly SessionProcess: typeof ChildProcess } -export async function ensureDependencies(): Promise> { - try { - await ensureRemoteSshInstalled() - } catch (e) { - return Result.err(e as Error) +export async function ensureDependencies(options?: { + skipRemoteSshCheck?: boolean +}): Promise> { + // Skip Remote SSH extension check if explicitly requested (e.g., for SageMaker in Kiro) + if (!options?.skipRemoteSshCheck) { + try { + await ensureRemoteSshInstalled() + } catch (e) { + return Result.err(e as Error) + } } const tools = await ensureTools() diff --git a/packages/core/src/shared/utilities/pathFind.ts b/packages/core/src/shared/utilities/pathFind.ts index 018b4feaa76..31afcb22bbe 100644 --- a/packages/core/src/shared/utilities/pathFind.ts +++ b/packages/core/src/shared/utilities/pathFind.ts @@ -12,6 +12,7 @@ import { Settings } from '../settings' import { getLogger } from '../logger/logger' import { mergeResolvedShellPath } from '../env/resolveEnv' import { matchesPattern } from './textUtilities' +import { getIdeType } from '../extensionUtilities' import { getIdeInfo } from '../vscode/env' /** Full path to VSCode CLI. */ @@ -53,8 +54,8 @@ export async function tryRun( } /** - * Gets the fullpath to the IDE CLI (code, cursor, kiro, windsurf, etc.), or falls back to the CLI name (not - * absolute) if it works. + * Gets the fullpath to IDE CLI (code, cursor, kiro, windsurf, etc.), or falls back to the CLI name (not + * absolute) if it works. For Kiro on Windows, looks for `kiro.cmd` instead. * * @see https://github.com/microsoft/vscode-test/blob/4bdccd4c386813a8158b0f9b96f31cbbecbb3374/lib/util.ts#L133 */ @@ -67,26 +68,31 @@ export async function getVscodeCliPath(): Promise { const cliName = ideInfo.cliName || 'code' const vscExe = process.argv0 - // https://github.com/microsoft/vscode-test/blob/4bdccd4c386813a8158b0f9b96f31cbbecbb3374/lib/util.ts#L133 - const vscs = [ - // Special case for flatpak (steamdeck). #V896741845 - // https://github.com/flathub/com.visualstudio.code/blob/master/code.sh - `/app/bin/${cliName}`, - // Note: macOS does not have a separate "code-insiders" binary. - path.resolve(`${vscode.env.appRoot}/bin/${cliName}`), // macOS - path.resolve(`${vscode.env.appRoot}/../../bin/${cliName}`), // Windows - path.resolve(`${vscode.env.appRoot}/../../bin/${cliName}-insiders`), // Windows - // Linux example "appRoot": vscode-linux-x64-1.42.0/VSCode-linux-x64/resources/app - path.resolve(`${vscode.env.appRoot}/${cliName}`), - path.resolve(vscExe, `../bin/${cliName}-insiders`), - path.resolve(vscExe, `../bin/${cliName}`), - path.resolve(vscExe, `../../bin/${cliName}-insiders`), - path.resolve(vscExe, `../../bin/${cliName}`), - `/usr/bin/${cliName}`, - cliName, // $PATH - ] + const ideType = getIdeType() + const isKiro = ideType === 'kiro' + + const vscs = isKiro + ? getKiroCliPaths(vscExe) + : [ + // Special case for flatpak (steamdeck). #V896741845 + // https://github.com/flathub/com.visualstudio.code/blob/master/code.sh + `/app/bin/${cliName}`, + // Note: macOS does not have a separate "code-insiders" binary. + path.resolve(`${vscode.env.appRoot}/bin/${cliName}`), // macOS + path.resolve(`${vscode.env.appRoot}/../../bin/${cliName}`), // Windows + path.resolve(`${vscode.env.appRoot}/../../bin/${cliName}-insiders`), // Windows + // Linux example "appRoot": vscode-linux-x64-1.42.0/VSCode-linux-x64/resources/app + path.resolve(`${vscode.env.appRoot}/${cliName}`), + path.resolve(vscExe, `../bin/${cliName}-insiders`), + path.resolve(vscExe, `../bin/${cliName}`), + path.resolve(vscExe, `../../bin/${cliName}-insiders`), + path.resolve(vscExe, `../../bin/${cliName}`), + `/usr/bin/${cliName}`, + cliName, // $PATH + ] + for (const vsc of vscs) { - if (!vsc || (vsc !== cliName && !(await fs.exists(vsc)))) { + if (!vsc || (vsc !== 'code' && vsc !== 'kiro' && !(await fs.exists(vsc)))) { continue } if (await tryRun(vsc, ['--version'])) { @@ -98,6 +104,31 @@ export async function getVscodeCliPath(): Promise { return undefined } +/** + * Gets Kiro CLI paths + */ +function getKiroCliPaths(vscExe: string): string[] { + return [ + path.resolve(`${vscode.env.appRoot}/bin/kiro`), + path.resolve(`${vscode.env.appRoot}/../../bin/kiro`), + path.resolve(`${vscode.env.appRoot}/kiro`), + path.resolve(vscExe, '../bin/kiro'), + path.resolve(vscExe, '../../bin/kiro'), + + // When no `kiro` file is found in the application directories, search for a `code` file in the same locations. + // This is necessary for Mac because the executable is called `code`. Though `kiro` on the $PATH may resolve to + // /usr/local/bin/kiro, that is just a symlink to /Applications/Kiro.app/Contents/Resources/app/bin/code. + path.resolve(`${vscode.env.appRoot}/bin/code`), + path.resolve(`${vscode.env.appRoot}/../../bin/code`), + path.resolve(`${vscode.env.appRoot}/code`), + path.resolve(vscExe, '../bin/code'), + path.resolve(vscExe, '../../bin/code'), + + '/usr/bin/kiro', + 'kiro', // $PATH + ] +} + /** * Searches for `tsc` in the current workspace, or the system (tries `tsc` * using current $PATH). diff --git a/packages/core/src/shared/vscode/constants.ts b/packages/core/src/shared/vscode/constants.ts index fbe266e0e0b..6961f911f38 100644 --- a/packages/core/src/shared/vscode/constants.ts +++ b/packages/core/src/shared/vscode/constants.ts @@ -3,6 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ export const vscodeAppname = 'Visual Studio Code' +export const kiroAppname = 'Kiro' export const cloud9Appname = 'AWS Cloud9' export const cloud9CnAppname = 'Amazon Cloud9' export const sageMakerAppname = 'SageMaker Code Editor' diff --git a/packages/core/src/test/awsService/sagemaker/model.test.ts b/packages/core/src/test/awsService/sagemaker/model.test.ts index 7570e1bfe31..5e1d3f9453c 100644 --- a/packages/core/src/test/awsService/sagemaker/model.test.ts +++ b/packages/core/src/test/awsService/sagemaker/model.test.ts @@ -8,7 +8,12 @@ import * as sinon from 'sinon' import * as os from 'os' import * as path from 'path' import { DevSettings, fs, ToolkitError } from '../../../shared' -import { removeKnownHost, startLocalServer, stopLocalServer } from '../../../awsService/sagemaker/model' +import { + removeKnownHost, + startLocalServer, + stopLocalServer, + startRemoteViaSageMakerSshKiro, +} from '../../../awsService/sagemaker/model' import { assertLogsContain } from '../../globalSetup.test' import assert from 'assert' @@ -301,4 +306,61 @@ describe('SageMaker Model', () => { } }) }) + + describe('startRemoteViaSageMakerSshKiro', function () { + let sandbox: sinon.SinonSandbox + let mockProcessClass: sinon.SinonStub + let mockProcessInstance: { run: sinon.SinonStub } + + beforeEach(function () { + sandbox = sinon.createSandbox() + mockProcessInstance = { run: sandbox.stub().resolves() } + mockProcessClass = sandbox.stub().returns(mockProcessInstance) + }) + + afterEach(function () { + sandbox.restore() + }) + + it('constructs correct workspace URI without user', async function () { + await startRemoteViaSageMakerSshKiro( + mockProcessClass as any, + 'space_arn', + '/home/sagemaker-user', + '/usr/bin/code' + ) + + const expectedUri = `vscode-remote://sagemaker-ssh-kiro+space_arn/home/sagemaker-user` + sinon.assert.calledOnceWithExactly(mockProcessClass, '/usr/bin/code', ['--folder-uri', expectedUri]) + sinon.assert.calledOnce(mockProcessInstance.run) + }) + + it('constructs correct workspace URI with user', async function () { + await startRemoteViaSageMakerSshKiro( + mockProcessClass as any, + 'space_arn', + '/home/sagemaker-user', + '/usr/bin/code', + 'sagemaker-user' + ) + + const expectedUri = `vscode-remote://sagemaker-ssh-kiro+sagemaker-user@space_arn/home/sagemaker-user` + sinon.assert.calledOnceWithExactly(mockProcessClass, '/usr/bin/code', ['--folder-uri', expectedUri]) + sinon.assert.calledOnce(mockProcessInstance.run) + }) + + it('handles different target directories', async function () { + await startRemoteViaSageMakerSshKiro( + mockProcessClass as any, + 'space_arn', + '/workspace/project', + '/usr/bin/code', + 'sagemaker-user' + ) + + const expectedUri = `vscode-remote://sagemaker-ssh-kiro+sagemaker-user@space_arn/workspace/project` + sinon.assert.calledOnceWithExactly(mockProcessClass, '/usr/bin/code', ['--folder-uri', expectedUri]) + sinon.assert.calledOnce(mockProcessInstance.run) + }) + }) }) diff --git a/packages/core/src/test/awsService/sagemaker/sagemakerSshKiroUtils.test.ts b/packages/core/src/test/awsService/sagemaker/sagemakerSshKiroUtils.test.ts new file mode 100644 index 00000000000..7e90c466b70 --- /dev/null +++ b/packages/core/src/test/awsService/sagemaker/sagemakerSshKiroUtils.test.ts @@ -0,0 +1,304 @@ +/*! + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +import * as vscode from 'vscode' +import * as sinon from 'sinon' +import * as path from 'path' +// Import methods only for typing, actual functions will be dynamically imported +import type { + findEmbeddedSageMakerSshKiroExtension as findEmbeddedSageMakerSshKiroExtensionStatic, + ensureSageMakerSshKiroExtension as ensureSageMakerSshKiroExtensionStatic, + getKiroVersion as getKiroVersionStatic, +} from '../../../awsService/sagemaker/sagemakerSshKiroUtils' +import { VSCODE_EXTENSION_ID } from '../../../shared/extensions' +import { assertLogsContain } from '../../globalSetup.test' +import assert from 'assert' +import { getTestWindow } from '../../shared/vscode/window' +import fs from '../../../shared/fs/fs' + +describe('SageMaker SSH Kiro Utils', () => { + const resourcesDir = '/mock/extension/path/resources' + + let sandbox: sinon.SinonSandbox + let mockContext: vscode.ExtensionContext + let readFileTextStub: sinon.SinonStub + + // Dynamically imported functions with fresh module state + let findEmbeddedSageMakerSshKiroExtension: typeof findEmbeddedSageMakerSshKiroExtensionStatic + let ensureSageMakerSshKiroExtension: typeof ensureSageMakerSshKiroExtensionStatic + let getKiroVersion: typeof getKiroVersionStatic + + beforeEach(() => { + sandbox = sinon.createSandbox() + mockContext = { + asAbsolutePath: (relativePath: string) => path.join('/mock/extension/path', relativePath), + } as vscode.ExtensionContext + + // Mock product.json reading + readFileTextStub = sandbox.stub(fs, 'readFileText') + readFileTextStub.resolves(JSON.stringify({ version: '0.8.0' })) + + // Mock vscode.env.appRoot + sandbox.stub(vscode.env, 'appRoot').value('/mock/vscode/app') + + // Get fresh module instance for each test to reset cached state + const freshModule = require('../../../awsService/sagemaker/sagemakerSshKiroUtils') + findEmbeddedSageMakerSshKiroExtension = freshModule.findEmbeddedSageMakerSshKiroExtension + ensureSageMakerSshKiroExtension = freshModule.ensureSageMakerSshKiroExtension + getKiroVersion = freshModule.getKiroVersion + }) + + afterEach(() => { + sandbox.restore() + + // Clear module cache to reset cached state for dynamic imports + for (const key of Object.keys(require.cache)) { + if (key.includes('sagemakerSshKiroUtils')) { + delete require.cache[key] + } + } + }) + + describe('findEmbeddedSageMakerSshKiroExtension', () => { + it('finds extension with valid version pattern', async () => { + const expectedPath = path.join(resourcesDir, 'sagemaker-ssh-kiro-0.1.0.vsix') + sandbox.stub(require('glob'), 'glob').resolves([expectedPath]) + + const result = await findEmbeddedSageMakerSshKiroExtension(mockContext) + + assert.strictEqual(result.version, '0.1.0') + assert.strictEqual(result.path, expectedPath) + }) + + it('throws error when multiple VSIX files found', async () => { + const firstPath = path.join(resourcesDir, 'sagemaker-ssh-kiro-0.1.0.vsix') + const secondPath = path.join(resourcesDir, 'sagemaker-ssh-kiro-0.2.0.vsix') + sandbox.stub(require('glob'), 'glob').resolves([firstPath, secondPath]) + + await assert.rejects(() => findEmbeddedSageMakerSshKiroExtension(mockContext), /found multiple/i) + }) + + it('throws error when no VSIX files found', async () => { + sandbox.stub(require('glob'), 'glob').resolves([]) + + await assert.rejects(() => findEmbeddedSageMakerSshKiroExtension(mockContext), /not found/i) + }) + + it('throws error when filename does not match expected pattern', async () => { + const invalidPath = path.join(resourcesDir, 'invalid-filename.vsix') + sandbox.stub(require('glob'), 'glob').resolves([invalidPath]) + + await assert.rejects( + () => findEmbeddedSageMakerSshKiroExtension(mockContext), + /Failed to extract version number/i + ) + }) + + it('throws error when glob operation fails', async () => { + sandbox.stub(require('glob'), 'glob').rejects(new Error('Permission denied')) + + await assert.rejects(() => findEmbeddedSageMakerSshKiroExtension(mockContext), /Permission denied/i) + }) + }) + + describe('getKiroVersion', () => { + it('reads version from product.json', async () => { + readFileTextStub.resolves(JSON.stringify({ version: '0.8.1' })) + + const version = await getKiroVersion() + + assert.strictEqual(version, '0.8.1') + sinon.assert.calledWith(readFileTextStub, path.join('/mock', 'vscode', 'app', 'product.json')) + }) + + it('caches product.json after first read', async () => { + readFileTextStub.resolves(JSON.stringify({ version: '0.8.1' })) + + await getKiroVersion() + await getKiroVersion() + + sinon.assert.calledOnce(readFileTextStub) + }) + }) + + describe('ensureSageMakerSshKiroExtension', () => { + let getExtensionStub: sinon.SinonStub + let executeCommandStub: sinon.SinonStub + + beforeEach(() => { + const expectedPath = path.join(resourcesDir, 'sagemaker-ssh-kiro-0.1.0.vsix') + sandbox.stub(require('glob'), 'glob').resolves([expectedPath]) + + getExtensionStub = sandbox.stub(vscode.extensions, 'getExtension') + executeCommandStub = sandbox.stub(vscode.commands, 'executeCommand') + }) + + it('throws error when Kiro version is too old', async () => { + readFileTextStub.resolves(JSON.stringify({ version: '0.7.9' })) + + await assert.rejects( + () => ensureSageMakerSshKiroExtension(mockContext), + /requires.+version 0\.8\.0 or higher \(current: 0\.7\.9\)/i + ) + }) + + it('succeeds when Kiro version meets minimum requirement', async () => { + readFileTextStub.resolves(JSON.stringify({ version: '0.8.0' })) + getExtensionStub + .withArgs(VSCODE_EXTENSION_ID.sagemakerSshKiro) + .returns({ packageJSON: { version: '0.1.0' } }) + + await ensureSageMakerSshKiroExtension(mockContext) + + assertLogsContain('meets minimum requirement', false, 'info') + }) + + it('succeeds when Kiro version exceeds minimum requirement', async () => { + readFileTextStub.resolves(JSON.stringify({ version: '0.9.0' })) + getExtensionStub + .withArgs(VSCODE_EXTENSION_ID.sagemakerSshKiro) + .returns({ packageJSON: { version: '0.1.0' } }) + + await ensureSageMakerSshKiroExtension(mockContext) + + assertLogsContain('meets minimum requirement', false, 'info') + }) + + it('returns early when correct version already installed', async () => { + const mockExtension = { packageJSON: { version: '0.1.0' } } + getExtensionStub.withArgs(VSCODE_EXTENSION_ID.sagemakerSshKiro).returns(mockExtension) + + await ensureSageMakerSshKiroExtension(mockContext) + + assertLogsContain('already installed', false, 'info') + assert.equal(getTestWindow().shownMessages.length, 0) + sinon.assert.notCalled(executeCommandStub) + }) + + it('prompts for install when extension not installed', async () => { + getExtensionStub.withArgs(VSCODE_EXTENSION_ID.sagemakerSshKiro).returns(undefined) + + getTestWindow().onDidShowMessage((message) => { + if (message.message.match(/needs to be installed.*install version 0\.1\.0/i)) { + message.selectItem('Install') + return + } + }) + + await ensureSageMakerSshKiroExtension(mockContext) + + sinon.assert.calledWith( + executeCommandStub, + 'workbench.extensions.installExtension', + vscode.Uri.file('/mock/extension/path/resources/sagemaker-ssh-kiro-0.1.0.vsix') + ) + }) + + it('prompts for update when older version installed', async () => { + getExtensionStub + .withArgs(VSCODE_EXTENSION_ID.sagemakerSshKiro) + .returns({ packageJSON: { version: '0.0.9' } }) + + getTestWindow().onDidShowMessage((message) => { + if (message.message.match(/needs to be updated.*from version 0.0.9 to 0.1.0/i)) { + message.selectItem('Update') + return + } + }) + + await ensureSageMakerSshKiroExtension(mockContext) + + await getTestWindow().waitForMessage(/updated to version 0.1.0/i) + sinon.assert.calledWith( + executeCommandStub, + 'workbench.extensions.installExtension', + vscode.Uri.file('/mock/extension/path/resources/sagemaker-ssh-kiro-0.1.0.vsix') + ) + }) + + it('prompts for update when newer version installed', async () => { + getExtensionStub + .withArgs(VSCODE_EXTENSION_ID.sagemakerSshKiro) + .returns({ packageJSON: { version: '0.1.1' } }) + + getTestWindow().onDidShowMessage((message) => { + if (message.message.match(/needs to be updated.*from version 0.1.1 to 0.1.0/i)) { + message.selectItem('Update') + return + } + }) + + await ensureSageMakerSshKiroExtension(mockContext) + + await getTestWindow().waitForMessage(/updated to version 0.1.0/i) + sinon.assert.calledWith( + executeCommandStub, + 'workbench.extensions.installExtension', + vscode.Uri.file('/mock/extension/path/resources/sagemaker-ssh-kiro-0.1.0.vsix') + ) + }) + + it('should not prompt for update when previously applied', async () => { + getExtensionStub + .withArgs(VSCODE_EXTENSION_ID.sagemakerSshKiro) + .returns({ packageJSON: { version: '0.0.9' } }) + + let didShowUpdatePrompt = false + + getTestWindow().onDidShowMessage((message) => { + if (message.message.match(/needs to be updated.*from version 0.0.9 to 0.1.0/i)) { + if (didShowUpdatePrompt) { + throw new Error('Should not be prompted to update a second time') + } + message.selectItem('Update') + didShowUpdatePrompt = true + return + } + }) + + await ensureSageMakerSshKiroExtension(mockContext) + + await getTestWindow().waitForMessage(/updated to version 0.1.0/i) + sinon.assert.calledWith( + executeCommandStub, + 'workbench.extensions.installExtension', + vscode.Uri.file('/mock/extension/path/resources/sagemaker-ssh-kiro-0.1.0.vsix') + ) + + // Call it again to trigger the update check again (should not prompt for update) + await ensureSageMakerSshKiroExtension(mockContext) + }) + + it('throws error when user declines installation', async () => { + getExtensionStub.withArgs(VSCODE_EXTENSION_ID.sagemakerSshKiro).returns(undefined) + + getTestWindow().onDidShowMessage((message) => { + if (message.message.match(/needs to be installed/i)) { + message.selectItem('Cancel') + return + } + }) + + await assert.rejects(() => ensureSageMakerSshKiroExtension(mockContext), /User declined to install/i) + sinon.assert.notCalled(executeCommandStub) + }) + + it('throws error when user declines update', async () => { + getExtensionStub + .withArgs(VSCODE_EXTENSION_ID.sagemakerSshKiro) + .returns({ packageJSON: { version: '0.0.9' } }) + + getTestWindow().onDidShowMessage((message) => { + if (message.message.match(/needs to be updated/i)) { + message.selectItem('Cancel') + return + } + }) + + await assert.rejects(() => ensureSageMakerSshKiroExtension(mockContext), /User declined to update/i) + sinon.assert.notCalled(executeCommandStub) + }) + }) +}) diff --git a/packages/core/src/test/sagemakerunifiedstudio/bootstrapAgentContext.test.ts b/packages/core/src/test/sagemakerunifiedstudio/bootstrapAgentContext.test.ts new file mode 100644 index 00000000000..b34c98fdf37 --- /dev/null +++ b/packages/core/src/test/sagemakerunifiedstudio/bootstrapAgentContext.test.ts @@ -0,0 +1,155 @@ +/*! + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +import assert from 'assert' +import sinon from 'sinon' +import * as vscode from 'vscode' +import fs from '../../shared/fs/fs' +import { createAgentsFile } from '../../sagemakerunifiedstudio/bootstrapAgentContext' +import { agentsFile, contextFile, importStatement, promptMessage } from '../../sagemakerunifiedstudio/shared/constants' +import { getTestWindow } from '../shared/vscode/window' + +describe('AGENTS.md', function () { + let sandbox: sinon.SinonSandbox + let mockCtx: vscode.ExtensionContext + let existsStub: sinon.SinonStub + let writeStub: sinon.SinonStub + + const templateContent = '# SageMaker context' + + beforeEach(function () { + sandbox = sinon.createSandbox() + mockCtx = { + asAbsolutePath: sandbox.stub().callsFake((p: string) => `/fake/${p}`), + } as any + writeStub = sandbox.stub(fs, 'writeFile').resolves() + existsStub = sandbox.stub(fs, 'existsFile') + }) + + afterEach(function () { + sandbox.restore() + }) + + describe('createAgentsFile', function () { + it('creates both files when neither exists', async function () { + sandbox.stub(fs, 'readFileText').resolves(templateContent) + existsStub.withArgs(contextFile).resolves(false) + existsStub.withArgs(agentsFile).resolves(false) + + getTestWindow().onDidShowMessage((msg) => { + if (msg.message === promptMessage) { + msg.selectItem('Yes') + } + }) + + await createAgentsFile(mockCtx) + + assert.ok(writeStub.calledWith(contextFile, templateContent)) + assert.ok(writeStub.calledWith(agentsFile, importStatement + '\n')) + }) + + it('creates nothing when neither file exists and user declines', async function () { + sandbox.stub(fs, 'readFileText').resolves(templateContent) + existsStub.withArgs(contextFile).resolves(false) + existsStub.withArgs(agentsFile).resolves(false) + + getTestWindow().onDidShowMessage((msg) => { + if (msg.message === promptMessage) { + msg.close() + } + }) + + await createAgentsFile(mockCtx) + + assert.ok(writeStub.notCalled) + }) + + it('updates smus-context.md and skips AGENTS.md when import already present', async function () { + const agentsContent = `# My agents\n\n${importStatement}\n` + const readStub = sandbox.stub(fs, 'readFileText') + readStub.resolves(templateContent) + readStub.withArgs(agentsFile).resolves(agentsContent) + existsStub.withArgs(contextFile).resolves(true) + existsStub.withArgs(agentsFile).resolves(true) + + await createAgentsFile(mockCtx) + + assert.ok(writeStub.calledOnceWith(contextFile, templateContent)) + }) + + it('prompts and adds import when AGENTS.md exists without import and smus-context.md is new', async function () { + const agentsContent = '# My agents\n' + const readStub = sandbox.stub(fs, 'readFileText') + readStub.resolves(templateContent) + readStub.withArgs(agentsFile).resolves(agentsContent) + existsStub.withArgs(contextFile).resolves(false) + existsStub.withArgs(agentsFile).resolves(true) + + getTestWindow().onDidShowMessage((msg) => { + if (msg.message === promptMessage) { + msg.selectItem('Yes') + } + }) + + await createAgentsFile(mockCtx) + + assert.ok(writeStub.calledWith(contextFile, templateContent)) + assert.ok(writeStub.calledWith(agentsFile, agentsContent + '\n' + importStatement + '\n')) + }) + + it('creates nothing when user declines import prompt', async function () { + const agentsContent = '# My agents\n' + const readStub = sandbox.stub(fs, 'readFileText') + readStub.resolves(templateContent) + readStub.withArgs(agentsFile).resolves(agentsContent) + existsStub.withArgs(contextFile).resolves(false) + existsStub.withArgs(agentsFile).resolves(true) + + getTestWindow().onDidShowMessage((msg) => { + if (msg.message === promptMessage) { + msg.close() + } + }) + + await createAgentsFile(mockCtx) + + assert.ok(writeStub.notCalled) + }) + + it('respects user choice when smus-context.md exists but is not imported', async function () { + const agentsContent = '# My agents\n' + const readStub = sandbox.stub(fs, 'readFileText') + readStub.resolves(templateContent) + readStub.withArgs(agentsFile).resolves(agentsContent) + existsStub.withArgs(contextFile).resolves(true) + existsStub.withArgs(agentsFile).resolves(true) + + await createAgentsFile(mockCtx) + + // Only smus-context.md is written, AGENTS.md is not touched, no prompt + assert.ok(writeStub.calledOnceWith(contextFile, templateContent)) + }) + + it('does not throw when template read fails', async function () { + sandbox.stub(fs, 'readFileText').rejects(new Error('file not found')) + + await assert.doesNotReject(() => createAgentsFile(mockCtx)) + }) + + it('does not throw when write fails', async function () { + sandbox.stub(fs, 'readFileText').resolves(templateContent) + existsStub.resolves(false) + writeStub.rejects(new Error('permission denied')) + + getTestWindow().onDidShowMessage((msg) => { + if (msg.message === promptMessage) { + msg.selectItem('Yes') + } + }) + + await assert.doesNotReject(() => createAgentsFile(mockCtx)) + }) + }) +}) diff --git a/packages/core/src/test/sagemakerunifiedstudio/explorer/activation.test.ts b/packages/core/src/test/sagemakerunifiedstudio/explorer/activation.test.ts index eb770f6bf82..05590c1cdb6 100644 --- a/packages/core/src/test/sagemakerunifiedstudio/explorer/activation.test.ts +++ b/packages/core/src/test/sagemakerunifiedstudio/explorer/activation.test.ts @@ -20,6 +20,7 @@ import * as extensionUtilities from '../../../shared/extensionUtilities' import { createMockSpaceNode } from '../testUtils' import { DataZoneClient } from '../../../sagemakerunifiedstudio/shared/client/datazoneClient' import * as model from '../../../sagemakerunifiedstudio/auth/model' +import * as bootstrapAgentContext from '../../../sagemakerunifiedstudio/bootstrapAgentContext' describe('SMUS Explorer Activation', function () { let mockExtensionContext: vscode.ExtensionContext @@ -576,4 +577,30 @@ describe('SMUS Explorer Activation', function () { assert.ok(mockExtensionContext.subscriptions.includes(mockTreeView)) }) }) + + describe('AGENTS.md', function () { + let createAgentsFileStub: sinon.SinonStub + let isSageMakerStub: sinon.SinonStub + + beforeEach(function () { + createAgentsFileStub = sinon.stub(bootstrapAgentContext, 'createAgentsFile').resolves() + isSageMakerStub = extensionUtilities.isSageMaker as sinon.SinonStub + }) + + it('should create AGENTS.md when running on SMUS Space remote access', async function () { + isSageMakerStub.returns(true) + + await activate(mockExtensionContext) + + assert.ok(createAgentsFileStub.calledOnceWith(mockExtensionContext)) + }) + + it('should not create AGENTS.md when not on SMUS Space remote access', async function () { + isSageMakerStub.returns(false) + + await activate(mockExtensionContext) + + assert.ok(createAgentsFileStub.notCalled) + }) + }) }) diff --git a/packages/sagemaker-ssh-kiro/CHANGELOG.md b/packages/sagemaker-ssh-kiro/CHANGELOG.md new file mode 100644 index 00000000000..2a7d6761e74 --- /dev/null +++ b/packages/sagemaker-ssh-kiro/CHANGELOG.md @@ -0,0 +1,12 @@ +## 0.2.0 + +- Added support for setting the http_proxy and https_proxy environment variables on the remote Kiro server, configurable via the `aws.sagemaker.ssh.kiro.httpProxy` and `aws.sagemaker.ssh.kiro.httpsProxy` settings + +## 0.1.1 + +- Fixed issue where remote connection could fail to a freshly-started Space due to the remote Kiro server not being given enough time to boot +- Fixed issue where attempting to establish a remote connection would hang for a few additional minutes in some cases where the connection had already failed +- Fixed issue where Kiro would infinitely try to reconnect to the Space after a successful remote connection closed unexpectedly + +## 0.1.0 +- Initial release diff --git a/packages/sagemaker-ssh-kiro/README.md b/packages/sagemaker-ssh-kiro/README.md new file mode 100644 index 00000000000..84826a26f12 --- /dev/null +++ b/packages/sagemaker-ssh-kiro/README.md @@ -0,0 +1,3 @@ +# Amazon SageMaker SSH Plugin for Kiro + +A plugin for AWS Toolkit that enables secure remote development in Amazon SageMaker Spaces using the Kiro IDE. This plugin provides SSH connectivity between your local Kiro environment and SageMaker Spaces, allowing you to develop, train, and deploy machine learning models using SageMaker's managed infrastructure while working in your local IDE. Note: This extension is specifically designed for Kiro IDE users; VS Code users should continue using the Microsoft Remote - SSH extension. diff --git a/packages/sagemaker-ssh-kiro/aws-icon-256x256.png b/packages/sagemaker-ssh-kiro/aws-icon-256x256.png new file mode 100644 index 0000000000000000000000000000000000000000..2cb94c1f3e347c0310ef39c204044d8b4fd2cd80 GIT binary patch literal 10466 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 LWkl&KBme&ae(t$e literal 0 HcmV?d00001 diff --git a/packages/sagemaker-ssh-kiro/package.json b/packages/sagemaker-ssh-kiro/package.json new file mode 100644 index 00000000000..8932e60bad5 --- /dev/null +++ b/packages/sagemaker-ssh-kiro/package.json @@ -0,0 +1,117 @@ +{ + "name": "sagemaker-ssh-kiro", + "displayName": "Amazon SageMaker SSH Plugin for Kiro", + "description": "Plugin for AWS Toolkit that enables secure remote development in Amazon SageMaker Spaces using the Kiro IDE.", + "version": "0.2.0", + "publisher": "amazonwebservices", + "license": "Apache-2.0", + "repository": { + "type": "git", + "url": "https://github.com/aws/aws-toolkit-vscode" + }, + "icon": "resources/marketplace/aws-icon-256x256.png", + "bugs": { + "url": "https://github.com/aws/aws-toolkit-vscode/issues" + }, + "galleryBanner": { + "color": "#232F3E", + "theme": "dark" + }, + "extensionKind": [ + "ui" + ], + "enabledApiProposals": [ + "resolvers", + "contribViewsRemote" + ], + "categories": [ + "Other" + ], + "keywords": [ + "AWS", + "SageMaker", + "remote development", + "ssh" + ], + "preview": false, + "qna": "https://github.com/aws/aws-toolkit-vscode/issues", + "api": "none", + "activationEvents": [ + "onStartupFinished", + "onResolveRemoteAuthority:sagemaker-ssh-kiro" + ], + "main": "./dist/extension.js", + "engines": { + "npm": "^10.1.0", + "vscode": "^1.83.0" + }, + "contributes": { + "configuration": { + "title": "SageMaker SSH", + "properties": { + "aws.sagemaker.ssh.kiro.defaultExtensions": { + "type": "array", + "items": { + "type": "string" + }, + "description": "List of extensions to be automatically installed when connecting to SageMaker Spaces.", + "scope": "application" + }, + "aws.sagemaker.ssh.kiro.serverDownloadUrlTemplate": { + "type": "string", + "description": "The URL from where the Kiro remote server will be downloaded for SageMaker Spaces.", + "scope": "application" + }, + "aws.sagemaker.ssh.kiro.httpProxy": { + "type": "string", + "markdownDescription": "Set the 'http_proxy' environment variable. This will be set for install and launch of the remote Kiro server. After changing this value, restart the SageMaker Space for it to take effect.", + "examples": [ + "http://proxy.example.com:8080", + "http://user:pass@proxy.example.com:8080" + ], + "scope": "application" + }, + "aws.sagemaker.ssh.kiro.httpsProxy": { + "type": "string", + "markdownDescription": "Set the 'https_proxy' environment variable. This will be set for install and launch of the remote Kiro server. After changing this value, restart the SageMaker Space for it to take effect.", + "examples": [ + "http://proxy.example.com:8080", + "http://user:pass@proxy.example.com:8080" + ], + "scope": "application" + } + } + }, + "resourceLabelFormatters": [ + { + "scheme": "vscode-remote", + "authority": "sagemaker-ssh-kiro+*", + "formatting": { + "label": "${path}", + "separator": "/", + "tildify": true, + "workspaceSuffix": "SageMaker" + } + } + ] + }, + "scripts": { + "vscode:prepublish": "npm run clean && npm run buildScripts && webpack --mode production", + "buildScripts": "npm run copyFiles && tsc -p ./ --noEmit", + "copyFiles": "ts-node ./scripts/build/copyFiles.ts", + "clean": "ts-node ../../scripts/clean.ts dist/", + "webpack": "webpack --mode development", + "webpack:analyze": "webpack --mode production --analyze", + "bundle-analyze": "npx webpack-bundle-analyzer dist/extension.js", + "compile": "tsc -b", + "watch": "tsc -b -w", + "package": "ts-node ../../scripts/package.ts", + "update-dts": "npx vscode-dts dev" + }, + "devDependencies": { + "@types/ssh2": "^1.15.0" + }, + "dependencies": { + "ssh2": "^1.17.0" + } +} diff --git a/packages/sagemaker-ssh-kiro/scripts/build/copyFiles.ts b/packages/sagemaker-ssh-kiro/scripts/build/copyFiles.ts new file mode 100644 index 00000000000..b75788f3610 --- /dev/null +++ b/packages/sagemaker-ssh-kiro/scripts/build/copyFiles.ts @@ -0,0 +1,62 @@ +/*! + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +/* eslint-disable no-restricted-imports */ +import fs from 'fs' +import * as path from 'path' + +// Copies various dependencies into "dist/". + +const projectRoot = process.cwd() +const outRoot = path.join(projectRoot, 'dist') + +interface CopyTask { + /** + * Target file or directory to copy. + */ + readonly target: string + + /** + * Providing no destination means the target will be copied relative to the root directory. + */ + readonly destination?: string +} + +const tasks: CopyTask[] = [ + ...['LICENSE', 'NOTICE'].map((f) => { + return { target: path.join('../../', f), destination: path.join(projectRoot, f) } + }), + // Copy the AWS icon from toolkit resources + { + target: 'aws-icon-256x256.png', + destination: '../resources/marketplace/aws-icon-256x256.png', + }, +] + +function copy(task: CopyTask): void { + const src = path.resolve(projectRoot, task.target) + const dst = path.resolve(outRoot, task.destination ?? task.target) + + try { + fs.cpSync(src, dst, { + recursive: true, + force: true, + errorOnExist: false, + }) + } catch (error) { + throw new Error(`Copy "${src}" to "${dst}" failed: ${error instanceof Error ? error.message : error}`) + } +} +function main() { + try { + tasks.map(copy) + } catch (error) { + console.error('`copyFiles.ts` failed') + console.error(error) + process.exit(1) + } +} + +void main() diff --git a/packages/sagemaker-ssh-kiro/src/authResolver.ts b/packages/sagemaker-ssh-kiro/src/authResolver.ts new file mode 100644 index 00000000000..c946847a634 --- /dev/null +++ b/packages/sagemaker-ssh-kiro/src/authResolver.ts @@ -0,0 +1,347 @@ +/*! + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + * + * This file contains code originally from https://github.com/jeanp413/open-remote-ssh + * Original copyright: (c) 2022 + * Originally released under MIT license + */ + +import * as cp from 'child_process' // eslint-disable-line no-restricted-imports +import * as path from 'path' +import * as stream from 'stream' +import * as vscode from 'vscode' +import SSHConnection from './sshConnection' +import { findRandomPort } from './common/ports' +import { disposeAll } from './common/disposable' +import { installCodeServer, ServerInstallResult } from './serverSetup' +import { waitForMatchingStreamOutput as waitForStreamOutput } from './common/streamUtils' +import { rejectAfterSecondsElapsed } from './common/promiseUtils' + +// The SSH client timeout mirrors the timeout value that the AWS Toolkit writes into the remote.SSH configuration for VS Code. +const ssmSessionReadyTimeoutSeconds = 30 +const sshClientConnectTimeoutSeconds = 120 +const installCommandTimeoutSeconds = 120 +const openTunnelTimeoutSeconds = 10 + +// This is hard-coded rather than imported from the AWS Toolkit core/ package to keep the bundle size low. +const awsToolkitExtensionId = 'amazonwebservices.aws-toolkit-vscode' + +export const sagemakerSshKiroAuthority = 'sagemaker-ssh-kiro' + +export function getRemoteAuthority(host: string) { + return `${sagemakerSshKiroAuthority}+${host}` +} + +class TunnelInfo implements vscode.Disposable { + constructor( + readonly localPort: number, + readonly remotePortOrSocketPath: number | string, + private disposables: vscode.Disposable[] + ) {} + + dispose() { + disposeAll(this.disposables) + } +} + +export class SageMakerSshKiroResolver implements vscode.RemoteAuthorityResolver, vscode.Disposable { + private sshConnection?: SSHConnection + private tunnels: TunnelInfo[] = [] + private proxyCommandProcess?: cp.ChildProcessWithoutNullStreams + + private labelFormatterDisposable?: vscode.Disposable + + constructor( + readonly context: vscode.ExtensionContext, + readonly logger: vscode.LogOutputChannel + ) {} + + resolve(authority: string, context: vscode.RemoteAuthorityResolverContext): Thenable { + const { hostname: hostname, user } = validateAuthority(authority) + + this.logger.info(`Resolving SSH remote authority '${authority}' (attempt #${context.resolveAttempt})`) + + const awsSagemakerConfig = vscode.workspace.getConfiguration('aws.sagemaker.ssh.kiro') + const serverDownloadUrlTemplate = awsSagemakerConfig.get('serverDownloadUrlTemplate') + const httpProxy = awsSagemakerConfig.get('httpProxy') + const httpsProxy = awsSagemakerConfig.get('httpsProxy') + + if (httpProxy) { + this.logger.info(`Using HTTP proxy: ${httpProxy}`) + } + if (httpsProxy) { + this.logger.info(`Using HTTPS proxy: ${httpsProxy}`) + } + + let defaultExtensions = awsSagemakerConfig.get('defaultExtensions', []) + + // Ensure the AWS Toolkit is always installed. In VS Code, this is done by updating the user's + // `defaultExtensions` setting before connecting, but there is no need to update the user's setting if we are + // going to make sure it's installed every time. + if (!defaultExtensions.includes(awsToolkitExtensionId)) { + defaultExtensions = [...defaultExtensions, awsToolkitExtensionId] + } + + const awsToolkitGlobalStoragePath = this.context.globalStorageUri.fsPath.replace( + path.basename(this.context.globalStorageUri.fsPath), + awsToolkitExtensionId + ) + + const isWindows = process.platform === 'win32' + const scriptName = `sagemaker_connect${isWindows ? '.ps1' : ''}` + const sagemakerConnectPath = path.join(awsToolkitGlobalStoragePath, scriptName) + const proxyArgs = [hostname] + + return vscode.window.withProgress( + { + title: `Setting up SSH Host ${hostname}`, + location: vscode.ProgressLocation.Notification, + cancellable: false, + }, + async () => { + try { + // Use the determined sagemaker_connect script with appropriate arguments + const command = sagemakerConnectPath + + let options: cp.SpawnOptions = { + env: { ...process.env }, // Inherit environment variables from parent process + } + + if (isWindows && /\.ps1$/.test(command)) { + // For PowerShell scripts, use powershell.exe + const allArgs = ['-ExecutionPolicy', 'RemoteSigned', '-File', command, ...proxyArgs] + options = { + ...options, + windowsHide: true, + } + + this.logger.info(`Spawning SageMaker Connect: powershell.exe ${allArgs.join(' ')}`) + this.proxyCommandProcess = cp.spawn( + 'powershell.exe', + allArgs, + options + ) as cp.ChildProcessWithoutNullStreams + } else { + this.logger.info(`Spawning SageMaker Connect: ${command} with args: [${proxyArgs.join(',')}]`) + this.proxyCommandProcess = cp.spawn( + command, + proxyArgs, + options + ) as cp.ChildProcessWithoutNullStreams + } + + if (!this.proxyCommandProcess.stdout || !this.proxyCommandProcess.stdin) { + throw new Error('Failed to create proxy command process streams') + } + + // Monitor stderr for errors while spinning sagemaker_connect script + this.proxyCommandProcess.stderr.on('data', (data) => { + const errorText = data.toString() + this.logger.info(`SageMaker Connect stderr: ${errorText}`) + }) + + // This promise will be rejected if the sagemaker_connect script exits (it's not supposed to exit unless we are disconnecting) + // This is used later in Promise.race() calls in order to fail fast while waiting for other operations if the connection closes prematurely + const rejectWhenProxyCommandExits = new Promise((resolve, reject) => { + this.proxyCommandProcess!.on('exit', () => + reject(new Error('SageMaker Connect script exited prematurely')) + ) + }) + + // For Windows, we have to wait until the SSM session provides an appropriate ready signal, + // or else the SSH2 client handshake will fail for some unknown reason. + // We also do this for non-Windows because we have seen occasional SSH connection failures + // if the SSH client is given access to the stream while the remote-access-server is still booting. + this.logger.info('Waiting for SSM session to be ready...') + const readySignals = ['Starting session with SessionId:', 'SSH-2.0-Go'] + + try { + await Promise.race([ + rejectWhenProxyCommandExits, + rejectAfterSecondsElapsed( + ssmSessionReadyTimeoutSeconds, + new Error('Timed out waiting for the SSM session to be ready.') + ), + waitForStreamOutput(this.proxyCommandProcess.stdout, (data: Buffer) => { + const output = data.toString() + + if (isWindows) { + // The stderr 'data' callback doesn't emit on Windows for some reason (possibly due to the way the sagemaker_connect + // powershell script is written), so logging stdout is the only way to see what is happening. + this.logger.info(`SageMaker Connect output: ${output}`) + } + + for (const signal of readySignals) { + if (output.includes(signal)) { + this.logger.info(`Tunnel ready signal detected: [${signal}]`) + return true + } + } + + return false + }), + ]) + } catch (error: unknown) { + const errorMessage = `Failed to establish SSM session: ${error}` + this.logger.error(errorMessage) + throw new Error(errorMessage) + } + + const proxyStream = stream.Duplex.from({ + readable: this.proxyCommandProcess.stdout, + writable: this.proxyCommandProcess.stdin, + }) + + // Authentication is handled by AWS SSM Session Manager + this.sshConnection = new SSHConnection({ + sock: proxyStream, + username: user, + readyTimeout: sshClientConnectTimeoutSeconds * 1000, + }) + + this.logger.info(`Initiating SSH connection with ${sshClientConnectTimeoutSeconds}s timeout...`) + + // The connect() function has built-in timeout handling (configured above) + await Promise.race([rejectWhenProxyCommandExits, this.sshConnection.connect()]) + + this.logger.info('Established SSH connection. Setting up remote server...') + + const installResult = await Promise.race([ + rejectWhenProxyCommandExits as Promise, + rejectAfterSecondsElapsed( + installCommandTimeoutSeconds, + new Error('Timed out while setting up remote server.') + ), + installCodeServer(this.sshConnection, serverDownloadUrlTemplate, defaultExtensions, false, { + httpProxy, + httpsProxy, + }), + ]) + + const tunnelConfig = await Promise.race([ + rejectWhenProxyCommandExits as Promise, + rejectAfterSecondsElapsed( + openTunnelTimeoutSeconds, + new Error('Timed out while attempting to open a tunnel.') + ), + this.openTunnel(0, installResult.listeningOn), + ]) + this.tunnels.push(tunnelConfig) + + this.labelFormatterDisposable?.dispose() + this.labelFormatterDisposable = vscode.workspace.registerResourceLabelFormatter({ + scheme: 'vscode-remote', + authority: `${sagemakerSshKiroAuthority}+*`, + formatting: { + label: '${path}', + separator: '/', + tildify: true, + workspaceSuffix: `SageMaker: ${hostname}`, + }, + }) + + const resolvedResult: vscode.ResolverResult = new vscode.ResolvedAuthority( + '127.0.0.1', + tunnelConfig.localPort, + installResult.connectionToken + ) + return resolvedResult + } catch (e: unknown) { + this.logger.error(`Error resolving authority`, e) + + // Initial connection + if (context.resolveAttempt === 1) { + this.logger.show() + + const closeRemote = 'Close Remote' + const retry = 'Retry' + const result = await vscode.window.showErrorMessage( + `Could not establish connection to "${hostname}"`, + { modal: true }, + closeRemote, + retry + ) + + if (result === closeRemote) { + await vscode.commands.executeCommand('workbench.action.remote.close') + } else if (result === retry) { + await vscode.commands.executeCommand('workbench.action.reloadWindow') + } + } + + // Signal to the IDE to not retry the connection. + throw vscode.RemoteAuthorityResolverError.NotAvailable(e?.toString()) + } + } + ) + } + + private async openTunnel(localPort: number, remotePortOrSocketPath: number | string) { + localPort = localPort > 0 ? localPort : await findRandomPort() + + const disposables: vscode.Disposable[] = [] + const remotePort = typeof remotePortOrSocketPath === 'number' ? remotePortOrSocketPath : undefined + const remoteSocketPath = typeof remotePortOrSocketPath === 'string' ? remotePortOrSocketPath : undefined + + this.logger.info(`Opening tunnel ${localPort}(local) => ${remotePortOrSocketPath}(remote)`) + const tunnelConfig = await this.sshConnection!.addTunnel({ + name: `ssh_tunnel_${localPort}_${remotePortOrSocketPath}`, + remoteAddr: '127.0.0.1', + remotePort, + remoteSocketPath, + localPort, + }) + disposables.push({ + dispose: () => { + void this.sshConnection?.closeTunnel(tunnelConfig.name) + this.logger.info(`Tunnel ${tunnelConfig.name} closed`) + }, + }) + + return new TunnelInfo(localPort, remotePortOrSocketPath, disposables) + } + + dispose() { + disposeAll(this.tunnels) + void this.sshConnection?.close() + this.proxyCommandProcess?.kill() + this.labelFormatterDisposable?.dispose() + } +} + +export function validateAuthority(authority: string): { hostname: string; user: string } { + const [type, dest] = authority.split('+') + if (type !== sagemakerSshKiroAuthority) { + throw new Error(`Invalid authority type for SageMaker SSH Kiro resolver: ${type}`) + } + + let hostname = dest + let user = 'sagemaker-user' + if (dest.includes('@')) { + const parts = dest.split('@') + + if (parts.length !== 2) { + throw new Error(`Invalid connection format: ${dest}. Expected format: [user@]hostname`) + } + + const providedUser = parts[0].trim() + hostname = parts[1].trim() + + if (providedUser) { + if (!/^[a-zA-Z0-9_-]+$/.test(providedUser)) { + throw new Error( + `Invalid username format: ${providedUser}. Username must contain only alphanumeric characters, hyphens, and underscores.` + ) + } + + user = providedUser + } + } + + if (!/^sm_[a-zA-Z0-9\._-]+$/.test(hostname)) { + throw new Error(`Invalid SageMaker hostname format: ${hostname}. Expected either 'sm_*' format.`) + } + + return { hostname, user } +} diff --git a/packages/sagemaker-ssh-kiro/src/common/disposable.ts b/packages/sagemaker-ssh-kiro/src/common/disposable.ts new file mode 100644 index 00000000000..3db6fc06b80 --- /dev/null +++ b/packages/sagemaker-ssh-kiro/src/common/disposable.ts @@ -0,0 +1,46 @@ +/*! + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + * + * This file contains code originally from https://github.com/jeanp413/open-remote-ssh + * Original copyright: (c) 2022 + * Originally released under MIT license + */ + +import * as vscode from 'vscode' + +export function disposeAll(disposables: vscode.Disposable[]): void { + while (disposables.length) { + const item = disposables.pop() + if (item) { + item.dispose() + } + } +} + +export abstract class Disposable { + private _isDisposed = false + + protected _disposables: vscode.Disposable[] = [] + + public dispose(): any { + if (this._isDisposed) { + return + } + this._isDisposed = true + disposeAll(this._disposables) + } + + protected _register(value: T): T { + if (this._isDisposed) { + value.dispose() + } else { + this._disposables.push(value) + } + return value + } + + protected get isDisposed(): boolean { + return this._isDisposed + } +} diff --git a/packages/sagemaker-ssh-kiro/src/common/logger.ts b/packages/sagemaker-ssh-kiro/src/common/logger.ts new file mode 100644 index 00000000000..aacb46812d0 --- /dev/null +++ b/packages/sagemaker-ssh-kiro/src/common/logger.ts @@ -0,0 +1,20 @@ +/*! + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +import * as vscode from 'vscode' + +let logger: vscode.LogOutputChannel | undefined + +export function initializeLogger(): vscode.LogOutputChannel { + logger = vscode.window.createOutputChannel('Amazon SageMaker SSH Plugin for Kiro', { log: true }) + return logger +} + +export function getLogger(): vscode.LogOutputChannel { + if (!logger) { + throw new Error('Logger not initialized. This was probably called before extension activation') + } + return logger +} diff --git a/packages/sagemaker-ssh-kiro/src/common/ports.ts b/packages/sagemaker-ssh-kiro/src/common/ports.ts new file mode 100644 index 00000000000..ce866419974 --- /dev/null +++ b/packages/sagemaker-ssh-kiro/src/common/ports.ts @@ -0,0 +1,138 @@ +/*! + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + * + * This file contains code originally from https://github.com/jeanp413/open-remote-ssh + * Original copyright: (c) 2022 + * Originally released under MIT license + */ + +import * as net from 'net' + +/** + * Finds a random unused port assigned by the operating system. Will reject in case no free port can be found. + */ +export function findRandomPort(): Promise { + return new Promise((resolve, reject) => { + const server = net.createServer({ pauseOnConnect: true }) + server.on('error', reject) + server.on('listening', () => { + const port = (server.address() as net.AddressInfo).port + server.close(() => resolve(port)) + }) + server.listen(0, '127.0.0.1') + }) +} + +/** + * Given a start point and a max number of retries, will find a port that + * is openable. Will return 0 in case no free port can be found. + */ +export function findFreePort(startPort: number, giveUpAfter: number, timeout: number, stride = 1): Promise { + let done = false + + return new Promise((resolve) => { + const timeoutHandle = setTimeout(() => { + if (!done) { + done = true + return resolve(0) + } + }, timeout) + + doFindFreePort(startPort, giveUpAfter, stride, (port) => { + if (!done) { + done = true + clearTimeout(timeoutHandle) + return resolve(port) + } + }) + }) +} + +function doFindFreePort(startPort: number, giveUpAfter: number, stride: number, clb: (port: number) => void): void { + if (giveUpAfter === 0) { + return clb(0) + } + + const client = new net.Socket() + + // If we can connect to the port it means the port is already taken so we continue searching + client.once('connect', () => { + dispose(client) + + return doFindFreePort(startPort + stride, giveUpAfter - 1, stride, clb) + }) + + client.once('data', () => { + // this listener is required since node.js 8.x + }) + + client.once('error', (err: Error & { code?: string }) => { + dispose(client) + + // If we receive any non ECONNREFUSED error, it means the port is used but we cannot connect + if (err.code !== 'ECONNREFUSED') { + return doFindFreePort(startPort + stride, giveUpAfter - 1, stride, clb) + } + + // Otherwise it means the port is free to use! + return clb(startPort) + }) + + client.connect(startPort, '127.0.0.1') +} + +/** + * Uses listen instead of connect. Is faster, but if there is another listener on 0.0.0.0 then this will take 127.0.0.1 from that listener. + */ +export function findFreePortFaster(startPort: number, giveUpAfter: number, timeout: number): Promise { + let resolved = false + let timeoutHandle: NodeJS.Timeout | undefined = undefined + let countTried = 1 + const server = net.createServer({ pauseOnConnect: true }) + function doResolve(port: number, resolve: (port: number) => void) { + if (!resolved) { + resolved = true + server.removeAllListeners() + server.close() + if (timeoutHandle) { + clearTimeout(timeoutHandle) + } + resolve(port) + } + } + return new Promise((resolve) => { + timeoutHandle = setTimeout(() => { + doResolve(0, resolve) + }, timeout) + + server.on('listening', () => { + doResolve(startPort, resolve) + }) + server.on('error', (err) => { + if (err && ((err).code === 'EADDRINUSE' || (err).code === 'EACCES') && countTried < giveUpAfter) { + startPort++ + countTried++ + server.listen(startPort, '127.0.0.1') + } else { + doResolve(0, resolve) + } + }) + server.on('close', () => { + doResolve(0, resolve) + }) + server.listen(startPort, '127.0.0.1') + }) +} + +function dispose(socket: net.Socket): void { + try { + socket.removeAllListeners('connect') + socket.removeAllListeners('error') + socket.end() + socket.destroy() + socket.unref() + } catch (error) { + console.error(error) // otherwise this error would get lost in the callback chain + } +} diff --git a/packages/sagemaker-ssh-kiro/src/common/promiseUtils.ts b/packages/sagemaker-ssh-kiro/src/common/promiseUtils.ts new file mode 100644 index 00000000000..cc79c71451f --- /dev/null +++ b/packages/sagemaker-ssh-kiro/src/common/promiseUtils.ts @@ -0,0 +1,22 @@ +/*! + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * Creates a promise that rejects when the specified timeout is reached. + * + * Usage: + * ``` + * await Promise.race([ + * rejectAfterSecondsElapsed(10, new Error('Timed out while doing X.')), + * someOtherPromise + * ]) + * ``` + * + * Tip: If you are using the return value of the other promise, you can supply the type of its return value to this + * function's type parameter to the same value to avoid TypeScript warnings. + */ +export function rejectAfterSecondsElapsed(timeoutSeconds: number, error: any): Promise { + return new Promise((resolve, reject) => setTimeout(() => reject(error), timeoutSeconds * 1000)) +} diff --git a/packages/sagemaker-ssh-kiro/src/common/streamUtils.ts b/packages/sagemaker-ssh-kiro/src/common/streamUtils.ts new file mode 100644 index 00000000000..94c45e04a3a --- /dev/null +++ b/packages/sagemaker-ssh-kiro/src/common/streamUtils.ts @@ -0,0 +1,33 @@ +/*! + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +import * as stream from 'stream' + +/** + * Returns a promise that resolves when the provided stream outputs data that satisfies the provided predicate function. + */ +export function waitForMatchingStreamOutput( + stream: stream.Readable, + predicate: (data: Buffer) => boolean +): Promise { + return new Promise((resolve, reject) => { + const onData = (data: Buffer) => { + if (predicate(data)) { + cleanup() + resolve() + } + } + + const cleanup = () => { + stream.off('data', onData) + } + + stream.on('data', onData) + stream.on('error', (error) => { + cleanup() + reject(error) + }) + }) +} diff --git a/packages/sagemaker-ssh-kiro/src/extension.ts b/packages/sagemaker-ssh-kiro/src/extension.ts new file mode 100644 index 00000000000..91e267c650a --- /dev/null +++ b/packages/sagemaker-ssh-kiro/src/extension.ts @@ -0,0 +1,40 @@ +/*! + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + * + * This file contains code originally from https://github.com/jeanp413/open-remote-ssh + * Original copyright: (c) 2022 + * Originally released under MIT license + */ + +import * as vscode from 'vscode' +import { SageMakerSshKiroResolver as SageMakerSshKiroResolver, sagemakerSshKiroAuthority } from './authResolver' +import { initializeLogger } from './common/logger' + +export async function activate(context: vscode.ExtensionContext) { + const logger = initializeLogger() + context.subscriptions.push(logger) + + if (!vscode.env.appName.toLowerCase().includes('kiro')) { + const errorMessage = 'Amazon SageMaker SSH Plugin for Kiro is only supported in the Kiro IDE' + logger.error(errorMessage) + void vscode.window.showErrorMessage(errorMessage) + return + } + + try { + const sagemakerSSHResolver = new SageMakerSshKiroResolver(context, logger) + context.subscriptions.push( + vscode.workspace.registerRemoteAuthorityResolver(sagemakerSshKiroAuthority, sagemakerSSHResolver) + ) + context.subscriptions.push(sagemakerSSHResolver) + + logger.info('Amazon SageMaker SSH Plugin for Kiro activated successfully') + } catch (error) { + logger.error(`Amazon SageMaker SSH Plugin for Kiro: Activation failed: ${error}`) + void vscode.window.showErrorMessage(`SageMaker SSH Extension activation failed: ${error}`) + throw error + } +} + +export function deactivate() {} diff --git a/packages/sagemaker-ssh-kiro/src/serverConfig.ts b/packages/sagemaker-ssh-kiro/src/serverConfig.ts new file mode 100644 index 00000000000..f84a186e23d --- /dev/null +++ b/packages/sagemaker-ssh-kiro/src/serverConfig.ts @@ -0,0 +1,44 @@ +/*! + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + * + * This file contains code originally from https://github.com/jeanp413/open-remote-ssh + * Original copyright: (c) 2022 + * Originally released under MIT license + */ + +import * as vscode from 'vscode' +import * as fs from 'fs' // eslint-disable-line no-restricted-imports +import * as path from 'path' + +let vscodeProductJson: any +async function getVSCodeProductJson() { + if (!vscodeProductJson) { + const productJsonStr = await fs.promises.readFile(path.join(vscode.env.appRoot, 'product.json'), 'utf8') + vscodeProductJson = JSON.parse(productJsonStr) + } + + return vscodeProductJson +} + +export interface IServerConfig { + version: string + commit: string + quality: string + serverApplicationName: string + serverDataFolderName: string + serverDownloadUrlTemplate?: string +} + +export async function getVSCodeServerConfig(): Promise { + const productJson = await getVSCodeProductJson() + + return { + version: vscode.version.replace('-insider', ''), + commit: productJson.commit, + quality: productJson.quality, + serverApplicationName: productJson.serverApplicationName, + serverDataFolderName: productJson.serverDataFolderName, + serverDownloadUrlTemplate: productJson.serverDownloadUrlTemplate, + } +} diff --git a/packages/sagemaker-ssh-kiro/src/serverSetup.ts b/packages/sagemaker-ssh-kiro/src/serverSetup.ts new file mode 100644 index 00000000000..5e557f46701 --- /dev/null +++ b/packages/sagemaker-ssh-kiro/src/serverSetup.ts @@ -0,0 +1,450 @@ +/*! + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + * + * This file contains code originally from https://github.com/jeanp413/open-remote-ssh + * Original copyright: (c) 2022 + * Originally released under MIT license + */ + +import * as crypto from 'crypto' +import { getLogger } from './common/logger' +import { getVSCodeServerConfig } from './serverConfig' +import SSHConnection, { executeShellCommand } from './sshConnection' + +export interface ServerInstallOptions { + id: string + quality: string + commit: string + version: string + extensionIds: string[] + useSocketPath: boolean + serverApplicationName: string + serverDataFolderName: string + serverDownloadUrlTemplate: string +} + +export interface ServerInstallResult { + exitCode: number + listeningOn: number | string + connectionToken: string + logFile: string + osReleaseId: string + arch: string + platform: string + tmpDir: string + [key: string]: any +} + +export class ServerInstallError extends Error { + constructor(message: string) { + super(message) + } +} + +interface ProxyConfig { + httpProxy?: string + httpsProxy?: string +} + +function getEnvVariables(proxyConfig?: ProxyConfig): Record { + // Hard-code environment variables that are required for the install script to work on SageMaker Spaces. + const envVariables: Record = { + USER: 'sagemaker-user', + HOME: '/home/sagemaker-user', + } + + // Set proxy environment variables for the Kiro remote server. + // These are used during installation (wget/curl for downloading the server) and at runtime by the server itself. + // + // Code-OSS server reads the environment variables here: + // https://github.com/microsoft/vscode/blob/main/src/vs/platform/request/node/proxy.ts + // + // Note: For consistency with the Microsoft Remote SSH extension, we intentionally do not set the uppercase variant (HTTP_PROXY / HTTPS_PROXY). + // Source code for that extension isn't available, so this was determined by running `printenv` on the VS Code server process after connecting with VS Code. + if (proxyConfig?.httpProxy) { + envVariables.http_proxy = proxyConfig.httpProxy + } + + if (proxyConfig?.httpsProxy) { + envVariables.https_proxy = proxyConfig.httpsProxy + } + + return envVariables +} + +export async function installCodeServer( + conn: SSHConnection, + serverDownloadUrlTemplate: string | undefined, + extensionIds: string[], + useSocketPath: boolean, + proxyConfig?: ProxyConfig +): Promise { + const logger = getLogger() + const scriptId = crypto.randomBytes(12).toString('hex') + + const vscodeServerConfig = await getVSCodeServerConfig() + const installOptions: ServerInstallOptions = { + id: scriptId, + version: vscodeServerConfig.version, + commit: vscodeServerConfig.commit, + quality: vscodeServerConfig.quality, + extensionIds, + useSocketPath, + serverApplicationName: vscodeServerConfig.serverApplicationName, + serverDataFolderName: vscodeServerConfig.serverDataFolderName, + serverDownloadUrlTemplate: serverDownloadUrlTemplate || vscodeServerConfig.serverDownloadUrlTemplate || '', + } + + const installServerScript = generateBashInstallScript(installOptions) + + const commandOutput = await executeShellCommand( + conn, + // Fish shell does not support heredoc so let's workaround it using -c option, + // also replace single quotes (') within the script with ('\'') as there's no quoting within single quotes, see https://unix.stackexchange.com/a/24676 + `bash -c '${installServerScript.replace(/'/g, `'\\''`)}'`, + getEnvVariables(proxyConfig) + ) + + if (commandOutput.stderr) { + logger.info(`Server install command stderr: ${commandOutput.stderr}`) + } + logger.info(`Server install command stdout: ${commandOutput.stdout}`) + + const resultMap = parseServerInstallOutput(commandOutput.stdout, scriptId) + if (!resultMap) { + throw new ServerInstallError(`Failed parsing install script output`) + } + + const exitCode = parseInt(resultMap.exitCode, 10) + if (exitCode !== 0) { + throw new ServerInstallError( + `Couldn't install vscode server on remote server, install script returned non-zero exit status, ${exitCode}` + ) + } + + const listeningOn = resultMap.listeningOn.match(/^\d+$/) + ? parseInt(resultMap.listeningOn, 10) + : resultMap.listeningOn + + return { + exitCode, + listeningOn, + connectionToken: resultMap.connectionToken, + logFile: resultMap.logFile, + osReleaseId: resultMap.osReleaseId, + arch: resultMap.arch, + platform: resultMap.platform, + tmpDir: resultMap.tmpDir, + } +} + +function parseServerInstallOutput(str: string, scriptId: string): { [k: string]: string } | undefined { + const startResultStr = `${scriptId}: start` + const endResultStr = `${scriptId}: end` + + const startResultIdx = str.lastIndexOf(startResultStr) + if (startResultIdx < 0) { + return undefined + } + + const endResultIdx = str.indexOf(endResultStr, startResultIdx + startResultStr.length) + if (endResultIdx < 0) { + return undefined + } + + const installResult = str.substring(startResultIdx + startResultStr.length, endResultIdx) + + const resultMap: { [k: string]: string } = {} + const resultArr = installResult.split(/\r?\n/) + for (const line of resultArr) { + const [key, value] = line.split('==') + resultMap[key] = value + } + + return resultMap +} + +function generateBashInstallScript({ + id, + quality, + version, + commit, + extensionIds, + useSocketPath, + serverApplicationName, + serverDataFolderName, + serverDownloadUrlTemplate, +}: ServerInstallOptions) { + const extensions = extensionIds.map((id) => '--install-extension ' + id).join(' ') + return ` +# Server installation script + +TMP_DIR="\${XDG_RUNTIME_DIR:-"/tmp"}" + +DISTRO_VERSION="${version}" +DISTRO_COMMIT="${commit}" +DISTRO_QUALITY="${quality}" + +SERVER_APP_NAME="${serverApplicationName}" +SERVER_INITIAL_EXTENSIONS="${extensions}" +SERVER_LISTEN_FLAG="${useSocketPath ? `--socket-path="$TMP_DIR/vscode-server-sock-${crypto.randomUUID()}"` : '--port=0'}" +SERVER_DATA_DIR="$HOME/${serverDataFolderName}" +SERVER_DIR="$SERVER_DATA_DIR/bin/$DISTRO_COMMIT" +SERVER_SCRIPT="$SERVER_DIR/bin/$SERVER_APP_NAME" +SERVER_LOGFILE="$SERVER_DATA_DIR/.$DISTRO_COMMIT.log" +SERVER_PIDFILE="$SERVER_DATA_DIR/.$DISTRO_COMMIT.pid" +SERVER_TOKENFILE="$SERVER_DATA_DIR/.$DISTRO_COMMIT.token" +SERVER_ARCH= +SERVER_CONNECTION_TOKEN= +SERVER_DOWNLOAD_URL= + +LISTENING_ON= +OS_RELEASE_ID= +ARCH= +PLATFORM= + +# Mimic output from logs of remote-ssh extension +print_install_results_and_exit() { + echo "${id}: start" + echo "exitCode==$1==" + echo "listeningOn==$LISTENING_ON==" + echo "connectionToken==$SERVER_CONNECTION_TOKEN==" + echo "logFile==$SERVER_LOGFILE==" + echo "osReleaseId==$OS_RELEASE_ID==" + echo "arch==$ARCH==" + echo "platform==$PLATFORM==" + echo "tmpDir==$TMP_DIR==" + echo "${id}: end" + exit 0 +} + +# Check if platform is supported +KERNEL="$(uname -s)" +case $KERNEL in + Darwin) + PLATFORM="darwin" + ;; + Linux) + PLATFORM="linux" + ;; + FreeBSD) + PLATFORM="freebsd" + ;; + DragonFly) + PLATFORM="dragonfly" + ;; + *) + echo "Error platform not supported: $KERNEL" + print_install_results_and_exit 1 + ;; +esac + +# Check machine architecture +ARCH="$(uname -m)" +case $ARCH in + x86_64 | amd64) + SERVER_ARCH="x64" + ;; + armv7l | armv8l) + SERVER_ARCH="armhf" + ;; + arm64 | aarch64) + SERVER_ARCH="arm64" + ;; + ppc64le) + SERVER_ARCH="ppc64le" + ;; + riscv64) + SERVER_ARCH="riscv64" + ;; + loongarch64) + SERVER_ARCH="loong64" + ;; + s390x) + SERVER_ARCH="s390x" + ;; + *) + echo "Error architecture not supported: $ARCH" + print_install_results_and_exit 1 + ;; +esac + +# https://www.freedesktop.org/software/systemd/man/os-release.html +OS_RELEASE_ID="$(grep -i '^ID=' /etc/os-release 2>/dev/null | sed 's/^ID=//gi' | sed 's/"//g')" +if [[ -z $OS_RELEASE_ID ]]; then + OS_RELEASE_ID="$(grep -i '^ID=' /usr/lib/os-release 2>/dev/null | sed 's/^ID=//gi' | sed 's/"//g')" + if [[ -z $OS_RELEASE_ID ]]; then + OS_RELEASE_ID="unknown" + fi +fi + +# Create installation folder +if [[ ! -d $SERVER_DIR ]]; then + mkdir -p $SERVER_DIR + if (( $? > 0 )); then + echo "Error creating server install directory" + print_install_results_and_exit 1 + fi +fi + +# adjust platform for vscodium download, if needed +if [[ $OS_RELEASE_ID = alpine ]]; then + PLATFORM=$OS_RELEASE_ID +fi + +SERVER_DOWNLOAD_URL="$(echo "${serverDownloadUrlTemplate.replace(/\$\{/g, '\\${')}" | sed "s/\\\${quality}/$DISTRO_QUALITY/g" | sed "s/\\\${version}/$DISTRO_VERSION/g" | sed "s/\\\${commit}/$DISTRO_COMMIT/g" | sed "s/\\\${os}/$PLATFORM/g" | sed "s/\\\${arch}/$SERVER_ARCH/g")" + +# Check if server script is already installed +if [[ ! -f $SERVER_SCRIPT ]]; then + case "$PLATFORM" in + darwin | linux | alpine ) + ;; + *) + echo "Error '$PLATFORM' needs manual installation of remote extension host" + print_install_results_and_exit 1 + ;; + esac + + pushd $SERVER_DIR > /dev/null + + if [[ ! -z $(which wget) ]]; then + wget --tries=3 --timeout=10 --continue --no-verbose -O vscode-server.tar.gz $SERVER_DOWNLOAD_URL + elif [[ ! -z $(which curl) ]]; then + curl --retry 3 --connect-timeout 10 --location --show-error --silent --output vscode-server.tar.gz $SERVER_DOWNLOAD_URL + else + echo "Error no tool to download server binary" + print_install_results_and_exit 1 + fi + + if (( $? > 0 )); then + echo "Error downloading server from $SERVER_DOWNLOAD_URL" + print_install_results_and_exit 1 + fi + + tar -xf vscode-server.tar.gz --strip-components 1 + if (( $? > 0 )); then + echo "Error while extracting server contents" + print_install_results_and_exit 1 + fi + + if [[ ! -f $SERVER_SCRIPT ]]; then + echo "Error server contents are corrupted" + print_install_results_and_exit 1 + fi + + rm -f vscode-server.tar.gz + + popd > /dev/null +else + echo "Server script already installed in $SERVER_SCRIPT" +fi + +# Try to find if server is already running +if [[ -f $SERVER_PIDFILE ]]; then + SERVER_PID="$(cat $SERVER_PIDFILE)" + SERVER_RUNNING_PROCESS="$(ps -o pid,args -p $SERVER_PID | grep $SERVER_SCRIPT)" +else + SERVER_RUNNING_PROCESS="$(ps -o pid,args -A | grep $SERVER_SCRIPT | grep -v grep)" +fi + +if [[ -z $SERVER_RUNNING_PROCESS ]]; then + if [[ -f $SERVER_LOGFILE ]]; then + rm $SERVER_LOGFILE + fi + if [[ -f $SERVER_TOKENFILE ]]; then + rm $SERVER_TOKENFILE + fi + + touch $SERVER_TOKENFILE + chmod 600 $SERVER_TOKENFILE + SERVER_CONNECTION_TOKEN="${crypto.randomUUID()}" + echo $SERVER_CONNECTION_TOKEN > $SERVER_TOKENFILE + + $SERVER_SCRIPT --start-server --host=127.0.0.1 $SERVER_LISTEN_FLAG $SERVER_INITIAL_EXTENSIONS --connection-token-file $SERVER_TOKENFILE --telemetry-level off --enable-remote-auto-shutdown --accept-server-license-terms &> $SERVER_LOGFILE & + echo $! > $SERVER_PIDFILE +else + echo "Server script is already running $SERVER_SCRIPT" +fi + +if [[ -f $SERVER_TOKENFILE ]]; then + SERVER_CONNECTION_TOKEN="$(cat $SERVER_TOKENFILE)" +else + echo "Error server token file not found $SERVER_TOKENFILE" + print_install_results_and_exit 1 +fi + +# Function to wait for server log file to be created +wait_for_server_log_file() { + local logfile="$1" + local max_attempts=20 + local sleep_interval=0.5 + local start_time_ms=$(date +%s%3N) + + echo "Waiting for server log file to be created at $\{logfile\}..." + for i in $(seq 1 $max_attempts); do + if [[ -f "$logfile" ]]; then + local end_time_ms=$(date +%s%3N) + local elapsed_ms=$((end_time_ms - start_time_ms)) + local seconds_part=$((elapsed_ms / 1000)) + local decimal_part=$(((elapsed_ms % 1000) / 100)) + echo "Log file found after $\{seconds_part\}.$\{decimal_part\} seconds (attempt $i/$max_attempts)" + return 0 + fi + if [[ $i -ge $max_attempts ]]; then + local end_time_ms=$(date +%s%3N) + local elapsed_ms=$((end_time_ms - start_time_ms)) + local seconds_part=$((elapsed_ms / 1000)) + local decimal_part=$(((elapsed_ms % 1000) / 100)) + echo "Error server log file not found after $\{seconds_part\}.$\{decimal_part\} seconds ($max_attempts attempts): $logfile" + return 1 + fi + sleep $sleep_interval + done +} + +# Function to wait for server to start listening +wait_for_server_listening() { + local logfile="$1" + local max_attempts=20 + local sleep_interval=0.5 + local start_time_ms=$(date +%s%3N) + + echo "Waiting for server to start listening..." + for i in $(seq 1 $max_attempts); do + local listening_on="$(cat "$logfile" | grep -E 'Extension host agent listening on .+' | sed 's/Extension host agent listening on //')" + if [[ -n "$listening_on" ]]; then + local end_time_ms=$(date +%s%3N) + local elapsed_ms=$((end_time_ms - start_time_ms)) + local seconds_part=$((elapsed_ms / 1000)) + local decimal_part=$(((elapsed_ms % 1000) / 100)) + echo "Server started successfully in $\{seconds_part\}.$\{decimal_part\} seconds (attempt $i/$max_attempts)" + LISTENING_ON="$listening_on" # Set global variable + return 0 + fi + if [[ $i -ge $max_attempts ]]; then + local end_time_ms=$(date +%s%3N) + local elapsed_ms=$((end_time_ms - start_time_ms)) + local seconds_part=$((elapsed_ms / 1000)) + local decimal_part=$(((elapsed_ms % 1000) / 100)) + echo "Error server did not start successfully after $\{seconds_part\}.$\{decimal_part\} seconds ($max_attempts attempts)" + return 1 + fi + sleep $sleep_interval + done +} + +# Wait for log file to be created first +if ! wait_for_server_log_file "$SERVER_LOGFILE"; then + print_install_results_and_exit 1 +fi + +# Now wait for server to start listening +if ! wait_for_server_listening "$SERVER_LOGFILE"; then + print_install_results_and_exit 1 +fi + +# Finish server setup +print_install_results_and_exit 0 +` +} diff --git a/packages/sagemaker-ssh-kiro/src/sshConnection.ts b/packages/sagemaker-ssh-kiro/src/sshConnection.ts new file mode 100644 index 00000000000..b68f3f830eb --- /dev/null +++ b/packages/sagemaker-ssh-kiro/src/sshConnection.ts @@ -0,0 +1,348 @@ +/*! + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + * + * This file contains code copied from the following places: + * - https://github.com/jeanp413/open-remote-ssh + * Original copyright: (c) 2022 + * Originally released under MIT license + * - https://github.com/sanketbajoria/ssh2-promise + * Original copyright: Copyright (c) 2015 Sanket Bajoria + * Originally released under MIT license + */ + +import { EventEmitter } from 'events' +import * as net from 'net' +import { Server } from 'net' +import { Client, ClientChannel, ClientErrorExtensions, ConnectConfig, ShellOptions } from 'ssh2' +import { rejectAfterSecondsElapsed } from './common/promiseUtils' + +const establishShellTimeoutSeconds = 10 + +export interface SSHConnectConfig extends ConnectConfig { + /** Optional Unique ID attached to ssh connection. */ + uniqueId?: string + /** Automatic retry to connect, after disconnect. Default true */ + reconnect?: boolean + /** Number of reconnect retry, after disconnect. Default 10 */ + reconnectTries?: number + /** Delay after which reconnect should be done. Default 5000ms */ + reconnectDelay?: number +} + +export interface SSHTunnelConfig { + /** Remote Address to connect */ + remoteAddr?: string + /** Local port to bind to. By default, it will bind to a random port, if not passed */ + localPort?: number + /** Remote Port to connect */ + remotePort?: number + /** Remote socket path to connect */ + remoteSocketPath?: string + /** Unique name */ + name?: string +} + +const defaultOptions: Partial = { + reconnect: false, + port: 22, + reconnectTries: 3, + reconnectDelay: 5000, +} + +const SSHConstants = { + CHANNEL: { + SSH: 'ssh', + TUNNEL: 'tunnel', + X11: 'x11', + }, + STATUS: { + BEFORECONNECT: 'beforeconnect', + CONNECT: 'connect', + BEFOREDISCONNECT: 'beforedisconnect', + DISCONNECT: 'disconnect', + }, +} + +interface CommandResult { + stdout: string + stderr: string +} + +/** + * Execute a command over a `shell` channel. This is currently used as a workaround instead of `exec` in order to be + * compatible with SageMaker Spaces. + */ +export async function executeShellCommand( + connection: SSHConnection, + command: string, + env: { [index: string]: string | undefined } +): Promise { + const stream = await Promise.race([ + // Arbitrary timeout for the shell to be established. + rejectAfterSecondsElapsed( + establishShellTimeoutSeconds, + new Error('Timed out while attempting to establish a remote shell.') + ), + connection.shell({ env }), + ]) + + // Then return a promise for the command execution + return new Promise((resolve, reject) => { + let stdout = '' + let stderr = '' + + stream!.on('close', () => { + resolve({ + stdout: stdout, + stderr: stderr, + }) + }) + stream!.on('error', (error: any) => { + reject(new Error(`Shell stream error: ${error}`)) + }) + stream!.on('data', (data: any) => { + stdout += data.toString() + }) + stream!.stderr.on('data', (data: any) => { + stderr += data.toString() + }) + + // Send command and exit afterward. + // This will lead to the `close` event being emitted after all stdout/stderr data has been received. + stream!.end(`${command}\nexit\n`) + }) +} + +// This class is mostly unmodified from jeanp413/open-remote-ssh, aside from removing unused features. +export default class SSHConnection extends EventEmitter { + public config: SSHConnectConfig + + private activeTunnels: { [index: string]: SSHTunnelConfig & { server: Server } } = {} + private __$connectPromise?: Promise + private __retries: number = 0 + private __err: (Error & ClientErrorExtensions & { code?: string }) | undefined + private sshConnection?: Client + + constructor(options: SSHConnectConfig) { + super() + this.config = Object.assign({}, defaultOptions, options) + this.config.uniqueId = this.config.uniqueId || `${this.config.username}@${this.config.host}` + } + + /** + * Emit message on this channel + */ + override emit(channel: string, status: string, payload?: any): boolean { + super.emit(channel, status, this, payload) + return super.emit(`${channel}:${status}`, this, payload) + } + + /** + * Get shell socket + */ + shell(options: ShellOptions = {}): Promise { + return this.connect().then(() => { + return new Promise((resolve, reject) => { + this.sshConnection!.shell(options, (err, stream) => (err ? reject(err) : resolve(stream))) + }) + }) + } + + /** + * Forward out + */ + forwardOut(srcIP: string, srcPort: number, destIP: string, destPort: number): Promise { + return this.connect().then(() => { + return new Promise((resolve, reject) => { + this.sshConnection!.forwardOut(srcIP, srcPort, destIP, destPort, (err, stream) => { + if (err) { + return reject(err) + } + resolve(stream) + }) + }) + }) + } + + /** + * Close SSH Connection + */ + close(): Promise { + this.emit(SSHConstants.CHANNEL.SSH, SSHConstants.STATUS.BEFOREDISCONNECT) + return this.closeTunnel().then(() => { + if (this.sshConnection) { + this.sshConnection.end() + this.emit(SSHConstants.CHANNEL.SSH, SSHConstants.STATUS.DISCONNECT) + } + }) + } + + /** + * Connect the SSH Connection + */ + connect(c?: SSHConnectConfig): Promise { + this.config = Object.assign(this.config, c) + ++this.__retries + + if (this.__$connectPromise) { + return this.__$connectPromise + } + + this.__$connectPromise = new Promise((resolve, reject) => { + this.emit(SSHConstants.CHANNEL.SSH, SSHConstants.STATUS.BEFORECONNECT) + if ( + !this.config || + typeof this.config === 'function' || + !(this.config.host || this.config.sock) || + !this.config.username + ) { + reject(`Invalid SSH connection configuration host/username can't be empty`) + this.__$connectPromise = undefined + return + } + + // Start ssh server connection + this.sshConnection = new Client() + this.sshConnection + .on('ready', () => { + this.emit(SSHConstants.CHANNEL.SSH, SSHConstants.STATUS.CONNECT) + this.__retries = 0 + this.__err = undefined + resolve(this) + }) + .on('error', (err) => { + this.emit(SSHConstants.CHANNEL.SSH, SSHConstants.STATUS.DISCONNECT, { err: err }) + this.__err = err + }) + .on('close', () => { + this.emit(SSHConstants.CHANNEL.SSH, SSHConstants.STATUS.DISCONNECT, { err: this.__err }) + if ( + this.config.reconnect && + this.__retries <= this.config.reconnectTries! && + this.__err && + this.__err.level !== 'client-authentication' && + this.__err.code !== 'ENOTFOUND' + ) { + setTimeout(() => { + this.__$connectPromise = undefined + resolve(this.connect()) + }, this.config.reconnectDelay) + } else { + reject(this.__err) + } + }) + .connect(this.config) + }) + return this.__$connectPromise + } + + /** + * Get existing tunnel by name + */ + getTunnel(name: string) { + return this.activeTunnels[name] + } + + /** + * Add new tunnel if not exist + */ + addTunnel(SSHTunnelConfig: SSHTunnelConfig): Promise { + SSHTunnelConfig.name = + SSHTunnelConfig.name || + `${SSHTunnelConfig.remoteAddr}@${SSHTunnelConfig.remotePort || SSHTunnelConfig.remoteSocketPath}` + this.emit(SSHConstants.CHANNEL.TUNNEL, SSHConstants.STATUS.BEFORECONNECT, { SSHTunnelConfig: SSHTunnelConfig }) + if (this.getTunnel(SSHTunnelConfig.name)) { + this.emit(SSHConstants.CHANNEL.TUNNEL, SSHConstants.STATUS.CONNECT, { SSHTunnelConfig: SSHTunnelConfig }) + return Promise.resolve(this.getTunnel(SSHTunnelConfig.name)) + } else { + return new Promise((resolve, reject) => { + const server: net.Server = net.createServer().on('connection', (socket) => { + void this.connect().then(() => { + if (SSHTunnelConfig.remotePort) { + this.sshConnection!.forwardOut( + '127.0.0.1', + 0, + SSHTunnelConfig.remoteAddr!, + SSHTunnelConfig.remotePort!, + (err, stream) => { + if (err) { + this.emit(SSHConstants.CHANNEL.TUNNEL, SSHConstants.STATUS.DISCONNECT, { + SSHTunnelConfig: SSHTunnelConfig, + err: err, + }) + return + } + stream.pipe(socket) + socket.pipe(stream) + } + ) + } else { + this.sshConnection!.openssh_forwardOutStreamLocal( + SSHTunnelConfig.remoteSocketPath!, + (err, stream) => { + if (err) { + this.emit(SSHConstants.CHANNEL.TUNNEL, SSHConstants.STATUS.DISCONNECT, { + SSHTunnelConfig: SSHTunnelConfig, + err: err, + }) + return + } + stream.pipe(socket) + socket.pipe(stream) + } + ) + } + }) + }) + + SSHTunnelConfig.localPort = SSHTunnelConfig.localPort || 0 + server + .on('listening', () => { + SSHTunnelConfig.localPort = (server.address() as net.AddressInfo).port + this.activeTunnels[SSHTunnelConfig.name!] = Object.assign({}, { server }, SSHTunnelConfig) + this.emit(SSHConstants.CHANNEL.TUNNEL, SSHConstants.STATUS.CONNECT, { + SSHTunnelConfig: SSHTunnelConfig, + }) + resolve(this.activeTunnels[SSHTunnelConfig.name!]) + }) + .on('error', (err: any) => { + this.emit(SSHConstants.CHANNEL.TUNNEL, SSHConstants.STATUS.DISCONNECT, { + SSHTunnelConfig: SSHTunnelConfig, + err: err, + }) + server.close() + reject(err) + delete this.activeTunnels[SSHTunnelConfig.name!] + }) + .listen(SSHTunnelConfig.localPort) + }) + } + } + + /** + * Close the tunnel + */ + closeTunnel(name?: string): Promise { + if (name && this.activeTunnels[name]) { + return new Promise((resolve) => { + const tunnel = this.activeTunnels[name] + this.emit(SSHConstants.CHANNEL.TUNNEL, SSHConstants.STATUS.BEFOREDISCONNECT, { + SSHTunnelConfig: tunnel, + }) + tunnel.server.close(() => { + this.emit(SSHConstants.CHANNEL.TUNNEL, SSHConstants.STATUS.DISCONNECT, { + SSHTunnelConfig: this.activeTunnels[name], + }) + delete this.activeTunnels[name] + resolve() + }) + }) + } else if (!name) { + const tunnels = Object.keys(this.activeTunnels).map((key) => this.closeTunnel(key)) + return Promise.all(tunnels).then(() => {}) + } + + return Promise.resolve() + } +} diff --git a/packages/sagemaker-ssh-kiro/tsconfig.json b/packages/sagemaker-ssh-kiro/tsconfig.json new file mode 100644 index 00000000000..03e625ae957 --- /dev/null +++ b/packages/sagemaker-ssh-kiro/tsconfig.json @@ -0,0 +1,11 @@ +{ + "extends": "../tsconfig.packages.json", + "compilerOptions": { + "outDir": "dist", + "baseUrl": ".", + "rootDir": ".", + "skipLibCheck": true + }, + "exclude": ["node_modules", ".vscode-test", "dist"], + "noEmitOnError": false // allow emitting even with type errors +} diff --git a/packages/sagemaker-ssh-kiro/vscode.proposed.resolvers.d.ts b/packages/sagemaker-ssh-kiro/vscode.proposed.resolvers.d.ts new file mode 100644 index 00000000000..5df4f6fc1c5 --- /dev/null +++ b/packages/sagemaker-ssh-kiro/vscode.proposed.resolvers.d.ts @@ -0,0 +1,475 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +declare module 'vscode' { + + //resolvers: @alexdima + + export interface MessageOptions { + /** + * Do not render a native message box. + */ + useCustom?: boolean; + } + + export interface RemoteAuthorityResolverContext { + resolveAttempt: number; + /** + * Exec server from a recursively-resolved remote authority. If the + * remote authority includes nested authorities delimited by `@`, it is + * resolved from outer to inner authorities with ExecServer passed down + * to each resolver in the chain. + */ + execServer?: ExecServer; + } + + export class ResolvedAuthority { + readonly host: string; + readonly port: number; + readonly connectionToken: string | undefined; + + constructor(host: string, port: number, connectionToken?: string); + } + + export interface ManagedMessagePassing { + onDidReceiveMessage: Event; + onDidClose: Event; + onDidEnd: Event; + + send: (data: Uint8Array) => void; + end: () => void; + drain?: () => Thenable; + } + + export class ManagedResolvedAuthority { + readonly makeConnection: () => Thenable; + readonly connectionToken: string | undefined; + + constructor(makeConnection: () => Thenable, connectionToken?: string); + } + + export interface ResolvedOptions { + extensionHostEnv?: { [key: string]: string | null }; + + isTrusted?: boolean; + + /** + * When provided, remote server will be initialized with the extensions synced using the given user account. + */ + authenticationSessionForInitializingExtensions?: AuthenticationSession & { providerId: string }; + } + + export interface TunnelPrivacy { + themeIcon: string; + id: string; + label: string; + } + + export namespace env { + /** Quality of the application. May be undefined if running from sources. */ + export const appQuality: string | undefined; + /** Commit of the application. May be undefined if running from sources. */ + export const appCommit: string | undefined; + } + + export interface TunnelOptions { + remoteAddress: { port: number; host: string }; + // The desired local port. If this port can't be used, then another will be chosen. + localAddressPort?: number; + label?: string; + /** + * @deprecated Use privacy instead + */ + public?: boolean; + privacy?: string; + protocol?: string; + } + + export interface TunnelDescription { + remoteAddress: { port: number; host: string }; + //The complete local address(ex. localhost:1234) + localAddress: { port: number; host: string } | string; + /** + * @deprecated Use privacy instead + */ + public?: boolean; + privacy?: string; + // If protocol is not provided it is assumed to be http, regardless of the localAddress. + protocol?: string; + } + + export interface Tunnel extends TunnelDescription { + // Implementers of Tunnel should fire onDidDispose when dispose is called. + onDidDispose: Event; + dispose(): void | Thenable; + } + + /** + * Used as part of the ResolverResult if the extension has any candidate, + * published, or forwarded ports. + */ + export interface TunnelInformation { + /** + * Tunnels that are detected by the extension. The remotePort is used for display purposes. + * The localAddress should be the complete local address (ex. localhost:1234) for connecting to the port. Tunnels provided through + * detected are read-only from the forwarded ports UI. + */ + environmentTunnels?: TunnelDescription[]; + + tunnelFeatures?: { + elevation: boolean; + /** + * One of the options must have the ID "private". + */ + privacyOptions: TunnelPrivacy[]; + /** + * Defaults to true for backwards compatibility. + */ + protocol?: boolean; + }; + } + + export interface TunnelCreationOptions { + /** + * True when the local operating system will require elevation to use the requested local port. + */ + elevationRequired?: boolean; + } + + export enum CandidatePortSource { + None = 0, + Process = 1, + Output = 2, + Hybrid = 3 + } + + export type ResolverResult = (ResolvedAuthority | ManagedResolvedAuthority) & ResolvedOptions & TunnelInformation; + + export class RemoteAuthorityResolverError extends Error { + static NotAvailable(message?: string, handled?: boolean): RemoteAuthorityResolverError; + static TemporarilyNotAvailable(message?: string): RemoteAuthorityResolverError; + + constructor(message?: string); + } + + /** + * An ExecServer allows spawning processes on a remote machine. An ExecServer is provided by resolvers. It can be + * acquired by `workspace.getRemoteExecServer` or from the context when in a resolver (`RemoteAuthorityResolverContext.execServer`). + */ + export interface ExecServer { + /** + * Spawns a given subprocess with the given command and arguments. + * @param command The command to execute. + * @param args The arguments to pass to the command. + * @param options Additional options for the spawned process. + * @returns A promise that gives access to the process' stdin, stdout and stderr streams, as well as the process' exit code. + */ + spawn(command: string, args: string[], options?: ExecServerSpawnOptions): Thenable; + + /** + * Spawns an connector that allows to start a remote server. It is assumed the command starts a Code CLI. Additional + * arguments will be passed to the connector. + * @param command The command to execute. It is assumed the command spawns a Code CLI executable. + * @param args The arguments to pass to the connector + * @param options Additional options for the spawned process. + * @returns A promise that gives access to the spawned {@link RemoteServerConnector}. It also provides a stream to which standard + * log messages are written. + */ + spawnRemoteServerConnector?(command: string, args: string[], options?: ExecServerSpawnOptions): Thenable; + + /** + * Downloads the CLI executable of the desired platform and quality and pipes it to the + * provided process' stdin. + * @param buildTarget The CLI build target to download. + * @param command The command to execute. The downloaded bits will be piped to the command's stdin. + * @param args The arguments to pass to the command. + * @param options Additional options for the spawned process. + * @returns A promise that resolves when the process exits with a {@link ProcessExit} object. + */ + downloadCliExecutable?(buildTarget: CliBuild, command: string, args: string[], options?: ExecServerSpawnOptions): Thenable; + + /** + * Gets the environment where the exec server is running. + * @returns A promise that resolves to an {@link ExecEnvironment} object. + */ + env(): Thenable; + + /** + * Kills a process with the given ID. + * + * @param processId process ID to kill. + */ + kill(processId: number): Thenable; + + /** + * Connects to the given TCP host/port on the remote. + * + * @param host The hostname or IP to connect to + * @param port The port number to connect to + * @returns a duplex stream, and a promise the resolves when both sides + * have closed. + */ + tcpConnect( + host: string, + port: number, + ): Thenable<{ stream: WriteStream & ReadStream; done: Thenable }>; + + /** + * Access to the file system of the remote. + */ + readonly fs: RemoteFileSystem; + } + + export type ProcessEnv = Record; + + export interface ExecServerSpawnOptions { + readonly env?: ProcessEnv; + readonly cwd?: string; + } + + export interface SpawnedCommand { + readonly stdin: WriteStream; + readonly stdout: ReadStream; + readonly stderr: ReadStream; + readonly onExit: Thenable; + } + + export interface RemoteServerConnector { + readonly logs: ReadStream; + readonly onExit: Thenable; + /** + * Connect to a new code server, returning a stream that can be used to communicate with it. + * @param params The parameters for the code server. + * @returns A promise that resolves to a {@link ManagedMessagePassing} object that can be used with a resolver + */ + connect(params: ServeParams): Thenable; + } + + export interface ProcessExit { + readonly status: number; + readonly message?: string; + } + + export interface ReadStream { + readonly onDidReceiveMessage: Event; + readonly onEnd: Thenable; + } + + export interface WriteStream { + write(data: Uint8Array): void; + end(): void; + } + + export interface ServeParams { + readonly socketId: number; + readonly commit?: string; + readonly quality: string; + readonly extensions: string[]; + /** Whether server traffic should be compressed. */ + readonly compress?: boolean; + /** Optional explicit connection token for the server. */ + readonly connectionToken?: string; + } + + export interface CliBuild { + readonly quality: string; + /** 'LinuxAlpineX64' | 'LinuxAlpineARM64', 'LinuxX64' | 'LinuxARM64' | 'LinuxARM32' | 'DarwinX64' | 'DarwinARM64' | 'WindowsX64' | 'WindowsX86' | 'WindowsARM64' */ + readonly buildTarget: string; + readonly commit: string; + } + + export interface ExecEnvironment { + readonly env: ProcessEnv; + /** 'darwin' | 'linux' | 'win32' */ + readonly osPlatform: string; + /** uname.version or windows version number, undefined if it could not be read. */ + readonly osRelease?: string; + } + + export interface RemoteFileSystem { + /** + * Retrieve metadata about a file. + * + * @param path The path of the file to retrieve metadata about. + * @returns The file metadata about the file. + * @throws an exception when `path` doesn't exist. + */ + stat(path: string): Thenable; + + /** + * Recursively creates the given directory on the remote. + * + * @param path The path of the folder to create + * @throws an exception when `path` is a file, or other i/o operations happen + */ + mkdirp(path: string): Thenable; + + /** + * Recursively deletes the given path on the remote. + * + * @param path The path of the file or folder to delete. + * @throws if an i/o error happens during removal. It does not throw if + * the path already does not exist. + */ + rm(path: string): Thenable; + + /** + * Reads the given file from the remote. + * + * @param path The path of the file to read. + * @throws if the path doesn't exist or can't be accessed + * @returns a readable stream of the file data + */ + read(path: string): Thenable; + + /** + * Writes the given file on the remote. Truncates the file if it exists. + * + * @param path The path of the file to write. + * @throws if the path can't be accessed + * @returns a writable `stream` that accepts data, and a `done` promise that + * will resolve after `stream.end()` is called once the write is complete. + */ + write(path: string): Thenable<{ stream: WriteStream; done: Thenable }>; + + /** + * Connects to the given unix socket or named pipe on the remote. + * + * @param path The path of the unix socket or named pipe + * @throws if the path can't be accessed + * @returns a duplex stream, and a promise the resolves when both sides + * have closed. + */ + connect(path: string): Thenable<{ stream: WriteStream & ReadStream; done: Thenable }>; + + /** + * Renames the file. + * + * @param fromPath The existing file path. + * @param toPath The new file path. + * @throws if the original path doesn't exist, or the toPath can't be accessed + */ + rename(fromPath: string, toPath: string): Thenable; + + /** + * Reads the contents of a directory. + * + * @param path The path of the folder to read. + * @throws if the folder doesn't exist + * @returns a list of directory entries + */ + readdir(path: string): Thenable; + } + + export interface DirectoryEntry { + /** + * The type of the file, e.g. is a regular file, a directory, or symbolic link + * to a file. + * + * *Note:* This value might be a bitmask, e.g. `FileType.File | FileType.SymbolicLink`. + */ + type: FileType; + + /** + * Non-absolute name of the file in the directory. + */ + name: string; + } + + export interface RemoteAuthorityResolver { + /** + * Resolve the authority part of the current opened `vscode-remote://` URI. + * + * This method will be invoked once during the startup of the editor and again each time + * the editor detects a disconnection. + * + * @param authority The authority part of the current opened `vscode-remote://` URI. + * @param context A context indicating if this is the first call or a subsequent call. + */ + resolve(authority: string, context: RemoteAuthorityResolverContext): ResolverResult | Thenable; + + /** + * Resolves an exec server interface for the authority. Called if an + * authority is a midpoint in a transit to the desired remote. + * + * @param authority The authority part of the current opened `vscode-remote://` URI. + * @returns The exec server interface, as defined in a contract between extensions. + */ + resolveExecServer?(remoteAuthority: string, context: RemoteAuthorityResolverContext): ExecServer | Thenable; + + /** + * Get the canonical URI (if applicable) for a `vscode-remote://` URI. + * + * @returns The canonical URI or undefined if the uri is already canonical. + */ + getCanonicalURI?(uri: Uri): ProviderResult; + + /** + * Can be optionally implemented if the extension can forward ports better than the core. + * When not implemented, the core will use its default forwarding logic. + * When implemented, the core will use this to forward ports. + * + * To enable the "Change Local Port" action on forwarded ports, make sure to set the `localAddress` of + * the returned `Tunnel` to a `{ port: number, host: string; }` and not a string. + */ + tunnelFactory?: (tunnelOptions: TunnelOptions, tunnelCreationOptions: TunnelCreationOptions) => Thenable | undefined; + + /**p + * Provides filtering for candidate ports. + */ + showCandidatePort?: (host: string, port: number, detail: string) => Thenable; + + /** + * @deprecated Return tunnelFeatures as part of the resolver result in tunnelInformation. + */ + tunnelFeatures?: { + elevation: boolean; + public: boolean; + privacyOptions: TunnelPrivacy[]; + }; + + candidatePortSource?: CandidatePortSource; + } + + export interface ResourceLabelFormatter { + scheme: string; + authority?: string; + formatting: ResourceLabelFormatting; + } + + export interface ResourceLabelFormatting { + label: string; // myLabel:/${path} + // For historic reasons we use an or string here. Once we finalize this API we should start using enums instead and adopt it in extensions. + // eslint-disable-next-line local/vscode-dts-literal-or-types, local/vscode-dts-string-type-literals + separator: '/' | '\\' | ''; + tildify?: boolean; + normalizeDriveLetter?: boolean; + workspaceSuffix?: string; + workspaceTooltip?: string; + authorityPrefix?: string; + stripPathStartingSeparator?: boolean; + } + + export namespace workspace { + export function registerRemoteAuthorityResolver(authorityPrefix: string, resolver: RemoteAuthorityResolver): Disposable; + export function registerResourceLabelFormatter(formatter: ResourceLabelFormatter): Disposable; + export function getRemoteExecServer(authority: string): Thenable; + } + + export namespace env { + + /** + * The authority part of the current opened `vscode-remote://` URI. + * Defined by extensions, e.g. `ssh-remote+${host}` for remotes using a secure shell. + * + * *Note* that the value is `undefined` when there is no remote extension host but that the + * value is defined in all extension hosts (local and remote) in case a remote extension host + * exists. Use {@link Extension.extensionKind} to know if + * a specific extension runs remote or not. + */ + export const remoteAuthority: string | undefined; + + } +} diff --git a/packages/sagemaker-ssh-kiro/webpack.config.js b/packages/sagemaker-ssh-kiro/webpack.config.js new file mode 100644 index 00000000000..20d14ffc63f --- /dev/null +++ b/packages/sagemaker-ssh-kiro/webpack.config.js @@ -0,0 +1,40 @@ +/*! + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + * + * This file contains code originally from https://github.com/jeanp413/open-remote-ssh + * Original copyright: (c) 2022 + * Originally released under MIT license + */ + +'use strict' + +const baseConfigFactory = require('../webpack.base.config') +const webpack = require('webpack') + +module.exports = (env, argv) => { + const baseConfig = baseConfigFactory(env, argv) + + const config = { + ...baseConfig, + entry: { + extension: './src/extension.ts', + }, + externals: { + ...baseConfig.externals, + bufferutil: 'bufferutil', + 'utf-8-validate': 'utf-8-validate', + }, + plugins: [ + ...(baseConfig.plugins || []), + new webpack.IgnorePlugin({ + resourceRegExp: /crypto\/build\/Release\/sshcrypto\.node$/, + }), + new webpack.IgnorePlugin({ + resourceRegExp: /cpu-features/, + }), + ], + } + + return config +} diff --git a/packages/toolkit/.changes/next-release/Feature-17b786cd-7705-4696-add5-21558550f99b.json b/packages/toolkit/.changes/next-release/Feature-17b786cd-7705-4696-add5-21558550f99b.json new file mode 100644 index 00000000000..56efbf44f34 --- /dev/null +++ b/packages/toolkit/.changes/next-release/Feature-17b786cd-7705-4696-add5-21558550f99b.json @@ -0,0 +1,4 @@ +{ + "type": "Feature", + "description": "AI assistants are able to receive SageMaker Unified Studio context when connected to a Space" +} diff --git a/packages/toolkit/.changes/next-release/Feature-a04fc1f1-b60a-4d3b-ad39-ef4067f9483e.json b/packages/toolkit/.changes/next-release/Feature-a04fc1f1-b60a-4d3b-ad39-ef4067f9483e.json new file mode 100644 index 00000000000..2a2356049aa --- /dev/null +++ b/packages/toolkit/.changes/next-release/Feature-a04fc1f1-b60a-4d3b-ad39-ef4067f9483e.json @@ -0,0 +1,4 @@ +{ + "type": "Feature", + "description": "SageMaker Studio users can now connect to Spaces from Kiro IDE" +} diff --git a/packages/toolkit/package.json b/packages/toolkit/package.json index 98ad0c00baf..aa3d483e9af 100644 --- a/packages/toolkit/package.json +++ b/packages/toolkit/package.json @@ -58,7 +58,7 @@ }, "scripts": { "vscode:prepublish": "npm run clean && npm run buildScripts && webpack --mode production", - "buildScripts": "npm run generateNonCodeFiles && npm run copyFiles && npm run generateIcons && npm run generateSettings && npm run generateConfigurationAttributes && tsc -p ./ --noEmit", + "buildScripts": "npm run build:sagemaker-ssh-kiro && npm run generateNonCodeFiles && npm run copyFiles && npm run generateIcons && npm run generateSettings && npm run generateConfigurationAttributes && tsc -p ./ --noEmit", "generateConfigurationAttributes": "ts-node ./scripts/build/generateConfigurationAttributes.ts", "generateNonCodeFiles": "ts-node ../../scripts/generateNonCodeFiles.ts", "copyFiles": "ts-node ./scripts/build/copyFiles.ts", @@ -75,6 +75,7 @@ "testE2ECfn": "npm run testCompile && c8 --allowExternal ts-node ../core/scripts/test/launchTest.ts e2e dist/test/e2e/cloudformation/index.js ../core/dist/src/testFixtures/workspaceFolder", "testInteg": "npm run testCompile && c8 --allowExternal ts-node ../core/scripts/test/launchTest.ts integration dist/test/integ/index.js ../core/dist/src/testFixtures/workspaceFolder", "package": "ts-node ../../scripts/package.ts", + "build:sagemaker-ssh-kiro": "npm run package -w sagemaker-ssh-kiro", "lint": "true", "createRelease": "ts-node ../../scripts/createRelease.ts", "newChange": "ts-node ../../scripts/newChange.ts", diff --git a/packages/toolkit/scripts/build/copyFiles.ts b/packages/toolkit/scripts/build/copyFiles.ts index 782c16ddb50..63bc9b901ad 100644 --- a/packages/toolkit/scripts/build/copyFiles.ts +++ b/packages/toolkit/scripts/build/copyFiles.ts @@ -129,9 +129,31 @@ function copy(task: CopyTask): void { throw new Error(`Copy "${src}" to "${dst}" failed: ${error instanceof Error ? error.message : error}`) } } + +function copySageMakerSshKiroExtension(): void { + const searchDir = path.resolve(projectRoot, '../../') + const destinationDir = path.resolve(outRoot, '../resources') + + fs.mkdirSync(destinationDir, { recursive: true }) + + const files = fs + .readdirSync(searchDir) + .filter((file) => file.startsWith('sagemaker-ssh-kiro') && file.endsWith('.vsix')) + + if (files.length !== 1) { + throw new Error(`Expected 1 sagemaker-ssh-kiro VSIX file but found ${files.length}`) + } + + const sourceFile = path.join(searchDir, files[0]) + const destinationFile = path.join(destinationDir, files[0]) + + fs.copyFileSync(sourceFile, destinationFile) +} + function main() { try { tasks.map(copy) + copySageMakerSshKiroExtension() } catch (error) { console.error('`copyFiles.ts` failed') console.error(error) From b13ad47f6d888690668df1ff390b08191cc85e40 Mon Sep 17 00:00:00 2001 From: Keen Wilson <40321520+keenwilson@users.noreply.github.com> Date: Tue, 24 Feb 2026 10:27:53 -0800 Subject: [PATCH 28/51] fix(lambda): add confirmation prompt before initiating console login (#8598) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Problem When users click “Open in VS Code” from the Lambda console and the request reaches Toolkit without an active connection or with mismatched credentials, Toolkit currently falls back to console credential login (`aws login`) immediately. This triggers a browser-based authentication flow without prior notice. ## Solution This change adds a modal confirmation dialog before invoking `aws login` in these cases. The dialog explains that Toolkit will sign in using browser-based authentication and states the required prerequisites. Users must explicitly choose to continue before the console login flow starts. The prompt: - Explains that signing in is required to open the Lambda function locally - Informs users that browser-based authentication will occur - States the AWS CLI and permission prerequisites - Allows users to explicitly choose whether to proceed This makes the flow intentional, reduces surprise browser redirects, and helps distinguish between informed cancellation and setup issues. ## Screenshots Screenshot 2026-02-23 at 3 53 57 PM --- - Treat all work as PUBLIC. Private `feature/x` branches will not be squash-merged at release time. - Your code changes must meet the guidelines in [CONTRIBUTING.md](https://github.com/aws/aws-toolkit-vscode/blob/master/CONTRIBUTING.md#guidelines). - License: I confirm that my contribution is made under the terms of the Apache 2.0 license. --- .../core/src/lambda/commands/editLambda.ts | 43 ++++++++- packages/core/src/lambda/uriHandlers.ts | 18 +++- .../test/lambda/commands/editLambda.test.ts | 87 ++++++++++++++++++- .../core/src/test/lambda/uriHandlers.test.ts | 34 ++++---- ...-34390739-2300-4d54-a325-4f16ccc29005.json | 4 + 5 files changed, 162 insertions(+), 24 deletions(-) create mode 100644 packages/toolkit/.changes/next-release/Bug Fix-34390739-2300-4d54-a325-4f16ccc29005.json diff --git a/packages/core/src/lambda/commands/editLambda.ts b/packages/core/src/lambda/commands/editLambda.ts index 83552999a5c..683b658f94a 100644 --- a/packages/core/src/lambda/commands/editLambda.ts +++ b/packages/core/src/lambda/commands/editLambda.ts @@ -19,6 +19,7 @@ import { import { showConfirmationMessage } from '../../shared/utilities/messages' import fs from '../../shared/fs/fs' import globals from '../../shared/extensionGlobals' +import * as localizedText from '../../shared/localizedText' import { LambdaFunctionNodeDecorationProvider } from '../explorer/lambdaFunctionNodeDecorationProvider' import path from 'path' import { telemetry } from '../../shared/telemetry/telemetry' @@ -229,13 +230,37 @@ export async function editLambda(lambda: LambdaFunction, source?: 'workspace' | }) } +export async function promptConsoleLogin(): Promise { + const continueBtn = localizedText.continueText + const useOtherMethodBtn = localize('AWS.lambda.open.useOtherMethod', 'Use a different sign-in method') + const response = await vscode.window.showInformationMessage( + localize( + 'AWS.lambda.open.consoleLoginPrompt', + 'To open Lambda function locally, Toolkit will sign you in using browser-based authentication (aws login).\n\n' + + 'Requires AWS CLI v2.32.0+ and specific IAM permissions for programmatic access to AWS through the AWS Sign-in service.\n\n' + + 'Toolkit can help install or update the AWS CLI if needed.\n\n' + + 'Continue?' + ), + { modal: true }, // need to take action before proceeding + continueBtn, + useOtherMethodBtn + ) + + if (response === useOtherMethodBtn) { + await vscode.commands.executeCommand('aws.toolkit.auth.manageConnections') + return false + } + + return response === continueBtn +} + /** * Retrieves Lambda function configuration with automatic fallback to console credentials. * Handles credential mismatches (ResourceNotFoundException, AccessDeniedException). * * Three scenarios: - * 1. No connection exists → Set up console first, try once, if it fails don't retry (because we already used console) - * 2. Connection exists → Try it first, if it fails with credential error, fall back to console + * 1. No connection exists → Prompt user, set up console first, try once, if it fails don't retry (because we already used console) + * 2. Connection exists → Try it first, if it fails with credential error, prompt and fall back to console * 3. Connection exists and fails → Retry with console, if that fails, throw (no second retry) * * @param name - Lambda function name @@ -247,8 +272,12 @@ export async function getFunctionWithFallback(name: string, region: string): Pro // Tracks if we've already attempted console credentials let calledConsoleLogin = false - // If no connection, create console connection before first attempt + // If no connection, prompt and create console connection before first attempt if (!activeConnection) { + const proceed = await promptConsoleLogin() + if (!proceed) { + throw new ToolkitError('Console login not performed (no active connection)', { cancelled: true }) + } await setupConsoleConnection(name, region) calledConsoleLogin = true } @@ -273,7 +302,13 @@ export async function getFunctionWithFallback(name: string, region: string): Pro // Skip retry if we just created console connection - error is not due to credential mismatch throw ToolkitError.chain(error, 'Failed to get Lambda function with console credentials. Retry skipped.') } else { - // Retry once with console credentials + // Prompt and retry once with console credentials + const proceed = await promptConsoleLogin() + if (!proceed) { + throw new ToolkitError('Console login not performed (mismatched credentials)', { + cancelled: true, + }) + } await setupConsoleConnection(name, region) return await getFunctionWithCredentials(region, name) } diff --git a/packages/core/src/lambda/uriHandlers.ts b/packages/core/src/lambda/uriHandlers.ts index ee80928b703..455499c5576 100644 --- a/packages/core/src/lambda/uriHandlers.ts +++ b/packages/core/src/lambda/uriHandlers.ts @@ -12,16 +12,26 @@ import { showConfirmationMessage } from '../shared/utilities/messages' import globals from '../shared/extensionGlobals' import { telemetry } from '../shared/telemetry/telemetry' import { ToolkitError, isUserCancelledError } from '../shared/errors' +import { getLogger } from '../shared/logger/logger' const localize = nls.loadMessageBundle() -export function handleLambdaUriError(e: unknown, functionName: string, region: string): never { +export function handleLambdaUriError(e: unknown, functionName: string, region: string): void { // Classify cancellations for telemetry metrics - const message = e instanceof Error ? e.message.toLowerCase() : '' - const isCancellation = isUserCancelledError(e) || message.includes('canceled') || message.includes('cancelled') + const message = e instanceof Error ? e.message : '' + const isCancellation = + isUserCancelledError(e) || + message.toLowerCase().includes('canceled') || + message.toLowerCase().includes('cancelled') if (isCancellation) { - throw ToolkitError.chain(e, 'User cancelled operation', { cancelled: true }) + getLogger().info(`Opening Lambda function cancelled: ${message}`) + // Record cancellation in telemetry but don't pop-up error to user + telemetry.record({ + result: 'Cancelled', + reasonDesc: message, + }) + return } // Handle other errors diff --git a/packages/core/src/test/lambda/commands/editLambda.test.ts b/packages/core/src/test/lambda/commands/editLambda.test.ts index ec9bbffb97a..964d38ae6f8 100644 --- a/packages/core/src/test/lambda/commands/editLambda.test.ts +++ b/packages/core/src/test/lambda/commands/editLambda.test.ts @@ -15,6 +15,7 @@ import { deleteFilesInFolder, overwriteChangesForEdit, getFunctionWithFallback, + promptConsoleLogin, } from '../../../lambda/commands/editLambda' import { LambdaFunction } from '../../../lambda/commands/uploadLambda' import * as downloadLambda from '../../../lambda/commands/downloadLambda' @@ -28,6 +29,8 @@ import globals from '../../../shared/extensionGlobals' import { lambdaTempPath } from '../../../lambda/utils' import * as lambdaClient from '../../../shared/clients/lambdaClient' import * as authUtils from '../../../auth/utils' +import { getTestWindow } from '../../shared/vscode/window' +import { ToolkitError } from '../../../shared/errors' describe('editLambda', function () { let mockLambda: LambdaFunction @@ -309,6 +312,34 @@ describe('editLambda', function () { }) }) +describe('promptConsoleLogin', function () { + it('returns true when user selects Continue', async function () { + getTestWindow().onDidShowMessage((m) => m.selectItem('Continue')) + + const result = await promptConsoleLogin() + + assert.strictEqual(result, true) + }) + + it('returns false when user closes dialog', async function () { + getTestWindow().onDidShowMessage((m) => m.close()) + + const result = await promptConsoleLogin() + + assert.strictEqual(result, false) + }) + + it('returns false and opens auth manager when user selects different sign-in method', async function () { + const executeCommandStub = sinon.stub(vscode.commands, 'executeCommand').resolves() + getTestWindow().onDidShowMessage((m) => m.selectItem('Use a different sign-in method')) + + const result = await promptConsoleLogin() + + assert.strictEqual(result, false) + assert(executeCommandStub.calledWith('aws.toolkit.auth.manageConnections')) + }) +}) + describe('getFunctionWithFallback', function () { let getFunctionWithCredentialsStub: sinon.SinonStub let setupConsoleConnectionStub: sinon.SinonStub @@ -343,10 +374,11 @@ describe('getFunctionWithFallback', function () { assert(setupConsoleConnectionStub.notCalled) }) - it('creates console connection when no active connection exists', async function () { + it('prompts user and creates console connection when no active connection exists', async function () { getFunctionWithCredentialsStub.resolves(mockFunction) getIAMConnectionStub.resolves(undefined) setupConsoleConnectionStub.resolves() + getTestWindow().onDidShowMessage((m) => m.selectItem('Continue')) const result = await getFunctionWithFallback('test-function', 'us-east-1') @@ -355,12 +387,29 @@ describe('getFunctionWithFallback', function () { assert(setupConsoleConnectionStub.calledWith('test-function', 'us-east-1')) }) + it('throws error when user opts out of console login with no active connection', async function () { + getIAMConnectionStub.resolves(undefined) + getTestWindow().onDidShowMessage((m) => m.close()) + + await assert.rejects( + () => getFunctionWithFallback('test-function', 'us-east-1'), + (err: ToolkitError) => { + assert.strictEqual(err.message, 'User opted out of console login despite no active connection') + assert.strictEqual(err.cancelled, true) + return true + } + ) + + assert(setupConsoleConnectionStub.notCalled) + }) + it('does not retry when console connection was just created and fails', async function () { const error = new Error('Console creds not working') error.name = 'Error' getFunctionWithCredentialsStub.rejects(error) getIAMConnectionStub.resolves(undefined) setupConsoleConnectionStub.resolves() + getTestWindow().onDidShowMessage((m) => m.selectItem('Continue')) await assert.rejects( () => getFunctionWithFallback('test-function', 'us-east-1'), @@ -372,6 +421,39 @@ describe('getFunctionWithFallback', function () { assert(showViewLogsMessageStub.notCalled) }) + it('prompts user before retrying with console credentials on ResourceNotFoundException', async function () { + const error = new Error('Function not found') + error.name = 'ResourceNotFoundException' + getFunctionWithCredentialsStub.onFirstCall().rejects(error) + getFunctionWithCredentialsStub.onSecondCall().resolves(mockFunction) + getIAMConnectionStub.resolves(mockConnection) + getTestWindow().onDidShowMessage((m) => m.selectItem('Continue')) + + const result = await getFunctionWithFallback('test-function', 'us-east-1') + + assert.strictEqual(result, mockFunction) + assert(setupConsoleConnectionStub.calledOnce) + }) + + it('throws error when user opts out of console login with mismatched credentials', async function () { + const error = new Error('Function not found') + error.name = 'ResourceNotFoundException' + getFunctionWithCredentialsStub.rejects(error) + getIAMConnectionStub.resolves(mockConnection) + getTestWindow().onDidShowMessage((m) => m.close()) + + await assert.rejects( + () => getFunctionWithFallback('test-function', 'us-east-1'), + (err: ToolkitError) => { + assert.strictEqual(err.message, 'User opted out of console login despite mismatched credentials') + assert.strictEqual(err.cancelled, true) + return true + } + ) + + assert(setupConsoleConnectionStub.notCalled) + }) + it('retries with console credentials on ResourceNotFoundException with existing connection', async function () { const error = new Error('Function not found') error.name = 'ResourceNotFoundException' @@ -384,6 +466,7 @@ describe('getFunctionWithFallback', function () { getCredentials: sinon.stub().resolves({ accountId: '123456789' }), } getIAMConnectionStub.resolves(mockConnection) + getTestWindow().onDidShowMessage((m) => m.selectItem('Continue')) const result = await getFunctionWithFallback('test-function', 'us-east-1') @@ -406,6 +489,7 @@ describe('getFunctionWithFallback', function () { getCredentials: sinon.stub().resolves({ accountId: '987654321' }), } getIAMConnectionStub.resolves(mockConnection) + getTestWindow().onDidShowMessage((m) => m.selectItem('Continue')) const result = await getFunctionWithFallback('test-function', 'us-east-2') @@ -420,6 +504,7 @@ describe('getFunctionWithFallback', function () { const setupError = new Error('Console setup failed') getIAMConnectionStub.resolves(undefined) setupConsoleConnectionStub.rejects(setupError) + getTestWindow().onDidShowMessage((m) => m.selectItem('Continue')) await assert.rejects( () => getFunctionWithFallback('test-function', 'us-east-1'), diff --git a/packages/core/src/test/lambda/uriHandlers.test.ts b/packages/core/src/test/lambda/uriHandlers.test.ts index 2131e3d057c..cbf1331607a 100644 --- a/packages/core/src/test/lambda/uriHandlers.test.ts +++ b/packages/core/src/test/lambda/uriHandlers.test.ts @@ -9,6 +9,7 @@ import { handleLambdaUriError, parseOpenParams } from '../../lambda/uriHandlers' import { globals } from '../../shared' import { ToolkitError } from '../../shared/errors' import { CancellationError } from '../../shared/utilities/timeoutUtils' +import { assertTelemetry } from '../../test/testUtil' describe('Lambda URI Handler', function () { describe('load-function', function () { @@ -37,28 +38,31 @@ describe('Lambda URI Handler', function () { }) describe('handleLambdaUriError', function () { - it('throws cancelled error for CancellationError', function () { + it('records cancelled result for CancellationError', function () { const error = new CancellationError('user') - assert.throws( - () => handleLambdaUriError(error, 'test-fn', 'us-east-1'), - (e: ToolkitError) => e.cancelled === true - ) + handleLambdaUriError(error, 'test-fn', 'us-east-1') + assertTelemetry('lambda_uriHandler', { + result: 'Cancelled', + reasonDesc: 'User cancelled', + }) }) - it('throws cancelled error for "canceled" message', function () { + it('records cancelled result for "canceled" message', function () { const error = new Error('Canceled') // vscode reload window - assert.throws( - () => handleLambdaUriError(error, 'test-fn', 'us-east-1'), - (e: ToolkitError) => e.cancelled === true - ) + handleLambdaUriError(error, 'test-fn', 'us-east-1') + assertTelemetry('lambda_uriHandler', { + result: 'Cancelled', + reasonDesc: 'Canceled', + }) }) - it('throws cancelled error for "cancelled" message', function () { + it('records cancelled result for "cancelled" message', function () { const error = new Error('Timeout token cancelled') - assert.throws( - () => handleLambdaUriError(error, 'test-fn', 'us-east-1'), - (e: ToolkitError) => e.cancelled === true - ) + handleLambdaUriError(error, 'test-fn', 'us-east-1') + assertTelemetry('lambda_uriHandler', { + result: 'Cancelled', + reasonDesc: 'Timeout token cancelled', + }) }) it('throws non-cancelled error for other errors', function () { diff --git a/packages/toolkit/.changes/next-release/Bug Fix-34390739-2300-4d54-a325-4f16ccc29005.json b/packages/toolkit/.changes/next-release/Bug Fix-34390739-2300-4d54-a325-4f16ccc29005.json new file mode 100644 index 00000000000..a50eca86b58 --- /dev/null +++ b/packages/toolkit/.changes/next-release/Bug Fix-34390739-2300-4d54-a325-4f16ccc29005.json @@ -0,0 +1,4 @@ +{ + "type": "Bug Fix", + "description": "Adds a confirmation prompt before initiating console credential login (aws login) when opening a Lambda function in VS Code. Improves clarity around prerequisites and reduces unexpected login cancellations." +} From c99c1446bc1f7ac05ba82c47cd95cf9d03afcdef Mon Sep 17 00:00:00 2001 From: David <60020664+dhasani23@users.noreply.github.com> Date: Tue, 24 Feb 2026 16:16:48 -0800 Subject: [PATCH 29/51] fix(amazonq): add info banner pointing to ATX (#8597) ## Problem ## Solution --- - Treat all work as PUBLIC. Private `feature/x` branches will not be squash-merged at release time. - Your code changes must meet the guidelines in [CONTRIBUTING.md](https://github.com/aws/aws-toolkit-vscode/blob/master/CONTRIBUTING.md#guidelines). - License: I confirm that my contribution is made under the terms of the Apache 2.0 license. Co-authored-by: David Hasani Co-authored-by: Laxman Reddy <141967714+laileni-aws@users.noreply.github.com> --- packages/core/src/amazonq/webview/ui/tabs/constants.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core/src/amazonq/webview/ui/tabs/constants.ts b/packages/core/src/amazonq/webview/ui/tabs/constants.ts index 0872b829a6a..aeafa3d23c9 100644 --- a/packages/core/src/amazonq/webview/ui/tabs/constants.ts +++ b/packages/core/src/amazonq/webview/ui/tabs/constants.ts @@ -51,7 +51,7 @@ export const TabTypeDataMap: Record, TabTypeData> = title: 'Q - Code Transformation', placeholder: 'Open a new tab to chat with Q', 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).**', + 'Welcome to Code Transformation!\n\n> **ℹ️ AWS Transform custom now available for Java upgrades. Agentic AI that handles version upgrades, SDK migration, and more, and improves with every execution. [Learn more](https://aws.amazon.com/transform/custom/)**', }, review: { title: 'Q - Review', From 3aa2f34b4783f220396a22279c2b2ec719fd6691 Mon Sep 17 00:00:00 2001 From: Ziwei Ba Date: Tue, 24 Feb 2026 17:06:45 -0800 Subject: [PATCH 30/51] telemetry(smus): Added telemetry for agent context and made agents.md prompt a warning (#8610) ## Problem The SMUS agent context prompt was displayed as an information notification that users were easily overlooking or ignoring. Additionally, there was no telemetry to track how users responded to the prompt (accepted, declined, or dismissed), making it impossible to measure engagement. ## Solution Changed the prompt from showInformationMessage to showWarningMessage for higher visibility. Added telemetry using smus_acceptAgentsNotification to track whether users accept, decline, or dismiss the prompt. --- - Treat all work as PUBLIC. Private `feature/x` branches will not be squash-merged at release time. - Your code changes must meet the guidelines in [CONTRIBUTING.md](https://github.com/aws/aws-toolkit-vscode/blob/master/CONTRIBUTING.md#guidelines). - License: I confirm that my contribution is made under the terms of the Apache 2.0 license. Co-authored-by: Ziwei Ba --- .../bootstrapAgentContext.ts | 45 ++++++++++++++++--- .../src/shared/telemetry/vscodeTelemetry.json | 24 ++++++++++ 2 files changed, 64 insertions(+), 5 deletions(-) diff --git a/packages/core/src/sagemakerunifiedstudio/bootstrapAgentContext.ts b/packages/core/src/sagemakerunifiedstudio/bootstrapAgentContext.ts index 63df3bcfce7..2b7e3d90172 100644 --- a/packages/core/src/sagemakerunifiedstudio/bootstrapAgentContext.ts +++ b/packages/core/src/sagemakerunifiedstudio/bootstrapAgentContext.ts @@ -7,15 +7,43 @@ import * as path from 'path' import * as vscode from 'vscode' import fs from '../shared/fs/fs' import { getLogger } from '../shared/logger/logger' +import { telemetry } from '../shared/telemetry/telemetry' import { agentsFile, contextFile, importStatement, notificationMessage, promptMessage } from './shared/constants' +import { extractAccountIdFromResourceMetadata } from './shared/smusUtils' +import { getResourceMetadata } from './shared/utils/resourceMetadataUtils' function notifyContextUpdated(): void { void vscode.window.showInformationMessage(notificationMessage) } -async function promptUserToAddSmusContext(): Promise { - const choice = await vscode.window.showInformationMessage(promptMessage, 'Yes', 'No') - return choice === 'Yes' +async function promptUserToAddSmusContext(accountId: string, domainId: string | undefined): Promise { + return telemetry.toolkit_showNotification.run(async () => { + telemetry.record({ id: 'smusContextPrompt', component: 'editor', passive: true }) + const choice = await vscode.window.showWarningMessage(promptMessage, 'Yes', 'No') + await telemetry.smus_acceptAgentsNotification.run(async () => { + telemetry.record({ passive: true }) + if (choice === 'Yes') { + telemetry.record({ + smusAcceptAgentContextAction: 'accepted', + smusDomainId: domainId, + smusDomainAccountId: accountId, + }) + } else if (choice === 'No') { + telemetry.record({ + smusAcceptAgentContextAction: 'declined', + smusDomainId: domainId, + smusDomainAccountId: accountId, + }) + } else { + telemetry.record({ + smusAcceptAgentContextAction: 'dismissed', + smusDomainId: domainId, + smusDomainAccountId: accountId, + }) + } + }) + return choice === 'Yes' + }) } /** @@ -42,9 +70,15 @@ export async function createAgentsFile(ctx: vscode.ExtensionContext): Promise Date: Tue, 24 Feb 2026 17:06:56 -0800 Subject: [PATCH 31/51] fix(smus): Update SMUS context template with credentials provider uri for MCP servers (#8608) ## Problem Kiro struggles to troubleshoot credential issues when MCP server doesn't have the proper credentials environment variable, even though it's mentioned in the smus-context file. ## Solution Add a prompt to smus-context.md to include credentials provider uri in MCP server env block. --- - Treat all work as PUBLIC. Private `feature/x` branches will not be squash-merged at release time. - Your code changes must meet the guidelines in [CONTRIBUTING.md](https://github.com/aws/aws-toolkit-vscode/blob/master/CONTRIBUTING.md#guidelines). - License: I confirm that my contribution is made under the terms of the Apache 2.0 license. Co-authored-by: kzr-at-amazon --- .../core/resources/smus-context-template.md | 69 +++++++++++++------ 1 file changed, 49 insertions(+), 20 deletions(-) diff --git a/packages/core/resources/smus-context-template.md b/packages/core/resources/smus-context-template.md index a3e21950096..a9df7ae4d48 100644 --- a/packages/core/resources/smus-context-template.md +++ b/packages/core/resources/smus-context-template.md @@ -7,21 +7,25 @@ inclusion: always This workspace is running on an Amazon SageMaker Unified Studio Space. ## Environment -- Operating system: Ubuntu-based SageMaker Distribution -- User: sagemaker-user -- Home directory: /home/sagemaker-user -- AWS credentials are available via the container credentials provider (AWS_CONTAINER_CREDENTIALS_RELATIVE_URI) -- Do NOT hardcode AWS credentials; use the default credential chain (e.g., boto3.Session()) + +- Operating system: Ubuntu-based SageMaker Distribution +- User: sagemaker-user +- Home directory: /home/sagemaker-user +- AWS credentials are available via the container credentials provider (AWS_CONTAINER_CREDENTIALS_RELATIVE_URI) +- Do NOT hardcode AWS credentials; use the default credential chain (e.g., boto3.Session()) ## Project Info -- ~/README.md contains project-specific configuration such as connection names and available compute resources. -- ~/shared/README.md contains shared project data catalog and storage information. -Refer to these files when you need details about the project's connections, databases, or S3 paths. + +- ~/README.md contains project-specific configuration such as connection names and available compute resources. +- ~/shared/README.md contains shared project data catalog and storage information. + Refer to these files when you need details about the project's connections, databases, or S3 paths. ## Project Library (`sagemaker_studio`) + The `sagemaker_studio` package is pre-installed and provides access to project resources. ### Project + ```python from sagemaker_studio import Project project = Project() @@ -35,6 +39,7 @@ project.s3.root # project S3 root path ``` ### Connections + ```python project.connections # list all connections project.connection() # default IAM connection @@ -48,6 +53,7 @@ conn.create_client("glue") # boto3 client for specific service ``` ### Catalogs, Databases, and Tables + ```python catalog = project.connection().catalog() # default catalog catalog = project.connection().catalog("catalog_id") @@ -59,6 +65,7 @@ table.columns # list columns (name, type) ``` ### SQL Utilities + ```python from sagemaker_studio import sqlutils @@ -83,6 +90,7 @@ engine = sqlutils.get_engine(connection_name="project.redshift") ``` ### DataFrame Utilities + ```python from sagemaker_studio import dataframeutils import pandas as pd @@ -101,6 +109,7 @@ df = pd.read_catalog_table( ``` ### Spark Utilities + ```python from sagemaker_studio import sparkutils @@ -114,19 +123,39 @@ df = spark.read.format("jdbc").options(**options).option("dbtable", "my_table"). ``` ## Compute Options -- **Local Python**: Runs directly on the Space instance. Use for single-machine Python, ML, and AI workloads. -- **Apache Spark (AWS Glue / Amazon EMR)**: Use `%%pyspark`, `%%scalaspark`, or `%%sql` cell magics in notebooks. Default Spark connection is `project.spark.compatibility`. -- **SQL (Athena)**: Use `%%sql project.athena` for Trino SQL queries via Amazon Athena. -- **SQL (Redshift)**: Use `%%sql project.redshift` if a Redshift connection is available. + +- **Local Python**: Runs directly on the Space instance. Use for single-machine Python, ML, and AI workloads. +- **Apache Spark (AWS Glue / Amazon EMR)**: Use `%%pyspark`, `%%scalaspark`, or `%%sql` cell magics in notebooks. Default Spark connection is `project.spark.compatibility`. +- **SQL (Athena)**: Use `%%sql project.athena` for Trino SQL queries via Amazon Athena. +- **SQL (Redshift)**: Use `%%sql project.redshift` if a Redshift connection is available. ## Code Patterns -- Use `sagemaker_studio.Project()` for project-aware sessions and resource discovery -- Reference data using S3 URIs in s3://bucket/prefix format -- Write Spark DataFrames to the project catalog: `df.write.saveAsTable(f"{database}.table_name", format='parquet', mode='overwrite')` -- SQL query results are available as DataFrames in subsequent cells via the `_` variable -- Use `sqlutils.sql()` for programmatic SQL execution against any connection -- Use `pd.read_catalog_table()` / `df.to_catalog_table()` for pandas catalog I/O + +- Use `sagemaker_studio.Project()` for project-aware sessions and resource discovery +- Reference data using S3 URIs in s3://bucket/prefix format +- Write Spark DataFrames to the project catalog: `df.write.saveAsTable(f"{database}.table_name", format='parquet', mode='overwrite')` +- SQL query results are available as DataFrames in subsequent cells via the `_` variable +- Use `sqlutils.sql()` for programmatic SQL execution against any connection +- Use `pd.read_catalog_table()` / `df.to_catalog_table()` for pandas catalog I/O ## MCP Server Configuration -- When configuring MCP servers, pass AWS credentials via environment variable expansion: - "AWS_CONTAINER_CREDENTIALS_RELATIVE_URI": "${AWS_CONTAINER_CREDENTIALS_RELATIVE_URI}" + +MCP servers in this environment may need AWS credentials forwarded from the container. If an MCP tool returns "Unable to locate credentials", add the `env` block to the affected server in MCP server config file: + +```json +{ + "mcpServers": { + "example-server": { + "command": "uvx", + "args": ["example-server@latest"], + "env": { + "AWS_CONTAINER_CREDENTIALS_RELATIVE_URI": "${AWS_CONTAINER_CREDENTIALS_RELATIVE_URI}" + }, + "disabled": false, + "autoApprove": [] + } + } +} +``` + +If you cannot edit the config directly, suggest the user add the `env` block to their MCP server entry in MCP server config. From 269fa58fee55c989d7c48d8ce6a73de19da2a938 Mon Sep 17 00:00:00 2001 From: Ziwei Ba Date: Wed, 25 Feb 2026 09:48:34 -0800 Subject: [PATCH 32/51] telemetry(smus): Emit metric when showing the agents.md prompt and on user choice (#8611) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Problem Previously, we emitted a metric when a user chooses Yes, No, or closes out of the prompt. However, sometimes the notification is buried or goes to the little notification bell. We also want to see if users will actually see the prompt. ## Solution - Changed existing agent context metric to two metrics: - smus_agentContextShowPrompt — emitted when the prompt is displayed - smus_agentContextUserChoice — emitted when the user accepts, declines, or dismisses the prompt - Both metrics include rich context: domain ID, account ID, region, project ID, project account ID, project region, space key, and auth mode. --- - Treat all work as PUBLIC. Private `feature/x` branches will not be squash-merged at release time. - Your code changes must meet the guidelines in [CONTRIBUTING.md](https://github.com/aws/aws-toolkit-vscode/blob/master/CONTRIBUTING.md#guidelines). - License: I confirm that my contribution is made under the terms of the Apache 2.0 license. --------- Co-authored-by: Ziwei Ba --- .../bootstrapAgentContext.ts | 61 +++++++++------- .../src/shared/telemetry/vscodeTelemetry.json | 70 +++++++++++++++++-- 2 files changed, 103 insertions(+), 28 deletions(-) diff --git a/packages/core/src/sagemakerunifiedstudio/bootstrapAgentContext.ts b/packages/core/src/sagemakerunifiedstudio/bootstrapAgentContext.ts index 2b7e3d90172..b90763994f4 100644 --- a/packages/core/src/sagemakerunifiedstudio/bootstrapAgentContext.ts +++ b/packages/core/src/sagemakerunifiedstudio/bootstrapAgentContext.ts @@ -11,37 +11,50 @@ import { telemetry } from '../shared/telemetry/telemetry' import { agentsFile, contextFile, importStatement, notificationMessage, promptMessage } from './shared/constants' import { extractAccountIdFromResourceMetadata } from './shared/smusUtils' import { getResourceMetadata } from './shared/utils/resourceMetadataUtils' +import { SmusAuthenticationProvider } from './auth/providers/smusAuthenticationProvider' function notifyContextUpdated(): void { void vscode.window.showInformationMessage(notificationMessage) } async function promptUserToAddSmusContext(accountId: string, domainId: string | undefined): Promise { - return telemetry.toolkit_showNotification.run(async () => { - telemetry.record({ id: 'smusContextPrompt', component: 'editor', passive: true }) + const metadata = getResourceMetadata() + const region = metadata?.AdditionalMetadata?.DataZoneDomainRegion + const projectId = metadata?.AdditionalMetadata?.DataZoneProjectId + const spaceKey = metadata?.SpaceName + const authProvider = SmusAuthenticationProvider.fromContext() + + // Extract project account ID and region from ResourceArn + // ARN format: arn:aws:sagemaker:region:account-id:space/domain-id/space-name + const arnParts = metadata?.ResourceArn?.split(':') + const projectRegion = arnParts?.[3] + const projectAccountId = arnParts?.[4] + + const commonFields = { + smusDomainId: domainId, + smusDomainAccountId: accountId, + smusDomainRegion: region, + smusProjectId: projectId, + smusProjectAccountId: projectAccountId, + smusProjectRegion: projectRegion, + smusSpaceKey: spaceKey, + smusAuthMode: authProvider.activeConnection?.type, + passive: true, + } + + telemetry.smus_agentContextShowPrompt.emit({ + ...commonFields, + }) + + return telemetry.smus_agentContextUserChoice.run(async () => { const choice = await vscode.window.showWarningMessage(promptMessage, 'Yes', 'No') - await telemetry.smus_acceptAgentsNotification.run(async () => { - telemetry.record({ passive: true }) - if (choice === 'Yes') { - telemetry.record({ - smusAcceptAgentContextAction: 'accepted', - smusDomainId: domainId, - smusDomainAccountId: accountId, - }) - } else if (choice === 'No') { - telemetry.record({ - smusAcceptAgentContextAction: 'declined', - smusDomainId: domainId, - smusDomainAccountId: accountId, - }) - } else { - telemetry.record({ - smusAcceptAgentContextAction: 'dismissed', - smusDomainId: domainId, - smusDomainAccountId: accountId, - }) - } - }) + if (choice === 'Yes') { + telemetry.record({ smusAcceptAgentContextAction: 'accepted', ...commonFields }) + } else if (choice === 'No') { + telemetry.record({ smusAcceptAgentContextAction: 'declined', ...commonFields }) + } else { + telemetry.record({ smusAcceptAgentContextAction: 'dismissed', ...commonFields }) + } return choice === 'Yes' }) } diff --git a/packages/core/src/shared/telemetry/vscodeTelemetry.json b/packages/core/src/shared/telemetry/vscodeTelemetry.json index 6522cfd4309..b10fe93257e 100644 --- a/packages/core/src/shared/telemetry/vscodeTelemetry.json +++ b/packages/core/src/shared/telemetry/vscodeTelemetry.json @@ -336,7 +336,7 @@ "name": "smusAcceptAgentContextAction", "type": "string", "allowedValues": ["accepted", "declined", "dismissed"], - "description": "Whether the user accepted the smus context added to AGENTS.md" + "description": "Whether the user accepted, declined or dismissed the smus context prompt to add to AGENTS.md" } ], "metrics": [ @@ -1776,8 +1776,8 @@ ] }, { - "name": "smus_acceptAgentsNotification", - "description": "Emitted whenever user accepts AGENTS.md file changes", + "name": "smus_agentContextShowPrompt", + "description": "Emitted whenever user is shown a prompt to add SMUS context to their AGENTS.md", "metadata": [ { "type": "smusDomainId", @@ -1787,9 +1787,71 @@ "type": "smusDomainAccountId", "required": false }, + { + "type": "smusDomainRegion", + "required": false + }, + { + "type": "smusProjectId", + "required": false + }, + { + "type": "smusProjectAccountId", + "required": false + }, + { + "type": "smusProjectRegion", + "required": false + }, + { + "type": "smusSpaceKey", + "required": false + }, + { + "type": "smusAuthMode", + "required": false + } + ] + }, + { + "name": "smus_agentContextUserChoice", + "description": "Emitted whenever user makes a choice on adding SMUS context to their AGENTS.md", + "metadata": [ + { + "type": "smusDomainId", + "required": false + }, + { + "type": "smusDomainAccountId", + "required": false + }, + { + "type": "smusDomainRegion", + "required": false + }, + { + "type": "smusProjectId", + "required": false + }, + { + "type": "smusProjectAccountId", + "required": false + }, + { + "type": "smusProjectRegion", + "required": false + }, + { + "type": "smusSpaceKey", + "required": false + }, + { + "type": "smusAuthMode", + "required": false + }, { "type": "smusAcceptAgentContextAction", - "required": true + "required": false } ] } From 2b3493ec62a5de7ccbb18472b1728f6bf0eeb1e5 Mon Sep 17 00:00:00 2001 From: Dylan Ross <90357952+dylanraws@users.noreply.github.com> Date: Wed, 25 Feb 2026 17:11:12 -0800 Subject: [PATCH 33/51] fix(sagemaker): Remove sagemaker-ssh-kiro VSIX from release artifacts (#8620) ## Problem The `sagemaker-ssh-kiro` extension VSIX is showing up in the release artifacts for prerelease, but we don't want it to show there. It's intended only to be embedded inside of the toolkit VSIX. ## Solution Remove the `sagemaker-ssh-kiro` extension VSIX from the top level file system during the GitHub Action workflow step which packages the VSIX files. --- - Treat all work as PUBLIC. Private `feature/x` branches will not be squash-merged at release time. - Your code changes must meet the guidelines in [CONTRIBUTING.md](https://github.com/aws/aws-toolkit-vscode/blob/master/CONTRIBUTING.md#guidelines). - License: I confirm that my contribution is made under the terms of the Apache 2.0 license. --- .github/workflows/release.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 60863f3b5a4..4ffa61d08be 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -60,6 +60,7 @@ jobs: npm run createRelease -w packages/toolkit -w packages/amazonq # Generate CHANGELOG.md npm run -w packages/toolkit package -- --feature "$FEAT_NAME" npm run -w packages/amazonq package -- --feature "$FEAT_NAME" + rm -f sagemaker-ssh-kiro-*.vsix # Remove standalone VSIX; it's already embedded inside toolkit - uses: actions/upload-artifact@v4 with: name: artifacts From 608b8904e8a0a5430abcbf39f17a70f301d27ae4 Mon Sep 17 00:00:00 2001 From: Ziwei Ba Date: Thu, 26 Feb 2026 10:13:14 -0800 Subject: [PATCH 34/51] telemetry(smus): Add result when emitting show prompt metric (#8618) ## Problem Did not include "Result: Success" in the emitted metric for showing the AGENTS.md prompt, which resulted in a warning when logging the metric. ## Solution Added this missing field. --- - Treat all work as PUBLIC. Private `feature/x` branches will not be squash-merged at release time. - Your code changes must meet the guidelines in [CONTRIBUTING.md](https://github.com/aws/aws-toolkit-vscode/blob/master/CONTRIBUTING.md#guidelines). - License: I confirm that my contribution is made under the terms of the Apache 2.0 license. Co-authored-by: Ziwei Ba Co-authored-by: Will Lo <96078566+Will-ShaoHua@users.noreply.github.com> --- .../core/src/sagemakerunifiedstudio/bootstrapAgentContext.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/core/src/sagemakerunifiedstudio/bootstrapAgentContext.ts b/packages/core/src/sagemakerunifiedstudio/bootstrapAgentContext.ts index b90763994f4..d9e266036ca 100644 --- a/packages/core/src/sagemakerunifiedstudio/bootstrapAgentContext.ts +++ b/packages/core/src/sagemakerunifiedstudio/bootstrapAgentContext.ts @@ -43,6 +43,7 @@ async function promptUserToAddSmusContext(accountId: string, domainId: string | } telemetry.smus_agentContextShowPrompt.emit({ + result: 'Succeeded', ...commonFields, }) From 64bf472a809008c30d0bd44991fd672b219d4db9 Mon Sep 17 00:00:00 2001 From: Will Lo <96078566+Will-ShaoHua@users.noreply.github.com> Date: Thu, 26 Feb 2026 10:14:01 -0800 Subject: [PATCH 35/51] fix(amazonq): inline chat onReject should revert to initial document state (#8599) ## Problem ## Solution simply revert to whatever document initial content is --- - Treat all work as PUBLIC. Private `feature/x` branches will not be squash-merged at release time. - Your code changes must meet the guidelines in [CONTRIBUTING.md](https://github.com/aws/aws-toolkit-vscode/blob/master/CONTRIBUTING.md#guidelines). - License: I confirm that my contribution is made under the terms of the Apache 2.0 license. --- .../Bug Fix-00d5a036-67d6-46fe-925b-48d55d647a3f.json | 4 ++++ .../src/inlineChat/controller/inlineChatController.ts | 10 ++++++---- .../amazonq/src/inlineChat/controller/inlineTask.ts | 3 +++ 3 files changed, 13 insertions(+), 4 deletions(-) create mode 100644 packages/amazonq/.changes/next-release/Bug Fix-00d5a036-67d6-46fe-925b-48d55d647a3f.json diff --git a/packages/amazonq/.changes/next-release/Bug Fix-00d5a036-67d6-46fe-925b-48d55d647a3f.json b/packages/amazonq/.changes/next-release/Bug Fix-00d5a036-67d6-46fe-925b-48d55d647a3f.json new file mode 100644 index 00000000000..c0db1191f12 --- /dev/null +++ b/packages/amazonq/.changes/next-release/Bug Fix-00d5a036-67d6-46fe-925b-48d55d647a3f.json @@ -0,0 +1,4 @@ +{ + "type": "Bug Fix", + "description": "fix: inline chat fails to revert to original state after users reject" +} diff --git a/packages/amazonq/src/inlineChat/controller/inlineChatController.ts b/packages/amazonq/src/inlineChat/controller/inlineChatController.ts index 472591039f3..98b0fc7c683 100644 --- a/packages/amazonq/src/inlineChat/controller/inlineChatController.ts +++ b/packages/amazonq/src/inlineChat/controller/inlineChatController.ts @@ -117,12 +117,14 @@ export class InlineChatController { this.task ) } - const insertions = task.diff.filter((diff) => diff.type === 'insertion') + // Revert to the original document text + const fullRange = new vscode.Range( + task.document.positionAt(0), + task.document.positionAt(task.document.getText().length) + ) await editor.edit( (editBuilder) => { - for (const insertion of insertions) { - editBuilder.delete(insertion.range) - } + editBuilder.replace(fullRange, task.originalDocumentText) }, { undoStopAfter: false, undoStopBefore: false } ) diff --git a/packages/amazonq/src/inlineChat/controller/inlineTask.ts b/packages/amazonq/src/inlineChat/controller/inlineTask.ts index a6a169ad58c..7b549ffbe5b 100644 --- a/packages/amazonq/src/inlineChat/controller/inlineTask.ts +++ b/packages/amazonq/src/inlineChat/controller/inlineTask.ts @@ -47,6 +47,8 @@ export class InlineTask { public selectedText: string public languageName: string | undefined + public readonly originalDocumentText: string + public partialSelectedText: string | undefined public partialSelectedTextRight: string | undefined @@ -67,6 +69,7 @@ export class InlineTask { ) { this.selectedRange = textDocumentUtil.expandSelectionToFullLines(document, selection) this.selectedText = document.getText(this.selectedRange) + this.originalDocumentText = document.getText() this.languageName = extractLanguageNameFromFile(document) } From e17c2b1918e8a64ab78fc3a7ba4a3e908777a866 Mon Sep 17 00:00:00 2001 From: Will Lo <96078566+Will-ShaoHua@users.noreply.github.com> Date: Fri, 27 Feb 2026 10:44:19 -0800 Subject: [PATCH 36/51] build(amazonq): merge release candidate version rc-20260226 (#8625) ## Problem ## Solution --- - Treat all work as PUBLIC. Private `feature/x` branches will not be squash-merged at release time. - Your code changes must meet the guidelines in [CONTRIBUTING.md](https://github.com/aws/aws-toolkit-vscode/blob/master/CONTRIBUTING.md#guidelines). - License: I confirm that my contribution is made under the terms of the Apache 2.0 license. --------- Co-authored-by: aws-toolkit-automation <> Co-authored-by: Laxman Reddy <141967714+laileni-aws@users.noreply.github.com> --- .github/workflows/release.yml | 3 +- LICENSE-THIRD-PARTY | 819 +++++++++--------- buildspec/packageTestVsix.yml | 2 + package-lock.json | 4 +- package.json | 2 +- packages/amazonq/.changes/1.111.0.json | 10 + ...-00d5a036-67d6-46fe-925b-48d55d647a3f.json | 4 - packages/amazonq/CHANGELOG.md | 4 + packages/amazonq/package.json | 2 +- packages/toolkit/.changes/3.97.0.json | 26 + ...-34390739-2300-4d54-a325-4f16ccc29005.json | 4 - ...-726900f0-c604-49ba-85ca-d35d454ffa9d.json | 4 - ...-17b786cd-7705-4696-add5-21558550f99b.json | 4 - ...-8dac03d9-ef57-4018-a360-1f8a818b47ad.json | 4 - ...-a04fc1f1-b60a-4d3b-ad39-ef4067f9483e.json | 4 - packages/toolkit/CHANGELOG.md | 8 + packages/toolkit/package.json | 2 +- 17 files changed, 453 insertions(+), 453 deletions(-) create mode 100644 packages/amazonq/.changes/1.111.0.json delete mode 100644 packages/amazonq/.changes/next-release/Bug Fix-00d5a036-67d6-46fe-925b-48d55d647a3f.json create mode 100644 packages/toolkit/.changes/3.97.0.json delete mode 100644 packages/toolkit/.changes/next-release/Bug Fix-34390739-2300-4d54-a325-4f16ccc29005.json delete mode 100644 packages/toolkit/.changes/next-release/Bug Fix-726900f0-c604-49ba-85ca-d35d454ffa9d.json delete mode 100644 packages/toolkit/.changes/next-release/Feature-17b786cd-7705-4696-add5-21558550f99b.json delete mode 100644 packages/toolkit/.changes/next-release/Feature-8dac03d9-ef57-4018-a360-1f8a818b47ad.json delete mode 100644 packages/toolkit/.changes/next-release/Feature-a04fc1f1-b60a-4d3b-ad39-ef4067f9483e.json diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 4ffa61d08be..149b92ac1fe 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -58,9 +58,10 @@ jobs: - name: vsix run: | npm run createRelease -w packages/toolkit -w packages/amazonq # Generate CHANGELOG.md + npm run -w packages/sagemaker-ssh-kiro package # Must be built before toolkit (toolkit embeds it) npm run -w packages/toolkit package -- --feature "$FEAT_NAME" npm run -w packages/amazonq package -- --feature "$FEAT_NAME" - rm -f sagemaker-ssh-kiro-*.vsix # Remove standalone VSIX; it's already embedded inside toolkit + rm -f sagemaker-ssh-kiro-*.vsix # Remove standalone VSIX; it's already embedded inside toolkit VSIX - uses: actions/upload-artifact@v4 with: name: artifacts diff --git a/LICENSE-THIRD-PARTY b/LICENSE-THIRD-PARTY index 518423005a7..873fd158694 100644 --- a/LICENSE-THIRD-PARTY +++ b/LICENSE-THIRD-PARTY @@ -2846,320 +2846,320 @@ @protobufjs/aspromise 1.1.2 -Copyright (c) 2016, Daniel Wirtz All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - -* Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. -* Neither the name of its author, nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +Copyright (c) 2016, Daniel Wirtz All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +* Neither the name of its author, nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ****************************** @protobufjs/base64 1.1.2 -Copyright (c) 2016, Daniel Wirtz All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - -* Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. -* Neither the name of its author, nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +Copyright (c) 2016, Daniel Wirtz All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +* Neither the name of its author, nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ****************************** @protobufjs/codegen 2.0.4 -Copyright (c) 2016, Daniel Wirtz All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - -* Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. -* Neither the name of its author, nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +Copyright (c) 2016, Daniel Wirtz All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +* Neither the name of its author, nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ****************************** @protobufjs/eventemitter 1.1.0 -Copyright (c) 2016, Daniel Wirtz All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - -* Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. -* Neither the name of its author, nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +Copyright (c) 2016, Daniel Wirtz All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +* Neither the name of its author, nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ****************************** @protobufjs/fetch 1.1.0 -Copyright (c) 2016, Daniel Wirtz All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - -* Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. -* Neither the name of its author, nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +Copyright (c) 2016, Daniel Wirtz All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +* Neither the name of its author, nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ****************************** @protobufjs/float 1.0.2 -Copyright (c) 2016, Daniel Wirtz All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - -* Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. -* Neither the name of its author, nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +Copyright (c) 2016, Daniel Wirtz All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +* Neither the name of its author, nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ****************************** @protobufjs/inquire 1.1.0 -Copyright (c) 2016, Daniel Wirtz All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - -* Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. -* Neither the name of its author, nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +Copyright (c) 2016, Daniel Wirtz All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +* Neither the name of its author, nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ****************************** @protobufjs/path 1.1.2 -Copyright (c) 2016, Daniel Wirtz All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - -* Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. -* Neither the name of its author, nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +Copyright (c) 2016, Daniel Wirtz All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +* Neither the name of its author, nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ****************************** @protobufjs/pool 1.1.0 -Copyright (c) 2016, Daniel Wirtz All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - -* Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. -* Neither the name of its author, nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +Copyright (c) 2016, Daniel Wirtz All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +* Neither the name of its author, nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ****************************** @protobufjs/utf8 1.1.0 -Copyright (c) 2016, Daniel Wirtz All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - -* Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. -* Neither the name of its author, nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +Copyright (c) 2016, Daniel Wirtz All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +* Neither the name of its author, nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ****************************** @@ -4929,13 +4929,13 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. color-name 1.1.4 -The MIT License (MIT) -Copyright (c) 2015 Dmitry Ivanov - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - +The MIT License (MIT) +Copyright (c) 2015 Dmitry Ivanov + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ****************************** @@ -7345,27 +7345,27 @@ IN THE SOFTWARE. registry-js 1.16.1 -MIT License - -Copyright (c) 2017 GitHub Desktop - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. +MIT License + +Copyright (c) 2017 GitHub Desktop + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. ****************************** @@ -8166,17 +8166,17 @@ THE SOFTWARE. tslib 2.8.1 -Copyright (c) Microsoft Corporation. - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH -REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY -AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, -INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM -LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR -OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +Copyright (c) Microsoft Corporation. + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ****************************** @@ -8243,88 +8243,61 @@ END OF TERMS AND CONDITIONS typescript 4.9.5 -Apache License - -Version 2.0, January 2004 - -http://www.apache.org/licenses/ - -TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - -1. Definitions. - -"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. - -"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. - -"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. - -"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. - -"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. - -"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. - -"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). - -"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. - -"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." - -"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. - -2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. - -3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. - -4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: - -You must give any other recipients of the Work or Derivative Works a copy of this License; and - -You must cause any modified files to carry prominent notices stating that You changed the files; and - -You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and - -If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. - -5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. - -6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. - -7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. - -8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. - -9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. - -END OF TERMS AND CONDITIONS - - -****************************** - -unbox-primitive -1.0.2 -MIT License - -Copyright (c) 2019 Jordan Harband - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. +Apache License + +Version 2.0, January 2004 + +http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + +"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. + +"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. + +"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + +"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. + +"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + +"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. + +"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). + +"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + +"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." + +"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: + +You must give any other recipients of the Work or Derivative Works a copy of this License; and + +You must cause any modified files to carry prominent notices stating that You changed the files; and + +You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and + +If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS ****************************** @@ -8634,27 +8607,27 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. win-ca 3.5.1 -MIT License - -Copyright (c) 2020 Stas Ukolov - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. +MIT License + +Copyright (c) 2020 Stas Ukolov + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. ****************************** @@ -8722,27 +8695,27 @@ IN THE SOFTWARE. xmlbuilder 11.0.1 -The MIT License (MIT) - -Copyright (c) 2013 Ozgur Ozcitak - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. +The MIT License (MIT) + +Copyright (c) 2013 Ozgur Ozcitak + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. ****************************** diff --git a/buildspec/packageTestVsix.yml b/buildspec/packageTestVsix.yml index 73f15c0ba10..43afcdc2843 100644 --- a/buildspec/packageTestVsix.yml +++ b/buildspec/packageTestVsix.yml @@ -27,7 +27,9 @@ phases: - export HOME=/home/codebuild-user # Generate CHANGELOG.md - npm run createRelease -w packages/toolkit -w packages/amazonq + - npm run package -w packages/sagemaker-ssh-kiro # Must be built before toolkit (toolkit embeds it) - npm run package -w packages/toolkit -w packages/amazonq + - rm -f sagemaker-ssh-kiro-*.vsix # Remove standalone VSIX; it's already embedded inside toolkit VSIX artifacts: files: diff --git a/package-lock.json b/package-lock.json index 12b025a4be7..69fc9341148 100644 --- a/package-lock.json +++ b/package-lock.json @@ -48390,7 +48390,7 @@ }, "packages/amazonq": { "name": "amazon-q-vscode", - "version": "1.111.0-SNAPSHOT", + "version": "1.112.0-SNAPSHOT", "license": "Apache-2.0", "dependencies": { "aws-core-vscode": "file:../core/" @@ -50700,7 +50700,7 @@ }, "packages/toolkit": { "name": "aws-toolkit-vscode", - "version": "3.97.0-SNAPSHOT", + "version": "3.98.0-SNAPSHOT", "license": "Apache-2.0", "dependencies": { "aws-core-vscode": "file:../core/" diff --git a/package.json b/package.json index 1c63c1e0dde..9d14dcbd224 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,7 @@ "testWeb": "npm run testWeb -w packages/ --if-present", "testE2E": "npm run testE2E -w packages/ --if-present", "testInteg": "npm run testInteg -w packages/ --if-present", - "package": "npm run package -w packages/toolkit -w packages/amazonq", + "package": "npm run package -w packages/sagemaker-ssh-kiro && npm run package -w packages/toolkit -w packages/amazonq && rm -f sagemaker-ssh-kiro-*.vsix", "newChange": "echo 'Must specify subproject/workspace with -w packages/' && false", "createRelease": "echo 'Must specify subproject/workspace with -w packages/' && false", "lint": "npm run lint -w packages/ --if-present", diff --git a/packages/amazonq/.changes/1.111.0.json b/packages/amazonq/.changes/1.111.0.json new file mode 100644 index 00000000000..3e3b496f85b --- /dev/null +++ b/packages/amazonq/.changes/1.111.0.json @@ -0,0 +1,10 @@ +{ + "date": "2026-02-26", + "version": "1.111.0", + "entries": [ + { + "type": "Bug Fix", + "description": "fix: inline chat fails to revert to original state after users reject" + } + ] +} \ No newline at end of file diff --git a/packages/amazonq/.changes/next-release/Bug Fix-00d5a036-67d6-46fe-925b-48d55d647a3f.json b/packages/amazonq/.changes/next-release/Bug Fix-00d5a036-67d6-46fe-925b-48d55d647a3f.json deleted file mode 100644 index c0db1191f12..00000000000 --- a/packages/amazonq/.changes/next-release/Bug Fix-00d5a036-67d6-46fe-925b-48d55d647a3f.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "type": "Bug Fix", - "description": "fix: inline chat fails to revert to original state after users reject" -} diff --git a/packages/amazonq/CHANGELOG.md b/packages/amazonq/CHANGELOG.md index 6cc2c6c5f5d..edfb88b866a 100644 --- a/packages/amazonq/CHANGELOG.md +++ b/packages/amazonq/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.111.0 2026-02-26 + +- **Bug Fix** fix: inline chat fails to revert to original state after users reject + ## 1.110.0 2026-02-16 - **Bug Fix** Amazon Q Chat: Fix chat history restoration to display rich UI elements and persist user preferences diff --git a/packages/amazonq/package.json b/packages/amazonq/package.json index 6266e108333..e13a6bee4d7 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 software development.", - "version": "1.111.0-SNAPSHOT", + "version": "1.112.0-SNAPSHOT", "extensionKind": [ "workspace" ], diff --git a/packages/toolkit/.changes/3.97.0.json b/packages/toolkit/.changes/3.97.0.json new file mode 100644 index 00000000000..40f224d3145 --- /dev/null +++ b/packages/toolkit/.changes/3.97.0.json @@ -0,0 +1,26 @@ +{ + "date": "2026-02-26", + "version": "3.97.0", + "entries": [ + { + "type": "Bug Fix", + "description": "Adds a confirmation prompt before initiating console credential login (aws login) when opening a Lambda function in VS Code. Improves clarity around prerequisites and reduces unexpected login cancellations." + }, + { + "type": "Bug Fix", + "description": "Lamdbda: Console-to-IDE transition shows \"Connection does not exist\" error when console login is cancelled or fail." + }, + { + "type": "Feature", + "description": "AI assistants are able to receive SageMaker Unified Studio context when connected to a Space" + }, + { + "type": "Feature", + "description": "This update enhances HyperPod Space connectivity in the Toolkit by adding reconnection support. In the event of a connection disruption, users can now seamlessly reconnect to their existing session and resume work without losing in-progress changes." + }, + { + "type": "Feature", + "description": "SageMaker Studio users can now connect to Spaces from Kiro IDE" + } + ] +} \ No newline at end of file diff --git a/packages/toolkit/.changes/next-release/Bug Fix-34390739-2300-4d54-a325-4f16ccc29005.json b/packages/toolkit/.changes/next-release/Bug Fix-34390739-2300-4d54-a325-4f16ccc29005.json deleted file mode 100644 index a50eca86b58..00000000000 --- a/packages/toolkit/.changes/next-release/Bug Fix-34390739-2300-4d54-a325-4f16ccc29005.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "type": "Bug Fix", - "description": "Adds a confirmation prompt before initiating console credential login (aws login) when opening a Lambda function in VS Code. Improves clarity around prerequisites and reduces unexpected login cancellations." -} diff --git a/packages/toolkit/.changes/next-release/Bug Fix-726900f0-c604-49ba-85ca-d35d454ffa9d.json b/packages/toolkit/.changes/next-release/Bug Fix-726900f0-c604-49ba-85ca-d35d454ffa9d.json deleted file mode 100644 index add6f1eae01..00000000000 --- a/packages/toolkit/.changes/next-release/Bug Fix-726900f0-c604-49ba-85ca-d35d454ffa9d.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "type": "Bug Fix", - "description": "Lamdbda: Console-to-IDE transition shows \"Connection does not exist\" error when console login is cancelled or fail." -} diff --git a/packages/toolkit/.changes/next-release/Feature-17b786cd-7705-4696-add5-21558550f99b.json b/packages/toolkit/.changes/next-release/Feature-17b786cd-7705-4696-add5-21558550f99b.json deleted file mode 100644 index 56efbf44f34..00000000000 --- a/packages/toolkit/.changes/next-release/Feature-17b786cd-7705-4696-add5-21558550f99b.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "type": "Feature", - "description": "AI assistants are able to receive SageMaker Unified Studio context when connected to a Space" -} diff --git a/packages/toolkit/.changes/next-release/Feature-8dac03d9-ef57-4018-a360-1f8a818b47ad.json b/packages/toolkit/.changes/next-release/Feature-8dac03d9-ef57-4018-a360-1f8a818b47ad.json deleted file mode 100644 index d0dfd166d76..00000000000 --- a/packages/toolkit/.changes/next-release/Feature-8dac03d9-ef57-4018-a360-1f8a818b47ad.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "type": "Feature", - "description": "This update enhances HyperPod Space connectivity in the Toolkit by adding reconnection support. In the event of a connection disruption, users can now seamlessly reconnect to their existing session and resume work without losing in-progress changes." -} diff --git a/packages/toolkit/.changes/next-release/Feature-a04fc1f1-b60a-4d3b-ad39-ef4067f9483e.json b/packages/toolkit/.changes/next-release/Feature-a04fc1f1-b60a-4d3b-ad39-ef4067f9483e.json deleted file mode 100644 index 2a2356049aa..00000000000 --- a/packages/toolkit/.changes/next-release/Feature-a04fc1f1-b60a-4d3b-ad39-ef4067f9483e.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "type": "Feature", - "description": "SageMaker Studio users can now connect to Spaces from Kiro IDE" -} diff --git a/packages/toolkit/CHANGELOG.md b/packages/toolkit/CHANGELOG.md index 438e7f2fd40..bc930d6d3f3 100644 --- a/packages/toolkit/CHANGELOG.md +++ b/packages/toolkit/CHANGELOG.md @@ -1,3 +1,11 @@ +## 3.97.0 2026-02-26 + +- **Bug Fix** Adds a confirmation prompt before initiating console credential login (aws login) when opening a Lambda function in VS Code. Improves clarity around prerequisites and reduces unexpected login cancellations. +- **Bug Fix** Lamdbda: Console-to-IDE transition shows "Connection does not exist" error when console login is cancelled or fail. +- **Feature** AI assistants are able to receive SageMaker Unified Studio context when connected to a Space +- **Feature** This update enhances HyperPod Space connectivity in the Toolkit by adding reconnection support. In the event of a connection disruption, users can now seamlessly reconnect to their existing session and resume work without losing in-progress changes. +- **Feature** SageMaker Studio users can now connect to Spaces from Kiro IDE + ## 3.96.0 2026-02-13 - Miscellaneous non-user-facing changes diff --git a/packages/toolkit/package.json b/packages/toolkit/package.json index aa3d483e9af..0689f319fa1 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.97.0-SNAPSHOT", + "version": "3.98.0-SNAPSHOT", "extensionKind": [ "workspace" ], From b00674f760550b18bd133811bd073c2f41111c27 Mon Sep 17 00:00:00 2001 From: Will Lo <96078566+Will-ShaoHua@users.noreply.github.com> Date: Fri, 27 Feb 2026 13:25:48 -0800 Subject: [PATCH 37/51] fix(amazonq): update amazonq data collection configurable wording (#8627) ## Problem ## Solution --- - Treat all work as PUBLIC. Private `feature/x` branches will not be squash-merged at release time. - Your code changes must meet the guidelines in [CONTRIBUTING.md](https://github.com/aws/aws-toolkit-vscode/blob/master/CONTRIBUTING.md#guidelines). - License: I confirm that my contribution is made under the terms of the Apache 2.0 license. Co-authored-by: invictus <149003065+ashishrp-aws@users.noreply.github.com> --- packages/core/package.nls.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core/package.nls.json b/packages/core/package.nls.json index 9595d269ffd..8dd2b8310c5 100644 --- a/packages/core/package.nls.json +++ b/packages/core/package.nls.json @@ -88,7 +88,7 @@ "AWS.configuration.description.awssam.debug.snippets.api.label.cn": "Amazon SAM: API Gateway lambda invoke", "AWS.configuration.description.awssam.debug.snippets.api.description.cn": "A new configuration for invoking an Amazon Lambda in a CloudFormation template, simulating API Gateway", "AWS.configuration.description.amazonq": "Amazon Q creates a code reference when you insert a code suggestion from Amazon Q that is similar to training data. When unchecked, Amazon Q will not show code suggestions that have code references. If you authenticate through IAM Identity Center, this setting is controlled by your Amazon Q administrator. [Learn More](https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/code-reference.html)", - "AWS.configuration.description.amazonq.shareContentWithAWS": "When checked, your content processed by Amazon Q may be used for service improvement (except for content processed for users with the Amazon Q Developer Pro Tier). Unchecking this box will cause AWS to delete any of your content used for that purpose. The information used to provide the Amazon Q service to you will not be affected. See the [Service Terms](https://aws.amazon.com/service-terms) for more details.", + "AWS.configuration.description.amazonq.shareContentWithAWS": "When checked, your content processed by Amazon Q may be used for service improvement (except for content processed for users with the Amazon Q Developer Pro Tier and Amazon Q in SageMaker). Unchecking this box will cause AWS to delete any of your content used for that purpose. The information used to provide the Amazon Q service to you will not be affected. See the [Service Terms](https://aws.amazon.com/service-terms) for more details.", "AWS.configuration.description.amazonq.importRecommendation": "Amazon Q will add import statements with inline code suggestions when necessary.", "AWS.configuration.description.amazonq.workspaceIndex": "When you add @workspace to your question in Amazon Q chat, Amazon Q will index your workspace files locally to use as context for its response. Extra CPU usage is expected while indexing a workspace. This will not impact Amazon Q features or your IDE, but you may manage CPU usage by setting the number of local threads in 'Local Workspace Index Threads'.", "AWS.configuration.description.amazonq.workspaceIndexWorkerThreads": "Number of worker threads of Amazon Q local index process. '0' will use the system default worker threads for balance performance. You may increase this number to more quickly index your workspace, but only up to your hardware's number of CPU cores. Please restart VS Code or reload the VS Code window after changing worker threads.", From 146d35b027f9ea40bc86d17e9c5bf8093d97bbba Mon Sep 17 00:00:00 2001 From: Dylan Ross <90357952+dylanraws@users.noreply.github.com> Date: Thu, 5 Mar 2026 10:35:52 -0800 Subject: [PATCH 38/51] fix(sagemaker): Remove top-level sagemaker-ssh-kiro VSIX (#8624) ## Problem 1. Toolkit CI builds fail when they detect more than one VSIX file at the top level, due to the `sagemaker-ssh-kiro` extension being present even though it's not needed there 2. Whenever the `sagemaker-ssh-kiro` extension version is updated (e.g., 0.2.0 -> 0.3.0), there can be two VSIX files in the toolkit resources directory, which can eventually lead to an error as the toolkit cannot determine which file to install at runtime ## Solution 1. As part of packaging `toolkit`, move (rather than copy) the `sagemaker-ssh-kiro` VSIX file to the toolkit resources directory, so that it will be no longer present at the top level, thus preventing any CI build failures 2. Remove all `sagemaker-ssh-kiro` VSIX files from the toolkit resources directory before moving the new file there --- - Treat all work as PUBLIC. Private `feature/x` branches will not be squash-merged at release time. - Your code changes must meet the guidelines in [CONTRIBUTING.md](https://github.com/aws/aws-toolkit-vscode/blob/master/CONTRIBUTING.md#guidelines). - License: I confirm that my contribution is made under the terms of the Apache 2.0 license. --- packages/toolkit/scripts/build/copyFiles.ts | 31 ++++++++++++++------- 1 file changed, 21 insertions(+), 10 deletions(-) diff --git a/packages/toolkit/scripts/build/copyFiles.ts b/packages/toolkit/scripts/build/copyFiles.ts index 63bc9b901ad..aee68b5b03c 100644 --- a/packages/toolkit/scripts/build/copyFiles.ts +++ b/packages/toolkit/scripts/build/copyFiles.ts @@ -130,30 +130,41 @@ function copy(task: CopyTask): void { } } -function copySageMakerSshKiroExtension(): void { +function moveSageMakerSshKiroExtension(): void { const searchDir = path.resolve(projectRoot, '../../') const destinationDir = path.resolve(outRoot, '../resources') fs.mkdirSync(destinationDir, { recursive: true }) - const files = fs - .readdirSync(searchDir) - .filter((file) => file.startsWith('sagemaker-ssh-kiro') && file.endsWith('.vsix')) + const isSageMakerSshKiroVsix = (file: string) => file.startsWith('sagemaker-ssh-kiro') && file.endsWith('.vsix') - if (files.length !== 1) { - throw new Error(`Expected 1 sagemaker-ssh-kiro VSIX file but found ${files.length}`) + // Remove all existing sagemaker-ssh-kiro files in the destination directory. This prevents multiple + // sagemaker-ssh-kiro VSIX files being present in the destination if the version number has changed. + const existingFilesInDestination = fs.readdirSync(destinationDir).filter(isSageMakerSshKiroVsix) + + for (const file of existingFilesInDestination) { + const filePath = path.join(destinationDir, file) + fs.unlinkSync(filePath) + } + + const sourceFiles = fs.readdirSync(searchDir).filter(isSageMakerSshKiroVsix) + + if (sourceFiles.length !== 1) { + throw new Error(`Expected 1 sagemaker-ssh-kiro VSIX file but found ${sourceFiles.length}`) } - const sourceFile = path.join(searchDir, files[0]) - const destinationFile = path.join(destinationDir, files[0]) + const sourceFile = path.join(searchDir, sourceFiles[0]) + const destinationFile = path.join(destinationDir, sourceFiles[0]) - fs.copyFileSync(sourceFile, destinationFile) + // Move (rather than copy) the sagemaker-ssh-kiro VSIX file to the toolkit resources directory so it's + // no longer at the top level, since we don't want to release it standalone (it should be embedded only). + fs.renameSync(sourceFile, destinationFile) } function main() { try { tasks.map(copy) - copySageMakerSshKiroExtension() + moveSageMakerSshKiroExtension() } catch (error) { console.error('`copyFiles.ts` failed') console.error(error) From f3a9935e76b6dd20682ac539939ff760d64ccb60 Mon Sep 17 00:00:00 2001 From: msgupta-amazon Date: Thu, 5 Mar 2026 10:48:58 -0800 Subject: [PATCH 39/51] fix(sagemaker): store hyperpod connection info for reconnection (#8641) ## Problem Users are not able to connect to hyperpod spaces through deeplink ## Solution This PR will solve the issue and is tested locally. --- - Treat all work as PUBLIC. Private `feature/x` branches will not be squash-merged at release time. - Your code changes must meet the guidelines in [CONTRIBUTING.md](https://github.com/aws/aws-toolkit-vscode/blob/master/CONTRIBUTING.md#guidelines). - License: I confirm that my contribution is made under the terms of the Apache 2.0 license. --------- Co-authored-by: msgupta --- .../core/src/awsService/sagemaker/commands.ts | 54 ++++++++++--------- .../sagemaker/detached-server/utils.ts | 13 ++--- ...-7f4b2db6-3199-4c56-aaf6-c4be97009ced.json | 4 ++ 3 files changed, 40 insertions(+), 31 deletions(-) create mode 100644 packages/toolkit/.changes/next-release/BugFix-7f4b2db6-3199-4c56-aaf6-c4be97009ced.json diff --git a/packages/core/src/awsService/sagemaker/commands.ts b/packages/core/src/awsService/sagemaker/commands.ts index fa7ef62b5e5..e9cde613af2 100644 --- a/packages/core/src/awsService/sagemaker/commands.ts +++ b/packages/core/src/awsService/sagemaker/commands.ts @@ -36,6 +36,7 @@ import { import { SagemakerUnifiedStudioSpaceNode } from '../../sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioSpaceNode' import { node } from 'webpack' import { parse } from '@aws-sdk/util-arn-parser' +import { storeHyperpodConnection } from './detached-server/hyperpodMappingUtils.js' const localize = nls.loadMessageBundle() @@ -126,6 +127,10 @@ export async function deeplinkConnect( eksClusterArn: ${eksClusterArn}` ) + getLogger().info( + `sm:deeplinkConnect: Condition check - !domain: ${!domain}, eksClusterArn: ${!!eksClusterArn}, workspaceName: ${!!workspaceName}, namespace: ${!!namespace}` + ) + if (isRemoteWorkspace()) { void vscode.window.showErrorMessage(ConnectFromRemoteWorkspaceMessage) return @@ -133,13 +138,30 @@ export async function deeplinkConnect( try { let connectionType = 'sm_dl' + let clusterName: string | undefined + let region: string | undefined if (!domain && eksClusterArn && workspaceName && namespace) { - const { accountId, region, clusterName } = parseArn(eksClusterArn) + const parsed = parse(eksClusterArn) + clusterName = parsed.resource.split('/')[1] + region = parsed.region connectionType = 'sm_hp' - const proposedSession = `${workspaceName}_${namespace}_${clusterName}_${region}_${accountId}` + const proposedSession = `${workspaceName}_${namespace}_${clusterName}_${region}_${parsed.accountId}` session = isValidSshHostname(proposedSession) ? proposedSession - : createValidSshSession(workspaceName, namespace, clusterName, region, accountId) + : createValidSshSession(workspaceName, namespace, clusterName, region, parsed.accountId) + + await storeHyperpodConnection( + workspaceName, + namespace, + eksClusterArn, + clusterName, + clusterName, + undefined, + undefined, + region, + wsUrl, + token + ) } const remoteEnv = await prepareDevEnvConnection( connectionIdentifier, @@ -153,8 +175,10 @@ export async function deeplinkConnect( domain, appType, workspaceName, - undefined, - namespace + clusterName, + namespace, + region, + eksClusterArn ) try { @@ -196,26 +220,6 @@ export async function deeplinkConnect( } } -function parseArn(arn: string): { accountId: string; region: string; clusterName: string } { - try { - const parsed = parse(arn) - if (!parsed.service) { - throw new Error('Invalid service') - } - const clusterName = parsed.resource.split('/')[1] - if (!clusterName) { - throw new Error('Invalid cluster name') - } - return { - accountId: parsed.accountId, - clusterName, - region: parsed.region, - } - } catch (error) { - throw new Error('Invalid cluster ARN') - } -} - /** * Validates and sanitizes session names for SSH hostname compliance */ diff --git a/packages/core/src/awsService/sagemaker/detached-server/utils.ts b/packages/core/src/awsService/sagemaker/detached-server/utils.ts index 380a943244a..b276a2d6edc 100644 --- a/packages/core/src/awsService/sagemaker/detached-server/utils.ts +++ b/packages/core/src/awsService/sagemaker/detached-server/utils.ts @@ -56,31 +56,32 @@ export async function readServerInfo(): Promise { } /** - * Parses a SageMaker ARN to extract region, account ID, and space name. + * Parses a SageMaker or EKS ARN to extract region, account ID, and space/cluster name. * Supports formats like: * arn:aws:sagemaker:::space// * arn:aws:sagemaker:::cluster/ + * arn:aws:eks:::cluster/cluster-name * or sm_lc_arn:aws:sagemaker:::space__d-xxxx__ * * If the input is prefixed with an identifier (e.g. "sagemaker-user@"), the function will strip it. * - * @param arn - The full SageMaker ARN string + * @param arn - The full ARN string * @returns An object containing the region, accountId, and spaceName * @throws If the ARN format is invalid */ export function parseArn(arn: string): { region: string; accountId: string; spaceName: string } { const cleanedArn = arn.includes('@') ? arn.split('@')[1] : arn - const regex = /^arn:aws:sagemaker:(?[^:]+):(?\d+):(space|cluster)[/:].+$/i + const regex = /^arn:aws:(sagemaker|eks):(?[^:]+):(?\d+):(space|cluster)[/:].+$/i const match = cleanedArn.match(regex) if (!match?.groups) { - throw new Error(`Invalid SageMaker ARN format: "${arn}"`) + throw new Error(`Invalid SageMaker/EKS ARN format: "${arn}"`) } - // Extract space name from the end of the ARN (after the last forward slash) + // Extract space/cluster name from the end of the ARN (after the last forward slash) const spaceName = cleanedArn.split('/').pop() if (!spaceName) { - throw new Error(`Could not extract space name from ARN: "${arn}"`) + throw new Error(`Could not extract space/cluster name from ARN: "${arn}"`) } return { diff --git a/packages/toolkit/.changes/next-release/BugFix-7f4b2db6-3199-4c56-aaf6-c4be97009ced.json b/packages/toolkit/.changes/next-release/BugFix-7f4b2db6-3199-4c56-aaf6-c4be97009ced.json new file mode 100644 index 00000000000..a089ad04b70 --- /dev/null +++ b/packages/toolkit/.changes/next-release/BugFix-7f4b2db6-3199-4c56-aaf6-c4be97009ced.json @@ -0,0 +1,4 @@ +{ + "type": "Bug Fix", + "description": "SageMaker: Fixed HyperPod workspace reconnection for deeplink usecase" +} From 2b26e0eb38abb4cfc111f6293fdb4cf8fd8633df Mon Sep 17 00:00:00 2001 From: aws-ajangg Date: Thu, 5 Mar 2026 10:50:57 -0800 Subject: [PATCH 40/51] fix(sagemaker): enhance idle activity monitoring for appropriate shutdown (#8584) ## Problem - Users reported code editor and jupyterlab spaces were prematurely or not shutting down when connecting via remote ide. This issue has been addressed by enhancing the idle activity monitoring system ## Solution - Check for remote ide environment which triggers the last active timestamp script to update. previously this was skipped and the timestamp was not being updated which caused the space to not shut down when idle - Add special case for focused window due to event handlers triggering for idle windows in the background - Add remaining criteria for idle detection: > No background processes running > No notebook kernels processing > No unsaved work - Check for active jupyterlab kernels ## Test - Tested idle detection locally with new VSIX - Internal bugbash --- - Treat all work as PUBLIC. Private `feature/x` branches will not be squash-merged at release time. - Your code changes must meet the guidelines in [CONTRIBUTING.md](https://github.com/aws/aws-toolkit-vscode/blob/master/CONTRIBUTING.md#guidelines). - License: I confirm that my contribution is made under the terms of the Apache 2.0 license. --- .../src/awsService/sagemaker/activation.ts | 54 ++++++++++----- .../core/src/awsService/sagemaker/utils.ts | 69 +++++++++++++++++++ .../core/src/shared/extensionUtilities.ts | 16 ++++- .../test/shared/extensionUtilities.test.ts | 19 ++++- 4 files changed, 136 insertions(+), 22 deletions(-) diff --git a/packages/core/src/awsService/sagemaker/activation.ts b/packages/core/src/awsService/sagemaker/activation.ts index 1a537fbc0f9..572643694cd 100644 --- a/packages/core/src/awsService/sagemaker/activation.ts +++ b/packages/core/src/awsService/sagemaker/activation.ts @@ -10,7 +10,12 @@ import { SagemakerSpaceNode } from './explorer/sagemakerSpaceNode' import { SagemakerStudioNode } from './explorer/sagemakerStudioNode' import * as uriHandlers from './uriHandlers' import { openRemoteConnect, filterSpaceAppsByDomainUserProfiles, stopSpace } from './commands' -import { updateIdleFile, startMonitoringTerminalActivity, ActivityCheckInterval } from './utils' +import { + updateIdleFile, + startMonitoringTerminalActivity, + startMonitoringBackgroundState, + ActivityCheckInterval, +} from './utils' import { ExtContext } from '../../shared/extensions' import { telemetry } from '../../shared/telemetry/telemetry' import { isSageMaker, UserActivity } from '../../shared/extensionUtilities' @@ -21,8 +26,10 @@ import { stopHyperPodSpaceCommand, } from './hyperpodCommands' import { SagemakerHyperpodNode } from './explorer/sagemakerHyperpodNode' +import { getLogger } from '../../shared/logger/logger' let terminalActivityInterval: NodeJS.Timeout | undefined +let backgroundStateInterval: NodeJS.Timeout | undefined export async function activate(ctx: ExtContext): Promise { ctx.extensionContext.subscriptions.push( @@ -78,26 +85,39 @@ export async function activate(ctx: ExtContext): Promise { // If running in SageMaker AI Space, track user activity for autoshutdown feature if (isSageMaker('SMAI')) { - // Use /tmp/ directory so the file is cleared on each reboot to prevent stale timestamps. - const tmpDirectory = '/tmp/' - const idleFilePath = path.join(tmpDirectory, '.sagemaker-last-active-timestamp') + getLogger().info('SMAI environment detected - starting user activity monitoring') - const userActivity = new UserActivity(ActivityCheckInterval) - userActivity.onUserActivity(() => updateIdleFile(idleFilePath)) + try { + // Use /tmp/ directory so the file is cleared on each reboot to prevent stale timestamps. + const tmpDirectory = '/tmp/' + const idleFilePath = path.join(tmpDirectory, '.sagemaker-last-active-timestamp') - terminalActivityInterval = startMonitoringTerminalActivity(idleFilePath) + const userActivity = new UserActivity(ActivityCheckInterval) + userActivity.onUserActivity(() => updateIdleFile(idleFilePath)) - // Write initial timestamp - await updateIdleFile(idleFilePath) + terminalActivityInterval = startMonitoringTerminalActivity(idleFilePath) + backgroundStateInterval = startMonitoringBackgroundState(idleFilePath) - ctx.extensionContext.subscriptions.push(userActivity, { - dispose: () => { - if (terminalActivityInterval) { - clearInterval(terminalActivityInterval) - terminalActivityInterval = undefined - } - }, - }) + // Write initial timestamp + await updateIdleFile(idleFilePath) + + ctx.extensionContext.subscriptions.push(userActivity, { + dispose: () => { + if (terminalActivityInterval) { + clearInterval(terminalActivityInterval) + terminalActivityInterval = undefined + } + if (backgroundStateInterval) { + clearInterval(backgroundStateInterval) + backgroundStateInterval = undefined + } + }, + }) + } catch (error) { + getLogger().error(`Error in MonitoringTerminalActivity: ${error}`) + } + } else { + getLogger().info('Not in SMAI environment, skipping user activity monitoring') } } diff --git a/packages/core/src/awsService/sagemaker/utils.ts b/packages/core/src/awsService/sagemaker/utils.ts index 33cc5880bee..a86c3f7f5a1 100644 --- a/packages/core/src/awsService/sagemaker/utils.ts +++ b/packages/core/src/awsService/sagemaker/utils.ts @@ -5,6 +5,7 @@ import * as cp from 'child_process' // eslint-disable-line no-restricted-imports import * as path from 'path' +import * as vscode from 'vscode' import { AppStatus, SpaceStatus } from '@aws-sdk/client-sagemaker' import { SagemakerSpaceApp } from '../../shared/clients/sagemaker' import { sshLogFileLocation } from '../../shared/sshConfig' @@ -134,6 +135,9 @@ export async function checkTerminalActivity(idleFilePath: string): Promise const stats = await fs.stat(filePath) const mtime = new Date(stats.mtime).getTime() if (now - mtime < ActivityCheckInterval) { + getLogger().debug( + `[Terminal Activity] Detected in ${fileName}, mtime: ${new Date(mtime).toISOString()}` + ) await updateIdleFile(idleFilePath) return } @@ -141,6 +145,7 @@ export async function checkTerminalActivity(idleFilePath: string): Promise getLogger().error(`Error reading file stats:`, err) } } + getLogger().debug(`No terminal activity detected.`) } catch (err) { getLogger().error(`Error reading /dev/pts directory:`, err) } @@ -154,3 +159,67 @@ export function startMonitoringTerminalActivity(idleFilePath: string): NodeJS.Ti await checkTerminalActivity(idleFilePath) }, ActivityCheckInterval) } + +/** + * Checks for active Jupyter kernels by querying the Jupyter extension API. + * Returns true if any kernel is in 'busy' state. + */ +export async function hasActiveJupyterKernels(): Promise { + try { + const jupyterExt = vscode.extensions.getExtension('ms-toolsai.jupyter') + if (!jupyterExt) { + // Jupyter extension not installed, cannot detect active kernels + return false + } + + const jupyterExtApi = await jupyterExt.activate() + + for (const notebook of vscode.workspace.notebookDocuments) { + const kernel = await jupyterExtApi.kernels.getKernel(notebook.uri) + if (kernel && kernel.status === 'busy') { + getLogger().debug(`[Kernel State] Kernel busy for ${notebook.uri.toString()}`) + return true + } + } + + getLogger().debug(`No kernel activity detected.`) + return false + } catch (error) { + getLogger().error(`Error checking Jupyter kernel state: ${error}`) + return false + } +} + +/** + * Starts monitoring background state (tasks, debug sessions, notebook kernels, unsaved work). + * Updates the idle file if any background activity is detected. + */ +export function startMonitoringBackgroundState(idleFilePath: string): NodeJS.Timeout { + return setInterval(async () => { + getLogger().debug(`Monitoring background state.`) + const hasActiveTasks = vscode.tasks.taskExecutions.length > 0 + const hasDebugSession = vscode.debug.activeDebugSession !== undefined + + // Use Jupyter extension API to check actual kernel state + const hasActiveKernels = await hasActiveJupyterKernels() + + // Check for unsaved text documents (file and untitled) + const hasUnsavedText = vscode.workspace.textDocuments.some( + (doc) => doc.isDirty && (doc.uri.scheme === 'file' || doc.uri.scheme === 'untitled') + ) + + // Check for unsaved notebooks + const hasUnsavedNotebooks = vscode.workspace.notebookDocuments.some((notebook) => notebook.isDirty) + + const hasUnsaved = hasUnsavedText || hasUnsavedNotebooks + + if (hasActiveTasks || hasDebugSession || hasActiveKernels || hasUnsaved) { + getLogger().debug( + `[Background State] tasks:${hasActiveTasks}, debug:${hasDebugSession}, kernels:${hasActiveKernels}, unsaved:${hasUnsaved}` + ) + await updateIdleFile(idleFilePath) + } else { + getLogger().debug(`No background activity detected.`) + } + }, ActivityCheckInterval) +} diff --git a/packages/core/src/shared/extensionUtilities.ts b/packages/core/src/shared/extensionUtilities.ts index ca77f01b504..90503134d90 100644 --- a/packages/core/src/shared/extensionUtilities.ts +++ b/packages/core/src/shared/extensionUtilities.ts @@ -210,7 +210,7 @@ export function isSageMaker(appName: 'SMAI' | 'SMUS' | 'SMUS-SPACE-REMOTE-ACCESS switch (appName) { case 'SMAI': - return vscode.env.appName === sageMakerAppname && hasSMEnvVars + return (vscode.env.appName === sageMakerAppname || vscode.env.appName === vscodeAppname) && hasSMEnvVars case 'SMUS': return vscode.env.appName === sageMakerAppname && isSageMakerUnifiedStudio() && hasSMEnvVars case 'SMUS-SPACE-REMOTE-ACCESS': @@ -443,7 +443,9 @@ export class UserActivity implements vscode.Disposable { const throttledEmit = _.throttle( (event: vscode.Event) => { this.activityEvent.fire() - getLogger().debug(`UserActivity: event fired "${event.name}"`) + getLogger().debug( + `[UserActivity] Event fired: "${event.name}", window focused: ${vscode.window.state.focused}` + ) }, delay, { leading: true, trailing: false } @@ -476,7 +478,6 @@ export class UserActivity implements vscode.Disposable { vscode.window.onDidChangeTextEditorOptions, vscode.window.onDidOpenTerminal, vscode.window.onDidCloseTerminal, - vscode.window.onDidChangeTerminalState, vscode.window.onDidChangeTextEditorViewColumn, ] @@ -492,6 +493,15 @@ export class UserActivity implements vscode.Disposable { // Events with special cases: // + this.register( + vscode.window.onDidChangeTerminalState((terminal) => { + if (!vscode.window.state.focused) { + return + } + throttledEmit(vscode.window.onDidChangeTerminalState) + }) + ) + this.register( vscode.window.onDidChangeWindowState((e) => { if ((e as any).active === false || e.focused === false) { diff --git a/packages/core/src/test/shared/extensionUtilities.test.ts b/packages/core/src/test/shared/extensionUtilities.test.ts index ce4c764d3d5..b02e06d7884 100644 --- a/packages/core/src/test/shared/extensionUtilities.test.ts +++ b/packages/core/src/test/shared/extensionUtilities.test.ts @@ -329,6 +329,21 @@ describe('UserActivity', function () { assert.strictEqual(userActivitySubscriber.callCount, 1) }) + it('does not fire onDidChangeTerminalState when window is not focused', function () { + stubUserActivityEvent(vscode.window, 'onDidChangeTerminalState') + const focusedStub = sandbox.stub(vscode.window.state, 'focused') + + const triggerUserActivity = createTriggerActivityFunc() + + focusedStub.value(false) + triggerUserActivity({}) + assert.strictEqual(userActivitySubscriber.callCount, 0) + + focusedStub.value(true) + triggerUserActivity({}) + assert.strictEqual(userActivitySubscriber.callCount, 1) + }) + /** * Helper to stub a vscode event object. * @@ -386,11 +401,11 @@ describe('isSageMaker', function () { assert.strictEqual(isSageMaker('SMAI'), true) }) - it('returns false when app name is different', function () { + it('returns true when app name is Visual Studio Code with env vars', function () { sandbox.stub(vscode.env, 'appName').value('Visual Studio Code') sandbox.stub(env, 'hasSageMakerEnvVars').returns(true) - assert.strictEqual(isSageMaker('SMAI'), false) + assert.strictEqual(isSageMaker('SMAI'), true) }) it('returns false when env vars are missing', function () { From 08cd0db7dc79a99c126f647b82c393f554e72979 Mon Sep 17 00:00:00 2001 From: aws-ajangg Date: Thu, 5 Mar 2026 11:35:37 -0800 Subject: [PATCH 41/51] fix(sagemaker): refactor ssh config to also trigger for sm_lc and sm_dl (#8636) ## Problem - When users attempted to open SageMaker spaces in vscode via SageMaker UI, they ran into connection errors. Upon investigation, we discovered that our source code was refactored when another feature was merged. ## Solution - Move ssh config outside sm_hp scope so it also triggers for sm_lc and sm_dl ## Testing - Local testing with vsix --- - Treat all work as PUBLIC. Private `feature/x` branches will not be squash-merged at release time. - Your code changes must meet the guidelines in [CONTRIBUTING.md](https://github.com/aws/aws-toolkit-vscode/blob/master/CONTRIBUTING.md#guidelines). - License: I confirm that my contribution is made under the terms of the Apache 2.0 license. Co-authored-by: invictus <149003065+ashishrp-aws@users.noreply.github.com> --- .../core/src/awsService/sagemaker/model.ts | 58 +++++++++---------- 1 file changed, 29 insertions(+), 29 deletions(-) diff --git a/packages/core/src/awsService/sagemaker/model.ts b/packages/core/src/awsService/sagemaker/model.ts index 1b1bc7a0cc1..b3141eee6d6 100644 --- a/packages/core/src/awsService/sagemaker/model.ts +++ b/packages/core/src/awsService/sagemaker/model.ts @@ -214,39 +214,39 @@ export async function prepareDevEnvConnection( logger.error(`Failed to copy hyperpod_connect script: ${err}`) } } + } - const sshConfig = - connectionType === 'sm_hp' - ? new HyperPodSshConfig(ssh, hyperpodConnectPath) - : new SshConfig(ssh, 'sm_', 'sagemaker_connect') - const config = await sshConfig.ensureValid() - if (config.isErr()) { - const err = config.err() - const logPrefix = connectionType === 'sm_hp' ? 'hyperpod' : 'sagemaker' - logger.error(`${logPrefix}: failed to add ssh config section: ${err.message}`) - - if (err instanceof ToolkitError && err.code === 'SshCheckFailed') { - const sshConfigPath = getSshConfigPath() - const openConfigButton = 'Open SSH Config' - const resp = await vscode.window.showErrorMessage( - SshConfigErrorMessage(), - { modal: true, detail: err.message }, - openConfigButton - ) - - if (resp === openConfigButton) { - void vscode.window.showTextDocument(vscode.Uri.file(sshConfigPath)) - } - - // Throw error to stop the connection flow - // User is already notified via modal above, downstream handlers check the error code - throw new ToolkitError('Unable to connect: SSH configuration contains errors', { - code: SshConfigError, - }) + const sshConfig = + connectionType === 'sm_hp' + ? new HyperPodSshConfig(ssh, hyperpodConnectPath) + : new SshConfig(ssh, 'sm_', 'sagemaker_connect') + const config = await sshConfig.ensureValid() + if (config.isErr()) { + const err = config.err() + const logPrefix = connectionType === 'sm_hp' ? 'hyperpod' : 'sagemaker' + logger.error(`${logPrefix}: failed to add ssh config section: ${err.message}`) + + if (err instanceof ToolkitError && err.code === 'SshCheckFailed') { + const sshConfigPath = getSshConfigPath() + const openConfigButton = 'Open SSH Config' + const resp = await vscode.window.showErrorMessage( + SshConfigErrorMessage(), + { modal: true, detail: err.message }, + openConfigButton + ) + + if (resp === openConfigButton) { + void vscode.window.showTextDocument(vscode.Uri.file(sshConfigPath)) } - throw err + // Throw error to stop the connection flow + // User is already notified via modal above, downstream handlers check the error code + throw new ToolkitError('Unable to connect: SSH configuration contains errors', { + code: SshConfigError, + }) } + + throw err } } From e99ee260e996d8da13209b64b690e2f259c1ca44 Mon Sep 17 00:00:00 2001 From: gemammercado <131494638+gemammercado@users.noreply.github.com> Date: Thu, 5 Mar 2026 16:34:27 -0500 Subject: [PATCH 42/51] fix(cloudformation): improve stack name readability in messages (#8638) ## Problem CloudFormation error messages have repetitive colons that make stack names hard to distinguish from the rest of the message. ## Solution Add quotes around stack names in all CloudFormation failure/success messages to improves readability by clearly separating stack names from error details --- - Treat all work as PUBLIC. Private `feature/x` branches will not be squash-merged at release time. - Your code changes must meet the guidelines in [CONTRIBUTING.md](https://github.com/aws/aws-toolkit-vscode/blob/master/CONTRIBUTING.md#guidelines). - License: I confirm that my contribution is made under the terms of the Apache 2.0 license. Co-authored-by: invictus <149003065+ashishrp-aws@users.noreply.github.com> --- .../awsService/cloudformation/ui/message.ts | 26 +++++++++---------- ...-cc4bfdb0-2512-4204-9167-5192fb3acc64.json | 4 +++ 2 files changed, 17 insertions(+), 13 deletions(-) create mode 100644 packages/toolkit/.changes/next-release/Feature-cc4bfdb0-2512-4204-9167-5192fb3acc64.json diff --git a/packages/core/src/awsService/cloudformation/ui/message.ts b/packages/core/src/awsService/cloudformation/ui/message.ts index 55056002522..d1d142691e6 100644 --- a/packages/core/src/awsService/cloudformation/ui/message.ts +++ b/packages/core/src/awsService/cloudformation/ui/message.ts @@ -20,59 +20,59 @@ export async function showDeploymentCompletion( pollResult.phase === StackActionPhase.DEPLOYMENT_COMPLETE && pollResult.state === StackActionState.SUCCESSFUL ) { - void window.showInformationMessage(`Deployment completed successfully for stack: ${stackName}`) + void window.showInformationMessage(`Deployment completed successfully for stack '${stackName}'`) } else if ( pollResult.phase === StackActionPhase.DEPLOYMENT_FAILED || pollResult.phase === StackActionPhase.VALIDATION_FAILED || pollResult.state === StackActionState.FAILED ) { - void window.showErrorMessage(`Deployment failed for stack: ${stackName}`) + void window.showErrorMessage(`Deployment failed for stack '${stackName}'`) } else { - void window.showWarningMessage(`Deployment status unknown for stack: ${stackName}`) + void window.showWarningMessage(`Deployment status unknown for stack '${stackName}'`) } } catch (error) { - void window.showErrorMessage(`Error checking deployment status for stack: ${stackName}`) + void window.showErrorMessage(`Error checking deployment status for stack '${stackName}'`) } } export function showDeploymentSuccess(stackName: string) { - void window.showInformationMessage(`Deployment completed successfully for stack: ${stackName}`) + void window.showInformationMessage(`Deployment completed successfully for stack '${stackName}'`) } export function showChangeSetDeletionSuccess(changeSetName: string, stackName: string) { void window.showInformationMessage( - `Deletion completed successfully for change set: ${changeSetName}, in stack: ${stackName}` + `Deletion completed successfully for change set: ${changeSetName}, in stack '${stackName}'` ) } export function showDeploymentFailure(stackName: string, failureReason: string) { - void window.showErrorMessage(`Deployment failed for stack: ${stackName} with reason: ${failureReason}`) + void window.showErrorMessage(`Deployment failed for stack '${stackName}' with reason: ${failureReason}`) } export function showChangeSetDeletionFailure(changeSetName: string, stackName: string, failureReason: string) { void window.showErrorMessage( - `Change Set Deletion failed for change set: ${changeSetName}, in stack: ${stackName} with reason: ${failureReason}` + `Change Set Deletion failed for change set: ${changeSetName}, in stack '${stackName}' with reason: ${failureReason}` ) } export function showValidationStarted(stackName: string) { - void window.showInformationMessage(`Validation started for stack: ${stackName}`) + void window.showInformationMessage(`Validation started for stack '${stackName}'`) } export function showValidationSuccess(stackName: string) { - void window.showInformationMessage(`Validation completed successfully for stack: ${stackName}`) + void window.showInformationMessage(`Validation completed successfully for stack '${stackName}'`) } export function showValidationFailure(stackName: string, failureReason: string) { - void window.showErrorMessage(`Validation failed for stack: ${stackName} with reason: ${failureReason}`) + void window.showErrorMessage(`Validation failed for stack '${stackName}' with reason: ${failureReason}`) } export function showDeploymentStarted(stackName: string) { - void window.showInformationMessage(`Deployment started for stack: ${stackName}`) + void window.showInformationMessage(`Deployment started for stack '${stackName}'`) } export function showChangeSetDeletionStarted(changeSetName: string, stackName: string) { - void window.showInformationMessage(`Deletion started for change set: ${changeSetName}, in stack: ${stackName}`) + void window.showInformationMessage(`Deletion started for change set: ${changeSetName}, in stack '${stackName}'`) } export function showErrorMessage(message: string) { diff --git a/packages/toolkit/.changes/next-release/Feature-cc4bfdb0-2512-4204-9167-5192fb3acc64.json b/packages/toolkit/.changes/next-release/Feature-cc4bfdb0-2512-4204-9167-5192fb3acc64.json new file mode 100644 index 00000000000..83753c440ce --- /dev/null +++ b/packages/toolkit/.changes/next-release/Feature-cc4bfdb0-2512-4204-9167-5192fb3acc64.json @@ -0,0 +1,4 @@ +{ + "type": "Feature", + "description": "Replace stack: with stack '' to ensure failure messages maintain proper grammar." +} From 699643a8213b686cddc7edd95ab879dec06e4b42 Mon Sep 17 00:00:00 2001 From: satyaki <208557303+satyakigh@users.noreply.github.com> Date: Thu, 5 Mar 2026 16:35:58 -0500 Subject: [PATCH 43/51] fix(cloudformation): Fixing LSP version config (#8640) ## Problem Fixing LSP version config ## Solution --- - Treat all work as PUBLIC. Private `feature/x` branches will not be squash-merged at release time. - Your code changes must meet the guidelines in [CONTRIBUTING.md](https://github.com/aws/aws-toolkit-vscode/blob/master/CONTRIBUTING.md#guidelines). - License: I confirm that my contribution is made under the terms of the Apache 2.0 license. --- packages/core/src/awsService/cloudformation/extension.ts | 9 +++++---- .../src/awsService/cloudformation/extensionConfig.ts | 3 +-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/core/src/awsService/cloudformation/extension.ts b/packages/core/src/awsService/cloudformation/extension.ts index 22016000d83..ead7b5d87fa 100644 --- a/packages/core/src/awsService/cloudformation/extension.ts +++ b/packages/core/src/awsService/cloudformation/extension.ts @@ -15,7 +15,7 @@ import { import { CloseAction, ErrorAction, Message } from 'vscode-languageclient/node' import { formatMessage, toString } from './utils' import globals from '../../shared/extensionGlobals' -import { getServiceEnvVarConfig } from '../../shared/vscode/env' +import { extensionVersion, getServiceEnvVarConfig } from '../../shared/vscode/env' import { DevSettings } from '../../shared/settings' import { deployTemplateCommand, @@ -49,7 +49,8 @@ import { import { openStackTemplateCommand } from './commands/openStackTemplate' import { selectRegionCommand } from './commands/regionCommands' import { AwsCredentialsService, encryptionKey } from './auth/credentials' -import { ExtensionId, ExtensionName, Version, CloudFormationTelemetrySettings } from './extensionConfig' +import { ExtensionId, ExtensionName, CloudFormationTelemetrySettings } from './extensionConfig' +import { VSCODE_EXTENSION_ID_CONSTANTS } from '../../shared/extensionIds' import { commandKey } from './utils' import { CloudFormationExplorer } from './explorer/explorer' import { handleTelemetryOptIn } from './telemetryOptIn' @@ -149,8 +150,8 @@ async function startClient(context: ExtensionContext) { aws: { clientInfo: { extension: { - name: ExtensionId, - version: Version, + name: VSCODE_EXTENSION_ID_CONSTANTS.awstoolkit, + version: extensionVersion, }, clientId: getClientId(globals.globalState, telemetryEnabled), }, diff --git a/packages/core/src/awsService/cloudformation/extensionConfig.ts b/packages/core/src/awsService/cloudformation/extensionConfig.ts index c3577d9c19b..920c46cbdaa 100644 --- a/packages/core/src/awsService/cloudformation/extensionConfig.ts +++ b/packages/core/src/awsService/cloudformation/extensionConfig.ts @@ -5,10 +5,9 @@ import { fromExtensionManifest } from '../../shared/settings' -export const ExtensionId = 'amazonwebservices.cloudformation' export const ExtensionName = 'AWS CloudFormation' -export const Version = '1.0.0' export const ExtensionConfigKey = 'aws.cloudformation' +export const ExtensionId = ExtensionConfigKey export class CloudFormationTelemetrySettings extends fromExtensionManifest(`${ExtensionConfigKey}.telemetry`, { enabled: Boolean, From 613a66dc3698c1ebc8af829a40678a8aceb94e7d Mon Sep 17 00:00:00 2001 From: Laxman Reddy <141967714+laileni-aws@users.noreply.github.com> Date: Thu, 5 Mar 2026 13:47:11 -0800 Subject: [PATCH 44/51] fix(amazonq): code prompt can recognize the selected code (#8642) ## Problem ## Solution --- - Treat all work as PUBLIC. Private `feature/x` branches will not be squash-merged at release time. - Your code changes must meet the guidelines in [CONTRIBUTING.md](https://github.com/aws/aws-toolkit-vscode/blob/master/CONTRIBUTING.md#guidelines). - License: I confirm that my contribution is made under the terms of the Apache 2.0 license. --- packages/amazonq/src/lsp/chat/messages.ts | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/packages/amazonq/src/lsp/chat/messages.ts b/packages/amazonq/src/lsp/chat/messages.ts index 1541e60b9c5..8c9f3d940b2 100644 --- a/packages/amazonq/src/lsp/chat/messages.ts +++ b/packages/amazonq/src/lsp/chat/messages.ts @@ -641,17 +641,20 @@ export function registerMessageListeners( params: params, }) }) + languageClient.onNotification( pinnedContextNotificationType.method, (params: ContextCommandParams & { tabId: string; textDocument?: TextDocumentIdentifier }) => { const editor = vscode.window.activeTextEditor let textDocument = undefined + let cursorState = undefined if (editor && isTextEditor(editor)) { - textDocument = { uri: vscode.workspace.asRelativePath(editor.document.uri) } + textDocument = { uri: editor.document.uri.toString() } + cursorState = getCursorState(editor.selections) } void provider.webview?.postMessage({ command: pinnedContextNotificationType.method, - params: { ...params, textDocument }, + params: { ...params, textDocument, cursorState }, }) } ) From 5150623f70e2ba811791aabbb2d819b5ec6ccda5 Mon Sep 17 00:00:00 2001 From: chungjac Date: Thu, 5 Mar 2026 14:06:47 -0800 Subject: [PATCH 45/51] feat(amazonq): bundle stripped indexing folder for @file support in fallback LSP (#8591) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Problem When users behind corporate proxies/firewalls can't download the LSP from CDN, the extension falls back to a bundled LSP. The bundled LSP currently excludes the entire indexing/ folder (~200MB), which means @file, @folder, and @code context commands don't work for these users. ## Solution Instead of deleting the entire `indexing` folder during bundling, selectively strip only the heavy platform-specific files that aren't needed for context commands: - dist/bin/ — ONNX native binaries (25MB) - dist/build/ — faiss native binaries (11MB) - models/ — CodeSage ONNX model (124MB) This keeps extension.js, lspServer.js, tree-sitter WASMs (~30MB uncompressed, ~3MB compressed in VSIX), which is everything needed for @file, @folder, @code, and BM25 cross-file context. VSIX size impact: +3MB (19MB → 22MB) Depends on https://github.com/aws/language-servers/pull/2629: (CDN must have the updated indexing library) --- scripts/lspArtifact.ts | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/scripts/lspArtifact.ts b/scripts/lspArtifact.ts index 42b5c59907d..aae1c11e427 100644 --- a/scripts/lspArtifact.ts +++ b/scripts/lspArtifact.ts @@ -152,7 +152,22 @@ export async function downloadLanguageServer(): Promise { // Clean up temp directory fs.rmdirSync(tempDir) - fs.rmdirSync(path.join(resourcesDir, 'servers', 'indexing'), { recursive: true }) + // Strip heavy native/model files from indexing, keep tree-sitter + extension.js + const indexingDir = path.join(resourcesDir, 'servers', 'indexing') + if (fs.existsSync(indexingDir)) { + const binDir = path.join(indexingDir, 'dist', 'bin') + if (fs.existsSync(binDir)) { + fs.rmdirSync(binDir, { recursive: true }) + } + const buildDir = path.join(indexingDir, 'dist', 'build') + if (fs.existsSync(buildDir)) { + fs.rmdirSync(buildDir, { recursive: true }) + } + const modelsDir = path.join(indexingDir, 'models') + if (fs.existsSync(modelsDir)) { + fs.rmdirSync(modelsDir, { 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'))) { From 000a20dc0a67b7899b265bb886bdb9bcf827e7f9 Mon Sep 17 00:00:00 2001 From: Laxman Reddy <141967714+laileni-aws@users.noreply.github.com> Date: Thu, 5 Mar 2026 15:27:40 -0800 Subject: [PATCH 46/51] fix(sagemaker): Revert "fix(sagemaker): store hyperpod connection info for reconnection (#8641)" (#8645) This reverts commit f3a9935e76b6dd20682ac539939ff760d64ccb60. ## Problem ## Solution --- - Treat all work as PUBLIC. Private `feature/x` branches will not be squash-merged at release time. - Your code changes must meet the guidelines in [CONTRIBUTING.md](https://github.com/aws/aws-toolkit-vscode/blob/master/CONTRIBUTING.md#guidelines). - License: I confirm that my contribution is made under the terms of the Apache 2.0 license. --- .../core/src/awsService/sagemaker/commands.ts | 54 +++++++++---------- .../sagemaker/detached-server/utils.ts | 13 +++-- ...-7f4b2db6-3199-4c56-aaf6-c4be97009ced.json | 4 -- 3 files changed, 31 insertions(+), 40 deletions(-) delete mode 100644 packages/toolkit/.changes/next-release/BugFix-7f4b2db6-3199-4c56-aaf6-c4be97009ced.json diff --git a/packages/core/src/awsService/sagemaker/commands.ts b/packages/core/src/awsService/sagemaker/commands.ts index e9cde613af2..fa7ef62b5e5 100644 --- a/packages/core/src/awsService/sagemaker/commands.ts +++ b/packages/core/src/awsService/sagemaker/commands.ts @@ -36,7 +36,6 @@ import { import { SagemakerUnifiedStudioSpaceNode } from '../../sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioSpaceNode' import { node } from 'webpack' import { parse } from '@aws-sdk/util-arn-parser' -import { storeHyperpodConnection } from './detached-server/hyperpodMappingUtils.js' const localize = nls.loadMessageBundle() @@ -127,10 +126,6 @@ export async function deeplinkConnect( eksClusterArn: ${eksClusterArn}` ) - getLogger().info( - `sm:deeplinkConnect: Condition check - !domain: ${!domain}, eksClusterArn: ${!!eksClusterArn}, workspaceName: ${!!workspaceName}, namespace: ${!!namespace}` - ) - if (isRemoteWorkspace()) { void vscode.window.showErrorMessage(ConnectFromRemoteWorkspaceMessage) return @@ -138,30 +133,13 @@ export async function deeplinkConnect( try { let connectionType = 'sm_dl' - let clusterName: string | undefined - let region: string | undefined if (!domain && eksClusterArn && workspaceName && namespace) { - const parsed = parse(eksClusterArn) - clusterName = parsed.resource.split('/')[1] - region = parsed.region + const { accountId, region, clusterName } = parseArn(eksClusterArn) connectionType = 'sm_hp' - const proposedSession = `${workspaceName}_${namespace}_${clusterName}_${region}_${parsed.accountId}` + const proposedSession = `${workspaceName}_${namespace}_${clusterName}_${region}_${accountId}` session = isValidSshHostname(proposedSession) ? proposedSession - : createValidSshSession(workspaceName, namespace, clusterName, region, parsed.accountId) - - await storeHyperpodConnection( - workspaceName, - namespace, - eksClusterArn, - clusterName, - clusterName, - undefined, - undefined, - region, - wsUrl, - token - ) + : createValidSshSession(workspaceName, namespace, clusterName, region, accountId) } const remoteEnv = await prepareDevEnvConnection( connectionIdentifier, @@ -175,10 +153,8 @@ export async function deeplinkConnect( domain, appType, workspaceName, - clusterName, - namespace, - region, - eksClusterArn + undefined, + namespace ) try { @@ -220,6 +196,26 @@ export async function deeplinkConnect( } } +function parseArn(arn: string): { accountId: string; region: string; clusterName: string } { + try { + const parsed = parse(arn) + if (!parsed.service) { + throw new Error('Invalid service') + } + const clusterName = parsed.resource.split('/')[1] + if (!clusterName) { + throw new Error('Invalid cluster name') + } + return { + accountId: parsed.accountId, + clusterName, + region: parsed.region, + } + } catch (error) { + throw new Error('Invalid cluster ARN') + } +} + /** * Validates and sanitizes session names for SSH hostname compliance */ diff --git a/packages/core/src/awsService/sagemaker/detached-server/utils.ts b/packages/core/src/awsService/sagemaker/detached-server/utils.ts index b276a2d6edc..380a943244a 100644 --- a/packages/core/src/awsService/sagemaker/detached-server/utils.ts +++ b/packages/core/src/awsService/sagemaker/detached-server/utils.ts @@ -56,32 +56,31 @@ export async function readServerInfo(): Promise { } /** - * Parses a SageMaker or EKS ARN to extract region, account ID, and space/cluster name. + * Parses a SageMaker ARN to extract region, account ID, and space name. * Supports formats like: * arn:aws:sagemaker:::space// * arn:aws:sagemaker:::cluster/ - * arn:aws:eks:::cluster/cluster-name * or sm_lc_arn:aws:sagemaker:::space__d-xxxx__ * * If the input is prefixed with an identifier (e.g. "sagemaker-user@"), the function will strip it. * - * @param arn - The full ARN string + * @param arn - The full SageMaker ARN string * @returns An object containing the region, accountId, and spaceName * @throws If the ARN format is invalid */ export function parseArn(arn: string): { region: string; accountId: string; spaceName: string } { const cleanedArn = arn.includes('@') ? arn.split('@')[1] : arn - const regex = /^arn:aws:(sagemaker|eks):(?[^:]+):(?\d+):(space|cluster)[/:].+$/i + const regex = /^arn:aws:sagemaker:(?[^:]+):(?\d+):(space|cluster)[/:].+$/i const match = cleanedArn.match(regex) if (!match?.groups) { - throw new Error(`Invalid SageMaker/EKS ARN format: "${arn}"`) + throw new Error(`Invalid SageMaker ARN format: "${arn}"`) } - // Extract space/cluster name from the end of the ARN (after the last forward slash) + // Extract space name from the end of the ARN (after the last forward slash) const spaceName = cleanedArn.split('/').pop() if (!spaceName) { - throw new Error(`Could not extract space/cluster name from ARN: "${arn}"`) + throw new Error(`Could not extract space name from ARN: "${arn}"`) } return { diff --git a/packages/toolkit/.changes/next-release/BugFix-7f4b2db6-3199-4c56-aaf6-c4be97009ced.json b/packages/toolkit/.changes/next-release/BugFix-7f4b2db6-3199-4c56-aaf6-c4be97009ced.json deleted file mode 100644 index a089ad04b70..00000000000 --- a/packages/toolkit/.changes/next-release/BugFix-7f4b2db6-3199-4c56-aaf6-c4be97009ced.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "type": "Bug Fix", - "description": "SageMaker: Fixed HyperPod workspace reconnection for deeplink usecase" -} From 57f06354151f94c103735efee39243fc9f106e8c Mon Sep 17 00:00:00 2001 From: Laxman Reddy <141967714+laileni-aws@users.noreply.github.com> Date: Thu, 5 Mar 2026 15:28:54 -0800 Subject: [PATCH 47/51] fix(sagemaker): Revert "fix(sagemaker): store hyperpod connection info for reconnection (#8641)" (#8646) This reverts commit f3a9935e76b6dd20682ac539939ff760d64ccb60. ## Problem ## Solution --- - Treat all work as PUBLIC. Private `feature/x` branches will not be squash-merged at release time. - Your code changes must meet the guidelines in [CONTRIBUTING.md](https://github.com/aws/aws-toolkit-vscode/blob/master/CONTRIBUTING.md#guidelines). - License: I confirm that my contribution is made under the terms of the Apache 2.0 license. --- .../core/src/awsService/sagemaker/commands.ts | 54 +++++++++---------- .../sagemaker/detached-server/utils.ts | 13 +++-- ...-7f4b2db6-3199-4c56-aaf6-c4be97009ced.json | 4 -- 3 files changed, 31 insertions(+), 40 deletions(-) delete mode 100644 packages/toolkit/.changes/next-release/BugFix-7f4b2db6-3199-4c56-aaf6-c4be97009ced.json diff --git a/packages/core/src/awsService/sagemaker/commands.ts b/packages/core/src/awsService/sagemaker/commands.ts index e9cde613af2..fa7ef62b5e5 100644 --- a/packages/core/src/awsService/sagemaker/commands.ts +++ b/packages/core/src/awsService/sagemaker/commands.ts @@ -36,7 +36,6 @@ import { import { SagemakerUnifiedStudioSpaceNode } from '../../sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioSpaceNode' import { node } from 'webpack' import { parse } from '@aws-sdk/util-arn-parser' -import { storeHyperpodConnection } from './detached-server/hyperpodMappingUtils.js' const localize = nls.loadMessageBundle() @@ -127,10 +126,6 @@ export async function deeplinkConnect( eksClusterArn: ${eksClusterArn}` ) - getLogger().info( - `sm:deeplinkConnect: Condition check - !domain: ${!domain}, eksClusterArn: ${!!eksClusterArn}, workspaceName: ${!!workspaceName}, namespace: ${!!namespace}` - ) - if (isRemoteWorkspace()) { void vscode.window.showErrorMessage(ConnectFromRemoteWorkspaceMessage) return @@ -138,30 +133,13 @@ export async function deeplinkConnect( try { let connectionType = 'sm_dl' - let clusterName: string | undefined - let region: string | undefined if (!domain && eksClusterArn && workspaceName && namespace) { - const parsed = parse(eksClusterArn) - clusterName = parsed.resource.split('/')[1] - region = parsed.region + const { accountId, region, clusterName } = parseArn(eksClusterArn) connectionType = 'sm_hp' - const proposedSession = `${workspaceName}_${namespace}_${clusterName}_${region}_${parsed.accountId}` + const proposedSession = `${workspaceName}_${namespace}_${clusterName}_${region}_${accountId}` session = isValidSshHostname(proposedSession) ? proposedSession - : createValidSshSession(workspaceName, namespace, clusterName, region, parsed.accountId) - - await storeHyperpodConnection( - workspaceName, - namespace, - eksClusterArn, - clusterName, - clusterName, - undefined, - undefined, - region, - wsUrl, - token - ) + : createValidSshSession(workspaceName, namespace, clusterName, region, accountId) } const remoteEnv = await prepareDevEnvConnection( connectionIdentifier, @@ -175,10 +153,8 @@ export async function deeplinkConnect( domain, appType, workspaceName, - clusterName, - namespace, - region, - eksClusterArn + undefined, + namespace ) try { @@ -220,6 +196,26 @@ export async function deeplinkConnect( } } +function parseArn(arn: string): { accountId: string; region: string; clusterName: string } { + try { + const parsed = parse(arn) + if (!parsed.service) { + throw new Error('Invalid service') + } + const clusterName = parsed.resource.split('/')[1] + if (!clusterName) { + throw new Error('Invalid cluster name') + } + return { + accountId: parsed.accountId, + clusterName, + region: parsed.region, + } + } catch (error) { + throw new Error('Invalid cluster ARN') + } +} + /** * Validates and sanitizes session names for SSH hostname compliance */ diff --git a/packages/core/src/awsService/sagemaker/detached-server/utils.ts b/packages/core/src/awsService/sagemaker/detached-server/utils.ts index b276a2d6edc..380a943244a 100644 --- a/packages/core/src/awsService/sagemaker/detached-server/utils.ts +++ b/packages/core/src/awsService/sagemaker/detached-server/utils.ts @@ -56,32 +56,31 @@ export async function readServerInfo(): Promise { } /** - * Parses a SageMaker or EKS ARN to extract region, account ID, and space/cluster name. + * Parses a SageMaker ARN to extract region, account ID, and space name. * Supports formats like: * arn:aws:sagemaker:::space// * arn:aws:sagemaker:::cluster/ - * arn:aws:eks:::cluster/cluster-name * or sm_lc_arn:aws:sagemaker:::space__d-xxxx__ * * If the input is prefixed with an identifier (e.g. "sagemaker-user@"), the function will strip it. * - * @param arn - The full ARN string + * @param arn - The full SageMaker ARN string * @returns An object containing the region, accountId, and spaceName * @throws If the ARN format is invalid */ export function parseArn(arn: string): { region: string; accountId: string; spaceName: string } { const cleanedArn = arn.includes('@') ? arn.split('@')[1] : arn - const regex = /^arn:aws:(sagemaker|eks):(?[^:]+):(?\d+):(space|cluster)[/:].+$/i + const regex = /^arn:aws:sagemaker:(?[^:]+):(?\d+):(space|cluster)[/:].+$/i const match = cleanedArn.match(regex) if (!match?.groups) { - throw new Error(`Invalid SageMaker/EKS ARN format: "${arn}"`) + throw new Error(`Invalid SageMaker ARN format: "${arn}"`) } - // Extract space/cluster name from the end of the ARN (after the last forward slash) + // Extract space name from the end of the ARN (after the last forward slash) const spaceName = cleanedArn.split('/').pop() if (!spaceName) { - throw new Error(`Could not extract space/cluster name from ARN: "${arn}"`) + throw new Error(`Could not extract space name from ARN: "${arn}"`) } return { diff --git a/packages/toolkit/.changes/next-release/BugFix-7f4b2db6-3199-4c56-aaf6-c4be97009ced.json b/packages/toolkit/.changes/next-release/BugFix-7f4b2db6-3199-4c56-aaf6-c4be97009ced.json deleted file mode 100644 index a089ad04b70..00000000000 --- a/packages/toolkit/.changes/next-release/BugFix-7f4b2db6-3199-4c56-aaf6-c4be97009ced.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "type": "Bug Fix", - "description": "SageMaker: Fixed HyperPod workspace reconnection for deeplink usecase" -} From b4fe43e7b0192806eca08abea2c10c3d8cd62167 Mon Sep 17 00:00:00 2001 From: aws-toolkit-automation <> Date: Fri, 6 Mar 2026 00:45:15 +0000 Subject: [PATCH 48/51] Release 1.112.0 --- package-lock.json | 4 ++-- packages/amazonq/.changes/1.112.0.json | 5 +++++ packages/amazonq/CHANGELOG.md | 4 ++++ packages/amazonq/package.json | 2 +- 4 files changed, 12 insertions(+), 3 deletions(-) create mode 100644 packages/amazonq/.changes/1.112.0.json diff --git a/package-lock.json b/package-lock.json index 69fc9341148..09d4a8b5c74 100644 --- a/package-lock.json +++ b/package-lock.json @@ -47,7 +47,7 @@ "prettier": "^3.3.3", "prettier-plugin-sh": "^0.14.0", "pretty-quick": "^4.0.0", - "ts-node": "^10.9.1", + "ts-node": "^10.9.2", "typescript": "^5.0.4", "webpack": "^5.95.0", "webpack-cli": "^5.1.4", @@ -48390,7 +48390,7 @@ }, "packages/amazonq": { "name": "amazon-q-vscode", - "version": "1.112.0-SNAPSHOT", + "version": "1.112.0", "license": "Apache-2.0", "dependencies": { "aws-core-vscode": "file:../core/" diff --git a/packages/amazonq/.changes/1.112.0.json b/packages/amazonq/.changes/1.112.0.json new file mode 100644 index 00000000000..e2afd8aaaf5 --- /dev/null +++ b/packages/amazonq/.changes/1.112.0.json @@ -0,0 +1,5 @@ +{ + "date": "2026-03-06", + "version": "1.112.0", + "entries": [] +} \ No newline at end of file diff --git a/packages/amazonq/CHANGELOG.md b/packages/amazonq/CHANGELOG.md index edfb88b866a..09ab406e75a 100644 --- a/packages/amazonq/CHANGELOG.md +++ b/packages/amazonq/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.112.0 2026-03-06 + +- Miscellaneous non-user-facing changes + ## 1.111.0 2026-02-26 - **Bug Fix** fix: inline chat fails to revert to original state after users reject diff --git a/packages/amazonq/package.json b/packages/amazonq/package.json index e13a6bee4d7..9aeaf3064e5 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 software development.", - "version": "1.112.0-SNAPSHOT", + "version": "1.112.0", "extensionKind": [ "workspace" ], From 0840885a45e344188570bdd62da031d0e380bb5c Mon Sep 17 00:00:00 2001 From: aws-toolkit-automation <> Date: Fri, 6 Mar 2026 00:49:41 +0000 Subject: [PATCH 49/51] Release 3.98.0 --- package-lock.json | 4 ++-- packages/toolkit/.changes/3.98.0.json | 10 ++++++++++ .../Feature-cc4bfdb0-2512-4204-9167-5192fb3acc64.json | 4 ---- packages/toolkit/CHANGELOG.md | 4 ++++ packages/toolkit/package.json | 2 +- 5 files changed, 17 insertions(+), 7 deletions(-) create mode 100644 packages/toolkit/.changes/3.98.0.json delete mode 100644 packages/toolkit/.changes/next-release/Feature-cc4bfdb0-2512-4204-9167-5192fb3acc64.json diff --git a/package-lock.json b/package-lock.json index 69fc9341148..675245f0742 100644 --- a/package-lock.json +++ b/package-lock.json @@ -47,7 +47,7 @@ "prettier": "^3.3.3", "prettier-plugin-sh": "^0.14.0", "pretty-quick": "^4.0.0", - "ts-node": "^10.9.1", + "ts-node": "^10.9.2", "typescript": "^5.0.4", "webpack": "^5.95.0", "webpack-cli": "^5.1.4", @@ -50700,7 +50700,7 @@ }, "packages/toolkit": { "name": "aws-toolkit-vscode", - "version": "3.98.0-SNAPSHOT", + "version": "3.98.0", "license": "Apache-2.0", "dependencies": { "aws-core-vscode": "file:../core/" diff --git a/packages/toolkit/.changes/3.98.0.json b/packages/toolkit/.changes/3.98.0.json new file mode 100644 index 00000000000..5bf2dc4e0b0 --- /dev/null +++ b/packages/toolkit/.changes/3.98.0.json @@ -0,0 +1,10 @@ +{ + "date": "2026-03-06", + "version": "3.98.0", + "entries": [ + { + "type": "Feature", + "description": "Replace stack: with stack '' to ensure failure messages maintain proper grammar." + } + ] +} \ No newline at end of file diff --git a/packages/toolkit/.changes/next-release/Feature-cc4bfdb0-2512-4204-9167-5192fb3acc64.json b/packages/toolkit/.changes/next-release/Feature-cc4bfdb0-2512-4204-9167-5192fb3acc64.json deleted file mode 100644 index 83753c440ce..00000000000 --- a/packages/toolkit/.changes/next-release/Feature-cc4bfdb0-2512-4204-9167-5192fb3acc64.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "type": "Feature", - "description": "Replace stack: with stack '' to ensure failure messages maintain proper grammar." -} diff --git a/packages/toolkit/CHANGELOG.md b/packages/toolkit/CHANGELOG.md index bc930d6d3f3..f50a7bde448 100644 --- a/packages/toolkit/CHANGELOG.md +++ b/packages/toolkit/CHANGELOG.md @@ -1,3 +1,7 @@ +## 3.98.0 2026-03-06 + +- **Feature** Replace stack: with stack '' to ensure failure messages maintain proper grammar. + ## 3.97.0 2026-02-26 - **Bug Fix** Adds a confirmation prompt before initiating console credential login (aws login) when opening a Lambda function in VS Code. Improves clarity around prerequisites and reduces unexpected login cancellations. diff --git a/packages/toolkit/package.json b/packages/toolkit/package.json index 0689f319fa1..0c4873d247e 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.98.0-SNAPSHOT", + "version": "3.98.0", "extensionKind": [ "workspace" ], From a3f6d02df9f36e74fb7c2c89324efb3283bd78bc Mon Sep 17 00:00:00 2001 From: aws-toolkit-automation <> Date: Fri, 6 Mar 2026 01:03:31 +0000 Subject: [PATCH 50/51] Update version to snapshot version: 1.113.0-SNAPSHOT --- package-lock.json | 4 ++-- packages/amazonq/package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 09d4a8b5c74..8fa6276f786 100644 --- a/package-lock.json +++ b/package-lock.json @@ -47,7 +47,7 @@ "prettier": "^3.3.3", "prettier-plugin-sh": "^0.14.0", "pretty-quick": "^4.0.0", - "ts-node": "^10.9.2", + "ts-node": "^10.9.1", "typescript": "^5.0.4", "webpack": "^5.95.0", "webpack-cli": "^5.1.4", @@ -48390,7 +48390,7 @@ }, "packages/amazonq": { "name": "amazon-q-vscode", - "version": "1.112.0", + "version": "1.113.0-SNAPSHOT", "license": "Apache-2.0", "dependencies": { "aws-core-vscode": "file:../core/" diff --git a/packages/amazonq/package.json b/packages/amazonq/package.json index 9aeaf3064e5..91baef55a7c 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 software development.", - "version": "1.112.0", + "version": "1.113.0-SNAPSHOT", "extensionKind": [ "workspace" ], From abbfb738f1a8b2f52f4b6bdcfa6c13b1948f58cd Mon Sep 17 00:00:00 2001 From: aws-toolkit-automation <> Date: Fri, 6 Mar 2026 01:06:26 +0000 Subject: [PATCH 51/51] Update version to snapshot version: 3.99.0-SNAPSHOT --- package-lock.json | 4 ++-- packages/toolkit/package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 675245f0742..c67c1020bec 100644 --- a/package-lock.json +++ b/package-lock.json @@ -47,7 +47,7 @@ "prettier": "^3.3.3", "prettier-plugin-sh": "^0.14.0", "pretty-quick": "^4.0.0", - "ts-node": "^10.9.2", + "ts-node": "^10.9.1", "typescript": "^5.0.4", "webpack": "^5.95.0", "webpack-cli": "^5.1.4", @@ -50700,7 +50700,7 @@ }, "packages/toolkit": { "name": "aws-toolkit-vscode", - "version": "3.98.0", + "version": "3.99.0-SNAPSHOT", "license": "Apache-2.0", "dependencies": { "aws-core-vscode": "file:../core/" diff --git a/packages/toolkit/package.json b/packages/toolkit/package.json index 0c4873d247e..445c4d9c52f 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.98.0", + "version": "3.99.0-SNAPSHOT", "extensionKind": [ "workspace" ],