diff --git a/NOTICE.txt b/NOTICE.txt index fb8513c5..db19952c 100644 --- a/NOTICE.txt +++ b/NOTICE.txt @@ -20,6 +20,7 @@ This software includes third party software subject to the following copyrights: @aws-lambda-powertools/logger MIT @aws-lambda-powertools/metrics MIT @aws-lambda-powertools/tracer MIT +@aws-sdk/client-cognito-identity-provider Apache-2.0 @aws-sdk/client-cloudformation Apache-2.0 @aws-sdk/client-dynamodb Apache-2.0 @aws-sdk/client-kendra Apache-2.0 diff --git a/source/infrastructure/lib/api/model-schema/deploy-usecase-body.ts b/source/infrastructure/lib/api/model-schema/deploy-usecase-body.ts index 977f7c0b..e1558994 100644 --- a/source/infrastructure/lib/api/model-schema/deploy-usecase-body.ts +++ b/source/infrastructure/lib/api/model-schema/deploy-usecase-body.ts @@ -13,6 +13,7 @@ import { JsonSchema, JsonSchemaType, JsonSchemaVersion } from 'aws-cdk-lib/aws-apigateway'; import { + AUTHENTICATION_PROVIDERS, CHAT_PROVIDERS, DEFAULT_CONVERSATION_MEMORY_TYPE, DEFAULT_ENABLE_RBAC, @@ -31,6 +32,7 @@ import { MIN_KENDRA_NUMBER_OF_DOCS, MIN_SCORE_THRESHOLD, MODEL_PARAM_TYPES, + SUPPORTED_AUTHENTICATION_PROVIDERS, SUPPORTED_CHAT_PROVIDERS, SUPPORTED_CONVERSATION_MEMORY_TYPES, SUPPORTED_KNOWLEDGE_BASE_TYPES @@ -358,6 +360,39 @@ export const deployUseCaseBodySchema: JsonSchema = { required: ['KnowledgeBaseType'], additionalProperties: false }, + + AuthenticationParams: { + type: JsonSchemaType.OBJECT, + description: 'Parameters related to the Authentication.', + properties: { + AuthenticationProvider: { + type: JsonSchemaType.STRING, + description: 'Supported authentication provider.', + enum: SUPPORTED_AUTHENTICATION_PROVIDERS + }, + CognitoParams: { + type: JsonSchemaType.OBJECT, + description: 'Cognito user pool related parameters.', + properties: { + ExistingUserPoolId: { + type: JsonSchemaType.STRING, + description: 'Existing Cognito User Pool Id.', + pattern: '^[\\w-]+_[0-9a-zA-Z]+$', + minLength: 1, + maxLength: 55 + }, + ExistingUserPoolClientId: { + type: JsonSchemaType.STRING, + description: 'Existing Cognito User Pool Client Id.', + pattern: '^[\\w+]+$', + minLength: 1, + maxLength: 128 + } + }, + required: ['ExistingUserPoolId'] + }, + }, + }, LlmParams: { type: JsonSchemaType.OBJECT, description: 'Parameters related to the LLM performing inferences.', @@ -552,35 +587,49 @@ export const deployUseCaseBodySchema: JsonSchema = { } }, // If RAG is enabled, ensure we provide the KnowledgeBaseParams - oneOf: [ + allOf: [ { - properties: { - LlmParams: { + oneOf: [ + { properties: { - RAGEnabled: { - type: JsonSchemaType.BOOLEAN, - enum: [false] + LlmParams: { + properties: { + RAGEnabled: { + type: JsonSchemaType.BOOLEAN, + enum: [false] + } + } + }, + KnowledgeBaseParams: { + 'not': {} } } }, - KnowledgeBaseParams: { - 'not': {} - } - } + { + properties: { + LlmParams: { + properties: { + RAGEnabled: { + type: JsonSchemaType.BOOLEAN, + enum: [true] + } + } + } + }, + required: ['KnowledgeBaseParams'] + }, + ], }, { properties: { - LlmParams: { + AuthenticationParams: { properties: { - RAGEnabled: { - type: JsonSchemaType.BOOLEAN, - enum: [true] - } - } + AuthenticationProvider: { enum: [AUTHENTICATION_PROVIDERS.COGNITO] } + }, + required: ['CognitoParams'] } }, - required: ['KnowledgeBaseParams'] - } + }, ], required: ['UseCaseName', 'LlmParams'], additionalProperties: false diff --git a/source/infrastructure/lib/api/model-schema/update-usecase-body.ts b/source/infrastructure/lib/api/model-schema/update-usecase-body.ts index bee9d24b..202242fd 100644 --- a/source/infrastructure/lib/api/model-schema/update-usecase-body.ts +++ b/source/infrastructure/lib/api/model-schema/update-usecase-body.ts @@ -13,6 +13,7 @@ import { JsonSchema, JsonSchemaType, JsonSchemaVersion } from 'aws-cdk-lib/aws-apigateway'; import { + AUTHENTICATION_PROVIDERS, CHAT_PROVIDERS, DEFAULT_CONVERSATION_MEMORY_TYPE, DEFAULT_ENABLE_RBAC, @@ -25,6 +26,7 @@ import { MIN_KENDRA_NUMBER_OF_DOCS, MIN_SCORE_THRESHOLD, MODEL_PARAM_TYPES, + SUPPORTED_AUTHENTICATION_PROVIDERS, SUPPORTED_CHAT_PROVIDERS, SUPPORTED_CONVERSATION_MEMORY_TYPES, SUPPORTED_KNOWLEDGE_BASE_TYPES @@ -225,6 +227,47 @@ export const updateUseCaseBodySchema: JsonSchema = { ], additionalProperties: false }, + AuthenticationParams: { + type: JsonSchemaType.OBJECT, + description: 'Parameters related to the Authentication.', + properties: { + AuthenticationProvider: { + type: JsonSchemaType.STRING, + description: 'Supported authentication provider.', + enum: SUPPORTED_AUTHENTICATION_PROVIDERS + }, + CognitoParams: { + type: JsonSchemaType.OBJECT, + description: 'Cognito user pool related parameters.', + properties: { + ExistingUserPoolId: { + type: JsonSchemaType.STRING, + description: 'Existing Cognito User Pool Id.', + pattern: '^[\\w-]+_[0-9a-zA-Z]+$', + minLength: 1, + maxLength: 55 + }, + ExistingUserPoolClientId: { + type: JsonSchemaType.STRING, + description: 'Existing Cognito User Pool Client Id.', + pattern: '^[\\w+]+$', + minLength: 1, + maxLength: 128 + } + }, + required: ['ExistingUserPoolId'] + }, + }, + anyOf: [ + { + properties: { + AuthenticationProvider: { enum: [AUTHENTICATION_PROVIDERS.COGNITO] } + }, + required: ['CognitoParams'] + }, + ], + required: ['AuthenticationProvider'] + }, LlmParams: { type: JsonSchemaType.OBJECT, properties: { @@ -434,6 +477,9 @@ export const updateUseCaseBodySchema: JsonSchema = { }, { required: ['LlmParams'] + }, + { + required: ['AuthenticationParams'] } ], additionalProperties: false diff --git a/source/infrastructure/lib/use-case-management/management-stack.ts b/source/infrastructure/lib/use-case-management/management-stack.ts index d6bcf6d6..97f6ba9d 100644 --- a/source/infrastructure/lib/use-case-management/management-stack.ts +++ b/source/infrastructure/lib/use-case-management/management-stack.ts @@ -716,6 +716,13 @@ const buildCfnDeployRole = (scope: Construct, lambdaRole: iam.Role): iam.Role => ...awsCalledViaCondition } }), + new iam.PolicyStatement({ + effect: iam.Effect.ALLOW, + actions: [ + 'cognito-idp:DescribeUserPool' + ], + resources: [`arn:${cdk.Aws.PARTITION}:cognito-idp:${cdk.Aws.REGION}:${cdk.Aws.ACCOUNT_ID}:userpool/*`], + }), new iam.PolicyStatement({ effect: iam.Effect.ALLOW, actions: [ diff --git a/source/infrastructure/lib/utils/constants.ts b/source/infrastructure/lib/utils/constants.ts index b6cc0acf..6f3ef98c 100644 --- a/source/infrastructure/lib/utils/constants.ts +++ b/source/infrastructure/lib/utils/constants.ts @@ -138,7 +138,13 @@ export const enum CHAT_PROVIDERS { BEDROCK = 'Bedrock', SAGEMAKER = 'SageMaker' } + +export const enum AUTHENTICATION_PROVIDERS { + COGNITO = 'Cognito' +} + export const SUPPORTED_CHAT_PROVIDERS = [CHAT_PROVIDERS.BEDROCK, CHAT_PROVIDERS.SAGEMAKER]; +export const SUPPORTED_AUTHENTICATION_PROVIDERS = [AUTHENTICATION_PROVIDERS.COGNITO]; export const KENDRA_EDITIONS = ['DEVELOPER_EDITION', 'ENTERPRISE_EDITION']; export const DEFAULT_KENDRA_EDITION = 'DEVELOPER_EDITION'; diff --git a/source/infrastructure/test/api/model-schema/deploy-usecase-body.test.ts b/source/infrastructure/test/api/model-schema/deploy-usecase-body.test.ts index 637ef648..97400889 100644 --- a/source/infrastructure/test/api/model-schema/deploy-usecase-body.test.ts +++ b/source/infrastructure/test/api/model-schema/deploy-usecase-body.test.ts @@ -15,6 +15,7 @@ import { deployUseCaseBodySchema } from '../../../lib/api/model-schema/deploy-us import { checkValidationSucceeded, checkValidationFailed } from './utils'; import { Validator } from 'jsonschema'; import { + AUTHENTICATION_PROVIDERS, CHAT_PROVIDERS, CONVERSATION_MEMORY_TYPES, DEFAULT_KENDRA_EDITION, @@ -45,7 +46,7 @@ describe('Testing API schema validation', () => { BedrockLlmParams: { ModelId: 'fakemodel' } - } + }, }; checkValidationSucceeded(validator.validate(payload, schema)); }); @@ -59,7 +60,7 @@ describe('Testing API schema validation', () => { ModelId: 'fakemodel', ModelArn: 'arn:aws:bedrock:us-east-1:111111111111:custom-model/test.1/111111111111' } - } + }, }; checkValidationSucceeded(validator.validate(payload, schema)); }); @@ -1103,9 +1104,150 @@ describe('Testing API schema validation', () => { HumanPrefix: 'human', AiPrefix: 'ai', ChatHistoryLength: -1 + }, + AuthenticationParams: { + AuthenticationProvider: AUTHENTICATION_PROVIDERS.COGNITO, + CognitoParams: { + ExistingUserPoolId: 'us-east-1_111111111111' + } } }; checkValidationFailed(validator.validate(payload, schema)); }); }); + + + describe('AuthenticationParams Validation', () => { + describe('User Pool Id provided', () => { + + it('Valid User Pool Id provided', () => { + const payload = { + UseCaseName: 'test', + LlmParams: { + ModelProvider: CHAT_PROVIDERS.BEDROCK, + BedrockLlmParams: { + ModelId: 'fakemodel' + } + }, + AuthenticationParams: { + AuthenticationProvider: AUTHENTICATION_PROVIDERS.COGNITO, + CognitoParams: { + ExistingUserPoolId: 'us-east-1_111111111111' + } + } + }; + checkValidationSucceeded(validator.validate(payload, schema)); + }); + + it('Valid Pool Client Id provided', () => { + const payload = { + UseCaseName: 'test', + LlmParams: { + ModelProvider: CHAT_PROVIDERS.BEDROCK, + BedrockLlmParams: { + ModelId: 'fakemodel' + } + }, + AuthenticationParams: { + AuthenticationProvider: AUTHENTICATION_PROVIDERS.COGNITO, + CognitoParams: { + ExistingUserPoolId: 'us-east-1_111111111111', + ExistingUserPoolClientId: '1111111111111111111111111111' + } + } + }; + checkValidationSucceeded(validator.validate(payload, schema)); + }); + + + }); + + describe('Invalid Input provided', () => { + + it('Empty Authentication Params', () => { + const payload = { + UseCaseName: 'test', + LlmParams: { + ModelProvider: CHAT_PROVIDERS.BEDROCK, + BedrockLlmParams: { + ModelId: 'fakemodel' + } + }, + AuthenticationParams: { + } + }; + checkValidationFailed(validator.validate(payload, schema)); + }); + + + it('Unsupported Authentication Provider', () => { + const payload = { + UseCaseName: 'test', + LlmParams: { + ModelProvider: CHAT_PROVIDERS.BEDROCK, + BedrockLlmParams: { + ModelId: 'fakemodel' + } + }, + AuthenticationParams: { + AuthenticationProvider: 'unsupported', + } + }; + checkValidationFailed(validator.validate(payload, schema)); + }); + + it('Invalid User Pool Id provided', () => { + const payload = { + UseCaseName: 'test', + LlmParams: { + ModelProvider: CHAT_PROVIDERS.BEDROCK, + BedrockLlmParams: { + ModelId: 'fakemodel' + } + }, + AuthenticationParams: { + AuthenticationProvider: AUTHENTICATION_PROVIDERS.COGNITO, + CognitoParams: { + ExistingUserPoolId: 'invalid user pool' + } + } + }; + checkValidationFailed(validator.validate(payload, schema)); + }); + + it('No CognitoParams provided', () => { + const payload = { + UseCaseName: 'test', + LlmParams: { + ModelProvider: CHAT_PROVIDERS.BEDROCK, + BedrockLlmParams: { + ModelId: 'fakemodel' + } + }, + AuthenticationParams: { + AuthenticationProvider: AUTHENTICATION_PROVIDERS.COGNITO, + } + }; + checkValidationFailed(validator.validate(payload, schema)); + }); + + it('No User Pool provided', () => { + const payload = { + UseCaseName: 'test', + LlmParams: { + ModelProvider: CHAT_PROVIDERS.BEDROCK, + BedrockLlmParams: { + ModelId: 'fakemodel' + } + }, + AuthenticationParams: { + AuthenticationProvider: AUTHENTICATION_PROVIDERS.COGNITO, + CognitoParams: {} + } + }; + checkValidationFailed(validator.validate(payload, schema)); + }); + }); + }); + }); diff --git a/source/infrastructure/test/api/model-schema/update-usecase-body.test.ts b/source/infrastructure/test/api/model-schema/update-usecase-body.test.ts index af7526c9..a5e1c9dc 100644 --- a/source/infrastructure/test/api/model-schema/update-usecase-body.test.ts +++ b/source/infrastructure/test/api/model-schema/update-usecase-body.test.ts @@ -11,10 +11,10 @@ * and limitations under the License. * *********************************************************************************************************************/ -import { updateUseCaseBodySchema } from '../../../lib/api/model-schema/update-usecase-body'; -import { checkValidationSucceeded, checkValidationFailed } from './utils'; import { Validator } from 'jsonschema'; +import { updateUseCaseBodySchema } from '../../../lib/api/model-schema/update-usecase-body'; import { + AUTHENTICATION_PROVIDERS, CHAT_PROVIDERS, CONVERSATION_MEMORY_TYPES, KNOWLEDGE_BASE_TYPES, @@ -23,6 +23,7 @@ import { MIN_KENDRA_NUMBER_OF_DOCS, MIN_SCORE_THRESHOLD } from '../../../lib/utils/constants'; +import { checkValidationFailed, checkValidationSucceeded } from './utils'; describe('Testing API schema validation', () => { let schema: any; @@ -724,4 +725,91 @@ describe('Testing API schema validation', () => { checkValidationFailed(validator.validate(payload, schema)); }); }); + + describe('AuthenticationParams Validation', () => { + describe('User Pool Id provided', () => { + + it('Valid User Pool Id provided', () => { + const payload = { + AuthenticationParams: { + AuthenticationProvider: AUTHENTICATION_PROVIDERS.COGNITO, + CognitoParams: { + ExistingUserPoolId: 'us-east-1_111111111111' + } + } + }; + checkValidationSucceeded(validator.validate(payload, schema)); + }); + + it('Valid Pool Client Id provided', () => { + const payload = { + AuthenticationParams: { + AuthenticationProvider: AUTHENTICATION_PROVIDERS.COGNITO, + CognitoParams: { + ExistingUserPoolId: 'us-east-1_111111111111', + ExistingUserPoolClientId: '1111111111111111111111111111' + } + } + }; + checkValidationSucceeded(validator.validate(payload, schema)); + }); + + + }); + + describe('Invalid Input provided', () => { + + it('Empty Authentication Params', () => { + const payload = { + AuthenticationParams: { + } + }; + checkValidationFailed(validator.validate(payload, schema)); + }); + + + it('Unsupported Authentication Provider', () => { + const payload = { + AuthenticationParams: { + AuthenticationProvider: 'unsupported', + } + }; + checkValidationFailed(validator.validate(payload, schema)); + }); + + it('Invalid User Pool Id provided', () => { + const payload = { + AuthenticationParams: { + AuthenticationProvider: AUTHENTICATION_PROVIDERS.COGNITO, + CognitoParams: { + ExistingUserPoolId: 'invalid user pool' + } + } + }; + checkValidationFailed(validator.validate(payload, schema)); + }); + + it('No CognitoParams provided', () => { + const payload = { + AuthenticationParams: { + AuthenticationProvider: AUTHENTICATION_PROVIDERS.COGNITO, + } + }; + checkValidationFailed(validator.validate(payload, schema)); + }); + + it('No User Pool provided', () => { + const payload = { + AuthenticationParams: { + AuthenticationProvider: AUTHENTICATION_PROVIDERS.COGNITO, + CognitoParams: {} + } + }; + checkValidationFailed(validator.validate(payload, schema)); + }); + }); + }); + + + }); diff --git a/source/infrastructure/test/use-case-management/management-stack.test.ts b/source/infrastructure/test/use-case-management/management-stack.test.ts index c7348b85..58bc165d 100644 --- a/source/infrastructure/test/use-case-management/management-stack.test.ts +++ b/source/infrastructure/test/use-case-management/management-stack.test.ts @@ -713,6 +713,32 @@ describe('When creating a use case management Stack', () => { ] } }, + { + Action: [ + 'cognito-idp:DescribeUserPool' + ], + Effect: 'Allow', + Resource: { + 'Fn::Join': [ + '', + [ + 'arn:', + { + Ref: 'AWS::Partition' + }, + ':cognito-idp:', + { + Ref: 'AWS::Region' + }, + ':', + { + Ref: 'AWS::AccountId' + }, + ':userpool/*' + ] + ] + } + }, { Action: [ 'cloudfront:Create*', diff --git a/source/lambda/layers/aws-sdk-lib/package-lock.json b/source/lambda/layers/aws-sdk-lib/package-lock.json index 6fc54bdc..25f67225 100644 --- a/source/lambda/layers/aws-sdk-lib/package-lock.json +++ b/source/lambda/layers/aws-sdk-lib/package-lock.json @@ -10,6 +10,7 @@ "license": "Apache-2.0", "dependencies": { "@aws-sdk/client-cloudformation": "^3.620.1", + "@aws-sdk/client-cognito-identity-provider": "3.620.1", "@aws-sdk/client-dynamodb": "^3.620.1", "@aws-sdk/client-kendra": "^3.620.1", "@aws-sdk/client-s3": "^3.620.1", @@ -273,6 +274,68 @@ "node": ">=16.0.0" } }, + "node_modules/@aws-sdk/client-cognito-identity-provider": { + "version": "3.620.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity-provider/-/client-cognito-identity-provider-3.620.1.tgz", + "integrity": "sha512-uLxGG7shGimRHyl/LTuI86w0+JSMp2GuZy1ZWAhiTWycfkfFZyf0N1LakjhGIXcBJnXXlu4vKYhcJ01NTi9a4g==", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/client-sso-oidc": "3.620.1", + "@aws-sdk/client-sts": "3.620.1", + "@aws-sdk/core": "3.620.1", + "@aws-sdk/credential-provider-node": "3.620.1", + "@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.620.0", + "@aws-sdk/region-config-resolver": "3.614.0", + "@aws-sdk/types": "3.609.0", + "@aws-sdk/util-endpoints": "3.614.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.3.0", + "@smithy/fetch-http-handler": "^3.2.3", + "@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.12", + "@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.1.10", + "@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.12", + "@smithy/util-defaults-mode-node": "^3.0.12", + "@smithy/util-endpoints": "^2.0.5", + "@smithy/util-middleware": "^3.0.3", + "@smithy/util-retry": "^3.0.3", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity-provider/node_modules/@smithy/types": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.4.2.tgz", + "integrity": "sha512-tHiFcfcVedVBHpmHUEUHOCCih8iZbIAYn9NvPsNzaPm/237I3imdDdZoOC8c87H5HBAVEa06tTgb+OcSWV9g5w==", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, "node_modules/@aws-sdk/client-dynamodb": { "version": "3.620.1", "resolved": "https://registry.npmjs.org/@aws-sdk/client-dynamodb/-/client-dynamodb-3.620.1.tgz", @@ -1628,11 +1691,11 @@ } }, "node_modules/@smithy/abort-controller": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-3.1.1.tgz", - "integrity": "sha512-MBJBiidoe+0cTFhyxT8g+9g7CeVccLM0IOKKUMCNQ1CNMJ/eIfoo0RTfVrXOONEI1UCN1W+zkiHSbzUNE9dZtQ==", + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-3.1.4.tgz", + "integrity": "sha512-VupaALAQlXViW3/enTf/f5l5JZYSAxoJL7f0nanhNNKnww6DGCg1oYIuNP78KDugnkwthBO6iEcym16HhWV8RQ==", "dependencies": { - "@smithy/types": "^3.3.0", + "@smithy/types": "^3.4.2", "tslib": "^2.6.2" }, "engines": { @@ -1640,9 +1703,9 @@ } }, "node_modules/@smithy/abort-controller/node_modules/@smithy/types": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.3.0.tgz", - "integrity": "sha512-IxvBBCTFDHbVoK7zIxqA1ZOdc4QfM5HM7rGleCuHi7L1wnKv5Pn69xXJQ9hgxH60ZVygH9/JG0jRgtUncE3QUA==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.4.2.tgz", + "integrity": "sha512-tHiFcfcVedVBHpmHUEUHOCCih8iZbIAYn9NvPsNzaPm/237I3imdDdZoOC8c87H5HBAVEa06tTgb+OcSWV9g5w==", "dependencies": { "tslib": "^2.6.2" }, @@ -1668,14 +1731,14 @@ } }, "node_modules/@smithy/config-resolver": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-3.0.5.tgz", - "integrity": "sha512-SkW5LxfkSI1bUC74OtfBbdz+grQXYiPYolyu8VfpLIjEoN/sHVBlLeGXMQ1vX4ejkgfv6sxVbQJ32yF2cl1veA==", + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-3.0.8.tgz", + "integrity": "sha512-Tv1obAC18XOd2OnDAjSWmmthzx6Pdeh63FbLin8MlPiuJ2ATpKkq0NcNOJFr0dO+JmZXnwu8FQxKJ3TKJ3Hulw==", "dependencies": { - "@smithy/node-config-provider": "^3.1.4", - "@smithy/types": "^3.3.0", + "@smithy/node-config-provider": "^3.1.7", + "@smithy/types": "^3.4.2", "@smithy/util-config-provider": "^3.0.0", - "@smithy/util-middleware": "^3.0.3", + "@smithy/util-middleware": "^3.0.6", "tslib": "^2.6.2" }, "engines": { @@ -1683,9 +1746,9 @@ } }, "node_modules/@smithy/config-resolver/node_modules/@smithy/types": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.3.0.tgz", - "integrity": "sha512-IxvBBCTFDHbVoK7zIxqA1ZOdc4QfM5HM7rGleCuHi7L1wnKv5Pn69xXJQ9hgxH60ZVygH9/JG0jRgtUncE3QUA==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.4.2.tgz", + "integrity": "sha512-tHiFcfcVedVBHpmHUEUHOCCih8iZbIAYn9NvPsNzaPm/237I3imdDdZoOC8c87H5HBAVEa06tTgb+OcSWV9g5w==", "dependencies": { "tslib": "^2.6.2" }, @@ -1694,17 +1757,19 @@ } }, "node_modules/@smithy/core": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@smithy/core/-/core-2.3.1.tgz", - "integrity": "sha512-BC7VMXx/1BCmRPCVzzn4HGWAtsrb7/0758EtwOGFJQrlSwJBEjCcDLNZLFoL/68JexYa2s+KmgL/UfmXdG6v1w==", - "dependencies": { - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-retry": "^3.0.13", - "@smithy/middleware-serde": "^3.0.3", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.1.11", - "@smithy/types": "^3.3.0", - "@smithy/util-middleware": "^3.0.3", + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-2.4.6.tgz", + "integrity": "sha512-6lQQp99hnyuNNIzeTYSzCUXJHwvvFLY7hfdFGSJM95tjRDJGfzWYFRBXPaM9766LiiTsQ561KErtbufzUFSYUg==", + "dependencies": { + "@smithy/middleware-endpoint": "^3.1.3", + "@smithy/middleware-retry": "^3.0.21", + "@smithy/middleware-serde": "^3.0.6", + "@smithy/protocol-http": "^4.1.3", + "@smithy/smithy-client": "^3.3.5", + "@smithy/types": "^3.4.2", + "@smithy/util-body-length-browser": "^3.0.0", + "@smithy/util-middleware": "^3.0.6", + "@smithy/util-utf8": "^3.0.0", "tslib": "^2.6.2" }, "engines": { @@ -1712,9 +1777,9 @@ } }, "node_modules/@smithy/core/node_modules/@smithy/types": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.3.0.tgz", - "integrity": "sha512-IxvBBCTFDHbVoK7zIxqA1ZOdc4QfM5HM7rGleCuHi7L1wnKv5Pn69xXJQ9hgxH60ZVygH9/JG0jRgtUncE3QUA==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.4.2.tgz", + "integrity": "sha512-tHiFcfcVedVBHpmHUEUHOCCih8iZbIAYn9NvPsNzaPm/237I3imdDdZoOC8c87H5HBAVEa06tTgb+OcSWV9g5w==", "dependencies": { "tslib": "^2.6.2" }, @@ -1723,14 +1788,14 @@ } }, "node_modules/@smithy/credential-provider-imds": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-3.2.0.tgz", - "integrity": "sha512-0SCIzgd8LYZ9EJxUjLXBmEKSZR/P/w6l7Rz/pab9culE/RWuqelAKGJvn5qUOl8BgX8Yj5HWM50A5hiB/RzsgA==", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-3.2.3.tgz", + "integrity": "sha512-VoxMzSzdvkkjMJNE38yQgx4CfnmT+Z+5EUXkg4x7yag93eQkVQgZvN3XBSHC/ylfBbLbAtdu7flTCChX9I+mVg==", "dependencies": { - "@smithy/node-config-provider": "^3.1.4", - "@smithy/property-provider": "^3.1.3", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", + "@smithy/node-config-provider": "^3.1.7", + "@smithy/property-provider": "^3.1.6", + "@smithy/types": "^3.4.2", + "@smithy/url-parser": "^3.0.6", "tslib": "^2.6.2" }, "engines": { @@ -1738,9 +1803,9 @@ } }, "node_modules/@smithy/credential-provider-imds/node_modules/@smithy/types": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.3.0.tgz", - "integrity": "sha512-IxvBBCTFDHbVoK7zIxqA1ZOdc4QfM5HM7rGleCuHi7L1wnKv5Pn69xXJQ9hgxH60ZVygH9/JG0jRgtUncE3QUA==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.4.2.tgz", + "integrity": "sha512-tHiFcfcVedVBHpmHUEUHOCCih8iZbIAYn9NvPsNzaPm/237I3imdDdZoOC8c87H5HBAVEa06tTgb+OcSWV9g5w==", "dependencies": { "tslib": "^2.6.2" }, @@ -1866,21 +1931,21 @@ } }, "node_modules/@smithy/fetch-http-handler": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-3.2.4.tgz", - "integrity": "sha512-kBprh5Gs5h7ug4nBWZi1FZthdqSM+T7zMmsZxx0IBvWUn7dK3diz2SHn7Bs4dQGFDk8plDv375gzenDoNwrXjg==", + "version": "3.2.8", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-3.2.8.tgz", + "integrity": "sha512-Lqe0B8F5RM7zkw//6avq1SJ8AfaRd3ubFUS1eVp5WszV7p6Ne5hQ4dSuMHDpNRPhgTvj4va9Kd/pcVigHEHRow==", "dependencies": { - "@smithy/protocol-http": "^4.1.0", - "@smithy/querystring-builder": "^3.0.3", - "@smithy/types": "^3.3.0", + "@smithy/protocol-http": "^4.1.3", + "@smithy/querystring-builder": "^3.0.6", + "@smithy/types": "^3.4.2", "@smithy/util-base64": "^3.0.0", "tslib": "^2.6.2" } }, "node_modules/@smithy/fetch-http-handler/node_modules/@smithy/types": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.3.0.tgz", - "integrity": "sha512-IxvBBCTFDHbVoK7zIxqA1ZOdc4QfM5HM7rGleCuHi7L1wnKv5Pn69xXJQ9hgxH60ZVygH9/JG0jRgtUncE3QUA==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.4.2.tgz", + "integrity": "sha512-tHiFcfcVedVBHpmHUEUHOCCih8iZbIAYn9NvPsNzaPm/237I3imdDdZoOC8c87H5HBAVEa06tTgb+OcSWV9g5w==", "dependencies": { "tslib": "^2.6.2" }, @@ -1911,11 +1976,11 @@ } }, "node_modules/@smithy/hash-node": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-3.0.3.tgz", - "integrity": "sha512-2ctBXpPMG+B3BtWSGNnKELJ7SH9e4TNefJS0cd2eSkOOROeBnnVBnAy9LtJ8tY4vUEoe55N4CNPxzbWvR39iBw==", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-3.0.6.tgz", + "integrity": "sha512-c/FHEdKK/7DU2z6ZE91L36ahyXWayR3B+FzELjnYq7wH5YqIseM24V+pWCS9kFn1Ln8OFGTf+pyYPiHZuX0s/Q==", "dependencies": { - "@smithy/types": "^3.3.0", + "@smithy/types": "^3.4.2", "@smithy/util-buffer-from": "^3.0.0", "@smithy/util-utf8": "^3.0.0", "tslib": "^2.6.2" @@ -1925,9 +1990,9 @@ } }, "node_modules/@smithy/hash-node/node_modules/@smithy/types": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.3.0.tgz", - "integrity": "sha512-IxvBBCTFDHbVoK7zIxqA1ZOdc4QfM5HM7rGleCuHi7L1wnKv5Pn69xXJQ9hgxH60ZVygH9/JG0jRgtUncE3QUA==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.4.2.tgz", + "integrity": "sha512-tHiFcfcVedVBHpmHUEUHOCCih8iZbIAYn9NvPsNzaPm/237I3imdDdZoOC8c87H5HBAVEa06tTgb+OcSWV9g5w==", "dependencies": { "tslib": "^2.6.2" }, @@ -1960,18 +2025,18 @@ } }, "node_modules/@smithy/invalid-dependency": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-3.0.3.tgz", - "integrity": "sha512-ID1eL/zpDULmHJbflb864k72/SNOZCADRc9i7Exq3RUNJw6raWUSlFEQ+3PX3EYs++bTxZB2dE9mEHTQLv61tw==", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-3.0.6.tgz", + "integrity": "sha512-czM7Ioq3s8pIXht7oD+vmgy4Wfb4XavU/k/irO8NdXFFOx7YAlsCCcKOh/lJD1mJSYQqiR7NmpZ9JviryD/7AQ==", "dependencies": { - "@smithy/types": "^3.3.0", + "@smithy/types": "^3.4.2", "tslib": "^2.6.2" } }, "node_modules/@smithy/invalid-dependency/node_modules/@smithy/types": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.3.0.tgz", - "integrity": "sha512-IxvBBCTFDHbVoK7zIxqA1ZOdc4QfM5HM7rGleCuHi7L1wnKv5Pn69xXJQ9hgxH60ZVygH9/JG0jRgtUncE3QUA==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.4.2.tgz", + "integrity": "sha512-tHiFcfcVedVBHpmHUEUHOCCih8iZbIAYn9NvPsNzaPm/237I3imdDdZoOC8c87H5HBAVEa06tTgb+OcSWV9g5w==", "dependencies": { "tslib": "^2.6.2" }, @@ -2012,12 +2077,12 @@ } }, "node_modules/@smithy/middleware-content-length": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-3.0.5.tgz", - "integrity": "sha512-ILEzC2eyxx6ncej3zZSwMpB5RJ0zuqH7eMptxC4KN3f+v9bqT8ohssKbhNR78k/2tWW+KS5Spw+tbPF4Ejyqvw==", + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-3.0.8.tgz", + "integrity": "sha512-VuyszlSO49WKh3H9/kIO2kf07VUwGV80QRiaDxUfP8P8UKlokz381ETJvwLhwuypBYhLymCYyNhB3fLAGBX2og==", "dependencies": { - "@smithy/protocol-http": "^4.1.0", - "@smithy/types": "^3.3.0", + "@smithy/protocol-http": "^4.1.3", + "@smithy/types": "^3.4.2", "tslib": "^2.6.2" }, "engines": { @@ -2025,9 +2090,9 @@ } }, "node_modules/@smithy/middleware-content-length/node_modules/@smithy/types": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.3.0.tgz", - "integrity": "sha512-IxvBBCTFDHbVoK7zIxqA1ZOdc4QfM5HM7rGleCuHi7L1wnKv5Pn69xXJQ9hgxH60ZVygH9/JG0jRgtUncE3QUA==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.4.2.tgz", + "integrity": "sha512-tHiFcfcVedVBHpmHUEUHOCCih8iZbIAYn9NvPsNzaPm/237I3imdDdZoOC8c87H5HBAVEa06tTgb+OcSWV9g5w==", "dependencies": { "tslib": "^2.6.2" }, @@ -2036,16 +2101,16 @@ } }, "node_modules/@smithy/middleware-endpoint": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-3.1.0.tgz", - "integrity": "sha512-5y5aiKCEwg9TDPB4yFE7H6tYvGFf1OJHNczeY10/EFF8Ir8jZbNntQJxMWNfeQjC1mxPsaQ6mR9cvQbf+0YeMw==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-3.1.3.tgz", + "integrity": "sha512-KeM/OrK8MVFUsoJsmCN0MZMVPjKKLudn13xpgwIMpGTYpA8QZB2Xq5tJ+RE6iu3A6NhOI4VajDTwBsm8pwwrhg==", "dependencies": { - "@smithy/middleware-serde": "^3.0.3", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "@smithy/util-middleware": "^3.0.3", + "@smithy/middleware-serde": "^3.0.6", + "@smithy/node-config-provider": "^3.1.7", + "@smithy/shared-ini-file-loader": "^3.1.7", + "@smithy/types": "^3.4.2", + "@smithy/url-parser": "^3.0.6", + "@smithy/util-middleware": "^3.0.6", "tslib": "^2.6.2" }, "engines": { @@ -2053,9 +2118,9 @@ } }, "node_modules/@smithy/middleware-endpoint/node_modules/@smithy/types": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.3.0.tgz", - "integrity": "sha512-IxvBBCTFDHbVoK7zIxqA1ZOdc4QfM5HM7rGleCuHi7L1wnKv5Pn69xXJQ9hgxH60ZVygH9/JG0jRgtUncE3QUA==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.4.2.tgz", + "integrity": "sha512-tHiFcfcVedVBHpmHUEUHOCCih8iZbIAYn9NvPsNzaPm/237I3imdDdZoOC8c87H5HBAVEa06tTgb+OcSWV9g5w==", "dependencies": { "tslib": "^2.6.2" }, @@ -2064,17 +2129,17 @@ } }, "node_modules/@smithy/middleware-retry": { - "version": "3.0.13", - "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-3.0.13.tgz", - "integrity": "sha512-zvCLfaRYCaUmjbF2yxShGZdolSHft7NNCTA28HVN9hKcEbOH+g5irr1X9s+in8EpambclGnevZY4A3lYpvDCFw==", - "dependencies": { - "@smithy/node-config-provider": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/service-error-classification": "^3.0.3", - "@smithy/smithy-client": "^3.1.11", - "@smithy/types": "^3.3.0", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-retry": "^3.0.3", + "version": "3.0.21", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-3.0.21.tgz", + "integrity": "sha512-/h0fElV95LekVVEJuSw+aI11S1Y3zIUwBc6h9ZbUv43Gl2weXsbQwjLoet6j/Qtb0phfrSxS6pNg6FqgJOWZkA==", + "dependencies": { + "@smithy/node-config-provider": "^3.1.7", + "@smithy/protocol-http": "^4.1.3", + "@smithy/service-error-classification": "^3.0.6", + "@smithy/smithy-client": "^3.3.5", + "@smithy/types": "^3.4.2", + "@smithy/util-middleware": "^3.0.6", + "@smithy/util-retry": "^3.0.6", "tslib": "^2.6.2", "uuid": "^9.0.1" }, @@ -2083,9 +2148,9 @@ } }, "node_modules/@smithy/middleware-retry/node_modules/@smithy/types": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.3.0.tgz", - "integrity": "sha512-IxvBBCTFDHbVoK7zIxqA1ZOdc4QfM5HM7rGleCuHi7L1wnKv5Pn69xXJQ9hgxH60ZVygH9/JG0jRgtUncE3QUA==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.4.2.tgz", + "integrity": "sha512-tHiFcfcVedVBHpmHUEUHOCCih8iZbIAYn9NvPsNzaPm/237I3imdDdZoOC8c87H5HBAVEa06tTgb+OcSWV9g5w==", "dependencies": { "tslib": "^2.6.2" }, @@ -2094,11 +2159,11 @@ } }, "node_modules/@smithy/middleware-serde": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-3.0.3.tgz", - "integrity": "sha512-puUbyJQBcg9eSErFXjKNiGILJGtiqmuuNKEYNYfUD57fUl4i9+mfmThtQhvFXU0hCVG0iEJhvQUipUf+/SsFdA==", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-3.0.6.tgz", + "integrity": "sha512-KKTUSl1MzOM0MAjGbudeaVNtIDo+PpekTBkCNwvfZlKndodrnvRo+00USatiyLOc0ujjO9UydMRu3O9dYML7ag==", "dependencies": { - "@smithy/types": "^3.3.0", + "@smithy/types": "^3.4.2", "tslib": "^2.6.2" }, "engines": { @@ -2106,9 +2171,9 @@ } }, "node_modules/@smithy/middleware-serde/node_modules/@smithy/types": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.3.0.tgz", - "integrity": "sha512-IxvBBCTFDHbVoK7zIxqA1ZOdc4QfM5HM7rGleCuHi7L1wnKv5Pn69xXJQ9hgxH60ZVygH9/JG0jRgtUncE3QUA==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.4.2.tgz", + "integrity": "sha512-tHiFcfcVedVBHpmHUEUHOCCih8iZbIAYn9NvPsNzaPm/237I3imdDdZoOC8c87H5HBAVEa06tTgb+OcSWV9g5w==", "dependencies": { "tslib": "^2.6.2" }, @@ -2117,11 +2182,11 @@ } }, "node_modules/@smithy/middleware-stack": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-3.0.3.tgz", - "integrity": "sha512-r4klY9nFudB0r9UdSMaGSyjyQK5adUyPnQN/ZM6M75phTxOdnc/AhpvGD1fQUvgmqjQEBGCwpnPbDm8pH5PapA==", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-3.0.6.tgz", + "integrity": "sha512-2c0eSYhTQ8xQqHMcRxLMpadFbTXg6Zla5l0mwNftFCZMQmuhI7EbAJMx6R5eqfuV3YbJ3QGyS3d5uSmrHV8Khg==", "dependencies": { - "@smithy/types": "^3.3.0", + "@smithy/types": "^3.4.2", "tslib": "^2.6.2" }, "engines": { @@ -2129,9 +2194,9 @@ } }, "node_modules/@smithy/middleware-stack/node_modules/@smithy/types": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.3.0.tgz", - "integrity": "sha512-IxvBBCTFDHbVoK7zIxqA1ZOdc4QfM5HM7rGleCuHi7L1wnKv5Pn69xXJQ9hgxH60ZVygH9/JG0jRgtUncE3QUA==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.4.2.tgz", + "integrity": "sha512-tHiFcfcVedVBHpmHUEUHOCCih8iZbIAYn9NvPsNzaPm/237I3imdDdZoOC8c87H5HBAVEa06tTgb+OcSWV9g5w==", "dependencies": { "tslib": "^2.6.2" }, @@ -2140,13 +2205,13 @@ } }, "node_modules/@smithy/node-config-provider": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-3.1.4.tgz", - "integrity": "sha512-YvnElQy8HR4vDcAjoy7Xkx9YT8xZP4cBXcbJSgm/kxmiQu08DwUwj8rkGnyoJTpfl/3xYHH+d8zE+eHqoDCSdQ==", + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-3.1.7.tgz", + "integrity": "sha512-g3mfnC3Oo8pOI0dYuPXLtdW1WGVb3bR2tkV21GNkm0ZvQjLTtamXAwCWt/FCb0HGvKt3gHHmF1XerG0ICfalOg==", "dependencies": { - "@smithy/property-provider": "^3.1.3", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", + "@smithy/property-provider": "^3.1.6", + "@smithy/shared-ini-file-loader": "^3.1.7", + "@smithy/types": "^3.4.2", "tslib": "^2.6.2" }, "engines": { @@ -2154,9 +2219,9 @@ } }, "node_modules/@smithy/node-config-provider/node_modules/@smithy/types": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.3.0.tgz", - "integrity": "sha512-IxvBBCTFDHbVoK7zIxqA1ZOdc4QfM5HM7rGleCuHi7L1wnKv5Pn69xXJQ9hgxH60ZVygH9/JG0jRgtUncE3QUA==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.4.2.tgz", + "integrity": "sha512-tHiFcfcVedVBHpmHUEUHOCCih8iZbIAYn9NvPsNzaPm/237I3imdDdZoOC8c87H5HBAVEa06tTgb+OcSWV9g5w==", "dependencies": { "tslib": "^2.6.2" }, @@ -2165,14 +2230,14 @@ } }, "node_modules/@smithy/node-http-handler": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-3.1.4.tgz", - "integrity": "sha512-+UmxgixgOr/yLsUxcEKGH0fMNVteJFGkmRltYFHnBMlogyFdpzn2CwqWmxOrfJELhV34v0WSlaqG1UtE1uXlJg==", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-3.2.3.tgz", + "integrity": "sha512-/gcm5DJ3k1b1zEInzBGAZC8ntJ+jwrz1NcSIu+9dSXd1FfG0G6QgkDI40tt8/WYUbHtLyo8fEqtm2v29koWo/w==", "dependencies": { - "@smithy/abort-controller": "^3.1.1", - "@smithy/protocol-http": "^4.1.0", - "@smithy/querystring-builder": "^3.0.3", - "@smithy/types": "^3.3.0", + "@smithy/abort-controller": "^3.1.4", + "@smithy/protocol-http": "^4.1.3", + "@smithy/querystring-builder": "^3.0.6", + "@smithy/types": "^3.4.2", "tslib": "^2.6.2" }, "engines": { @@ -2180,9 +2245,9 @@ } }, "node_modules/@smithy/node-http-handler/node_modules/@smithy/types": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.3.0.tgz", - "integrity": "sha512-IxvBBCTFDHbVoK7zIxqA1ZOdc4QfM5HM7rGleCuHi7L1wnKv5Pn69xXJQ9hgxH60ZVygH9/JG0jRgtUncE3QUA==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.4.2.tgz", + "integrity": "sha512-tHiFcfcVedVBHpmHUEUHOCCih8iZbIAYn9NvPsNzaPm/237I3imdDdZoOC8c87H5HBAVEa06tTgb+OcSWV9g5w==", "dependencies": { "tslib": "^2.6.2" }, @@ -2191,11 +2256,11 @@ } }, "node_modules/@smithy/property-provider": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-3.1.3.tgz", - "integrity": "sha512-zahyOVR9Q4PEoguJ/NrFP4O7SMAfYO1HLhB18M+q+Z4KFd4V2obiMnlVoUFzFLSPeVt1POyNWneHHrZaTMoc/g==", + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-3.1.6.tgz", + "integrity": "sha512-NK3y/T7Q/Bw+Z8vsVs9MYIQ5v7gOX7clyrXcwhhIBQhbPgRl6JDrZbusO9qWDhcEus75Tg+VCxtIRfo3H76fpw==", "dependencies": { - "@smithy/types": "^3.3.0", + "@smithy/types": "^3.4.2", "tslib": "^2.6.2" }, "engines": { @@ -2203,9 +2268,9 @@ } }, "node_modules/@smithy/property-provider/node_modules/@smithy/types": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.3.0.tgz", - "integrity": "sha512-IxvBBCTFDHbVoK7zIxqA1ZOdc4QfM5HM7rGleCuHi7L1wnKv5Pn69xXJQ9hgxH60ZVygH9/JG0jRgtUncE3QUA==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.4.2.tgz", + "integrity": "sha512-tHiFcfcVedVBHpmHUEUHOCCih8iZbIAYn9NvPsNzaPm/237I3imdDdZoOC8c87H5HBAVEa06tTgb+OcSWV9g5w==", "dependencies": { "tslib": "^2.6.2" }, @@ -2214,11 +2279,11 @@ } }, "node_modules/@smithy/protocol-http": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-4.1.0.tgz", - "integrity": "sha512-dPVoHYQ2wcHooGXg3LQisa1hH0e4y0pAddPMeeUPipI1tEOqL6A4N0/G7abeq+K8wrwSgjk4C0wnD1XZpJm5aA==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-4.1.3.tgz", + "integrity": "sha512-GcbMmOYpH9iRqtC05RbRnc/0FssxSTHlmaNhYBTgSgNCYpdR3Kt88u5GAZTBmouzv+Zlj/VRv92J9ruuDeJuEw==", "dependencies": { - "@smithy/types": "^3.3.0", + "@smithy/types": "^3.4.2", "tslib": "^2.6.2" }, "engines": { @@ -2226,9 +2291,9 @@ } }, "node_modules/@smithy/protocol-http/node_modules/@smithy/types": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.3.0.tgz", - "integrity": "sha512-IxvBBCTFDHbVoK7zIxqA1ZOdc4QfM5HM7rGleCuHi7L1wnKv5Pn69xXJQ9hgxH60ZVygH9/JG0jRgtUncE3QUA==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.4.2.tgz", + "integrity": "sha512-tHiFcfcVedVBHpmHUEUHOCCih8iZbIAYn9NvPsNzaPm/237I3imdDdZoOC8c87H5HBAVEa06tTgb+OcSWV9g5w==", "dependencies": { "tslib": "^2.6.2" }, @@ -2237,11 +2302,11 @@ } }, "node_modules/@smithy/querystring-builder": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-3.0.3.tgz", - "integrity": "sha512-vyWckeUeesFKzCDaRwWLUA1Xym9McaA6XpFfAK5qI9DKJ4M33ooQGqvM4J+LalH4u/Dq9nFiC8U6Qn1qi0+9zw==", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-3.0.6.tgz", + "integrity": "sha512-sQe08RunoObe+Usujn9+R2zrLuQERi3CWvRO3BvnoWSYUaIrLKuAIeY7cMeDax6xGyfIP3x/yFWbEKSXvOnvVg==", "dependencies": { - "@smithy/types": "^3.3.0", + "@smithy/types": "^3.4.2", "@smithy/util-uri-escape": "^3.0.0", "tslib": "^2.6.2" }, @@ -2250,9 +2315,9 @@ } }, "node_modules/@smithy/querystring-builder/node_modules/@smithy/types": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.3.0.tgz", - "integrity": "sha512-IxvBBCTFDHbVoK7zIxqA1ZOdc4QfM5HM7rGleCuHi7L1wnKv5Pn69xXJQ9hgxH60ZVygH9/JG0jRgtUncE3QUA==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.4.2.tgz", + "integrity": "sha512-tHiFcfcVedVBHpmHUEUHOCCih8iZbIAYn9NvPsNzaPm/237I3imdDdZoOC8c87H5HBAVEa06tTgb+OcSWV9g5w==", "dependencies": { "tslib": "^2.6.2" }, @@ -2261,11 +2326,11 @@ } }, "node_modules/@smithy/querystring-parser": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-3.0.3.tgz", - "integrity": "sha512-zahM1lQv2YjmznnfQsWbYojFe55l0SLG/988brlLv1i8z3dubloLF+75ATRsqPBboUXsW6I9CPGE5rQgLfY0vQ==", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-3.0.6.tgz", + "integrity": "sha512-UJKw4LlEkytzz2Wq+uIdHf6qOtFfee/o7ruH0jF5I6UAuU+19r9QV7nU3P/uI0l6+oElRHmG/5cBBcGJrD7Ozg==", "dependencies": { - "@smithy/types": "^3.3.0", + "@smithy/types": "^3.4.2", "tslib": "^2.6.2" }, "engines": { @@ -2273,9 +2338,9 @@ } }, "node_modules/@smithy/querystring-parser/node_modules/@smithy/types": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.3.0.tgz", - "integrity": "sha512-IxvBBCTFDHbVoK7zIxqA1ZOdc4QfM5HM7rGleCuHi7L1wnKv5Pn69xXJQ9hgxH60ZVygH9/JG0jRgtUncE3QUA==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.4.2.tgz", + "integrity": "sha512-tHiFcfcVedVBHpmHUEUHOCCih8iZbIAYn9NvPsNzaPm/237I3imdDdZoOC8c87H5HBAVEa06tTgb+OcSWV9g5w==", "dependencies": { "tslib": "^2.6.2" }, @@ -2284,20 +2349,20 @@ } }, "node_modules/@smithy/service-error-classification": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-3.0.3.tgz", - "integrity": "sha512-Jn39sSl8cim/VlkLsUhRFq/dKDnRUFlfRkvhOJaUbLBXUsLRLNf9WaxDv/z9BjuQ3A6k/qE8af1lsqcwm7+DaQ==", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-3.0.6.tgz", + "integrity": "sha512-53SpchU3+DUZrN7J6sBx9tBiCVGzsib2e4sc512Q7K9fpC5zkJKs6Z9s+qbMxSYrkEkle6hnMtrts7XNkMJJMg==", "dependencies": { - "@smithy/types": "^3.3.0" + "@smithy/types": "^3.4.2" }, "engines": { "node": ">=16.0.0" } }, "node_modules/@smithy/service-error-classification/node_modules/@smithy/types": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.3.0.tgz", - "integrity": "sha512-IxvBBCTFDHbVoK7zIxqA1ZOdc4QfM5HM7rGleCuHi7L1wnKv5Pn69xXJQ9hgxH60ZVygH9/JG0jRgtUncE3QUA==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.4.2.tgz", + "integrity": "sha512-tHiFcfcVedVBHpmHUEUHOCCih8iZbIAYn9NvPsNzaPm/237I3imdDdZoOC8c87H5HBAVEa06tTgb+OcSWV9g5w==", "dependencies": { "tslib": "^2.6.2" }, @@ -2306,11 +2371,11 @@ } }, "node_modules/@smithy/shared-ini-file-loader": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-3.1.4.tgz", - "integrity": "sha512-qMxS4hBGB8FY2GQqshcRUy1K6k8aBWP5vwm8qKkCT3A9K2dawUwOIJfqh9Yste/Bl0J2lzosVyrXDj68kLcHXQ==", + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-3.1.7.tgz", + "integrity": "sha512-IA4K2qTJYXkF5OfVN4vsY1hfnUZjaslEE8Fsr/gGFza4TAC2A9NfnZuSY2srQIbt9bwtjHiAayrRVgKse4Q7fA==", "dependencies": { - "@smithy/types": "^3.3.0", + "@smithy/types": "^3.4.2", "tslib": "^2.6.2" }, "engines": { @@ -2318,9 +2383,9 @@ } }, "node_modules/@smithy/shared-ini-file-loader/node_modules/@smithy/types": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.3.0.tgz", - "integrity": "sha512-IxvBBCTFDHbVoK7zIxqA1ZOdc4QfM5HM7rGleCuHi7L1wnKv5Pn69xXJQ9hgxH60ZVygH9/JG0jRgtUncE3QUA==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.4.2.tgz", + "integrity": "sha512-tHiFcfcVedVBHpmHUEUHOCCih8iZbIAYn9NvPsNzaPm/237I3imdDdZoOC8c87H5HBAVEa06tTgb+OcSWV9g5w==", "dependencies": { "tslib": "^2.6.2" }, @@ -2329,15 +2394,15 @@ } }, "node_modules/@smithy/signature-v4": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-4.1.0.tgz", - "integrity": "sha512-aRryp2XNZeRcOtuJoxjydO6QTaVhxx/vjaR+gx7ZjaFgrgPRyZ3HCTbfwqYj6ZWEBHkCSUfcaymKPURaByukag==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-4.1.4.tgz", + "integrity": "sha512-72MiK7xYukNsnLJI9NqvUHqTu0ziEsfMsYNlWpiJfuGQnCTFKpckThlEatirvcA/LmT1h7rRO+pJD06PYsPu9Q==", "dependencies": { "@smithy/is-array-buffer": "^3.0.0", - "@smithy/protocol-http": "^4.1.0", - "@smithy/types": "^3.3.0", + "@smithy/protocol-http": "^4.1.3", + "@smithy/types": "^3.4.2", "@smithy/util-hex-encoding": "^3.0.0", - "@smithy/util-middleware": "^3.0.3", + "@smithy/util-middleware": "^3.0.6", "@smithy/util-uri-escape": "^3.0.0", "@smithy/util-utf8": "^3.0.0", "tslib": "^2.6.2" @@ -2347,9 +2412,9 @@ } }, "node_modules/@smithy/signature-v4/node_modules/@smithy/types": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.3.0.tgz", - "integrity": "sha512-IxvBBCTFDHbVoK7zIxqA1ZOdc4QfM5HM7rGleCuHi7L1wnKv5Pn69xXJQ9hgxH60ZVygH9/JG0jRgtUncE3QUA==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.4.2.tgz", + "integrity": "sha512-tHiFcfcVedVBHpmHUEUHOCCih8iZbIAYn9NvPsNzaPm/237I3imdDdZoOC8c87H5HBAVEa06tTgb+OcSWV9g5w==", "dependencies": { "tslib": "^2.6.2" }, @@ -2358,15 +2423,15 @@ } }, "node_modules/@smithy/smithy-client": { - "version": "3.1.11", - "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-3.1.11.tgz", - "integrity": "sha512-l0BpyYkciNyMaS+PnFFz4aO5sBcXvGLoJd7mX9xrMBIm2nIQBVvYgp2ZpPDMzwjKCavsXu06iuCm0F6ZJZc6yQ==", + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-3.3.5.tgz", + "integrity": "sha512-7IZi8J3Dr9n3tX+lcpmJ/5tCYIqoXdblFBaPuv0SEKZFRpCxE+TqIWL6I3t7jLlk9TWu3JSvEZAhtjB9yvB+zA==", "dependencies": { - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-stack": "^3.0.3", - "@smithy/protocol-http": "^4.1.0", - "@smithy/types": "^3.3.0", - "@smithy/util-stream": "^3.1.3", + "@smithy/middleware-endpoint": "^3.1.3", + "@smithy/middleware-stack": "^3.0.6", + "@smithy/protocol-http": "^4.1.3", + "@smithy/types": "^3.4.2", + "@smithy/util-stream": "^3.1.8", "tslib": "^2.6.2" }, "engines": { @@ -2374,9 +2439,9 @@ } }, "node_modules/@smithy/smithy-client/node_modules/@smithy/types": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.3.0.tgz", - "integrity": "sha512-IxvBBCTFDHbVoK7zIxqA1ZOdc4QfM5HM7rGleCuHi7L1wnKv5Pn69xXJQ9hgxH60ZVygH9/JG0jRgtUncE3QUA==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.4.2.tgz", + "integrity": "sha512-tHiFcfcVedVBHpmHUEUHOCCih8iZbIAYn9NvPsNzaPm/237I3imdDdZoOC8c87H5HBAVEa06tTgb+OcSWV9g5w==", "dependencies": { "tslib": "^2.6.2" }, @@ -2396,19 +2461,19 @@ } }, "node_modules/@smithy/url-parser": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-3.0.3.tgz", - "integrity": "sha512-pw3VtZtX2rg+s6HMs6/+u9+hu6oY6U7IohGhVNnjbgKy86wcIsSZwgHrFR+t67Uyxvp4Xz3p3kGXXIpTNisq8A==", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-3.0.6.tgz", + "integrity": "sha512-47Op/NU8Opt49KyGpHtVdnmmJMsp2hEwBdyjuFB9M2V5QVOwA7pBhhxKN5z6ztKGrMw76gd8MlbPuzzvaAncuQ==", "dependencies": { - "@smithy/querystring-parser": "^3.0.3", - "@smithy/types": "^3.3.0", + "@smithy/querystring-parser": "^3.0.6", + "@smithy/types": "^3.4.2", "tslib": "^2.6.2" } }, "node_modules/@smithy/url-parser/node_modules/@smithy/types": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.3.0.tgz", - "integrity": "sha512-IxvBBCTFDHbVoK7zIxqA1ZOdc4QfM5HM7rGleCuHi7L1wnKv5Pn69xXJQ9hgxH60ZVygH9/JG0jRgtUncE3QUA==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.4.2.tgz", + "integrity": "sha512-tHiFcfcVedVBHpmHUEUHOCCih8iZbIAYn9NvPsNzaPm/237I3imdDdZoOC8c87H5HBAVEa06tTgb+OcSWV9g5w==", "dependencies": { "tslib": "^2.6.2" }, @@ -2472,13 +2537,13 @@ } }, "node_modules/@smithy/util-defaults-mode-browser": { - "version": "3.0.13", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-3.0.13.tgz", - "integrity": "sha512-ZIRSUsnnMRStOP6OKtW+gCSiVFkwnfQF2xtf32QKAbHR6ACjhbAybDvry+3L5qQYdh3H6+7yD/AiUE45n8mTTw==", + "version": "3.0.21", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-3.0.21.tgz", + "integrity": "sha512-M/FhTBk4c/SsB91dD/M4gMGfJO7z/qJaM9+XQQIqBOf4qzZYMExnP7R4VdGwxxH8IKMGW+8F0I4rNtVRrcfPoA==", "dependencies": { - "@smithy/property-provider": "^3.1.3", - "@smithy/smithy-client": "^3.1.11", - "@smithy/types": "^3.3.0", + "@smithy/property-provider": "^3.1.6", + "@smithy/smithy-client": "^3.3.5", + "@smithy/types": "^3.4.2", "bowser": "^2.11.0", "tslib": "^2.6.2" }, @@ -2487,9 +2552,9 @@ } }, "node_modules/@smithy/util-defaults-mode-browser/node_modules/@smithy/types": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.3.0.tgz", - "integrity": "sha512-IxvBBCTFDHbVoK7zIxqA1ZOdc4QfM5HM7rGleCuHi7L1wnKv5Pn69xXJQ9hgxH60ZVygH9/JG0jRgtUncE3QUA==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.4.2.tgz", + "integrity": "sha512-tHiFcfcVedVBHpmHUEUHOCCih8iZbIAYn9NvPsNzaPm/237I3imdDdZoOC8c87H5HBAVEa06tTgb+OcSWV9g5w==", "dependencies": { "tslib": "^2.6.2" }, @@ -2498,16 +2563,16 @@ } }, "node_modules/@smithy/util-defaults-mode-node": { - "version": "3.0.13", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-3.0.13.tgz", - "integrity": "sha512-voUa8TFJGfD+U12tlNNLCDlXibt9vRdNzRX45Onk/WxZe7TS+hTOZouEZRa7oARGicdgeXvt1A0W45qLGYdy+g==", + "version": "3.0.21", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-3.0.21.tgz", + "integrity": "sha512-NiLinPvF86U3S2Pdx/ycqd4bnY5dmFSPNL5KYRwbNjqQFS09M5Wzqk8BNk61/47xCYz1X/6KeiSk9qgYPTtuDw==", "dependencies": { - "@smithy/config-resolver": "^3.0.5", - "@smithy/credential-provider-imds": "^3.2.0", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/property-provider": "^3.1.3", - "@smithy/smithy-client": "^3.1.11", - "@smithy/types": "^3.3.0", + "@smithy/config-resolver": "^3.0.8", + "@smithy/credential-provider-imds": "^3.2.3", + "@smithy/node-config-provider": "^3.1.7", + "@smithy/property-provider": "^3.1.6", + "@smithy/smithy-client": "^3.3.5", + "@smithy/types": "^3.4.2", "tslib": "^2.6.2" }, "engines": { @@ -2515,9 +2580,9 @@ } }, "node_modules/@smithy/util-defaults-mode-node/node_modules/@smithy/types": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.3.0.tgz", - "integrity": "sha512-IxvBBCTFDHbVoK7zIxqA1ZOdc4QfM5HM7rGleCuHi7L1wnKv5Pn69xXJQ9hgxH60ZVygH9/JG0jRgtUncE3QUA==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.4.2.tgz", + "integrity": "sha512-tHiFcfcVedVBHpmHUEUHOCCih8iZbIAYn9NvPsNzaPm/237I3imdDdZoOC8c87H5HBAVEa06tTgb+OcSWV9g5w==", "dependencies": { "tslib": "^2.6.2" }, @@ -2526,12 +2591,12 @@ } }, "node_modules/@smithy/util-endpoints": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-2.0.5.tgz", - "integrity": "sha512-ReQP0BWihIE68OAblC/WQmDD40Gx+QY1Ez8mTdFMXpmjfxSyz2fVQu3A4zXRfQU9sZXtewk3GmhfOHswvX+eNg==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-2.1.2.tgz", + "integrity": "sha512-FEISzffb4H8DLzGq1g4MuDpcv6CIG15fXoQzDH9SjpRJv6h7J++1STFWWinilG0tQh9H1v2UKWG19Jjr2B16zQ==", "dependencies": { - "@smithy/node-config-provider": "^3.1.4", - "@smithy/types": "^3.3.0", + "@smithy/node-config-provider": "^3.1.7", + "@smithy/types": "^3.4.2", "tslib": "^2.6.2" }, "engines": { @@ -2539,9 +2604,9 @@ } }, "node_modules/@smithy/util-endpoints/node_modules/@smithy/types": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.3.0.tgz", - "integrity": "sha512-IxvBBCTFDHbVoK7zIxqA1ZOdc4QfM5HM7rGleCuHi7L1wnKv5Pn69xXJQ9hgxH60ZVygH9/JG0jRgtUncE3QUA==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.4.2.tgz", + "integrity": "sha512-tHiFcfcVedVBHpmHUEUHOCCih8iZbIAYn9NvPsNzaPm/237I3imdDdZoOC8c87H5HBAVEa06tTgb+OcSWV9g5w==", "dependencies": { "tslib": "^2.6.2" }, @@ -2561,11 +2626,11 @@ } }, "node_modules/@smithy/util-middleware": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-3.0.3.tgz", - "integrity": "sha512-l+StyYYK/eO3DlVPbU+4Bi06Jjal+PFLSMmlWM1BEwyLxZ3aKkf1ROnoIakfaA7mC6uw3ny7JBkau4Yc+5zfWw==", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-3.0.6.tgz", + "integrity": "sha512-BxbX4aBhI1O9p87/xM+zWy0GzT3CEVcXFPBRDoHAM+pV0eSW156pR+PSYEz0DQHDMYDsYAflC2bQNz2uaDBUZQ==", "dependencies": { - "@smithy/types": "^3.3.0", + "@smithy/types": "^3.4.2", "tslib": "^2.6.2" }, "engines": { @@ -2573,9 +2638,9 @@ } }, "node_modules/@smithy/util-middleware/node_modules/@smithy/types": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.3.0.tgz", - "integrity": "sha512-IxvBBCTFDHbVoK7zIxqA1ZOdc4QfM5HM7rGleCuHi7L1wnKv5Pn69xXJQ9hgxH60ZVygH9/JG0jRgtUncE3QUA==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.4.2.tgz", + "integrity": "sha512-tHiFcfcVedVBHpmHUEUHOCCih8iZbIAYn9NvPsNzaPm/237I3imdDdZoOC8c87H5HBAVEa06tTgb+OcSWV9g5w==", "dependencies": { "tslib": "^2.6.2" }, @@ -2584,12 +2649,12 @@ } }, "node_modules/@smithy/util-retry": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-3.0.3.tgz", - "integrity": "sha512-AFw+hjpbtVApzpNDhbjNG5NA3kyoMs7vx0gsgmlJF4s+yz1Zlepde7J58zpIRIsdjc+emhpAITxA88qLkPF26w==", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-3.0.6.tgz", + "integrity": "sha512-BRZiuF7IwDntAbevqMco67an0Sr9oLQJqqRCsSPZZHYRnehS0LHDAkJk/pSmI7Z8c/1Vet294H7fY2fWUgB+Rg==", "dependencies": { - "@smithy/service-error-classification": "^3.0.3", - "@smithy/types": "^3.3.0", + "@smithy/service-error-classification": "^3.0.6", + "@smithy/types": "^3.4.2", "tslib": "^2.6.2" }, "engines": { @@ -2597,9 +2662,9 @@ } }, "node_modules/@smithy/util-retry/node_modules/@smithy/types": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.3.0.tgz", - "integrity": "sha512-IxvBBCTFDHbVoK7zIxqA1ZOdc4QfM5HM7rGleCuHi7L1wnKv5Pn69xXJQ9hgxH60ZVygH9/JG0jRgtUncE3QUA==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.4.2.tgz", + "integrity": "sha512-tHiFcfcVedVBHpmHUEUHOCCih8iZbIAYn9NvPsNzaPm/237I3imdDdZoOC8c87H5HBAVEa06tTgb+OcSWV9g5w==", "dependencies": { "tslib": "^2.6.2" }, @@ -2608,13 +2673,13 @@ } }, "node_modules/@smithy/util-stream": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-3.1.3.tgz", - "integrity": "sha512-FIv/bRhIlAxC0U7xM1BCnF2aDRPq0UaelqBHkM2lsCp26mcBbgI0tCVTv+jGdsQLUmAMybua/bjDsSu8RQHbmw==", + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-3.1.8.tgz", + "integrity": "sha512-hoKOqSmb8FD3WLObuB5hwbM7bNIWgcnvkThokTvVq7J5PKjlLUK5qQQcB9zWLHIoSaIlf3VIv2OxZY2wtQjcRQ==", "dependencies": { - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/types": "^3.3.0", + "@smithy/fetch-http-handler": "^3.2.8", + "@smithy/node-http-handler": "^3.2.3", + "@smithy/types": "^3.4.2", "@smithy/util-base64": "^3.0.0", "@smithy/util-buffer-from": "^3.0.0", "@smithy/util-hex-encoding": "^3.0.0", @@ -2626,9 +2691,9 @@ } }, "node_modules/@smithy/util-stream/node_modules/@smithy/types": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.3.0.tgz", - "integrity": "sha512-IxvBBCTFDHbVoK7zIxqA1ZOdc4QfM5HM7rGleCuHi7L1wnKv5Pn69xXJQ9hgxH60ZVygH9/JG0jRgtUncE3QUA==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.4.2.tgz", + "integrity": "sha512-tHiFcfcVedVBHpmHUEUHOCCih8iZbIAYn9NvPsNzaPm/237I3imdDdZoOC8c87H5HBAVEa06tTgb+OcSWV9g5w==", "dependencies": { "tslib": "^2.6.2" }, @@ -2970,6 +3035,64 @@ } } }, + "@aws-sdk/client-cognito-identity-provider": { + "version": "3.620.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity-provider/-/client-cognito-identity-provider-3.620.1.tgz", + "integrity": "sha512-uLxGG7shGimRHyl/LTuI86w0+JSMp2GuZy1ZWAhiTWycfkfFZyf0N1LakjhGIXcBJnXXlu4vKYhcJ01NTi9a4g==", + "requires": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/client-sso-oidc": "3.620.1", + "@aws-sdk/client-sts": "3.620.1", + "@aws-sdk/core": "3.620.1", + "@aws-sdk/credential-provider-node": "3.620.1", + "@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.620.0", + "@aws-sdk/region-config-resolver": "3.614.0", + "@aws-sdk/types": "3.609.0", + "@aws-sdk/util-endpoints": "3.614.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.3.0", + "@smithy/fetch-http-handler": "^3.2.3", + "@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.12", + "@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.1.10", + "@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.12", + "@smithy/util-defaults-mode-node": "^3.0.12", + "@smithy/util-endpoints": "^2.0.5", + "@smithy/util-middleware": "^3.0.3", + "@smithy/util-retry": "^3.0.3", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "dependencies": { + "@smithy/types": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.4.2.tgz", + "integrity": "sha512-tHiFcfcVedVBHpmHUEUHOCCih8iZbIAYn9NvPsNzaPm/237I3imdDdZoOC8c87H5HBAVEa06tTgb+OcSWV9g5w==", + "requires": { + "tslib": "^2.6.2" + } + } + } + }, "@aws-sdk/client-dynamodb": { "version": "3.620.1", "resolved": "https://registry.npmjs.org/@aws-sdk/client-dynamodb/-/client-dynamodb-3.620.1.tgz", @@ -4142,18 +4265,18 @@ } }, "@smithy/abort-controller": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-3.1.1.tgz", - "integrity": "sha512-MBJBiidoe+0cTFhyxT8g+9g7CeVccLM0IOKKUMCNQ1CNMJ/eIfoo0RTfVrXOONEI1UCN1W+zkiHSbzUNE9dZtQ==", + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-3.1.4.tgz", + "integrity": "sha512-VupaALAQlXViW3/enTf/f5l5JZYSAxoJL7f0nanhNNKnww6DGCg1oYIuNP78KDugnkwthBO6iEcym16HhWV8RQ==", "requires": { - "@smithy/types": "^3.3.0", + "@smithy/types": "^3.4.2", "tslib": "^2.6.2" }, "dependencies": { "@smithy/types": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.3.0.tgz", - "integrity": "sha512-IxvBBCTFDHbVoK7zIxqA1ZOdc4QfM5HM7rGleCuHi7L1wnKv5Pn69xXJQ9hgxH60ZVygH9/JG0jRgtUncE3QUA==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.4.2.tgz", + "integrity": "sha512-tHiFcfcVedVBHpmHUEUHOCCih8iZbIAYn9NvPsNzaPm/237I3imdDdZoOC8c87H5HBAVEa06tTgb+OcSWV9g5w==", "requires": { "tslib": "^2.6.2" } @@ -4178,21 +4301,21 @@ } }, "@smithy/config-resolver": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-3.0.5.tgz", - "integrity": "sha512-SkW5LxfkSI1bUC74OtfBbdz+grQXYiPYolyu8VfpLIjEoN/sHVBlLeGXMQ1vX4ejkgfv6sxVbQJ32yF2cl1veA==", + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-3.0.8.tgz", + "integrity": "sha512-Tv1obAC18XOd2OnDAjSWmmthzx6Pdeh63FbLin8MlPiuJ2ATpKkq0NcNOJFr0dO+JmZXnwu8FQxKJ3TKJ3Hulw==", "requires": { - "@smithy/node-config-provider": "^3.1.4", - "@smithy/types": "^3.3.0", + "@smithy/node-config-provider": "^3.1.7", + "@smithy/types": "^3.4.2", "@smithy/util-config-provider": "^3.0.0", - "@smithy/util-middleware": "^3.0.3", + "@smithy/util-middleware": "^3.0.6", "tslib": "^2.6.2" }, "dependencies": { "@smithy/types": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.3.0.tgz", - "integrity": "sha512-IxvBBCTFDHbVoK7zIxqA1ZOdc4QfM5HM7rGleCuHi7L1wnKv5Pn69xXJQ9hgxH60ZVygH9/JG0jRgtUncE3QUA==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.4.2.tgz", + "integrity": "sha512-tHiFcfcVedVBHpmHUEUHOCCih8iZbIAYn9NvPsNzaPm/237I3imdDdZoOC8c87H5HBAVEa06tTgb+OcSWV9g5w==", "requires": { "tslib": "^2.6.2" } @@ -4200,24 +4323,26 @@ } }, "@smithy/core": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@smithy/core/-/core-2.3.1.tgz", - "integrity": "sha512-BC7VMXx/1BCmRPCVzzn4HGWAtsrb7/0758EtwOGFJQrlSwJBEjCcDLNZLFoL/68JexYa2s+KmgL/UfmXdG6v1w==", + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-2.4.6.tgz", + "integrity": "sha512-6lQQp99hnyuNNIzeTYSzCUXJHwvvFLY7hfdFGSJM95tjRDJGfzWYFRBXPaM9766LiiTsQ561KErtbufzUFSYUg==", "requires": { - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-retry": "^3.0.13", - "@smithy/middleware-serde": "^3.0.3", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.1.11", - "@smithy/types": "^3.3.0", - "@smithy/util-middleware": "^3.0.3", + "@smithy/middleware-endpoint": "^3.1.3", + "@smithy/middleware-retry": "^3.0.21", + "@smithy/middleware-serde": "^3.0.6", + "@smithy/protocol-http": "^4.1.3", + "@smithy/smithy-client": "^3.3.5", + "@smithy/types": "^3.4.2", + "@smithy/util-body-length-browser": "^3.0.0", + "@smithy/util-middleware": "^3.0.6", + "@smithy/util-utf8": "^3.0.0", "tslib": "^2.6.2" }, "dependencies": { "@smithy/types": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.3.0.tgz", - "integrity": "sha512-IxvBBCTFDHbVoK7zIxqA1ZOdc4QfM5HM7rGleCuHi7L1wnKv5Pn69xXJQ9hgxH60ZVygH9/JG0jRgtUncE3QUA==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.4.2.tgz", + "integrity": "sha512-tHiFcfcVedVBHpmHUEUHOCCih8iZbIAYn9NvPsNzaPm/237I3imdDdZoOC8c87H5HBAVEa06tTgb+OcSWV9g5w==", "requires": { "tslib": "^2.6.2" } @@ -4225,21 +4350,21 @@ } }, "@smithy/credential-provider-imds": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-3.2.0.tgz", - "integrity": "sha512-0SCIzgd8LYZ9EJxUjLXBmEKSZR/P/w6l7Rz/pab9culE/RWuqelAKGJvn5qUOl8BgX8Yj5HWM50A5hiB/RzsgA==", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-3.2.3.tgz", + "integrity": "sha512-VoxMzSzdvkkjMJNE38yQgx4CfnmT+Z+5EUXkg4x7yag93eQkVQgZvN3XBSHC/ylfBbLbAtdu7flTCChX9I+mVg==", "requires": { - "@smithy/node-config-provider": "^3.1.4", - "@smithy/property-provider": "^3.1.3", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", + "@smithy/node-config-provider": "^3.1.7", + "@smithy/property-provider": "^3.1.6", + "@smithy/types": "^3.4.2", + "@smithy/url-parser": "^3.0.6", "tslib": "^2.6.2" }, "dependencies": { "@smithy/types": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.3.0.tgz", - "integrity": "sha512-IxvBBCTFDHbVoK7zIxqA1ZOdc4QfM5HM7rGleCuHi7L1wnKv5Pn69xXJQ9hgxH60ZVygH9/JG0jRgtUncE3QUA==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.4.2.tgz", + "integrity": "sha512-tHiFcfcVedVBHpmHUEUHOCCih8iZbIAYn9NvPsNzaPm/237I3imdDdZoOC8c87H5HBAVEa06tTgb+OcSWV9g5w==", "requires": { "tslib": "^2.6.2" } @@ -4347,21 +4472,21 @@ } }, "@smithy/fetch-http-handler": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-3.2.4.tgz", - "integrity": "sha512-kBprh5Gs5h7ug4nBWZi1FZthdqSM+T7zMmsZxx0IBvWUn7dK3diz2SHn7Bs4dQGFDk8plDv375gzenDoNwrXjg==", + "version": "3.2.8", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-3.2.8.tgz", + "integrity": "sha512-Lqe0B8F5RM7zkw//6avq1SJ8AfaRd3ubFUS1eVp5WszV7p6Ne5hQ4dSuMHDpNRPhgTvj4va9Kd/pcVigHEHRow==", "requires": { - "@smithy/protocol-http": "^4.1.0", - "@smithy/querystring-builder": "^3.0.3", - "@smithy/types": "^3.3.0", + "@smithy/protocol-http": "^4.1.3", + "@smithy/querystring-builder": "^3.0.6", + "@smithy/types": "^3.4.2", "@smithy/util-base64": "^3.0.0", "tslib": "^2.6.2" }, "dependencies": { "@smithy/types": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.3.0.tgz", - "integrity": "sha512-IxvBBCTFDHbVoK7zIxqA1ZOdc4QfM5HM7rGleCuHi7L1wnKv5Pn69xXJQ9hgxH60ZVygH9/JG0jRgtUncE3QUA==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.4.2.tgz", + "integrity": "sha512-tHiFcfcVedVBHpmHUEUHOCCih8iZbIAYn9NvPsNzaPm/237I3imdDdZoOC8c87H5HBAVEa06tTgb+OcSWV9g5w==", "requires": { "tslib": "^2.6.2" } @@ -4390,20 +4515,20 @@ } }, "@smithy/hash-node": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-3.0.3.tgz", - "integrity": "sha512-2ctBXpPMG+B3BtWSGNnKELJ7SH9e4TNefJS0cd2eSkOOROeBnnVBnAy9LtJ8tY4vUEoe55N4CNPxzbWvR39iBw==", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-3.0.6.tgz", + "integrity": "sha512-c/FHEdKK/7DU2z6ZE91L36ahyXWayR3B+FzELjnYq7wH5YqIseM24V+pWCS9kFn1Ln8OFGTf+pyYPiHZuX0s/Q==", "requires": { - "@smithy/types": "^3.3.0", + "@smithy/types": "^3.4.2", "@smithy/util-buffer-from": "^3.0.0", "@smithy/util-utf8": "^3.0.0", "tslib": "^2.6.2" }, "dependencies": { "@smithy/types": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.3.0.tgz", - "integrity": "sha512-IxvBBCTFDHbVoK7zIxqA1ZOdc4QfM5HM7rGleCuHi7L1wnKv5Pn69xXJQ9hgxH60ZVygH9/JG0jRgtUncE3QUA==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.4.2.tgz", + "integrity": "sha512-tHiFcfcVedVBHpmHUEUHOCCih8iZbIAYn9NvPsNzaPm/237I3imdDdZoOC8c87H5HBAVEa06tTgb+OcSWV9g5w==", "requires": { "tslib": "^2.6.2" } @@ -4431,18 +4556,18 @@ } }, "@smithy/invalid-dependency": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-3.0.3.tgz", - "integrity": "sha512-ID1eL/zpDULmHJbflb864k72/SNOZCADRc9i7Exq3RUNJw6raWUSlFEQ+3PX3EYs++bTxZB2dE9mEHTQLv61tw==", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-3.0.6.tgz", + "integrity": "sha512-czM7Ioq3s8pIXht7oD+vmgy4Wfb4XavU/k/irO8NdXFFOx7YAlsCCcKOh/lJD1mJSYQqiR7NmpZ9JviryD/7AQ==", "requires": { - "@smithy/types": "^3.3.0", + "@smithy/types": "^3.4.2", "tslib": "^2.6.2" }, "dependencies": { "@smithy/types": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.3.0.tgz", - "integrity": "sha512-IxvBBCTFDHbVoK7zIxqA1ZOdc4QfM5HM7rGleCuHi7L1wnKv5Pn69xXJQ9hgxH60ZVygH9/JG0jRgtUncE3QUA==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.4.2.tgz", + "integrity": "sha512-tHiFcfcVedVBHpmHUEUHOCCih8iZbIAYn9NvPsNzaPm/237I3imdDdZoOC8c87H5HBAVEa06tTgb+OcSWV9g5w==", "requires": { "tslib": "^2.6.2" } @@ -4478,19 +4603,19 @@ } }, "@smithy/middleware-content-length": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-3.0.5.tgz", - "integrity": "sha512-ILEzC2eyxx6ncej3zZSwMpB5RJ0zuqH7eMptxC4KN3f+v9bqT8ohssKbhNR78k/2tWW+KS5Spw+tbPF4Ejyqvw==", + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-3.0.8.tgz", + "integrity": "sha512-VuyszlSO49WKh3H9/kIO2kf07VUwGV80QRiaDxUfP8P8UKlokz381ETJvwLhwuypBYhLymCYyNhB3fLAGBX2og==", "requires": { - "@smithy/protocol-http": "^4.1.0", - "@smithy/types": "^3.3.0", + "@smithy/protocol-http": "^4.1.3", + "@smithy/types": "^3.4.2", "tslib": "^2.6.2" }, "dependencies": { "@smithy/types": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.3.0.tgz", - "integrity": "sha512-IxvBBCTFDHbVoK7zIxqA1ZOdc4QfM5HM7rGleCuHi7L1wnKv5Pn69xXJQ9hgxH60ZVygH9/JG0jRgtUncE3QUA==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.4.2.tgz", + "integrity": "sha512-tHiFcfcVedVBHpmHUEUHOCCih8iZbIAYn9NvPsNzaPm/237I3imdDdZoOC8c87H5HBAVEa06tTgb+OcSWV9g5w==", "requires": { "tslib": "^2.6.2" } @@ -4498,23 +4623,23 @@ } }, "@smithy/middleware-endpoint": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-3.1.0.tgz", - "integrity": "sha512-5y5aiKCEwg9TDPB4yFE7H6tYvGFf1OJHNczeY10/EFF8Ir8jZbNntQJxMWNfeQjC1mxPsaQ6mR9cvQbf+0YeMw==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-3.1.3.tgz", + "integrity": "sha512-KeM/OrK8MVFUsoJsmCN0MZMVPjKKLudn13xpgwIMpGTYpA8QZB2Xq5tJ+RE6iu3A6NhOI4VajDTwBsm8pwwrhg==", "requires": { - "@smithy/middleware-serde": "^3.0.3", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "@smithy/util-middleware": "^3.0.3", + "@smithy/middleware-serde": "^3.0.6", + "@smithy/node-config-provider": "^3.1.7", + "@smithy/shared-ini-file-loader": "^3.1.7", + "@smithy/types": "^3.4.2", + "@smithy/url-parser": "^3.0.6", + "@smithy/util-middleware": "^3.0.6", "tslib": "^2.6.2" }, "dependencies": { "@smithy/types": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.3.0.tgz", - "integrity": "sha512-IxvBBCTFDHbVoK7zIxqA1ZOdc4QfM5HM7rGleCuHi7L1wnKv5Pn69xXJQ9hgxH60ZVygH9/JG0jRgtUncE3QUA==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.4.2.tgz", + "integrity": "sha512-tHiFcfcVedVBHpmHUEUHOCCih8iZbIAYn9NvPsNzaPm/237I3imdDdZoOC8c87H5HBAVEa06tTgb+OcSWV9g5w==", "requires": { "tslib": "^2.6.2" } @@ -4522,25 +4647,25 @@ } }, "@smithy/middleware-retry": { - "version": "3.0.13", - "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-3.0.13.tgz", - "integrity": "sha512-zvCLfaRYCaUmjbF2yxShGZdolSHft7NNCTA28HVN9hKcEbOH+g5irr1X9s+in8EpambclGnevZY4A3lYpvDCFw==", + "version": "3.0.21", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-3.0.21.tgz", + "integrity": "sha512-/h0fElV95LekVVEJuSw+aI11S1Y3zIUwBc6h9ZbUv43Gl2weXsbQwjLoet6j/Qtb0phfrSxS6pNg6FqgJOWZkA==", "requires": { - "@smithy/node-config-provider": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/service-error-classification": "^3.0.3", - "@smithy/smithy-client": "^3.1.11", - "@smithy/types": "^3.3.0", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-retry": "^3.0.3", + "@smithy/node-config-provider": "^3.1.7", + "@smithy/protocol-http": "^4.1.3", + "@smithy/service-error-classification": "^3.0.6", + "@smithy/smithy-client": "^3.3.5", + "@smithy/types": "^3.4.2", + "@smithy/util-middleware": "^3.0.6", + "@smithy/util-retry": "^3.0.6", "tslib": "^2.6.2", "uuid": "^9.0.1" }, "dependencies": { "@smithy/types": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.3.0.tgz", - "integrity": "sha512-IxvBBCTFDHbVoK7zIxqA1ZOdc4QfM5HM7rGleCuHi7L1wnKv5Pn69xXJQ9hgxH60ZVygH9/JG0jRgtUncE3QUA==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.4.2.tgz", + "integrity": "sha512-tHiFcfcVedVBHpmHUEUHOCCih8iZbIAYn9NvPsNzaPm/237I3imdDdZoOC8c87H5HBAVEa06tTgb+OcSWV9g5w==", "requires": { "tslib": "^2.6.2" } @@ -4548,18 +4673,18 @@ } }, "@smithy/middleware-serde": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-3.0.3.tgz", - "integrity": "sha512-puUbyJQBcg9eSErFXjKNiGILJGtiqmuuNKEYNYfUD57fUl4i9+mfmThtQhvFXU0hCVG0iEJhvQUipUf+/SsFdA==", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-3.0.6.tgz", + "integrity": "sha512-KKTUSl1MzOM0MAjGbudeaVNtIDo+PpekTBkCNwvfZlKndodrnvRo+00USatiyLOc0ujjO9UydMRu3O9dYML7ag==", "requires": { - "@smithy/types": "^3.3.0", + "@smithy/types": "^3.4.2", "tslib": "^2.6.2" }, "dependencies": { "@smithy/types": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.3.0.tgz", - "integrity": "sha512-IxvBBCTFDHbVoK7zIxqA1ZOdc4QfM5HM7rGleCuHi7L1wnKv5Pn69xXJQ9hgxH60ZVygH9/JG0jRgtUncE3QUA==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.4.2.tgz", + "integrity": "sha512-tHiFcfcVedVBHpmHUEUHOCCih8iZbIAYn9NvPsNzaPm/237I3imdDdZoOC8c87H5HBAVEa06tTgb+OcSWV9g5w==", "requires": { "tslib": "^2.6.2" } @@ -4567,18 +4692,18 @@ } }, "@smithy/middleware-stack": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-3.0.3.tgz", - "integrity": "sha512-r4klY9nFudB0r9UdSMaGSyjyQK5adUyPnQN/ZM6M75phTxOdnc/AhpvGD1fQUvgmqjQEBGCwpnPbDm8pH5PapA==", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-3.0.6.tgz", + "integrity": "sha512-2c0eSYhTQ8xQqHMcRxLMpadFbTXg6Zla5l0mwNftFCZMQmuhI7EbAJMx6R5eqfuV3YbJ3QGyS3d5uSmrHV8Khg==", "requires": { - "@smithy/types": "^3.3.0", + "@smithy/types": "^3.4.2", "tslib": "^2.6.2" }, "dependencies": { "@smithy/types": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.3.0.tgz", - "integrity": "sha512-IxvBBCTFDHbVoK7zIxqA1ZOdc4QfM5HM7rGleCuHi7L1wnKv5Pn69xXJQ9hgxH60ZVygH9/JG0jRgtUncE3QUA==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.4.2.tgz", + "integrity": "sha512-tHiFcfcVedVBHpmHUEUHOCCih8iZbIAYn9NvPsNzaPm/237I3imdDdZoOC8c87H5HBAVEa06tTgb+OcSWV9g5w==", "requires": { "tslib": "^2.6.2" } @@ -4586,20 +4711,20 @@ } }, "@smithy/node-config-provider": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-3.1.4.tgz", - "integrity": "sha512-YvnElQy8HR4vDcAjoy7Xkx9YT8xZP4cBXcbJSgm/kxmiQu08DwUwj8rkGnyoJTpfl/3xYHH+d8zE+eHqoDCSdQ==", + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-3.1.7.tgz", + "integrity": "sha512-g3mfnC3Oo8pOI0dYuPXLtdW1WGVb3bR2tkV21GNkm0ZvQjLTtamXAwCWt/FCb0HGvKt3gHHmF1XerG0ICfalOg==", "requires": { - "@smithy/property-provider": "^3.1.3", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", + "@smithy/property-provider": "^3.1.6", + "@smithy/shared-ini-file-loader": "^3.1.7", + "@smithy/types": "^3.4.2", "tslib": "^2.6.2" }, "dependencies": { "@smithy/types": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.3.0.tgz", - "integrity": "sha512-IxvBBCTFDHbVoK7zIxqA1ZOdc4QfM5HM7rGleCuHi7L1wnKv5Pn69xXJQ9hgxH60ZVygH9/JG0jRgtUncE3QUA==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.4.2.tgz", + "integrity": "sha512-tHiFcfcVedVBHpmHUEUHOCCih8iZbIAYn9NvPsNzaPm/237I3imdDdZoOC8c87H5HBAVEa06tTgb+OcSWV9g5w==", "requires": { "tslib": "^2.6.2" } @@ -4607,21 +4732,21 @@ } }, "@smithy/node-http-handler": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-3.1.4.tgz", - "integrity": "sha512-+UmxgixgOr/yLsUxcEKGH0fMNVteJFGkmRltYFHnBMlogyFdpzn2CwqWmxOrfJELhV34v0WSlaqG1UtE1uXlJg==", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-3.2.3.tgz", + "integrity": "sha512-/gcm5DJ3k1b1zEInzBGAZC8ntJ+jwrz1NcSIu+9dSXd1FfG0G6QgkDI40tt8/WYUbHtLyo8fEqtm2v29koWo/w==", "requires": { - "@smithy/abort-controller": "^3.1.1", - "@smithy/protocol-http": "^4.1.0", - "@smithy/querystring-builder": "^3.0.3", - "@smithy/types": "^3.3.0", + "@smithy/abort-controller": "^3.1.4", + "@smithy/protocol-http": "^4.1.3", + "@smithy/querystring-builder": "^3.0.6", + "@smithy/types": "^3.4.2", "tslib": "^2.6.2" }, "dependencies": { "@smithy/types": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.3.0.tgz", - "integrity": "sha512-IxvBBCTFDHbVoK7zIxqA1ZOdc4QfM5HM7rGleCuHi7L1wnKv5Pn69xXJQ9hgxH60ZVygH9/JG0jRgtUncE3QUA==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.4.2.tgz", + "integrity": "sha512-tHiFcfcVedVBHpmHUEUHOCCih8iZbIAYn9NvPsNzaPm/237I3imdDdZoOC8c87H5HBAVEa06tTgb+OcSWV9g5w==", "requires": { "tslib": "^2.6.2" } @@ -4629,18 +4754,18 @@ } }, "@smithy/property-provider": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-3.1.3.tgz", - "integrity": "sha512-zahyOVR9Q4PEoguJ/NrFP4O7SMAfYO1HLhB18M+q+Z4KFd4V2obiMnlVoUFzFLSPeVt1POyNWneHHrZaTMoc/g==", + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-3.1.6.tgz", + "integrity": "sha512-NK3y/T7Q/Bw+Z8vsVs9MYIQ5v7gOX7clyrXcwhhIBQhbPgRl6JDrZbusO9qWDhcEus75Tg+VCxtIRfo3H76fpw==", "requires": { - "@smithy/types": "^3.3.0", + "@smithy/types": "^3.4.2", "tslib": "^2.6.2" }, "dependencies": { "@smithy/types": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.3.0.tgz", - "integrity": "sha512-IxvBBCTFDHbVoK7zIxqA1ZOdc4QfM5HM7rGleCuHi7L1wnKv5Pn69xXJQ9hgxH60ZVygH9/JG0jRgtUncE3QUA==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.4.2.tgz", + "integrity": "sha512-tHiFcfcVedVBHpmHUEUHOCCih8iZbIAYn9NvPsNzaPm/237I3imdDdZoOC8c87H5HBAVEa06tTgb+OcSWV9g5w==", "requires": { "tslib": "^2.6.2" } @@ -4648,18 +4773,18 @@ } }, "@smithy/protocol-http": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-4.1.0.tgz", - "integrity": "sha512-dPVoHYQ2wcHooGXg3LQisa1hH0e4y0pAddPMeeUPipI1tEOqL6A4N0/G7abeq+K8wrwSgjk4C0wnD1XZpJm5aA==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-4.1.3.tgz", + "integrity": "sha512-GcbMmOYpH9iRqtC05RbRnc/0FssxSTHlmaNhYBTgSgNCYpdR3Kt88u5GAZTBmouzv+Zlj/VRv92J9ruuDeJuEw==", "requires": { - "@smithy/types": "^3.3.0", + "@smithy/types": "^3.4.2", "tslib": "^2.6.2" }, "dependencies": { "@smithy/types": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.3.0.tgz", - "integrity": "sha512-IxvBBCTFDHbVoK7zIxqA1ZOdc4QfM5HM7rGleCuHi7L1wnKv5Pn69xXJQ9hgxH60ZVygH9/JG0jRgtUncE3QUA==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.4.2.tgz", + "integrity": "sha512-tHiFcfcVedVBHpmHUEUHOCCih8iZbIAYn9NvPsNzaPm/237I3imdDdZoOC8c87H5HBAVEa06tTgb+OcSWV9g5w==", "requires": { "tslib": "^2.6.2" } @@ -4667,19 +4792,19 @@ } }, "@smithy/querystring-builder": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-3.0.3.tgz", - "integrity": "sha512-vyWckeUeesFKzCDaRwWLUA1Xym9McaA6XpFfAK5qI9DKJ4M33ooQGqvM4J+LalH4u/Dq9nFiC8U6Qn1qi0+9zw==", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-3.0.6.tgz", + "integrity": "sha512-sQe08RunoObe+Usujn9+R2zrLuQERi3CWvRO3BvnoWSYUaIrLKuAIeY7cMeDax6xGyfIP3x/yFWbEKSXvOnvVg==", "requires": { - "@smithy/types": "^3.3.0", + "@smithy/types": "^3.4.2", "@smithy/util-uri-escape": "^3.0.0", "tslib": "^2.6.2" }, "dependencies": { "@smithy/types": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.3.0.tgz", - "integrity": "sha512-IxvBBCTFDHbVoK7zIxqA1ZOdc4QfM5HM7rGleCuHi7L1wnKv5Pn69xXJQ9hgxH60ZVygH9/JG0jRgtUncE3QUA==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.4.2.tgz", + "integrity": "sha512-tHiFcfcVedVBHpmHUEUHOCCih8iZbIAYn9NvPsNzaPm/237I3imdDdZoOC8c87H5HBAVEa06tTgb+OcSWV9g5w==", "requires": { "tslib": "^2.6.2" } @@ -4687,18 +4812,18 @@ } }, "@smithy/querystring-parser": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-3.0.3.tgz", - "integrity": "sha512-zahM1lQv2YjmznnfQsWbYojFe55l0SLG/988brlLv1i8z3dubloLF+75ATRsqPBboUXsW6I9CPGE5rQgLfY0vQ==", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-3.0.6.tgz", + "integrity": "sha512-UJKw4LlEkytzz2Wq+uIdHf6qOtFfee/o7ruH0jF5I6UAuU+19r9QV7nU3P/uI0l6+oElRHmG/5cBBcGJrD7Ozg==", "requires": { - "@smithy/types": "^3.3.0", + "@smithy/types": "^3.4.2", "tslib": "^2.6.2" }, "dependencies": { "@smithy/types": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.3.0.tgz", - "integrity": "sha512-IxvBBCTFDHbVoK7zIxqA1ZOdc4QfM5HM7rGleCuHi7L1wnKv5Pn69xXJQ9hgxH60ZVygH9/JG0jRgtUncE3QUA==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.4.2.tgz", + "integrity": "sha512-tHiFcfcVedVBHpmHUEUHOCCih8iZbIAYn9NvPsNzaPm/237I3imdDdZoOC8c87H5HBAVEa06tTgb+OcSWV9g5w==", "requires": { "tslib": "^2.6.2" } @@ -4706,17 +4831,17 @@ } }, "@smithy/service-error-classification": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-3.0.3.tgz", - "integrity": "sha512-Jn39sSl8cim/VlkLsUhRFq/dKDnRUFlfRkvhOJaUbLBXUsLRLNf9WaxDv/z9BjuQ3A6k/qE8af1lsqcwm7+DaQ==", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-3.0.6.tgz", + "integrity": "sha512-53SpchU3+DUZrN7J6sBx9tBiCVGzsib2e4sc512Q7K9fpC5zkJKs6Z9s+qbMxSYrkEkle6hnMtrts7XNkMJJMg==", "requires": { - "@smithy/types": "^3.3.0" + "@smithy/types": "^3.4.2" }, "dependencies": { "@smithy/types": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.3.0.tgz", - "integrity": "sha512-IxvBBCTFDHbVoK7zIxqA1ZOdc4QfM5HM7rGleCuHi7L1wnKv5Pn69xXJQ9hgxH60ZVygH9/JG0jRgtUncE3QUA==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.4.2.tgz", + "integrity": "sha512-tHiFcfcVedVBHpmHUEUHOCCih8iZbIAYn9NvPsNzaPm/237I3imdDdZoOC8c87H5HBAVEa06tTgb+OcSWV9g5w==", "requires": { "tslib": "^2.6.2" } @@ -4724,18 +4849,18 @@ } }, "@smithy/shared-ini-file-loader": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-3.1.4.tgz", - "integrity": "sha512-qMxS4hBGB8FY2GQqshcRUy1K6k8aBWP5vwm8qKkCT3A9K2dawUwOIJfqh9Yste/Bl0J2lzosVyrXDj68kLcHXQ==", + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-3.1.7.tgz", + "integrity": "sha512-IA4K2qTJYXkF5OfVN4vsY1hfnUZjaslEE8Fsr/gGFza4TAC2A9NfnZuSY2srQIbt9bwtjHiAayrRVgKse4Q7fA==", "requires": { - "@smithy/types": "^3.3.0", + "@smithy/types": "^3.4.2", "tslib": "^2.6.2" }, "dependencies": { "@smithy/types": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.3.0.tgz", - "integrity": "sha512-IxvBBCTFDHbVoK7zIxqA1ZOdc4QfM5HM7rGleCuHi7L1wnKv5Pn69xXJQ9hgxH60ZVygH9/JG0jRgtUncE3QUA==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.4.2.tgz", + "integrity": "sha512-tHiFcfcVedVBHpmHUEUHOCCih8iZbIAYn9NvPsNzaPm/237I3imdDdZoOC8c87H5HBAVEa06tTgb+OcSWV9g5w==", "requires": { "tslib": "^2.6.2" } @@ -4743,24 +4868,24 @@ } }, "@smithy/signature-v4": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-4.1.0.tgz", - "integrity": "sha512-aRryp2XNZeRcOtuJoxjydO6QTaVhxx/vjaR+gx7ZjaFgrgPRyZ3HCTbfwqYj6ZWEBHkCSUfcaymKPURaByukag==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-4.1.4.tgz", + "integrity": "sha512-72MiK7xYukNsnLJI9NqvUHqTu0ziEsfMsYNlWpiJfuGQnCTFKpckThlEatirvcA/LmT1h7rRO+pJD06PYsPu9Q==", "requires": { "@smithy/is-array-buffer": "^3.0.0", - "@smithy/protocol-http": "^4.1.0", - "@smithy/types": "^3.3.0", + "@smithy/protocol-http": "^4.1.3", + "@smithy/types": "^3.4.2", "@smithy/util-hex-encoding": "^3.0.0", - "@smithy/util-middleware": "^3.0.3", + "@smithy/util-middleware": "^3.0.6", "@smithy/util-uri-escape": "^3.0.0", "@smithy/util-utf8": "^3.0.0", "tslib": "^2.6.2" }, "dependencies": { "@smithy/types": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.3.0.tgz", - "integrity": "sha512-IxvBBCTFDHbVoK7zIxqA1ZOdc4QfM5HM7rGleCuHi7L1wnKv5Pn69xXJQ9hgxH60ZVygH9/JG0jRgtUncE3QUA==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.4.2.tgz", + "integrity": "sha512-tHiFcfcVedVBHpmHUEUHOCCih8iZbIAYn9NvPsNzaPm/237I3imdDdZoOC8c87H5HBAVEa06tTgb+OcSWV9g5w==", "requires": { "tslib": "^2.6.2" } @@ -4768,22 +4893,22 @@ } }, "@smithy/smithy-client": { - "version": "3.1.11", - "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-3.1.11.tgz", - "integrity": "sha512-l0BpyYkciNyMaS+PnFFz4aO5sBcXvGLoJd7mX9xrMBIm2nIQBVvYgp2ZpPDMzwjKCavsXu06iuCm0F6ZJZc6yQ==", + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-3.3.5.tgz", + "integrity": "sha512-7IZi8J3Dr9n3tX+lcpmJ/5tCYIqoXdblFBaPuv0SEKZFRpCxE+TqIWL6I3t7jLlk9TWu3JSvEZAhtjB9yvB+zA==", "requires": { - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-stack": "^3.0.3", - "@smithy/protocol-http": "^4.1.0", - "@smithy/types": "^3.3.0", - "@smithy/util-stream": "^3.1.3", + "@smithy/middleware-endpoint": "^3.1.3", + "@smithy/middleware-stack": "^3.0.6", + "@smithy/protocol-http": "^4.1.3", + "@smithy/types": "^3.4.2", + "@smithy/util-stream": "^3.1.8", "tslib": "^2.6.2" }, "dependencies": { "@smithy/types": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.3.0.tgz", - "integrity": "sha512-IxvBBCTFDHbVoK7zIxqA1ZOdc4QfM5HM7rGleCuHi7L1wnKv5Pn69xXJQ9hgxH60ZVygH9/JG0jRgtUncE3QUA==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.4.2.tgz", + "integrity": "sha512-tHiFcfcVedVBHpmHUEUHOCCih8iZbIAYn9NvPsNzaPm/237I3imdDdZoOC8c87H5HBAVEa06tTgb+OcSWV9g5w==", "requires": { "tslib": "^2.6.2" } @@ -4799,19 +4924,19 @@ } }, "@smithy/url-parser": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-3.0.3.tgz", - "integrity": "sha512-pw3VtZtX2rg+s6HMs6/+u9+hu6oY6U7IohGhVNnjbgKy86wcIsSZwgHrFR+t67Uyxvp4Xz3p3kGXXIpTNisq8A==", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-3.0.6.tgz", + "integrity": "sha512-47Op/NU8Opt49KyGpHtVdnmmJMsp2hEwBdyjuFB9M2V5QVOwA7pBhhxKN5z6ztKGrMw76gd8MlbPuzzvaAncuQ==", "requires": { - "@smithy/querystring-parser": "^3.0.3", - "@smithy/types": "^3.3.0", + "@smithy/querystring-parser": "^3.0.6", + "@smithy/types": "^3.4.2", "tslib": "^2.6.2" }, "dependencies": { "@smithy/types": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.3.0.tgz", - "integrity": "sha512-IxvBBCTFDHbVoK7zIxqA1ZOdc4QfM5HM7rGleCuHi7L1wnKv5Pn69xXJQ9hgxH60ZVygH9/JG0jRgtUncE3QUA==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.4.2.tgz", + "integrity": "sha512-tHiFcfcVedVBHpmHUEUHOCCih8iZbIAYn9NvPsNzaPm/237I3imdDdZoOC8c87H5HBAVEa06tTgb+OcSWV9g5w==", "requires": { "tslib": "^2.6.2" } @@ -4862,21 +4987,21 @@ } }, "@smithy/util-defaults-mode-browser": { - "version": "3.0.13", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-3.0.13.tgz", - "integrity": "sha512-ZIRSUsnnMRStOP6OKtW+gCSiVFkwnfQF2xtf32QKAbHR6ACjhbAybDvry+3L5qQYdh3H6+7yD/AiUE45n8mTTw==", + "version": "3.0.21", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-3.0.21.tgz", + "integrity": "sha512-M/FhTBk4c/SsB91dD/M4gMGfJO7z/qJaM9+XQQIqBOf4qzZYMExnP7R4VdGwxxH8IKMGW+8F0I4rNtVRrcfPoA==", "requires": { - "@smithy/property-provider": "^3.1.3", - "@smithy/smithy-client": "^3.1.11", - "@smithy/types": "^3.3.0", + "@smithy/property-provider": "^3.1.6", + "@smithy/smithy-client": "^3.3.5", + "@smithy/types": "^3.4.2", "bowser": "^2.11.0", "tslib": "^2.6.2" }, "dependencies": { "@smithy/types": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.3.0.tgz", - "integrity": "sha512-IxvBBCTFDHbVoK7zIxqA1ZOdc4QfM5HM7rGleCuHi7L1wnKv5Pn69xXJQ9hgxH60ZVygH9/JG0jRgtUncE3QUA==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.4.2.tgz", + "integrity": "sha512-tHiFcfcVedVBHpmHUEUHOCCih8iZbIAYn9NvPsNzaPm/237I3imdDdZoOC8c87H5HBAVEa06tTgb+OcSWV9g5w==", "requires": { "tslib": "^2.6.2" } @@ -4884,23 +5009,23 @@ } }, "@smithy/util-defaults-mode-node": { - "version": "3.0.13", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-3.0.13.tgz", - "integrity": "sha512-voUa8TFJGfD+U12tlNNLCDlXibt9vRdNzRX45Onk/WxZe7TS+hTOZouEZRa7oARGicdgeXvt1A0W45qLGYdy+g==", + "version": "3.0.21", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-3.0.21.tgz", + "integrity": "sha512-NiLinPvF86U3S2Pdx/ycqd4bnY5dmFSPNL5KYRwbNjqQFS09M5Wzqk8BNk61/47xCYz1X/6KeiSk9qgYPTtuDw==", "requires": { - "@smithy/config-resolver": "^3.0.5", - "@smithy/credential-provider-imds": "^3.2.0", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/property-provider": "^3.1.3", - "@smithy/smithy-client": "^3.1.11", - "@smithy/types": "^3.3.0", + "@smithy/config-resolver": "^3.0.8", + "@smithy/credential-provider-imds": "^3.2.3", + "@smithy/node-config-provider": "^3.1.7", + "@smithy/property-provider": "^3.1.6", + "@smithy/smithy-client": "^3.3.5", + "@smithy/types": "^3.4.2", "tslib": "^2.6.2" }, "dependencies": { "@smithy/types": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.3.0.tgz", - "integrity": "sha512-IxvBBCTFDHbVoK7zIxqA1ZOdc4QfM5HM7rGleCuHi7L1wnKv5Pn69xXJQ9hgxH60ZVygH9/JG0jRgtUncE3QUA==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.4.2.tgz", + "integrity": "sha512-tHiFcfcVedVBHpmHUEUHOCCih8iZbIAYn9NvPsNzaPm/237I3imdDdZoOC8c87H5HBAVEa06tTgb+OcSWV9g5w==", "requires": { "tslib": "^2.6.2" } @@ -4908,19 +5033,19 @@ } }, "@smithy/util-endpoints": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-2.0.5.tgz", - "integrity": "sha512-ReQP0BWihIE68OAblC/WQmDD40Gx+QY1Ez8mTdFMXpmjfxSyz2fVQu3A4zXRfQU9sZXtewk3GmhfOHswvX+eNg==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-2.1.2.tgz", + "integrity": "sha512-FEISzffb4H8DLzGq1g4MuDpcv6CIG15fXoQzDH9SjpRJv6h7J++1STFWWinilG0tQh9H1v2UKWG19Jjr2B16zQ==", "requires": { - "@smithy/node-config-provider": "^3.1.4", - "@smithy/types": "^3.3.0", + "@smithy/node-config-provider": "^3.1.7", + "@smithy/types": "^3.4.2", "tslib": "^2.6.2" }, "dependencies": { "@smithy/types": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.3.0.tgz", - "integrity": "sha512-IxvBBCTFDHbVoK7zIxqA1ZOdc4QfM5HM7rGleCuHi7L1wnKv5Pn69xXJQ9hgxH60ZVygH9/JG0jRgtUncE3QUA==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.4.2.tgz", + "integrity": "sha512-tHiFcfcVedVBHpmHUEUHOCCih8iZbIAYn9NvPsNzaPm/237I3imdDdZoOC8c87H5HBAVEa06tTgb+OcSWV9g5w==", "requires": { "tslib": "^2.6.2" } @@ -4936,18 +5061,18 @@ } }, "@smithy/util-middleware": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-3.0.3.tgz", - "integrity": "sha512-l+StyYYK/eO3DlVPbU+4Bi06Jjal+PFLSMmlWM1BEwyLxZ3aKkf1ROnoIakfaA7mC6uw3ny7JBkau4Yc+5zfWw==", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-3.0.6.tgz", + "integrity": "sha512-BxbX4aBhI1O9p87/xM+zWy0GzT3CEVcXFPBRDoHAM+pV0eSW156pR+PSYEz0DQHDMYDsYAflC2bQNz2uaDBUZQ==", "requires": { - "@smithy/types": "^3.3.0", + "@smithy/types": "^3.4.2", "tslib": "^2.6.2" }, "dependencies": { "@smithy/types": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.3.0.tgz", - "integrity": "sha512-IxvBBCTFDHbVoK7zIxqA1ZOdc4QfM5HM7rGleCuHi7L1wnKv5Pn69xXJQ9hgxH60ZVygH9/JG0jRgtUncE3QUA==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.4.2.tgz", + "integrity": "sha512-tHiFcfcVedVBHpmHUEUHOCCih8iZbIAYn9NvPsNzaPm/237I3imdDdZoOC8c87H5HBAVEa06tTgb+OcSWV9g5w==", "requires": { "tslib": "^2.6.2" } @@ -4955,19 +5080,19 @@ } }, "@smithy/util-retry": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-3.0.3.tgz", - "integrity": "sha512-AFw+hjpbtVApzpNDhbjNG5NA3kyoMs7vx0gsgmlJF4s+yz1Zlepde7J58zpIRIsdjc+emhpAITxA88qLkPF26w==", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-3.0.6.tgz", + "integrity": "sha512-BRZiuF7IwDntAbevqMco67an0Sr9oLQJqqRCsSPZZHYRnehS0LHDAkJk/pSmI7Z8c/1Vet294H7fY2fWUgB+Rg==", "requires": { - "@smithy/service-error-classification": "^3.0.3", - "@smithy/types": "^3.3.0", + "@smithy/service-error-classification": "^3.0.6", + "@smithy/types": "^3.4.2", "tslib": "^2.6.2" }, "dependencies": { "@smithy/types": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.3.0.tgz", - "integrity": "sha512-IxvBBCTFDHbVoK7zIxqA1ZOdc4QfM5HM7rGleCuHi7L1wnKv5Pn69xXJQ9hgxH60ZVygH9/JG0jRgtUncE3QUA==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.4.2.tgz", + "integrity": "sha512-tHiFcfcVedVBHpmHUEUHOCCih8iZbIAYn9NvPsNzaPm/237I3imdDdZoOC8c87H5HBAVEa06tTgb+OcSWV9g5w==", "requires": { "tslib": "^2.6.2" } @@ -4975,13 +5100,13 @@ } }, "@smithy/util-stream": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-3.1.3.tgz", - "integrity": "sha512-FIv/bRhIlAxC0U7xM1BCnF2aDRPq0UaelqBHkM2lsCp26mcBbgI0tCVTv+jGdsQLUmAMybua/bjDsSu8RQHbmw==", + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-3.1.8.tgz", + "integrity": "sha512-hoKOqSmb8FD3WLObuB5hwbM7bNIWgcnvkThokTvVq7J5PKjlLUK5qQQcB9zWLHIoSaIlf3VIv2OxZY2wtQjcRQ==", "requires": { - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/types": "^3.3.0", + "@smithy/fetch-http-handler": "^3.2.8", + "@smithy/node-http-handler": "^3.2.3", + "@smithy/types": "^3.4.2", "@smithy/util-base64": "^3.0.0", "@smithy/util-buffer-from": "^3.0.0", "@smithy/util-hex-encoding": "^3.0.0", @@ -4990,9 +5115,9 @@ }, "dependencies": { "@smithy/types": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.3.0.tgz", - "integrity": "sha512-IxvBBCTFDHbVoK7zIxqA1ZOdc4QfM5HM7rGleCuHi7L1wnKv5Pn69xXJQ9hgxH60ZVygH9/JG0jRgtUncE3QUA==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.4.2.tgz", + "integrity": "sha512-tHiFcfcVedVBHpmHUEUHOCCih8iZbIAYn9NvPsNzaPm/237I3imdDdZoOC8c87H5HBAVEa06tTgb+OcSWV9g5w==", "requires": { "tslib": "^2.6.2" } diff --git a/source/lambda/layers/aws-sdk-lib/package.json b/source/lambda/layers/aws-sdk-lib/package.json index bbd80ef3..8a49f77b 100644 --- a/source/lambda/layers/aws-sdk-lib/package.json +++ b/source/lambda/layers/aws-sdk-lib/package.json @@ -13,6 +13,7 @@ "@aws-sdk/types": "^3.609.0", "@aws-sdk/util-arn-parser": "^3.568.0", "@aws-sdk/util-dynamodb": "^3.620.1", + "@aws-sdk/client-cognito-identity-provider": "3.620.1", "@smithy/types": "^2.12.0", "@types/aws-lambda": "^8.10.142" }, diff --git a/source/lambda/model-info/tsconfig.json b/source/lambda/model-info/tsconfig.json index 9d97a885..cdddd0f6 100644 --- a/source/lambda/model-info/tsconfig.json +++ b/source/lambda/model-info/tsconfig.json @@ -32,6 +32,9 @@ "aws-node-user-agent-config": [ "../layers/aws-node-user-agent-config/dist" ], + "@aws-sdk/client-cognito-identity-provider": [ + "../layers/aws-sdk-lib/node_modules/@aws-sdk/client-cognito-identity-provider" + ], "@aws-sdk/client-cloudformation": [ "../layers/aws-sdk-lib/node_modules/@aws-sdk/client-cloudformation" ], diff --git a/source/lambda/use-case-management/model/types.ts b/source/lambda/use-case-management/model/types.ts index aafee76a..ce3489c5 100644 --- a/source/lambda/use-case-management/model/types.ts +++ b/source/lambda/use-case-management/model/types.ts @@ -72,10 +72,22 @@ export interface ConversationMemoryParams { ChatHistoryLength?: number; } +export interface CognitoParams { + ExistingUserPoolId: string; + ExistingUserPoolClientId: string; +} + +export interface AuthenticationParams { + AuthenticationProvider: string; + CognitoParams?: CognitoParams; +} + export interface UseCaseConfiguration { UseCaseName?: string; + ExistingCognitoUserPoolId?: string; ConversationMemoryParams?: ConversationMemoryParams; KnowledgeBaseParams?: KnowledgeBaseParams; LlmParams?: LlmParams; + AuthenticationParams?: AuthenticationParams; IsInternalUser?: string; } diff --git a/source/lambda/use-case-management/model/use-case-validator.ts b/source/lambda/use-case-management/model/use-case-validator.ts index 692066ef..830a2152 100644 --- a/source/lambda/use-case-management/model/use-case-validator.ts +++ b/source/lambda/use-case-management/model/use-case-validator.ts @@ -12,10 +12,13 @@ **********************************************************************************************************************/ import _ from 'lodash'; +import { CognitoIdentityProviderClient, DescribeUserPoolCommand } from "@aws-sdk/client-cognito-identity-provider";; import { StorageManagement } from '../ddb/storage-management'; import { UseCaseConfigManagement } from '../ddb/use-case-config-management'; import { tracer } from '../power-tools-init'; import { + AUTHENTICATION_PROVIDERS, + CfnParameterKeys, ChatRequiredPlaceholders, DisambiguationRequiredPlaceholders, KnowledgeBaseTypes, @@ -23,6 +26,7 @@ import { } from '../utils/constants'; import RequestValidationError from '../utils/error'; import { UseCase } from './use-case'; +import { customAwsConfig } from 'aws-node-user-agent-config'; /** * Class responsible for validating that use cases can be used for creations and updates, @@ -59,12 +63,55 @@ export class UseCaseValidator { useCase.configuration.LlmParams!.PromptParams.DisambiguationPromptTemplate = modelInfo.DisambiguationPrompt; } + + if (useCase.configuration.AuthenticationParams) { + switch (useCase.configuration.AuthenticationParams.AuthenticationProvider) { + case AUTHENTICATION_PROVIDERS.COGNITO: + // overriding the previously set CognitoDomainPrefix parameter + // by fetching it dynamically based on the set user pool + + const existingUserPoolId = useCase.cfnParameters?.get(CfnParameterKeys.ExistingCognitoUserPoolId); + if (!existingUserPoolId) { + throw new Error(`Undefined user pool provided for the cognito authentication provider.`) + } + + const cognitoDomainPrefix = await this.getCognitoDomainPrefixByUserPool(existingUserPoolId); + + if (!useCase.cfnParameters) { + throw new Error(`CFNParameters are not available yet for setting Cognito Domain Prefix.`) + } + + useCase.cfnParameters.set(CfnParameterKeys.CognitoDomainPrefix, cognitoDomainPrefix); + + break; + } + } + await UseCaseValidator.checkModelInputPayloadSchema(useCase); // NOSONAR - typescript:S4123 - await is required in tests despite seeming unnecessary await UseCaseValidator.checkPromptsAreCompatible(useCase); // NOSONAR - typescript:S4123 - await is required in tests despite seeming unnecessary await UseCaseValidator.checkKnowledgeBaseTypeMatchesParams(useCase); // NOSONAR - typescript:S4123 - await is required in tests despite seeming unnecessary return useCase; } + private async getCognitoDomainPrefixByUserPool(userPoolId: string) { + + const client = new CognitoIdentityProviderClient(customAwsConfig()); + + try { + const command = new DescribeUserPoolCommand({ UserPoolId: userPoolId }); + const response = await client.send(command); + + if (response.UserPool && response.UserPool.Domain) { + return response.UserPool.Domain; + } else { + throw new Error(`No domain found for this user pool.`); + } + } catch (error) { + console.log(`Error fetching user pool details. Error: ${error}`) + throw error; + } + } + /** * Validates a use case meant for an update fills in values as required. Will: * - Check the model info database to ensure provider/modelid combination is valid diff --git a/source/lambda/use-case-management/model/use-case.ts b/source/lambda/use-case-management/model/use-case.ts index c17c0d57..d5c09e9f 100644 --- a/source/lambda/use-case-management/model/use-case.ts +++ b/source/lambda/use-case-management/model/use-case.ts @@ -16,6 +16,7 @@ import * as crypto from 'crypto'; import { MissingValueError } from '../exception/missing-value-error'; import { logger } from '../power-tools-init'; import { + AUTHENTICATION_PROVIDERS, CLIENT_ID_ENV_VAR, COGNITO_DOMAIN_PREFIX_VAR, COGNITO_POLICY_TABLE_ENV_VAR, @@ -296,25 +297,42 @@ export class ChatUseCaseDeploymentAdapter extends UseCase { ); cfnParameters.set(CfnParameterKeys.UseCaseConfigTableName, process.env[USE_CASE_CONFIG_TABLE_NAME_ENV_VAR]!); - cfnParameters.set(CfnParameterKeys.ExistingCognitoUserPoolId, process.env[USER_POOL_ID_ENV_VAR]!); - if ( - process.env[USE_EXISTING_USER_POOL_CLIENT_ENV_VAR] && - process.env[USE_EXISTING_USER_POOL_CLIENT_ENV_VAR].toLowerCase() === 'true' && - process.env[CLIENT_ID_ENV_VAR] - ) { - cfnParameters.set(CfnParameterKeys.ExistingCognitoUserPoolClient, process.env[CLIENT_ID_ENV_VAR]); - } + if (eventBody.AuthenticationParams) { + switch (eventBody.AuthenticationParams.AuthenticationProvider) { + case AUTHENTICATION_PROVIDERS.COGNITO: + const existingUserPoolId = eventBody.AuthenticationParams.CognitoParams.ExistingUserPoolId; + const existingUserPoolClientId = eventBody.AuthenticationParams.CognitoParams.ExistingUserPoolClientId; - if (process.env[USER_POOL_ID_ENV_VAR]) { - if (process.env[COGNITO_DOMAIN_PREFIX_VAR]) { - cfnParameters.set(CfnParameterKeys.CognitoDomainPrefix, process.env[COGNITO_DOMAIN_PREFIX_VAR]); - } else { - logger.error( - 'Lambda has an environment variable to use existing user pool, but could not find the environment variable for Cognito domain prefix. This use case setup will have an incorrect sign-in url.' - ); - throw new Error( - 'Domain prefix not available for existing user pool. Without domain prefix, authenticating into a use case would fail.' - ); + if (!existingUserPoolId) { + throw new Error(`Required field existingUserPoolId not provided for the "Cognito" AuthenticationProvider.`); + } + + cfnParameters.set(CfnParameterKeys.ExistingCognitoUserPoolId, existingUserPoolId); + + if (existingUserPoolClientId) { + cfnParameters.set(CfnParameterKeys.ExistingCognitoUserPoolClient, existingUserPoolClientId); + } + + break; + default: + console.log(`Error: unsupported AuthenticationProvider. AuthenticationParams provided: ${eventBody.AuthenticationParams}`); + throw new Error(`Error: unsupported AuthenticationProvider: ${eventBody.AuthenticationParams.AuthenticationProvider}.`); + } + } + else { + cfnParameters.set(CfnParameterKeys.ExistingCognitoUserPoolId, process.env[USER_POOL_ID_ENV_VAR]!); + + if (process.env[USER_POOL_ID_ENV_VAR]) { + if (process.env[COGNITO_DOMAIN_PREFIX_VAR]) { + cfnParameters.set(CfnParameterKeys.CognitoDomainPrefix, process.env[COGNITO_DOMAIN_PREFIX_VAR]); + } else { + logger.error( + 'Lambda has an environment variable to use existing user pool, but could not find the environment variable for Cognito domain prefix. This use case setup will have an incorrect sign-in url.' + ); + throw new Error( + 'Domain prefix not available for existing user pool. Without domain prefix, authenticating into a use case would fail.' + ); + } } } @@ -394,6 +412,7 @@ export class ChatUseCaseDeploymentAdapter extends UseCase { private static createConfiguration(eventBody: any): UseCaseConfiguration { let config = { UseCaseName: eventBody.UseCaseName, + ExistingCognitoUserPoolId: eventBody.ExistingCognitoUserPoolId, ConversationMemoryParams: eventBody.ConversationMemoryParams, KnowledgeBaseParams: { KnowledgeBaseType: eventBody.KnowledgeBaseParams?.KnowledgeBaseType, @@ -416,6 +435,7 @@ export class ChatUseCaseDeploymentAdapter extends UseCase { Streaming: eventBody.LlmParams.Streaming, Verbose: eventBody.LlmParams.Verbose }, + AuthenticationParams: eventBody.AuthenticationParams, IsInternalUser: process.env[IS_INTERNAL_USER_ENV_VAR]! // env var value is set as 'true' or 'false' on deployment of management stack }; diff --git a/source/lambda/use-case-management/test/cfn/stack-operation-builder.test.ts b/source/lambda/use-case-management/test/cfn/stack-operation-builder.test.ts index d73a9acd..d4a4bb84 100644 --- a/source/lambda/use-case-management/test/cfn/stack-operation-builder.test.ts +++ b/source/lambda/use-case-management/test/cfn/stack-operation-builder.test.ts @@ -43,6 +43,7 @@ import { import { createUseCaseEvent, + createUseCaseEventAuthenticationParams, createUseCaseEventVPC, deleteUseCaseEvent, updateUseCaseEvent, @@ -316,6 +317,65 @@ describe('When creating StackCommandBuilders', () => { }); }); + describe('When creating CreateStackCommandInputBuilder with a UseCaseAdapter from createEvent with AuthenticationParams', () => { + let createStackCommandInput: CreateStackCommandInput; + + beforeAll(async () => { + let event = { ...createUseCaseEventAuthenticationParams } as any; + event.body.LlmParams.ModelProvider = CHAT_PROVIDERS.BEDROCK; + event.body = JSON.stringify(event.body); + + const useCase = new ChatUseCaseDeploymentAdapter(event); + useCase.templateName = 'fake-template-file-name'; + const createStackInputBuilder = new CreateStackCommandInputBuilder(useCase); + + try { + createStackCommandInput = await createStackInputBuilder.build(); + } catch (error) { + console.error(`Error occurred, error is ${error}`); + } + }); + + it('should create a CreateStackCommandInputBuilder with the correct properties', () => { + expect(createStackCommandInput.Parameters).toEqual([ + { ParameterKey: CfnParameterKeys.KnowledgeBaseType, ParameterValue: KnowledgeBaseTypes.KENDRA }, + { ParameterKey: CfnParameterKeys.NewKendraIndexName, ParameterValue: 'fake-index-name' }, + { ParameterKey: CfnParameterKeys.RAGEnabled, ParameterValue: 'true' }, + { ParameterKey: CfnParameterKeys.DefaultUserEmail, ParameterValue: 'fake-email@example.com' }, + { + ParameterKey: CfnParameterKeys.UseCaseConfigRecordKey, + ParameterValue: '11111111-11111111' + }, + { + ParameterKey: CfnParameterKeys.UseCaseConfigTableName, + ParameterValue: process.env[USE_CASE_CONFIG_TABLE_NAME_ENV_VAR] + }, + { ParameterKey: CfnParameterKeys.ExistingCognitoUserPoolId, ParameterValue: 'us-east-1_11111111111111111111' }, + { + ParameterKey: CfnParameterKeys.ExistingCognitoGroupPolicyTableName, + ParameterValue: 'fake-table-name' + }, + { ParameterKey: CfnParameterKeys.ExistingModelInfoTableName, ParameterValue: 'model-info-table-name' }, + { ParameterKey: CfnParameterKeys.UseCaseUUID, ParameterValue: '11111111' } + ]); + expect(createStackCommandInput.Capabilities).toEqual([ + 'CAPABILITY_IAM', + 'CAPABILITY_AUTO_EXPAND', + 'CAPABILITY_NAMED_IAM' + ]); + expect(createStackCommandInput.Tags).toEqual([ + { + Key: 'createdVia', + Value: 'deploymentPlatform' + }, + { + Key: 'userId', + Value: 'fake-user-id' + } + ]); + }); + }); + describe('When creating CreateStackCommandInputBuilder with a UseCaseAdapter from createEvent for a SageMaker endpoint', () => { it('should create a CreateStackCommandInputBuilder with the correct properties for sagemaker', async () => { let event = { ...createUseCaseEvent } as any; @@ -367,137 +427,6 @@ describe('When creating StackCommandBuilders', () => { }); }); - describe('When creating CreateStackCommandInputBuilder', () => { - describe('when POOL_ID env variable is not set', () => { - it('should not set POOL_ID when env variable is not set', async () => { - let event = { ...createUseCaseEvent } as any; - event.body.LlmParams.ModelProvider = CHAT_PROVIDERS.BEDROCK; - event.body.LlmParams.BedrockLlmParams = { ModelId: 'fake-model' }; - event.body = JSON.stringify(event.body); - const useCaseWithoutPoolID = new ChatUseCaseDeploymentAdapter(event); - const createStackInputBuilder = new CreateStackCommandInputBuilder(useCaseWithoutPoolID); - const createStackCommandInput = await createStackInputBuilder.build(); - - expect(createStackCommandInput.Parameters).not.toContainEqual({ - ParameterKey: CfnParameterKeys.ExistingCognitoUserPoolClient, - ParameterValue: expect.any(String) - }); - expect(createStackCommandInput.Parameters).toEqual([ - { ParameterKey: CfnParameterKeys.KnowledgeBaseType, ParameterValue: KnowledgeBaseTypes.KENDRA }, - { ParameterKey: CfnParameterKeys.NewKendraIndexName, ParameterValue: 'fake-index-name' }, - { ParameterKey: CfnParameterKeys.RAGEnabled, ParameterValue: 'true' }, - { ParameterKey: CfnParameterKeys.DefaultUserEmail, ParameterValue: 'fake-email@example.com' }, - { ParameterKey: CfnParameterKeys.DeployUI, ParameterValue: 'Yes' }, - { - ParameterKey: CfnParameterKeys.UseCaseConfigRecordKey, - ParameterValue: '11111111-11111111' - }, - { - ParameterKey: CfnParameterKeys.UseCaseConfigTableName, - ParameterValue: process.env[USE_CASE_CONFIG_TABLE_NAME_ENV_VAR] - }, - { ParameterKey: CfnParameterKeys.ExistingCognitoUserPoolId, ParameterValue: 'fake-user-pool' }, - { ParameterKey: CfnParameterKeys.CognitoDomainPrefix, ParameterValue: 'fake-domain-prefix' }, - { - ParameterKey: CfnParameterKeys.ExistingCognitoGroupPolicyTableName, - ParameterValue: 'fake-table-name' - }, - { - ParameterKey: CfnParameterKeys.ExistingModelInfoTableName, - ParameterValue: 'model-info-table-name' - }, - { ParameterKey: CfnParameterKeys.UseCaseUUID, ParameterValue: '11111111' } - ]); - expect(useCaseWithoutPoolID.configuration.LlmParams?.BedrockLlmParams?.ModelId).toEqual('fake-model'); - expect(createStackCommandInput.Capabilities).toEqual([ - 'CAPABILITY_IAM', - 'CAPABILITY_AUTO_EXPAND', - 'CAPABILITY_NAMED_IAM' - ]); - expect(createStackCommandInput.Tags).toEqual([ - { - Key: 'createdVia', - Value: 'deploymentPlatform' - }, - { - Key: 'userId', - Value: 'fake-user-id' - } - ]); - }); - }); - - describe('when POOL_ID env variable is set', () => { - beforeAll(() => { - process.env[USE_EXISTING_USER_POOL_CLIENT_ENV_VAR] = 'true'; - process.env[CLIENT_ID_ENV_VAR] = 'fake-pool-id'; - }); - - afterAll(() => { - delete process.env[USE_EXISTING_USER_POOL_CLIENT_ENV_VAR]; - delete process.env[CLIENT_ID_ENV_VAR]; - }); - - it('should set POOL_ID when env variable is set', async () => { - let event = { ...createUseCaseEvent } as any; - event.body.LlmParams.ModelProvider = CHAT_PROVIDERS.BEDROCK; - event.body.LlmParams.BedrockLlmParams = { ModelId: 'fake-model' }; - event.body = JSON.stringify(event.body); - - const useCaseWithoutPoolID = new ChatUseCaseDeploymentAdapter(event); - const createStackInputBuilder = new CreateStackCommandInputBuilder(useCaseWithoutPoolID); - const createStackCommandInput = await createStackInputBuilder.build(); - - expect(createStackCommandInput.Parameters).toEqual([ - { ParameterKey: CfnParameterKeys.KnowledgeBaseType, ParameterValue: KnowledgeBaseTypes.KENDRA }, - { ParameterKey: CfnParameterKeys.NewKendraIndexName, ParameterValue: 'fake-index-name' }, - { ParameterKey: CfnParameterKeys.RAGEnabled, ParameterValue: 'true' }, - { ParameterKey: CfnParameterKeys.DefaultUserEmail, ParameterValue: 'fake-email@example.com' }, - { ParameterKey: CfnParameterKeys.DeployUI, ParameterValue: 'Yes' }, - { - ParameterKey: CfnParameterKeys.UseCaseConfigRecordKey, - ParameterValue: '11111111-11111111' - }, - { - ParameterKey: CfnParameterKeys.UseCaseConfigTableName, - ParameterValue: process.env[USE_CASE_CONFIG_TABLE_NAME_ENV_VAR] - }, - { ParameterKey: CfnParameterKeys.ExistingCognitoUserPoolId, ParameterValue: 'fake-user-pool' }, - { - ParameterKey: CfnParameterKeys.ExistingCognitoUserPoolClient, - ParameterValue: 'fake-pool-id' - }, - { ParameterKey: CfnParameterKeys.CognitoDomainPrefix, ParameterValue: 'fake-domain-prefix' }, - { - ParameterKey: CfnParameterKeys.ExistingCognitoGroupPolicyTableName, - ParameterValue: 'fake-table-name' - }, - { - ParameterKey: CfnParameterKeys.ExistingModelInfoTableName, - ParameterValue: 'model-info-table-name' - }, - { ParameterKey: CfnParameterKeys.UseCaseUUID, ParameterValue: '11111111' } - ]); - expect(useCaseWithoutPoolID.configuration.LlmParams?.BedrockLlmParams?.ModelId).toEqual('fake-model'); - expect(createStackCommandInput.Capabilities).toEqual([ - 'CAPABILITY_IAM', - 'CAPABILITY_AUTO_EXPAND', - 'CAPABILITY_NAMED_IAM' - ]); - expect(createStackCommandInput.Tags).toEqual([ - { - Key: 'createdVia', - Value: 'deploymentPlatform' - }, - { - Key: 'userId', - Value: 'fake-user-id' - } - ]); - }); - }); - }); - describe('When creating UpdateStackCommandInputBuilder with a UseCase', () => { let updateStackInput: UpdateStackCommandInput; let useCase: UseCase; @@ -601,7 +530,8 @@ describe('When creating StackCommandBuilders', () => { { ParameterKey: CfnParameterKeys.CreateNewVpc, UsePreviousValue: true }, { ParameterKey: CfnParameterKeys.ExistingVpcId, UsePreviousValue: true }, { ParameterKey: CfnParameterKeys.ExistingPrivateSubnetIds, UsePreviousValue: true }, - { ParameterKey: CfnParameterKeys.ExistingSecurityGroupIds, UsePreviousValue: true } + { ParameterKey: CfnParameterKeys.ExistingSecurityGroupIds, UsePreviousValue: true }, + { ParameterKey: CfnParameterKeys.ExistingCognitoUserPoolClient, UsePreviousValue: true }, ]); expect(updateStackInput.Capabilities).toEqual([ 'CAPABILITY_IAM', @@ -654,7 +584,8 @@ describe('When creating StackCommandBuilders', () => { { ParameterKey: CfnParameterKeys.UseCaseUUID, ParameterValue: '11111111' }, { ParameterKey: CfnParameterKeys.VpcEnabled, UsePreviousValue: true }, { ParameterKey: CfnParameterKeys.CreateNewVpc, UsePreviousValue: true }, - { ParameterKey: CfnParameterKeys.ExistingVpcId, UsePreviousValue: true } + { ParameterKey: CfnParameterKeys.ExistingVpcId, UsePreviousValue: true }, + { ParameterKey: CfnParameterKeys.ExistingCognitoUserPoolClient, UsePreviousValue: true } ]); expect(updateStackInput2.Capabilities).toEqual([ 'CAPABILITY_IAM', diff --git a/source/lambda/use-case-management/test/event-test-data.ts b/source/lambda/use-case-management/test/event-test-data.ts index 8eca72f9..63c5e79a 100644 --- a/source/lambda/use-case-management/test/event-test-data.ts +++ b/source/lambda/use-case-management/test/event-test-data.ts @@ -11,7 +11,7 @@ * and limitations under the License. * *********************************************************************************************************************/ -import { CHAT_PROVIDERS, KnowledgeBaseTypes } from '../utils/constants'; +import { AUTHENTICATION_PROVIDERS, CHAT_PROVIDERS, KnowledgeBaseTypes } from '../utils/constants'; export const createUseCaseEvent = { body: { @@ -170,6 +170,41 @@ export const createUseCaseEventNoPrompt = { } }; + +export const createUseCaseEventAuthenticationParams = { + body: { + UseCaseName: 'fake-name', + UseCaseDescription: 'fake-description', + DefaultUserEmail: 'fake-email@example.com', + ConversationMemoryParams: { ConversationMemoryType: 'DDBMemoryType' }, + KnowledgeBaseParams: { + KnowledgeBaseType: KnowledgeBaseTypes.KENDRA, + NumberOfDocs: 5, + ReturnSourceDocs: false, + KendraKnowledgeBaseParams: { KendraIndexName: 'fake-index-name' } + }, + LlmParams: { + ModelProvider: CHAT_PROVIDERS.BEDROCK, + BedrockLlmParams: { 'ModelId': 'fake-model' }, + ModelParams: { 'Param1': 'value1' }, + Streaming: true, + RAGEnabled: true, + Temperature: 0.1 + }, + AuthenticationParams: { + AuthenticationProvider: AUTHENTICATION_PROVIDERS.COGNITO, + CognitoParams: { + ExistingUserPoolId: 'us-east-1_11111111111111111111' + } + } + }, + requestContext: { + authorizer: { + UserId: 'fake-user-id' + } + } +}; + export const createUseCaseEventVPC = { body: { UseCaseName: 'fake-name', diff --git a/source/lambda/use-case-management/tsconfig.json b/source/lambda/use-case-management/tsconfig.json index 328a2f34..524e8482 100644 --- a/source/lambda/use-case-management/tsconfig.json +++ b/source/lambda/use-case-management/tsconfig.json @@ -77,6 +77,9 @@ "@aws-sdk/util-arn-parser": [ "../layers/aws-sdk-lib/node_modules/@aws-sdk/util-arn-parser" ], + "@aws-sdk/client-cognito-identity-provider": [ + "../layers/aws-sdk-lib/node_modules/@aws-sdk/client-cognito-identity-provider" + ], "@smithy/types": [ "../layers/aws-sdk-lib/node_modules/@smithy/types" ] diff --git a/source/lambda/use-case-management/utils/constants.ts b/source/lambda/use-case-management/utils/constants.ts index 7d85db38..24a74df2 100644 --- a/source/lambda/use-case-management/utils/constants.ts +++ b/source/lambda/use-case-management/utils/constants.ts @@ -151,7 +151,10 @@ export const RetainedCfnParameterKeys = [ CfnParameterKeys.CreateNewVpc, CfnParameterKeys.ExistingVpcId, CfnParameterKeys.ExistingPrivateSubnetIds, - CfnParameterKeys.ExistingSecurityGroupIds + CfnParameterKeys.ExistingSecurityGroupIds, + CfnParameterKeys.ExistingCognitoUserPoolClient, + CfnParameterKeys.ExistingCognitoUserPoolId, + CfnParameterKeys.CognitoDomainPrefix ]; export const ChatRequiredPlaceholders = ['{input}', '{history}']; @@ -168,3 +171,10 @@ export const USE_CASE_CONFIG_RECORD_KEY_ATTRIBUTE_NAME = 'key'; export const USE_CASE_CONFIG_RECORD_CONFIG_ATTRIBUTE_NAME = 'config'; export const DEFAULT_USE_CASES_PER_PAGE = 10; + + +export const enum AUTHENTICATION_PROVIDERS { + COGNITO = 'Cognito' +} + +export const SUPPORTED_AUTHENTICATION_PROVIDERS = [AUTHENTICATION_PROVIDERS.COGNITO]; \ No newline at end of file diff --git a/source/ui-deployment/src/components/useCaseDetails/common-components.jsx b/source/ui-deployment/src/components/useCaseDetails/common-components.jsx index 0ae4f16b..c9d96a2f 100644 --- a/source/ui-deployment/src/components/useCaseDetails/common-components.jsx +++ b/source/ui-deployment/src/components/useCaseDetails/common-components.jsx @@ -126,6 +126,9 @@ export const GeneralConfig = () => { return value === undefined || value === '' || value === null; }; + const existingUserPoolId = selectedDeployment.AuthenticationParams?.CognitoParams?.ExistingUserPoolId; + const existingUserPoolClientId = selectedDeployment.AuthenticationParams?.CognitoParams?.ExistingUserPoolClientId; + const isVpcEnabled = selectedDeployment.vpcEnabled ? selectedDeployment.vpcEnabled.toLowerCase() === 'yes' : false; return ( @@ -222,6 +225,16 @@ export const GeneralConfig = () => { {selectedDeployment.vpcId} )} + {existingUserPoolId && ( + {existingUserPoolId} + )} + + {existingUserPoolClientId && ( + {existingUserPoolClientId} + )} + + + {isVpcEnabled && selectedDeployment.privateSubnetIds && ( {selectedDeployment.privateSubnetIds.join(', ')} diff --git a/source/ui-deployment/src/components/wizard/Review/UseCaseReview.tsx b/source/ui-deployment/src/components/wizard/Review/UseCaseReview.tsx index e989a7be..d9776884 100644 --- a/source/ui-deployment/src/components/wizard/Review/UseCaseReview.tsx +++ b/source/ui-deployment/src/components/wizard/Review/UseCaseReview.tsx @@ -53,6 +53,18 @@ export const UseCaseReview = (props: UseCaseReviewProps) => { )} + {props.useCaseData.existingUserPoolId !== '' && ( + + {props.useCaseData.existingUserPoolId} + + )} + + {props.useCaseData.existingUserPoolClientId !== '' && ( + + {props.useCaseData.existingUserPoolClientId} + + )} + {props.useCaseData.deployUI ? 'Yes' : 'No'} diff --git a/source/ui-deployment/src/components/wizard/UseCase/UseCase.tsx b/source/ui-deployment/src/components/wizard/UseCase/UseCase.tsx index f1af9f80..3eb19672 100644 --- a/source/ui-deployment/src/components/wizard/UseCase/UseCase.tsx +++ b/source/ui-deployment/src/components/wizard/UseCase/UseCase.tsx @@ -11,19 +11,20 @@ * and limitations under the License. * **********************************************************************************************************************/ -import React, { useContext } from 'react'; import { Box, Container, Header, SpaceBetween } from '@cloudscape-design/components'; +import React, { useContext } from 'react'; import UserEmail from './UserEmail'; -import { USE_CASE_OPTIONS } from '../steps-config'; import { DEPLOYMENT_ACTIONS } from '../../../utils/constants'; +import { USE_CASE_OPTIONS } from '../steps-config'; import HomeContext from '../../../contexts/home.context'; +import { StepContentProps } from '../interfaces/Steps'; +import DeployUI from './DeployUI'; import UseCaseDescription from './UseCaseDescription'; import UseCaseName from './UseCaseName'; import UseCaseTypeSelection from './UseCaseTypeSelection'; -import { StepContentProps } from '../interfaces/Steps'; -import DeployUI from './DeployUI'; +import UserPool from './UserPool/UserPool'; const UseCase = ({ info: { useCase }, onChange, setHelpPanelContent }: StepContentProps) => { const { @@ -31,7 +32,18 @@ const UseCase = ({ info: { useCase }, onChange, setHelpPanelContent }: StepConte } = useContext(HomeContext); const [numFieldsInError, setNumFieldsInError] = React.useState(0); - const requiredFields = ['useCaseName']; + + const initRequiredFieldsValue = () => { + const requiredFields = ['useCaseName']; + + if (useCase.existingUserPool) { + requiredFields.push('userPoolId'); + } + return requiredFields; + }; + + const [requiredFields, setRequiredFields] = React.useState(initRequiredFieldsValue); + React.useEffect(() => { const isRequiredFieldsFilled = () => { @@ -50,42 +62,75 @@ const UseCase = ({ info: { useCase }, onChange, setHelpPanelContent }: StepConte } }; updateError(); - }, [numFieldsInError, useCase.useCaseName, useCase.useCaseDescription, useCase.defaultUserEmail]); + }, [numFieldsInError, useCase.useCaseName, useCase.useCaseDescription, useCase.defaultUserEmail, useCase.existingUserPool, useCase.userPoolId]); + + + React.useEffect(() => { + if (useCase.existingUserPool) { + setRequiredFields(['useCaseName', 'userPoolId']); + } else { + setRequiredFields(['useCaseName']); + } + + if ((useCase.existingUserPool && useCase.userPoolId || !useCase.existingUserPool) && useCase.useCaseName) { + setNumFieldsInError(0); + onChange({ inError: false }); + } + + }, [useCase.useCaseName, useCase.existingUserPool, useCase.userPoolId]) + return ( - - Use case options}> - - - +
+ + Use case options}> + + + + + + + + + Manage user access}> + - - - +
); }; diff --git a/source/ui-deployment/src/components/wizard/UseCase/UserPool/ExistingUserPoolClientId.tsx b/source/ui-deployment/src/components/wizard/UseCase/UserPool/ExistingUserPoolClientId.tsx new file mode 100644 index 00000000..2f1586e3 --- /dev/null +++ b/source/ui-deployment/src/components/wizard/UseCase/UserPool/ExistingUserPoolClientId.tsx @@ -0,0 +1,69 @@ +/********************************************************************************************************************** + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * + * * + * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance * + * with the License. A copy of the License is located at * + * * + * http://www.apache.org/licenses/LICENSE-2.0 * + * * + * or in the 'license' file accompanying this file. This file is distributed on an 'AS IS' BASIS, WITHOUT WARRANTIES * + * OR CONDITIONS OF ANY KIND, express or implied. See the License for the specific language governing permissions * + * and limitations under the License. * + **********************************************************************************************************************/ + +import { FormField, Input, InputProps } from '@cloudscape-design/components'; +import { InfoLink } from 'components/commons'; +import React from 'react'; +import { TOOLS_CONTENT } from '../../tools-content'; +import { updateNumFieldsInError } from '../../utils'; +import { UserPoolFieldProps, isUserPoolClientIdValid } from './UserPool'; +const { useCase: useCaseToolsContent } = TOOLS_CONTENT; + + +export const ExistingUserPoolClientId = (props: UserPoolFieldProps) => { + const [existingUserPoolClientIdError, setExistingUserPoolClientIdError] = React.useState(''); + + const onExistingUserPoolClientIdChange = (detail: InputProps.ChangeDetail) => { + props.onChangeFn({ existingUserPoolClientId: detail.value }); + let errors = ''; + if (detail.value.length === 0) { + errors += 'Required field. '; + } + + if (!isUserPoolClientIdValid(detail.value)) { + errors += 'USER POOL CLIENT ID is invalid.'; + } + updateNumFieldsInError(errors, existingUserPoolClientIdError, props.setNumFieldsInError); + setExistingUserPoolClientIdError(errors); + }; + + React.useEffect(() => { + onExistingUserPoolClientIdChange({ value: props.existingUserPoolClientId } as InputProps.ChangeDetail); + }, []); + + return ( + + Cognito User Pool Client Id - required{' '} + + } + errorText={existingUserPoolClientIdError} + data-testid="user-pool-client-id-field" + description="The Id of the Cognito User Pool Client to be used for the use case." + info={ props.setHelpPanelContent!(useCaseToolsContent.existingUserPoolClientId)} />} + > + onExistingUserPoolClientIdChange(detail)} + disabled={props.disabled} + autoComplete={false} + data-testid="user-pool-id-input" + /> + + ); +}; + +export default ExistingUserPoolClientId; diff --git a/source/ui-deployment/src/components/wizard/UseCase/UserPool/ExistingUserPoolId.tsx b/source/ui-deployment/src/components/wizard/UseCase/UserPool/ExistingUserPoolId.tsx new file mode 100644 index 00000000..f476159f --- /dev/null +++ b/source/ui-deployment/src/components/wizard/UseCase/UserPool/ExistingUserPoolId.tsx @@ -0,0 +1,69 @@ +/********************************************************************************************************************** + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * + * * + * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance * + * with the License. A copy of the License is located at * + * * + * http://www.apache.org/licenses/LICENSE-2.0 * + * * + * or in the 'license' file accompanying this file. This file is distributed on an 'AS IS' BASIS, WITHOUT WARRANTIES * + * OR CONDITIONS OF ANY KIND, express or implied. See the License for the specific language governing permissions * + * and limitations under the License. * + **********************************************************************************************************************/ + +import React from 'react'; +import { Input, InputProps, FormField } from '@cloudscape-design/components'; +import { updateNumFieldsInError } from '../../utils'; +import { UserPoolFieldProps, isUserPoolIdValid } from './UserPool'; +import { InfoLink } from 'components/commons'; +import { TOOLS_CONTENT } from '../../tools-content'; +const { useCase: useCaseToolsContent } = TOOLS_CONTENT; + + +export const ExistingUserPoolId = (props: UserPoolFieldProps) => { + const [existingUserPoolIdError, setExistingUserPoolIdError] = React.useState(''); + + const onExistingUserPoolIdChange = (detail: InputProps.ChangeDetail) => { + props.onChangeFn({ existingUserPoolId: detail.value }); + let errors = ''; + if (detail.value.length === 0) { + errors += 'Required field. '; + } + + if (!isUserPoolIdValid(detail.value)) { + errors += 'USER POOL ID is invalid.'; + } + updateNumFieldsInError(errors, existingUserPoolIdError, props.setNumFieldsInError); + setExistingUserPoolIdError(errors); + }; + + React.useEffect(() => { + onExistingUserPoolIdChange({ value: props.existingUserPoolId } as InputProps.ChangeDetail); + }, []); + + return ( + + Cognito User Pool Id - required{' '} + + } + errorText={existingUserPoolIdError} + data-testid="user-pool-id-field" + description="The Id of the Cognito User Pool to be used for the use case." + info={ props.setHelpPanelContent!(useCaseToolsContent.existingUserPoolId)} />} + > + onExistingUserPoolIdChange(detail)} + disabled={props.disabled} + autoComplete={false} + data-testid="user-pool-id-input" + /> + + ); +}; + +export default ExistingUserPoolId; diff --git a/source/ui-deployment/src/components/wizard/UseCase/UserPool/UseExistingUserPoolClientId.tsx b/source/ui-deployment/src/components/wizard/UseCase/UserPool/UseExistingUserPoolClientId.tsx new file mode 100644 index 00000000..84fb0a42 --- /dev/null +++ b/source/ui-deployment/src/components/wizard/UseCase/UserPool/UseExistingUserPoolClientId.tsx @@ -0,0 +1,72 @@ +/********************************************************************************************************************** + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * + * * + * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance * + * with the License. A copy of the License is located at * + * * + * http://www.apache.org/licenses/LICENSE-2.0 * + * * + * or in the 'license' file accompanying this file. This file is distributed on an 'AS IS' BASIS, WITHOUT WARRANTIES * + * OR CONDITIONS OF ANY KIND, express or implied. See the License for the specific language governing permissions * + * and limitations under the License. * + **********************************************************************************************************************/ + +import { FormField, RadioGroup, RadioGroupProps } from '@cloudscape-design/components'; + +import { InfoLink } from 'components/commons'; +import { TOOLS_CONTENT } from '../../tools-content'; +import { UserPoolFieldProps } from './UserPool'; +const { useCase: useCaseToolsContent } = TOOLS_CONTENT; + + +export const UseExistingUserPoolClientId = (props: UserPoolFieldProps) => { + + const onUseExistingUserPoolClientIdChange = (detail: RadioGroupProps.ChangeDetail) => { + if (detail.value === 'yes') { + props.onChangeFn({ useExistingUserPoolClientId: true }); + } else { + props.onChangeFn({ + useExistingUserPoolClientId: false, + existingUserPoolClientId: '', + inError: false + }); + } + }; + + return ( + props.setHelpPanelContent!(useCaseToolsContent.existingUserPoolClientId)} + ariaLabel={ + 'You can use an existing Cognito User Pool Client, or choose "No" to have it created for you automatically.' + } + /> + } + stretch={true} + data-testid="use-existing-user-pool-client-field" + description="You can use an existing Cognito User Pool Client, or choose 'No' to have it created for you automatically." + > + onUseExistingUserPoolClientIdChange(detail)} + items={[ + { + value: 'yes', + label: 'Yes', + disabled: props.disabled + }, + { + value: 'no', + label: 'No', + disabled: props.disabled + } + ]} + value={props.useExistingUserPoolClientId === true ? 'yes' : 'no'} + data-testid="use-existing-user-pool-client-radio-group" + /> + + ); +}; + +export default UseExistingUserPoolClientId; diff --git a/source/ui-deployment/src/components/wizard/UseCase/UserPool/UseExistingUserPoolId.tsx b/source/ui-deployment/src/components/wizard/UseCase/UserPool/UseExistingUserPoolId.tsx new file mode 100644 index 00000000..43fa7ddf --- /dev/null +++ b/source/ui-deployment/src/components/wizard/UseCase/UserPool/UseExistingUserPoolId.tsx @@ -0,0 +1,74 @@ +/********************************************************************************************************************** + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * + * * + * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance * + * with the License. A copy of the License is located at * + * * + * http://www.apache.org/licenses/LICENSE-2.0 * + * * + * or in the 'license' file accompanying this file. This file is distributed on an 'AS IS' BASIS, WITHOUT WARRANTIES * + * OR CONDITIONS OF ANY KIND, express or implied. See the License for the specific language governing permissions * + * and limitations under the License. * + **********************************************************************************************************************/ + +import { FormField, RadioGroup, RadioGroupProps } from '@cloudscape-design/components'; + +import { InfoLink } from 'components/commons'; +import { TOOLS_CONTENT } from '../../tools-content'; +import { UserPoolFieldProps } from './UserPool'; +const { useCase: useCaseToolsContent } = TOOLS_CONTENT; + + +export const UseExistingUserPoolId = (props: UserPoolFieldProps) => { + + const onUseExistingUserPoolIdChange = (detail: RadioGroupProps.ChangeDetail) => { + if (detail.value === 'yes') { + props.onChangeFn({ useExistingUserPoolId: true }); + } else { + props.onChangeFn({ + useExistingUserPoolId: false, + existingUserPoolId: '', + useExistingUserPoolClientId: false, + existingUserPoolClientId: '', + inError: false + }); + } + }; + + return ( + props.setHelpPanelContent!(useCaseToolsContent.existingUserPool)} + ariaLabel={ + 'You can use an existing Cognito User Pool, or choose "No" to use the default user pool.' + } + /> + } + stretch={true} + data-testid="use-existing-user-pool-field" + description="You can use an existing Cognito User Pool, or choose 'No' to use the default user pool." + > + onUseExistingUserPoolIdChange(detail)} + items={[ + { + value: 'yes', + label: 'Yes', + disabled: props.disabled + }, + { + value: 'no', + label: 'No', + disabled: props.disabled + } + ]} + value={props.useExistingUserPoolId === true ? 'yes' : 'no'} + data-testid="use-existing-user-pool-radio-group" + /> + + ); +}; + +export default UseExistingUserPoolId; diff --git a/source/ui-deployment/src/components/wizard/UseCase/UserPool/UserPool.tsx b/source/ui-deployment/src/components/wizard/UseCase/UserPool/UserPool.tsx new file mode 100644 index 00000000..8da33742 --- /dev/null +++ b/source/ui-deployment/src/components/wizard/UseCase/UserPool/UserPool.tsx @@ -0,0 +1,84 @@ +import { Alert, Box, Header } from "@cloudscape-design/components"; +import { BaseFormComponentProps } from "../../interfaces"; +import ExistingUserPoolClientId from "./ExistingUserPoolClientId"; +import ExistingUserPoolId from "./ExistingUserPoolId"; +import UseExistingUserPoolClientId from "./UseExistingUserPoolClientId"; +import UseExistingUserPoolId from "./UseExistingUserPoolId"; + +export interface UserPoolFieldProps extends BaseFormComponentProps { + useExistingUserPoolId: boolean; + existingUserPoolId: string; + useExistingUserPoolClientId: boolean; + existingUserPoolClientId: string; + disabled?: boolean; +} + + +/** + * Validate user pool id based on: + * https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_UserPoolType.html + * @param userPoolId user pool id string + * @returns + */ +export const isUserPoolIdValid = (userPoolId: string) => { + if (userPoolId === '') { + return false; + } + + return userPoolId.match('^[\\w-]+_[0-9a-zA-Z]+$') !== null && userPoolId.length >= 1 && userPoolId.length <= 55; +}; + +/** + * Validate user pool client id based on: + * https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_UserPoolClientType.html + * @param userPoolClientId user pool id string + * @returns + */ +export const isUserPoolClientIdValid = (userPoolClientId: string) => { + if (userPoolClientId === '') { + return false; + } + + return userPoolClientId.match('^[\\w+]+') !== null && userPoolClientId.length >= 1 && userPoolClientId.length <= 128; +}; + + + +export const UserPool = (props: UserPoolFieldProps) => { + + return ( + +
User Pool Configuration
+ + + {props.disabled && ( + + + User Pool Settings cannot be modified for the deployed Use Case. + + + )} + + + + {props.useExistingUserPoolId && ( + <> + + + + {props.useExistingUserPoolClientId && ( + + )} + + + )} +
+ ); + +} + + +export default UserPool; diff --git a/source/ui-deployment/src/components/wizard/steps-config.jsx b/source/ui-deployment/src/components/wizard/steps-config.jsx index 10223a35..8cd96b5e 100644 --- a/source/ui-deployment/src/components/wizard/steps-config.jsx +++ b/source/ui-deployment/src/components/wizard/steps-config.jsx @@ -103,7 +103,11 @@ export const DEFAULT_STEP_INFO = { useCaseDescription: '', defaultUserEmail: '', deployUI: true, - inError: false + useExistingUserPoolId: false, + existingUserPoolId: '', + useExistingUserPoolClientId: false, + existingUserPoolClientId: '', + inError: false, }, vpc: { isVpcRequired: false, diff --git a/source/ui-deployment/src/components/wizard/tools-content.jsx b/source/ui-deployment/src/components/wizard/tools-content.jsx index 746450d4..34d5b40f 100644 --- a/source/ui-deployment/src/components/wizard/tools-content.jsx +++ b/source/ui-deployment/src/components/wizard/tools-content.jsx @@ -26,6 +26,58 @@ export const TOOLS_CONTENT = { } ] }, + existingUserPool: { + title: 'Default or Existing User Pool', + content: ( + + If No is selected, the solution will use the default user pool. This user pool is by default used for both the Deployment Dashboard and all the use cases.

+ Otherwise, if you select Yes, you will be asked to provide a UserPoolId rather than using the default one. This allows you to pre-create and configure user pool based on your requirements and use it to authenticate to the use case interface. +
+ ), + links: [ + { + href: IG_DOCS.MANAGE_USERS, + text: 'Manage user access' + } + ] + }, + existingUserPoolId: { + title: 'Bring Your Own User Pool', + content: ( + + + Use this option to configure the Cognito User Pool Id to be used by the deployment. When deploying the solution, + you have the option to use an existing Congito User Pool. If you choose otherwise, the solution will use the default Cognito User Pool + which is used to login to use case deployment dashboard. + + + ), + + links: [ + { + href: IG_DOCS.MANAGE_USERS, + text: 'Manage Users' + } + ] + }, + existingUserPoolClientId: { + title: 'Bring Your Own User Pool', + content: ( + + + Use this option to configure the Cognito User Pool Client Id to be used by the deployment. When deploying the solution, + you have the option to use an existing Congito User Pool. If you choose otherwise, the solution will use the default Cognito User Pool + which is used to login to use case deployment dashboard and will create a new Cognito User Pool Client. + + + ), + links: [ + { + href: IG_DOCS.MANAGE_USERS, + text: 'Manage Users' + } + ] + }, defaultUserEmail: { title: 'Default user email address', content: ( diff --git a/source/ui-deployment/src/components/wizard/utils.jsx b/source/ui-deployment/src/components/wizard/utils.jsx index b856d27f..6f6c888d 100644 --- a/source/ui-deployment/src/components/wizard/utils.jsx +++ b/source/ui-deployment/src/components/wizard/utils.jsx @@ -31,19 +31,19 @@ import workerJson from 'ace-builds/src-min-noconflict/worker-json?url'; export const getFieldOnChange = (fieldType, fieldKey, onChangeFn) => - ({ detail: { selectedOption, value, checked } }) => { - let fieldValue; - if (fieldType === 'select') { - fieldValue = selectedOption; - } else if (fieldType === 'toggle') { - fieldValue = checked; - } else { - fieldValue = value; - } - onChangeFn({ - [fieldKey]: fieldValue - }); - }; + ({ detail: { selectedOption, value, checked } }) => { + let fieldValue; + if (fieldType === 'select') { + fieldValue = selectedOption; + } else if (fieldType === 'toggle') { + fieldValue = checked; + } else { + fieldValue = value; + } + onChangeFn({ + [fieldKey]: fieldValue + }); + }; export const createDeployRequestPayload = (stepsInfo) => { const payload = { @@ -51,7 +51,8 @@ export const createDeployRequestPayload = (stepsInfo) => { ...createLLMParamsApiParams(stepsInfo.model, stepsInfo.prompt, stepsInfo.knowledgeBase.isRagRequired), ...createConversationMemoryApiParams(stepsInfo.prompt), ...createUseCaseInfoApiParams(stepsInfo.useCase), - ...createVpcApiParams(stepsInfo.vpc) + ...createVpcApiParams(stepsInfo.vpc), + ...createAuthenticationApiParams(stepsInfo.useCase), }; return payload; @@ -76,7 +77,9 @@ export const createUpdateRequestPayload = (stepsInfo) => { ...createKnowledgeBaseApiParams(stepsInfo.knowledgeBase, DEPLOYMENT_ACTIONS.EDIT), ...createLLMParamsApiParams(stepsInfo.model, stepsInfo.prompt, stepsInfo.knowledgeBase.isRagRequired), ...createConversationMemoryApiParams(stepsInfo.prompt), - ...updateVpcApiParams(stepsInfo.vpc) + ...updateVpcApiParams(stepsInfo.vpc), + ...createAuthenticationApiParams(stepsInfo.useCase), + }; removeEmptyString(payload); @@ -90,8 +93,8 @@ export const createUseCaseInfoApiParams = (useCaseStepInfo) => { DeployUI: useCaseStepInfo.deployUI, ...(useCaseStepInfo.defaultUserEmail && useCaseStepInfo.defaultUserEmail !== '' && { - DefaultUserEmail: useCaseStepInfo.defaultUserEmail - }) + DefaultUserEmail: useCaseStepInfo.defaultUserEmail + }) }; return params; }; @@ -374,6 +377,33 @@ export const createVpcApiParams = (vpcStepInfo) => { }; }; +/** + * Construct the params for the Authentication config for the api. + * @param {*} useCaseStepInfo Use Case step wizard details + * @returns + */ +export const createAuthenticationApiParams = (useCaseStepInfo) => { + + if (!useCaseStepInfo.useExistingUserPoolId) { + return { + }; + } + + return { + AuthenticationParams: { + AuthenticationProvider: "Cognito", + CognitoParams: { + ExistingUserPoolId: useCaseStepInfo.existingUserPoolId, + ...( + useCaseStepInfo.useExistingUserPoolClientId ? { + ExistingUserPoolClientId: useCaseStepInfo.existingUserPoolClientId + } : {} + ), + } + } + } +}; + /** * Construct the params for the VPC config for the api. * @param {*} vpcStepInfo Vpc step wizard details @@ -674,13 +704,24 @@ export const mapPromptStepInfoFromDeployment = (selectedDeployment) => { export const mapUseCaseStepInfoFromDeployment = (selectedDeployment) => { const { Name: useCaseName, defaultUserEmail, Description: useCaseDescription } = selectedDeployment; + const useExistingUserPoolId = selectedDeployment.AuthenticationParams?.CognitoParams?.ExistingUserPoolId != null; + const useExistingUserPoolClientId = selectedDeployment.AuthenticationParams?.CognitoParams?.ExistingUserPoolClientId != null + return { useCase: DEFAULT_STEP_INFO.useCase.useCase, useCaseName: useCaseName || '', defaultUserEmail: defaultUserEmail !== 'placeholder@example.com' ? defaultUserEmail : '', useCaseDescription: useCaseDescription || '', deployUI: selectedDeployment.deployUI === 'Yes', - inError: false + inError: false, + useExistingUserPoolId: useExistingUserPoolId, + ...(useExistingUserPoolId && { + existingUserPoolId: selectedDeployment.AuthenticationParams.CognitoParams.ExistingUserPoolId + }), + useExistingUserPoolClientId: useExistingUserPoolClientId, + ...(useExistingUserPoolClientId && { + existingUserPoolClientId: selectedDeployment.AuthenticationParams.CognitoParams.ExistingUserPoolClientId + }) }; };