From 35a3b3667c1f468b97e6a20271880f1c2e106e3a Mon Sep 17 00:00:00 2001 From: Tom Richards Date: Thu, 9 Nov 2023 09:54:59 +0000 Subject: [PATCH] WIP add `ChatBot` support --- bootstrapping-lambda/src/server.ts | 6 + cdk/lib/__snapshots__/stack.test.ts.snap | 63 +- cdk/lib/stack.ts | 9 +- client/gql.ts | 9 + client/src/avatarRoundel.tsx | 44 +- client/src/itemDisplay.tsx | 3 +- client/src/itemInputBox.tsx | 75 +- client/src/mentionsUtil.tsx | 16 +- client/src/nestedItemDisplay.tsx | 2 +- client/src/seenBy.tsx | 2 +- client/src/sendMessageArea.tsx | 37 +- client/src/tour/tourMessageReplies.ts | 1 + client/src/tour/tourState.tsx | 2 + database-bridge-lambda/package.json | 2 + .../src/services/chatBotBroker.ts | 92 ++ database-bridge-lambda/src/sql/Item.ts | 46 +- database-bridge-lambda/src/sql/User.ts | 39 +- notifications-lambda/run.ts | 1 + shared/awsIntegration.ts | 2 +- shared/database/local/runDatabaseSetup.ts | 2 + ...20-AddChatBotMentionsColumnToItemTable.sql | 2 + shared/graphql/extraTypes.ts | 23 +- shared/graphql/schema.graphql | 16 +- yarn.lock | 915 +++++++++++++++++- 24 files changed, 1291 insertions(+), 118 deletions(-) create mode 100644 database-bridge-lambda/src/services/chatBotBroker.ts create mode 100644 shared/database/local/setup/020-AddChatBotMentionsColumnToItemTable.sql diff --git a/bootstrapping-lambda/src/server.ts b/bootstrapping-lambda/src/server.ts index 45311225..9ec9992c 100644 --- a/bootstrapping-lambda/src/server.ts +++ b/bootstrapping-lambda/src/server.ts @@ -44,6 +44,12 @@ const corsOptions: cors.CorsOptions = { server.use(express.json()); server.use(cors(corsOptions)); +server.post("/bot/:pinboardId/:replyToItemId", (request, response) => { + //TODO check request for valid auth token + //TODO build CreateItemInput, + // TODO make http request to appsync endpoint using token from request (or possibly new token) +}); + server.post("/search", getAuthMiddleware(), (_, response) => { response.setHeader("Access-Control-Allow-Credentials", "true"); return response.json(Object.values(StageMetric)); diff --git a/cdk/lib/__snapshots__/stack.test.ts.snap b/cdk/lib/__snapshots__/stack.test.ts.snap index 5e58d1dc..0bb236ac 100644 --- a/cdk/lib/__snapshots__/stack.test.ts.snap +++ b/cdk/lib/__snapshots__/stack.test.ts.snap @@ -2275,7 +2275,7 @@ type Query { listItems(pinboardId: String!): [Item] listLastItemSeenByUsers(pinboardId: String!): [LastItemSeenByUser] getMyUser: MyUser - searchMentionableUsers(prefix: String!): UsersAndGroups + searchMentionableUsers(prefix: String!): UsersGroupsAndChatBots getUsers(emails: [String!]!): [User] getGroupPinboardIds: [PinboardIdWithClaimCounts!]! getItemCounts(pinboardIds: [String!]!): [PinboardIdWithItemCounts!]! @@ -2320,7 +2320,8 @@ type Subscription { type MentionHandle { label: String! - isMe: Boolean! + isMe: Boolean + isBot: Boolean } type Item { @@ -2333,6 +2334,7 @@ type Item { pinboardId: String! mentions: [MentionHandle!] groupMentions: [MentionHandle!] + chatBotMentions: [MentionHandle!] claimedByEmail: String claimable: Boolean! relatedItemId: String @@ -2370,9 +2372,16 @@ type Group { memberEmails: [String!]! } -type UsersAndGroups { +type ChatBot { + shorthand: String! + description: String! + avatarUrl: String +} + +type UsersGroupsAndChatBots { users: [User!]! groups: [Group!]! + chatBots: [ChatBot!]! } type WorkflowStub { @@ -2410,6 +2419,7 @@ input CreateItemInput { pinboardId: String! mentions: [String!] groupMentions: [String!] + chatBotMentions: [String!] claimable: Boolean relatedItemId: String } @@ -2492,7 +2502,7 @@ type PinboardIdWithItemCounts { "DataSourceName": "database_bridge_lambda_ds", "FieldName": "addManuallyOpenedPinboardIds", "Kind": "UNIT", - "ResponseMappingTemplate": "## schema checksum : aa02bae16942e48366fa36a1cd643d16 + "ResponseMappingTemplate": "## schema checksum : 51a0add4d309eaf60c5fce1924e07115 $util.toJson($ctx.result)", "TypeName": "Mutation", }, @@ -2513,7 +2523,7 @@ $util.toJson($ctx.result)", "DataSourceName": "database_bridge_lambda_ds", "FieldName": "claimItem", "Kind": "UNIT", - "ResponseMappingTemplate": "## schema checksum : aa02bae16942e48366fa36a1cd643d16 + "ResponseMappingTemplate": "## schema checksum : 51a0add4d309eaf60c5fce1924e07115 $util.toJson($ctx.result)", "TypeName": "Mutation", }, @@ -2534,7 +2544,7 @@ $util.toJson($ctx.result)", "DataSourceName": "database_bridge_lambda_ds", "FieldName": "createItem", "Kind": "UNIT", - "ResponseMappingTemplate": "## schema checksum : aa02bae16942e48366fa36a1cd643d16 + "ResponseMappingTemplate": "## schema checksum : 51a0add4d309eaf60c5fce1924e07115 $util.toJson($ctx.result)", "TypeName": "Mutation", }, @@ -2555,7 +2565,7 @@ $util.toJson($ctx.result)", "DataSourceName": "database_bridge_lambda_ds", "FieldName": "deleteItem", "Kind": "UNIT", - "ResponseMappingTemplate": "## schema checksum : aa02bae16942e48366fa36a1cd643d16 + "ResponseMappingTemplate": "## schema checksum : 51a0add4d309eaf60c5fce1924e07115 $util.toJson($ctx.result)", "TypeName": "Mutation", }, @@ -2576,7 +2586,7 @@ $util.toJson($ctx.result)", "DataSourceName": "database_bridge_lambda_ds", "FieldName": "editItem", "Kind": "UNIT", - "ResponseMappingTemplate": "## schema checksum : aa02bae16942e48366fa36a1cd643d16 + "ResponseMappingTemplate": "## schema checksum : 51a0add4d309eaf60c5fce1924e07115 $util.toJson($ctx.result)", "TypeName": "Mutation", }, @@ -2597,7 +2607,7 @@ $util.toJson($ctx.result)", "DataSourceName": "database_bridge_lambda_ds", "FieldName": "removeManuallyOpenedPinboardIds", "Kind": "UNIT", - "ResponseMappingTemplate": "## schema checksum : aa02bae16942e48366fa36a1cd643d16 + "ResponseMappingTemplate": "## schema checksum : 51a0add4d309eaf60c5fce1924e07115 $util.toJson($ctx.result)", "TypeName": "Mutation", }, @@ -2618,7 +2628,7 @@ $util.toJson($ctx.result)", "DataSourceName": "database_bridge_lambda_ds", "FieldName": "seenItem", "Kind": "UNIT", - "ResponseMappingTemplate": "## schema checksum : aa02bae16942e48366fa36a1cd643d16 + "ResponseMappingTemplate": "## schema checksum : 51a0add4d309eaf60c5fce1924e07115 $util.toJson($ctx.result)", "TypeName": "Mutation", }, @@ -2639,7 +2649,7 @@ $util.toJson($ctx.result)", "DataSourceName": "database_bridge_lambda_ds", "FieldName": "setWebPushSubscriptionForUser", "Kind": "UNIT", - "ResponseMappingTemplate": "## schema checksum : aa02bae16942e48366fa36a1cd643d16 + "ResponseMappingTemplate": "## schema checksum : 51a0add4d309eaf60c5fce1924e07115 $util.toJson($ctx.result)", "TypeName": "Mutation", }, @@ -2660,7 +2670,7 @@ $util.toJson($ctx.result)", "DataSourceName": "database_bridge_lambda_ds", "FieldName": "visitTourStep", "Kind": "UNIT", - "ResponseMappingTemplate": "## schema checksum : aa02bae16942e48366fa36a1cd643d16 + "ResponseMappingTemplate": "## schema checksum : 51a0add4d309eaf60c5fce1924e07115 $util.toJson($ctx.result)", "TypeName": "Mutation", }, @@ -2681,7 +2691,7 @@ $util.toJson($ctx.result)", "DataSourceName": "database_bridge_lambda_ds", "FieldName": "getGroupPinboardIds", "Kind": "UNIT", - "ResponseMappingTemplate": "## schema checksum : aa02bae16942e48366fa36a1cd643d16 + "ResponseMappingTemplate": "## schema checksum : 51a0add4d309eaf60c5fce1924e07115 $util.toJson($ctx.result)", "TypeName": "Query", }, @@ -2702,7 +2712,7 @@ $util.toJson($ctx.result)", "DataSourceName": "database_bridge_lambda_ds", "FieldName": "getItemCounts", "Kind": "UNIT", - "ResponseMappingTemplate": "## schema checksum : aa02bae16942e48366fa36a1cd643d16 + "ResponseMappingTemplate": "## schema checksum : 51a0add4d309eaf60c5fce1924e07115 $util.toJson($ctx.result)", "TypeName": "Query", }, @@ -2723,7 +2733,7 @@ $util.toJson($ctx.result)", "DataSourceName": "database_bridge_lambda_ds", "FieldName": "getMyUser", "Kind": "UNIT", - "ResponseMappingTemplate": "## schema checksum : aa02bae16942e48366fa36a1cd643d16 + "ResponseMappingTemplate": "## schema checksum : 51a0add4d309eaf60c5fce1924e07115 $util.toJson($ctx.result)", "TypeName": "Query", }, @@ -2744,7 +2754,7 @@ $util.toJson($ctx.result)", "DataSourceName": "database_bridge_lambda_ds", "FieldName": "getUsers", "Kind": "UNIT", - "ResponseMappingTemplate": "## schema checksum : aa02bae16942e48366fa36a1cd643d16 + "ResponseMappingTemplate": "## schema checksum : 51a0add4d309eaf60c5fce1924e07115 $util.toJson($ctx.result)", "TypeName": "Query", }, @@ -2765,7 +2775,7 @@ $util.toJson($ctx.result)", "DataSourceName": "database_bridge_lambda_ds", "FieldName": "listItems", "Kind": "UNIT", - "ResponseMappingTemplate": "## schema checksum : aa02bae16942e48366fa36a1cd643d16 + "ResponseMappingTemplate": "## schema checksum : 51a0add4d309eaf60c5fce1924e07115 $util.toJson($ctx.result)", "TypeName": "Query", }, @@ -2786,7 +2796,7 @@ $util.toJson($ctx.result)", "DataSourceName": "database_bridge_lambda_ds", "FieldName": "listLastItemSeenByUsers", "Kind": "UNIT", - "ResponseMappingTemplate": "## schema checksum : aa02bae16942e48366fa36a1cd643d16 + "ResponseMappingTemplate": "## schema checksum : 51a0add4d309eaf60c5fce1924e07115 $util.toJson($ctx.result)", "TypeName": "Query", }, @@ -2807,7 +2817,7 @@ $util.toJson($ctx.result)", "DataSourceName": "database_bridge_lambda_ds", "FieldName": "searchMentionableUsers", "Kind": "UNIT", - "ResponseMappingTemplate": "## schema checksum : aa02bae16942e48366fa36a1cd643d16 + "ResponseMappingTemplate": "## schema checksum : 51a0add4d309eaf60c5fce1924e07115 $util.toJson($ctx.result)", "TypeName": "Query", }, @@ -2932,7 +2942,7 @@ $util.toJson($ctx.result)", "DataSourceName": "grid_bridge_lambda_ds", "FieldName": "asGridPayload", "Kind": "UNIT", - "ResponseMappingTemplate": "## schema checksum : aa02bae16942e48366fa36a1cd643d16 + "ResponseMappingTemplate": "## schema checksum : 51a0add4d309eaf60c5fce1924e07115 $util.toJson($ctx.result)", "TypeName": "Query", }, @@ -2953,7 +2963,7 @@ $util.toJson($ctx.result)", "DataSourceName": "grid_bridge_lambda_ds", "FieldName": "getGridSearchSummary", "Kind": "UNIT", - "ResponseMappingTemplate": "## schema checksum : aa02bae16942e48366fa36a1cd643d16 + "ResponseMappingTemplate": "## schema checksum : 51a0add4d309eaf60c5fce1924e07115 $util.toJson($ctx.result)", "TypeName": "Query", }, @@ -3078,7 +3088,7 @@ $util.toJson($ctx.result)", "DataSourceName": "workflow_bridge_lambda_ds", "FieldName": "getPinboardByComposerId", "Kind": "UNIT", - "ResponseMappingTemplate": "## schema checksum : aa02bae16942e48366fa36a1cd643d16 + "ResponseMappingTemplate": "## schema checksum : 51a0add4d309eaf60c5fce1924e07115 $util.toJson($ctx.result)", "TypeName": "Query", }, @@ -3099,7 +3109,7 @@ $util.toJson($ctx.result)", "DataSourceName": "workflow_bridge_lambda_ds", "FieldName": "getPinboardsByIds", "Kind": "UNIT", - "ResponseMappingTemplate": "## schema checksum : aa02bae16942e48366fa36a1cd643d16 + "ResponseMappingTemplate": "## schema checksum : 51a0add4d309eaf60c5fce1924e07115 $util.toJson($ctx.result)", "TypeName": "Query", }, @@ -3120,7 +3130,7 @@ $util.toJson($ctx.result)", "DataSourceName": "workflow_bridge_lambda_ds", "FieldName": "listPinboards", "Kind": "UNIT", - "ResponseMappingTemplate": "## schema checksum : aa02bae16942e48366fa36a1cd643d16 + "ResponseMappingTemplate": "## schema checksum : 51a0add4d309eaf60c5fce1924e07115 $util.toJson($ctx.result)", "TypeName": "Query", }, @@ -4121,6 +4131,11 @@ $util.toJson($ctx.result)", "Properties": Object { "PolicyDocument": Object { "Statement": Array [ + Object { + "Action": "ram:GetResourceShareAssociations", + "Effect": "Allow", + "Resource": "*", + }, Object { "Action": "rds-db:connect", "Effect": "Allow", diff --git a/cdk/lib/stack.ts b/cdk/lib/stack.ts index b53cb229..5436973c 100644 --- a/cdk/lib/stack.ts +++ b/cdk/lib/stack.ts @@ -296,7 +296,14 @@ export class PinBoardStack extends GuStack { deployBucket, `${this.stack}/${this.stage}/${DATABASE_BRIDGE_LAMBDA_BASENAME}/${DATABASE_BRIDGE_LAMBDA_BASENAME}.zip` ), - initialPolicy: [], + initialPolicy: [ + // to lookup chatbots shared from other accounts + new iam.PolicyStatement({ + effect: iam.Effect.ALLOW, + actions: ["ram:GetResourceShareAssociations"], + resources: ["*"], + }), + ], vpc: accountVpc, securityGroups: [databaseSecurityGroup], } diff --git a/client/gql.ts b/client/gql.ts index 550a643c..7000724f 100644 --- a/client/gql.ts +++ b/client/gql.ts @@ -63,6 +63,10 @@ const itemReturnFields = ` label isMe } + chatBotMentions { + label + isMe + } claimedByEmail claimable relatedItemId @@ -133,6 +137,11 @@ export const gqlSearchMentionableUsers = (prefix: string) => gql` name memberEmails } + chatBots { + shorthand + description + avatarUrl + } } } `; diff --git a/client/src/avatarRoundel.tsx b/client/src/avatarRoundel.tsx index 604daf14..3f19b4b6 100644 --- a/client/src/avatarRoundel.tsx +++ b/client/src/avatarRoundel.tsx @@ -1,23 +1,29 @@ import { css } from "@emotion/react"; import { neutral } from "@guardian/source-foundations"; import React from "react"; -import { Group, User } from "../../shared/graphql/graphql"; +import { ChatBot, Group, User } from "../../shared/graphql/graphql"; import { composer } from "../colours"; import { agateSans } from "../fontNormaliser"; -import { isUser } from "../../shared/graphql/extraTypes"; +import { + hasAvatarUrl, + isChatBot, + isGroup, + isUser, +} from "../../shared/graphql/extraTypes"; interface AvatarRoundelProps { - maybeUserOrGroup: User | Group | undefined; + maybeUserOrGroupOrChatBot: User | Group | ChatBot | undefined; size: number; fallback: string; } export const AvatarRoundel = ({ - maybeUserOrGroup, + maybeUserOrGroupOrChatBot, size, fallback, }: AvatarRoundelProps) => - maybeUserOrGroup && isUser(maybeUserOrGroup) && maybeUserOrGroup.avatarUrl ? ( + hasAvatarUrl(maybeUserOrGroupOrChatBot) && + maybeUserOrGroupOrChatBot.avatarUrl ? ( ) : ( @@ -35,7 +41,9 @@ export const AvatarRoundel = ({ height: ${size}px; border-radius: 50%; box-shadow: 0 0 1px ${neutral[93]}; - background-color: ${composer.primary[300]}; + background-color: ${isChatBot(maybeUserOrGroupOrChatBot) + ? "none" + : composer.primary[300]}; color: ${neutral[100]}; display: flex; flex-shrink: 0; @@ -47,17 +55,17 @@ export const AvatarRoundel = ({ line-height: ${size}px; `} > - {maybeUserOrGroup ? ( - isUser(maybeUserOrGroup) ? ( - - {maybeUserOrGroup.firstName.charAt(0).toUpperCase()} - {maybeUserOrGroup.lastName?.charAt(0).toUpperCase()} - - ) : ( - maybeUserOrGroup.memberEmails?.length - ) - ) : ( - fallback.charAt(0).toUpperCase() + {isUser(maybeUserOrGroupOrChatBot) && ( + + {maybeUserOrGroupOrChatBot.firstName.charAt(0).toUpperCase()} + {maybeUserOrGroupOrChatBot.lastName?.charAt(0).toUpperCase()} + )} + {isGroup(maybeUserOrGroupOrChatBot) && + maybeUserOrGroupOrChatBot.memberEmails?.length} + {isChatBot(maybeUserOrGroupOrChatBot) && ( + 🤖 /* TODO replace with actual bot SVG */ + )} + {!maybeUserOrGroupOrChatBot && fallback.charAt(0).toUpperCase()} ); diff --git a/client/src/itemDisplay.tsx b/client/src/itemDisplay.tsx index e9603f6f..0fd9bf75 100644 --- a/client/src/itemDisplay.tsx +++ b/client/src/itemDisplay.tsx @@ -66,6 +66,7 @@ export const ItemDisplay = ({ const mentionHandles = [ ...(item.mentions || []), ...(item.groupMentions || []), + ...(item.chatBotMentions || []), ]; const formattedMessage = useMemo( @@ -123,7 +124,7 @@ export const ItemDisplay = ({ {isDifferentUserFromPreviousItem && ( diff --git a/client/src/itemInputBox.tsx b/client/src/itemInputBox.tsx index 2b908492..6e0eb40f 100644 --- a/client/src/itemInputBox.tsx +++ b/client/src/itemInputBox.tsx @@ -4,7 +4,7 @@ import ReactTextareaAutocomplete from "@webscopeio/react-textarea-autocomplete"; import { PayloadAndType } from "./types/PayloadAndType"; import { palette, space } from "@guardian/source-foundations"; import { PayloadDisplay } from "./payloadDisplay"; -import { Group, User } from "shared/graphql/graphql"; +import { ChatBot, Group, User } from "shared/graphql/graphql"; import { AvatarRoundel } from "./avatarRoundel"; import { agateSans } from "../fontNormaliser"; import { scrollbarsCss } from "./styling"; @@ -12,14 +12,17 @@ import { composer } from "../colours"; import { LazyQueryHookOptions, useApolloClient } from "@apollo/client"; import { gqlSearchMentionableUsers } from "../gql"; import { SvgSpinner } from "@guardian/source-react-components"; -import { isGroup, isUser } from "shared/graphql/extraTypes"; -import { groupToMentionHandle, userToMentionHandle } from "./mentionsUtil"; +import { isChatBot, isGroup, isUser } from "shared/graphql/extraTypes"; +import { + groupOrChatBotToMentionHandle, + userToMentionHandle, +} from "./mentionsUtil"; import { useTourProgress } from "./tour/tourState"; import { PINBOARD_TELEMETRY_TYPE, TelemetryContext } from "./types/Telemetry"; interface WithEntity { entity: E & { - heading?: string; + maybeHeading?: string; }; } @@ -40,10 +43,10 @@ const LoadingSuggestions = () => ( ); const Suggestion = ({ - entity: { heading, ...userOrGroup }, -}: WithEntity) => ( + entity: { maybeHeading, ...userOrGroupOrChatBot }, +}: WithEntity) => (
- {heading && ( + {maybeHeading && (
e.stopPropagation()} > - {heading} + {maybeHeading}
)}
@@ -84,16 +97,20 @@ const Suggestion = ({ }), }} > - {isUser(userOrGroup) - ? `${userOrGroup.firstName} ${userOrGroup.lastName}` - : userOrGroup.shorthand} + {isUser(userOrGroupOrChatBot) + ? `${userOrGroupOrChatBot.firstName} ${userOrGroupOrChatBot.lastName}` + : userOrGroupOrChatBot.shorthand}
- {isUser(userOrGroup) ? userOrGroup.email : userOrGroup.name} + {isUser(userOrGroupOrChatBot) + ? userOrGroupOrChatBot.email + : isGroup(userOrGroupOrChatBot) + ? userOrGroupOrChatBot.name + : userOrGroupOrChatBot.description}
@@ -125,7 +142,7 @@ interface ItemInputBoxProps { message: string; setMessage: (newMessage: string) => void; sendItem?: () => void; - addUnverifiedMention?: (userOrGroup: User | Group) => void; + addUnverifiedMention?: (userOrGroupOrChatBot: User | Group | ChatBot) => void; panelElement: HTMLElement | null; isSending: boolean; asGridPayload: ( @@ -175,16 +192,20 @@ export const ItemInputBox = ({ .then( ({ data: { - searchMentionableUsers: { users, groups }, + searchMentionableUsers: { users, groups, chatBots }, }, }) => [ ...users.map((user: User, index: number) => ({ ...user, - heading: index === 0 ? "INDIVIDUALS" : undefined, + maybeHeading: index === 0 ? "INDIVIDUALS" : undefined, })), ...groups.map((group: Group, index: number) => ({ ...group, - heading: index === 0 ? "GROUPS" : undefined, + maybeHeading: index === 0 ? "GROUPS" : undefined, + })), + ...chatBots.map((chatBot: ChatBot, index: number) => ({ + ...chatBot, + maybeHeading: index === 0 ? "CHAT BOTS" : undefined, })), ] ); @@ -260,7 +281,7 @@ export const ItemInputBox = ({ `} > {maybeReplyingToElement} - + innerRef={(element) => (textAreaRef.current = element)} disabled={isSending} trigger={{ @@ -269,13 +290,13 @@ export const ItemInputBox = ({ ? mentionsDataProvider : () => [], component: Suggestion, - output: (userOrGroup) => ({ - key: isGroup(userOrGroup) - ? userOrGroup.shorthand - : userOrGroup.email, - text: isGroup(userOrGroup) - ? groupToMentionHandle(userOrGroup) - : userToMentionHandle(userOrGroup), + output: (userOrGroupOrChatBot) => ({ + key: isUser(userOrGroupOrChatBot) + ? userOrGroupOrChatBot.email + : userOrGroupOrChatBot.shorthand, + text: isUser(userOrGroupOrChatBot) + ? userToMentionHandle(userOrGroupOrChatBot) + : groupOrChatBotToMentionHandle(userOrGroupOrChatBot), caretPosition: "next", }), allowWhitespace: true, diff --git a/client/src/mentionsUtil.tsx b/client/src/mentionsUtil.tsx index 7ba9e8c8..fa219e82 100644 --- a/client/src/mentionsUtil.tsx +++ b/client/src/mentionsUtil.tsx @@ -1,12 +1,19 @@ import { css } from "@emotion/react"; import { composer } from "../colours"; import React, { Fragment } from "react"; -import { Group, MentionHandle, User } from "../../shared/graphql/graphql"; +import { + ChatBot, + Group, + MentionHandle, + User, +} from "../../shared/graphql/graphql"; export const userToMentionHandle = (user: User) => `@${user.firstName} ${user.lastName}`; -export const groupToMentionHandle = (group: Group) => `@${group.shorthand}`; +export const groupOrChatBotToMentionHandle = ( + groupOrChatBot: Group | ChatBot +) => `@${groupOrChatBot.shorthand}`; const meMentionedCSS = (unread: boolean | undefined) => css` color: white; @@ -55,10 +62,13 @@ export const formatMentionHandlesInText = ( const formattedMentionHandle = ( - {maybeMentionHandle.label} + {maybeMentionHandle.isBot + ? maybeMentionHandle.label.replace("@", "🤖") //TODO use svg here in future + : maybeMentionHandle.label} ); const partsBetweenMentionHandles = text.split(maybeMentionHandle.label); diff --git a/client/src/nestedItemDisplay.tsx b/client/src/nestedItemDisplay.tsx index 13362a23..729cd0dc 100644 --- a/client/src/nestedItemDisplay.tsx +++ b/client/src/nestedItemDisplay.tsx @@ -90,7 +90,7 @@ export const NestedItemDisplay = ({ `} > diff --git a/client/src/seenBy.tsx b/client/src/seenBy.tsx index 531801d4..b059635c 100644 --- a/client/src/seenBy.tsx +++ b/client/src/seenBy.tsx @@ -60,7 +60,7 @@ export const SeenBy = ({ seenBy, userLookup }: SeenByProps) => { `} > diff --git a/client/src/sendMessageArea.tsx b/client/src/sendMessageArea.tsx index 51ed7e17..1aeafe75 100644 --- a/client/src/sendMessageArea.tsx +++ b/client/src/sendMessageArea.tsx @@ -2,7 +2,13 @@ import { ApolloError, useLazyQuery, useMutation } from "@apollo/client"; import { css } from "@emotion/react"; import { palette, space } from "@guardian/source-foundations"; import React, { useContext, useState } from "react"; -import { CreateItemInput, Group, Item, User } from "shared/graphql/graphql"; +import { + ChatBot, + CreateItemInput, + Group, + Item, + User, +} from "shared/graphql/graphql"; import { gqlAsGridPayload, gqlCreateItem } from "../gql"; import { ItemInputBox } from "./itemInputBox"; import { PayloadAndType } from "./types/PayloadAndType"; @@ -12,9 +18,12 @@ import SendArrow from "../icons/send.svg"; import { buttonBackground } from "./styling"; import { PINBOARD_TELEMETRY_TYPE, TelemetryContext } from "./types/Telemetry"; import { SvgSpinner } from "@guardian/source-react-components"; -import { isGroup, isUser } from "shared/graphql/extraTypes"; +import { isChatBot, isGroup, isUser } from "shared/graphql/extraTypes"; import { useConfirmModal } from "./modal"; -import { groupToMentionHandle, userToMentionHandle } from "./mentionsUtil"; +import { + groupOrChatBotToMentionHandle, + userToMentionHandle, +} from "./mentionsUtil"; import { useTourProgress } from "./tour/tourState"; import { demoPinboardData } from "./tour/tourConstants"; @@ -48,10 +57,10 @@ export const SendMessageArea = ({ }: SendMessageAreaProps) => { const [message, setMessage] = useState(""); const [unverifiedMentions, setUnverifiedMentions] = useState< - Array + Array >([]); - const addUnverifiedMention = (userOrGroup: User | Group) => - setUnverifiedMentions((prevState) => [...prevState, userOrGroup]); // TODO: also make user unique in list + const addUnverifiedMention = (userOrGroupOrChatBot: User | Group | ChatBot) => + setUnverifiedMentions((prevState) => [...prevState, userOrGroupOrChatBot]); // TODO: also make user unique in list const verifiedIndividualMentionEmails = Array.from( new Set( @@ -66,11 +75,24 @@ export const SendMessageArea = ({ new Set( unverifiedMentions .filter(isGroup) - .filter((group) => message.includes(groupToMentionHandle(group))) + .filter((group) => + message.includes(groupOrChatBotToMentionHandle(group)) + ) .map((group) => group.shorthand) ) ); + const verifiedChatBotMentionShorthands = Array.from( + new Set( + unverifiedMentions + .filter(isChatBot) + .filter((chatBot) => + message.includes(groupOrChatBotToMentionHandle(chatBot)) + ) + .map((chatBot) => chatBot.shorthand) + ) + ); + const sendTelemetryEvent = useContext(TelemetryContext); const [_sendItem, { loading: isItemSending }] = useMutation<{ @@ -137,6 +159,7 @@ export const SendMessageArea = ({ pinboardId, mentions: verifiedIndividualMentionEmails, groupMentions: verifiedGroupMentionShorthands, + chatBotMentions: verifiedChatBotMentionShorthands, claimable, relatedItemId: maybeReplyingToItemId, } satisfies CreateItemInput, diff --git a/client/src/tour/tourMessageReplies.ts b/client/src/tour/tourMessageReplies.ts index 1e67dcd6..c049f638 100644 --- a/client/src/tour/tourMessageReplies.ts +++ b/client/src/tour/tourMessageReplies.ts @@ -22,6 +22,7 @@ const buildMessageItem = ( userEmail: user.email, groupMentions: null, mentions: null, + chatBotMentions: null, payload: null, relatedItemId: null, deletedAt: null, diff --git a/client/src/tour/tourState.tsx b/client/src/tour/tourState.tsx index c4049870..4aca2343 100644 --- a/client/src/tour/tourState.tsx +++ b/client/src/tour/tourState.tsx @@ -301,8 +301,10 @@ export const TourStateProvider: React.FC = ({ children }) => { .filter((_) => _.email === email) .map(userToMentionHandle)[0], isMe: false, + isBot: false, })), groupMentions: [], //TODO - map variables.input.groupMentions to mention handle, + chatBotMentions: [], //TODO - map variables.input.chatBotMentions to mention handle, claimable: variables.input.claimable || false, }; setSuccessfulSends((prevSuccessfulSends) => [ diff --git a/database-bridge-lambda/package.json b/database-bridge-lambda/package.json index eb541164..80ef164d 100644 --- a/database-bridge-lambda/package.json +++ b/database-bridge-lambda/package.json @@ -10,6 +10,8 @@ "watch": "ts-node-dev --respawn run.ts" }, "devDependencies": { + "@aws-sdk/client-lambda": "^3.299.0", + "@aws-sdk/client-ram": "^3.299.0", "ts-node-dev": "^1.0.0" }, "dependencies": { diff --git a/database-bridge-lambda/src/services/chatBotBroker.ts b/database-bridge-lambda/src/services/chatBotBroker.ts new file mode 100644 index 00000000..391ab436 --- /dev/null +++ b/database-bridge-lambda/src/services/chatBotBroker.ts @@ -0,0 +1,92 @@ +import { Item } from "shared/graphql/graphql"; +import { ssm, STAGE, standardAwsConfig } from "shared/awsIntegration"; +import { + GetResourceShareAssociationsCommand, + RAMClient, +} from "@aws-sdk/client-ram"; +import { Lambda } from "@aws-sdk/client-lambda"; + +const sharedAwsResources = new RAMClient(standardAwsConfig); +const lambda = new Lambda(standardAwsConfig); +const { encode } = new TextEncoder(); + +export interface ChatBotDetails { + shorthand: string; + description: string; + lambdaArn: string; +} + +// TODO probably need to cache this somehow (would be awesome if could be notified when param changed??) +export const getBots = async ( + maybeStartToken?: string +): Promise => { + const { resourceShareAssociations, nextToken } = + await sharedAwsResources.send( + new GetResourceShareAssociationsCommand({ + associationType: "RESOURCE", + nextToken: maybeStartToken, + }) + ); + + const maybeThisPagePromises = resourceShareAssociations?.reduce( + (acc, { associatedEntity }) => + associatedEntity + ? // associatedEntity?.includes("/pinboard/bots") //TODO reinstate when param pattern is controlled by cdk construct + [ + ...acc, + ssm + .getParameterHistory({ + Name: associatedEntity, + MaxResults: 1, //TODO check this returns latest + }) + .then((_) => _!.Parameters![0]) + .then(({ Description, Value }) => ({ + shorthand: associatedEntity.split("/").pop()!, + description: Description!, + lambdaArn: Value!, + })), + ] + : acc, + [] as Promise[] + ); + + return [ + ...(nextToken ? await getBots(nextToken) : []), + ...(await Promise.all(maybeThisPagePromises || [])), + ]; +}; + +export const processAllBotMentions = ( + allItemsInThisPinboard: Item[], + newItem: Item, + chatBotMentions: string[] +): Promise[] => + chatBotMentions.map(async (chatBotShorthand) => { + const allBots = await getBots(); + + const chatBot = allBots.find((_) => _.shorthand === chatBotShorthand); + + if (!chatBot) { + return console.error( + "could not find chatbot with shorthand: ", + chatBotShorthand + ); + } + + await lambda.invoke({ + FunctionName: chatBot.lambdaArn, + // asynchronous invocation, so we can exit the create call early (and hope the bot replies in due course) + InvocationType: "Event", + Payload: encode( + JSON.stringify({ + callbackToken: "", //TODO implement single-use callback token mechanism + callbackUrl: `https://pinboard.${ + STAGE === "PROD" ? "gutools.co.uk" : "code.dev-gutools.co.uk" + }/bot/${newItem.pinboardId}/${newItem.id}`, + item: newItem, + allItemsInThisPinboard: allItemsInThisPinboard, + //TODO share composer ID so bot can fetch content if needs be + }) + ), + }); + }); diff --git a/database-bridge-lambda/src/sql/Item.ts b/database-bridge-lambda/src/sql/Item.ts index efe977a7..28dc2353 100644 --- a/database-bridge-lambda/src/sql/Item.ts +++ b/database-bridge-lambda/src/sql/Item.ts @@ -3,9 +3,10 @@ import { EditItemInput, Item, PinboardIdWithClaimCounts, -} from "../../../shared/graphql/graphql"; -import { Sql } from "../../../shared/database/types"; -import { Range } from "../../../shared/types/grafanaType"; +} from "shared/graphql/graphql"; +import { Sql } from "shared/database/types"; +import { Range } from "shared/types/grafanaType"; +import { processAllBotMentions } from "../services/chatBotBroker"; const fragmentIndividualMentionsToMentionHandles = ( sql: Sql, @@ -41,6 +42,15 @@ const fragmentGroupMentionsToMentionHandles = ( FROM "Group" WHERE "shorthand" = ANY ("groupMentions") `; +const fragmentChatBotMentionsToMentionHandles = (sql: Sql) => sql` + SELECT json_agg( + json_build_object( + 'label', concat('@', "shorthand"), + 'isBot', true + ) + ) + FROM unnest("chatBotMentions") as "shorthand" +`; const fragmentItemFields = (sql: Sql, userEmail: string) => sql` *, ( @@ -52,18 +62,42 @@ const fragmentItemFields = (sql: Sql, userEmail: string) => sql` ${fragmentGroupMentionsToMentionHandles(sql, userEmail)} ) as - "groupMentions"`; + "groupMentions", + ( + ${fragmentChatBotMentionsToMentionHandles(sql)} + ) + as + "chatBotMentions" + `; export const createItem = async ( sql: Sql, args: { input: CreateItemInput }, userEmail: string -) => - sql` +) => { + const newItem = await sql` INSERT INTO "Item" ${sql({ userEmail, ...args.input })} RETURNING ${fragmentItemFields(sql, userEmail)} `.then((rows) => rows[0]); + if (args.input.chatBotMentions && args.input.chatBotMentions.length > 0) { + const rowsForAllItemsInThisPinboard = await listItems( + sql, + { pinboardId: args.input.pinboardId }, + userEmail + ); + + await Promise.allSettled( + processAllBotMentions( + [...rowsForAllItemsInThisPinboard] as Item[], + newItem as Item, + args.input.chatBotMentions + ) + ); + } + + return newItem; +}; export const editItem = async ( sql: Sql, args: { itemId: string; input: EditItemInput }, diff --git a/database-bridge-lambda/src/sql/User.ts b/database-bridge-lambda/src/sql/User.ts index a9699abd..b5509700 100644 --- a/database-bridge-lambda/src/sql/User.ts +++ b/database-bridge-lambda/src/sql/User.ts @@ -1,4 +1,5 @@ import { Sql } from "../../../shared/database/types"; +import { getBots } from "../services/chatBotBroker"; const fragmentUserWithoutPushSubscriptionSecrets = (sql: Sql) => sql`"email", "firstName", "lastName", "avatarUrl", "isMentionable"`; @@ -6,19 +7,19 @@ const fragmentUserWithoutPushSubscriptionSecrets = (sql: Sql) => export const searchMentionableUsers = async ( sql: Sql, args: { prefix: string } -) => ({ - users: await sql` - SELECT ${fragmentUserWithoutPushSubscriptionSecrets(sql)} - FROM "User" - WHERE "isMentionable" = true AND ( - "firstName" ILIKE ${args.prefix + "%"} - OR "lastName" ILIKE ${args.prefix + "%"} - OR CONCAT("firstName", ' ', "lastName") ILIKE ${args.prefix + "%"} - ) - ORDER BY "webPushSubscription" IS NOT NULL DESC, "manuallyOpenedPinboardIds" IS NOT NULL DESC, "firstName" - LIMIT 5 - `, - groups: await sql` +) => { + const usersPromise = sql` + SELECT ${fragmentUserWithoutPushSubscriptionSecrets(sql)} + FROM "User" + WHERE "isMentionable" = true AND ( + "firstName" ILIKE ${args.prefix + "%"} + OR "lastName" ILIKE ${args.prefix + "%"} + OR CONCAT("firstName", ' ', "lastName") ILIKE ${args.prefix + "%"} + ) + ORDER BY "webPushSubscription" IS NOT NULL DESC, "manuallyOpenedPinboardIds" IS NOT NULL DESC, "firstName" + LIMIT 5 + `; + const groupsPromise = sql` SELECT "shorthand", "name", COALESCE(( SELECT json_agg("email") FROM "User", "GroupMember" @@ -36,8 +37,16 @@ export const searchMentionableUsers = async ( ) ORDER BY "name" LIMIT 3 - `, -}); + `; + const chatBotsPromise = (await getBots()).filter((chatBot) => + chatBot.shorthand.toLowerCase().includes(args.prefix.toLowerCase()) + ); + return { + users: await usersPromise, + groups: await groupsPromise, + chatBots: await chatBotsPromise, + }; +}; export const getUsers = (sql: Sql, args: { emails: string[] }) => sql` diff --git a/notifications-lambda/run.ts b/notifications-lambda/run.ts index 98ad2dc2..1ebad0b7 100644 --- a/notifications-lambda/run.ts +++ b/notifications-lambda/run.ts @@ -30,6 +30,7 @@ import { Item } from "shared/graphql/graphql"; payload: null, mentions: [], groupMentions: [], + chatBotMentions: [], userEmail: "tom.richards@guardian.co.uk", id: "535b86e2-4f01-4f60-a2d0-a5e4f5a7d312", message: "testing one two three", diff --git a/shared/awsIntegration.ts b/shared/awsIntegration.ts index 4bf904e8..9611d4b9 100644 --- a/shared/awsIntegration.ts +++ b/shared/awsIntegration.ts @@ -16,7 +16,7 @@ export const standardAwsConfig = { : fromNodeProviderChain(), }; -const ssm = new SSM(standardAwsConfig); +export const ssm = new SSM(standardAwsConfig); const paramStorePromiseGetter = (WithDecryption: boolean) => (nameSuffix: string) => { diff --git a/shared/database/local/runDatabaseSetup.ts b/shared/database/local/runDatabaseSetup.ts index d4ffe63b..cad1c743 100644 --- a/shared/database/local/runDatabaseSetup.ts +++ b/shared/database/local/runDatabaseSetup.ts @@ -85,6 +85,8 @@ const runSetupTriggerSqlFile = ( getEmailLambdaFunctionName(stage), EMAIL_DATABASE_TRIGGER_NAME ), + "add chatBotMentions column to Item table": () => + runSetupSqlFile(sql, "020-AddChatBotMentionsColumnToItemTable.sql"), }; const allSteps = async () => { diff --git a/shared/database/local/setup/020-AddChatBotMentionsColumnToItemTable.sql b/shared/database/local/setup/020-AddChatBotMentionsColumnToItemTable.sql new file mode 100644 index 00000000..0531b43c --- /dev/null +++ b/shared/database/local/setup/020-AddChatBotMentionsColumnToItemTable.sql @@ -0,0 +1,2 @@ +ALTER TABLE "Item" + ADD COLUMN "chatBotMentions" VARCHAR(128)[]; diff --git a/shared/graphql/extraTypes.ts b/shared/graphql/extraTypes.ts index 56bc6b9b..b5827408 100644 --- a/shared/graphql/extraTypes.ts +++ b/shared/graphql/extraTypes.ts @@ -1,4 +1,5 @@ import type { + ChatBot, Group, PinboardIdWithClaimCounts, User, @@ -28,8 +29,22 @@ export const isPinboardDataWithClaimCounts = ( ): pinboardData is PinboardDataWithClaimCounts => "unclaimedCount" in pinboardData; -export const isGroup = (userOrGroup: User | Group): userOrGroup is Group => - "shorthand" in userOrGroup; +export const isGroup = ( + userOrGroupOrChatBot: User | Group | ChatBot | undefined +): userOrGroupOrChatBot is Group => + !!userOrGroupOrChatBot && "memberEmails" in userOrGroupOrChatBot; -export const isUser = (userOrGroup: User | Group): userOrGroup is User => - !isGroup(userOrGroup); +export const isUser = ( + userOrGroupOrChatBot: User | Group | ChatBot | undefined +): userOrGroupOrChatBot is User => + !!userOrGroupOrChatBot && "email" in userOrGroupOrChatBot; + +export const isChatBot = ( + userOrGroupOrChatBot: User | Group | ChatBot | undefined +): userOrGroupOrChatBot is ChatBot => + !!userOrGroupOrChatBot && "description" in userOrGroupOrChatBot; + +export const hasAvatarUrl = ( + userOrGroupOrChatBot: User | Group | ChatBot | undefined +): userOrGroupOrChatBot is User | ChatBot => + !!userOrGroupOrChatBot && "avatarUrl" in userOrGroupOrChatBot; diff --git a/shared/graphql/schema.graphql b/shared/graphql/schema.graphql index cb1d8029..62297282 100644 --- a/shared/graphql/schema.graphql +++ b/shared/graphql/schema.graphql @@ -9,7 +9,7 @@ type Query { listItems(pinboardId: String!): [Item] listLastItemSeenByUsers(pinboardId: String!): [LastItemSeenByUser] getMyUser: MyUser - searchMentionableUsers(prefix: String!): UsersAndGroups + searchMentionableUsers(prefix: String!): UsersGroupsAndChatBots getUsers(emails: [String!]!): [User] getGroupPinboardIds: [PinboardIdWithClaimCounts!]! getItemCounts(pinboardIds: [String!]!): [PinboardIdWithItemCounts!]! @@ -54,7 +54,8 @@ type Subscription { type MentionHandle { label: String! - isMe: Boolean! + isMe: Boolean + isBot: Boolean } type Item { @@ -67,6 +68,7 @@ type Item { pinboardId: String! mentions: [MentionHandle!] groupMentions: [MentionHandle!] + chatBotMentions: [MentionHandle!] claimedByEmail: String claimable: Boolean! relatedItemId: String @@ -104,9 +106,16 @@ type Group { memberEmails: [String!]! } -type UsersAndGroups { +type ChatBot { + shorthand: String! + description: String! + avatarUrl: String +} + +type UsersGroupsAndChatBots { users: [User!]! groups: [Group!]! + chatBots: [ChatBot!]! } type WorkflowStub { @@ -144,6 +153,7 @@ input CreateItemInput { pinboardId: String! mentions: [String!] groupMentions: [String!] + chatBotMentions: [String!] claimable: Boolean relatedItemId: String } diff --git a/yarn.lock b/yarn.lock index 95293702..93973e52 100644 --- a/yarn.lock +++ b/yarn.lock @@ -537,6 +537,55 @@ __metadata: languageName: node linkType: hard +"@aws-sdk/client-ram@npm:^3.299.0": + version: 3.583.0 + resolution: "@aws-sdk/client-ram@npm:3.583.0" + dependencies: + "@aws-crypto/sha256-browser": "npm:3.0.0" + "@aws-crypto/sha256-js": "npm:3.0.0" + "@aws-sdk/client-sso-oidc": "npm:3.583.0" + "@aws-sdk/client-sts": "npm:3.583.0" + "@aws-sdk/core": "npm:3.582.0" + "@aws-sdk/credential-provider-node": "npm:3.583.0" + "@aws-sdk/middleware-host-header": "npm:3.577.0" + "@aws-sdk/middleware-logger": "npm:3.577.0" + "@aws-sdk/middleware-recursion-detection": "npm:3.577.0" + "@aws-sdk/middleware-user-agent": "npm:3.583.0" + "@aws-sdk/region-config-resolver": "npm:3.577.0" + "@aws-sdk/types": "npm:3.577.0" + "@aws-sdk/util-endpoints": "npm:3.583.0" + "@aws-sdk/util-user-agent-browser": "npm:3.577.0" + "@aws-sdk/util-user-agent-node": "npm:3.577.0" + "@smithy/config-resolver": "npm:^3.0.0" + "@smithy/core": "npm:^2.0.1" + "@smithy/fetch-http-handler": "npm:^3.0.1" + "@smithy/hash-node": "npm:^3.0.0" + "@smithy/invalid-dependency": "npm:^3.0.0" + "@smithy/middleware-content-length": "npm:^3.0.0" + "@smithy/middleware-endpoint": "npm:^3.0.0" + "@smithy/middleware-retry": "npm:^3.0.1" + "@smithy/middleware-serde": "npm:^3.0.0" + "@smithy/middleware-stack": "npm:^3.0.0" + "@smithy/node-config-provider": "npm:^3.0.0" + "@smithy/node-http-handler": "npm:^3.0.0" + "@smithy/protocol-http": "npm:^4.0.0" + "@smithy/smithy-client": "npm:^3.0.1" + "@smithy/types": "npm:^3.0.0" + "@smithy/url-parser": "npm:^3.0.0" + "@smithy/util-base64": "npm:^3.0.0" + "@smithy/util-body-length-browser": "npm:^3.0.0" + "@smithy/util-body-length-node": "npm:^3.0.0" + "@smithy/util-defaults-mode-browser": "npm:^3.0.1" + "@smithy/util-defaults-mode-node": "npm:^3.0.1" + "@smithy/util-endpoints": "npm:^2.0.0" + "@smithy/util-middleware": "npm:^3.0.0" + "@smithy/util-retry": "npm:^3.0.0" + "@smithy/util-utf8": "npm:^3.0.0" + tslib: "npm:^2.6.2" + checksum: 10c0/1a2409cee8f948df48ab8d364a95109b5c7989a2dea139cc7918eff0d4b7ae8b2a221a8697fbf771f7fa14613b4cb8a2d2f710017df9192a513e3ce4505355a4 + languageName: node + linkType: hard + "@aws-sdk/client-rds@npm:^3.299.0": version: 3.299.0 resolution: "@aws-sdk/client-rds@npm:3.299.0" @@ -815,6 +864,54 @@ __metadata: languageName: node linkType: hard +"@aws-sdk/client-sso-oidc@npm:3.583.0": + version: 3.583.0 + resolution: "@aws-sdk/client-sso-oidc@npm:3.583.0" + dependencies: + "@aws-crypto/sha256-browser": "npm:3.0.0" + "@aws-crypto/sha256-js": "npm:3.0.0" + "@aws-sdk/client-sts": "npm:3.583.0" + "@aws-sdk/core": "npm:3.582.0" + "@aws-sdk/credential-provider-node": "npm:3.583.0" + "@aws-sdk/middleware-host-header": "npm:3.577.0" + "@aws-sdk/middleware-logger": "npm:3.577.0" + "@aws-sdk/middleware-recursion-detection": "npm:3.577.0" + "@aws-sdk/middleware-user-agent": "npm:3.583.0" + "@aws-sdk/region-config-resolver": "npm:3.577.0" + "@aws-sdk/types": "npm:3.577.0" + "@aws-sdk/util-endpoints": "npm:3.583.0" + "@aws-sdk/util-user-agent-browser": "npm:3.577.0" + "@aws-sdk/util-user-agent-node": "npm:3.577.0" + "@smithy/config-resolver": "npm:^3.0.0" + "@smithy/core": "npm:^2.0.1" + "@smithy/fetch-http-handler": "npm:^3.0.1" + "@smithy/hash-node": "npm:^3.0.0" + "@smithy/invalid-dependency": "npm:^3.0.0" + "@smithy/middleware-content-length": "npm:^3.0.0" + "@smithy/middleware-endpoint": "npm:^3.0.0" + "@smithy/middleware-retry": "npm:^3.0.1" + "@smithy/middleware-serde": "npm:^3.0.0" + "@smithy/middleware-stack": "npm:^3.0.0" + "@smithy/node-config-provider": "npm:^3.0.0" + "@smithy/node-http-handler": "npm:^3.0.0" + "@smithy/protocol-http": "npm:^4.0.0" + "@smithy/smithy-client": "npm:^3.0.1" + "@smithy/types": "npm:^3.0.0" + "@smithy/url-parser": "npm:^3.0.0" + "@smithy/util-base64": "npm:^3.0.0" + "@smithy/util-body-length-browser": "npm:^3.0.0" + "@smithy/util-body-length-node": "npm:^3.0.0" + "@smithy/util-defaults-mode-browser": "npm:^3.0.1" + "@smithy/util-defaults-mode-node": "npm:^3.0.1" + "@smithy/util-endpoints": "npm:^2.0.0" + "@smithy/util-middleware": "npm:^3.0.0" + "@smithy/util-retry": "npm:^3.0.0" + "@smithy/util-utf8": "npm:^3.0.0" + tslib: "npm:^2.6.2" + checksum: 10c0/5b153aea929501df4f04e27ee9fda1d8ebdfa321d6df4e3b6cf84f145ad5e09485c69aee17581efb88e6dc87f87191c8a54bec2715ce34dfbab11c7c2ffa0b57 + languageName: node + linkType: hard + "@aws-sdk/client-sso@npm:3.299.0": version: 3.299.0 resolution: "@aws-sdk/client-sso@npm:3.299.0" @@ -895,6 +992,52 @@ __metadata: languageName: node linkType: hard +"@aws-sdk/client-sso@npm:3.583.0": + version: 3.583.0 + resolution: "@aws-sdk/client-sso@npm:3.583.0" + dependencies: + "@aws-crypto/sha256-browser": "npm:3.0.0" + "@aws-crypto/sha256-js": "npm:3.0.0" + "@aws-sdk/core": "npm:3.582.0" + "@aws-sdk/middleware-host-header": "npm:3.577.0" + "@aws-sdk/middleware-logger": "npm:3.577.0" + "@aws-sdk/middleware-recursion-detection": "npm:3.577.0" + "@aws-sdk/middleware-user-agent": "npm:3.583.0" + "@aws-sdk/region-config-resolver": "npm:3.577.0" + "@aws-sdk/types": "npm:3.577.0" + "@aws-sdk/util-endpoints": "npm:3.583.0" + "@aws-sdk/util-user-agent-browser": "npm:3.577.0" + "@aws-sdk/util-user-agent-node": "npm:3.577.0" + "@smithy/config-resolver": "npm:^3.0.0" + "@smithy/core": "npm:^2.0.1" + "@smithy/fetch-http-handler": "npm:^3.0.1" + "@smithy/hash-node": "npm:^3.0.0" + "@smithy/invalid-dependency": "npm:^3.0.0" + "@smithy/middleware-content-length": "npm:^3.0.0" + "@smithy/middleware-endpoint": "npm:^3.0.0" + "@smithy/middleware-retry": "npm:^3.0.1" + "@smithy/middleware-serde": "npm:^3.0.0" + "@smithy/middleware-stack": "npm:^3.0.0" + "@smithy/node-config-provider": "npm:^3.0.0" + "@smithy/node-http-handler": "npm:^3.0.0" + "@smithy/protocol-http": "npm:^4.0.0" + "@smithy/smithy-client": "npm:^3.0.1" + "@smithy/types": "npm:^3.0.0" + "@smithy/url-parser": "npm:^3.0.0" + "@smithy/util-base64": "npm:^3.0.0" + "@smithy/util-body-length-browser": "npm:^3.0.0" + "@smithy/util-body-length-node": "npm:^3.0.0" + "@smithy/util-defaults-mode-browser": "npm:^3.0.1" + "@smithy/util-defaults-mode-node": "npm:^3.0.1" + "@smithy/util-endpoints": "npm:^2.0.0" + "@smithy/util-middleware": "npm:^3.0.0" + "@smithy/util-retry": "npm:^3.0.0" + "@smithy/util-utf8": "npm:^3.0.0" + tslib: "npm:^2.6.2" + checksum: 10c0/d426ae5922c3c694a27e7f4a3b31faea7930e9cf9c0ef44400aa52a7cdf700b111ec4945c7a8afc498a5cb88daaa2ea05ddea271da98707021ddcf0684a36f99 + languageName: node + linkType: hard + "@aws-sdk/client-sts@npm:3.299.0": version: 3.299.0 resolution: "@aws-sdk/client-sts@npm:3.299.0" @@ -939,7 +1082,7 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/client-sts@npm:3.332.0, @aws-sdk/client-sts@npm:^3.299.0": +"@aws-sdk/client-sts@npm:3.332.0": version: 3.332.0 resolution: "@aws-sdk/client-sts@npm:3.332.0" dependencies: @@ -983,6 +1126,54 @@ __metadata: languageName: node linkType: hard +"@aws-sdk/client-sts@npm:3.583.0, @aws-sdk/client-sts@npm:^3.299.0": + version: 3.583.0 + resolution: "@aws-sdk/client-sts@npm:3.583.0" + dependencies: + "@aws-crypto/sha256-browser": "npm:3.0.0" + "@aws-crypto/sha256-js": "npm:3.0.0" + "@aws-sdk/client-sso-oidc": "npm:3.583.0" + "@aws-sdk/core": "npm:3.582.0" + "@aws-sdk/credential-provider-node": "npm:3.583.0" + "@aws-sdk/middleware-host-header": "npm:3.577.0" + "@aws-sdk/middleware-logger": "npm:3.577.0" + "@aws-sdk/middleware-recursion-detection": "npm:3.577.0" + "@aws-sdk/middleware-user-agent": "npm:3.583.0" + "@aws-sdk/region-config-resolver": "npm:3.577.0" + "@aws-sdk/types": "npm:3.577.0" + "@aws-sdk/util-endpoints": "npm:3.583.0" + "@aws-sdk/util-user-agent-browser": "npm:3.577.0" + "@aws-sdk/util-user-agent-node": "npm:3.577.0" + "@smithy/config-resolver": "npm:^3.0.0" + "@smithy/core": "npm:^2.0.1" + "@smithy/fetch-http-handler": "npm:^3.0.1" + "@smithy/hash-node": "npm:^3.0.0" + "@smithy/invalid-dependency": "npm:^3.0.0" + "@smithy/middleware-content-length": "npm:^3.0.0" + "@smithy/middleware-endpoint": "npm:^3.0.0" + "@smithy/middleware-retry": "npm:^3.0.1" + "@smithy/middleware-serde": "npm:^3.0.0" + "@smithy/middleware-stack": "npm:^3.0.0" + "@smithy/node-config-provider": "npm:^3.0.0" + "@smithy/node-http-handler": "npm:^3.0.0" + "@smithy/protocol-http": "npm:^4.0.0" + "@smithy/smithy-client": "npm:^3.0.1" + "@smithy/types": "npm:^3.0.0" + "@smithy/url-parser": "npm:^3.0.0" + "@smithy/util-base64": "npm:^3.0.0" + "@smithy/util-body-length-browser": "npm:^3.0.0" + "@smithy/util-body-length-node": "npm:^3.0.0" + "@smithy/util-defaults-mode-browser": "npm:^3.0.1" + "@smithy/util-defaults-mode-node": "npm:^3.0.1" + "@smithy/util-endpoints": "npm:^2.0.0" + "@smithy/util-middleware": "npm:^3.0.0" + "@smithy/util-retry": "npm:^3.0.0" + "@smithy/util-utf8": "npm:^3.0.0" + tslib: "npm:^2.6.2" + checksum: 10c0/795bac0fbac8828bcc6d085abb861e39b93994bedeb22a0b9221f7eb9cb47c8670710d518a87498c1921536aef538eb670dc347ff4f459564ba973738d62c93d + languageName: node + linkType: hard + "@aws-sdk/config-resolver@npm:3.299.0": version: 3.299.0 resolution: "@aws-sdk/config-resolver@npm:3.299.0" @@ -1007,6 +1198,21 @@ __metadata: languageName: node linkType: hard +"@aws-sdk/core@npm:3.582.0": + version: 3.582.0 + resolution: "@aws-sdk/core@npm:3.582.0" + dependencies: + "@smithy/core": "npm:^2.0.1" + "@smithy/protocol-http": "npm:^4.0.0" + "@smithy/signature-v4": "npm:^3.0.0" + "@smithy/smithy-client": "npm:^3.0.1" + "@smithy/types": "npm:^3.0.0" + fast-xml-parser: "npm:4.2.5" + tslib: "npm:^2.6.2" + checksum: 10c0/88d5e4ba0e05c1ebd7a7d852c4cab17fdd210c881a295a604793939a90703ff1e03ddce04d7a37f68f58da4687c1d2c3babf8b4873e04cc4e64471cda1678690 + languageName: node + linkType: hard + "@aws-sdk/credential-provider-cognito-identity@npm:3.299.0": version: 3.299.0 resolution: "@aws-sdk/credential-provider-cognito-identity@npm:3.299.0" @@ -1041,6 +1247,35 @@ __metadata: languageName: node linkType: hard +"@aws-sdk/credential-provider-env@npm:3.577.0": + version: 3.577.0 + resolution: "@aws-sdk/credential-provider-env@npm:3.577.0" + dependencies: + "@aws-sdk/types": "npm:3.577.0" + "@smithy/property-provider": "npm:^3.0.0" + "@smithy/types": "npm:^3.0.0" + tslib: "npm:^2.6.2" + checksum: 10c0/1ba9837bc96bc182f852f1e486ce511eb1b79ff30087cbb6b03ed1dc8013c161c7138b89c5b46adfc8f26b5b87f0d1bd1b90740b80cff27ad5629e3b053aab76 + languageName: node + linkType: hard + +"@aws-sdk/credential-provider-http@npm:3.582.0": + version: 3.582.0 + resolution: "@aws-sdk/credential-provider-http@npm:3.582.0" + dependencies: + "@aws-sdk/types": "npm:3.577.0" + "@smithy/fetch-http-handler": "npm:^3.0.1" + "@smithy/node-http-handler": "npm:^3.0.0" + "@smithy/property-provider": "npm:^3.0.0" + "@smithy/protocol-http": "npm:^4.0.0" + "@smithy/smithy-client": "npm:^3.0.1" + "@smithy/types": "npm:^3.0.0" + "@smithy/util-stream": "npm:^3.0.1" + tslib: "npm:^2.6.2" + checksum: 10c0/c18bd66be34cdf858fbee1beb2643d7c302296656b4f0743a0fdc7f7d1c7dde66f1dec2eae0a8c8a87a5c4df096298f8827f5812e1a861cce40d9f0af0be570a + languageName: node + linkType: hard + "@aws-sdk/credential-provider-imds@npm:3.296.0": version: 3.296.0 resolution: "@aws-sdk/credential-provider-imds@npm:3.296.0" @@ -1101,6 +1336,26 @@ __metadata: languageName: node linkType: hard +"@aws-sdk/credential-provider-ini@npm:3.583.0": + version: 3.583.0 + resolution: "@aws-sdk/credential-provider-ini@npm:3.583.0" + dependencies: + "@aws-sdk/credential-provider-env": "npm:3.577.0" + "@aws-sdk/credential-provider-process": "npm:3.577.0" + "@aws-sdk/credential-provider-sso": "npm:3.583.0" + "@aws-sdk/credential-provider-web-identity": "npm:3.577.0" + "@aws-sdk/types": "npm:3.577.0" + "@smithy/credential-provider-imds": "npm:^3.0.0" + "@smithy/property-provider": "npm:^3.0.0" + "@smithy/shared-ini-file-loader": "npm:^3.0.0" + "@smithy/types": "npm:^3.0.0" + tslib: "npm:^2.6.2" + peerDependencies: + "@aws-sdk/client-sts": ^3.583.0 + checksum: 10c0/eea729dd45cf0cd4de9c8c0d5b324b4652fa36fd064b44bdc482e0fdab7e19f3c5ea877a288ad70c126e2568f148b497c85ffb43dfa2fb9a43ad61a78e0c9b17 + languageName: node + linkType: hard + "@aws-sdk/credential-provider-node@npm:3.299.0": version: 3.299.0 resolution: "@aws-sdk/credential-provider-node@npm:3.299.0" @@ -1137,6 +1392,26 @@ __metadata: languageName: node linkType: hard +"@aws-sdk/credential-provider-node@npm:3.583.0": + version: 3.583.0 + resolution: "@aws-sdk/credential-provider-node@npm:3.583.0" + dependencies: + "@aws-sdk/credential-provider-env": "npm:3.577.0" + "@aws-sdk/credential-provider-http": "npm:3.582.0" + "@aws-sdk/credential-provider-ini": "npm:3.583.0" + "@aws-sdk/credential-provider-process": "npm:3.577.0" + "@aws-sdk/credential-provider-sso": "npm:3.583.0" + "@aws-sdk/credential-provider-web-identity": "npm:3.577.0" + "@aws-sdk/types": "npm:3.577.0" + "@smithy/credential-provider-imds": "npm:^3.0.0" + "@smithy/property-provider": "npm:^3.0.0" + "@smithy/shared-ini-file-loader": "npm:^3.0.0" + "@smithy/types": "npm:^3.0.0" + tslib: "npm:^2.6.2" + checksum: 10c0/c757ec2cf610dba94d447757f8830dbd1f092cf22e897910776da93f0a59ecef406c010d5db2ea6c73b6f912cbbe9f71c7350c161902e965b89216f66719703c + languageName: node + linkType: hard + "@aws-sdk/credential-provider-process@npm:3.296.0": version: 3.296.0 resolution: "@aws-sdk/credential-provider-process@npm:3.296.0" @@ -1161,6 +1436,19 @@ __metadata: languageName: node linkType: hard +"@aws-sdk/credential-provider-process@npm:3.577.0": + version: 3.577.0 + resolution: "@aws-sdk/credential-provider-process@npm:3.577.0" + dependencies: + "@aws-sdk/types": "npm:3.577.0" + "@smithy/property-provider": "npm:^3.0.0" + "@smithy/shared-ini-file-loader": "npm:^3.0.0" + "@smithy/types": "npm:^3.0.0" + tslib: "npm:^2.6.2" + checksum: 10c0/07867d102a85846ff6f0cca8b5d28ac22f829ca10b9d799f4d437832e162992b06de0a81947866acc5d7e950210fc1a859d446732d4dfae1f4fb393eea6b5316 + languageName: node + linkType: hard + "@aws-sdk/credential-provider-sso@npm:3.299.0": version: 3.299.0 resolution: "@aws-sdk/credential-provider-sso@npm:3.299.0" @@ -1189,6 +1477,21 @@ __metadata: languageName: node linkType: hard +"@aws-sdk/credential-provider-sso@npm:3.583.0": + version: 3.583.0 + resolution: "@aws-sdk/credential-provider-sso@npm:3.583.0" + dependencies: + "@aws-sdk/client-sso": "npm:3.583.0" + "@aws-sdk/token-providers": "npm:3.577.0" + "@aws-sdk/types": "npm:3.577.0" + "@smithy/property-provider": "npm:^3.0.0" + "@smithy/shared-ini-file-loader": "npm:^3.0.0" + "@smithy/types": "npm:^3.0.0" + tslib: "npm:^2.6.2" + checksum: 10c0/5e8d5623d7c6be03091240baffeb7ed1e21832f466c3d985bba396a7a47dd6a22b399b2239c9c01db6e3625dd566c192a93f5fd44b24bb2d9ad098966be4bb96 + languageName: node + linkType: hard + "@aws-sdk/credential-provider-web-identity@npm:3.296.0": version: 3.296.0 resolution: "@aws-sdk/credential-provider-web-identity@npm:3.296.0" @@ -1211,6 +1514,20 @@ __metadata: languageName: node linkType: hard +"@aws-sdk/credential-provider-web-identity@npm:3.577.0": + version: 3.577.0 + resolution: "@aws-sdk/credential-provider-web-identity@npm:3.577.0" + dependencies: + "@aws-sdk/types": "npm:3.577.0" + "@smithy/property-provider": "npm:^3.0.0" + "@smithy/types": "npm:^3.0.0" + tslib: "npm:^2.6.2" + peerDependencies: + "@aws-sdk/client-sts": ^3.577.0 + checksum: 10c0/d8fa1f97f2d76b4b4e3bdcafb3d3962566524df1f22b181567d7ff5dae51eae6be557f56c7e99038ea4f3e9a19b7e57ab009997fb4ad6127dc576f2dfdd31707 + languageName: node + linkType: hard + "@aws-sdk/credential-providers@npm:3.299.0, @aws-sdk/credential-providers@npm:^3.299.0": version: 3.299.0 resolution: "@aws-sdk/credential-providers@npm:3.299.0" @@ -1554,6 +1871,18 @@ __metadata: languageName: node linkType: hard +"@aws-sdk/middleware-host-header@npm:3.577.0": + version: 3.577.0 + resolution: "@aws-sdk/middleware-host-header@npm:3.577.0" + dependencies: + "@aws-sdk/types": "npm:3.577.0" + "@smithy/protocol-http": "npm:^4.0.0" + "@smithy/types": "npm:^3.0.0" + tslib: "npm:^2.6.2" + checksum: 10c0/443e00eeab3d67c988d0102338e8625f72329d06340ce73723bbcd287a5bf435f9e32988e38c7f9b2e0cf56718a72653799bc06187e5cd8d3aeb44a9eb765a3c + languageName: node + linkType: hard + "@aws-sdk/middleware-location-constraint@npm:3.296.0": version: 3.296.0 resolution: "@aws-sdk/middleware-location-constraint@npm:3.296.0" @@ -1584,6 +1913,17 @@ __metadata: languageName: node linkType: hard +"@aws-sdk/middleware-logger@npm:3.577.0": + version: 3.577.0 + resolution: "@aws-sdk/middleware-logger@npm:3.577.0" + dependencies: + "@aws-sdk/types": "npm:3.577.0" + "@smithy/types": "npm:^3.0.0" + tslib: "npm:^2.6.2" + checksum: 10c0/398b7f45e591103a3a90388be4dedd0ca83b02133b5a49907f4f671cc1a3539e1af21da2df232cdc977a88a7fa3261af08e8875f25eff23f87588fb9899fd796 + languageName: node + linkType: hard + "@aws-sdk/middleware-recursion-detection@npm:3.296.0": version: 3.296.0 resolution: "@aws-sdk/middleware-recursion-detection@npm:3.296.0" @@ -1606,6 +1946,18 @@ __metadata: languageName: node linkType: hard +"@aws-sdk/middleware-recursion-detection@npm:3.577.0": + version: 3.577.0 + resolution: "@aws-sdk/middleware-recursion-detection@npm:3.577.0" + dependencies: + "@aws-sdk/types": "npm:3.577.0" + "@smithy/protocol-http": "npm:^4.0.0" + "@smithy/types": "npm:^3.0.0" + tslib: "npm:^2.6.2" + checksum: 10c0/35e0958a806dd93911a58385b53ce36f724aa15bef8fcf674f80096a13bfa3aca3a80552016772db72577450c5206c324353ae71c6faa896ab6edf738cc743ad + languageName: node + linkType: hard + "@aws-sdk/middleware-retry@npm:3.296.0": version: 3.296.0 resolution: "@aws-sdk/middleware-retry@npm:3.296.0" @@ -1798,6 +2150,19 @@ __metadata: languageName: node linkType: hard +"@aws-sdk/middleware-user-agent@npm:3.583.0": + version: 3.583.0 + resolution: "@aws-sdk/middleware-user-agent@npm:3.583.0" + dependencies: + "@aws-sdk/types": "npm:3.577.0" + "@aws-sdk/util-endpoints": "npm:3.583.0" + "@smithy/protocol-http": "npm:^4.0.0" + "@smithy/types": "npm:^3.0.0" + tslib: "npm:^2.6.2" + checksum: 10c0/c7608c99039e5b7814a841bbc52606a3774ea76ef444c8ba386774fbfa981262a309597bc7ffd0c0a2ec220ca39e79ab0d689c8d0f2117b9ed7d41a2e98ad75f + languageName: node + linkType: hard + "@aws-sdk/node-config-provider@npm:3.296.0": version: 3.296.0 resolution: "@aws-sdk/node-config-provider@npm:3.296.0" @@ -1949,6 +2314,20 @@ __metadata: languageName: node linkType: hard +"@aws-sdk/region-config-resolver@npm:3.577.0": + version: 3.577.0 + resolution: "@aws-sdk/region-config-resolver@npm:3.577.0" + dependencies: + "@aws-sdk/types": "npm:3.577.0" + "@smithy/node-config-provider": "npm:^3.0.0" + "@smithy/types": "npm:^3.0.0" + "@smithy/util-config-provider": "npm:^3.0.0" + "@smithy/util-middleware": "npm:^3.0.0" + tslib: "npm:^2.6.2" + checksum: 10c0/4271d65f5f54c3c3acb3f72070470ead12b1bd12a5fbaf14f5e633da081fcb8ddef7a3a5ffa4c65f09f2a060f585a8f51895db23b71dbe4ba61b4a20f8ac9928 + languageName: node + linkType: hard + "@aws-sdk/service-error-classification@npm:3.296.0": version: 3.296.0 resolution: "@aws-sdk/service-error-classification@npm:3.296.0" @@ -2078,6 +2457,21 @@ __metadata: languageName: node linkType: hard +"@aws-sdk/token-providers@npm:3.577.0": + version: 3.577.0 + resolution: "@aws-sdk/token-providers@npm:3.577.0" + dependencies: + "@aws-sdk/types": "npm:3.577.0" + "@smithy/property-provider": "npm:^3.0.0" + "@smithy/shared-ini-file-loader": "npm:^3.0.0" + "@smithy/types": "npm:^3.0.0" + tslib: "npm:^2.6.2" + peerDependencies: + "@aws-sdk/client-sso-oidc": ^3.577.0 + checksum: 10c0/5d9fade10e1dcb66c4b4c97c21989bbbb71b6a01e1e865561f68c2c2a18f4d797f21f65d9e171aa0580feb9392e90b76ebee7af22c773e6f5ac65e8c11c656f1 + languageName: node + linkType: hard + "@aws-sdk/types@npm:3.296.0": version: 3.296.0 resolution: "@aws-sdk/types@npm:3.296.0" @@ -2087,7 +2481,7 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/types@npm:3.329.0, @aws-sdk/types@npm:^3.1.0, @aws-sdk/types@npm:^3.222.0, @aws-sdk/types@npm:^3.25.0": +"@aws-sdk/types@npm:3.329.0": version: 3.329.0 resolution: "@aws-sdk/types@npm:3.329.0" dependencies: @@ -2096,6 +2490,16 @@ __metadata: languageName: node linkType: hard +"@aws-sdk/types@npm:3.577.0, @aws-sdk/types@npm:^3.1.0, @aws-sdk/types@npm:^3.222.0, @aws-sdk/types@npm:^3.25.0": + version: 3.577.0 + resolution: "@aws-sdk/types@npm:3.577.0" + dependencies: + "@smithy/types": "npm:^3.0.0" + tslib: "npm:^2.6.2" + checksum: 10c0/ae31757b05c2445f52b3f3268d7e9cbae765cae24f088afb8f967c8e3a268b425794a8e99fab3e0428dc6491ccca99b6c57ab5ca69e2d1cc2878ec85ff9643f7 + languageName: node + linkType: hard + "@aws-sdk/url-parser@npm:3.296.0": version: 3.296.0 resolution: "@aws-sdk/url-parser@npm:3.296.0" @@ -2302,6 +2706,18 @@ __metadata: languageName: node linkType: hard +"@aws-sdk/util-endpoints@npm:3.583.0": + version: 3.583.0 + resolution: "@aws-sdk/util-endpoints@npm:3.583.0" + dependencies: + "@aws-sdk/types": "npm:3.577.0" + "@smithy/types": "npm:^3.0.0" + "@smithy/util-endpoints": "npm:^2.0.0" + tslib: "npm:^2.6.2" + checksum: 10c0/81487e7ee4e0542c4d7a3a69b9af50a3df2c0179f87b9f1f470c17991b80fd64585a92593d9821da16e6dc86df44cd4e45c0ebb27babb8ee0dc0226f6eef1418 + languageName: node + linkType: hard + "@aws-sdk/util-format-url@npm:3.296.0": version: 3.296.0 resolution: "@aws-sdk/util-format-url@npm:3.296.0" @@ -2444,6 +2860,18 @@ __metadata: languageName: node linkType: hard +"@aws-sdk/util-user-agent-browser@npm:3.577.0": + version: 3.577.0 + resolution: "@aws-sdk/util-user-agent-browser@npm:3.577.0" + dependencies: + "@aws-sdk/types": "npm:3.577.0" + "@smithy/types": "npm:^3.0.0" + bowser: "npm:^2.11.0" + tslib: "npm:^2.6.2" + checksum: 10c0/795db0f1b7d74f84db56775c609a65eeea94041d731fad1fb071d923d4b180c62c3fdf0e179e08adc11310f894245241584780c7e86bc338b768f6aa000a85f0 + languageName: node + linkType: hard + "@aws-sdk/util-user-agent-node@npm:3.299.0": version: 3.299.0 resolution: "@aws-sdk/util-user-agent-node@npm:3.299.0" @@ -2476,6 +2904,23 @@ __metadata: languageName: node linkType: hard +"@aws-sdk/util-user-agent-node@npm:3.577.0": + version: 3.577.0 + resolution: "@aws-sdk/util-user-agent-node@npm:3.577.0" + dependencies: + "@aws-sdk/types": "npm:3.577.0" + "@smithy/node-config-provider": "npm:^3.0.0" + "@smithy/types": "npm:^3.0.0" + tslib: "npm:^2.6.2" + peerDependencies: + aws-crt: ">=1.0.0" + peerDependenciesMeta: + aws-crt: + optional: true + checksum: 10c0/f45a7f346adc3ca9b4a2cf93fef00d639df81bfe0ba4cc5f869aabbce86a89c40a9510b30c525bbf62e6e19ebacfdd69dc0c44454daab9db61d670db15c98669 + languageName: node + linkType: hard + "@aws-sdk/util-utf8-browser@npm:^3.0.0": version: 3.37.0 resolution: "@aws-sdk/util-utf8-browser@npm:3.37.0" @@ -5784,6 +6229,451 @@ __metadata: languageName: node linkType: hard +"@smithy/abort-controller@npm:^3.0.0": + version: 3.0.0 + resolution: "@smithy/abort-controller@npm:3.0.0" + dependencies: + "@smithy/types": "npm:^3.0.0" + tslib: "npm:^2.6.2" + checksum: 10c0/7582febcbac6cdca851a45925ce57e211f5f6eadbcb5f53ad9bd09a2ee52fe5cc8aa76b623e17e0a42afcd9504c532d0eb6bb7cc305035e2c67684ee56b8988b + languageName: node + linkType: hard + +"@smithy/config-resolver@npm:^3.0.0": + version: 3.0.0 + resolution: "@smithy/config-resolver@npm:3.0.0" + dependencies: + "@smithy/node-config-provider": "npm:^3.0.0" + "@smithy/types": "npm:^3.0.0" + "@smithy/util-config-provider": "npm:^3.0.0" + "@smithy/util-middleware": "npm:^3.0.0" + tslib: "npm:^2.6.2" + checksum: 10c0/f8cf48624bb39939ddbed63d2c94aaf2759a02d81ebb616aa41258e8a390236e6a57ac888c055f76c8365cee67a3ab8e9af439d9f6d9275b0a39b77959fccad8 + languageName: node + linkType: hard + +"@smithy/core@npm:^2.0.1": + version: 2.0.1 + resolution: "@smithy/core@npm:2.0.1" + dependencies: + "@smithy/middleware-endpoint": "npm:^3.0.0" + "@smithy/middleware-retry": "npm:^3.0.1" + "@smithy/middleware-serde": "npm:^3.0.0" + "@smithy/protocol-http": "npm:^4.0.0" + "@smithy/smithy-client": "npm:^3.0.1" + "@smithy/types": "npm:^3.0.0" + "@smithy/util-middleware": "npm:^3.0.0" + tslib: "npm:^2.6.2" + checksum: 10c0/71a581f35bbd06ede752a2b687c05e9be4c10de5995497c8997f10e7def2501f025cc1c1fdd248155a9e36d4f130a86bf8572b04555c1a6c9724f3b81e0c9075 + languageName: node + linkType: hard + +"@smithy/credential-provider-imds@npm:^3.0.0": + version: 3.0.0 + resolution: "@smithy/credential-provider-imds@npm:3.0.0" + dependencies: + "@smithy/node-config-provider": "npm:^3.0.0" + "@smithy/property-provider": "npm:^3.0.0" + "@smithy/types": "npm:^3.0.0" + "@smithy/url-parser": "npm:^3.0.0" + tslib: "npm:^2.6.2" + checksum: 10c0/8e248eb7590107c1745dd0e9290c6ab04fed3f28d899d9c22350a8220ab0374387b0b8c62413ff56c9c2d3f7f3c4b20cfaf09f1014618dfd80086f65377c4e11 + languageName: node + linkType: hard + +"@smithy/fetch-http-handler@npm:^3.0.1": + version: 3.0.1 + resolution: "@smithy/fetch-http-handler@npm:3.0.1" + dependencies: + "@smithy/protocol-http": "npm:^4.0.0" + "@smithy/querystring-builder": "npm:^3.0.0" + "@smithy/types": "npm:^3.0.0" + "@smithy/util-base64": "npm:^3.0.0" + tslib: "npm:^2.6.2" + checksum: 10c0/84378648be8e5023cc1eccda66c516153a37183546318b083e5a998d2dcb4fcffbf85837be8b334331b6f80785c08f7e0e63168dc1b80dfddfdc4d58f3137490 + languageName: node + linkType: hard + +"@smithy/hash-node@npm:^3.0.0": + version: 3.0.0 + resolution: "@smithy/hash-node@npm:3.0.0" + dependencies: + "@smithy/types": "npm:^3.0.0" + "@smithy/util-buffer-from": "npm:^3.0.0" + "@smithy/util-utf8": "npm:^3.0.0" + tslib: "npm:^2.6.2" + checksum: 10c0/3f3ab1afa4bef2ddc923c1d3ad7278621a222d68e59639367fa84597aedac84d1bd614769bed045b60fa5144cb821e192bddfdd5c4842321274207c4311e8b6a + languageName: node + linkType: hard + +"@smithy/invalid-dependency@npm:^3.0.0": + version: 3.0.0 + resolution: "@smithy/invalid-dependency@npm:3.0.0" + dependencies: + "@smithy/types": "npm:^3.0.0" + tslib: "npm:^2.6.2" + checksum: 10c0/f3dfba2caee6849607dc4f6b36a218a9d5091c83c7a440501c38f7fdc4171d58bc5358a5231a53b89a0c7f76ffe68c22645054461311c317bcf80f606d6d6d85 + languageName: node + linkType: hard + +"@smithy/is-array-buffer@npm:^3.0.0": + version: 3.0.0 + resolution: "@smithy/is-array-buffer@npm:3.0.0" + dependencies: + tslib: "npm:^2.6.2" + checksum: 10c0/44710d94b9e6655ebc02169c149ea2bc5d5b9e509b6b39511cfe61bac571412290f4b9c743d61e395822f014021fcb709dbb533f2f717c1ac2d5a356696c22fd + languageName: node + linkType: hard + +"@smithy/middleware-content-length@npm:^3.0.0": + version: 3.0.0 + resolution: "@smithy/middleware-content-length@npm:3.0.0" + dependencies: + "@smithy/protocol-http": "npm:^4.0.0" + "@smithy/types": "npm:^3.0.0" + tslib: "npm:^2.6.2" + checksum: 10c0/b4310878d36c39ca56dc471467fd1d2500fbf50126032c7ec4ab41bb21cbb9f89de5afbf42083fa74605d37377d08350e3ecbc5e7202226237527455cc7453f4 + languageName: node + linkType: hard + +"@smithy/middleware-endpoint@npm:^3.0.0": + version: 3.0.0 + resolution: "@smithy/middleware-endpoint@npm:3.0.0" + dependencies: + "@smithy/middleware-serde": "npm:^3.0.0" + "@smithy/node-config-provider": "npm:^3.0.0" + "@smithy/shared-ini-file-loader": "npm:^3.0.0" + "@smithy/types": "npm:^3.0.0" + "@smithy/url-parser": "npm:^3.0.0" + "@smithy/util-middleware": "npm:^3.0.0" + tslib: "npm:^2.6.2" + checksum: 10c0/d604647cafe9b562893ae2de2f6224ea1090735be8929e4fe1328bbd838c828defb74a96d4c43b43440e7539d1dfee1db37424b8eab2cfb002b9ca54ba93471c + languageName: node + linkType: hard + +"@smithy/middleware-retry@npm:^3.0.1": + version: 3.0.1 + resolution: "@smithy/middleware-retry@npm:3.0.1" + dependencies: + "@smithy/node-config-provider": "npm:^3.0.0" + "@smithy/protocol-http": "npm:^4.0.0" + "@smithy/service-error-classification": "npm:^3.0.0" + "@smithy/smithy-client": "npm:^3.0.1" + "@smithy/types": "npm:^3.0.0" + "@smithy/util-middleware": "npm:^3.0.0" + "@smithy/util-retry": "npm:^3.0.0" + tslib: "npm:^2.6.2" + uuid: "npm:^9.0.1" + checksum: 10c0/b2ae9635a4e81ef2ace07b4143ffe4b6b480eae16bec77a44baf03b69d30e2d1bbdd324bde940b67413c7da6b678fbb510bbbe3afa3c4bb910fb3a6fc470a152 + languageName: node + linkType: hard + +"@smithy/middleware-serde@npm:^3.0.0": + version: 3.0.0 + resolution: "@smithy/middleware-serde@npm:3.0.0" + dependencies: + "@smithy/types": "npm:^3.0.0" + tslib: "npm:^2.6.2" + checksum: 10c0/66f78e261c05087d84287f917948fa992ec38376770ff96ce0cd7a27f116af560e82f1205e5a815a93dc54d08e44a2b2797a3c466099ce2d0ee2beb78840c9a9 + languageName: node + linkType: hard + +"@smithy/middleware-stack@npm:^3.0.0": + version: 3.0.0 + resolution: "@smithy/middleware-stack@npm:3.0.0" + dependencies: + "@smithy/types": "npm:^3.0.0" + tslib: "npm:^2.6.2" + checksum: 10c0/7b9131d3fa1c42e57ca769b6adeb14268c00d480161b493b47bdf5864a267b09cac6b4240ecdc8a69e236d7a77a44024734d6b3f05d94f048c31a8fc2797a506 + languageName: node + linkType: hard + +"@smithy/node-config-provider@npm:^3.0.0": + version: 3.0.0 + resolution: "@smithy/node-config-provider@npm:3.0.0" + dependencies: + "@smithy/property-provider": "npm:^3.0.0" + "@smithy/shared-ini-file-loader": "npm:^3.0.0" + "@smithy/types": "npm:^3.0.0" + tslib: "npm:^2.6.2" + checksum: 10c0/0c6940e695a2a6d6cec945f0e7e5e74dd4eeb2810a543fa389c7bc73f16e5a5af37bd3f93a66ebb433c6e1779e4e1559162d57169848eab1f62b9188a8edb35d + languageName: node + linkType: hard + +"@smithy/node-http-handler@npm:^3.0.0": + version: 3.0.0 + resolution: "@smithy/node-http-handler@npm:3.0.0" + dependencies: + "@smithy/abort-controller": "npm:^3.0.0" + "@smithy/protocol-http": "npm:^4.0.0" + "@smithy/querystring-builder": "npm:^3.0.0" + "@smithy/types": "npm:^3.0.0" + tslib: "npm:^2.6.2" + checksum: 10c0/1f3009f785b6fc6e1bf8b0a249d728e979d9e8264b5cc070c5d43097573b1345df5133468bd16e1222e3c8b864506e26401e48c1b7b2e47426749ba0e0c0cb7c + languageName: node + linkType: hard + +"@smithy/property-provider@npm:^3.0.0": + version: 3.0.0 + resolution: "@smithy/property-provider@npm:3.0.0" + dependencies: + "@smithy/types": "npm:^3.0.0" + tslib: "npm:^2.6.2" + checksum: 10c0/f6446a9bcaa7ba0b3be0ba87ee5d7621b3fa49de2eec6abb5f4240babd0949644ab43e018212f7658d4fde1723a500ffd1f137f4fee5d4e57711c45ad410e19a + languageName: node + linkType: hard + +"@smithy/protocol-http@npm:^4.0.0": + version: 4.0.0 + resolution: "@smithy/protocol-http@npm:4.0.0" + dependencies: + "@smithy/types": "npm:^3.0.0" + tslib: "npm:^2.6.2" + checksum: 10c0/c047f136afbdc8b50990537a73b8656c2756800557b358f81c3939148cd43281b50370a61eb284a2a215fd37e9702a6c2b79b307a1dda3685ec8dff522b146e1 + languageName: node + linkType: hard + +"@smithy/querystring-builder@npm:^3.0.0": + version: 3.0.0 + resolution: "@smithy/querystring-builder@npm:3.0.0" + dependencies: + "@smithy/types": "npm:^3.0.0" + "@smithy/util-uri-escape": "npm:^3.0.0" + tslib: "npm:^2.6.2" + checksum: 10c0/985728a9226ea6b3bd0468c6e3a0d41e2622a7c194d2f787feff03ab88eb114edafd71668dd8e90f936ea8912616a7202250a3242a2b46b94e2d200c0b3b19c0 + languageName: node + linkType: hard + +"@smithy/querystring-parser@npm:^3.0.0": + version: 3.0.0 + resolution: "@smithy/querystring-parser@npm:3.0.0" + dependencies: + "@smithy/types": "npm:^3.0.0" + tslib: "npm:^2.6.2" + checksum: 10c0/59a5f1676e439fd4ae6f5ef751fa660e234c9b9bdd4a2997581b94042dba299a67785c32f5fd3c321e3802cd774ee704d4e192620d5fa434312c0a1c16d9b4fe + languageName: node + linkType: hard + +"@smithy/service-error-classification@npm:^3.0.0": + version: 3.0.0 + resolution: "@smithy/service-error-classification@npm:3.0.0" + dependencies: + "@smithy/types": "npm:^3.0.0" + checksum: 10c0/c63a9169a8f47c85ab290c8cdebe418cf74ea234ed919264cba64248cb5f8ef90118db5513ef7c624a560e4e2e950daa9107f0bbc18160616d3ec9f470e88c57 + languageName: node + linkType: hard + +"@smithy/shared-ini-file-loader@npm:^3.0.0": + version: 3.0.0 + resolution: "@smithy/shared-ini-file-loader@npm:3.0.0" + dependencies: + "@smithy/types": "npm:^3.0.0" + tslib: "npm:^2.6.2" + checksum: 10c0/d56a1db760f4c82e916639ace2ff6f39c2718ac1db876228282b51ae392cae75f69bf1f334e06d2a4500f7831fb6420fd161544199efe6bae1fd1d9408faf9b5 + languageName: node + linkType: hard + +"@smithy/signature-v4@npm:^3.0.0": + version: 3.0.0 + resolution: "@smithy/signature-v4@npm:3.0.0" + dependencies: + "@smithy/is-array-buffer": "npm:^3.0.0" + "@smithy/types": "npm:^3.0.0" + "@smithy/util-hex-encoding": "npm:^3.0.0" + "@smithy/util-middleware": "npm:^3.0.0" + "@smithy/util-uri-escape": "npm:^3.0.0" + "@smithy/util-utf8": "npm:^3.0.0" + tslib: "npm:^2.6.2" + checksum: 10c0/e655dfa6882fedee7ac43fdee6ed22af92baea777ad57a5c54600eba05563b989108ab60bfae661895221897fa987cf483bfecf7165be2fbdc04756d067817e0 + languageName: node + linkType: hard + +"@smithy/smithy-client@npm:^3.0.1": + version: 3.0.1 + resolution: "@smithy/smithy-client@npm:3.0.1" + dependencies: + "@smithy/middleware-endpoint": "npm:^3.0.0" + "@smithy/middleware-stack": "npm:^3.0.0" + "@smithy/protocol-http": "npm:^4.0.0" + "@smithy/types": "npm:^3.0.0" + "@smithy/util-stream": "npm:^3.0.1" + tslib: "npm:^2.6.2" + checksum: 10c0/fac5315460c3b033e105513b0ced4de10542863850c35c34076498abf17c90b392ccb06eb603109de91917ceb002e487072abc5116476c55ff6bf1d127691367 + languageName: node + linkType: hard + +"@smithy/types@npm:^3.0.0": + version: 3.0.0 + resolution: "@smithy/types@npm:3.0.0" + dependencies: + tslib: "npm:^2.6.2" + checksum: 10c0/9f6eefa4f715a8f0bfd79787f82156b4785baaa1524496abe9fc3db96c36f7c782fb962353601d8bd2bba3b449d999d48a09b2b25405bfcd7fb5e1d1c935f1fb + languageName: node + linkType: hard + +"@smithy/url-parser@npm:^3.0.0": + version: 3.0.0 + resolution: "@smithy/url-parser@npm:3.0.0" + dependencies: + "@smithy/querystring-parser": "npm:^3.0.0" + "@smithy/types": "npm:^3.0.0" + tslib: "npm:^2.6.2" + checksum: 10c0/77aca0d0c6946bbdcbb6a21c98a72deac8e0ce4e97e029a9f0e28eded53edb5ad87dfbd199425f6efaf0253cb3886a1b877078491a9c5d62007053d56427a830 + languageName: node + linkType: hard + +"@smithy/util-base64@npm:^3.0.0": + version: 3.0.0 + resolution: "@smithy/util-base64@npm:3.0.0" + dependencies: + "@smithy/util-buffer-from": "npm:^3.0.0" + "@smithy/util-utf8": "npm:^3.0.0" + tslib: "npm:^2.6.2" + checksum: 10c0/5c05c3505bd1ac4c1e04ec0e22ad1c9e0c61756945735861614f9e46146369a1a112dd0895602475822c18b8f1fe0cc3fb9e45c99a4e7fb03308969c673cf043 + languageName: node + linkType: hard + +"@smithy/util-body-length-browser@npm:^3.0.0": + version: 3.0.0 + resolution: "@smithy/util-body-length-browser@npm:3.0.0" + dependencies: + tslib: "npm:^2.6.2" + checksum: 10c0/cfb595e814334fe7bb78e8381141cc7364f66bff0c1d672680f4abb99361ef66fbdb9468fa1dbabcd5753254b2b05c59c907fa9d600b36e6e4b8423eccf412f7 + languageName: node + linkType: hard + +"@smithy/util-body-length-node@npm:^3.0.0": + version: 3.0.0 + resolution: "@smithy/util-body-length-node@npm:3.0.0" + dependencies: + tslib: "npm:^2.6.2" + checksum: 10c0/6f779848e7c81051364cf6e40ed61034a06fa8df3480398528baae54d9b69622abc7d068869e33dbe51fef2bbc6fda3f548ac59644a0f10545a54c87bc3a4391 + languageName: node + linkType: hard + +"@smithy/util-buffer-from@npm:^3.0.0": + version: 3.0.0 + resolution: "@smithy/util-buffer-from@npm:3.0.0" + dependencies: + "@smithy/is-array-buffer": "npm:^3.0.0" + tslib: "npm:^2.6.2" + checksum: 10c0/b10fb81ef34f95418f27c9123c2c1774e690dd447e8064184688c553156bdec46d2ba1b1ae3bad7edd2b58a5ef32ac569e1ad814b36e7ee05eba10526d329983 + languageName: node + linkType: hard + +"@smithy/util-config-provider@npm:^3.0.0": + version: 3.0.0 + resolution: "@smithy/util-config-provider@npm:3.0.0" + dependencies: + tslib: "npm:^2.6.2" + checksum: 10c0/a2c25eac31223eddea306beff2bb3c32e8761f8cb50e8cb2a9d61417a5040e9565dc715a655787e99a37465fdd35bbd0668ff36e06043a5f6b7be48a76974792 + languageName: node + linkType: hard + +"@smithy/util-defaults-mode-browser@npm:^3.0.1": + version: 3.0.1 + resolution: "@smithy/util-defaults-mode-browser@npm:3.0.1" + dependencies: + "@smithy/property-provider": "npm:^3.0.0" + "@smithy/smithy-client": "npm:^3.0.1" + "@smithy/types": "npm:^3.0.0" + bowser: "npm:^2.11.0" + tslib: "npm:^2.6.2" + checksum: 10c0/d2b62aba1bcdf03a776e0e64e26d03f2ca15441ac7c9cf366a55ed1d2c55376a2d4d2511777b706722917914efb78feece6d898e9e130d5e36c6a86c1c952497 + languageName: node + linkType: hard + +"@smithy/util-defaults-mode-node@npm:^3.0.1": + version: 3.0.1 + resolution: "@smithy/util-defaults-mode-node@npm:3.0.1" + dependencies: + "@smithy/config-resolver": "npm:^3.0.0" + "@smithy/credential-provider-imds": "npm:^3.0.0" + "@smithy/node-config-provider": "npm:^3.0.0" + "@smithy/property-provider": "npm:^3.0.0" + "@smithy/smithy-client": "npm:^3.0.1" + "@smithy/types": "npm:^3.0.0" + tslib: "npm:^2.6.2" + checksum: 10c0/f950dc66529e9f7b822d5ff944693f7b27d42ba9ab3645c532379dd2b19d771f3113d2b26c5720eeaab52b66ef50daa3e3ae9941fb4de30d62b9bb7a3687d261 + languageName: node + linkType: hard + +"@smithy/util-endpoints@npm:^2.0.0": + version: 2.0.0 + resolution: "@smithy/util-endpoints@npm:2.0.0" + dependencies: + "@smithy/node-config-provider": "npm:^3.0.0" + "@smithy/types": "npm:^3.0.0" + tslib: "npm:^2.6.2" + checksum: 10c0/9cc0746fb7af795649929458ea57757955e592e504af7874c688d7c148e22a858d8d5cac10788b8c79f97e676f88764e8360dbeeff47d37b300d654bc31ce2da + languageName: node + linkType: hard + +"@smithy/util-hex-encoding@npm:^3.0.0": + version: 3.0.0 + resolution: "@smithy/util-hex-encoding@npm:3.0.0" + dependencies: + tslib: "npm:^2.6.2" + checksum: 10c0/d2fa7270853cc8f22c4f4635c72bf52e303731a68a3999e3ea9da1d38b6bf08c0f884e7d20b65741e3bc68bb3821e1abd1c3406d7a3dce8fc02df019aea59162 + languageName: node + linkType: hard + +"@smithy/util-middleware@npm:^3.0.0": + version: 3.0.0 + resolution: "@smithy/util-middleware@npm:3.0.0" + dependencies: + "@smithy/types": "npm:^3.0.0" + tslib: "npm:^2.6.2" + checksum: 10c0/033f914f85125c36f32bbacccb6afde28be12c31a55cf69ac8da46b935ff01107ca5a0f2f65787a4722389782ec63896f7381ce75a975f64a3ca08add6f10673 + languageName: node + linkType: hard + +"@smithy/util-retry@npm:^3.0.0": + version: 3.0.0 + resolution: "@smithy/util-retry@npm:3.0.0" + dependencies: + "@smithy/service-error-classification": "npm:^3.0.0" + "@smithy/types": "npm:^3.0.0" + tslib: "npm:^2.6.2" + checksum: 10c0/d47673e44161bc316347cc54224a62b748433752644667f6076728b026a7e15ab26adfe169006ff3c69e7f1310bb945c2485485161be43222c6f052270e0fe3a + languageName: node + linkType: hard + +"@smithy/util-stream@npm:^3.0.1": + version: 3.0.1 + resolution: "@smithy/util-stream@npm:3.0.1" + dependencies: + "@smithy/fetch-http-handler": "npm:^3.0.1" + "@smithy/node-http-handler": "npm:^3.0.0" + "@smithy/types": "npm:^3.0.0" + "@smithy/util-base64": "npm:^3.0.0" + "@smithy/util-buffer-from": "npm:^3.0.0" + "@smithy/util-hex-encoding": "npm:^3.0.0" + "@smithy/util-utf8": "npm:^3.0.0" + tslib: "npm:^2.6.2" + checksum: 10c0/a11f01afd89d20278740d71584d27ec7f8ee54776ac81038dfa0e4a665cb367d99594d7f1fc0708ee833f136e100350c24494a681aa39d418287b43e1b0ed3a3 + languageName: node + linkType: hard + +"@smithy/util-uri-escape@npm:^3.0.0": + version: 3.0.0 + resolution: "@smithy/util-uri-escape@npm:3.0.0" + dependencies: + tslib: "npm:^2.6.2" + checksum: 10c0/b8d831348412cfafd9300069e74a12e0075b5e786d7ef6a210ba4ab576001c2525653eec68b71dfe6d7aef71c52f547404c4f0345c0fb476a67277f9d44b1156 + languageName: node + linkType: hard + +"@smithy/util-utf8@npm:^3.0.0": + version: 3.0.0 + resolution: "@smithy/util-utf8@npm:3.0.0" + dependencies: + "@smithy/util-buffer-from": "npm:^3.0.0" + tslib: "npm:^2.6.2" + checksum: 10c0/b568ed84b4770d2ae9b632eb85603765195a791f045af7f47df1369dc26b001056f4edf488b42ca1cd6d852d0155ad306a0d6531e912cb4e633c0d87abaa8899 + languageName: node + linkType: hard + "@svgr/babel-plugin-add-jsx-attribute@npm:^6.0.0": version: 6.0.0 resolution: "@svgr/babel-plugin-add-jsx-attribute@npm:6.0.0" @@ -9189,6 +10079,8 @@ __metadata: version: 0.0.0-use.local resolution: "database-bridge-lambda@workspace:database-bridge-lambda" dependencies: + "@aws-sdk/client-lambda": "npm:^3.299.0" + "@aws-sdk/client-ram": "npm:^3.299.0" postgres: "npm:^3.2.4" ts-node-dev: "npm:^1.0.0" languageName: unknown @@ -10750,6 +11642,17 @@ __metadata: languageName: node linkType: hard +"fast-xml-parser@npm:4.2.5": + version: 4.2.5 + resolution: "fast-xml-parser@npm:4.2.5" + dependencies: + strnum: "npm:^1.0.5" + bin: + fxparser: src/cli/cli.js + checksum: 10c0/f422349189b70660238eff9e48c57a0b9e5142f4c442bd79f50049847006341fe8dbcaac899c54e219034f63249fdba4512542ec54ef4dec24fcf9f54ad20d42 + languageName: node + linkType: hard + "fastest-levenshtein@npm:^1.0.12": version: 1.0.12 resolution: "fastest-levenshtein@npm:1.0.12" @@ -18759,12 +19662,12 @@ __metadata: languageName: node linkType: hard -"uuid@npm:^9.0.0": - version: 9.0.0 - resolution: "uuid@npm:9.0.0" +"uuid@npm:^9.0.0, uuid@npm:^9.0.1": + version: 9.0.1 + resolution: "uuid@npm:9.0.1" bin: uuid: dist/bin/uuid - checksum: 10c0/8867e438990d1d33ac61093e2e4e3477a2148b844e4fa9e3c2360fa4399292429c4b6ec64537eb1659c97b2d10db349c673ad58b50e2824a11e0d3630de3c056 + checksum: 10c0/1607dd32ac7fc22f2d8f77051e6a64845c9bce5cd3dd8aa0070c074ec73e666a1f63c7b4e0f4bf2bc8b9d59dc85a15e17807446d9d2b17c8485fbc2147b27f9b languageName: node linkType: hard