From db3f02a6ca380846d245d458266b6ffab01781c9 Mon Sep 17 00:00:00 2001 From: hathind Date: Mon, 8 May 2023 15:32:12 -0700 Subject: [PATCH 01/33] Remove auth --- .../copilot-chat-app/webapi/appsettings.json | 8 +- .../apps/copilot-chat-app/webapp/README.md | 2 +- .../apps/copilot-chat-app/webapp/env.example | 4 +- .../apps/copilot-chat-app/webapp/package.json | 5 +- .../apps/copilot-chat-app/webapp/src/App.tsx | 132 ++- .../copilot-chat-app/webapp/src/Constants.ts | 56 +- .../webapp/src/components/chat/ChatInput.tsx | 29 +- .../webapp/src/components/chat/ChatRoom.tsx | 12 +- .../webapp/src/components/chat/ChatStatus.tsx | 8 +- .../webapp/src/components/chat/ChatWindow.tsx | 9 +- .../open-api-plugins/PluginConnector.tsx | 45 +- .../webapp/src/components/views/Login.tsx | 26 - .../copilot-chat-app/webapp/src/index.tsx | 13 +- .../webapp/src/libs/auth/AuthHelper.ts | 98 -- .../webapp/src/libs/auth/TokenHelper.ts | 103 --- .../src/libs/connectors/useConnectors.ts | 48 - .../libs/semantic-kernel/DocumentImport.ts | 16 +- .../libs/semantic-kernel/SemanticKernel.ts | 2 - .../libs/semantic-kernel/useDocumentImport.ts | 2 +- .../webapp/src/libs/services/BaseService.ts | 2 - .../webapp/src/libs/services/BotService.ts | 32 +- .../webapp/src/libs/services/ChatService.ts | 79 +- .../webapp/src/libs/useChat.ts | 90 +- .../redux/features/plugins/PluginsState.ts | 19 - .../redux/features/plugins/pluginsSlice.ts | 6 - .../apps/copilot-chat-app/webapp/yarn.lock | 851 +++++++----------- 26 files changed, 477 insertions(+), 1220 deletions(-) delete mode 100644 samples/apps/copilot-chat-app/webapp/src/components/views/Login.tsx delete mode 100644 samples/apps/copilot-chat-app/webapp/src/libs/auth/AuthHelper.ts delete mode 100644 samples/apps/copilot-chat-app/webapp/src/libs/auth/TokenHelper.ts diff --git a/samples/apps/copilot-chat-app/webapi/appsettings.json b/samples/apps/copilot-chat-app/webapi/appsettings.json index 273f92c1c0c2..52053afa94da 100644 --- a/samples/apps/copilot-chat-app/webapi/appsettings.json +++ b/samples/apps/copilot-chat-app/webapi/appsettings.json @@ -38,8 +38,8 @@ "Label": "Completion", "AIService": "AzureOpenAI", "DeploymentOrModelId": "gpt-35-turbo", - "Endpoint": "" // ignored when AIService is "OpenAI" - // "Key": "" + "Endpoint": "https://lightspeed-team-shared-openai.openai.azure.com/", // ignored when AIService is "OpenAI" + "Key": "9e2fe86fbbfd4438bdc9bf81e8a1a9c3" }, // @@ -61,8 +61,8 @@ "Label": "Embeddings", "AIService": "AzureOpenAI", "DeploymentOrModelId": "text-embedding-ada-002", - "Endpoint": "" // ignored when AIService is "OpenAI" - // "Key": "" + "Endpoint": "https://lightspeed-team-shared-openai.openai.azure.com/", // ignored when AIService is "OpenAI" + "Key": "9e2fe86fbbfd4438bdc9bf81e8a1a9c3" }, // diff --git a/samples/apps/copilot-chat-app/webapp/README.md b/samples/apps/copilot-chat-app/webapp/README.md index b46e854f1537..f5d4e2310c0d 100644 --- a/samples/apps/copilot-chat-app/webapp/README.md +++ b/samples/apps/copilot-chat-app/webapp/README.md @@ -1,4 +1,4 @@ -# Copilot Chat Web App +# Copilot Chat Guest Web App > This learning sample is for educational purposes only and is not recommended for production deployments. diff --git a/samples/apps/copilot-chat-app/webapp/env.example b/samples/apps/copilot-chat-app/webapp/env.example index 2795ae07b9bd..d2b8c6d8b0b6 100644 --- a/samples/apps/copilot-chat-app/webapp/env.example +++ b/samples/apps/copilot-chat-app/webapp/env.example @@ -1,3 +1 @@ -REACT_APP_BACKEND_URI=https://localhost:40443/ -REACT_APP_AAD_AUTHORITY=https://login.microsoftonline.com/common -REACT_APP_AAD_CLIENT_ID= \ No newline at end of file +REACT_APP_BACKEND_URI=https://localhost:40443/ \ No newline at end of file diff --git a/samples/apps/copilot-chat-app/webapp/package.json b/samples/apps/copilot-chat-app/webapp/package.json index 013d4c8b92c4..9522df0af4fa 100644 --- a/samples/apps/copilot-chat-app/webapp/package.json +++ b/samples/apps/copilot-chat-app/webapp/package.json @@ -1,5 +1,5 @@ { - "name": "copilot-chat", + "name": "copilot-chat-guest", "private": true, "version": "0.0.0", "type": "module", @@ -16,9 +16,6 @@ "eject": "react-scripts eject" }, "dependencies": { - "@azure/ms-rest-js": "^2.6.4", - "@azure/msal-browser": "^2.32.1", - "@azure/msal-react": "^1.5.1", "@fluentui/react-components": "^9.13.0", "@fluentui/react-icons": "^2.0.193", "@fluentui/react-northstar": "^0.66.4", diff --git a/samples/apps/copilot-chat-app/webapp/src/App.tsx b/samples/apps/copilot-chat-app/webapp/src/App.tsx index 4050c6658f63..9a097a8f1fb8 100644 --- a/samples/apps/copilot-chat-app/webapp/src/App.tsx +++ b/samples/apps/copilot-chat-app/webapp/src/App.tsx @@ -1,12 +1,4 @@ // Copyright (c) Microsoft. All rights reserved. - -import { - AuthenticatedTemplate, - UnauthenticatedTemplate, - useAccount, - useIsAuthenticated, - useMsal, -} from '@azure/msal-react'; import { Avatar, Spinner, Subtitle1, makeStyles, shorthands, tokens } from '@fluentui/react-components'; import { Alert } from '@fluentui/react-components/unstable'; import { Dismiss16Regular } from '@fluentui/react-icons'; @@ -15,7 +7,6 @@ import { FC, useEffect } from 'react'; import { PluginGallery } from './components/open-api-plugins/PluginGallery'; import BackendProbe from './components/views/BackendProbe'; import { ChatView } from './components/views/ChatView'; -import { Login } from './components/views/Login'; import { useChat } from './libs/useChat'; import { useAppDispatch, useAppSelector } from './redux/app/hooks'; import { RootState } from './redux/app/store'; @@ -66,91 +57,70 @@ const App: FC = () => { const { alerts } = useAppSelector((state: RootState) => state.app); const dispatch = useAppDispatch(); - const { instance, accounts, inProgress } = useMsal(); - const account = useAccount(accounts[0] || {}); - const isAuthenticated = useIsAuthenticated(); - const chat = useChat(); useEffect(() => { - if (isAuthenticated && account && appState === AppState.LoadingChats) { - instance.setActiveAccount(account); - - // Load all chats from memory - async function loadChats() { - if (await chat.loadChats()) { - setAppState(AppState.Chat); - } + // Load all chats from memory + async function loadChats() { + if (await chat.loadChats()) { + setAppState(AppState.Chat); } - - loadChats(); } + + loadChats(); // eslint-disable-next-line react-hooks/exhaustive-deps - }, [instance, inProgress, isAuthenticated, appState]); + }, [appState]); const onDismissAlert = (key: string) => { dispatch(removeAlert(key)); }; - // TODO: handle error case of missing account information return ( -
- -
-
- Copilot Chat -
- -
-
- -
-
- Copilot Chat -
- - -
-
-
- {alerts && - Object.keys(alerts).map((key) => { - const alert = alerts[key]; - return ( - onDismissAlert(key)} - color="black" - /> - ), - }} - key={key} - > - {alert.message} - - ); - })} - {appState === AppState.ProbeForBackend && ( - setAppState(AppState.LoadingChats)} - /> - )} - {appState === AppState.LoadingChats && } - {appState === AppState.Chat && } -
+
+
+ Copilot Chat +
+ +
- +
+
+ {alerts && + Object.keys(alerts).map((key) => { + const alert = alerts[key]; + return ( + onDismissAlert(key)} + color="black" + /> + ), + }} + key={key} + > + {alert.message} + + ); + })} + {appState === AppState.ProbeForBackend && ( + setAppState(AppState.LoadingChats)} + /> + )} + {appState === AppState.LoadingChats && } + {appState === AppState.Chat && } +
); }; diff --git a/samples/apps/copilot-chat-app/webapp/src/Constants.ts b/samples/apps/copilot-chat-app/webapp/src/Constants.ts index f2a863149348..5ff145ae0066 100644 --- a/samples/apps/copilot-chat-app/webapp/src/Constants.ts +++ b/samples/apps/copilot-chat-app/webapp/src/Constants.ts @@ -1,20 +1,13 @@ export const Constants = { + GuestUser: { + id: 'guest-user-id', + name: 'guest-user-name', + email: 'guest-user-email', + }, app: { name: 'Copilot', updateCheckIntervalSeconds: 60 * 5, }, - msal: { - method: 'redirect', // 'redirect' | 'popup' - auth: { - clientId: process.env.REACT_APP_AAD_CLIENT_ID as string, - authority: process.env.REACT_APP_AAD_AUTHORITY as string, - }, - cache: { - cacheLocation: 'localStorage', - storeAuthStateInCookie: false, - }, - skScopes: ['openid', 'offline_access', 'profile'], - }, bot: { profile: { id: 'bot', @@ -33,43 +26,4 @@ export const Constants = { defaultDefinition: 'int', }, }, - // This is not a comprehensive list, see https://learn.microsoft.com/en-us/graph/permissions-reference. - // Uncomment the ones you need and pass into invokeSkillWithMsalToken (./connectors/useConnectors.ts) - // Your application will need to be granted these permissions in Azure AD. - msGraphScopes: [ - 'Calendars.Read', // Get Schedule Availability - // 'Calendars.ReadWrite', - // 'Calendars.Read.Shared', - // 'ChannelMessage.Read.All', - // 'Chat.Read', - // 'Contacts.Read', - // 'Contacts.Read.Shared', - // 'Files.Read', - // 'Files.Read.All', - // 'Files.Read.Selected', - // 'Files.ReadWrite', // Upload Files to OneDrive, Create a Share link - // 'Group.Read.All', - 'Mail.Read', - // 'Mail.Read.Shared', - // 'Mail.Send', // Send Email - // 'MailboxSettings.Read', - // 'Notes.Read', - // 'Notes.Read.All', - // 'offline_access', - // 'OnlineMeetingArtifact.Read.All', - // 'OnlineMeetings.Read', - // 'OnlineMeetings.ReadWrite', // Create Meeting - // 'OnlineMeetings.ReadWrite.All', - // 'People.Read', - // 'Presence.Read.All', - // 'Sites.Read.All', // List Trending SharePoint Documents - // 'Tasks.Read', - // 'Tasks.Read.Shared', - 'Tasks.ReadWrite', // Manage Task or To Do Task list - // 'TeamSettings.Read.All', - 'User.Read', - // 'User.Read.All', // Get Manager (requires admin consent) - // 'User.ReadBasic.All', - ], - adoScopes: ['vso.work'], }; diff --git a/samples/apps/copilot-chat-app/webapp/src/components/chat/ChatInput.tsx b/samples/apps/copilot-chat-app/webapp/src/components/chat/ChatInput.tsx index b17777f782cf..baae429b5b18 100644 --- a/samples/apps/copilot-chat-app/webapp/src/components/chat/ChatInput.tsx +++ b/samples/apps/copilot-chat-app/webapp/src/components/chat/ChatInput.tsx @@ -1,13 +1,11 @@ // Copyright (c) Microsoft. All rights reserved. -import { useMsal } from '@azure/msal-react'; import { Button, Spinner, Textarea, makeStyles, shorthands, tokens } from '@fluentui/react-components'; import { AttachRegular, MicRegular, SendRegular } from '@fluentui/react-icons'; import debug from 'debug'; import * as speechSdk from 'microsoft-cognitiveservices-speech-sdk'; import React, { useRef } from 'react'; import { Constants } from '../../Constants'; -import { AuthHelper } from '../../libs/auth/AuthHelper'; import { AlertType } from '../../libs/models/AlertType'; import { useDocumentImportService } from '../../libs/semantic-kernel/useDocumentImport'; import { useAppDispatch } from '../../redux/app/hooks'; @@ -51,7 +49,7 @@ const useClasses = makeStyles({ functional: { display: 'flex', flexDirection: 'row', - } + }, }); interface ChatInputProps { @@ -63,7 +61,6 @@ interface ChatInputProps { export const ChatInput: React.FC = (props) => { const { isTyping, onSubmit } = props; const classes = useClasses(); - const { instance } = useMsal(); const dispatch = useAppDispatch(); const [value, setValue] = React.useState(''); const [previousValue, setPreviousValue] = React.useState(''); @@ -78,8 +75,7 @@ export const ChatInput: React.FC = (props) => { if (recognizer) return; void (async () => { var response = await speechService.validSpeechKeyAsync(); - if(response.isSuccess) - { + if (response.isSuccess) { const newRecognizer = await speechService.getSpeechRecognizerAsyncWithValidKey(response); setRecognizer(newRecognizer); } @@ -108,10 +104,7 @@ export const ChatInput: React.FC = (props) => { if (documentFile) { try { SetDocumentImporting(true); - await documentImportService.importDocumentAsync( - documentFile, - await AuthHelper.getSKaaSAccessToken(instance) - ); + await documentImportService.importDocumentAsync(documentFile); dispatch(addAlert({ message: 'Document uploaded successfully', type: AlertType.Success })); } catch (e: any) { const errorMessage = `Failed to upload document. Details: ${e.message ?? e}`; @@ -182,16 +175,26 @@ export const ChatInput: React.FC = (props) => { type="file" ref={documentFileRef} style={{ display: 'none' }} - accept='.txt,.pdf' + accept=".txt,.pdf" multiple={false} onChange={() => importDocument()} /> -
{recognizer && ( -
diff --git a/samples/apps/copilot-chat-app/webapp/src/components/chat/ChatRoom.tsx b/samples/apps/copilot-chat-app/webapp/src/components/chat/ChatRoom.tsx index ae1a29ea5c8d..98c19c98a00a 100644 --- a/samples/apps/copilot-chat-app/webapp/src/components/chat/ChatRoom.tsx +++ b/samples/apps/copilot-chat-app/webapp/src/components/chat/ChatRoom.tsx @@ -1,6 +1,5 @@ // Copyright (c) Microsoft. All rights reserved. -import { useAccount, useMsal } from '@azure/msal-react'; import { makeStyles, shorthands, tokens } from '@fluentui/react-components'; import debug from 'debug'; import React from 'react'; @@ -44,9 +43,6 @@ export const ChatRoom: React.FC = () => { const messages = conversations[selectedId].messages; const classes = useClasses(); - const { accounts } = useMsal(); - const account = useAccount(accounts[0] || {}); - const dispatch = useAppDispatch(); const scrollViewTargetRef = React.useRef(null); const scrollTargetRef = React.useRef(null); @@ -80,16 +76,12 @@ export const ChatRoom: React.FC = () => { }; }, []); - if (!account) { - return null; - } - const handleSubmit = async (value: string) => { log('submitting user chat message'); const chatInput = { timestamp: new Date().getTime(), - userId: account?.homeAccountId, - userName: account?.name as string, + userId: Constants.GuestUser.id, + userName: Constants.GuestUser.name, content: value, authorRole: AuthorRoles.User, }; diff --git a/samples/apps/copilot-chat-app/webapp/src/components/chat/ChatStatus.tsx b/samples/apps/copilot-chat-app/webapp/src/components/chat/ChatStatus.tsx index 4710642c38b6..044e677e7aa5 100644 --- a/samples/apps/copilot-chat-app/webapp/src/components/chat/ChatStatus.tsx +++ b/samples/apps/copilot-chat-app/webapp/src/components/chat/ChatStatus.tsx @@ -1,6 +1,5 @@ // Copyright (c) Microsoft. All rights reserved. -import { useAccount, useMsal } from '@azure/msal-react'; import { Label, makeStyles } from '@fluentui/react-components'; import React from 'react'; import { Constants } from '../../Constants'; @@ -20,8 +19,7 @@ const useClasses = makeStyles({ export const ChatStatus: React.FC = () => { const classes = useClasses(); - const { accounts } = useMsal(); - const account = useAccount(accounts[0] || {}); + const { conversations, selectedId } = useAppSelector((state: RootState) => state.conversations); const { audience, botTypingTimestamp } = conversations[selectedId]; const [typing, setTyping] = React.useState([]); @@ -40,7 +38,7 @@ export const ChatStatus: React.FC = () => { } const typingAudience = audience.filter( (chatUser: ChatUser) => - chatUser.id !== account?.homeAccountId && + chatUser.id !== Constants.GuestUser.id && chatUser.lastTypingTimestamp > Date.now() - timeoutDuration, ); updatedTyping.push(...typingAudience); @@ -52,7 +50,7 @@ export const ChatStatus: React.FC = () => { checkAreTyping(); }, timeoutDuration + 1000); return () => clearTimeout(timer); - }, [account?.homeAccountId, audience, botTypingTimestamp]); + }, [audience, botTypingTimestamp]); let message = ''; switch (typing.length) { diff --git a/samples/apps/copilot-chat-app/webapp/src/components/chat/ChatWindow.tsx b/samples/apps/copilot-chat-app/webapp/src/components/chat/ChatWindow.tsx index 6a1119d86c10..2f59f3dd2ab0 100644 --- a/samples/apps/copilot-chat-app/webapp/src/components/chat/ChatWindow.tsx +++ b/samples/apps/copilot-chat-app/webapp/src/components/chat/ChatWindow.tsx @@ -1,6 +1,5 @@ // Copyright (c) Microsoft. All rights reserved. -import { useMsal } from '@azure/msal-react'; import { Button, Input, @@ -14,7 +13,6 @@ import { } from '@fluentui/react-components'; import { EditRegular, Save24Regular } from '@fluentui/react-icons'; import React, { useEffect, useState } from 'react'; -import { AuthHelper } from '../../libs/auth/AuthHelper'; import { AlertType } from '../../libs/models/AlertType'; import { ChatService } from '../../libs/services/ChatService'; import { useAppDispatch, useAppSelector } from '../../redux/app/hooks'; @@ -86,7 +84,6 @@ export const ChatWindow: React.FC = () => { const chatName = conversations[selectedId].title; const [title, setTitle] = useState(selectedId ?? undefined); const [isEditing, setIsEditing] = useState(false); - const { instance } = useMsal(); const chatService = new ChatService(process.env.REACT_APP_BACKEND_URI as string); @@ -94,11 +91,7 @@ export const ChatWindow: React.FC = () => { if (isEditing) { if (chatName !== title) { try { - await chatService.editChatAsync( - conversations[selectedId].id, - title!, - await AuthHelper.getSKaaSAccessToken(instance) - ); + await chatService.editChatAsync(conversations[selectedId].id, title!); dispatch(editConversationTitle({ id: selectedId ?? '', newTitle: title ?? '' })); } catch (e: any) { diff --git a/samples/apps/copilot-chat-app/webapp/src/components/open-api-plugins/PluginConnector.tsx b/samples/apps/copilot-chat-app/webapp/src/components/open-api-plugins/PluginConnector.tsx index fc53851eb18e..696e7d2a1405 100644 --- a/samples/apps/copilot-chat-app/webapp/src/components/open-api-plugins/PluginConnector.tsx +++ b/samples/apps/copilot-chat-app/webapp/src/components/open-api-plugins/PluginConnector.tsx @@ -1,4 +1,3 @@ -import { useMsal } from '@azure/msal-react'; import { Body1, Body1Strong, @@ -17,7 +16,6 @@ import { } from '@fluentui/react-components'; import { Dismiss20Regular } from '@fluentui/react-icons'; import { FormEvent, useState } from 'react'; -import { TokenHelper } from '../../libs/auth/TokenHelper'; import { useAppDispatch } from '../../redux/app/hooks'; import { AdditionalApiProperties, PluginAuthRequirements, Plugins } from '../../redux/features/plugins/PluginsState'; import { connectPlugin } from '../../redux/features/plugins/pluginsSlice'; @@ -68,8 +66,6 @@ export const PluginConnector: React.FC = ({ const usernameRequired = authRequirements.username; const passwordRequired = authRequirements.password; const accessTokenRequired = authRequirements.personalAccessToken; - const msalRequired = authRequirements.Msal; - const oauthRequired = authRequirements.OAuth; const [username, setUsername] = useState(''); const [password, setPassword] = useState(''); @@ -80,34 +76,20 @@ export const PluginConnector: React.FC = ({ const [errorMessage, setErrorMessage] = useState(); const dispatch = useAppDispatch(); - const { instance, inProgress } = useMsal(); const handleSubmit = async (event: FormEvent) => { event.preventDefault(); try { - if (msalRequired) { - const token = await TokenHelper.getAccessTokenUsingMsal(inProgress, instance, authRequirements.scopes!); - dispatch( - connectPlugin({ - plugin: name, - accessToken: token, - apiProperties: apiPropertiesInput, - }), - ); - } else if (oauthRequired) { - // TODO: implement OAuth Flow - } else { - // Basic Auth or PAT - dispatch( - connectPlugin({ - plugin: name, - username: username, - password: password, - accessToken: accessToken, - apiProperties: apiPropertiesInput, - }), - ); - } + // Basic Auth or PAT + dispatch( + connectPlugin({ + plugin: name, + username: username, + password: password, + accessToken: accessToken, + apiProperties: apiPropertiesInput, + }), + ); setOpen(false); } catch (_e) { @@ -167,13 +149,6 @@ export const PluginConnector: React.FC = ({ {(usernameRequired || accessTokenRequired) && ( Log in to {name} to continue )} - {(msalRequired || oauthRequired) && ( - - {' '} - You will be prompted into sign in with {publisher} on the next screen if you haven't - already provided prior consent. - - )} {usernameRequired && ( <> { - const { instance } = useMsal(); - - return ( -
- Login with your Microsoft Account - - Don't have an account? Create one for free at{' '} - - https://account.microsoft.com/ - - - - -
- ); -}; diff --git a/samples/apps/copilot-chat-app/webapp/src/index.tsx b/samples/apps/copilot-chat-app/webapp/src/index.tsx index e1c5faa388aa..d2a0935cc734 100644 --- a/samples/apps/copilot-chat-app/webapp/src/index.tsx +++ b/samples/apps/copilot-chat-app/webapp/src/index.tsx @@ -1,12 +1,9 @@ -import { PublicClientApplication } from '@azure/msal-browser'; -import { MsalProvider } from '@azure/msal-react'; import { FluentProvider, webLightTheme } from '@fluentui/react-components'; import ReactDOM from 'react-dom/client'; import { Provider as ReduxProvider } from 'react-redux'; import App from './App'; import { Constants } from './Constants'; import './index.css'; -import { AuthHelper } from './libs/auth/AuthHelper'; import { store } from './redux/app/store'; import React from 'react'; @@ -15,8 +12,6 @@ if (!localStorage.getItem('debug')) { localStorage.setItem('debug', `${Constants.debug.root}:*`); } -const msalInstance = new PublicClientApplication(AuthHelper.msalConfig); - let container: HTMLElement | null = null; document.addEventListener('DOMContentLoaded', () => { if (!container) { @@ -28,11 +23,9 @@ document.addEventListener('DOMContentLoaded', () => { root.render( - - - - - + + + , ); diff --git a/samples/apps/copilot-chat-app/webapp/src/libs/auth/AuthHelper.ts b/samples/apps/copilot-chat-app/webapp/src/libs/auth/AuthHelper.ts deleted file mode 100644 index 3db373175dd2..000000000000 --- a/samples/apps/copilot-chat-app/webapp/src/libs/auth/AuthHelper.ts +++ /dev/null @@ -1,98 +0,0 @@ -// Copyright (c) Microsoft. All rights reserved. - -import { - Configuration, - EndSessionRequest, - IPublicClientApplication, - InteractionRequiredAuthError, - LogLevel -} from '@azure/msal-browser'; -import debug from 'debug'; -import { Constants } from '../../Constants'; - -const log = debug(Constants.debug.root).extend('authHelper'); - -const msalConfig: Configuration = { - auth: { - ...Constants.msal.auth, - redirectUri: window.origin, - }, - cache: Constants.msal.cache, - system: { - loggerOptions: { - loggerCallback: (level: LogLevel, message: string, containsPii: boolean) => { - if (containsPii) { - return; - } - switch (level) { - case LogLevel.Error: - log('error:', message); - return; - case LogLevel.Info: - log('info:', message); - return; - case LogLevel.Verbose: - log('verbose:', message); - return; - case LogLevel.Warning: - log('warn:', message); - return; - default: - log(message); - } - }, - }, - windowHashTimeout: 9000, // Applies just to popup calls - In milliseconds - iframeHashTimeout: 9000, // Applies just to silent calls - In milliseconds - loadFrameTimeout: 9000, // Applies to both silent and popup calls - In milliseconds - }, -}; - -const logoutRequest: EndSessionRequest = { - postLogoutRedirectUri: window.origin, -}; - -const ssoSilentRequest = async (msalInstance: IPublicClientApplication) => { - await msalInstance.ssoSilent({ account: msalInstance.getAllAccounts()[0], scopes: Constants.msal.skScopes }); -}; - -const loginAsync = async (instance: IPublicClientApplication) => { - if (Constants.msal.method === 'redirect') { - await instance.loginRedirect({ account: instance.getAllAccounts()[0], scopes: Constants.msal.skScopes }); - } else { - await instance.loginPopup({ account: instance.getAllAccounts()[0], scopes: Constants.msal.skScopes }); - } -}; - -const logoutAsync = async (instance: IPublicClientApplication) => { - if (Constants.msal.method === 'popup') { - void instance.logoutPopup(logoutRequest); - } - if (Constants.msal.method === 'redirect') { - void instance.logoutRedirect(logoutRequest); - } -}; - -// SKaaS = Semantic Kernel as a Service -// Gets token with scopes to authorize SKaaS specifically -const getSKaaSAccessToken = async (instance: IPublicClientApplication) => { - try { - const token = await instance.acquireTokenSilent({ scopes: Constants.msal.skScopes, account: instance.getAllAccounts()[0] }); - return token.accessToken; - } catch (ex: any) { - if (ex instanceof InteractionRequiredAuthError) { - const token = await instance.acquireTokenPopup({ scopes: Constants.msal.skScopes, account: instance.getAllAccounts()[0] }); - return token.accessToken; - } - throw new Error(`Failed to get access token for web service: ${ex}`); - } -}; - -export const AuthHelper = { - getSKaaSAccessToken, - msalConfig, - logoutRequest, - ssoSilentRequest, - loginAsync, - logoutAsync, -}; diff --git a/samples/apps/copilot-chat-app/webapp/src/libs/auth/TokenHelper.ts b/samples/apps/copilot-chat-app/webapp/src/libs/auth/TokenHelper.ts deleted file mode 100644 index e3cc293d1003..000000000000 --- a/samples/apps/copilot-chat-app/webapp/src/libs/auth/TokenHelper.ts +++ /dev/null @@ -1,103 +0,0 @@ -import { - IPublicClientApplication, - InteractionRequiredAuthError, - InteractionStatus, - PopupRequest, -} from '@azure/msal-browser'; - -enum TokenErrors { - InteractionInProgress = 'interaction_in_progress', -} - -/* - * This implementation follows incremental consent, and token acquisition is limited to one - * resource at a time (scopes), but user can consent to many resources upfront (extraScopesToConsent) - */ -export const getAccessTokenUsingMsal = async ( - inProgress: InteractionStatus, - msalInstance: IPublicClientApplication, - scopes: Array, - extraScopesToConsent?: Array, -) => { - const account = msalInstance.getActiveAccount()!; - const accessTokenRequest: PopupRequest = { - authority: `https://login.microsoftonline.com/${account.tenantId}`, - scopes: scopes, - extraScopesToConsent: extraScopesToConsent, - account: account, - }; - - return await acquireToken(accessTokenRequest, msalInstance, inProgress).catch((e) => { - if (e.message === TokenErrors.InteractionInProgress) { - return interactionInProgressHandler(inProgress, msalInstance, accessTokenRequest); - } - - throw e; - }); -}; - -const acquireToken = async ( - accessTokenRequest: PopupRequest, - msalInstance: IPublicClientApplication, - interactionStatus: InteractionStatus, -) => { - return msalInstance - .acquireTokenSilent(accessTokenRequest) - .then(function (accessTokenResponse) { - // Acquire token silent success - return accessTokenResponse.accessToken; - }) - .catch(async (error) => { - if (error instanceof InteractionRequiredAuthError) { - // Since app can trigger concurrent interactive requests, first check - // if any other interaction is in progress proper to invoking a new one - if (interactionStatus !== InteractionStatus.None) { - // throw a new error to be handled in the caller above - throw new Error(TokenErrors.InteractionInProgress); - } else { - return msalInstance - .acquireTokenPopup({ ...accessTokenRequest }) - .then(function (accessTokenResponse) { - // Acquire token interactive success - return accessTokenResponse.accessToken; - }) - .catch(function (error) { - // Acquire token interactive failure - throw new Error(`Received error while retrieving access token: ${error}`); - }); - } - } - throw new Error(`Received error while retrieving access token: ${error}`); - }); -}; - -const interactionInProgressHandler = async ( - interactionStatus: InteractionStatus, - msalInstance: IPublicClientApplication, - accessTokenRequest: PopupRequest, -) => { - // Polls the interaction status from the application - // state and resolves when it's equal to "None". - await waitFor(() => interactionStatus === InteractionStatus.None); - - // Wait is over, call acquireToken again to re-try acquireTokenSilent - return await acquireToken(accessTokenRequest, msalInstance, interactionStatus); -}; - -const waitFor = (hasInteractionCompleted: () => boolean) => { - const checkInteraction = (resolve: (arg0: null) => void, _reject: any) => { - const interactionInProgress = !hasInteractionCompleted(); - while (interactionInProgress) { - setTimeout(() => { - hasInteractionCompleted(); - }, 500); - } - resolve(null); - }; - - return new Promise(checkInteraction); -}; - -export const TokenHelper = { - getAccessTokenUsingMsal, -}; diff --git a/samples/apps/copilot-chat-app/webapp/src/libs/connectors/useConnectors.ts b/samples/apps/copilot-chat-app/webapp/src/libs/connectors/useConnectors.ts index a0f7d95783ad..6d9b21bdbde7 100644 --- a/samples/apps/copilot-chat-app/webapp/src/libs/connectors/useConnectors.ts +++ b/samples/apps/copilot-chat-app/webapp/src/libs/connectors/useConnectors.ts @@ -1,55 +1,9 @@ -import { useMsal } from '@azure/msal-react'; -import { Constants } from '../../Constants'; import { useAppSelector } from '../../redux/app/hooks'; import { RootState } from '../../redux/app/store'; import { AuthHeaderTags } from '../../redux/features/plugins/PluginsState'; -import { AuthHelper } from '../auth/AuthHelper'; -import { TokenHelper } from '../auth/TokenHelper'; -import { IAsk } from '../semantic-kernel/model/Ask'; -import { useSemanticKernel } from '../semantic-kernel/useSemanticKernel'; export const useConnectors = () => { - const { instance, inProgress } = useMsal(); - const sk = useSemanticKernel(process.env.REACT_APP_BACKEND_URI as string); const plugins = useAppSelector((state: RootState) => state.plugins); - - /** - * Helper function to invoke SK skills - * using custom token header containing - * Msal access token for downstream plug-ins. - * scopes should be limited to only permissions needed for the skill - */ - const invokeSkillWithMsalToken = async ( - ask: IAsk, - skillName: string, - functionName: string, - scopes: Array, - pluginHeaderTag: AuthHeaderTags, - ) => { - return await TokenHelper.getAccessTokenUsingMsal(inProgress, instance, scopes).then(async (token: string) => { - return await sk.invokeAsync(ask, skillName, functionName, await AuthHelper.getSKaaSAccessToken(instance), [ - { - headerTag: pluginHeaderTag, - authData: token, - }, - ]); - }); - }; - - /** - * Helper function to invoke SK skills - * using MS Graph API token - */ - const invokeSkillWithGraphToken = async (ask: IAsk, skillName: string, functionName: string) => { - return await invokeSkillWithMsalToken( - ask, - skillName, - functionName, - Constants.msGraphScopes, - AuthHeaderTags.MsGraph, - ); - }; - /* * Once enabled, each plugin will have a custom dedicated header in every SK request * containing respective auth information (i.e., token, encoded client info, etc.) @@ -76,8 +30,6 @@ export const useConnectors = () => { }; return { - invokeSkillWithMsalToken, - invokeSkillWithGraphToken, getEnabledPlugins, }; }; diff --git a/samples/apps/copilot-chat-app/webapp/src/libs/semantic-kernel/DocumentImport.ts b/samples/apps/copilot-chat-app/webapp/src/libs/semantic-kernel/DocumentImport.ts index 4216dc0942b9..cf317524274d 100644 --- a/samples/apps/copilot-chat-app/webapp/src/libs/semantic-kernel/DocumentImport.ts +++ b/samples/apps/copilot-chat-app/webapp/src/libs/semantic-kernel/DocumentImport.ts @@ -1,27 +1,19 @@ // Copyright (c) Microsoft. All rights reserved. export class DocumentImportService { - constructor(private readonly serviceUrl: string) { } + constructor(private readonly serviceUrl: string) {} - importDocumentAsync = async ( - document: File, - accessToken: string, - ) => { + importDocumentAsync = async (document: File) => { const formData = new FormData(); formData.append('formFile', document); - + const commandPath = `importDocument`; const requestUrl = new URL(commandPath, this.serviceUrl); - const headers = new Headers({ - Authorization: `Bearer ${accessToken}`, - }); - try { const response = await fetch(requestUrl, { method: 'POST', body: formData, - headers: headers, }); if (!response.ok) { @@ -37,4 +29,4 @@ export class DocumentImportService { throw Object.assign(new Error(e + additional_error_msg)); } }; -} \ No newline at end of file +} diff --git a/samples/apps/copilot-chat-app/webapp/src/libs/semantic-kernel/SemanticKernel.ts b/samples/apps/copilot-chat-app/webapp/src/libs/semantic-kernel/SemanticKernel.ts index c9cf68351084..c7862def7008 100644 --- a/samples/apps/copilot-chat-app/webapp/src/libs/semantic-kernel/SemanticKernel.ts +++ b/samples/apps/copilot-chat-app/webapp/src/libs/semantic-kernel/SemanticKernel.ts @@ -10,7 +10,6 @@ export class SemanticKernel extends BaseService { ask: IAsk, skillName: string, functionName: string, - accessToken: string, enabledPlugins?: { headerTag: AuthHeaderTags; authData: string; @@ -53,7 +52,6 @@ export class SemanticKernel extends BaseService { method: 'POST', body: ask, }, - accessToken, enabledPlugins, ); diff --git a/samples/apps/copilot-chat-app/webapp/src/libs/semantic-kernel/useDocumentImport.ts b/samples/apps/copilot-chat-app/webapp/src/libs/semantic-kernel/useDocumentImport.ts index c5323979006b..fa512bc606da 100644 --- a/samples/apps/copilot-chat-app/webapp/src/libs/semantic-kernel/useDocumentImport.ts +++ b/samples/apps/copilot-chat-app/webapp/src/libs/semantic-kernel/useDocumentImport.ts @@ -6,4 +6,4 @@ import { DocumentImportService } from './DocumentImport'; export const useDocumentImportService = (uri: string) => { const [documentImportService] = React.useState(new DocumentImportService(uri)); return documentImportService; -}; \ No newline at end of file +}; diff --git a/samples/apps/copilot-chat-app/webapp/src/libs/services/BaseService.ts b/samples/apps/copilot-chat-app/webapp/src/libs/services/BaseService.ts index 02c462e2cd82..b92276d1a46a 100644 --- a/samples/apps/copilot-chat-app/webapp/src/libs/services/BaseService.ts +++ b/samples/apps/copilot-chat-app/webapp/src/libs/services/BaseService.ts @@ -13,7 +13,6 @@ export class BaseService { protected readonly getResponseAsync = async ( request: ServiceRequest, - accessToken: string, enabledPlugins?: { headerTag: AuthHeaderTags; authData: string; @@ -22,7 +21,6 @@ export class BaseService { ): Promise => { const { commandPath, method, body } = request; const headers = new Headers({ - Authorization: `Bearer ${accessToken}`, 'Content-Type': 'application/json', }); diff --git a/samples/apps/copilot-chat-app/webapp/src/libs/services/BotService.ts b/samples/apps/copilot-chat-app/webapp/src/libs/services/BotService.ts index 875b4c5b4f3d..04efde0e9a94 100644 --- a/samples/apps/copilot-chat-app/webapp/src/libs/services/BotService.ts +++ b/samples/apps/copilot-chat-app/webapp/src/libs/services/BotService.ts @@ -4,32 +4,22 @@ import { Bot } from '../models/Bot'; import { BaseService } from './BaseService'; export class BotService extends BaseService { - public downloadAsync = async ( - chatId: string, - userId: string, - accessToken: string, - ): Promise => { - const result = await this.getResponseAsync( - { - commandPath: `bot/download/${chatId}/${userId}`, - method: 'GET', - }, - accessToken, - ); + public downloadAsync = async (chatId: string, userId: string): Promise => { + const result = await this.getResponseAsync({ + commandPath: `bot/download/${chatId}/${userId}`, + method: 'GET', + }); return result; }; - public uploadAsync = async (bot: Bot, userId: string, accessToken: string): Promise => { + public uploadAsync = async (bot: Bot, userId: string): Promise => { // TODO: return type - const result = await this.getResponseAsync( - { - commandPath: `bot/upload?userId=${userId}`, - method: 'Post', - body: bot, - }, - accessToken, - ); + const result = await this.getResponseAsync({ + commandPath: `bot/upload?userId=${userId}`, + method: 'Post', + body: bot, + }); return result; }; diff --git a/samples/apps/copilot-chat-app/webapp/src/libs/services/ChatService.ts b/samples/apps/copilot-chat-app/webapp/src/libs/services/ChatService.ts index 65fb95ed65fd..1ba7c3113726 100644 --- a/samples/apps/copilot-chat-app/webapp/src/libs/services/ChatService.ts +++ b/samples/apps/copilot-chat-app/webapp/src/libs/services/ChatService.ts @@ -5,85 +5,60 @@ import { IChatSession } from '../models/ChatSession'; import { BaseService } from './BaseService'; export class ChatService extends BaseService { - public createChatAsync = async ( - userId: string, - userName: string, - title: string, - accessToken: string, - ): Promise => { + public createChatAsync = async (userId: string, userName: string, title: string): Promise => { const body = { userId: userId, userName: userName, title: title, }; - const result = await this.getResponseAsync( - { - commandPath: 'chatSession/create', - method: 'POST', - body: body, - }, - accessToken, - ); + const result = await this.getResponseAsync({ + commandPath: 'chatSession/create', + method: 'POST', + body: body, + }); return result; }; - public getChatAsync = async (chatId: string, accessToken: string): Promise => { - const result = await this.getResponseAsync( - { - commandPath: `chatSession/getChat/${chatId}`, - method: 'GET', - }, - accessToken, - ); + public getChatAsync = async (chatId: string): Promise => { + const result = await this.getResponseAsync({ + commandPath: `chatSession/getChat/${chatId}`, + method: 'GET', + }); return result; }; - public getAllChatsAsync = async (userId: string, accessToken: string): Promise => { - const result = await this.getResponseAsync( - { - commandPath: `chatSession/getAllChats/${userId}`, - method: 'GET', - }, - accessToken, - ); + public getAllChatsAsync = async (userId: string): Promise => { + const result = await this.getResponseAsync({ + commandPath: `chatSession/getAllChats/${userId}`, + method: 'GET', + }); return result; }; - public getChatMessagesAsync = async ( - chatId: string, - startIdx: number, - count: number, - accessToken: string, - ): Promise => { - const result = await this.getResponseAsync( - { - commandPath: `chatSession/getChatMessages/${chatId}?startIdx=${startIdx}&count=${count}`, - method: 'GET', - }, - accessToken, - ); + public getChatMessagesAsync = async (chatId: string, startIdx: number, count: number): Promise => { + const result = await this.getResponseAsync({ + commandPath: `chatSession/getChatMessages/${chatId}?startIdx=${startIdx}&count=${count}`, + method: 'GET', + }); return result; }; - public editChatAsync = async (chatId: string, title: string, accessToken: string): Promise => { + public editChatAsync = async (chatId: string, title: string): Promise => { const body: IChatSession = { id: chatId, userId: '', title: title, }; - const result = await this.getResponseAsync( - { - commandPath: `chatSession/edit`, - method: 'POST', - body: body, - }, - accessToken, - ); + const result = await this.getResponseAsync({ + commandPath: `chatSession/edit`, + method: 'POST', + body: body, + }); return result; }; diff --git a/samples/apps/copilot-chat-app/webapp/src/libs/useChat.ts b/samples/apps/copilot-chat-app/webapp/src/libs/useChat.ts index e1a241877264..89f21b4697ef 100644 --- a/samples/apps/copilot-chat-app/webapp/src/libs/useChat.ts +++ b/samples/apps/copilot-chat-app/webapp/src/libs/useChat.ts @@ -1,18 +1,14 @@ -import { useAccount, useMsal } from '@azure/msal-react'; import { Constants } from '../Constants'; import { useAppDispatch, useAppSelector } from '../redux/app/hooks'; import { RootState } from '../redux/app/store'; import { addAlert } from '../redux/features/app/appSlice'; import { ChatState } from '../redux/features/conversations/ChatState'; -import { Conversations } from '../redux/features/conversations/ConversationsState'; import { addConversation, incrementBotProfilePictureIndex, - setConversations, setSelectedConversation, updateConversation, } from '../redux/features/conversations/conversationsSlice'; -import { AuthHelper } from './auth/AuthHelper'; import { useConnectors } from './connectors/useConnectors'; import { AlertType } from './models/AlertType'; import { Bot } from './models/Bot'; @@ -25,8 +21,6 @@ import { ChatService } from './services/ChatService'; export const useChat = () => { const dispatch = useAppDispatch(); - const { instance, accounts } = useMsal(); - const account = useAccount(accounts[0] || {}); const sk = useSemanticKernel(process.env.REACT_APP_BACKEND_URI as string); const { botProfilePictureIndex } = useAppSelector((state: RootState) => state.conversations); @@ -43,10 +37,10 @@ export const useChat = () => { ]; const loggedInUser: ChatUser = { - id: account?.homeAccountId || '', - fullName: account?.name || '', - emailAddress: account?.username || '', - photo: undefined, // TODO: Make call to Graph /me endpoint to load photo + id: Constants.GuestUser.id, + fullName: Constants.GuestUser.name, + emailAddress: Constants.GuestUser.email, + photo: undefined, online: true, lastTypingTimestamp: 0, }; @@ -57,22 +51,12 @@ export const useChat = () => { }; const createChat = async () => { - const chatTitle = `Copilot @ ${new Date().toLocaleString()}`; + const chatTitle = `Copilot`; try { await chatService - .createChatAsync( - account?.homeAccountId!, - account?.name!, - chatTitle, - await AuthHelper.getSKaaSAccessToken(instance), - ) + .createChatAsync('guest-user-id', 'guest-user-name', chatTitle) .then(async (result: IChatSession) => { - const chatMessages = await chatService.getChatMessagesAsync( - result.id, - 0, - 1, - await AuthHelper.getSKaaSAccessToken(instance), - ); + const chatMessages = await chatService.getChatMessagesAsync(result.id, 0, 1); const newChat: ChatState = { id: result.id, @@ -101,11 +85,11 @@ export const useChat = () => { variables: [ { key: 'userId', - value: account?.homeAccountId!, + value: Constants.GuestUser.id, }, { key: 'userName', - value: account?.name!, + value: Constants.GuestUser.name, }, { key: 'chatId', @@ -115,13 +99,7 @@ export const useChat = () => { }; try { - var result = await sk.invokeAsync( - ask, - 'ChatSkill', - 'Chat', - await AuthHelper.getSKaaSAccessToken(instance), - connectors.getEnabledPlugins(), - ); + var result = await sk.invokeAsync(ask, 'ChatSkill', 'Chat', connectors.getEnabledPlugins()); const messageResult = { timestamp: new Date().getTime(), @@ -140,45 +118,7 @@ export const useChat = () => { const loadChats = async () => { try { - const chatSessions = await chatService.getAllChatsAsync( - account?.homeAccountId!, - await AuthHelper.getSKaaSAccessToken(instance), - ); - - if (chatSessions.length > 0) { - const conversations: Conversations = {}; - for (const index in chatSessions) { - const chatSession = chatSessions[index]; - const chatMessages = await chatService.getChatMessagesAsync( - chatSession.id, - 0, - 100, - await AuthHelper.getSKaaSAccessToken(instance), - ); - - // Messages are returned with most recent message at index 0 and oldest message at the last index, - // so we need to reverse the order for render - const orderedMessages = chatMessages.reverse(); - - conversations[chatSession.id] = { - id: chatSession.id, - title: chatSession.title, - audience: [loggedInUser], - messages: orderedMessages, - botTypingTimestamp: 0, - botProfilePicture: botProfilePictures[botProfilePictureIndex], - }; - - dispatch(incrementBotProfilePictureIndex()); - } - - dispatch(setConversations(conversations)); - dispatch(setSelectedConversation(chatSessions[0].id)); - } else { - // No chats exist, create first chat window - await createChat(); - } - + await createChat(); return true; } catch (e: any) { const errorMessage = `Unable to load chats. Details: ${e.message ?? e}`; @@ -190,11 +130,7 @@ export const useChat = () => { const downloadBot = async (chatId: string) => { try { - return botService.downloadAsync( - chatId, - account?.homeAccountId || '', - await AuthHelper.getSKaaSAccessToken(instance), - ); + return botService.downloadAsync(chatId, Constants.GuestUser.id); } catch (e: any) { const errorMessage = `Unable to download the bot. Details: ${e.message ?? e}`; dispatch(addAlert({ message: errorMessage, type: AlertType.Error })); @@ -203,7 +139,7 @@ export const useChat = () => { const uploadBot = async (bot: Bot) => { botService - .uploadAsync(bot, account?.homeAccountId || '', await AuthHelper.getSKaaSAccessToken(instance)) + .uploadAsync(bot, Constants.GuestUser.id) .then(() => loadChats()) .catch((e: any) => { const errorMessage = `Unable to upload the bot. Details: ${e.message ?? e}`; diff --git a/samples/apps/copilot-chat-app/webapp/src/redux/features/plugins/PluginsState.ts b/samples/apps/copilot-chat-app/webapp/src/redux/features/plugins/PluginsState.ts index d879156c105d..67ca314686ae 100644 --- a/samples/apps/copilot-chat-app/webapp/src/redux/features/plugins/PluginsState.ts +++ b/samples/apps/copilot-chat-app/webapp/src/redux/features/plugins/PluginsState.ts @@ -1,20 +1,16 @@ -import { Constants } from '../../../Constants'; import GithubIcon from '../../../assets/plugin-icons/github.png'; import JiraIcon from '../../../assets/plugin-icons/jira.png'; -import GraphIcon from '../../../assets/plugin-icons/ms-graph.png'; /* * For each OpenAPI Spec you're supporting in the Kernel, * add all the relevant information here. */ export const enum Plugins { - MsGraph = 'Microsoft Graph', Jira = 'Jira', GitHub = 'GitHub', } export const enum AuthHeaderTags { - MsGraph = 'graph', Jira = 'jira', GitHub = 'github', } @@ -23,8 +19,6 @@ export type PluginAuthRequirements = { username?: boolean; password?: boolean; personalAccessToken?: boolean; - OAuth?: boolean; - Msal?: boolean; scopes?: string[]; helpLink?: string; }; @@ -54,24 +48,11 @@ export type Plugin = { }; export interface PluginsState { - MsGraph: Plugin; Jira: Plugin; GitHub: Plugin; } export const initialState: PluginsState = { - MsGraph: { - name: Plugins.MsGraph, - publisher: 'Microsoft', - description: 'Use your Microsoft Account to access your personal Graph information and Microsoft services.', - enabled: false, - authRequirements: { - Msal: true, - scopes: Constants.msGraphScopes, - }, - headerTag: AuthHeaderTags.MsGraph, - icon: GraphIcon, - }, Jira: { name: Plugins.Jira, publisher: 'Atlassian', diff --git a/samples/apps/copilot-chat-app/webapp/src/redux/features/plugins/pluginsSlice.ts b/samples/apps/copilot-chat-app/webapp/src/redux/features/plugins/pluginsSlice.ts index e71a08e6cec9..3eaf076e0f22 100644 --- a/samples/apps/copilot-chat-app/webapp/src/redux/features/plugins/pluginsSlice.ts +++ b/samples/apps/copilot-chat-app/webapp/src/redux/features/plugins/pluginsSlice.ts @@ -13,9 +13,6 @@ export const pluginsState = createSlice({ var authData = action.payload.accessToken; switch (action.payload.plugin) { - case Plugins.MsGraph: - plugin = state.MsGraph; - break; case Plugins.Jira: plugin = state.Jira; @@ -39,9 +36,6 @@ export const pluginsState = createSlice({ var plugin: Plugin; switch (action.payload) { - case Plugins.MsGraph: - plugin = state.MsGraph; - break; case Plugins.Jira: plugin = state.Jira; break; diff --git a/samples/apps/copilot-chat-app/webapp/yarn.lock b/samples/apps/copilot-chat-app/webapp/yarn.lock index acb7c6d0e234..b7e850086124 100644 --- a/samples/apps/copilot-chat-app/webapp/yarn.lock +++ b/samples/apps/copilot-chat-app/webapp/yarn.lock @@ -24,53 +24,6 @@ jsonpointer "^5.0.0" leven "^3.1.0" -"@azure/abort-controller@^1.0.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@azure/abort-controller/-/abort-controller-1.1.0.tgz#788ee78457a55af8a1ad342acb182383d2119249" - integrity sha512-TrRLIoSQVzfAJX9H1JeFjzAoDGcoK1IYX1UImfceTZpsyYfWr09Ss1aHW1y5TrrR3iq6RZLBwJ3E24uwPhwahw== - dependencies: - tslib "^2.2.0" - -"@azure/core-auth@^1.1.4": - version "1.4.0" - resolved "https://registry.yarnpkg.com/@azure/core-auth/-/core-auth-1.4.0.tgz#6fa9661c1705857820dbc216df5ba5665ac36a9e" - integrity sha512-HFrcTgmuSuukRf/EdPmqBrc5l6Q5Uu+2TbuhaKbgaCpP2TfAeiNaQPAadxO+CYBRHGUzIDteMAjFspFLDLnKVQ== - dependencies: - "@azure/abort-controller" "^1.0.0" - tslib "^2.2.0" - -"@azure/ms-rest-js@^2.6.4": - version "2.6.6" - resolved "https://registry.yarnpkg.com/@azure/ms-rest-js/-/ms-rest-js-2.6.6.tgz#a2ae4a515565ae1b73729b52b25875853bb3240a" - integrity sha512-WYIda8VvrkZE68xHgOxUXvjThxNf1nnGPPe0rAljqK5HJHIZ12Pi3YhEDOn3Ge7UnwaaM3eFO0VtAy4nGVI27Q== - dependencies: - "@azure/core-auth" "^1.1.4" - abort-controller "^3.0.0" - form-data "^2.5.0" - node-fetch "^2.6.7" - tough-cookie "^3.0.1" - tslib "^1.10.0" - tunnel "0.0.6" - uuid "^8.3.2" - xml2js "^0.5.0" - -"@azure/msal-browser@^2.32.1": - version "2.36.0" - resolved "https://registry.yarnpkg.com/@azure/msal-browser/-/msal-browser-2.36.0.tgz#a95af979da1dd8572b6b3cb9fc86d51713d8ad91" - integrity sha512-OrVDZ9ftO7ExqZVHripAt+doKg6G14YbP2LoSygiWQoSqoO4CejoXLRLqANc/HGg18N0p/oaRETw4IHZvwsxZw== - dependencies: - "@azure/msal-common" "^12.1.0" - -"@azure/msal-common@^12.1.0": - version "12.1.0" - resolved "https://registry.yarnpkg.com/@azure/msal-common/-/msal-common-12.1.0.tgz#e253a4912a359193c52c570a1e2585cfd0213bff" - integrity sha512-9RUiv0evSHvYtvF7r9ksShw9FgCeT6Rf6JB/SOMbMzI0VySZDUBSE+0b9e7DgL2Ph8wSARIh3m8c5pCK9TRY3w== - -"@azure/msal-react@^1.5.1": - version "1.5.6" - resolved "https://registry.yarnpkg.com/@azure/msal-react/-/msal-react-1.5.6.tgz#5a14f754e4f8e3e90dac02e833cf11f91617c787" - integrity sha512-LCi1zr5ZGqspZN3MyeibH006Eqixtks9nz/Avxjo2OJGM3xKOdXLy6+qSyRJhwUUnLoGal+/0QJjlJoKyeRvAQ== - "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.16.0", "@babel/code-frame@^7.18.6", "@babel/code-frame@^7.21.4", "@babel/code-frame@^7.8.3": version "7.21.4" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.21.4.tgz#d0fa9e4413aca81f2b23b9442797bda1826edb39" @@ -78,26 +31,26 @@ dependencies: "@babel/highlight" "^7.18.6" -"@babel/compat-data@^7.17.7", "@babel/compat-data@^7.20.5", "@babel/compat-data@^7.21.4": - version "7.21.4" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.21.4.tgz#457ffe647c480dff59c2be092fc3acf71195c87f" - integrity sha512-/DYyDpeCfaVinT40FPGdkkb+lYSKvsVuMjDAG7jPOWWiM1ibOaB9CXJAlc4d1QpP/U2q2P9jbrSlClKSErd55g== +"@babel/compat-data@^7.17.7", "@babel/compat-data@^7.20.5", "@babel/compat-data@^7.21.5": + version "7.21.7" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.21.7.tgz#61caffb60776e49a57ba61a88f02bedd8714f6bc" + integrity sha512-KYMqFYTaenzMK4yUtf4EW9wc4N9ef80FsbMtkwool5zpwl4YrT1SdWYSTRcT94KO4hannogdS+LxY7L+arP3gA== "@babel/core@^7.1.0", "@babel/core@^7.11.1", "@babel/core@^7.12.3", "@babel/core@^7.16.0", "@babel/core@^7.7.2", "@babel/core@^7.8.0": - version "7.21.4" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.21.4.tgz#c6dc73242507b8e2a27fd13a9c1814f9fa34a659" - integrity sha512-qt/YV149Jman/6AfmlxJ04LMIu8bMoyl3RB91yTFrxQmgbrSvQMy7cI8Q62FHx1t8wJ8B5fu0UDoLwHAhUo1QA== + version "7.21.8" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.21.8.tgz#2a8c7f0f53d60100ba4c32470ba0281c92aa9aa4" + integrity sha512-YeM22Sondbo523Sz0+CirSPnbj9bG3P0CdHcBZdqUuaeOaYEFbOLoGU7lebvGP6P5J/WE9wOn7u7C4J9HvS1xQ== dependencies: "@ampproject/remapping" "^2.2.0" "@babel/code-frame" "^7.21.4" - "@babel/generator" "^7.21.4" - "@babel/helper-compilation-targets" "^7.21.4" - "@babel/helper-module-transforms" "^7.21.2" - "@babel/helpers" "^7.21.0" - "@babel/parser" "^7.21.4" + "@babel/generator" "^7.21.5" + "@babel/helper-compilation-targets" "^7.21.5" + "@babel/helper-module-transforms" "^7.21.5" + "@babel/helpers" "^7.21.5" + "@babel/parser" "^7.21.8" "@babel/template" "^7.20.7" - "@babel/traverse" "^7.21.4" - "@babel/types" "^7.21.4" + "@babel/traverse" "^7.21.5" + "@babel/types" "^7.21.5" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.2" @@ -105,20 +58,20 @@ semver "^6.3.0" "@babel/eslint-parser@^7.16.3": - version "7.21.3" - resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.21.3.tgz#d79e822050f2de65d7f368a076846e7184234af7" - integrity sha512-kfhmPimwo6k4P8zxNs8+T7yR44q1LdpsZdE1NkCsVlfiuTPRfnGgjaF8Qgug9q9Pou17u6wneYF0lDCZJATMFg== + version "7.21.8" + resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.21.8.tgz#59fb6fc4f3b017ab86987c076226ceef7b2b2ef2" + integrity sha512-HLhI+2q+BP3sf78mFUZNCGc10KEmoUqtUT1OCdMZsN+qr4qFeLUod62/zAnF3jNQstwyasDkZnVXwfK2Bml7MQ== dependencies: "@nicolo-ribaudo/eslint-scope-5-internals" "5.1.1-v1" eslint-visitor-keys "^2.1.0" semver "^6.3.0" -"@babel/generator@^7.21.4", "@babel/generator@^7.7.2": - version "7.21.4" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.21.4.tgz#64a94b7448989f421f919d5239ef553b37bb26bc" - integrity sha512-NieM3pVIYW2SwGzKoqfPrQsf4xGs9M9AIG3ThppsSRmO+m7eQhmI6amajKMUeIO37wFfsvnvcxQFx6x6iqxDnA== +"@babel/generator@^7.21.5", "@babel/generator@^7.7.2": + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.21.5.tgz#c0c0e5449504c7b7de8236d99338c3e2a340745f" + integrity sha512-SrKK/sRv8GesIW1bDagf9cCG38IOMYZusoe1dfg0D8aiUe3Amvoj1QtjTPAWcfrZFvIwlleLb0gxzQidL9w14w== dependencies: - "@babel/types" "^7.21.4" + "@babel/types" "^7.21.5" "@jridgewell/gen-mapping" "^0.3.2" "@jridgewell/trace-mapping" "^0.3.17" jsesc "^2.5.1" @@ -131,45 +84,46 @@ "@babel/types" "^7.18.6" "@babel/helper-builder-binary-assignment-operator-visitor@^7.18.6": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz#acd4edfd7a566d1d51ea975dff38fd52906981bb" - integrity sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw== + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.21.5.tgz#817f73b6c59726ab39f6ba18c234268a519e5abb" + integrity sha512-uNrjKztPLkUk7bpCNC0jEKDJzzkvel/W+HguzbN8krA+LPfC1CEobJEvAvGka2A/M+ViOqXdcRL0GqPUJSjx9g== dependencies: - "@babel/helper-explode-assignable-expression" "^7.18.6" - "@babel/types" "^7.18.9" + "@babel/types" "^7.21.5" -"@babel/helper-compilation-targets@^7.17.7", "@babel/helper-compilation-targets@^7.18.9", "@babel/helper-compilation-targets@^7.20.7", "@babel/helper-compilation-targets@^7.21.4": - version "7.21.4" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.21.4.tgz#770cd1ce0889097ceacb99418ee6934ef0572656" - integrity sha512-Fa0tTuOXZ1iL8IeDFUWCzjZcn+sJGd9RZdH9esYVjEejGmzf+FFYQpMi/kZUk2kPy/q1H3/GPw7np8qar/stfg== +"@babel/helper-compilation-targets@^7.17.7", "@babel/helper-compilation-targets@^7.18.9", "@babel/helper-compilation-targets@^7.20.7", "@babel/helper-compilation-targets@^7.21.5": + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.21.5.tgz#631e6cc784c7b660417421349aac304c94115366" + integrity sha512-1RkbFGUKex4lvsB9yhIfWltJM5cZKUftB2eNajaDv3dCMEp49iBG0K14uH8NnX9IPux2+mK7JGEOB0jn48/J6w== dependencies: - "@babel/compat-data" "^7.21.4" + "@babel/compat-data" "^7.21.5" "@babel/helper-validator-option" "^7.21.0" browserslist "^4.21.3" lru-cache "^5.1.1" semver "^6.3.0" "@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.21.0": - version "7.21.4" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.21.4.tgz#3a017163dc3c2ba7deb9a7950849a9586ea24c18" - integrity sha512-46QrX2CQlaFRF4TkwfTt6nJD7IHq8539cCL7SDpqWSDeJKY1xylKKY5F/33mJhLZ3mFvKv2gGrVS6NkyF6qs+Q== + version "7.21.8" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.21.8.tgz#205b26330258625ef8869672ebca1e0dee5a0f02" + integrity sha512-+THiN8MqiH2AczyuZrnrKL6cAxFRRQDKW9h1YkBvbgKmAm6mwiacig1qT73DHIWMGo40GRnsEfN3LA+E6NtmSw== dependencies: "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-environment-visitor" "^7.21.5" "@babel/helper-function-name" "^7.21.0" - "@babel/helper-member-expression-to-functions" "^7.21.0" + "@babel/helper-member-expression-to-functions" "^7.21.5" "@babel/helper-optimise-call-expression" "^7.18.6" - "@babel/helper-replace-supers" "^7.20.7" + "@babel/helper-replace-supers" "^7.21.5" "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" "@babel/helper-split-export-declaration" "^7.18.6" + semver "^6.3.0" "@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.20.5": - version "7.21.4" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.21.4.tgz#40411a8ab134258ad2cf3a3d987ec6aa0723cee5" - integrity sha512-M00OuhU+0GyZ5iBBN9czjugzWrEq2vDpf/zCYHxxf93ul/Q5rv+a5h+/+0WnI1AebHNVtl5bFV0qsJoH23DbfA== + version "7.21.8" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.21.8.tgz#a7886f61c2e29e21fd4aaeaf1e473deba6b571dc" + integrity sha512-zGuSdedkFtsFHGbexAvNuipg1hbtitDLo2XE8/uf6Y9sOQV1xsYX/2pNbtedp/X0eU1pIt+kGvaqHCowkRbS5g== dependencies: "@babel/helper-annotate-as-pure" "^7.18.6" regexpu-core "^5.3.1" + semver "^6.3.0" "@babel/helper-define-polyfill-provider@^0.3.3": version "0.3.3" @@ -183,17 +137,10 @@ resolve "^1.14.2" semver "^6.1.2" -"@babel/helper-environment-visitor@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz#0c0cee9b35d2ca190478756865bb3528422f51be" - integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg== - -"@babel/helper-explode-assignable-expression@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz#41f8228ef0a6f1a036b8dfdfec7ce94f9a6bc096" - integrity sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg== - dependencies: - "@babel/types" "^7.18.6" +"@babel/helper-environment-visitor@^7.18.9", "@babel/helper-environment-visitor@^7.21.5": + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.21.5.tgz#c769afefd41d171836f7cb63e295bedf689d48ba" + integrity sha512-IYl4gZ3ETsWocUWgsFZLM5i1BYx9SoemminVEXadgLBa9TdeorzgLKm8wWLA6J1N/kT3Kch8XIk1laNzYoHKvQ== "@babel/helper-function-name@^7.18.9", "@babel/helper-function-name@^7.19.0", "@babel/helper-function-name@^7.21.0": version "7.21.0" @@ -210,12 +157,12 @@ dependencies: "@babel/types" "^7.18.6" -"@babel/helper-member-expression-to-functions@^7.20.7", "@babel/helper-member-expression-to-functions@^7.21.0": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.21.0.tgz#319c6a940431a133897148515877d2f3269c3ba5" - integrity sha512-Muu8cdZwNN6mRRNG6lAYErJ5X3bRevgYR2O8wN0yn7jJSnGDu6eG59RfT29JHxGUovyfrh6Pj0XzmR7drNVL3Q== +"@babel/helper-member-expression-to-functions@^7.21.5": + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.21.5.tgz#3b1a009af932e586af77c1030fba9ee0bde396c0" + integrity sha512-nIcGfgwpH2u4n9GG1HpStW5Ogx7x7ekiFHbjjFRKXbn5zUvqO9ZgotCO4x1aNbKn/x/xOUaXEhyNHCwtFCpxWg== dependencies: - "@babel/types" "^7.21.0" + "@babel/types" "^7.21.5" "@babel/helper-module-imports@^7.10.4", "@babel/helper-module-imports@^7.18.6", "@babel/helper-module-imports@^7.21.4": version "7.21.4" @@ -224,19 +171,19 @@ dependencies: "@babel/types" "^7.21.4" -"@babel/helper-module-transforms@^7.18.6", "@babel/helper-module-transforms@^7.20.11", "@babel/helper-module-transforms@^7.21.2": - version "7.21.2" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz#160caafa4978ac8c00ac66636cb0fa37b024e2d2" - integrity sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ== +"@babel/helper-module-transforms@^7.18.6", "@babel/helper-module-transforms@^7.20.11", "@babel/helper-module-transforms@^7.21.5": + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.21.5.tgz#d937c82e9af68d31ab49039136a222b17ac0b420" + integrity sha512-bI2Z9zBGY2q5yMHoBvJ2a9iX3ZOAzJPm7Q8Yz6YeoUjU/Cvhmi2G4QyTNyPBqqXSgTjUxRg3L0xV45HvkNWWBw== dependencies: - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-module-imports" "^7.18.6" - "@babel/helper-simple-access" "^7.20.2" + "@babel/helper-environment-visitor" "^7.21.5" + "@babel/helper-module-imports" "^7.21.4" + "@babel/helper-simple-access" "^7.21.5" "@babel/helper-split-export-declaration" "^7.18.6" "@babel/helper-validator-identifier" "^7.19.1" "@babel/template" "^7.20.7" - "@babel/traverse" "^7.21.2" - "@babel/types" "^7.21.2" + "@babel/traverse" "^7.21.5" + "@babel/types" "^7.21.5" "@babel/helper-optimise-call-expression@^7.18.6": version "7.18.6" @@ -245,10 +192,10 @@ dependencies: "@babel/types" "^7.18.6" -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.18.9", "@babel/helper-plugin-utils@^7.19.0", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": - version "7.20.2" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz#d1b9000752b18d0877cff85a5c376ce5c3121629" - integrity sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ== +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.18.9", "@babel/helper-plugin-utils@^7.19.0", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.21.5", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.21.5.tgz#345f2377d05a720a4e5ecfa39cbf4474a4daed56" + integrity sha512-0WDaIlXKOX/3KfBK/dwP1oQGiPh6rjMkT7HIRv7i5RR2VUMwrx5ZL0dwBkKx7+SW1zwNdgjHd34IMk5ZjTeHVg== "@babel/helper-remap-async-to-generator@^7.18.9": version "7.18.9" @@ -260,24 +207,24 @@ "@babel/helper-wrap-function" "^7.18.9" "@babel/types" "^7.18.9" -"@babel/helper-replace-supers@^7.18.6", "@babel/helper-replace-supers@^7.20.7": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.20.7.tgz#243ecd2724d2071532b2c8ad2f0f9f083bcae331" - integrity sha512-vujDMtB6LVfNW13jhlCrp48QNslK6JXi7lQG736HVbHz/mbf4Dc7tIRh1Xf5C0rF7BP8iiSxGMCmY6Ci1ven3A== +"@babel/helper-replace-supers@^7.18.6", "@babel/helper-replace-supers@^7.20.7", "@babel/helper-replace-supers@^7.21.5": + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.21.5.tgz#a6ad005ba1c7d9bc2973dfde05a1bba7065dde3c" + integrity sha512-/y7vBgsr9Idu4M6MprbOVUfH3vs7tsIfnVWv/Ml2xgwvyH6LTngdfbf5AdsKwkJy4zgy1X/kuNrEKvhhK28Yrg== dependencies: - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-member-expression-to-functions" "^7.20.7" + "@babel/helper-environment-visitor" "^7.21.5" + "@babel/helper-member-expression-to-functions" "^7.21.5" "@babel/helper-optimise-call-expression" "^7.18.6" "@babel/template" "^7.20.7" - "@babel/traverse" "^7.20.7" - "@babel/types" "^7.20.7" + "@babel/traverse" "^7.21.5" + "@babel/types" "^7.21.5" -"@babel/helper-simple-access@^7.20.2": - version "7.20.2" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz#0ab452687fe0c2cfb1e2b9e0015de07fc2d62dd9" - integrity sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA== +"@babel/helper-simple-access@^7.21.5": + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.21.5.tgz#d697a7971a5c39eac32c7e63c0921c06c8a249ee" + integrity sha512-ENPDAMC1wAjR0uaCUwliBdiSl1KBJAVnMTzXqi64c2MG8MPR6ii4qf7bSXDqSFbr4W6W028/rf5ivoHop5/mkg== dependencies: - "@babel/types" "^7.20.2" + "@babel/types" "^7.21.5" "@babel/helper-skip-transparent-expression-wrappers@^7.20.0": version "7.20.0" @@ -293,10 +240,10 @@ dependencies: "@babel/types" "^7.18.6" -"@babel/helper-string-parser@^7.19.4": - version "7.19.4" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz#38d3acb654b4701a9b77fb0615a96f775c3a9e63" - integrity sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw== +"@babel/helper-string-parser@^7.21.5": + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.21.5.tgz#2b3eea65443c6bdc31c22d037c65f6d323b6b2bd" + integrity sha512-5pTUx3hAJaZIdW99sJ6ZUUgWq/Y+Hja7TowEnLNMm1VivRgZQL3vpBY3qUACVsvw+yQU6+YgfBVmcbLaZtrA1w== "@babel/helper-validator-identifier@^7.18.6", "@babel/helper-validator-identifier@^7.19.1": version "7.19.1" @@ -318,14 +265,14 @@ "@babel/traverse" "^7.20.5" "@babel/types" "^7.20.5" -"@babel/helpers@^7.21.0": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.21.0.tgz#9dd184fb5599862037917cdc9eecb84577dc4e7e" - integrity sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA== +"@babel/helpers@^7.21.5": + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.21.5.tgz#5bac66e084d7a4d2d9696bdf0175a93f7fb63c08" + integrity sha512-BSY+JSlHxOmGsPTydUkPf1MdMQ3M81x5xGCOVgWM3G8XH77sJ292Y2oqcp0CbbgxhqBuI46iUz1tT7hqP7EfgA== dependencies: "@babel/template" "^7.20.7" - "@babel/traverse" "^7.21.0" - "@babel/types" "^7.21.0" + "@babel/traverse" "^7.21.5" + "@babel/types" "^7.21.5" "@babel/highlight@^7.18.6": version "7.18.6" @@ -341,10 +288,10 @@ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.16.4.tgz#d5f92f57cf2c74ffe9b37981c0e72fee7311372e" integrity sha512-6V0qdPUaiVHH3RtZeLIsc+6pDhbYzHR8ogA8w+f+Wc77DuXto19g2QUwveINoS34Uw+W8/hQDGJCx+i4n7xcng== -"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.16.4", "@babel/parser@^7.20.7", "@babel/parser@^7.21.4": - version "7.21.4" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.21.4.tgz#94003fdfc520bbe2875d4ae557b43ddb6d880f17" - integrity sha512-alVJj7k7zIxqBZ7BTRhz0IqJFxW1VJbm6N8JbcYhQ186df9ZBPbZBmWSqAMXwHGsCJdYks7z/voa3ibiS5bCIw== +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.16.4", "@babel/parser@^7.20.7", "@babel/parser@^7.21.5", "@babel/parser@^7.21.8": + version "7.21.8" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.21.8.tgz#642af7d0333eab9c0ad70b14ac5e76dbde7bfdf8" + integrity sha512-6zavDGdzG3gUqAdWvlLFfk+36RilI+Pwyuuh7HItyeScCWP3k6i8vKclAQ0bM/0y/Kz/xiwvxhMv9MgTJP5gmA== "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.18.6": version "7.18.6" @@ -565,7 +512,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.19.0" -"@babel/plugin-syntax-import-meta@^7.8.3": +"@babel/plugin-syntax-import-meta@^7.10.4", "@babel/plugin-syntax-import-meta@^7.8.3": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== @@ -579,7 +526,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-jsx@^7.18.6", "@babel/plugin-syntax-jsx@^7.21.4": +"@babel/plugin-syntax-jsx@^7.21.4": version "7.21.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.21.4.tgz#f264ed7bf40ffc9ec239edabc17a50c4f5b6fea2" integrity sha512-5hewiLct5OKyh6PLKEYaFclcqtIgCb6bmELouxjF6up5q3Sov7rOayW4RwhbaBL0dit8rA80GNfY+UuDp2mBbQ== @@ -649,12 +596,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.20.2" -"@babel/plugin-transform-arrow-functions@^7.20.7": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.20.7.tgz#bea332b0e8b2dab3dafe55a163d8227531ab0551" - integrity sha512-3poA5E7dzDomxj9WXWwuD6A5F3kc7VXwIJO+E+J8qtDtS+pXPAhrgEyh+9GBwBgPq1Z+bB+/JD60lp5jsN7JPQ== +"@babel/plugin-transform-arrow-functions@^7.21.5": + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.21.5.tgz#9bb42a53de447936a57ba256fbf537fc312b6929" + integrity sha512-wb1mhwGOCaXHDTcsRYMKF9e5bbMgqwxtqa2Y1ifH96dXJPwbuLX9qHy3clhrxVqgMz7nyNXs8VkxdH8UBcjKqA== dependencies: - "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-plugin-utils" "^7.21.5" "@babel/plugin-transform-async-to-generator@^7.20.7": version "7.20.7" @@ -694,12 +641,12 @@ "@babel/helper-split-export-declaration" "^7.18.6" globals "^11.1.0" -"@babel/plugin-transform-computed-properties@^7.20.7": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.20.7.tgz#704cc2fd155d1c996551db8276d55b9d46e4d0aa" - integrity sha512-Lz7MvBK6DTjElHAmfu6bfANzKcxpyNPeYBGEafyA6E5HtRpjpZwU+u7Qrgz/2OR0z+5TvKYbPdphfSaAcZBrYQ== +"@babel/plugin-transform-computed-properties@^7.21.5": + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.21.5.tgz#3a2d8bb771cd2ef1cd736435f6552fe502e11b44" + integrity sha512-TR653Ki3pAwxBxUe8srfF3e4Pe3FTA46uaNHYyQwIoM4oWKSoOZiDNyHJ0oIoDIUPSRQbQG7jzgVBX3FPVne1Q== dependencies: - "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-plugin-utils" "^7.21.5" "@babel/template" "^7.20.7" "@babel/plugin-transform-destructuring@^7.21.3": @@ -740,12 +687,12 @@ "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-syntax-flow" "^7.18.6" -"@babel/plugin-transform-for-of@^7.21.0": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.21.0.tgz#964108c9988de1a60b4be2354a7d7e245f36e86e" - integrity sha512-LlUYlydgDkKpIY7mcBWvyPPmMcOphEyYA27Ef4xpbh1IiDNLr0kZsos2nf92vz3IccvJI25QUwp86Eo5s6HmBQ== +"@babel/plugin-transform-for-of@^7.21.5": + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.21.5.tgz#e890032b535f5a2e237a18535f56a9fdaa7b83fc" + integrity sha512-nYWpjKW/7j/I/mZkGVgHJXh4bA1sfdFnJoOXwJuj4m3Q2EraO/8ZyrkCau9P5tbHQk01RMSt6KYLCsW7730SXQ== dependencies: - "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-plugin-utils" "^7.21.5" "@babel/plugin-transform-function-name@^7.18.9": version "7.18.9" @@ -778,14 +725,14 @@ "@babel/helper-module-transforms" "^7.20.11" "@babel/helper-plugin-utils" "^7.20.2" -"@babel/plugin-transform-modules-commonjs@^7.21.2": - version "7.21.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.21.2.tgz#6ff5070e71e3192ef2b7e39820a06fb78e3058e7" - integrity sha512-Cln+Yy04Gxua7iPdj6nOV96smLGjpElir5YwzF0LBPKoPlLDNJePNlrGGaybAJkd0zKRnOVXOgizSqPYMNYkzA== +"@babel/plugin-transform-modules-commonjs@^7.21.5": + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.21.5.tgz#d69fb947eed51af91de82e4708f676864e5e47bc" + integrity sha512-OVryBEgKUbtqMoB7eG2rs6UFexJi6Zj6FDXx+esBLPTCxCNxAY9o+8Di7IsUGJ+AVhp5ncK0fxWUBd0/1gPhrQ== dependencies: - "@babel/helper-module-transforms" "^7.21.2" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-simple-access" "^7.20.2" + "@babel/helper-module-transforms" "^7.21.5" + "@babel/helper-plugin-utils" "^7.21.5" + "@babel/helper-simple-access" "^7.21.5" "@babel/plugin-transform-modules-systemjs@^7.20.11": version "7.20.11" @@ -864,15 +811,15 @@ "@babel/plugin-transform-react-jsx" "^7.18.6" "@babel/plugin-transform-react-jsx@^7.18.6": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.21.0.tgz#656b42c2fdea0a6d8762075d58ef9d4e3c4ab8a2" - integrity sha512-6OAWljMvQrZjR2DaNhVfRz6dkCAVV+ymcLUmaf8bccGOHn2v5rHJK3tTpij0BuhdYWP4LLaqj5lwcdlpAAPuvg== + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.21.5.tgz#bd98f3b429688243e4fa131fe1cbb2ef31ce6f38" + integrity sha512-ELdlq61FpoEkHO6gFRpfj0kUgSwQTGoaEU8eMRoS8Dv3v6e7BjEAj5WMtIBRdHUeAioMhKP5HyxNzNnP+heKbA== dependencies: "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-module-imports" "^7.18.6" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/plugin-syntax-jsx" "^7.18.6" - "@babel/types" "^7.21.0" + "@babel/helper-module-imports" "^7.21.4" + "@babel/helper-plugin-utils" "^7.21.5" + "@babel/plugin-syntax-jsx" "^7.21.4" + "@babel/types" "^7.21.5" "@babel/plugin-transform-react-pure-annotations@^7.18.6": version "7.18.6" @@ -882,12 +829,12 @@ "@babel/helper-annotate-as-pure" "^7.18.6" "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-regenerator@^7.20.5": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.20.5.tgz#57cda588c7ffb7f4f8483cc83bdcea02a907f04d" - integrity sha512-kW/oO7HPBtntbsahzQ0qSE3tFvkFwnbozz3NWFhLGqH75vLEg+sCGngLlhVkePlCs3Jv0dBBHDzCHxNiFAQKCQ== +"@babel/plugin-transform-regenerator@^7.21.5": + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.21.5.tgz#576c62f9923f94bcb1c855adc53561fd7913724e" + integrity sha512-ZoYBKDb6LyMi5yCsByQ5jmXsHAQDDYeexT1Szvlmui+lADvfSecr5Dxd/PkrTC3pAD182Fcju1VQkB4oCp9M+w== dependencies: - "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-plugin-utils" "^7.21.5" regenerator-transform "^0.15.1" "@babel/plugin-transform-reserved-words@^7.18.6": @@ -955,12 +902,12 @@ "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-syntax-typescript" "^7.20.0" -"@babel/plugin-transform-unicode-escapes@^7.18.10": - version "7.18.10" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz#1ecfb0eda83d09bbcb77c09970c2dd55832aa246" - integrity sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ== +"@babel/plugin-transform-unicode-escapes@^7.21.5": + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.21.5.tgz#1e55ed6195259b0e9061d81f5ef45a9b009fb7f2" + integrity sha512-LYm/gTOwZqsYohlvFUe/8Tujz75LqqVC2w+2qPHLR+WyWHGCZPN1KBpJCJn+4Bk4gOkQy/IXKIge6az5MqwlOg== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-plugin-utils" "^7.21.5" "@babel/plugin-transform-unicode-regex@^7.18.6": version "7.18.6" @@ -971,13 +918,13 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/preset-env@^7.11.0", "@babel/preset-env@^7.12.1", "@babel/preset-env@^7.16.4": - version "7.21.4" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.21.4.tgz#a952482e634a8dd8271a3fe5459a16eb10739c58" - integrity sha512-2W57zHs2yDLm6GD5ZpvNn71lZ0B/iypSdIeq25OurDKji6AdzV07qp4s3n1/x5BqtiGaTrPN3nerlSCaC5qNTw== + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.21.5.tgz#db2089d99efd2297716f018aeead815ac3decffb" + integrity sha512-wH00QnTTldTbf/IefEVyChtRdw5RJvODT/Vb4Vcxq1AZvtXj6T0YeX0cAcXhI6/BdGuiP3GcNIL4OQbI2DVNxg== dependencies: - "@babel/compat-data" "^7.21.4" - "@babel/helper-compilation-targets" "^7.21.4" - "@babel/helper-plugin-utils" "^7.20.2" + "@babel/compat-data" "^7.21.5" + "@babel/helper-compilation-targets" "^7.21.5" + "@babel/helper-plugin-utils" "^7.21.5" "@babel/helper-validator-option" "^7.21.0" "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.18.6" "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.20.7" @@ -1002,6 +949,7 @@ "@babel/plugin-syntax-dynamic-import" "^7.8.3" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" "@babel/plugin-syntax-import-assertions" "^7.20.0" + "@babel/plugin-syntax-import-meta" "^7.10.4" "@babel/plugin-syntax-json-strings" "^7.8.3" "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" @@ -1011,22 +959,22 @@ "@babel/plugin-syntax-optional-chaining" "^7.8.3" "@babel/plugin-syntax-private-property-in-object" "^7.14.5" "@babel/plugin-syntax-top-level-await" "^7.14.5" - "@babel/plugin-transform-arrow-functions" "^7.20.7" + "@babel/plugin-transform-arrow-functions" "^7.21.5" "@babel/plugin-transform-async-to-generator" "^7.20.7" "@babel/plugin-transform-block-scoped-functions" "^7.18.6" "@babel/plugin-transform-block-scoping" "^7.21.0" "@babel/plugin-transform-classes" "^7.21.0" - "@babel/plugin-transform-computed-properties" "^7.20.7" + "@babel/plugin-transform-computed-properties" "^7.21.5" "@babel/plugin-transform-destructuring" "^7.21.3" "@babel/plugin-transform-dotall-regex" "^7.18.6" "@babel/plugin-transform-duplicate-keys" "^7.18.9" "@babel/plugin-transform-exponentiation-operator" "^7.18.6" - "@babel/plugin-transform-for-of" "^7.21.0" + "@babel/plugin-transform-for-of" "^7.21.5" "@babel/plugin-transform-function-name" "^7.18.9" "@babel/plugin-transform-literals" "^7.18.9" "@babel/plugin-transform-member-expression-literals" "^7.18.6" "@babel/plugin-transform-modules-amd" "^7.20.11" - "@babel/plugin-transform-modules-commonjs" "^7.21.2" + "@babel/plugin-transform-modules-commonjs" "^7.21.5" "@babel/plugin-transform-modules-systemjs" "^7.20.11" "@babel/plugin-transform-modules-umd" "^7.18.6" "@babel/plugin-transform-named-capturing-groups-regex" "^7.20.5" @@ -1034,17 +982,17 @@ "@babel/plugin-transform-object-super" "^7.18.6" "@babel/plugin-transform-parameters" "^7.21.3" "@babel/plugin-transform-property-literals" "^7.18.6" - "@babel/plugin-transform-regenerator" "^7.20.5" + "@babel/plugin-transform-regenerator" "^7.21.5" "@babel/plugin-transform-reserved-words" "^7.18.6" "@babel/plugin-transform-shorthand-properties" "^7.18.6" "@babel/plugin-transform-spread" "^7.20.7" "@babel/plugin-transform-sticky-regex" "^7.18.6" "@babel/plugin-transform-template-literals" "^7.18.9" "@babel/plugin-transform-typeof-symbol" "^7.18.9" - "@babel/plugin-transform-unicode-escapes" "^7.18.10" + "@babel/plugin-transform-unicode-escapes" "^7.21.5" "@babel/plugin-transform-unicode-regex" "^7.18.6" "@babel/preset-modules" "^0.1.5" - "@babel/types" "^7.21.4" + "@babel/types" "^7.21.5" babel-plugin-polyfill-corejs2 "^0.3.3" babel-plugin-polyfill-corejs3 "^0.6.0" babel-plugin-polyfill-regenerator "^0.4.1" @@ -1075,14 +1023,14 @@ "@babel/plugin-transform-react-pure-annotations" "^7.18.6" "@babel/preset-typescript@^7.16.0": - version "7.21.4" - resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.21.4.tgz#b913ac8e6aa8932e47c21b01b4368d8aa239a529" - integrity sha512-sMLNWY37TCdRH/bJ6ZeeOH1nPuanED7Ai9Y/vH31IPqalioJ6ZNFUWONsakhv4r4n+I6gm5lmoE0olkgib/j/A== + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.21.5.tgz#68292c884b0e26070b4d66b202072d391358395f" + integrity sha512-iqe3sETat5EOrORXiQ6rWfoOg2y68Cs75B9wNxdPW4kixJxh7aXQE1KPdWLDniC24T/6dSnguF33W9j/ZZQcmA== dependencies: - "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-plugin-utils" "^7.21.5" "@babel/helper-validator-option" "^7.21.0" "@babel/plugin-syntax-jsx" "^7.21.4" - "@babel/plugin-transform-modules-commonjs" "^7.21.2" + "@babel/plugin-transform-modules-commonjs" "^7.21.5" "@babel/plugin-transform-typescript" "^7.21.3" "@babel/regjsgen@^0.8.0": @@ -1091,9 +1039,9 @@ integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== "@babel/runtime@^7.1.2", "@babel/runtime@^7.10.4", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.1", "@babel/runtime@^7.12.5", "@babel/runtime@^7.16.3", "@babel/runtime@^7.20.7", "@babel/runtime@^7.4.5", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.21.0.tgz#5b55c9d394e5fcf304909a8b00c07dc217b56673" - integrity sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw== + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.21.5.tgz#8492dddda9644ae3bda3b45eabe87382caee7200" + integrity sha512-8jI69toZqqcsnqGGqwGS4Qb1VwLOEp4hz+CXPywcvjs60u3B4Pom/U/7rm4W8tMOYEB+E9wgD0mW1l3r8qlI9Q== dependencies: regenerator-runtime "^0.13.11" @@ -1106,28 +1054,28 @@ "@babel/parser" "^7.20.7" "@babel/types" "^7.20.7" -"@babel/traverse@^7.12.5", "@babel/traverse@^7.20.5", "@babel/traverse@^7.20.7", "@babel/traverse@^7.21.0", "@babel/traverse@^7.21.2", "@babel/traverse@^7.21.4", "@babel/traverse@^7.7.2": - version "7.21.4" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.21.4.tgz#a836aca7b116634e97a6ed99976236b3282c9d36" - integrity sha512-eyKrRHKdyZxqDm+fV1iqL9UAHMoIg0nDaGqfIOd8rKH17m5snv7Gn4qgjBoFfLz9APvjFU/ICT00NVCv1Epp8Q== +"@babel/traverse@^7.12.5", "@babel/traverse@^7.20.5", "@babel/traverse@^7.21.5", "@babel/traverse@^7.7.2": + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.21.5.tgz#ad22361d352a5154b498299d523cf72998a4b133" + integrity sha512-AhQoI3YjWi6u/y/ntv7k48mcrCXmus0t79J9qPNlk/lAsFlCiJ047RmbfMOawySTHtywXhbXgpx/8nXMYd+oFw== dependencies: "@babel/code-frame" "^7.21.4" - "@babel/generator" "^7.21.4" - "@babel/helper-environment-visitor" "^7.18.9" + "@babel/generator" "^7.21.5" + "@babel/helper-environment-visitor" "^7.21.5" "@babel/helper-function-name" "^7.21.0" "@babel/helper-hoist-variables" "^7.18.6" "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/parser" "^7.21.4" - "@babel/types" "^7.21.4" + "@babel/parser" "^7.21.5" + "@babel/types" "^7.21.5" debug "^4.1.0" globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.12.6", "@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.20.0", "@babel/types@^7.20.2", "@babel/types@^7.20.5", "@babel/types@^7.20.7", "@babel/types@^7.21.0", "@babel/types@^7.21.2", "@babel/types@^7.21.4", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4": - version "7.21.4" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.21.4.tgz#2d5d6bb7908699b3b416409ffd3b5daa25b030d4" - integrity sha512-rU2oY501qDxE8Pyo7i/Orqma4ziCOrby0/9mvbDUGEfvZjb279Nk9k19e2fiCxHbRRpY2ZyrgW1eq22mvmOIzA== +"@babel/types@^7.0.0", "@babel/types@^7.12.6", "@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.20.0", "@babel/types@^7.20.5", "@babel/types@^7.20.7", "@babel/types@^7.21.0", "@babel/types@^7.21.4", "@babel/types@^7.21.5", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4": + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.21.5.tgz#18dfbd47c39d3904d5db3d3dc2cc80bedb60e5b6" + integrity sha512-m4AfNvVF2mVC/F7fDEdH2El3HzUg9It/XsCxZiOTTA3m3qYfcSVSbTfM6Q9xG+hYDniZssYhlXKKUMD5m8tF4Q== dependencies: - "@babel/helper-string-parser" "^7.19.4" + "@babel/helper-string-parser" "^7.21.5" "@babel/helper-validator-identifier" "^7.19.1" to-fast-properties "^2.0.0" @@ -1248,9 +1196,9 @@ integrity sha512-+OJ9konv95ClSTOJCmMZqpd5+YGsB2S+x6w3E1oaM8UuR5j8nTNHYSz8c9BEPGDOCMQYIEEGlVPj/VY64iTbGw== "@emotion/hash@^0.9.0": - version "0.9.0" - resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.9.0.tgz#c5153d50401ee3c027a57a177bc269b16d889cb7" - integrity sha512-14FtKiHhy2QoPIzdTcvh//8OyBlknNs2nXRwIhG904opCby3l+9Xaf/wuPvICBF0rc1ZCNBd3nKe9cd2mecVkQ== + version "0.9.1" + resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.9.1.tgz#4ffb0055f7ef676ebc3a5a91fb621393294e2f43" + integrity sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ== "@eslint-community/eslint-utils@^4.2.0": version "4.4.0" @@ -1260,18 +1208,18 @@ eslint-visitor-keys "^3.3.0" "@eslint-community/regexpp@^4.4.0": - version "4.5.0" - resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.5.0.tgz#f6f729b02feee2c749f57e334b7a1b5f40a81724" - integrity sha512-vITaYzIcNmjn5tF5uxcZ/ft7/RXGrMUIS9HalWckEOF6ESiwXKoMzAQf2UW0aVd6rnOeExTJVd5hmWXucBKGXQ== + version "4.5.1" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.5.1.tgz#cdd35dce4fa1a89a4fd42b1599eb35b3af408884" + integrity sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ== -"@eslint/eslintrc@^2.0.2": - version "2.0.2" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.0.2.tgz#01575e38707add677cf73ca1589abba8da899a02" - integrity sha512-3W4f5tDUra+pA+FzgugqL2pRimUTDJWKr7BINqOpkZrC0uYI0NIc0/JFgBROCU07HR6GieA5m3/rsPIhDmCXTQ== +"@eslint/eslintrc@^2.0.3": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.0.3.tgz#4910db5505f4d503f27774bf356e3704818a0331" + integrity sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ== dependencies: ajv "^6.12.4" debug "^4.3.2" - espree "^9.5.1" + espree "^9.5.2" globals "^13.19.0" ignore "^5.2.0" import-fresh "^3.2.1" @@ -1279,10 +1227,10 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" -"@eslint/js@8.39.0": - version "8.39.0" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.39.0.tgz#58b536bcc843f4cd1e02a7e6171da5c040f4d44b" - integrity sha512-kf9RB0Fg7NZfap83B3QOqOGg9QmD9yBudqQXzzOtn3i4y7ZUXe5ONeW34Gwi+TxhH4mvj72R1Zc300KUMa9Bng== +"@eslint/js@8.40.0": + version "8.40.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.40.0.tgz#3ba73359e11f5a7bd3e407f70b3528abfae69cec" + integrity sha512-ElyB54bJIhXQYVKjDSvCkPO1iU1tSAeVQJbllWJq1XQSmmA4dgFk8CbiBGpiOPxleE48vDogxCtmMYku4HSVLA== "@floating-ui/core@^1.2.6": version "1.2.6" @@ -1617,9 +1565,9 @@ classnames "^2.2.6" "@fluentui/react-icons@^2.0.193", "@fluentui/react-icons@^2.0.196": - version "2.0.200" - resolved "https://registry.yarnpkg.com/@fluentui/react-icons/-/react-icons-2.0.200.tgz#d9aa5e57f1e9b0a9d9f06f368cc73b32922d6a2f" - integrity sha512-u9hcNIUlxYxCdCD6doNPVzAfxUmfbKd68lIf300O10LZ+Sk5QPI9iFV7uBvAmUqELukWqTmzJ4USMsTeTEUCkw== + version "2.0.201" + resolved "https://registry.yarnpkg.com/@fluentui/react-icons/-/react-icons-2.0.201.tgz#5a5f8b549652b5024443589f9676cd1fea24275e" + integrity sha512-krQ8ZcKp5ONRTIjuN+Wf1Pl2UwqCmK3Bf0cbjm3IdCyX/HeFSUF2rT8ery6vToTAfFzmGQur7HSFzd6fPywnyA== dependencies: "@griffel/react" "^1.0.0" tslib "^2.1.0" @@ -2778,9 +2726,9 @@ "@types/node" "*" "@types/connect-history-api-fallback@^1.3.5": - version "1.3.5" - resolved "https://registry.yarnpkg.com/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz#d1f7a8a09d0ed5a57aee5ae9c18ab9b803205dae" - integrity sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw== + version "1.5.0" + resolved "https://registry.yarnpkg.com/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz#9fd20b3974bdc2bcd4ac6567e2e0f6885cb2cf41" + integrity sha512-4x5FkPpLipqwthjPsF7ZRbOv3uoLUFkTA9G9v583qi4pACvq0uTELrB8OLUzPWUI4IJIyvM85vzkV1nyiI2Lig== dependencies: "@types/express-serve-static-core" "*" "@types/node" "*" @@ -2921,10 +2869,15 @@ resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.31.tgz#31b7ca6407128a3d2bbc27fe2d21b345397f6197" integrity sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA== -"@types/node@*", "@types/node@^18.11.9": - version "18.16.2" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.16.2.tgz#2f610ea71034b3971c312192377f8a7178eb57f1" - integrity sha512-GQW/JL/5Fz/0I8RpeBG9lKp0+aNcXEaVL71c0D2Q0QHDTFvlYKT7an0onCUXj85anv7b4/WesqdfchLc0jtsCg== +"@types/node@*": + version "20.1.0" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.1.0.tgz#258805edc37c327cf706e64c6957f241ca4c4c20" + integrity sha512-O+z53uwx64xY7D6roOi4+jApDGFg0qn6WHcxe5QeqjMaTezBO/mxdfFXIVAVVyNWKx84OmPB3L8kbVYOTeN34A== + +"@types/node@^18.11.9": + version "18.16.5" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.16.5.tgz#bf64e42719dc2e74da24709a2e1c0b50a966120a" + integrity sha512-seOA34WMo9KB+UA78qaJoCO20RJzZGVXQ5Sh6FWu0g/hfT44nKXnej3/tCQl7FL97idFpBhisLYCTB50S0EirA== "@types/parse-json@^4.0.0": version "4.0.0" @@ -2957,16 +2910,16 @@ integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== "@types/react-dom@^18.0.11": - version "18.2.1" - resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.2.1.tgz#663b2612feb5f6431a70207430d7c04881b87f29" - integrity sha512-8QZEV9+Kwy7tXFmjJrp3XUKQSs9LTnE0KnoUb0YCguWBiNW0Yfb2iBMYZ08WPg35IR6P3Z0s00B15SwZnO26+w== + version "18.2.4" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.2.4.tgz#13f25bfbf4e404d26f62ac6e406591451acba9e0" + integrity sha512-G2mHoTMTL4yoydITgOGwWdWMVd8sNgyEP85xVmMKAPUBwQWm9wBPQUmvbeF4V3WBY1P7mmL4BkjQ0SqUpf1snw== dependencies: "@types/react" "*" "@types/react@*", "@types/react@^18.0.28": - version "18.2.0" - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.0.tgz#15cda145354accfc09a18d2f2305f9fc099ada21" - integrity sha512-0FLj93y5USLHdnhIhABk83rm8XEGA7kH3cr+YUlvxoUGp1xNt/DINUMvqPxLyOQMzLmZe8i4RTHbvb8MC7NmrA== + version "18.2.6" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.6.tgz#5cd53ee0d30ffc193b159d3516c8c8ad2f19d571" + integrity sha512-wRZClXn//zxCFW+ye/D2qY65UsYP1Fpex2YXorHc8awoNamkMZSvBxwxdYVInsHOZZd2Ppq8isnSzJL5Mpf8OA== dependencies: "@types/prop-types" "*" "@types/scheduler" "*" @@ -2990,9 +2943,9 @@ integrity sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ== "@types/semver@^7.3.12": - version "7.3.13" - resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.3.13.tgz#da4bfd73f49bd541d28920ab0e2bf0ee80f71c91" - integrity sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw== + version "7.5.0" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.0.tgz#591c1ce3a702c45ee15f47a42ade72c2fd78978a" + integrity sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw== "@types/send@*": version "0.17.1" @@ -3066,14 +3019,14 @@ "@types/yargs-parser" "*" "@typescript-eslint/eslint-plugin@^5.0.0", "@typescript-eslint/eslint-plugin@^5.5.0": - version "5.59.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.1.tgz#9b09ee1541bff1d2cebdcb87e7ce4a4003acde08" - integrity sha512-AVi0uazY5quFB9hlp2Xv+ogpfpk77xzsgsIEWyVS7uK/c7MZ5tw7ZPbapa0SbfkqE0fsAMkz5UwtgMLVk2BQAg== + version "5.59.5" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.5.tgz#f156827610a3f8cefc56baeaa93cd4a5f32966b4" + integrity sha512-feA9xbVRWJZor+AnLNAr7A8JRWeZqHUf4T9tlP+TN04b05pFVhO5eN7/O93Y/1OUlLMHKbnJisgDURs/qvtqdg== dependencies: "@eslint-community/regexpp" "^4.4.0" - "@typescript-eslint/scope-manager" "5.59.1" - "@typescript-eslint/type-utils" "5.59.1" - "@typescript-eslint/utils" "5.59.1" + "@typescript-eslint/scope-manager" "5.59.5" + "@typescript-eslint/type-utils" "5.59.5" + "@typescript-eslint/utils" "5.59.5" debug "^4.3.4" grapheme-splitter "^1.0.4" ignore "^5.2.0" @@ -3082,78 +3035,78 @@ tsutils "^3.21.0" "@typescript-eslint/experimental-utils@^5.0.0": - version "5.59.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-5.59.1.tgz#e185c9db6fe0c02ff2e542622db375ae012a0fe2" - integrity sha512-KVtKcHEizCIRx//LC9tBi6xp94ULKbU5StVHBVWURJQOVa2qw6HP28Hu7LmHrQM3p9I3q5Y2VR4wKllCJ3IWrw== + version "5.59.5" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-5.59.5.tgz#41308b6bb1e77eccab4c383f52aafecfe13e0d27" + integrity sha512-ArcSSBifznsKNA/p4h2w3Olt/T8AZf3bNglxD8OnuTsSDJbRpjPPmI8qpr6ijyvk1J/T3GMJHwRIluS/Kuz9kA== dependencies: - "@typescript-eslint/utils" "5.59.1" + "@typescript-eslint/utils" "5.59.5" "@typescript-eslint/parser@^5.0.0", "@typescript-eslint/parser@^5.45.0", "@typescript-eslint/parser@^5.5.0": - version "5.59.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.59.1.tgz#73c2c12127c5c1182d2e5b71a8fa2a85d215cbb4" - integrity sha512-nzjFAN8WEu6yPRDizIFyzAfgK7nybPodMNFGNH0M9tei2gYnYszRDqVA0xlnRjkl7Hkx2vYrEdb6fP2a21cG1g== + version "5.59.5" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.59.5.tgz#63064f5eafbdbfb5f9dfbf5c4503cdf949852981" + integrity sha512-NJXQC4MRnF9N9yWqQE2/KLRSOLvrrlZb48NGVfBa+RuPMN6B7ZcK5jZOvhuygv4D64fRKnZI4L4p8+M+rfeQuw== dependencies: - "@typescript-eslint/scope-manager" "5.59.1" - "@typescript-eslint/types" "5.59.1" - "@typescript-eslint/typescript-estree" "5.59.1" + "@typescript-eslint/scope-manager" "5.59.5" + "@typescript-eslint/types" "5.59.5" + "@typescript-eslint/typescript-estree" "5.59.5" debug "^4.3.4" -"@typescript-eslint/scope-manager@5.59.1": - version "5.59.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.59.1.tgz#8a20222719cebc5198618a5d44113705b51fd7fe" - integrity sha512-mau0waO5frJctPuAzcxiNWqJR5Z8V0190FTSqRw1Q4Euop6+zTwHAf8YIXNwDOT29tyUDrQ65jSg9aTU/H0omA== +"@typescript-eslint/scope-manager@5.59.5": + version "5.59.5" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.59.5.tgz#33ffc7e8663f42cfaac873de65ebf65d2bce674d" + integrity sha512-jVecWwnkX6ZgutF+DovbBJirZcAxgxC0EOHYt/niMROf8p4PwxxG32Qdhj/iIQQIuOflLjNkxoXyArkcIP7C3A== dependencies: - "@typescript-eslint/types" "5.59.1" - "@typescript-eslint/visitor-keys" "5.59.1" + "@typescript-eslint/types" "5.59.5" + "@typescript-eslint/visitor-keys" "5.59.5" -"@typescript-eslint/type-utils@5.59.1": - version "5.59.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.59.1.tgz#63981d61684fd24eda2f9f08c0a47ecb000a2111" - integrity sha512-ZMWQ+Oh82jWqWzvM3xU+9y5U7MEMVv6GLioM3R5NJk6uvP47kZ7YvlgSHJ7ERD6bOY7Q4uxWm25c76HKEwIjZw== +"@typescript-eslint/type-utils@5.59.5": + version "5.59.5" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.59.5.tgz#485b0e2c5b923460bc2ea6b338c595343f06fc9b" + integrity sha512-4eyhS7oGym67/pSxA2mmNq7X164oqDYNnZCUayBwJZIRVvKpBCMBzFnFxjeoDeShjtO6RQBHBuwybuX3POnDqg== dependencies: - "@typescript-eslint/typescript-estree" "5.59.1" - "@typescript-eslint/utils" "5.59.1" + "@typescript-eslint/typescript-estree" "5.59.5" + "@typescript-eslint/utils" "5.59.5" debug "^4.3.4" tsutils "^3.21.0" -"@typescript-eslint/types@5.59.1": - version "5.59.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.59.1.tgz#03f3fedd1c044cb336ebc34cc7855f121991f41d" - integrity sha512-dg0ICB+RZwHlysIy/Dh1SP+gnXNzwd/KS0JprD3Lmgmdq+dJAJnUPe1gNG34p0U19HvRlGX733d/KqscrGC1Pg== +"@typescript-eslint/types@5.59.5": + version "5.59.5" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.59.5.tgz#e63c5952532306d97c6ea432cee0981f6d2258c7" + integrity sha512-xkfRPHbqSH4Ggx4eHRIO/eGL8XL4Ysb4woL8c87YuAo8Md7AUjyWKa9YMwTL519SyDPrfEgKdewjkxNCVeJW7w== -"@typescript-eslint/typescript-estree@5.59.1": - version "5.59.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.1.tgz#4aa546d27fd0d477c618f0ca00b483f0ec84c43c" - integrity sha512-lYLBBOCsFltFy7XVqzX0Ju+Lh3WPIAWxYpmH/Q7ZoqzbscLiCW00LeYCdsUnnfnj29/s1WovXKh2gwCoinHNGA== +"@typescript-eslint/typescript-estree@5.59.5": + version "5.59.5" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.5.tgz#9b252ce55dd765e972a7a2f99233c439c5101e42" + integrity sha512-+XXdLN2CZLZcD/mO7mQtJMvCkzRfmODbeSKuMY/yXbGkzvA9rJyDY5qDYNoiz2kP/dmyAxXquL2BvLQLJFPQIg== dependencies: - "@typescript-eslint/types" "5.59.1" - "@typescript-eslint/visitor-keys" "5.59.1" + "@typescript-eslint/types" "5.59.5" + "@typescript-eslint/visitor-keys" "5.59.5" debug "^4.3.4" globby "^11.1.0" is-glob "^4.0.3" semver "^7.3.7" tsutils "^3.21.0" -"@typescript-eslint/utils@5.59.1", "@typescript-eslint/utils@^5.58.0": - version "5.59.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.59.1.tgz#d89fc758ad23d2157cfae53f0b429bdf15db9473" - integrity sha512-MkTe7FE+K1/GxZkP5gRj3rCztg45bEhsd8HYjczBuYm+qFHP5vtZmjx3B0yUCDotceQ4sHgTyz60Ycl225njmA== +"@typescript-eslint/utils@5.59.5", "@typescript-eslint/utils@^5.58.0": + version "5.59.5" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.59.5.tgz#15b3eb619bb223302e60413adb0accd29c32bcae" + integrity sha512-sCEHOiw+RbyTii9c3/qN74hYDPNORb8yWCoPLmB7BIflhplJ65u2PBpdRla12e3SSTJ2erRkPjz7ngLHhUegxA== dependencies: "@eslint-community/eslint-utils" "^4.2.0" "@types/json-schema" "^7.0.9" "@types/semver" "^7.3.12" - "@typescript-eslint/scope-manager" "5.59.1" - "@typescript-eslint/types" "5.59.1" - "@typescript-eslint/typescript-estree" "5.59.1" + "@typescript-eslint/scope-manager" "5.59.5" + "@typescript-eslint/types" "5.59.5" + "@typescript-eslint/typescript-estree" "5.59.5" eslint-scope "^5.1.1" semver "^7.3.7" -"@typescript-eslint/visitor-keys@5.59.1": - version "5.59.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.1.tgz#0d96c36efb6560d7fb8eb85de10442c10d8f6058" - integrity sha512-6waEYwBTCWryx0VJmP7JaM4FpipLsFl9CvYf2foAE8Qh/Y0s+bxWysciwOs0LTBED4JCaNxTZ5rGadB14M6dwA== +"@typescript-eslint/visitor-keys@5.59.5": + version "5.59.5" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.5.tgz#ba5b8d6791a13cf9fea6716af1e7626434b29b9b" + integrity sha512-qL+Oz+dbeBRTeyJTIy0eniD3uvqU7x+y1QceBismZ41hd4aBSRh8UAw4pZP0+XzLuPZmx4raNMq/I+59W2lXKA== dependencies: - "@typescript-eslint/types" "5.59.1" + "@typescript-eslint/types" "5.59.5" eslint-visitor-keys "^3.3.0" "@uifabric/set-version@^7.0.24": @@ -3357,13 +3310,6 @@ abab@^2.0.3, abab@^2.0.5: resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291" integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA== -abort-controller@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" - integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg== - dependencies: - event-target-shim "^5.0.0" - accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.8: version "1.3.8" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" @@ -3658,48 +3604,11 @@ asap@~2.0.6: resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" integrity sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA== -asn1.js-rfc2560@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/asn1.js-rfc2560/-/asn1.js-rfc2560-5.0.1.tgz#cff99b903e714756b29503ad49de01c72f131e60" - integrity sha512-1PrVg6kuBziDN3PGFmRk3QrjpKvP9h/Hv5yMrFZvC1kpzP6dQRzf5BpKstANqHBkaOUmTpakJWhicTATOA/SbA== - dependencies: - asn1.js-rfc5280 "^3.0.0" - -asn1.js-rfc5280@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/asn1.js-rfc5280/-/asn1.js-rfc5280-3.0.0.tgz#94e60498d5d4984b842d1a825485837574ccc902" - integrity sha512-Y2LZPOWeZ6qehv698ZgOGGCZXBQShObWnGthTrIFlIQjuV1gg2B8QOhWFRExq/MR1VnPpIIe7P9vX2vElxv+Pg== - dependencies: - asn1.js "^5.0.0" - -asn1.js@^5.0.0: - version "5.4.1" - resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-5.4.1.tgz#11a980b84ebb91781ce35b0fdc2ee294e3783f07" - integrity sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA== - dependencies: - bn.js "^4.0.0" - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - safer-buffer "^2.1.0" - ast-types-flow@^0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.7.tgz#f70b735c6bca1a5c9c22d982c3e39e7feba3bdad" integrity sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag== -async-disk-cache@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/async-disk-cache/-/async-disk-cache-2.1.0.tgz#e0f37b187ed8c41a5991518a9556d206ae2843a2" - integrity sha512-iH+boep2xivfD9wMaZWkywYIURSmsL96d6MoqrC94BnGSvXE4Quf8hnJiHGFYhw/nLeIa1XyRaf4vvcvkwAefg== - dependencies: - debug "^4.1.1" - heimdalljs "^0.2.3" - istextorbinary "^2.5.1" - mkdirp "^0.5.0" - rimraf "^3.0.0" - rsvp "^4.8.5" - username-sync "^1.0.2" - async@^2.6.4: version "2.6.4" resolved "https://registry.yarnpkg.com/async/-/async-2.6.4.tgz#706b7ff6084664cd7eae713f6f965433b5504221" @@ -3959,21 +3868,11 @@ binary-extensions@^2.0.0: resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== -binaryextensions@^2.1.2: - version "2.3.0" - resolved "https://registry.yarnpkg.com/binaryextensions/-/binaryextensions-2.3.0.tgz#1d269cbf7e6243ea886aa41453c3651ccbe13c22" - integrity sha512-nAihlQsYGyc5Bwq6+EsubvANYGExeJKHDO3RjnvwU042fawQTQfM3Kxn7IHUXQOz4bzfwsGYYHGSvXyW4zOGLg== - bluebird@^3.5.5: version "3.7.2" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== -bn.js@^4.0.0: - version "4.12.0" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" - integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== - body-parser@1.20.1: version "1.20.1" resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.1.tgz#b1812a8912c195cd371a3ee5e66faa2338a5c668" @@ -4153,9 +4052,9 @@ caniuse-api@^3.0.0: lodash.uniq "^4.5.0" caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001449, caniuse-lite@^1.0.30001464: - version "1.0.30001481" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001481.tgz#f58a717afe92f9e69d0e35ff64df596bfad93912" - integrity sha512-KCqHwRnaa1InZBtqXzP98LPg0ajCVujMKjqKDhZEthIpAsJl/YEIa3YvXjGXPVqzZVguccuu7ga9KOE1J9rKPQ== + version "1.0.30001486" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001486.tgz#56a08885228edf62cbe1ac8980f2b5dae159997e" + integrity sha512-uv7/gXuHi10Whlj0pp5q/tsK/32J2QSqVRKQhs2j8VsDCjgyruAh/eEXHF822VqO9yT6iZKw3nRwZRSPBE9OQg== case-sensitive-paths-webpack-plugin@^2.4.0: version "2.4.0" @@ -4340,7 +4239,7 @@ colorette@^2.0.10: resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== -combined-stream@^1.0.6, combined-stream@^1.0.8: +combined-stream@^1.0.8: version "1.0.8" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== @@ -4455,16 +4354,16 @@ cookie@0.5.0: integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== core-js-compat@^3.25.1: - version "3.30.1" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.30.1.tgz#961541e22db9c27fc48bfc13a3cafa8734171dfe" - integrity sha512-d690npR7MC6P0gq4npTl5n2VQeNAmUrJ90n+MHiKS7W2+xno4o3F5GDEuylSdi6EJ3VssibSGXOa1r3YXD3Mhw== + version "3.30.2" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.30.2.tgz#83f136e375babdb8c80ad3c22d67c69098c1dd8b" + integrity sha512-nriW1nuJjUgvkEjIot1Spwakz52V9YkYHZAQG6A1eCgC8AA1p0zngrQEP9R0+V6hji5XilWKG1Bd0YRppmGimA== dependencies: browserslist "^4.21.5" core-js-pure@^3.23.3: - version "3.30.1" - resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.30.1.tgz#7d93dc89e7d47b8ef05d7e79f507b0e99ea77eec" - integrity sha512-nXBEVpmUnNRhz83cHd9JRQC52cTMcuXAmR56+9dSMpRdpeA4I1PX6yjmhd71Eyc/wXNsdBdUDIj1QTIeZpU5Tg== + version "3.30.2" + resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.30.2.tgz#005a82551f4af3250dcfb46ed360fad32ced114e" + integrity sha512-p/npFUJXXBkCCTIlEGBdghofn00jWG6ZOtdoIXSJmAu2QBvN0IqpZXWweOytcwE6cfx8ZvVUy1vw8zxhe4Y2vg== core-js@^2.4.0: version "2.6.12" @@ -4472,9 +4371,9 @@ core-js@^2.4.0: integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ== core-js@^3.19.2: - version "3.30.1" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.30.1.tgz#fc9c5adcc541d8e9fa3e381179433cbf795628ba" - integrity sha512-ZNS5nbiSwDTq4hFosEDqm65izl2CWmLz0hARJMyNQBgkUZMIF51cQiMvIQKA6hvuaeWxQDP3hEedM1JZIgTldQ== + version "3.30.2" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.30.2.tgz#6528abfda65e5ad728143ea23f7a14f0dcf503fc" + integrity sha512-uBJiDmwqsbJCWHAwjrx3cvjbMXP7xD72Dmsn5LOJpiRmE3WbBbN5rCqQ2Qh6Ek6/eOrjlWngEynBWo4VxerQhg== core-util-is@~1.0.0: version "1.0.3" @@ -5070,14 +4969,6 @@ ecdsa-sig-formatter@1.0.11: dependencies: safe-buffer "^5.0.1" -editions@^2.2.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/editions/-/editions-2.3.1.tgz#3bc9962f1978e801312fbd0aebfed63b49bfe698" - integrity sha512-ptGvkwTvGdGfC0hfhKg0MT+TRLRKGtUiWGBInxOm5pz7ssADezahjCUaYuZ8Dr+C05FW0AECIIPt4WBxVINEhA== - dependencies: - errlop "^2.0.0" - semver "^6.3.0" - ee-first@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" @@ -5091,9 +4982,9 @@ ejs@^3.1.6: jake "^10.8.5" electron-to-chromium@^1.4.284: - version "1.4.376" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.376.tgz#a771d6c4db028634df126348a4f94075e07e7f65" - integrity sha512-TFeOKd98TpJzRHkr4Aorn16QkMnuCQuGAE6IZ0wYF+qkbSfMPqjplvRppR02tMUpVxZz8nyBNvVm9lIZsqrbPQ== + version "1.4.385" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.385.tgz#1afd8d6280d510145148777b899ff481c65531ff" + integrity sha512-L9zlje9bIw0h+CwPQumiuVlfMcV4boxRjFIWDcLfFqTZNbkwOExBzfmswytHawObQX4OUhtNv8gIiB21kOurIg== emittery@^0.10.2: version "0.10.2" @@ -5138,11 +5029,6 @@ entities@^2.0.0: resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== -errlop@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/errlop/-/errlop-2.2.0.tgz#1ff383f8f917ae328bebb802d6ca69666a42d21b" - integrity sha512-e64Qj9+4aZzjzzFpZC7p5kmm/ccCrbLhAJplhsDXQFs87XTsXwOpH4s1Io2s90Tau/8r2j9f4l/thhDevRjzxw== - error-ex@^1.3.1: version "1.3.2" resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" @@ -5498,10 +5384,10 @@ eslint-visitor-keys@^2.0.0, eslint-visitor-keys@^2.1.0: resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== -eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.0.tgz#c7f0f956124ce677047ddbc192a68f999454dedc" - integrity sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ== +eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1: + version "3.4.1" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz#c22c48f48942d08ca824cc526211ae400478a994" + integrity sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA== eslint-webpack-plugin@^3.1.1: version "3.2.0" @@ -5515,14 +5401,14 @@ eslint-webpack-plugin@^3.1.1: schema-utils "^4.0.0" eslint@^8.0.1, eslint@^8.3.0: - version "8.39.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.39.0.tgz#7fd20a295ef92d43809e914b70c39fd5a23cf3f1" - integrity sha512-mwiok6cy7KTW7rBpo05k6+p4YVZByLNjAZ/ACB9DRCu4YDRwjXI01tWHp6KAUWelsBetTxKK/2sHB0vdS8Z2Og== + version "8.40.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.40.0.tgz#a564cd0099f38542c4e9a2f630fa45bf33bc42a4" + integrity sha512-bvR+TsP9EHL3TqNtj9sCNJVAFK3fBN8Q7g5waghxyRsPLIMwL73XSKnZFK0hk/O2ANC+iAoq6PWMQ+IfBAJIiQ== dependencies: "@eslint-community/eslint-utils" "^4.2.0" "@eslint-community/regexpp" "^4.4.0" - "@eslint/eslintrc" "^2.0.2" - "@eslint/js" "8.39.0" + "@eslint/eslintrc" "^2.0.3" + "@eslint/js" "8.40.0" "@humanwhocodes/config-array" "^0.11.8" "@humanwhocodes/module-importer" "^1.0.1" "@nodelib/fs.walk" "^1.2.8" @@ -5533,8 +5419,8 @@ eslint@^8.0.1, eslint@^8.3.0: doctrine "^3.0.0" escape-string-regexp "^4.0.0" eslint-scope "^7.2.0" - eslint-visitor-keys "^3.4.0" - espree "^9.5.1" + eslint-visitor-keys "^3.4.1" + espree "^9.5.2" esquery "^1.4.2" esutils "^2.0.2" fast-deep-equal "^3.1.3" @@ -5560,14 +5446,14 @@ eslint@^8.0.1, eslint@^8.3.0: strip-json-comments "^3.1.0" text-table "^0.2.0" -espree@^9.5.1: - version "9.5.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-9.5.1.tgz#4f26a4d5f18905bf4f2e0bd99002aab807e96dd4" - integrity sha512-5yxtHSZXRSW5pvv3hAlXM5+/Oswi1AUFqBmbibKb5s6bp3rGIDkyXU6xCoyuuLhijr4SFwPrXRoZjz0AZDN9tg== +espree@^9.5.2: + version "9.5.2" + resolved "https://registry.yarnpkg.com/espree/-/espree-9.5.2.tgz#e994e7dc33a082a7a82dceaf12883a829353215b" + integrity sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw== dependencies: acorn "^8.8.0" acorn-jsx "^5.3.2" - eslint-visitor-keys "^3.4.0" + eslint-visitor-keys "^3.4.1" esprima@^4.0.0, esprima@^4.0.1: version "4.0.1" @@ -5618,11 +5504,6 @@ etag@~1.8.1: resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== -event-target-shim@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" - integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== - eventemitter3@^4.0.0: version "4.0.7" resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" @@ -5994,15 +5875,6 @@ fork-ts-checker-webpack-plugin@^6.5.0: semver "^7.3.2" tapable "^1.0.0" -form-data@^2.5.0: - version "2.5.1" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.5.1.tgz#f2cbec57b5e59e23716e128fe44d4e5dd23895f4" - integrity sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.6" - mime-types "^2.1.12" - form-data@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f" @@ -6315,13 +6187,6 @@ he@^1.2.0: resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== -heimdalljs@^0.2.3: - version "0.2.6" - resolved "https://registry.yarnpkg.com/heimdalljs/-/heimdalljs-0.2.6.tgz#b0eebabc412813aeb9542f9cc622cb58dbdcd9fe" - integrity sha512-o9bd30+5vLBvBtzCPwwGqpry2+n0Hi6H1+qwt6y+0kwRHGGF8TFIhJPmnuM0xO97zaKrDZMwO/V56fAnn8m/tA== - dependencies: - rsvp "~3.2.1" - hoist-non-react-statics@^3.3.0, hoist-non-react-statics@^3.3.2: version "3.3.2" resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" @@ -6657,11 +6522,6 @@ invert-kv@^1.0.0: resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" integrity sha512-xgs2NH9AE66ucSq4cNG1nhSFghr5l6tdL15Pk+jl46bmmBapgoaY/AacXyaDznAqmGL99TiLSQgO/XazFSKYeQ== -ip-regex@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-2.1.0.tgz#fa78bf5d2e6913c911ce9f819ee5146bb6d844e9" - integrity sha512-58yWmlHpp7VYfcdTwMTvwMmqx/Elfxjd9RXTDyMsbL7lLWmhMylLEqiYVLKuLzOZqVgiWXD9MfR62Vv89VRxkw== - ipaddr.js@1.9.1: version "1.9.1" resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" @@ -6980,15 +6840,6 @@ istanbul-reports@^3.1.3: html-escaper "^2.0.0" istanbul-lib-report "^3.0.0" -istextorbinary@^2.5.1: - version "2.6.0" - resolved "https://registry.yarnpkg.com/istextorbinary/-/istextorbinary-2.6.0.tgz#60776315fb0fa3999add276c02c69557b9ca28ab" - integrity sha512-+XRlFseT8B3L9KyjxxLjfXSLMuErKDsd8DBNrsaxoViABMEZlOSCstwmw0qpoFX3+U6yWU1yhLudAe6/lETGGA== - dependencies: - binaryextensions "^2.1.2" - editions "^2.2.0" - textextensions "^2.5.0" - jake@^10.8.5: version "10.8.5" resolved "https://registry.yarnpkg.com/jake/-/jake-10.8.5.tgz#f2183d2c59382cb274226034543b9c03b8164c46" @@ -7953,17 +7804,13 @@ micromatch@^4.0.2, micromatch@^4.0.4, micromatch@^4.0.5: picomatch "^2.3.1" microsoft-cognitiveservices-speech-sdk@^1.27.0: - version "1.27.0" - resolved "https://registry.yarnpkg.com/microsoft-cognitiveservices-speech-sdk/-/microsoft-cognitiveservices-speech-sdk-1.27.0.tgz#f499705a34b458f4abad99aa1067889c266e043a" - integrity sha512-KZsLl1jWC2MMZ5xOoIDGM5lLCvglF4HIQ8FpxUiBVEIodL8XV+Wu+cm6LSiY8fhfha21C5brWSW+JC1J5CiXEw== + version "1.28.0" + resolved "https://registry.yarnpkg.com/microsoft-cognitiveservices-speech-sdk/-/microsoft-cognitiveservices-speech-sdk-1.28.0.tgz#a19d8b43a7f2354aeed2e06bb9de75f66fa02281" + integrity sha512-d+hCqTSeVCGtog5BgUKdIVTNifuigap9VSJbtDUP4kW1uG/yp7zRnqsjYx9nV9sRfuiYwZCyFzGG+VXGa37QDw== dependencies: agent-base "^6.0.1" - asn1.js-rfc2560 "^5.0.1" - asn1.js-rfc5280 "^3.0.0" - async-disk-cache "^2.1.0" bent "^7.3.12" https-proxy-agent "^4.0.0" - simple-lru-cache "0.0.2" uuid "^9.0.0" ws "^7.5.6" @@ -8025,7 +7872,7 @@ minimist@^1.2.0, minimist@^1.2.6: resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== -mkdirp@^0.5.0, mkdirp@^0.5.6, mkdirp@~0.5.1: +mkdirp@^0.5.6, mkdirp@~0.5.1: version "0.5.6" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== @@ -8113,10 +7960,10 @@ no-case@^3.0.4: lower-case "^2.0.2" tslib "^2.0.3" -node-fetch@^2.3.0, node-fetch@^2.6.7: - version "2.6.9" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.9.tgz#7c7f744b5cc6eb5fd404e0c7a9fec630a55657e6" - integrity sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg== +node-fetch@^2.3.0: + version "2.6.10" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.10.tgz#4a52b637a6802092aa11a3bf73d19aac789fdce1" + integrity sha512-5YytjUVbwzjE/BX4N62vnPPkGNxlJPwdA9/ArUc4pcM6cYS4Hinuv4VazzwjMGgnWuiQqcemOanib/5PpcsGug== dependencies: whatwg-url "^5.0.0" @@ -9078,9 +8925,9 @@ postcss-selector-not@^6.0.1: postcss-selector-parser "^6.0.10" postcss-selector-parser@^6.0.10, postcss-selector-parser@^6.0.11, postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4, postcss-selector-parser@^6.0.5, postcss-selector-parser@^6.0.9: - version "6.0.11" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz#2e41dc39b7ad74046e1615185185cd0b17d0c8dc" - integrity sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g== + version "6.0.12" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.12.tgz#2efae5ffab3c8bfb2b7fbf0c426e3bca616c4abb" + integrity sha512-NdxGCAZdRrwVI1sy59+Wzrh+pMMHxapGnpfenDVlMEXoOcvt4pGE0JLK9YY2F5dLxcFYA/YbVQKhcGU+FtSYQg== dependencies: cssesc "^3.0.0" util-deprecate "^1.0.2" @@ -9211,7 +9058,7 @@ pseudomap@^1.0.2: resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" integrity sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ== -psl@^1.1.28, psl@^1.1.33: +psl@^1.1.33: version "1.9.0" resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== @@ -9721,16 +9568,6 @@ rollup@^2.43.1: optionalDependencies: fsevents "~2.3.2" -rsvp@^4.8.5: - version "4.8.5" - resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.5.tgz#c8f155311d167f68f21e168df71ec5b083113734" - integrity sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA== - -rsvp@~3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-3.2.1.tgz#07cb4a5df25add9e826ebc67dcc9fd89db27d84a" - integrity sha512-Rf4YVNYpKjZ6ASAmibcwTNciQ5Co5Ztq6iZPEykHpkoflnD/K5ryE/rHehFsTm4NJj8nKDhbi3eKBWGogmNnkg== - rtl-css-js@^1.1.3, rtl-css-js@^1.16.1: version "1.16.1" resolved "https://registry.yarnpkg.com/rtl-css-js/-/rtl-css-js-1.16.1.tgz#4b48b4354b0ff917a30488d95100fbf7219a3e80" @@ -9786,7 +9623,7 @@ safe-regex-test@^1.0.0: get-intrinsic "^1.1.3" is-regex "^1.1.4" -"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.1.0: +"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0": version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== @@ -9813,7 +9650,7 @@ sass@^1.29.0: immutable "^4.0.0" source-map-js ">=0.6.2 <2.0.0" -sax@>=0.6.0, sax@~1.2.4: +sax@~1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== @@ -10030,11 +9867,6 @@ signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== -simple-lru-cache@0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/simple-lru-cache/-/simple-lru-cache-0.0.2.tgz#d59cc3a193c1a5d0320f84ee732f6e4713e511dd" - integrity sha512-uEv/AFO0ADI7d99OHDmh1QfYzQk/izT1vCmu/riQfh7qjBVUUgRT87E5s5h7CxWCA/+YoZerykpEthzVrW3LIw== - sisteransi@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" @@ -10368,9 +10200,9 @@ stylis@^3.5.4: integrity sha512-8/3pSmthWM7lsPBKv7NXkzn2Uc9W7NotcwGNpJaa3k7WMM1XDCA4MgT5k/8BIexd5ydZdboXtU90XH9Ec4Bv/Q== stylis@^4.0.13: - version "4.1.3" - resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.1.3.tgz#fd2fbe79f5fed17c55269e16ed8da14c84d069f7" - integrity sha512-GP6WDNWf+o403jrEp9c5jibKavrtLW+/qYGhFxFrG8maXhwTBI7gLLhiBb0o7uFccWN+EOS9aMO6cGHWAO07OA== + version "4.2.0" + resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.2.0.tgz#79daee0208964c8fe695a42fcffcac633a211a51" + integrity sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw== sucrase@^3.32.0: version "3.32.0" @@ -10467,9 +10299,9 @@ symbol-tree@^3.2.4: integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== tabster@^4.1.1: - version "4.4.0" - resolved "https://registry.yarnpkg.com/tabster/-/tabster-4.4.0.tgz#9bcc91450a56f72e9b4466cee72f966b1560129e" - integrity sha512-lhbh4jBOcwN+qGzzyi0+bF1B6Lu/onneSSQN3hep1fvC+O98tiXzQFOvDoDnnMW9tfGoiuvJad5ZnI3AGXMAHw== + version "4.4.1" + resolved "https://registry.yarnpkg.com/tabster/-/tabster-4.4.1.tgz#7ce4281372a124bbc9f3b7b06aabfca542840a2e" + integrity sha512-Am5XszZz/5PnWVWveQubi4jfE6aJzTAEJ+c9Bc6R0tTEl1XYaPZpFrJUFb/SCq0BPE6ncFxLyPPpy6CwrIhnVg== dependencies: keyborg "^2.0.0" tslib "^2.3.1" @@ -10537,20 +10369,20 @@ terminal-link@^2.0.0: supports-hyperlinks "^2.0.0" terser-webpack-plugin@^5.2.5, terser-webpack-plugin@^5.3.7: - version "5.3.7" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.7.tgz#ef760632d24991760f339fe9290deb936ad1ffc7" - integrity sha512-AfKwIktyP7Cu50xNjXF/6Qb5lBNzYaWpU6YfoX3uZicTx0zTy0stDDCsvjDapKsSDvOeWo5MEq4TmdBy2cNoHw== + version "5.3.8" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.8.tgz#415e03d2508f7de63d59eca85c5d102838f06610" + integrity sha512-WiHL3ElchZMsK27P8uIUh4604IgJyAW47LVXGbEoB21DbQcZ+OuMpGjVYnEUaqcWM6dO8uS2qUbA7LSCWqvsbg== dependencies: "@jridgewell/trace-mapping" "^0.3.17" jest-worker "^27.4.5" schema-utils "^3.1.1" serialize-javascript "^6.0.1" - terser "^5.16.5" + terser "^5.16.8" -terser@^5.0.0, terser@^5.10.0, terser@^5.16.5: - version "5.17.1" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.17.1.tgz#948f10830454761e2eeedc6debe45c532c83fd69" - integrity sha512-hVl35zClmpisy6oaoKALOpS0rDYLxRFLHhRuDlEGTKey9qHjS1w9GMORjuwIMt70Wan4lwsLYyWDVnWgF+KUEw== +terser@^5.0.0, terser@^5.10.0, terser@^5.16.8: + version "5.17.2" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.17.2.tgz#06c9818ae998066234b985abeb57bb7bff29d449" + integrity sha512-1D1aGbOF1Mnayq5PvfMc0amAR1y5Z1nrZaGCvI5xsdEfZEVte8okonk02OiaK5fw5hG1GWuuVsakOnpZW8y25A== dependencies: "@jridgewell/source-map" "^0.3.2" acorn "^8.5.0" @@ -10571,11 +10403,6 @@ text-table@^0.2.0: resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== -textextensions@^2.5.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/textextensions/-/textextensions-2.6.0.tgz#d7e4ab13fe54e32e08873be40d51b74229b00fc4" - integrity sha512-49WtAWS+tcsy93dRt6P0P3AMD2m5PvXRhuEA0kaXos5ZLlujtYmpmFsB+QvWUSxE1ZsstmYXfQ7L40+EcQgpAQ== - thenify-all@^1.0.0: version "1.6.0" resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726" @@ -10627,15 +10454,6 @@ toidentifier@1.0.1: resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== -tough-cookie@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-3.0.1.tgz#9df4f57e739c26930a018184887f4adb7dca73b2" - integrity sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg== - dependencies: - ip-regex "^2.1.0" - psl "^1.1.28" - punycode "^2.1.1" - tough-cookie@^4.0.0: version "4.1.2" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.2.tgz#e53e84b85f24e0b65dd526f46628db6c85f6b874" @@ -10690,7 +10508,7 @@ tslib@^1.10.0, tslib@^1.8.1: resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tslib@^2.0.3, tslib@^2.1.0, tslib@^2.2.0, tslib@^2.3.1, tslib@^2.4.0: +tslib@^2.0.3, tslib@^2.1.0, tslib@^2.3.1, tslib@^2.4.0: version "2.5.0" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.0.tgz#42bfed86f5787aeb41d031866c8f402429e0fddf" integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg== @@ -10702,11 +10520,6 @@ tsutils@^3.21.0: dependencies: tslib "^1.8.1" -tunnel@0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/tunnel/-/tunnel-0.0.6.tgz#72f1314b34a5b192db012324df2cc587ca47f92c" - integrity sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg== - type-check@^0.4.0, type-check@~0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" @@ -10880,11 +10693,6 @@ use-sync-external-store@^1.0.0: resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz#7dbefd6ef3fe4e767a0cf5d7287aacfb5846928a" integrity sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA== -username-sync@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/username-sync/-/username-sync-1.0.3.tgz#ae41c5c8a4c8c2ecc1443a7d0742742bd7e36732" - integrity sha512-m/7/FSqjJNAzF2La448c/aEom0gJy7HY7Y509h6l0ePvEkFictAGptwWaj1msWJ38JbfEDOUoE8kqFee9EHKdA== - util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" @@ -11012,9 +10820,9 @@ webpack-dev-middleware@^5.3.1: schema-utils "^4.0.0" webpack-dev-server@^4.6.0: - version "4.13.3" - resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-4.13.3.tgz#9feb740b8b56b886260bae1360286818a221bae8" - integrity sha512-KqqzrzMRSRy5ePz10VhjyL27K2dxqwXQLP5rAKwRJBPUahe7Z2bBWzHw37jeb8GCPKxZRO79ZdQUAPesMh/Nug== + version "4.15.0" + resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-4.15.0.tgz#87ba9006eca53c551607ea0d663f4ae88be7af21" + integrity sha512-HmNB5QeSl1KpulTBQ8UT4FPrByYyaLxpJoQ0+s7EvUrMc16m0ZS1sgb1XGqzmgCPk0c9y+aaXxn11tbLzuM7NQ== dependencies: "@types/bonjour" "^3.5.9" "@types/connect-history-api-fallback" "^1.3.5" @@ -11077,9 +10885,9 @@ webpack-sources@^3.2.3: integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== webpack@^5.64.4: - version "5.81.0" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.81.0.tgz#27a2e8466c8b4820d800a8d90f06ef98294f9956" - integrity sha512-AAjaJ9S4hYCVODKLQTgG5p5e11hiMawBwV2v8MYLE0C/6UAGLuAF4n1qa9GOwdxnicaP+5k6M5HrLmD4+gIB8Q== + version "5.82.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.82.0.tgz#3c0d074dec79401db026b4ba0fb23d6333f88e7d" + integrity sha512-iGNA2fHhnDcV1bONdUu554eZx+XeldsaeQ8T67H6KKHl2nUSwX8Zm7cmzOA46ox/X1ARxf7Bjv8wQ/HsB5fxBg== dependencies: "@types/eslint-scope" "^3.7.3" "@types/estree" "^1.0.0" @@ -11443,19 +11251,6 @@ xml-name-validator@^3.0.0: resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== -xml2js@^0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.5.0.tgz#d9440631fbb2ed800203fad106f2724f62c493b7" - integrity sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA== - dependencies: - sax ">=0.6.0" - xmlbuilder "~11.0.0" - -xmlbuilder@~11.0.0: - version "11.0.1" - resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-11.0.1.tgz#be9bae1c8a046e76b31127726347d0ad7002beb3" - integrity sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA== - xmlchars@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" From a2e4e60e16ac822b260f8e815633f951c343e116 Mon Sep 17 00:00:00 2001 From: hathind Date: Mon, 8 May 2023 15:38:40 -0700 Subject: [PATCH 02/33] Remove plugins --- .../apps/copilot-chat-app/webapp/src/App.tsx | 2 - .../webapp/src/assets/plugin-icons/github.png | Bin 4387 -> 0 bytes .../webapp/src/assets/plugin-icons/jira.png | Bin 6321 -> 0 bytes .../src/assets/plugin-icons/ms-graph.png | Bin 7408 -> 0 bytes .../open-api-plugins/PluginCard.tsx | 79 ------ .../open-api-plugins/PluginConnector.tsx | 257 ------------------ .../open-api-plugins/PluginGallery.tsx | 85 ------ .../src/libs/connectors/useConnectors.ts | 35 --- .../libs/semantic-kernel/SemanticKernel.ts | 37 +-- .../webapp/src/libs/services/BaseService.ts | 16 -- .../webapp/src/libs/useChat.ts | 4 +- .../webapp/src/redux/app/store.ts | 2 - .../redux/features/plugins/PluginsState.ts | 110 -------- .../redux/features/plugins/pluginsSlice.ts | 55 ---- 14 files changed, 2 insertions(+), 680 deletions(-) delete mode 100644 samples/apps/copilot-chat-app/webapp/src/assets/plugin-icons/github.png delete mode 100644 samples/apps/copilot-chat-app/webapp/src/assets/plugin-icons/jira.png delete mode 100644 samples/apps/copilot-chat-app/webapp/src/assets/plugin-icons/ms-graph.png delete mode 100644 samples/apps/copilot-chat-app/webapp/src/components/open-api-plugins/PluginCard.tsx delete mode 100644 samples/apps/copilot-chat-app/webapp/src/components/open-api-plugins/PluginConnector.tsx delete mode 100644 samples/apps/copilot-chat-app/webapp/src/components/open-api-plugins/PluginGallery.tsx delete mode 100644 samples/apps/copilot-chat-app/webapp/src/libs/connectors/useConnectors.ts delete mode 100644 samples/apps/copilot-chat-app/webapp/src/redux/features/plugins/PluginsState.ts delete mode 100644 samples/apps/copilot-chat-app/webapp/src/redux/features/plugins/pluginsSlice.ts diff --git a/samples/apps/copilot-chat-app/webapp/src/App.tsx b/samples/apps/copilot-chat-app/webapp/src/App.tsx index 9a097a8f1fb8..f34183b1084e 100644 --- a/samples/apps/copilot-chat-app/webapp/src/App.tsx +++ b/samples/apps/copilot-chat-app/webapp/src/App.tsx @@ -4,7 +4,6 @@ import { Alert } from '@fluentui/react-components/unstable'; import { Dismiss16Regular } from '@fluentui/react-icons'; import * as React from 'react'; import { FC, useEffect } from 'react'; -import { PluginGallery } from './components/open-api-plugins/PluginGallery'; import BackendProbe from './components/views/BackendProbe'; import { ChatView } from './components/views/ChatView'; import { useChat } from './libs/useChat'; @@ -80,7 +79,6 @@ const App: FC = () => {
Copilot Chat
- lx4&ZNA90W-I zrMtdQt&k)n(zgGB6cnNLw;&-!!nD;$s=u>t{T1Y{ss^egBy~ymE*)=^kkB^kXsDV7 zk?!SE)H-W2Mu*d>rekkaV^8~J#WeZ3bt-SsF=(i&s-(t7y4{8G@Rrl2m-4g6Kc%B$ z&*Wzxdk|0cfGM-Fb`|q5lN}y@Ld6o~v$4?9)SWA9KW_irs{4KR{^M7Mc}g3N&cJBL z{}GAn>XO@U4l&*CFK{$N+-HmWFZ;LHaG43#;%L!c4D?t=WVi9{sN~*_Vvl>lr=Y=I zufY-!^@Z)A+pv#(`|?TpC>)xW`v}##xW$2U#n@#@zbqng8Eycm+swP$;-qrTUoiV$ zG%ds#n97l<|oDy=np9^m?yq7Bko?fam>1jox)B);%EkRQvPak%K&uX z2-vfDmVlDSiC~mgPUxi2Wl$O!ThWe}_8TXK39lo;hmlZu+1wu|jh9?);FHqPX{fyX zD>W^9G{*`JSghmj^VEV&#`iLOhV6* zad6YJ)_IUmT7vi+Ai838J|&6ZMy0_czRCjmN624Vf>%TPgnGXo70O^z9=F6qm%Y9NX#%CI_J*yUl~^o`HLCJ5-JidSntI zs!as&F-r=&>}HeXDJQl>CRbn<0*FfNFM-mJ39q=-%b441Ywgv-SOxNQr@7Ia6e$ZA zwpQHOC+nz-_#6cJRf#m_np-}(Y~UpnRc4j8IK;^pf&dj4jKF4!Q_euCkRj! z$Ln=|t82~gT{R2#qq_YG#+};o=7TwNs*Hi}l+BTEISP;caLDmW9Vs2Y{wML^h!ykt zl^jS)iF>R03+HPk%%v^X#UOtR-CC)bMMmx2lQ&)&_c*Z{IfIl-UP2iUPh;;s4rHPb zM|yNRxDM2`=+Gkss~a#%CFIyxu2lM;^ye}q#JtLxYg8K`qH1l{Mhfv!;#Z0E403+5 zl4r4|N{1f4ZEN~P7^j4=GI$PgV`e3W_z3(0K~%9V4r#nyrg<`uc>f&WbCW(^UyG>M z2?`eiqk7q$__c@WXzvmlf-BMZDV@{h!<5sq8gp=M;bqp{!~UBj7YxZvn8=UDq|vCO zTp8rED%g(BdF_n!D$A##C-Y}1Tfp*v6Ei!6N`DA11>m|2zArQc`E;S<<@UBtq^W!)wbrj`Zax}8+C7N0D@?8E_*r&0sWZCBJwZ{8RD>D&!iAD<6EbmcEA1XquFV(tkf+fcc3Z zy^}Z=gMY$?BBTm=nEsHbZn(1i=-~5LiKn0nF5E_cb&KqZ4m{u8>93iX?xJzVbSYa) zV2!42R>At-9W)jen2pA~&@O}Baw_v(4qRgHeZPyWOZtc*t-0KGl~~QVKUR;7&w>?H zxo(UaUXN$@dTqXLwsiav;j#|&68)K-X)*QrfmL>m(OIx_hMie^O~#OAbclpA*EKxsuNM;LFpkh%N?@J zsB&gglqv!|dAJy61=(1mPCYHms4j$b-|y6B4 z3lfviT5u#EhzSqT^gfIIOw{G~PkJtEC84HF|wVSH8Db z;K7*;O3#A_wug}KDaDiopvp})J~gom45e9FO36k<^T&)}F;@A7O^lz7}lGBq`i-hQiDOyByVj@LH0c~|jFN{piL;S=Ef=_*%lU+MkylzS&9@#8f`WKpd5 z7+?8;(02NVVtlxm<9m|+ub=pw3W!e46>8es^yHrx)s0Hkq@}Q!%>uKc<_e1A@&7rm zKLWK#s2+k$PNEQ0tv|t4DGZLB@CkibC?y{@Lt;~RZB0?7V!YRR6;MV~N7F({!R7zN zt=fuzlzK6itcjtmq?z2R0REY^a<~ruK?^0bnp56PepmpvuxyZfcC8gw+t*gs%<#Qg z2tI5q3eLM*!7`8p<+ahLoVEK77<7G%{!X*b^CEn|EAHpu7eoTj3lWf!Ugk2LYr=q& zZbOa0+>kg5y}q3D(RuY&#qr$Rp%qPg%bxr^7&FXH-+AB;GKI5aJ+4qp7(Seq9?dUe zmZ;`g08xPbxA2^I+X7BRn`1<-_Gq`AOW@ZSvi7dxAcXBZ0bTXtS$pY+?H7Bwb(Ni1WJXw+>~U=7G^!qJ4v^C_Co$qnSfeAry@y~LpVG$&DrZ5x zf?-y#lp`e?RItC_%g<=g6{HQ05_(Hp+@HKajfF+}?j90)|G7J)h2jgxDd0o3Z<3`- zwr(@`UYZ0Cu6@((Tt7M|%2Jbq94q?x335lc4%tBt=?SesX}Kljd}SMetbH>8JIX1k zg-+hsI)Z1+UixL&OP=~EuSv7BDXuog2scVA<^^2f+mdp2+Sp3p_%d8!j@VeA$TrEo zGIRH4@4IcT@Zj@V%7&c9Ca74^BRt7u{0~#}!dCoIk_t>+7UZ;a!*36?+Hf#Pz4^rl zu8pnLx&E*X?l+P%1kKIVmR;UfZV!DuG`M`=v=l?&D;<+{Q!u_>YAgz6)K|6*`GNvv z+H*r;NGgyq)#s0r5!T&$W3yTO{>=Xh9wTuUW?r3I55kdcp$`Twj+9)|ys6p4^n=GX za>F<}3SQdzQP+vuRweX&ptTdTj~wgdqQp~VEGAW4bSCm%dil54q$H8Bj$PZWl5f<$ zJqEe))K-mtfx61fi`e^2ZjYT_hi9*t3Y)4Q_b~XG=x+HKG2euE{%ObYU!T6? z*#|RCp@V=k5@52Ml4?Tv@gYt-tc}M894s-CPuhbp$ zR3Wn=Cgt}25XZ5b>aF$?CZ_S#Aa}Z~-(!d5`T{wAF^?l|{Bo;R5Y!$M_2CRBC zbH#~TB*uFLkfF<&2_Y&I;bhT_zg5bhDRQ;>7Yu@R6)preAvB*sjhULnS00n@ZRCXM z$D?4FY1)ZbUo0;W@;X9`)oYUUyuDFxFR->Wwpi%y}?YH%{MZsVH+L;PJ4L|mE}&tiM}ye!|dvo<# zpsv5arI+O%QVB5R9_8|VJw<}klQ#_Ou}3?QzY-e?l!H?50&4lsY8d(^QVJ$3#2-H1 zBt|_~t^RB~Wtt4Nbt?B(Rp5ANfyYAJe)HLnlJsQnI0!}Uxk~2*VeSjq!$6R$;>l#= zyRAufrOjbd0L98s9mnAlQo~1?J4`>vOEu%SENF!6otPo;YdxzO@4cl4uOBC+%lfM@ zLY5`Kz*Vqk?s6@{m)5_e%LjXCQ0Et@(lmFEpQJmXTW=-rIu(mpf;Zz^HYzQ7S|LLqR7+ovJ z&A$4+rXC1{#GPe*I~A9ZjK258ok4xKRrmN8hK9Br2!X5V#d$gVt!b&2#>FcPrT7S% zxQtl+$g;o>n_zcQg>Zr34VG_RzKJpNR#4N!4=C2d^)}h%WOQbuCjQ=U^>(7qVhi+%vbB4!`#RkunSasQt=){yj2Xi~e^=DKh|^Ca8u-GImkW&{HO+OjCF-G~7IW*vPkm}Ly` zup}siZ6Wf@RLN$}d~(p|^iA6r*_{@mRLe~COMm725i8{(lpO+BNR$wyQ`?QctAT;7 z+jkloWkwI1wx+jdCbqY{B(Yp$BpYF3_%Wuh#oNW_P^PVBOW)HM9zHc5fB)~1IZuyl zpKSCLCu+;h=UKzb8pq9XkIy8a)mDu0`6u_b|0gu^L|!{RB2P@R>LqG@U`6s48P&y& zivMTy5Mo;;47B!(y^-u@8yD)F%-uD= z{k?ud5WAgBBqn^-M%D=bMAPfa-+wdI-fp7)&$YmemeI0Oo#IXpWfCSnsnC668*`Ax z+o$rTOu{ixDIFs!+AjOdd$Pvwc+b4M{z=V7V7?0I)iL{qOj1-RcFG;WH78j+y~JaB8|Dqd%{9LZa$b% zY@&*nqvuMA)w@$pi;6aR+Bdp->P#uf$3;{Z6$gJDd!8unFtF6lyn}u)D3%jpcit=B zzON@ejnjvV8o3pgt@hnb=?yie1_zL6E#gteRcNC|9yX?nGHMmpyO40|HVbf!C%F|>yjQ3CY zt!nr$*GEyj^qOc4%8!tB+z>&Y;`Yq6H~#PI%x^n%U{h4AAksv#3mKB zG>r$XE}2Sc2DnBhO$MumT}Wj(lJC9ntc|86WUu|VRMpdwFGc}wCvl{E{g8VkD%>)v z!lj+^%vBnrHSyFSoNH!NE7h)SgdxSZGuZX@=kVIiaYV9|jx?5V7#g5<*=OTy(%ULl zSujyJ0aHlfb$HO7EeA0La$`lm+&=g~)o4iBF;lj7^LxMK@X8<^ixZRJ9Vzm3B!!jB z9a)OnI@z#PwGNwZ7sa5c#cwVmg<}mqYI$U9ipeiRzY9z?=pm!rYh{h(Fut;u@0@tP z-+#tzSdzlRuyrN#gY@{b1WxJhM+zg4D}V?2sD*u)xSX4*2@yv3_M&}R_FHNrCnk#L;rIJ% z;v<#hY0Gk*&!9Dwk(=~t7+sUq`&DrvDp>=Q3P07AY}A_$0gQZ^q^s)R-?H!3w4*_t z(?}@0Jm$;Ifj}3|pS7RuiN9D1`%l~@i2MT}%gc=}zBTgLpf-;lD`FB)!eiY5<-9s6 z_TjIjxF-9b9X_WVg7jTZ&4dL_D$-e}&-y>x} zE0b_Se1af0dNxq^*F}DJFl>UsN&~$_SP~CjIrI_+dw;2FW0K2tYgVRNMS%xyY5APl zb!jV43|E&fb{>!EE(ma<+shHX^U&_4;wGZrujzw5L@=zDpr-%^_#ZecBdicqR8%35 zF-Zj(slrpe)9Zh@5uOTV!A6GUnmV9d0>4^o%H=bdhf8EpI(L0sB8HhqDX{C7cPdfs zpr%SmrZ~*rD2*EYKA_gwFIEg523MJdM;_zN3{by8CN+G{<4bR)iaOZtwSByxB=B-! z5&Au;4|gMpo=aCR)T8YVE)|g}2>DD?6|jb>j)M9~H7K&JT?9T$!8w%~o%cvlZrOg{ ztS)hxjBBHR(;u}=aV-BXmFj#kb4nwN|G@%e&mNc=(mK{5PJvXqXg7fiAg#hrKia75 zZwoC1Yo270G#Jf61j<>a;qMk8?z-0%S8E5pGvRJ398>*%3V?bJh}7` zOoQP~pojewCo|KO;7os_$STBV1sjo_Cevb=WUm5dixmMv?J7^DkV%dy7nis28vb!? z=W10RA;y2gzt*~CutI6lLUy#{7~H={He&j2r^lbz-QmJ1L@p? zV4WDj|YokNG|Q|^LuMEJCV^nuL)PWa14_s8=vRVk3%W6H%_z<|m6Z8V&@2cpCPR9=fc(>$BAx zcXsvX;wRY@S3adJ_8RChKnYq}SnP0X5ja?AOR&Hva5A69#bL)u_~fUIFP~s*zW=r6J-LO~5YQ7l3 z)H77}@_!VHx$j4Y=Aqlv{0g*>ryV&1CR?~%kheE^Rn%+r29%NiAS#%(Set}sNvX%Q zc$L7$x)u)WW7;QPIX{2#&ntjA1LNf4DdS2hv0*Xie8>Do zr46rHGX=(n5=-7Of7mhzNw*?CQynIYB#uqY0PP%TNSvsLYmcIKwqLOO(mLu3f$FKW z{5c0sa5rsHLyw)SwE|Ohl-K^P5APYb31dB_0yepF?J3cQv;>WcHxzf75*vw8 z zz;+rg)&2V)qtjTRiJNBcBPE8sN2PfRnsr@pbQ|FUVxx!#9L}MI2UoSFgW+vh7v- za>lv73E9S6dCy~Ud3up1UUld5i@H}0e<3HqhHTGTb>%%*)9qNorR-xtDL97xxC- zr;T_hh#_vDqs&dGsksg#gZ`R1l22*&9hFM~!XnrGef$GFrC6=-YV77uqt(U7!?52o zO&}KQ{`tG~O8WcRqYU|YaKp3D09kU4z-!FhUbA4Jf91zwEk=Tfl5#x{e-TmAs`mJv zJSst(Q{~j>q@U3LI;95!JyF(@yF9}+@G_32Fs%Fp_AsL3nQ>5fcA06$j#d`ro>V3HFG+ig+1XzsWka<7)mO!T`KUtedQu3Kd*#e0g4wSR zSfeLvI}H13l8!zRo|*nTFH5rKI7;M_ncJKnjOljF^Hufpmg{pOj_kfMHIQC@=encX zG4{L}nlby9S15A1<(K-_Ub4eT!#z5uq&&%oVo8K6_7678=N{j%QI?gdMa(4G^oRsT zTrQP1ms-)mDVm=q?=JAQcTu5(P4E$AQ8RR+QkCSw#_2stBwy}1IK@ORcT)wIyqD<{ zrY^B5yYN~V6>gJX!$o{RE2|-hcq1!-@@8(@51v|mduV0*2wreJO1OtM+R}oz*qgka z_viqzIDLUP=(PViufY86YVBaRd78(I{1@yKYnO@N8n5!GT@EW)%6gw9+%0oYAM#&$*j>k@m7JoFRYt0`eUEE zw7CykxefW9tJv6&Nr{QxV#ZWu=R*~927-60+E{xNUDgsd+76wlJ~xN=a#V%pDOfN^ zTG@_9BjE*JB7qDZjE|mnvC2$&>y^yCT(ZB28ag12p6l)T5q~WL^0utASfe~!eJWL> z*7M)mXX7VFQgu$qj#XS>aYqSh%zA~{M`wG5c^ux{O()O!Yc`&gM-(+`Nr24~bM!mw zvS0&r@##f3Rge_ucyE_+_c3$(I6MvjkhTL^*nUcp)V9gA1{Rp{3LE!cclpXm$no5!U!&Jh$u=Kc(?Qxn$bHzkO}=!+lqz(qTHKxBj0o zp`y%1oWRBYJVykMwFO2 z&-U@RQt`o~n(gu#P$h@5ZzJt^?Ss4P(SfwV90BpOT- z@OA}CF_>?HUbea4ANv$vg~q99fFv||Mtjeupm7Q>1E_@$asmSmc@)uz(&=X*&!3x0 zTfLn&Z0x2ohJY?EDZZ2`$!>Tto4P%i&~hy*M9~Q)3z~Vp{EnJBE7hHi0ayOwU@ZLI zJ~%}tQacu9oX)c6F{MF0YB@Be^>SRRv;^R8ky_GfhI3f31F`-$bddJ^I^K>!mTOrF zZUgbQta3nnXU&&e*9r`x^`>G&@|tjdokzcyf&#=JjcZMC$xxsGU)TRzFZ_-@S(s6A z_Uu>e>@PQosd{lKR!=Eg{|9~Oj^@SQl|kPJz7IW;n`g?wz=}H*@^w6tmD9!%=$A5Q zQ^dihdOW9J(yf{Ov?|K-v(G?@+pR8(_+>| zN4dY&3aCOB{LA83oGMmShIOvKBsjw~adT(7ameh!q1JgS%bfm{&nyo=D^6c7 z$^{TE;o)}ri166(kYXk4O^_nDw1(l?8ORgdI?RAmkQW+GfNzN?K4oUn3APOy z`+WWEF!pZ6nYb``&-QZH?G=gpJ#%;Iq$LnRd!PTOo?zwFO0(tuE%51Yz8nf$BklHi zsS5wZtUTKyE%#TGe`X4O=Z8R4h!_t@SyRIRv@LeA)~>pb+I zjFR0Emza%qJFJ}cgVZ9UX&Bf{pD&7qiXC^T?ykK9n7)NKrf(sHTy?a8a^xB>@7{Yl z(~WtLXFfhb97~=u|IPi<37u5XE841gcfD zTT~yKo&INEd18x4KhD@tF%d(2^;79Iogr2_>GDUS{rA4jBb#Y0-+E=mG}Y^vRg0Cs zlauDi!h75Nm1@iEnsKsiLUo1}NEQZuOl|L~a?I8M&_~hJRlE@&si1jYwVIJ=e7G^Q zM579eJ-YmxB?hfbXY{pX4`I)+=^*n-_+5%R$c3&jHMNVsqXye;aZLz`l>-2Q$_GVYXFiC*G*RljPc_f)ySzVXRR9TusE})l0390fip&!5f zWymU^MMo%CFJZc2BUgc))xq0JrIftIp&Xk@ zzj9F4^qtFE6W<=Q?ULwsPr#NABu9R=Yel=qRVBvH4t^4CCN5$$`$;nYh2$VI;0Hp- z3bZ#lZ{0-?SlzTz2+|Foh6h8b8INzjb>}C2g0gbol}ok>%ID@|!8N(!?duJ~j5Ct_ zb2f#6BlKIxi33uscRZfePEB`b4~t`QTYm4 zJ$7XgV^}tl>0BgIU?Me+VBP`Bm}XTNeMI*~2WFaC=TkSc`o5V12ME_nE+@*2Cl5o9 zxsb7JXbpwq<+fy)vQLgd<7l;O0Vfy9B@hy+S^T2NbX2v&I&>jdzQB0vyM}QiFhExt zLp?22wrUxbJO%<;d3qN_-?6q#5C&|t;`Kvcb-NL%V{OV)2`dGxui^(w=o;KeCW6okUKJ^?wstP;i5shofrwUeVWP}fmkxg z)$4#zhW~a)QOpOUbQ;E%1bURCs= z<1f$q<4*WmAJ9;f8_fTX_H;mht$7O~jv-NgZso&`Wm)|HAm+sw8}#r56Rc6AeRCRS8`JgdzbIr79gFRR~2&2#E9= zAP7;4G!X=(dGmhX{dw2@vCo{d*6cGg&v|C{p0iWUP4yY+x#`Ks$QTU`bSz1->Ayis zO}c7)r3R7&U7&$&2pO5O<9~x3@LZ2{Lq;BAssDhiZuHg`>4DM%WC9{1LuX#UaH1k3 zyOn6D1G0jV?-pLqWt%A&)Vw)BgA+Q4g9F8=6$7>6gz0Ih<>+70((CCaf=a8`fDQKr zI$yY}m$GJS}oJuTdbLp9-8jnYwHJc*Q=n z`lt0w?b~y;4_gIwZ;L;iZ`XJ4|I>JZdn(7pKpp@2|0l*%?!5qFvxM}A=Vx4j!k=?X zGgKw?0c)Pad~)mbKw%J|LG&O#!4dKwK+4BUndJy19dn@>C98LCmLQ||Lb=A_baR=Cts#9DZQkEyuhoCN zWr;jY*&yTAhner|KHSpQ9@EHp#VfQsW@mZnBbTA5AH`gFGP(#G^k$CHmCig5>pKZe z&K&<$-aOm9%JZ}h^)^Q8kN09faFe!a&Jp|N0mIjsHz83>Q!mYYW!q|Pb4oou2Z=cI zfPOgwjjX@vvr}71?&Zsb3M>N$a@~_R`1{Sz^aQl{v#SK}mRNVk;W2M~;Q6@e;KW)u z^Ibbx#?sD|h_$#8p)Uz+=L;W}hE1Xt{>(v%iK2g(J8w-^jsoBA$t%vO$u6{IR;|>G znQ?S|`p{G4C%c^Q?8PNRz;%v#KH#;BvH$4-S+Ula^~almSMb{B`4%Udt)CDe3fR_h znK+(X@sRSRumRK#fTnptJx~UKEL$O;N;Xa%_wEdePTA$3N6zhCEqj2OTKs6#20cMu81BEn6j;-bf#xH7 zc{ypQoCdd~yMyRqOa~X~dxYHZ6ZB5AU6nn&qBJ=+BV34K!IUy07mi9|B?`sra7Lsu z3J%kzmaiMMK8`J-m$XZ^2j_VNrV9HJ=$Yw-L?ba@6}XN`(1NUAhax9WwW*7f*NQTQW_i=4T|ZJf5gEU!ozG7E3@ zFucONy-}N~;jpoOA>>pgeJ5CbUtf^;XnTC4I4zmu*k=UNmpPM4 z)fjPAcY^1)BT!YKsPspF&iyhoaYHifZ#JI?fm)VDSRxuh{SyB++70E_Z+nPU-`fnQ zU!M3kowR>|VR+J;$@lFRAMZ4rCr{2?!#H}|a*dC>`Ppye*4on{wR11u{e6z*jC)+D zxRDg6rE+dgn$Ob95uIq(makEV3a{`RI)qg#Z1W_oiu-}T!^uRk0kAMdaH9}+*IhXl zTT?y#p8JG{4Z_7~F^XP~msLMkpT9Fv3r^*3LK%nu$XPVJORM01`CXCzI)aOEni_2| z!SyZO`7=1`&IBLuZF6X9#MVMCODX_*16cU_ccbYy>}YImu)!)#0Nb{&wcN+*MD=gQ z#kc6J4U9)cQ&Mp-!@VE0iq_@uEY7Bqq8{z^SKVLfWw~F=$MZTc?*@n<4}LO*q!acI z4H9%1@IE!(qhC6l4@LzL;bGnl=`S$>6o)_Q*a z>R~&VPB$Tz$8g-1_nc~^!rl_m?>%0Ht#bV=VwwA?TIPPD6?p)oS-M==!)+{@cCwI* z`e2-lXm@Scph3%k9Swj^rV8BXdDNO~p?mU+>FLik#-r1pwM#B?JG!M~UTjV&QEXtP zq?XG4!+XN24uB7+j4AEwZmKh>MSdg8rn3II5s?ET+%f;2O&u4mRUY6eo{V>^Ux}DF z9w{v!;e4QnLiLt=4`T%fn6!mCdE9SIh*`5tW*<0vnf|u3y#MorUn0Hm%c64mhTa?7 zhSMc?y+1zCXMd_^=R8{cO;IQJU&lsxyn~;QI9}ELDDcsgzTPNI`?ZuZ4T)mQFh078!i-?2u zv08sUax~2A2la0ArRQ`BZyEiO=g9hzS5M$G)i8ODW@ncPd9FxvmPi2xfSg~s2iLWN z{fyWTmf}w{omJ=p@8?}>2sPA-=sL6%4}y6X8z=jnTf`|tLcvkoi`8xMqe|sLk&i^IXFlJW_RGw_z zeu<+Sp1=iN^A`M zU#b`ymxqESlBMK!_PTBM07*-*2}8WHMyejV1Rf+!jy$+6nv%t!nt_(+2DTWvWZYC^ z0I_E$H*Oi~2mJTi7oDMoJ>M&U5G&@d%drXhDhT6bppvT!4s#VBLW_peQ@u+-+jH*PyMBPYcf z=oDVui63j5{VoQC)Zp36}Z>_iwQiceJk!yS2`j&0^J zH+Z1&;L&2{#qhkGy9Gc^YVWkeZR&fn^RArE31M5T)F!qEJSbnsek?u6-aAn(C^@xd zj-@V{9dARs-7k!)FGV;HeN(Q}6{PhYhX4zGl?zSXcAA2c1i2IgDFQUEK2FuhxoUk_ z&lR>HMe+-IFx-oS#WC0=8gD$pCS_+?1JwMWJDnM-B-RfK~WS7in(Ec%7E)dXazL;6_egECq zv6M@-H4qcX15JB>R(EC8abh<^3b?98#t;CV-_^Gjb7@rv?K_5f9Yd;b4P=875u)40 z6aktN&A>2x*-TWeH_0HoJt~^tF&|xJDdY0NWU_Nkg5-Znd+5+q(P65<2`c3VNDNQ{ zRC<806nFVxnEk&BJ#Be|fZ^y?nZFU9u#J)@Jz&b!^miTTLJ#fx63@L#wYTiq4UZtz zd;{5n!)a`y=+zRu9i)&+${v!U4a_Vei*9Mhlx68gllSOJxEm+R8^3Y-a z?Sk;La>KbW^xJQD#r1l_GqXR5nx-93?kCyLB~4Ov3f$?*Ee)!>#}PH%5HNhX$LMlJ z+$qj$XLVO@1U(`AJ0eRIY&~b`>{k1PDGQ)k6*auu_`^GDjTI8fV@OsS8+>L~17TDY z02sxy#w93|Zi=4{8gUl5ZS3&47MLFheQ9XqfVY8H(hIvb z-ae2NWh$c4chCaGg_{oNf9VRjm452vGqI`?!6PG9Gvdyf3m)%^9Q=+Gd^l0qqhl5r$wilFXOTuxG0v2+N{^*#p8JJ+%5&jBGa#q$e;YG&w8 z1u^rA1#+86#{Camf_Nj)n*7YK@ zI72(b;%25~UXd5t9}3p4Sm+y~PxJQEn0_E>RRg}&evU)Qgs;%b#xN@Uq={{X6Cwg= zOnB51M(^#aQJsJs(&dD=2T+z2iKT-!uvK9p=O~qGL+?uFHS+S-!)g(A#N+R8|{)&14oG)A!bdQ-0z89W~ycos(PVdu&pw z|4w?ZrIF~(tIa}4vwop5;X)nSwC3t?s0Aa>WN67$0ybSX53aHstzQW4!k{e;rSse^Cb%h))zb9TgPfzFn47sKgG=deee2~EG6gC_1?J^ z|E3dacSxl)l+?%scM$hC3WS;N27gCxEzvUK!C0Q@57+-V88eM>nE zqbj7hz07z&0v&Si`tF&{3ZE%)tW4TMD-7O;2q|a_Nwq9Rn(*&2YvFkmF1_%r-S=i6 zI24A3%5O_I(8{ui3Sn68e%B6;7cAWn8D80rE%avYms|k7KQy2`&tmSPE=1{Z{LWY| zL><7?J9eH`{=?C<1%>YW`#rq-Q_Alk{Dw}Fwv&#obWh><;8w8{?mo~lBN|y4+>f!g zSb|ed3z@@WvT=Wm^`yVO|BRe^5(qLJ*6u?N=C-o)z7--Cf{-dulKMI! zocC{B8#lpDc=xkCkJmnrtJ^)UU>1N3EoM%rRr2jcANais)J(%Nh(5hJ!C$Rh6AgRg>>$mONz)I?^zH%`q_S z&jJ_d>N_)Ag!!(m10ctZ*~MX(1B%5rmBL(qXb7&Yu#%AW@`JO<8$wmWL?&{bOKMia64MFRUVFm zuvKuD$QajH2gyM-?Dip&JScSF^zRZ2Wl(b!i*R}wOVIDNj zKpta^)>RFoS{Pc7uj1^613@V+N5dbU2tjXe>ddH6wb`Qth|4#D|Kp49lw3;n)Z3&X zI0?CXdiCE5?fJ$S>4SGHP3X;?N&7UyUDQ8;2E<^W4>uMfAkOo+n!)0ua32-u&*mcs zU?C5?d=r%`Mo2${L1Z+W8wZmO!T4|q?0#8xozZx#En{UFg z!hsCtysUklwW>Pd8Q;_+s93h~hTb19L;}%nzP*gT-YdV2)4<&}={kIPLh@Z~x}>3? z5hLDbd$K9$aS|z^%H$by+yF8XP8y2N?)(M*yyC(cH@^mvHd5(6iGr10T)04>c4bOV zDO34Rcn6HVrD9Fqn(Fo!sDCaG6j=+d(sGclk{LGc6F@wl`0dYpyYJ;B-AgM3Byl;G zEwNOL+9o)qUBvPXcp`5QAlG%T=kK)&ExTepLB~(L z!DH&IW*gEa@}y5qDYRy~l2x17tToA8f72Yl99VusG|gN-^3ObDp-%GbfZK?`USnoR z{MG126RW?YW#Zhmp`zUXzHvqAW5Z#nzw_Nq3_^5iqu3HlTy55}OtQ>d#iV4jVCAjZ z6WTNsD{ku&?VO%lXcMkes0UXjbE=mZgz=H8n=>i-`u)ct|B)#43c~Y(2NThI`G$~& zC*I!Kd}*e<+}qZvV9={gvD!ATb z=S=rE(fO(Y#y-Qn3AZF#`E>=wnRh!v#YZU*7ToGX!XJGh)5cD#Fq{|DX|^chEk#H+ zhIjQX3`U9$13Q}zckF_mmj$k01eQKEZMdMOO13=4JL%O&pWVI9*hziIBK~;$Fl7o{ zZ_^1H1_%7xd>9$&mA(?mj9KLA*Z(9f zbo?Xx3OhZSKKXf|7`fIr?f0z^y3rqz7Z+vG{c-0kiP6l~OgKIRGJw7mqeuSAD~6BOi*P!YO4a(={GZ?Y1Mi?Ux;**%h!~-c^>>2J;bVuJ?UHAcq48ga zn5}MDBuqqy$7^SU6X~AuOlna4fsI;M$ENxc zI&|u9mLATj&xFG&)915VM>>F@QX#MQjA<3eu55OY-i*d91AIILQ*(Jcf2&kRmyk-= zGy`e9?$CF7M-z~K?Lm5lfDYQlub%)xD3V$7><2K1bpyPJs_Hjnr8?iCR6vr#ucl!~@TF)(E7Gn|Ai(;Q&8I zR}bwi7W1Yli44KFUZy!bGT?gqE|`_Qe~uWyuh$tF`$S?E(y|^PHR>MFbk|lxXB^>mbhcS_t)lf-4A|0ZuQ5kLN=`tPx$gKWA1(;il@X)lC zmi|`0+I$X)sfQNuLe%Pj9R?qB=3{e(OvZ;u zQEWa%xTB1eIv`2XdWVfi9WS;+zy3HI7zG7!_+DU?)T@T!CKK2R$7IWe|D3a85_M{o zIcO32%=MJZRbY^&{Su)xcpn8t^=W4)bR^OsqPYafR}US zY7(B0h2Hl{@i#2K>Hm?O82SZ3C4{*TVFHG(J^ z+F$bpyoHZjPB#4`to%IeD53}KQdT7&>A~7(doNh}x_;!zy|I(7U(+@vhrnu`H6O@J zb28Ur_--cX>$kbQfqQm)?zMv+}b9E#SxxeI9C;e~lwfkBx|=tHG9o_^z6 z)9Ew~n-~75J&Z5=xmaEFbA~^Z2lyL^FYkzs_D#y9@VFuE#_L^PN&;KPs0=sgB4hmK z$1BZ-busOta^npVNovQ@I_tm7X6{rVmk$G}CIuEJx%9dYp5jxVh7v#&SqKjU%G#SC zQCr|9u*!^uacBy%p);O3stP5C#PB8A6y&hGP!}AG_kghq{SPt}QCmx{Snc==J4h{_ y9eiuIed_|3o7^%~&6kuv#O(P0I_|?AGRtyfwITc>$D{*FGDBTcow^54;r|CJDPjHq diff --git a/samples/apps/copilot-chat-app/webapp/src/components/open-api-plugins/PluginCard.tsx b/samples/apps/copilot-chat-app/webapp/src/components/open-api-plugins/PluginCard.tsx deleted file mode 100644 index b53b7a8d8ca1..000000000000 --- a/samples/apps/copilot-chat-app/webapp/src/components/open-api-plugins/PluginCard.tsx +++ /dev/null @@ -1,79 +0,0 @@ -import { Button, Caption1, Card, CardHeader, Text, makeStyles, shorthands, tokens } from '@fluentui/react-components'; -import { FormEvent } from 'react'; -import { useAppDispatch } from '../../redux/app/hooks'; -import { Plugin } from '../../redux/features/plugins/PluginsState'; -import { disconnectPlugin } from '../../redux/features/plugins/pluginsSlice'; -import { PluginConnector } from './PluginConnector'; - -const useStyles = makeStyles({ - main: { - ...shorthands.gap('36px'), - display: 'flex', - flexDirection: 'column', - flexWrap: 'wrap', - }, - title: { - ...shorthands.margin(0, 0, '12px'), - }, - description: { - ...shorthands.margin(0, 0, '12px'), - }, - card: { - width: '480px', - maxWidth: '100%', - height: '124px', - }, - caption: { - color: tokens.colorNeutralForeground3, - }, - logo: { - ...shorthands.borderRadius('4px'), - width: '48px', - height: '48px', - }, - text: { - ...shorthands.margin(0), - }, -}); - -interface PluginCardProps { - plugin: Plugin; -} - -export const PluginCard: React.FC = ({ plugin }) => { - const { name, publisher, enabled, authRequirements, apiProperties, icon, description } = plugin; - - const styles = useStyles(); - const dispatch = useAppDispatch(); - - const onDisconnectClick = (event: FormEvent) => { - event.preventDefault(); - dispatch(disconnectPlugin(name)); - }; - - return ( - - } - header={{name}} - description={{publisher}} - action={ - enabled ? ( - - ) : ( - - ) - } - /> -

{description}

-
- ); -}; diff --git a/samples/apps/copilot-chat-app/webapp/src/components/open-api-plugins/PluginConnector.tsx b/samples/apps/copilot-chat-app/webapp/src/components/open-api-plugins/PluginConnector.tsx deleted file mode 100644 index 696e7d2a1405..000000000000 --- a/samples/apps/copilot-chat-app/webapp/src/components/open-api-plugins/PluginConnector.tsx +++ /dev/null @@ -1,257 +0,0 @@ -import { - Body1, - Body1Strong, - Button, - Dialog, - DialogActions, - DialogBody, - DialogContent, - DialogSurface, - DialogTitle, - DialogTrigger, - Input, - Persona, - Text, - makeStyles, -} from '@fluentui/react-components'; -import { Dismiss20Regular } from '@fluentui/react-icons'; -import { FormEvent, useState } from 'react'; -import { useAppDispatch } from '../../redux/app/hooks'; -import { AdditionalApiProperties, PluginAuthRequirements, Plugins } from '../../redux/features/plugins/PluginsState'; -import { connectPlugin } from '../../redux/features/plugins/pluginsSlice'; - -const useClasses = makeStyles({ - root: { - height: '515px', - }, - content: { - display: 'flex', - flexDirection: 'column', - rowGap: '10px', - }, - scopes: { - display: 'flex', - flexDirection: 'column', - rowGap: '5px', - paddingLeft: '20px', - }, - error: { - color: '#d13438', - }, - section: { - display: 'flex', - flexDirection: 'column', - width: '100%', - rowGap: '10px', - }, -}); - -interface PluginConnectorProps { - name: Plugins; - icon: string; - publisher: string; - authRequirements: PluginAuthRequirements; - apiProperties?: AdditionalApiProperties; -} - -export const PluginConnector: React.FC = ({ - name, - icon, - publisher, - authRequirements, - apiProperties, -}) => { - const classes = useClasses(); - - const usernameRequired = authRequirements.username; - const passwordRequired = authRequirements.password; - const accessTokenRequired = authRequirements.personalAccessToken; - - const [username, setUsername] = useState(''); - const [password, setPassword] = useState(''); - const [accessToken, setAccessToken] = useState(''); - const [apiPropertiesInput, setApiRequirmentsInput] = useState(apiProperties); - - const [open, setOpen] = useState(false); - const [errorMessage, setErrorMessage] = useState(); - - const dispatch = useAppDispatch(); - - const handleSubmit = async (event: FormEvent) => { - event.preventDefault(); - try { - // Basic Auth or PAT - dispatch( - connectPlugin({ - plugin: name, - username: username, - password: password, - accessToken: accessToken, - apiProperties: apiPropertiesInput, - }), - ); - - setOpen(false); - } catch (_e) { - setErrorMessage(`Could not authenticate to ${name}. Check your permissions and try again.`); - } - }; - - return ( - { - setErrorMessage(undefined); - setOpen(data.open); - }} - modalType="alert" - > - - - - -
- - - - - - - -
-
-
- ); -}; diff --git a/samples/apps/copilot-chat-app/webapp/src/components/open-api-plugins/PluginGallery.tsx b/samples/apps/copilot-chat-app/webapp/src/components/open-api-plugins/PluginGallery.tsx deleted file mode 100644 index ba3f947e29bf..000000000000 --- a/samples/apps/copilot-chat-app/webapp/src/components/open-api-plugins/PluginGallery.tsx +++ /dev/null @@ -1,85 +0,0 @@ -import { - Body1, - Button, - Dialog, - DialogBody, - DialogContent, - DialogSurface, - DialogTitle, - DialogTrigger, - Subtitle1, - Subtitle2, - makeStyles, - shorthands, -} from '@fluentui/react-components'; -import { AppsAddIn24Regular, Dismiss24Regular } from '@fluentui/react-icons'; -import { useState } from 'react'; -import { useAppSelector } from '../../redux/app/hooks'; -import { RootState } from '../../redux/app/store'; -import { PluginCard } from './PluginCard'; - -const useClasses = makeStyles({ - root: { - maxWidth: '1052px', - height: '632px', - width: 'fit-content', - }, - title: { - ...shorthands.margin(0, 0, '12px'), - }, - description: { - ...shorthands.margin(0, 0, '12px'), - }, - content: { - display: 'flex', - flexDirection: 'row', - flexWrap: 'wrap', - rowGap: '24px', - columnGap: '24px', - ...shorthands.margin(0, '2px', '12px'), - }, -}); - -export const PluginGallery: React.FC = () => { - const classes = useClasses(); - - const plugins = useAppSelector((state: RootState) => state.plugins); - const [open, setOpen] = useState(false); - - return ( - setOpen(data.open)}> - - - ); -}; diff --git a/samples/apps/copilot-chat-app/webapp/src/libs/connectors/useConnectors.ts b/samples/apps/copilot-chat-app/webapp/src/libs/connectors/useConnectors.ts deleted file mode 100644 index 6d9b21bdbde7..000000000000 --- a/samples/apps/copilot-chat-app/webapp/src/libs/connectors/useConnectors.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { useAppSelector } from '../../redux/app/hooks'; -import { RootState } from '../../redux/app/store'; -import { AuthHeaderTags } from '../../redux/features/plugins/PluginsState'; - -export const useConnectors = () => { - const plugins = useAppSelector((state: RootState) => state.plugins); - /* - * Once enabled, each plugin will have a custom dedicated header in every SK request - * containing respective auth information (i.e., token, encoded client info, etc.) - * that the server can use to authenticate to the downstream APIs - */ - const getEnabledPlugins = () => { - const enabledPlugins: { headerTag: AuthHeaderTags; authData: string; apiProperties?: any }[] = []; - - Object.entries(plugins).map((entry) => { - const plugin = entry[1]; - - if (plugin.enabled) { - enabledPlugins.push({ - headerTag: plugin.headerTag, - authData: plugin.authData!, - apiProperties: plugin.apiProperties, - }); - } - - return entry; - }); - - return enabledPlugins; - }; - - return { - getEnabledPlugins, - }; -}; diff --git a/samples/apps/copilot-chat-app/webapp/src/libs/semantic-kernel/SemanticKernel.ts b/samples/apps/copilot-chat-app/webapp/src/libs/semantic-kernel/SemanticKernel.ts index c7862def7008..415504dda4b1 100644 --- a/samples/apps/copilot-chat-app/webapp/src/libs/semantic-kernel/SemanticKernel.ts +++ b/samples/apps/copilot-chat-app/webapp/src/libs/semantic-kernel/SemanticKernel.ts @@ -1,8 +1,7 @@ // Copyright (c) Microsoft. All rights reserved. -import { AdditionalApiProperties, AuthHeaderTags } from '../../redux/features/plugins/PluginsState'; import { BaseService } from '../services/BaseService'; -import { IAsk, IAskVariables } from './model/Ask'; +import { IAsk } from './model/Ask'; import { IAskResult } from './model/AskResult'; export class SemanticKernel extends BaseService { @@ -10,41 +9,8 @@ export class SemanticKernel extends BaseService { ask: IAsk, skillName: string, functionName: string, - enabledPlugins?: { - headerTag: AuthHeaderTags; - authData: string; - apiProperties?: AdditionalApiProperties; - }[], ): Promise => { // If skill requires any additional api properties, append to context - if (enabledPlugins && enabledPlugins.length > 0) { - const openApiSkillVariables: IAskVariables[] = []; - - for (var idx in enabledPlugins) { - var plugin = enabledPlugins[idx]; - - if (plugin.apiProperties) { - const apiProperties = plugin.apiProperties; - - for (var property in apiProperties) { - const propertyDetails = apiProperties[property]; - - if (propertyDetails.required && !propertyDetails.value) { - throw new Error(`Missing required property ${property} for ${plugin} skill.`); - } - - if (propertyDetails.value) { - openApiSkillVariables.push({ - key: `${property}`, - value: apiProperties[property].value!, - }); - } - } - } - } - - ask.variables = ask.variables ? ask.variables.concat(openApiSkillVariables) : openApiSkillVariables; - } const result = await this.getResponseAsync( { @@ -52,7 +18,6 @@ export class SemanticKernel extends BaseService { method: 'POST', body: ask, }, - enabledPlugins, ); return result; diff --git a/samples/apps/copilot-chat-app/webapp/src/libs/services/BaseService.ts b/samples/apps/copilot-chat-app/webapp/src/libs/services/BaseService.ts index b92276d1a46a..89d9b94f19c6 100644 --- a/samples/apps/copilot-chat-app/webapp/src/libs/services/BaseService.ts +++ b/samples/apps/copilot-chat-app/webapp/src/libs/services/BaseService.ts @@ -1,5 +1,3 @@ -import { AdditionalApiProperties, AuthHeaderTags } from '../../redux/features/plugins/PluginsState'; - interface ServiceRequest { commandPath: string; method?: string; @@ -13,26 +11,12 @@ export class BaseService { protected readonly getResponseAsync = async ( request: ServiceRequest, - enabledPlugins?: { - headerTag: AuthHeaderTags; - authData: string; - apiProperties?: AdditionalApiProperties; - }[], ): Promise => { const { commandPath, method, body } = request; const headers = new Headers({ 'Content-Type': 'application/json', }); - // For each enabled plugin, pass its auth information as a customer header - // to the backend so the server can authenticate to the plugin - if (enabledPlugins && enabledPlugins.length > 0) { - for (var idx in enabledPlugins) { - var plugin = enabledPlugins[idx]; - headers.append(`x-sk-copilot-${plugin.headerTag}-auth`, plugin.authData); - } - } - try { const requestUrl = new URL(commandPath, this.serviceUrl); const response = await fetch(requestUrl, { diff --git a/samples/apps/copilot-chat-app/webapp/src/libs/useChat.ts b/samples/apps/copilot-chat-app/webapp/src/libs/useChat.ts index 89f21b4697ef..77a761cb6fb8 100644 --- a/samples/apps/copilot-chat-app/webapp/src/libs/useChat.ts +++ b/samples/apps/copilot-chat-app/webapp/src/libs/useChat.ts @@ -9,7 +9,6 @@ import { setSelectedConversation, updateConversation, } from '../redux/features/conversations/conversationsSlice'; -import { useConnectors } from './connectors/useConnectors'; import { AlertType } from './models/AlertType'; import { Bot } from './models/Bot'; import { AuthorRoles } from './models/ChatMessage'; @@ -24,7 +23,6 @@ export const useChat = () => { const sk = useSemanticKernel(process.env.REACT_APP_BACKEND_URI as string); const { botProfilePictureIndex } = useAppSelector((state: RootState) => state.conversations); - const connectors = useConnectors(); const botService = new BotService(process.env.REACT_APP_BACKEND_URI as string); const chatService = new ChatService(process.env.REACT_APP_BACKEND_URI as string); @@ -99,7 +97,7 @@ export const useChat = () => { }; try { - var result = await sk.invokeAsync(ask, 'ChatSkill', 'Chat', connectors.getEnabledPlugins()); + var result = await sk.invokeAsync(ask, 'ChatSkill', 'Chat'); const messageResult = { timestamp: new Date().getTime(), diff --git a/samples/apps/copilot-chat-app/webapp/src/redux/app/store.ts b/samples/apps/copilot-chat-app/webapp/src/redux/app/store.ts index 93137c959351..e6c657905180 100644 --- a/samples/apps/copilot-chat-app/webapp/src/redux/app/store.ts +++ b/samples/apps/copilot-chat-app/webapp/src/redux/app/store.ts @@ -3,13 +3,11 @@ import { configureStore } from '@reduxjs/toolkit'; import appReducer from '../features/app/appSlice'; import conversationsReducer from '../features/conversations/conversationsSlice'; -import pluginsReducer from '../features/plugins/pluginsSlice'; export const store = configureStore({ reducer: { app: appReducer, conversations: conversationsReducer, - plugins: pluginsReducer, }, }); diff --git a/samples/apps/copilot-chat-app/webapp/src/redux/features/plugins/PluginsState.ts b/samples/apps/copilot-chat-app/webapp/src/redux/features/plugins/PluginsState.ts deleted file mode 100644 index 67ca314686ae..000000000000 --- a/samples/apps/copilot-chat-app/webapp/src/redux/features/plugins/PluginsState.ts +++ /dev/null @@ -1,110 +0,0 @@ -import GithubIcon from '../../../assets/plugin-icons/github.png'; -import JiraIcon from '../../../assets/plugin-icons/jira.png'; - -/* - * For each OpenAPI Spec you're supporting in the Kernel, - * add all the relevant information here. - */ -export const enum Plugins { - Jira = 'Jira', - GitHub = 'GitHub', -} - -export const enum AuthHeaderTags { - Jira = 'jira', - GitHub = 'github', -} - -export type PluginAuthRequirements = { - username?: boolean; - password?: boolean; - personalAccessToken?: boolean; - scopes?: string[]; - helpLink?: string; -}; - -// Additional information required to enable OpenAPI skills, i.e., server-url -export type AdditionalApiProperties = { - // Key should be the property name and in kebab case (valid format for request header), - // make sure it matches exactly with the property name the API requires - [key: string]: { - required: boolean; - helpLink?: string; - value?: string; - description?: string; - }; -}; - -export type Plugin = { - name: Plugins; - publisher: string; - description: string; - enabled: boolean; - authRequirements: PluginAuthRequirements; - headerTag: AuthHeaderTags; - icon: string; // Can be imported as shown above or direct URL - authData?: string; // token or encoded auth header value - apiProperties?: AdditionalApiProperties; -}; - -export interface PluginsState { - Jira: Plugin; - GitHub: Plugin; -} - -export const initialState: PluginsState = { - Jira: { - name: Plugins.Jira, - publisher: 'Atlassian', - description: 'Authorize Copilot Chat to post and link with Jira when there are issues.', - enabled: false, - authRequirements: { - username: true, - personalAccessToken: true, - helpLink: 'https://developer.atlassian.com/cloud/confluence/basic-auth-for-rest-apis/', - }, - icon: JiraIcon, - headerTag: AuthHeaderTags.Jira, - apiProperties: { - 'jira-server-url': { - description: 'base server url', - required: true, - helpLink: 'https://confluence.atlassian.com/adminjiraserver/configuring-the-base-url-938847830.html', - }, - }, - }, - GitHub: { - name: Plugins.GitHub, - publisher: 'Microsoft', - description: - 'Integrate Github with Copilot Chat, i.e., allow Copilot ChatBot to list active Pull Requests for you.', - enabled: false, - authRequirements: { - personalAccessToken: true, - scopes: ['Read and Write access to pull requests'], - helpLink: - 'https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token', - }, - icon: GithubIcon, - headerTag: AuthHeaderTags.GitHub, - apiProperties: { - owner: { - required: false, - description: 'account owner of repository. i.e., "microsoft"', - }, - repo: { - required: false, - description: 'name of repository. i.e., "semantic-kernel"', - helpLink: 'https://docs.github.com/en/rest/pulls/pulls?apiVersion=2022-11-28#list-pull-requests', - }, - }, - }, -}; - -export type EnablePluginPayload = { - plugin: Plugins; - username?: string; - password?: string; - accessToken?: string; - apiProperties?: AdditionalApiProperties; -}; diff --git a/samples/apps/copilot-chat-app/webapp/src/redux/features/plugins/pluginsSlice.ts b/samples/apps/copilot-chat-app/webapp/src/redux/features/plugins/pluginsSlice.ts deleted file mode 100644 index 3eaf076e0f22..000000000000 --- a/samples/apps/copilot-chat-app/webapp/src/redux/features/plugins/pluginsSlice.ts +++ /dev/null @@ -1,55 +0,0 @@ -// Copyright (c) Microsoft. All rights reserved. - -import { createSlice, PayloadAction } from '@reduxjs/toolkit'; -import { Buffer } from 'buffer'; -import { EnablePluginPayload, initialState, Plugin, Plugins, PluginsState } from './PluginsState'; - -export const pluginsState = createSlice({ - name: 'plugins', - initialState, - reducers: { - connectPlugin: (state: PluginsState, action: PayloadAction) => { - var plugin: Plugin; - var authData = action.payload.accessToken; - - switch (action.payload.plugin) { - case Plugins.Jira: - plugin = state.Jira; - - // TODO: Aman to change with Jira integration - const encodedData = Buffer.from( - `${action.payload.username}:${action.payload.accessToken}`, - ).toString('base64'); - authData = encodedData; - - break; - case Plugins.GitHub: - plugin = state.GitHub; - break; - } - - plugin.enabled = true; - plugin.authData = authData; - plugin.apiProperties = action.payload.apiProperties; - }, - disconnectPlugin: (state: PluginsState, action: PayloadAction) => { - var plugin: Plugin; - - switch (action.payload) { - case Plugins.Jira: - plugin = state.Jira; - break; - case Plugins.GitHub: - plugin = state.GitHub; - break; - } - - plugin.enabled = false; - plugin.authData = undefined; - }, - }, -}); - -export const { connectPlugin, disconnectPlugin } = pluginsState.actions; - -export default pluginsState.reducer; From 23c5889a483ddf4001bacb05a5134ab8f80ecbf8 Mon Sep 17 00:00:00 2001 From: hathind Date: Mon, 8 May 2023 15:52:01 -0700 Subject: [PATCH 03/33] Remove bot sharing --- .../webapp/src/components/chat/ChatWindow.tsx | 4 - .../src/components/chat/ShareBotMenu.tsx | 45 ------------ .../components/chat/chat-list/ChatList.tsx | 5 +- .../components/chat/chat-list/NewBotMenu.tsx | 73 ------------------- .../webapp/src/libs/services/BotService.ts | 26 ------- .../webapp/src/libs/useChat.ts | 24 ------ 6 files changed, 1 insertion(+), 176 deletions(-) delete mode 100644 samples/apps/copilot-chat-app/webapp/src/components/chat/ShareBotMenu.tsx delete mode 100644 samples/apps/copilot-chat-app/webapp/src/components/chat/chat-list/NewBotMenu.tsx delete mode 100644 samples/apps/copilot-chat-app/webapp/src/libs/services/BotService.ts diff --git a/samples/apps/copilot-chat-app/webapp/src/components/chat/ChatWindow.tsx b/samples/apps/copilot-chat-app/webapp/src/components/chat/ChatWindow.tsx index 2f59f3dd2ab0..0e5add489af4 100644 --- a/samples/apps/copilot-chat-app/webapp/src/components/chat/ChatWindow.tsx +++ b/samples/apps/copilot-chat-app/webapp/src/components/chat/ChatWindow.tsx @@ -20,7 +20,6 @@ import { RootState } from '../../redux/app/store'; import { addAlert } from '../../redux/features/app/appSlice'; import { editConversationTitle } from '../../redux/features/conversations/conversationsSlice'; import { ChatRoom } from './ChatRoom'; -import { ShareBotMenu } from './ShareBotMenu'; const useClasses = makeStyles({ root: { @@ -140,9 +139,6 @@ export const ChatWindow: React.FC = () => { />
-
- -
diff --git a/samples/apps/copilot-chat-app/webapp/src/components/chat/ShareBotMenu.tsx b/samples/apps/copilot-chat-app/webapp/src/components/chat/ShareBotMenu.tsx deleted file mode 100644 index ee4a40b01b18..000000000000 --- a/samples/apps/copilot-chat-app/webapp/src/components/chat/ShareBotMenu.tsx +++ /dev/null @@ -1,45 +0,0 @@ -// Copyright (c) Microsoft. All rights reserved. - -import { FC, useCallback } from 'react'; - -import { Button, Menu, MenuItem, MenuList, MenuPopover, MenuTrigger, Tooltip } from '@fluentui/react-components'; -import { ArrowDownloadRegular, ShareRegular } from '@fluentui/react-icons'; -import { useChat } from '../../libs/useChat'; -import { useFile } from '../../libs/useFile'; - -interface ShareBotMenuProps { - chatId: string; - chatTitle: string; -} - -export const ShareBotMenu: FC = ({ chatId, chatTitle }) => { - const chat = useChat(); - const { downloadFile } = useFile(); - - const onDownloadBotClick = useCallback(async () => { - // TODO: Add a loading indicator - const content = await chat.downloadBot(chatId); - downloadFile( - `chat-history-${chatTitle}-${new Date().toISOString()}.json`, - JSON.stringify(content), - 'text/json', - ); - }, [chat, chatId, chatTitle, downloadFile]); - - return ( - - - - - ); -}; diff --git a/samples/apps/copilot-chat-app/webapp/src/components/chat/chat-list/ChatList.tsx b/samples/apps/copilot-chat-app/webapp/src/components/chat/chat-list/ChatList.tsx index 1d58d18b0385..95ec6f617447 100644 --- a/samples/apps/copilot-chat-app/webapp/src/components/chat/chat-list/ChatList.tsx +++ b/samples/apps/copilot-chat-app/webapp/src/components/chat/chat-list/ChatList.tsx @@ -1,12 +1,11 @@ // Copyright (c) Microsoft. All rights reserved. -import { Label, makeStyles, shorthands, Text } from '@fluentui/react-components'; +import { makeStyles, shorthands, Text } from '@fluentui/react-components'; import { Tree, TreeItem } from '@fluentui/react-components/unstable'; import { FC } from 'react'; import { useAppSelector } from '../../../redux/app/hooks'; import { RootState } from '../../../redux/app/store'; import { ChatListItem } from './ChatListItem'; -import { NewBotMenu } from './NewBotMenu'; const useClasses = makeStyles({ root: { @@ -46,9 +45,7 @@ export const ChatList: FC = () => { Conversations -
- {Object.keys(conversations).map((id) => { const convo = conversations[id]; diff --git a/samples/apps/copilot-chat-app/webapp/src/components/chat/chat-list/NewBotMenu.tsx b/samples/apps/copilot-chat-app/webapp/src/components/chat/chat-list/NewBotMenu.tsx deleted file mode 100644 index bda4f77d220d..000000000000 --- a/samples/apps/copilot-chat-app/webapp/src/components/chat/chat-list/NewBotMenu.tsx +++ /dev/null @@ -1,73 +0,0 @@ -// Copyright (c) Microsoft. All rights reserved. - -import { FC, useCallback, useRef, useState } from 'react'; - -import { Button, Menu, MenuItem, MenuList, MenuPopover, MenuTrigger, Tooltip } from '@fluentui/react-components'; -import { ArrowUploadRegular, BotAdd20Regular } from '@fluentui/react-icons'; -import { useChat } from '../../../libs/useChat'; -import { FileUploader } from '../../FileUploader'; -import { useFile } from '../../../libs/useFile'; -import { Bot } from '../../../libs/models/Bot'; -import { useAppDispatch } from '../../../redux/app/hooks'; -import { addAlert } from '../../../redux/features/app/appSlice'; -import { AlertType } from '../../../libs/models/AlertType'; - -export const NewBotMenu: FC = () => { - const dispatch = useAppDispatch(); - const chat = useChat(); - const fileHandler = useFile(); - const [isNewBotMenuOpen, setIsNewBotMenuOpen] = useState(false); - - const fileUploaderRef = useRef(null); - - const onAddChat = () => { - chat.createChat(); - setIsNewBotMenuOpen(false); - }; - - const onUpload = useCallback( - (file: File) => { - fileHandler - .loadFile(file, chat.uploadBot) - .catch((error) => - dispatch( - addAlert({ message: `Failed to parse uploaded file. ${error.message}`, type: AlertType.Error }), - ), - ); - setIsNewBotMenuOpen(false); - }, - [fileHandler, chat, dispatch], - ); - - return ( - - - - - ); -}; diff --git a/samples/apps/copilot-chat-app/webapp/src/libs/services/BotService.ts b/samples/apps/copilot-chat-app/webapp/src/libs/services/BotService.ts deleted file mode 100644 index 04efde0e9a94..000000000000 --- a/samples/apps/copilot-chat-app/webapp/src/libs/services/BotService.ts +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright (c) Microsoft. All rights reserved. - -import { Bot } from '../models/Bot'; -import { BaseService } from './BaseService'; - -export class BotService extends BaseService { - public downloadAsync = async (chatId: string, userId: string): Promise => { - const result = await this.getResponseAsync({ - commandPath: `bot/download/${chatId}/${userId}`, - method: 'GET', - }); - - return result; - }; - - public uploadAsync = async (bot: Bot, userId: string): Promise => { - // TODO: return type - const result = await this.getResponseAsync({ - commandPath: `bot/upload?userId=${userId}`, - method: 'Post', - body: bot, - }); - - return result; - }; -} diff --git a/samples/apps/copilot-chat-app/webapp/src/libs/useChat.ts b/samples/apps/copilot-chat-app/webapp/src/libs/useChat.ts index 77a761cb6fb8..c8b55e388d98 100644 --- a/samples/apps/copilot-chat-app/webapp/src/libs/useChat.ts +++ b/samples/apps/copilot-chat-app/webapp/src/libs/useChat.ts @@ -10,12 +10,10 @@ import { updateConversation, } from '../redux/features/conversations/conversationsSlice'; import { AlertType } from './models/AlertType'; -import { Bot } from './models/Bot'; import { AuthorRoles } from './models/ChatMessage'; import { IChatSession } from './models/ChatSession'; import { ChatUser } from './models/ChatUser'; import { useSemanticKernel } from './semantic-kernel/useSemanticKernel'; -import { BotService } from './services/BotService'; import { ChatService } from './services/ChatService'; export const useChat = () => { @@ -23,7 +21,6 @@ export const useChat = () => { const sk = useSemanticKernel(process.env.REACT_APP_BACKEND_URI as string); const { botProfilePictureIndex } = useAppSelector((state: RootState) => state.conversations); - const botService = new BotService(process.env.REACT_APP_BACKEND_URI as string); const chatService = new ChatService(process.env.REACT_APP_BACKEND_URI as string); const botProfilePictures: string[] = [ @@ -126,31 +123,10 @@ export const useChat = () => { } }; - const downloadBot = async (chatId: string) => { - try { - return botService.downloadAsync(chatId, Constants.GuestUser.id); - } catch (e: any) { - const errorMessage = `Unable to download the bot. Details: ${e.message ?? e}`; - dispatch(addAlert({ message: errorMessage, type: AlertType.Error })); - } - }; - - const uploadBot = async (bot: Bot) => { - botService - .uploadAsync(bot, Constants.GuestUser.id) - .then(() => loadChats()) - .catch((e: any) => { - const errorMessage = `Unable to upload the bot. Details: ${e.message ?? e}`; - dispatch(addAlert({ message: errorMessage, type: AlertType.Error })); - }); - }; - return { getAudienceMemberForId, createChat, loadChats, getResponse, - downloadBot, - uploadBot, }; }; From 3a21075dce18731ed5aa7dae30ba7cca79613181 Mon Sep 17 00:00:00 2001 From: hathind Date: Tue, 9 May 2023 11:45:03 -0700 Subject: [PATCH 04/33] Remove chat list --- .../components/chat/chat-list/ChatList.tsx | 83 -------------- .../chat/chat-list/ChatListItem.tsx | 102 ------------------ .../webapp/src/components/views/ChatView.tsx | 2 - .../webapp/src/libs/services/ChatService.ts | 8 -- .../webapp/src/libs/useFile.ts | 40 ------- 5 files changed, 235 deletions(-) delete mode 100644 samples/apps/copilot-chat-app/webapp/src/components/chat/chat-list/ChatList.tsx delete mode 100644 samples/apps/copilot-chat-app/webapp/src/components/chat/chat-list/ChatListItem.tsx delete mode 100644 samples/apps/copilot-chat-app/webapp/src/libs/useFile.ts diff --git a/samples/apps/copilot-chat-app/webapp/src/components/chat/chat-list/ChatList.tsx b/samples/apps/copilot-chat-app/webapp/src/components/chat/chat-list/ChatList.tsx deleted file mode 100644 index 95ec6f617447..000000000000 --- a/samples/apps/copilot-chat-app/webapp/src/components/chat/chat-list/ChatList.tsx +++ /dev/null @@ -1,83 +0,0 @@ -// Copyright (c) Microsoft. All rights reserved. - -import { makeStyles, shorthands, Text } from '@fluentui/react-components'; -import { Tree, TreeItem } from '@fluentui/react-components/unstable'; -import { FC } from 'react'; -import { useAppSelector } from '../../../redux/app/hooks'; -import { RootState } from '../../../redux/app/store'; -import { ChatListItem } from './ChatListItem'; - -const useClasses = makeStyles({ - root: { - width: '25%', - minHeight: '100%', - overflowX: 'hidden', - overflowY: 'auto', - scrollbarWidth: 'thin', - backgroundColor: '#F0F0F0', - }, - header: { - display: 'flex', - flexDirection: 'row', - justifyContent: 'space-between', - marginRight: '1em', - marginLeft: '1em', - alignItems: 'center', - height: '4.8em', - '& controls': { - ...shorthands.gap('10px'), - display: 'flex', - }, - }, - label: { - marginLeft: '1em', - }, -}); - -export const ChatList: FC = () => { - const classes = useClasses(); - const { conversations, selectedId } = useAppSelector((state: RootState) => state.conversations); - - return ( - <> -
-
- - Conversations - -
- - {Object.keys(conversations).map((id) => { - const convo = conversations[id]; - const messages = convo.messages; - const lastMessage = convo.messages.length - 1; - return ( - - 0 ? messages[lastMessage].content : 'Click to start the chat' - } - botProfilePicture={convo.botProfilePicture} - /> - - ); - })} - -
- - ); -}; diff --git a/samples/apps/copilot-chat-app/webapp/src/components/chat/chat-list/ChatListItem.tsx b/samples/apps/copilot-chat-app/webapp/src/components/chat/chat-list/ChatListItem.tsx deleted file mode 100644 index 6f1c43957ca6..000000000000 --- a/samples/apps/copilot-chat-app/webapp/src/components/chat/chat-list/ChatListItem.tsx +++ /dev/null @@ -1,102 +0,0 @@ -import { Avatar, makeStyles, shorthands, Text } from '@fluentui/react-components'; -import { FC } from 'react'; -import { useAppDispatch } from '../../../redux/app/hooks'; -import { setSelectedConversation } from '../../../redux/features/conversations/conversationsSlice'; - -const useClasses = makeStyles({ - root: { - display: 'flex', - flexDirection: 'row', - paddingTop: '0.8rem', - paddingBottom: '0.8rem', - paddingRight: '1rem', - minWidth: '90%', - }, - avatar: { - flexShrink: '0', - minWidth: '3.2rem' - }, - body: { - display: 'flex', - flexDirection: 'column', - minWidth: '0', - flexGrow: '1', - lineHeight: '1.6rem', - paddingLeft: '0.8rem', - }, - header: { - display: 'flex', - flexDirection: 'row', - maxHeight: '1.2rem', - lineHeight: '20px', - flexGrow: '1', - justifyContent: 'space-between', - }, - timestamp: { - flexShrink: 0, - fontSize: 'small', - maxWidth: '6rem', - marginTop: '0', - marginBottom: 'auto', - marginLeft: '0.8rem' - }, - title: { - ...shorthands.overflow('hidden'), - textOverflow: 'ellipsis', - whiteSpace: 'nowrap', - minWidth: '4rem' - }, - preview: { - ...shorthands.overflow('hidden'), - marginTop: '0.2rem', - lineHeight: '16px', - display: '-webkit-box', - WebkitLineClamp: 2, - WebkitBoxOrient: 'vertical' - } -}); - -interface IChatListItemProps { - id: string; - header: string; - timestamp: string; - preview: string; - botProfilePicture: string; -} - -// TODO: populate Avatar -export const ChatListItem: FC = ({ id, header, timestamp, preview, botProfilePicture }) => { - const classes = useClasses(); - const dispatch = useAppDispatch(); - - const onClick = (_ev: any) => { - dispatch(setSelectedConversation(id)); - }; - - return ( -
- -
-
- - {header} - - {timestamp && ( - - {timestamp} - - )} -
- {preview && ( -
- { - - {preview} - - } -
- )} -
-
- ); -}; \ No newline at end of file diff --git a/samples/apps/copilot-chat-app/webapp/src/components/views/ChatView.tsx b/samples/apps/copilot-chat-app/webapp/src/components/views/ChatView.tsx index dbca02777329..edab21abfabf 100644 --- a/samples/apps/copilot-chat-app/webapp/src/components/views/ChatView.tsx +++ b/samples/apps/copilot-chat-app/webapp/src/components/views/ChatView.tsx @@ -1,7 +1,6 @@ import { makeStyles } from '@fluentui/react-components'; import { FC } from 'react'; import { ChatWindow } from '../chat/ChatWindow'; -import { ChatList } from '../chat/chat-list/ChatList'; const useClasses = makeStyles({ container: { @@ -21,7 +20,6 @@ export const ChatView: FC = () => { return (
-
); diff --git a/samples/apps/copilot-chat-app/webapp/src/libs/services/ChatService.ts b/samples/apps/copilot-chat-app/webapp/src/libs/services/ChatService.ts index 1ba7c3113726..39240123dfe1 100644 --- a/samples/apps/copilot-chat-app/webapp/src/libs/services/ChatService.ts +++ b/samples/apps/copilot-chat-app/webapp/src/libs/services/ChatService.ts @@ -30,14 +30,6 @@ export class ChatService extends BaseService { return result; }; - public getAllChatsAsync = async (userId: string): Promise => { - const result = await this.getResponseAsync({ - commandPath: `chatSession/getAllChats/${userId}`, - method: 'GET', - }); - return result; - }; - public getChatMessagesAsync = async (chatId: string, startIdx: number, count: number): Promise => { const result = await this.getResponseAsync({ commandPath: `chatSession/getChatMessages/${chatId}?startIdx=${startIdx}&count=${count}`, diff --git a/samples/apps/copilot-chat-app/webapp/src/libs/useFile.ts b/samples/apps/copilot-chat-app/webapp/src/libs/useFile.ts deleted file mode 100644 index a700fab10a2a..000000000000 --- a/samples/apps/copilot-chat-app/webapp/src/libs/useFile.ts +++ /dev/null @@ -1,40 +0,0 @@ -// Copyright (c) Microsoft. All rights reserved. - -export const useFile = () => { - function loadFile(file: File, loadCallBack: (data: T) => Promise): Promise { - return new Promise((resolve, reject) => { - const fileReader = new FileReader(); - fileReader.onload = async (event: ProgressEvent) => { - const content = event?.target?.result as string; - try { - const parsedData = JSON.parse(content) as T; - await loadCallBack(parsedData); - resolve(parsedData); - } catch (e) { - reject(e); - } - }; - fileReader.onerror = reject; - fileReader.readAsText(file); - }); - } - - function downloadFile(filename: string, content: string, type: string) { - const data: BlobPart[] = [content]; - let file: File | null = new File(data, filename, { type }); - - const link = document.createElement('a'); - link.href = URL.createObjectURL(file); - link.download = filename; - - link.click(); - URL.revokeObjectURL(link.href); - link.remove(); - file = null; - } - - return { - loadFile, - downloadFile, - }; -}; From 816ec8b0ca6a1df29e4ec0e44b304cc8a9dedcb4 Mon Sep 17 00:00:00 2001 From: hathind Date: Tue, 9 May 2023 12:17:04 -0700 Subject: [PATCH 05/33] Remove planner --- .../webapi/Config/PlannerOptions.cs | 24 - .../Controllers/SemanticKernelController.cs | 83 - .../webapi/CopilotChatApi.csproj | 4 + .../webapi/FunctionLoadingExtensions.cs | 4 - .../webapi/SemanticKernelExtensions.cs | 16 - .../webapi/ServiceExtensions.cs | 6 - .../webapi/Skills/ChatSkill.cs | 145 - .../webapi/Skills/CopilotChatPlanner.cs | 42 - .../OpenApiSkills/GitHubSkill/Model/Label.cs | 42 - .../GitHubSkill/Model/PullRequest.cs | 118 - .../OpenApiSkills/GitHubSkill/Model/Repo.cs | 34 - .../OpenApiSkills/GitHubSkill/Model/User.cs | 56 - .../OpenApiSkills/GitHubSkill/openapi.json | 5935 ----------------- .../webapi/Skills/OpenApiSkills/README.md | 13 - .../webapi/Skills/PromptSettings.cs | 1 - .../copilot-chat-app/webapi/appsettings.json | 26 - 16 files changed, 4 insertions(+), 6545 deletions(-) delete mode 100644 samples/apps/copilot-chat-app/webapi/Config/PlannerOptions.cs delete mode 100644 samples/apps/copilot-chat-app/webapi/Skills/CopilotChatPlanner.cs delete mode 100644 samples/apps/copilot-chat-app/webapi/Skills/OpenApiSkills/GitHubSkill/Model/Label.cs delete mode 100644 samples/apps/copilot-chat-app/webapi/Skills/OpenApiSkills/GitHubSkill/Model/PullRequest.cs delete mode 100644 samples/apps/copilot-chat-app/webapi/Skills/OpenApiSkills/GitHubSkill/Model/Repo.cs delete mode 100644 samples/apps/copilot-chat-app/webapi/Skills/OpenApiSkills/GitHubSkill/Model/User.cs delete mode 100644 samples/apps/copilot-chat-app/webapi/Skills/OpenApiSkills/GitHubSkill/openapi.json delete mode 100644 samples/apps/copilot-chat-app/webapi/Skills/OpenApiSkills/README.md diff --git a/samples/apps/copilot-chat-app/webapi/Config/PlannerOptions.cs b/samples/apps/copilot-chat-app/webapi/Config/PlannerOptions.cs deleted file mode 100644 index e333e5677788..000000000000 --- a/samples/apps/copilot-chat-app/webapi/Config/PlannerOptions.cs +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright (c) Microsoft. All rights reserved. - -using System.ComponentModel.DataAnnotations; - -namespace SemanticKernel.Service.Config; - -/// -/// Configuration options for the planner. -/// -public class PlannerOptions -{ - public const string PropertyName = "Planner"; - - /// - /// The AI service to use for planning. - /// - [Required] - public AIServiceOptions? AIService { get; set; } - - /// - /// Whether to enable the planner. - /// - public bool Enabled { get; set; } = false; -} diff --git a/samples/apps/copilot-chat-app/webapi/Controllers/SemanticKernelController.cs b/samples/apps/copilot-chat-app/webapi/Controllers/SemanticKernelController.cs index adfe94d35923..fad5b5ed5516 100644 --- a/samples/apps/copilot-chat-app/webapi/Controllers/SemanticKernelController.cs +++ b/samples/apps/copilot-chat-app/webapi/Controllers/SemanticKernelController.cs @@ -53,8 +53,6 @@ public SemanticKernelController( /// Storage repository to store chat sessions /// Storage repository to store chat messages /// Options for document memory handling. - /// Planner to use to create function sequences. - /// Options for the planner. /// Prompt along with its parameters /// Authentication headers to connect to OpenAPI Skills /// Skill in which function to invoke resides @@ -71,8 +69,6 @@ public async Task> InvokeFunctionAsync( [FromServices] ChatSessionRepository chatRepository, [FromServices] ChatMessageRepository chatMessageRepository, [FromServices] IOptions documentMemoryOptions, - [FromServices] CopilotChatPlanner planner, - [FromServices] IOptions plannerOptions, [FromBody] Ask ask, [FromHeader] OpenApiSkillsAuthHeaders openApiSkillsAuthHeaders, string skillName, string functionName) @@ -97,19 +93,12 @@ public async Task> InvokeFunctionAsync( kernel.RegisterSemanticSkills(this._options.SemanticSkillsDirectory, this._logger); } - // Register skills with the planner if enabled. - if (plannerOptions.Value.Enabled) - { - await this.RegisterPlannerSkillsAsync(planner, plannerOptions.Value, openApiSkillsAuthHeaders, contextVariables); - } // Register native skills with the chat's kernel kernel.RegisterNativeSkills( chatSessionRepository: chatRepository, chatMessageRepository: chatMessageRepository, promptSettings: this._promptSettings, - planner: planner, - plannerOptions: plannerOptions.Value, documentMemoryOptions: documentMemoryOptions.Value, logger: this._logger); @@ -139,78 +128,6 @@ public async Task> InvokeFunctionAsync( return this.Ok(new AskResult { Value = result.Result, Variables = result.Variables.Select(v => new KeyValuePair(v.Key, v.Value)) }); } - /// - /// Register skills with the planner's kernel. - /// - private async Task RegisterPlannerSkillsAsync(CopilotChatPlanner planner, PlannerOptions options, OpenApiSkillsAuthHeaders openApiSkillsAuthHeaders, ContextVariables variables) - { - // Register the Klarna shopping ChatGPT plugin with the planner's kernel. - using DefaultHttpRetryHandler retryHandler = new(new HttpRetryConfig(), this._logger) - { - InnerHandler = new HttpClientHandler() { CheckCertificateRevocationList = true } - }; - using HttpClient importHttpClient = new HttpClient(retryHandler, false); - importHttpClient.DefaultRequestHeaders.Add("User-Agent", "Microsoft.CopilotChat"); - await planner.Kernel.ImportChatGptPluginSkillFromUrlAsync("KlarnaShoppingSkill", new Uri("https://www.klarna.com/.well-known/ai-plugin.json"), - importHttpClient); - - // - // Register authenticated skills with the planner's kernel only if the request includes an auth header for the skill. - // - - // GitHub - if (!string.IsNullOrWhiteSpace(openApiSkillsAuthHeaders.GithubAuthentication)) - { - this._logger.LogInformation("Enabling GitHub skill."); - BearerAuthenticationProvider authenticationProvider = new(() => Task.FromResult(openApiSkillsAuthHeaders.GithubAuthentication)); - await planner.Kernel.ImportOpenApiSkillFromFileAsync( - skillName: "GitHubSkill", - filePath: Path.Combine(Directory.GetCurrentDirectory(), @"Skills/OpenApiSkills/GitHubSkill/openapi.json"), - authCallback: authenticationProvider.AuthenticateRequestAsync); - } - - if (openApiSkillsAuthHeaders.JiraAuthentication != null) - { - this._logger.LogInformation("Registering Jira Skill"); - var authenticationProvider = new BasicAuthenticationProvider(() => { return Task.FromResult(openApiSkillsAuthHeaders.JiraAuthentication); }); - var hasServerUrlOverride = variables.Get("jira-server-url", out string serverUrlOverride); - - // TODO: Import Jira OpenAPI Skill - } - - // Microsoft Graph - if (!string.IsNullOrWhiteSpace(openApiSkillsAuthHeaders.GraphAuthentication)) - { - this._logger.LogInformation("Enabling Microsoft Graph skill(s)."); - BearerAuthenticationProvider authenticationProvider = new(() => Task.FromResult(openApiSkillsAuthHeaders.GraphAuthentication)); - GraphServiceClient graphServiceClient = this.CreateGraphServiceClient(authenticationProvider.AuthenticateRequestAsync); - - planner.Kernel.ImportSkill(new TaskListSkill(new MicrosoftToDoConnector(graphServiceClient)), "todo"); - planner.Kernel.ImportSkill(new CalendarSkill(new OutlookCalendarConnector(graphServiceClient)), "calendar"); - planner.Kernel.ImportSkill(new EmailSkill(new OutlookMailConnector(graphServiceClient)), "email"); - } - } - - /// - /// Create a Microsoft Graph service client. - /// - /// The delegate to authenticate the request. - private GraphServiceClient CreateGraphServiceClient(AuthenticateRequestAsyncDelegate authenticateRequestAsyncDelegate) - { - MsGraphClientLoggingHandler graphLoggingHandler = new(this._logger); - this._disposables.Add(graphLoggingHandler); - - IList graphMiddlewareHandlers = - GraphClientFactory.CreateDefaultHandlers(new DelegateAuthenticationProvider(authenticateRequestAsyncDelegate)); - graphMiddlewareHandlers.Add(graphLoggingHandler); - - HttpClient graphHttpClient = GraphClientFactory.Create(graphMiddlewareHandlers); - this._disposables.Add(graphHttpClient); - - GraphServiceClient graphServiceClient = new(graphHttpClient); - return graphServiceClient; - } - /// /// Dispose of the object. /// diff --git a/samples/apps/copilot-chat-app/webapi/CopilotChatApi.csproj b/samples/apps/copilot-chat-app/webapi/CopilotChatApi.csproj index eabb1cf0c9bc..fbc58bf76266 100644 --- a/samples/apps/copilot-chat-app/webapi/CopilotChatApi.csproj +++ b/samples/apps/copilot-chat-app/webapi/CopilotChatApi.csproj @@ -39,4 +39,8 @@ + + <_ContentIncludedByDefault Remove="Skills\OpenApiSkills\GitHubSkill\openapi.json" /> + + diff --git a/samples/apps/copilot-chat-app/webapi/FunctionLoadingExtensions.cs b/samples/apps/copilot-chat-app/webapi/FunctionLoadingExtensions.cs index 431bffe8f48e..1d5132128aa6 100644 --- a/samples/apps/copilot-chat-app/webapi/FunctionLoadingExtensions.cs +++ b/samples/apps/copilot-chat-app/webapi/FunctionLoadingExtensions.cs @@ -42,8 +42,6 @@ internal static void RegisterNativeSkills( ChatSessionRepository chatSessionRepository, ChatMessageRepository chatMessageRepository, PromptSettings promptSettings, - CopilotChatPlanner planner, - PlannerOptions plannerOptions, DocumentMemoryOptions documentMemoryOptions, ILogger logger) { @@ -57,8 +55,6 @@ internal static void RegisterNativeSkills( chatMessageRepository: chatMessageRepository, chatSessionRepository: chatSessionRepository, promptSettings: promptSettings, - planner: planner, - plannerOptions: plannerOptions, logger: logger ); kernel.ImportSkill(chatSkill, nameof(ChatSkill)); diff --git a/samples/apps/copilot-chat-app/webapi/SemanticKernelExtensions.cs b/samples/apps/copilot-chat-app/webapi/SemanticKernelExtensions.cs index 1eb2d0eae052..3b8193a3aecd 100644 --- a/samples/apps/copilot-chat-app/webapi/SemanticKernelExtensions.cs +++ b/samples/apps/copilot-chat-app/webapi/SemanticKernelExtensions.cs @@ -37,22 +37,6 @@ internal static IServiceCollection AddSemanticKernelServices(this IServiceCollec // Add the semantic memory with backing memory store. services.AddSingleton(CreateSemanticTextMemory); - // Add the planner. - services.AddScoped(sp => - { - // Create a kernel for the planner with the same contexts as the chat's kernel except with no skills and its own completion backend. - // This allows the planner to use only the skills that are available at call time. - IKernel chatKernel = sp.GetRequiredService(); - IOptions plannerOptions = sp.GetRequiredService>(); - IKernel plannerKernel = new Kernel( - new SkillCollection(), - chatKernel.PromptTemplateEngine, - chatKernel.Memory, - new KernelConfig().AddCompletionBackend(plannerOptions.Value.AIService!), - sp.GetRequiredService>()); - return new CopilotChatPlanner(plannerKernel, plannerOptions); - }); - // Add the Semantic Kernel services.AddSingleton(); services.AddScoped(); diff --git a/samples/apps/copilot-chat-app/webapi/ServiceExtensions.cs b/samples/apps/copilot-chat-app/webapi/ServiceExtensions.cs index 53679b23a10c..def8ef4afd3e 100644 --- a/samples/apps/copilot-chat-app/webapi/ServiceExtensions.cs +++ b/samples/apps/copilot-chat-app/webapi/ServiceExtensions.cs @@ -65,12 +65,6 @@ internal static IServiceCollection AddOptions(this IServiceCollection services, .ValidateOnStart() .PostConfigure(TrimStringProperties); - // Planner options - services.AddOptions() - .Bind(configuration.GetSection(PlannerOptions.PropertyName)) - .ValidateOnStart() - .PostConfigure(TrimStringProperties); - return services; } diff --git a/samples/apps/copilot-chat-app/webapi/Skills/ChatSkill.cs b/samples/apps/copilot-chat-app/webapi/Skills/ChatSkill.cs index d17f5dbccf4a..15255a7d26c0 100644 --- a/samples/apps/copilot-chat-app/webapi/Skills/ChatSkill.cs +++ b/samples/apps/copilot-chat-app/webapi/Skills/ChatSkill.cs @@ -10,9 +10,7 @@ using Microsoft.SemanticKernel.Orchestration; using Microsoft.SemanticKernel.Planning; using Microsoft.SemanticKernel.SkillDefinition; -using SemanticKernel.Service.Config; using SemanticKernel.Service.Model; -using SemanticKernel.Service.Skills.OpenApiSkills.GitHubSkill.Model; using SemanticKernel.Service.Storage; namespace SemanticKernel.Service.Skills; @@ -49,16 +47,6 @@ public class ChatSkill /// private readonly PromptSettings _promptSettings; - /// - /// CopilotChat's planner to gather additional information for the chat context. - /// - private readonly CopilotChatPlanner _planner; - - /// - /// Options for the planner. - /// - private readonly PlannerOptions _plannerOptions; - /// /// Create a new instance of . /// @@ -67,8 +55,6 @@ public ChatSkill( ChatMessageRepository chatMessageRepository, ChatSessionRepository chatSessionRepository, PromptSettings promptSettings, - CopilotChatPlanner planner, - PlannerOptions plannerOptions, ILogger logger) { this._logger = logger; @@ -76,8 +62,6 @@ public ChatSkill( this._chatMessageRepository = chatMessageRepository; this._chatSessionRepository = chatSessionRepository; this._promptSettings = promptSettings; - this._planner = planner; - this._plannerOptions = plannerOptions; } /// @@ -188,58 +172,6 @@ public async Task ExtractUserMemoriesAsync(SKContext context) return memoryText; } - /// - /// Extract relevant additional knowledge using a planner. - /// - [SKFunction("Acquire external information")] - [SKFunctionName("AcquireExternalInformation")] - [SKFunctionContextParameter(Name = "userIntent", Description = "The intent of the user.")] - [SKFunctionContextParameter(Name = "tokenLimit", Description = "Maximum number of tokens")] - public async Task AcquireExternalInformationAsync(SKContext context) - { - if (!this._plannerOptions.Enabled) - { - return string.Empty; - } - - // Skills run in the planner may modify the SKContext. Clone the context to avoid - // modifying the original context variables. - SKContext plannerContext = Utilities.CopyContextWithVariablesClone(context); - - // Use the user intent message as the input to the plan. - plannerContext.Variables.Update(plannerContext["userIntent"]); - - // Create a plan and run it. - Plan plan = await this._planner.CreatePlanAsync(plannerContext.Variables.Input); - if (plan.Steps.Count > 0) - { - SKContext planContext = await plan.InvokeAsync(plannerContext); - int tokenLimit = int.Parse(context["tokenLimit"], new NumberFormatInfo()); - - // The result of the plan may be from an OpenAPI skill. Attempt to extract JSON from the response. - if (!this.TryExtractJsonFromOpenApiPlanResult(planContext.Variables.Input, out string planResult)) - { - // If not, use result of the plan execution result directly. - planResult = planContext.Variables.Input; - } - else - { - int relatedInformationTokenLimit = (int)Math.Floor(tokenLimit * this._promptSettings.RelatedInformationContextWeight); - planResult = this.OptimizeOpenApiSkillJson(planResult, relatedInformationTokenLimit, plan); - } - - string informationText = $"[START RELATED INFORMATION]\n{planResult.Trim()}\n[END RELATED INFORMATION]\n"; - - // Adjust the token limit using the number of tokens in the information text. - tokenLimit -= Utilities.TokenCount(informationText); - context.Variables.Set("tokenLimit", tokenLimit.ToString(new NumberFormatInfo())); - - return informationText; - } - - return string.Empty; - } - /// /// Extract chat history. /// @@ -409,83 +341,6 @@ private bool TryExtractJsonFromOpenApiPlanResult(string openApiSkillResponse, ou return false; } - /// - /// Try to optimize json from the planner response - /// based on token limit - /// - private string OptimizeOpenApiSkillJson(string jsonContent, int tokenLimit, Plan plan) - { - int jsonTokenLimit = (int)(tokenLimit * this._promptSettings.RelatedInformationContextWeight); - - // Remove all new line characters + leading and trailing white space - jsonContent = Regex.Replace(jsonContent.Trim(), @"[\n\r]", string.Empty); - var document = JsonDocument.Parse(jsonContent); - string lastSkillInvoked = plan.Steps[^1].SkillName; - - // Check if the last skill invoked was GitHubSkill and deserialize the JSON content accordingly - if (string.Equals(lastSkillInvoked, "GitHubSkill", StringComparison.Ordinal)) - { - var pullRequestType = document.RootElement.ValueKind == JsonValueKind.Array ? typeof(PullRequest[]) : typeof(PullRequest); - - // Deserializing limits the json content to only the fields defined in the GitHubSkill/Model classes - var pullRequest = JsonSerializer.Deserialize(jsonContent, pullRequestType); - jsonContent = pullRequest != null ? JsonSerializer.Serialize(pullRequest) : string.Empty; - document = JsonDocument.Parse(jsonContent); - } - - int jsonContentTokenCount = Utilities.TokenCount(jsonContent); - - // Return the JSON content if it does not exceed the token limit - if (jsonContentTokenCount < jsonTokenLimit) - { - return jsonContent; - } - - List itemList = new(); - - // Summary (List) Object - if (document.RootElement.ValueKind == JsonValueKind.Array) - { - foreach (JsonElement item in document.RootElement.EnumerateArray()) - { - int itemTokenCount = Utilities.TokenCount(item.ToString()); - - if (jsonTokenLimit - itemTokenCount > 0) - { - itemList.Add(item); - jsonTokenLimit -= itemTokenCount; - } - else - { - break; - } - } - } - - // Detail Object - if (document.RootElement.ValueKind == JsonValueKind.Object) - { - foreach (JsonProperty property in document.RootElement.EnumerateObject()) - { - int propertyTokenCount = Utilities.TokenCount(property.ToString()); - - if (jsonTokenLimit - propertyTokenCount > 0) - { - itemList.Add(property); - jsonTokenLimit -= propertyTokenCount; - } - else - { - break; - } - } - } - - return itemList.Count > 0 - ? JsonSerializer.Serialize(itemList) - : string.Format(CultureInfo.InvariantCulture, "JSON response for {0} is too large to be consumed at this time.", lastSkillInvoked); - } - /// /// Save a new message to the chat history. /// diff --git a/samples/apps/copilot-chat-app/webapi/Skills/CopilotChatPlanner.cs b/samples/apps/copilot-chat-app/webapi/Skills/CopilotChatPlanner.cs deleted file mode 100644 index 24411fd04c2f..000000000000 --- a/samples/apps/copilot-chat-app/webapi/Skills/CopilotChatPlanner.cs +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright (c) Microsoft. All rights reserved. - -using Microsoft.Extensions.Options; -using Microsoft.SemanticKernel; -using Microsoft.SemanticKernel.Planning; -using SemanticKernel.Service.Config; - -namespace SemanticKernel.Service.Skills; - -/// -/// A lightweight wrapper around a planner to allow for curating which skills are available to it. -/// -public class CopilotChatPlanner -{ - /// - /// The planner's kernel. - /// - public IKernel Kernel { get; } - - /// - /// The planner's options. - /// - private readonly PlannerOptions _options; - - /// - /// Initializes a new instance of the class. - /// - /// The planner's kernel. - /// The planner's options. - public CopilotChatPlanner(IKernel plannerKernel, IOptions options) - { - this.Kernel = plannerKernel; - this._options = options.Value; - } - - /// - /// Create a plan for a goal. - /// - /// The goal to create a plan for. - /// The plan. - public Task CreatePlanAsync(string goal) => new ActionPlanner(this.Kernel).CreatePlanAsync(goal); -} diff --git a/samples/apps/copilot-chat-app/webapi/Skills/OpenApiSkills/GitHubSkill/Model/Label.cs b/samples/apps/copilot-chat-app/webapi/Skills/OpenApiSkills/GitHubSkill/Model/Label.cs deleted file mode 100644 index fdcf129e9763..000000000000 --- a/samples/apps/copilot-chat-app/webapi/Skills/OpenApiSkills/GitHubSkill/Model/Label.cs +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright (c) Microsoft. All rights reserved. - -using System.Text.Json.Serialization; - -namespace SemanticKernel.Service.Skills.OpenApiSkills.GitHubSkill.Model; - -/// -/// Represents a pull request label. -/// -public class Label -{ - /// - /// Gets or sets the ID of the label. - /// - [JsonPropertyName("id")] - public long Id { get; set; } - - /// - /// Gets or sets the name of the label. - /// - [JsonPropertyName("name")] - public string Name { get; set; } - - /// - /// Gets or sets the description of the label. - /// - [JsonPropertyName("description")] - public string Description { get; set; } - - /// - /// Initializes a new instance of the class. - /// - /// The ID of the label. - /// The name of the label. - /// The description of the label. - public Label(long id, string name, string description) - { - this.Id = id; - this.Name = name; - this.Description = description; - } -} diff --git a/samples/apps/copilot-chat-app/webapi/Skills/OpenApiSkills/GitHubSkill/Model/PullRequest.cs b/samples/apps/copilot-chat-app/webapi/Skills/OpenApiSkills/GitHubSkill/Model/PullRequest.cs deleted file mode 100644 index 2ec711317716..000000000000 --- a/samples/apps/copilot-chat-app/webapi/Skills/OpenApiSkills/GitHubSkill/Model/PullRequest.cs +++ /dev/null @@ -1,118 +0,0 @@ -// Copyright (c) Microsoft. All rights reserved. - -using System.Text.Json.Serialization; - -namespace SemanticKernel.Service.Skills.OpenApiSkills.GitHubSkill.Model; - -/// -/// Represents a GitHub Pull Request. -/// -public class PullRequest -{ - /// - /// Gets or sets the URL of the pull request - /// - [JsonPropertyName("url")] - public System.Uri Url { get; set; } - - /// - /// Gets or sets the unique identifier of the pull request - /// - [JsonPropertyName("id")] - public int Id { get; set; } - - /// - /// Gets or sets the number of the pull request - /// - [JsonPropertyName("number")] - public int Number { get; set; } - - /// - /// Gets or sets the state of the pull request - /// - [JsonPropertyName("state")] - public string State { get; set; } - - /// - /// Whether the pull request is locked - /// - [JsonPropertyName("locked")] - public bool Locked { get; set; } - - /// - /// Gets or sets the title of the pull request - /// - [JsonPropertyName("title")] - public string Title { get; set; } - - /// - /// Gets or sets the user who created the pull request - /// - [JsonPropertyName("user")] - public GitHubUser User { get; set; } - - /// - /// Gets or sets the labels associated with the pull request - /// - [JsonPropertyName("labels")] - public List