diff --git a/samples/app-hello-world/python/Images/M365_Copilot_Click_Continue_To_Load_Tab.png b/samples/app-hello-world/python/Images/M365_Copilot_Click_Continue_To_Load_Tab.png new file mode 100644 index 0000000000..80d1acffaa Binary files /dev/null and b/samples/app-hello-world/python/Images/M365_Copilot_Click_Continue_To_Load_Tab.png differ diff --git a/samples/app-hello-world/python/Images/M365_Copilot_Office.png b/samples/app-hello-world/python/Images/M365_Copilot_Office.png new file mode 100644 index 0000000000..7d7d21a5d9 Binary files /dev/null and b/samples/app-hello-world/python/Images/M365_Copilot_Office.png differ diff --git a/samples/app-hello-world/python/Images/M365_Copilot_Tab_Loaded_Successfully.png b/samples/app-hello-world/python/Images/M365_Copilot_Tab_Loaded_Successfully.png new file mode 100644 index 0000000000..674bd00599 Binary files /dev/null and b/samples/app-hello-world/python/Images/M365_Copilot_Tab_Loaded_Successfully.png differ diff --git a/samples/app-hello-world/python/Images/Outlook_Click_Continue.png b/samples/app-hello-world/python/Images/Outlook_Click_Continue.png new file mode 100644 index 0000000000..4cfbe93e23 Binary files /dev/null and b/samples/app-hello-world/python/Images/Outlook_Click_Continue.png differ diff --git a/samples/app-hello-world/python/Images/Outlook_Tab_Loaded.png b/samples/app-hello-world/python/Images/Outlook_Tab_Loaded.png new file mode 100644 index 0000000000..6ef859e428 Binary files /dev/null and b/samples/app-hello-world/python/Images/Outlook_Tab_Loaded.png differ diff --git a/samples/app-hello-world/python/README.md b/samples/app-hello-world/python/README.md index c65e82cd29..5cda66cee6 100644 --- a/samples/app-hello-world/python/README.md +++ b/samples/app-hello-world/python/README.md @@ -25,6 +25,7 @@ With this sample, users can: * Tabs * Bots * Messaging Extensions +* Agents SDK ## Interaction with app @@ -171,30 +172,50 @@ To set the **Tab as the default landing capability**, configure the 'staticTabs' ![Personal Scope Bot](Images/1.PersonalScope_Bot.png) +*Installing the Hello World app in personal scope. Once added, the bot sends a welcome message and you can interact with it through chat.* + **Hello World Tab:** ![HelloWorld](Images/2.PersonalScope_StaticTab.png) -**ME:** +*The Hello Tab displays a static page in personal scope, demonstrating how to embed custom web content within Teams.* + +**Messaging Extension (ME):** ![Hello World App](Images/3.PersonalScope_MsgExtSearchQuery.png) +*Messaging extension search interface showing the "getRandomText" command, which allows users to search and insert content into conversations.* + ![Hello World App](Images/4.PersonalScope_MsgExtQuery2.png) +*Search results from the messaging extension displaying randomly generated text and images that can be shared in the conversation.* + **Teams Scope** ![Hello World App](Images/TeamsScope_Bot.png) +*Bot interaction in a Teams channel. The bot responds to messages from team members and can be @mentioned for specific interactions.* + ![Hello World App](Images/TeamsScope_ComposeExt_1.png) +*Opening the messaging extension compose area in a Teams conversation to search for content.* + ![Hello World App](Images/TeamsScope_ComposeExt_2.png) +*Messaging extension results displayed in Teams scope, showing the preview of content before inserting into the conversation.* + ![Hello World App](Images/TeamsScope_ConfigTab.png) +*Configuration page for a configurable tab in Teams, allowing users to customize tab settings before adding it to a channel.* + ![Hello World App](Images/TeamsScope_FirstTab.png) +*The First Tab displaying custom content in a Teams channel, demonstrating how tabs can provide dedicated workspace within Teams.* + ![Hello World App](Images/TeamsScope_SecondTab.png) +*The Second Tab showing additional content options, illustrating how multiple tabs can be used to organize different features.* + ## Outlook on the web - To view your app in Outlook on the web. @@ -205,9 +226,31 @@ To set the **Tab as the default landing capability**, configure the 'staticTabs' ![InstallOutlook](Images/Outlook_SelectApp.png) +*Accessing the Hello World app from Outlook on the web. The app appears in the More Apps section of the sidebar.* + **Select your app icon to launch and preview your app running in Outlook on the web** -![AppOutlook](Images/Outlook_StaticTab.png) +![AppOutlook](Images/Outlook_Click_Continue.png) + +*Launching the Hello World app in Outlook. Click Continue to load the app content.* + +![AppOutlook](Images/Outlook_Tab_Loaded.png) + +*The Hello World tab successfully loaded in Outlook on the web, displaying the same content as in Teams.* + +**M365 Copilot Office** + +![Copilot](Images/M365_Copilot_Office.png) + +*Accessing the Hello World app from Microsoft 365 Copilot in Office on the web.* + +![Copilot](Images/M365_Copilot_Click_Continue_To_Load_Tab.png) + +*Loading the Hello World app in M365 Copilot. Click Continue to proceed.* + +![Copilot](Images/M365_Copilot_Tab_Loaded_Successfully.png) + +*The Hello World tab successfully loaded in M365 Copilot, showcasing cross-platform compatibility.* **Note:** Similarly, you can test your application in the Outlook desktop app as well. @@ -221,19 +264,24 @@ To set the **Tab as the default landing capability**, configure the 'staticTabs' ![InstallOffice](Images/Office_M365.png) +*Finding the Hello World app in the Office on the web Apps section.* + **Select your app icon to launch your app in Office on the web** ![AppOffice](Images/Office_M365_App.png) -**Note:** Similarly, you can test your application in the Office 365 desktop app as well. - -## Deploy the bot to Azure +*The Hello World app running in Office on the web, demonstrating Microsoft 365 integration.* -To learn more about deploying a bot to Azure, see [Deploy your bot to Azure](https://aka.ms/azuredeployment) for a complete list of deployment instructions. +**Note:** Similarly, you can test your application in the Office 365 desktop app as well. ## Further reading -- [Bot Framework Documentation](https://docs.botframework.com) +- [Microsoft 365 Agents SDK Documentation](https://aka.ms/agents) +- [Microsoft 365 Agents SDK for Python - GitHub](https://github.com/microsoft/Agents) +- [Microsoft 365 Agents SDK Python Samples](https://github.com/microsoft/Agents/tree/main/samples/python) +- [Building Conversational Agents with Microsoft 365 Agents SDK](https://learn.microsoft.com/microsoft-365-copilot/extensibility/overview-agents-sdk) +- [Azure Bot Service Introduction](https://docs.microsoft.com/azure/bot-service/bot-service-overview-introduction?view=azure-bot-service-4.0) +- [Extend Teams apps across Microsoft 365](https://learn.microsoft.com/en-us/microsoftteams/platform/m365-apps/overview) - [Bot Basics](https://docs.microsoft.com/azure/bot-service/bot-builder-basics?view=azure-bot-service-4.0) - [Azure Bot Service Introduction](https://docs.microsoft.com/azure/bot-service/bot-service-overview-introduction?view=azure-bot-service-4.0) - [Azure Bot Service Documentation](https://docs.microsoft.com/azure/bot-service/?view=azure-bot-service-4.0) diff --git a/samples/app-hello-world/python/app.py b/samples/app-hello-world/python/app.py index 12324e424a..0f7b5d9968 100644 --- a/samples/app-hello-world/python/app.py +++ b/samples/app-hello-world/python/app.py @@ -3,27 +3,34 @@ import sys import traceback -import uuid from datetime import datetime -from http import HTTPStatus from aiohttp import web -from aiohttp.web import Request, Response, json_response -from botbuilder.core import ( - TurnContext -) -from botbuilder.integration.aiohttp import CloudAdapter, ConfigurationBotFrameworkAuthentication -from botbuilder.core.integration import aiohttp_error_middleware -from botbuilder.schema import Activity, ActivityTypes +from aiohttp.web import Request, Response +from microsoft_agents.hosting.core import TurnContext +from microsoft_agents.hosting.aiohttp import CloudAdapter +from microsoft_agents.authentication.msal import MsalConnectionManager +from microsoft_agents.hosting.aiohttp import jwt_authorization_middleware +from microsoft_agents.activity import Activity, ActivityTypes, load_configuration_from_env +from os import environ from bots import HelloWorldBot from config import DefaultConfig CONFIG = DefaultConfig() -# Create adapter. -# See https://aka.ms/about-bot-adapter to learn more about how bots work. -ADAPTER = CloudAdapter(ConfigurationBotFrameworkAuthentication(CONFIG)) +# Set up environment variables for Agent SDK +# The Agent SDK expects specific environment variable format for service connection +environ.setdefault("CONNECTIONS__SERVICE_CONNECTION__SETTINGS__CLIENTID", CONFIG.APP_ID) +environ.setdefault("CONNECTIONS__SERVICE_CONNECTION__SETTINGS__CLIENTSECRET", CONFIG.APP_PASSWORD) +environ.setdefault("CONNECTIONS__SERVICE_CONNECTION__SETTINGS__TENANTID", CONFIG.APP_TENANTID) +# Load configuration from environment using Agent SDK helper +agents_sdk_config = load_configuration_from_env(environ) +# Create connection manager for authentication +CONNECTION_MANAGER = MsalConnectionManager(**agents_sdk_config) + +# Create adapter with connection manager +ADAPTER = CloudAdapter(connection_manager=CONNECTION_MANAGER) # Catch-all for errors. async def on_error(context: TurnContext, error: Exception): @@ -97,8 +104,20 @@ async def configure(request): async def messages(req: Request) -> Response: return await ADAPTER.process(req, bot) +# Custom middleware wrapper to apply JWT only to /api/messages +@web.middleware +async def conditional_jwt_middleware(request, handler): + # Only apply JWT authentication to /api/messages endpoint + if request.path.startswith('/api/messages'): + return await jwt_authorization_middleware(request, handler) + else: + # For other routes (tabs, static pages), skip JWT validation + return await handler(request) + +APP = web.Application(middlewares=[conditional_jwt_middleware]) -APP = web.Application(middlewares=[aiohttp_error_middleware]) +# Set the agent configuration in app state for jwt_authorization_middleware +APP["agent_configuration"] = CONNECTION_MANAGER.get_default_connection_configuration() # Register routes APP.router.add_get("/", home) diff --git a/samples/app-hello-world/python/assets/sample.json b/samples/app-hello-world/python/assets/sample.json index fe9b33e32b..95a3474a48 100644 --- a/samples/app-hello-world/python/assets/sample.json +++ b/samples/app-hello-world/python/assets/sample.json @@ -9,7 +9,7 @@ "The Microsoft Teams Python Hello World Sample app demonstrates key features of Teams, including tabs, bots, and messaging extensions, built with Python. It’s a great starting point for developing and deploying custom Teams apps." ], "creationDateTime": "2024-12-12", - "updateDateTime": "2024-12-12", + "updateDateTime": "2025-12-01", "products": [ "Teams" ], diff --git a/samples/app-hello-world/python/bots/bot.py b/samples/app-hello-world/python/bots/bot.py index b048d8cfad..889731d62b 100644 --- a/samples/app-hello-world/python/bots/bot.py +++ b/samples/app-hello-world/python/bots/bot.py @@ -1,22 +1,21 @@ # Copyright (c) Microsoft Corporation. All rights reserved. # Licensed under the MIT License. -from botbuilder.core import TurnContext, CardFactory -from botbuilder.core.teams import TeamsActivityHandler -from botbuilder.schema.teams import TeamInfo, TeamsChannelAccount +from microsoft_agents.hosting.core import TurnContext, CardFactory +from microsoft_agents.hosting.teams import TeamsActivityHandler +from microsoft_agents.activity.teams import TeamInfo, TeamsChannelAccount from faker import Faker -from botbuilder.schema.teams import ( +from microsoft_agents.activity.teams import ( MessagingExtensionResponse, MessagingExtensionAttachment, MessagingExtensionResult, ) -from botbuilder.schema import ( +from microsoft_agents.activity import ( ThumbnailCard, CardImage, CardAction, ) - class HelloWorldBot(TeamsActivityHandler): """ A bot class that handles activities for Microsoft Teams, including messaging, @@ -105,6 +104,7 @@ async def on_teams_messaging_extension_query(self, context, query): preview_card = self.create_thumbnail_card(title, text, images) tap_action = CardAction( type="invoke", + title=title, value={"title": title, "text": text, "images": images}, ) preview_attachment = CardFactory.thumbnail_card(preview_card) @@ -114,6 +114,7 @@ async def on_teams_messaging_extension_query(self, context, query): attachment = MessagingExtensionAttachment( content=thumbnail_card, content_type=CardFactory.content_types.thumbnail_card, + content_url="", preview=preview_attachment, ) attachments.append(attachment) @@ -149,6 +150,7 @@ async def on_teams_messaging_extension_select_item( attachment = MessagingExtensionAttachment( content_type=CardFactory.content_types.thumbnail_card, content=thumbnail_card, + content_url="", ) return MessagingExtensionResponse( diff --git a/samples/app-hello-world/python/env/.env.local b/samples/app-hello-world/python/env/.env.local index 22987ef6bb..6cbc235aa2 100644 --- a/samples/app-hello-world/python/env/.env.local +++ b/samples/app-hello-world/python/env/.env.local @@ -18,4 +18,5 @@ MICROSOFT_APP_TENANT_ID= RESOURCE_SUFFIX= AZURE_SUBSCRIPTION_ID= AZURE_RESOURCE_GROUP_NAME= -APP_NAME_SUFFIX= \ No newline at end of file +APP_NAME_SUFFIX= +AAD_APP_ACCESS_AS_USER_PERMISSION_ID= \ No newline at end of file diff --git a/samples/app-hello-world/python/requirements.txt b/samples/app-hello-world/python/requirements.txt index c6424216e6..558b739ced 100644 --- a/samples/app-hello-world/python/requirements.txt +++ b/samples/app-hello-world/python/requirements.txt @@ -1,2 +1,7 @@ -requests==2.31.0 -botbuilder-integration-aiohttp>=4.14.5 +requests>=2.32.3 +microsoft-agents-activity>=0.6.0 +microsoft-agents-hosting-core>=0.6.0 +microsoft-agents-hosting-aiohttp>=0.6.0 +microsoft-agents-hosting-teams>=0.6.0 +microsoft-agents-authentication-msal>=0.6.0 +faker>=18.0.0 diff --git a/samples/graph-chat-lifecycle/nodejs/Images/1.Install.png b/samples/graph-chat-lifecycle/nodejs/Images/1.Install.png new file mode 100644 index 0000000000..97e29eb6b6 Binary files /dev/null and b/samples/graph-chat-lifecycle/nodejs/Images/1.Install.png differ diff --git a/samples/graph-chat-lifecycle/nodejs/Images/10.Continue_M365_Copilot.png b/samples/graph-chat-lifecycle/nodejs/Images/10.Continue_M365_Copilot.png new file mode 100644 index 0000000000..268ddef144 Binary files /dev/null and b/samples/graph-chat-lifecycle/nodejs/Images/10.Continue_M365_Copilot.png differ diff --git a/samples/graph-chat-lifecycle/nodejs/Images/11.Tab_Loaded_In_M365_Copilot.png b/samples/graph-chat-lifecycle/nodejs/Images/11.Tab_Loaded_In_M365_Copilot.png new file mode 100644 index 0000000000..38dbbe50b9 Binary files /dev/null and b/samples/graph-chat-lifecycle/nodejs/Images/11.Tab_Loaded_In_M365_Copilot.png differ diff --git a/samples/graph-chat-lifecycle/nodejs/Images/2.Add_To_GroupChat.png b/samples/graph-chat-lifecycle/nodejs/Images/2.Add_To_GroupChat.png new file mode 100644 index 0000000000..1fa70fe5bf Binary files /dev/null and b/samples/graph-chat-lifecycle/nodejs/Images/2.Add_To_GroupChat.png differ diff --git a/samples/graph-chat-lifecycle/nodejs/Images/3.Configurable_Tab.png b/samples/graph-chat-lifecycle/nodejs/Images/3.Configurable_Tab.png new file mode 100644 index 0000000000..ec653c58e4 Binary files /dev/null and b/samples/graph-chat-lifecycle/nodejs/Images/3.Configurable_Tab.png differ diff --git a/samples/graph-chat-lifecycle/nodejs/Images/4.Tab_Added_Successfully.png b/samples/graph-chat-lifecycle/nodejs/Images/4.Tab_Added_Successfully.png new file mode 100644 index 0000000000..133ac05290 Binary files /dev/null and b/samples/graph-chat-lifecycle/nodejs/Images/4.Tab_Added_Successfully.png differ diff --git a/samples/graph-chat-lifecycle/nodejs/Images/5.Create_Group_Chat.png b/samples/graph-chat-lifecycle/nodejs/Images/5.Create_Group_Chat.png new file mode 100644 index 0000000000..2443457317 Binary files /dev/null and b/samples/graph-chat-lifecycle/nodejs/Images/5.Create_Group_Chat.png differ diff --git a/samples/graph-chat-lifecycle/nodejs/Images/6.Created_GC_Successfully.png b/samples/graph-chat-lifecycle/nodejs/Images/6.Created_GC_Successfully.png new file mode 100644 index 0000000000..9af56bb19e Binary files /dev/null and b/samples/graph-chat-lifecycle/nodejs/Images/6.Created_GC_Successfully.png differ diff --git a/samples/graph-chat-lifecycle/nodejs/Images/7.In_Outlook.png b/samples/graph-chat-lifecycle/nodejs/Images/7.In_Outlook.png new file mode 100644 index 0000000000..235af0407e Binary files /dev/null and b/samples/graph-chat-lifecycle/nodejs/Images/7.In_Outlook.png differ diff --git a/samples/graph-chat-lifecycle/nodejs/Images/8.Outlook_Tab.png b/samples/graph-chat-lifecycle/nodejs/Images/8.Outlook_Tab.png new file mode 100644 index 0000000000..cd11e52738 Binary files /dev/null and b/samples/graph-chat-lifecycle/nodejs/Images/8.Outlook_Tab.png differ diff --git a/samples/graph-chat-lifecycle/nodejs/Images/9.M365_Copilot_Office.png b/samples/graph-chat-lifecycle/nodejs/Images/9.M365_Copilot_Office.png new file mode 100644 index 0000000000..8d44fc7ad9 Binary files /dev/null and b/samples/graph-chat-lifecycle/nodejs/Images/9.M365_Copilot_Office.png differ diff --git a/samples/graph-chat-lifecycle/nodejs/Images/AppOffice.png b/samples/graph-chat-lifecycle/nodejs/Images/AppOffice.png deleted file mode 100644 index 0c3cac3a9a..0000000000 Binary files a/samples/graph-chat-lifecycle/nodejs/Images/AppOffice.png and /dev/null differ diff --git a/samples/graph-chat-lifecycle/nodejs/Images/AppOutlook.png b/samples/graph-chat-lifecycle/nodejs/Images/AppOutlook.png deleted file mode 100644 index f4caf00f3a..0000000000 Binary files a/samples/graph-chat-lifecycle/nodejs/Images/AppOutlook.png and /dev/null differ diff --git a/samples/graph-chat-lifecycle/nodejs/Images/CreateGroupChat.png b/samples/graph-chat-lifecycle/nodejs/Images/CreateGroupChat.png deleted file mode 100644 index ba0ff01ddf..0000000000 Binary files a/samples/graph-chat-lifecycle/nodejs/Images/CreateGroupChat.png and /dev/null differ diff --git a/samples/graph-chat-lifecycle/nodejs/Images/CreateGroupChatDetails.png b/samples/graph-chat-lifecycle/nodejs/Images/CreateGroupChatDetails.png deleted file mode 100644 index 1a4bf06a2f..0000000000 Binary files a/samples/graph-chat-lifecycle/nodejs/Images/CreateGroupChatDetails.png and /dev/null differ diff --git a/samples/graph-chat-lifecycle/nodejs/Images/GraphChatLifecycleGif.gif b/samples/graph-chat-lifecycle/nodejs/Images/GraphChatLifecycleGif.gif index f50c0b5bc3..1df2aea4c7 100644 Binary files a/samples/graph-chat-lifecycle/nodejs/Images/GraphChatLifecycleGif.gif and b/samples/graph-chat-lifecycle/nodejs/Images/GraphChatLifecycleGif.gif differ diff --git a/samples/graph-chat-lifecycle/nodejs/Images/GroupChatCreatedSuccessfully.png b/samples/graph-chat-lifecycle/nodejs/Images/GroupChatCreatedSuccessfully.png deleted file mode 100644 index 0c3d4601dc..0000000000 Binary files a/samples/graph-chat-lifecycle/nodejs/Images/GroupChatCreatedSuccessfully.png and /dev/null differ diff --git a/samples/graph-chat-lifecycle/nodejs/Images/Install.png b/samples/graph-chat-lifecycle/nodejs/Images/Install.png deleted file mode 100644 index 0ba2361c31..0000000000 Binary files a/samples/graph-chat-lifecycle/nodejs/Images/Install.png and /dev/null differ diff --git a/samples/graph-chat-lifecycle/nodejs/Images/InstallOffice.png b/samples/graph-chat-lifecycle/nodejs/Images/InstallOffice.png deleted file mode 100644 index 24050f17ab..0000000000 Binary files a/samples/graph-chat-lifecycle/nodejs/Images/InstallOffice.png and /dev/null differ diff --git a/samples/graph-chat-lifecycle/nodejs/Images/InstallOutlook.png b/samples/graph-chat-lifecycle/nodejs/Images/InstallOutlook.png deleted file mode 100644 index 3ed2b62101..0000000000 Binary files a/samples/graph-chat-lifecycle/nodejs/Images/InstallOutlook.png and /dev/null differ diff --git a/samples/graph-chat-lifecycle/nodejs/Images/InstallSaveTab.png b/samples/graph-chat-lifecycle/nodejs/Images/InstallSaveTab.png deleted file mode 100644 index f917563bcf..0000000000 Binary files a/samples/graph-chat-lifecycle/nodejs/Images/InstallSaveTab.png and /dev/null differ diff --git a/samples/graph-chat-lifecycle/nodejs/Images/MembersList.png b/samples/graph-chat-lifecycle/nodejs/Images/MembersList.png deleted file mode 100644 index b0e2313742..0000000000 Binary files a/samples/graph-chat-lifecycle/nodejs/Images/MembersList.png and /dev/null differ diff --git a/samples/graph-chat-lifecycle/nodejs/Images/PinnedTabSuccessfully.png b/samples/graph-chat-lifecycle/nodejs/Images/PinnedTabSuccessfully.png deleted file mode 100644 index 76700460c8..0000000000 Binary files a/samples/graph-chat-lifecycle/nodejs/Images/PinnedTabSuccessfully.png and /dev/null differ diff --git a/samples/graph-chat-lifecycle/nodejs/Images/SelectTeams.png b/samples/graph-chat-lifecycle/nodejs/Images/SelectTeams.png deleted file mode 100644 index 76c78736dc..0000000000 Binary files a/samples/graph-chat-lifecycle/nodejs/Images/SelectTeams.png and /dev/null differ diff --git a/samples/graph-chat-lifecycle/nodejs/Images/WelcomeCreateGroup.png b/samples/graph-chat-lifecycle/nodejs/Images/WelcomeCreateGroup.png deleted file mode 100644 index 47633b0862..0000000000 Binary files a/samples/graph-chat-lifecycle/nodejs/Images/WelcomeCreateGroup.png and /dev/null differ diff --git a/samples/graph-chat-lifecycle/nodejs/README.md b/samples/graph-chat-lifecycle/nodejs/README.md index 2111f40c73..5aeb040587 100644 --- a/samples/graph-chat-lifecycle/nodejs/README.md +++ b/samples/graph-chat-lifecycle/nodejs/README.md @@ -21,6 +21,7 @@ This sample application showcases the management of chat lifecycles in Microsoft * Tabs * Adaptive Cards * Graph API +* Agent SDK ## Interaction with app @@ -166,63 +167,41 @@ The simplest way to run this sample in Teams is to use Microsoft 365 Agents Tool ## Running the sample -1. In Teams, Install App +- **Install App:** + ![Install the Chat Lifecycle app in Teams](Images/1.Install.png) - ![](Images/Install.png) - - ![](Images/SelectTeams.png) - - ![](Images/InstallSaveTab.png) - -2. In Teams, Once the app is successfully installed, it can be opened in the tab and has option to create group chat if user is authenticated. - - ![](Images/WelcomeCreateGroup.png) - -3. Once create group chat is clicked, user will be able to add Title of the groupchat and select users from drop down to create a group chat and add members (using different scenarios) and delete member accordingly to depict the lifecycle of chat. - - ![](Images/CreateGroupChat.png) - - ![](Images/MembersList.png) - - ![](Images/CreateGroupChatDetails.png) - - ![](Images/GroupChatCreatedSuccessfully.png) - -4. Also, Polly app will be installed to the created group chat and will be pinned to the chat. - - ![](Images/PinnedTabSuccessfully.png) - -## Outlook on the web - -- To view your app in Outlook on the web. - -- Go to [Outlook on the web](https://outlook.office.com/mail/)and sign in using your dev tenant account. - -**On the side bar, select More Apps. Your uploaded app title appears among your installed apps** - -![InstallOutlook](Images/InstallOutlook.png) +- **Add To Group Chat:** + ![Add the app to an existing group chat](Images/2.Add_To_GroupChat.png) -**Select your app icon to launch and preview your app running in Outlook on the web** +- **Open Configurable Tab:** + ![Open the configurable tab to set up the app](Images/3.Configurable_Tab.png) -![AppOutlook](Images/AppOutlook.png) +- **Tab Added Successfully:** + ![Confirmation that the tab was added successfully](Images/4.Tab_Added_Successfully.png) -**Note:** Similarly, you can test your application in the Outlook desktop app as well. +- **Create Group Chat (Adaptive Card):** + ![Adaptive card used to create a group chat](Images/5.Create_Group_Chat.png) -## Office on the web +- **Group Chat Created Successfully:** + ![Success message after creating group chat and installing app](Images/6.Created_GC_Successfully.png) -- To preview your app running in Office on the web. +- **App In Outlook:** + ![The app shown in Outlook on the web](Images/7.In_Outlook.png) -- Log into office.com with test tenant credentials +- **Outlook Tab View:** + ![The app loaded as a tab inside Outlook](Images/8.Outlook_Tab.png) -**Select the Apps icon on the side bar. Your uploaded app title appears among your installed apps** +- **M365 Copilot Integration:** + ![App appearing within the M365 Copilot experience](Images/9.M365_Copilot_Office.png) -![InstallOffice](Images/InstallOffice.png) +- **Continue in M365 Copilot:** + ![Continue flow inside M365 Copilot after opening the app](Images/10.Continue_M365_Copilot.png) -**Select your app icon to launch your app in Office on the web** +- **Tab Loaded in M365 Copilot:** + ![Final view of the tab loaded in the M365 Copilot surface](Images/11.Tab_Loaded_In_M365_Copilot.png) -![AppOffice](Images/AppOffice.png) -**Note:** Similarly, you can test your application in the Office 365 desktop app as well. +**Note:** Similarly, you can test your application in the Office M365 Copilot desktop app as well. ## Further Reading [Graph-Chat-Life-Cycle](https://learn.microsoft.com/en-us/microsoftteams/plan-teams-lifecycle) diff --git a/samples/graph-chat-lifecycle/nodejs/appManifest/manifest.json b/samples/graph-chat-lifecycle/nodejs/appManifest/manifest.json index a95fed8d1c..a8c07ddc3f 100644 --- a/samples/graph-chat-lifecycle/nodejs/appManifest/manifest.json +++ b/samples/graph-chat-lifecycle/nodejs/appManifest/manifest.json @@ -37,7 +37,9 @@ "configurationUrl": "https://${{TAB_DOMAIN}}/configure", "canUpdateConfiguration": true, "scopes": [ - "team" + "team", + "groupChat" + ] } ], diff --git a/samples/graph-chat-lifecycle/nodejs/assets/sample.json b/samples/graph-chat-lifecycle/nodejs/assets/sample.json index 52932a5971..40cdc09cfc 100644 --- a/samples/graph-chat-lifecycle/nodejs/assets/sample.json +++ b/samples/graph-chat-lifecycle/nodejs/assets/sample.json @@ -9,7 +9,7 @@ "This sample application illustrates the full lifecycle of chats in Microsoft Teams, allowing users to create chats, add and remove members, and interact with the application using Microsoft Graph APIs. Built with Node.js, it features tabs, adaptive cards, and a seamless setup process using the Teams Toolkit for Visual Studio Code." ], "creationDateTime": "2021-07-07", - "updateDateTime": "2024-10-14", + "updateDateTime": "2025-11-28", "products": [ "Teams" ], diff --git a/samples/graph-chat-lifecycle/nodejs/helpers/chatHelper.js b/samples/graph-chat-lifecycle/nodejs/helpers/chatHelper.js index eafde06658..a43784ada8 100644 --- a/samples/graph-chat-lifecycle/nodejs/helpers/chatHelper.js +++ b/samples/graph-chat-lifecycle/nodejs/helpers/chatHelper.js @@ -1,6 +1,6 @@ const fs = require('fs'); const ACData = require("adaptivecards-templating"); -const { CardFactory } = require('botbuilder'); +const { CardFactory } = require('@microsoft/agents-hosting'); require('isomorphic-fetch'); const { Client } = require("@microsoft/microsoft-graph-client"); const config = require('../config/default.json'); diff --git a/samples/graph-chat-lifecycle/nodejs/package-lock.json b/samples/graph-chat-lifecycle/nodejs/package-lock.json index 438ab73007..f7eaa8e417 100644 --- a/samples/graph-chat-lifecycle/nodejs/package-lock.json +++ b/samples/graph-chat-lifecycle/nodejs/package-lock.json @@ -9,12 +9,13 @@ "version": "1.0.0", "license": "MIT", "dependencies": { + "@microsoft/agents-hosting": "^1.0.15", + "@microsoft/agents-hosting-extensions-teams": "^1.0.15", "@microsoft/microsoft-graph-client": "^3.0.4", "@microsoft/teams-js": "^2.5.0", "adaptive-expressions": "^4.19.3", "adaptivecards-templating": "^2.3.1", "body-parser": "^1.19.0", - "botbuilder": "^4.18.0", "config": "^3.3.8", "cors": "^2.8.5", "ejs": "^3.1.6", @@ -25,7 +26,8 @@ "node-fetch": "^2.1.2", "nodemon": "^2.0.7", "pug": "^3.0.2", - "restify": "^8.5.1" + "restify": "^8.5.1", + "zod": "^3.22.4" }, "devDependencies": { "del": "^3.0.0", @@ -34,204 +36,56 @@ "gulp-zip": "^4.0.0" } }, - "node_modules/@azure/abort-controller": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-1.1.0.tgz", - "integrity": "sha512-TrRLIoSQVzfAJX9H1JeFjzAoDGcoK1IYX1UImfceTZpsyYfWr09Ss1aHW1y5TrrR3iq6RZLBwJ3E24uwPhwahw==", - "dependencies": { - "tslib": "^2.2.0" - }, - "engines": { - "node": ">=12.0.0" - } - }, "node_modules/@azure/core-auth": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@azure/core-auth/-/core-auth-1.4.0.tgz", - "integrity": "sha512-HFrcTgmuSuukRf/EdPmqBrc5l6Q5Uu+2TbuhaKbgaCpP2TfAeiNaQPAadxO+CYBRHGUzIDteMAjFspFLDLnKVQ==", - "dependencies": { - "@azure/abort-controller": "^1.0.0", - "tslib": "^2.2.0" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/@azure/core-client": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/@azure/core-client/-/core-client-1.7.3.tgz", - "integrity": "sha512-kleJ1iUTxcO32Y06dH9Pfi9K4U+Tlb111WXEnbt7R/ne+NLRwppZiTGJuTD5VVoxTMK5NTbEtm5t2vcdNCFe2g==", - "dependencies": { - "@azure/abort-controller": "^1.0.0", - "@azure/core-auth": "^1.4.0", - "@azure/core-rest-pipeline": "^1.9.1", - "@azure/core-tracing": "^1.0.0", - "@azure/core-util": "^1.0.0", - "@azure/logger": "^1.0.0", - "tslib": "^2.2.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@azure/core-rest-pipeline": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.11.0.tgz", - "integrity": "sha512-nB4KXl6qAyJmBVLWA7SakT4tzpYZTCk4pvRBeI+Ye0WYSOrlTqlMhc4MSS/8atD3ufeYWdkN380LLoXlUUzThw==", - "dependencies": { - "@azure/abort-controller": "^1.0.0", - "@azure/core-auth": "^1.4.0", - "@azure/core-tracing": "^1.0.1", - "@azure/core-util": "^1.3.0", - "@azure/logger": "^1.0.0", - "form-data": "^4.0.0", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "tslib": "^2.2.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@azure/core-rest-pipeline/node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/@azure/core-auth/-/core-auth-1.10.1.tgz", + "integrity": "sha512-ykRMW8PjVAn+RS6ww5cmK9U2CyH9p4Q88YJwvUslfuMmN98w/2rdGRLPqJYObapBCdzBVeDgYWdJnFPFb7qzpg==", + "license": "MIT", "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" + "@azure/abort-controller": "^2.1.2", + "@azure/core-util": "^1.13.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">= 6" + "node": ">=20.0.0" } }, - "node_modules/@azure/core-tracing": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.0.1.tgz", - "integrity": "sha512-I5CGMoLtX+pI17ZdiFJZgxMJApsK6jjfm85hpgp3oazCdq5Wxgh4wMr7ge/TTWW1B5WBuvIOI1fMU/FrOAMKrw==", + "node_modules/@azure/core-auth/node_modules/@azure/abort-controller": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-2.1.2.tgz", + "integrity": "sha512-nBrLsEWm4J2u5LpAPjxADTlq3trDgVZZXHNKabeXZtpq3d3AbN/KGO82R87rdDz5/lYB024rtEf10/q0urNgsA==", + "license": "MIT", "dependencies": { - "tslib": "^2.2.0" + "tslib": "^2.6.2" }, "engines": { - "node": ">=12.0.0" + "node": ">=18.0.0" } }, "node_modules/@azure/core-util": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@azure/core-util/-/core-util-1.3.2.tgz", - "integrity": "sha512-2bECOUh88RvL1pMZTcc6OzfobBeWDBf5oBbhjIhT1MV9otMVWCzpOJkkiKtrnO88y5GGBelgY8At73KGAdbkeQ==", - "dependencies": { - "@azure/abort-controller": "^1.0.0", - "tslib": "^2.2.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@azure/identity": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@azure/identity/-/identity-2.1.0.tgz", - "integrity": "sha512-BPDz1sK7Ul9t0l9YKLEa8PHqWU4iCfhGJ+ELJl6c8CP3TpJt2urNCbm0ZHsthmxRsYoMPbz2Dvzj30zXZVmAFw==", - "dependencies": { - "@azure/abort-controller": "^1.0.0", - "@azure/core-auth": "^1.3.0", - "@azure/core-client": "^1.4.0", - "@azure/core-rest-pipeline": "^1.1.0", - "@azure/core-tracing": "^1.0.0", - "@azure/core-util": "^1.0.0", - "@azure/logger": "^1.0.0", - "@azure/msal-browser": "^2.26.0", - "@azure/msal-common": "^7.0.0", - "@azure/msal-node": "^1.10.0", - "events": "^3.0.0", - "jws": "^4.0.0", - "open": "^8.0.0", - "stoppable": "^1.1.0", - "tslib": "^2.2.0", - "uuid": "^8.3.0" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/@azure/logger": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@azure/logger/-/logger-1.0.4.tgz", - "integrity": "sha512-ustrPY8MryhloQj7OWGe+HrYx+aoiOxzbXTtgblbV3xwCqpzUK36phH3XNHQKj3EPonyFUuDTfR3qFhTEAuZEg==", - "dependencies": { - "tslib": "^2.2.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@azure/ms-rest-js": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@azure/ms-rest-js/-/ms-rest-js-2.7.0.tgz", - "integrity": "sha512-ngbzWbqF+NmztDOpLBVDxYM+XLcUj7nKhxGbSU9WtIsXfRB//cf2ZbAG5HkOrhU9/wd/ORRB6lM/d69RKVjiyA==", - "dependencies": { - "@azure/core-auth": "^1.1.4", - "abort-controller": "^3.0.0", - "form-data": "^2.5.0", - "node-fetch": "^2.6.7", - "tslib": "^1.10.0", - "tunnel": "0.0.6", - "uuid": "^8.3.2", - "xml2js": "^0.5.0" - } - }, - "node_modules/@azure/ms-rest-js/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, - "node_modules/@azure/msal-browser": { - "version": "2.38.0", - "resolved": "https://registry.npmjs.org/@azure/msal-browser/-/msal-browser-2.38.0.tgz", - "integrity": "sha512-gxBh83IumHgEP9uMCm9pJLKLRwICMQTxG9TX3AytdNt3oLUI3tytm/szYD5u5zKJgSkhHvwFSM+NPnM04hYw3w==", + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/@azure/core-util/-/core-util-1.13.1.tgz", + "integrity": "sha512-XPArKLzsvl0Hf0CaGyKHUyVgF7oDnhKoP85Xv6M4StF/1AhfORhZudHtOyf2s+FcbuQ9dPRAjB8J2KvRRMUK2A==", + "license": "MIT", "dependencies": { - "@azure/msal-common": "13.2.0" + "@azure/abort-controller": "^2.1.2", + "@typespec/ts-http-runtime": "^0.3.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=0.8.0" + "node": ">=20.0.0" } }, - "node_modules/@azure/msal-browser/node_modules/@azure/msal-common": { - "version": "13.2.0", - "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-13.2.0.tgz", - "integrity": "sha512-rnstQ7Zgn3fSTKNQO+/YNV34/QXJs0vni7IA0/3QB1EEyrJg14xyRmTqlw9ta+pdSuT5OJwUP8kI3D/rBwUIBw==", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@azure/msal-common": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-7.6.0.tgz", - "integrity": "sha512-XqfbglUTVLdkHQ8F9UQJtKseRr3sSnr9ysboxtoswvaMVaEfvyLtMoHv9XdKUfOc0qKGzNgRFd9yRjIWVepl6Q==", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@azure/msal-node": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-1.18.0.tgz", - "integrity": "sha512-N6GX1Twxw524e7gaJvj7hKtrPRmZl9qGY7U4pmUdx4XzoWYRFfYk4H1ZjVhQ7pwb5Ks88NNhbXVCagsuYPTEFg==", + "node_modules/@azure/core-util/node_modules/@azure/abort-controller": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-2.1.2.tgz", + "integrity": "sha512-nBrLsEWm4J2u5LpAPjxADTlq3trDgVZZXHNKabeXZtpq3d3AbN/KGO82R87rdDz5/lYB024rtEf10/q0urNgsA==", + "license": "MIT", "dependencies": { - "@azure/msal-common": "13.2.0", - "jsonwebtoken": "^9.0.0", - "uuid": "^8.3.0" + "tslib": "^2.6.2" }, "engines": { - "node": "10 || 12 || 14 || 16 || 18" - } - }, - "node_modules/@azure/msal-node/node_modules/@azure/msal-common": { - "version": "13.2.0", - "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-13.2.0.tgz", - "integrity": "sha512-rnstQ7Zgn3fSTKNQO+/YNV34/QXJs0vni7IA0/3QB1EEyrJg14xyRmTqlw9ta+pdSuT5OJwUP8kI3D/rBwUIBw==", - "engines": { - "node": ">=0.8.0" + "node": ">=18.0.0" } }, "node_modules/@babel/helper-string-parser": { @@ -285,356 +139,135 @@ "node": ">=6.9.0" } }, - "node_modules/@esbuild/android-arm": { - "version": "0.18.16", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.16.tgz", - "integrity": "sha512-gCHjjQmA8L0soklKbLKA6pgsLk1byULuHe94lkZDzcO3/Ta+bbeewJioEn1Fr7kgy9NWNFy/C+MrBwC6I/WCug==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.18.16", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.16.tgz", - "integrity": "sha512-wsCqSPqLz+6Ov+OM4EthU43DyYVVyfn15S4j1bJzylDpc1r1jZFFfJQNfDuT8SlgwuqpmpJXK4uPlHGw6ve7eA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.18.16", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.16.tgz", - "integrity": "sha512-ldsTXolyA3eTQ1//4DS+E15xl0H/3DTRJaRL0/0PgkqDsI0fV/FlOtD+h0u/AUJr+eOTlZv4aC9gvfppo3C4sw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.18.16", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.16.tgz", - "integrity": "sha512-aBxruWCII+OtluORR/KvisEw0ALuw/qDQWvkoosA+c/ngC/Kwk0lLaZ+B++LLS481/VdydB2u6tYpWxUfnLAIw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.18.16", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.16.tgz", - "integrity": "sha512-6w4Dbue280+rp3LnkgmriS1icOUZDyPuZo/9VsuMUTns7SYEiOaJ7Ca1cbhu9KVObAWfmdjUl4gwy9TIgiO5eA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.18.16", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.16.tgz", - "integrity": "sha512-x35fCebhe9s979DGKbVAwXUOcTmCIE32AIqB9CB1GralMIvxdnMLAw5CnID17ipEw9/3MvDsusj/cspYt2ZLNQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-x64": { + "node_modules/@esbuild/win32-x64": { "version": "0.18.16", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.16.tgz", - "integrity": "sha512-YM98f+PeNXF3GbxIJlUsj+McUWG1irguBHkszCIwfr3BXtXZsXo0vqybjUDFfu9a8Wr7uUD/YSmHib+EeGAFlg==", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.16.tgz", + "integrity": "sha512-sCIVrrtcWN5Ua7jYXNG1xD199IalrbfV2+0k/2Zf2OyV2FtnQnMgdzgpRAbi4AWlKJj1jkX+M+fEGPQj6BQB4w==", "cpu": [ "x64" ], "dev": true, "optional": true, "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.18.16", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.16.tgz", - "integrity": "sha512-b5ABb+5Ha2C9JkeZXV+b+OruR1tJ33ePmv9ZwMeETSEKlmu/WJ45XTTG+l6a2KDsQtJJ66qo/hbSGBtk0XVLHw==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.18.16", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.16.tgz", - "integrity": "sha512-XIqhNUxJiuy+zsR77+H5Z2f7s4YRlriSJKtvx99nJuG5ATuJPjmZ9n0ANgnGlPCpXGSReFpgcJ7O3SMtzIFeiQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.18.16", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.16.tgz", - "integrity": "sha512-no+pfEpwnRvIyH+txbBAWtjxPU9grslmTBfsmDndj7bnBmr55rOo/PfQmRfz7Qg9isswt1FP5hBbWb23fRWnow==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.18.16", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.16.tgz", - "integrity": "sha512-Zbnczs9ZXjmo0oZSS0zbNlJbcwKXa/fcNhYQjahDs4Xg18UumpXG/lwM2lcSvHS3mTrRyCYZvJbmzYc4laRI1g==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.18.16", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.16.tgz", - "integrity": "sha512-YMF7hih1HVR/hQVa/ot4UVffc5ZlrzEb3k2ip0nZr1w6fnYypll9td2qcoMLvd3o8j3y6EbJM3MyIcXIVzXvQQ==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.18.16", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.16.tgz", - "integrity": "sha512-Wkz++LZ29lDwUyTSEnzDaaP5OveOgTU69q9IyIw9WqLRxM4BjTBjz9un4G6TOvehWpf/J3gYVFN96TjGHrbcNQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" + "win32" ], "engines": { "node": ">=12" } }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.18.16", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.16.tgz", - "integrity": "sha512-LFMKZ30tk78/mUv1ygvIP+568bwf4oN6reG/uczXnz6SvFn4e2QUFpUpZY9iSJT6Qpgstrhef/nMykIXZtZWGQ==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], + "node_modules/@microsoft/agents-activity": { + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/@microsoft/agents-activity/-/agents-activity-1.0.15.tgz", + "integrity": "sha512-1u8BVLsipsgTTte2SrR+LBXMkkU0oKteE6QDk+Dq5yTS4dF9266LPQ6HgOTNEk3PxRFSibrlw7zSO4y6S/d5wA==", + "license": "MIT", + "dependencies": { + "debug": "^4.3.7", + "uuid": "^11.1.0", + "zod": "3.25.75" + }, "engines": { - "node": ">=12" + "node": ">=20.0.0" } }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.18.16", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.16.tgz", - "integrity": "sha512-3ZC0BgyYHYKfZo3AV2/66TD/I9tlSBaW7eWTEIkrQQKfJIifKMMttXl9FrAg+UT0SGYsCRLI35Gwdmm96vlOjg==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" + "node_modules/@microsoft/agents-activity/node_modules/uuid": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz", + "integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" ], - "engines": { - "node": ">=12" + "license": "MIT", + "bin": { + "uuid": "dist/esm/bin/uuid" } }, - "node_modules/@esbuild/linux-x64": { - "version": "0.18.16", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.16.tgz", - "integrity": "sha512-xu86B3647DihHJHv/wx3NCz2Dg1gjQ8bbf9cVYZzWKY+gsvxYmn/lnVlqDRazObc3UMwoHpUhNYaZset4X8IPA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" + "node_modules/@microsoft/agents-activity/node_modules/zod": { + "version": "3.25.75", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.75.tgz", + "integrity": "sha512-OhpzAmVzabPOL6C3A3gpAifqr9MqihV/Msx3gor2b2kviCgcb+HM9SEOpMWwwNp9MRunWnhtAKUoo0AHhjyPPg==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" } }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.18.16", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.16.tgz", - "integrity": "sha512-uVAgpimx9Ffw3xowtg/7qQPwHFx94yCje+DoBx+LNm2ePDpQXHrzE+Sb0Si2VBObYz+LcRps15cq+95YM7gkUw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], + "node_modules/@microsoft/agents-hosting": { + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/@microsoft/agents-hosting/-/agents-hosting-1.0.15.tgz", + "integrity": "sha512-f7fG0jOYH7UUmGkJT+Y7Hu4vrTrlbgsSGD18+I7H3XyrfOnAkjfwfhkd0BF6F4qCTqDokDXmcQuhlPj/w69k7w==", + "license": "MIT", + "dependencies": { + "@azure/core-auth": "^1.10.0", + "@azure/msal-node": "^3.7.0", + "@microsoft/agents-activity": "1.0.15", + "axios": "^1.11.0", + "jsonwebtoken": "^9.0.2", + "jwks-rsa": "^3.2.0" + }, "engines": { - "node": ">=12" + "node": ">=20.0.0" } }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.18.16", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.16.tgz", - "integrity": "sha512-6OjCQM9wf7z8/MBi6BOWaTL2AS/SZudsZtBziXMtNI8r/U41AxS9x7jn0ATOwVy08OotwkPqGRMkpPR2wcTJXA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], + "node_modules/@microsoft/agents-hosting-extensions-teams": { + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/@microsoft/agents-hosting-extensions-teams/-/agents-hosting-extensions-teams-1.0.15.tgz", + "integrity": "sha512-kMf5xSv4X3h+h0ocYDDykCthdIGKfsbqJuQuJlLSBO3A91NlkZFoceonlYf553DM1fzyJPDhJfIYlXWHpNwd1w==", + "license": "MIT", + "dependencies": { + "@microsoft/agents-hosting": "1.0.15" + }, "engines": { - "node": ">=12" + "node": ">=20.0.0" } }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.18.16", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.16.tgz", - "integrity": "sha512-ZoNkruFYJp9d1LbUYCh8awgQDvB9uOMZqlQ+gGEZR7v6C+N6u7vPr86c+Chih8niBR81Q/bHOSKGBK3brJyvkQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], + "node_modules/@microsoft/agents-hosting/node_modules/@azure/msal-common": { + "version": "15.13.2", + "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-15.13.2.tgz", + "integrity": "sha512-cNwUoCk3FF8VQ7Ln/MdcJVIv3sF73/OT86cRH81ECsydh7F4CNfIo2OAx6Cegtg8Yv75x4506wN4q+Emo6erOA==", + "license": "MIT", "engines": { - "node": ">=12" + "node": ">=0.8.0" } }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.18.16", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.16.tgz", - "integrity": "sha512-+j4anzQ9hrs+iqO+/wa8UE6TVkKua1pXUb0XWFOx0FiAj6R9INJ+WE//1/Xo6FG1vB5EpH3ko+XcgwiDXTxcdw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], + "node_modules/@microsoft/agents-hosting/node_modules/@azure/msal-node": { + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-3.8.3.tgz", + "integrity": "sha512-Ul7A4gwmaHzYWj2Z5xBDly/W8JSC1vnKgJ898zPMZr0oSf1ah0tiL15sytjycU/PMhDZAlkWtEL1+MzNMU6uww==", + "license": "MIT", + "dependencies": { + "@azure/msal-common": "15.13.2", + "jsonwebtoken": "^9.0.0", + "uuid": "^8.3.0" + }, "engines": { - "node": ">=12" + "node": ">=16" } }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.18.16", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.16.tgz", - "integrity": "sha512-5PFPmq3sSKTp9cT9dzvI67WNfRZGvEVctcZa1KGjDDu4n3H8k59Inbk0du1fz0KrAbKKNpJbdFXQMDUz7BG4rQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" + "node_modules/@microsoft/agents-hosting/node_modules/axios": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.2.tgz", + "integrity": "sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.4", + "proxy-from-env": "^1.1.0" } }, - "node_modules/@esbuild/win32-x64": { - "version": "0.18.16", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.16.tgz", - "integrity": "sha512-sCIVrrtcWN5Ua7jYXNG1xD199IalrbfV2+0k/2Zf2OyV2FtnQnMgdzgpRAbi4AWlKJj1jkX+M+fEGPQj6BQB4w==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], + "node_modules/@microsoft/agents-hosting/node_modules/form-data": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, "engines": { - "node": ">=12" + "node": ">= 6" } }, "node_modules/@microsoft/microsoft-graph-client": { @@ -697,23 +330,74 @@ "node >=0.6.0" ] }, - "node_modules/@tootallnate/once": { + "node_modules/@types/atob-lite": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", - "engines": { - "node": ">= 10" + "resolved": "https://registry.npmjs.org/@types/atob-lite/-/atob-lite-2.0.0.tgz", + "integrity": "sha512-7bjymPR7Ffa1/L3HskkaxMgTQDtwFObbISzHm9g3T12VyD89IiHS3BBVojlQHyZRiIilzdh0WT1gwwgyyBtLGQ==" + }, + "node_modules/@types/body-parser": { + "version": "1.19.6", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz", + "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==", + "license": "MIT", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/btoa-lite": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/btoa-lite/-/btoa-lite-1.0.0.tgz", + "integrity": "sha512-wJsiX1tosQ+J5+bY5LrSahHxr2wT+uME5UDwdN1kg4frt40euqA+wzECkmq4t5QbveHiJepfdThgQrPw6KiSlg==" + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/express": { + "version": "4.17.25", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.25.tgz", + "integrity": "sha512-dVd04UKsfpINUnK0yBoYHDF3xu7xVH4BuDotC/xGuycx4CgbP48X/KF/586bcObxT0HENHXEU8Nqtu6NR+eKhw==", + "license": "MIT", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "^1" } }, - "node_modules/@types/atob-lite": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@types/atob-lite/-/atob-lite-2.0.0.tgz", - "integrity": "sha512-7bjymPR7Ffa1/L3HskkaxMgTQDtwFObbISzHm9g3T12VyD89IiHS3BBVojlQHyZRiIilzdh0WT1gwwgyyBtLGQ==" + "node_modules/@types/express-serve-static-core": { + "version": "4.19.7", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.7.tgz", + "integrity": "sha512-FvPtiIf1LfhzsaIXhv/PHan/2FeQBbtBDtfX2QfvPxdUelMDEckK08SM6nqo1MIZY3RUlfA+HV8+hFUSio78qg==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } }, - "node_modules/@types/btoa-lite": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/btoa-lite/-/btoa-lite-1.0.0.tgz", - "integrity": "sha512-wJsiX1tosQ+J5+bY5LrSahHxr2wT+uME5UDwdN1kg4frt40euqA+wzECkmq4t5QbveHiJepfdThgQrPw6KiSlg==" + "node_modules/@types/http-errors": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz", + "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==", + "license": "MIT" + }, + "node_modules/@types/jsonwebtoken": { + "version": "9.0.10", + "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.10.tgz", + "integrity": "sha512-asx5hIG9Qmf/1oStypjanR7iKTv0gXQ1Ov/jfrX6kS/EO0OFni8orbmGCn0672NHR3kXHwpAwR+B368ZGN/2rA==", + "license": "MIT", + "dependencies": { + "@types/ms": "*", + "@types/node": "*" + } }, "node_modules/@types/lodash": { "version": "4.14.195", @@ -733,16 +417,62 @@ "resolved": "https://registry.npmjs.org/@types/lru-cache/-/lru-cache-5.1.1.tgz", "integrity": "sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw==" }, + "node_modules/@types/mime": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", + "license": "MIT" + }, + "node_modules/@types/ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", + "license": "MIT" + }, "node_modules/@types/node": { "version": "10.17.60", "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" }, - "node_modules/@types/ws": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-6.0.4.tgz", - "integrity": "sha512-PpPrX7SZW9re6+Ha8ojZG4Se8AZXgf0GK6zmfqEuCsY49LFDNXO3SByp44X3dFEqtB73lkCDAdUazhAjVPiNwg==", + "node_modules/@types/qs": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==", + "license": "MIT" + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", + "license": "MIT" + }, + "node_modules/@types/send": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@types/send/-/send-1.2.1.tgz", + "integrity": "sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.10", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.10.tgz", + "integrity": "sha512-tRs1dB+g8Itk72rlSI2ZrW6vZg0YrLI81iQSTkMmOqnqCaNr/8Ek4VwWcN5vZgCYWbg/JJSGBlUaYGAOP73qBw==", + "license": "MIT", + "dependencies": { + "@types/http-errors": "*", + "@types/node": "*", + "@types/send": "<1" + } + }, + "node_modules/@types/serve-static/node_modules/@types/send": { + "version": "0.17.6", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.6.tgz", + "integrity": "sha512-Uqt8rPBE8SY0RK8JB1EzVOIZ32uqy8HwdxCnoCOsYrvnswqmFZ/k+9Ikidlk/ImhsdvBsloHbAlewb2IEBV/Og==", + "license": "MIT", "dependencies": { + "@types/mime": "^1", "@types/node": "*" } }, @@ -751,6 +481,55 @@ "resolved": "https://registry.npmjs.org/@types/xmldom/-/xmldom-0.1.31.tgz", "integrity": "sha512-bVy7s0nvaR5D1mT1a8ZkByHWNOGb6Vn4yi5TWhEdmyKlAG+08SA7Md6+jH+tYmMLueAwNeWvHHpeKrr6S4c4BA==" }, + "node_modules/@typespec/ts-http-runtime": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@typespec/ts-http-runtime/-/ts-http-runtime-0.3.2.tgz", + "integrity": "sha512-IlqQ/Gv22xUC1r/WQm4StLkYQmaaTsXAhUVsNE0+xiyf0yRFiH5++q78U3bw6bLKDCTmh0uqKB9eG9+Bt75Dkg==", + "license": "MIT", + "dependencies": { + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@typespec/ts-http-runtime/node_modules/agent-base": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/@typespec/ts-http-runtime/node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@typespec/ts-http-runtime/node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, "node_modules/@xmldom/xmldom": { "version": "0.8.10", "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.10.tgz", @@ -764,17 +543,6 @@ "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" }, - "node_modules/abort-controller": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", - "dependencies": { - "event-target-shim": "^5.0.0" - }, - "engines": { - "node": ">=6.5" - } - }, "node_modules/accepts": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", @@ -798,68 +566,6 @@ "node": ">=0.4.0" } }, - "node_modules/adal-node": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/adal-node/-/adal-node-0.2.3.tgz", - "integrity": "sha512-gMKr8RuYEYvsj7jyfCv/4BfKToQThz20SP71N3AtFn3ia3yAR8Qt2T3aVQhuJzunWs2b38ZsQV0qsZPdwZr7VQ==", - "dependencies": { - "@xmldom/xmldom": "^0.7.0", - "async": "^2.6.3", - "axios": "^0.21.1", - "date-utils": "*", - "jws": "3.x.x", - "underscore": ">= 1.3.1", - "uuid": "^3.1.0", - "xpath.js": "~1.1.0" - }, - "engines": { - "node": ">= 0.6.15" - } - }, - "node_modules/adal-node/node_modules/@xmldom/xmldom": { - "version": "0.7.13", - "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.7.13.tgz", - "integrity": "sha512-lm2GW5PkosIzccsaZIz7tp8cPADSIlIHWDFTR1N0SzfinhhYgeIQjFMz4rYzanCScr3DqQLeomUDArp6MWKm+g==", - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/adal-node/node_modules/axios": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", - "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", - "dependencies": { - "follow-redirects": "^1.14.0" - } - }, - "node_modules/adal-node/node_modules/jwa": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", - "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", - "dependencies": { - "buffer-equal-constant-time": "1.0.1", - "ecdsa-sig-formatter": "1.0.11", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/adal-node/node_modules/jws": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", - "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", - "dependencies": { - "jwa": "^1.4.1", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/adal-node/node_modules/uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", - "bin": { - "uuid": "bin/uuid" - } - }, "node_modules/adaptive-expressions": { "version": "4.20.0", "resolved": "https://registry.npmjs.org/adaptive-expressions/-/adaptive-expressions-4.20.0.tgz", @@ -894,17 +600,6 @@ "adaptive-expressions": "^4.11.0" } }, - "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, "node_modules/ansi-cyan": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/ansi-cyan/-/ansi-cyan-0.1.1.tgz", @@ -1115,14 +810,6 @@ "node": ">=0.10.0" } }, - "node_modules/async": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", - "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", - "dependencies": { - "lodash": "^4.17.14" - } - }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -1145,14 +832,6 @@ "resolved": "https://registry.npmjs.org/atob-lite/-/atob-lite-2.0.0.tgz", "integrity": "sha512-LEeSAWeh2Gfa2FtlQE1shxQ8zi5F9GHarrGKz08TMdODD5T4eH6BMsvtnhbWZ+XQn+Gb6om/917ucvRu7l7ukw==" }, - "node_modules/axios": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.25.0.tgz", - "integrity": "sha512-cD8FOb0tRH3uuEe6+evtAbgJtfxr7ly3fQjYcMcuPlgkwVS9xboaVIpcDV+cYQe+yGykgwZCs1pzjntcGa6l5g==", - "dependencies": { - "follow-redirects": "^1.14.7" - } - }, "node_modules/babel-walk": { "version": "3.0.0-canary-5", "resolved": "https://registry.npmjs.org/babel-walk/-/babel-walk-3.0.0-canary-5.tgz", @@ -1199,14 +878,6 @@ "node": ">=0.10.0" } }, - "node_modules/base64url": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/base64url/-/base64url-3.0.1.tgz", - "integrity": "sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A==", - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/bcrypt-pbkdf": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", @@ -1276,90 +947,6 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, - "node_modules/botbuilder": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/botbuilder/-/botbuilder-4.20.0.tgz", - "integrity": "sha512-YfJgAcUyjKZQP3XzXqBoQmj8S5NoIGmqX5g/5coLlsNEaFLAbQXmOEBddN+ww4gz49S246MDspoGaqtweTu/pw==", - "dependencies": { - "@azure/ms-rest-js": "^2.6.1", - "axios": "^0.25.0", - "botbuilder-core": "4.20.0", - "botbuilder-stdlib": "4.20.0-internal", - "botframework-connector": "4.20.0", - "botframework-schema": "4.20.0", - "botframework-streaming": "4.20.0", - "dayjs": "^1.10.3", - "filenamify": "^4.1.0", - "fs-extra": "^7.0.1", - "htmlparser2": "^6.0.1", - "uuid": "^8.3.2", - "zod": "~1.11.17" - } - }, - "node_modules/botbuilder-core": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/botbuilder-core/-/botbuilder-core-4.20.0.tgz", - "integrity": "sha512-UxJF31nkIuiVHerPhtJKAyzfIbdG7sTgsS4bXvCqkQvxaY+60p6mIwuxOZZQf3AIOPIxCysMKAmhfoaFyTc+Uw==", - "dependencies": { - "botbuilder-dialogs-adaptive-runtime-core": "4.20.0-preview", - "botbuilder-stdlib": "4.20.0-internal", - "botframework-connector": "4.20.0", - "botframework-schema": "4.20.0", - "uuid": "^8.3.2", - "zod": "~1.11.17" - } - }, - "node_modules/botbuilder-dialogs-adaptive-runtime-core": { - "version": "4.20.0-preview", - "resolved": "https://registry.npmjs.org/botbuilder-dialogs-adaptive-runtime-core/-/botbuilder-dialogs-adaptive-runtime-core-4.20.0-preview.tgz", - "integrity": "sha512-P7ezlaFsv5xPHGRYHHsb5UgvkbyxCj0OTHpIfIRCPYLWaKYrzcLI46zzIj76XImn/aYLUsKU7Xg/qw13l9sPKA==", - "dependencies": { - "dependency-graph": "^0.10.0" - } - }, - "node_modules/botbuilder-stdlib": { - "version": "4.20.0-internal", - "resolved": "https://registry.npmjs.org/botbuilder-stdlib/-/botbuilder-stdlib-4.20.0-internal.tgz", - "integrity": "sha512-WtMQkl1PHWX+GkdqufDC4nv+JZTUitvjLpdh56piQaakxozK6FQqQzJFdMvUdOMgfJ/mQMPmtojLhfbQOKYvfA==" - }, - "node_modules/botframework-connector": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/botframework-connector/-/botframework-connector-4.20.0.tgz", - "integrity": "sha512-3mP67NHOGdLeODxuXNchK9gzzTafzLdBGZDSWkJDRvIPORbfoxvA/kXsWU2USwMXBnu/M5YeDZn/eUPjDu1nvw==", - "dependencies": { - "@azure/identity": "^2.0.4", - "@azure/ms-rest-js": "^2.6.1", - "adal-node": "0.2.3", - "axios": "^0.25.0", - "base64url": "^3.0.0", - "botbuilder-stdlib": "4.20.0-internal", - "botframework-schema": "4.20.0", - "cross-fetch": "^3.0.5", - "jsonwebtoken": "^9.0.0", - "rsa-pem-from-mod-exp": "^0.8.4", - "zod": "~1.11.17" - } - }, - "node_modules/botframework-schema": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/botframework-schema/-/botframework-schema-4.20.0.tgz", - "integrity": "sha512-Tda488691XFlkBKdMLdlGWRI8IebLprxqQf57LpuRQHqK2ttbvmfwjFiW5V3VcTBBz1SVzMhwJBAWVDG+MexLA==", - "dependencies": { - "uuid": "^8.3.2", - "zod": "~1.11.17" - } - }, - "node_modules/botframework-streaming": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/botframework-streaming/-/botframework-streaming-4.20.0.tgz", - "integrity": "sha512-yPH9+BYJ9RPb76OcARjls3QHfwRejNQz9RxR9YXt6OX0nMfP+sdMfE8BYTDqvBiIXLivbPi+pJG334PwskfohA==", - "dependencies": { - "@types/node": "^10.17.27", - "@types/ws": "^6.0.3", - "uuid": "^8.3.2", - "ws": "^7.1.2" - } - }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -1487,6 +1074,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/chalk": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", @@ -1905,14 +1505,6 @@ "node": ">= 0.10" } }, - "node_modules/cross-fetch": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.8.tgz", - "integrity": "sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==", - "dependencies": { - "node-fetch": "^2.6.12" - } - }, "node_modules/csv": { "version": "5.5.3", "resolved": "https://registry.npmjs.org/csv/-/csv-5.5.3.tgz", @@ -1958,14 +1550,6 @@ "node": ">=0.10" } }, - "node_modules/date-utils": { - "version": "1.2.21", - "resolved": "https://registry.npmjs.org/date-utils/-/date-utils-1.2.21.tgz", - "integrity": "sha512-wJMBjqlwXR0Iv0wUo/lFbhSQ7MmG1hl36iuxuE91kW+5b5sWbase73manEqNH9sOLFAMG83B4ffNKq9/Iq0FVA==", - "engines": { - "node": ">0.4.0" - } - }, "node_modules/dateformat": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-2.2.0.tgz", @@ -1981,11 +1565,12 @@ "integrity": "sha512-QvzAURSbQ0pKdIye2txOzNaHmxtUBXerpY0FJsFXUMKbIZeFm5ht1LS/jFsrncjnmtv8HsG0W2g6c0zUjZWmpA==" }, "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -2017,14 +1602,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/define-lazy-prop": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", - "engines": { - "node": ">=8" - } - }, "node_modules/define-property": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", @@ -2071,14 +1648,6 @@ "node": ">= 0.8" } }, - "node_modules/dependency-graph": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.10.0.tgz", - "integrity": "sha512-c9amUgpgxSi1bE5/sbLwcs5diLD0ygCQYmhfM5H1s5VH1mCsYkcmAL3CcNdv4kdSw6JuMoHeDGzLgj/gAXdWVg==", - "engines": { - "node": ">= 0.6.0" - } - }, "node_modules/deprecated": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/deprecated/-/deprecated-0.0.1.tgz", @@ -2116,57 +1685,6 @@ "resolved": "https://registry.npmjs.org/doctypes/-/doctypes-1.1.0.tgz", "integrity": "sha512-LLBi6pEqS6Do3EKQ3J0NqHWV5hhb78Pi8vvESYwyOy2c31ZEZVdtitdzsQsKb7878PEERhzUk0ftqGhG6Mz+pQ==" }, - "node_modules/dom-serializer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", - "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ] - }, - "node_modules/domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", - "dependencies": { - "domelementtype": "^2.2.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", - "dependencies": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, "node_modules/dtrace-provider": { "version": "0.8.8", "resolved": "https://registry.npmjs.org/dtrace-provider/-/dtrace-provider-0.8.8.tgz", @@ -2180,6 +1698,20 @@ "node": ">=0.10" } }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/duplexer2": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz", @@ -2251,12 +1783,49 @@ "wrappy": "1" } }, - "node_modules/entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" } }, "node_modules/esbuild": { @@ -2310,6 +1879,7 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, "engines": { "node": ">=0.8.0" } @@ -2322,22 +1892,6 @@ "node": ">= 0.6" } }, - "node_modules/event-target-shim": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "engines": { - "node": ">=0.8.x" - } - }, "node_modules/ewma": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/ewma/-/ewma-2.0.1.tgz", @@ -2734,32 +2288,8 @@ "dependencies": { "brace-expansion": "^2.0.1" }, - "engines": { - "node": ">=10" - } - }, - "node_modules/filename-reserved-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz", - "integrity": "sha512-lc1bnsSr4L4Bdif8Xb/qrtokGbq5zlsms/CYH8PP+WtCkGNF65DPiQY8vG3SakEdRn8Dlnm+gW/qWKKjS5sZzQ==", - "engines": { - "node": ">=4" - } - }, - "node_modules/filenamify": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-4.3.0.tgz", - "integrity": "sha512-hcFKyUG57yWGAzu1CMt/dPzYZuv+jAJUT85bL8mrXvNe6hWj6yEHEc4EdcgiA6Z3oi1/9wXJdZPXF2dZNgwgOg==", - "dependencies": { - "filename-reserved-regex": "^2.0.0", - "strip-outer": "^1.0.1", - "trim-repeated": "^1.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=10" } }, "node_modules/fill-range": { @@ -2897,15 +2427,16 @@ } }, "node_modules/follow-redirects": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", + "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", "funding": [ { "type": "individual", "url": "https://github.com/sponsors/RubenVerborgh" } ], + "license": "MIT", "engines": { "node": ">=4.0" }, @@ -2936,19 +2467,6 @@ "node": ">=0.10.0" } }, - "node_modules/form-data": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", - "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 0.12" - } - }, "node_modules/formidable": { "version": "1.2.6", "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.6.tgz", @@ -2991,42 +2509,20 @@ "resolved": "https://registry.npmjs.org/fs/-/fs-0.0.1-security.tgz", "integrity": "sha512-3XY9e1pP0CVEUCdj5BmfIZxRBTSDycnbqhIOGec9QYtmVH2fbLpj86CFWkrNOkt/Fvty4KZG5lTglL9j/gJ87w==" }, - "node_modules/fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", - "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", "dev": true }, - "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/gaze": { "version": "0.5.2", @@ -3041,19 +2537,42 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", - "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3" + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/get-stream": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", @@ -3354,10 +2873,17 @@ "node": ">= 0.10" } }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/gulp": { "version": "3.9.1", @@ -3542,21 +3068,11 @@ "node": ">= 0.10" } }, - "node_modules/has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -3565,11 +3081,12 @@ } }, "node_modules/has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", "dependencies": { - "has-symbols": "^1.0.2" + "has-symbols": "^1.0.3" }, "engines": { "node": ">= 0.4" @@ -3617,6 +3134,18 @@ "node": ">=0.10.0" } }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/homedir-polyfill": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", @@ -3672,24 +3201,6 @@ "safe-buffer": "~5.1.0" } }, - "node_modules/htmlparser2": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", - "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.0.0", - "domutils": "^2.5.2", - "entities": "^2.0.0" - } - }, "node_modules/http-deceiver": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", @@ -3710,19 +3221,6 @@ "node": ">= 0.8" } }, - "node_modules/http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", - "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/http-signature": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.3.6.tgz", @@ -3736,18 +3234,6 @@ "node": ">=0.10" } }, - "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -3881,20 +3367,6 @@ "node": ">=0.10.0" } }, - "node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/is-expression": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/is-expression/-/is-expression-4.0.0.tgz", @@ -4064,17 +3536,6 @@ "node": ">=0.10.0" } }, - "node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dependencies": { - "is-docker": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/isarray": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", @@ -4167,6 +3628,15 @@ "node": ">=8" } }, + "node_modules/jose": { + "version": "4.15.9", + "resolved": "https://registry.npmjs.org/jose/-/jose-4.15.9.tgz", + "integrity": "sha512-1vUQX+IdDMVPj4k8kOxgUqlcK518yluMuGZwqlr44FS1ppZB/5GWh4rZG89erpOBOJjU/OBsnCVFfapsRz6nEA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, "node_modules/js-stringify": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/js-stringify/-/js-stringify-1.0.2.tgz", @@ -4193,23 +3663,22 @@ "node": ">=6" } }, - "node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, "node_modules/jsonwebtoken": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.1.tgz", - "integrity": "sha512-K8wx7eJ5TPvEjuiVSkv167EVboBDv9PZdDoF7BgeQnBLVvZWW9clr2PsQHVJDTKaEIH5JBIwHujGcHp7GgI2eg==", + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", + "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==", + "license": "MIT", "dependencies": { "jws": "^3.2.2", - "lodash": "^4.17.21", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", "ms": "^2.1.1", - "semver": "^7.3.8" + "semver": "^7.5.4" }, "engines": { "node": ">=12", @@ -4296,23 +3765,21 @@ "promise": "^7.0.1" } }, - "node_modules/jwa": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz", - "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==", - "dependencies": { - "buffer-equal-constant-time": "1.0.1", - "ecdsa-sig-formatter": "1.0.11", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/jws": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz", - "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==", + "node_modules/jwks-rsa": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jwks-rsa/-/jwks-rsa-3.2.0.tgz", + "integrity": "sha512-PwchfHcQK/5PSydeKCs1ylNym0w/SSv8a62DgHJ//7x2ZclCoinlsjAfDxAAbpoTPybOum/Jgy+vkvMmKz89Ww==", + "license": "MIT", "dependencies": { - "jwa": "^2.0.0", - "safe-buffer": "^5.0.1" + "@types/express": "^4.17.20", + "@types/jsonwebtoken": "^9.0.4", + "debug": "^4.3.4", + "jose": "^4.15.4", + "limiter": "^1.1.5", + "lru-memoizer": "^2.2.0" + }, + "engines": { + "node": ">=14" } }, "node_modules/kind-of": { @@ -4343,6 +3810,11 @@ "node": ">= 0.8" } }, + "node_modules/limiter": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/limiter/-/limiter-1.1.5.tgz", + "integrity": "sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA==" + }, "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", @@ -4402,6 +3874,12 @@ "integrity": "sha512-O0pWuFSK6x4EXhM1dhZ8gchNtG7JMqBtrHdoUFUWXD7dJnNSUze1GuyQr5sOs0aCvgGeI3o/OJW8f4ca7FDxmQ==", "dev": true }, + "node_modules/lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==", + "license": "MIT" + }, "node_modules/lodash.escape": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-3.2.0.tgz", @@ -4411,6 +3889,12 @@ "lodash._root": "^3.0.0" } }, + "node_modules/lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==", + "license": "MIT" + }, "node_modules/lodash.isarguments": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", @@ -4423,11 +3907,41 @@ "integrity": "sha512-JwObCrNJuT0Nnbuecmqr5DgtuBppuCvGD9lxjFpAzwnVtdGoDQ1zig+5W8k5/6Gcn0gZ3936HDAlGd28i7sOGQ==", "dev": true }, + "node_modules/lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==", + "license": "MIT" + }, "node_modules/lodash.isequal": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==" }, + "node_modules/lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==", + "license": "MIT" + }, + "node_modules/lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==", + "license": "MIT" + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", + "license": "MIT" + }, + "node_modules/lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", + "license": "MIT" + }, "node_modules/lodash.keys": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", @@ -4439,6 +3953,12 @@ "lodash.isarray": "^3.0.0" } }, + "node_modules/lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", + "license": "MIT" + }, "node_modules/lodash.restparam": { "version": "3.6.1", "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", @@ -4480,6 +4000,34 @@ "yallist": "^3.0.2" } }, + "node_modules/lru-memoizer": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/lru-memoizer/-/lru-memoizer-2.3.0.tgz", + "integrity": "sha512-GXn7gyHAMhO13WSKrIiNfztwxodVsP8IoZ3XfrJV4yH2x0/OeTO/FIaAHTY5YekdGgW94njfuKmyyt1E0mR6Ug==", + "license": "MIT", + "dependencies": { + "lodash.clonedeep": "^4.5.0", + "lru-cache": "6.0.0" + } + }, + "node_modules/lru-memoizer/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/lru-memoizer/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "license": "ISC" + }, "node_modules/make-iterator": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", @@ -4513,6 +4061,15 @@ "node": ">=0.10.0" } }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", @@ -4656,9 +4213,10 @@ } }, "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" }, "node_modules/multipipe": { "version": "0.1.2", @@ -5043,22 +4601,6 @@ "wrappy": "1" } }, - "node_modules/open": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", - "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", - "dependencies": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/orchestrator": { "version": "0.3.8", "resolved": "https://registry.npmjs.org/orchestrator/-/orchestrator-0.3.8.tgz", @@ -5343,6 +4885,12 @@ "node": ">= 0.10" } }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "license": "MIT" + }, "node_modules/pstree.remy": { "version": "1.1.8", "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", @@ -5806,11 +5354,6 @@ "rimraf": "bin.js" } }, - "node_modules/rsa-pem-from-mod-exp": { - "version": "0.8.6", - "resolved": "https://registry.npmjs.org/rsa-pem-from-mod-exp/-/rsa-pem-from-mod-exp-0.8.6.tgz", - "integrity": "sha512-c5ouQkOvGHF1qomUUDJGFcXsomeSO2gbEs6hVhMAtlkE1CuaZase/WzoaKFG/EZQuNmq6pw/EMCeEnDvOgCJYQ==" - }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -5866,11 +5409,6 @@ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, - "node_modules/sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" - }, "node_modules/select-hose": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", @@ -5937,11 +5475,6 @@ "node": ">=4" } }, - "node_modules/send/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, "node_modules/sequencify": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/sequencify/-/sequencify-0.0.7.tgz", @@ -6460,15 +5993,6 @@ "node": ">= 0.8" } }, - "node_modules/stoppable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/stoppable/-/stoppable-1.1.0.tgz", - "integrity": "sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==", - "engines": { - "node": ">=4", - "npm": ">=6" - } - }, "node_modules/stream-consume": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/stream-consume/-/stream-consume-0.1.1.tgz", @@ -6517,17 +6041,6 @@ "node": ">=0.10.0" } }, - "node_modules/strip-outer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz", - "integrity": "sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==", - "dependencies": { - "escape-string-regexp": "^1.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/strnum": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", @@ -6709,29 +6222,11 @@ "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" }, - "node_modules/trim-repeated": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz", - "integrity": "sha512-pkonvlKk8/ZuR0D5tLW8ljt5I8kmxp2XKymhepUeOdCEfKpZaktSArkLHZt76OB1ZvO9bssUsDty4SWhLvZpLg==", - "dependencies": { - "escape-string-regexp": "^1.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/tslib": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", - "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==" - }, - "node_modules/tunnel": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", - "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==", - "engines": { - "node": ">=0.6.11 <=0.7.0 || >=0.7.3" - } + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" }, "node_modules/tweetnacl": { "version": "0.14.5", @@ -6764,11 +6259,6 @@ "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==" }, - "node_modules/underscore": { - "version": "1.13.6", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz", - "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==" - }, "node_modules/union-value": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", @@ -6808,14 +6298,6 @@ "integrity": "sha512-L8KM6TdpsoBk6TJTXevbmpub3bATS06Znu3BcfVPVQkFtnh1MFeCZ3gFKCQcji7f7YYiigsO5OR99vqhoNT8nQ==", "dev": true }, - "node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "engines": { - "node": ">= 4.0.0" - } - }, "node_modules/unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", @@ -7131,46 +6613,6 @@ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, - "node_modules/ws": { - "version": "7.5.9", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", - "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/xml2js": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.5.0.tgz", - "integrity": "sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==", - "dependencies": { - "sax": ">=0.6.0", - "xmlbuilder": "~11.0.0" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/xmlbuilder": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", - "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", - "engines": { - "node": ">=4.0" - } - }, "node_modules/xpath": { "version": "0.0.32", "resolved": "https://registry.npmjs.org/xpath/-/xpath-0.0.32.tgz", @@ -7179,14 +6621,6 @@ "node": ">=0.6.0" } }, - "node_modules/xpath.js": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/xpath.js/-/xpath.js-1.1.0.tgz", - "integrity": "sha512-jg+qkfS4K8E7965sqaUl8mRngXiKb3WZGfONgE18pr03FUQiuSV6G+Ej4tS55B+rIQSFEIw3phdVAQ4pPqNWfQ==", - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", @@ -7211,9 +6645,13 @@ } }, "node_modules/zod": { - "version": "1.11.17", - "resolved": "https://registry.npmjs.org/zod/-/zod-1.11.17.tgz", - "integrity": "sha512-UzIwO92D0dSFwIRyyqAfRXICITLjF0IP8tRbEK/un7adirMssWZx8xF/1hZNE7t61knWZ+lhEuUvxlu2MO8qqA==" + "version": "3.25.76", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } } } } diff --git a/samples/graph-chat-lifecycle/nodejs/package.json b/samples/graph-chat-lifecycle/nodejs/package.json index aa5d28756a..c5615e79f1 100644 --- a/samples/graph-chat-lifecycle/nodejs/package.json +++ b/samples/graph-chat-lifecycle/nodejs/package.json @@ -20,14 +20,16 @@ }, "homepage": "https://docs.microsoft.com/en-us/microsoftteams/platform/get-started/get-started-nodejs", "dependencies": { + "@microsoft/agents-hosting": "^1.0.15", + "@microsoft/agents-hosting-extensions-teams": "^1.0.15", "@microsoft/microsoft-graph-client": "^3.0.4", "@microsoft/teams-js": "^2.5.0", "adaptive-expressions": "^4.19.3", "adaptivecards-templating": "^2.3.1", "body-parser": "^1.19.0", - "botbuilder": "^4.18.0", "config": "^3.3.8", "cors": "^2.8.5", + "zod": "^3.22.4", "ejs": "^3.1.6", "express": "^4.17.1", "faker": "^4.1.0", diff --git a/samples/graph-chat-lifecycle/nodejs/src/app.js b/samples/graph-chat-lifecycle/nodejs/src/app.js index 63ac894db3..ecf6e583c6 100644 --- a/samples/graph-chat-lifecycle/nodejs/src/app.js +++ b/samples/graph-chat-lifecycle/nodejs/src/app.js @@ -26,6 +26,7 @@ server.set("views", __dirname + "/views"); server.engine('html', require('ejs').renderFile); server.use(bodyParser.urlencoded({ extended: false })); server.get('/tab', (req, res) => { res.render('chatLifecycle.html') }); +server.get('/chatLifecycle', (req, res) => { res.render('chatLifecycle.html') }); server.post('/api/getAdaptiveCard', Helper.getAdaptiveCard); server.post('/api/createGroupChat', Helper.createGroupChat); @@ -58,7 +59,14 @@ server.get('/auth/auth-end', function (req, res) { server.post('/auth/token', function (req, res) { const tid = req.body.tid; const token = req.body.token; - var scopes = ["https://graph.microsoft.com/User.Read"]; + var scopes = [ + "https://graph.microsoft.com/User.Read", + "https://graph.microsoft.com/User.ReadBasic.All", + "https://graph.microsoft.com/Chat.Create", + "https://graph.microsoft.com/Chat.ReadWrite", + "https://graph.microsoft.com/TeamsAppInstallation.ReadWriteForChat", + "https://graph.microsoft.com/TeamsTab.ReadWriteForChat" + ]; var oboPromise = new Promise((resolve, reject) => { const url = "https://login.microsoftonline.com/" + tid + "/oauth2/v2.0/token"; @@ -71,6 +79,10 @@ server.post('/auth/token', function (req, res) { scope: scopes.join(" ") }; + console.log('OBO Token Request for tenant:', tid); + console.log('Client ID:', config["tab"]["appId"]); + console.log('Scopes:', scopes.join(" ")); + fetch(url, { method: "POST", body: querystring.stringify(params), @@ -81,22 +93,43 @@ server.post('/auth/token', function (req, res) { }).then(result => { if (result.status !== 200) { result.json().then(json => { - // TODO: Check explicitly for invalid_grant or interaction_required - reject({ "error": json.error }); + console.error('OBO Token Error Response:', JSON.stringify(json, null, 2)); + console.error('Status Code:', result.status); + // Check explicitly for invalid_grant or interaction_required + if (json.error === 'invalid_grant' || json.error === 'interaction_required') { + reject({ "error": json.error, "error_description": json.error_description, "error_codes": json.error_codes }); + } else { + reject({ "error": json.error, "error_description": json.error_description }); + } + }).catch(parseError => { + console.error('Error parsing error response:', parseError); + reject({ "error": "parse_error", "error_description": "Failed to parse error response" }); }); } else { result.json().then(json => { + console.log('OBO Token Success'); resolve(json.access_token); + }).catch(parseError => { + console.error('Error parsing success response:', parseError); + reject({ "error": "parse_error", "error_description": "Failed to parse success response" }); }); } + }).catch(fetchError => { + console.error('Fetch Error:', fetchError); + reject({ "error": "network_error", "error_description": fetchError.message }); }); }); oboPromise.then(function (result) { res.json(result); }, function (err) { - console.log(err); // Error: "It broke" - res.json(err); + console.error('Final Error:', err); + // Return 401 for consent_required or interaction_required errors + if (err.error === 'invalid_grant' || err.error === 'interaction_required') { + res.status(401).json(err); + } else { + res.status(500).json(err); + } }); }); diff --git a/samples/graph-chat-lifecycle/nodejs/src/static/scripts/auth.js b/samples/graph-chat-lifecycle/nodejs/src/static/scripts/auth.js index 4541036b36..7d5c26386b 100644 --- a/samples/graph-chat-lifecycle/nodejs/src/static/scripts/auth.js +++ b/samples/graph-chat-lifecycle/nodejs/src/static/scripts/auth.js @@ -10,8 +10,10 @@ getClientSideToken() return useServerSideToken(serverSideToken); }) .catch((error) => { - if (error === "invalid_grant") { - display(`Error: ${error} - user or admin consent required`); + console.error("Authentication error:", error); + // Check for consent_required or invalid_grant errors + if (error === "invalid_grant" || (typeof error === 'object' && error.error === "invalid_grant")) { + display(`Error: Consent required - please click the button below to grant permissions`); // Display in-line button so user can consent button = display("Consent", "button"); button.onclick = (() => { @@ -73,16 +75,23 @@ function getServerSideToken(clientSideToken) { cache: 'default' }) .then((response) => { - console.log(response); + console.log('Token response:', response); if (response.ok) { return response.json(); } else { - reject(response.error); + // Parse error response + return response.json().then(errorData => { + throw errorData; + }); } }) .then((responseJson) => { + console.log('Response JSON:', responseJson); if (responseJson.error) { - reject(responseJson.error); + reject(responseJson); + } else if (responseJson.error_description) { + // Handle detailed error responses + reject(responseJson); } else { serverSideToken = responseJson; localStorage.setItem("accessToken", serverSideToken); @@ -91,6 +100,10 @@ function getServerSideToken(clientSideToken) { button.disabled = true; resolve(serverSideToken); } + }) + .catch((error) => { + console.error('Fetch error:', error); + reject(error); }); }); }); diff --git a/samples/graph-chat-lifecycle/nodejs/src/views/auth-end.html b/samples/graph-chat-lifecycle/nodejs/src/views/auth-end.html index 1550d00f0b..482b6cbb31 100644 --- a/samples/graph-chat-lifecycle/nodejs/src/views/auth-end.html +++ b/samples/graph-chat-lifecycle/nodejs/src/views/auth-end.html @@ -18,7 +18,7 @@ const msalConfig = { auth: { clientId: <%-clientId%>, - authority: `https://login.microsoftonline.com/${context.tid}`, + authority: `https://login.microsoftonline.com/${context.user.tenant.id}`, navigateToLoginRequestUrl: false }, cache: { @@ -26,7 +26,7 @@ }, } - const msalInstance = new window.msal.PublicClientApplication(msalConfig);2 + const msalInstance = new window.msal.PublicClientApplication(msalConfig); msalInstance.handleRedirectPromise() .then((tokenResponse) => { diff --git a/samples/graph-chat-lifecycle/nodejs/src/views/auth-start.html b/samples/graph-chat-lifecycle/nodejs/src/views/auth-start.html index ed3266b3f0..6a331a49c2 100644 --- a/samples/graph-chat-lifecycle/nodejs/src/views/auth-start.html +++ b/samples/graph-chat-lifecycle/nodejs/src/views/auth-start.html @@ -14,7 +14,7 @@ // Get the tab context, and use the information to navigate to Azure AD login page microsoftTeams.app.getContext().then(async (context) => { var currentURL = new URL(window.location); - var scope = "User.Read email openid profile offline_access"; + var scope = "User.Read User.ReadBasic.All Chat.Create Chat.ReadWrite TeamsAppInstallation.ReadWriteForChat TeamsTab.ReadWriteForChat email openid profile offline_access"; var loginHint = context.user.loginHint; const msalConfig = { diff --git a/samples/graph-chat-lifecycle/python/Images/1.Install.png b/samples/graph-chat-lifecycle/python/Images/1.Install.png new file mode 100644 index 0000000000..6beb70780f Binary files /dev/null and b/samples/graph-chat-lifecycle/python/Images/1.Install.png differ diff --git a/samples/graph-chat-lifecycle/python/Images/10.Outlook_Tab_Loaded_Successfully.png b/samples/graph-chat-lifecycle/python/Images/10.Outlook_Tab_Loaded_Successfully.png new file mode 100644 index 0000000000..ff43855d63 Binary files /dev/null and b/samples/graph-chat-lifecycle/python/Images/10.Outlook_Tab_Loaded_Successfully.png differ diff --git a/samples/graph-chat-lifecycle/python/Images/11.M365_Copilot_Select_App.png b/samples/graph-chat-lifecycle/python/Images/11.M365_Copilot_Select_App.png new file mode 100644 index 0000000000..1b281dd683 Binary files /dev/null and b/samples/graph-chat-lifecycle/python/Images/11.M365_Copilot_Select_App.png differ diff --git a/samples/graph-chat-lifecycle/python/Images/12.M365_Copilot_Click_Continue.png b/samples/graph-chat-lifecycle/python/Images/12.M365_Copilot_Click_Continue.png new file mode 100644 index 0000000000..c277b2aa83 Binary files /dev/null and b/samples/graph-chat-lifecycle/python/Images/12.M365_Copilot_Click_Continue.png differ diff --git a/samples/graph-chat-lifecycle/python/Images/13.M365_Copilot_Tab_Loaded_Successfully.png b/samples/graph-chat-lifecycle/python/Images/13.M365_Copilot_Tab_Loaded_Successfully.png new file mode 100644 index 0000000000..ae481b06d4 Binary files /dev/null and b/samples/graph-chat-lifecycle/python/Images/13.M365_Copilot_Tab_Loaded_Successfully.png differ diff --git a/samples/graph-chat-lifecycle/python/Images/2.Add_To_Teams.png b/samples/graph-chat-lifecycle/python/Images/2.Add_To_Teams.png new file mode 100644 index 0000000000..08a5d52087 Binary files /dev/null and b/samples/graph-chat-lifecycle/python/Images/2.Add_To_Teams.png differ diff --git a/samples/graph-chat-lifecycle/python/Images/3.Configurable.png b/samples/graph-chat-lifecycle/python/Images/3.Configurable.png new file mode 100644 index 0000000000..7a2b166e01 Binary files /dev/null and b/samples/graph-chat-lifecycle/python/Images/3.Configurable.png differ diff --git a/samples/graph-chat-lifecycle/python/Images/3.Configurable_Tab.png b/samples/graph-chat-lifecycle/python/Images/3.Configurable_Tab.png new file mode 100644 index 0000000000..7a2b166e01 Binary files /dev/null and b/samples/graph-chat-lifecycle/python/Images/3.Configurable_Tab.png differ diff --git a/samples/graph-chat-lifecycle/python/Images/4.Tab_Configured_Successfully.png b/samples/graph-chat-lifecycle/python/Images/4.Tab_Configured_Successfully.png new file mode 100644 index 0000000000..f1e01fc318 Binary files /dev/null and b/samples/graph-chat-lifecycle/python/Images/4.Tab_Configured_Successfully.png differ diff --git a/samples/graph-chat-lifecycle/python/Images/5.Create_GC_Of_Selected_Members.png b/samples/graph-chat-lifecycle/python/Images/5.Create_GC_Of_Selected_Members.png new file mode 100644 index 0000000000..6665c577d9 Binary files /dev/null and b/samples/graph-chat-lifecycle/python/Images/5.Create_GC_Of_Selected_Members.png differ diff --git a/samples/graph-chat-lifecycle/python/Images/6.GC_Created_Successfully.png b/samples/graph-chat-lifecycle/python/Images/6.GC_Created_Successfully.png new file mode 100644 index 0000000000..f08c93287b Binary files /dev/null and b/samples/graph-chat-lifecycle/python/Images/6.GC_Created_Successfully.png differ diff --git a/samples/graph-chat-lifecycle/python/Images/7.Created_Group_From_Python.png b/samples/graph-chat-lifecycle/python/Images/7.Created_Group_From_Python.png new file mode 100644 index 0000000000..1be36e50b6 Binary files /dev/null and b/samples/graph-chat-lifecycle/python/Images/7.Created_Group_From_Python.png differ diff --git a/samples/graph-chat-lifecycle/python/Images/8.Outlook_Select_App.png b/samples/graph-chat-lifecycle/python/Images/8.Outlook_Select_App.png new file mode 100644 index 0000000000..d54e422c7d Binary files /dev/null and b/samples/graph-chat-lifecycle/python/Images/8.Outlook_Select_App.png differ diff --git a/samples/graph-chat-lifecycle/python/Images/9.Outlook_Click_Continue.png b/samples/graph-chat-lifecycle/python/Images/9.Outlook_Click_Continue.png new file mode 100644 index 0000000000..77e46b0e76 Binary files /dev/null and b/samples/graph-chat-lifecycle/python/Images/9.Outlook_Click_Continue.png differ diff --git a/samples/graph-chat-lifecycle/python/Images/CreateGroup.png b/samples/graph-chat-lifecycle/python/Images/CreateGroup.png deleted file mode 100644 index 04403ae08f..0000000000 Binary files a/samples/graph-chat-lifecycle/python/Images/CreateGroup.png and /dev/null differ diff --git a/samples/graph-chat-lifecycle/python/Images/GraphChatLifecycleGif.gif b/samples/graph-chat-lifecycle/python/Images/GraphChatLifecycleGif.gif index f50c0b5bc3..317271cabd 100644 Binary files a/samples/graph-chat-lifecycle/python/Images/GraphChatLifecycleGif.gif and b/samples/graph-chat-lifecycle/python/Images/GraphChatLifecycleGif.gif differ diff --git a/samples/graph-chat-lifecycle/python/Images/GroupChat.png b/samples/graph-chat-lifecycle/python/Images/GroupChat.png deleted file mode 100644 index 318b0fb8f3..0000000000 Binary files a/samples/graph-chat-lifecycle/python/Images/GroupChat.png and /dev/null differ diff --git a/samples/graph-chat-lifecycle/python/Images/OpenApp.png b/samples/graph-chat-lifecycle/python/Images/OpenApp.png deleted file mode 100644 index e8e9269641..0000000000 Binary files a/samples/graph-chat-lifecycle/python/Images/OpenApp.png and /dev/null differ diff --git a/samples/graph-chat-lifecycle/python/Images/Save.png b/samples/graph-chat-lifecycle/python/Images/Save.png deleted file mode 100644 index d8a052aa13..0000000000 Binary files a/samples/graph-chat-lifecycle/python/Images/Save.png and /dev/null differ diff --git a/samples/graph-chat-lifecycle/python/Images/TabView.png b/samples/graph-chat-lifecycle/python/Images/TabView.png deleted file mode 100644 index dddc9e8ea2..0000000000 Binary files a/samples/graph-chat-lifecycle/python/Images/TabView.png and /dev/null differ diff --git a/samples/graph-chat-lifecycle/python/README.md b/samples/graph-chat-lifecycle/python/README.md index 721fbdd10b..1763502b76 100644 --- a/samples/graph-chat-lifecycle/python/README.md +++ b/samples/graph-chat-lifecycle/python/README.md @@ -1,26 +1,12 @@ --- page_type: sample +description: This sample demonstrates how to manage the chat lifecycle in Microsoft Teams using Python and Microsoft Graph APIs, including creating chats, adding members, and deleting members. products: - office-teams - office - office-365 languages: - python - -## Run the app (Manually Uploading to Teams) - -> Note these instructions are for running the sample on your local machine, the tunneling solution is required because -the Teams service needs to call into the app. - -1) Clone the repository - - ```bash - git clone https://github.com/OfficeDev/Microsoft-Teams-Samples.git - ``` - -2) Run ngrok - point to port 3978ation (client) ID, Directory (tenant) ID**. You'll need those later when updating your Teams application manifest and in the config.py.hon -title: Microsoft Teams Python Chat Lifecycle Sample -description: This sample demonstrates how to manage the chat lifecycle in Microsoft Teams using Python and Microsoft Graph APIs, including creating chats, adding members, and deleting members. extensions: contentType: samples createdDate: "07/07/2021 01:38:26 PM" @@ -35,10 +21,11 @@ This sample application showcases the management of chat lifecycles in Microsoft * Tabs * Adaptive Cards * Graph API +* Agent SDK ## Interaction with app -![](Images/GraphChatLifecycleGif.gif) +![Graph-Chat-LifeCycle](Images/GraphChatLifecycleGif.gif) ## Prerequisites @@ -154,24 +141,58 @@ The simplest way to run this sample in Teams is to use Microsoft 365 Agents Tool ## Running the sample -1. In Teams, Install App +**1. Install App in Teams** + +![Install App](Images/1.Install.png) + +**2. Add App to Teams** + +![Add to Teams](Images/2.Add_To_Teams.png) + +**3. Configure Tab** + +![Configurable Tab](Images/3.Configurable_Tab.png) + +**4. Tab Configured Successfully** + +![Tab Configured](Images/4.Tab_Configured_Successfully.png) + +**5. Create Group Chat with Selected Members** + +![Create Group Chat](Images/5.Create_GC_Of_Selected_Members.png) + +**6. Group Chat Created Successfully** + +![Group Chat Created](Images/6.GC_Created_Successfully.png) + +**7. Group Created from Python Sample** + +![Created Group](Images/7.Created_Group_From_Python.png) + +**8. Select App in Outlook** + +![Outlook Select App](Images/8.Outlook_Select_App.png) + +**9. Click Continue in Outlook** + +![Outlook Continue](Images/9.Outlook_Click_Continue.png) + +**10. Outlook Tab Loaded Successfully** + +![Outlook Tab Loaded](Images/10.Outlook_Tab_Loaded_Successfully.png) - ![](Images/OpenApp.png) +**11. Select App in M365 Copilot** - ![](Images/Save.png) - -2. In Teams, Once the app is successfully installed, it can be opened in the tab and has option to create group chat if user is authenticated. +![M365 Copilot Select App](Images/11.M365_Copilot_Select_App.png) - ![](Images/TabView.png) +**12. Click Continue in M365 Copilot** -3. Once create group chat is clicked, user will be able to add Title of the groupchat and select users from drop down to create a group chat and add members (using different scenarios) and delete member accordingly to depict the lifecycle of chat. +![M365 Copilot Continue](Images/12.M365_Copilot_Click_Continue.png) - ![](Images/CreateGroup.png) +**13. M365 Copilot Tab Loaded Successfully** -4. Also, Polly app will be installed to the created group chat and will be pinned to the chat. +![M365 Copilot Tab Loaded](Images/13.M365_Copilot_Tab_Loaded_Successfully.png) - ![](Images/GroupChat.png) - ## Further reading diff --git a/samples/graph-chat-lifecycle/python/app.py b/samples/graph-chat-lifecycle/python/app.py index 3cf092da8b..4c7630eb86 100644 --- a/samples/graph-chat-lifecycle/python/app.py +++ b/samples/graph-chat-lifecycle/python/app.py @@ -1,3 +1,6 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. + import os from flask import Flask, render_template, request, jsonify, send_file import requests @@ -41,7 +44,7 @@ def auth_end(): def obo_token(): tid = request.json.get("tid") token = request.json.get("token") - scopes = ["https://graph.microsoft.com/User.Read"] + scopes = ["https://graph.microsoft.com/User.Read.All", "https://graph.microsoft.com/Chat.ReadWrite"] app_id = config.APP_ID app_secret = config.APP_PASSWORD @@ -65,7 +68,20 @@ def obo_token(): response.raise_for_status() return jsonify(response.json().get("access_token")) except requests.RequestException as err: - return jsonify({"error": str(err)}), 400 + error_msg = str(err) + # Check if response contains JSON error details + if hasattr(err, 'response') and err.response is not None: + try: + error_json = err.response.json() + error_code = error_json.get("error", "") + error_desc = error_json.get("error_description", "") + print(f"Token exchange error - Code: {error_code}, Description: {error_desc}") + # Return just the error code for client-side handling + return jsonify({"error": error_code}), 400 + except: + error_msg = f"{err.response.status_code}: {err.response.text}" + print(f"Token exchange error: {error_msg}") + return jsonify({"error": error_msg}), 400 if __name__ == "__main__": app.run(host="0.0.0.0", port=PORT) diff --git a/samples/graph-chat-lifecycle/python/appManifest/manifest.json b/samples/graph-chat-lifecycle/python/appManifest/manifest.json index f31a82200e..cb138de7b0 100644 --- a/samples/graph-chat-lifecycle/python/appManifest/manifest.json +++ b/samples/graph-chat-lifecycle/python/appManifest/manifest.json @@ -37,7 +37,8 @@ "configurationUrl": "https://${{BOT_DOMAIN}}/configure", "canUpdateConfiguration": true, "scopes": [ - "team" + "team", + "groupChat" ] } ], diff --git a/samples/graph-chat-lifecycle/python/assets/sample.json b/samples/graph-chat-lifecycle/python/assets/sample.json index 50d557499d..6860453ad0 100644 --- a/samples/graph-chat-lifecycle/python/assets/sample.json +++ b/samples/graph-chat-lifecycle/python/assets/sample.json @@ -9,7 +9,7 @@ "This sample application illustrates the full lifecycle of chats in Microsoft Teams, allowing users to create chats, add and remove members, and interact with the application using Microsoft Graph APIs. Built with python, it features tabs, adaptive cards, and a seamless setup process using the Teams Toolkit for Visual Studio Code." ], "creationDateTime": "2025-07-11", - "updateDateTime": "2025-07-11", + "updateDateTime": "2025-11-28", "products": [ "Teams" ], diff --git a/samples/graph-chat-lifecycle/python/config.py b/samples/graph-chat-lifecycle/python/config.py index b02f14ae5f..581c63b792 100644 --- a/samples/graph-chat-lifecycle/python/config.py +++ b/samples/graph-chat-lifecycle/python/config.py @@ -1,4 +1,3 @@ -#!/usr/bin/env python3 # Copyright (c) Microsoft Corporation. All rights reserved. # Licensed under the MIT License. diff --git a/samples/graph-chat-lifecycle/python/helpers/chatHelper.py b/samples/graph-chat-lifecycle/python/helpers/chatHelper.py index ffa167a492..5dc1b601bb 100644 --- a/samples/graph-chat-lifecycle/python/helpers/chatHelper.py +++ b/samples/graph-chat-lifecycle/python/helpers/chatHelper.py @@ -1,3 +1,6 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. + import os import json import requests @@ -33,6 +36,9 @@ def get_adaptive_card(req): return jsonify({"type": "AdaptiveCard", "content": card}) except Exception as e: + print(f"Error in get_adaptive_card: {str(e)}") + import traceback + traceback.print_exc() return jsonify({"error": str(e)}), 500 def create_group_chat(req): @@ -42,6 +48,7 @@ def create_group_chat(req): title = req.json.get("title") try: + print(f"Creating group chat with title: {title}, users: {user_ids}, main user: {user_id_main}") client_headers = HEADERS(token) chat_payload = { @@ -100,6 +107,9 @@ def create_group_chat(req): return jsonify(True) except Exception as e: + print(f"Error in create_group_chat: {str(e)}") + import traceback + traceback.print_exc() return jsonify({"error": str(e)}), 500 diff --git a/samples/graph-chat-lifecycle/python/requirements.txt b/samples/graph-chat-lifecycle/python/requirements.txt index 05f1986c8a..27666fed85 100644 --- a/samples/graph-chat-lifecycle/python/requirements.txt +++ b/samples/graph-chat-lifecycle/python/requirements.txt @@ -1,3 +1,2 @@ requests==2.32.3 -botbuilder-integration-aiohttp>=4.16.2 flask==3.1.1 \ No newline at end of file diff --git a/samples/graph-chat-lifecycle/python/src/views/auth-end.html b/samples/graph-chat-lifecycle/python/src/views/auth-end.html index 089ae77167..b46ba80842 100644 --- a/samples/graph-chat-lifecycle/python/src/views/auth-end.html +++ b/samples/graph-chat-lifecycle/python/src/views/auth-end.html @@ -1,3 +1,7 @@ + + + @@ -6,42 +10,42 @@ - - - - - + + + + + \ No newline at end of file diff --git a/samples/graph-chat-lifecycle/python/src/views/auth-start.html b/samples/graph-chat-lifecycle/python/src/views/auth-start.html index 5d43f75c4e..1e6963eae6 100644 --- a/samples/graph-chat-lifecycle/python/src/views/auth-start.html +++ b/samples/graph-chat-lifecycle/python/src/views/auth-start.html @@ -1,7 +1,12 @@ + + + Auth Start Page + - + \ No newline at end of file diff --git a/samples/graph-chat-lifecycle/python/src/views/chatLifecycle.html b/samples/graph-chat-lifecycle/python/src/views/chatLifecycle.html index 7a93916c04..1d1b9270ed 100644 --- a/samples/graph-chat-lifecycle/python/src/views/chatLifecycle.html +++ b/samples/graph-chat-lifecycle/python/src/views/chatLifecycle.html @@ -1,3 +1,6 @@ + + @@ -77,9 +80,9 @@ if (response.ok) { return response.json(); } else { - // Get the response text to understand the error - return response.text().then(text => { - reject(`HTTP ${response.status}: ${text}`); + // Parse error response as JSON + return response.json().then(errorJson => { + reject(errorJson.error || `HTTP ${response.status}`); }); } }) diff --git a/samples/graph-chat-lifecycle/python/src/views/configure.html b/samples/graph-chat-lifecycle/python/src/views/configure.html index b8570f358a..7ff2329413 100644 --- a/samples/graph-chat-lifecycle/python/src/views/configure.html +++ b/samples/graph-chat-lifecycle/python/src/views/configure.html @@ -1,3 +1,6 @@ + +