From dfc6a8490b4bef78d38e3ee227c05ca0617306a8 Mon Sep 17 00:00:00 2001 From: virtualgill Date: Mon, 5 Jun 2023 22:36:47 +0100 Subject: [PATCH] Release 1.5.5 --- CHANGELOG.md | 7 +- README.md | 35 +- .../.gitignore | 20 + .../README.md | 67 + .../cdk-lex-v2-lambda-integration-examples.ts | 17 + .../bots/ReminderBotFiles/Manifest.json | 7 + .../ReminderBotFiles/ReminderBot/Bot.json | 10 + .../BotLocales/en_US/BotLocale.json | 11 + .../en_US/Intents/CallIntent/Intent.json | 271 ++ .../Intents/CallIntent/Slots/Time/Slot.json | 238 ++ .../en_US/Intents/EmailIntent/Intent.json | 255 ++ .../EmailIntent/Slots/DaysBefore/Slot.json | 266 ++ .../en_US/Intents/FallbackIntent/Intent.json | 318 ++ .../cdk.json | 27 + .../basic-passthrough-lambda-stack.ts | 45 + .../cdkStacks/reminder-bot-stack.ts | 147 + .../reminderBotFlow/ReminderBotFlow | 287 ++ .../package-lock.json | 3679 +++++++++++++++++ .../package.json | 36 + .../src/basicPassthroughLexv2Lambda/README.md | 66 + .../basicPassthroughLexv2Lambda.ts | 17 + .../src/reminderBotLex2Lambda/README.md | 49 + .../intentHandlers/callIntentHandler.ts | 229 + .../intentHandlers/constants.ts | 8 + .../intentHandlers/emailIntentHandler.ts | 37 + .../reminderBotLambda.ts | 29 + .../src/sharedLibraries/CommonUtils.ts | 62 + .../src/sharedLibraries/DialogHelpers.ts | 157 + .../sharedLibraries/LexCodeHookInterfaces.ts | 266 ++ .../tsconfig.json | 24 + tools/CCPLogParser/package-lock.json | 33 + 31 files changed, 6697 insertions(+), 23 deletions(-) create mode 100644 projects/AmazonLexv2LambdaIntegrationExamples/.gitignore create mode 100644 projects/AmazonLexv2LambdaIntegrationExamples/README.md create mode 100644 projects/AmazonLexv2LambdaIntegrationExamples/bin/cdk-lex-v2-lambda-integration-examples.ts create mode 100644 projects/AmazonLexv2LambdaIntegrationExamples/bots/ReminderBotFiles/Manifest.json create mode 100644 projects/AmazonLexv2LambdaIntegrationExamples/bots/ReminderBotFiles/ReminderBot/Bot.json create mode 100644 projects/AmazonLexv2LambdaIntegrationExamples/bots/ReminderBotFiles/ReminderBot/BotLocales/en_US/BotLocale.json create mode 100644 projects/AmazonLexv2LambdaIntegrationExamples/bots/ReminderBotFiles/ReminderBot/BotLocales/en_US/Intents/CallIntent/Intent.json create mode 100644 projects/AmazonLexv2LambdaIntegrationExamples/bots/ReminderBotFiles/ReminderBot/BotLocales/en_US/Intents/CallIntent/Slots/Time/Slot.json create mode 100644 projects/AmazonLexv2LambdaIntegrationExamples/bots/ReminderBotFiles/ReminderBot/BotLocales/en_US/Intents/EmailIntent/Intent.json create mode 100644 projects/AmazonLexv2LambdaIntegrationExamples/bots/ReminderBotFiles/ReminderBot/BotLocales/en_US/Intents/EmailIntent/Slots/DaysBefore/Slot.json create mode 100644 projects/AmazonLexv2LambdaIntegrationExamples/bots/ReminderBotFiles/ReminderBot/BotLocales/en_US/Intents/FallbackIntent/Intent.json create mode 100644 projects/AmazonLexv2LambdaIntegrationExamples/cdk.json create mode 100644 projects/AmazonLexv2LambdaIntegrationExamples/cdkStacks/basic-passthrough-lambda-stack.ts create mode 100644 projects/AmazonLexv2LambdaIntegrationExamples/cdkStacks/reminder-bot-stack.ts create mode 100644 projects/AmazonLexv2LambdaIntegrationExamples/connectFlows/reminderBotFlow/ReminderBotFlow create mode 100644 projects/AmazonLexv2LambdaIntegrationExamples/package-lock.json create mode 100644 projects/AmazonLexv2LambdaIntegrationExamples/package.json create mode 100644 projects/AmazonLexv2LambdaIntegrationExamples/src/basicPassthroughLexv2Lambda/README.md create mode 100644 projects/AmazonLexv2LambdaIntegrationExamples/src/basicPassthroughLexv2Lambda/basicPassthroughLexv2Lambda.ts create mode 100644 projects/AmazonLexv2LambdaIntegrationExamples/src/reminderBotLex2Lambda/README.md create mode 100644 projects/AmazonLexv2LambdaIntegrationExamples/src/reminderBotLex2Lambda/intentHandlers/callIntentHandler.ts create mode 100644 projects/AmazonLexv2LambdaIntegrationExamples/src/reminderBotLex2Lambda/intentHandlers/constants.ts create mode 100644 projects/AmazonLexv2LambdaIntegrationExamples/src/reminderBotLex2Lambda/intentHandlers/emailIntentHandler.ts create mode 100644 projects/AmazonLexv2LambdaIntegrationExamples/src/reminderBotLex2Lambda/reminderBotLambda.ts create mode 100644 projects/AmazonLexv2LambdaIntegrationExamples/src/sharedLibraries/CommonUtils.ts create mode 100644 projects/AmazonLexv2LambdaIntegrationExamples/src/sharedLibraries/DialogHelpers.ts create mode 100644 projects/AmazonLexv2LambdaIntegrationExamples/src/sharedLibraries/LexCodeHookInterfaces.ts create mode 100644 projects/AmazonLexv2LambdaIntegrationExamples/tsconfig.json diff --git a/CHANGELOG.md b/CHANGELOG.md index f4caed6..4724f2f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,12 +8,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - [powershell/Search-ContactFlows/] Downloads and searches Amazon Connect contact flows for a specified String ### Changed - [go/go.mod] Dependency Updates -## [1.5.3] - 2023-01-25 -### Changed - - [javascript/programmatically-create-task-example] Updating dependencies to address [CVE-1321](https://cwe.mitre.org/data/definitions/1321.html) -## [1.5.2] - 2023-01-25 -### Changed - - [tools/CCPLogParser] Updating dependencies to address [CVE-1321](https://cwe.mitre.org/data/definitions/1321.html) + ## [1.5.3] - 2023-01-25 ### Changed - [javascript/programmatically-create-task-example] Updating dependencies to address [CVE-1321](https://cwe.mitre.org/data/definitions/1321.html) diff --git a/README.md b/README.md index eeeaeb0..f047b4c 100644 --- a/README.md +++ b/README.md @@ -28,29 +28,30 @@ Feel free to add more languages. Please follow the requirements in each subdirec | Restrict Deskphone in CCP | Enforce deskphone settings with javascript in the CCP | [Javascript](javascript/restrict-deskphone-in-ccp) | | Remote Control Center | Centrally manage prompts and routing configurations in DynamoDB | [Python](python/remote-control-center) | | Contact Flow Helper | A single AWS Lambda function which provides a set of basic math and text tools to help manipulate data in contact flows | [Python](python/contactflowhelper)| -| Create Tasks Programmatically | CloudFormation template to enable you to programmatically create an Amazon Connect Task | [Javascript](javascript/programmatically-create-task-example) +| Create Tasks Programmatically | CloudFormation template to enable you to programmatically create an Amazon Connect Task | [Javascript](javascript/programmatically-create-task-example) | | Amazon Connect Reg-Ex Patterns | For use in Cloudformation templates | [Tools](tools/)| | Amazon Connect Draw.io Objects | Contact flow blocks that can be imported into Draw.io | [Tools](tools/)| | Check Time Left | This snippet helps make a routing decision whether to add a new contact to the queue or take another action (like terminating the call) based on the queue length and the business hours for that day. | [Python](python/CheckTimeLeft/) | ## Projects -| Name | Description | Links | -| ---- | ----------- | ----- | -| Context Routing | Uses CTR processing, Lambda, and DynamoDB to track IVR task completion and return callers to incomplete tasks | [CloudFormation](projects/ContextRouting) | -| SCV-CrossAccountSMS | Uses Lambda and cross account permissions to allow Salesforce Service Cloud Voice provisioned Amazon Connect instances to utilize SNS to send SMS messages. | [CloudFormation](projects/SCV-CrossAccountSMS) | -| CallerHistory | The caller history project utilizes AWS Lambda and Amazon DynamoDB to record if an individual has contacted previously though a user defined identifier and records time of last contact. | [CloudFormation](projects/CallerHistory) | -| CrossRegionCrossAccount | This project shows how to call an AWS Lambda function that exists in a separate account or a separate region using AWS Lambda permissions. | [CloudFormation](projects/CrossRegionCrossAccount) | -| GetSetDataByID | This project expands on the CallerHistory project by implementing additional functionality to get, put, and update items in Amazon DynamoDB. | [CloudFormation](projects/GetSetDataByID) | -| LastAgentRouting | This project shows how to potentially implement last agent routing for customers using a voice channel.| [CloudFormation](projects/LastAgentRouting) | -| RoutingFeatureRouting | This project shows how to capture a routing feature and use that to dynamically route a caller in a contact flow.| [CloudFormation](projects/RoutingFeatureRouting) | -| LambdaAlias | This project shows how to provide access to an AWS Lambda function Alias from Amazon Connect.| [CloudFormation](projects/LambdaAlias) | -| ContextRouting | This project demonstrates how you can use contact trace record processing, Lambda, and DynamoDB to track a callers progress through an IVR task, such as making a payment, and return them to that task should they be disconnected.| [CloudFormation](projects/ContextRouting) | -| Rate Limiter | The rate limiter project utilizes AWS Lambda and Amazon DynamoDB dynamically to add rate limiting a caller to a Amazon Connect queue based on their phone number and/or IP address.| [CloudFormation](projects/RateLimiter) | -| CCP Log Parser| A visualisation tool to visualise CCP logs to help troubleshoot client side errors | [link](tools/CCPLogParser) | -| Connectivity Test Tool | This tool checks which web browser the agent is running, the network configuration from the client side and whether the microphone has required permissions. | [link](tools/CCPConnectivityTestTools) | -| Dynamic Contact Center | This project demonstrates how you can use persistent session attributes to develop modular, repeatable and dynamic contact flows | [CloudFormation](projects/DynamicContactCenter) -| Connect Cloudwatch Dashboard | This project automates the creation and deployment of a Cloudwatch Dashboard to monitor critical metrics for an Amazon Connect instance | [link](tools/ConnectCloudwatchDashboard/README.md) +| Name | Description | Links | +|-----------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| ----- | +| Context Routing | Uses CTR processing, Lambda, and DynamoDB to track IVR task completion and return callers to incomplete tasks | [CloudFormation](projects/ContextRouting) | +| SCV-CrossAccountSMS | Uses Lambda and cross account permissions to allow Salesforce Service Cloud Voice provisioned Amazon Connect instances to utilize SNS to send SMS messages. | [CloudFormation](projects/SCV-CrossAccountSMS) | +| CallerHistory | The caller history project utilizes AWS Lambda and Amazon DynamoDB to record if an individual has contacted previously though a user defined identifier and records time of last contact. | [CloudFormation](projects/CallerHistory) | +| CrossRegionCrossAccount | This project shows how to call an AWS Lambda function that exists in a separate account or a separate region using AWS Lambda permissions. | [CloudFormation](projects/CrossRegionCrossAccount) | +| GetSetDataByID | This project expands on the CallerHistory project by implementing additional functionality to get, put, and update items in Amazon DynamoDB. | [CloudFormation](projects/GetSetDataByID) | +| LastAgentRouting | This project shows how to potentially implement last agent routing for customers using a voice channel. | [CloudFormation](projects/LastAgentRouting) | +| RoutingFeatureRouting | This project shows how to capture a routing feature and use that to dynamically route a caller in a contact flow. | [CloudFormation](projects/RoutingFeatureRouting) | +| LambdaAlias | This project shows how to provide access to an AWS Lambda function Alias from Amazon Connect. | [CloudFormation](projects/LambdaAlias) | +| ContextRouting | This project demonstrates how you can use contact trace record processing, Lambda, and DynamoDB to track a callers progress through an IVR task, such as making a payment, and return them to that task should they be disconnected. | [CloudFormation](projects/ContextRouting) | +| Rate Limiter | The rate limiter project utilizes AWS Lambda and Amazon DynamoDB dynamically to add rate limiting a caller to a Amazon Connect queue based on their phone number and/or IP address. | [CloudFormation](projects/RateLimiter) | +| CCP Log Parser | A visualisation tool to visualise CCP logs to help troubleshoot client side errors | [link](tools/CCPLogParser) | +| Connectivity Test Tool | This tool checks which web browser the agent is running, the network configuration from the client side and whether the microphone has required permissions. | [link](tools/CCPConnectivityTestTools) | +| Dynamic Contact Center | This project demonstrates how you can use persistent session attributes to develop modular, repeatable and dynamic contact flows | [CloudFormation](projects/DynamicContactCenter) | +| Connect Cloudwatch Dashboard | This project automates the creation and deployment of a Cloudwatch Dashboard to monitor critical metrics for an Amazon Connect instance | [link](tools/ConnectCloudwatchDashboard/README.md) | +| Lex v2 Lambda integration example | This folder contains examples of AWS Lambda functions for use with Amazon Lex v2 code hooks. | [link](projects/AmazonLexv2LambdaIntegrationExamples/README.md) | ## Contributions diff --git a/projects/AmazonLexv2LambdaIntegrationExamples/.gitignore b/projects/AmazonLexv2LambdaIntegrationExamples/.gitignore new file mode 100644 index 0000000..ba59c98 --- /dev/null +++ b/projects/AmazonLexv2LambdaIntegrationExamples/.gitignore @@ -0,0 +1,20 @@ + +# dependencies +/node_modules/ + +# build +/cdk.out/ + +# ide +/.vscode +.vscode +/.idea/ + +# ignore files compiled from ts files - this assumes that ALL js files in these dirs were generated from ts +*.d.ts +/src/**/*.js +/cdkStacks/**/*.js +/bin/*.js + +# General +.DS_Store diff --git a/projects/AmazonLexv2LambdaIntegrationExamples/README.md b/projects/AmazonLexv2LambdaIntegrationExamples/README.md new file mode 100644 index 0000000..7d0be2d --- /dev/null +++ b/projects/AmazonLexv2LambdaIntegrationExamples/README.md @@ -0,0 +1,67 @@ +# Amazon Lex V2 Lambda Integration Examples + +## Introduction + +This folder contains examples of AWS Lambda functions for use with Amazon Lex v2 code hooks. + + +## Prerequisites + +- AWS Account +- [AWS IAM user](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users_create.html) with Administrator permissions +- [Node](https://nodejs.org/) (v18) +- [NPM](https://docs.npmjs.com/cli/v9/configuring-npm/install) (v9) +- [AWS CLI v2](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html) +- [AWS CDK v2](https://docs.aws.amazon.com/cdk/v2/guide/cli.html) + +## Set-up +```commandline +cd projects/AmazonLexv2LambdaIntegrationExamples +``` +```commandline +npm install +npm run build +``` + +If you have started with a new environment, please bootstrap CDK +```commandline +npm run cdk:bootstrap +``` + + + +## Deploying + +To deploy **all** examples +```commandline +npm run cdk:deploy:all +``` + +To deploy individual examples, use the specific instructions below: + +#### Basic pass-through lambda +If you are just looking to get a basic template, or to do some experimenting and learning, this lambda will give you a place to start. + +See [README](src/basicPassthroughLexv2Lambda/README.md) for detailed information. + +```commandline +npm run cdk:deploy:basiclambda +``` + +#### Reminder Lex bot and Lambda function +This bot shows a simple non-functional example of a Reminder bot showing example Lambda function integrations and conditional flows. +It deploys both the Lex bot and the Lambda function and connects the Lambda function to the bot as part of deploy. + +See [README](src/reminderBotLex2Lambda/README.md) for detailed information. + +```commandline +npm run cdk:deploy:reminderbot +``` + + +### Clean-up +To remove **all** resources created as part of all stacks run the below: +```commandline +npm run cdk:destroy:all +``` +See individual READMEs for specific instructions to just remove individual Stacks. diff --git a/projects/AmazonLexv2LambdaIntegrationExamples/bin/cdk-lex-v2-lambda-integration-examples.ts b/projects/AmazonLexv2LambdaIntegrationExamples/bin/cdk-lex-v2-lambda-integration-examples.ts new file mode 100644 index 0000000..984f233 --- /dev/null +++ b/projects/AmazonLexv2LambdaIntegrationExamples/bin/cdk-lex-v2-lambda-integration-examples.ts @@ -0,0 +1,17 @@ +#!/usr/bin/env node +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: MIT-0 + +import "source-map-support/register" +import * as cdk from "aws-cdk-lib" +import { AwsSolutionsChecks } from "cdk-nag" +import { Aspects } from "aws-cdk-lib" + +import { BasicPassthroughLambdaCdkStack } from "../cdkStacks/basic-passthrough-lambda-stack" +import { ReminderBotStack } from "../cdkStacks/reminder-bot-stack" + +const app = new cdk.App() +Aspects.of(app).add(new AwsSolutionsChecks({ verbose: true })) + +new BasicPassthroughLambdaCdkStack(app, "BasicLexLambdaIntegration", {}) +new ReminderBotStack(app, "ReminderBot", {}) diff --git a/projects/AmazonLexv2LambdaIntegrationExamples/bots/ReminderBotFiles/Manifest.json b/projects/AmazonLexv2LambdaIntegrationExamples/bots/ReminderBotFiles/Manifest.json new file mode 100644 index 0000000..fdbd69d --- /dev/null +++ b/projects/AmazonLexv2LambdaIntegrationExamples/bots/ReminderBotFiles/Manifest.json @@ -0,0 +1,7 @@ +{ + "metaData": { + "fileFormat": "LexJson", + "resourceType": "BOT", + "schemaVersion": "1" + } +} diff --git a/projects/AmazonLexv2LambdaIntegrationExamples/bots/ReminderBotFiles/ReminderBot/Bot.json b/projects/AmazonLexv2LambdaIntegrationExamples/bots/ReminderBotFiles/ReminderBot/Bot.json new file mode 100644 index 0000000..1703550 --- /dev/null +++ b/projects/AmazonLexv2LambdaIntegrationExamples/bots/ReminderBotFiles/ReminderBot/Bot.json @@ -0,0 +1,10 @@ +{ + "name": "ReminderBot", + "version": "DRAFT", + "description": "Example reminder bot to demonstrate different lambda integration options.", + "identifier": "", + "dataPrivacy": { + "childDirected": false + }, + "idleSessionTTLInSeconds": 300 +} diff --git a/projects/AmazonLexv2LambdaIntegrationExamples/bots/ReminderBotFiles/ReminderBot/BotLocales/en_US/BotLocale.json b/projects/AmazonLexv2LambdaIntegrationExamples/bots/ReminderBotFiles/ReminderBot/BotLocales/en_US/BotLocale.json new file mode 100644 index 0000000..deb1954 --- /dev/null +++ b/projects/AmazonLexv2LambdaIntegrationExamples/bots/ReminderBotFiles/ReminderBot/BotLocales/en_US/BotLocale.json @@ -0,0 +1,11 @@ +{ + "name": "English (US)", + "identifier": "en_US", + "version": null, + "description": null, + "voiceSettings": { + "engine": "neural", + "voiceId": "Ivy" + }, + "nluConfidenceThreshold": 0.4 +} diff --git a/projects/AmazonLexv2LambdaIntegrationExamples/bots/ReminderBotFiles/ReminderBot/BotLocales/en_US/Intents/CallIntent/Intent.json b/projects/AmazonLexv2LambdaIntegrationExamples/bots/ReminderBotFiles/ReminderBot/BotLocales/en_US/Intents/CallIntent/Intent.json new file mode 100644 index 0000000..ac83d1c --- /dev/null +++ b/projects/AmazonLexv2LambdaIntegrationExamples/bots/ReminderBotFiles/ReminderBot/BotLocales/en_US/Intents/CallIntent/Intent.json @@ -0,0 +1,271 @@ +{ + "name": "CallIntent", + "identifier": "", + "description": "Intent to book a reminder call.", + "parentIntentSignature": null, + "sampleUtterances": [ + { + "utterance": "I would like a call" + }, + { + "utterance": "Please call me" + }, + { + "utterance": "call" + }, + { + "utterance": "Can you make a call to me" + }, + { + "utterance": "I would prefer a call" + }, + { + "utterance": "Call me please" + }, + { + "utterance": "I'd want a call" + }, + { + "utterance": "call me to confirm" + }, + { + "utterance": "Get someone to phone me" + }, + { + "utterance": "Can I get a phone call" + }, + { + "utterance": "Phone me" + }, + { + "utterance": "Please make a phone call" + }, + { + "utterance": "Ring me" + }, + { + "utterance": "I would like you to ring me" + }, + { + "utterance": "I would want to speak to someone" + }, + { + "utterance": "Can you confirm by phone" + }, + { + "utterance": "I would prefer a phone call" + }, + { + "utterance": "Can you contact me on the phone " + }, + { + "utterance": "I'd rather you rang me" + }, + { + "utterance": "call me in {Time}" + }, + { + "utterance": "call me in {Time} before my appointment" + }, + { + "utterance": "call me at {Time}" + }, + { + "utterance": "I’d like a call at {Time}" + }, + { + "utterance": "I would like a call at {Time}" + }, + { + "utterance": "Can you call me at {Time}" + }, + { + "utterance": "I'd prefer a call in the {Time}" + }, + { + "utterance": "Ring me around {Time}" + }, + { + "utterance": "Phone me at {Time}" + }, + { + "utterance": "Phone me in the {Time}" + }, + { + "utterance": "I'd prefer you rang me at {Time}" + } + ], + "intentConfirmationSetting": null, + "intentClosingSetting": null, + "initialResponseSetting": { + "initialResponse": { + "allowInterrupt": true, + "messageGroupsList": [ + { + "message": { + "imageResponseCard": null, + "ssmlMessage": null, + "customPayload": null, + "plainTextMessage": { + "value": "We'll call you the day before your appointment." + } + }, + "variations": null + } + ] + }, + "codeHook": { + "isActive": true, + "enableCodeHookInvocation": true, + "invocationLabel": "CallIntent_InitialCodeHook", + "postCodeHookSpecification": { + "failureResponse": null, + "failureNextStep": { + "sessionAttributes": {}, + "dialogAction": { + "type": "EndConversation", + "slotToElicit": null, + "suppressNextMessage": null + }, + "intent": { + "name": null, + "slots": {} + } + }, + "failureConditional": null, + "successNextStep": { + "sessionAttributes": {}, + "dialogAction": { + "type": "ElicitSlot", + "slotToElicit": "Time", + "suppressNextMessage": null + }, + "intent": { + "name": null, + "slots": {} + } + }, + "successResponse": null, + "successConditional": null, + "timeoutResponse": null, + "timeoutNextStep": { + "sessionAttributes": {}, + "dialogAction": { + "type": "EndConversation", + "slotToElicit": null, + "suppressNextMessage": null + }, + "intent": { + "name": null, + "slots": {} + } + }, + "timeoutConditional": null + } + }, + "conditional": null, + "nextStep": { + "sessionAttributes": { + "fallback-count": "0", + "slot-failure": "false" + }, + "dialogAction": { + "type": "InvokeDialogCodeHook", + "slotToElicit": null, + "suppressNextMessage": null + }, + "intent": { + "name": null, + "slots": {} + } + } + }, + "inputContexts": null, + "outputContexts": null, + "kendraConfiguration": null, + "dialogCodeHook": { + "enabled": true + }, + "fulfillmentCodeHook": { + "isActive": true, + "fulfillmentUpdatesSpecification": null, + "postFulfillmentStatusSpecification": { + "failureResponse": { + "allowInterrupt": true, + "messageGroupsList": [ + { + "message": { + "imageResponseCard": null, + "ssmlMessage": null, + "customPayload": null, + "plainTextMessage": { + "value": "Apologies, we are having a system issue and couldn't book the call in. Please try again later." + } + }, + "variations": null + } + ] + }, + "failureNextStep": { + "sessionAttributes": {}, + "dialogAction": { + "type": "EndConversation", + "slotToElicit": null, + "suppressNextMessage": null + }, + "intent": { + "name": null, + "slots": {} + } + }, + "successNextStep": { + "sessionAttributes": {}, + "dialogAction": { + "type": "EndConversation", + "slotToElicit": null, + "suppressNextMessage": null + }, + "intent": { + "name": null, + "slots": {} + } + }, + "successResponse": { + "allowInterrupt": true, + "messageGroupsList": [ + { + "message": { + "imageResponseCard": null, + "ssmlMessage": null, + "customPayload": null, + "plainTextMessage": { + "value": "Your call has been scheduled for {Time}." + } + }, + "variations": null + } + ] + }, + "timeoutResponse": null, + "timeoutNextStep": { + "sessionAttributes": {}, + "dialogAction": { + "type": "EndConversation", + "slotToElicit": null, + "suppressNextMessage": null + }, + "intent": { + "name": null, + "slots": {} + } + } + }, + "enabled": true + }, + "slotPriorities": [ + { + "priority": 1, + "slotName": "Time" + } + ] +} diff --git a/projects/AmazonLexv2LambdaIntegrationExamples/bots/ReminderBotFiles/ReminderBot/BotLocales/en_US/Intents/CallIntent/Slots/Time/Slot.json b/projects/AmazonLexv2LambdaIntegrationExamples/bots/ReminderBotFiles/ReminderBot/BotLocales/en_US/Intents/CallIntent/Slots/Time/Slot.json new file mode 100644 index 0000000..8733c4c --- /dev/null +++ b/projects/AmazonLexv2LambdaIntegrationExamples/bots/ReminderBotFiles/ReminderBot/BotLocales/en_US/Intents/CallIntent/Slots/Time/Slot.json @@ -0,0 +1,238 @@ +{ + "name": "Time", + "identifier": "", + "description": "Slot to capture the time the user would like the reminder call.", + "slotTypeName": "AMAZON.Time", + "obfuscationSetting": null, + "valueElicitationSetting": { + "slotCaptureSetting": { + "captureResponse": null, + "captureNextStep": { + "sessionAttributes": {}, + "dialogAction": { + "type": "InvokeDialogCodeHook", + "slotToElicit": null, + "suppressNextMessage": null + }, + "intent": { + "name": null, + "slots": {} + } + }, + "captureConditional": null, + "failureResponse": null, + "failureNextStep": { + "sessionAttributes": { + "slot-failure": "true" + }, + "dialogAction": { + "type": "StartIntent", + "slotToElicit": null, + "suppressNextMessage": null + }, + "intent": { + "name": "FallbackIntent", + "slots": {} + } + }, + "failureConditional": null, + "elicitationCodeHook": { + "enableCodeHookInvocation": true, + "invocationLabel": "CallIntent_TimeSlot_PromptCodeHook" + }, + "codeHook": { + "isActive": true, + "enableCodeHookInvocation": true, + "invocationLabel": "CallIntent_TimeSlot_ValidationCodeHook", + "postCodeHookSpecification": { + "failureResponse": null, + "failureNextStep": { + "sessionAttributes": {}, + "dialogAction": { + "type": "EndConversation", + "slotToElicit": null, + "suppressNextMessage": null + }, + "intent": { + "name": null, + "slots": {} + } + }, + "failureConditional": null, + "successNextStep": { + "sessionAttributes": {}, + "dialogAction": { + "type": "FulfillIntent", + "slotToElicit": null, + "suppressNextMessage": null + }, + "intent": { + "name": null, + "slots": {} + } + }, + "successResponse": null, + "successConditional": null, + "timeoutResponse": null, + "timeoutNextStep": { + "sessionAttributes": {}, + "dialogAction": { + "type": "EndConversation", + "slotToElicit": null, + "suppressNextMessage": null + }, + "intent": { + "name": null, + "slots": {} + } + }, + "timeoutConditional": null + } + } + }, + "promptSpecification": { + "messageSelectionStrategy": "Random", + "allowInterrupt": true, + "promptAttemptsSpecification": { + "Retry1": { + "allowedInputTypes": { + "allowAudioInput": true, + "allowDTMFInput": true + }, + "audioAndDTMFInputSpecification": { + "dtmfSpecification": { + "maxLength": 513, + "deletionCharacter": "*", + "endCharacter": "#", + "endTimeoutMs": 5000 + }, + "audioSpecification": { + "maxLengthMs": 15000, + "endTimeoutMs": 640 + }, + "startTimeoutMs": 4000 + }, + "allowInterrupt": true, + "textInputSpecification": { + "startTimeoutMs": 30000 + } + }, + "Initial": { + "allowedInputTypes": { + "allowAudioInput": true, + "allowDTMFInput": true + }, + "audioAndDTMFInputSpecification": { + "dtmfSpecification": { + "maxLength": 513, + "deletionCharacter": "*", + "endCharacter": "#", + "endTimeoutMs": 5000 + }, + "audioSpecification": { + "maxLengthMs": 15000, + "endTimeoutMs": 640 + }, + "startTimeoutMs": 4000 + }, + "allowInterrupt": true, + "textInputSpecification": { + "startTimeoutMs": 30000 + } + }, + "Retry4": { + "allowedInputTypes": { + "allowAudioInput": true, + "allowDTMFInput": true + }, + "audioAndDTMFInputSpecification": { + "dtmfSpecification": { + "maxLength": 513, + "deletionCharacter": "*", + "endCharacter": "#", + "endTimeoutMs": 5000 + }, + "audioSpecification": { + "maxLengthMs": 15000, + "endTimeoutMs": 640 + }, + "startTimeoutMs": 4000 + }, + "allowInterrupt": true, + "textInputSpecification": { + "startTimeoutMs": 30000 + } + }, + "Retry3": { + "allowedInputTypes": { + "allowAudioInput": true, + "allowDTMFInput": true + }, + "audioAndDTMFInputSpecification": { + "dtmfSpecification": { + "maxLength": 513, + "deletionCharacter": "*", + "endCharacter": "#", + "endTimeoutMs": 5000 + }, + "audioSpecification": { + "maxLengthMs": 15000, + "endTimeoutMs": 640 + }, + "startTimeoutMs": 4000 + }, + "allowInterrupt": true, + "textInputSpecification": { + "startTimeoutMs": 30000 + } + }, + "Retry2": { + "allowedInputTypes": { + "allowAudioInput": true, + "allowDTMFInput": true + }, + "audioAndDTMFInputSpecification": { + "dtmfSpecification": { + "maxLength": 513, + "deletionCharacter": "*", + "endCharacter": "#", + "endTimeoutMs": 5000 + }, + "audioSpecification": { + "maxLengthMs": 15000, + "endTimeoutMs": 640 + }, + "startTimeoutMs": 4000 + }, + "allowInterrupt": true, + "textInputSpecification": { + "startTimeoutMs": 30000 + } + } + }, + "messageGroupsList": [ + { + "message": { + "imageResponseCard": null, + "ssmlMessage": null, + "customPayload": null, + "plainTextMessage": { + "value": "What time would you like the call?" + } + }, + "variations": null + } + ], + "maxRetries": 4 + }, + "slotConstraint": "Required", + "defaultValueSpecification": null, + "sampleUtterances": [ + { + "utterance": "{Time} o'clock" + } + ], + "waitAndContinueSpecification": null + }, + "multipleValuesSetting": null +} diff --git a/projects/AmazonLexv2LambdaIntegrationExamples/bots/ReminderBotFiles/ReminderBot/BotLocales/en_US/Intents/EmailIntent/Intent.json b/projects/AmazonLexv2LambdaIntegrationExamples/bots/ReminderBotFiles/ReminderBot/BotLocales/en_US/Intents/EmailIntent/Intent.json new file mode 100644 index 0000000..7386896 --- /dev/null +++ b/projects/AmazonLexv2LambdaIntegrationExamples/bots/ReminderBotFiles/ReminderBot/BotLocales/en_US/Intents/EmailIntent/Intent.json @@ -0,0 +1,255 @@ +{ + "name": "EmailIntent", + "identifier": "", + "description": "Intent to book a reminder email.", + "parentIntentSignature": null, + "sampleUtterances": [ + { + "utterance": "email" + }, + { + "utterance": "I would like an email" + }, + { + "utterance": "Please send me an email" + }, + { + "utterance": "just email me" + }, + { + "utterance": "I want an email" + }, + { + "utterance": "remind me on email" + }, + { + "utterance": "send me an email to confirm" + }, + { + "utterance": "mail me the info" + }, + { + "utterance": "i want to get an email" + }, + { + "utterance": "email is fine" + }, + { + "utterance": "I would prefer an email" + }, + { + "utterance": "I would rather have an email" + }, + { + "utterance": "I'd like to get an email" + }, + { + "utterance": "An email would be best" + }, + { + "utterance": "Send me an email {DaysBefore} days my appointment" + }, + { + "utterance": "I want an email {DaysBefore} days before" + }, + { + "utterance": "I" + } + ], + "intentConfirmationSetting": null, + "intentClosingSetting": null, + "initialResponseSetting": { + "initialResponse": null, + "codeHook": { + "isActive": true, + "enableCodeHookInvocation": true, + "invocationLabel": "EmailIntent_InitialCodeHook", + "postCodeHookSpecification": { + "failureResponse": null, + "failureNextStep": { + "sessionAttributes": {}, + "dialogAction": { + "type": "EndConversation", + "slotToElicit": null, + "suppressNextMessage": null + }, + "intent": { + "name": null, + "slots": {} + } + }, + "failureConditional": null, + "successNextStep": { + "sessionAttributes": {}, + "dialogAction": { + "type": "ElicitSlot", + "slotToElicit": "DaysBefore", + "suppressNextMessage": null + }, + "intent": { + "name": null, + "slots": {} + } + }, + "successResponse": null, + "successConditional": null, + "timeoutResponse": null, + "timeoutNextStep": { + "sessionAttributes": {}, + "dialogAction": { + "type": "EndConversation", + "slotToElicit": null, + "suppressNextMessage": null + }, + "intent": { + "name": null, + "slots": {} + } + }, + "timeoutConditional": null + } + }, + "conditional": { + "isActive": true, + "conditionalBranches": [ + { + "name": "DaysBeforeSet", + "response": null, + "condition": { + "expressionString": "fn.IS_SET({DaysBefore})" + }, + "nextStep": { + "sessionAttributes": {}, + "dialogAction": { + "type": "InvokeDialogCodeHook", + "slotToElicit": null, + "suppressNextMessage": null + }, + "intent": { + "name": null, + "slots": {} + } + } + } + ], + "defaultBranch": { + "response": { + "allowInterrupt": false, + "messageGroupsList": [ + { + "message": { + "imageResponseCard": null, + "ssmlMessage": null, + "customPayload": null, + "plainTextMessage": { + "value": "We will email you on the day you choose up to a week before your appointment." + } + }, + "variations": null + } + ] + }, + "nextStep": { + "sessionAttributes": {}, + "dialogAction": { + "type": "InvokeDialogCodeHook", + "slotToElicit": null, + "suppressNextMessage": null + }, + "intent": { + "name": null, + "slots": {} + } + } + } + }, + "nextStep": { + "sessionAttributes": { + "fallback-count": "0", + "slot-failure": "false" + }, + "dialogAction": { + "type": "EvaluateConditional", + "slotToElicit": null, + "suppressNextMessage": null + }, + "intent": { + "name": null, + "slots": {} + } + } + }, + "inputContexts": null, + "outputContexts": null, + "kendraConfiguration": null, + "dialogCodeHook": { + "enabled": true + }, + "fulfillmentCodeHook": { + "isActive": true, + "fulfillmentUpdatesSpecification": null, + "postFulfillmentStatusSpecification": { + "failureResponse": null, + "failureNextStep": { + "sessionAttributes": {}, + "dialogAction": { + "type": "EndConversation", + "slotToElicit": null, + "suppressNextMessage": null + }, + "intent": { + "name": null, + "slots": {} + } + }, + "successNextStep": { + "sessionAttributes": {}, + "dialogAction": { + "type": "EndConversation", + "slotToElicit": null, + "suppressNextMessage": null + }, + "intent": { + "name": null, + "slots": {} + } + }, + "successResponse": { + "allowInterrupt": true, + "messageGroupsList": [ + { + "message": { + "imageResponseCard": null, + "ssmlMessage": null, + "customPayload": null, + "plainTextMessage": { + "value": "No problem! Your email reminder has been set up for {DaysBefore} days before your appointment." + } + }, + "variations": null + } + ] + }, + "timeoutResponse": null, + "timeoutNextStep": { + "sessionAttributes": {}, + "dialogAction": { + "type": "EndConversation", + "slotToElicit": null, + "suppressNextMessage": null + }, + "intent": { + "name": null, + "slots": {} + } + } + }, + "enabled": true + }, + "slotPriorities": [ + { + "priority": 0, + "slotName": "DaysBefore" + } + ] +} diff --git a/projects/AmazonLexv2LambdaIntegrationExamples/bots/ReminderBotFiles/ReminderBot/BotLocales/en_US/Intents/EmailIntent/Slots/DaysBefore/Slot.json b/projects/AmazonLexv2LambdaIntegrationExamples/bots/ReminderBotFiles/ReminderBot/BotLocales/en_US/Intents/EmailIntent/Slots/DaysBefore/Slot.json new file mode 100644 index 0000000..c1ed801 --- /dev/null +++ b/projects/AmazonLexv2LambdaIntegrationExamples/bots/ReminderBotFiles/ReminderBot/BotLocales/en_US/Intents/EmailIntent/Slots/DaysBefore/Slot.json @@ -0,0 +1,266 @@ +{ + "name": "DaysBefore", + "identifier": "", + "description": "Slot to capture the number of days before an appointment that the user would like a reminder email", + "slotTypeName": "AMAZON.Number", + "obfuscationSetting": null, + "valueElicitationSetting": { + "slotCaptureSetting": { + "captureResponse": null, + "captureNextStep": { + "sessionAttributes": {}, + "dialogAction": { + "type": "EvaluateConditional", + "slotToElicit": null, + "suppressNextMessage": null + }, + "intent": { + "name": null, + "slots": {} + } + }, + "captureConditional": { + "isActive": true, + "conditionalBranches": [ + { + "name": "DaysGreaterThan7", + "response": { + "allowInterrupt": true, + "messageGroupsList": [ + { + "message": { + "imageResponseCard": null, + "ssmlMessage": null, + "customPayload": null, + "plainTextMessage": { + "value": "We can't email more than a week before your appointment. Please choose a number between 1 and 7." + } + }, + "variations": null + } + ] + }, + "condition": { + "expressionString": "{DaysBefore} > 7" + }, + "nextStep": { + "sessionAttributes": {}, + "dialogAction": { + "type": "ElicitSlot", + "slotToElicit": "DaysBefore", + "suppressNextMessage": true + }, + "intent": { + "name": "EmailIntent", + "slots": { + "DaysBefore": { + "value": { + "interpretedValue": null + }, + "values": null, + "shape": null + } + } + } + } + }, + { + "name": "DaysLessThan1", + "response": { + "allowInterrupt": true, + "messageGroupsList": [ + { + "message": { + "imageResponseCard": null, + "ssmlMessage": null, + "customPayload": null, + "plainTextMessage": { + "value": "The last day we can email you is the day before your appointment. Please choose a number between 1 and 7." + } + }, + "variations": null + } + ] + }, + "condition": { + "expressionString": "{DaysBefore} < 1" + }, + "nextStep": { + "sessionAttributes": {}, + "dialogAction": { + "type": "ElicitSlot", + "slotToElicit": "DaysBefore", + "suppressNextMessage": true + }, + "intent": { + "name": "EmailIntent", + "slots": { + "DaysBefore": { + "value": { + "interpretedValue": null + }, + "values": null, + "shape": null + } + } + } + } + } + ], + "defaultBranch": { + "response": null, + "nextStep": { + "sessionAttributes": {}, + "dialogAction": { + "type": "FulfillIntent", + "slotToElicit": null, + "suppressNextMessage": null + }, + "intent": { + "name": null, + "slots": {} + } + } + } + }, + "failureResponse": null, + "failureNextStep": { + "sessionAttributes": { + "slot-failure": "true" + }, + "dialogAction": { + "type": "StartIntent", + "slotToElicit": null, + "suppressNextMessage": null + }, + "intent": { + "name": "FallbackIntent", + "slots": {} + } + }, + "failureConditional": null, + "elicitationCodeHook": { + "enableCodeHookInvocation": false, + "invocationLabel": "EmailIntent_DaysBeforeSlot_PromptCodeHook" + }, + "codeHook": null + }, + "promptSpecification": { + "messageSelectionStrategy": "Random", + "allowInterrupt": true, + "promptAttemptsSpecification": { + "Retry1": { + "allowedInputTypes": { + "allowAudioInput": true, + "allowDTMFInput": true + }, + "audioAndDTMFInputSpecification": { + "dtmfSpecification": { + "maxLength": 513, + "deletionCharacter": "*", + "endCharacter": "#", + "endTimeoutMs": 5000 + }, + "audioSpecification": { + "maxLengthMs": 15000, + "endTimeoutMs": 640 + }, + "startTimeoutMs": 4000 + }, + "allowInterrupt": true, + "textInputSpecification": { + "startTimeoutMs": 30000 + } + }, + "Initial": { + "allowedInputTypes": { + "allowAudioInput": true, + "allowDTMFInput": true + }, + "audioAndDTMFInputSpecification": { + "dtmfSpecification": { + "maxLength": 513, + "deletionCharacter": "*", + "endCharacter": "#", + "endTimeoutMs": 5000 + }, + "audioSpecification": { + "maxLengthMs": 15000, + "endTimeoutMs": 640 + }, + "startTimeoutMs": 4000 + }, + "allowInterrupt": true, + "textInputSpecification": { + "startTimeoutMs": 30000 + } + }, + "Retry3": { + "allowedInputTypes": { + "allowAudioInput": true, + "allowDTMFInput": true + }, + "audioAndDTMFInputSpecification": { + "dtmfSpecification": { + "maxLength": 513, + "deletionCharacter": "*", + "endCharacter": "#", + "endTimeoutMs": 5000 + }, + "audioSpecification": { + "maxLengthMs": 15000, + "endTimeoutMs": 640 + }, + "startTimeoutMs": 4000 + }, + "allowInterrupt": true, + "textInputSpecification": { + "startTimeoutMs": 30000 + } + }, + "Retry2": { + "allowedInputTypes": { + "allowAudioInput": true, + "allowDTMFInput": true + }, + "audioAndDTMFInputSpecification": { + "dtmfSpecification": { + "maxLength": 513, + "deletionCharacter": "*", + "endCharacter": "#", + "endTimeoutMs": 5000 + }, + "audioSpecification": { + "maxLengthMs": 15000, + "endTimeoutMs": 640 + }, + "startTimeoutMs": 4000 + }, + "allowInterrupt": true, + "textInputSpecification": { + "startTimeoutMs": 30000 + } + } + }, + "messageGroupsList": [ + { + "message": { + "imageResponseCard": null, + "ssmlMessage": null, + "customPayload": null, + "plainTextMessage": { + "value": "How many days before your appointment would you like us to email you?" + } + }, + "variations": null + } + ], + "maxRetries": 3 + }, + "slotConstraint": "Required", + "defaultValueSpecification": null, + "sampleUtterances": null, + "waitAndContinueSpecification": null + }, + "multipleValuesSetting": null +} diff --git a/projects/AmazonLexv2LambdaIntegrationExamples/bots/ReminderBotFiles/ReminderBot/BotLocales/en_US/Intents/FallbackIntent/Intent.json b/projects/AmazonLexv2LambdaIntegrationExamples/bots/ReminderBotFiles/ReminderBot/BotLocales/en_US/Intents/FallbackIntent/Intent.json new file mode 100644 index 0000000..40e968f --- /dev/null +++ b/projects/AmazonLexv2LambdaIntegrationExamples/bots/ReminderBotFiles/ReminderBot/BotLocales/en_US/Intents/FallbackIntent/Intent.json @@ -0,0 +1,318 @@ +{ + "name": "FallbackIntent", + "identifier": "FALLBCKINT", + "description": "Default intent when no other intent matches", + "parentIntentSignature": "AMAZON.FallbackIntent", + "sampleUtterances": null, + "intentConfirmationSetting": null, + "intentClosingSetting": { + "isActive": false, + "closingResponse": null, + "nextStep": { + "sessionAttributes": null, + "dialogAction": { + "type": "EndConversation", + "slotToElicit": null, + "suppressNextMessage": null + }, + "intent": { + "name": null, + "slots": null + } + } + }, + "initialResponseSetting": { + "initialResponse": null, + "codeHook": { + "isActive": true, + "enableCodeHookInvocation": true, + "invocationLabel": "FallbackIntent_InitialCodeHook", + "postCodeHookSpecification": { + "failureResponse": null, + "failureNextStep": { + "sessionAttributes": null, + "dialogAction": { + "type": "EndConversation", + "slotToElicit": null, + "suppressNextMessage": null + }, + "intent": { + "name": null, + "slots": null + } + }, + "failureConditional": null, + "successNextStep": { + "sessionAttributes": null, + "dialogAction": { + "type": "FulfillIntent", + "slotToElicit": null, + "suppressNextMessage": null + }, + "intent": { + "name": null, + "slots": null + } + }, + "successResponse": null, + "successConditional": null, + "timeoutResponse": null, + "timeoutNextStep": { + "sessionAttributes": null, + "dialogAction": { + "type": "EndConversation", + "slotToElicit": null, + "suppressNextMessage": null + }, + "intent": { + "name": null, + "slots": null + } + }, + "timeoutConditional": null + } + }, + "conditional": { + "isActive": true, + "conditionalBranches": [ + { + "name": "Initial", + "response": { + "allowInterrupt": true, + "messageGroupsList": [ + { + "message": { + "imageResponseCard": null, + "ssmlMessage": null, + "customPayload": null, + "plainTextMessage": { + "value": "Sorry, I didn't understand, can you rephrase? I am only able to set up reminders." + } + }, + "variations": null + } + ] + }, + "condition": { + "expressionString": "(!fn.IS_SET([fallback-count]) OR [fallback-count] = \"\" OR [fallback-count] = \"0\") AND (!fn.IS_SET([slot-failure] OR [slot-failure] != \"true\")" + }, + "nextStep": { + "sessionAttributes": { + "fallback-count": "1" + }, + "dialogAction": { + "type": "ElicitIntent", + "slotToElicit": null, + "suppressNextMessage": null + }, + "intent": { + "name": null, + "slots": null + } + } + }, + { + "name": "Retry1", + "response": { + "allowInterrupt": true, + "messageGroupsList": [ + { + "message": { + "imageResponseCard": null, + "ssmlMessage": null, + "customPayload": null, + "plainTextMessage": { + "value": "Sorry, I didn't understand, can you rephrase? I can set up a reminder by call or email. Which would you prefer?" + } + }, + "variations": null + } + ] + }, + "condition": { + "expressionString": "[fallback-count] = \"1\" AND (!fn.IS_SET([slot-failure] OR [slot-failure] != \"true\")" + }, + "nextStep": { + "sessionAttributes": { + "fallback-count": "2" + }, + "dialogAction": { + "type": "ElicitIntent", + "slotToElicit": null, + "suppressNextMessage": null + }, + "intent": { + "name": null, + "slots": null + } + } + }, + { + "name": "Retry2", + "response": { + "allowInterrupt": true, + "messageGroupsList": [ + { + "message": { + "imageResponseCard": null, + "ssmlMessage": null, + "customPayload": null, + "plainTextMessage": { + "value": "Sorry, I didn't understand. You can say things like 'I would like an email reminder' or 'I would like a phone call'" + } + }, + "variations": null + } + ] + }, + "condition": { + "expressionString": "[fallback-count] = \"2\" AND (!fn.IS_SET([slot-failure] OR [slot-failure] != \"true\")" + }, + "nextStep": { + "sessionAttributes": { + "fallback-count": "3" + }, + "dialogAction": { + "type": "ElicitIntent", + "slotToElicit": null, + "suppressNextMessage": null + }, + "intent": { + "name": null, + "slots": null + } + } + }, + { + "name": "SlotFallback", + "response": { + "allowInterrupt": true, + "messageGroupsList": [ + { + "message": { + "imageResponseCard": null, + "ssmlMessage": null, + "customPayload": null, + "plainTextMessage": { + "value": "Apologies, I wasn't able to understand your response." + } + }, + "variations": null + } + ] + }, + "condition": { + "expressionString": "[slot-failure] = \"true\" " + }, + "nextStep": { + "sessionAttributes": {}, + "dialogAction": { + "type": "FulfillIntent", + "slotToElicit": null, + "suppressNextMessage": null + }, + "intent": { + "name": null, + "slots": null + } + } + } + ], + "defaultBranch": { + "response": null, + "nextStep": { + "sessionAttributes": null, + "dialogAction": { + "type": "FulfillIntent", + "slotToElicit": null, + "suppressNextMessage": null + }, + "intent": { + "name": null, + "slots": null + } + } + } + }, + "nextStep": { + "sessionAttributes": {}, + "dialogAction": { + "type": "EvaluateConditional", + "slotToElicit": null, + "suppressNextMessage": null + }, + "intent": { + "name": null, + "slots": null + } + } + }, + "inputContexts": null, + "outputContexts": null, + "kendraConfiguration": null, + "dialogCodeHook": { + "enabled": true + }, + "fulfillmentCodeHook": { + "isActive": true, + "fulfillmentUpdatesSpecification": null, + "postFulfillmentStatusSpecification": { + "failureResponse": null, + "failureNextStep": { + "sessionAttributes": null, + "dialogAction": { + "type": "EndConversation", + "slotToElicit": null, + "suppressNextMessage": null + }, + "intent": { + "name": null, + "slots": null + } + }, + "successNextStep": { + "sessionAttributes": null, + "dialogAction": { + "type": "EndConversation", + "slotToElicit": null, + "suppressNextMessage": null + }, + "intent": { + "name": null, + "slots": null + } + }, + "successResponse": { + "allowInterrupt": true, + "messageGroupsList": [ + { + "message": { + "imageResponseCard": null, + "ssmlMessage": null, + "customPayload": null, + "plainTextMessage": { + "value": "One of our customer service agents will be in touch shortly to help with your request." + } + }, + "variations": null + } + ] + }, + "timeoutResponse": null, + "timeoutNextStep": { + "sessionAttributes": null, + "dialogAction": { + "type": "EndConversation", + "slotToElicit": null, + "suppressNextMessage": null + }, + "intent": { + "name": null, + "slots": null + } + } + }, + "enabled": true + }, + "slotPriorities": [] +} diff --git a/projects/AmazonLexv2LambdaIntegrationExamples/cdk.json b/projects/AmazonLexv2LambdaIntegrationExamples/cdk.json new file mode 100644 index 0000000..c7104c3 --- /dev/null +++ b/projects/AmazonLexv2LambdaIntegrationExamples/cdk.json @@ -0,0 +1,27 @@ +{ + "app": "npx ts-node --prefer-ts-exts bin/cdk-lex-v2-lambda-integration-examples.ts", + "watch": { + "include": ["**"], + "exclude": [ + "README.md", + "cdk*.json", + "**/*.d.ts", + "**/*.js", + "tsconfig.json", + "package*.json", + "yarn.lock", + "node_modules", + "test" + ] + }, + "context": { + "@aws-cdk/aws-apigateway:usagePlanKeyOrderInsensitiveId": true, + "@aws-cdk/core:stackRelativeExports": true, + "@aws-cdk/aws-rds:lowercaseDbIdentifier": true, + "@aws-cdk/aws-lambda:recognizeVersionProps": true, + "@aws-cdk/aws-cloudfront:defaultSecurityPolicyTLSv1.2_2021": true, + "@aws-cdk-containers/ecs-service-extensions:enableDefaultLogDriver": true, + "@aws-cdk/aws-ec2:uniqueImdsv2TemplateName": true, + "@aws-cdk/core:target-partitions": ["aws", "aws-cn"] + } +} diff --git a/projects/AmazonLexv2LambdaIntegrationExamples/cdkStacks/basic-passthrough-lambda-stack.ts b/projects/AmazonLexv2LambdaIntegrationExamples/cdkStacks/basic-passthrough-lambda-stack.ts new file mode 100644 index 0000000..f2137c9 --- /dev/null +++ b/projects/AmazonLexv2LambdaIntegrationExamples/cdkStacks/basic-passthrough-lambda-stack.ts @@ -0,0 +1,45 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: MIT-0 + +import { App, CfnOutput, Duration, Stack, StackProps } from "aws-cdk-lib" +import { NagSuppressions } from "cdk-nag" +import * as path from "path" +import * as nodejs from "aws-cdk-lib/aws-lambda-nodejs" +import * as lambda from "aws-cdk-lib/aws-lambda" + +export class BasicPassthroughLambdaCdkStack extends Stack { + constructor(scope: App, id: string, props?: StackProps) { + super(scope, id, props) + + const basicPassthroughLexv2Lambda = new nodejs.NodejsFunction(this, "BasicPassthroughLexv2Lambda", { + memorySize: 1024, + timeout: Duration.seconds(30), + runtime: lambda.Runtime.NODEJS_18_X, + handler: "handler", + environment: { + DEBUG_LOGGING_ENABLED: "true", + }, + entry: path.join(__dirname, `/../src/basicPassthroughLexv2Lambda/basicPassthroughLexv2Lambda.ts`), + }) + + NagSuppressions.addResourceSuppressions( + basicPassthroughLexv2Lambda, + [ + { + id: "AwsSolutions-IAM4", + reason: "This is the default Lambda Execution Policy which just grants writes to CloudWatch.", + }, + ], + true + ) + + new CfnOutput(this, "basicPassthroughLexv2LambdaArn", { + value: basicPassthroughLexv2Lambda.functionArn, + }) + new CfnOutput(this, "basicPassthroughLexv2LambdaLink", { + value: `https://${Stack.of(this).region}.console.aws.amazon.com/lambda/home?region=${ + Stack.of(this).region + }#/functions/${basicPassthroughLexv2Lambda.functionName}`, + }) + } +} diff --git a/projects/AmazonLexv2LambdaIntegrationExamples/cdkStacks/reminder-bot-stack.ts b/projects/AmazonLexv2LambdaIntegrationExamples/cdkStacks/reminder-bot-stack.ts new file mode 100644 index 0000000..bb9f110 --- /dev/null +++ b/projects/AmazonLexv2LambdaIntegrationExamples/cdkStacks/reminder-bot-stack.ts @@ -0,0 +1,147 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: MIT-0 + +import { App, CfnOutput, Duration, Stack, StackProps } from "aws-cdk-lib" +import { NodejsFunction } from "aws-cdk-lib/aws-lambda-nodejs" +import { Runtime } from "aws-cdk-lib/aws-lambda" +import { CfnBot, CfnBotAlias, CfnBotVersion } from "aws-cdk-lib/aws-lex" +import { Asset } from "aws-cdk-lib/aws-s3-assets" +import { PolicyDocument, PolicyStatement, Role, ServicePrincipal } from "aws-cdk-lib/aws-iam" + +import { NagSuppressions } from "cdk-nag" +import * as path from "path" + +export class ReminderBotStack extends Stack { + constructor(scope: App, id: string, props?: StackProps) { + super(scope, id, props) + + const lexFulfillmentLambda = new NodejsFunction(this, "LexFulfillmentLambda", { + memorySize: 1024, + timeout: Duration.seconds(30), + runtime: Runtime.NODEJS_18_X, + handler: "handler", + environment: { + DEBUG_LOGGING_ENABLED: "true", + }, + entry: path.join(__dirname, "../src/reminderBotLex2Lambda/reminderBotLambda.ts"), + }) + + NagSuppressions.addResourceSuppressions( + lexFulfillmentLambda, + [ + { + id: "AwsSolutions-IAM4", + reason: "This is the default Lambda Execution Policy which just grants writes to CloudWatch.", + }, + ], + true + ) + + const lexBotRole = new Role(this, "LexBotRole", { + assumedBy: new ServicePrincipal("lexv2.amazonaws.com"), + inlinePolicies: { + ["LexRuntimeRolePolicy"]: new PolicyDocument({ + statements: [ + new PolicyStatement({ + resources: ["*"], + actions: ["polly:SynthesizeSpeech", "comprehend:DetectSentiment"], + }), + ], + }), + }, + }) + + NagSuppressions.addResourceSuppressions( + lexBotRole, + [ + { + id: "AwsSolutions-IAM5", + reason: "This is the standard pattern for a service-linked role for Amazon Lex V2.", + }, + ], + true + ) + + const lexAssetS3Bucket = new Asset(this, "lexAssetS3Bucket", { + path: path.join(__dirname, "../bots/ReminderBotFiles"), + }) + + const reminderBot = new CfnBot(this, "ReminderBot", { + dataPrivacy: { ChildDirected: false }, + idleSessionTtlInSeconds: 300, + name: "ReminderBot", + roleArn: lexBotRole.roleArn, + autoBuildBotLocales: true, + botFileS3Location: { + s3Bucket: lexAssetS3Bucket.s3BucketName, + s3ObjectKey: lexAssetS3Bucket.s3ObjectKey, + }, + testBotAliasSettings: { + botAliasLocaleSettings: [ + { + localeId: "en_US", + botAliasLocaleSetting: { + enabled: true, + codeHookSpecification: { + lambdaCodeHook: { + codeHookInterfaceVersion: "1.0", + lambdaArn: lexFulfillmentLambda.functionArn, + }, + }, + }, + }, + ], + }, + }) + + const botVersion = new CfnBotVersion(this, "BotVersion", { + botId: reminderBot.ref, + botVersionLocaleSpecification: [ + { + botVersionLocaleDetails: { + sourceBotVersion: "DRAFT", + }, + localeId: "en_US", + }, + ], + }) + + const prodBotAlias = new CfnBotAlias(this, "prodBotAlias", { + botAliasName: "Prod", + botId: reminderBot.ref, + botAliasLocaleSettings: [ + { + botAliasLocaleSetting: { + enabled: true, + codeHookSpecification: { + lambdaCodeHook: { + codeHookInterfaceVersion: "1.0", + lambdaArn: lexFulfillmentLambda.functionArn, + }, + }, + }, + localeId: "en_US", + }, + ], + botVersion: botVersion.getAtt("BotVersion").toString(), + sentimentAnalysisSettings: { DetectSentiment: true }, + }) + + lexFulfillmentLambda.addPermission("Lex Invocation", { + principal: new ServicePrincipal("lexv2.amazonaws.com"), + sourceArn: `arn:aws:lex:${Stack.of(this).region}:${Stack.of(this).account}:bot-alias/${reminderBot.attrId}/*`, + }) + + new CfnOutput(this, "reminderBotLambdaLink", { + value: `https://${Stack.of(this).region}.console.aws.amazon.com/lambda/home?region=${ + Stack.of(this).region + }#/functions/${lexFulfillmentLambda.functionName}`, + }) + + new CfnOutput(this, "reminderBotLink", { + value: `https://${Stack.of(this).region}.console.aws.amazon.com/lexv2/home?region=${Stack.of(this).region}#/bot/${ + reminderBot.attrId + }`, + }) + } +} diff --git a/projects/AmazonLexv2LambdaIntegrationExamples/connectFlows/reminderBotFlow/ReminderBotFlow b/projects/AmazonLexv2LambdaIntegrationExamples/connectFlows/reminderBotFlow/ReminderBotFlow new file mode 100644 index 0000000..081c966 --- /dev/null +++ b/projects/AmazonLexv2LambdaIntegrationExamples/connectFlows/reminderBotFlow/ReminderBotFlow @@ -0,0 +1,287 @@ +{ + "Version": "2019-10-30", + "StartAction": "2f9a965a-f07a-43e9-8909-4899efe5d3bf", + "Metadata": { + "entryPointPosition": { + "x": 40, + "y": 40 + }, + "ActionMetadata": { + "2f9a965a-f07a-43e9-8909-4899efe5d3bf": { + "position": { + "x": 241.6, + "y": 117.6 + } + }, + "2f08ce68-8a36-4d56-aea1-02909807458b": { + "position": { + "x": 204.8, + "y": 403.2 + }, + "overrideConsoleVoice": true + }, + "07b13e07-39d4-4e63-bda8-bce7fe9abc2e": { + "position": { + "x": 1052.8, + "y": 390.4 + } + }, + "11143221-8170-45d9-b5e7-933716eecdea": { + "position": { + "x": 839.2, + "y": 14.4 + } + }, + "a91aefae-1cd6-4c48-a058-217a35380d03": { + "position": { + "x": 1110.4, + "y": 152.8 + } + }, + "73dbc0b9-3f89-4638-9774-042f44984cd7": { + "position": { + "x": 1442.4, + "y": 344 + } + }, + "ea48a6b5-f192-488e-b19b-db31b9af3d81": { + "position": { + "x": 1832, + "y": 337.6 + } + }, + "8f73f57f-dc98-4450-9b02-bc64ea0dffd2": { + "position": { + "x": 761.6, + "y": 671.2 + } + }, + "8aa6727f-83a4-4ab9-b2f0-7717fca0577a": { + "position": { + "x": 513.6, + "y": 188 + }, + "parameters": { + "LexV2Bot": { + "AliasArn": { + "displayName": "TestBotAlias", + "useLexBotDropdown": true, + "lexV2BotName": "ReminderBot" + } + }, + "LexTimeoutSeconds": { + "Text": { + "unit": 60 + } + } + }, + "useLexBotDropdown": true, + "lexV2BotName": "ReminderBot", + "lexV2BotAliasName": "TestBotAlias", + "conditionMetadata": [ + { + "id": "dd1d4111-aee5-4622-a978-e2024fdb6665", + "operator": { + "name": "Equals", + "value": "Equals", + "shortDisplay": "=" + }, + "value": "FallbackIntent" + }, + { + "id": "d8dad234-3655-4467-8f81-1c36dbbb6498", + "operator": { + "name": "Equals", + "value": "Equals", + "shortDisplay": "=" + }, + "value": "CallIntent" + }, + { + "id": "899eebed-376c-4b89-ae26-c860176c02b4", + "operator": { + "name": "Equals", + "value": "Equals", + "shortDisplay": "=" + }, + "value": "EmailIntent" + } + ] + } + }, + "name": "ReminderBotFlow", + "description": "", + "type": "contactFlow", + "status": "published", + "hash": {} + }, + "Actions": [ + { + "Parameters": { + "FlowLoggingBehavior": "Enabled" + }, + "Identifier": "2f9a965a-f07a-43e9-8909-4899efe5d3bf", + "Type": "UpdateFlowLoggingBehavior", + "Transitions": { + "NextAction": "2f08ce68-8a36-4d56-aea1-02909807458b" + } + }, + { + "Parameters": { + "TextToSpeechVoice": "Joanna", + "TextToSpeechEngine": "Neural", + "TextToSpeechStyle": "Conversational" + }, + "Identifier": "2f08ce68-8a36-4d56-aea1-02909807458b", + "Type": "UpdateContactTextToSpeechVoice", + "Transitions": { + "NextAction": "8aa6727f-83a4-4ab9-b2f0-7717fca0577a" + } + }, + { + "Parameters": { + "Text": "Exited bot because there was a timeout waiting for the customer to respond" + }, + "Identifier": "07b13e07-39d4-4e63-bda8-bce7fe9abc2e", + "Type": "MessageParticipant", + "Transitions": { + "NextAction": "ea48a6b5-f192-488e-b19b-db31b9af3d81", + "Errors": [ + { + "NextAction": "ea48a6b5-f192-488e-b19b-db31b9af3d81", + "ErrorType": "NoMatchingError" + } + ] + } + }, + { + "Parameters": { + "Text": "Exited bot from Fallback Intent\n" + }, + "Identifier": "11143221-8170-45d9-b5e7-933716eecdea", + "Type": "MessageParticipant", + "Transitions": { + "NextAction": "ea48a6b5-f192-488e-b19b-db31b9af3d81", + "Errors": [ + { + "NextAction": "ea48a6b5-f192-488e-b19b-db31b9af3d81", + "ErrorType": "NoMatchingError" + } + ] + } + }, + { + "Parameters": { + "Text": "Exited bot from Call Intent\n" + }, + "Identifier": "a91aefae-1cd6-4c48-a058-217a35380d03", + "Type": "MessageParticipant", + "Transitions": { + "NextAction": "ea48a6b5-f192-488e-b19b-db31b9af3d81", + "Errors": [ + { + "NextAction": "ea48a6b5-f192-488e-b19b-db31b9af3d81", + "ErrorType": "NoMatchingError" + } + ] + } + }, + { + "Parameters": { + "Text": "Exited bot from Email Intent" + }, + "Identifier": "73dbc0b9-3f89-4638-9774-042f44984cd7", + "Type": "MessageParticipant", + "Transitions": { + "NextAction": "ea48a6b5-f192-488e-b19b-db31b9af3d81", + "Errors": [ + { + "NextAction": "ea48a6b5-f192-488e-b19b-db31b9af3d81", + "ErrorType": "NoMatchingError" + } + ] + } + }, + { + "Parameters": {}, + "Identifier": "ea48a6b5-f192-488e-b19b-db31b9af3d81", + "Type": "DisconnectParticipant", + "Transitions": {} + }, + { + "Parameters": { + "Text": "Exited bot because of an error\n" + }, + "Identifier": "8f73f57f-dc98-4450-9b02-bc64ea0dffd2", + "Type": "MessageParticipant", + "Transitions": { + "NextAction": "ea48a6b5-f192-488e-b19b-db31b9af3d81", + "Errors": [ + { + "NextAction": "ea48a6b5-f192-488e-b19b-db31b9af3d81", + "ErrorType": "NoMatchingError" + } + ] + } + }, + { + "Parameters": { + "Text": "Hi there! I can help you set up a reminder for your appointment. Would you prefer us to call you, or to get an email?", + "LexV2Bot": { + "AliasArn": "BOT_ALIAS_ARN_HERE" + }, + "LexTimeoutSeconds": { + "Text": "120" + } + }, + "Identifier": "8aa6727f-83a4-4ab9-b2f0-7717fca0577a", + "Type": "ConnectParticipantWithLexBot", + "Transitions": { + "NextAction": "8f73f57f-dc98-4450-9b02-bc64ea0dffd2", + "Conditions": [ + { + "NextAction": "11143221-8170-45d9-b5e7-933716eecdea", + "Condition": { + "Operator": "Equals", + "Operands": [ + "FallbackIntent" + ] + } + }, + { + "NextAction": "a91aefae-1cd6-4c48-a058-217a35380d03", + "Condition": { + "Operator": "Equals", + "Operands": [ + "CallIntent" + ] + } + }, + { + "NextAction": "73dbc0b9-3f89-4638-9774-042f44984cd7", + "Condition": { + "Operator": "Equals", + "Operands": [ + "EmailIntent" + ] + } + } + ], + "Errors": [ + { + "NextAction": "07b13e07-39d4-4e63-bda8-bce7fe9abc2e", + "ErrorType": "InputTimeLimitExceeded" + }, + { + "NextAction": "ea48a6b5-f192-488e-b19b-db31b9af3d81", + "ErrorType": "NoMatchingCondition" + }, + { + "NextAction": "8f73f57f-dc98-4450-9b02-bc64ea0dffd2", + "ErrorType": "NoMatchingError" + } + ] + } + } + ] +} \ No newline at end of file diff --git a/projects/AmazonLexv2LambdaIntegrationExamples/package-lock.json b/projects/AmazonLexv2LambdaIntegrationExamples/package-lock.json new file mode 100644 index 0000000..472adbc --- /dev/null +++ b/projects/AmazonLexv2LambdaIntegrationExamples/package-lock.json @@ -0,0 +1,3679 @@ +{ + "name": "amazon-lex-v2-lambda-integration-examples", + "version": "1.0.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "amazon-lex-v2-lambda-integration-examples", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "moment": "^2.29.4" + }, + "devDependencies": { + "@aws-sdk/client-kendra": "^3.316.0", + "@aws-sdk/client-lex-runtime-v2": "^3.316.0", + "@types/node": "^18.15.12", + "aws-cdk-lib": "^2.76.0", + "cdk-nag": "^2.26.12", + "esbuild": "^0.17.17", + "typescript": "^4.9.5" + } + }, + "node_modules/@aws-cdk/asset-awscli-v1": { + "version": "2.2.145", + "resolved": "https://registry.npmjs.org/@aws-cdk/asset-awscli-v1/-/asset-awscli-v1-2.2.145.tgz", + "integrity": "sha512-hcKds6DWRm+xcrI4u5bUBvM7aupF5aGCBPAAuATJpp+w0Zp63TkANDPOCKB4bA79QLzvoQ3YYWnGCysmdaW57Q==", + "dev": true + }, + "node_modules/@aws-cdk/asset-kubectl-v20": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@aws-cdk/asset-kubectl-v20/-/asset-kubectl-v20-2.1.1.tgz", + "integrity": "sha512-U1ntiX8XiMRRRH5J1IdC+1t5CE89015cwyt5U63Cpk0GnMlN5+h9WsWMlKlPXZR4rdq/m806JRlBMRpBUB2Dhw==", + "dev": true + }, + "node_modules/@aws-cdk/asset-node-proxy-agent-v5": { + "version": "2.0.120", + "resolved": "https://registry.npmjs.org/@aws-cdk/asset-node-proxy-agent-v5/-/asset-node-proxy-agent-v5-2.0.120.tgz", + "integrity": "sha512-b8KA43ltvgoj6ybQuuTs6VSoP0edq6ZHDQsBbxw0wsNFMC/5VpmnbnfBrhjMLXbcJH6nwZJhMtBCWFswpPKDAw==", + "dev": true + }, + "node_modules/@aws-crypto/crc32": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-3.0.0.tgz", + "integrity": "sha512-IzSgsrxUcsrejQbPVilIKy16kAT52EwB6zSaI+M3xxIhKh5+aldEyvI+z6erM7TCLB2BJsFrtHjp6/4/sr+3dA==", + "dev": true, + "dependencies": { + "@aws-crypto/util": "^3.0.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/crc32/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/@aws-crypto/ie11-detection": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/ie11-detection/-/ie11-detection-3.0.0.tgz", + "integrity": "sha512-341lBBkiY1DfDNKai/wXM3aujNBkXR7tq1URPQDL9wi3AUbI80NR74uF1TXHMm7po1AcnFk8iu2S2IeU/+/A+Q==", + "dev": true, + "dependencies": { + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/ie11-detection/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/@aws-crypto/sha256-browser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-3.0.0.tgz", + "integrity": "sha512-8VLmW2B+gjFbU5uMeqtQM6Nj0/F1bro80xQXCW6CQBWgosFWXTx77aeOF5CAIAmbOK64SdMBJdNr6J41yP5mvQ==", + "dev": true, + "dependencies": { + "@aws-crypto/ie11-detection": "^3.0.0", + "@aws-crypto/sha256-js": "^3.0.0", + "@aws-crypto/supports-web-crypto": "^3.0.0", + "@aws-crypto/util": "^3.0.0", + "@aws-sdk/types": "^3.222.0", + "@aws-sdk/util-locate-window": "^3.0.0", + "@aws-sdk/util-utf8-browser": "^3.0.0", + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/sha256-browser/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/@aws-crypto/sha256-js": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-3.0.0.tgz", + "integrity": "sha512-PnNN7os0+yd1XvXAy23CFOmTbMaDxgxXtTKHybrJ39Y8kGzBATgBFibWJKH6BhytLI/Zyszs87xCOBNyBig6vQ==", + "dev": true, + "dependencies": { + "@aws-crypto/util": "^3.0.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/sha256-js/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/@aws-crypto/supports-web-crypto": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-3.0.0.tgz", + "integrity": "sha512-06hBdMwUAb2WFTuGG73LSC0wfPu93xWwo5vL2et9eymgmu3Id5vFAHBbajVWiGhPO37qcsdCap/FqXvJGJWPIg==", + "dev": true, + "dependencies": { + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/supports-web-crypto/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/@aws-crypto/util": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-3.0.0.tgz", + "integrity": "sha512-2OJlpeJpCR48CC8r+uKVChzs9Iungj9wkZrl8Z041DWEWvyIHILYKCPNzJghKsivj+S3mLo6BVc7mBNzdxA46w==", + "dev": true, + "dependencies": { + "@aws-sdk/types": "^3.222.0", + "@aws-sdk/util-utf8-browser": "^3.0.0", + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/util/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/@aws-sdk/abort-controller": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/abort-controller/-/abort-controller-3.310.0.tgz", + "integrity": "sha512-v1zrRQxDLA1MdPim159Vx/CPHqsB4uybSxRi1CnfHO5ZjHryx3a5htW2gdGAykVCul40+yJXvfpufMrELVxH+g==", + "dev": true, + "dependencies": { + "@aws-sdk/types": "3.310.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-kendra": { + "version": "3.316.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-kendra/-/client-kendra-3.316.0.tgz", + "integrity": "sha512-prXImj5XS+m4OalE+KU7hd47DWh6Gr0oSe/8xtRH2UrHlczwsnpZb7JZhx4Wydy+v+YwN3ujCbzUwhOO0ELkFQ==", + "dev": true, + "dependencies": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/client-sts": "3.316.0", + "@aws-sdk/config-resolver": "3.310.0", + "@aws-sdk/credential-provider-node": "3.316.0", + "@aws-sdk/fetch-http-handler": "3.310.0", + "@aws-sdk/hash-node": "3.310.0", + "@aws-sdk/invalid-dependency": "3.310.0", + "@aws-sdk/middleware-content-length": "3.310.0", + "@aws-sdk/middleware-endpoint": "3.310.0", + "@aws-sdk/middleware-host-header": "3.310.0", + "@aws-sdk/middleware-logger": "3.310.0", + "@aws-sdk/middleware-recursion-detection": "3.310.0", + "@aws-sdk/middleware-retry": "3.310.0", + "@aws-sdk/middleware-serde": "3.310.0", + "@aws-sdk/middleware-signing": "3.310.0", + "@aws-sdk/middleware-stack": "3.310.0", + "@aws-sdk/middleware-user-agent": "3.310.0", + "@aws-sdk/node-config-provider": "3.310.0", + "@aws-sdk/node-http-handler": "3.310.0", + "@aws-sdk/protocol-http": "3.310.0", + "@aws-sdk/smithy-client": "3.316.0", + "@aws-sdk/types": "3.310.0", + "@aws-sdk/url-parser": "3.310.0", + "@aws-sdk/util-base64": "3.310.0", + "@aws-sdk/util-body-length-browser": "3.310.0", + "@aws-sdk/util-body-length-node": "3.310.0", + "@aws-sdk/util-defaults-mode-browser": "3.316.0", + "@aws-sdk/util-defaults-mode-node": "3.316.0", + "@aws-sdk/util-endpoints": "3.310.0", + "@aws-sdk/util-retry": "3.310.0", + "@aws-sdk/util-user-agent-browser": "3.310.0", + "@aws-sdk/util-user-agent-node": "3.310.0", + "@aws-sdk/util-utf8": "3.310.0", + "tslib": "^2.5.0", + "uuid": "^8.3.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-lex-runtime-v2": { + "version": "3.316.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-lex-runtime-v2/-/client-lex-runtime-v2-3.316.0.tgz", + "integrity": "sha512-csaMmn/h6Z6QpDwKOnZpwEE7d2XXV50C5UZyGLSWcp2Sn7LmBHJsS7A+jSFC1MoKcAcK6waLXyDsFud7P9WZIA==", + "dev": true, + "dependencies": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/client-sts": "3.316.0", + "@aws-sdk/config-resolver": "3.310.0", + "@aws-sdk/credential-provider-node": "3.316.0", + "@aws-sdk/eventstream-handler-node": "3.310.0", + "@aws-sdk/eventstream-serde-browser": "3.310.0", + "@aws-sdk/eventstream-serde-config-resolver": "3.310.0", + "@aws-sdk/eventstream-serde-node": "3.310.0", + "@aws-sdk/fetch-http-handler": "3.310.0", + "@aws-sdk/hash-node": "3.310.0", + "@aws-sdk/invalid-dependency": "3.310.0", + "@aws-sdk/middleware-content-length": "3.310.0", + "@aws-sdk/middleware-endpoint": "3.310.0", + "@aws-sdk/middleware-eventstream": "3.310.0", + "@aws-sdk/middleware-host-header": "3.310.0", + "@aws-sdk/middleware-logger": "3.310.0", + "@aws-sdk/middleware-recursion-detection": "3.310.0", + "@aws-sdk/middleware-retry": "3.310.0", + "@aws-sdk/middleware-serde": "3.310.0", + "@aws-sdk/middleware-signing": "3.310.0", + "@aws-sdk/middleware-stack": "3.310.0", + "@aws-sdk/middleware-user-agent": "3.310.0", + "@aws-sdk/node-config-provider": "3.310.0", + "@aws-sdk/node-http-handler": "3.310.0", + "@aws-sdk/protocol-http": "3.310.0", + "@aws-sdk/smithy-client": "3.316.0", + "@aws-sdk/types": "3.310.0", + "@aws-sdk/url-parser": "3.310.0", + "@aws-sdk/util-base64": "3.310.0", + "@aws-sdk/util-body-length-browser": "3.310.0", + "@aws-sdk/util-body-length-node": "3.310.0", + "@aws-sdk/util-defaults-mode-browser": "3.316.0", + "@aws-sdk/util-defaults-mode-node": "3.316.0", + "@aws-sdk/util-endpoints": "3.310.0", + "@aws-sdk/util-retry": "3.310.0", + "@aws-sdk/util-stream-browser": "3.310.0", + "@aws-sdk/util-stream-node": "3.310.0", + "@aws-sdk/util-user-agent-browser": "3.310.0", + "@aws-sdk/util-user-agent-node": "3.310.0", + "@aws-sdk/util-utf8": "3.310.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sso": { + "version": "3.316.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.316.0.tgz", + "integrity": "sha512-wGXfIhR0lJGB8QTT0fwSwwklHePHxd2GW3IQt3trXnEYe0frmJ7vYRnVL5CSRKsikLDmaU7ll3SdsshMzQzo3w==", + "dev": true, + "dependencies": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/config-resolver": "3.310.0", + "@aws-sdk/fetch-http-handler": "3.310.0", + "@aws-sdk/hash-node": "3.310.0", + "@aws-sdk/invalid-dependency": "3.310.0", + "@aws-sdk/middleware-content-length": "3.310.0", + "@aws-sdk/middleware-endpoint": "3.310.0", + "@aws-sdk/middleware-host-header": "3.310.0", + "@aws-sdk/middleware-logger": "3.310.0", + "@aws-sdk/middleware-recursion-detection": "3.310.0", + "@aws-sdk/middleware-retry": "3.310.0", + "@aws-sdk/middleware-serde": "3.310.0", + "@aws-sdk/middleware-stack": "3.310.0", + "@aws-sdk/middleware-user-agent": "3.310.0", + "@aws-sdk/node-config-provider": "3.310.0", + "@aws-sdk/node-http-handler": "3.310.0", + "@aws-sdk/protocol-http": "3.310.0", + "@aws-sdk/smithy-client": "3.316.0", + "@aws-sdk/types": "3.310.0", + "@aws-sdk/url-parser": "3.310.0", + "@aws-sdk/util-base64": "3.310.0", + "@aws-sdk/util-body-length-browser": "3.310.0", + "@aws-sdk/util-body-length-node": "3.310.0", + "@aws-sdk/util-defaults-mode-browser": "3.316.0", + "@aws-sdk/util-defaults-mode-node": "3.316.0", + "@aws-sdk/util-endpoints": "3.310.0", + "@aws-sdk/util-retry": "3.310.0", + "@aws-sdk/util-user-agent-browser": "3.310.0", + "@aws-sdk/util-user-agent-node": "3.310.0", + "@aws-sdk/util-utf8": "3.310.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sso-oidc": { + "version": "3.316.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.316.0.tgz", + "integrity": "sha512-e2fvC7o42YV+LcZYfXCcvBn4L7NM9oNccnZ7T+pS6SFpHZlaqkw4uuQMRE6iUAof+Id7Mt7xDrz1x2yGlP+8GA==", + "dev": true, + "dependencies": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/config-resolver": "3.310.0", + "@aws-sdk/fetch-http-handler": "3.310.0", + "@aws-sdk/hash-node": "3.310.0", + "@aws-sdk/invalid-dependency": "3.310.0", + "@aws-sdk/middleware-content-length": "3.310.0", + "@aws-sdk/middleware-endpoint": "3.310.0", + "@aws-sdk/middleware-host-header": "3.310.0", + "@aws-sdk/middleware-logger": "3.310.0", + "@aws-sdk/middleware-recursion-detection": "3.310.0", + "@aws-sdk/middleware-retry": "3.310.0", + "@aws-sdk/middleware-serde": "3.310.0", + "@aws-sdk/middleware-stack": "3.310.0", + "@aws-sdk/middleware-user-agent": "3.310.0", + "@aws-sdk/node-config-provider": "3.310.0", + "@aws-sdk/node-http-handler": "3.310.0", + "@aws-sdk/protocol-http": "3.310.0", + "@aws-sdk/smithy-client": "3.316.0", + "@aws-sdk/types": "3.310.0", + "@aws-sdk/url-parser": "3.310.0", + "@aws-sdk/util-base64": "3.310.0", + "@aws-sdk/util-body-length-browser": "3.310.0", + "@aws-sdk/util-body-length-node": "3.310.0", + "@aws-sdk/util-defaults-mode-browser": "3.316.0", + "@aws-sdk/util-defaults-mode-node": "3.316.0", + "@aws-sdk/util-endpoints": "3.310.0", + "@aws-sdk/util-retry": "3.310.0", + "@aws-sdk/util-user-agent-browser": "3.310.0", + "@aws-sdk/util-user-agent-node": "3.310.0", + "@aws-sdk/util-utf8": "3.310.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sts": { + "version": "3.316.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.316.0.tgz", + "integrity": "sha512-5SD59+DRVy1mKckGs/5J8OwWpRS3E5v4BX19XaX/s9JJ5Rw9aZd9DP4SZVpeNXztIPjkQSEzHgrUVlZFB1QJgg==", + "dev": true, + "dependencies": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/config-resolver": "3.310.0", + "@aws-sdk/credential-provider-node": "3.316.0", + "@aws-sdk/fetch-http-handler": "3.310.0", + "@aws-sdk/hash-node": "3.310.0", + "@aws-sdk/invalid-dependency": "3.310.0", + "@aws-sdk/middleware-content-length": "3.310.0", + "@aws-sdk/middleware-endpoint": "3.310.0", + "@aws-sdk/middleware-host-header": "3.310.0", + "@aws-sdk/middleware-logger": "3.310.0", + "@aws-sdk/middleware-recursion-detection": "3.310.0", + "@aws-sdk/middleware-retry": "3.310.0", + "@aws-sdk/middleware-sdk-sts": "3.310.0", + "@aws-sdk/middleware-serde": "3.310.0", + "@aws-sdk/middleware-signing": "3.310.0", + "@aws-sdk/middleware-stack": "3.310.0", + "@aws-sdk/middleware-user-agent": "3.310.0", + "@aws-sdk/node-config-provider": "3.310.0", + "@aws-sdk/node-http-handler": "3.310.0", + "@aws-sdk/protocol-http": "3.310.0", + "@aws-sdk/smithy-client": "3.316.0", + "@aws-sdk/types": "3.310.0", + "@aws-sdk/url-parser": "3.310.0", + "@aws-sdk/util-base64": "3.310.0", + "@aws-sdk/util-body-length-browser": "3.310.0", + "@aws-sdk/util-body-length-node": "3.310.0", + "@aws-sdk/util-defaults-mode-browser": "3.316.0", + "@aws-sdk/util-defaults-mode-node": "3.316.0", + "@aws-sdk/util-endpoints": "3.310.0", + "@aws-sdk/util-retry": "3.310.0", + "@aws-sdk/util-user-agent-browser": "3.310.0", + "@aws-sdk/util-user-agent-node": "3.310.0", + "@aws-sdk/util-utf8": "3.310.0", + "fast-xml-parser": "4.1.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/config-resolver": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/config-resolver/-/config-resolver-3.310.0.tgz", + "integrity": "sha512-8vsT+/50lOqfDxka9m/rRt6oxv1WuGZoP8oPMk0Dt+TxXMbAzf4+rejBgiB96wshI1k3gLokYRjSQZn+dDtT8g==", + "dev": true, + "dependencies": { + "@aws-sdk/types": "3.310.0", + "@aws-sdk/util-config-provider": "3.310.0", + "@aws-sdk/util-middleware": "3.310.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-env": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.310.0.tgz", + "integrity": "sha512-vvIPQpI16fj95xwS7M3D48F7QhZJBnnCgB5lR+b7So+vsG9ibm1mZRVGzVpdxCvgyOhHFbvrby9aalNJmmIP1A==", + "dev": true, + "dependencies": { + "@aws-sdk/property-provider": "3.310.0", + "@aws-sdk/types": "3.310.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-imds": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-imds/-/credential-provider-imds-3.310.0.tgz", + "integrity": "sha512-baxK7Zp6dai5AGW01FIW27xS2KAaPUmKLIXv5SvFYsUgXXvNW55im4uG3b+2gA0F7V+hXvVBH08OEqmwW6we5w==", + "dev": true, + "dependencies": { + "@aws-sdk/node-config-provider": "3.310.0", + "@aws-sdk/property-provider": "3.310.0", + "@aws-sdk/types": "3.310.0", + "@aws-sdk/url-parser": "3.310.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-ini": { + "version": "3.316.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.316.0.tgz", + "integrity": "sha512-ZADkpdEjFCAXyzEpYbCRENlZ/AQEwevWdPd2yshjNo7xvOcepv4pPIBpYd8h9LvRafSLGA7zlWDz84hkIt+HKA==", + "dev": true, + "dependencies": { + "@aws-sdk/credential-provider-env": "3.310.0", + "@aws-sdk/credential-provider-imds": "3.310.0", + "@aws-sdk/credential-provider-process": "3.310.0", + "@aws-sdk/credential-provider-sso": "3.316.0", + "@aws-sdk/credential-provider-web-identity": "3.310.0", + "@aws-sdk/property-provider": "3.310.0", + "@aws-sdk/shared-ini-file-loader": "3.310.0", + "@aws-sdk/types": "3.310.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-node": { + "version": "3.316.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.316.0.tgz", + "integrity": "sha512-oE1LTXP8XZp4bT8LhBeolMRiz0RwnmHDC2XpUmWO8LTmbDNrQO0mVzxEvXDLeKaN5BIFIJqNFlMgjWUMa9Kwcw==", + "dev": true, + "dependencies": { + "@aws-sdk/credential-provider-env": "3.310.0", + "@aws-sdk/credential-provider-imds": "3.310.0", + "@aws-sdk/credential-provider-ini": "3.316.0", + "@aws-sdk/credential-provider-process": "3.310.0", + "@aws-sdk/credential-provider-sso": "3.316.0", + "@aws-sdk/credential-provider-web-identity": "3.310.0", + "@aws-sdk/property-provider": "3.310.0", + "@aws-sdk/shared-ini-file-loader": "3.310.0", + "@aws-sdk/types": "3.310.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-process": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.310.0.tgz", + "integrity": "sha512-h73sg6GPMUWC+3zMCbA1nZ2O03nNJt7G96JdmnantiXBwHpRKWW8nBTLzx5uhXn6hTuTaoQRP/P+oxQJKYdMmA==", + "dev": true, + "dependencies": { + "@aws-sdk/property-provider": "3.310.0", + "@aws-sdk/shared-ini-file-loader": "3.310.0", + "@aws-sdk/types": "3.310.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-sso": { + "version": "3.316.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.316.0.tgz", + "integrity": "sha512-8/O2twlsoV1bDkZ9jd7JCMWsftfyoTyRT1UYscsKZGUDEgZRAxRkzS3GLYuLXEWNuxb1OB9rYk/cEJoxwy7T9g==", + "dev": true, + "dependencies": { + "@aws-sdk/client-sso": "3.316.0", + "@aws-sdk/property-provider": "3.310.0", + "@aws-sdk/shared-ini-file-loader": "3.310.0", + "@aws-sdk/token-providers": "3.316.0", + "@aws-sdk/types": "3.310.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-web-identity": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.310.0.tgz", + "integrity": "sha512-H4SzuZXILNhK6/IR1uVvsUDZvzc051hem7GLyYghBCu8mU+tq28YhKE8MfSroi6eL2e5Vujloij1OM2EQQkPkw==", + "dev": true, + "dependencies": { + "@aws-sdk/property-provider": "3.310.0", + "@aws-sdk/types": "3.310.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/eventstream-codec": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-codec/-/eventstream-codec-3.310.0.tgz", + "integrity": "sha512-clIeSgWbZbxwtsxZ/yoedNM0/kJFSIjjHPikuDGhxhqc+vP6TN3oYyVMFrYwFaTFhk2+S5wZcWYMw8Op1pWo+A==", + "dev": true, + "dependencies": { + "@aws-crypto/crc32": "3.0.0", + "@aws-sdk/types": "3.310.0", + "@aws-sdk/util-hex-encoding": "3.310.0", + "tslib": "^2.5.0" + } + }, + "node_modules/@aws-sdk/eventstream-handler-node": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-handler-node/-/eventstream-handler-node-3.310.0.tgz", + "integrity": "sha512-mNwskuY4T+jdmVJNxrTyqw8XEeqHi2vFbzQ9DT9TwrjMBrIYZRuVyTGEyXu3aCofMxMhXxPEAH2wdTM+wBvxvg==", + "dev": true, + "dependencies": { + "@aws-sdk/eventstream-codec": "3.310.0", + "@aws-sdk/types": "3.310.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/eventstream-serde-browser": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-serde-browser/-/eventstream-serde-browser-3.310.0.tgz", + "integrity": "sha512-3S6ziuQVALgEyz0TANGtYDVeG8ArK4Y05mcgrs8qUTmsvlDIXX37cR/DvmVbNB76M4IrsZeSAIajL9644CywkA==", + "dev": true, + "dependencies": { + "@aws-sdk/eventstream-serde-universal": "3.310.0", + "@aws-sdk/types": "3.310.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/eventstream-serde-config-resolver": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-3.310.0.tgz", + "integrity": "sha512-8s1Qdn9STj+sV75nUp9yt0W6fHS4BZ2jTm4Z/1Pcbvh2Gqs0WjH5n2StS+pDW5Y9J/HSGBl0ogmUr5lC5bXFHg==", + "dev": true, + "dependencies": { + "@aws-sdk/types": "3.310.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/eventstream-serde-node": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-serde-node/-/eventstream-serde-node-3.310.0.tgz", + "integrity": "sha512-kSnRomCgW43K9TmQYuwN9+AoYPnhyOKroanUMyZEzJk7rpCPMj4OzaUpXfDYOvznFNYn7NLaH6nHLJAr0VPlJA==", + "dev": true, + "dependencies": { + "@aws-sdk/eventstream-serde-universal": "3.310.0", + "@aws-sdk/types": "3.310.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/eventstream-serde-universal": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-serde-universal/-/eventstream-serde-universal-3.310.0.tgz", + "integrity": "sha512-Qyjt5k/waV5cDukpgT824ISZAz5U0pwzLz5ztR409u85AGNkF/9n7MS+LSyBUBSb0WJ5pUeSD47WBk+nLq9Nhw==", + "dev": true, + "dependencies": { + "@aws-sdk/eventstream-codec": "3.310.0", + "@aws-sdk/types": "3.310.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/fetch-http-handler": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/fetch-http-handler/-/fetch-http-handler-3.310.0.tgz", + "integrity": "sha512-Bi9vIwzdkw1zMcvi/zGzlWS9KfIEnAq4NNhsnCxbQ4OoIRU9wvU+WGZdBBhxg0ZxZmpp1j1aZhU53lLjA07MHw==", + "dev": true, + "dependencies": { + "@aws-sdk/protocol-http": "3.310.0", + "@aws-sdk/querystring-builder": "3.310.0", + "@aws-sdk/types": "3.310.0", + "@aws-sdk/util-base64": "3.310.0", + "tslib": "^2.5.0" + } + }, + "node_modules/@aws-sdk/hash-node": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/hash-node/-/hash-node-3.310.0.tgz", + "integrity": "sha512-NvE2fhRc8GRwCXBfDehxVAWCmVwVMILliAKVPAEr4yz2CkYs0tqU51S48x23dtna07H4qHtgpeNqVTthcIQOEQ==", + "dev": true, + "dependencies": { + "@aws-sdk/types": "3.310.0", + "@aws-sdk/util-buffer-from": "3.310.0", + "@aws-sdk/util-utf8": "3.310.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/invalid-dependency": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/invalid-dependency/-/invalid-dependency-3.310.0.tgz", + "integrity": "sha512-1s5RG5rSPXoa/aZ/Kqr5U/7lqpx+Ry81GprQ2bxWqJvWQIJ0IRUwo5pk8XFxbKVr/2a+4lZT/c3OGoBOM1yRRA==", + "dev": true, + "dependencies": { + "@aws-sdk/types": "3.310.0", + "tslib": "^2.5.0" + } + }, + "node_modules/@aws-sdk/is-array-buffer": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/is-array-buffer/-/is-array-buffer-3.310.0.tgz", + "integrity": "sha512-urnbcCR+h9NWUnmOtet/s4ghvzsidFmspfhYaHAmSRdy9yDjdjBJMFjjsn85A1ODUktztm+cVncXjQ38WCMjMQ==", + "dev": true, + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-content-length": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-content-length/-/middleware-content-length-3.310.0.tgz", + "integrity": "sha512-P8tQZxgDt6CAh1wd/W6WPzjc+uWPJwQkm+F7rAwRlM+k9q17HrhnksGDKcpuuLyIhPQYdmOMIkpKVgXGa4avhQ==", + "dev": true, + "dependencies": { + "@aws-sdk/protocol-http": "3.310.0", + "@aws-sdk/types": "3.310.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-endpoint": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-endpoint/-/middleware-endpoint-3.310.0.tgz", + "integrity": "sha512-Z+N2vOL8K354/lstkClxLLsr6hCpVRh+0tCMXrVj66/NtKysCEZ/0b9LmqOwD9pWHNiI2mJqXwY0gxNlKAroUg==", + "dev": true, + "dependencies": { + "@aws-sdk/middleware-serde": "3.310.0", + "@aws-sdk/types": "3.310.0", + "@aws-sdk/url-parser": "3.310.0", + "@aws-sdk/util-middleware": "3.310.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-eventstream": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-eventstream/-/middleware-eventstream-3.310.0.tgz", + "integrity": "sha512-ukUoZSKDrZlZh/6qjcrZcFfg5qckuifuLepgIRTC14BCbswLSYuareceRPooOxnB+gVmApHtLZ9gvm8Nz74Ilw==", + "dev": true, + "dependencies": { + "@aws-sdk/protocol-http": "3.310.0", + "@aws-sdk/types": "3.310.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-host-header": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.310.0.tgz", + "integrity": "sha512-QWSA+46/hXorXyWa61ic2K7qZzwHTiwfk2e9mRRjeIRepUgI3qxFjsYqrWtrOGBjmFmq0pYIY8Bb/DCJuQqcoA==", + "dev": true, + "dependencies": { + "@aws-sdk/protocol-http": "3.310.0", + "@aws-sdk/types": "3.310.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-logger": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.310.0.tgz", + "integrity": "sha512-Lurm8XofrASBRnAVtiSNuDSRsRqPNg27RIFLLsLp/pqog9nFJ0vz0kgdb9S5Z+zw83Mm+UlqOe6D8NTUNp4fVg==", + "dev": true, + "dependencies": { + "@aws-sdk/types": "3.310.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-recursion-detection": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.310.0.tgz", + "integrity": "sha512-SuB75/xk/gyue24gkriTwO2jFd7YcUGZDClQYuRejgbXSa3CO0lWyawQtfLcSSEBp9izrEVXuFH24K1eAft5nQ==", + "dev": true, + "dependencies": { + "@aws-sdk/protocol-http": "3.310.0", + "@aws-sdk/types": "3.310.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-retry": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-retry/-/middleware-retry-3.310.0.tgz", + "integrity": "sha512-oTPsRy2W4s+dfxbJPW7Km+hHtv/OMsNsVfThAq8DDYKC13qlr1aAyOqGLD+dpBy2aKe7ss517Sy2HcHtHqm7/g==", + "dev": true, + "dependencies": { + "@aws-sdk/protocol-http": "3.310.0", + "@aws-sdk/service-error-classification": "3.310.0", + "@aws-sdk/types": "3.310.0", + "@aws-sdk/util-middleware": "3.310.0", + "@aws-sdk/util-retry": "3.310.0", + "tslib": "^2.5.0", + "uuid": "^8.3.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-sdk-sts": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.310.0.tgz", + "integrity": "sha512-+5PFwlYNLvLLIfw0ASAoWV/iIF8Zv6R6QGtyP0CclhRSvNjgbQDVnV0g95MC5qvh+GB/Yjlkt8qAjLSPjHfsrQ==", + "dev": true, + "dependencies": { + "@aws-sdk/middleware-signing": "3.310.0", + "@aws-sdk/types": "3.310.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-serde": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-serde/-/middleware-serde-3.310.0.tgz", + "integrity": "sha512-RNeeTVWSLTaentUeCgQKZhAl+C6hxtwD78cQWS10UymWpQFwbaxztzKUu4UQS5xA2j6PxwPRRUjqa4jcFjfLsg==", + "dev": true, + "dependencies": { + "@aws-sdk/types": "3.310.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-signing": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.310.0.tgz", + "integrity": "sha512-f9mKq+XMdW207Af3hKjdTnpNhdtwqWuvFs/ZyXoOkp/g1MY1O6L23Jy6i52m29LxbT4AuNRG1oKODfXM0vYVjQ==", + "dev": true, + "dependencies": { + "@aws-sdk/property-provider": "3.310.0", + "@aws-sdk/protocol-http": "3.310.0", + "@aws-sdk/signature-v4": "3.310.0", + "@aws-sdk/types": "3.310.0", + "@aws-sdk/util-middleware": "3.310.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-stack": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-stack/-/middleware-stack-3.310.0.tgz", + "integrity": "sha512-010O1PD+UAcZVKRvqEusE1KJqN96wwrf6QsqbRM0ywsKQ21NDweaHvEDlds2VHpgmofxkRLRu/IDrlPkKRQrRg==", + "dev": true, + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.310.0.tgz", + "integrity": "sha512-x3IOwSwSbwKidlxRk3CNVHVUb06SRuaELxggCaR++QVI8NU6qD/l4VHXKVRvbTHiC/cYxXE/GaBDgQVpDR7V/g==", + "dev": true, + "dependencies": { + "@aws-sdk/protocol-http": "3.310.0", + "@aws-sdk/types": "3.310.0", + "@aws-sdk/util-endpoints": "3.310.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/node-config-provider": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/node-config-provider/-/node-config-provider-3.310.0.tgz", + "integrity": "sha512-T/Pp6htc6hq/Cq+MLNDSyiwWCMVF6GqbBbXKVlO5L8rdHx4sq9xPdoPveZhGWrxvkanjA6eCwUp6E0riBOSVng==", + "dev": true, + "dependencies": { + "@aws-sdk/property-provider": "3.310.0", + "@aws-sdk/shared-ini-file-loader": "3.310.0", + "@aws-sdk/types": "3.310.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/node-http-handler": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/node-http-handler/-/node-http-handler-3.310.0.tgz", + "integrity": "sha512-irv9mbcM9xC2xYjArQF5SYmHBMu4ciMWtGsoHII1nRuFOl9FoT4ffTvEPuLlfC6pznzvKt9zvnm6xXj7gDChKg==", + "dev": true, + "dependencies": { + "@aws-sdk/abort-controller": "3.310.0", + "@aws-sdk/protocol-http": "3.310.0", + "@aws-sdk/querystring-builder": "3.310.0", + "@aws-sdk/types": "3.310.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/property-provider": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/property-provider/-/property-provider-3.310.0.tgz", + "integrity": "sha512-3lxDb0akV6BBzmFe4nLPaoliQbAifyWJhuvuDOu7e8NzouvpQXs0275w9LePhhcgjKAEVXUIse05ZW2DLbxo/g==", + "dev": true, + "dependencies": { + "@aws-sdk/types": "3.310.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/protocol-http": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/protocol-http/-/protocol-http-3.310.0.tgz", + "integrity": "sha512-fgZ1aw/irQtnrsR58pS8ThKOWo57Py3xX6giRvwSgZDEcxHfVzuQjy9yPuV++v04fdmdtgpbGf8WfvAAJ11yXQ==", + "dev": true, + "dependencies": { + "@aws-sdk/types": "3.310.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/querystring-builder": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-builder/-/querystring-builder-3.310.0.tgz", + "integrity": "sha512-ZHH8GV/80+pWGo7DzsvwvXR5xVxUHXUvPJPFAkhr6nCf78igdoF8gR10ScFoEKbtEapoNTaZlKHPXxpD8aPG7A==", + "dev": true, + "dependencies": { + "@aws-sdk/types": "3.310.0", + "@aws-sdk/util-uri-escape": "3.310.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/querystring-parser": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-parser/-/querystring-parser-3.310.0.tgz", + "integrity": "sha512-YkIznoP6lsiIUHinx++/lbb3tlMURGGqMpo0Pnn32zYzGrJXA6eC3D0as2EcMjo55onTfuLcIiX4qzXes2MYOA==", + "dev": true, + "dependencies": { + "@aws-sdk/types": "3.310.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/service-error-classification": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/service-error-classification/-/service-error-classification-3.310.0.tgz", + "integrity": "sha512-PuyC7k3qfIKeH2LCnDwbttMOKq3qAx4buvg0yfnJtQOz6t1AR8gsnAq0CjKXXyfkXwNKWTqCpE6lVNUIkXgsMw==", + "dev": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/shared-ini-file-loader": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/shared-ini-file-loader/-/shared-ini-file-loader-3.310.0.tgz", + "integrity": "sha512-N0q9pG0xSjQwc690YQND5bofm+4nfUviQ/Ppgan2kU6aU0WUq8KwgHJBto/YEEI+VlrME30jZJnxtOvcZJc2XA==", + "dev": true, + "dependencies": { + "@aws-sdk/types": "3.310.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/signature-v4": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4/-/signature-v4-3.310.0.tgz", + "integrity": "sha512-1M60P1ZBNAjCFv9sYW29OF6okktaeibWyW3lMXqzoHF70lHBZh+838iUchznXUA5FLabfn4jBFWMRxlAXJUY2Q==", + "dev": true, + "dependencies": { + "@aws-sdk/is-array-buffer": "3.310.0", + "@aws-sdk/types": "3.310.0", + "@aws-sdk/util-hex-encoding": "3.310.0", + "@aws-sdk/util-middleware": "3.310.0", + "@aws-sdk/util-uri-escape": "3.310.0", + "@aws-sdk/util-utf8": "3.310.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/smithy-client": { + "version": "3.316.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/smithy-client/-/smithy-client-3.316.0.tgz", + "integrity": "sha512-6YXOKbRnXeS8r8RWzuL6JMBolDYM5Wa4fD/VY6x/wK78i2xErHOvqzHgyyeLI1MMw4uqyd4wRNJNWC9TMPduXw==", + "dev": true, + "dependencies": { + "@aws-sdk/middleware-stack": "3.310.0", + "@aws-sdk/types": "3.310.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/token-providers": { + "version": "3.316.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.316.0.tgz", + "integrity": "sha512-foJ2YmB8A/mtp52riO2zdmBgzA3IpASNgUhY9FZg1BKpGcjqLQDGYP+BY3BA0H7CFsMa4PCf13M5wWwn1onyBA==", + "dev": true, + "dependencies": { + "@aws-sdk/client-sso-oidc": "3.316.0", + "@aws-sdk/property-provider": "3.310.0", + "@aws-sdk/shared-ini-file-loader": "3.310.0", + "@aws-sdk/types": "3.310.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/types": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.310.0.tgz", + "integrity": "sha512-j8eamQJ7YcIhw7fneUfs8LYl3t01k4uHi4ZDmNRgtbmbmTTG3FZc2MotStZnp3nZB6vLiPF1o5aoJxWVvkzS6A==", + "dev": true, + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/url-parser": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/url-parser/-/url-parser-3.310.0.tgz", + "integrity": "sha512-mCLnCaSB9rQvAgx33u0DujLvr4d5yEm/W5r789GblwwQnlNXedVu50QRizMLTpltYWyAUoXjJgQnJHmJMaKXhw==", + "dev": true, + "dependencies": { + "@aws-sdk/querystring-parser": "3.310.0", + "@aws-sdk/types": "3.310.0", + "tslib": "^2.5.0" + } + }, + "node_modules/@aws-sdk/util-base64": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-base64/-/util-base64-3.310.0.tgz", + "integrity": "sha512-v3+HBKQvqgdzcbL+pFswlx5HQsd9L6ZTlyPVL2LS9nNXnCcR3XgGz9jRskikRUuUvUXtkSG1J88GAOnJ/apTPg==", + "dev": true, + "dependencies": { + "@aws-sdk/util-buffer-from": "3.310.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/util-body-length-browser": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-browser/-/util-body-length-browser-3.310.0.tgz", + "integrity": "sha512-sxsC3lPBGfpHtNTUoGXMQXLwjmR0zVpx0rSvzTPAuoVILVsp5AU/w5FphNPxD5OVIjNbZv9KsKTuvNTiZjDp9g==", + "dev": true, + "dependencies": { + "tslib": "^2.5.0" + } + }, + "node_modules/@aws-sdk/util-body-length-node": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-node/-/util-body-length-node-3.310.0.tgz", + "integrity": "sha512-2tqGXdyKhyA6w4zz7UPoS8Ip+7sayOg9BwHNidiGm2ikbDxm1YrCfYXvCBdwaJxa4hJfRVz+aL9e+d3GqPI9pQ==", + "dev": true, + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/util-buffer-from": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-buffer-from/-/util-buffer-from-3.310.0.tgz", + "integrity": "sha512-i6LVeXFtGih5Zs8enLrt+ExXY92QV25jtEnTKHsmlFqFAuL3VBeod6boeMXkN2p9lbSVVQ1sAOOYZOHYbYkntw==", + "dev": true, + "dependencies": { + "@aws-sdk/is-array-buffer": "3.310.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/util-config-provider": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-config-provider/-/util-config-provider-3.310.0.tgz", + "integrity": "sha512-xIBaYo8dwiojCw8vnUcIL4Z5tyfb1v3yjqyJKJWV/dqKUFOOS0U591plmXbM+M/QkXyML3ypon1f8+BoaDExrg==", + "dev": true, + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/util-defaults-mode-browser": { + "version": "3.316.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-browser/-/util-defaults-mode-browser-3.316.0.tgz", + "integrity": "sha512-6FSqLhYmaihtH2n1s4b2rlLW0ABU8N6VZIfzLfe2ING4PF0MzfaMMhnTFUHVXfKCVGoR8yP6iyFTRCyHGVEL1w==", + "dev": true, + "dependencies": { + "@aws-sdk/property-provider": "3.310.0", + "@aws-sdk/types": "3.310.0", + "bowser": "^2.11.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@aws-sdk/util-defaults-mode-node": { + "version": "3.316.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-node/-/util-defaults-mode-node-3.316.0.tgz", + "integrity": "sha512-dkYy10hdjPSScXXvnjGpZpnJxllkb6ICHgLMwZ4JczLHhPM12T/4PQ758YN8HS+muiYDGX1Bl2z1jd/bMcewBQ==", + "dev": true, + "dependencies": { + "@aws-sdk/config-resolver": "3.310.0", + "@aws-sdk/credential-provider-imds": "3.310.0", + "@aws-sdk/node-config-provider": "3.310.0", + "@aws-sdk/property-provider": "3.310.0", + "@aws-sdk/types": "3.310.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@aws-sdk/util-endpoints": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.310.0.tgz", + "integrity": "sha512-zG+/d/O5KPmAaeOMPd6bW1abifdT0H03f42keLjYEoRZzYtHPC5DuPE0UayiWGckI6BCDgy0sRKXCYS49UNFaQ==", + "dev": true, + "dependencies": { + "@aws-sdk/types": "3.310.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/util-hex-encoding": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-hex-encoding/-/util-hex-encoding-3.310.0.tgz", + "integrity": "sha512-sVN7mcCCDSJ67pI1ZMtk84SKGqyix6/0A1Ab163YKn+lFBQRMKexleZzpYzNGxYzmQS6VanP/cfU7NiLQOaSfA==", + "dev": true, + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/util-locate-window": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.310.0.tgz", + "integrity": "sha512-qo2t/vBTnoXpjKxlsC2e1gBrRm80M3bId27r0BRB2VniSSe7bL1mmzM+/HFtujm0iAxtPM+aLEflLJlJeDPg0w==", + "dev": true, + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/util-middleware": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-middleware/-/util-middleware-3.310.0.tgz", + "integrity": "sha512-FTSUKL/eRb9X6uEZClrTe27QFXUNNp7fxYrPndZwk1hlaOP5ix+MIHBcI7pIiiY/JPfOUmPyZOu+HetlFXjWog==", + "dev": true, + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/util-retry": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-retry/-/util-retry-3.310.0.tgz", + "integrity": "sha512-FwWGhCBLfoivTMUHu1LIn4NjrN9JLJ/aX5aZmbcPIOhZVFJj638j0qDgZXyfvVqBuBZh7M8kGq0Oahy3dp69OA==", + "dev": true, + "dependencies": { + "@aws-sdk/service-error-classification": "3.310.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@aws-sdk/util-stream-browser": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-stream-browser/-/util-stream-browser-3.310.0.tgz", + "integrity": "sha512-bysXZHwFwvbqOTCScCdCnoLk1K3GCo0HRIYEZuL7O7MHrQmfaYRXcaft/p22+GUv9VeFXS/eJJZ5r4u32az94w==", + "dev": true, + "dependencies": { + "@aws-sdk/fetch-http-handler": "3.310.0", + "@aws-sdk/types": "3.310.0", + "@aws-sdk/util-base64": "3.310.0", + "@aws-sdk/util-hex-encoding": "3.310.0", + "@aws-sdk/util-utf8": "3.310.0", + "tslib": "^2.5.0" + } + }, + "node_modules/@aws-sdk/util-stream-node": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-stream-node/-/util-stream-node-3.310.0.tgz", + "integrity": "sha512-hueAXFK0GVvnfYFgqbF7587xZfMZff5jlIFZOHqx7XVU7bl7qrRUCnphHk8H6yZ7RoQbDPcfmHJgtEoAJg1T1Q==", + "dev": true, + "dependencies": { + "@aws-sdk/node-http-handler": "3.310.0", + "@aws-sdk/types": "3.310.0", + "@aws-sdk/util-buffer-from": "3.310.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/util-uri-escape": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-uri-escape/-/util-uri-escape-3.310.0.tgz", + "integrity": "sha512-drzt+aB2qo2LgtDoiy/3sVG8w63cgLkqFIa2NFlGpUgHFWTXkqtbgf4L5QdjRGKWhmZsnqkbtL7vkSWEcYDJ4Q==", + "dev": true, + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/util-user-agent-browser": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.310.0.tgz", + "integrity": "sha512-yU/4QnHHuQ5z3vsUqMQVfYLbZGYwpYblPiuZx4Zo9+x0PBkNjYMqctdDcrpoH9Z2xZiDN16AmQGK1tix117ZKw==", + "dev": true, + "dependencies": { + "@aws-sdk/types": "3.310.0", + "bowser": "^2.11.0", + "tslib": "^2.5.0" + } + }, + "node_modules/@aws-sdk/util-user-agent-node": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.310.0.tgz", + "integrity": "sha512-Ra3pEl+Gn2BpeE7KiDGpi4zj7WJXZA5GXnGo3mjbi9+Y3zrbuhJAbdZO3mO/o7xDgMC6ph4xCTbaSGzU6b6EDg==", + "dev": true, + "dependencies": { + "@aws-sdk/node-config-provider": "3.310.0", + "@aws-sdk/types": "3.310.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "aws-crt": ">=1.0.0" + }, + "peerDependenciesMeta": { + "aws-crt": { + "optional": true + } + } + }, + "node_modules/@aws-sdk/util-utf8": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8/-/util-utf8-3.310.0.tgz", + "integrity": "sha512-DnLfFT8uCO22uOJc0pt0DsSNau1GTisngBCDw8jQuWT5CqogMJu4b/uXmwEqfj8B3GX6Xsz8zOd6JpRlPftQoA==", + "dev": true, + "dependencies": { + "@aws-sdk/util-buffer-from": "3.310.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/util-utf8-browser": { + "version": "3.259.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.259.0.tgz", + "integrity": "sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw==", + "dev": true, + "dependencies": { + "tslib": "^2.3.1" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.17.17", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.17.tgz", + "integrity": "sha512-E6VAZwN7diCa3labs0GYvhEPL2M94WLF8A+czO8hfjREXxba8Ng7nM5VxV+9ihNXIY1iQO1XxUU4P7hbqbICxg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.17.17", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.17.tgz", + "integrity": "sha512-jaJ5IlmaDLFPNttv0ofcwy/cfeY4bh/n705Tgh+eLObbGtQBK3EPAu+CzL95JVE4nFAliyrnEu0d32Q5foavqg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.17.17", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.17.tgz", + "integrity": "sha512-446zpfJ3nioMC7ASvJB1pszHVskkw4u/9Eu8s5yvvsSDTzYh4p4ZIRj0DznSl3FBF0Z/mZfrKXTtt0QCoFmoHA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.17.17", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.17.tgz", + "integrity": "sha512-m/gwyiBwH3jqfUabtq3GH31otL/0sE0l34XKpSIqR7NjQ/XHQ3lpmQHLHbG8AHTGCw8Ao059GvV08MS0bhFIJQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.17.17", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.17.tgz", + "integrity": "sha512-4utIrsX9IykrqYaXR8ob9Ha2hAY2qLc6ohJ8c0CN1DR8yWeMrTgYFjgdeQ9LIoTOfLetXjuCu5TRPHT9yKYJVg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.17.17", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.17.tgz", + "integrity": "sha512-4PxjQII/9ppOrpEwzQ1b0pXCsFLqy77i0GaHodrmzH9zq2/NEhHMAMJkJ635Ns4fyJPFOlHMz4AsklIyRqFZWA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.17.17", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.17.tgz", + "integrity": "sha512-lQRS+4sW5S3P1sv0z2Ym807qMDfkmdhUYX30GRBURtLTrJOPDpoU0kI6pVz1hz3U0+YQ0tXGS9YWveQjUewAJw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.17.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.17.tgz", + "integrity": "sha512-biDs7bjGdOdcmIk6xU426VgdRUpGg39Yz6sT9Xp23aq+IEHDb/u5cbmu/pAANpDB4rZpY/2USPhCA+w9t3roQg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.17.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.17.tgz", + "integrity": "sha512-2+pwLx0whKY1/Vqt8lyzStyda1v0qjJ5INWIe+d8+1onqQxHLLi3yr5bAa4gvbzhZqBztifYEu8hh1La5+7sUw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.17.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.17.tgz", + "integrity": "sha512-IBTTv8X60dYo6P2t23sSUYym8fGfMAiuv7PzJ+0LcdAndZRzvke+wTVxJeCq4WgjppkOpndL04gMZIFvwoU34Q==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.17.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.17.tgz", + "integrity": "sha512-WVMBtcDpATjaGfWfp6u9dANIqmU9r37SY8wgAivuKmgKHE+bWSuv0qXEFt/p3qXQYxJIGXQQv6hHcm7iWhWjiw==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.17.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.17.tgz", + "integrity": "sha512-2kYCGh8589ZYnY031FgMLy0kmE4VoGdvfJkxLdxP4HJvWNXpyLhjOvxVsYjYZ6awqY4bgLR9tpdYyStgZZhi2A==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.17.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.17.tgz", + "integrity": "sha512-KIdG5jdAEeAKogfyMTcszRxy3OPbZhq0PPsW4iKKcdlbk3YE4miKznxV2YOSmiK/hfOZ+lqHri3v8eecT2ATwQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.17.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.17.tgz", + "integrity": "sha512-Cj6uWLBR5LWhcD/2Lkfg2NrkVsNb2sFM5aVEfumKB2vYetkA/9Uyc1jVoxLZ0a38sUhFk4JOVKH0aVdPbjZQeA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.17.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.17.tgz", + "integrity": "sha512-lK+SffWIr0XsFf7E0srBjhpkdFVJf3HEgXCwzkm69kNbRar8MhezFpkIwpk0qo2IOQL4JE4mJPJI8AbRPLbuOQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.17.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.17.tgz", + "integrity": "sha512-XcSGTQcWFQS2jx3lZtQi7cQmDYLrpLRyz1Ns1DzZCtn898cWfm5Icx/DEWNcTU+T+tyPV89RQtDnI7qL2PObPg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.17.17", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.17.tgz", + "integrity": "sha512-RNLCDmLP5kCWAJR+ItLM3cHxzXRTe4N00TQyQiimq+lyqVqZWGPAvcyfUBM0isE79eEZhIuGN09rAz8EL5KdLA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.17.17", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.17.tgz", + "integrity": "sha512-PAXswI5+cQq3Pann7FNdcpSUrhrql3wKjj3gVkmuz6OHhqqYxKvi6GgRBoaHjaG22HV/ZZEgF9TlS+9ftHVigA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.17.17", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.17.tgz", + "integrity": "sha512-V63egsWKnx/4V0FMYkr9NXWrKTB5qFftKGKuZKFIrAkO/7EWLFnbBZNM1CvJ6Sis+XBdPws2YQSHF1Gqf1oj/Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.17.17", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.17.tgz", + "integrity": "sha512-YtUXLdVnd6YBSYlZODjWzH+KzbaubV0YVd6UxSfoFfa5PtNJNaW+1i+Hcmjpg2nEe0YXUCNF5bkKy1NnBv1y7Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.17.17", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.17.tgz", + "integrity": "sha512-yczSLRbDdReCO74Yfc5tKG0izzm+lPMYyO1fFTcn0QNwnKmc3K+HdxZWLGKg4pZVte7XVgcFku7TIZNbWEJdeQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.17.17", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.17.tgz", + "integrity": "sha512-FNZw7H3aqhF9OyRQbDDnzUApDXfC1N6fgBhkqEO2jvYCJ+DxMTfZVqg3AX0R1khg1wHTBRD5SdcibSJ+XF6bFg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@types/node": { + "version": "18.15.12", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.12.tgz", + "integrity": "sha512-Wha1UwsB3CYdqUm2PPzh/1gujGCNtWVUYF0mB00fJFoR4gTyWTDPjSm+zBF787Ahw8vSGgBja90MkgFwvB86Dg==", + "dev": true + }, + "node_modules/aws-cdk-lib": { + "version": "2.76.0", + "resolved": "https://registry.npmjs.org/aws-cdk-lib/-/aws-cdk-lib-2.76.0.tgz", + "integrity": "sha512-EYWdHh/qJA7v+jD6SeW+BOEChI7oe6IYPHHap+SoJMUrKBVSDKnIGJ8wTP5eV6F27aYaUQiA7rWTKcCWoda8ag==", + "bundleDependencies": [ + "@balena/dockerignore", + "case", + "fs-extra", + "ignore", + "jsonschema", + "minimatch", + "punycode", + "semver", + "table", + "yaml" + ], + "dev": true, + "dependencies": { + "@aws-cdk/asset-awscli-v1": "^2.2.97", + "@aws-cdk/asset-kubectl-v20": "^2.1.1", + "@aws-cdk/asset-node-proxy-agent-v5": "^2.0.77", + "@balena/dockerignore": "^1.0.2", + "case": "1.6.3", + "fs-extra": "^9.1.0", + "ignore": "^5.2.4", + "jsonschema": "^1.4.1", + "minimatch": "^3.1.2", + "punycode": "^2.3.0", + "semver": "^7.3.8", + "table": "^6.8.1", + "yaml": "1.10.2" + }, + "engines": { + "node": ">= 14.15.0" + }, + "peerDependencies": { + "constructs": "^10.0.0" + } + }, + "node_modules/aws-cdk-lib/node_modules/@balena/dockerignore": { + "version": "1.0.2", + "dev": true, + "inBundle": true, + "license": "Apache-2.0" + }, + "node_modules/aws-cdk-lib/node_modules/ajv": { + "version": "8.12.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/aws-cdk-lib/node_modules/ansi-regex": { + "version": "5.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/aws-cdk-lib/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/aws-cdk-lib/node_modules/astral-regex": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/aws-cdk-lib/node_modules/at-least-node": { + "version": "1.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/aws-cdk-lib/node_modules/balanced-match": { + "version": "1.0.2", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/aws-cdk-lib/node_modules/brace-expansion": { + "version": "1.1.11", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/aws-cdk-lib/node_modules/case": { + "version": "1.6.3", + "dev": true, + "inBundle": true, + "license": "(MIT OR GPL-3.0-or-later)", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/aws-cdk-lib/node_modules/color-convert": { + "version": "2.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/aws-cdk-lib/node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/aws-cdk-lib/node_modules/concat-map": { + "version": "0.0.1", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/aws-cdk-lib/node_modules/emoji-regex": { + "version": "8.0.0", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/aws-cdk-lib/node_modules/fast-deep-equal": { + "version": "3.1.3", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/aws-cdk-lib/node_modules/fs-extra": { + "version": "9.1.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/aws-cdk-lib/node_modules/graceful-fs": { + "version": "4.2.10", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/aws-cdk-lib/node_modules/ignore": { + "version": "5.2.4", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/aws-cdk-lib/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/aws-cdk-lib/node_modules/json-schema-traverse": { + "version": "1.0.0", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/aws-cdk-lib/node_modules/jsonfile": { + "version": "6.1.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/aws-cdk-lib/node_modules/jsonschema": { + "version": "1.4.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/aws-cdk-lib/node_modules/lodash.truncate": { + "version": "4.4.2", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/aws-cdk-lib/node_modules/lru-cache": { + "version": "6.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/aws-cdk-lib/node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/aws-cdk-lib/node_modules/punycode": { + "version": "2.3.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/aws-cdk-lib/node_modules/require-from-string": { + "version": "2.0.2", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/aws-cdk-lib/node_modules/semver": { + "version": "7.3.8", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/aws-cdk-lib/node_modules/slice-ansi": { + "version": "4.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/aws-cdk-lib/node_modules/string-width": { + "version": "4.2.3", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/aws-cdk-lib/node_modules/strip-ansi": { + "version": "6.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/aws-cdk-lib/node_modules/table": { + "version": "6.8.1", + "dev": true, + "inBundle": true, + "license": "BSD-3-Clause", + "dependencies": { + "ajv": "^8.0.1", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/aws-cdk-lib/node_modules/universalify": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/aws-cdk-lib/node_modules/uri-js": { + "version": "4.4.1", + "dev": true, + "inBundle": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/aws-cdk-lib/node_modules/yallist": { + "version": "4.0.0", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/aws-cdk-lib/node_modules/yaml": { + "version": "1.10.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": ">= 6" + } + }, + "node_modules/bowser": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", + "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==", + "dev": true + }, + "node_modules/cdk-nag": { + "version": "2.26.12", + "resolved": "https://registry.npmjs.org/cdk-nag/-/cdk-nag-2.26.12.tgz", + "integrity": "sha512-SGThrCn3I5fSTt7plN/V/obgMLIzDGWgmp0Bb+v+dAHXLifW32+7WZHYPWzan7lXu20yZKCfwHg6c10XBTWO7w==", + "dev": true, + "peerDependencies": { + "aws-cdk-lib": "^2.45.0", + "constructs": "^10.0.5" + } + }, + "node_modules/constructs": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/constructs/-/constructs-10.2.1.tgz", + "integrity": "sha512-XJSrPWg3iXHe7a7bk1+Ty+yd4G2xQQP1dKEcOdoaBcCWEHIZMJ8D/J/ogptgJwp0hbJzlZueSab79osa29z5ug==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 14.17.0" + } + }, + "node_modules/esbuild": { + "version": "0.17.17", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.17.tgz", + "integrity": "sha512-/jUywtAymR8jR4qsa2RujlAF7Krpt5VWi72Q2yuLD4e/hvtNcFQ0I1j8m/bxq238pf3/0KO5yuXNpuLx8BE1KA==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.17.17", + "@esbuild/android-arm64": "0.17.17", + "@esbuild/android-x64": "0.17.17", + "@esbuild/darwin-arm64": "0.17.17", + "@esbuild/darwin-x64": "0.17.17", + "@esbuild/freebsd-arm64": "0.17.17", + "@esbuild/freebsd-x64": "0.17.17", + "@esbuild/linux-arm": "0.17.17", + "@esbuild/linux-arm64": "0.17.17", + "@esbuild/linux-ia32": "0.17.17", + "@esbuild/linux-loong64": "0.17.17", + "@esbuild/linux-mips64el": "0.17.17", + "@esbuild/linux-ppc64": "0.17.17", + "@esbuild/linux-riscv64": "0.17.17", + "@esbuild/linux-s390x": "0.17.17", + "@esbuild/linux-x64": "0.17.17", + "@esbuild/netbsd-x64": "0.17.17", + "@esbuild/openbsd-x64": "0.17.17", + "@esbuild/sunos-x64": "0.17.17", + "@esbuild/win32-arm64": "0.17.17", + "@esbuild/win32-ia32": "0.17.17", + "@esbuild/win32-x64": "0.17.17" + } + }, + "node_modules/fast-xml-parser": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.1.2.tgz", + "integrity": "sha512-CDYeykkle1LiA/uqQyNwYpFbyF6Axec6YapmpUP+/RHWIoR1zKjocdvNaTsxCxZzQ6v9MLXaSYm9Qq0thv0DHg==", + "dev": true, + "dependencies": { + "strnum": "^1.0.5" + }, + "bin": { + "fxparser": "src/cli/cli.js" + }, + "funding": { + "type": "paypal", + "url": "https://paypal.me/naturalintelligence" + } + }, + "node_modules/moment": { + "version": "2.29.4", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", + "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==", + "engines": { + "node": "*" + } + }, + "node_modules/strnum": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", + "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==", + "dev": true + }, + "node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, + "node_modules/typescript": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, + "bin": { + "uuid": "dist/bin/uuid" + } + } + }, + "dependencies": { + "@aws-cdk/asset-awscli-v1": { + "version": "2.2.145", + "resolved": "https://registry.npmjs.org/@aws-cdk/asset-awscli-v1/-/asset-awscli-v1-2.2.145.tgz", + "integrity": "sha512-hcKds6DWRm+xcrI4u5bUBvM7aupF5aGCBPAAuATJpp+w0Zp63TkANDPOCKB4bA79QLzvoQ3YYWnGCysmdaW57Q==", + "dev": true + }, + "@aws-cdk/asset-kubectl-v20": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@aws-cdk/asset-kubectl-v20/-/asset-kubectl-v20-2.1.1.tgz", + "integrity": "sha512-U1ntiX8XiMRRRH5J1IdC+1t5CE89015cwyt5U63Cpk0GnMlN5+h9WsWMlKlPXZR4rdq/m806JRlBMRpBUB2Dhw==", + "dev": true + }, + "@aws-cdk/asset-node-proxy-agent-v5": { + "version": "2.0.120", + "resolved": "https://registry.npmjs.org/@aws-cdk/asset-node-proxy-agent-v5/-/asset-node-proxy-agent-v5-2.0.120.tgz", + "integrity": "sha512-b8KA43ltvgoj6ybQuuTs6VSoP0edq6ZHDQsBbxw0wsNFMC/5VpmnbnfBrhjMLXbcJH6nwZJhMtBCWFswpPKDAw==", + "dev": true + }, + "@aws-crypto/crc32": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-3.0.0.tgz", + "integrity": "sha512-IzSgsrxUcsrejQbPVilIKy16kAT52EwB6zSaI+M3xxIhKh5+aldEyvI+z6erM7TCLB2BJsFrtHjp6/4/sr+3dA==", + "dev": true, + "requires": { + "@aws-crypto/util": "^3.0.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^1.11.1" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + } + } + }, + "@aws-crypto/ie11-detection": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/ie11-detection/-/ie11-detection-3.0.0.tgz", + "integrity": "sha512-341lBBkiY1DfDNKai/wXM3aujNBkXR7tq1URPQDL9wi3AUbI80NR74uF1TXHMm7po1AcnFk8iu2S2IeU/+/A+Q==", + "dev": true, + "requires": { + "tslib": "^1.11.1" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + } + } + }, + "@aws-crypto/sha256-browser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-3.0.0.tgz", + "integrity": "sha512-8VLmW2B+gjFbU5uMeqtQM6Nj0/F1bro80xQXCW6CQBWgosFWXTx77aeOF5CAIAmbOK64SdMBJdNr6J41yP5mvQ==", + "dev": true, + "requires": { + "@aws-crypto/ie11-detection": "^3.0.0", + "@aws-crypto/sha256-js": "^3.0.0", + "@aws-crypto/supports-web-crypto": "^3.0.0", + "@aws-crypto/util": "^3.0.0", + "@aws-sdk/types": "^3.222.0", + "@aws-sdk/util-locate-window": "^3.0.0", + "@aws-sdk/util-utf8-browser": "^3.0.0", + "tslib": "^1.11.1" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + } + } + }, + "@aws-crypto/sha256-js": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-3.0.0.tgz", + "integrity": "sha512-PnNN7os0+yd1XvXAy23CFOmTbMaDxgxXtTKHybrJ39Y8kGzBATgBFibWJKH6BhytLI/Zyszs87xCOBNyBig6vQ==", + "dev": true, + "requires": { + "@aws-crypto/util": "^3.0.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^1.11.1" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + } + } + }, + "@aws-crypto/supports-web-crypto": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-3.0.0.tgz", + "integrity": "sha512-06hBdMwUAb2WFTuGG73LSC0wfPu93xWwo5vL2et9eymgmu3Id5vFAHBbajVWiGhPO37qcsdCap/FqXvJGJWPIg==", + "dev": true, + "requires": { + "tslib": "^1.11.1" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + } + } + }, + "@aws-crypto/util": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-3.0.0.tgz", + "integrity": "sha512-2OJlpeJpCR48CC8r+uKVChzs9Iungj9wkZrl8Z041DWEWvyIHILYKCPNzJghKsivj+S3mLo6BVc7mBNzdxA46w==", + "dev": true, + "requires": { + "@aws-sdk/types": "^3.222.0", + "@aws-sdk/util-utf8-browser": "^3.0.0", + "tslib": "^1.11.1" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + } + } + }, + "@aws-sdk/abort-controller": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/abort-controller/-/abort-controller-3.310.0.tgz", + "integrity": "sha512-v1zrRQxDLA1MdPim159Vx/CPHqsB4uybSxRi1CnfHO5ZjHryx3a5htW2gdGAykVCul40+yJXvfpufMrELVxH+g==", + "dev": true, + "requires": { + "@aws-sdk/types": "3.310.0", + "tslib": "^2.5.0" + } + }, + "@aws-sdk/client-kendra": { + "version": "3.316.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-kendra/-/client-kendra-3.316.0.tgz", + "integrity": "sha512-prXImj5XS+m4OalE+KU7hd47DWh6Gr0oSe/8xtRH2UrHlczwsnpZb7JZhx4Wydy+v+YwN3ujCbzUwhOO0ELkFQ==", + "dev": true, + "requires": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/client-sts": "3.316.0", + "@aws-sdk/config-resolver": "3.310.0", + "@aws-sdk/credential-provider-node": "3.316.0", + "@aws-sdk/fetch-http-handler": "3.310.0", + "@aws-sdk/hash-node": "3.310.0", + "@aws-sdk/invalid-dependency": "3.310.0", + "@aws-sdk/middleware-content-length": "3.310.0", + "@aws-sdk/middleware-endpoint": "3.310.0", + "@aws-sdk/middleware-host-header": "3.310.0", + "@aws-sdk/middleware-logger": "3.310.0", + "@aws-sdk/middleware-recursion-detection": "3.310.0", + "@aws-sdk/middleware-retry": "3.310.0", + "@aws-sdk/middleware-serde": "3.310.0", + "@aws-sdk/middleware-signing": "3.310.0", + "@aws-sdk/middleware-stack": "3.310.0", + "@aws-sdk/middleware-user-agent": "3.310.0", + "@aws-sdk/node-config-provider": "3.310.0", + "@aws-sdk/node-http-handler": "3.310.0", + "@aws-sdk/protocol-http": "3.310.0", + "@aws-sdk/smithy-client": "3.316.0", + "@aws-sdk/types": "3.310.0", + "@aws-sdk/url-parser": "3.310.0", + "@aws-sdk/util-base64": "3.310.0", + "@aws-sdk/util-body-length-browser": "3.310.0", + "@aws-sdk/util-body-length-node": "3.310.0", + "@aws-sdk/util-defaults-mode-browser": "3.316.0", + "@aws-sdk/util-defaults-mode-node": "3.316.0", + "@aws-sdk/util-endpoints": "3.310.0", + "@aws-sdk/util-retry": "3.310.0", + "@aws-sdk/util-user-agent-browser": "3.310.0", + "@aws-sdk/util-user-agent-node": "3.310.0", + "@aws-sdk/util-utf8": "3.310.0", + "tslib": "^2.5.0", + "uuid": "^8.3.2" + } + }, + "@aws-sdk/client-lex-runtime-v2": { + "version": "3.316.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-lex-runtime-v2/-/client-lex-runtime-v2-3.316.0.tgz", + "integrity": "sha512-csaMmn/h6Z6QpDwKOnZpwEE7d2XXV50C5UZyGLSWcp2Sn7LmBHJsS7A+jSFC1MoKcAcK6waLXyDsFud7P9WZIA==", + "dev": true, + "requires": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/client-sts": "3.316.0", + "@aws-sdk/config-resolver": "3.310.0", + "@aws-sdk/credential-provider-node": "3.316.0", + "@aws-sdk/eventstream-handler-node": "3.310.0", + "@aws-sdk/eventstream-serde-browser": "3.310.0", + "@aws-sdk/eventstream-serde-config-resolver": "3.310.0", + "@aws-sdk/eventstream-serde-node": "3.310.0", + "@aws-sdk/fetch-http-handler": "3.310.0", + "@aws-sdk/hash-node": "3.310.0", + "@aws-sdk/invalid-dependency": "3.310.0", + "@aws-sdk/middleware-content-length": "3.310.0", + "@aws-sdk/middleware-endpoint": "3.310.0", + "@aws-sdk/middleware-eventstream": "3.310.0", + "@aws-sdk/middleware-host-header": "3.310.0", + "@aws-sdk/middleware-logger": "3.310.0", + "@aws-sdk/middleware-recursion-detection": "3.310.0", + "@aws-sdk/middleware-retry": "3.310.0", + "@aws-sdk/middleware-serde": "3.310.0", + "@aws-sdk/middleware-signing": "3.310.0", + "@aws-sdk/middleware-stack": "3.310.0", + "@aws-sdk/middleware-user-agent": "3.310.0", + "@aws-sdk/node-config-provider": "3.310.0", + "@aws-sdk/node-http-handler": "3.310.0", + "@aws-sdk/protocol-http": "3.310.0", + "@aws-sdk/smithy-client": "3.316.0", + "@aws-sdk/types": "3.310.0", + "@aws-sdk/url-parser": "3.310.0", + "@aws-sdk/util-base64": "3.310.0", + "@aws-sdk/util-body-length-browser": "3.310.0", + "@aws-sdk/util-body-length-node": "3.310.0", + "@aws-sdk/util-defaults-mode-browser": "3.316.0", + "@aws-sdk/util-defaults-mode-node": "3.316.0", + "@aws-sdk/util-endpoints": "3.310.0", + "@aws-sdk/util-retry": "3.310.0", + "@aws-sdk/util-stream-browser": "3.310.0", + "@aws-sdk/util-stream-node": "3.310.0", + "@aws-sdk/util-user-agent-browser": "3.310.0", + "@aws-sdk/util-user-agent-node": "3.310.0", + "@aws-sdk/util-utf8": "3.310.0", + "tslib": "^2.5.0" + } + }, + "@aws-sdk/client-sso": { + "version": "3.316.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.316.0.tgz", + "integrity": "sha512-wGXfIhR0lJGB8QTT0fwSwwklHePHxd2GW3IQt3trXnEYe0frmJ7vYRnVL5CSRKsikLDmaU7ll3SdsshMzQzo3w==", + "dev": true, + "requires": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/config-resolver": "3.310.0", + "@aws-sdk/fetch-http-handler": "3.310.0", + "@aws-sdk/hash-node": "3.310.0", + "@aws-sdk/invalid-dependency": "3.310.0", + "@aws-sdk/middleware-content-length": "3.310.0", + "@aws-sdk/middleware-endpoint": "3.310.0", + "@aws-sdk/middleware-host-header": "3.310.0", + "@aws-sdk/middleware-logger": "3.310.0", + "@aws-sdk/middleware-recursion-detection": "3.310.0", + "@aws-sdk/middleware-retry": "3.310.0", + "@aws-sdk/middleware-serde": "3.310.0", + "@aws-sdk/middleware-stack": "3.310.0", + "@aws-sdk/middleware-user-agent": "3.310.0", + "@aws-sdk/node-config-provider": "3.310.0", + "@aws-sdk/node-http-handler": "3.310.0", + "@aws-sdk/protocol-http": "3.310.0", + "@aws-sdk/smithy-client": "3.316.0", + "@aws-sdk/types": "3.310.0", + "@aws-sdk/url-parser": "3.310.0", + "@aws-sdk/util-base64": "3.310.0", + "@aws-sdk/util-body-length-browser": "3.310.0", + "@aws-sdk/util-body-length-node": "3.310.0", + "@aws-sdk/util-defaults-mode-browser": "3.316.0", + "@aws-sdk/util-defaults-mode-node": "3.316.0", + "@aws-sdk/util-endpoints": "3.310.0", + "@aws-sdk/util-retry": "3.310.0", + "@aws-sdk/util-user-agent-browser": "3.310.0", + "@aws-sdk/util-user-agent-node": "3.310.0", + "@aws-sdk/util-utf8": "3.310.0", + "tslib": "^2.5.0" + } + }, + "@aws-sdk/client-sso-oidc": { + "version": "3.316.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.316.0.tgz", + "integrity": "sha512-e2fvC7o42YV+LcZYfXCcvBn4L7NM9oNccnZ7T+pS6SFpHZlaqkw4uuQMRE6iUAof+Id7Mt7xDrz1x2yGlP+8GA==", + "dev": true, + "requires": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/config-resolver": "3.310.0", + "@aws-sdk/fetch-http-handler": "3.310.0", + "@aws-sdk/hash-node": "3.310.0", + "@aws-sdk/invalid-dependency": "3.310.0", + "@aws-sdk/middleware-content-length": "3.310.0", + "@aws-sdk/middleware-endpoint": "3.310.0", + "@aws-sdk/middleware-host-header": "3.310.0", + "@aws-sdk/middleware-logger": "3.310.0", + "@aws-sdk/middleware-recursion-detection": "3.310.0", + "@aws-sdk/middleware-retry": "3.310.0", + "@aws-sdk/middleware-serde": "3.310.0", + "@aws-sdk/middleware-stack": "3.310.0", + "@aws-sdk/middleware-user-agent": "3.310.0", + "@aws-sdk/node-config-provider": "3.310.0", + "@aws-sdk/node-http-handler": "3.310.0", + "@aws-sdk/protocol-http": "3.310.0", + "@aws-sdk/smithy-client": "3.316.0", + "@aws-sdk/types": "3.310.0", + "@aws-sdk/url-parser": "3.310.0", + "@aws-sdk/util-base64": "3.310.0", + "@aws-sdk/util-body-length-browser": "3.310.0", + "@aws-sdk/util-body-length-node": "3.310.0", + "@aws-sdk/util-defaults-mode-browser": "3.316.0", + "@aws-sdk/util-defaults-mode-node": "3.316.0", + "@aws-sdk/util-endpoints": "3.310.0", + "@aws-sdk/util-retry": "3.310.0", + "@aws-sdk/util-user-agent-browser": "3.310.0", + "@aws-sdk/util-user-agent-node": "3.310.0", + "@aws-sdk/util-utf8": "3.310.0", + "tslib": "^2.5.0" + } + }, + "@aws-sdk/client-sts": { + "version": "3.316.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.316.0.tgz", + "integrity": "sha512-5SD59+DRVy1mKckGs/5J8OwWpRS3E5v4BX19XaX/s9JJ5Rw9aZd9DP4SZVpeNXztIPjkQSEzHgrUVlZFB1QJgg==", + "dev": true, + "requires": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/config-resolver": "3.310.0", + "@aws-sdk/credential-provider-node": "3.316.0", + "@aws-sdk/fetch-http-handler": "3.310.0", + "@aws-sdk/hash-node": "3.310.0", + "@aws-sdk/invalid-dependency": "3.310.0", + "@aws-sdk/middleware-content-length": "3.310.0", + "@aws-sdk/middleware-endpoint": "3.310.0", + "@aws-sdk/middleware-host-header": "3.310.0", + "@aws-sdk/middleware-logger": "3.310.0", + "@aws-sdk/middleware-recursion-detection": "3.310.0", + "@aws-sdk/middleware-retry": "3.310.0", + "@aws-sdk/middleware-sdk-sts": "3.310.0", + "@aws-sdk/middleware-serde": "3.310.0", + "@aws-sdk/middleware-signing": "3.310.0", + "@aws-sdk/middleware-stack": "3.310.0", + "@aws-sdk/middleware-user-agent": "3.310.0", + "@aws-sdk/node-config-provider": "3.310.0", + "@aws-sdk/node-http-handler": "3.310.0", + "@aws-sdk/protocol-http": "3.310.0", + "@aws-sdk/smithy-client": "3.316.0", + "@aws-sdk/types": "3.310.0", + "@aws-sdk/url-parser": "3.310.0", + "@aws-sdk/util-base64": "3.310.0", + "@aws-sdk/util-body-length-browser": "3.310.0", + "@aws-sdk/util-body-length-node": "3.310.0", + "@aws-sdk/util-defaults-mode-browser": "3.316.0", + "@aws-sdk/util-defaults-mode-node": "3.316.0", + "@aws-sdk/util-endpoints": "3.310.0", + "@aws-sdk/util-retry": "3.310.0", + "@aws-sdk/util-user-agent-browser": "3.310.0", + "@aws-sdk/util-user-agent-node": "3.310.0", + "@aws-sdk/util-utf8": "3.310.0", + "fast-xml-parser": "4.1.2", + "tslib": "^2.5.0" + } + }, + "@aws-sdk/config-resolver": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/config-resolver/-/config-resolver-3.310.0.tgz", + "integrity": "sha512-8vsT+/50lOqfDxka9m/rRt6oxv1WuGZoP8oPMk0Dt+TxXMbAzf4+rejBgiB96wshI1k3gLokYRjSQZn+dDtT8g==", + "dev": true, + "requires": { + "@aws-sdk/types": "3.310.0", + "@aws-sdk/util-config-provider": "3.310.0", + "@aws-sdk/util-middleware": "3.310.0", + "tslib": "^2.5.0" + } + }, + "@aws-sdk/credential-provider-env": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.310.0.tgz", + "integrity": "sha512-vvIPQpI16fj95xwS7M3D48F7QhZJBnnCgB5lR+b7So+vsG9ibm1mZRVGzVpdxCvgyOhHFbvrby9aalNJmmIP1A==", + "dev": true, + "requires": { + "@aws-sdk/property-provider": "3.310.0", + "@aws-sdk/types": "3.310.0", + "tslib": "^2.5.0" + } + }, + "@aws-sdk/credential-provider-imds": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-imds/-/credential-provider-imds-3.310.0.tgz", + "integrity": "sha512-baxK7Zp6dai5AGW01FIW27xS2KAaPUmKLIXv5SvFYsUgXXvNW55im4uG3b+2gA0F7V+hXvVBH08OEqmwW6we5w==", + "dev": true, + "requires": { + "@aws-sdk/node-config-provider": "3.310.0", + "@aws-sdk/property-provider": "3.310.0", + "@aws-sdk/types": "3.310.0", + "@aws-sdk/url-parser": "3.310.0", + "tslib": "^2.5.0" + } + }, + "@aws-sdk/credential-provider-ini": { + "version": "3.316.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.316.0.tgz", + "integrity": "sha512-ZADkpdEjFCAXyzEpYbCRENlZ/AQEwevWdPd2yshjNo7xvOcepv4pPIBpYd8h9LvRafSLGA7zlWDz84hkIt+HKA==", + "dev": true, + "requires": { + "@aws-sdk/credential-provider-env": "3.310.0", + "@aws-sdk/credential-provider-imds": "3.310.0", + "@aws-sdk/credential-provider-process": "3.310.0", + "@aws-sdk/credential-provider-sso": "3.316.0", + "@aws-sdk/credential-provider-web-identity": "3.310.0", + "@aws-sdk/property-provider": "3.310.0", + "@aws-sdk/shared-ini-file-loader": "3.310.0", + "@aws-sdk/types": "3.310.0", + "tslib": "^2.5.0" + } + }, + "@aws-sdk/credential-provider-node": { + "version": "3.316.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.316.0.tgz", + "integrity": "sha512-oE1LTXP8XZp4bT8LhBeolMRiz0RwnmHDC2XpUmWO8LTmbDNrQO0mVzxEvXDLeKaN5BIFIJqNFlMgjWUMa9Kwcw==", + "dev": true, + "requires": { + "@aws-sdk/credential-provider-env": "3.310.0", + "@aws-sdk/credential-provider-imds": "3.310.0", + "@aws-sdk/credential-provider-ini": "3.316.0", + "@aws-sdk/credential-provider-process": "3.310.0", + "@aws-sdk/credential-provider-sso": "3.316.0", + "@aws-sdk/credential-provider-web-identity": "3.310.0", + "@aws-sdk/property-provider": "3.310.0", + "@aws-sdk/shared-ini-file-loader": "3.310.0", + "@aws-sdk/types": "3.310.0", + "tslib": "^2.5.0" + } + }, + "@aws-sdk/credential-provider-process": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.310.0.tgz", + "integrity": "sha512-h73sg6GPMUWC+3zMCbA1nZ2O03nNJt7G96JdmnantiXBwHpRKWW8nBTLzx5uhXn6hTuTaoQRP/P+oxQJKYdMmA==", + "dev": true, + "requires": { + "@aws-sdk/property-provider": "3.310.0", + "@aws-sdk/shared-ini-file-loader": "3.310.0", + "@aws-sdk/types": "3.310.0", + "tslib": "^2.5.0" + } + }, + "@aws-sdk/credential-provider-sso": { + "version": "3.316.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.316.0.tgz", + "integrity": "sha512-8/O2twlsoV1bDkZ9jd7JCMWsftfyoTyRT1UYscsKZGUDEgZRAxRkzS3GLYuLXEWNuxb1OB9rYk/cEJoxwy7T9g==", + "dev": true, + "requires": { + "@aws-sdk/client-sso": "3.316.0", + "@aws-sdk/property-provider": "3.310.0", + "@aws-sdk/shared-ini-file-loader": "3.310.0", + "@aws-sdk/token-providers": "3.316.0", + "@aws-sdk/types": "3.310.0", + "tslib": "^2.5.0" + } + }, + "@aws-sdk/credential-provider-web-identity": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.310.0.tgz", + "integrity": "sha512-H4SzuZXILNhK6/IR1uVvsUDZvzc051hem7GLyYghBCu8mU+tq28YhKE8MfSroi6eL2e5Vujloij1OM2EQQkPkw==", + "dev": true, + "requires": { + "@aws-sdk/property-provider": "3.310.0", + "@aws-sdk/types": "3.310.0", + "tslib": "^2.5.0" + } + }, + "@aws-sdk/eventstream-codec": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-codec/-/eventstream-codec-3.310.0.tgz", + "integrity": "sha512-clIeSgWbZbxwtsxZ/yoedNM0/kJFSIjjHPikuDGhxhqc+vP6TN3oYyVMFrYwFaTFhk2+S5wZcWYMw8Op1pWo+A==", + "dev": true, + "requires": { + "@aws-crypto/crc32": "3.0.0", + "@aws-sdk/types": "3.310.0", + "@aws-sdk/util-hex-encoding": "3.310.0", + "tslib": "^2.5.0" + } + }, + "@aws-sdk/eventstream-handler-node": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-handler-node/-/eventstream-handler-node-3.310.0.tgz", + "integrity": "sha512-mNwskuY4T+jdmVJNxrTyqw8XEeqHi2vFbzQ9DT9TwrjMBrIYZRuVyTGEyXu3aCofMxMhXxPEAH2wdTM+wBvxvg==", + "dev": true, + "requires": { + "@aws-sdk/eventstream-codec": "3.310.0", + "@aws-sdk/types": "3.310.0", + "tslib": "^2.5.0" + } + }, + "@aws-sdk/eventstream-serde-browser": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-serde-browser/-/eventstream-serde-browser-3.310.0.tgz", + "integrity": "sha512-3S6ziuQVALgEyz0TANGtYDVeG8ArK4Y05mcgrs8qUTmsvlDIXX37cR/DvmVbNB76M4IrsZeSAIajL9644CywkA==", + "dev": true, + "requires": { + "@aws-sdk/eventstream-serde-universal": "3.310.0", + "@aws-sdk/types": "3.310.0", + "tslib": "^2.5.0" + } + }, + "@aws-sdk/eventstream-serde-config-resolver": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-3.310.0.tgz", + "integrity": "sha512-8s1Qdn9STj+sV75nUp9yt0W6fHS4BZ2jTm4Z/1Pcbvh2Gqs0WjH5n2StS+pDW5Y9J/HSGBl0ogmUr5lC5bXFHg==", + "dev": true, + "requires": { + "@aws-sdk/types": "3.310.0", + "tslib": "^2.5.0" + } + }, + "@aws-sdk/eventstream-serde-node": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-serde-node/-/eventstream-serde-node-3.310.0.tgz", + "integrity": "sha512-kSnRomCgW43K9TmQYuwN9+AoYPnhyOKroanUMyZEzJk7rpCPMj4OzaUpXfDYOvznFNYn7NLaH6nHLJAr0VPlJA==", + "dev": true, + "requires": { + "@aws-sdk/eventstream-serde-universal": "3.310.0", + "@aws-sdk/types": "3.310.0", + "tslib": "^2.5.0" + } + }, + "@aws-sdk/eventstream-serde-universal": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-serde-universal/-/eventstream-serde-universal-3.310.0.tgz", + "integrity": "sha512-Qyjt5k/waV5cDukpgT824ISZAz5U0pwzLz5ztR409u85AGNkF/9n7MS+LSyBUBSb0WJ5pUeSD47WBk+nLq9Nhw==", + "dev": true, + "requires": { + "@aws-sdk/eventstream-codec": "3.310.0", + "@aws-sdk/types": "3.310.0", + "tslib": "^2.5.0" + } + }, + "@aws-sdk/fetch-http-handler": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/fetch-http-handler/-/fetch-http-handler-3.310.0.tgz", + "integrity": "sha512-Bi9vIwzdkw1zMcvi/zGzlWS9KfIEnAq4NNhsnCxbQ4OoIRU9wvU+WGZdBBhxg0ZxZmpp1j1aZhU53lLjA07MHw==", + "dev": true, + "requires": { + "@aws-sdk/protocol-http": "3.310.0", + "@aws-sdk/querystring-builder": "3.310.0", + "@aws-sdk/types": "3.310.0", + "@aws-sdk/util-base64": "3.310.0", + "tslib": "^2.5.0" + } + }, + "@aws-sdk/hash-node": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/hash-node/-/hash-node-3.310.0.tgz", + "integrity": "sha512-NvE2fhRc8GRwCXBfDehxVAWCmVwVMILliAKVPAEr4yz2CkYs0tqU51S48x23dtna07H4qHtgpeNqVTthcIQOEQ==", + "dev": true, + "requires": { + "@aws-sdk/types": "3.310.0", + "@aws-sdk/util-buffer-from": "3.310.0", + "@aws-sdk/util-utf8": "3.310.0", + "tslib": "^2.5.0" + } + }, + "@aws-sdk/invalid-dependency": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/invalid-dependency/-/invalid-dependency-3.310.0.tgz", + "integrity": "sha512-1s5RG5rSPXoa/aZ/Kqr5U/7lqpx+Ry81GprQ2bxWqJvWQIJ0IRUwo5pk8XFxbKVr/2a+4lZT/c3OGoBOM1yRRA==", + "dev": true, + "requires": { + "@aws-sdk/types": "3.310.0", + "tslib": "^2.5.0" + } + }, + "@aws-sdk/is-array-buffer": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/is-array-buffer/-/is-array-buffer-3.310.0.tgz", + "integrity": "sha512-urnbcCR+h9NWUnmOtet/s4ghvzsidFmspfhYaHAmSRdy9yDjdjBJMFjjsn85A1ODUktztm+cVncXjQ38WCMjMQ==", + "dev": true, + "requires": { + "tslib": "^2.5.0" + } + }, + "@aws-sdk/middleware-content-length": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-content-length/-/middleware-content-length-3.310.0.tgz", + "integrity": "sha512-P8tQZxgDt6CAh1wd/W6WPzjc+uWPJwQkm+F7rAwRlM+k9q17HrhnksGDKcpuuLyIhPQYdmOMIkpKVgXGa4avhQ==", + "dev": true, + "requires": { + "@aws-sdk/protocol-http": "3.310.0", + "@aws-sdk/types": "3.310.0", + "tslib": "^2.5.0" + } + }, + "@aws-sdk/middleware-endpoint": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-endpoint/-/middleware-endpoint-3.310.0.tgz", + "integrity": "sha512-Z+N2vOL8K354/lstkClxLLsr6hCpVRh+0tCMXrVj66/NtKysCEZ/0b9LmqOwD9pWHNiI2mJqXwY0gxNlKAroUg==", + "dev": true, + "requires": { + "@aws-sdk/middleware-serde": "3.310.0", + "@aws-sdk/types": "3.310.0", + "@aws-sdk/url-parser": "3.310.0", + "@aws-sdk/util-middleware": "3.310.0", + "tslib": "^2.5.0" + } + }, + "@aws-sdk/middleware-eventstream": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-eventstream/-/middleware-eventstream-3.310.0.tgz", + "integrity": "sha512-ukUoZSKDrZlZh/6qjcrZcFfg5qckuifuLepgIRTC14BCbswLSYuareceRPooOxnB+gVmApHtLZ9gvm8Nz74Ilw==", + "dev": true, + "requires": { + "@aws-sdk/protocol-http": "3.310.0", + "@aws-sdk/types": "3.310.0", + "tslib": "^2.5.0" + } + }, + "@aws-sdk/middleware-host-header": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.310.0.tgz", + "integrity": "sha512-QWSA+46/hXorXyWa61ic2K7qZzwHTiwfk2e9mRRjeIRepUgI3qxFjsYqrWtrOGBjmFmq0pYIY8Bb/DCJuQqcoA==", + "dev": true, + "requires": { + "@aws-sdk/protocol-http": "3.310.0", + "@aws-sdk/types": "3.310.0", + "tslib": "^2.5.0" + } + }, + "@aws-sdk/middleware-logger": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.310.0.tgz", + "integrity": "sha512-Lurm8XofrASBRnAVtiSNuDSRsRqPNg27RIFLLsLp/pqog9nFJ0vz0kgdb9S5Z+zw83Mm+UlqOe6D8NTUNp4fVg==", + "dev": true, + "requires": { + "@aws-sdk/types": "3.310.0", + "tslib": "^2.5.0" + } + }, + "@aws-sdk/middleware-recursion-detection": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.310.0.tgz", + "integrity": "sha512-SuB75/xk/gyue24gkriTwO2jFd7YcUGZDClQYuRejgbXSa3CO0lWyawQtfLcSSEBp9izrEVXuFH24K1eAft5nQ==", + "dev": true, + "requires": { + "@aws-sdk/protocol-http": "3.310.0", + "@aws-sdk/types": "3.310.0", + "tslib": "^2.5.0" + } + }, + "@aws-sdk/middleware-retry": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-retry/-/middleware-retry-3.310.0.tgz", + "integrity": "sha512-oTPsRy2W4s+dfxbJPW7Km+hHtv/OMsNsVfThAq8DDYKC13qlr1aAyOqGLD+dpBy2aKe7ss517Sy2HcHtHqm7/g==", + "dev": true, + "requires": { + "@aws-sdk/protocol-http": "3.310.0", + "@aws-sdk/service-error-classification": "3.310.0", + "@aws-sdk/types": "3.310.0", + "@aws-sdk/util-middleware": "3.310.0", + "@aws-sdk/util-retry": "3.310.0", + "tslib": "^2.5.0", + "uuid": "^8.3.2" + } + }, + "@aws-sdk/middleware-sdk-sts": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.310.0.tgz", + "integrity": "sha512-+5PFwlYNLvLLIfw0ASAoWV/iIF8Zv6R6QGtyP0CclhRSvNjgbQDVnV0g95MC5qvh+GB/Yjlkt8qAjLSPjHfsrQ==", + "dev": true, + "requires": { + "@aws-sdk/middleware-signing": "3.310.0", + "@aws-sdk/types": "3.310.0", + "tslib": "^2.5.0" + } + }, + "@aws-sdk/middleware-serde": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-serde/-/middleware-serde-3.310.0.tgz", + "integrity": "sha512-RNeeTVWSLTaentUeCgQKZhAl+C6hxtwD78cQWS10UymWpQFwbaxztzKUu4UQS5xA2j6PxwPRRUjqa4jcFjfLsg==", + "dev": true, + "requires": { + "@aws-sdk/types": "3.310.0", + "tslib": "^2.5.0" + } + }, + "@aws-sdk/middleware-signing": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.310.0.tgz", + "integrity": "sha512-f9mKq+XMdW207Af3hKjdTnpNhdtwqWuvFs/ZyXoOkp/g1MY1O6L23Jy6i52m29LxbT4AuNRG1oKODfXM0vYVjQ==", + "dev": true, + "requires": { + "@aws-sdk/property-provider": "3.310.0", + "@aws-sdk/protocol-http": "3.310.0", + "@aws-sdk/signature-v4": "3.310.0", + "@aws-sdk/types": "3.310.0", + "@aws-sdk/util-middleware": "3.310.0", + "tslib": "^2.5.0" + } + }, + "@aws-sdk/middleware-stack": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-stack/-/middleware-stack-3.310.0.tgz", + "integrity": "sha512-010O1PD+UAcZVKRvqEusE1KJqN96wwrf6QsqbRM0ywsKQ21NDweaHvEDlds2VHpgmofxkRLRu/IDrlPkKRQrRg==", + "dev": true, + "requires": { + "tslib": "^2.5.0" + } + }, + "@aws-sdk/middleware-user-agent": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.310.0.tgz", + "integrity": "sha512-x3IOwSwSbwKidlxRk3CNVHVUb06SRuaELxggCaR++QVI8NU6qD/l4VHXKVRvbTHiC/cYxXE/GaBDgQVpDR7V/g==", + "dev": true, + "requires": { + "@aws-sdk/protocol-http": "3.310.0", + "@aws-sdk/types": "3.310.0", + "@aws-sdk/util-endpoints": "3.310.0", + "tslib": "^2.5.0" + } + }, + "@aws-sdk/node-config-provider": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/node-config-provider/-/node-config-provider-3.310.0.tgz", + "integrity": "sha512-T/Pp6htc6hq/Cq+MLNDSyiwWCMVF6GqbBbXKVlO5L8rdHx4sq9xPdoPveZhGWrxvkanjA6eCwUp6E0riBOSVng==", + "dev": true, + "requires": { + "@aws-sdk/property-provider": "3.310.0", + "@aws-sdk/shared-ini-file-loader": "3.310.0", + "@aws-sdk/types": "3.310.0", + "tslib": "^2.5.0" + } + }, + "@aws-sdk/node-http-handler": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/node-http-handler/-/node-http-handler-3.310.0.tgz", + "integrity": "sha512-irv9mbcM9xC2xYjArQF5SYmHBMu4ciMWtGsoHII1nRuFOl9FoT4ffTvEPuLlfC6pznzvKt9zvnm6xXj7gDChKg==", + "dev": true, + "requires": { + "@aws-sdk/abort-controller": "3.310.0", + "@aws-sdk/protocol-http": "3.310.0", + "@aws-sdk/querystring-builder": "3.310.0", + "@aws-sdk/types": "3.310.0", + "tslib": "^2.5.0" + } + }, + "@aws-sdk/property-provider": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/property-provider/-/property-provider-3.310.0.tgz", + "integrity": "sha512-3lxDb0akV6BBzmFe4nLPaoliQbAifyWJhuvuDOu7e8NzouvpQXs0275w9LePhhcgjKAEVXUIse05ZW2DLbxo/g==", + "dev": true, + "requires": { + "@aws-sdk/types": "3.310.0", + "tslib": "^2.5.0" + } + }, + "@aws-sdk/protocol-http": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/protocol-http/-/protocol-http-3.310.0.tgz", + "integrity": "sha512-fgZ1aw/irQtnrsR58pS8ThKOWo57Py3xX6giRvwSgZDEcxHfVzuQjy9yPuV++v04fdmdtgpbGf8WfvAAJ11yXQ==", + "dev": true, + "requires": { + "@aws-sdk/types": "3.310.0", + "tslib": "^2.5.0" + } + }, + "@aws-sdk/querystring-builder": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-builder/-/querystring-builder-3.310.0.tgz", + "integrity": "sha512-ZHH8GV/80+pWGo7DzsvwvXR5xVxUHXUvPJPFAkhr6nCf78igdoF8gR10ScFoEKbtEapoNTaZlKHPXxpD8aPG7A==", + "dev": true, + "requires": { + "@aws-sdk/types": "3.310.0", + "@aws-sdk/util-uri-escape": "3.310.0", + "tslib": "^2.5.0" + } + }, + "@aws-sdk/querystring-parser": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-parser/-/querystring-parser-3.310.0.tgz", + "integrity": "sha512-YkIznoP6lsiIUHinx++/lbb3tlMURGGqMpo0Pnn32zYzGrJXA6eC3D0as2EcMjo55onTfuLcIiX4qzXes2MYOA==", + "dev": true, + "requires": { + "@aws-sdk/types": "3.310.0", + "tslib": "^2.5.0" + } + }, + "@aws-sdk/service-error-classification": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/service-error-classification/-/service-error-classification-3.310.0.tgz", + "integrity": "sha512-PuyC7k3qfIKeH2LCnDwbttMOKq3qAx4buvg0yfnJtQOz6t1AR8gsnAq0CjKXXyfkXwNKWTqCpE6lVNUIkXgsMw==", + "dev": true + }, + "@aws-sdk/shared-ini-file-loader": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/shared-ini-file-loader/-/shared-ini-file-loader-3.310.0.tgz", + "integrity": "sha512-N0q9pG0xSjQwc690YQND5bofm+4nfUviQ/Ppgan2kU6aU0WUq8KwgHJBto/YEEI+VlrME30jZJnxtOvcZJc2XA==", + "dev": true, + "requires": { + "@aws-sdk/types": "3.310.0", + "tslib": "^2.5.0" + } + }, + "@aws-sdk/signature-v4": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4/-/signature-v4-3.310.0.tgz", + "integrity": "sha512-1M60P1ZBNAjCFv9sYW29OF6okktaeibWyW3lMXqzoHF70lHBZh+838iUchznXUA5FLabfn4jBFWMRxlAXJUY2Q==", + "dev": true, + "requires": { + "@aws-sdk/is-array-buffer": "3.310.0", + "@aws-sdk/types": "3.310.0", + "@aws-sdk/util-hex-encoding": "3.310.0", + "@aws-sdk/util-middleware": "3.310.0", + "@aws-sdk/util-uri-escape": "3.310.0", + "@aws-sdk/util-utf8": "3.310.0", + "tslib": "^2.5.0" + } + }, + "@aws-sdk/smithy-client": { + "version": "3.316.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/smithy-client/-/smithy-client-3.316.0.tgz", + "integrity": "sha512-6YXOKbRnXeS8r8RWzuL6JMBolDYM5Wa4fD/VY6x/wK78i2xErHOvqzHgyyeLI1MMw4uqyd4wRNJNWC9TMPduXw==", + "dev": true, + "requires": { + "@aws-sdk/middleware-stack": "3.310.0", + "@aws-sdk/types": "3.310.0", + "tslib": "^2.5.0" + } + }, + "@aws-sdk/token-providers": { + "version": "3.316.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.316.0.tgz", + "integrity": "sha512-foJ2YmB8A/mtp52riO2zdmBgzA3IpASNgUhY9FZg1BKpGcjqLQDGYP+BY3BA0H7CFsMa4PCf13M5wWwn1onyBA==", + "dev": true, + "requires": { + "@aws-sdk/client-sso-oidc": "3.316.0", + "@aws-sdk/property-provider": "3.310.0", + "@aws-sdk/shared-ini-file-loader": "3.310.0", + "@aws-sdk/types": "3.310.0", + "tslib": "^2.5.0" + } + }, + "@aws-sdk/types": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.310.0.tgz", + "integrity": "sha512-j8eamQJ7YcIhw7fneUfs8LYl3t01k4uHi4ZDmNRgtbmbmTTG3FZc2MotStZnp3nZB6vLiPF1o5aoJxWVvkzS6A==", + "dev": true, + "requires": { + "tslib": "^2.5.0" + } + }, + "@aws-sdk/url-parser": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/url-parser/-/url-parser-3.310.0.tgz", + "integrity": "sha512-mCLnCaSB9rQvAgx33u0DujLvr4d5yEm/W5r789GblwwQnlNXedVu50QRizMLTpltYWyAUoXjJgQnJHmJMaKXhw==", + "dev": true, + "requires": { + "@aws-sdk/querystring-parser": "3.310.0", + "@aws-sdk/types": "3.310.0", + "tslib": "^2.5.0" + } + }, + "@aws-sdk/util-base64": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-base64/-/util-base64-3.310.0.tgz", + "integrity": "sha512-v3+HBKQvqgdzcbL+pFswlx5HQsd9L6ZTlyPVL2LS9nNXnCcR3XgGz9jRskikRUuUvUXtkSG1J88GAOnJ/apTPg==", + "dev": true, + "requires": { + "@aws-sdk/util-buffer-from": "3.310.0", + "tslib": "^2.5.0" + } + }, + "@aws-sdk/util-body-length-browser": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-browser/-/util-body-length-browser-3.310.0.tgz", + "integrity": "sha512-sxsC3lPBGfpHtNTUoGXMQXLwjmR0zVpx0rSvzTPAuoVILVsp5AU/w5FphNPxD5OVIjNbZv9KsKTuvNTiZjDp9g==", + "dev": true, + "requires": { + "tslib": "^2.5.0" + } + }, + "@aws-sdk/util-body-length-node": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-node/-/util-body-length-node-3.310.0.tgz", + "integrity": "sha512-2tqGXdyKhyA6w4zz7UPoS8Ip+7sayOg9BwHNidiGm2ikbDxm1YrCfYXvCBdwaJxa4hJfRVz+aL9e+d3GqPI9pQ==", + "dev": true, + "requires": { + "tslib": "^2.5.0" + } + }, + "@aws-sdk/util-buffer-from": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-buffer-from/-/util-buffer-from-3.310.0.tgz", + "integrity": "sha512-i6LVeXFtGih5Zs8enLrt+ExXY92QV25jtEnTKHsmlFqFAuL3VBeod6boeMXkN2p9lbSVVQ1sAOOYZOHYbYkntw==", + "dev": true, + "requires": { + "@aws-sdk/is-array-buffer": "3.310.0", + "tslib": "^2.5.0" + } + }, + "@aws-sdk/util-config-provider": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-config-provider/-/util-config-provider-3.310.0.tgz", + "integrity": "sha512-xIBaYo8dwiojCw8vnUcIL4Z5tyfb1v3yjqyJKJWV/dqKUFOOS0U591plmXbM+M/QkXyML3ypon1f8+BoaDExrg==", + "dev": true, + "requires": { + "tslib": "^2.5.0" + } + }, + "@aws-sdk/util-defaults-mode-browser": { + "version": "3.316.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-browser/-/util-defaults-mode-browser-3.316.0.tgz", + "integrity": "sha512-6FSqLhYmaihtH2n1s4b2rlLW0ABU8N6VZIfzLfe2ING4PF0MzfaMMhnTFUHVXfKCVGoR8yP6iyFTRCyHGVEL1w==", + "dev": true, + "requires": { + "@aws-sdk/property-provider": "3.310.0", + "@aws-sdk/types": "3.310.0", + "bowser": "^2.11.0", + "tslib": "^2.5.0" + } + }, + "@aws-sdk/util-defaults-mode-node": { + "version": "3.316.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-node/-/util-defaults-mode-node-3.316.0.tgz", + "integrity": "sha512-dkYy10hdjPSScXXvnjGpZpnJxllkb6ICHgLMwZ4JczLHhPM12T/4PQ758YN8HS+muiYDGX1Bl2z1jd/bMcewBQ==", + "dev": true, + "requires": { + "@aws-sdk/config-resolver": "3.310.0", + "@aws-sdk/credential-provider-imds": "3.310.0", + "@aws-sdk/node-config-provider": "3.310.0", + "@aws-sdk/property-provider": "3.310.0", + "@aws-sdk/types": "3.310.0", + "tslib": "^2.5.0" + } + }, + "@aws-sdk/util-endpoints": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.310.0.tgz", + "integrity": "sha512-zG+/d/O5KPmAaeOMPd6bW1abifdT0H03f42keLjYEoRZzYtHPC5DuPE0UayiWGckI6BCDgy0sRKXCYS49UNFaQ==", + "dev": true, + "requires": { + "@aws-sdk/types": "3.310.0", + "tslib": "^2.5.0" + } + }, + "@aws-sdk/util-hex-encoding": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-hex-encoding/-/util-hex-encoding-3.310.0.tgz", + "integrity": "sha512-sVN7mcCCDSJ67pI1ZMtk84SKGqyix6/0A1Ab163YKn+lFBQRMKexleZzpYzNGxYzmQS6VanP/cfU7NiLQOaSfA==", + "dev": true, + "requires": { + "tslib": "^2.5.0" + } + }, + "@aws-sdk/util-locate-window": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.310.0.tgz", + "integrity": "sha512-qo2t/vBTnoXpjKxlsC2e1gBrRm80M3bId27r0BRB2VniSSe7bL1mmzM+/HFtujm0iAxtPM+aLEflLJlJeDPg0w==", + "dev": true, + "requires": { + "tslib": "^2.5.0" + } + }, + "@aws-sdk/util-middleware": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-middleware/-/util-middleware-3.310.0.tgz", + "integrity": "sha512-FTSUKL/eRb9X6uEZClrTe27QFXUNNp7fxYrPndZwk1hlaOP5ix+MIHBcI7pIiiY/JPfOUmPyZOu+HetlFXjWog==", + "dev": true, + "requires": { + "tslib": "^2.5.0" + } + }, + "@aws-sdk/util-retry": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-retry/-/util-retry-3.310.0.tgz", + "integrity": "sha512-FwWGhCBLfoivTMUHu1LIn4NjrN9JLJ/aX5aZmbcPIOhZVFJj638j0qDgZXyfvVqBuBZh7M8kGq0Oahy3dp69OA==", + "dev": true, + "requires": { + "@aws-sdk/service-error-classification": "3.310.0", + "tslib": "^2.5.0" + } + }, + "@aws-sdk/util-stream-browser": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-stream-browser/-/util-stream-browser-3.310.0.tgz", + "integrity": "sha512-bysXZHwFwvbqOTCScCdCnoLk1K3GCo0HRIYEZuL7O7MHrQmfaYRXcaft/p22+GUv9VeFXS/eJJZ5r4u32az94w==", + "dev": true, + "requires": { + "@aws-sdk/fetch-http-handler": "3.310.0", + "@aws-sdk/types": "3.310.0", + "@aws-sdk/util-base64": "3.310.0", + "@aws-sdk/util-hex-encoding": "3.310.0", + "@aws-sdk/util-utf8": "3.310.0", + "tslib": "^2.5.0" + } + }, + "@aws-sdk/util-stream-node": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-stream-node/-/util-stream-node-3.310.0.tgz", + "integrity": "sha512-hueAXFK0GVvnfYFgqbF7587xZfMZff5jlIFZOHqx7XVU7bl7qrRUCnphHk8H6yZ7RoQbDPcfmHJgtEoAJg1T1Q==", + "dev": true, + "requires": { + "@aws-sdk/node-http-handler": "3.310.0", + "@aws-sdk/types": "3.310.0", + "@aws-sdk/util-buffer-from": "3.310.0", + "tslib": "^2.5.0" + } + }, + "@aws-sdk/util-uri-escape": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-uri-escape/-/util-uri-escape-3.310.0.tgz", + "integrity": "sha512-drzt+aB2qo2LgtDoiy/3sVG8w63cgLkqFIa2NFlGpUgHFWTXkqtbgf4L5QdjRGKWhmZsnqkbtL7vkSWEcYDJ4Q==", + "dev": true, + "requires": { + "tslib": "^2.5.0" + } + }, + "@aws-sdk/util-user-agent-browser": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.310.0.tgz", + "integrity": "sha512-yU/4QnHHuQ5z3vsUqMQVfYLbZGYwpYblPiuZx4Zo9+x0PBkNjYMqctdDcrpoH9Z2xZiDN16AmQGK1tix117ZKw==", + "dev": true, + "requires": { + "@aws-sdk/types": "3.310.0", + "bowser": "^2.11.0", + "tslib": "^2.5.0" + } + }, + "@aws-sdk/util-user-agent-node": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.310.0.tgz", + "integrity": "sha512-Ra3pEl+Gn2BpeE7KiDGpi4zj7WJXZA5GXnGo3mjbi9+Y3zrbuhJAbdZO3mO/o7xDgMC6ph4xCTbaSGzU6b6EDg==", + "dev": true, + "requires": { + "@aws-sdk/node-config-provider": "3.310.0", + "@aws-sdk/types": "3.310.0", + "tslib": "^2.5.0" + } + }, + "@aws-sdk/util-utf8": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8/-/util-utf8-3.310.0.tgz", + "integrity": "sha512-DnLfFT8uCO22uOJc0pt0DsSNau1GTisngBCDw8jQuWT5CqogMJu4b/uXmwEqfj8B3GX6Xsz8zOd6JpRlPftQoA==", + "dev": true, + "requires": { + "@aws-sdk/util-buffer-from": "3.310.0", + "tslib": "^2.5.0" + } + }, + "@aws-sdk/util-utf8-browser": { + "version": "3.259.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.259.0.tgz", + "integrity": "sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw==", + "dev": true, + "requires": { + "tslib": "^2.3.1" + } + }, + "@esbuild/android-arm": { + "version": "0.17.17", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.17.tgz", + "integrity": "sha512-E6VAZwN7diCa3labs0GYvhEPL2M94WLF8A+czO8hfjREXxba8Ng7nM5VxV+9ihNXIY1iQO1XxUU4P7hbqbICxg==", + "dev": true, + "optional": true + }, + "@esbuild/android-arm64": { + "version": "0.17.17", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.17.tgz", + "integrity": "sha512-jaJ5IlmaDLFPNttv0ofcwy/cfeY4bh/n705Tgh+eLObbGtQBK3EPAu+CzL95JVE4nFAliyrnEu0d32Q5foavqg==", + "dev": true, + "optional": true + }, + "@esbuild/android-x64": { + "version": "0.17.17", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.17.tgz", + "integrity": "sha512-446zpfJ3nioMC7ASvJB1pszHVskkw4u/9Eu8s5yvvsSDTzYh4p4ZIRj0DznSl3FBF0Z/mZfrKXTtt0QCoFmoHA==", + "dev": true, + "optional": true + }, + "@esbuild/darwin-arm64": { + "version": "0.17.17", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.17.tgz", + "integrity": "sha512-m/gwyiBwH3jqfUabtq3GH31otL/0sE0l34XKpSIqR7NjQ/XHQ3lpmQHLHbG8AHTGCw8Ao059GvV08MS0bhFIJQ==", + "dev": true, + "optional": true + }, + "@esbuild/darwin-x64": { + "version": "0.17.17", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.17.tgz", + "integrity": "sha512-4utIrsX9IykrqYaXR8ob9Ha2hAY2qLc6ohJ8c0CN1DR8yWeMrTgYFjgdeQ9LIoTOfLetXjuCu5TRPHT9yKYJVg==", + "dev": true, + "optional": true + }, + "@esbuild/freebsd-arm64": { + "version": "0.17.17", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.17.tgz", + "integrity": "sha512-4PxjQII/9ppOrpEwzQ1b0pXCsFLqy77i0GaHodrmzH9zq2/NEhHMAMJkJ635Ns4fyJPFOlHMz4AsklIyRqFZWA==", + "dev": true, + "optional": true + }, + "@esbuild/freebsd-x64": { + "version": "0.17.17", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.17.tgz", + "integrity": "sha512-lQRS+4sW5S3P1sv0z2Ym807qMDfkmdhUYX30GRBURtLTrJOPDpoU0kI6pVz1hz3U0+YQ0tXGS9YWveQjUewAJw==", + "dev": true, + "optional": true + }, + "@esbuild/linux-arm": { + "version": "0.17.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.17.tgz", + "integrity": "sha512-biDs7bjGdOdcmIk6xU426VgdRUpGg39Yz6sT9Xp23aq+IEHDb/u5cbmu/pAANpDB4rZpY/2USPhCA+w9t3roQg==", + "dev": true, + "optional": true + }, + "@esbuild/linux-arm64": { + "version": "0.17.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.17.tgz", + "integrity": "sha512-2+pwLx0whKY1/Vqt8lyzStyda1v0qjJ5INWIe+d8+1onqQxHLLi3yr5bAa4gvbzhZqBztifYEu8hh1La5+7sUw==", + "dev": true, + "optional": true + }, + "@esbuild/linux-ia32": { + "version": "0.17.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.17.tgz", + "integrity": "sha512-IBTTv8X60dYo6P2t23sSUYym8fGfMAiuv7PzJ+0LcdAndZRzvke+wTVxJeCq4WgjppkOpndL04gMZIFvwoU34Q==", + "dev": true, + "optional": true + }, + "@esbuild/linux-loong64": { + "version": "0.17.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.17.tgz", + "integrity": "sha512-WVMBtcDpATjaGfWfp6u9dANIqmU9r37SY8wgAivuKmgKHE+bWSuv0qXEFt/p3qXQYxJIGXQQv6hHcm7iWhWjiw==", + "dev": true, + "optional": true + }, + "@esbuild/linux-mips64el": { + "version": "0.17.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.17.tgz", + "integrity": "sha512-2kYCGh8589ZYnY031FgMLy0kmE4VoGdvfJkxLdxP4HJvWNXpyLhjOvxVsYjYZ6awqY4bgLR9tpdYyStgZZhi2A==", + "dev": true, + "optional": true + }, + "@esbuild/linux-ppc64": { + "version": "0.17.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.17.tgz", + "integrity": "sha512-KIdG5jdAEeAKogfyMTcszRxy3OPbZhq0PPsW4iKKcdlbk3YE4miKznxV2YOSmiK/hfOZ+lqHri3v8eecT2ATwQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-riscv64": { + "version": "0.17.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.17.tgz", + "integrity": "sha512-Cj6uWLBR5LWhcD/2Lkfg2NrkVsNb2sFM5aVEfumKB2vYetkA/9Uyc1jVoxLZ0a38sUhFk4JOVKH0aVdPbjZQeA==", + "dev": true, + "optional": true + }, + "@esbuild/linux-s390x": { + "version": "0.17.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.17.tgz", + "integrity": "sha512-lK+SffWIr0XsFf7E0srBjhpkdFVJf3HEgXCwzkm69kNbRar8MhezFpkIwpk0qo2IOQL4JE4mJPJI8AbRPLbuOQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-x64": { + "version": "0.17.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.17.tgz", + "integrity": "sha512-XcSGTQcWFQS2jx3lZtQi7cQmDYLrpLRyz1Ns1DzZCtn898cWfm5Icx/DEWNcTU+T+tyPV89RQtDnI7qL2PObPg==", + "dev": true, + "optional": true + }, + "@esbuild/netbsd-x64": { + "version": "0.17.17", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.17.tgz", + "integrity": "sha512-RNLCDmLP5kCWAJR+ItLM3cHxzXRTe4N00TQyQiimq+lyqVqZWGPAvcyfUBM0isE79eEZhIuGN09rAz8EL5KdLA==", + "dev": true, + "optional": true + }, + "@esbuild/openbsd-x64": { + "version": "0.17.17", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.17.tgz", + "integrity": "sha512-PAXswI5+cQq3Pann7FNdcpSUrhrql3wKjj3gVkmuz6OHhqqYxKvi6GgRBoaHjaG22HV/ZZEgF9TlS+9ftHVigA==", + "dev": true, + "optional": true + }, + "@esbuild/sunos-x64": { + "version": "0.17.17", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.17.tgz", + "integrity": "sha512-V63egsWKnx/4V0FMYkr9NXWrKTB5qFftKGKuZKFIrAkO/7EWLFnbBZNM1CvJ6Sis+XBdPws2YQSHF1Gqf1oj/Q==", + "dev": true, + "optional": true + }, + "@esbuild/win32-arm64": { + "version": "0.17.17", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.17.tgz", + "integrity": "sha512-YtUXLdVnd6YBSYlZODjWzH+KzbaubV0YVd6UxSfoFfa5PtNJNaW+1i+Hcmjpg2nEe0YXUCNF5bkKy1NnBv1y7Q==", + "dev": true, + "optional": true + }, + "@esbuild/win32-ia32": { + "version": "0.17.17", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.17.tgz", + "integrity": "sha512-yczSLRbDdReCO74Yfc5tKG0izzm+lPMYyO1fFTcn0QNwnKmc3K+HdxZWLGKg4pZVte7XVgcFku7TIZNbWEJdeQ==", + "dev": true, + "optional": true + }, + "@esbuild/win32-x64": { + "version": "0.17.17", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.17.tgz", + "integrity": "sha512-FNZw7H3aqhF9OyRQbDDnzUApDXfC1N6fgBhkqEO2jvYCJ+DxMTfZVqg3AX0R1khg1wHTBRD5SdcibSJ+XF6bFg==", + "dev": true, + "optional": true + }, + "@types/node": { + "version": "18.15.12", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.12.tgz", + "integrity": "sha512-Wha1UwsB3CYdqUm2PPzh/1gujGCNtWVUYF0mB00fJFoR4gTyWTDPjSm+zBF787Ahw8vSGgBja90MkgFwvB86Dg==", + "dev": true + }, + "aws-cdk-lib": { + "version": "2.76.0", + "resolved": "https://registry.npmjs.org/aws-cdk-lib/-/aws-cdk-lib-2.76.0.tgz", + "integrity": "sha512-EYWdHh/qJA7v+jD6SeW+BOEChI7oe6IYPHHap+SoJMUrKBVSDKnIGJ8wTP5eV6F27aYaUQiA7rWTKcCWoda8ag==", + "dev": true, + "requires": { + "@aws-cdk/asset-awscli-v1": "^2.2.97", + "@aws-cdk/asset-kubectl-v20": "^2.1.1", + "@aws-cdk/asset-node-proxy-agent-v5": "^2.0.77", + "@balena/dockerignore": "^1.0.2", + "case": "1.6.3", + "fs-extra": "^9.1.0", + "ignore": "^5.2.4", + "jsonschema": "^1.4.1", + "minimatch": "^3.1.2", + "punycode": "^2.3.0", + "semver": "^7.3.8", + "table": "^6.8.1", + "yaml": "1.10.2" + }, + "dependencies": { + "@balena/dockerignore": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "ajv": { + "version": "8.12.0", + "bundled": true, + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "ansi-regex": { + "version": "5.0.1", + "bundled": true, + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "bundled": true, + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "astral-regex": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "at-least-node": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "balanced-match": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "case": { + "version": "1.6.3", + "bundled": true, + "dev": true + }, + "color-convert": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "bundled": true, + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true + }, + "emoji-regex": { + "version": "8.0.0", + "bundled": true, + "dev": true + }, + "fast-deep-equal": { + "version": "3.1.3", + "bundled": true, + "dev": true + }, + "fs-extra": { + "version": "9.1.0", + "bundled": true, + "dev": true, + "requires": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "graceful-fs": { + "version": "4.2.10", + "bundled": true, + "dev": true + }, + "ignore": { + "version": "5.2.4", + "bundled": true, + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "bundled": true, + "dev": true + }, + "json-schema-traverse": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "jsonfile": { + "version": "6.1.0", + "bundled": true, + "dev": true, + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "jsonschema": { + "version": "1.4.1", + "bundled": true, + "dev": true + }, + "lodash.truncate": { + "version": "4.4.2", + "bundled": true, + "dev": true + }, + "lru-cache": { + "version": "6.0.0", + "bundled": true, + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "minimatch": { + "version": "3.1.2", + "bundled": true, + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "punycode": { + "version": "2.3.0", + "bundled": true, + "dev": true + }, + "require-from-string": { + "version": "2.0.2", + "bundled": true, + "dev": true + }, + "semver": { + "version": "7.3.8", + "bundled": true, + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "slice-ansi": { + "version": "4.0.0", + "bundled": true, + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + } + }, + "string-width": { + "version": "4.2.3", + "bundled": true, + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "table": { + "version": "6.8.1", + "bundled": true, + "dev": true, + "requires": { + "ajv": "^8.0.1", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + } + }, + "universalify": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "uri-js": { + "version": "4.4.1", + "bundled": true, + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "yallist": { + "version": "4.0.0", + "bundled": true, + "dev": true + }, + "yaml": { + "version": "1.10.2", + "bundled": true, + "dev": true + } + } + }, + "bowser": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", + "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==", + "dev": true + }, + "cdk-nag": { + "version": "2.26.12", + "resolved": "https://registry.npmjs.org/cdk-nag/-/cdk-nag-2.26.12.tgz", + "integrity": "sha512-SGThrCn3I5fSTt7plN/V/obgMLIzDGWgmp0Bb+v+dAHXLifW32+7WZHYPWzan7lXu20yZKCfwHg6c10XBTWO7w==", + "dev": true, + "requires": {} + }, + "constructs": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/constructs/-/constructs-10.2.1.tgz", + "integrity": "sha512-XJSrPWg3iXHe7a7bk1+Ty+yd4G2xQQP1dKEcOdoaBcCWEHIZMJ8D/J/ogptgJwp0hbJzlZueSab79osa29z5ug==", + "dev": true, + "peer": true + }, + "esbuild": { + "version": "0.17.17", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.17.tgz", + "integrity": "sha512-/jUywtAymR8jR4qsa2RujlAF7Krpt5VWi72Q2yuLD4e/hvtNcFQ0I1j8m/bxq238pf3/0KO5yuXNpuLx8BE1KA==", + "dev": true, + "requires": { + "@esbuild/android-arm": "0.17.17", + "@esbuild/android-arm64": "0.17.17", + "@esbuild/android-x64": "0.17.17", + "@esbuild/darwin-arm64": "0.17.17", + "@esbuild/darwin-x64": "0.17.17", + "@esbuild/freebsd-arm64": "0.17.17", + "@esbuild/freebsd-x64": "0.17.17", + "@esbuild/linux-arm": "0.17.17", + "@esbuild/linux-arm64": "0.17.17", + "@esbuild/linux-ia32": "0.17.17", + "@esbuild/linux-loong64": "0.17.17", + "@esbuild/linux-mips64el": "0.17.17", + "@esbuild/linux-ppc64": "0.17.17", + "@esbuild/linux-riscv64": "0.17.17", + "@esbuild/linux-s390x": "0.17.17", + "@esbuild/linux-x64": "0.17.17", + "@esbuild/netbsd-x64": "0.17.17", + "@esbuild/openbsd-x64": "0.17.17", + "@esbuild/sunos-x64": "0.17.17", + "@esbuild/win32-arm64": "0.17.17", + "@esbuild/win32-ia32": "0.17.17", + "@esbuild/win32-x64": "0.17.17" + } + }, + "fast-xml-parser": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.1.2.tgz", + "integrity": "sha512-CDYeykkle1LiA/uqQyNwYpFbyF6Axec6YapmpUP+/RHWIoR1zKjocdvNaTsxCxZzQ6v9MLXaSYm9Qq0thv0DHg==", + "dev": true, + "requires": { + "strnum": "^1.0.5" + } + }, + "moment": { + "version": "2.29.4", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", + "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==" + }, + "strnum": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", + "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==", + "dev": true + }, + "tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, + "typescript": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "dev": true + }, + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true + } + } +} diff --git a/projects/AmazonLexv2LambdaIntegrationExamples/package.json b/projects/AmazonLexv2LambdaIntegrationExamples/package.json new file mode 100644 index 0000000..1ae1c69 --- /dev/null +++ b/projects/AmazonLexv2LambdaIntegrationExamples/package.json @@ -0,0 +1,36 @@ +{ + "name": "amazon-lex-v2-lambda-integration-examples", + "version": "1.0.0", + "description": "", + "main": "index.js", + "directories": { + "lib": "cdkStacks" + }, + "scripts": { + "build": "tsc", + "watch": "tsc -w", + "cdk": "cdk", + "cdk:nag": "cdk synth --all", + "cdk:bootstrap": "cdk bootstrap --all", + "cdk:deploy:all": "cdk deploy --all", + "cdk:destroy:all": "cdk destroy --all", + "cdk:deploy:basiclambda": "cdk deploy BasicLexLambdaIntegration", + "cdk:destroy:basiclambda": "cdk destroy BasicLexLambdaIntegration", + "cdk:deploy:reminderbot": "cdk deploy ReminderBot", + "cdk:destroy:reminderbot": "cdk destroy ReminderBot" + }, + "devDependencies": { + "@aws-sdk/client-kendra": "^3.316.0", + "@aws-sdk/client-lex-runtime-v2": "^3.316.0", + "@types/node": "^18.15.12", + "aws-cdk-lib": "^2.76.0", + "cdk-nag": "^2.26.12", + "esbuild": "^0.17.17", + "typescript": "^4.9.5" + }, + "author": "", + "license": "ISC", + "dependencies": { + "moment": "^2.29.4" + } +} diff --git a/projects/AmazonLexv2LambdaIntegrationExamples/src/basicPassthroughLexv2Lambda/README.md b/projects/AmazonLexv2LambdaIntegrationExamples/src/basicPassthroughLexv2Lambda/README.md new file mode 100644 index 0000000..f668501 --- /dev/null +++ b/projects/AmazonLexv2LambdaIntegrationExamples/src/basicPassthroughLexv2Lambda/README.md @@ -0,0 +1,66 @@ +# Basic Lambda function with no dialog handling + +## Introduction + +The [basicPassthroughLexv2Lambda](./basicPassthroughLexv2Lambda.ts) does not do any dialog handing, but simply logs out information. It can be attached to any code hook in Lex v2 bots created after August 17, 2022. + +The deployed name will start with _BasicLexLambdaIntegration-BasicPassthroughLexv2Lambda_ + + +### Basic Lambda function description +The Lambda function logs out the full input event and response, but also logs out a list of some of the key information. + +Here is an example of what that might look like for a call to the [Reminder bot](../../bots/ReminderBotFiles) from Amazon Connect. +``` +Lambda invoked with type DialogCodeHook and label CallIntent_InitialCodeHook for ReminderBot version DRAFT and locale en_US + +Calling system sent Speech and expects text/plain; charset=utf-8 to be returned + +Request Attributes are: +- x-amz-lex:accept-content-types passed with value PlainText,SSML +- x-amz-lex:channels:platform passed with value Connect + +User said "can you call me" +Possible alternate transcriptions are: +- "can you call me" with confidence 0.91 +- "can you tell me" with confidence 0.8 +- "can ya call me" with confidence 0.71 + +Current Intent is CallIntent with a state of InProgress +Possible interpretations are: +- CallIntent with NLU confidence 0.62 +- EmailIntent with NLU confidence 0.1 +- FallbackIntent with NLU confidence undefined + +Proposed next action is ElicitSlot + ``` + + +## Prerequisites and Set-up +See overall [README](../../README.md) + +## Deploying + +``` +npm run cdk:deploy:basiclambda +``` + +## Connecting the Lambda function +Follow the instructions here to attach the Lambda function to your bot once deployed: https://docs.aws.amazon.com/lexv2/latest/dg/lambda.html + +There are 3 different types of code hooks you can use +- Fulfillment code hook (inside fulfillment step) +- Standard dialog code hook (between any conversation steps up to fulfillment) +- Elicitation dialog code hook (inside slot capture or confirmation step) + +This Lambda function can be attached to any type of code hook, but will take no action apart from logging out details of the input and output. + + +## Clean-up +To remove all resources created as part of this stack run the below: + +``` +npm run cdk:destroy:basiclambda +``` + +NOTE: You will need to update any bot this was connected to, since they will now be pointing to a Lambda function that has been deleted. diff --git a/projects/AmazonLexv2LambdaIntegrationExamples/src/basicPassthroughLexv2Lambda/basicPassthroughLexv2Lambda.ts b/projects/AmazonLexv2LambdaIntegrationExamples/src/basicPassthroughLexv2Lambda/basicPassthroughLexv2Lambda.ts new file mode 100644 index 0000000..090d6d7 --- /dev/null +++ b/projects/AmazonLexv2LambdaIntegrationExamples/src/basicPassthroughLexv2Lambda/basicPassthroughLexv2Lambda.ts @@ -0,0 +1,17 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: MIT-0 + +import { LexCodeHookInputEvent, LexCodeHookResponse } from "../sharedLibraries/LexCodeHookInterfaces" +const DialogHelpers = require("../sharedLibraries/DialogHelpers") +const CommonUtils = require("../sharedLibraries/CommonUtils") + +exports.handler = async (event: LexCodeHookInputEvent) => { + console.debug("event", JSON.stringify(event, null, 2)) + + CommonUtils.logEventDetails(event) + + const response: LexCodeHookResponse = DialogHelpers.passThrough(event) + + console.debug("response", JSON.stringify(response, null, 2)) + return response +} diff --git a/projects/AmazonLexv2LambdaIntegrationExamples/src/reminderBotLex2Lambda/README.md b/projects/AmazonLexv2LambdaIntegrationExamples/src/reminderBotLex2Lambda/README.md new file mode 100644 index 0000000..e0be5e2 --- /dev/null +++ b/projects/AmazonLexv2LambdaIntegrationExamples/src/reminderBotLex2Lambda/README.md @@ -0,0 +1,49 @@ +# Reminder Lex bot and code hook Lambda function + +## Introduction +This bot shows a simple example of a Reminder bot showing example Lambda function integrations and conditional flows. +It lets the user set up either a reminder call or a reminder email. +It consists of three intents: +- CallIntent +- EmailIntent +- FallbackIntent + +The en-us language in both _TestBotAlias_ and _Prod_ **aliases** are hooked to a Lambda function that when deployed will have a named starting with _ReminderBot-LexFulfillmentLambda_ + +It is non-functional, and simply designed to show how the integration works and let you explore the input and output. + +### CallIntent description +The CallIntent intent consists of the following: +- **Initial response** enabled, with a message and dialog cook hook enabled (_CallIntent_InitialCodeHook_) +- A single **slot** (of type AMAZON.Time), with both elicitation (_CallIntent_TimeSlot_PromptCodeHook_) and validation (_CallIntent_TimeSlot_ValidationCodeHook_) dialog code hooks enabled +- A **fulfillment step** with fulfillment code hook enabled + +### EmailIntent description +The EmailIntent intent consists of the following: +- **Initial response** enabled, with message and dialog cook hook enabled (_CallIntent_InitialCodeHook_) +- A single **slot** (of type AMAZON.Number), with **conditional flows** for validation +- A **fulfillment step** with fulfillment code hook enabled + +### FallbackIntent description +The FallbackIntent consists of the following: +- **Initial response** enabled, with no message and **conditional flow** +- A **fulfillment step** with fulfillment code hook enabled + +### ReminderBot-LexFulfillmentLambda function description +The Lambda function shows how to detect and direct different parts of the conversation. +It does some validation and message adjustment. Most of the functionality simply delegates back to Lex. + +## Prerequisites and Set-up +See overall [README](../../README.md) + +## Deploying + +``` +npm run cdk:deploy:reminderbot +``` + +## Clean-up + +``` +npm run cdk:destroy:reminderBotLambda +``` diff --git a/projects/AmazonLexv2LambdaIntegrationExamples/src/reminderBotLex2Lambda/intentHandlers/callIntentHandler.ts b/projects/AmazonLexv2LambdaIntegrationExamples/src/reminderBotLex2Lambda/intentHandlers/callIntentHandler.ts new file mode 100644 index 0000000..194c9f4 --- /dev/null +++ b/projects/AmazonLexv2LambdaIntegrationExamples/src/reminderBotLex2Lambda/intentHandlers/callIntentHandler.ts @@ -0,0 +1,229 @@ +import { InvocationSource, LexCodeHookInputEvent } from "../../sharedLibraries/LexCodeHookInterfaces" +import { MessageContentType, Value } from "@aws-sdk/client-lex-runtime-v2" +import { IntentNames } from "./constants" + +import moment from "moment" + +const DialogHelpers = require("../../sharedLibraries/DialogHelpers") +const CommonUtils = require("../../sharedLibraries/CommonUtils") + +const TIME_SLOT = "Time" + +const TIME_PERIOD_VALUES = ["AM", "PM", "MO", "AF", "EV", "NI"] +const TIME_PERIOD_SESSION_ATTR = "timeperiod" + +const INITIAL_CODE_HOOK_LABEL = "CallIntent_InitialCodeHook" +const TIME_SLOT_PROMPT_CODE_HOOK_LABEL = "CallIntent_TimeSlot_PromptCodeHook" +const TIME_SLOT_VALIDATION_CODE_HOOK_LABEL = "CallIntent_TimeSlot_ValidationCodeHook" + +export function handler(event: LexCodeHookInputEvent) { + let response = DialogHelpers.passThrough(event) + const intent = event.sessionState.intent + + // @ts-ignore intent will never be undefined in the Intent Handler + if (intent.name !== IntentNames.CALL_INTENT) { + console.error(`Wrong handler for intent called, current intent is ${intent}`) + // Decide how you would like to handle this with the least disruption to your user + return response + } + + /** + * Determine the correct logic to run based on what code hook the request has come from + */ + if (event.invocationSource === InvocationSource.DIALOG_CODE_HOOK) { + if (event.invocationLabel === INITIAL_CODE_HOOK_LABEL) { + // Check if we already captured an ambiguous Time Slot value at this point, + // so we can adjust the prompt if needed + response = checkForAmbiguousTimeSlotValue(event) + } else if (event.invocationLabel === TIME_SLOT_PROMPT_CODE_HOOK_LABEL) { + // Check the user input, so we can adjust the prompt for ambiguous or time period values + response = checkUserInput(event) + } else if (event.invocationLabel === TIME_SLOT_VALIDATION_CODE_HOOK_LABEL) { + // final validation on slot + response = validateTimeSlot(event) + } + } else if (event.invocationSource === InvocationSource.FULFILLMENT_CODE_HOOK) { + // book the call + response = fulfillIntent(event) + } + + return response +} + +/** + * For Fulfillment, we will take action on book the call and then send a + * response with State of Fulfilled and a DialogAction of CLOSE + */ +const fulfillIntent = (event: LexCodeHookInputEvent) => { + //clear the time period session attribute + event.sessionState.sessionAttributes[TIME_PERIOD_SESSION_ATTR] = "" + + // **************************** + // ADD LOGIC HERE TO ACTUALLY BOOK THE CALL .... + // + // IN THE REAL WORLD WE WOULD BE REACHING OUT TO EXTERNAL SYSTEMS HERE + // FOR NOW WE'RE JUST GOING TO RESPOND AS IF WE DID BOOK THE CALL + // ***************************** + + const humanFriendlyTime = moment(CommonUtils.getSessionStateSlotValue(event, TIME_SLOT).interpretedValue, [ + "HH:mm", + ]).format("h:mm A") + + return DialogHelpers.fulfillIntent(event.sessionState, event.requestAttributes || {}, [ + { + contentType: MessageContentType.PLAIN_TEXT, + content: `Your call has been scheduled for ${humanFriendlyTime}`, + }, + ]) +} + +/** + * After we collect the slot value we want to + * - check it has been filled with a time and not a time period (in which case we would return to ElicitSlot) + * - if it is a valid time we return control to Lex to move to the next step + * @param event + */ +const validateTimeSlot = (event: LexCodeHookInputEvent) => { + const timeSlotValue = CommonUtils.getSessionStateSlotValue(event, TIME_SLOT) + + // Validate that the interpretedValue isn't a time period + // (if value was collected at ElicitIntent the CallIntent_TimeSlot_PromptCodeHook will have been skipped) + if (isTimePeriod(timeSlotValue.interpretedValue)) { + return askForSpecificTimeWithinTimePeriod(timeSlotValue.interpretedValue, event) + } else { + // **************************** + // LOGIC COULD BE ADDED HERE TO CHECK THIS TIME IS AVAILABLE BY REACHING OUT TO OUR BOOKING SYSTEM + // THIS WOULD ALLOW US TO RE-PROMPT THE USER FOR A NEW TIME IF NEEDED + // **************************** + + //If we have a valid time, pass through to next step + return DialogHelpers.passThrough(event) + } +} +/** + * On each elicitation within the Time Slot we will do the following: + * - If the slot is filled (has interpretedValue) we will check it is a valid time value + * - If not we will ask the user to clarify + * - Else we will just delegate back to Lex + * - If the slot is NOT filled we will check if there is more than one resolved value + * - If there is more than one, we will use those to ask the user to clarify with one + * - Else we will just delegate back to Lex + */ +const checkUserInput = (event: LexCodeHookInputEvent) => { + const timeSlotValue = CommonUtils.getSessionStateSlotValue(event, TIME_SLOT) + + // check it isn't a time period rather than a specific time + if (isTimePeriod(timeSlotValue.interpretedValue)) { + // if it is, ask for clarification + return askForSpecificTimeWithinTimePeriod(timeSlotValue.interpretedValue, event) + } + // otherwise check if there are potential values listed + else { + return checkForAmbiguousTimeSlotValue(event) + } +} + +const isAmbiguousSlotValue = (slot: Value) => { + return slot && slot.resolvedValues && slot.resolvedValues.length > 1 +} + +const checkForAmbiguousTimeSlotValue = (event: LexCodeHookInputEvent) => { + const timeSlotValue = CommonUtils.getSessionStateSlotValue(event, TIME_SLOT) + if (isAmbiguousSlotValue(timeSlotValue)) { + return disambiguateValues(event, timeSlotValue.resolvedValues) + } else { + return DialogHelpers.passThrough(event) + } +} + +const isTimePeriod = (interpretedValue: string) => { + return interpretedValue && interpretedValue !== "" && TIME_PERIOD_VALUES.includes(interpretedValue) +} + +const disambiguateValues = (event: LexCodeHookInputEvent, resolvedValues: string[]) => { + let disambiguatedValue = resolveTimeFromTimePeriod(event, resolvedValues) + if (disambiguatedValue !== "") { + // If we resolved a value, set the slot to the matched value before we pass back to Lex to handle the next step + // @ts-ignore - to have reached this point this will have to exist so not adding null checks + event.sessionState.intent.slots[TIME_SLOT].value.interpretedValue = disambiguatedValue + return DialogHelpers.passThrough(event) + } else { + // If we haven't resolved a value, ask the user for clarification + return askForTimeClarification(resolvedValues, event) + } +} + +const resolveTimeFromTimePeriod = (event: LexCodeHookInputEvent, resolvedValues: string[]) => { + let disambiguatedTime = "" + + // check if the user already indicated a time period, if they haven't, we can return an empty string + const timePeriod = event.sessionState.sessionAttributes[TIME_PERIOD_SESSION_ATTR] + if (timePeriod && timePeriod != "") { + // Try to match a resolved time with the time period the user has given + resolvedValues.forEach((resolvedValue) => { + if (["MO", "AM"].includes(timePeriod) && resolvedValue >= "00:00" && resolvedValue <= "12:00") { + disambiguatedTime = resolvedValue + } else if (["AF", "PM"].includes(timePeriod) && resolvedValue >= "12:00" && resolvedValue <= "18:00") { + disambiguatedTime = resolvedValue + } else if (["EV", "NI", "PM"].includes(timePeriod) && resolvedValue >= "18:00" && resolvedValue <= "23:59") { + disambiguatedTime = resolvedValue + } + }) + } + return disambiguatedTime +} + +const askForTimeClarification = (resolvedValues: string[], event: LexCodeHookInputEvent) => { + // map in a human friendly version of the times + resolvedValues = resolvedValues.map((value) => moment(value, ["HH:mm"]).format("h:mm A")) + + // concatenate the resolved values with 'or' between them + const resolvedValuesString = resolvedValues.join(" or ") + + // set the next step to a re-prompt for the slot + return DialogHelpers.promptForSlot( + event.sessionState, + event.requestAttributes || {}, + TIME_SLOT, + event.sessionState.intent, + [ + { + contentType: MessageContentType.PLAIN_TEXT, + content: `Would you like ${resolvedValuesString}?`, + }, + ] + ) +} + +const askForSpecificTimeWithinTimePeriod = (value: string, event: LexCodeHookInputEvent) => { + // map of values to human-friendly ones + const timePeriodMapping: { [index: string]: string } = { + AM: "morning", + PM: "evening", + MO: "morning", + AF: "afternoon", + EV: "evening", + NI: "evening", + } + + // add value to session, so we can use it for future disambiguation if needed + event.sessionState.sessionAttributes[TIME_PERIOD_SESSION_ATTR] = CommonUtils.getSessionStateSlotValue( + event, + TIME_SLOT + ).interpretedValue + + // add human-friendly value into message, or default to day if the value can't be mapped + const message = { + contentType: MessageContentType.PLAIN_TEXT, + content: `What time in the ${timePeriodMapping[value] || "day"} would you like?`, + } + + // set the next step to a re-prompt for the slot + return DialogHelpers.promptForSlot( + event.sessionState, + event.requestAttributes || {}, + TIME_SLOT, + event.sessionState.intent, + [message] + ) +} diff --git a/projects/AmazonLexv2LambdaIntegrationExamples/src/reminderBotLex2Lambda/intentHandlers/constants.ts b/projects/AmazonLexv2LambdaIntegrationExamples/src/reminderBotLex2Lambda/intentHandlers/constants.ts new file mode 100644 index 0000000..d9b3550 --- /dev/null +++ b/projects/AmazonLexv2LambdaIntegrationExamples/src/reminderBotLex2Lambda/intentHandlers/constants.ts @@ -0,0 +1,8 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: MIT-0 + +export const enum IntentNames { + CALL_INTENT = "CallIntent", + EMAIL_INTENT = "EmailIntent", + FALLBACK_INTENT = "FallbackIntent", +} diff --git a/projects/AmazonLexv2LambdaIntegrationExamples/src/reminderBotLex2Lambda/intentHandlers/emailIntentHandler.ts b/projects/AmazonLexv2LambdaIntegrationExamples/src/reminderBotLex2Lambda/intentHandlers/emailIntentHandler.ts new file mode 100644 index 0000000..f067204 --- /dev/null +++ b/projects/AmazonLexv2LambdaIntegrationExamples/src/reminderBotLex2Lambda/intentHandlers/emailIntentHandler.ts @@ -0,0 +1,37 @@ +import { LexCodeHookInputEvent, InvocationSource } from "../../sharedLibraries/LexCodeHookInterfaces" +import { IntentNames } from "./constants" +const DialogHelpers = require("../../sharedLibraries/DialogHelpers") + +const DAYS_BEFORE_SLOT = "DaysBefore" + +const INITIAL_CODE_HOOK_LABEL = "EmailIntent_InitialCodeHook" +const DAYS_BEFORE_SLOT_PROMPT_CODE_HOOK_LABEL = "EmailIntent_DaysBeforeSlot_PromptCodeHook" +const DAYS_BEFORE_VALIDATION_CODE_HOOK_LABEL = "EmailIntent_DaysBeforeSlot_ValidationCodeHook" + +export function handler(event: LexCodeHookInputEvent) { + let response = DialogHelpers.passThrough(event) + const intent = event.sessionState.intent + + // @ts-ignore intent will never be undefined in the Intent Handler + if (intent.name !== IntentNames.EMAIL_INTENT) { + console.error(`Wrong handler for intent called, current intent is ${intent}`) + // Decide how you would like to handle this with the least disruption to your user + return response + } + + if (event.invocationSource === InvocationSource.DIALOG_CODE_HOOK) { + if (event.invocationLabel == INITIAL_CODE_HOOK_LABEL) { + response = DialogHelpers.passThrough(event) + } else if (event.invocationLabel == DAYS_BEFORE_SLOT_PROMPT_CODE_HOOK_LABEL) { + response = DialogHelpers.passThrough(event) + } else if (event.invocationLabel == DAYS_BEFORE_VALIDATION_CODE_HOOK_LABEL) { + response = DialogHelpers.passThrough(event) + } else { + response = DialogHelpers.passThrough(event) + } + } else if (event.invocationSource === InvocationSource.FULFILLMENT_CODE_HOOK) { + response = DialogHelpers.passThrough(event) + } + + return response +} diff --git a/projects/AmazonLexv2LambdaIntegrationExamples/src/reminderBotLex2Lambda/reminderBotLambda.ts b/projects/AmazonLexv2LambdaIntegrationExamples/src/reminderBotLex2Lambda/reminderBotLambda.ts new file mode 100644 index 0000000..9781564 --- /dev/null +++ b/projects/AmazonLexv2LambdaIntegrationExamples/src/reminderBotLex2Lambda/reminderBotLambda.ts @@ -0,0 +1,29 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: MIT-0 + +import { LexCodeHookInputEvent } from "../sharedLibraries/LexCodeHookInterfaces" +import { IntentNames } from "./intentHandlers/constants" +const DialogHelpers = require("../sharedLibraries/DialogHelpers") +const CommonUtils = require("../sharedLibraries/CommonUtils") +import * as emailIntentHandler from "./intentHandlers/emailIntentHandler" +import * as callIntentHandler from "./intentHandlers/callIntentHandler" + +exports.handler = async (event: LexCodeHookInputEvent) => { + console.debug("event", JSON.stringify(event, null, 2)) + + CommonUtils.logEventDetails(event) + + let response = DialogHelpers.passThrough(event) + const sessionStateIntentName = event.sessionState.intent?.name || "" + + if (sessionStateIntentName === IntentNames.CALL_INTENT) { + console.debug("Handling call intent") + response = callIntentHandler.handler(event) + } else if (sessionStateIntentName === IntentNames.EMAIL_INTENT) { + console.debug("Handling email intent") + response = emailIntentHandler.handler(event) + } + + console.debug("response", JSON.stringify(response, null, 2)) + return response +} diff --git a/projects/AmazonLexv2LambdaIntegrationExamples/src/sharedLibraries/CommonUtils.ts b/projects/AmazonLexv2LambdaIntegrationExamples/src/sharedLibraries/CommonUtils.ts new file mode 100644 index 0000000..59c7e30 --- /dev/null +++ b/projects/AmazonLexv2LambdaIntegrationExamples/src/sharedLibraries/CommonUtils.ts @@ -0,0 +1,62 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: MIT-0 + +import { InvocationSource, LexCodeHookInputEvent } from "./LexCodeHookInterfaces" +import { Value } from "@aws-sdk/client-lex-runtime-v2" + +const logEventDetails = (event: LexCodeHookInputEvent) => { + console.log( + `Lambda invoked with type ${event.invocationSource} and label ${event.invocationLabel} for ${event.bot.name} version ${event.bot.version} and locale ${event.bot.localeId}` + ) + console.log(`Calling system sent ${event.inputMode} and expects ${event.responseContentType} to be returned`) + + if (event.requestAttributes) { + console.log("Request Attributes are:") + for (const key in event.requestAttributes) { + console.log(`- ${key} passed with value ${event.requestAttributes[key]}`) + } + } else { + console.log("No Request Attributes passed") + } + + console.log(`User said "${event.inputTranscript}"`) + if (event.transcriptions) { + console.log("Possible alternate transcriptions are:") + for (const transcription of event.transcriptions || []) { + console.log(`- "${transcription.transcription}" with confidence ${transcription.transcriptionConfidence}`) + } + } else { + console.log("No other alternate transcriptions are listed") + } + + const currentIntent = event.sessionState.intent + console.log(`Current Intent is ${currentIntent?.name} with a state of ${currentIntent?.state}`) + + console.log("Possible interpretations are:") + for (const interpretation of event.interpretations) { + console.log(`- ${interpretation.intent?.name} with NLU confidence ${interpretation.nluConfidence}`) + } + + if (event.invocationSource === InvocationSource.DIALOG_CODE_HOOK) { + const { proposedNextState } = event + console.log(`Proposed next action is ${proposedNextState?.dialogAction.type}`) + } +} + +const getSessionStateSlotValue = (event: LexCodeHookInputEvent, slotName: string): Value => { + const emptySlotValue: Value = { + originalValue: "", + resolvedValues: [], + interpretedValue: "", + } + let slotValue = emptySlotValue + if (event.sessionState.intent?.slots && event.sessionState.intent.slots?.[slotName]) { + slotValue = event.sessionState.intent.slots?.[slotName].value || emptySlotValue + } + return slotValue +} + +module.exports = { + logEventDetails, + getSessionStateSlotValue, +} diff --git a/projects/AmazonLexv2LambdaIntegrationExamples/src/sharedLibraries/DialogHelpers.ts b/projects/AmazonLexv2LambdaIntegrationExamples/src/sharedLibraries/DialogHelpers.ts new file mode 100644 index 0000000..6836db6 --- /dev/null +++ b/projects/AmazonLexv2LambdaIntegrationExamples/src/sharedLibraries/DialogHelpers.ts @@ -0,0 +1,157 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: MIT-0 + +import { + LexCodeHookInputEvent, + LexCodeHookResponse, + LambdaCodeHookSessionState, + Attributes, + LambdaCodeHookSessionStateIntent, +} from "./LexCodeHookInterfaces" +import { DialogActionType, Message, IntentState } from "@aws-sdk/client-lex-runtime-v2" + +const delegate = (sessionState: LambdaCodeHookSessionState, requestAttributes?: Attributes, messages?: Message[]) => { + // Ensure session state dialog action is set to Delegate, pass everything else in as-is + sessionState.dialogAction = { + type: DialogActionType.DELEGATE, + } + const response: LexCodeHookResponse = { + sessionState: sessionState, + requestAttributes: requestAttributes, + messages: messages, + } + + return response +} + +const passThrough = (event: LexCodeHookInputEvent) => { + return delegate(event.sessionState, event.requestAttributes) +} + +const fulfillIntent = ( + sessionState: LambdaCodeHookSessionState, + requestAttributes: Attributes, + messages?: Message[] +) => { + //Note that Delegate doesn't take the passed in message and will just use the one set in the configuration + let fulfilledSessionState = updateSessionState(sessionState, IntentState.FULFILLED, DialogActionType.CLOSE) + + const response: LexCodeHookResponse = { + sessionState: fulfilledSessionState, + messages: messages, + requestAttributes: requestAttributes, + } + + return response +} + +const endConversation = (event: LexCodeHookInputEvent, messages?: Message[]) => { + // This indicates a successful completion of the conversation, + // if this is not the case the state should be set to "Failed" + let sessionState = updateSessionState(event.sessionState, IntentState.FULFILLED, DialogActionType.CLOSE) + + const response: LexCodeHookResponse = { + sessionState: sessionState, + messages: messages, + requestAttributes: event.requestAttributes, + } + + return response +} + +const promptForNewIntent = (event: LexCodeHookInputEvent, messages?: Message[]) => { + let sessionState = event.sessionState + delete sessionState.intent + + const response: LexCodeHookResponse = { + sessionState: sessionState, + messages: messages, + requestAttributes: event.requestAttributes, + } + response.sessionState.dialogAction = { + type: DialogActionType.ELICIT_INTENT, + } + + return response +} + +const promptForConfirmationOfIntent = ( + sessionState: LambdaCodeHookSessionState, + requestAttributes: Attributes, + intent: LambdaCodeHookSessionStateIntent, + messages: Message[] +) => { + const response = { + sessionState: sessionState, + messages: messages, + requestAttributes: requestAttributes, + } as LexCodeHookResponse + + response.sessionState.dialogAction = { + type: DialogActionType.CONFIRM_INTENT, + } + + intent.state = IntentState.IN_PROGRESS + response.sessionState.intent = intent + + return response +} + +const promptForSlot = ( + sessionState: LambdaCodeHookSessionState, + requestAttributes: Attributes, + slotToElicit: string, + intent: LambdaCodeHookSessionStateIntent, + messages: Message[] +) => { + const response = { + sessionState: sessionState, + messages: messages, + requestAttributes: requestAttributes, + } as LexCodeHookResponse + + response.sessionState.dialogAction = { + type: DialogActionType.ELICIT_SLOT, + slotToElicit: slotToElicit, + } + + intent.state = IntentState.IN_PROGRESS + response.sessionState.intent = intent + + return response +} + +const updateSessionState = ( + currentState: LambdaCodeHookSessionState, + newIntentState: IntentState, + newDialogActionType: DialogActionType +) => { + let sessionState = currentState + sessionState.intent + ? (sessionState.intent.state = newIntentState) + : (sessionState.intent = { + name: "", + state: newIntentState, + }) + + sessionState.dialogAction = { + type: newDialogActionType, + } + + return sessionState +} + +module.exports = { + confirmIntent: promptForConfirmationOfIntent, + delegate, + endConversation, + elicitIntent: promptForNewIntent, + elicitSlot: promptForSlot, + fulfillIntent, + funRun: passThrough, + passThrough, + promptForConfirmationOfIntent, + promptForNewIntent, + promptForSlot, + waitForUserInput: promptForNewIntent, +} diff --git a/projects/AmazonLexv2LambdaIntegrationExamples/src/sharedLibraries/LexCodeHookInterfaces.ts b/projects/AmazonLexv2LambdaIntegrationExamples/src/sharedLibraries/LexCodeHookInterfaces.ts new file mode 100644 index 0000000..87c4960 --- /dev/null +++ b/projects/AmazonLexv2LambdaIntegrationExamples/src/sharedLibraries/LexCodeHookInterfaces.ts @@ -0,0 +1,266 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: MIT-0 + +import { DialogAction, Intent, Message, SessionState, Slot, SentimentResponse } from "@aws-sdk/client-lex-runtime-v2" +import { QueryResult } from "@aws-sdk/client-kendra" + +export interface LexCodeHookResponse { + /** + * The current state of the conversation with the user. + * + * The actual contents of the structure depends on the type of dialog action. + */ + sessionState: LambdaCodeHookSessionState + + /** + * One or more messages that Amazon Lex V2 shows to the customer to perform the next turn of the conversation. + * If you don't supply messages, Amazon Lex V2 uses the appropriate message defined when the bot was created + * + * Required if dialogAction.type is ElicitIntent. + */ + messages?: Message[] + + /** + * Request-specific attributes + */ + requestAttributes?: Attributes +} + +/** + * Note that per the docs https://docs.aws.amazon.com/lexv2/latest/dg/lambda.html the input format may change + * without a corresponding change to the messageVersion + * + * If this happens this interface will need updated, it is designed as a guide to allow you more easily understand + * and create code that can use this event and not as official documentation. + */ +export interface LexCodeHookInputEvent { + /** + * The version of the message that identifies the format of the event data going into the Lambda function + * and the expected format of the response from a Lambda function. + * In the current implementation, only message version 1.0 is supported. + * + * You configure this value when you define an intent, in the Console this defaulted to 1.0 and doesn't show onscreen. + */ + messageVersion: "1.0" | string + + /** + * Session identifier used for the conversation. + */ + sessionId: string + + /** + * The action that called the Lambda function. + * + * When the source is DialogCodeHook, the Lambda function was called after input from the user. + * + * When the source is FulfillmentCodeHook the Lambda function was called after all required slots have been + * filled and the intent is ready for fulfillment. + */ + invocationSource: InvocationSource + + /** + * A value that indicates the specific Dialog code hook that invoked the Lambda function + * within the initial response, slots, or confirmation response. These labels are set when creating the Intent and are optional. + * + * Maximum 100 characters. Valid characters: A-Z, a-z, 0-9, -, _ + */ + invocationLabel?: string + + /** + * The mode of the user utterance (text, speech, DTMF) + */ + inputMode: InputMode + + /** + * The mode the bot will use for the response (text or speech) + * If the value is text/plain;charset=utf-8, Amazon Lex V2 returns text in the response. + * If the value begins with audio/, Amazon Lex V2 returns speech in the response. + * Amazon Lex V2 uses Amazon Polly to generate the speech using the configuration that you specified in the responseContentType parameter. + * The following are the accepted values: audio/mpeg, audio/ogg, audio/pcm (16 KHz), audio/* (defaults to mpeg), text/plain; charset=utf-8 + */ + responseContentType: string + + /** + * The text that was used to process the input from the user. + * + * For text or DTMF input, this is the text that the user typed. + * For speech input, this is the text that was recognized from the speech. + */ + inputTranscript: string + rawInputTranscript?: string + + /** + * One or more transcriptions that Amazon Lex V2 considers possible matches to the user's audio utterance. + * + * Alternate transcriptions are only supported for 8 kHz audio input, and this object will not appear on other + * forms of audio, though will appear on text inputs and show a single transcription with a confidence of 1. + * + * See https://docs.aws.amazon.com/lexv2/latest/dg/using-transcript-confidence-scores.html + */ + transcriptions?: Transcription[] + + /** + * Information about the bot that processed the request + */ + bot: Bot + + /** + * One or more intents that Amazon Lex V2 considers possible matches to the user's utterance ordered by confidence. + * + * The Interpretation object differs from the API_runtime_Interpretation because of the format of the nluConfidence property. + */ + interpretations: LambdaCodeHookInterpretation[] + + /** + * The next state of the dialog between the user and the bot if the Lambda function sets the dialogAction of the sessionState to Delegate. + * + * If you override the dialog behavior in sessionState the next state depends on the settings that you return from your Lambda function and not + * the state proposed + * + * This structure is only present when the invocationSource field is DialogCodeHook and when the proposed dialog action is ElicitSlot, + * and can be used to add in Runtime Hints at the right point in the conversation. + */ + proposedNextState?: ProposedNextState + + /** + * Request-specific attributes that the client sends in the request. + * + * Request attributes should be used to pass information that doesn't need to persist for the entire session. + */ + requestAttributes?: Attributes + + /** + * The current state of the conversation between the user and your Amazon Lex V2 bot + */ + sessionState: LambdaCodeHookSessionState +} + +/** + * Map of key/value pairs + */ +export type Attributes = Record + +/** + * The Lambda function event Session state differs from the API_runtime_SessionState + * because of the format of the Intent + */ +export interface LambdaCodeHookSessionState extends SessionState { + sessionAttributes: Attributes + intent?: LambdaCodeHookSessionStateIntent +} + +/** + * The Lambda function event Intent state differs from the API_runtime_Intent + * because it can optionally include the kendraResponse when the intent is KendraSearchIntent + */ +export interface LambdaCodeHookSessionStateIntent extends Intent { + kendraResponse?: QueryResult +} + +export interface Transcription { + transcription: string + transcriptionConfidence: number + resolvedContext: { + intent: string + } + resolvedSlots: Record +} + +/** + * The predicted next state of the dialog between the user and the bot if the Lambda function sets the dialogAction of the sessionState to Delegate. + * + * If you override the dialog behavior in sessionState, the next state depends on the settings that you return from your Lambda function. + * + * You can use the information to modify your Lambda function's behavior based on what Amazon Lex V2 proposes as the next action. + */ +export interface ProposedNextState { + dialogAction: DialogAction + intent: Intent + + /** + * Indicates the number of times this slot has been prompted for in this session + * + * You can set the maximum number of consecutive retries when creating the Slot (up to 5). + */ + prompt: { + attempt?: PromptAttempt | string + } +} + +/** + * The Interpretation object differs from the API_runtime_Interpretation only because of the format of the nluConfidence property. + */ +export interface LambdaCodeHookInterpretation { + /** + * A score that indicates the confidence that Amazon Lex V2 has that an intent is the one that satisfies the user's intent. + * + * This differs from the nluConfidence in the API_runtime_Interpretation because this just returns a number and not an API_runtime_ConfidenceScore object + */ + nluConfidence?: number + + /** + * Provides information about the sentiment expressed in a user's response in a conversation. Sentiments are determined using Amazon Comprehend. + * + * Sentiments are only returned if they are enabled for the bot. + */ + sentimentResponse?: SentimentResponse + + /** + * List of intents that might satisfy the user's utterance. The intents are ordered by the confidence score. + */ + intent?: Intent +} + +export interface Bot { + /** + * The identifier assigned to the bot when you created it. + * You can see the bot ID in the Amazon Lex V2 console on the bot Settings page. + */ + id: string + + /** + * The name that you gave the bot when you created it. + */ + name: string + + /** + * The identifier assigned to the bot alias when you created it. You can see the bot alias ID in the Amazon Lex V2 console on the Aliases page. + * If you can't see the alias ID in the list, choose the gear icon on the upper right and turn on Alias ID. + */ + aliasId: string + + /** + * The name you gave the bot alias when you created it. + */ + aliasName: string + + /** + * The identifier of the locale that you used for your bot. For a list of locales, see Languages and locales supported by Amazon Lex V2.* + */ + localeId: string + + /** + * The version of the bot that processed the request. + */ + version: string +} + +export const enum PromptAttempt { + INITIAL = "Initial", + RETRY_1 = "Retry1", + RETRY_2 = "Retry2", + RETRY_3 = "Retry3", + RETRY_4 = "Retry4", + RETRY_5 = "Retry5", +} + +export const enum InvocationSource { + DIALOG_CODE_HOOK = "DialogCodeHook", + FULFILLMENT_CODE_HOOK = "FulfillmentCodeHook", +} + +export const enum InputMode { + DTMF = "DTMF", + SPEECH = "Speech", + TEXT = "Text", +} diff --git a/projects/AmazonLexv2LambdaIntegrationExamples/tsconfig.json b/projects/AmazonLexv2LambdaIntegrationExamples/tsconfig.json new file mode 100644 index 0000000..2100124 --- /dev/null +++ b/projects/AmazonLexv2LambdaIntegrationExamples/tsconfig.json @@ -0,0 +1,24 @@ +{ + "compilerOptions": { + "target": "es2020", + "module": "commonjs", + "lib": ["es2020", "dom"], + "declaration": true, + "strict": true, + "noImplicitAny": true, + "strictNullChecks": true, + "noImplicitThis": true, + "alwaysStrict": true, + "noUnusedLocals": false, + "noUnusedParameters": false, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": false, + "inlineSourceMap": true, + "inlineSources": true, + "experimentalDecorators": true, + "strictPropertyInitialization": false, + "esModuleInterop": true, + "typeRoots": ["./node_modules/@types"] + }, + "exclude": ["node_modules", "cdk.out"] +} diff --git a/tools/CCPLogParser/package-lock.json b/tools/CCPLogParser/package-lock.json index f904260..10e51c6 100644 --- a/tools/CCPLogParser/package-lock.json +++ b/tools/CCPLogParser/package-lock.json @@ -27096,6 +27096,39 @@ } } }, + "d3-geo": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-1.12.1.tgz", + "integrity": "sha512-XG4d1c/UJSEX9NfU02KwBL6BYPj8YKHxgBEw5om2ZnTRSbIcego6dhHwcxuSR3clxh0EpE38os1DVPOmnYtTPg==", + "requires": { + "d3-array": "1" + }, + "dependencies": { + "d3-array": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz", + "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==" + } + } + }, + "d3-geo-projection": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/d3-geo-projection/-/d3-geo-projection-2.9.0.tgz", + "integrity": "sha512-ZULvK/zBn87of5rWAfFMc9mJOipeSo57O+BBitsKIXmU4rTVAnX1kSsJkE0R+TxY8pGNoM1nbyRRE7GYHhdOEQ==", + "requires": { + "commander": "2", + "d3-array": "1", + "d3-geo": "^1.12.0", + "resolve": "^1.1.10" + }, + "dependencies": { + "d3-array": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz", + "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==" + } + } + }, "d3-hierarchy": { "version": "1.1.9", "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-1.1.9.tgz",