From 650a6a31ba2bc251ef43b2beb59eabb7f38b5a86 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 21 Nov 2024 11:01:42 -0800 Subject: [PATCH 01/19] [repo] bump: (deps): Bump the production group across 1 directory with 2 updates (#2187) #minor Bumps the production group with 2 updates in the / directory: [danielpalme/ReportGenerator-GitHub-Action](https://github.com/danielpalme/reportgenerator-github-action) and [github/codeql-action](https://github.com/github/codeql-action). Updates `danielpalme/ReportGenerator-GitHub-Action` from 5.3.11 to 5.4.1
Release notes

Sourced from danielpalme/ReportGenerator-GitHub-Action's releases.

5.4.1

5.4.0

Commits

Updates `github/codeql-action` from 3.27.0 to 3.27.4
Release notes

Sourced from github/codeql-action's releases.

v3.27.4

CodeQL Action Changelog

See the releases page for the relevant changes to the CodeQL CLI and language packs.

Note that the only difference between v2 and v3 of the CodeQL Action is the node version they support, with v3 running on node 20 while we continue to release v2 to support running on node 16. For example 3.22.11 was the first v3 release and is functionally identical to 2.22.11. This approach ensures an easy way to track exactly which features are included in different versions, indicated by the minor and patch version numbers.

3.27.4 - 14 Nov 2024

No user facing changes.

See the full CHANGELOG.md for more information.

v3.27.3

CodeQL Action Changelog

See the releases page for the relevant changes to the CodeQL CLI and language packs.

Note that the only difference between v2 and v3 of the CodeQL Action is the node version they support, with v3 running on node 20 while we continue to release v2 to support running on node 16. For example 3.22.11 was the first v3 release and is functionally identical to 2.22.11. This approach ensures an easy way to track exactly which features are included in different versions, indicated by the minor and patch version numbers.

3.27.3 - 12 Nov 2024

No user facing changes.

See the full CHANGELOG.md for more information.

v3.27.2

CodeQL Action Changelog

See the releases page for the relevant changes to the CodeQL CLI and language packs.

Note that the only difference between v2 and v3 of the CodeQL Action is the node version they support, with v3 running on node 20 while we continue to release v2 to support running on node 16. For example 3.22.11 was the first v3 release and is functionally identical to 2.22.11. This approach ensures an easy way to track exactly which features are included in different versions, indicated by the minor and patch version numbers.

3.27.2 - 12 Nov 2024

See the full CHANGELOG.md for more information.

v3.27.1

CodeQL Action Changelog

See the releases page for the relevant changes to the CodeQL CLI and language packs.

Note that the only difference between v2 and v3 of the CodeQL Action is the node version they support, with v3 running on node 20 while we continue to release v2 to support running on node 16. For example 3.22.11 was the first v3 release and is functionally identical to 2.22.11. This approach ensures an easy way to track exactly which features are included in different versions, indicated by the minor and patch version numbers.

3.27.1 - 08 Nov 2024

... (truncated)

Changelog

Sourced from github/codeql-action's changelog.

CodeQL Action Changelog

See the releases page for the relevant changes to the CodeQL CLI and language packs.

Note that the only difference between v2 and v3 of the CodeQL Action is the node version they support, with v3 running on node 20 while we continue to release v2 to support running on node 16. For example 3.22.11 was the first v3 release and is functionally identical to 2.22.11. This approach ensures an easy way to track exactly which features are included in different versions, indicated by the minor and patch version numbers.

[UNRELEASED]

No user facing changes.

3.27.4 - 14 Nov 2024

No user facing changes.

3.27.3 - 12 Nov 2024

No user facing changes.

3.27.2 - 12 Nov 2024

3.27.1 - 08 Nov 2024

3.27.0 - 22 Oct 2024

3.26.13 - 14 Oct 2024

No user facing changes.

3.26.12 - 07 Oct 2024

3.26.11 - 03 Oct 2024

... (truncated)

Commits

Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore major version` will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself) - `@dependabot ignore minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself) - `@dependabot ignore ` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself) - `@dependabot unignore ` will remove all of the ignore conditions of the specified dependency - `@dependabot unignore ` will remove the ignore condition of the specified dependency and ignore conditions
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/coverage.yml | 2 +- .github/workflows/dotnet-build-test-lint.yml | 2 +- .github/workflows/dotnet-codeql.yml | 4 ++-- .github/workflows/js-codeql.yml | 4 ++-- .github/workflows/python-codeql.yml | 4 ++-- .github/workflows/scorecards.yml | 2 +- 6 files changed, 9 insertions(+), 9 deletions(-) diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml index 7baee3d43..c67f92e4a 100644 --- a/.github/workflows/coverage.yml +++ b/.github/workflows/coverage.yml @@ -71,7 +71,7 @@ jobs: - name: Test run: dotnet test Microsoft.TeamsAI.Tests/Microsoft.Teams.AI.Tests.csproj --verbosity normal --logger trx --results-directory ./TestResults --collect:"XPlat Code Coverage" --configuration Release - name: Coverage - uses: danielpalme/ReportGenerator-GitHub-Action@62f9e70ab348d56eee76d446b4db903a85ab0ea8 # 5.3.11 + uses: danielpalme/ReportGenerator-GitHub-Action@810356ce07a94200154301fb73d878e327b2dd58 # 5.4.1 with: reports: ${{ env.SOLUTION_DIR }}TestResults/*/coverage.cobertura.xml targetdir: ${{ env.SOLUTION_DIR }}TestResults/coverage diff --git a/.github/workflows/dotnet-build-test-lint.yml b/.github/workflows/dotnet-build-test-lint.yml index 4f255d75e..e1f572d32 100644 --- a/.github/workflows/dotnet-build-test-lint.yml +++ b/.github/workflows/dotnet-build-test-lint.yml @@ -43,7 +43,7 @@ jobs: - name: Test run: dotnet test Microsoft.TeamsAI.Tests/Microsoft.Teams.AI.Tests.csproj --no-restore --verbosity normal --logger trx --results-directory ./TestResults --collect:"XPlat Code Coverage" --configuration Release - name: Coverage - uses: danielpalme/ReportGenerator-GitHub-Action@62f9e70ab348d56eee76d446b4db903a85ab0ea8 # 5.3.11 + uses: danielpalme/ReportGenerator-GitHub-Action@810356ce07a94200154301fb73d878e327b2dd58 # 5.4.1 with: reports: ${{ env.SOLUTION_DIR }}TestResults/*/coverage.cobertura.xml targetdir: ${{ env.SOLUTION_DIR }}TestResults/coverage diff --git a/.github/workflows/dotnet-codeql.yml b/.github/workflows/dotnet-codeql.yml index 7946effad..9b936e402 100644 --- a/.github/workflows/dotnet-codeql.yml +++ b/.github/workflows/dotnet-codeql.yml @@ -39,7 +39,7 @@ jobs: - name: Checkout uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Initialize CodeQL - uses: github/codeql-action/init@662472033e021d55d94146f66f6058822b0b39fd # v3.27.0 + uses: github/codeql-action/init@ea9e4e37992a54ee68a9622e985e60c8e8f12d9f # v3.27.4 with: languages: csharp - name: Setup .NET @@ -50,6 +50,6 @@ jobs: working-directory: dotnet/packages/Microsoft.TeamsAI/ run: dotnet build Microsoft.Teams.AI.sln --configuration Release - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@662472033e021d55d94146f66f6058822b0b39fd # v3.27.0 + uses: github/codeql-action/analyze@ea9e4e37992a54ee68a9622e985e60c8e8f12d9f # v3.27.4 with: category: "/language:csharp" diff --git a/.github/workflows/js-codeql.yml b/.github/workflows/js-codeql.yml index 1c0541e4b..a635d124a 100644 --- a/.github/workflows/js-codeql.yml +++ b/.github/workflows/js-codeql.yml @@ -38,10 +38,10 @@ jobs: - name: Checkout uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Initialize CodeQL - uses: github/codeql-action/init@662472033e021d55d94146f66f6058822b0b39fd # v3.27.0 + uses: github/codeql-action/init@ea9e4e37992a54ee68a9622e985e60c8e8f12d9f # v3.27.4 with: languages: javascript - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@662472033e021d55d94146f66f6058822b0b39fd # v3.27.0 + uses: github/codeql-action/analyze@ea9e4e37992a54ee68a9622e985e60c8e8f12d9f # v3.27.4 with: category: "/language:javascript" diff --git a/.github/workflows/python-codeql.yml b/.github/workflows/python-codeql.yml index 57a3a71ec..bece20cbe 100644 --- a/.github/workflows/python-codeql.yml +++ b/.github/workflows/python-codeql.yml @@ -38,10 +38,10 @@ jobs: - name: Checkout uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Initialize CodeQL - uses: github/codeql-action/init@662472033e021d55d94146f66f6058822b0b39fd # v3.27.0 + uses: github/codeql-action/init@ea9e4e37992a54ee68a9622e985e60c8e8f12d9f # v3.27.4 with: languages: python - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@662472033e021d55d94146f66f6058822b0b39fd # v3.27.0 + uses: github/codeql-action/analyze@ea9e4e37992a54ee68a9622e985e60c8e8f12d9f # v3.27.4 with: category: "/language:python" diff --git a/.github/workflows/scorecards.yml b/.github/workflows/scorecards.yml index 9d5b231b8..e9983d262 100644 --- a/.github/workflows/scorecards.yml +++ b/.github/workflows/scorecards.yml @@ -66,6 +66,6 @@ jobs: # Upload the results to GitHub's code scanning dashboard. - name: "Upload to code-scanning" - uses: github/codeql-action/upload-sarif@662472033e021d55d94146f66f6058822b0b39fd # v3.27.0 + uses: github/codeql-action/upload-sarif@ea9e4e37992a54ee68a9622e985e60c8e8f12d9f # v3.27.4 with: sarif_file: results.sarif From be7c8940201667b29748ad7270c63c41382e009c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 21 Nov 2024 11:16:54 -0800 Subject: [PATCH 02/19] [JS] bump: (deps): Bump the production group across 1 directory with 3 updates (#2189) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit #minor Bumps the production group with 3 updates in the /js directory: [@azure/msal-node](https://github.com/AzureAD/microsoft-authentication-library-for-js), [gpt-tokenizer](https://github.com/niieani/gpt-tokenizer) and [@microsoft/teams-js](https://github.com/OfficeDev/microsoft-teams-library-js/tree/HEAD/packages/teams-js). Updates `@azure/msal-node` from 2.15.0 to 2.16.1
Release notes

Sourced from @​azure/msal-node's releases.

@​azure/msal-node v2.16.1

2.16.1

Tue, 12 Nov 2024 15:32:46 GMT

Patches

  • Fixes bug where getAllAccounts always writes to the cache (shylasummers@microsoft.com)
  • Bump eslint-config-msal to v0.0.0 (beachball)
  • Bump rollup-msal to v0.0.0 (beachball)

@​azure/msal-node v2.16.0

2.16.0

Tue, 05 Nov 2024 18:58:45 GMT

Minor changes

Commits

Updates `gpt-tokenizer` from 2.5.1 to 2.6.2
Release notes

Sourced from gpt-tokenizer's releases.

2.6.2

2.6.2 (2024-11-13)

Bug Fixes

  • correct special token matching & counting (3547826)
  • unify property and variable names across the library (6030d91)

2.6.1

2.6.1 (2024-11-11)

Bug Fixes

2.6.0

2.6.0 (2024-11-04)

Bug Fixes

  • initialize encodings array in parts (aa6c71d), closes #62

Features

  • add new and update existing models (e832f9a)
  • provide comprehensive data for all OpenAI models (ec2ad7e)
Commits

Updates `@microsoft/teams-js` from 2.30.0 to 2.31.0
Release notes

Sourced from @​microsoft/teams-js's releases.

v2.31.0

Minor changes

  • Made the library treeshakable
  • Made externalAppAuthenticationForCEA.ts throw Error objects instead of SdkErrors.
  • Replaced Buffer with uint8array-extras to allow for buffer polyfill removal
  • Added validation for AppId instance in CEA APIs
  • Changed the notifySuccess function to indicate through a promise when the function finished processing in the host.
  • Added new timestamp and handler for analyzing latencies due to message delays between app and hub.

Patches

  • Add userClickTimeV2 to app Context to provide the timestamp when the user clicked the app using the performance timer API.
  • Increased the initialize response wait-timeout to 60 sec
  • Removed type: module from package.json to fix nextjs bug
  • Added validation for IActionExecuteInvokeRequest.data element in ExternalAppAuthentication and ExternalAppAuthenticationForCEA capabilities. The element can be of type primitive or plain object only
Changelog

Sourced from @​microsoft/teams-js's changelog.

2.31.0

Wed, 13 Nov 2024 19:22:01 GMT

Minor changes

  • Made the library treeshakable
  • Made externalAppAuthenticationForCEA.ts throw Error objects instead of SdkErrors.
  • Replaced Buffer with uint8array-extras to allow for buffer polyfill removal
  • Added validation for AppId instance in CEA APIs
  • Changed the notifySuccess function to indicate through a promise when the function finished processing in the host.
  • Added new timestamp and handler for analyzing latencies due to message delays between app and hub.

Patches

  • Add userClickTimeV2 to app Context to provide the timestamp when the user clicked the app using the performance timer API.
  • Increased the initialize response wait-timeout to 60 sec
  • Removed type: module from package.json to fix nextjs bug
  • Added validation for IActionExecuteInvokeRequest.data element in ExternalAppAuthentication and ExternalAppAuthenticationForCEA capabilities. The element can be of type primitive or plain object only
Commits

Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore major version` will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself) - `@dependabot ignore minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself) - `@dependabot ignore ` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself) - `@dependabot unignore ` will remove all of the ignore conditions of the specified dependency - `@dependabot unignore ` will remove the ignore condition of the specified dependency and ignore conditions
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- js/packages/teams-ai/package.json | 4 +-- .../04.ai-apps/a.teamsChefBot/package.json | 2 +- .../i.teamsChefBot-streaming/package.json | 2 +- js/yarn.lock | 31 +++++++++++-------- 4 files changed, 22 insertions(+), 17 deletions(-) diff --git a/js/packages/teams-ai/package.json b/js/packages/teams-ai/package.json index 9782cef02..7ef6f0be6 100644 --- a/js/packages/teams-ai/package.json +++ b/js/packages/teams-ai/package.json @@ -30,13 +30,13 @@ }, "dependencies": { "@azure/openai-assistants": "1.0.0-beta.6", - "@azure/msal-node": "^2.15.0", + "@azure/msal-node": "^2.16.1", "axios": "^1.7.5", "botbuilder-dialogs": "^4.23.1", "botframework-connector": "^4.23.1", "botframework-schema": "^4.23.1", "botframework-streaming": "^4.23.1", - "gpt-tokenizer": "^2.5.1", + "gpt-tokenizer": "^2.6.2", "json-colorizer": "^2.2.2", "jsonschema": "1.4.1", "uuid": "^9.0.1", diff --git a/js/samples/04.ai-apps/a.teamsChefBot/package.json b/js/samples/04.ai-apps/a.teamsChefBot/package.json index c7b46a423..3c6b1fb86 100644 --- a/js/samples/04.ai-apps/a.teamsChefBot/package.json +++ b/js/samples/04.ai-apps/a.teamsChefBot/package.json @@ -23,7 +23,7 @@ }, "dependencies": { "@microsoft/teams-ai": "~1.6.1", - "@microsoft/teams-js": "^2.30.0", + "@microsoft/teams-js": "^2.31.0", "botbuilder": "^4.23.1", "dotenv": "^16.4.5", "openai": "4.68.2", diff --git a/js/samples/04.ai-apps/i.teamsChefBot-streaming/package.json b/js/samples/04.ai-apps/i.teamsChefBot-streaming/package.json index 5fb31f7bf..27ba685c4 100644 --- a/js/samples/04.ai-apps/i.teamsChefBot-streaming/package.json +++ b/js/samples/04.ai-apps/i.teamsChefBot-streaming/package.json @@ -23,7 +23,7 @@ }, "dependencies": { "@microsoft/teams-ai": "~1.6.1", - "@microsoft/teams-js": "^2.30.0", + "@microsoft/teams-js": "^2.31.0", "botbuilder": "^4.23.1", "dotenv": "^16.4.5", "openai": "4.41.1", diff --git a/js/yarn.lock b/js/yarn.lock index 9d6b1d5ec..8b11bcf42 100644 --- a/js/yarn.lock +++ b/js/yarn.lock @@ -225,12 +225,17 @@ resolved "https://registry.yarnpkg.com/@azure/msal-common/-/msal-common-14.15.0.tgz#0e27ac0bb88fe100f4f8d1605b64d5c268636a55" integrity sha512-ImAQHxmpMneJ/4S8BRFhjt1MZ3bppmpRPYYNyzeQPeFN288YKbb8TmmISQEbtfkQ1BPASvYZU5doIZOPBAqENQ== -"@azure/msal-node@^2.13.1", "@azure/msal-node@^2.15.0": - version "2.15.0" - resolved "https://registry.yarnpkg.com/@azure/msal-node/-/msal-node-2.15.0.tgz#50bf8e692a6656027c073a75d877a8a478aafdfd" - integrity sha512-gVPW8YLz92ZeCibQH2QUw96odJoiM3k/ZPH3f2HxptozmH6+OnyyvKXo/Egg39HAM230akarQKHf0W74UHlh0Q== +"@azure/msal-common@14.16.0": + version "14.16.0" + resolved "https://registry.yarnpkg.com/@azure/msal-common/-/msal-common-14.16.0.tgz#f3470fcaec788dbe50859952cd499340bda23d7a" + integrity sha512-1KOZj9IpcDSwpNiQNjt0jDYZpQvNZay7QAEi/5DLubay40iGYtLzya/jbjRPLyOTZhEKyL1MzPuw2HqBCjceYA== + +"@azure/msal-node@^2.13.1", "@azure/msal-node@^2.15.0", "@azure/msal-node@^2.16.1": + version "2.16.1" + resolved "https://registry.yarnpkg.com/@azure/msal-node/-/msal-node-2.16.1.tgz#89828832e8e6c8a88cecc4ef6d8d4e4352116b77" + integrity sha512-1NEFpTmMMT2A7RnZuvRl/hUmJU+GLPjh+ShyIqPktG2PvSd2yvPnzGd/BxIBAAvJG5nr9lH4oYcQXepDbaE7fg== dependencies: - "@azure/msal-common" "14.15.0" + "@azure/msal-common" "14.16.0" jsonwebtoken "^9.0.0" uuid "^8.3.0" @@ -756,10 +761,10 @@ resolved "https://registry.yarnpkg.com/@microsoft/recognizers-text/-/recognizers-text-1.3.1.tgz#eda98a9148101ecdb04ed1424082d472b04aabd9" integrity sha512-HikLoRUgSzM4OKP3JVBzUUp3Q7L4wgI17p/3rERF01HVmopcujY3i6wgx8PenCwbenyTNxjr1AwSDSVuFlYedQ== -"@microsoft/teams-js@^2.30.0": - version "2.30.0" - resolved "https://registry.yarnpkg.com/@microsoft/teams-js/-/teams-js-2.30.0.tgz#26f91ae6072425d9c86cac841ebc3458f1fa7f31" - integrity sha512-zTy2EHuODZ2g4fXLvnKXdZse44n06iXGambmJnGDDCb6JRvG5dQwJp//swLoxBYs2iHL40TJdyUDoB6sTl6KXg== +"@microsoft/teams-js@^2.31.0": + version "2.31.0" + resolved "https://registry.yarnpkg.com/@microsoft/teams-js/-/teams-js-2.31.0.tgz#25e8453a26cdeeb72948672e2e04827ad744d9f9" + integrity sha512-MZLmMOqbPpDpooNkhBVw9v8Q474sLzne1YUP2sa1ZukCkoNPG9DOOKYbeX38CdvdZ1zfeteCUB920ZLXUKyzVA== dependencies: base64-js "^1.3.1" debug "^4.3.3" @@ -4776,10 +4781,10 @@ gpt-3-encoder@1.1.4: resolved "https://registry.yarnpkg.com/gpt-3-encoder/-/gpt-3-encoder-1.1.4.tgz#d6cdaacf5824857e133b6065247c757fc7e4fa72" integrity sha512-fSQRePV+HUAhCn7+7HL7lNIXNm6eaFWFbNLOOGtmSJ0qJycyQvj60OvRlH7mee8xAMjBDNRdMXlMwjAbMTDjkg== -gpt-tokenizer@^2.5.1: - version "2.5.1" - resolved "https://registry.yarnpkg.com/gpt-tokenizer/-/gpt-tokenizer-2.5.1.tgz#ff1175b9ae1325f0f5281e9797af078cb29295dc" - integrity sha512-26zNjvGrIf+a6yWg5l2DvNT4LXAmotHyx7IomHVhXiUs62BwKVFLv/l8yRQQrkUDc2XDtzCdjcNuJqzOjxxiPA== +gpt-tokenizer@^2.6.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/gpt-tokenizer/-/gpt-tokenizer-2.6.2.tgz#90e6932c7b5f73df7c13d360802edb43a2776586" + integrity sha512-OznIET3z069FiwbLtLFXJ9pVESYAa8EnX0BMogs6YJ4Fn2FIcyeZYEbxsp2grPiK0DVaqP1f+0JR/8t9R7/jlg== graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0: version "4.2.11" From e6186c183bf56d5078122bdf4bee6abe5614b0d6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 21 Nov 2024 11:28:18 -0800 Subject: [PATCH 03/19] [JS] bump: (deps-dev): Bump the development group across 1 directory with 3 updates (#2190) #minor Bumps the development group with 3 updates in the /js directory: [@types/lodash](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/lodash), [mocha](https://github.com/mochajs/mocha) and [tsc-watch](https://github.com/gilamran/tsc-watch). Updates `@types/lodash` from 4.17.12 to 4.17.13
Commits
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- js/package.json | 4 ++-- js/packages/teams-ai/package.json | 2 +- js/samples/04.ai-apps/f.whoBot/package.json | 2 +- .../a.oauth-adaptiveCard/package.json | 2 +- .../b.oauth-bot/package.json | 2 +- .../c.oauth-messageExtension/package.json | 2 +- .../d.teamsSSO-bot/package.json | 2 +- .../e.teamsSSO-messageExtension/package.json | 2 +- js/yarn.lock | 24 +++++++++---------- 9 files changed, 21 insertions(+), 21 deletions(-) diff --git a/js/package.json b/js/package.json index 6d038d4ed..bbd020693 100644 --- a/js/package.json +++ b/js/package.json @@ -29,7 +29,7 @@ "@microsoft/api-extractor": "^7.47.11", "@standardlabs/is-private": "^1.0.1", "@types/jsonwebtoken": "9.0.4", - "@types/lodash": "^4.17.12", + "@types/lodash": "^4.17.13", "@types/mocha": "^10.0.9", "@types/node": "^20.16.1", "@types/sinon": "^10.0.19", @@ -48,7 +48,7 @@ "exorcist": "^2.0.0", "express": "^4.21.1", "mocha-junit-reporter": "^2.0.0", - "mocha": "^10.7.3", + "mocha": "^10.8.2", "ms-rest-azure": "^3.0.2", "npm-run-all": "^4.1.5", "nyc": "^15.1.0", diff --git a/js/packages/teams-ai/package.json b/js/packages/teams-ai/package.json index 7ef6f0be6..0af5c806d 100644 --- a/js/packages/teams-ai/package.json +++ b/js/packages/teams-ai/package.json @@ -56,7 +56,7 @@ "eslint": "^8.57.1", "express": "^4.21.1", "jsonwebtoken": "^9.0.2", - "mocha": "10.7.3", + "mocha": "10.8.2", "nyc": "^15.1.0", "rimraf": "5.0.10", "shx": "^0.3.4", diff --git a/js/samples/04.ai-apps/f.whoBot/package.json b/js/samples/04.ai-apps/f.whoBot/package.json index a702c65e0..1393bb60c 100644 --- a/js/samples/04.ai-apps/f.whoBot/package.json +++ b/js/samples/04.ai-apps/f.whoBot/package.json @@ -38,7 +38,7 @@ "prettier": "^3.3.3", "rimraf": "^5.0.10", "ts-node": "^10.9.2", - "tsc-watch": "^6.2.0", + "tsc-watch": "^6.2.1", "typescript": "~5.5.4" } } diff --git a/js/samples/05.authentication/a.oauth-adaptiveCard/package.json b/js/samples/05.authentication/a.oauth-adaptiveCard/package.json index c95229f6e..fe3555f4a 100644 --- a/js/samples/05.authentication/a.oauth-adaptiveCard/package.json +++ b/js/samples/05.authentication/a.oauth-adaptiveCard/package.json @@ -39,7 +39,7 @@ "prettier": "^3.3.3", "rimraf": "^5.0.10", "ts-node": "^10.9.2", - "tsc-watch": "^6.2.0", + "tsc-watch": "^6.2.1", "typescript": "~5.5.4" } } diff --git a/js/samples/05.authentication/b.oauth-bot/package.json b/js/samples/05.authentication/b.oauth-bot/package.json index 63e37c1dd..fc5a97d5f 100644 --- a/js/samples/05.authentication/b.oauth-bot/package.json +++ b/js/samples/05.authentication/b.oauth-bot/package.json @@ -37,7 +37,7 @@ "prettier": "^3.3.3", "rimraf": "^5.0.10", "ts-node": "^10.9.2", - "tsc-watch": "^6.2.0", + "tsc-watch": "^6.2.1", "typescript": "~5.5.4" } } diff --git a/js/samples/05.authentication/c.oauth-messageExtension/package.json b/js/samples/05.authentication/c.oauth-messageExtension/package.json index 7ca2df4eb..4bf51c68c 100644 --- a/js/samples/05.authentication/c.oauth-messageExtension/package.json +++ b/js/samples/05.authentication/c.oauth-messageExtension/package.json @@ -40,7 +40,7 @@ "prettier": "^3.3.3", "rimraf": "^5.0.10", "ts-node": "^10.9.2", - "tsc-watch": "^6.2.0", + "tsc-watch": "^6.2.1", "typescript": "~5.5.4" } } diff --git a/js/samples/05.authentication/d.teamsSSO-bot/package.json b/js/samples/05.authentication/d.teamsSSO-bot/package.json index 9201182ae..076668c01 100644 --- a/js/samples/05.authentication/d.teamsSSO-bot/package.json +++ b/js/samples/05.authentication/d.teamsSSO-bot/package.json @@ -39,7 +39,7 @@ "prettier": "^3.3.3", "rimraf": "^5.0.10", "ts-node": "^10.9.2", - "tsc-watch": "^6.2.0", + "tsc-watch": "^6.2.1", "typescript": "~5.5.4" } } diff --git a/js/samples/05.authentication/e.teamsSSO-messageExtension/package.json b/js/samples/05.authentication/e.teamsSSO-messageExtension/package.json index d9aa7a68c..e90f21381 100644 --- a/js/samples/05.authentication/e.teamsSSO-messageExtension/package.json +++ b/js/samples/05.authentication/e.teamsSSO-messageExtension/package.json @@ -42,7 +42,7 @@ "prettier": "^3.3.3", "rimraf": "^5.0.10", "ts-node": "^10.9.2", - "tsc-watch": "^6.2.0", + "tsc-watch": "^6.2.1", "typescript": "~5.5.4" } } diff --git a/js/yarn.lock b/js/yarn.lock index 8b11bcf42..ee144a9bc 100644 --- a/js/yarn.lock +++ b/js/yarn.lock @@ -1114,10 +1114,10 @@ dependencies: "@types/node" "*" -"@types/lodash@^4.17.12": - version "4.17.12" - resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.17.12.tgz#25d71312bf66512105d71e55d42e22c36bcfc689" - integrity sha512-sviUmCE8AYdaF/KIHLDJBQgeYzPBI0vf/17NaYehBJfYD1j6/L95Slh07NlyK2iNyBNaEkb3En2jRt+a8y3xZQ== +"@types/lodash@^4.17.13": + version "4.17.13" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.17.13.tgz#786e2d67cfd95e32862143abe7463a7f90c300eb" + integrity sha512-lfx+dftrEZcdBPczf9d0Qv0x+j/rfNCMuC6OcfXmO8gkfeNAY88PgKUbvG56whcN23gc27yenwF6oJZXGFpYxg== "@types/mime@^1": version "1.3.5" @@ -6328,10 +6328,10 @@ mocha-junit-reporter@^2.0.0: strip-ansi "^6.0.1" xml "^1.0.1" -mocha@10.7.3, mocha@^10.7.3: - version "10.7.3" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-10.7.3.tgz#ae32003cabbd52b59aece17846056a68eb4b0752" - integrity sha512-uQWxAu44wwiACGqjbPYmjo7Lg8sFrS3dQe7PP2FQI+woptP4vZXSMcfMyFL/e1yFEeEpV4RtyTpZROOKmxis+A== +mocha@10.8.2, mocha@^10.8.2: + version "10.8.2" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-10.8.2.tgz#8d8342d016ed411b12a429eb731b825f961afb96" + integrity sha512-VZlYo/WE8t1tstuRmqgeyBgCbJc/lEdopaa+axcKzTBJ+UIdlAB9XnmvTCAH4pwR4ElNInaedhEBmZD8iCSVEg== dependencies: ansi-colors "^4.1.3" browser-stdout "^1.3.1" @@ -8781,10 +8781,10 @@ ts-node@^10.9.2: v8-compile-cache-lib "^3.0.1" yn "3.1.1" -tsc-watch@^6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/tsc-watch/-/tsc-watch-6.2.0.tgz#4b191c36c6ed24c2bf6e721013af0825cd73d217" - integrity sha512-2LBhf9kjKXnz7KQ/puLHlozMzzUNHAdYBNMkg3eksQJ9GBAgMg8czznM83T5PmsoUvDnXzfIeQn2lNcIYDr8LA== +tsc-watch@^6.2.1: + version "6.2.1" + resolved "https://registry.yarnpkg.com/tsc-watch/-/tsc-watch-6.2.1.tgz#861801be929b2fd3d597c5f608db2b7ddba503db" + integrity sha512-GLwdz5Dy9K3sVm3RzgkLcyDpl5cvU9HEcE1A3gf5rqEwlUe7gDLxNCgcuNEw3zoKOiegMo3LnbF1t6HLqxhrSA== dependencies: cross-spawn "^7.0.3" node-cleanup "^2.1.2" From 524f08cdd11a815ad9c0534aa58c1da9649d830d Mon Sep 17 00:00:00 2001 From: Lily Du Date: Wed, 27 Nov 2024 10:52:59 -0600 Subject: [PATCH 04/19] [PY] fix: content safety public preview deprecation (#2207) ## Linked issues closes: #2172 ## Details parity across languages - originated with #2121 and #2133 #### Change details - added `halt_on_blocklist_hit` - updated with GA reqs - updated moderation sample ## Attestation Checklist - [x] My code follows the style guidelines of this project - I have checked for/fixed spelling, linting, and other errors - I have commented my code for clarity - I have made corresponding changes to the documentation (updating the doc strings in the code is sufficient) - My changes generate no new warnings - I have added tests that validates my changes, and provides sufficient test coverage. I have tested with: - Local testing - E2E testing in Teams - New and existing unit tests pass locally with my changes --------- Co-authored-by: lilydu --- .../azure_content_safety_moderator.py | 67 +++++++++---------- .../test_azure_content_safety_moderator.py | 18 +++-- python/samples/05.chatModeration/src/bot.py | 6 +- .../src/prompts/chat/config.json | 2 +- 4 files changed, 50 insertions(+), 43 deletions(-) diff --git a/python/packages/ai/teams/ai/moderators/azure_content_safety_moderator.py b/python/packages/ai/teams/ai/moderators/azure_content_safety_moderator.py index f838290e1..3a6bba845 100644 --- a/python/packages/ai/teams/ai/moderators/azure_content_safety_moderator.py +++ b/python/packages/ai/teams/ai/moderators/azure_content_safety_moderator.py @@ -49,6 +49,15 @@ class AzureContentSafetyModeratorOptions(OpenAIModeratorOptions): You could attach multiple lists name here. """ + halt_on_blocklist_hit: Optional[bool] = False + """ + When set to true, further analyses of harmful content will not be performed + in cases where blocklists are hit. + When set to false, all analyses of harmful content will be performed, whether + or not blocklists are hit. + Default value is false. + """ + class AzureContentSafetyModerator(Generic[StateT], Moderator[StateT]): """ @@ -95,6 +104,7 @@ async def review_input(self, context: TurnContext, state: StateT) -> Optional[Pl text=input, categories=self._options.categories, blocklist_names=self._options.blocklist_names, + halt_on_blocklist_hit=self._options.halt_on_blocklist_hit, ) ) @@ -102,21 +112,16 @@ async def review_input(self, context: TurnContext, state: StateT) -> Optional[Pl categories: Dict[str, bool] = {} category_scores: Dict[str, int] = {} - category_results = ["hateResult", "selfHarmResult", "sexualResult", "violenceResult"] - - for category in category_results: - result = res[category] if category in res else None - if result is not None: - category = result["category"].lower() - if category == "selfharm": - category = "self_harm" - categories[category] = result["severity"] is not None and result["severity"] > 0 - category_scores[category] = ( - 0 if result["severity"] is None else result["severity"] - ) - if result["severity"] is not None and result["severity"] > 0: - flagged = True + categories_analysis = res["categoriesAnalysis"] + for result in categories_analysis: + category = result["category"].lower() + if category == "selfharm": + category = "self_harm" + categories[category] = result["severity"] is not None and result["severity"] > 0 + category_scores[category] = 0 if result["severity"] is None else result["severity"] + if result["severity"] is not None and result["severity"] > 0: + flagged = True return ( None if not flagged @@ -156,6 +161,7 @@ async def review_output(self, context: TurnContext, state: StateT, plan: Plan) - ), categories=self._options.categories, blocklist_names=self._options.blocklist_names, + halt_on_blocklist_hit=self._options.halt_on_blocklist_hit, ) ) @@ -163,27 +169,20 @@ async def review_output(self, context: TurnContext, state: StateT, plan: Plan) - categories: Dict[str, bool] = {} category_scores: Dict[str, int] = {} - category_results = [ - "hateResult", - "selfHarmResult", - "sexualResult", - "violenceResult", - ] + categories_analysis = res["categoriesAnalysis"] - for category in category_results: - result = res[category] if category in res else None - if result is not None: - category = result["category"].lower() - if category == "selfharm": - category = "self_harm" - categories[category] = ( - result["severity"] is not None and result["severity"] > 0 - ) - category_scores[category] = ( - 0 if result["severity"] is None else result["severity"] - ) - if result["severity"] is not None and result["severity"] > 0: - flagged = True + for result in categories_analysis: + category = result["category"].lower() + if category == "selfharm": + category = "self_harm" + categories[category] = ( + result["severity"] is not None and result["severity"] > 0 + ) + category_scores[category] = ( + 0 if result["severity"] is None else result["severity"] + ) + if result["severity"] is not None and result["severity"] > 0: + flagged = True if flagged: return Plan( diff --git a/python/packages/ai/tests/ai/moderators/test_azure_content_safety_moderator.py b/python/packages/ai/tests/ai/moderators/test_azure_content_safety_moderator.py index 752b42201..5f1e6a498 100644 --- a/python/packages/ai/tests/ai/moderators/test_azure_content_safety_moderator.py +++ b/python/packages/ai/tests/ai/moderators/test_azure_content_safety_moderator.py @@ -28,11 +28,19 @@ def analyze_text(self, *_args, **_kwargs: Any): class MockContentSafetyClientWithResults: def analyze_text(self, *_args, **_kwargs: Any): return { - "blocklistsMatchResults": [], - "hateResult": {"category": "Hate", "severity": 6}, - "selfHarmResult": {"category": "SelfHarm", "severity": 0}, - "sexualResult": {"category": "Sexual", "severity": 0}, - "violenceResult": {"category": "Violence", "severity": 0}, + "blocklistsMatch": [ + { + "blocklistName": "string", + "blocklistItemId": "string", + "blocklistItemText": "bleed", + } + ], + "categoriesAnalysis": [ + {"category": "Hate", "severity": 6}, + {"category": "SelfHarm", "severity": 0}, + {"category": "Sexual", "severity": 0}, + {"category": "Violence", "severity": 0}, + ], } diff --git a/python/samples/05.chatModeration/src/bot.py b/python/samples/05.chatModeration/src/bot.py index ff5d1451a..bac4eaa8d 100644 --- a/python/samples/05.chatModeration/src/bot.py +++ b/python/samples/05.chatModeration/src/bot.py @@ -35,7 +35,7 @@ model = OpenAIModel( OpenAIModelOptions( api_key=config.OPENAI_KEY, - default_model="gpt-3.5-turbo" + default_model="gpt-4o" )) moderator = OpenAIModerator( OpenAIModeratorOptions( @@ -47,7 +47,7 @@ model = OpenAIModel( AzureOpenAIModelOptions( api_key=config.AZURE_OPENAI_KEY, - default_model="gpt-35-turbo", + default_model="gpt-4o", api_version="2023-03-15-preview", endpoint=config.AZURE_OPENAI_ENDPOINT )) @@ -55,7 +55,7 @@ AzureContentSafetyModeratorOptions( api_key=config.AZURE_CONTENT_SAFETY_KEY, moderate="both", - api_version="2023-04-30-preview", + api_version="2023-10-01", endpoint=config.AZURE_CONTENT_SAFETY_ENDPOINT ) ) diff --git a/python/samples/05.chatModeration/src/prompts/chat/config.json b/python/samples/05.chatModeration/src/prompts/chat/config.json index 0a10896bd..7deca377f 100644 --- a/python/samples/05.chatModeration/src/prompts/chat/config.json +++ b/python/samples/05.chatModeration/src/prompts/chat/config.json @@ -3,7 +3,7 @@ "description": "A bot that demonstrates content moderation.", "type": "completion", "completion": { - "model": "gpt-3.5-turbo", + "model": "gpt-4o", "completion_type": "chat", "include_history": true, "include_input": true, From cd919c06579e7773219eb9e5ea24f2449e6935bd Mon Sep 17 00:00:00 2001 From: Corina <14900841+corinagum@users.noreply.github.com> Date: Tue, 3 Dec 2024 12:09:48 -0800 Subject: [PATCH 05/19] [JS] feat: support for v2 Assistants (#2193) ## Linked issues closes: #1585 ## Details ### Please note This code updates to use v2 assistants, but file search, vector store, and code interpreter handling have not been implemented yet. This work was mainly to remove the dependency `@azure/openai-assistants`. #### Change details - Remove `@azure/openai-assistants` package and use `openai` in `AssistantsPlanner.ts` - Update `AssistantsPlanner.ts` to use assistants v2 - Other: - Docstrings updates - Linting - Add TTK testtool to OrderBot - Fix JSON parsing issue in ToolsAugmentation - was causing error messages in unit tests but no negative impact on the feature. ## Attestation Checklist - [x] My code follows the style guidelines of this project - I have checked for/fixed spelling, linting, and other errors - I have commented my code for clarity - I have made corresponding changes to the documentation (updating the doc strings in the code is sufficient) - My changes generate no new warnings - I have added tests that validates my changes, and provides sufficient test coverage. I have tested with: - Local testing - E2E testing in Teams - New and existing unit tests pass locally with my changes ### Additional information > Feel free to add other relevant information below --------- Co-authored-by: Corina Gum <> --- js/package.json | 5 +- js/packages/teams-ai/package.json | 4 +- js/packages/teams-ai/src/AI.ts | 2 +- js/packages/teams-ai/src/actions/DoCommand.ts | 1 + .../teams-ai/src/actions/FlaggedInput.ts | 1 + .../teams-ai/src/actions/FlaggedOutput.ts | 3 +- js/packages/teams-ai/src/actions/HttpError.ts | 1 + js/packages/teams-ai/src/actions/PlanReady.ts | 1 + .../teams-ai/src/actions/TooManySteps.ts | 1 + js/packages/teams-ai/src/actions/Unknown.ts | 1 + .../augmentations/ToolsAugmentation.spec.ts | 42 + .../src/augmentations/ToolsAugmentation.ts | 20 +- .../src/authentication/Authentication.ts | 20 +- .../src/planners/AssistantsPlanner.spec.ts | 789 ++++------ .../src/planners/AssistantsPlanner.ts | 411 +++-- .../f.chatModeration/src/bot.ts | 2 +- .../e.assistants-orderBot/.gitignore | 3 + .../e.assistants-orderBot/.vscode/launch.json | 28 +- .../e.assistants-orderBot/.vscode/tasks.json | 109 +- .../devTools/teamsapptester | 1 + .../e.assistants-orderBot/env/.env.testtool | 3 + .../e.assistants-orderBot/package.json | 8 +- .../e.assistants-orderBot/src/bot.ts | 20 +- .../e.assistants-orderBot/src/index.ts | 2 +- .../teamsapp.testtool.yml | 27 + .../e.assistants-orderBot/teamsapp.yml | 163 +- .../h.datasource-azureOpenAI/src/index.ts | 2 +- .../i.teamsChefBot-streaming/src/index.ts | 8 +- js/yarn.lock | 1380 +++++++++-------- 29 files changed, 1523 insertions(+), 1535 deletions(-) create mode 120000 js/samples/04.ai-apps/e.assistants-orderBot/devTools/teamsapptester create mode 100644 js/samples/04.ai-apps/e.assistants-orderBot/env/.env.testtool create mode 100644 js/samples/04.ai-apps/e.assistants-orderBot/teamsapp.testtool.yml diff --git a/js/package.json b/js/package.json index bbd020693..6b38b07ab 100644 --- a/js/package.json +++ b/js/package.json @@ -32,7 +32,7 @@ "@types/lodash": "^4.17.13", "@types/mocha": "^10.0.9", "@types/node": "^20.16.1", - "@types/sinon": "^10.0.19", + "@types/sinon": "^17.0.3", "@typescript-eslint/eslint-plugin": "^6.21.0", "@typescript-eslint/parser": "^6.21.0", "applicationinsights": "^2.9.6", @@ -47,6 +47,7 @@ "eslint-plugin-prettier": "^5.2.1", "exorcist": "^2.0.0", "express": "^4.21.1", + "mocha": "^10.7.3", "mocha-junit-reporter": "^2.0.0", "mocha": "^10.8.2", "ms-rest-azure": "^3.0.2", @@ -58,7 +59,7 @@ "replace-in-file": "^4.1.0", "rimraf": "^5.0.10", "shx": "^0.3.4", - "sinon": "^16.1.3", + "sinon": "^19.0.2", "source-map-support": "^0.5.19", "sponge": "^0.1.0", "tinyify": "^4.0.0", diff --git a/js/packages/teams-ai/package.json b/js/packages/teams-ai/package.json index 0af5c806d..dd87a6da7 100644 --- a/js/packages/teams-ai/package.json +++ b/js/packages/teams-ai/package.json @@ -29,7 +29,6 @@ "openai": "^4.68.2" }, "dependencies": { - "@azure/openai-assistants": "1.0.0-beta.6", "@azure/msal-node": "^2.16.1", "axios": "^1.7.5", "botbuilder-dialogs": "^4.23.1", @@ -72,7 +71,8 @@ "test": "npx mocha -r ts-node/register src/**/*.spec.ts", "test:debug": "ts-mocha src/**/*.spec.ts --inspect-brk", "test:coverage": "nyc --reporter=html --reporter=text --reporter=text-summary npm test", - "test:compat": "npx api-extractor run --verbose" + "test:compat": "npx api-extractor run --verbose", + "watch": "tsc -b --watch" }, "files": [ "_ts3.4", diff --git a/js/packages/teams-ai/src/AI.ts b/js/packages/teams-ai/src/AI.ts index d04bb3682..ab7114f42 100644 --- a/js/packages/teams-ai/src/AI.ts +++ b/js/packages/teams-ai/src/AI.ts @@ -121,7 +121,7 @@ export class AI { * A text string that can be returned from an action to stop the AI system from continuing * to execute the current plan. * @remarks - * This command is incompatible and should not be used with `tools` augmentation + * This command is incompatible and should not be used with `tools` augmentation */ public static readonly StopCommandName = actions.StopCommandName; diff --git a/js/packages/teams-ai/src/actions/DoCommand.ts b/js/packages/teams-ai/src/actions/DoCommand.ts index 7b6fc0ca1..7c19f1bd2 100644 --- a/js/packages/teams-ai/src/actions/DoCommand.ts +++ b/js/packages/teams-ai/src/actions/DoCommand.ts @@ -34,6 +34,7 @@ export interface PredictedDoCommandAndHandler extends PredictedDoCommand /** * @private + * @returns {Promise} A promise that resolves to a string indicating whether the AI system should continue executing the plan. */ export function doCommand() { return async (context: TurnContext, state: TState, data: PredictedDoCommandAndHandler, action?: string) => { diff --git a/js/packages/teams-ai/src/actions/FlaggedInput.ts b/js/packages/teams-ai/src/actions/FlaggedInput.ts index d9e7a7d98..d13803e6b 100644 --- a/js/packages/teams-ai/src/actions/FlaggedInput.ts +++ b/js/packages/teams-ai/src/actions/FlaggedInput.ts @@ -10,6 +10,7 @@ import { StopCommandName } from './Action'; /** * @private + * @returns {Function} An async function that logs an error message and returns StopCommandName. */ export function flaggedInput() { return async () => { diff --git a/js/packages/teams-ai/src/actions/FlaggedOutput.ts b/js/packages/teams-ai/src/actions/FlaggedOutput.ts index c840d99eb..6a6bad0b3 100644 --- a/js/packages/teams-ai/src/actions/FlaggedOutput.ts +++ b/js/packages/teams-ai/src/actions/FlaggedOutput.ts @@ -10,8 +10,9 @@ import { StopCommandName } from './Action'; /** * @private + * @returns {() => Promise} A function that logs an error and returns the StopCommandName. */ -export function flaggedOutput() { +export function flaggedOutput(): () => Promise { return async () => { console.error( `The bots output has been moderated but no handler was registered for 'AI.FlaggedOutputActionName'.` diff --git a/js/packages/teams-ai/src/actions/HttpError.ts b/js/packages/teams-ai/src/actions/HttpError.ts index e2ff2b3b8..a4db23b8f 100644 --- a/js/packages/teams-ai/src/actions/HttpError.ts +++ b/js/packages/teams-ai/src/actions/HttpError.ts @@ -12,6 +12,7 @@ import { TurnState } from '../TurnState'; /** * @private + * @returns {Promise} A promise that resolves to a string. */ export function httpError() { return async (_context: TurnContext, _state: TState, err?: Error): Promise => { diff --git a/js/packages/teams-ai/src/actions/PlanReady.ts b/js/packages/teams-ai/src/actions/PlanReady.ts index 7f850b4fb..2c821cca5 100644 --- a/js/packages/teams-ai/src/actions/PlanReady.ts +++ b/js/packages/teams-ai/src/actions/PlanReady.ts @@ -14,6 +14,7 @@ import { StopCommandName } from './Action'; /** * @private + * @returns {Function} A function that takes TurnContext, TState, and Plan as arguments and returns a string or StopCommandName. */ export function planReady() { return async (_context: TurnContext, _state: TState, plan: Plan) => { diff --git a/js/packages/teams-ai/src/actions/TooManySteps.ts b/js/packages/teams-ai/src/actions/TooManySteps.ts index e6bb64d01..8e3b050a5 100644 --- a/js/packages/teams-ai/src/actions/TooManySteps.ts +++ b/js/packages/teams-ai/src/actions/TooManySteps.ts @@ -13,6 +13,7 @@ import { TooManyStepsParameters } from '../types'; /** * @private + * @returns {Function} A function that checks if the AI system has exceeded the maximum number of steps or time allowed. */ export function tooManySteps() { return async (_context: TurnContext, _state: TState, data: TooManyStepsParameters) => { diff --git a/js/packages/teams-ai/src/actions/Unknown.ts b/js/packages/teams-ai/src/actions/Unknown.ts index 3f1fd780f..d195a7f3d 100644 --- a/js/packages/teams-ai/src/actions/Unknown.ts +++ b/js/packages/teams-ai/src/actions/Unknown.ts @@ -13,6 +13,7 @@ import { StopCommandName } from './Action'; /** * @private + * @returns {Function} An async function that logs an error and returns StopCommandName. */ export function unknown() { return async (_context: TurnContext, _state: TState, _data: any, action?: string) => { diff --git a/js/packages/teams-ai/src/augmentations/ToolsAugmentation.spec.ts b/js/packages/teams-ai/src/augmentations/ToolsAugmentation.spec.ts index 82dd580ee..588745946 100644 --- a/js/packages/teams-ai/src/augmentations/ToolsAugmentation.spec.ts +++ b/js/packages/teams-ai/src/augmentations/ToolsAugmentation.spec.ts @@ -158,5 +158,47 @@ describe('ToolsAugmentation', () => { assert(plan.commands.length === 0); }); }); + + it('should handle empty arguments gracefully', async () => { + await adapter.sendTextToBot('test', async (context) => { + const actionCalls: ActionCall[] = [ + { + type: 'function', + id: '123', + function: { + name: 'LightsOn', + arguments: '' + } + }, + { + type: 'function', + id: '124', + function: { + name: 'Pause', + arguments: '{ "time": 10 }' + } + } + ]; + const response: PromptResponse = { + status: 'success', + input: { + role: 'user', + content: 'Perform actions' + }, + message: { role: 'assistant', content: '', action_calls: actionCalls } + }; + const state = await TestTurnState.create(context); + const plan = await toolsAugmentation.createPlanFromResponse(context, state, response); + + assert(plan.type === 'plan'); + assert(plan.commands.length === 2); + assert(plan.commands[0].type === 'DO'); + assert((plan.commands[0] as PredictedDoCommand).action === 'LightsOn'); + assert.deepEqual((plan.commands[0] as PredictedDoCommand).parameters, {}); + assert(plan.commands[1].type === 'DO'); + assert((plan.commands[1] as PredictedDoCommand).action === 'Pause'); + assert.deepEqual((plan.commands[1] as PredictedDoCommand).parameters, { time: 10 }); + }); + }); }); }); diff --git a/js/packages/teams-ai/src/augmentations/ToolsAugmentation.ts b/js/packages/teams-ai/src/augmentations/ToolsAugmentation.ts index 38c1a4410..545ca1dfa 100644 --- a/js/packages/teams-ai/src/augmentations/ToolsAugmentation.ts +++ b/js/packages/teams-ai/src/augmentations/ToolsAugmentation.ts @@ -60,7 +60,7 @@ export class ToolsAugmentation implements Augmentation { * Creates a plan given validated response value. * @param {TurnContext} context Context for the current turn of conversation. * @param {Memory} memory An interface for accessing state variables. - * @param {PromptResponse} response The validated and transformed response for the prompt. + * @param {PromptResponse} response The validated and transformed response for the prompt. * @returns {Promise} The created plan. */ public createPlanFromResponse( @@ -74,14 +74,18 @@ export class ToolsAugmentation implements Augmentation { const actionToolCalls: ActionCall[] = response.message.action_calls; for (const toolCall of actionToolCalls) { - let parameters; + let parameters = {}; - try { - parameters = JSON.parse(toolCall.function.arguments) ?? {}; - } catch (err) { - console.error('ToolsAugmentation parameters:', toolCall.function.arguments); - console.error('ToolsAugmentation createPlanFromResponse: Error parsing tool arguments: ', err); - parameters = {}; + if (toolCall.function.arguments && toolCall.function.arguments.trim() !== '') { + try { + parameters = JSON.parse(toolCall.function.arguments); + } catch (err) { + console.warn( + `ToolsAugmentation: Error parsing tool arguments for ${toolCall.function.name}:`, + err + ); + console.warn('Arguments:', toolCall.function.arguments); + } } const doCommand: PredictedDoCommand = { diff --git a/js/packages/teams-ai/src/authentication/Authentication.ts b/js/packages/teams-ai/src/authentication/Authentication.ts index 573840d2f..9dc93076e 100644 --- a/js/packages/teams-ai/src/authentication/Authentication.ts +++ b/js/packages/teams-ai/src/authentication/Authentication.ts @@ -6,22 +6,24 @@ * Licensed under the MIT License. */ +import { type AuthenticationResult, ConfidentialClientApplication } from '@azure/msal-node'; import { Storage, TurnContext } from 'botbuilder'; import { OAuthPromptSettings } from 'botbuilder-dialogs'; -import { AuthenticationResult, ConfidentialClientApplication } from '@azure/msal-node'; -import { TurnState } from '../TurnState'; + import { Application, Selector } from '../Application'; -import { MessageExtensionAuthenticationBase } from './MessageExtensionAuthenticationBase'; -import { BotAuthenticationBase, deleteTokenFromState, setTokenInState } from './BotAuthenticationBase'; -import * as UserTokenAccess from './UserTokenAccess'; +import { TurnState } from '../TurnState'; + import { AdaptiveCardAuthenticationBase } from './AdaptiveCardAuthenticationBase'; -import { TeamsSsoSettings } from './TeamsSsoSettings'; -import { OAuthPromptMessageExtensionAuthentication } from './OAuthMessageExtensionAuthentication'; +import { BotAuthenticationBase, deleteTokenFromState, setTokenInState } from './BotAuthenticationBase'; +import { MessageExtensionAuthenticationBase } from './MessageExtensionAuthenticationBase'; +import { OAuthAdaptiveCardAuthentication } from './OAuthAdaptiveCardAuthentication'; import { OAuthBotAuthentication } from './OAuthBotAuthentication'; +import { OAuthPromptMessageExtensionAuthentication } from './OAuthMessageExtensionAuthentication'; +import { TeamsSsoAdaptiveCardAuthentication } from './TeamsSsoAdaptiveCardAuthentication'; import { TeamsSsoBotAuthentication } from './TeamsSsoBotAuthentication'; import { TeamsSsoMessageExtensionAuthentication } from './TeamsSsoMessageExtensionAuthentication'; -import { OAuthAdaptiveCardAuthentication } from './OAuthAdaptiveCardAuthentication'; -import { TeamsSsoAdaptiveCardAuthentication } from './TeamsSsoAdaptiveCardAuthentication'; +import { TeamsSsoSettings } from './TeamsSsoSettings'; +import * as UserTokenAccess from './UserTokenAccess'; /** * User authentication service. diff --git a/js/packages/teams-ai/src/planners/AssistantsPlanner.spec.ts b/js/packages/teams-ai/src/planners/AssistantsPlanner.spec.ts index 8ab1e459a..40a116844 100644 --- a/js/packages/teams-ai/src/planners/AssistantsPlanner.spec.ts +++ b/js/packages/teams-ai/src/planners/AssistantsPlanner.spec.ts @@ -1,571 +1,320 @@ -import { - Assistant, - AssistantThread, - AssistantThreadCreationOptions, - AssistantsClient, - CreateMessageOptions, - CreateRunOptions, - CreateRunRequestOptions, - CreateThreadOptions, - GetRunOptions, - ListMessagesOptions, - ListResponseOf, - ListRunsOptions, - MessageRole, - OpenAIKeyCredential, - RequiredAction, - RequiredFunctionToolCall, - SubmitToolOutputsToRunOptions, - ThreadMessage, - ThreadRun, - ToolOutput -} from '@azure/openai-assistants'; -import { TestAdapter, TurnContext } from 'botbuilder-core'; -import { Activity } from 'botframework-schema'; +/// + +import assert from 'assert'; +import OpenAI from 'openai'; +import { TurnContext, TestAdapter } from 'botbuilder-core'; +import sinon from 'sinon'; + import { TurnState } from '../TurnState'; import { AssistantsPlanner, AssistantsPlannerOptions } from './AssistantsPlanner'; -import { AI, AIOptions } from '../AI'; -import assert from 'assert'; +import { AI } from '../AI'; import { PredictedDoCommand, PredictedSayCommand } from './Planner'; describe('AssistantsPlanner', () => { - const createTurnContextAndState = async (activity: Partial): Promise<[TurnContext, TurnState]> => { + let planner: AssistantsPlanner; + let openAIStub: sinon.SinonStubbedInstance; + let context: TurnContext; + let state: TurnState; + let ai: AI; + + beforeEach(async () => { + openAIStub = sinon.createStubInstance(OpenAI); + openAIStub.beta = { + threads: { + create: sinon.stub().resolves({ id: 'test-thread-id' }), + runs: { + create: sinon.stub().resolves({ id: 'test-run-id', status: 'completed' }), + createAndPoll: sinon.stub().resolves({ id: 'test-run-id', status: 'completed' }), + retrieve: sinon.stub().resolves({ id: 'test-run-id', status: 'completed' }), + submitToolOutputs: sinon.stub().resolves({ id: 'test-run-id', status: 'completed' }), + submitToolOutputsAndPoll: sinon.stub().resolves({ id: 'test-run-id', status: 'completed' }), + list: sinon.stub().resolves({ + data: [ + { + id: 'test-run-id', + status: 'completed' + } + ] + }) + }, + messages: { + create: sinon.stub().resolves({ id: 'test-message-id' }), + list: sinon.stub().resolves({ + data: [ + { + id: 'test-message-id', + content: [{ type: 'text', text: { value: 'Test response' } }] + } + ] + }) + } + } + } as unknown as OpenAI['beta']; + + const options: AssistantsPlannerOptions = { + apiKey: 'test-key', + assistant_id: 'test-assistant-id' + }; + + planner = new AssistantsPlanner(options); + (planner as any)._client = openAIStub; + const testAdapter = new TestAdapter(); - const context = new TurnContext(testAdapter, { - channelId: 'msteams', - recipient: { - id: 'bot', - name: 'bot' - }, - from: { - id: 'user', - name: 'user' - }, - conversation: { - id: 'convo', - isGroup: false, - conversationType: 'personal', - name: 'convo' - }, - ...activity + context = new TurnContext(testAdapter, { + type: 'message', + text: 'test input', + channelId: 'test', + from: { id: 'user', name: 'User' }, + recipient: { id: 'bot', name: 'Bot' }, + conversation: { id: 'conversation', isGroup: false, conversationType: 'personal', name: 'Conversation' }, + channelData: {} }); - const state: TurnState = new TurnState(); + + state = new TurnState(); await state.load(context); state.temp = { - input: '', + input: 'test input', inputFiles: [], lastOutput: '', actionOutputs: {}, authTokens: {} }; - return [context, state]; - }; - - describe('beginTask', async () => { - it('expects a single reply', async () => { - const testClient = new TestAssistantsClient(); - const planner = new TestAssistantsPlanner( - { apiKey: 'test-key', assistant_id: 'test-assistant-id' }, - testClient - ); - const [context, state] = await createTurnContextAndState({}); - state.temp.input = 'hello'; - - const aiOptions: AIOptions = { - planner: planner - }; - const ai = new AI(aiOptions); - - testClient.remainingRunStatus.push('completed'); - testClient.remainingMessages.push('welcome'); - - const plan = await planner.beginTask(context, state, ai); - - assert(plan); - assert(plan.commands); - assert.equal(plan.commands.length, 1); - assert.equal(plan.commands[0].type, 'SAY'); - assert.equal('welcome', (plan.commands[0] as PredictedSayCommand).response.content); - }); - - it('waits for current run', async () => { - const testClient = new TestAssistantsClient(); - const planner = new TestAssistantsPlanner( - { apiKey: 'test-key', assistant_id: 'test-assistant-id' }, - testClient - ); - const [context, state] = await createTurnContextAndState({}); - state.temp.input = 'hello'; + ai = new AI({ planner }); + }); - const aiOptions: AIOptions = { - planner: planner - }; - const ai = new AI(aiOptions); + afterEach(() => { + sinon.restore(); + }); - testClient.remainingRunStatus.push('in_progress'); - testClient.remainingRunStatus.push('completed'); - testClient.remainingMessages.push('welcome'); + describe('beginTask', () => { + it('should create a thread and run, then return a plan', async () => { + (openAIStub.beta.threads.messages.list as sinon.SinonStub).resolves({ + data: [ + { + id: 'test-message-id-2', + content: [{ type: 'text', text: { value: 'New response' } }] + }, + { + id: 'test-message-id', + content: [{ type: 'text', text: { value: 'Test response' } }] + } + ] + }); const plan = await planner.beginTask(context, state, ai); - assert(plan); - assert(plan.commands); - assert.equal(plan.commands.length, 1); - assert.equal(plan.commands[0].type, 'SAY'); - assert.equal('welcome', (plan.commands[0] as PredictedSayCommand).response.content); + sinon.assert.calledOnce(openAIStub.beta.threads.create as sinon.SinonStub); + sinon.assert.calledWith(openAIStub.beta.threads.messages.create as sinon.SinonStub, 'test-thread-id', { + role: 'user', + content: 'test input' + }); + sinon.assert.calledWith(openAIStub.beta.threads.runs.createAndPoll as sinon.SinonStub, 'test-thread-id', { + assistant_id: 'test-assistant-id' + }); + + assert.strictEqual(plan.type, 'plan'); + assert.strictEqual(plan.commands.length, 1); + assert.strictEqual(plan.commands[0].type, 'SAY'); + assert.strictEqual((plan.commands[0] as PredictedSayCommand).response.content, 'New response'); }); - it('waits for previous run', async () => { - const testClient = new TestAssistantsClient(); - const planner = new TestAssistantsPlanner( - { apiKey: 'test-key', assistant_id: 'test-assistant-id' }, - testClient - ); - const [context, state] = await createTurnContextAndState({}); - state.temp.input = 'hello'; - - const aiOptions: AIOptions = { - planner: planner - }; - const ai = new AI(aiOptions); - - testClient.remainingRunStatus.push('failed'); - testClient.remainingRunStatus.push('completed'); - testClient.remainingMessages.push('welcome'); - - const thread = await testClient.createThread({}); - await testClient.createRun(thread.id, { assistantId: 'assistant_id' }); - state.setValue('conversation.assistants_state', { threadId: thread.id }); + it('should handle run cancellation', async () => { + (openAIStub.beta.threads.runs.retrieve as sinon.SinonStub).resolves({ + id: 'test-run-id', + status: 'cancelled' + }); const plan = await planner.beginTask(context, state, ai); - assert(plan); - assert(plan.commands); - assert.equal(plan.commands.length, 1); - assert.equal(plan.commands[0].type, 'SAY'); - assert.equal('welcome', (plan.commands[0] as PredictedSayCommand).response.content); + assert.strictEqual(plan.type, 'plan'); + assert.strictEqual(plan.commands.length, 0); }); - it('run cancelled', async () => { - const testClient = new TestAssistantsClient(); - const planner = new TestAssistantsPlanner( - { apiKey: 'test-key', assistant_id: 'test-assistant-id' }, - testClient - ); - const [context, state] = await createTurnContextAndState({}); - state.temp.input = 'hello'; - - const aiOptions: AIOptions = { - planner: planner - }; - const ai = new AI(aiOptions); - - testClient.remainingRunStatus.push('cancelled'); - testClient.remainingMessages.push('welcome'); + it('should handle run expiration', async () => { + (openAIStub.beta.threads.runs.retrieve as sinon.SinonStub).resolves({ + id: 'test-run-id', + status: 'expired' + }); const plan = await planner.beginTask(context, state, ai); - assert(plan); - assert(plan.commands); - assert.equal(plan.commands.length, 0); + assert.strictEqual(plan.type, 'plan'); + assert.strictEqual(plan.commands.length, 1); + assert.strictEqual(plan.commands[0].type, 'DO'); + assert.strictEqual((plan.commands[0] as PredictedDoCommand).action, AI.TooManyStepsActionName); }); - it('run expired', async () => { - const testClient = new TestAssistantsClient(); - const planner = new TestAssistantsPlanner( - { apiKey: 'test-key', assistant_id: 'test-assistant-id' }, - testClient - ); - const [context, state] = await createTurnContextAndState({}); - state.temp.input = 'hello'; - - const aiOptions: AIOptions = { - planner: planner - }; - const ai = new AI(aiOptions); - - testClient.remainingRunStatus.push('expired'); - testClient.remainingMessages.push('welcome'); - - const plan = await planner.beginTask(context, state, ai); - - assert(plan); - assert(plan.commands); - assert.equal(plan.commands.length, 1); - assert.equal(plan.commands[0].type, 'DO'); - assert.equal((plan.commands[0] as PredictedDoCommand).action, AI.TooManyStepsActionName); - }); + it('should throw an error on run failure', async () => { + (openAIStub.beta.threads.runs.retrieve as sinon.SinonStub).resolves({ + id: 'test-run-id', + status: 'failed', + last_error: { code: 'test_error', message: 'Test error message' } + }); - it('run failed', async () => { - const testClient = new TestAssistantsClient(); - const planner = new TestAssistantsPlanner( - { apiKey: 'test-key', assistant_id: 'test-assistant-id' }, - testClient + await assert.rejects( + () => planner.beginTask(context, state, ai), + /Run failed failed. ErrorCode: test_error. ErrorMessage: Test error message/ ); - const [context, state] = await createTurnContextAndState({}); - state.temp.input = 'hello'; - - const aiOptions: AIOptions = { - planner: planner - }; - const ai = new AI(aiOptions); - - testClient.remainingRunStatus.push('failed'); - testClient.remainingMessages.push('welcome'); - - try { - await planner.beginTask(context, state, ai); - } catch (e) { - assert((e as Error).message.indexOf('Run failed') >= 0); - return; - } - - assert.fail(); }); }); - describe('continueTask()', () => { - it('requires action', async () => { - const testClient = new TestAssistantsClient(); - const planner = new TestAssistantsPlanner( - { apiKey: 'test-key', assistant_id: 'test-assistant-id' }, - testClient - ); - const [context, state] = await createTurnContextAndState({}); - state.temp.input = 'hello'; - - const aiOptions: AIOptions = { - planner: planner - }; - const ai = new AI(aiOptions); - - const functionToolCall: RequiredFunctionToolCall = { - type: 'function', - id: 'test-tool-id', - function: { - name: 'test-action', - arguments: '{}', - output: null - } - }; - const requiredAction: RequiredAction = { - type: 'submit_tool_outputs', - submitToolOutputs: { - toolCalls: [functionToolCall] - } - }; - - testClient.remainingActions.push(requiredAction); - testClient.remainingRunStatus.push('requires_action'); - testClient.remainingRunStatus.push('in_progress'); - testClient.remainingRunStatus.push('completed'); - testClient.remainingMessages.push('welcome'); - - const plan1 = await planner.continueTask(context, state, ai); - state.temp.actionOutputs['test-action'] = 'test-output'; - const plan2 = await planner.continueTask(context, state, ai); - - assert(plan1); - assert(plan1.commands); - assert.equal(plan1.commands.length, 1); - assert.equal(plan1.commands[0].type, 'DO'); - assert.equal((plan1.commands[0] as PredictedDoCommand).action, 'test-action'); - assert(plan2); - assert(plan2.commands); - assert.equal(plan2.commands[0].type, 'SAY'); - assert.equal((plan2.commands[0] as PredictedSayCommand).response.content, 'welcome'); - - const toolMap: { [key: string]: string } = state.getValue('temp.submitToolMap'); - assert(toolMap); - assert.equal(Object.keys(toolMap).length, 1); - assert('test-action' in toolMap); - assert(toolMap['test-action'], 'test-tool_id'); - }); + describe('continueTask', () => { + it('should continue an existing thread and run', async () => { + // Setup the initial state + state.setValue('conversation.assistants_state', { + thread_id: 'existing-thread-id', + run_id: 'existing-run-id', + last_message_id: 'existing-message-id' + }); + + // Setup action outputs + state.temp.actionOutputs = { test_function: 'test output' }; + state.setValue('temp.submitToolMap', { test_function: 'test-tool-call-id' }); + state.setValue('temp.submitToolOutputs', true); + + // Mock messages list response + (openAIStub.beta.threads.messages.list as sinon.SinonStub).resolves({ + data: [ + { + id: 'new-message-id', + content: [{ type: 'text', text: { value: 'New response' } }] + }, + { + id: 'existing-message-id', + content: [{ type: 'text', text: { value: 'Old response' } }] + } + ] + }); - it('ignores redundant action', async () => { - const testClient = new TestAssistantsClient(); - const planner = new TestAssistantsPlanner( - { apiKey: 'test-key', assistant_id: 'test-assistant-id' }, - testClient - ); - const [context, state] = await createTurnContextAndState({}); - state.temp.input = 'hello'; - state.temp.actionOutputs['other-action'] = 'should not be used'; - - const aiOptions: AIOptions = { - planner: planner - }; - const ai = new AI(aiOptions); - - const functionToolCall: RequiredFunctionToolCall = { - type: 'function', - id: 'test-tool-id', - function: { - name: 'test-action', - arguments: '{}', - output: null - } - }; - const requiredAction: RequiredAction = { - type: 'submit_tool_outputs', - submitToolOutputs: { - toolCalls: [functionToolCall] - } - }; - - testClient.remainingActions.push(requiredAction); - testClient.remainingRunStatus.push('requires_action'); - testClient.remainingRunStatus.push('in_progress'); - testClient.remainingRunStatus.push('completed'); - testClient.remainingMessages.push('welcome'); - - const plan1 = await planner.continueTask(context, state, ai); - state.temp.actionOutputs['test-action'] = 'test-output'; - const plan2 = await planner.continueTask(context, state, ai); - - assert(plan1); - assert(plan1.commands); - assert.equal(plan1.commands.length, 1); - assert.equal(plan1.commands[0].type, 'DO'); - assert.equal((plan1.commands[0] as PredictedDoCommand).action, 'test-action'); - assert(plan2); - assert(plan2.commands); - assert.equal(plan2.commands[0].type, 'SAY'); - assert.equal((plan2.commands[0] as PredictedSayCommand).response.content, 'welcome'); - - const toolMap: { [key: string]: string } = state.getValue('temp.submitToolMap'); - assert(toolMap); - assert.equal(Object.keys(toolMap).length, 1); - assert('test-action' in toolMap); - assert(toolMap['test-action'], 'test-tool_id'); - }); + const plan = await planner.continueTask(context, state, ai); - it('handles multiple messages', async () => { - const testClient = new TestAssistantsClient(); - const planner = new TestAssistantsPlanner( - { apiKey: 'test-key', assistant_id: 'test-assistant-id' }, - testClient + // Verify submitToolOutputsAndPoll was called with correct arguments + sinon.assert.calledWith( + openAIStub.beta.threads.runs.submitToolOutputsAndPoll as sinon.SinonStub, + 'existing-thread-id', + 'existing-run-id', + { + tool_outputs: [ + { + tool_call_id: 'test-tool-call-id', + output: 'test output' + } + ] + } ); - const [context, state] = await createTurnContextAndState({}); - state.temp.input = 'hello'; - state.temp.actionOutputs['other-action'] = 'should not be used'; - const aiOptions: AIOptions = { - planner: planner - }; - const ai = new AI(aiOptions); + // Verify the plan structure + assert.strictEqual(plan.type, 'plan'); + assert.strictEqual(plan.commands.length, 1); + assert.strictEqual(plan.commands[0].type, 'SAY'); + assert.strictEqual((plan.commands[0] as PredictedSayCommand).response.content, 'New response'); + }); - testClient.remainingRunStatus.push('completed'); - testClient.remainingMessages.push('message 2'); - testClient.remainingMessages.push('message 1'); - testClient.remainingMessages.push('welcome'); + it('should handle required actions', async () => { + (openAIStub.beta.threads.runs.retrieve as sinon.SinonStub).resolves({ + id: 'test-run-id', + status: 'requires_action', + required_action: { + type: 'submit_tool_outputs', + submit_tool_outputs: { + tool_calls: [ + { + id: 'test-tool-call-id', + type: 'function', + function: { + name: 'test_function', + arguments: '{"arg1": "value1"}' + } + } + ] + } + } + }); const plan = await planner.continueTask(context, state, ai); - assert(plan); - assert(plan.commands); - assert.equal(plan.commands.length, 3); - assert.equal(plan.commands[0].type, 'SAY'); - assert.equal((plan.commands[0] as PredictedSayCommand).response.content, 'message 2'); - assert.equal((plan.commands[1] as PredictedSayCommand).response.content, 'message 1'); - assert.equal((plan.commands[2] as PredictedSayCommand).response.content, 'welcome'); + assert.strictEqual(plan.type, 'plan'); + assert.strictEqual(plan.commands.length, 1); + assert.strictEqual(plan.commands[0].type, 'DO'); + assert.strictEqual((plan.commands[0] as PredictedDoCommand).action, 'test_function'); + assert.deepStrictEqual((plan.commands[0] as PredictedDoCommand).parameters, { arg1: 'value1' }); }); }); -}); -class TestAssistantsPlanner extends AssistantsPlanner { - public constructor(options: AssistantsPlannerOptions, client: AssistantsClient) { - options.polling_interval = 2; - super(options); - this._client = client; - } -} - -class TestAssistantsClient extends AssistantsClient { - private _threads: AssistantThread[]; - private _messages: { [key: string]: ThreadMessage[] }; - private _runs: { [key: string]: ThreadRun[] }; - public remainingActions: RequiredAction[]; - public remainingRunStatus: string[]; - public remainingMessages: string[]; - - private _assistant: Assistant; - - public constructor() { - super(new OpenAIKeyCredential('api-key')); - this._threads = []; - this._messages = {}; - this._runs = {}; - this.remainingActions = []; - this.remainingRunStatus = []; - this.remainingMessages = []; - this._assistant = { - id: 'assistant_id', - createdAt: new Date(), - name: 'test assistant', - description: 'test assistant description', - model: 'test model', - instructions: 'test instructions', - tools: [], - fileIds: [], - metadata: null - }; - } - - public override async createMessage( - threadId: string, - role: MessageRole, - content: string, - options?: CreateMessageOptions - ): Promise { - const newMessage: ThreadMessage = { - id: Date.now().toString(), - createdAt: new Date(), - threadId: threadId, - role: role, - content: [{ type: 'text', text: { value: content, annotations: [] } }], - assistantId: this._assistant?.id, - runId: '', - fileIds: options?.fileIds, - metadata: null - }; - - if (threadId in this._messages) { - this._messages[threadId].push(newMessage); - } else { - this._messages[threadId] = [newMessage]; - } - - return newMessage; - } - - public override async createThread( - body?: AssistantThreadCreationOptions, - options?: CreateThreadOptions - ): Promise { - const newThread: AssistantThread = { - id: Date.now().toString(), - createdAt: new Date(), - metadata: body!.metadata ?? null - }; + describe('submitActionResults', () => { + it('should submit action results and return a plan', async () => { + // Setup the initial state + state.setValue('conversation.assistants_state', { + thread_id: 'test-thread-id', + run_id: 'test-run-id', + last_message_id: 'test-message-id' + }); + + // Setup action outputs + state.temp.actionOutputs = { test_function: 'test output' }; + state.setValue('temp.submitToolMap', { test_function: 'test-tool-call-id' }); + + // Mock messages list response with messages before last_message_id + (openAIStub.beta.threads.messages.list as sinon.SinonStub).resolves({ + data: [ + { + id: 'new-message-id', + content: [{ type: 'text', text: { value: 'New response' } }] + }, + { + id: 'test-message-id', + content: [{ type: 'text', text: { value: 'Old response' } }] + } + ] + }); + + // Mock the run completion + (openAIStub.beta.threads.runs.submitToolOutputsAndPoll as sinon.SinonStub).resolves({ + id: 'test-run-id', + status: 'completed' + }); + + const plan = await (planner as any).submitActionResults(context, state, ai); + + // Verify submitToolOutputsAndPoll was called with correct arguments + sinon.assert.calledWith( + openAIStub.beta.threads.runs.submitToolOutputsAndPoll as sinon.SinonStub, + 'test-thread-id', + 'test-run-id', + { + tool_outputs: [ + { + tool_call_id: 'test-tool-call-id', + output: 'test output' + } + ] + } + ); - const newMessages: ThreadMessage[] = []; - const len = body?.messages?.length ?? 0; - for (let i = 0; i < len; i++) { - const m = body!.messages![i]; - const newMessage: ThreadMessage = { - role: m.role, - id: Date.now.toString(), - createdAt: new Date(), - threadId: newThread.id, - content: [{ type: 'text', text: { value: m.content, annotations: [] } }], - assistantId: this._assistant?.id, - runId: '', - fileIds: [], - metadata: null - }; - newMessages.push(newMessage); - } - - this._messages[newThread.id] = newMessages; - this._threads.push(newThread); - return Promise.resolve(newThread); - } - - public override async listMessages( - thread_id: string, - options?: ListMessagesOptions - ): Promise> { - while (this.remainingMessages.length > 0) { - const nextMessage = this.remainingMessages.shift(); // Removes the first element from the list - this.createMessage(thread_id, 'user', nextMessage!); - } - - const lastMessageId = options?.before; - const i = this._messages[thread_id].findIndex((m) => m.id == lastMessageId); - const filteredMessages = this._messages[thread_id].slice(i + 1); - - // the elements are in ascending order of the creation timestamp - filteredMessages.reverse(); - - return Promise.resolve({ - data: filteredMessages, - firstId: '', - lastId: '', - hasMore: false + // Verify the plan structure + assert.strictEqual(plan.type, 'plan'); + assert.strictEqual(plan.commands.length, 1); + assert.strictEqual(plan.commands[0].type, 'SAY'); + assert.strictEqual((plan.commands[0] as PredictedSayCommand).response.content, 'New response'); }); - } - - public async createRun( - thread_id: string, - createRunOptions: CreateRunOptions, - options?: CreateRunRequestOptions - ): Promise { - let remainingActions: RequiredAction; - - if (this.remainingActions.length > 0) { - remainingActions = this.remainingActions.shift()!; - } - - const newRun: ThreadRun = { - id: Date.now().toString(), - threadId: thread_id, - assistantId: this._assistant!.id, - status: 'in_progress', - requiredAction: remainingActions!, - model: this._assistant?.model ?? 'test-model', - instructions: this._assistant?.instructions ?? 'instructions', - tools: this._assistant?.tools ?? [], - fileIds: [], - createdAt: new Date(), - expiresAt: new Date(), - startedAt: new Date(), - completedAt: new Date(), - cancelledAt: new Date(), - failedAt: new Date(), - metadata: null - }; - - if (thread_id in this._runs) { - this._runs[thread_id].push(newRun); - } else { - this._runs[thread_id] = [newRun]; - } - - return Promise.resolve(newRun); - } - - public override async getRun(threadId: string, runId: string, options?: GetRunOptions): Promise { - if (this._runs[threadId].length == 0) { - return Promise.reject(); - } - - const runStatus = this.remainingRunStatus.shift(); // dequeue - const i = this._runs[threadId].findIndex((r) => r.id == runId); - - const run = this._runs[threadId][i]; - run.status = runStatus!; - - return Promise.resolve(run); - } + }); - public override async listRuns(threadId: string, options?: ListRunsOptions): Promise> { - const runs = this._runs[threadId] ?? []; - return { - data: runs, - firstId: '', - lastId: '', - hasMore: false - }; - } - - public override async submitToolOutputsToRun( - threadId: string, - runId: string, - toolOutputs: ToolOutput[], - options?: SubmitToolOutputsToRunOptions - ): Promise { - return Promise.resolve(this.getRun(threadId, runId)); - } -} + describe('blockOnInProgressRuns', () => { + it('should wait for in-progress runs to complete', async () => { + (openAIStub.beta.threads.runs.list as sinon.SinonStub) + .onFirstCall() + .resolves({ + data: [{ id: 'run-1', status: 'in_progress' }] + }) + .onSecondCall() + .resolves({ + data: [{ id: 'run-1', status: 'completed' }] + }); + + await (planner as any).blockOnInProgressRuns('test-thread-id'); + + sinon.assert.calledWith(openAIStub.beta.threads.runs.list as sinon.SinonStub, 'test-thread-id'); + }); + }); +}); diff --git a/js/packages/teams-ai/src/planners/AssistantsPlanner.ts b/js/packages/teams-ai/src/planners/AssistantsPlanner.ts index 376da2c16..b6e4e5dd5 100644 --- a/js/packages/teams-ai/src/planners/AssistantsPlanner.ts +++ b/js/packages/teams-ai/src/planners/AssistantsPlanner.ts @@ -6,21 +6,13 @@ * Licensed under the MIT License. */ -import { Planner, Plan, PredictedDoCommand, PredictedSayCommand } from './Planner'; -import { TurnState } from '../TurnState'; import { TurnContext } from 'botbuilder'; +import OpenAI, { AzureClientOptions, AzureOpenAI } from 'openai'; + import { AI } from '../AI'; -import { - Assistant, - AssistantCreationOptions, - AssistantsClient, - AzureKeyCredential, - OpenAIKeyCredential, - RequiredAction, - ThreadMessage, - ThreadRun, - ToolOutput -} from '@azure/openai-assistants'; +import { TurnState } from '../TurnState'; + +import { Planner, Plan, PredictedDoCommand, PredictedSayCommand } from './Planner'; /** * @private @@ -47,17 +39,19 @@ const SUBMIT_TOOL_OUTPUTS_MAP = 'temp.submitToolMap'; */ export interface AssistantsPlannerOptions { /** - * The OpenAI or Azure OpenAI API key. + * The OpenAI or Azure OpenAI API key. Required. */ apiKey: string; /** * The Azure OpenAI resource endpoint. + * @remarks + * Required when using Azure OpenAI. Not used for OpenAI. */ endpoint?: string; /** - * The ID of the assistant to use. + * The ID of the assistant to use. Required. */ assistant_id: string; @@ -77,34 +71,38 @@ export interface AssistantsPlannerOptions { } /** - * A Planner that uses the OpenAI Assistants API. + * A Planner that uses the OpenAI Assistants API to generate plans for the AI system. * @template TState Optional. Type of application state. + * @remarks + * This planner manages conversations through OpenAI's thread-based system, handling: + * - Thread creation and management + * - Message submission + * - Tool/function calling + * - Response processing */ export class AssistantsPlanner implements Planner { private readonly _options: AssistantsPlannerOptions; - protected _client: AssistantsClient; - protected _assistant?: Assistant; + private _client: OpenAI; /** * Creates a new `AssistantsPlanner` instance. * @param {AssistantsPlannerOptions} options - Options for configuring the AssistantsPlanner. */ public constructor(options: AssistantsPlannerOptions) { - this._options = Object.assign( - { - polling_interval: DEFAULT_POLLING_INTERVAL, - assistants_state_variable: DEFAULT_ASSISTANTS_STATE_VARIABLE - }, - options - ); + this._options = { + polling_interval: DEFAULT_POLLING_INTERVAL, + assistants_state_variable: DEFAULT_ASSISTANTS_STATE_VARIABLE, + ...options + }; - this._client = AssistantsPlanner.createClient(options.apiKey, options.endpoint); + this._client = AssistantsPlanner.createClient(options.apiKey, options.endpoint, this._options); } /** * Starts a new task. * @remarks - * This method is called when the AI system is ready to start a new task. The planner should + * This method is called when the AI system is ready to start a new task. It delegates the + * task handling to the `continueTask` method. The planner should * generate a plan that the AI system will execute. Returning an empty plan signals that * there is no work to be performed. * @@ -114,17 +112,22 @@ export class AssistantsPlanner implements * @param {AI} ai - The AI system that is generating the plan. * @returns {Promise} The plan that was generated. */ - public beginTask(context: TurnContext, state: TState, ai: AI): Promise { - return this.continueTask(context, state, ai); + public async beginTask(context: TurnContext, state: TState, ai: AI): Promise { + const threadId = await this.ensureThreadCreated(state, context.activity.text); + await this.blockOnInProgressRuns(threadId); + return await this.submitUserInput(context, state, ai); } /** * Continues the current task. * @remarks - * This method is called when the AI system has finished executing the previous plan and is - * ready to continue the current task. The planner should generate a plan that the AI system - * will execute. Returning an empty plan signals that the task is completed and there is no work - * to be performed. + * This method is called when the AI system is ready to continue the current task. It handles: + * - Creating a new thread if one doesn't exist + * - Submitting tool outputs if required + * - Waiting for any in-progress runs to complete + * - Submitting user input and creating a new run + * The method generates a plan that the AI system will execute. Returning an empty plan signals + * that the task is completed and there is no work to be performed. * * The output from the last plan step that was executed is passed to the planner via `state.temp.input`. * @param {TurnContext} context - Context for the current turn of conversation. @@ -133,260 +136,250 @@ export class AssistantsPlanner implements * @returns {Promise} The plan that was generated. */ public async continueTask(context: TurnContext, state: TState, ai: AI): Promise { - // Create a new thread if we don't have one already - const thread_id = await this.ensureThreadCreated(state, context.activity.text); - - // Add the users input to the thread or send tool outputs - if (state.getValue(SUBMIT_TOOL_OUTPUTS_VARIABLE) == true) { - // Send the tool output to the assistant - return await this.submitActionResults(context, state, ai); - } else { - // Wait for any current runs to complete since you can't add messages or start new runs - // if there's already one in progress - await this.blockOnInProgressRuns(thread_id); - - // Submit user input - return await this.submitUserInput(context, state, ai); - } + return await this.submitActionResults(context, state, ai); } /** - * Static helper method for programmatically creating an assistant. + * Creates a new assistant using the OpenAI Assistants API. * @param {string} apiKey - OpenAI API key. - * @param {AssistantCreationOptions} request - Definition of the assistant to create. - * @param {string} endpoint - The Azure OpenAI resource endpoint. - * @returns {Promise} The created assistant. + * @param {OpenAI.Beta.AssistantCreateParams} request - Definition of the assistant to create. + * @param {string} endpoint - Optional. The Azure OpenAI resource endpoint. Required when using Azure OpenAI. + * @param {Record} azureClientOptions - Optional. The Azure OpenAI client options. + * @returns {Promise} The created assistant. + * @throws {Error} If the assistant creation fails. */ public static async createAssistant( apiKey: string, - request: AssistantCreationOptions, - endpoint?: string - ): Promise { - const client = AssistantsPlanner.createClient(apiKey, endpoint); - return await client.createAssistant(request); + request: OpenAI.Beta.AssistantCreateParams, + endpoint?: string, + azureClientOptions?: AzureClientOptions + ): Promise { + const client = AssistantsPlanner.createClient(apiKey, endpoint, azureClientOptions); + return await client.beta.assistants.create(request); } /** + * Ensures a thread exists for the current conversation. * @private - * Exposed for unit testing. - * @param {string} thread_id The thread id to retrieve the run. - * @returns {Promise} The retrieved run. + * @param {TurnState} state - The application Turn State. + * @param {string} input - The initial thread input. + * @returns {Promise} The thread ID. */ - protected async retrieveLastRun(thread_id: string): Promise { - const list = await this._client.listRuns(thread_id, { limit: 1 }); - if (list.data.length > 0) { - return list.data[0]; + private async ensureThreadCreated(state: TState, input: string): Promise { + const assistantsState = this.ensureAssistantsState(state); + if (assistantsState.thread_id == null) { + const thread = await this._client.beta.threads.create(); + assistantsState.thread_id = thread.id; + this.updateAssistantsState(state, assistantsState); } - return null; + return assistantsState.thread_id; } /** + * Checks if a run has reached a terminal state. * @private - * @param {ThreadRun} run - The run to be checked for completion. - * @returns {boolean} True if completed, otherwise false. + * @param {OpenAI.Beta.Threads.Run} run - The run to check. + * @returns {boolean} True if the run is in a completed state. */ - private isRunCompleted(run: ThreadRun): boolean { - switch (run.status) { - case 'completed': - case 'failed': - case 'cancelled': - case 'expired': - return true; - } - - return false; + private isRunCompleted(run: OpenAI.Beta.Threads.Run): boolean { + return ['completed', 'failed', 'cancelled', 'expired'].includes(run.status); } /** * @private - * @param {string} thread_id - The current thread id. - * @param {string} run_id - The run id. - * @param {boolean} handleActions - Whether to handle actions. False by default. - * @returns {Promise} The current Run. + * Waits for a run to complete. + * @param {string} thread_id - The ID of the thread. + * @param {string} run_id - The ID of the run. + * @param {boolean} handleActions - Whether to handle actions. + * @returns {Promise} The completed run. */ - private async waitForRun(thread_id: string, run_id: string, handleActions = false): Promise { - // Wait for the run to complete + private async waitForRun( + thread_id: string, + run_id: string, + handleActions = false + ): Promise { while (true) { await new Promise((resolve) => setTimeout(resolve, this._options.polling_interval)); - const run = await this._client.getRun(thread_id, run_id); - switch (run.status) { - case 'requires_action': - if (handleActions) { - return run; - } - break; - case 'cancelled': - case 'failed': - case 'completed': - case 'expired': - return run; + const run = await this._client.beta.threads.runs.retrieve(thread_id, run_id); + if ((run.status === 'requires_action' && handleActions) || this.isRunCompleted(run)) { + return run; } } } /** * @private - * @param {TurnContext} context - The application Turn Context. - * @param {TState} state - The application Turn State. + * Submits action results to the assistant. + * @param {TurnContext} context - The turn context. + * @param {TState} state - The turn state. * @param {AI} ai - The AI instance. - * @returns {Promise} The action results as Plan. + * @returns {Promise} A plan based on the action results. */ private async submitActionResults(context: TurnContext, state: TState, ai: AI): Promise { - // Get the current assistant state - const assistants_state = this.ensureAssistantsState(state); + const assistantsState = this.ensureAssistantsState(state); - // Map the action outputs to tool outputs const actionOutputs = state.temp.actionOutputs; const toolMap = state.getValue(SUBMIT_TOOL_OUTPUTS_MAP) as { [key: string]: string }; - const toolOutputs: ToolOutput[] = []; + const toolOutputs: OpenAI.Beta.Threads.Runs.RunSubmitToolOutputsParams.ToolOutput[] = []; for (const action in actionOutputs) { const output = actionOutputs[action]; const toolCallId = toolMap[action]; if (toolCallId !== undefined) { - // Add required output only - toolOutputs.push({ toolCallId, output }); + toolOutputs.push({ tool_call_id: toolCallId, output }); } } - // Submit the tool outputs - const run = await this._client.submitToolOutputsToRun( - assistants_state.thread_id!, - assistants_state.run_id!, - toolOutputs + const run = await this._client.beta.threads.runs.submitToolOutputsAndPoll( + assistantsState.thread_id!, + assistantsState.run_id!, + { tool_outputs: toolOutputs } ); - // Wait for the run to complete - const results = await this.waitForRun(assistants_state.thread_id!, run.id, true); + const results = await this.waitForRun(assistantsState.thread_id!, run.id, true); switch (results.status) { - case 'requires_action': + case 'requires_action': { state.setValue(SUBMIT_TOOL_OUTPUTS_VARIABLE, true); - return this.generatePlanFromTools(state, results.requiredAction!); - case 'completed': + return this.generatePlanFromTools(state, results.required_action!.submit_tool_outputs.tool_calls); + } + case 'completed': { state.setValue(SUBMIT_TOOL_OUTPUTS_VARIABLE, false); - return this.generatePlanFromMessages(assistants_state.thread_id!, assistants_state.last_message_id!); - case 'cancelled': + return this.generatePlanFromMessages(assistantsState.thread_id!, assistantsState.last_message_id!); + } + case 'cancelled': { return { type: 'plan', commands: [] }; - case 'expired': + } + case 'expired': { + const expiredCommand: PredictedDoCommand = { + type: 'DO', + action: AI.TooManyStepsActionName, + parameters: {} + }; return { type: 'plan', - commands: [{ type: 'DO', action: AI.TooManyStepsActionName } as PredictedDoCommand] + commands: [expiredCommand] }; + } default: throw new Error( - `Run failed ${results.status}. ErrorCode: ${results.lastError?.code}. ErrorMessage: ${results.lastError?.message}` + `Run failed ${results.status}. ErrorCode: ${results.last_error?.code}. ErrorMessage: ${results.last_error?.message}` ); } } /** * @private - * @param {TurnContext} context - The application Turn Context. - * @param {TurnState} state - The application Turn State. + * Submits user input to the assistant. + * @param {TurnContext} context - The turn context. + * @param {TState} state - The turn state. * @param {AI} ai - The AI instance. - * @returns {Promise} - The user's input as Plan. + * @returns {Promise} A plan based on the user input. */ private async submitUserInput(context: TurnContext, state: TState, ai: AI): Promise { - // Get the current thread_id - const thread_id = await this.ensureThreadCreated(state, context.activity.text); + const threadId = await this.ensureThreadCreated(state, context.activity.text); - // Add the users input to the thread - const message = await this._client.createMessage(thread_id, 'user', state.temp.input); + const message = await this._client.beta.threads.messages.create(threadId, { + role: 'user', + content: state.temp.input + }); - // Create a new run - const run = await this._client.createRun(thread_id, { - assistantId: this._options.assistant_id + const run = await this._client.beta.threads.runs.createAndPoll(threadId, { + assistant_id: this._options.assistant_id }); - // Update state and wait for the run to complete - this.updateAssistantsState(state, { thread_id, run_id: run.id, last_message_id: message.id ?? null }); - const results = await this.waitForRun(thread_id, run.id, true); + this.updateAssistantsState(state, { thread_id: threadId, run_id: run.id, last_message_id: message.id }); + const results = await this.waitForRun(threadId, run.id, true); switch (results.status) { case 'requires_action': state.setValue(SUBMIT_TOOL_OUTPUTS_VARIABLE, true); - return this.generatePlanFromTools(state, results.requiredAction!); - case 'completed': + return this.generatePlanFromTools(state, results.required_action!.submit_tool_outputs.tool_calls); + case 'completed': { state.setValue(SUBMIT_TOOL_OUTPUTS_VARIABLE, false); - return this.generatePlanFromMessages(thread_id, message.id!); - case 'cancelled': + return this.generatePlanFromMessages(threadId, message.id); + } + case 'cancelled': { return { type: 'plan', commands: [] }; - case 'expired': + } + case 'expired': { + const expiredCommand: PredictedDoCommand = { + type: 'DO', + action: AI.TooManyStepsActionName, + parameters: {} + }; return { type: 'plan', - commands: [{ type: 'DO', action: AI.TooManyStepsActionName } as PredictedDoCommand] + commands: [expiredCommand] }; + } default: throw new Error( - `Run failed ${results.status}. ErrorCode: ${results.lastError?.code}. ErrorMessage: ${results.lastError?.message}` + `Run failed ${results.status}. ErrorCode: ${results.last_error?.code}. ErrorMessage: ${results.last_error?.message}` ); } } /** * @private - * @param {TurnState} state - The application Turn State. - * @param {RequiredAction} required_action - The required action. - * @returns {Plan} - The generated Plan. + * Generates a plan from tool calls. + * @param {TState} state - The turn state. + * @param {OpenAI.Beta.Threads.Runs.RequiredActionFunctionToolCall[]} toolCalls - The tool calls to generate the plan from. + * @returns {Plan} A plan based on the tool calls. */ - private generatePlanFromTools(state: TState, required_action: RequiredAction): Plan { + private generatePlanFromTools( + state: TState, + toolCalls: OpenAI.Beta.Threads.Runs.RequiredActionFunctionToolCall[] + ): Plan { const plan: Plan = { type: 'plan', commands: [] }; - const tool_map: { [key: string]: string } = {}; - required_action.submitToolOutputs!.toolCalls.forEach((tool_call) => { - tool_map[tool_call.function.name] = tool_call.id; - plan.commands.push({ + const toolMap: { [key: string]: string } = {}; + toolCalls.forEach((toolCall) => { + toolMap[toolCall.function.name] = toolCall.id; + const doCommand: PredictedDoCommand = { type: 'DO', - action: tool_call.function.name, - parameters: JSON.parse(tool_call.function.arguments) - } as PredictedDoCommand); + action: toolCall.function.name, + parameters: JSON.parse(toolCall.function.arguments) + }; + plan.commands.push(doCommand); }); - state.setValue(SUBMIT_TOOL_OUTPUTS_MAP, tool_map); + state.setValue(SUBMIT_TOOL_OUTPUTS_MAP, toolMap); return plan; } /** * @private - * @param {string} thread_id - The current thread's ID. - * @param {string} last_message_id - ID of the last message. - * @returns {Promise} The generated Plan from messages. + * Generates a plan from messages. + * @param {string} thread_id - The ID of the thread. + * @param {string} last_message_id - The ID of the last message. + * @returns {Promise} A plan based on the messages. */ private async generatePlanFromMessages(thread_id: string, last_message_id: string): Promise { - // Find the new messages - const messages = await this._client.listMessages(thread_id); - const newMessages: ThreadMessage[] = []; - for (let i = 0; i < messages.data.length; i++) { - const message = messages.data[i]; - if (message.id == last_message_id) { - break; - } else { - newMessages.push(message); - } - } + const messages = await this._client.beta.threads.messages.list(thread_id); - // listMessages return messages in desc, reverse to be in asc order - newMessages.reverse(); + const lastMessageIndex = messages.data.findIndex((message) => message.id === last_message_id); + const newMessages = lastMessageIndex >= 0 ? messages.data.slice(0, lastMessageIndex) : []; - // Convert the messages to SAY commands const plan: Plan = { type: 'plan', commands: [] }; newMessages.forEach((message) => { message.content.forEach((content) => { - if (content.type == 'text') { - plan.commands.push({ + if (content.type === 'text') { + const sayCommand: PredictedSayCommand = { type: 'SAY', response: { role: 'assistant', content: content.text.value, context: { intent: '', - citations: content.text.annotations.map((annotation) => ({ - title: '', - url: '', - filepath: '', - content: annotation.text - })) + citations: + content.text.annotations?.map((annotation) => ({ + title: '', + url: '', + filepath: '', + content: annotation.text + })) || [] } } - } as PredictedSayCommand); + }; + plan.commands.push(sayCommand); } }); }); @@ -395,8 +388,9 @@ export class AssistantsPlanner implements /** * @private - * @param {TurnState} state - The application Turn State. - * @returns {AssistantsState} - The current Assistant's State. + * Ensures that the assistants state exists in the turn state. + * @param {TState} state - The turn state. + * @returns {AssistantsState} The assistants state. */ private ensureAssistantsState(state: TState): AssistantsState { if (!state.hasValue(this._options.assistants_state_variable!)) { @@ -411,52 +405,32 @@ export class AssistantsPlanner implements } /** - * @param {TurnState} state - The application Turn State. - * @param {AssistantsState} assistants_state - The Assistant's State. * @private + * Updates the assistants state in the turn state. + * @param {TState} state - The turn state. + * @param {AssistantsState} assistantsState - The new assistants state. */ - private updateAssistantsState(state: TState, assistants_state: AssistantsState): void { - state.setValue(this._options.assistants_state_variable!, assistants_state); + private updateAssistantsState(state: TState, assistantsState: AssistantsState): void { + state.setValue(this._options.assistants_state_variable!, assistantsState); } /** * @private - * @param {TurnState} state - The application Turn State. - * @param {string} input - The thread input. - * @returns {Promise} The created thread. - */ - private async ensureThreadCreated(state: TState, input: string): Promise { - const assistants_state = this.ensureAssistantsState(state); - if (assistants_state.thread_id == null) { - const thread = await this._client.createThread({}); - assistants_state.thread_id = thread.id; - this.updateAssistantsState(state, assistants_state); - } - - return assistants_state.thread_id; - } - - /** - * @private - * @param {string} thread_id - The id of the thread. - * @returns {Promise} A Promise. + * Blocks until all in-progress runs are completed. + * @param {string} thread_id - The ID of the thread. */ private async blockOnInProgressRuns(thread_id: string): Promise { - // We loop until we're told the last run is completed while (true) { - const runs = await this._client.listRuns(thread_id, { limit: 1 }); - if (runs.data.length == 0) { - return; - } - - const run = runs.data[0]; + const runs = await this._client.beta.threads.runs.list(thread_id, { limit: 1 }); - if (!run || this.isRunCompleted(run)) { - return; + if (runs.data.length === 0) { + return; // No runs, so we're done } - - // Wait for the current run to complete and then loop to see if there's already a new run. - await this.waitForRun(thread_id, run.id); + const latestRun = runs.data[0]; + if (this.isRunCompleted(latestRun)) { + return; // Latest run is completed, so we're done + } + await this.waitForRun(thread_id, latestRun.id); } } @@ -464,15 +438,16 @@ export class AssistantsPlanner implements * @private * @param {string} apiKey - The api key * @param {string} endpoint - The Azure OpenAI resource endpoint - * @returns {AssistantsClient} the client + * @param {Record} azureClientOptions - The Azure OpenAI client options. + * @returns {OpenAI} the client */ - private static createClient(apiKey: string, endpoint?: string): AssistantsClient { + private static createClient(apiKey: string, endpoint?: string, azureClientOptions?: AzureClientOptions): OpenAI { if (endpoint) { // Azure OpenAI - return new AssistantsClient(endpoint, new AzureKeyCredential(apiKey)); + return new AzureOpenAI({ endpoint, apiKey, ...azureClientOptions }); } else { // OpenAI - return new AssistantsClient(new OpenAIKeyCredential(apiKey)); + return new OpenAI({ apiKey }); } } } diff --git a/js/samples/03.ai-concepts/f.chatModeration/src/bot.ts b/js/samples/03.ai-concepts/f.chatModeration/src/bot.ts index beaa4e908..1c8244e75 100644 --- a/js/samples/03.ai-concepts/f.chatModeration/src/bot.ts +++ b/js/samples/03.ai-concepts/f.chatModeration/src/bot.ts @@ -68,7 +68,7 @@ if (process.env.OPENAI_KEY) { category: 'Violence', severity: ModerationSeverity.High } - ], + ] // haltOnBlocklistHit: true, // blocklistNames: [] // Text blocklist Name. Only support following characters: 0-9 A-Z a-z - . _ ~. You could attach multiple lists name here. }); diff --git a/js/samples/04.ai-apps/e.assistants-orderBot/.gitignore b/js/samples/04.ai-apps/e.assistants-orderBot/.gitignore index d35dca83b..6e9cf82bb 100644 --- a/js/samples/04.ai-apps/e.assistants-orderBot/.gitignore +++ b/js/samples/04.ai-apps/e.assistants-orderBot/.gitignore @@ -112,3 +112,6 @@ env/.env.*.user env/.env.local appPackage/build .deployment +.localConfigs.testTool +.testTool.installInfo.json +teamsapptesttool.log diff --git a/js/samples/04.ai-apps/e.assistants-orderBot/.vscode/launch.json b/js/samples/04.ai-apps/e.assistants-orderBot/.vscode/launch.json index 063ae2e52..958aba606 100644 --- a/js/samples/04.ai-apps/e.assistants-orderBot/.vscode/launch.json +++ b/js/samples/04.ai-apps/e.assistants-orderBot/.vscode/launch.json @@ -28,9 +28,7 @@ "type": "msedge", "request": "launch", "url": "https://teams.microsoft.com/l/app/${{local:TEAMS_APP_ID}}?installAppPackage=true&webjoin=true&${account-hint}", - "cascadeTerminateToConfigurations": [ - "Attach to Local Service" - ], + "cascadeTerminateToConfigurations": ["Attach to Local Service"], "presentation": { "group": "all", "hidden": true @@ -42,9 +40,7 @@ "type": "chrome", "request": "launch", "url": "https://teams.microsoft.com/l/app/${{local:TEAMS_APP_ID}}?installAppPackage=true&webjoin=true&${account-hint}", - "cascadeTerminateToConfigurations": [ - "Attach to Local Service" - ], + "cascadeTerminateToConfigurations": ["Attach to Local Service"], "presentation": { "group": "all", "hidden": true @@ -67,10 +63,7 @@ "compounds": [ { "name": "Debug (Edge)", - "configurations": [ - "Launch App (Edge)", - "Attach to Local Service" - ], + "configurations": ["Launch App (Edge)", "Attach to Local Service"], "preLaunchTask": "Start Teams App Locally", "presentation": { "group": "all", @@ -80,16 +73,23 @@ }, { "name": "Debug (Chrome)", - "configurations": [ - "Launch App (Chrome)", - "Attach to Local Service" - ], + "configurations": ["Launch App (Chrome)", "Attach to Local Service"], "preLaunchTask": "Start Teams App Locally", "presentation": { "group": "all", "order": 2 }, "stopAll": true + }, + { + "name": "Debug in Test Tool", + "configurations": ["Attach to Local Service"], + "preLaunchTask": "Start Teams App (Test Tool)", + "presentation": { + "group": "local", + "order": 1 + }, + "stopAll": true } ] } diff --git a/js/samples/04.ai-apps/e.assistants-orderBot/.vscode/tasks.json b/js/samples/04.ai-apps/e.assistants-orderBot/.vscode/tasks.json index 585f86ae9..f4729471a 100644 --- a/js/samples/04.ai-apps/e.assistants-orderBot/.vscode/tasks.json +++ b/js/samples/04.ai-apps/e.assistants-orderBot/.vscode/tasks.json @@ -6,13 +6,7 @@ "tasks": [ { "label": "Start Teams App Locally", - "dependsOn": [ - "Validate prerequisites", - "Start local tunnel", - "Provision", - "Deploy", - "Start application" - ], + "dependsOn": ["Validate prerequisites", "Start local tunnel", "Provision", "Deploy", "Start application"], "dependsOrder": "sequence" }, { @@ -100,6 +94,105 @@ "endsPattern": "restify listening to|Bot/ME service listening at|[nodemon] app crashed" } } + }, + { + "label": "Start Teams App (Test Tool)", + "dependsOn": [ + "Validate prerequisites (Test Tool)", + "Deploy (Test Tool)", + "Start application (Test Tool)", + "Start Test Tool" + ], + "dependsOrder": "sequence" + }, + { + // Check all required prerequisites. + // See https://aka.ms/teamsfx-tasks/check-prerequisites to know the details and how to customize the args. + "label": "Validate prerequisites (Test Tool)", + "type": "teamsfx", + "command": "debug-check-prerequisites", + "args": { + "prerequisites": [ + "nodejs", // Validate if Node.js is installed. + "portOccupancy" // Validate available ports to ensure those debug ones are not occupied. + ], + "portOccupancy": [ + 3978, // app service port + 9239, // app inspector port for Node.js debugger + 56150 // test tool port + ] + } + }, + { + // Build project. + // See https://aka.ms/teamsfx-tasks/deploy to know the details and how to customize the args. + "label": "Deploy (Test Tool)", + "type": "teamsfx", + "command": "deploy", + "args": { + "env": "testtool" + } + }, + { + "label": "Start application (Test Tool)", + "type": "shell", + "command": "npm run dev:teamsfx:testtool", + "isBackground": true, + "options": { + "cwd": "${workspaceFolder}" + }, + "problemMatcher": { + "pattern": [ + { + "regexp": "^.*$", + "file": 0, + "location": 1, + "message": 2 + } + ], + "background": { + "activeOnStart": true, + "beginsPattern": "[nodemon] starting", + "endsPattern": "restify listening to|Bot/ME service listening at|[nodemon] app crashed" + } + } + }, + { + "label": "Start Test Tool", + "type": "shell", + "command": "npm run dev:teamsfx:launch-testtool", + "isBackground": true, + "options": { + "env": { + "PATH": "${workspaceFolder}/devTools/teamsapptester/node_modules/.bin:${env:PATH}" + } + }, + "windows": { + "options": { + "env": { + "PATH": "${workspaceFolder}/devTools/teamsapptester/node_modules/.bin;${env:PATH}" + } + } + }, + "problemMatcher": { + "pattern": [ + { + "regexp": "^.*$", + "file": 0, + "location": 1, + "message": 2 + } + ], + "background": { + "activeOnStart": true, + "beginsPattern": ".*", + "endsPattern": "Listening on" + } + }, + "presentation": { + "panel": "dedicated", + "reveal": "silent" + } } ] -} \ No newline at end of file +} diff --git a/js/samples/04.ai-apps/e.assistants-orderBot/devTools/teamsapptester b/js/samples/04.ai-apps/e.assistants-orderBot/devTools/teamsapptester new file mode 120000 index 000000000..e6800eee4 --- /dev/null +++ b/js/samples/04.ai-apps/e.assistants-orderBot/devTools/teamsapptester @@ -0,0 +1 @@ +/Users/corina/.fx/bin/testTool/0.2.4 \ No newline at end of file diff --git a/js/samples/04.ai-apps/e.assistants-orderBot/env/.env.testtool b/js/samples/04.ai-apps/e.assistants-orderBot/env/.env.testtool new file mode 100644 index 000000000..3c22da192 --- /dev/null +++ b/js/samples/04.ai-apps/e.assistants-orderBot/env/.env.testtool @@ -0,0 +1,3 @@ +TEAMSFX_ENV=testtool +ASSISTANT_ID= +SECRET_OPENAI_KEY= \ No newline at end of file diff --git a/js/samples/04.ai-apps/e.assistants-orderBot/package.json b/js/samples/04.ai-apps/e.assistants-orderBot/package.json index 7851e0922..719b24b44 100644 --- a/js/samples/04.ai-apps/e.assistants-orderBot/package.json +++ b/js/samples/04.ai-apps/e.assistants-orderBot/package.json @@ -12,7 +12,9 @@ "start": "tsc --build && node ./lib/index.js", "test": "echo \"Error: no test specified\" && exit 1", "watch": "nodemon --watch ./src -e ts --exec \"yarn start\"", - "dev:teamsfx": "nodemon --exec node --inspect=9239 --signal SIGINT -r ts-node/register ./src/index.ts" + "dev:teamsfx": "nodemon --exec node --inspect=9239 --signal SIGINT -r ts-node/register ./src/index.ts", + "dev:teamsfx:testtool": "env-cmd --silent -f .localConfigs.testTool npm run dev:teamsfx", + "dev:teamsfx:launch-testtool": "env-cmd --silent -f env/.env.testtool teamsapptester start" }, "repository": { "type": "git", @@ -29,13 +31,13 @@ "restify": "~11.1.0" }, "devDependencies": { - "@types/node": "^20.16.1", "@types/jsonwebtoken": "^9.0.4", + "@types/node": "^20.16.1", "@types/restify": "8.5.12", "@typescript-eslint/eslint-plugin": "^6.21.0", "@typescript-eslint/parser": "^6.21.0", - "eslint": "^8.57.1", "env-cmd": "^10.1.0", + "eslint": "^8.57.1", "nodemon": "~3.0.1", "prettier": "^3.3.3", "rimraf": "^5.0.10", diff --git a/js/samples/04.ai-apps/e.assistants-orderBot/src/bot.ts b/js/samples/04.ai-apps/e.assistants-orderBot/src/bot.ts index 896f5d706..1121751e2 100644 --- a/js/samples/04.ai-apps/e.assistants-orderBot/src/bot.ts +++ b/js/samples/04.ai-apps/e.assistants-orderBot/src/bot.ts @@ -1,4 +1,4 @@ -import { Application, preview, AI } from '@microsoft/teams-ai'; +import { Application, preview, AI, TurnState } from '@microsoft/teams-ai'; import { CardFactory, MemoryStorage, MessageFactory, TurnContext } from 'botbuilder'; import { Order } from './foodOrderViewSchema'; import { generateCardForOrder } from './foodOrderCard'; @@ -19,6 +19,7 @@ if (process.env.AZURE_OPENAI_KEY) { } const { AssistantsPlanner } = preview; +let assistantId = ''; // Create Assistant if no ID is provided, this will require you to restart the program and fill in the process.env.ASSISTANT_ID afterwards. if (!process.env.ASSISTANT_ID) { @@ -43,13 +44,16 @@ if (!process.env.ASSISTANT_ID) { } } ], - model: 'gpt-4' + model: 'gpt-4o-mini' }, - endpoint + endpoint ?? undefined, + endpoint ? { apiVersion: process.env.OPENAI_API_VERSION } : undefined ); console.log(`Created a new assistant with an ID of: ${assistant.id}`); - process.exit(); + console.log('Be sure to add this ID to your environment variables as ASSISTANT_ID before your next restart.'); + assistantId = assistant.id; + process.env.ASSISTANT_ID = assistantId; })(); } @@ -57,7 +61,7 @@ if (!process.env.ASSISTANT_ID) { const planner = new AssistantsPlanner({ apiKey: apiKey, endpoint: endpoint, - assistant_id: process.env.ASSISTANT_ID! + assistant_id: process.env.ASSISTANT_ID ?? assistantId }); // Define storage and application @@ -72,18 +76,18 @@ const app = new Application({ // Export bots run() function export const run = (context: TurnContext) => app.run(context); -app.message('/reset', async (context, state) => { +app.message('/reset', async (context: TurnContext, state: TurnState) => { state.deleteConversationState(); await context.sendActivity(`Ok lets start this over.`); }); -app.ai.action('place_order', async (context, state, order) => { +app.ai.action('place_order', async (context: TurnContext, state: TurnState, order: Order) => { const card = generateCardForOrder(order); await context.sendActivity(MessageFactory.attachment(CardFactory.adaptiveCard(card))); return `order placed`; }); -app.ai.action(AI.HttpErrorActionName, async (context, state, data) => { +app.ai.action(AI.HttpErrorActionName, async (context: TurnContext, state: TurnState, _data: unknown) => { await context.sendActivity('An AI request failed. Please try again later.'); return AI.StopCommandName; }); diff --git a/js/samples/04.ai-apps/e.assistants-orderBot/src/index.ts b/js/samples/04.ai-apps/e.assistants-orderBot/src/index.ts index 9a37c8d2f..046b47528 100644 --- a/js/samples/04.ai-apps/e.assistants-orderBot/src/index.ts +++ b/js/samples/04.ai-apps/e.assistants-orderBot/src/index.ts @@ -68,7 +68,7 @@ server.listen(process.env.port || process.env.PORT || 3978, () => { // Listen for incoming server requests. server.post('/api/messages', async (req, res) => { // Route received a request to adapter for processing - await adapter.process(req, res as any, async (context) => { + await adapter.process(req, res as any, async (context: TurnContext) => { // Dispatch to application for routing await bot.run(context); }); diff --git a/js/samples/04.ai-apps/e.assistants-orderBot/teamsapp.testtool.yml b/js/samples/04.ai-apps/e.assistants-orderBot/teamsapp.testtool.yml new file mode 100644 index 000000000..374c8adac --- /dev/null +++ b/js/samples/04.ai-apps/e.assistants-orderBot/teamsapp.testtool.yml @@ -0,0 +1,27 @@ +# yaml-language-server: $schema=https://aka.ms/teams-toolkit/v1.5/yaml.schema.json +# Visit https://aka.ms/teamsfx-v5.0-guide for details on this file +# Visit https://aka.ms/teamsfx-actions for details on actions +version: v1.5 + +deploy: + # Install development tool(s) + - uses: devTool/install + with: + testTool: + version: ~0.2.1 + symlinkDir: ./devTools/teamsapptester + + # Run npm command + - uses: cli/runNpmCommand + with: + args: install --no-audit --workspaces=false + + # Generate runtime environment variables + - uses: file/createOrUpdateEnvironmentFile + with: + target: ./.localConfigs.testTool + envs: + OPENAI_KEY: ${{SECRET_OPENAI_KEY}} + ASSISTANT_ID: ${{ASSISTANT_ID}} + # AZURE_OPENAI_KEY: ${{SECRET_AZURE_OPENAI_KEY}} + # AZURE_OPENAI_ENDPOINT: ${{SECRET_AZURE_OPENAI_ENDPOINT}} diff --git a/js/samples/04.ai-apps/e.assistants-orderBot/teamsapp.yml b/js/samples/04.ai-apps/e.assistants-orderBot/teamsapp.yml index f44ec818a..0dd6c5703 100644 --- a/js/samples/04.ai-apps/e.assistants-orderBot/teamsapp.yml +++ b/js/samples/04.ai-apps/e.assistants-orderBot/teamsapp.yml @@ -13,102 +13,103 @@ environmentFolderPath: ./env # Defines what the `provision` lifecycle step does with Teams Toolkit. # Runs with the Provision menu or CLI using `teamsfx provision --env {environment name}`. provision: - # Automates the creation of a Teams app registration and saves the App ID to an environment file. - - uses: teamsApp/create - with: - name: OrderBot${{APP_NAME_SUFFIX}} - writeToEnvironmentFile: - teamsAppId: TEAMS_APP_ID + # Automates the creation of a Teams app registration and saves the App ID to an environment file. + - uses: teamsApp/create + with: + name: OrderBot${{APP_NAME_SUFFIX}} + writeToEnvironmentFile: + teamsAppId: TEAMS_APP_ID - # Automates the creation an Azure AD app registration which is required for a bot. - # The Bot ID (AAD app client ID) and Bot Password (AAD app client secret) are saved to an environment file. - - uses: botAadApp/create - with: - name: OrderBot${{APP_NAME_SUFFIX}} - writeToEnvironmentFile: - botId: BOT_ID - botPassword: SECRET_BOT_PASSWORD + # Automates the creation an Azure AD app registration which is required for a bot. + # The Bot ID (AAD app client ID) and Bot Password (AAD app client secret) are saved to an environment file. + - uses: botAadApp/create + with: + name: OrderBot${{APP_NAME_SUFFIX}} + writeToEnvironmentFile: + botId: BOT_ID + botPassword: SECRET_BOT_PASSWORD - # Automates the creation of infrastructure defined in ARM templates to host the bot. - # The created resource IDs are saved to an environment file. - - uses: arm/deploy - with: - subscriptionId: ${{AZURE_SUBSCRIPTION_ID}} - resourceGroupName: ${{AZURE_RESOURCE_GROUP_NAME}} - templates: - - path: ./infra/azure.bicep - parameters: ./infra/azure.parameters.json - deploymentName: Create-resources-for-bot - bicepCliVersion: v0.9.1 + # Automates the creation of infrastructure defined in ARM templates to host the bot. + # The created resource IDs are saved to an environment file. + - uses: arm/deploy + with: + subscriptionId: ${{AZURE_SUBSCRIPTION_ID}} + resourceGroupName: ${{AZURE_RESOURCE_GROUP_NAME}} + templates: + - path: ./infra/azure.bicep + parameters: ./infra/azure.parameters.json + deploymentName: Create-resources-for-bot + bicepCliVersion: v0.9.1 - # Optional: Automates schema and error checking of the Teams app manifest and outputs the results in the console. - - uses: teamsApp/validateManifest - with: - manifestPath: ./appPackage/manifest.json + # Optional: Automates schema and error checking of the Teams app manifest and outputs the results in the console. + - uses: teamsApp/validateManifest + with: + manifestPath: ./appPackage/manifest.json - # Automates creating a final app package (.zip) by replacing any variables in the manifest.json file for the current environment. - - uses: teamsApp/zipAppPackage - with: - manifestPath: ./appPackage/manifest.json - outputZipPath: ./appPackage/build/appPackage.${{TEAMSFX_ENV}}.zip - outputJsonPath: ./appPackage/build/manifest.${{TEAMSFX_ENV}}.json + # Automates creating a final app package (.zip) by replacing any variables in the manifest.json file for the current environment. + - uses: teamsApp/zipAppPackage + with: + manifestPath: ./appPackage/manifest.json + outputZipPath: ./appPackage/build/appPackage.${{TEAMSFX_ENV}}.zip + outputJsonPath: ./appPackage/build/manifest.${{TEAMSFX_ENV}}.json - # Optional: Automates an app package check for errors that would prevent the app from being published and reports any problems. - - uses: teamsApp/validateAppPackage - with: - appPackagePath: ./appPackage/build/appPackage.${{TEAMSFX_ENV}}.zip + # Optional: Automates an app package check for errors that would prevent the app from being published and reports any problems. + - uses: teamsApp/validateAppPackage + with: + appPackagePath: ./appPackage/build/appPackage.${{TEAMSFX_ENV}}.zip - # Automates updating the Teams app manifest in Teams Developer Portal using the App ID from the mainfest file. - # This action ensures that any manifest changes are reflected when launching the app again in Teams. - - uses: teamsApp/update - with: - appPackagePath: ./appPackage/build/appPackage.${{TEAMSFX_ENV}}.zip + # Automates updating the Teams app manifest in Teams Developer Portal using the App ID from the mainfest file. + # This action ensures that any manifest changes are reflected when launching the app again in Teams. + - uses: teamsApp/update + with: + appPackagePath: ./appPackage/build/appPackage.${{TEAMSFX_ENV}}.zip # Defines what the `deploy` lifecycle step does with Teams Toolkit. # Runs with the Deploy menu or CLI using `teamsfx deploy --env {environment name}`. deploy: - # Install any dependencies and build the web app using NPM - - uses: cli/runNpmCommand - name: install dependencies - with: - args: install + # Install any dependencies and build the web app using NPM + - uses: cli/runNpmCommand + name: install dependencies + with: + args: install - - uses: cli/runNpmCommand - name: build app - with: - args: run build --if-present - # Deploy to an Azure App Service using the zip file created in the provision step. - - uses: azureAppService/zipDeploy - with: - artifactFolder: . - ignoreFile: .webappignore - # This example uses the env var thats generated by the arm/deploy action. - # You can replace it with an existing Azure Resource ID or other - # custom environment variable. - resourceId: ${{BOT_AZURE_APP_SERVICE_RESOURCE_ID}} + - uses: cli/runNpmCommand + name: build app + with: + args: run build --if-present + # Deploy to an Azure App Service using the zip file created in the provision step. + - uses: azureAppService/zipDeploy + with: + artifactFolder: . + ignoreFile: .webappignore + # This example uses the env var thats generated by the arm/deploy action. + # You can replace it with an existing Azure Resource ID or other + # custom environment variable. + resourceId: ${{BOT_AZURE_APP_SERVICE_RESOURCE_ID}} # Defines what the `publish` lifecycle step does with Teams Toolkit. # Runs with the Deploy menu or CLI using `teamsfx publish --env {environment name}`. publish: - # Optional: Automates schema and error checking of the Teams app manifest and outputs the results in the console. - - uses: teamsApp/validateManifest - with: - manifestPath: ./appPackage/manifest.json + # Optional: Automates schema and error checking of the Teams app manifest and outputs the results in the console. + - uses: teamsApp/validateManifest + with: + manifestPath: ./appPackage/manifest.json - # Automates creating a final app package (.zip) by replacing any variables in the manifest.json file for the current environment. - - uses: teamsApp/zipAppPackage - with: - manifestPath: ./appPackage/manifest.json - outputZipPath: ./appPackage/build/appPackage.${{TEAMSFX_ENV}}.zip - outputJsonPath: ./appPackage/build/manifest.${{TEAMSFX_ENV}}.json + # Automates creating a final app package (.zip) by replacing any variables in the manifest.json file for the current environment. + - uses: teamsApp/zipAppPackage + with: + manifestPath: ./appPackage/manifest.json + outputZipPath: ./appPackage/build/appPackage.${{TEAMSFX_ENV}}.zip + outputJsonPath: ./appPackage/build/manifest.${{TEAMSFX_ENV}}.json - # Optional: Automates an app package check for errors that would prevent the app from being published and reports any problems. - - uses: teamsApp/validateAppPackage - with: - appPackagePath: ./appPackage/build/appPackage.${{TEAMSFX_ENV}}.zip + # Optional: Automates an app package check for errors that would prevent the app from being published and reports any problems. + - uses: teamsApp/validateAppPackage + with: + appPackagePath: ./appPackage/build/appPackage.${{TEAMSFX_ENV}}.zip - # Automates updating the Teams app manifest in Teams Developer Portal using the App ID from the mainfest file. - # This action ensures that any manifest changes are reflected when launching the app again in Teams. - - uses: teamsApp/update - with: - appPackagePath: ./appPackage/build/appPackage.${{TEAMSFX_ENV}}.zip + # Automates updating the Teams app manifest in Teams Developer Portal using the App ID from the mainfest file. + # This action ensures that any manifest changes are reflected when launching the app again in Teams. + - uses: teamsApp/update + with: + appPackagePath: ./appPackage/build/appPackage.${{TEAMSFX_ENV}}.zip +projectId: bb70f06c-3c60-49ad-b6eb-f20acd222890 diff --git a/js/samples/04.ai-apps/h.datasource-azureOpenAI/src/index.ts b/js/samples/04.ai-apps/h.datasource-azureOpenAI/src/index.ts index 1c08ccb24..192bfb869 100644 --- a/js/samples/04.ai-apps/h.datasource-azureOpenAI/src/index.ts +++ b/js/samples/04.ai-apps/h.datasource-azureOpenAI/src/index.ts @@ -8,7 +8,7 @@ import debug from 'debug'; import * as restify from 'restify'; import { app } from './app'; import { TeamsAdapter } from '@microsoft/teams-ai'; -import { Request, Response, TurnContext } from 'botbuilder'; +import { TurnContext } from 'botbuilder'; const ENV_FILE = path.join(__dirname, '..', '.env'); config({ path: ENV_FILE }); diff --git a/js/samples/04.ai-apps/i.teamsChefBot-streaming/src/index.ts b/js/samples/04.ai-apps/i.teamsChefBot-streaming/src/index.ts index 7ef8ff0f4..0139657e4 100644 --- a/js/samples/04.ai-apps/i.teamsChefBot-streaming/src/index.ts +++ b/js/samples/04.ai-apps/i.teamsChefBot-streaming/src/index.ts @@ -142,8 +142,8 @@ const app = new Application({ storage, ai: { planner, - enable_feedback_loop: true, - }, + enable_feedback_loop: true + } }); // Register your data source with planner @@ -175,8 +175,8 @@ app.ai.action(AI.FlaggedOutputActionName, async (context: TurnContext, state: Ap }); app.feedbackLoop(async (context, state, feedbackLoopData) => { - console.log("Feedback loop triggered"); - }); + console.log('Feedback loop triggered'); +}); // Listen for incoming server requests. server.post('/api/messages', async (req, res) => { diff --git a/js/yarn.lock b/js/yarn.lock index ee144a9bc..3163d7b4c 100644 --- a/js/yarn.lock +++ b/js/yarn.lock @@ -10,18 +10,6 @@ "@jridgewell/gen-mapping" "^0.3.5" "@jridgewell/trace-mapping" "^0.3.24" -"@azure-rest/core-client@^1.1.4": - version "1.4.0" - resolved "https://registry.yarnpkg.com/@azure-rest/core-client/-/core-client-1.4.0.tgz#3be28c02c6c20e49dea73a7f012daeeda4eacb8e" - integrity sha512-ozTDPBVUDR5eOnMIwhggbnVmOrka4fXCs8n8mvUo4WLLc38kki6bAOByDoVZZPz/pZy2jMt2kwfpvy/UjALj6w== - dependencies: - "@azure/abort-controller" "^2.0.0" - "@azure/core-auth" "^1.3.0" - "@azure/core-rest-pipeline" "^1.5.0" - "@azure/core-tracing" "^1.0.1" - "@azure/core-util" "^1.0.0" - tslib "^2.6.2" - "@azure/abort-controller@^1.0.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@azure/abort-controller/-/abort-controller-1.1.0.tgz#788ee78457a55af8a1ad342acb182383d2119249" @@ -29,7 +17,7 @@ dependencies: tslib "^2.2.0" -"@azure/abort-controller@^2.0.0": +"@azure/abort-controller@^2.0.0", "@azure/abort-controller@^2.1.2": version "2.1.2" resolved "https://registry.yarnpkg.com/@azure/abort-controller/-/abort-controller-2.1.2.tgz#42fe0ccab23841d9905812c58f1082d27784566d" integrity sha512-nBrLsEWm4J2u5LpAPjxADTlq3trDgVZZXHNKabeXZtpq3d3AbN/KGO82R87rdDz5/lYB024rtEf10/q0urNgsA== @@ -45,7 +33,7 @@ "@azure/core-util" "^1.1.0" tslib "^2.6.2" -"@azure/core-auth@^1.1.4", "@azure/core-auth@^1.3.0", "@azure/core-auth@^1.4.0", "@azure/core-auth@^1.5.0", "@azure/core-auth@^1.8.0", "@azure/core-auth@^1.9.0": +"@azure/core-auth@^1.1.4", "@azure/core-auth@^1.3.0", "@azure/core-auth@^1.4.0", "@azure/core-auth@^1.8.0", "@azure/core-auth@^1.9.0": version "1.9.0" resolved "https://registry.yarnpkg.com/@azure/core-auth/-/core-auth-1.9.0.tgz#ac725b03fabe3c892371065ee9e2041bee0fd1ac" integrity sha512-FPwHpZywuyasDSLMqJ6fhbOK3TqUdviZNF8OqRGA4W5Ewib2lEEZ+pBsYcBa88B2NGO/SEnYPGhyBqNlE8ilSw== @@ -54,7 +42,7 @@ "@azure/core-util" "^1.11.0" tslib "^2.6.2" -"@azure/core-client@^1.3.0", "@azure/core-client@^1.6.2", "@azure/core-client@^1.7.3", "@azure/core-client@^1.9.2": +"@azure/core-client@^1.3.0", "@azure/core-client@^1.6.2", "@azure/core-client@^1.9.2": version "1.9.2" resolved "https://registry.yarnpkg.com/@azure/core-client/-/core-client-1.9.2.tgz#6fc69cee2816883ab6c5cdd653ee4f2ff9774f74" integrity sha512-kRdry/rav3fUKHl/aDLd/pDLcB+4pOFwPPTVEExuMyaI5r+JBbMWqRbCY1pn5BniDaU3lRxO9eaQ1AmSMehl/w== @@ -77,9 +65,9 @@ "@azure/core-rest-pipeline" "^1.3.0" "@azure/core-http@^3.0.4": - version "3.0.4" - resolved "https://registry.yarnpkg.com/@azure/core-http/-/core-http-3.0.4.tgz#024b2909bbc0f2fce08c74f97a21312c4f42e922" - integrity sha512-Fok9VVhMdxAFOtqiiAtg74fL0UJkt0z3D+ouUUxcRLzZNBioPRAMJFVxiWoJljYpXsRi4GDQHzQHDc9AiYaIUQ== + version "3.0.5" + resolved "https://registry.yarnpkg.com/@azure/core-http/-/core-http-3.0.5.tgz#727fc23bfda67cd10d0eaf3a30cfb3a32f8fb6a0" + integrity sha512-T8r2q/c3DxNu6mEJfPuJtptUVqwchxzjj32gKcnMi06rdiVONS9rar7kT9T2Am+XvER7uOzpsP79WsqNbdgdWg== dependencies: "@azure/abort-controller" "^1.0.0" "@azure/core-auth" "^1.3.0" @@ -127,15 +115,15 @@ https-proxy-agent "^7.0.0" tslib "^2.6.2" -"@azure/core-rest-pipeline@^1.10.1", "@azure/core-rest-pipeline@^1.13.0", "@azure/core-rest-pipeline@^1.17.0", "@azure/core-rest-pipeline@^1.3.0", "@azure/core-rest-pipeline@^1.5.0", "@azure/core-rest-pipeline@^1.9.1": - version "1.17.0" - resolved "https://registry.yarnpkg.com/@azure/core-rest-pipeline/-/core-rest-pipeline-1.17.0.tgz#55dafa1093553c549ed6d8dbca69aa505c7b3aa3" - integrity sha512-62Vv8nC+uPId3j86XJ0WI+sBf0jlqTqPUFCBNrGtlaUeQUIXWV/D8GE5A1d+Qx8H7OQojn2WguC8kChD6v0shA== +"@azure/core-rest-pipeline@^1.10.1", "@azure/core-rest-pipeline@^1.17.0", "@azure/core-rest-pipeline@^1.3.0", "@azure/core-rest-pipeline@^1.9.1": + version "1.18.1" + resolved "https://registry.yarnpkg.com/@azure/core-rest-pipeline/-/core-rest-pipeline-1.18.1.tgz#380e7d3f15be80de83ee414176adb32824402f38" + integrity sha512-/wS73UEDrxroUEVywEm7J0p2c+IIiVxyfigCGfsKvCxxCET4V/Hef2aURqltrXMRjNmdmt5IuOgIpl8f6xdO5A== dependencies: "@azure/abort-controller" "^2.0.0" "@azure/core-auth" "^1.8.0" "@azure/core-tracing" "^1.0.1" - "@azure/core-util" "^1.9.0" + "@azure/core-util" "^1.11.0" "@azure/logger" "^1.0.0" http-proxy-agent "^7.0.0" https-proxy-agent "^7.0.0" @@ -149,10 +137,10 @@ "@opentelemetry/api" "^1.0.1" tslib "^2.2.0" -"@azure/core-tracing@^1.0.0", "@azure/core-tracing@^1.0.1", "@azure/core-tracing@^1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@azure/core-tracing/-/core-tracing-1.1.2.tgz#065dab4e093fb61899988a1cdbc827d9ad90b4ee" - integrity sha512-dawW9ifvWAWmUm9/h+/UQ2jrdvjCJ7VJEuCJ6XVNudzcOwm53BFZH4Q845vjfgoUAM8ZxokvVNxNxAITc502YA== +"@azure/core-tracing@^1.0.0", "@azure/core-tracing@^1.0.1", "@azure/core-tracing@^1.1.2", "@azure/core-tracing@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@azure/core-tracing/-/core-tracing-1.2.0.tgz#7be5d53c3522d639cf19042cbcdb19f71bc35ab2" + integrity sha512-UKTiEJPkWcESPYJz3X5uKRYyOcJD+4nYph+KpfdPRnQJVrZfk0KJgdnaAWKfhsBBtAf/D58Az4AvCJEmWgIBAg== dependencies: tslib "^2.6.2" @@ -164,12 +152,12 @@ "@azure/abort-controller" "^2.0.0" tslib "^2.6.2" -"@azure/core-xml@^1.3.2": - version "1.4.3" - resolved "https://registry.yarnpkg.com/@azure/core-xml/-/core-xml-1.4.3.tgz#a74f37a0e584fee7e9adae19f51016d4b59e9ca2" - integrity sha512-D6G7FEmDiTctPKuWegX2WTrS1enKZwqYwdKTO6ZN6JMigcCehlT0/CYl+zWpI9vQ9frwwp7GQT3/owaEXgnOsA== +"@azure/core-xml@^1.4.3": + version "1.4.4" + resolved "https://registry.yarnpkg.com/@azure/core-xml/-/core-xml-1.4.4.tgz#a8656751943bf492762f758d147d33dfcd933d9e" + integrity sha512-J4FYAqakGXcbfeZjwjMzjNcpcH4E+JtEBv+xcV1yL0Ydn/6wbQfeFKTCHh9wttAi0lmajHw7yBbHPRG+YHckZQ== dependencies: - fast-xml-parser "^4.3.2" + fast-xml-parser "^4.4.1" tslib "^2.6.2" "@azure/identity@^4.4.1", "@azure/identity@^4.5.0": @@ -192,7 +180,7 @@ stoppable "^1.1.0" tslib "^2.2.0" -"@azure/logger@^1.0.0", "@azure/logger@^1.0.4", "@azure/logger@^1.1.4": +"@azure/logger@^1.0.0", "@azure/logger@^1.1.4": version "1.1.4" resolved "https://registry.yarnpkg.com/@azure/logger/-/logger-1.1.4.tgz#223cbf2b424dfa66478ce9a4f575f59c6f379768" integrity sha512-4IXXzcCdLdlXuCG+8UKEwLA1T1NHqUfanhXYHiQTn+6sfWCZXduqbtXDGceg3Ce5QxTGo7EqmbV6Bi+aqKuClQ== @@ -214,16 +202,11 @@ xml2js "^0.5.0" "@azure/msal-browser@^3.26.1": - version "3.26.1" - resolved "https://registry.yarnpkg.com/@azure/msal-browser/-/msal-browser-3.26.1.tgz#2f4368d7997682db30dca52e32fcac363fa0efad" - integrity sha512-y78sr9g61aCAH9fcLO1um+oHFXc1/5Ap88RIsUSuzkm0BHzFnN+PXGaQeuM1h5Qf5dTnWNOd6JqkskkMPAhh7Q== + version "3.27.0" + resolved "https://registry.yarnpkg.com/@azure/msal-browser/-/msal-browser-3.27.0.tgz#b6f02f73c8e102d3f115009b4677539fb173fe2b" + integrity sha512-+b4ZKSD8+vslCtVRVetkegEhOFMLP3rxDWJY212ct+2r6jVg6OSQKc1Qz3kCoXo0FgwaXkb+76TMZfpHp8QtgA== dependencies: - "@azure/msal-common" "14.15.0" - -"@azure/msal-common@14.15.0": - version "14.15.0" - resolved "https://registry.yarnpkg.com/@azure/msal-common/-/msal-common-14.15.0.tgz#0e27ac0bb88fe100f4f8d1605b64d5c268636a55" - integrity sha512-ImAQHxmpMneJ/4S8BRFhjt1MZ3bppmpRPYYNyzeQPeFN288YKbb8TmmISQEbtfkQ1BPASvYZU5doIZOPBAqENQ== + "@azure/msal-common" "14.16.0" "@azure/msal-common@14.16.0": version "14.16.0" @@ -231,38 +214,25 @@ integrity sha512-1KOZj9IpcDSwpNiQNjt0jDYZpQvNZay7QAEi/5DLubay40iGYtLzya/jbjRPLyOTZhEKyL1MzPuw2HqBCjceYA== "@azure/msal-node@^2.13.1", "@azure/msal-node@^2.15.0", "@azure/msal-node@^2.16.1": - version "2.16.1" - resolved "https://registry.yarnpkg.com/@azure/msal-node/-/msal-node-2.16.1.tgz#89828832e8e6c8a88cecc4ef6d8d4e4352116b77" - integrity sha512-1NEFpTmMMT2A7RnZuvRl/hUmJU+GLPjh+ShyIqPktG2PvSd2yvPnzGd/BxIBAAvJG5nr9lH4oYcQXepDbaE7fg== + version "2.16.2" + resolved "https://registry.yarnpkg.com/@azure/msal-node/-/msal-node-2.16.2.tgz#3eb768d36883ea6f9a939c0b5b467b518e78fffc" + integrity sha512-An7l1hEr0w1HMMh1LU+rtDtqL7/jw74ORlc9Wnh06v7TU/xpG39/Zdr1ZJu3QpjUfKJ+E0/OXMW8DRSWTlh7qQ== dependencies: "@azure/msal-common" "14.16.0" jsonwebtoken "^9.0.0" uuid "^8.3.0" -"@azure/openai-assistants@1.0.0-beta.6": - version "1.0.0-beta.6" - resolved "https://registry.yarnpkg.com/@azure/openai-assistants/-/openai-assistants-1.0.0-beta.6.tgz#8937267f631b257d099aaa17776b324a935b15d9" - integrity sha512-gINKKcqTpR0neF+36Owe0Q1u1JO3IK6clBzWTfZ+9V/TkQq+LoUgp5F8dKvSv/YChfwEpZA2r1DWCwNE07eYIQ== - dependencies: - "@azure-rest/core-client" "^1.1.4" - "@azure/core-auth" "^1.5.0" - "@azure/core-client" "^1.7.3" - "@azure/core-rest-pipeline" "^1.13.0" - "@azure/core-util" "^1.6.1" - "@azure/logger" "^1.0.4" - tslib "^2.2.0" - "@azure/opentelemetry-instrumentation-azure-sdk@^1.0.0-beta.5": - version "1.0.0-beta.6" - resolved "https://registry.yarnpkg.com/@azure/opentelemetry-instrumentation-azure-sdk/-/opentelemetry-instrumentation-azure-sdk-1.0.0-beta.6.tgz#94f46c3ccffa7e05f1776a137327fda27220d240" - integrity sha512-JP6TJ7vDNX6r0gN2+EQBINTNqZ86frl1RAj5STtbLP1ClgIhcdXXb0hvq7CuEOv7InrroHMDoEYG80OQcWChug== + version "1.0.0-beta.7" + resolved "https://registry.yarnpkg.com/@azure/opentelemetry-instrumentation-azure-sdk/-/opentelemetry-instrumentation-azure-sdk-1.0.0-beta.7.tgz#db55c80a7778371312f8ff95a7b854a14e88dd76" + integrity sha512-boG33EDRcbw0Jo2cRgB6bccSirKOzYdYFMdcSsnOajLCLfJ8WIve3vxUMi7YZKxM8txZX/0cwzUU6crXmYxXZg== dependencies: - "@azure/core-tracing" "^1.0.0" + "@azure/core-tracing" "^1.2.0" "@azure/logger" "^1.0.0" "@opentelemetry/api" "^1.9.0" - "@opentelemetry/core" "^1.25.1" - "@opentelemetry/instrumentation" "^0.52.1" - tslib "^2.2.0" + "@opentelemetry/core" "^1.26.0" + "@opentelemetry/instrumentation" "^0.53.0" + tslib "^2.7.0" "@azure/search-documents@12.1.0": version "12.1.0" @@ -281,11 +251,11 @@ tslib "^2.2.0" "@azure/storage-blob@^12.24.0": - version "12.24.0" - resolved "https://registry.yarnpkg.com/@azure/storage-blob/-/storage-blob-12.24.0.tgz#d4ae1e29574b4a19d90eaf082cfde95f996d3f9b" - integrity sha512-l8cmWM4C7RoNCBOImoFMxhTXe1Lr+8uQ/IgnhRNMpfoA9bAFWoLG4XrWm6O5rKXortreVQuD+fc1hbzWklOZbw== + version "12.26.0" + resolved "https://registry.yarnpkg.com/@azure/storage-blob/-/storage-blob-12.26.0.tgz#1fae3a0b68d8a91b56c89f353507916bf8705d1c" + integrity sha512-SriLPKezypIsiZ+TtlFfE46uuBIap2HeaQVS78e1P7rz5OSbq0rsd52WE1mC5f7vAeLiXqv7I7oRhL3WFZEw3Q== dependencies: - "@azure/abort-controller" "^1.0.0" + "@azure/abort-controller" "^2.1.2" "@azure/core-auth" "^1.4.0" "@azure/core-client" "^1.6.2" "@azure/core-http-compat" "^2.0.0" @@ -294,169 +264,151 @@ "@azure/core-rest-pipeline" "^1.10.1" "@azure/core-tracing" "^1.1.2" "@azure/core-util" "^1.6.1" - "@azure/core-xml" "^1.3.2" + "@azure/core-xml" "^1.4.3" "@azure/logger" "^1.0.0" events "^3.0.0" tslib "^2.2.0" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.24.7.tgz#882fd9e09e8ee324e496bd040401c6f046ef4465" - integrity sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA== +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.25.9", "@babel/code-frame@^7.26.0": + version "7.26.2" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.26.2.tgz#4b5fab97d33338eff916235055f0ebc21e573a85" + integrity sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ== dependencies: - "@babel/highlight" "^7.24.7" + "@babel/helper-validator-identifier" "^7.25.9" + js-tokens "^4.0.0" picocolors "^1.0.0" -"@babel/compat-data@^7.25.2": - version "7.25.4" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.25.4.tgz#7d2a80ce229890edcf4cc259d4d696cb4dae2fcb" - integrity sha512-+LGRog6RAsCJrrrg/IO6LGmpphNe5DiK30dGjCoxxeGv49B10/3XYGxPsAwrDlMFcFEvdAUavDT8r9k/hSyQqQ== +"@babel/compat-data@^7.25.9": + version "7.26.2" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.26.2.tgz#278b6b13664557de95b8f35b90d96785850bb56e" + integrity sha512-Z0WgzSEa+aUcdiJuCIqgujCshpMWgUpgOxXotrYPSA53hA3qopNaqcJpyr0hVb1FeWdnqFA35/fUtXgBK8srQg== "@babel/core@^7.7.5": - version "7.25.2" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.25.2.tgz#ed8eec275118d7613e77a352894cd12ded8eba77" - integrity sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA== + version "7.26.0" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.26.0.tgz#d78b6023cc8f3114ccf049eb219613f74a747b40" + integrity sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg== dependencies: "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.24.7" - "@babel/generator" "^7.25.0" - "@babel/helper-compilation-targets" "^7.25.2" - "@babel/helper-module-transforms" "^7.25.2" - "@babel/helpers" "^7.25.0" - "@babel/parser" "^7.25.0" - "@babel/template" "^7.25.0" - "@babel/traverse" "^7.25.2" - "@babel/types" "^7.25.2" + "@babel/code-frame" "^7.26.0" + "@babel/generator" "^7.26.0" + "@babel/helper-compilation-targets" "^7.25.9" + "@babel/helper-module-transforms" "^7.26.0" + "@babel/helpers" "^7.26.0" + "@babel/parser" "^7.26.0" + "@babel/template" "^7.25.9" + "@babel/traverse" "^7.25.9" + "@babel/types" "^7.26.0" convert-source-map "^2.0.0" debug "^4.1.0" gensync "^1.0.0-beta.2" json5 "^2.2.3" semver "^6.3.1" -"@babel/generator@^7.25.0", "@babel/generator@^7.25.6": - version "7.25.6" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.25.6.tgz#0df1ad8cb32fe4d2b01d8bf437f153d19342a87c" - integrity sha512-VPC82gr1seXOpkjAAKoLhP50vx4vGNlF4msF64dSFq1P8RfB+QAuJWGHPXXPc8QyfVWwwB/TNNU4+ayZmHNbZw== +"@babel/generator@^7.25.9", "@babel/generator@^7.26.0": + version "7.26.2" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.26.2.tgz#87b75813bec87916210e5e01939a4c823d6bb74f" + integrity sha512-zevQbhbau95nkoxSq3f/DC/SC+EEOUZd3DYqfSkMhY2/wfSeaHV1Ew4vk8e+x8lja31IbyuUa2uQ3JONqKbysw== dependencies: - "@babel/types" "^7.25.6" + "@babel/parser" "^7.26.2" + "@babel/types" "^7.26.0" "@jridgewell/gen-mapping" "^0.3.5" "@jridgewell/trace-mapping" "^0.3.25" - jsesc "^2.5.1" + jsesc "^3.0.2" -"@babel/helper-compilation-targets@^7.25.2": - version "7.25.2" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.2.tgz#e1d9410a90974a3a5a66e84ff55ef62e3c02d06c" - integrity sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw== +"@babel/helper-compilation-targets@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz#55af025ce365be3cdc0c1c1e56c6af617ce88875" + integrity sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ== dependencies: - "@babel/compat-data" "^7.25.2" - "@babel/helper-validator-option" "^7.24.8" - browserslist "^4.23.1" + "@babel/compat-data" "^7.25.9" + "@babel/helper-validator-option" "^7.25.9" + browserslist "^4.24.0" lru-cache "^5.1.1" semver "^6.3.1" -"@babel/helper-module-imports@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz#f2f980392de5b84c3328fc71d38bd81bbb83042b" - integrity sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA== - dependencies: - "@babel/traverse" "^7.24.7" - "@babel/types" "^7.24.7" - -"@babel/helper-module-transforms@^7.25.2": - version "7.25.2" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.25.2.tgz#ee713c29768100f2776edf04d4eb23b8d27a66e6" - integrity sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ== - dependencies: - "@babel/helper-module-imports" "^7.24.7" - "@babel/helper-simple-access" "^7.24.7" - "@babel/helper-validator-identifier" "^7.24.7" - "@babel/traverse" "^7.25.2" - -"@babel/helper-simple-access@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz#bcade8da3aec8ed16b9c4953b74e506b51b5edb3" - integrity sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg== - dependencies: - "@babel/traverse" "^7.24.7" - "@babel/types" "^7.24.7" - -"@babel/helper-string-parser@^7.24.8": - version "7.24.8" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz#5b3329c9a58803d5df425e5785865881a81ca48d" - integrity sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ== - -"@babel/helper-validator-identifier@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz#75b889cfaf9e35c2aaf42cf0d72c8e91719251db" - integrity sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w== - -"@babel/helper-validator-option@^7.24.8": - version "7.24.8" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz#3725cdeea8b480e86d34df15304806a06975e33d" - integrity sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q== - -"@babel/helpers@^7.25.0": - version "7.25.6" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.25.6.tgz#57ee60141829ba2e102f30711ffe3afab357cc60" - integrity sha512-Xg0tn4HcfTijTwfDwYlvVCl43V6h4KyVVX2aEm4qdO/PC6L2YvzLHFdmxhoeSA3eslcE6+ZVXHgWwopXYLNq4Q== - dependencies: - "@babel/template" "^7.25.0" - "@babel/types" "^7.25.6" - -"@babel/highlight@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.24.7.tgz#a05ab1df134b286558aae0ed41e6c5f731bf409d" - integrity sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw== - dependencies: - "@babel/helper-validator-identifier" "^7.24.7" - chalk "^2.4.2" - js-tokens "^4.0.0" - picocolors "^1.0.0" +"@babel/helper-module-imports@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz#e7f8d20602ebdbf9ebbea0a0751fb0f2a4141715" + integrity sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw== + dependencies: + "@babel/traverse" "^7.25.9" + "@babel/types" "^7.25.9" + +"@babel/helper-module-transforms@^7.26.0": + version "7.26.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz#8ce54ec9d592695e58d84cd884b7b5c6a2fdeeae" + integrity sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw== + dependencies: + "@babel/helper-module-imports" "^7.25.9" + "@babel/helper-validator-identifier" "^7.25.9" + "@babel/traverse" "^7.25.9" + +"@babel/helper-string-parser@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz#1aabb72ee72ed35789b4bbcad3ca2862ce614e8c" + integrity sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA== + +"@babel/helper-validator-identifier@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz#24b64e2c3ec7cd3b3c547729b8d16871f22cbdc7" + integrity sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ== + +"@babel/helper-validator-option@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz#86e45bd8a49ab7e03f276577f96179653d41da72" + integrity sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw== + +"@babel/helpers@^7.26.0": + version "7.26.0" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.26.0.tgz#30e621f1eba5aa45fe6f4868d2e9154d884119a4" + integrity sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw== + dependencies: + "@babel/template" "^7.25.9" + "@babel/types" "^7.26.0" -"@babel/parser@^7.23.0", "@babel/parser@^7.25.0", "@babel/parser@^7.25.3", "@babel/parser@^7.25.6": - version "7.25.6" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.25.6.tgz#85660c5ef388cbbf6e3d2a694ee97a38f18afe2f" - integrity sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q== +"@babel/parser@^7.23.0", "@babel/parser@^7.25.3", "@babel/parser@^7.25.9", "@babel/parser@^7.26.0", "@babel/parser@^7.26.2": + version "7.26.2" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.26.2.tgz#fd7b6f487cfea09889557ef5d4eeb9ff9a5abd11" + integrity sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ== dependencies: - "@babel/types" "^7.25.6" + "@babel/types" "^7.26.0" "@babel/runtime@^7.12.5": - version "7.25.6" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.25.6.tgz#9afc3289f7184d8d7f98b099884c26317b9264d2" - integrity sha512-VBj9MYyDb9tuLq7yzqjgzt6Q+IBQLrGZfdjOekyEirZPHxXWoTSGUTMrpsfi58Up73d13NfYLv8HT9vmznjzhQ== + version "7.26.0" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.26.0.tgz#8600c2f595f277c60815256418b85356a65173c1" + integrity sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw== dependencies: regenerator-runtime "^0.14.0" -"@babel/template@^7.25.0": - version "7.25.0" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.25.0.tgz#e733dc3134b4fede528c15bc95e89cb98c52592a" - integrity sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q== - dependencies: - "@babel/code-frame" "^7.24.7" - "@babel/parser" "^7.25.0" - "@babel/types" "^7.25.0" - -"@babel/traverse@^7.23.2", "@babel/traverse@^7.24.7", "@babel/traverse@^7.25.2": - version "7.25.6" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.25.6.tgz#04fad980e444f182ecf1520504941940a90fea41" - integrity sha512-9Vrcx5ZW6UwK5tvqsj0nGpp/XzqthkT0dqIc9g1AdtygFToNtTF67XzYS//dm+SAK9cp3B9R4ZO/46p63SCjlQ== - dependencies: - "@babel/code-frame" "^7.24.7" - "@babel/generator" "^7.25.6" - "@babel/parser" "^7.25.6" - "@babel/template" "^7.25.0" - "@babel/types" "^7.25.6" +"@babel/template@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.25.9.tgz#ecb62d81a8a6f5dc5fe8abfc3901fc52ddf15016" + integrity sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg== + dependencies: + "@babel/code-frame" "^7.25.9" + "@babel/parser" "^7.25.9" + "@babel/types" "^7.25.9" + +"@babel/traverse@^7.23.2", "@babel/traverse@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.25.9.tgz#a50f8fe49e7f69f53de5bea7e413cd35c5e13c84" + integrity sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw== + dependencies: + "@babel/code-frame" "^7.25.9" + "@babel/generator" "^7.25.9" + "@babel/parser" "^7.25.9" + "@babel/template" "^7.25.9" + "@babel/types" "^7.25.9" debug "^4.3.1" globals "^11.1.0" -"@babel/types@^7.24.7", "@babel/types@^7.25.0", "@babel/types@^7.25.2", "@babel/types@^7.25.6": - version "7.25.6" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.25.6.tgz#893942ddb858f32ae7a004ec9d3a76b3463ef8e6" - integrity sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw== +"@babel/types@^7.25.9", "@babel/types@^7.26.0": + version "7.26.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.26.0.tgz#deabd08d6b753bc8e0f198f8709fb575e31774ff" + integrity sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA== dependencies: - "@babel/helper-string-parser" "^7.24.8" - "@babel/helper-validator-identifier" "^7.24.7" - to-fast-properties "^2.0.0" + "@babel/helper-string-parser" "^7.25.9" + "@babel/helper-validator-identifier" "^7.25.9" "@browserify/envify@^6.0.0": version "6.0.0" @@ -496,16 +448,16 @@ jsdoc-type-pratt-parser "~4.0.0" "@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": - version "4.4.0" - resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" - integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== + version "4.4.1" + resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz#d1145bf2c20132d6400495d6df4bf59362fd9d56" + integrity sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA== dependencies: - eslint-visitor-keys "^3.3.0" + eslint-visitor-keys "^3.4.3" "@eslint-community/regexpp@^4.5.1", "@eslint-community/regexpp@^4.6.1": - version "4.11.0" - resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.11.0.tgz#b0ffd0312b4a3fd2d6f77237e7248a5ad3a680ae" - integrity sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A== + version "4.12.1" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.12.1.tgz#cfc6cffe39df390a3841cde2abccf92eaa7ae0e0" + integrity sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ== "@eslint/eslintrc@^2.1.4": version "2.1.4" @@ -640,27 +592,27 @@ "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" -"@microsoft/api-extractor-model@7.29.8": - version "7.29.8" - resolved "https://registry.yarnpkg.com/@microsoft/api-extractor-model/-/api-extractor-model-7.29.8.tgz#fa6d0c48374f1105c0637f0882cfe2044d88520a" - integrity sha512-t3Z/xcO6TRbMcnKGVMs4uMzv/gd5j0NhMiJIGjD4cJMeFJ1Hf8wnLSx37vxlRlL0GWlGJhnFgxvnaL6JlS+73g== +"@microsoft/api-extractor-model@7.30.0": + version "7.30.0" + resolved "https://registry.yarnpkg.com/@microsoft/api-extractor-model/-/api-extractor-model-7.30.0.tgz#18a0528350124015b2c08397474e9309a8b3c807" + integrity sha512-26/LJZBrsWDKAkOWRiQbdVgcfd1F3nyJnAiJzsAgpouPk7LtOIj7PK9aJtBaw/pUXrkotEg27RrT+Jm/q0bbug== dependencies: - "@microsoft/tsdoc" "~0.15.0" - "@microsoft/tsdoc-config" "~0.17.0" - "@rushstack/node-core-library" "5.9.0" + "@microsoft/tsdoc" "~0.15.1" + "@microsoft/tsdoc-config" "~0.17.1" + "@rushstack/node-core-library" "5.10.0" "@microsoft/api-extractor@^7.47.11": - version "7.47.11" - resolved "https://registry.yarnpkg.com/@microsoft/api-extractor/-/api-extractor-7.47.11.tgz#00450fb4f4c30f76c18d36110aa4cae1cdc2191c" - integrity sha512-lrudfbPub5wzBhymfFtgZKuBvXxoSIAdrvS2UbHjoMT2TjIEddq6Z13pcve7A03BAouw0x8sW8G4txdgfiSwpQ== - dependencies: - "@microsoft/api-extractor-model" "7.29.8" - "@microsoft/tsdoc" "~0.15.0" - "@microsoft/tsdoc-config" "~0.17.0" - "@rushstack/node-core-library" "5.9.0" + version "7.48.0" + resolved "https://registry.yarnpkg.com/@microsoft/api-extractor/-/api-extractor-7.48.0.tgz#d87243bdafbfadcf87b336b2b4e5de71ecc7caab" + integrity sha512-FMFgPjoilMUWeZXqYRlJ3gCVRhB7WU/HN88n8OLqEsmsG4zBdX/KQdtJfhq95LQTQ++zfu0Em1LLb73NqRCLYQ== + dependencies: + "@microsoft/api-extractor-model" "7.30.0" + "@microsoft/tsdoc" "~0.15.1" + "@microsoft/tsdoc-config" "~0.17.1" + "@rushstack/node-core-library" "5.10.0" "@rushstack/rig-package" "0.5.3" - "@rushstack/terminal" "0.14.2" - "@rushstack/ts-command-line" "4.23.0" + "@rushstack/terminal" "0.14.3" + "@rushstack/ts-command-line" "4.23.1" lodash "~4.17.15" minimatch "~3.0.3" resolve "~1.22.1" @@ -762,27 +714,27 @@ integrity sha512-HikLoRUgSzM4OKP3JVBzUUp3Q7L4wgI17p/3rERF01HVmopcujY3i6wgx8PenCwbenyTNxjr1AwSDSVuFlYedQ== "@microsoft/teams-js@^2.31.0": - version "2.31.0" - resolved "https://registry.yarnpkg.com/@microsoft/teams-js/-/teams-js-2.31.0.tgz#25e8453a26cdeeb72948672e2e04827ad744d9f9" - integrity sha512-MZLmMOqbPpDpooNkhBVw9v8Q474sLzne1YUP2sa1ZukCkoNPG9DOOKYbeX38CdvdZ1zfeteCUB920ZLXUKyzVA== + version "2.31.1" + resolved "https://registry.yarnpkg.com/@microsoft/teams-js/-/teams-js-2.31.1.tgz#6f3989613ccf8b81efb983c48dda3ffc1ae15431" + integrity sha512-HzUYELJxukST2lG3dlTOjSZNg9G+6JeWcXF6gEJU6OEFpdWN2EKlUBw2q4VLQFwwHV2I9+eCOALOEHFhGtEQxQ== dependencies: base64-js "^1.3.1" debug "^4.3.3" -"@microsoft/tsdoc-config@~0.17.0": - version "0.17.0" - resolved "https://registry.yarnpkg.com/@microsoft/tsdoc-config/-/tsdoc-config-0.17.0.tgz#82605152b3c1d3f5cd4a11697bc298437484d55d" - integrity sha512-v/EYRXnCAIHxOHW+Plb6OWuUoMotxTN0GLatnpOb1xq0KuTNw/WI3pamJx/UbsoJP5k9MCw1QxvvhPcF9pH3Zg== +"@microsoft/tsdoc-config@~0.17.1": + version "0.17.1" + resolved "https://registry.yarnpkg.com/@microsoft/tsdoc-config/-/tsdoc-config-0.17.1.tgz#e0f0b50628f4ad7fe121ca616beacfe6a25b9335" + integrity sha512-UtjIFe0C6oYgTnad4q1QP4qXwLhe6tIpNTRStJ2RZEPIkqQPREAwE5spzVxsdn9UaEMUqhh0AqSx3X4nWAKXWw== dependencies: - "@microsoft/tsdoc" "0.15.0" + "@microsoft/tsdoc" "0.15.1" ajv "~8.12.0" jju "~1.4.0" resolve "~1.22.2" -"@microsoft/tsdoc@0.15.0", "@microsoft/tsdoc@~0.15.0": - version "0.15.0" - resolved "https://registry.yarnpkg.com/@microsoft/tsdoc/-/tsdoc-0.15.0.tgz#f29a55df17cb6e87cfbabce33ff6a14a9f85076d" - integrity sha512-HZpPoABogPvjeJOdzCOSJsXeL/SMCBgBZMVC3X3d7YYp2gf31MfxhUoYUNwf1ERPJOnQc0wkFn9trqI6ZEdZuA== +"@microsoft/tsdoc@0.15.1", "@microsoft/tsdoc@~0.15.1": + version "0.15.1" + resolved "https://registry.yarnpkg.com/@microsoft/tsdoc/-/tsdoc-0.15.1.tgz#d4f6937353bc4568292654efb0a0e0532adbcba2" + integrity sha512-4aErSrCR/On/e5G2hDP0wjooqDdauzEbIq8hIkIe5pXV0rtWJZvdCEKL0ykZxex+IxIwBp0eGeV48hQN07dXtw== "@mixmark-io/domino@^2.2.0": version "2.2.0" @@ -819,10 +771,10 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" -"@opentelemetry/api-logs@0.52.1": - version "0.52.1" - resolved "https://registry.yarnpkg.com/@opentelemetry/api-logs/-/api-logs-0.52.1.tgz#52906375da4d64c206b0c4cb8ffa209214654ecc" - integrity sha512-qnSqB2DQ9TPP96dl8cDubDvrUyWc0/sK81xHTK8eSUspzDM3bsewX903qclQFvVhgStjRWdC5bLb3kQqMkfV5A== +"@opentelemetry/api-logs@0.53.0": + version "0.53.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/api-logs/-/api-logs-0.53.0.tgz#c478cbd8120ec2547b64edfa03a552cfe42170be" + integrity sha512-8HArjKx+RaAI8uEIgcORbZIPklyh1YLjPSBus8hjRmvLi6DeFzgOcdZ7KwPabKj8mXF8dX0hyfAyGfycz0DbFw== dependencies: "@opentelemetry/api" "^1.0.0" @@ -831,47 +783,52 @@ resolved "https://registry.yarnpkg.com/@opentelemetry/api/-/api-1.9.0.tgz#d03eba68273dc0f7509e2a3d5cba21eae10379fe" integrity sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg== -"@opentelemetry/core@1.26.0", "@opentelemetry/core@^1.19.0", "@opentelemetry/core@^1.25.1": - version "1.26.0" - resolved "https://registry.yarnpkg.com/@opentelemetry/core/-/core-1.26.0.tgz#7d84265aaa850ed0ca5813f97d831155be42b328" - integrity sha512-1iKxXXE8415Cdv0yjG3G6hQnB5eVEsJce3QaawX8SjDn0mAS0ZM8fAbZZJD4ajvhC15cePvosSCut404KrIIvQ== +"@opentelemetry/core@1.28.0", "@opentelemetry/core@^1.19.0", "@opentelemetry/core@^1.26.0": + version "1.28.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/core/-/core-1.28.0.tgz#e97290a3e36c59480ffb2287fe2713c66749274c" + integrity sha512-ZLwRMV+fNDpVmF2WYUdBHlq0eOWtEaUJSusrzjGnBt7iSRvfjFE3RXYUZJrqou/wIDWV0DwQ5KIfYe9WXg9Xqw== dependencies: "@opentelemetry/semantic-conventions" "1.27.0" -"@opentelemetry/instrumentation@^0.52.1": - version "0.52.1" - resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation/-/instrumentation-0.52.1.tgz#2e7e46a38bd7afbf03cf688c862b0b43418b7f48" - integrity sha512-uXJbYU/5/MBHjMp1FqrILLRuiJCs3Ofk0MeRDk8g1S1gD47U8X3JnSwcMO1rtRo1x1a7zKaQHaoYu49p/4eSKw== +"@opentelemetry/instrumentation@^0.53.0": + version "0.53.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation/-/instrumentation-0.53.0.tgz#e6369e4015eb5112468a4d45d38dcada7dad892d" + integrity sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A== dependencies: - "@opentelemetry/api-logs" "0.52.1" - "@types/shimmer" "^1.0.2" + "@opentelemetry/api-logs" "0.53.0" + "@types/shimmer" "^1.2.0" import-in-the-middle "^1.8.1" require-in-the-middle "^7.1.1" semver "^7.5.2" shimmer "^1.2.1" -"@opentelemetry/resources@1.26.0": - version "1.26.0" - resolved "https://registry.yarnpkg.com/@opentelemetry/resources/-/resources-1.26.0.tgz#da4c7366018bd8add1f3aa9c91c6ac59fd503cef" - integrity sha512-CPNYchBE7MBecCSVy0HKpUISEeJOniWqcHaAHpmasZ3j9o6V3AyBzhRc90jdmemq0HOxDr6ylhUbDhBqqPpeNw== +"@opentelemetry/resources@1.28.0": + version "1.28.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/resources/-/resources-1.28.0.tgz#c8c27ae7559c817f9d117f1bf96d76f893fb29f5" + integrity sha512-cIyXSVJjGeTICENN40YSvLDAq4Y2502hGK3iN7tfdynQLKWb3XWZQEkPc+eSx47kiy11YeFAlYkEfXwR1w8kfw== dependencies: - "@opentelemetry/core" "1.26.0" + "@opentelemetry/core" "1.28.0" "@opentelemetry/semantic-conventions" "1.27.0" "@opentelemetry/sdk-trace-base@^1.19.0": - version "1.26.0" - resolved "https://registry.yarnpkg.com/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.26.0.tgz#0c913bc6d2cfafd901de330e4540952269ae579c" - integrity sha512-olWQldtvbK4v22ymrKLbIcBi9L2SpMO84sCPY54IVsJhP9fRsxJT194C/AVaAuJzLE30EdhhM1VmvVYR7az+cw== + version "1.28.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.28.0.tgz#6195dc8cd78bd74394cf54c67c5cbd8d1528516c" + integrity sha512-ceUVWuCpIao7Y5xE02Xs3nQi0tOGmMea17ecBdwtCvdo9ekmO+ijc9RFDgfifMl7XCBf41zne/1POM3LqSTZDA== dependencies: - "@opentelemetry/core" "1.26.0" - "@opentelemetry/resources" "1.26.0" + "@opentelemetry/core" "1.28.0" + "@opentelemetry/resources" "1.28.0" "@opentelemetry/semantic-conventions" "1.27.0" -"@opentelemetry/semantic-conventions@1.27.0", "@opentelemetry/semantic-conventions@^1.19.0": +"@opentelemetry/semantic-conventions@1.27.0": version "1.27.0" resolved "https://registry.yarnpkg.com/@opentelemetry/semantic-conventions/-/semantic-conventions-1.27.0.tgz#1a857dcc95a5ab30122e04417148211e6f945e6c" integrity sha512-sAay1RrB+ONOem0OZanAR1ZI/k7yDpnOQSQmTMuGImUQb2y8EbSaCJ94FQluM74xoU03vlb2d2U90hZluL6nQg== +"@opentelemetry/semantic-conventions@^1.19.0": + version "1.28.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/semantic-conventions/-/semantic-conventions-1.28.0.tgz#337fb2bca0453d0726696e745f50064411f646d6" + integrity sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA== + "@pkgjs/parseargs@^0.11.0": version "0.11.0" resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" @@ -887,10 +844,10 @@ resolved "https://registry.yarnpkg.com/@rtsao/scc/-/scc-1.1.0.tgz#927dd2fae9bc3361403ac2c7a00c32ddce9ad7e8" integrity sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g== -"@rushstack/node-core-library@5.9.0": - version "5.9.0" - resolved "https://registry.yarnpkg.com/@rushstack/node-core-library/-/node-core-library-5.9.0.tgz#097213d518b29a9c28b46db9c2cc7968c67168f8" - integrity sha512-MMsshEWkTbXqxqFxD4gcIUWQOCeBChlGczdZbHfqmNZQFLHB3yWxDFSMHFUdu2/OB9NUk7Awn5qRL+rws4HQNg== +"@rushstack/node-core-library@5.10.0": + version "5.10.0" + resolved "https://registry.yarnpkg.com/@rushstack/node-core-library/-/node-core-library-5.10.0.tgz#84173c913761a7d1edef5c818ce03d9e22cab9d7" + integrity sha512-2pPLCuS/3x7DCd7liZkqOewGM0OzLyCacdvOe8j6Yrx9LkETGnxul1t7603bIaB8nUAooORcct9fFDOQMbWAgw== dependencies: ajv "~8.13.0" ajv-draft-04 "~1.0.0" @@ -909,46 +866,39 @@ resolve "~1.22.1" strip-json-comments "~3.1.1" -"@rushstack/terminal@0.14.2": - version "0.14.2" - resolved "https://registry.yarnpkg.com/@rushstack/terminal/-/terminal-0.14.2.tgz#cc34654990500e9413265e9fc03839fa3419c4c9" - integrity sha512-2fC1wqu1VCExKC0/L+0noVcFQEXEnoBOtCIex1TOjBzEDWcw8KzJjjj7aTP6mLxepG0XIyn9OufeFb6SFsa+sg== +"@rushstack/terminal@0.14.3": + version "0.14.3" + resolved "https://registry.yarnpkg.com/@rushstack/terminal/-/terminal-0.14.3.tgz#eae0198e73eac56c901f6e00d0d4254c50a3f655" + integrity sha512-csXbZsAdab/v8DbU1sz7WC2aNaKArcdS/FPmXMOXEj/JBBZMvDK0+1b4Qao0kkG0ciB1Qe86/Mb68GjH6/TnMw== dependencies: - "@rushstack/node-core-library" "5.9.0" + "@rushstack/node-core-library" "5.10.0" supports-color "~8.1.1" -"@rushstack/ts-command-line@4.23.0": - version "4.23.0" - resolved "https://registry.yarnpkg.com/@rushstack/ts-command-line/-/ts-command-line-4.23.0.tgz#d2517f9da17a2f7b8967cdb417c39edc25b432ba" - integrity sha512-jYREBtsxduPV6ptNq8jOKp9+yx0ld1Tb/Tkdnlj8gTjazl1sF3DwX2VbluyYrNd0meWIL0bNeer7WDf5tKFjaQ== +"@rushstack/ts-command-line@4.23.1": + version "4.23.1" + resolved "https://registry.yarnpkg.com/@rushstack/ts-command-line/-/ts-command-line-4.23.1.tgz#d5e33dbb1a016d9440b3a20010b82ccfe9abd34a" + integrity sha512-40jTmYoiu/xlIpkkRsVfENtBq4CW3R4azbL0Vmda+fMwHWqss6wwf/Cy/UJmMqIzpfYc2OTnjYP1ZLD3CmyeCA== dependencies: - "@rushstack/terminal" "0.14.2" + "@rushstack/terminal" "0.14.3" "@types/argparse" "1.0.38" argparse "~1.0.9" string-argv "~0.3.1" -"@sinonjs/commons@^3.0.0", "@sinonjs/commons@^3.0.1": +"@sinonjs/commons@^3.0.1": version "3.0.1" resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-3.0.1.tgz#1029357e44ca901a615585f6d27738dbc89084cd" integrity sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ== dependencies: type-detect "4.0.8" -"@sinonjs/fake-timers@^10.3.0": - version "10.3.0" - resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz#55fdff1ecab9f354019129daf4df0dd4d923ea66" - integrity sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA== - dependencies: - "@sinonjs/commons" "^3.0.0" - -"@sinonjs/fake-timers@^11.2.2": - version "11.3.1" - resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-11.3.1.tgz#51d6e8d83ca261ff02c0ab0e68e9db23d5cd5999" - integrity sha512-EVJO7nW5M/F5Tur0Rf2z/QoMo+1Ia963RiMtapiQrEWvY0iBUvADo8Beegwjpnle5BHkyHuoxSTW3jF43H1XRA== +"@sinonjs/fake-timers@^13.0.1", "@sinonjs/fake-timers@^13.0.2": + version "13.0.5" + resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-13.0.5.tgz#36b9dbc21ad5546486ea9173d6bea063eb1717d5" + integrity sha512-36/hTbH2uaWuGVERyC6da9YwGWnzUZXuPro/F2LfsdOsLnCojz/iSH8MxUt/FD2S5XBSVPhmArFUXcpCQ2Hkiw== dependencies: "@sinonjs/commons" "^3.0.1" -"@sinonjs/samsam@^8.0.0": +"@sinonjs/samsam@^8.0.1": version "8.0.2" resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-8.0.2.tgz#e4386bf668ff36c95949e55a38dc5f5892fc2689" integrity sha512-v46t/fwnhejRSFTGqbpn9u+LQ9xJDse10gNnPgAcxgdoCDMXj/G2asWAC/8Qs+BAZDicX+MNZouXT1A7c83kVw== @@ -957,7 +907,7 @@ lodash.get "^4.4.2" type-detect "^4.1.0" -"@sinonjs/text-encoding@^0.7.2": +"@sinonjs/text-encoding@^0.7.3": version "0.7.3" resolved "https://registry.yarnpkg.com/@sinonjs/text-encoding/-/text-encoding-0.7.3.tgz#282046f03e886e352b2d5f5da5eb755e01457f3f" integrity sha512-DE427ROAphMQzU4ENbliGYrBSYPXF+TtLg9S8vzeA+OF4ZKzoDdzfL8sxuMUGS/lgRhM6j1URSk9ghf7Xo1tyA== @@ -1027,9 +977,9 @@ "@types/ms" "*" "@types/express-serve-static-core@^4.17.33": - version "4.19.5" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.19.5.tgz#218064e321126fcf9048d1ca25dd2465da55d9c6" - integrity sha512-y6W03tvrACO72aijJ5uF02FRq5cgDR9lUxddQ8vyF+GvmjJQqbzDcJngEjURc+ZsG31VI3hODNZJ2URj86pzmg== + version "4.19.6" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.19.6.tgz#e01324c2a024ff367d92c66f48553ced0ab50267" + integrity sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A== dependencies: "@types/node" "*" "@types/qs" "*" @@ -1100,7 +1050,7 @@ dependencies: "@types/node" "*" -"@types/jsonwebtoken@9.0.6", "@types/jsonwebtoken@^9.0.4", "@types/jsonwebtoken@^9.0.6": +"@types/jsonwebtoken@9.0.6": version "9.0.6" resolved "https://registry.yarnpkg.com/@types/jsonwebtoken/-/jsonwebtoken-9.0.6.tgz#d1af3544d99ad992fb6681bbe60676e06b032bd3" integrity sha512-/5hndP5dCjloafCXns6SZyESp3Ldq7YjH3zwzwczYnjxIT0Fqzk5ROSYVGfFyczIue7IUEj8hkvLbPoLQ18vQw== @@ -1114,6 +1064,13 @@ dependencies: "@types/node" "*" +"@types/jsonwebtoken@^9.0.4", "@types/jsonwebtoken@^9.0.6": + version "9.0.7" + resolved "https://registry.yarnpkg.com/@types/jsonwebtoken/-/jsonwebtoken-9.0.7.tgz#e49b96c2b29356ed462e9708fc73b833014727d2" + integrity sha512-ugo316mmTYBl2g81zDFnZ7cfxlut3o+/EQdaP7J8QN2kY6lJ22hmQYCK5EHcJHbrW+dkCGSCPgbG8JtYj6qSrg== + dependencies: + "@types/node" "*" + "@types/lodash@^4.17.13": version "4.17.13" resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.17.13.tgz#786e2d67cfd95e32862143abe7463a7f90c300eb" @@ -1130,9 +1087,9 @@ integrity sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ== "@types/mocha@^10.0.9": - version "10.0.9" - resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-10.0.9.tgz#101e9da88d2c02e5ac8952982c23b224524d662a" - integrity sha512-sicdRoWtYevwxjOHNMPTl3vSfJM6oyW8o1wXeI7uww6b6xHg8eBznQDNSGBCDJmsE8UMxP05JgZRtsKbTqt//Q== + version "10.0.10" + resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-10.0.10.tgz#91f62905e8d23cbd66225312f239454a23bebfa0" + integrity sha512-xPyYSz1cMPnJQhl0CLMH68j3gprKZaTjG3s5Vi+fDgx+uhG9NOXwbVt52eFS8ECyXhyKcjDLCBEqBExKuiZb7Q== "@types/ms@*": version "0.7.34" @@ -1140,19 +1097,19 @@ integrity sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g== "@types/node-fetch@^2.5.0", "@types/node-fetch@^2.6.4": - version "2.6.11" - resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.6.11.tgz#9b39b78665dae0e82a08f02f4967d62c66f95d24" - integrity sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g== + version "2.6.12" + resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.6.12.tgz#8ab5c3ef8330f13100a7479e2cd56d3386830a03" + integrity sha512-8nneRWKCg3rMtF69nLQJnOYUcbafYeFSjqkw3jCRLsqkWFlHaoQrr5mXmofFGOx3DKn7UfmBMyov8ySvLRVldA== dependencies: "@types/node" "*" form-data "^4.0.0" "@types/node@*": - version "22.5.4" - resolved "https://registry.yarnpkg.com/@types/node/-/node-22.5.4.tgz#83f7d1f65bc2ed223bdbf57c7884f1d5a4fa84e8" - integrity sha512-FDuKUJQm/ju9fT/SeX/6+gBzoPzlVCzfzmGkwKvRHQVxi4BntVbyIwf6a4Xn62mrvndLiml6z/UBXIdEVjQLXg== + version "22.10.1" + resolved "https://registry.yarnpkg.com/@types/node/-/node-22.10.1.tgz#41ffeee127b8975a05f8c4f83fb89bcb2987d766" + integrity sha512-qKgsUwfHZV2WCWLAnVP1JqnpE6Im6h3Y0+fYgMTasNQ7V++CBX5OT1as0g0f+OyubbFqhf6XVNIsmN4IIhEgGQ== dependencies: - undici-types "~6.19.2" + undici-types "~6.20.0" "@types/node@18.19.47": version "18.19.47" @@ -1162,16 +1119,16 @@ undici-types "~5.26.4" "@types/node@^18.11.18": - version "18.19.50" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.19.50.tgz#8652b34ee7c0e7e2004b3f08192281808d41bf5a" - integrity sha512-xonK+NRrMBRtkL1hVCc3G+uXtjh1Al4opBLjqVmipe5ZAaBYWW6cNAiBVZ1BvmkBhep698rP3UM3aRAdSALuhg== + version "18.19.67" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.19.67.tgz#77c4b01641a1e3e1509aff7e10d39e4afd5ae06d" + integrity sha512-wI8uHusga+0ZugNp0Ol/3BqQfEcCCNfojtO6Oou9iVNGPTL6QNSdnUdqq85fRgIorLhLMuPIKpsN98QE9Nh+KQ== dependencies: undici-types "~5.26.4" "@types/node@^20.16.1": - version "20.16.5" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.16.5.tgz#d43c7f973b32ffdf9aa7bd4f80e1072310fd7a53" - integrity sha512-VwYCweNo3ERajwy0IUlqqcyZ8/A7Zwa9ZP3MnENWcB11AejO+tLy3pu850goUW2FC/IJMdZUfKpX/yxL1gymCA== + version "20.17.9" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.17.9.tgz#5f141d4b7ee125cdee5faefe28de095398865bab" + integrity sha512-0JOXkRyLanfGPE2QRCwgxhzlBAvaRdCNMcvbd7jFfpmD4eEXll7LRwy5ymJmyeZqk7Nh7eD2LeUyQ68BbndmXw== dependencies: undici-types "~6.19.2" @@ -1181,9 +1138,9 @@ integrity sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw== "@types/qs@*": - version "6.9.15" - resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.15.tgz#adde8a060ec9c305a82de1babc1056e73bd64dce" - integrity sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg== + version "6.9.17" + resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.17.tgz#fc560f60946d0aeff2f914eb41679659d3310e1a" + integrity sha512-rX4/bPcfmvxHDv0XjfJELTTr+iB+tn032nPILqHm5wbthUUUuVtNGGqzhya9XUxjTP8Fpr0qYgSZZKxGY++svQ== "@types/range-parser@*": version "1.2.7" @@ -1222,15 +1179,15 @@ "@types/node" "*" "@types/send" "*" -"@types/shimmer@^1.0.2": +"@types/shimmer@^1.2.0": version "1.2.0" resolved "https://registry.yarnpkg.com/@types/shimmer/-/shimmer-1.2.0.tgz#9b706af96fa06416828842397a70dfbbf1c14ded" integrity sha512-UE7oxhQLLd9gub6JKIAhDq06T0F6FnztwMNRvYgjeQSBeMc1ZG/tA47EwfduvkuQS8apbkM/lpLpWsaCeYsXVg== -"@types/sinon@^10.0.19": - version "10.0.20" - resolved "https://registry.yarnpkg.com/@types/sinon/-/sinon-10.0.20.tgz#f1585debf4c0d99f9938f4111e5479fb74865146" - integrity sha512-2APKKruFNCAZgx3daAyACGzWuJ028VVCUDk6o2rw/Z4PXT0ogwdV4KUegW0MwVs0Zu59auPXbbuBJHF12Sx1Eg== +"@types/sinon@^17.0.3": + version "17.0.3" + resolved "https://registry.yarnpkg.com/@types/sinon/-/sinon-17.0.3.tgz#9aa7e62f0a323b9ead177ed23a36ea757141a5fa" + integrity sha512-j3uovdn8ewky9kRBG19bOwaZbexJu/XjtkHyjvUgt4xfPFz18dcORIMqnYh66Fx3Powhcr85NT5+er3+oViapw== dependencies: "@types/sinonjs__fake-timers" "*" @@ -1368,52 +1325,52 @@ resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== -"@vue/compiler-core@3.5.4": - version "3.5.4" - resolved "https://registry.yarnpkg.com/@vue/compiler-core/-/compiler-core-3.5.4.tgz#b8b5805e767b94d84af01f5527dbb4896326c478" - integrity sha512-oNwn+BAt3n9dK9uAYvI+XGlutwuTq/wfj4xCBaZCqwwVIGtD7D6ViihEbyYZrDHIHTDE3Q6oL3/hqmAyFEy9DQ== +"@vue/compiler-core@3.5.13": + version "3.5.13" + resolved "https://registry.yarnpkg.com/@vue/compiler-core/-/compiler-core-3.5.13.tgz#b0ae6c4347f60c03e849a05d34e5bf747c9bda05" + integrity sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q== dependencies: "@babel/parser" "^7.25.3" - "@vue/shared" "3.5.4" + "@vue/shared" "3.5.13" entities "^4.5.0" estree-walker "^2.0.2" source-map-js "^1.2.0" -"@vue/compiler-dom@3.5.4": - version "3.5.4" - resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.5.4.tgz#3f98e6ca76abab73630dad055b3ef6e2e6c2b006" - integrity sha512-yP9RRs4BDLOLfldn6ah+AGCNovGjMbL9uHvhDHf5wan4dAHLnFGOkqtfE7PPe4HTXIqE7l/NILdYw53bo1C8jw== +"@vue/compiler-dom@3.5.13": + version "3.5.13" + resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.5.13.tgz#bb1b8758dbc542b3658dda973b98a1c9311a8a58" + integrity sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA== dependencies: - "@vue/compiler-core" "3.5.4" - "@vue/shared" "3.5.4" + "@vue/compiler-core" "3.5.13" + "@vue/shared" "3.5.13" "@vue/compiler-sfc@^3.3.4": - version "3.5.4" - resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-3.5.4.tgz#a530accc9afed38506b14ce7ac6fb237eb09ff2d" - integrity sha512-P+yiPhL+NYH7m0ZgCq7AQR2q7OIE+mpAEgtkqEeH9oHSdIRvUO+4X6MPvblJIWcoe4YC5a2Gdf/RsoyP8FFiPQ== + version "3.5.13" + resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-3.5.13.tgz#461f8bd343b5c06fac4189c4fef8af32dea82b46" + integrity sha512-6VdaljMpD82w6c2749Zhf5T9u5uLBWKnVue6XWxprDobftnletJ8+oel7sexFfM3qIxNmVE7LSFGTpv6obNyaQ== dependencies: "@babel/parser" "^7.25.3" - "@vue/compiler-core" "3.5.4" - "@vue/compiler-dom" "3.5.4" - "@vue/compiler-ssr" "3.5.4" - "@vue/shared" "3.5.4" + "@vue/compiler-core" "3.5.13" + "@vue/compiler-dom" "3.5.13" + "@vue/compiler-ssr" "3.5.13" + "@vue/shared" "3.5.13" estree-walker "^2.0.2" magic-string "^0.30.11" - postcss "^8.4.44" + postcss "^8.4.48" source-map-js "^1.2.0" -"@vue/compiler-ssr@3.5.4": - version "3.5.4" - resolved "https://registry.yarnpkg.com/@vue/compiler-ssr/-/compiler-ssr-3.5.4.tgz#b6d011adaca367e7cc364cb09dfb6a5c12ad974a" - integrity sha512-acESdTXsxPnYr2C4Blv0ggx5zIFMgOzZmYU2UgvIff9POdRGbRNBHRyzHAnizcItvpgerSKQbllUc9USp3V7eg== +"@vue/compiler-ssr@3.5.13": + version "3.5.13" + resolved "https://registry.yarnpkg.com/@vue/compiler-ssr/-/compiler-ssr-3.5.13.tgz#e771adcca6d3d000f91a4277c972a996d07f43ba" + integrity sha512-wMH6vrYHxQl/IybKJagqbquvxpWCuVYpoUJfCqFZwa/JY1GdATAQ+TgVtgrwwMZ0D07QhA99rs/EAAWfvG6KpA== dependencies: - "@vue/compiler-dom" "3.5.4" - "@vue/shared" "3.5.4" + "@vue/compiler-dom" "3.5.13" + "@vue/shared" "3.5.13" -"@vue/shared@3.5.4": - version "3.5.4" - resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.5.4.tgz#d4768ddf13aded2774162298a3b5658cc999e1ee" - integrity sha512-L2MCDD8l7yC62Te5UUyPVpmexhL9ipVnYRw9CsWfm/BGRL5FwDX4a25bcJ/OJSD3+Hx+k/a8LDKcG2AFdJV3BA== +"@vue/shared@3.5.13": + version "3.5.13" + resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.5.13.tgz#87b309a6379c22b926e696893237826f64339b6f" + integrity sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ== "@xmldom/xmldom@^0.8.3": version "0.8.10" @@ -1489,9 +1446,9 @@ acorn@^7.0.0, acorn@^7.1.1: integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== acorn@^8.0.0, acorn@^8.11.0, acorn@^8.4.1, acorn@^8.8.2, acorn@^8.9.0: - version "8.12.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.12.1.tgz#71616bdccbe25e27a54439e0046e89ca76df2248" - integrity sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg== + version "8.14.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.14.0.tgz#063e2c70cac5fb4f6467f0b11152e04c682795b0" + integrity sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA== adal-node@^0.2.2: version "0.2.4" @@ -1951,9 +1908,9 @@ axios@^0.26.0: follow-redirects "^1.14.8" axios@^1.3.4, axios@^1.7.5, axios@^1.7.7: - version "1.7.7" - resolved "https://registry.yarnpkg.com/axios/-/axios-1.7.7.tgz#2f554296f9892a72ac8d8e4c5b79c14a91d0a47f" - integrity sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q== + version "1.7.8" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.7.8.tgz#1997b1496b394c21953e68c14aaa51b7b5de3d6e" + integrity sha512-Uu0wb7KNqK2t5K+YQyVCLM76prD5sRFjKHbJYCP1J7JFGEQ6nN7HWn9+04LAeiJ3ji54lgS/gZCH1oxyrf1SPw== dependencies: follow-redirects "^1.15.6" form-data "^4.0.0" @@ -2022,11 +1979,11 @@ bluebird@^3.5.1: integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.9: - version "4.12.0" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" - integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== + version "4.12.1" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.1.tgz#215741fe3c9dba2d7e12c001d0cfdbae43975ba7" + integrity sha512-k8TVBiPkPJT9uHLdOKfFpqcfprwBFOAAXXozRubr7R7PfIuKvQlzcI4M0pALeqXN09vdaMbUdUj+pass+uULAg== -bn.js@^5.0.0, bn.js@^5.2.1: +bn.js@^5.2.1: version "5.2.1" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70" integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== @@ -2292,7 +2249,7 @@ browserify-aes@^1.0.4, browserify-aes@^1.2.0: inherits "^2.0.1" safe-buffer "^5.0.1" -browserify-cipher@^1.0.0: +browserify-cipher@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w== @@ -2312,14 +2269,15 @@ browserify-des@^1.0.0: safe-buffer "^5.1.2" browserify-rsa@^4.0.0, browserify-rsa@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.1.0.tgz#b2fd06b5b75ae297f7ce2dc651f918f5be158c8d" - integrity sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog== + version "4.1.1" + resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.1.1.tgz#06e530907fe2949dc21fc3c2e2302e10b1437238" + integrity sha512-YBjSAiTqM04ZVei6sXighu679a3SqWORA3qZTEqZImnlkDIFtKc6pNutpjyZ8RJTjQtuYfeetkxM11GwoYXMIQ== dependencies: - bn.js "^5.0.0" - randombytes "^2.0.1" + bn.js "^5.2.1" + randombytes "^2.1.0" + safe-buffer "^5.2.1" -browserify-sign@^4.0.0: +browserify-sign@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.3.tgz#7afe4c01ec7ee59a89a558a4b75bd85ae62d4208" integrity sha512-JWCZW6SKhfhjJxO8Tyiiy+XYB7cqd2S5/+WeYHsKdNKFlCBhKbblba1A/HN/90YwtxKc8tCErjffZl++UNmGiw== @@ -2335,15 +2293,15 @@ browserify-sign@^4.0.0: readable-stream "^2.3.8" safe-buffer "^5.2.1" -browserslist@^4.23.1: - version "4.23.3" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.23.3.tgz#debb029d3c93ebc97ffbc8d9cbb03403e227c800" - integrity sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA== +browserslist@^4.24.0: + version "4.24.2" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.24.2.tgz#f5845bc91069dbd55ee89faf9822e1d885d16580" + integrity sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg== dependencies: - caniuse-lite "^1.0.30001646" - electron-to-chromium "^1.5.4" + caniuse-lite "^1.0.30001669" + electron-to-chromium "^1.5.41" node-releases "^2.0.18" - update-browserslist-db "^1.1.0" + update-browserslist-db "^1.1.1" buffer-equal-constant-time@1.0.1: version "1.0.1" @@ -2456,10 +2414,10 @@ camelcase@^6.0.0, camelcase@^6.3.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== -caniuse-lite@^1.0.30001646: - version "1.0.30001660" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001660.tgz#31218de3463fabb44d0b7607b652e56edf2e2355" - integrity sha512-GacvNTTuATm26qC74pt+ad1fW15mlQ/zuTzzY1ZoIzECTP8HURDfF43kNxPgf7H1jmelCBQTTbBNxdSXOA7Bqg== +caniuse-lite@^1.0.30001669: + version "1.0.30001686" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001686.tgz#0e04b8d90de8753188e93c9989d56cb19d902670" + integrity sha512-Y7deg0Aergpa24M3qLC5xjNklnKnhsmSyR/V89dLZ1n0ucJIFNs7PgR2Yfa/Zf6W79SbBicgtGxZr2juHkEUIA== capture-stack-trace@^1.0.0: version "1.0.2" @@ -2593,12 +2551,12 @@ ci-info@^1.5.0: integrity sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A== cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" - integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== + version "1.0.6" + resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.6.tgz#8fe672437d01cd6c4561af5334e0cc50ff1955f7" + integrity sha512-3Ek9H3X6pj5TgenXYtNWdaBon1tgYCaebd+XPg0keyjEbEfkD4KkmAxkQ/i1vYvxdcT5nscLBfq9VJRmCBcFSw== dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" + inherits "^2.0.4" + safe-buffer "^5.2.1" cjs-module-lexer@^1.2.2: version "1.4.1" @@ -2891,7 +2849,7 @@ count-lines@^0.1.2: resolved "https://registry.yarnpkg.com/count-lines/-/count-lines-0.1.2.tgz#e33493fb6860a82f7159d8237843fbfaefee5962" integrity sha512-YS8P4UYXX/hrDyLU3r/A5OcCNwdNbJFJckbe8j+x2Jhxsr2J4/rYl0sDwOljLZL7Uxc4s7mRSNcQD8dSjobz+g== -create-ecdh@^4.0.0: +create-ecdh@^4.0.4: version "4.0.4" resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.4.tgz#d6e7f4bffa66736085a0762fd3a632684dabcc4e" integrity sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A== @@ -2917,7 +2875,7 @@ create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: ripemd160 "^2.0.1" sha.js "^2.4.0" -create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7: +create-hmac@^1.1.4, create-hmac@^1.1.7: version "1.1.7" resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== @@ -2951,9 +2909,9 @@ cross-spawn@^5.0.1: which "^1.2.9" cross-spawn@^6.0.0, cross-spawn@^6.0.5: - version "6.0.5" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" - integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== + version "6.0.6" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.6.tgz#30d0efa0712ddb7eb5a76e1e8721bffafa6b5d57" + integrity sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw== dependencies: nice-try "^1.0.4" path-key "^2.0.1" @@ -2962,9 +2920,9 @@ cross-spawn@^6.0.0, cross-spawn@^6.0.5: which "^1.2.9" cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: - version "7.0.3" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" - integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + version "7.0.6" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f" + integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== dependencies: path-key "^3.1.0" shebang-command "^2.0.0" @@ -2976,21 +2934,22 @@ crypt@0.0.2: integrity sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow== crypto-browserify@^3.12.0: - version "3.12.0" - resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" - integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg== + version "3.12.1" + resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.1.tgz#bb8921bec9acc81633379aa8f52d69b0b69e0dac" + integrity sha512-r4ESw/IlusD17lgQi1O20Fa3qNnsckR126TdUuBgAu7GBYSIPvdNyONd3Zrxh0xCwA4+6w/TDArBPsMvhur+KQ== dependencies: - browserify-cipher "^1.0.0" - browserify-sign "^4.0.0" - create-ecdh "^4.0.0" - create-hash "^1.1.0" - create-hmac "^1.1.0" - diffie-hellman "^5.0.0" - inherits "^2.0.1" - pbkdf2 "^3.0.3" - public-encrypt "^4.0.0" - randombytes "^2.0.0" - randomfill "^1.0.3" + browserify-cipher "^1.0.1" + browserify-sign "^4.2.3" + create-ecdh "^4.0.4" + create-hash "^1.2.0" + create-hmac "^1.1.7" + diffie-hellman "^5.0.3" + hash-base "~3.0.4" + inherits "^2.0.4" + pbkdf2 "^3.1.2" + public-encrypt "^4.0.3" + randombytes "^2.1.0" + randomfill "^1.0.4" crypto-random-string@^1.0.0: version "1.0.0" @@ -3013,30 +2972,30 @@ css-what@^6.1.0: resolved "https://registry.yarnpkg.com/css-what/-/css-what-6.1.0.tgz#fb5effcf76f1ddea2c81bdfaa4de44e79bac70f4" integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw== -csv-generate@^4.4.1: - version "4.4.1" - resolved "https://registry.yarnpkg.com/csv-generate/-/csv-generate-4.4.1.tgz#729781ace8d1b92f6bfb407d1ab9548728c55681" - integrity sha512-O/einO0v4zPmXaOV+sYqGa02VkST4GP5GLpWBNHEouIU7pF3kpGf3D0kCCvX82ydIY4EKkOK+R8b1BYsRXravg== +csv-generate@^4.4.2: + version "4.4.2" + resolved "https://registry.yarnpkg.com/csv-generate/-/csv-generate-4.4.2.tgz#001d7eda4993a72d24f73e15c9b9d7b251af8a2e" + integrity sha512-W6nVsf+rz0J3yo9FOjeer7tmzBJKaTTxf7K0uw6GZgRocZYPVpuSWWa5/aoWWrjQZj4/oNIKTYapOM7hiNjVMA== -csv-parse@^5.5.6: - version "5.5.6" - resolved "https://registry.yarnpkg.com/csv-parse/-/csv-parse-5.5.6.tgz#0d726d58a60416361358eec291a9f93abe0b6b1a" - integrity sha512-uNpm30m/AGSkLxxy7d9yRXpJQFrZzVWLFBkS+6ngPcZkw/5k3L/jjFuj7tVnEpRn+QgmiXr21nDlhCiUK4ij2A== +csv-parse@^5.6.0: + version "5.6.0" + resolved "https://registry.yarnpkg.com/csv-parse/-/csv-parse-5.6.0.tgz#219beace2a3e9f28929999d2aa417d3fb3071c7f" + integrity sha512-l3nz3euub2QMg5ouu5U09Ew9Wf6/wQ8I++ch1loQ0ljmzhmfZYrH9fflS22i/PQEvsPvxCwxgz5q7UB8K1JO4Q== -csv-stringify@^6.5.1: - version "6.5.1" - resolved "https://registry.yarnpkg.com/csv-stringify/-/csv-stringify-6.5.1.tgz#a31837dd35e34787e3c248159c982a21af964d94" - integrity sha512-+9lpZfwpLntpTIEpFbwQyWuW/hmI/eHuJZD1XzeZpfZTqkf1fyvBbBLXTJJMsBuuS11uTShMqPwzx4A6ffXgRQ== +csv-stringify@^6.5.2: + version "6.5.2" + resolved "https://registry.yarnpkg.com/csv-stringify/-/csv-stringify-6.5.2.tgz#b51d61cd949906d5b5b790463f3055d95915193e" + integrity sha512-RFPahj0sXcmUyjrObAK+DOWtMvMIFV328n4qZJhgX3x2RqkQgOTU2mCUmiFR0CzM6AzChlRSUErjiJeEt8BaQA== csv@^6.2.2: - version "6.3.10" - resolved "https://registry.yarnpkg.com/csv/-/csv-6.3.10.tgz#960a3a9cef08573ecca2d80ddb71152aca383088" - integrity sha512-5NYZG4AN2ZUthmNxIudgBEdMPUnbQHu9V4QTzBPqQzUP3KQsFiJo+8HQ0+oVxj1PomIT1/f67VI1QH/hsrZLKA== + version "6.3.11" + resolved "https://registry.yarnpkg.com/csv/-/csv-6.3.11.tgz#c6dd1242e7543f67148827c6458ea668aee583f0" + integrity sha512-a8bhT76Q546jOElHcTrkzWY7Py925mfLO/jqquseH61ThOebYwOjLbWHBqdRB4K1VpU36sTyIei6Jwj7QdEZ7g== dependencies: - csv-generate "^4.4.1" - csv-parse "^5.5.6" - csv-stringify "^6.5.1" - stream-transform "^3.3.2" + csv-generate "^4.4.2" + csv-parse "^5.6.0" + csv-stringify "^6.5.2" + stream-transform "^3.3.3" d@1, d@^1.0.1, d@^1.0.2: version "1.0.2" @@ -3309,12 +3268,17 @@ diff@^4.0.1: resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== -diff@^5.1.0, diff@^5.2.0: +diff@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/diff/-/diff-5.2.0.tgz#26ded047cd1179b78b9537d5ef725503ce1ae531" integrity sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A== -diffie-hellman@^5.0.0: +diff@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-7.0.0.tgz#3fb34d387cd76d803f6eebea67b921dab0182a9a" + integrity sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw== + +diffie-hellman@^5.0.3: version "5.0.3" resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg== @@ -3382,9 +3346,9 @@ dot-prop@^4.2.1: is-obj "^1.0.0" dotenv@^16.4.1, dotenv@^16.4.5: - version "16.4.5" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.4.5.tgz#cdd3b3b604cb327e286b4762e13502f717cb099f" - integrity sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg== + version "16.4.7" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.4.7.tgz#0e20c5b82950140aa99be360a8a5f52335f53c26" + integrity sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ== dotenv@^8.2.0: version "8.6.0" @@ -3450,15 +3414,15 @@ ee-first@1.1.1: resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== -electron-to-chromium@^1.5.4: - version "1.5.21" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.21.tgz#f331794ee99045f2b2d73bc1d2dc654a13c462ee" - integrity sha512-+rBAerCpQvFSPyAO677i5gJuWGO2WFsoujENdcMzsrpP7Ebcc3pmpERgU8CV4fFF10a5haP4ivnFQ/AmLICBVg== +electron-to-chromium@^1.5.41: + version "1.5.68" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.68.tgz#4f46be4d465ef00e2100d5557b66f4af70e3ce6c" + integrity sha512-FgMdJlma0OzUYlbrtZ4AeXjKxKPk6KT8WOP8BjcqxWtlg8qyJQjRzPJzUtUn5GBg1oQ26hFs7HOOHJMYiJRnvQ== elliptic@^6.5.3, elliptic@^6.5.5: - version "6.6.0" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.6.0.tgz#5919ec723286c1edf28685aa89261d4761afa210" - integrity sha512-dpwoQcLc/2WLQvJvLRHKZ+f9FgOdjnq11rurqwekGQygGPsYSK29OMMD2WalatiqQ+XGFDglTNixpPfI+lpaAA== + version "6.6.1" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.6.1.tgz#3b8ffb02670bf69e382c7f65bf524c97c5405c06" + integrity sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g== dependencies: bn.js "^4.11.9" brorand "^1.1.0" @@ -3515,7 +3479,7 @@ end-of-stream@^1.1.0, end-of-stream@^1.4.1: dependencies: once "^1.4.0" -entities@^4.2.0, entities@^4.4.0, entities@^4.5.0: +entities@^4.2.0, entities@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== @@ -3535,10 +3499,10 @@ error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" -es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23.2: - version "1.23.3" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.23.3.tgz#8f0c5a35cd215312573c5a27c87dfd6c881a0aa0" - integrity sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A== +es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23.2, es-abstract@^1.23.5: + version "1.23.5" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.23.5.tgz#f4599a4946d57ed467515ed10e4f157289cd52fb" + integrity sha512-vlmniQ0WNPwXqA0BnmwV3Ng7HxiGlh6r5U6JcTMNx8OilcAGqVJBHJcPjqOMaczU9fRuRK5Px2BdVyPRnKMMVQ== dependencies: array-buffer-byte-length "^1.0.1" arraybuffer.prototype.slice "^1.0.3" @@ -3555,7 +3519,7 @@ es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23 function.prototype.name "^1.1.6" get-intrinsic "^1.2.4" get-symbol-description "^1.0.2" - globalthis "^1.0.3" + globalthis "^1.0.4" gopd "^1.0.1" has-property-descriptors "^1.0.2" has-proto "^1.0.3" @@ -3571,10 +3535,10 @@ es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23 is-string "^1.0.7" is-typed-array "^1.1.13" is-weakref "^1.0.2" - object-inspect "^1.13.1" + object-inspect "^1.13.3" object-keys "^1.1.1" object.assign "^4.1.5" - regexp.prototype.flags "^1.5.2" + regexp.prototype.flags "^1.5.3" safe-array-concat "^1.1.2" safe-regex-test "^1.0.3" string.prototype.trim "^1.2.9" @@ -3623,13 +3587,13 @@ es-shim-unscopables@^1.0.0, es-shim-unscopables@^1.0.2: hasown "^2.0.0" es-to-primitive@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" - integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + version "1.3.0" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.3.0.tgz#96c89c82cc49fd8794a24835ba3e1ff87f214e18" + integrity sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g== dependencies: - is-callable "^1.1.4" - is-date-object "^1.0.1" - is-symbol "^1.0.2" + is-callable "^1.2.7" + is-date-object "^1.0.5" + is-symbol "^1.0.4" es5-ext@^0.10.35, es5-ext@^0.10.46, es5-ext@^0.10.62, es5-ext@^0.10.64, es5-ext@~0.10.14: version "0.10.64" @@ -3697,7 +3661,7 @@ es6-weak-map@^2.0.1: es6-iterator "^2.0.3" es6-symbol "^3.1.1" -escalade@^3.1.1, escalade@^3.1.2: +escalade@^3.1.1, escalade@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== @@ -3846,7 +3810,7 @@ eslint-visitor-keys@^2.0.0: resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== -eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: +eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: version "3.4.3" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== @@ -4227,11 +4191,11 @@ fast-redact@^3.1.1: integrity sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A== fast-uri@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-3.0.1.tgz#cddd2eecfc83a71c1be2cc2ef2061331be8a7134" - integrity sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw== + version "3.0.3" + resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-3.0.3.tgz#892a1c91802d5d7860de728f18608a0573142241" + integrity sha512-aLrHthzCjH5He4Z2H9YZ+v6Ujb9ocRuW6ZzkJQOrTxleEijANq4v1TsaPaVG1PZcuurEzrLcWRyYBYXD5cEiaw== -fast-xml-parser@^4.3.2: +fast-xml-parser@^4.4.1: version "4.5.0" resolved "https://registry.yarnpkg.com/fast-xml-parser/-/fast-xml-parser-4.5.0.tgz#2882b7d01a6825dfdf909638f2de0256351def37" integrity sha512-/PlTQCI96+fZMAOLMZK4CWG1ItCbfZ/0jx7UIJFChPNrx7tcEgerUgWbeieCM9MfHInUDyK8DWYZ+YrywDJuTg== @@ -4375,9 +4339,9 @@ flat@^5.0.2: integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== flatted@^3.2.9: - version "3.3.1" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.1.tgz#21db470729a6734d4997002f439cb308987f567a" - integrity sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw== + version "3.3.2" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.2.tgz#adba1448a9841bec72b42c532ea23dbbedef1a27" + integrity sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA== follow-redirects@^1.14.0, follow-redirects@^1.14.8, follow-redirects@^1.15.6: version "1.15.9" @@ -4423,18 +4387,19 @@ form-data-encoder@1.7.2: integrity sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A== form-data@^2.5.0: - version "2.5.1" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.5.1.tgz#f2cbec57b5e59e23716e128fe44d4e5dd23895f4" - integrity sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA== + version "2.5.2" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.5.2.tgz#dc653743d1de2fcc340ceea38079daf6e9069fd2" + integrity sha512-GgwY0PS7DbXqajuGf4OYlsrIu3zgxD6Vvql43IBhm6MahqA5SK/7mwhtNj2AdH2z35YR34ujJ7BN+3fFC3jP5Q== dependencies: asynckit "^0.4.0" combined-stream "^1.0.6" mime-types "^2.1.12" + safe-buffer "^5.2.1" form-data@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" - integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== + version "4.0.1" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.1.tgz#ba1076daaaa5bfd7e99c1a6cb02aa0a5cff90d48" + integrity sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw== dependencies: asynckit "^0.4.0" combined-stream "^1.0.8" @@ -4580,7 +4545,7 @@ get-func-name@^2.0.1, get-func-name@^2.0.2: resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.2.tgz#0d7cf20cd13fda808669ffa88f4ffc7a3943fc41" integrity sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ== -get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4: +get-intrinsic@^1.2.1, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== @@ -4732,7 +4697,7 @@ globals@^13.19.0, globals@^13.24.0: dependencies: type-fest "^0.20.2" -globalthis@^1.0.3: +globalthis@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.4.tgz#7430ed3a975d97bfb59bcce41f5cabbafa651236" integrity sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ== @@ -4752,12 +4717,12 @@ globby@^11.1.0: merge2 "^1.4.1" slash "^3.0.0" -gopd@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" - integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== +gopd@^1.0.1, gopd@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.1.0.tgz#df8f0839c2d48caefc32a025a49294d39606c912" + integrity sha512-FQoVQnqcdk4hVM4JN1eromaun4iuS34oStkdlLENLdpULsuQcTyXj8w7ayhuUfPwEYZ1ZOooOTT6fdA9Vmx/RA== dependencies: - get-intrinsic "^1.1.3" + get-intrinsic "^1.2.4" got@^6.7.1: version "6.7.1" @@ -4782,9 +4747,9 @@ gpt-3-encoder@1.1.4: integrity sha512-fSQRePV+HUAhCn7+7HL7lNIXNm6eaFWFbNLOOGtmSJ0qJycyQvj60OvRlH7mee8xAMjBDNRdMXlMwjAbMTDjkg== gpt-tokenizer@^2.6.2: - version "2.6.2" - resolved "https://registry.yarnpkg.com/gpt-tokenizer/-/gpt-tokenizer-2.6.2.tgz#90e6932c7b5f73df7c13d360802edb43a2776586" - integrity sha512-OznIET3z069FiwbLtLFXJ9pVESYAa8EnX0BMogs6YJ4Fn2FIcyeZYEbxsp2grPiK0DVaqP1f+0JR/8t9R7/jlg== + version "2.7.0" + resolved "https://registry.yarnpkg.com/gpt-tokenizer/-/gpt-tokenizer-2.7.0.tgz#30cb445dd3102ca921c446db300f97a4a9d8a577" + integrity sha512-QjxaGgCZgKp8ecZzy7AmrCbYs+DD+y7GWSRwbe2ZiHPBs1EaK8xUIrt8irnmkAQcNMflpD27tk5yF4m9ig3wgw== graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0: version "4.2.11" @@ -4826,7 +4791,7 @@ has-ansi@^2.0.0: dependencies: ansi-regex "^2.0.0" -has-bigints@^1.0.1, has-bigints@^1.0.2: +has-bigints@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== @@ -4849,14 +4814,16 @@ has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2: es-define-property "^1.0.0" has-proto@^1.0.1, has-proto@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.3.tgz#b31ddfe9b0e6e9914536a6ab286426d0214f77fd" - integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q== + version "1.1.0" + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.1.0.tgz#deb10494cbbe8809bce168a3b961f42969f5ed43" + integrity sha512-QLdzI9IIO1Jg7f9GT1gXpPpXArAn6cS31R1eEZqz08Gc+uQ8/XiqHWt17Fiw+2p6oTTIq5GXEpQkAlA88YRl/Q== + dependencies: + call-bind "^1.0.7" -has-symbols@^1.0.2, has-symbols@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" - integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== +has-symbols@^1.0.3: + version "1.1.0" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.1.0.tgz#fc9c6a783a084951d0b971fe1018de813707a338" + integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ== has-tostringtag@^1.0.0, has-tostringtag@^1.0.2: version "1.0.2" @@ -4905,13 +4872,13 @@ hash-base@^3.0.0: readable-stream "^3.6.0" safe-buffer "^5.2.0" -hash-base@~3.0: - version "3.0.4" - resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918" - integrity sha512-EeeoJKjTyt868liAlVmcv2ZsUfGHlE3Q+BICOXcZiwN3osr5Q/zFGYmTJpoIzuaSTAwndFy+GqhEwlU4L3j4Ow== +hash-base@~3.0, hash-base@~3.0.4: + version "3.0.5" + resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.5.tgz#52480e285395cf7fba17dc4c9e47acdc7f248a8a" + integrity sha512-vXm0l45VbcHEVlTCzs8M+s0VeYsB2lnlAaThoLKGXr3bE/VWDOelNUnycUPEhKEaXARL2TEFjBOyUiM6+55KBg== dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" + inherits "^2.0.4" + safe-buffer "^5.2.1" hash.js@^1.0.0, hash.js@^1.0.3: version "1.1.7" @@ -5096,9 +5063,9 @@ import-fresh@^3.2.1: resolve-from "^4.0.0" import-in-the-middle@^1.8.1: - version "1.11.0" - resolved "https://registry.yarnpkg.com/import-in-the-middle/-/import-in-the-middle-1.11.0.tgz#a94c4925b8da18256cde3b3b7b38253e6ca5e708" - integrity sha512-5DimNQGoe0pLUHbR9qK84iWaWjjbsxiqXnw6Qz64+azRgleqv9k2kTt5fw7QsOpmaGYtuxxursnPPsnTKEx10Q== + version "1.11.2" + resolved "https://registry.yarnpkg.com/import-in-the-middle/-/import-in-the-middle-1.11.2.tgz#dd848e72b63ca6cd7c34df8b8d97fc9baee6174f" + integrity sha512-gK6Rr6EykBcc6cVWRSBR5TWf8nn6hZMYSRYqCcHa0l0d1fPK7JSYo6+Mlmck76jIX9aL/IZ71c06U2VpFwl1zA== dependencies: acorn "^8.8.2" acorn-import-attributes "^1.9.5" @@ -5189,12 +5156,19 @@ is-arrayish@^0.2.1: resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== -is-bigint@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" - integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== +is-async-function@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-async-function/-/is-async-function-2.0.0.tgz#8e4418efd3e5d3a6ebb0164c05ef5afb69aa9646" + integrity sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA== + dependencies: + has-tostringtag "^1.0.0" + +is-bigint@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.1.0.tgz#dda7a3445df57a42583db4228682eba7c4170672" + integrity sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ== dependencies: - has-bigints "^1.0.1" + has-bigints "^1.0.2" is-binary-path@^1.0.0: version "1.0.1" @@ -5210,13 +5184,13 @@ is-binary-path@~2.1.0: dependencies: binary-extensions "^2.0.0" -is-boolean-object@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" - integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== +is-boolean-object@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.2.0.tgz#9743641e80a62c094b5941c5bb791d66a88e497a" + integrity sha512-kR5g0+dXf/+kXnqI+lu0URKYPKgICtHGGNCDSB10AaUFj3o/HkB3u7WfpRBJGFopxxY0oH3ux7ZsDjLtK7xqvw== dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" + call-bind "^1.0.7" + has-tostringtag "^1.0.2" is-buffer@^1.1.5, is-buffer@^1.1.6, is-buffer@~1.1.6: version "1.1.6" @@ -5235,7 +5209,7 @@ is-builtin-module@^3.2.1: dependencies: builtin-modules "^3.3.0" -is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: +is-callable@^1.1.3, is-callable@^1.2.7: version "1.2.7" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== @@ -5268,7 +5242,7 @@ is-data-view@^1.0.1: dependencies: is-typed-array "^1.1.13" -is-date-object@^1.0.1: +is-date-object@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== @@ -5313,6 +5287,13 @@ is-extglob@^2.1.0, is-extglob@^2.1.1: resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== +is-finalizationregistry@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-finalizationregistry/-/is-finalizationregistry-1.1.0.tgz#d74a7d0c5f3578e34a20729e69202e578d495dc2" + integrity sha512-qfMdqbAQEwBw78ZyReKnlA8ezmPdb9BemzIIip/JkjaZUhitfXDkkr+3QTboW0JrSXT1QWyYShpvnNHGZ4c4yA== + dependencies: + call-bind "^1.0.7" + is-fullwidth-code-point@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" @@ -5323,6 +5304,13 @@ is-fullwidth-code-point@^3.0.0: resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== +is-generator-function@^1.0.10: + version "1.0.10" + resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" + integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== + dependencies: + has-tostringtag "^1.0.0" + is-glob@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" @@ -5345,6 +5333,11 @@ is-installed-globally@^0.1.0: global-dirs "^0.1.0" is-path-inside "^1.0.0" +is-map@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.3.tgz#ede96b7fe1e270b3c4465e3a465658764926d62e" + integrity sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw== + is-negative-zero@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.3.tgz#ced903a027aca6381b777a5743069d7376a49747" @@ -5355,12 +5348,13 @@ is-npm@^1.0.0: resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4" integrity sha512-9r39FIr3d+KD9SbX0sfMsHzb5PP3uimOiwr3YupUaUFG4W0l1U57Rx3utpttV7qz5U3jmrO5auUa04LU9pyHsg== -is-number-object@^1.0.4: - version "1.0.7" - resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" - integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== +is-number-object@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.1.0.tgz#5a867e9ecc3d294dda740d9f127835857af7eb05" + integrity sha512-KVSZV0Dunv9DTPkhXwcZ3Q+tUc9TsaE1ZwX5J2WMvsSGS6Md8TFPun5uwh0yRdrNerI6vf/tbJxqSx4c1ZI1Lw== dependencies: - has-tostringtag "^1.0.0" + call-bind "^1.0.7" + has-tostringtag "^1.0.2" is-number@^3.0.0: version "3.0.0" @@ -5414,18 +5408,25 @@ is-redirect@^1.0.0: integrity sha512-cr/SlUEe5zOGmzvj9bUyC4LVvkNVAXu4GytXLNMr1pny+a65MpQ9IJzFHD5vi7FyJgb4qt27+eS3TuQnqB+RQw== is-regex@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" - integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== + version "1.2.0" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.2.0.tgz#41b9d266e7eb7451312c64efc37e8a7d453077cf" + integrity sha512-B6ohK4ZmoftlUe+uvenXSbPJFo6U37BH7oO1B3nQH8f/7h27N56s85MhUtbFJAziz5dcmuR3i8ovUl35zp8pFA== dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" + call-bind "^1.0.7" + gopd "^1.1.0" + has-tostringtag "^1.0.2" + hasown "^2.0.2" is-retry-allowed@^1.0.0: version "1.2.0" resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz#d778488bd0a4666a3be8a1482b9f2baafedea8b4" integrity sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg== +is-set@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.3.tgz#8ab209ea424608141372ded6e0cb200ef1d9d01d" + integrity sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg== + is-shared-array-buffer@^1.0.2, is-shared-array-buffer@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz#1237f1cba059cdb62431d378dcc37d9680181688" @@ -5443,19 +5444,22 @@ is-stream@^2.0.0: resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== -is-string@^1.0.5, is-string@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" - integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== +is-string@^1.0.7, is-string@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.1.0.tgz#8cb83c5d57311bf8058bc6c8db294711641da45d" + integrity sha512-PlfzajuF9vSo5wErv3MJAKD/nqf9ngAs1NFQYm16nUYFO2IzxJ2hcm+IOCg+EEopdykNNUhVq5cz35cAUxU8+g== dependencies: - has-tostringtag "^1.0.0" + call-bind "^1.0.7" + has-tostringtag "^1.0.2" -is-symbol@^1.0.2, is-symbol@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" - integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== +is-symbol@^1.0.4, is-symbol@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.1.0.tgz#ae993830a56d4781886d39f9f0a46b3e89b7b60b" + integrity sha512-qS8KkNNXUZ/I+nX6QT8ZS1/Yx0A444yhzdTKxCzKkNjQ9sHErBxJnJAgh+f5YhusYECEcjo4XcyH87hn6+ks0A== dependencies: - has-symbols "^1.0.2" + call-bind "^1.0.7" + has-symbols "^1.0.3" + safe-regex-test "^1.0.3" is-typed-array@^1.1.13: version "1.1.13" @@ -5474,6 +5478,11 @@ is-unicode-supported@^0.1.0: resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== +is-weakmap@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.2.tgz#bf72615d649dfe5f699079c54b83e47d1ae19cfd" + integrity sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w== + is-weakref@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" @@ -5481,6 +5490,14 @@ is-weakref@^1.0.2: dependencies: call-bind "^1.0.2" +is-weakset@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.3.tgz#e801519df8c0c43e12ff2834eead84ec9e624007" + integrity sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ== + dependencies: + call-bind "^1.0.7" + get-intrinsic "^1.2.4" + is-windows@^1.0.1, is-windows@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" @@ -5656,10 +5673,10 @@ jsdoc-type-pratt-parser@~4.0.0: resolved "https://registry.yarnpkg.com/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-4.0.0.tgz#136f0571a99c184d84ec84662c45c29ceff71114" integrity sha512-YtOli5Cmzy3q4dP26GraSOeAhqecewG04hoO8DY56CH4KJ9Fvv5qKWUCCo3HZob7esJQHCv6/+bnTy72xZZaVQ== -jsesc@^2.5.1: - version "2.5.2" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" - integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== +jsesc@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-3.0.2.tgz#bb8b09a6597ba426425f2e4a07245c3d00b9343e" + integrity sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g== json-buffer@3.0.1: version "3.0.1" @@ -6055,9 +6072,9 @@ magic-string@^0.23.2: sourcemap-codec "^1.4.1" magic-string@^0.30.11: - version "0.30.11" - resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.11.tgz#301a6f93b3e8c2cb13ac1a7a673492c0dfd12954" - integrity sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A== + version "0.30.14" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.14.tgz#e9bb29870b81cfc1ec3cc656552f5a7fcbf19077" + integrity sha512-5c99P1WKTed11ZC0HMJOj6CDIue6F8ySu+bJL+85q1zBEIY8IklrJ1eiKC2NDRh3Ct3FcvmJPyQHb9erXMTJNw== dependencies: "@jridgewell/sourcemap-codec" "^1.5.0" @@ -6445,9 +6462,9 @@ mutexify@^1.1.0: queue-tick "^1.0.0" nan@^2.12.1, nan@^2.14.0: - version "2.20.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.20.0.tgz#08c5ea813dd54ed16e5bd6505bf42af4f7838ca3" - integrity sha512-bk3gXBZDGILuuo/6sKtr0DQmSThYHLtNCdSdXk9YkxD/jK6X2vmCyyXBBxyqZ4XcnzTyYEAThfX3DCEnLf6igw== + version "2.22.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.22.0.tgz#31bc433fc33213c97bad36404bb68063de604de3" + integrity sha512-nbajikzWTMwsW+eSsNm3QwlOs7het9gGJU5dDZzRTQGk03vyBOauxgI4VakDzE0PtsGTmXPsXTbbjVhRwR5mpw== nanobench@^2.1.1: version "2.1.1" @@ -6460,9 +6477,9 @@ nanobench@^2.1.1: pretty-hrtime "^1.0.2" nanoid@^3.3.7: - version "3.3.7" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" - integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== + version "3.3.8" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.8.tgz#b1be3030bee36aaff18bacb375e5cce521684baf" + integrity sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w== nanomatch@^1.2.9: version "1.2.13" @@ -6486,11 +6503,16 @@ natural-compare@^1.4.0: resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== -negotiator@0.6.3, negotiator@^0.6.2: +negotiator@0.6.3: version "0.6.3" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== +negotiator@^0.6.2: + version "0.6.4" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.4.tgz#777948e2452651c570b712dd01c23e262713fff7" + integrity sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w== + next-tick@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.1.0.tgz#1836ee30ad56d67ef281b22bd199f709449b35eb" @@ -6501,16 +6523,16 @@ nice-try@^1.0.4: resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== -nise@^5.1.4: - version "5.1.9" - resolved "https://registry.yarnpkg.com/nise/-/nise-5.1.9.tgz#0cb73b5e4499d738231a473cd89bd8afbb618139" - integrity sha512-qOnoujW4SV6e40dYxJOb3uvuoPHtmLzIk4TFo+j0jPJoC+5Z9xja5qH5JZobEPsa8+YYphMrOSwnrshEhG2qww== +nise@^6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/nise/-/nise-6.1.1.tgz#78ea93cc49be122e44cb7c8fdf597b0e8778b64a" + integrity sha512-aMSAzLVY7LyeM60gvBS423nBmIPP+Wy7St7hsb+8/fc1HmeoHJfLO8CKse4u3BtOZvQLJghYPI2i/1WZrEj5/g== dependencies: - "@sinonjs/commons" "^3.0.0" - "@sinonjs/fake-timers" "^11.2.2" - "@sinonjs/text-encoding" "^0.7.2" + "@sinonjs/commons" "^3.0.1" + "@sinonjs/fake-timers" "^13.0.1" + "@sinonjs/text-encoding" "^0.7.3" just-extend "^6.2.0" - path-to-regexp "^6.2.1" + path-to-regexp "^8.1.0" node-cleanup@^2.1.2: version "2.1.2" @@ -6679,10 +6701,10 @@ object-copy@^0.1.0: define-property "^0.2.5" kind-of "^3.0.3" -object-inspect@^1.13.1: - version "1.13.2" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.2.tgz#dea0088467fb991e67af4058147a24824a3043ff" - integrity sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g== +object-inspect@^1.13.1, object-inspect@^1.13.3: + version "1.13.3" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.3.tgz#f14c183de51130243d6d18ae149375ff50ea488a" + integrity sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA== object-keys@^1.1.1: version "1.1.1" @@ -6896,9 +6918,9 @@ package-hash@^4.0.0: release-zalgo "^1.0.0" package-json-from-dist@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz#e501cd3094b278495eb4258d4c9f6d5ac3019f00" - integrity sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw== + version "1.0.1" + resolved "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz#4f1471a010827a86f94cfd9b0727e36d267de505" + integrity sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw== package-json@^4.0.0: version "4.0.1" @@ -6953,11 +6975,11 @@ parse-passwd@^1.0.0: integrity sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q== parse5-htmlparser2-tree-adapter@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz#23c2cc233bcf09bb7beba8b8a69d46b08c62c2f1" - integrity sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g== + version "7.1.0" + resolved "https://registry.yarnpkg.com/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.1.0.tgz#b5a806548ed893a43e24ccb42fbb78069311e81b" + integrity sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g== dependencies: - domhandler "^5.0.2" + domhandler "^5.0.3" parse5 "^7.0.0" parse5-parser-stream@^7.1.2: @@ -6968,11 +6990,11 @@ parse5-parser-stream@^7.1.2: parse5 "^7.0.0" parse5@^7.0.0, parse5@^7.1.2: - version "7.1.2" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-7.1.2.tgz#0736bebbfd77793823240a23b7fc5e010b7f8e32" - integrity sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw== + version "7.2.1" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-7.2.1.tgz#8928f55915e6125f430cc44309765bf17556a33a" + integrity sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ== dependencies: - entities "^4.4.0" + entities "^4.5.0" parseurl@~1.3.3: version "1.3.3" @@ -7037,10 +7059,10 @@ path-to-regexp@0.1.10: resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.10.tgz#67e9108c5c0551b9e5326064387de4763c4d5f8b" integrity sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w== -path-to-regexp@^6.2.1: - version "6.3.0" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-6.3.0.tgz#2b6a26a337737a8e1416f9272ed0766b1c0389f4" - integrity sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ== +path-to-regexp@^8.1.0: + version "8.2.0" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-8.2.0.tgz#73990cc29e57a3ff2a0d914095156df5db79e8b4" + integrity sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ== path-type@^3.0.0: version "3.0.0" @@ -7066,7 +7088,7 @@ pause-stream@0.0.11: dependencies: through "~2.3" -pbkdf2@^3.0.3, pbkdf2@^3.1.2: +pbkdf2@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075" integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA== @@ -7082,10 +7104,10 @@ performance-now@^2.1.0: resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" integrity sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow== -picocolors@^1.0.0, picocolors@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.0.tgz#5358b76a78cde483ba5cef6a9dc9671440b27d59" - integrity sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw== +picocolors@^1.0.0, picocolors@^1.1.0, picocolors@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" + integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: version "2.3.1" @@ -7163,14 +7185,14 @@ possible-typed-array-names@^1.0.0: resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz#89bb63c6fada2c3e90adc4a647beeeb39cc7bf8f" integrity sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q== -postcss@^8.4.44: - version "8.4.45" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.45.tgz#538d13d89a16ef71edbf75d895284ae06b79e603" - integrity sha512-7KTLTdzdZZYscUc65XmjFiB73vBhBfbPztCYdUNvlaso9PrzjzcmjqBPR0lNGkcVlcO4BjiO5rK/qNz+XAen1Q== +postcss@^8.4.48: + version "8.4.49" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.49.tgz#4ea479048ab059ab3ae61d082190fabfd994fe19" + integrity sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA== dependencies: nanoid "^3.3.7" - picocolors "^1.0.1" - source-map-js "^1.2.0" + picocolors "^1.1.1" + source-map-js "^1.2.1" prelude-ls@^1.2.1: version "1.2.1" @@ -7190,9 +7212,9 @@ prettier-linter-helpers@^1.0.0: fast-diff "^1.1.2" prettier@^3.3.3: - version "3.3.3" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.3.3.tgz#30c54fe0be0d8d12e6ae61dbb10109ea00d53105" - integrity sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew== + version "3.4.1" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.4.1.tgz#e211d451d6452db0a291672ca9154bc8c2579f7b" + integrity sha512-G+YdqtITVZmOJje6QkXQWzl3fSfMxFwm1tjTyo9exhkmWSqC4Yhd1+lug++IlR2mvRVAxEDDWYkQdeSztajqgg== pretty-hrtime@^1.0.2: version "1.0.3" @@ -7205,9 +7227,9 @@ process-nextick-args@~2.0.0: integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== process-on-spawn@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/process-on-spawn/-/process-on-spawn-1.0.0.tgz#95b05a23073d30a17acfdc92a440efd2baefdc93" - integrity sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg== + version "1.1.0" + resolved "https://registry.yarnpkg.com/process-on-spawn/-/process-on-spawn-1.1.0.tgz#9d5999ba87b3bf0a8acb05322d69f2f5aa4fb763" + integrity sha512-JOnOPQ/8TZgjs1JIH/m9ni7FfimjNa/PRx7y/Wb5qdItsnhO0jE4AT7fC0HjC28DUQWDr50dwSYZLdRMlqDq3Q== dependencies: fromentries "^1.2.0" @@ -7256,16 +7278,18 @@ pseudomap@^1.0.2: integrity sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ== psl@^1.1.28: - version "1.9.0" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" - integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== + version "1.15.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.15.0.tgz#bdace31896f1d97cec6a79e8224898ce93d974c6" + integrity sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w== + dependencies: + punycode "^2.3.1" pstree.remy@^1.1.7, pstree.remy@^1.1.8: version "1.1.8" resolved "https://registry.yarnpkg.com/pstree.remy/-/pstree.remy-1.1.8.tgz#c242224f4a67c21f686839bbdb4ac282b8373d3a" integrity sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w== -public-encrypt@^4.0.0: +public-encrypt@^4.0.3: version "4.0.3" resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q== @@ -7285,18 +7309,25 @@ pump@^3.0.0: end-of-stream "^1.1.0" once "^1.3.1" -punycode@^2.1.0, punycode@^2.1.1: +punycode@^2.1.0, punycode@^2.1.1, punycode@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== -qs@6.13.0, qs@^6.7.0: +qs@6.13.0: version "6.13.0" resolved "https://registry.yarnpkg.com/qs/-/qs-6.13.0.tgz#6ca3bd58439f7e245655798997787b0d88a51906" integrity sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg== dependencies: side-channel "^1.0.6" +qs@^6.7.0: + version "6.13.1" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.13.1.tgz#3ce5fc72bd3a8171b85c99b93c65dd20b7d1b16e" + integrity sha512-EJPeIn0CYrGu+hli1xilKAPXODtJ12T0sP63Ijx2/khC2JtuaN3JyNIpvmnkmaEtha9ocbG4A4cMcr+TvqvwQg== + dependencies: + side-channel "^1.0.6" + qs@~6.5.2: version "6.5.3" resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.3.tgz#3aeeffc91967ef6e35c0e488ef46fb296ab76aad" @@ -7329,7 +7360,7 @@ randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.1.0: dependencies: safe-buffer "^5.1.0" -randomfill@^1.0.3: +randomfill@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw== @@ -7460,6 +7491,19 @@ rechoir@^0.6.2: dependencies: resolve "^1.1.6" +reflect.getprototypeof@^1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.7.tgz#04311b33a1b713ca5eb7b5aed9950a86481858e5" + integrity sha512-bMvFGIUKlc/eSfXNX+aZ+EL95/EgZzuwA0OBPTbZZDEJw/0AkentjMuM1oiRfwHrshqk4RzdgiTg5CcDalXN5g== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.5" + es-errors "^1.3.0" + get-intrinsic "^1.2.4" + gopd "^1.0.1" + which-builtin-type "^1.1.4" + regenerator-runtime@^0.14.0: version "0.14.1" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f" @@ -7473,15 +7517,15 @@ regex-not@^1.0.0, regex-not@^1.0.2: extend-shallow "^3.0.2" safe-regex "^1.1.0" -regexp.prototype.flags@^1.5.2: - version "1.5.2" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz#138f644a3350f981a858c44f6bb1a61ff59be334" - integrity sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw== +regexp.prototype.flags@^1.5.3: + version "1.5.3" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.3.tgz#b3ae40b1d2499b8350ab2c3fe6ef3845d3a96f42" + integrity sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ== dependencies: - call-bind "^1.0.6" + call-bind "^1.0.7" define-properties "^1.2.1" es-errors "^1.3.0" - set-function-name "^2.0.1" + set-function-name "^2.0.2" registry-auth-token@^3.0.1: version "3.4.0" @@ -7901,7 +7945,7 @@ set-function-length@^1.2.1: gopd "^1.0.1" has-property-descriptors "^1.0.2" -set-function-name@^2.0.1: +set-function-name@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.2.tgz#16a705c5a0dc2f5e638ca96d8a8cd4e1c2b90985" integrity sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ== @@ -7959,9 +8003,9 @@ shebang-regex@^3.0.0: integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== shell-quote@^1.6.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.1.tgz#6dbf4db75515ad5bac63b4f1894c3a154c766680" - integrity sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA== + version "1.8.2" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.2.tgz#d2d83e057959d53ec261311e9e9b8f51dcb2934a" + integrity sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA== shelljs@^0.8.5: version "0.8.5" @@ -8012,16 +8056,16 @@ simple-update-notifier@^2.0.0: dependencies: semver "^7.5.3" -sinon@^16.1.3: - version "16.1.3" - resolved "https://registry.yarnpkg.com/sinon/-/sinon-16.1.3.tgz#b760ddafe785356e2847502657b4a0da5501fba8" - integrity sha512-mjnWWeyxcAf9nC0bXcPmiDut+oE8HYridTNzBbF98AYVLmWwGRp2ISEpyhYflG1ifILT+eNn3BmKUJPxjXUPlA== +sinon@^19.0.2: + version "19.0.2" + resolved "https://registry.yarnpkg.com/sinon/-/sinon-19.0.2.tgz#944cf771d22236aa84fc1ab70ce5bffc3a215dad" + integrity sha512-euuToqM+PjO4UgXeLETsfQiuoyPXlqFezr6YZDFwHR3t4qaX0fZUe1MfPMznTL5f8BWrVS89KduLdMUsxFCO6g== dependencies: - "@sinonjs/commons" "^3.0.0" - "@sinonjs/fake-timers" "^10.3.0" - "@sinonjs/samsam" "^8.0.0" - diff "^5.1.0" - nise "^5.1.4" + "@sinonjs/commons" "^3.0.1" + "@sinonjs/fake-timers" "^13.0.2" + "@sinonjs/samsam" "^8.0.1" + diff "^7.0.0" + nise "^6.1.1" supports-color "^7.2.0" slash@^3.0.0: @@ -8066,7 +8110,7 @@ sonic-boom@^3.7.0: dependencies: atomic-sleep "^1.0.0" -source-map-js@^1.2.0: +source-map-js@^1.2.0, source-map-js@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46" integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== @@ -8302,10 +8346,10 @@ stream-shift@^1.0.2: resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.3.tgz#85b8fab4d71010fc3ba8772e8046cc49b8a3864b" integrity sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ== -stream-transform@^3.3.2: - version "3.3.2" - resolved "https://registry.yarnpkg.com/stream-transform/-/stream-transform-3.3.2.tgz#398c67b2f3b6ed5d04ceadde9e412bda8416c8ab" - integrity sha512-v64PUnPy9Qw94NGuaEMo+9RHQe4jTBYf+NkTtqkCgeuiNo8NlL0LtLR7fkKWNVFtp3RhIm5Dlxkgm5uz7TDimQ== +stream-transform@^3.3.3: + version "3.3.3" + resolved "https://registry.yarnpkg.com/stream-transform/-/stream-transform-3.3.3.tgz#d130bfed33739de6ef190a8f06cc8ad1b4c1635a" + integrity sha512-dALXrXe+uq4aO5oStdHKlfCM/b3NBdouigvxVPxCdrMRAU6oHh3KNss20VbTPQNQmjAHzZGKGe66vgwegFEIog== string-argv@^0.3.1, string-argv@~0.3.1: version "0.3.2" @@ -8524,9 +8568,9 @@ supports-preserve-symlinks-flag@^1.0.0: integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== synckit@^0.9.1: - version "0.9.1" - resolved "https://registry.yarnpkg.com/synckit/-/synckit-0.9.1.tgz#febbfbb6649979450131f64735aa3f6c14575c88" - integrity sha512-7gr8p9TQP6RAHusBOSLs46F4564ZrjV8xFmw5zCmgmhGUcw2hxsShhJ6CEiHQMgPDwAQ1fWHPM0ypc4RMAig4A== + version "0.9.2" + resolved "https://registry.yarnpkg.com/synckit/-/synckit-0.9.2.tgz#a3a935eca7922d48b9e7d6c61822ee6c3ae4ec62" + integrity sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw== dependencies: "@pkgr/core" "^0.1.0" tslib "^2.6.2" @@ -8557,9 +8601,9 @@ terser@^4.7.0: source-map-support "~0.5.12" terser@^5.15.1: - version "5.32.0" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.32.0.tgz#ee811c0d2d6b741c1cc34a2bc5bcbfc1b5b1f96c" - integrity sha512-v3Gtw3IzpBJ0ugkxEX8U0W6+TnPKRRCWGh1jC/iM/e3Ki5+qvO1L1EAZ56bZasc64aXHwRHNIQEzm6//i5cemQ== + version "5.36.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.36.0.tgz#8b0dbed459ac40ff7b4c9fd5a3a2029de105180e" + integrity sha512-IYV9eNMuFAV4THUspIRXkLakHnV6XO7FEdtKjf/mDyrnqUg9LnlOn6/RwRvM9SZjR4GUq8Nk8zj67FzVARr74w== dependencies: "@jridgewell/source-map" "^0.3.3" acorn "^8.8.2" @@ -8654,11 +8698,6 @@ tinyify@^4.0.0: through2 "^4.0.2" unassertify "^3.0.1" -to-fast-properties@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" - integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== - to-object-path@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" @@ -8735,9 +8774,9 @@ trim-repeated@^1.0.0: escape-string-regexp "^1.0.2" ts-api-utils@^1.0.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.3.0.tgz#4b490e27129f1e8e686b45cc4ab63714dc60eea1" - integrity sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ== + version "1.4.3" + resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.4.3.tgz#bfc2215fe6528fecab2b0fba570a2e8a4263b064" + integrity sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw== ts-mocha@10.0.0: version "10.0.0" @@ -8806,10 +8845,10 @@ tslib@^1.10.0: resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tslib@^2.2.0, tslib@^2.6.2: - version "2.7.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.7.0.tgz#d9b40c5c40ab59e8738f297df3087bf1a2690c01" - integrity sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA== +tslib@^2.2.0, tslib@^2.6.2, tslib@^2.7.0: + version "2.8.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" + integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== tunnel-agent@^0.6.0: version "0.6.0" @@ -8901,9 +8940,9 @@ typed-array-byte-length@^1.0.1: is-typed-array "^1.1.13" typed-array-byte-offset@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz#f9ec1acb9259f395093e4567eb3c28a580d02063" - integrity sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA== + version "1.0.3" + resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.3.tgz#3fa9f22567700cc86aaf86a1e7176f74b59600f2" + integrity sha512-GsvTyUHTriq6o/bHcTd0vM7OQ9JEdlvluu9YISaA7+KzDzPaIzEeDFNkTfhdE3MYcNhNi0vq/LlegYgIs5yPAw== dependencies: available-typed-arrays "^1.0.7" call-bind "^1.0.7" @@ -8911,18 +8950,19 @@ typed-array-byte-offset@^1.0.2: gopd "^1.0.1" has-proto "^1.0.3" is-typed-array "^1.1.13" + reflect.getprototypeof "^1.0.6" typed-array-length@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.6.tgz#57155207c76e64a3457482dfdc1c9d1d3c4c73a3" - integrity sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g== + version "1.0.7" + resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.7.tgz#ee4deff984b64be1e118b0de8c9c877d5ce73d3d" + integrity sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg== dependencies: call-bind "^1.0.7" for-each "^0.3.3" gopd "^1.0.1" - has-proto "^1.0.3" is-typed-array "^1.1.13" possible-typed-array-names "^1.0.0" + reflect.getprototypeof "^1.0.6" typedarray-to-buffer@^3.1.5: version "3.1.5" @@ -9000,10 +9040,15 @@ undici-types@~6.19.2: resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.19.8.tgz#35111c9d1437ab83a7cdc0abae2f26d88eda0a02" integrity sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw== +undici-types@~6.20.0: + version "6.20.0" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.20.0.tgz#8171bf22c1f588d1554d55bf204bc624af388433" + integrity sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg== + undici@^6.19.5: - version "6.19.8" - resolved "https://registry.yarnpkg.com/undici/-/undici-6.19.8.tgz#002d7c8a28f8cc3a44ff33c3d4be4d85e15d40e1" - integrity sha512-U8uCCl2x9TK3WANvmBavymRzxbfFYG+tAu+fgx3zxQy3qdagQqBLwJVrdyO1TBfUXvfKveMKJZhpvUYoOjM+4g== + version "6.21.0" + resolved "https://registry.yarnpkg.com/undici/-/undici-6.21.0.tgz#4b3d3afaef984e07b48e7620c34ed8a285ed4cd4" + integrity sha512-BUgJXc752Kou3oOIuU1i+yZZypyZRqNPW0vqoMPl8VaoalSfeR0D8/t4iAS3yirs79SSMTxTag+ZC86uswv+Cw== union-value@^1.0.0: version "1.0.1" @@ -9060,13 +9105,13 @@ upath@^1.1.1: resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== -update-browserslist-db@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz#7ca61c0d8650766090728046e416a8cde682859e" - integrity sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ== +update-browserslist-db@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz#80846fba1d79e82547fb661f8d141e0945755fe5" + integrity sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A== dependencies: - escalade "^3.1.2" - picocolors "^1.0.1" + escalade "^3.2.0" + picocolors "^1.1.0" update-notifier@^2.5.0: version "2.5.0" @@ -9235,15 +9280,44 @@ whatwg-url@^5.0.0: webidl-conversions "^3.0.0" which-boxed-primitive@^1.0.2: + version "1.1.0" + resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.1.0.tgz#2d850d6c4ac37b95441a67890e19f3fda8b6c6d9" + integrity sha512-Ei7Miu/AXe2JJ4iNF5j/UphAgRoma4trE6PtisM09bPygb3egMH3YLW/befsWb1A1AxvNSFidOFTB18XtnIIng== + dependencies: + is-bigint "^1.1.0" + is-boolean-object "^1.2.0" + is-number-object "^1.1.0" + is-string "^1.1.0" + is-symbol "^1.1.0" + +which-builtin-type@^1.1.4: + version "1.2.0" + resolved "https://registry.yarnpkg.com/which-builtin-type/-/which-builtin-type-1.2.0.tgz#58042ac9602d78a6d117c7e811349df1268ba63c" + integrity sha512-I+qLGQ/vucCby4tf5HsLmGueEla4ZhwTBSqaooS+Y0BuxN4Cp+okmGuV+8mXZ84KDI9BA+oklo+RzKg0ONdSUA== + dependencies: + call-bind "^1.0.7" + function.prototype.name "^1.1.6" + has-tostringtag "^1.0.2" + is-async-function "^2.0.0" + is-date-object "^1.0.5" + is-finalizationregistry "^1.1.0" + is-generator-function "^1.0.10" + is-regex "^1.1.4" + is-weakref "^1.0.2" + isarray "^2.0.5" + which-boxed-primitive "^1.0.2" + which-collection "^1.0.2" + which-typed-array "^1.1.15" + +which-collection@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" - integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== + resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.2.tgz#627ef76243920a107e7ce8e96191debe4b16c2a0" + integrity sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw== dependencies: - is-bigint "^1.0.1" - is-boolean-object "^1.1.0" - is-number-object "^1.0.4" - is-string "^1.0.5" - is-symbol "^1.0.3" + is-map "^2.0.3" + is-set "^2.0.3" + is-weakmap "^2.0.2" + is-weakset "^2.0.3" which-module@^2.0.0: version "2.0.1" @@ -9251,9 +9325,9 @@ which-module@^2.0.0: integrity sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ== which-typed-array@^1.1.14, which-typed-array@^1.1.15: - version "1.1.15" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.15.tgz#264859e9b11a649b388bfaaf4f767df1f779b38d" - integrity sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA== + version "1.1.16" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.16.tgz#db4db429c4706feca2f01677a144278e4a8c216b" + integrity sha512-g+N+GAWiRj66DngFwHvISJd+ITsyphZvD1vChfVg6cEdnzy53GzB3oy0fUNlvhz7H7+MiqhYr26qxQShCpKTTQ== dependencies: available-typed-arrays "^1.0.7" call-bind "^1.0.7" @@ -9450,9 +9524,9 @@ yaml@^1.10.0: integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== yaml@^2.6.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.6.0.tgz#14059ad9d0b1680d0f04d3a60fe00f3a857303c3" - integrity sha512-a6ae//JvKDEra2kdi1qzCyrJW/WZCgFi8ydDV+eXExl95t+5R+ijnqHJbz9tmMh8FUjx3iv2fCQ4dclAQlO2UQ== + version "2.6.1" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.6.1.tgz#42f2b1ba89203f374609572d5349fb8686500773" + integrity sha512-7r0XPzioN/Q9kXBro/XPnA6kznR73DHq+GXh5ON7ZozRO6aMjbmiBuKste2wslTFkC5d1dw0GooOCepZXJ2SAg== yargs-parser@^13.1.2: version "13.1.2" From a8cc2c25a83d29f83ac1c12fc6f651bd87d023ea Mon Sep 17 00:00:00 2001 From: Yiqing Zhao Date: Wed, 4 Dec 2024 04:25:51 +0800 Subject: [PATCH 06/19] [JS] feat: add helper functions to to get Teams channels, members, and details (#1949) ## Linked issues closes: #minor ## Details Provide a list of your changes here. If you are fixing a bug, please provide steps to reproduce the bug. #### Change details > We have encapsulated three APIs from [`TeamsInfo`](https://github.com/microsoft/botbuilder-js/blob/main/libraries/botbuilder/src/teamsInfo.ts) class of `botbuilder` library: `getTeamChannels`, `getTeamDetails`, and `getPagedMember`, to facilitate easier proactive message sending. These three APIs have been wrapped as an initial sample. If this approach is deemed acceptable, we intend to extend this encapsulation to include additional APIs provided by `TeamsInfo`, such as `sendMessageToListOfUsers`, `sendMessageToAllUsersInTenant`, and more. PM Contact: @MuyangAmigo **code snippets**: To use the APIs: ```ts for (const reference of conversationReferences) { await app.sendProactiveActivity( reference, "Proactive message from RestifyNotiBot!" ); if (reference.conversation?.conversationType === "channel") { const details = await app.getTeamDetails(reference); const teamMembers = await app.getPagedMembers(reference); console.log(details, teamMembers.members.length); } } ``` **screenshots**: Results are printed as belows, furthur ![image](https://github.com/user-attachments/assets/a0317b50-dff4-429a-89dd-832cfe95d3f4) ## Attestation Checklist - [ ] My code follows the style guidelines of this project - I have checked for/fixed spelling, linting, and other errors - I have commented my code for clarity - I have made corresponding changes to the documentation (updating the doc strings in the code is sufficient) - My changes generate no new warnings - I have added tests that validates my changes, and provides sufficient test coverage. I have tested with: - Local testing - E2E testing in Teams - New and existing unit tests pass locally with my changes ### Additional information > Feel free to add other relevant information below --------- Co-authored-by: Yiqing Zhao Co-authored-by: Corina <14900841+corinagum@users.noreply.github.com> --- js/packages/teams-ai/src/Application.spec.ts | 308 ++++++++++++++++++- js/packages/teams-ai/src/Application.ts | 154 +++++++++- 2 files changed, 453 insertions(+), 9 deletions(-) diff --git a/js/packages/teams-ai/src/Application.spec.ts b/js/packages/teams-ai/src/Application.spec.ts index 513822f3a..f13d24ef8 100644 --- a/js/packages/teams-ai/src/Application.spec.ts +++ b/js/packages/teams-ai/src/Application.spec.ts @@ -11,7 +11,14 @@ import { MessageReactionTypes, TestAdapter, O365ConnectorCardActionQuery, - FileConsentCardResponse + FileConsentCardResponse, + TurnContext, + TeamsInfo, + ConversationReference, + TeamDetails, + ChannelInfo, + TeamsChannelAccount, + TeamsPagedMembersResult } from 'botbuilder'; import { @@ -920,4 +927,303 @@ describe('Application', () => { }); }); }); + + describe('getTeamChannels', () => { + let app = new Application(); + let stubContext: sinon.SinonStubbedInstance; + const returnedChannels: ChannelInfo[] = [{ id: 'testChannelId', name: 'testName' }]; + + beforeEach(() => { + app = new Application({ adapter: new TeamsAdapter() }); + stubContext = sandbox.createStubInstance(TurnContext); + const stubAdapter = sandbox.createStubInstance(CloudAdapter); + ( + stubAdapter.continueConversationAsync as unknown as sinon.SinonStub< + [string, Partial, (context: TurnContext) => Promise], + Promise + > + ).callsFake(async (fakeBotAppId, ref, logic) => { + await logic(stubContext); + }); + sandbox.stub(app, 'adapter').get(() => stubAdapter); + sandbox.stub(TeamsInfo, 'getTeamChannels').resolves(returnedChannels); + }); + + it('should return empty array if conversationType is not channel', async () => { + sandbox.stub(TurnContext, 'getConversationReference').returns({ + conversation: { + isGroup: false, + conversationType: 'personal', + id: 'testChannelId', + name: 'testName' + } + }); + const continueConversationAsyncStub = sandbox.stub(testAdapter, 'continueConversationAsync').resolves(); + + const channels = await app.getTeamChannels(new TurnContext(testAdapter, {})); + + assert.equal(channels.length, 0); + assert(continueConversationAsyncStub.notCalled); + }); + + it('should return channel array if conversationType is channel with defined teamId', async () => { + sandbox.stub(TurnContext, 'getConversationReference').returns({ + conversation: { + isGroup: false, + conversationType: 'channel', + id: 'testChannelId', + name: 'testName' + } + }); + sandbox.stub(TurnContext.prototype, 'activity').get(() => { + return { + channelData: { + team: { + id: 'testId' + } + } + }; + }); + + const channels = await app.getTeamChannels({ + conversation: { + isGroup: false, + conversationType: 'channel', + id: 'testChannelId', + name: 'testName' + } + }); + + assert.deepEqual(channels, returnedChannels); + }); + + it('should return channel array if conversationType is channel with defined conversationId and undefined name', async () => { + sandbox.stub(TurnContext, 'getConversationReference').returns({ + conversation: { + isGroup: false, + conversationType: 'channel', + id: 'testChannelId', + name: 'testName' + } + }); + sandbox.stub(TurnContext.prototype, 'activity').get(() => { + return { + conversation: { + id: 'teamId' + } + }; + }); + + const channels = await app.getTeamChannels({ + conversation: { + isGroup: false, + conversationType: 'channel', + id: 'testChannelId', + name: 'testName' + } + }); + + assert.deepEqual(channels, returnedChannels); + }); + + it('should return empty array if conversationType is channel with defined name', async () => { + sandbox.stub(TurnContext, 'getConversationReference').returns({ + conversation: { + isGroup: false, + conversationType: 'channel', + id: 'testChannelId', + name: 'testName' + } + }); + sandbox.stub(TurnContext.prototype, 'activity').get(() => { + return { + conversation: { + name: 'teamName', + id: 'teamId' + } + }; + }); + + const channels = await app.getTeamChannels({ + conversation: { + isGroup: false, + conversationType: 'channel', + id: 'testChannelId', + name: 'testName' + } + }); + + assert.equal(channels.length, 0); + }); + }); + + describe('getTeamDetails', () => { + let app = new Application(); + let stubContext: sinon.SinonStubbedInstance; + const returnedDetails: TeamDetails = { + id: 'teamId', + name: 'teamName' + }; + + beforeEach(() => { + app = new Application({ adapter: new TeamsAdapter() }); + stubContext = sandbox.createStubInstance(TurnContext); + const stubAdapter = sandbox.createStubInstance(CloudAdapter); + ( + stubAdapter.continueConversationAsync as unknown as sinon.SinonStub< + [string, Partial, (context: TurnContext) => Promise], + Promise + > + ).callsFake(async (fakeBotAppId, ref, logic) => { + await logic(stubContext); + }); + sandbox.stub(app, 'adapter').get(() => stubAdapter); + sandbox.stub(TeamsInfo, 'getTeamDetails').resolves(returnedDetails); + }); + + it('should return undefined details if conversationType is not channel', async () => { + sandbox.stub(TurnContext, 'getConversationReference').returns({ + conversation: { + isGroup: false, + conversationType: 'personal', + id: 'testChannelId', + name: 'testName' + } + }); + const continueConversationAsyncStub = sandbox.stub(testAdapter, 'continueConversationAsync').resolves(); + + const details = await app.getTeamDetails(new TurnContext(testAdapter, {})); + + assert.equal(details, undefined); + assert(continueConversationAsyncStub.notCalled); + }); + + it('should return team details if conversationType is channel with defined teamId', async () => { + sandbox.stub(TurnContext, 'getConversationReference').returns({ + conversation: { + isGroup: false, + conversationType: 'channel', + id: 'testChannelId', + name: 'testName' + } + }); + sandbox.stub(TurnContext.prototype, 'activity').get(() => { + return { + channelData: { + team: { + id: 'testId' + } + } + }; + }); + + const details = await app.getTeamDetails({ + conversation: { + isGroup: false, + conversationType: 'channel', + id: 'testChannelId', + name: 'testName' + } + }); + + assert.deepEqual(details, returnedDetails); + }); + + it('should return team details if conversationType is channel with defined conversationId and undefined name', async () => { + sandbox.stub(TurnContext, 'getConversationReference').returns({ + conversation: { + isGroup: false, + conversationType: 'channel', + id: 'testChannelId', + name: 'testName' + } + }); + sandbox.stub(TurnContext.prototype, 'activity').get(() => { + return { + conversation: { + id: 'teamId' + } + }; + }); + + const details = await app.getTeamDetails({ + conversation: { + isGroup: false, + conversationType: 'channel', + id: 'testChannelId', + name: 'testName' + } + }); + + assert.deepEqual(details, returnedDetails); + }); + + it('should return undefined if conversationType is channel with defined name', async () => { + sandbox.stub(TurnContext, 'getConversationReference').returns({ + conversation: { + isGroup: false, + conversationType: 'channel', + id: 'testChannelId', + name: 'testName' + } + }); + sandbox.stub(TurnContext.prototype, 'activity').get(() => { + return { + conversation: { + name: 'teamName', + id: 'teamId' + } + }; + }); + + const details = await app.getTeamDetails({ + conversation: { + isGroup: false, + conversationType: 'channel', + id: 'testChannelId', + name: 'testName' + } + }); + + assert.equal(details, undefined); + }); + }); + + describe('getPagedMembers', () => { + let app = new Application(); + let stubContext: sinon.SinonStubbedInstance; + const returnedPagedMembers: TeamsPagedMembersResult = { + continuationToken: 'token', + members: [{} as TeamsChannelAccount, {} as TeamsChannelAccount] + }; + + beforeEach(() => { + app = new Application({ adapter: new TeamsAdapter() }); + stubContext = sandbox.createStubInstance(TurnContext); + const stubAdapter = sandbox.createStubInstance(CloudAdapter); + ( + stubAdapter.continueConversationAsync as unknown as sinon.SinonStub< + [string, Partial, (context: TurnContext) => Promise], + Promise + > + ).callsFake(async (fakeBotAppId, ref, logic) => { + await logic(stubContext); + }); + sandbox.stub(app, 'adapter').get(() => stubAdapter); + sandbox.stub(TeamsInfo, 'getPagedMembers').resolves(returnedPagedMembers); + }); + + it('should return paged members result', async () => { + const pagedMembers = await app.getPagedMembers({ + conversation: { + isGroup: false, + conversationType: 'channel', + id: 'testChannelId', + name: 'testName' + } + }); + + assert.deepEqual(pagedMembers, returnedPagedMembers); + }); + }); }); diff --git a/js/packages/teams-ai/src/Application.ts b/js/packages/teams-ai/src/Application.ts index 2dd9b59f0..366d631f1 100644 --- a/js/packages/teams-ai/src/Application.ts +++ b/js/packages/teams-ai/src/Application.ts @@ -10,11 +10,15 @@ import { Activity, ActivityTypes, BotAdapter, + ChannelInfo, ConversationReference, FileConsentCardResponse, O365ConnectorCardActionQuery, ResourceResponse, Storage, + TeamDetails, + TeamsInfo, + TeamsPagedMembersResult, TurnContext } from 'botbuilder'; @@ -514,14 +518,7 @@ export class Application { } // Identify conversation reference - let reference: Partial; - if (typeof (context as TurnContext).activity == 'object') { - reference = TurnContext.getConversationReference((context as TurnContext).activity); - } else if (typeof (context as Partial).type == 'string') { - reference = TurnContext.getConversationReference(context as Partial); - } else { - reference = context as Partial; - } + const reference: Partial = getConversationReference(context); await this.adapter.continueConversationAsync(this._options.botAppId ?? '', reference, logic); } @@ -899,6 +896,106 @@ export class Application { return response; } + /** + * Retrieves the list of team channels for a given context. + * @param context - The context of the conversation, which can be a TurnContext, + * Partial, or Partial. + * @returns A promise that resolves to an array of ChannelInfo objects if the bot is installed into a team, otherwise returns an empty array. + */ + public async getTeamChannels(context: TurnContext): Promise; + public async getTeamChannels(conversationReference: Partial): Promise; + public async getTeamChannels(activity: Partial): Promise; + public async getTeamChannels( + context: TurnContext | Partial | Partial + ): Promise { + let teamsChannels: ChannelInfo[] = []; + + // Identify conversation reference + const reference: Partial = getConversationReference(context); + + if (reference.conversation?.conversationType === 'channel') { + await this.continueConversationAsync(reference, async (ctx) => { + const teamId = + ctx.activity?.channelData?.team?.id ?? + (ctx.activity?.conversation?.name === undefined ? ctx.activity?.conversation?.id : undefined); + if (teamId) { + teamsChannels = await TeamsInfo.getTeamChannels(ctx, teamId); + } + }); + } + + return teamsChannels; + } + + /** + * Retrieves the team details for a given context. + * @param context - The context of the conversation, which can be a TurnContext, + * Partial, or Partial. + * @returns A promise that resolves to an array of ChannelInfo objects if the bot is installed into a team, otherwise returns an empty array. + */ + public async getTeamDetails(context: TurnContext): Promise; + public async getTeamDetails( + conversationReference: Partial + ): Promise; + public async getTeamDetails(activity: Partial): Promise; + public async getTeamDetails( + context: TurnContext | Partial | Partial + ): Promise { + let teamDetails: TeamDetails | undefined = undefined; + + // Identify conversation reference + const reference: Partial = getConversationReference(context); + + if (reference.conversation?.conversationType === 'channel') { + await this.continueConversationAsync(reference, async (ctx) => { + const teamId = + ctx.activity?.channelData?.team?.id ?? + (ctx.activity?.conversation?.name === undefined ? ctx.activity?.conversation?.id : undefined); + if (teamId) { + teamDetails = await TeamsInfo.getTeamDetails(ctx, teamId); + } + }); + } + + return teamDetails; + } + + /** + * Gets a paginated list of members of one-on-one, group, or team conversation. + * @param context - The context for the current turn with the user. + * @param {number} pageSize - Suggested number of entries on a page. Page sizes with less than 50 are treated as 50, and greater than 500, are capped at 500. + * @param {string} continuationToken - A continuation token. + * @returns The TeamsPagedMembersResult with the list of members. + */ + public async getPagedMembers( + context: TurnContext, + pageSize?: number, + continuationToken?: string + ): Promise; + public async getPagedMembers( + reference: Partial, + pageSize?: number, + continuationToken?: string + ): Promise; + public async getPagedMembers( + activity: Partial, + pageSize?: number, + continuationToken?: string + ): Promise; + public async getPagedMembers( + context: TurnContext | Partial | Partial, + pageSize?: number, + continuationToken?: string + ): Promise { + let pagedMembers: TeamsPagedMembersResult = { members: [], continuationToken: '' }; + await this.continueConversationAsync(context, async (ctx) => { + // Page sizes with less than 50 are treated as 50, and greater than 500, are capped at 500. + pagedMembers = await TeamsInfo.getPagedMembers(ctx, pageSize, continuationToken); + }); + + return pagedMembers; + } + /** * Manually start a timer to periodically send "typing" activities. * @remarks @@ -1367,6 +1464,47 @@ function createSignInSelector(startSignIn?: boolean | Selector): Selector { }; } +/** + * Retrieves a conversation reference from the given TurnContext. + * @param {TurnContext} context - The context to extract the conversation reference from. + * @returns {Partial} The extracted conversation reference. + */ +function getConversationReference(context: TurnContext): Partial; +/** + * Retrieves a conversation reference from the given activity. + * @param {Partial} activity - The activity to extract the conversation reference from. + * @returns {Partial} The extracted conversation reference. + */ +function getConversationReference(activity: Partial): Partial; +/** + * Retrieves a conversation reference from the given reference. + * @param {Partial} reference - The reference to extract the conversation reference from. + * @returns {Partial} The extracted conversation reference. + */ +function getConversationReference(reference: Partial): Partial; +/** + * Retrieves a conversation reference from the given context, activity, or reference. + * Overloaded function signatures: + * - getConversationReference(context: TurnContext): Partial + * - getConversationReference(activity: Partial): Partial + * - getConversationReference(reference: Partial): Partial + * @param {TurnContext | Partial | Partial} context - The context, activity, or reference to extract the conversation reference from. + * @returns {Partial} The extracted conversation reference. + */ +function getConversationReference( + context: TurnContext | Partial | Partial +): Partial { + let reference: Partial; + if (typeof (context as TurnContext).activity == 'object') { + reference = TurnContext.getConversationReference((context as TurnContext).activity); + } else if (typeof (context as Partial).type == 'string') { + reference = TurnContext.getConversationReference(context as Partial); + } else { + reference = context as Partial; + } + return reference; +} + /** * @private */ From d7446e25c11535e15840bade18a6c4333701659c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 3 Dec 2024 12:33:46 -0800 Subject: [PATCH 07/19] [repo] bump: (deps): Bump the production group with 3 updates (#2203) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit #minor Bumps the production group with 3 updates: [actions/dependency-review-action](https://github.com/actions/dependency-review-action), [step-security/harden-runner](https://github.com/step-security/harden-runner) and [github/codeql-action](https://github.com/github/codeql-action). Updates `actions/dependency-review-action` from 4.4.0 to 4.5.0
Release notes

Sourced from actions/dependency-review-action's releases.

v4.5.0

What's Changed

New Contributors

Full Changelog: https://github.com/actions/dependency-review-action/compare/v4...v4.5.0

Commits
  • 3b139cf Merge pull request #851 from actions/ahmed3lmallah/prepare-for-4.5.0-release
  • d6807b6 updating generated code
  • c89b41f addressing lint issues
  • eee97d8 incrementing project version
  • 9d10182 Merge pull request #827 from ebickle/fix/comment-warn-only
  • 9192be9 Merge pull request #850 from actions/ahmed3lmallah/adressing-CVE-2024-21538
  • 2fc8e23 Using cross-spawn safe version
  • fb86db2 fix: resolve race conditions in async core.group calls
  • 0a198ab fix: replace integer failureCount with boolean
  • fc499fc Merge branch 'main' into fix/comment-warn-only
  • Additional commits viewable in compare view

Updates `step-security/harden-runner` from 2.10.1 to 2.10.2
Release notes

Sourced from step-security/harden-runner's releases.

v2.10.2

What's Changed

  1. Fixes low-severity command injection weaknesses The advisory is here: https://github.com/step-security/harden-runner/security/advisories/GHSA-g85v-wf27-67xc

  2. Bug fix to improve detection of whether Harden-Runner is running in a container

Full Changelog: https://github.com/step-security/harden-runner/compare/v2...v2.10.2

Commits

Updates `github/codeql-action` from 3.27.4 to 3.27.5
Release notes

Sourced from github/codeql-action's releases.

v3.27.5

CodeQL Action Changelog

See the releases page for the relevant changes to the CodeQL CLI and language packs.

Note that the only difference between v2 and v3 of the CodeQL Action is the node version they support, with v3 running on node 20 while we continue to release v2 to support running on node 16. For example 3.22.11 was the first v3 release and is functionally identical to 2.22.11. This approach ensures an easy way to track exactly which features are included in different versions, indicated by the minor and patch version numbers.

3.27.5 - 19 Nov 2024

No user facing changes.

See the full CHANGELOG.md for more information.

Changelog

Sourced from github/codeql-action's changelog.

CodeQL Action Changelog

See the releases page for the relevant changes to the CodeQL CLI and language packs.

Note that the only difference between v2 and v3 of the CodeQL Action is the node version they support, with v3 running on node 20 while we continue to release v2 to support running on node 16. For example 3.22.11 was the first v3 release and is functionally identical to 2.22.11. This approach ensures an easy way to track exactly which features are included in different versions, indicated by the minor and patch version numbers.

[UNRELEASED]

No user facing changes.

3.27.5 - 19 Nov 2024

No user facing changes.

3.27.4 - 14 Nov 2024

No user facing changes.

3.27.3 - 12 Nov 2024

No user facing changes.

3.27.2 - 12 Nov 2024

  • Fixed an issue where setting up the CodeQL tools would sometimes fail with the message "Invalid value 'undefined' for header 'authorization'". #2590

3.27.1 - 08 Nov 2024

  • The CodeQL Action now downloads bundles compressed using Zstandard on GitHub Enterprise Server when using Linux or macOS runners. This speeds up the installation of the CodeQL tools. This feature is already available to GitHub.com users. #2573
  • Update default CodeQL bundle version to 2.19.3. #2576

3.27.0 - 22 Oct 2024

  • Bump the minimum CodeQL bundle version to 2.14.6. #2549
  • Fix an issue where the upload-sarif Action would fail with "upload-sarif post-action step failed: Input required and not supplied: token" when called in a composite Action that had a different set of inputs to the ones expected by the upload-sarif Action. #2557
  • Update default CodeQL bundle version to 2.19.2. #2552

3.26.13 - 14 Oct 2024

No user facing changes.

3.26.12 - 07 Oct 2024

  • Upcoming breaking change: Add a deprecation warning for customers using CodeQL version 2.14.5 and earlier. These versions of CodeQL were discontinued on 24 September 2024 alongside GitHub Enterprise Server 3.10, and will be unsupported by CodeQL Action versions 3.27.0 and later and versions 2.27.0 and later. #2520

    • If you are using one of these versions, please update to CodeQL CLI version 2.14.6 or later. For instance, if you have specified a custom version of the CLI using the 'tools' input to the 'init' Action, you can remove this input to use the default version.

    • Alternatively, if you want to continue using a version of the CodeQL CLI between 2.13.5 and 2.14.5, you can replace github/codeql-action/*@v3 by github/codeql-action/*@v3.26.11 and github/codeql-action/*@v2 by github/codeql-action/*@v2.26.11 in your code scanning workflow to ensure you continue using this version of the CodeQL Action.

3.26.11 - 03 Oct 2024

... (truncated)

Commits
  • f09c1c0 Merge pull request #2616 from github/update-v3.27.5-a6c8729a5
  • 67b73ea Update changelog for v3.27.5
  • a6c8729 Merge pull request #2614 from github/marcogario/per-platform-proxy
  • 8f3b487 Start-proxy: Fetch OS specific binary
  • cba5fb5 Merge pull request #2613 from github/dependabot/npm_and_yarn/npm_and_yarn-018...
  • e782c3a Merge pull request #2612 from github/angelapwen/report-linux-runner-release
  • db67881 Update checked-in dependencies
  • ecde4d2 Bump cross-spawn from 7.0.3 to 7.0.6 in the npm_and_yarn group
  • e3c67a0 Merge pull request #2610 from github/dependabot/npm_and_yarn/npm-d2ca52e617
  • f9ada54 Telemetry: report OS release for GitHub-hosted Linux runners
  • Additional commits viewable in compare view

Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore major version` will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself) - `@dependabot ignore minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself) - `@dependabot ignore ` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself) - `@dependabot unignore ` will remove all of the ignore conditions of the specified dependency - `@dependabot unignore ` will remove the ignore condition of the specified dependency and ignore conditions
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/dependency-review.yml | 2 +- .github/workflows/dotnet-build-test-lint.yml | 2 +- .github/workflows/dotnet-codeql.yml | 4 ++-- .github/workflows/js-build-test-lint.yml | 2 +- .github/workflows/js-codeql.yml | 4 ++-- .github/workflows/python-build-test-lint.yml | 2 +- .github/workflows/python-codeql.yml | 4 ++-- .github/workflows/scorecards.yml | 2 +- 8 files changed, 11 insertions(+), 11 deletions(-) diff --git a/.github/workflows/dependency-review.yml b/.github/workflows/dependency-review.yml index 74eee94fb..fea1d11c9 100644 --- a/.github/workflows/dependency-review.yml +++ b/.github/workflows/dependency-review.yml @@ -19,4 +19,4 @@ jobs: - name: 'Checkout Repository' uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: 'Dependency Review' - uses: actions/dependency-review-action@4081bf99e2866ebe428fc0477b69eb4fcda7220a # v4.4.0 + uses: actions/dependency-review-action@3b139cfc5fae8b618d3eae3675e383bb1769c019 # v4.5.0 diff --git a/.github/workflows/dotnet-build-test-lint.yml b/.github/workflows/dotnet-build-test-lint.yml index e1f572d32..159c10f0e 100644 --- a/.github/workflows/dotnet-build-test-lint.yml +++ b/.github/workflows/dotnet-build-test-lint.yml @@ -55,6 +55,6 @@ jobs: name: testresults-dotnet-${{ matrix.dotnet-version }} path: ${{ env.SOLUTION_DIR }}TestResults - name: Harden Runner - uses: step-security/harden-runner@91182cccc01eb5e619899d80e4e971d6181294a7 # v2.10.1 + uses: step-security/harden-runner@0080882f6c36860b6ba35c610c98ce87d4e2f26f # v2.10.2 with: egress-policy: audit diff --git a/.github/workflows/dotnet-codeql.yml b/.github/workflows/dotnet-codeql.yml index 9b936e402..6e91ff779 100644 --- a/.github/workflows/dotnet-codeql.yml +++ b/.github/workflows/dotnet-codeql.yml @@ -39,7 +39,7 @@ jobs: - name: Checkout uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Initialize CodeQL - uses: github/codeql-action/init@ea9e4e37992a54ee68a9622e985e60c8e8f12d9f # v3.27.4 + uses: github/codeql-action/init@f09c1c0a94de965c15400f5634aa42fac8fb8f88 # v3.27.5 with: languages: csharp - name: Setup .NET @@ -50,6 +50,6 @@ jobs: working-directory: dotnet/packages/Microsoft.TeamsAI/ run: dotnet build Microsoft.Teams.AI.sln --configuration Release - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@ea9e4e37992a54ee68a9622e985e60c8e8f12d9f # v3.27.4 + uses: github/codeql-action/analyze@f09c1c0a94de965c15400f5634aa42fac8fb8f88 # v3.27.5 with: category: "/language:csharp" diff --git a/.github/workflows/js-build-test-lint.yml b/.github/workflows/js-build-test-lint.yml index 2b16fa133..fcddf48ac 100644 --- a/.github/workflows/js-build-test-lint.yml +++ b/.github/workflows/js-build-test-lint.yml @@ -42,6 +42,6 @@ jobs: - name: Lint run: yarn lint - name: Harden Runner - uses: step-security/harden-runner@91182cccc01eb5e619899d80e4e971d6181294a7 # v2.10.1 + uses: step-security/harden-runner@0080882f6c36860b6ba35c610c98ce87d4e2f26f # v2.10.2 with: egress-policy: audit diff --git a/.github/workflows/js-codeql.yml b/.github/workflows/js-codeql.yml index a635d124a..768201763 100644 --- a/.github/workflows/js-codeql.yml +++ b/.github/workflows/js-codeql.yml @@ -38,10 +38,10 @@ jobs: - name: Checkout uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Initialize CodeQL - uses: github/codeql-action/init@ea9e4e37992a54ee68a9622e985e60c8e8f12d9f # v3.27.4 + uses: github/codeql-action/init@f09c1c0a94de965c15400f5634aa42fac8fb8f88 # v3.27.5 with: languages: javascript - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@ea9e4e37992a54ee68a9622e985e60c8e8f12d9f # v3.27.4 + uses: github/codeql-action/analyze@f09c1c0a94de965c15400f5634aa42fac8fb8f88 # v3.27.5 with: category: "/language:javascript" diff --git a/.github/workflows/python-build-test-lint.yml b/.github/workflows/python-build-test-lint.yml index ab934a4db..e390e26c4 100644 --- a/.github/workflows/python-build-test-lint.yml +++ b/.github/workflows/python-build-test-lint.yml @@ -51,6 +51,6 @@ jobs: run: | python scripts/lint.py - name: Harden Runner - uses: step-security/harden-runner@91182cccc01eb5e619899d80e4e971d6181294a7 # v2.10.1 + uses: step-security/harden-runner@0080882f6c36860b6ba35c610c98ce87d4e2f26f # v2.10.2 with: egress-policy: audit diff --git a/.github/workflows/python-codeql.yml b/.github/workflows/python-codeql.yml index bece20cbe..f27a1fd69 100644 --- a/.github/workflows/python-codeql.yml +++ b/.github/workflows/python-codeql.yml @@ -38,10 +38,10 @@ jobs: - name: Checkout uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Initialize CodeQL - uses: github/codeql-action/init@ea9e4e37992a54ee68a9622e985e60c8e8f12d9f # v3.27.4 + uses: github/codeql-action/init@f09c1c0a94de965c15400f5634aa42fac8fb8f88 # v3.27.5 with: languages: python - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@ea9e4e37992a54ee68a9622e985e60c8e8f12d9f # v3.27.4 + uses: github/codeql-action/analyze@f09c1c0a94de965c15400f5634aa42fac8fb8f88 # v3.27.5 with: category: "/language:python" diff --git a/.github/workflows/scorecards.yml b/.github/workflows/scorecards.yml index e9983d262..9fafeb0dc 100644 --- a/.github/workflows/scorecards.yml +++ b/.github/workflows/scorecards.yml @@ -66,6 +66,6 @@ jobs: # Upload the results to GitHub's code scanning dashboard. - name: "Upload to code-scanning" - uses: github/codeql-action/upload-sarif@ea9e4e37992a54ee68a9622e985e60c8e8f12d9f # v3.27.4 + uses: github/codeql-action/upload-sarif@f09c1c0a94de965c15400f5634aa42fac8fb8f88 # v3.27.5 with: sarif_file: results.sarif From eb63a75d18953147e732ee719913c36263cc843f Mon Sep 17 00:00:00 2001 From: Alex Acebo Date: Fri, 6 Dec 2024 03:30:21 +0800 Subject: [PATCH 08/19] DO NOT MERGE [JS] feat: custom feedback form + citation changes (#2182) ## Linked issues closes: #2167 ## Details update types/handlers for new custom feedback loop and citations changes for ignite. --- js/packages/teams-ai/src/AI.ts | 17 ++- js/packages/teams-ai/src/Application.ts | 17 ++- js/packages/teams-ai/src/Messages.spec.ts | 56 ++++++++++ js/packages/teams-ai/src/Messages.ts | 100 ++++++++++++++++++ js/packages/teams-ai/src/StreamingResponse.ts | 2 +- js/packages/teams-ai/src/Utilities.spec.ts | 12 +-- .../teams-ai/src/actions/SayCommand.spec.ts | 2 +- .../teams-ai/src/actions/SayCommand.ts | 16 ++- .../teams-ai/src/types/ClientCitation.ts | 49 +++++++-- 9 files changed, 248 insertions(+), 23 deletions(-) create mode 100644 js/packages/teams-ai/src/Messages.spec.ts create mode 100644 js/packages/teams-ai/src/Messages.ts diff --git a/js/packages/teams-ai/src/AI.ts b/js/packages/teams-ai/src/AI.ts index ab7114f42..a8244e4ce 100644 --- a/js/packages/teams-ai/src/AI.ts +++ b/js/packages/teams-ai/src/AI.ts @@ -68,6 +68,12 @@ export interface AIOptions { * https://github.com/microsoft/teams-ai/blob/main/getting-started/CONCEPTS/POWERED-BY-AI.md */ enable_feedback_loop?: boolean; + + /** + * Optional. Only used when `enable_feedback_loop` == `true`. When set to `custom` the user will be presented with a text input + * to provide feedback. + */ + feedback_loop_type?: 'default' | 'custom'; } /** @@ -104,6 +110,12 @@ export interface ConfiguredAIOptions { * If true, the AI system will enable the feedback loop in Teams that allows a user to give thumbs up or down to a response. */ enable_feedback_loop: boolean; + + /** + * Optional. Only used when `enable_feedback_loop` == `true`. When set to `custom` the user will be presented with a text input + * to provide feedback. + */ + feedback_loop_type?: 'default' | 'custom'; } /** @@ -225,8 +237,11 @@ export class AI { this.defaultAction(AI.HttpErrorActionName, actions.httpError()); this.defaultAction(AI.PlanReadyActionName, actions.planReady()); this.defaultAction(AI.DoCommandActionName, actions.doCommand()); - this.defaultAction(AI.SayCommandActionName, actions.sayCommand(this._options.enable_feedback_loop)); this.defaultAction(AI.TooManyStepsActionName, actions.tooManySteps()); + this.defaultAction(AI.SayCommandActionName, actions.sayCommand( + this._options.enable_feedback_loop, + this._options.feedback_loop_type || 'default' + )); } /** diff --git a/js/packages/teams-ai/src/Application.ts b/js/packages/teams-ai/src/Application.ts index 366d631f1..a9ed1f646 100644 --- a/js/packages/teams-ai/src/Application.ts +++ b/js/packages/teams-ai/src/Application.ts @@ -27,6 +27,7 @@ import { ReadReceiptInfo } from 'botframework-connector'; import { AdaptiveCards, AdaptiveCardsOptions } from './AdaptiveCards'; import { AI, AIOptions } from './AI'; import { Meetings } from './Meetings'; +import { Messages } from './Messages'; import { MessageExtensions } from './MessageExtensions'; import { TaskModules, TaskModulesOptions } from './TaskModules'; import { AuthenticationManager, AuthenticationOptions } from './authentication/Authentication'; @@ -153,12 +154,14 @@ export interface FeedbackLoopData { /** * 'like' or 'dislike' */ - reaction: string; + reaction: 'like' | 'dislike'; + /** * The response the user provides when prompted with "What did you like/dislike?" after pressing one of the feedback buttons. */ - feedback: string; + feedback: string | Record; }; + /** * The activity ID that the feedback was provided on. */ @@ -245,6 +248,7 @@ export class Application { private readonly _invokeRoutes: AppRoute[] = []; private readonly _adaptiveCards: AdaptiveCards; private readonly _meetings: Meetings; + private readonly _messages: Messages; private readonly _messageExtensions: MessageExtensions; private readonly _taskModules: TaskModules; private readonly _ai?: AI; @@ -287,6 +291,7 @@ export class Application { } this._adaptiveCards = new AdaptiveCards(this); + this._messages = new Messages(this); this._messageExtensions = new MessageExtensions(this); this._meetings = new Meetings(this); this._taskModules = new TaskModules(this); @@ -354,6 +359,14 @@ export class Application { return this._authentication; } + /** + * Fluent interface for accessing Messages specific features. + * @returns {Messages} The Messages instance. + */ + public get messages(): Messages { + return this._messages; + } + /** * Fluent interface for accessing Message Extensions' specific features. * @returns {MessageExtensions} The MessageExtensions instance. diff --git a/js/packages/teams-ai/src/Messages.spec.ts b/js/packages/teams-ai/src/Messages.spec.ts new file mode 100644 index 000000000..dc92ba5c5 --- /dev/null +++ b/js/packages/teams-ai/src/Messages.spec.ts @@ -0,0 +1,56 @@ +import sinon from 'sinon'; +import { strict as assert } from 'assert'; +import { ActivityTypes, Channels, INVOKE_RESPONSE_KEY, TestAdapter } from 'botbuilder'; + +import { Application } from './Application'; +import { createTestInvoke } from './internals/testing/TestUtilities'; +import { MessageInvokeNames, Messages } from './Messages'; + +describe('Messages', () => { + const adapter = new TestAdapter(); + let mockApp: Application; + + beforeEach(() => { + mockApp = new Application(); + sinon.stub(mockApp, 'adapter').get(() => adapter); + }); + + it('should exist when Application is instantiated', () => { + assert.notEqual(mockApp.messages, undefined); + assert.equal(mockApp.messages instanceof Messages, true); + }); + + describe(MessageInvokeNames.FETCH_INVOKE_NAME, () => { + it('fetch() with custom RouteSelector handler result is falsy', async () => { + const activity = createTestInvoke(MessageInvokeNames.FETCH_INVOKE_NAME, {}); + activity.channelId = Channels.Msteams; + mockApp.messages.fetch(async (_context, _state, _data) => { + return {}; + }); + + await adapter.processActivity(activity, async (context) => { + await mockApp.run(context); + const response = context.turnState.get(INVOKE_RESPONSE_KEY); + assert.deepEqual(response.value, { + status: 200, + body: { task: { type: 'continue', value: {} } } + }); + }); + }); + + it('fetch() with custom RouteSelector unhappy path', async () => { + const activity = { channelId: Channels.Msteams, type: ActivityTypes.Invoke, name: 'incorrectName' }; + const spy = sinon.spy(async (context, _state, _data) => { + return Promise.resolve(''); + }); + + mockApp.messages.fetch(spy); + + await adapter.processActivity(activity, async (context) => { + await mockApp.run(context); + }); + + assert.equal(spy.called, false); + }); + }); +}); diff --git a/js/packages/teams-ai/src/Messages.ts b/js/packages/teams-ai/src/Messages.ts new file mode 100644 index 000000000..1e00ccd25 --- /dev/null +++ b/js/packages/teams-ai/src/Messages.ts @@ -0,0 +1,100 @@ +/** + * @module teams-ai + */ +/** + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. + */ + +import { + ActivityTypes, + Channels, + INVOKE_RESPONSE_KEY, + InvokeResponse, + TaskModuleResponse, + TaskModuleTaskInfo, + TurnContext +} from 'botbuilder'; +import { Application } from './Application'; +import { TurnState } from './TurnState'; + +export enum MessageInvokeNames { + FETCH_INVOKE_NAME = `message/fetchTask` +} + +/** + * TaskModules class to enable fluent style registration of handlers related to Task Modules. + * @template TState Type of the turn state object being persisted. + */ +export class Messages { + private readonly _app: Application; + + /** + * Creates a new instance of the TaskModules class. + * @param {Application} app Top level application class to register handlers with. + */ + public constructor(app: Application) { + this._app = app; + } + + /** + * Registers a handler to process the initial fetch of the task module. + * @remarks + * Handlers should respond with either an initial TaskInfo object or a string containing + * a message to display to the user. + * @template TData Optional. Type of the data object being passed to the handler. + * @param {(context: TurnContext, state: TState, data: TData) => Promise} handler - Function to call when the handler is triggered. + * @param {TurnContext} handler.context - Context for the current turn of conversation with the user. + * @param {TState} handler.state - Current state of the turn. + * @param {TData} handler.data - Data object passed to the handler. + * @returns {Application} The application for chaining purposes. + */ + public fetch = Record>( + handler: (context: TurnContext, state: TState, data: TData) => Promise + ): Application { + this._app.addRoute( + async (context) => { + return ( + context?.activity?.type === ActivityTypes.Invoke && + context?.activity?.name === MessageInvokeNames.FETCH_INVOKE_NAME + ); + }, + async (context, state) => { + if (context?.activity?.channelId === Channels.Msteams) { + const result = await handler(context, state, context.activity.value?.data ?? {}); + + if (!context.turnState.get(INVOKE_RESPONSE_KEY)) { + // Format invoke response + let response: TaskModuleResponse; + if (typeof result == 'string') { + // Return message + response = { + task: { + type: 'message', + value: result + } + }; + } else { + // Return card + response = { + task: { + type: 'continue', + value: result + } + }; + } + + // Queue up invoke response + await context.sendActivity({ + value: { body: response, status: 200 } as InvokeResponse, + type: ActivityTypes.InvokeResponse + }); + } + } + }, + true + ); + + return this._app; + } +} diff --git a/js/packages/teams-ai/src/StreamingResponse.ts b/js/packages/teams-ai/src/StreamingResponse.ts index 467685933..0d42a76f5 100644 --- a/js/packages/teams-ai/src/StreamingResponse.ts +++ b/js/packages/teams-ai/src/StreamingResponse.ts @@ -119,7 +119,7 @@ export class StreamingResponse { for (const citation of citations) { const clientCitation: ClientCitation = { '@type': 'Claim', - position: `${currPos + 1}`, + position: currPos + 1, appearance: { '@type': 'DigitalDocument', name: citation.title || `Document #${currPos + 1}`, diff --git a/js/packages/teams-ai/src/Utilities.spec.ts b/js/packages/teams-ai/src/Utilities.spec.ts index f019d6d6d..cce713c66 100644 --- a/js/packages/teams-ai/src/Utilities.spec.ts +++ b/js/packages/teams-ai/src/Utilities.spec.ts @@ -87,7 +87,7 @@ describe('Utilities', () => { const citations = [ { '@type': 'Claim', - position: '1', + position: 1, appearance: { '@type': 'DigitalDocument', name: 'the title', @@ -96,7 +96,7 @@ describe('Utilities', () => { }, { '@type': 'Claim', - position: '2', + position: 2, appearance: { '@type': 'DigitalDocument', name: 'the title', @@ -113,7 +113,7 @@ describe('Utilities', () => { const citations = [ { '@type': 'Claim', - position: '1', + position: 1, appearance: { '@type': 'DigitalDocument', name: 'the title', @@ -122,7 +122,7 @@ describe('Utilities', () => { }, { '@type': 'Claim', - position: '2', + position: 2, appearance: { '@type': 'DigitalDocument', name: 'the title', @@ -131,7 +131,7 @@ describe('Utilities', () => { }, { '@type': 'Claim', - position: '3', + position: 3, appearance: { '@type': 'DigitalDocument', name: 'the title', @@ -140,7 +140,7 @@ describe('Utilities', () => { }, { '@type': 'Claim', - position: '4', + position: 4, appearance: { '@type': 'DigitalDocument', name: 'the title', diff --git a/js/packages/teams-ai/src/actions/SayCommand.spec.ts b/js/packages/teams-ai/src/actions/SayCommand.spec.ts index ea70ecbc9..7292b7179 100644 --- a/js/packages/teams-ai/src/actions/SayCommand.spec.ts +++ b/js/packages/teams-ai/src/actions/SayCommand.spec.ts @@ -188,7 +188,7 @@ describe('actions.sayCommand', () => { citation: [ { '@type': 'Claim', - position: '1', + position: 1, appearance: { '@type': 'DigitalDocument', name: 'the title', diff --git a/js/packages/teams-ai/src/actions/SayCommand.ts b/js/packages/teams-ai/src/actions/SayCommand.ts index d16e232e7..8af08452a 100644 --- a/js/packages/teams-ai/src/actions/SayCommand.ts +++ b/js/packages/teams-ai/src/actions/SayCommand.ts @@ -15,9 +15,13 @@ import { AIEntity, ClientCitation } from '../types'; /** * @private * @param {boolean} feedbackLoopEnabled - If true, the feedback loop UI for Teams will be enabled. + * @param {'default' | 'custom'} feedbackLoopType - the type of UI to use for feedback loop * @returns {''} - An empty string. */ -export function sayCommand(feedbackLoopEnabled: boolean = false) { +export function sayCommand( + feedbackLoopEnabled: boolean = false, + feedbackLoopType: 'default' | 'custom' = 'default', +) { return async (context: TurnContext, _state: TState, data: PredictedSayCommand) => { if (!data.response?.content) { return ''; @@ -37,7 +41,7 @@ export function sayCommand(feedbackLoopEna citations = data.response.context!.citations.map((citation, i) => { const clientCitation: ClientCitation = { '@type': 'Claim', - position: `${i + 1}`, + position: i + 1, appearance: { '@type': 'DigitalDocument', name: citation.title || `Document #${i + 1}`, @@ -54,6 +58,11 @@ export function sayCommand(feedbackLoopEna // If there are citations, filter out the citations unused in content. const referencedCitations = citations ? Utilities.getUsedCitations(contentText, citations) : undefined; + const channelData = feedbackLoopEnabled && feedbackLoopType ? { + feedbackLoop: { + type: feedbackLoopType + } + } : { feedbackLoopEnabled }; const entities: AIEntity[] = [ { @@ -65,10 +74,11 @@ export function sayCommand(feedbackLoopEna ...(referencedCitations ? { citation: referencedCitations } : {}) } ]; + const activity: Partial = { type: ActivityTypes.Message, text: contentText, - ...(isTeamsChannel ? { channelData: { feedbackLoopEnabled } } : {}), + ...(isTeamsChannel ? { channelData } : {}), entities: entities }; diff --git a/js/packages/teams-ai/src/types/ClientCitation.ts b/js/packages/teams-ai/src/types/ClientCitation.ts index cea3af835..cc42f1079 100644 --- a/js/packages/teams-ai/src/types/ClientCitation.ts +++ b/js/packages/teams-ai/src/types/ClientCitation.ts @@ -8,6 +8,29 @@ import { SensitivityUsageInfo } from './SensitivityUsageInfo'; +export type ClientCitationIconName = + | 'Microsoft Word' + | 'Microsoft Excel' + | 'Microsoft PowerPoint' + | 'Microsoft OneNote' + | 'Microsoft SharePoint' + | 'Microsoft Visio' + | 'Microsoft Loop' + | 'Microsoft Whiteboard' + | 'Adobe Illustrator' + | 'Adobe Photoshop' + | 'Adobe InDesign' + | 'Adobe Flash' + | 'Sketch' + | 'Source Code' + | 'Image' + | 'GIF' + | 'Video' + | 'Sound' + | 'ZIP' + | 'Text' + | 'PDF'; + /** * Represents a Teams client citation to be included in a message. See Bot messages with AI-generated content for more details. * https://learn.microsoft.com/en-us/microsoftteams/platform/bots/how-to/bot-messages-ai-generated-content?tabs=before%2Cbotmessage @@ -21,7 +44,7 @@ export interface ClientCitation { /** * Required. Number and position of the citation. */ - position: string; + position: number; appearance: { /** * Required; Must be 'DigitalDocument' @@ -29,12 +52,13 @@ export interface ClientCitation { '@type': 'DigitalDocument'; /** - * Name of the document. + * Name of the document. (max length 80) */ name: string; /** - * Optional; ignored in Teams + * Stringified adaptive card with additional information about the citation. + * It is rendered within the modal. */ text?: string; @@ -44,22 +68,29 @@ export interface ClientCitation { url?: string; /** - * Content of the citation. Must be clipped if longer than 480 characters. + * Extract of the referenced content. (max length 160) */ abstract: string; /** - * Used for icon; for now it is ignored. + * Encoding format of the ` citation.appearance.text` field. */ - encodingFormat?: 'text/html'; + encodingFormat?: 'application/vnd.microsoft.card.adaptive'; /** - * For now ignored, later used for icon + * Information about the citation’s icon. */ - image?: string; + image?: { + '@type': 'ImageObject'; + + /** + * The image/icon name + */ + name: ClientCitationIconName; + }; /** - * Optional; set by developer + * Optional; set by developer. (max length 3) (max keyword length 28) */ keywords?: string[]; From ecfdb0ac2d21a2afda117b30edfc6ebf5a8c5b39 Mon Sep 17 00:00:00 2001 From: Stephen Provine Date: Mon, 9 Dec 2024 09:05:05 -0800 Subject: [PATCH 09/19] [C#] feat: Allow passing custom credentials factory to CloudAdapter (#2166) ## Linked issues closes: #2130 ## Details Added an additional constructor to CloudAdapter that allows passing a custom credentials factory to CloudAdapter. This enables using an alternative credentials factory, like FederatedServiceClientCredentialsFactory, instead of it being hardcoded to the ConfigurationServiceClientCredentialFactory. ## Attestation Checklist - [x] My code follows the style guidelines of this project - [x] I have checked for/fixed spelling, linting, and other errors - [x] I have commented my code for clarity - [x] I have made corresponding changes to the documentation (updating the doc strings in the code is sufficient) - [x] My changes generate no new warnings - [x] New and existing unit tests pass locally with my changes --- .../Application/TeamsAdapter.cs | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/dotnet/packages/Microsoft.TeamsAI/Microsoft.TeamsAI/Application/TeamsAdapter.cs b/dotnet/packages/Microsoft.TeamsAI/Microsoft.TeamsAI/Application/TeamsAdapter.cs index 215902d22..29e54b14d 100644 --- a/dotnet/packages/Microsoft.TeamsAI/Microsoft.TeamsAI/Application/TeamsAdapter.cs +++ b/dotnet/packages/Microsoft.TeamsAI/Microsoft.TeamsAI/Application/TeamsAdapter.cs @@ -58,6 +58,29 @@ public TeamsAdapter( CredentialsFactory = new ConfigurationServiceClientCredentialFactory(configuration); } + /// + /// Initializes a new instance of the class. + /// + /// The instance. + /// The instance. + /// The this adapter should use. + /// The implementation this adapter should use. + public TeamsAdapter( + IConfiguration configuration, + ServiceClientCredentialsFactory credentialsFactory, + IHttpClientFactory? httpClientFactory = null, + ILogger? logger = null) : base( + new ConfigurationBotFrameworkAuthentication(configuration, + credentialsFactory: credentialsFactory, + httpClientFactory: new TeamsHttpClientFactory(httpClientFactory), + logger: logger), + logger) + { + HttpClientFactory = new TeamsHttpClientFactory(httpClientFactory); + Configuration = configuration; + CredentialsFactory = credentialsFactory; + } + /// public new async Task ProcessAsync(HttpRequest httpRequest, HttpResponse httpResponse, IBot bot, CancellationToken cancellationToken = default) { From 1efef595b945f08c0f05d9e28be930a8a3e506ba Mon Sep 17 00:00:00 2001 From: Steven Ickman Date: Mon, 9 Dec 2024 10:08:51 -0800 Subject: [PATCH 10/19] [JS] feat: streaming support for Tools Augmentation (#2195) ## Linked issues closes: #2197 ## Details This update adds support for properly calling tools with streaming support. It doesn't solve for the other augmentation types as that's much more challenging. #### Change details The challenge with streaming + tool use is that we need to make multiple calls to the model and we can only have a single stream open to the teams client. To address this we end up leveraging the fact that the Streamer is being cached to temp state and we let the tool call happen as it normally world. To the tool call its as if its a non-streaming message but the Streamer object is kept in memory (temp state) waiting for the tool call to complete. We a new request is made to the ActionPlanner, the created LLMClient will see that it's already created a Streamer and attach to that instance. There was a bit of book keeping that needed to be done but it's a straightforward change. **code snippets**: **screenshots**: ## Attestation Checklist - [x ] My code follows the style guidelines of this project - I have checked for/fixed spelling, linting, and other errors - I have commented my code for clarity - I have made corresponding changes to the documentation (updating the doc strings in the code is sufficient) - My changes generate no new warnings - I have added tests that validates my changes, and provides sufficient test coverage. I have tested with: - Local testing - E2E testing in Teams - New and existing unit tests pass locally with my changes ### Additional information > Feel free to add other relevant information below --- getting-started/CONCEPTS/STREAMING.md | 8 ++- .../teams-ai/src/models/OpenAIModel.ts | 54 ++++++++++---- .../teams-ai/src/planners/LLMClient.ts | 70 ++++++++++++------- .../c.actionMapping-lightBot/src/index.ts | 9 +-- 4 files changed, 97 insertions(+), 44 deletions(-) diff --git a/getting-started/CONCEPTS/STREAMING.md b/getting-started/CONCEPTS/STREAMING.md index f740d7a38..81d2f81b7 100644 --- a/getting-started/CONCEPTS/STREAMING.md +++ b/getting-started/CONCEPTS/STREAMING.md @@ -25,15 +25,18 @@ AI-powered bots tend to have slower response times which can disengage users. Th A common solution is to stream the bot’s response to users while the LLM generates its full response. Through streaming, your bot can offer an experience that feels engaging, responsive, and on-par with leading AI products. -There are two parts to streaming: +There are three parts to streaming: - **Informative Updates**: Provide users with insights into what your bot is doing before it has started generating its response. - **Response Streaming**: Provide users with chunks of the response as they are generated by the LLM. This feels like the bot is actively typing out its message. +- **Tools Streaming**: Initiate tool (action) calls as part of the streaming response. Streaming can now be paired with the `tools` augmentation to enable action calling as part of the streaming experience. + ## Sample Bots - [C# Streaming ChefBot](https://github.com/microsoft/teams-ai/tree/main/dotnet/samples/04.ai.g.teamsChefBot-streaming) - [JS Streaming ChefBot](https://github.com/microsoft/teams-ai/tree/main/js/samples/04.ai-apps/i.teamsChefBot-streaming) +- [JS Streaming+Tools LightBot](https://github.com/microsoft/teams-ai/tree/main/js/samples/03.ai-concepts/c.actionMapping-lightBot) - [Python Streaming ListBot](https://github.com/microsoft/teams-ai/tree/main/python/samples/04.ai.h.chainedActions.listBot-streaming) ## Streaming Response Class @@ -64,8 +67,9 @@ Once `endStream()` is called, the stream is considered ended and no further upda - “Finding relevant work items” - The informative message is rendered only at the beginning of each message returned from the LLM. - Attachments can only be sent in the final streamed chunk. -- Streaming is not available in conjunction with AI SDK's function calls yet. - Streaming does not work with OpenAI's `o1` models. +- Tools Streaming only works with the `tools` augmentation. The `sequence` and `monologue` augmentations do not currently support streaming. +- Streaming without tools support works with the `default` augmentation. ### Setup Instructions: diff --git a/js/packages/teams-ai/src/models/OpenAIModel.ts b/js/packages/teams-ai/src/models/OpenAIModel.ts index 11734fe5f..cfd11ce30 100644 --- a/js/packages/teams-ai/src/models/OpenAIModel.ts +++ b/js/packages/teams-ai/src/models/OpenAIModel.ts @@ -354,6 +354,10 @@ export class OpenAIModel implements PromptCompletionModel { params.presence_penalty = 0; } + // Check for tools augmentation + const isToolsAugmentation = + template.config.augmentation && template.config.augmentation?.augmentation_type == 'tools'; + // Call chat completion API let message: Message; const completion = await this._client.chat.completions.create(params); @@ -373,20 +377,44 @@ export class OpenAIModel implements PromptCompletionModel { if (delta.content) { message.content += delta.content; } + // Handle tool calls - if (delta.tool_calls) { - message.action_calls = delta.tool_calls.map( - (toolCall: OpenAI.Chat.Completions.ChatCompletionChunk.Choice.Delta.ToolCall) => { - return { - id: toolCall.id, - function: { - name: toolCall.function!.name, - arguments: toolCall.function!.arguments - }, - type: toolCall.type - } as ActionCall; + // - We don't know how many tool calls there will be so we need to add them one-by-one. + if (isToolsAugmentation && delta.tool_calls) { + // Create action calls array if it doesn't exist + if (!Array.isArray(message.action_calls)) { + message.action_calls = []; + } + + // Add tool calls to action calls + for (const toolCall of delta.tool_calls) { + // Add empty tool call to message if new index + // - Note that a single tool call can span multiple chunks. + const index = toolCall.index; + if (index >= message.action_calls.length) { + message.action_calls.push({ id: '', function: { name: '', arguments: '' }, type: '' } as any); + } + + // Set ID if provided + if (toolCall.id) { + message.action_calls[index].id = toolCall.id; + } + + // Set type if provided + if (toolCall.type) { + message.action_calls[index].type = toolCall.type; + } + + // Append function name if provided + if (toolCall.function?.name) { + message.action_calls[index].function.name += toolCall.function.name; + } + + // Append function arguments if provided + if (toolCall.function?.arguments) { + message.action_calls[index].function.arguments += toolCall.function.arguments; } - ); + } } // Signal chunk received @@ -415,8 +443,6 @@ export class OpenAIModel implements PromptCompletionModel { message.context = messageWithContext.context; } const actionCalls: ActionCall[] = []; - const isToolsAugmentation = - template.config.augmentation && template.config.augmentation?.augmentation_type == 'tools'; // Log tool calls to be added to message of type Message as action_calls if (isToolsAugmentation && responseMessage?.tool_calls) { diff --git a/js/packages/teams-ai/src/planners/LLMClient.ts b/js/packages/teams-ai/src/planners/LLMClient.ts index 50652c0da..05d0be611 100644 --- a/js/packages/teams-ai/src/planners/LLMClient.ts +++ b/js/packages/teams-ai/src/planners/LLMClient.ts @@ -284,7 +284,6 @@ export class LLMClient { functions: PromptFunctions ): Promise> { // Define event handlers - let isStreaming = false; let streamer: StreamingResponse | undefined; const beforeCompletion: PromptCompletionModelBeforeCompletionEvent = ( ctx, @@ -301,20 +300,23 @@ export class LLMClient { // Check for a streaming response if (streaming) { - isStreaming = true; - - // Create streamer and send initial message - streamer = new StreamingResponse(context); - memory.setValue('temp.streamer', streamer); - - if (this._enableFeedbackLoop != null) { - streamer.setFeedbackLoop(this._enableFeedbackLoop); - } - - streamer.setGeneratedByAILabel(true); - - if (this._startStreamingMessage) { - streamer.queueInformativeUpdate(this._startStreamingMessage); + // Attach to any existing streamer + // - see tool call note below to understand. + streamer = memory.getValue('temp.streamer'); + if (!streamer) { + // Create streamer and send initial message + streamer = new StreamingResponse(context); + memory.setValue('temp.streamer', streamer); + + if (this._enableFeedbackLoop != null) { + streamer.setFeedbackLoop(this._enableFeedbackLoop); + } + + streamer.setGeneratedByAILabel(true); + + if (this._startStreamingMessage) { + streamer.queueInformativeUpdate(this._startStreamingMessage); + } } } }; @@ -325,8 +327,15 @@ export class LLMClient { return; } - // Send chunk to client - const text = chunk.delta?.content ?? ''; + // Ignore calls without content + // - This is typically because the chunk represents a tool call. + // - See the note below for why we're handling tool calls this way. + if (!chunk.delta?.content) { + return; + } + + // Send text chunk to client + const text = chunk.delta?.content; const citations = chunk.delta?.context?.citations ?? undefined; if (text.length > 0) { @@ -347,15 +356,28 @@ export class LLMClient { try { // Complete the prompt const response = await this.callCompletePrompt(context, memory, functions); - if (response.status == 'success' && isStreaming) { - // Delete message from response to avoid sending it twice - delete response.message; - } - // End the stream if streaming - // - We're not listening for the response received event because we can't await the completion of events. + // Handle streaming responses if (streamer) { - await streamer.endStream(); + // Tool call handling + // - We need to keep the streamer around during tool calls so we're just letting them return as normal + // messages minus the message content. The text content is being streamed to the client in chunks. + // - When the tool call completes we'll call back into ActionPlanner and end up re-attaching to the + // streamer. This will result in us continuing to stream the response to the client. + if (Array.isArray(response.message?.action_calls)) { + // Ensure content is empty for tool calls + response.message!.content = '' as TContent; + } else { + if (response.status == 'success') { + // Delete message from response to avoid sending it twice + delete response.message; + } + + // End the stream and remove pointer from memory + // - We're not listening for the response received event because we can't await the completion of events. + await streamer.endStream(); + memory.deleteValue('temp.streamer'); + } } return response; diff --git a/js/samples/03.ai-concepts/c.actionMapping-lightBot/src/index.ts b/js/samples/03.ai-concepts/c.actionMapping-lightBot/src/index.ts index 7cf63894d..6f83f771c 100644 --- a/js/samples/03.ai-concepts/c.actionMapping-lightBot/src/index.ts +++ b/js/samples/03.ai-concepts/c.actionMapping-lightBot/src/index.ts @@ -96,7 +96,8 @@ const model = new OpenAIModel({ azureApiVersion: '2023-03-15-preview', // Request logging - logRequests: true + logRequests: true, + stream: true }); const prompts = new PromptManager({ @@ -131,13 +132,13 @@ app.ai.action('LightStatus', async (context: TurnContext, state: ApplicationTurn // Register action handlers app.ai.action('LightsOn', async (context: TurnContext, state: ApplicationTurnState) => { state.conversation.lightsOn = true; - await context.sendActivity(`[lights on]`); + console.log('[Turning lights on]'); return `the lights are now on`; }); app.ai.action('LightsOff', async (context: TurnContext, state: ApplicationTurnState) => { state.conversation.lightsOn = false; - await context.sendActivity(`[lights off]`); + console.log('[Turning lights off]'); return `the lights are now off`; }); @@ -146,7 +147,7 @@ interface PauseParameters { } app.ai.action('Pause', async (context: TurnContext, state: ApplicationTurnState, parameters: PauseParameters) => { - await context.sendActivity(`[pausing for ${parameters.time / 1000} seconds]`); + console.log(`[Pausing for ${parameters.time / 1000} seconds]`); await new Promise((resolve) => setTimeout(resolve, parameters.time)); return `done pausing`; }); From 1a8a0b458f5dabf44bb224814dbf72f5fa7db46e Mon Sep 17 00:00:00 2001 From: Corina <14900841+corinagum@users.noreply.github.com> Date: Mon, 9 Dec 2024 10:40:31 -0800 Subject: [PATCH 11/19] [JS] chore: Release 1.7.0 (#2222) ## Linked issues #minor Co-authored-by: Corina Gum <> --- js/.gitignore | 1 + js/packages/teams-ai/package.json | 2 +- .../01.getting-started/a.echoBot/package.json | 2 +- .../package.json | 2 +- .../b.adaptiveCards.typeAheadBot/package.json | 2 +- .../a.twentyQuestions/package.json | 2 +- .../b.AI-messageExtensions/package.json | 2 +- .../c.actionMapping-lightBot/package.json | 2 +- .../d.chainedActions-listBot/package.json | 2 +- .../e.customModel-LLAMA/package.json | 2 +- .../f.chatModeration/package.json | 2 +- .../04.ai-apps/a.teamsChefBot/package.json | 2 +- .../04.ai-apps/b.devOpsBot/package.json | 2 +- .../c.vision-cardGazer/package.json | 2 +- .../d.assistants-mathBot/package.json | 2 +- .../devTools/teamsapptester | 1 - .../e.assistants-orderBot/package.json | 2 +- js/samples/04.ai-apps/f.whoBot/package.json | 2 +- .../g.datasource-azureAISearch/package.json | 2 +- .../h.datasource-azureOpenAI/package.json | 2 +- .../i.teamsChefBot-streaming/package.json | 2 +- .../a.oauth-adaptiveCard/package.json | 2 +- .../b.oauth-bot/package.json | 2 +- .../c.oauth-messageExtension/package.json | 2 +- .../d.teamsSSO-bot/package.json | 2 +- .../e.teamsSSO-messageExtension/package.json | 2 +- js/yarn.lock | 273 +++++++++--------- 27 files changed, 166 insertions(+), 157 deletions(-) delete mode 120000 js/samples/04.ai-apps/e.assistants-orderBot/devTools/teamsapptester diff --git a/js/.gitignore b/js/.gitignore index c3689103b..54de3dbfc 100644 --- a/js/.gitignore +++ b/js/.gitignore @@ -124,6 +124,7 @@ package-lock.json env/.env.*.user env/.env.local env/.env.staging +devtools // Ignore codepilot .codepilot/ \ No newline at end of file diff --git a/js/packages/teams-ai/package.json b/js/packages/teams-ai/package.json index dd87a6da7..5762a3dae 100644 --- a/js/packages/teams-ai/package.json +++ b/js/packages/teams-ai/package.json @@ -2,7 +2,7 @@ "name": "@microsoft/teams-ai", "author": "Microsoft Corp.", "description": "SDK focused on building AI based applications for Microsoft Teams.", - "version": "1.6.1", + "version": "1.7.0", "license": "MIT", "keywords": [ "botbuilder", diff --git a/js/samples/01.getting-started/a.echoBot/package.json b/js/samples/01.getting-started/a.echoBot/package.json index 51fcbc485..c56f8a3df 100644 --- a/js/samples/01.getting-started/a.echoBot/package.json +++ b/js/samples/01.getting-started/a.echoBot/package.json @@ -22,7 +22,7 @@ "url": "https://github.com/microsoft/teams-ai/" }, "dependencies": { - "@microsoft/teams-ai": "~1.6.1", + "@microsoft/teams-ai": "~1.7.0", "botbuilder": "^4.23.1", "dotenv": "^16.4.5", "openai": "4.68.2", diff --git a/js/samples/02.teams-features/a.messageExtensions.searchCommand/package.json b/js/samples/02.teams-features/a.messageExtensions.searchCommand/package.json index ab4f73dfb..084f972bf 100644 --- a/js/samples/02.teams-features/a.messageExtensions.searchCommand/package.json +++ b/js/samples/02.teams-features/a.messageExtensions.searchCommand/package.json @@ -19,7 +19,7 @@ "url": "https://github.com/microsoft/teams-ai" }, "dependencies": { - "@microsoft/teams-ai": "~1.6.1", + "@microsoft/teams-ai": "~1.7.0", "axios": "^1.7.5", "botbuilder": "^4.23.1", "dotenv": "^16.4.5", diff --git a/js/samples/02.teams-features/b.adaptiveCards.typeAheadBot/package.json b/js/samples/02.teams-features/b.adaptiveCards.typeAheadBot/package.json index 249907743..004296494 100644 --- a/js/samples/02.teams-features/b.adaptiveCards.typeAheadBot/package.json +++ b/js/samples/02.teams-features/b.adaptiveCards.typeAheadBot/package.json @@ -22,7 +22,7 @@ "url": "https://github.com/microsoft/teams-ai" }, "dependencies": { - "@microsoft/teams-ai": "~1.6.1", + "@microsoft/teams-ai": "~1.7.0", "axios": "^1.7.5", "botbuilder": "^4.23.1", "dotenv": "^16.4.5", diff --git a/js/samples/03.ai-concepts/a.twentyQuestions/package.json b/js/samples/03.ai-concepts/a.twentyQuestions/package.json index d89fade1f..de41ddaf8 100644 --- a/js/samples/03.ai-concepts/a.twentyQuestions/package.json +++ b/js/samples/03.ai-concepts/a.twentyQuestions/package.json @@ -21,7 +21,7 @@ "url": "https://github.com/microsoft/teams-ai" }, "dependencies": { - "@microsoft/teams-ai": "~1.6.1", + "@microsoft/teams-ai": "~1.7.0", "botbuilder": "^4.23.1", "dotenv": "^16.4.5", "openai": "4.68.2", diff --git a/js/samples/03.ai-concepts/b.AI-messageExtensions/package.json b/js/samples/03.ai-concepts/b.AI-messageExtensions/package.json index 0599e69fc..60cd5f00f 100644 --- a/js/samples/03.ai-concepts/b.AI-messageExtensions/package.json +++ b/js/samples/03.ai-concepts/b.AI-messageExtensions/package.json @@ -20,7 +20,7 @@ }, "dependencies": { "botbuilder": "^4.23.1", - "@microsoft/teams-ai": "~1.6.1", + "@microsoft/teams-ai": "~1.7.0", "dotenv": "^16.4.5", "openai": "4.68.2", "replace": "~1.2.0", diff --git a/js/samples/03.ai-concepts/c.actionMapping-lightBot/package.json b/js/samples/03.ai-concepts/c.actionMapping-lightBot/package.json index e5d95a1f0..e87eb4514 100644 --- a/js/samples/03.ai-concepts/c.actionMapping-lightBot/package.json +++ b/js/samples/03.ai-concepts/c.actionMapping-lightBot/package.json @@ -21,7 +21,7 @@ "url": "https://github.com/microsoft/teams-ai" }, "dependencies": { - "@microsoft/teams-ai": "~1.6.1", + "@microsoft/teams-ai": "~1.7.0", "botbuilder": "^4.23.1", "dotenv": "^16.4.5", "openai": "4.68.2", diff --git a/js/samples/03.ai-concepts/d.chainedActions-listBot/package.json b/js/samples/03.ai-concepts/d.chainedActions-listBot/package.json index b27129034..1b40a97ac 100644 --- a/js/samples/03.ai-concepts/d.chainedActions-listBot/package.json +++ b/js/samples/03.ai-concepts/d.chainedActions-listBot/package.json @@ -21,7 +21,7 @@ "url": "https://github.com/microsoft/teams-ai" }, "dependencies": { - "@microsoft/teams-ai": "~1.6.1", + "@microsoft/teams-ai": "~1.7.0", "botbuilder": "^4.23.1", "dotenv": "^16.4.5", "openai": "4.68.2", diff --git a/js/samples/03.ai-concepts/e.customModel-LLAMA/package.json b/js/samples/03.ai-concepts/e.customModel-LLAMA/package.json index 48e3a0b6d..69e3dd178 100644 --- a/js/samples/03.ai-concepts/e.customModel-LLAMA/package.json +++ b/js/samples/03.ai-concepts/e.customModel-LLAMA/package.json @@ -23,7 +23,7 @@ }, "dependencies": { "botbuilder": "^4.23.1", - "@microsoft/teams-ai": "~1.6.1", + "@microsoft/teams-ai": "~1.7.0", "openai": "4.68.2", "dotenv": "^16.4.1", "replace": "~1.2.0", diff --git a/js/samples/03.ai-concepts/f.chatModeration/package.json b/js/samples/03.ai-concepts/f.chatModeration/package.json index c98f4fa0b..3d8c7e6b2 100644 --- a/js/samples/03.ai-concepts/f.chatModeration/package.json +++ b/js/samples/03.ai-concepts/f.chatModeration/package.json @@ -19,7 +19,7 @@ "url": "https://github.com/microsoft/teams-ai" }, "dependencies": { - "@microsoft/teams-ai": "~1.6.1", + "@microsoft/teams-ai": "~1.7.0", "axios": "^1.7.5", "botbuilder": "^4.23.1", "dotenv": "^16.4.5", diff --git a/js/samples/04.ai-apps/a.teamsChefBot/package.json b/js/samples/04.ai-apps/a.teamsChefBot/package.json index 3c6b1fb86..ea600adbd 100644 --- a/js/samples/04.ai-apps/a.teamsChefBot/package.json +++ b/js/samples/04.ai-apps/a.teamsChefBot/package.json @@ -22,7 +22,7 @@ "url": "https://github.com/microsoft/teams-ai" }, "dependencies": { - "@microsoft/teams-ai": "~1.6.1", + "@microsoft/teams-ai": "~1.7.0", "@microsoft/teams-js": "^2.31.0", "botbuilder": "^4.23.1", "dotenv": "^16.4.5", diff --git a/js/samples/04.ai-apps/b.devOpsBot/package.json b/js/samples/04.ai-apps/b.devOpsBot/package.json index 63f790a78..99fdad521 100644 --- a/js/samples/04.ai-apps/b.devOpsBot/package.json +++ b/js/samples/04.ai-apps/b.devOpsBot/package.json @@ -20,7 +20,7 @@ }, "dependencies": { "botbuilder": "^4.23.1", - "@microsoft/teams-ai": "~1.6.1", + "@microsoft/teams-ai": "~1.7.0", "dotenv": "^16.4.5", "replace": "~1.2.0", "restify": "~11.1.0", diff --git a/js/samples/04.ai-apps/c.vision-cardGazer/package.json b/js/samples/04.ai-apps/c.vision-cardGazer/package.json index 4a9b0e85d..e2dc668c3 100644 --- a/js/samples/04.ai-apps/c.vision-cardGazer/package.json +++ b/js/samples/04.ai-apps/c.vision-cardGazer/package.json @@ -20,7 +20,7 @@ "url": "https://github.com/microsoft/teams-ai" }, "dependencies": { - "@microsoft/teams-ai": "~1.6.1", + "@microsoft/teams-ai": "~1.7.0", "botbuilder": "^4.23.1", "dotenv": "^16.4.5", "openai": "4.68.2", diff --git a/js/samples/04.ai-apps/d.assistants-mathBot/package.json b/js/samples/04.ai-apps/d.assistants-mathBot/package.json index e94a18fc0..ed4c9d4e4 100644 --- a/js/samples/04.ai-apps/d.assistants-mathBot/package.json +++ b/js/samples/04.ai-apps/d.assistants-mathBot/package.json @@ -19,7 +19,7 @@ "url": "https://github.com/microsoft/teams-ai" }, "dependencies": { - "@microsoft/teams-ai": "~1.6.1", + "@microsoft/teams-ai": "~1.7.0", "axios": "^1.7.5", "botbuilder": "^4.23.1", "dotenv": "^16.4.5", diff --git a/js/samples/04.ai-apps/e.assistants-orderBot/devTools/teamsapptester b/js/samples/04.ai-apps/e.assistants-orderBot/devTools/teamsapptester deleted file mode 120000 index e6800eee4..000000000 --- a/js/samples/04.ai-apps/e.assistants-orderBot/devTools/teamsapptester +++ /dev/null @@ -1 +0,0 @@ -/Users/corina/.fx/bin/testTool/0.2.4 \ No newline at end of file diff --git a/js/samples/04.ai-apps/e.assistants-orderBot/package.json b/js/samples/04.ai-apps/e.assistants-orderBot/package.json index 719b24b44..b8a0888ec 100644 --- a/js/samples/04.ai-apps/e.assistants-orderBot/package.json +++ b/js/samples/04.ai-apps/e.assistants-orderBot/package.json @@ -21,7 +21,7 @@ "url": "https://github.com/microsoft/teams-ai" }, "dependencies": { - "@microsoft/teams-ai": "~1.6.1", + "@microsoft/teams-ai": "~1.7.0", "axios": "^1.7.5", "botbuilder": "^4.23.1", "dotenv": "^16.4.5", diff --git a/js/samples/04.ai-apps/f.whoBot/package.json b/js/samples/04.ai-apps/f.whoBot/package.json index 1393bb60c..2fcbf4fee 100644 --- a/js/samples/04.ai-apps/f.whoBot/package.json +++ b/js/samples/04.ai-apps/f.whoBot/package.json @@ -19,7 +19,7 @@ "url": "https://github.com/microsoft/teams-ai" }, "dependencies": { - "@microsoft/teams-ai": "~1.6.1", + "@microsoft/teams-ai": "~1.7.0", "botbuilder": "^4.23.1", "botbuilder-dialogs": "^4.23.1", "dotenv": "^16.4.5", diff --git a/js/samples/04.ai-apps/g.datasource-azureAISearch/package.json b/js/samples/04.ai-apps/g.datasource-azureAISearch/package.json index 51d63ec2c..a785f1c4d 100644 --- a/js/samples/04.ai-apps/g.datasource-azureAISearch/package.json +++ b/js/samples/04.ai-apps/g.datasource-azureAISearch/package.json @@ -28,7 +28,7 @@ }, "dependencies": { "@azure/search-documents": "12.1.0", - "@microsoft/teams-ai": "~1.6.1", + "@microsoft/teams-ai": "~1.7.0", "botbuilder": "^4.23.1", "debug": "^4.3.7", "dotenv": "^16.4.1", diff --git a/js/samples/04.ai-apps/h.datasource-azureOpenAI/package.json b/js/samples/04.ai-apps/h.datasource-azureOpenAI/package.json index e1cedd703..0665a95ae 100644 --- a/js/samples/04.ai-apps/h.datasource-azureOpenAI/package.json +++ b/js/samples/04.ai-apps/h.datasource-azureOpenAI/package.json @@ -27,7 +27,7 @@ "dependencies": { "@azure/identity": "^4.5.0", "@azure/search-documents": "12.1.0", - "@microsoft/teams-ai": "~1.6.1", + "@microsoft/teams-ai": "~1.7.0", "botbuilder": "^4.23.1", "dotenv": "^16.4.1", "openai": "4.68.2", diff --git a/js/samples/04.ai-apps/i.teamsChefBot-streaming/package.json b/js/samples/04.ai-apps/i.teamsChefBot-streaming/package.json index 27ba685c4..c05f96742 100644 --- a/js/samples/04.ai-apps/i.teamsChefBot-streaming/package.json +++ b/js/samples/04.ai-apps/i.teamsChefBot-streaming/package.json @@ -22,7 +22,7 @@ "url": "https://github.com/microsoft/teams-ai" }, "dependencies": { - "@microsoft/teams-ai": "~1.6.1", + "@microsoft/teams-ai": "~1.7.0", "@microsoft/teams-js": "^2.31.0", "botbuilder": "^4.23.1", "dotenv": "^16.4.5", diff --git a/js/samples/05.authentication/a.oauth-adaptiveCard/package.json b/js/samples/05.authentication/a.oauth-adaptiveCard/package.json index fe3555f4a..e8d6e49aa 100644 --- a/js/samples/05.authentication/a.oauth-adaptiveCard/package.json +++ b/js/samples/05.authentication/a.oauth-adaptiveCard/package.json @@ -20,7 +20,7 @@ }, "dependencies": { "@microsoft/microsoft-graph-client": "^3.0.7", - "@microsoft/teams-ai": "~1.6.1", + "@microsoft/teams-ai": "~1.7.0", "botbuilder": "^4.23.1", "dotenv": "^16.4.5", "openai": "4.68.2", diff --git a/js/samples/05.authentication/b.oauth-bot/package.json b/js/samples/05.authentication/b.oauth-bot/package.json index fc5a97d5f..c62d89b3b 100644 --- a/js/samples/05.authentication/b.oauth-bot/package.json +++ b/js/samples/05.authentication/b.oauth-bot/package.json @@ -19,7 +19,7 @@ "url": "https://github.com/microsoft/teams-ai" }, "dependencies": { - "@microsoft/teams-ai": "~1.6.1", + "@microsoft/teams-ai": "~1.7.0", "botbuilder": "^4.23.1", "botbuilder-dialogs": "^4.23.1", "dotenv": "^16.4.5", diff --git a/js/samples/05.authentication/c.oauth-messageExtension/package.json b/js/samples/05.authentication/c.oauth-messageExtension/package.json index 4bf51c68c..5d3e0877a 100644 --- a/js/samples/05.authentication/c.oauth-messageExtension/package.json +++ b/js/samples/05.authentication/c.oauth-messageExtension/package.json @@ -20,7 +20,7 @@ }, "dependencies": { "@microsoft/microsoft-graph-client": "^3.0.7", - "@microsoft/teams-ai": "~1.6.1", + "@microsoft/teams-ai": "~1.7.0", "botbuilder": "^4.23.1", "dotenv": "^16.4.5", "isomorphic-fetch": "^3.0.0", diff --git a/js/samples/05.authentication/d.teamsSSO-bot/package.json b/js/samples/05.authentication/d.teamsSSO-bot/package.json index 076668c01..9e6f05bdd 100644 --- a/js/samples/05.authentication/d.teamsSSO-bot/package.json +++ b/js/samples/05.authentication/d.teamsSSO-bot/package.json @@ -19,7 +19,7 @@ "url": "https://github.com/microsoft/teams-ai" }, "dependencies": { - "@microsoft/teams-ai": "~1.6.1", + "@microsoft/teams-ai": "~1.7.0", "botbuilder": "^4.23.1", "botbuilder-dialogs": "^4.23.1", "dotenv": "^16.4.5", diff --git a/js/samples/05.authentication/e.teamsSSO-messageExtension/package.json b/js/samples/05.authentication/e.teamsSSO-messageExtension/package.json index e90f21381..3d8f165a6 100644 --- a/js/samples/05.authentication/e.teamsSSO-messageExtension/package.json +++ b/js/samples/05.authentication/e.teamsSSO-messageExtension/package.json @@ -20,7 +20,7 @@ }, "dependencies": { "@microsoft/microsoft-graph-client": "^3.0.7", - "@microsoft/teams-ai": "~1.6.1", + "@microsoft/teams-ai": "~1.7.0", "botbuilder": "^4.23.1", "botbuilder-azure-blobs": "^4.23.1", "dotenv": "^16.4.5", diff --git a/js/yarn.lock b/js/yarn.lock index 3163d7b4c..52227566b 100644 --- a/js/yarn.lock +++ b/js/yarn.lock @@ -269,7 +269,7 @@ events "^3.0.0" tslib "^2.2.0" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.25.9", "@babel/code-frame@^7.26.0": +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.25.9", "@babel/code-frame@^7.26.0", "@babel/code-frame@^7.26.2": version "7.26.2" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.26.2.tgz#4b5fab97d33338eff916235055f0ebc21e573a85" integrity sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ== @@ -279,9 +279,9 @@ picocolors "^1.0.0" "@babel/compat-data@^7.25.9": - version "7.26.2" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.26.2.tgz#278b6b13664557de95b8f35b90d96785850bb56e" - integrity sha512-Z0WgzSEa+aUcdiJuCIqgujCshpMWgUpgOxXotrYPSA53hA3qopNaqcJpyr0hVb1FeWdnqFA35/fUtXgBK8srQg== + version "7.26.3" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.26.3.tgz#99488264a56b2aded63983abd6a417f03b92ed02" + integrity sha512-nHIxvKPniQXpmQLb0vhY3VaFb3S0YrTAwpOWJZh1wn3oJPjJk9Asva204PsBdmAE8vpzfHudT8DB0scYvy9q0g== "@babel/core@^7.7.5": version "7.26.0" @@ -304,13 +304,13 @@ json5 "^2.2.3" semver "^6.3.1" -"@babel/generator@^7.25.9", "@babel/generator@^7.26.0": - version "7.26.2" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.26.2.tgz#87b75813bec87916210e5e01939a4c823d6bb74f" - integrity sha512-zevQbhbau95nkoxSq3f/DC/SC+EEOUZd3DYqfSkMhY2/wfSeaHV1Ew4vk8e+x8lja31IbyuUa2uQ3JONqKbysw== +"@babel/generator@^7.26.0", "@babel/generator@^7.26.3": + version "7.26.3" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.26.3.tgz#ab8d4360544a425c90c248df7059881f4b2ce019" + integrity sha512-6FF/urZvD0sTeO7k6/B15pMLC4CHUv1426lzr3N01aHJTl046uCAh9LXW/fzeXXjPNCJ6iABW5XaWOsIZB93aQ== dependencies: - "@babel/parser" "^7.26.2" - "@babel/types" "^7.26.0" + "@babel/parser" "^7.26.3" + "@babel/types" "^7.26.3" "@jridgewell/gen-mapping" "^0.3.5" "@jridgewell/trace-mapping" "^0.3.25" jsesc "^3.0.2" @@ -366,12 +366,12 @@ "@babel/template" "^7.25.9" "@babel/types" "^7.26.0" -"@babel/parser@^7.23.0", "@babel/parser@^7.25.3", "@babel/parser@^7.25.9", "@babel/parser@^7.26.0", "@babel/parser@^7.26.2": - version "7.26.2" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.26.2.tgz#fd7b6f487cfea09889557ef5d4eeb9ff9a5abd11" - integrity sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ== +"@babel/parser@^7.23.0", "@babel/parser@^7.25.3", "@babel/parser@^7.25.9", "@babel/parser@^7.26.0", "@babel/parser@^7.26.3": + version "7.26.3" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.26.3.tgz#8c51c5db6ddf08134af1ddbacf16aaab48bac234" + integrity sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA== dependencies: - "@babel/types" "^7.26.0" + "@babel/types" "^7.26.3" "@babel/runtime@^7.12.5": version "7.26.0" @@ -390,22 +390,22 @@ "@babel/types" "^7.25.9" "@babel/traverse@^7.23.2", "@babel/traverse@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.25.9.tgz#a50f8fe49e7f69f53de5bea7e413cd35c5e13c84" - integrity sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw== + version "7.26.4" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.26.4.tgz#ac3a2a84b908dde6d463c3bfa2c5fdc1653574bd" + integrity sha512-fH+b7Y4p3yqvApJALCPJcwb0/XaOSgtK4pzV6WVjPR5GLFQBRI7pfoX2V2iM48NXvX07NUxxm1Vw98YjqTcU5w== dependencies: - "@babel/code-frame" "^7.25.9" - "@babel/generator" "^7.25.9" - "@babel/parser" "^7.25.9" + "@babel/code-frame" "^7.26.2" + "@babel/generator" "^7.26.3" + "@babel/parser" "^7.26.3" "@babel/template" "^7.25.9" - "@babel/types" "^7.25.9" + "@babel/types" "^7.26.3" debug "^4.3.1" globals "^11.1.0" -"@babel/types@^7.25.9", "@babel/types@^7.26.0": - version "7.26.0" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.26.0.tgz#deabd08d6b753bc8e0f198f8709fb575e31774ff" - integrity sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA== +"@babel/types@^7.25.9", "@babel/types@^7.26.0", "@babel/types@^7.26.3": + version "7.26.3" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.26.3.tgz#37e79830f04c2b5687acc77db97fbc75fb81f3c0" + integrity sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA== dependencies: "@babel/helper-string-parser" "^7.25.9" "@babel/helper-validator-identifier" "^7.25.9" @@ -783,12 +783,12 @@ resolved "https://registry.yarnpkg.com/@opentelemetry/api/-/api-1.9.0.tgz#d03eba68273dc0f7509e2a3d5cba21eae10379fe" integrity sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg== -"@opentelemetry/core@1.28.0", "@opentelemetry/core@^1.19.0", "@opentelemetry/core@^1.26.0": - version "1.28.0" - resolved "https://registry.yarnpkg.com/@opentelemetry/core/-/core-1.28.0.tgz#e97290a3e36c59480ffb2287fe2713c66749274c" - integrity sha512-ZLwRMV+fNDpVmF2WYUdBHlq0eOWtEaUJSusrzjGnBt7iSRvfjFE3RXYUZJrqou/wIDWV0DwQ5KIfYe9WXg9Xqw== +"@opentelemetry/core@1.29.0", "@opentelemetry/core@^1.19.0", "@opentelemetry/core@^1.26.0": + version "1.29.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/core/-/core-1.29.0.tgz#a9397dfd9a8b37b2435b5e44be16d39ec1c82bd9" + integrity sha512-gmT7vAreXl0DTHD2rVZcw3+l2g84+5XiHIqdBUxXbExymPCvSsGOpiwMmn8nkiJur28STV31wnhIDrzWDPzjfA== dependencies: - "@opentelemetry/semantic-conventions" "1.27.0" + "@opentelemetry/semantic-conventions" "1.28.0" "@opentelemetry/instrumentation@^0.53.0": version "0.53.0" @@ -802,29 +802,24 @@ semver "^7.5.2" shimmer "^1.2.1" -"@opentelemetry/resources@1.28.0": - version "1.28.0" - resolved "https://registry.yarnpkg.com/@opentelemetry/resources/-/resources-1.28.0.tgz#c8c27ae7559c817f9d117f1bf96d76f893fb29f5" - integrity sha512-cIyXSVJjGeTICENN40YSvLDAq4Y2502hGK3iN7tfdynQLKWb3XWZQEkPc+eSx47kiy11YeFAlYkEfXwR1w8kfw== +"@opentelemetry/resources@1.29.0": + version "1.29.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/resources/-/resources-1.29.0.tgz#d170f39b2ac93d61b53d13dfcd96795181bdc372" + integrity sha512-s7mLXuHZE7RQr1wwweGcaRp3Q4UJJ0wazeGlc/N5/XSe6UyXfsh1UQGMADYeg7YwD+cEdMtU1yJAUXdnFzYzyQ== dependencies: - "@opentelemetry/core" "1.28.0" - "@opentelemetry/semantic-conventions" "1.27.0" + "@opentelemetry/core" "1.29.0" + "@opentelemetry/semantic-conventions" "1.28.0" "@opentelemetry/sdk-trace-base@^1.19.0": - version "1.28.0" - resolved "https://registry.yarnpkg.com/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.28.0.tgz#6195dc8cd78bd74394cf54c67c5cbd8d1528516c" - integrity sha512-ceUVWuCpIao7Y5xE02Xs3nQi0tOGmMea17ecBdwtCvdo9ekmO+ijc9RFDgfifMl7XCBf41zne/1POM3LqSTZDA== + version "1.29.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.29.0.tgz#f48d95dae0e58e601d0596bd2e482122d2688fb8" + integrity sha512-hEOpAYLKXF3wGJpXOtWsxEtqBgde0SCv+w+jvr3/UusR4ll3QrENEGnSl1WDCyRrpqOQ5NCNOvZch9UFVa7MnQ== dependencies: - "@opentelemetry/core" "1.28.0" - "@opentelemetry/resources" "1.28.0" - "@opentelemetry/semantic-conventions" "1.27.0" - -"@opentelemetry/semantic-conventions@1.27.0": - version "1.27.0" - resolved "https://registry.yarnpkg.com/@opentelemetry/semantic-conventions/-/semantic-conventions-1.27.0.tgz#1a857dcc95a5ab30122e04417148211e6f945e6c" - integrity sha512-sAay1RrB+ONOem0OZanAR1ZI/k7yDpnOQSQmTMuGImUQb2y8EbSaCJ94FQluM74xoU03vlb2d2U90hZluL6nQg== + "@opentelemetry/core" "1.29.0" + "@opentelemetry/resources" "1.29.0" + "@opentelemetry/semantic-conventions" "1.28.0" -"@opentelemetry/semantic-conventions@^1.19.0": +"@opentelemetry/semantic-conventions@1.28.0", "@opentelemetry/semantic-conventions@^1.19.0": version "1.28.0" resolved "https://registry.yarnpkg.com/@opentelemetry/semantic-conventions/-/semantic-conventions-1.28.0.tgz#337fb2bca0453d0726696e745f50064411f646d6" integrity sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA== @@ -1321,9 +1316,9 @@ eslint-visitor-keys "^3.4.1" "@ungap/structured-clone@^1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" - integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== + version "1.2.1" + resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.1.tgz#28fa185f67daaf7b7a1a8c1d445132c5d979f8bd" + integrity sha512-fEzPV3hSkSMltkw152tJKNARhOupqbH96MZWyRjNaYZOMIzbrTeQDG+MTc6Mr2pgzFQzFxAfmhGDNP5QK++2ZA== "@vue/compiler-core@3.5.13": version "3.5.13" @@ -1469,12 +1464,10 @@ adaptivecards@1.2.3: resolved "https://registry.yarnpkg.com/adaptivecards/-/adaptivecards-1.2.3.tgz#b69319c75bd214a5ec48119240c98449e7df685a" integrity sha512-amQ5OSW3OpIkrxVKLjxVBPk/T49yuOtnqs1z5ZPfZr0+OpTovzmiHbyoAGDIsu5SNYHwOZFp/3LGOnRaALFa/g== -agent-base@^7.0.2, agent-base@^7.1.0: - version "7.1.1" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-7.1.1.tgz#bdbded7dfb096b751a2a087eeeb9664725b2e317" - integrity sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA== - dependencies: - debug "^4.3.4" +agent-base@^7.1.0, agent-base@^7.1.2: + version "7.1.3" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-7.1.3.tgz#29435eb821bc4194633a5b89e5bc4703bafc25a1" + integrity sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw== agentkeepalive@^4.2.1: version "4.5.0" @@ -1908,9 +1901,9 @@ axios@^0.26.0: follow-redirects "^1.14.8" axios@^1.3.4, axios@^1.7.5, axios@^1.7.7: - version "1.7.8" - resolved "https://registry.yarnpkg.com/axios/-/axios-1.7.8.tgz#1997b1496b394c21953e68c14aaa51b7b5de3d6e" - integrity sha512-Uu0wb7KNqK2t5K+YQyVCLM76prD5sRFjKHbJYCP1J7JFGEQ6nN7HWn9+04LAeiJ3ji54lgS/gZCH1oxyrf1SPw== + version "1.7.9" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.7.9.tgz#d7d071380c132a24accda1b2cfc1535b79ec650a" + integrity sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw== dependencies: follow-redirects "^1.15.6" form-data "^4.0.0" @@ -2378,16 +2371,23 @@ caching-transform@^4.0.0: package-hash "^4.0.0" write-file-atomic "^3.0.0" -call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" - integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== +call-bind-apply-helpers@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz#32e5892e6361b29b0b545ba6f7763378daca2840" + integrity sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g== dependencies: - es-define-property "^1.0.0" es-errors "^1.3.0" function-bind "^1.1.2" + +call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7, call-bind@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.8.tgz#0736a9660f537e3388826f440d5ec45f744eaa4c" + integrity sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww== + dependencies: + call-bind-apply-helpers "^1.0.0" + es-define-property "^1.0.0" get-intrinsic "^1.2.4" - set-function-length "^1.2.1" + set-function-length "^1.2.2" callsite@^1.0.0: version "1.0.0" @@ -2415,9 +2415,9 @@ camelcase@^6.0.0, camelcase@^6.3.0: integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== caniuse-lite@^1.0.30001669: - version "1.0.30001686" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001686.tgz#0e04b8d90de8753188e93c9989d56cb19d902670" - integrity sha512-Y7deg0Aergpa24M3qLC5xjNklnKnhsmSyR/V89dLZ1n0ucJIFNs7PgR2Yfa/Zf6W79SbBicgtGxZr2juHkEUIA== + version "1.0.30001687" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001687.tgz#d0ac634d043648498eedf7a3932836beba90ebae" + integrity sha512-0S/FDhf4ZiqrTUiQ39dKeUjYRjkv7lOZU1Dgif2rIqrTzX/1wV2hfKu9TOm1IHkdSijfLswxTFzl/cvir+SLSQ== capture-stack-trace@^1.0.0: version "1.0.2" @@ -3067,9 +3067,9 @@ debug@2.6.9, debug@^2.2.0, debug@^2.3.3: ms "2.0.0" debug@4, debug@^4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4, debug@^4.3.5, debug@^4.3.7: - version "4.3.7" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.7.tgz#87945b4151a011d76d95a198d7111c865c360a52" - integrity sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ== + version "4.4.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.0.tgz#2b3f2aea2ffeb776477460267377dc8710faba8a" + integrity sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA== dependencies: ms "^2.1.3" @@ -3362,6 +3362,15 @@ dtrace-provider@~0.8: dependencies: nan "^2.14.0" +dunder-proto@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/dunder-proto/-/dunder-proto-1.0.0.tgz#c2fce098b3c8f8899554905f4377b6d85dabaa80" + integrity sha512-9+Sj30DIu+4KvHqMfLUGLFYL2PkURSYMVXJyXe92nFRvlYq5hBjLEhblKB+vkd/WVlUYMWigiY07T91Fkk0+4A== + dependencies: + call-bind-apply-helpers "^1.0.0" + es-errors "^1.3.0" + gopd "^1.2.0" + duplexer2@0.0.2: version "0.0.2" resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.0.2.tgz#c614dcf67e2fb14995a91711e5a617e8a60a31db" @@ -3415,9 +3424,9 @@ ee-first@1.1.1: integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== electron-to-chromium@^1.5.41: - version "1.5.68" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.68.tgz#4f46be4d465ef00e2100d5557b66f4af70e3ce6c" - integrity sha512-FgMdJlma0OzUYlbrtZ4AeXjKxKPk6KT8WOP8BjcqxWtlg8qyJQjRzPJzUtUn5GBg1oQ26hFs7HOOHJMYiJRnvQ== + version "1.5.71" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.71.tgz#d8b5dba1e55b320f2f4e9b1ca80738f53fcfec2b" + integrity sha512-dB68l59BI75W1BUGVTAEJy45CEVuEGy9qPVVQ8pnHyHMn36PLPPoE1mjLH+lo9rKulO3HC2OhbACI/8tCqJBcA== elliptic@^6.5.3, elliptic@^6.5.5: version "6.6.1" @@ -3551,12 +3560,10 @@ es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23 unbox-primitive "^1.0.2" which-typed-array "^1.1.15" -es-define-property@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845" - integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ== - dependencies: - get-intrinsic "^1.2.4" +es-define-property@^1.0.0, es-define-property@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.1.tgz#983eb2f9a6724e9303f61addf011c72e09e0b0fa" + integrity sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g== es-errors@^1.2.1, es-errors@^1.3.0: version "1.3.0" @@ -4047,9 +4054,9 @@ expand-tilde@^2.0.0, expand-tilde@^2.0.2: homedir-polyfill "^1.0.1" express@^4.21.1: - version "4.21.1" - resolved "https://registry.yarnpkg.com/express/-/express-4.21.1.tgz#9dae5dda832f16b4eec941a4e44aa89ec481b281" - integrity sha512-YSFlK1Ee0/GC8QaO91tHcDxJiE/X4FbpAyQWkxAvG6AXCuR65YzK8ua6D9hvi/TzUfZMpc+BwuM1IPw8fmQBiQ== + version "4.21.2" + resolved "https://registry.yarnpkg.com/express/-/express-4.21.2.tgz#cf250e48362174ead6cea4a566abef0162c1ec32" + integrity sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA== dependencies: accepts "~1.3.8" array-flatten "1.1.1" @@ -4070,7 +4077,7 @@ express@^4.21.1: methods "~1.1.2" on-finished "2.4.1" parseurl "~1.3.3" - path-to-regexp "0.1.10" + path-to-regexp "0.1.12" proxy-addr "~2.0.7" qs "6.13.0" range-parser "~1.2.1" @@ -4546,15 +4553,18 @@ get-func-name@^2.0.1, get-func-name@^2.0.2: integrity sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ== get-intrinsic@^1.2.1, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" - integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== + version "1.2.5" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.5.tgz#dfe7dd1b30761b464fe51bf4bb00ac7c37b681e7" + integrity sha512-Y4+pKa7XeRUPWFNvOOYHkRYrfzW07oraURSvjDmRVOJ748OrVmeXtpE4+GCEHncjCjkTxPNRt8kEbxDhsn6VTg== dependencies: + call-bind-apply-helpers "^1.0.0" + dunder-proto "^1.0.0" + es-define-property "^1.0.1" es-errors "^1.3.0" function-bind "^1.1.2" - has-proto "^1.0.1" - has-symbols "^1.0.3" - hasown "^2.0.0" + gopd "^1.2.0" + has-symbols "^1.1.0" + hasown "^2.0.2" get-package-type@^0.1.0: version "0.1.0" @@ -4717,12 +4727,10 @@ globby@^11.1.0: merge2 "^1.4.1" slash "^3.0.0" -gopd@^1.0.1, gopd@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.1.0.tgz#df8f0839c2d48caefc32a025a49294d39606c912" - integrity sha512-FQoVQnqcdk4hVM4JN1eromaun4iuS34oStkdlLENLdpULsuQcTyXj8w7ayhuUfPwEYZ1ZOooOTT6fdA9Vmx/RA== - dependencies: - get-intrinsic "^1.2.4" +gopd@^1.0.1, gopd@^1.1.0, gopd@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.2.0.tgz#89f56b8217bdbc8802bd299df6d7f1081d7e51a1" + integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg== got@^6.7.1: version "6.7.1" @@ -4747,9 +4755,9 @@ gpt-3-encoder@1.1.4: integrity sha512-fSQRePV+HUAhCn7+7HL7lNIXNm6eaFWFbNLOOGtmSJ0qJycyQvj60OvRlH7mee8xAMjBDNRdMXlMwjAbMTDjkg== gpt-tokenizer@^2.6.2: - version "2.7.0" - resolved "https://registry.yarnpkg.com/gpt-tokenizer/-/gpt-tokenizer-2.7.0.tgz#30cb445dd3102ca921c446db300f97a4a9d8a577" - integrity sha512-QjxaGgCZgKp8ecZzy7AmrCbYs+DD+y7GWSRwbe2ZiHPBs1EaK8xUIrt8irnmkAQcNMflpD27tk5yF4m9ig3wgw== + version "2.8.1" + resolved "https://registry.yarnpkg.com/gpt-tokenizer/-/gpt-tokenizer-2.8.1.tgz#505d5d05ed8db9871ad6f50adcbb87111654134c" + integrity sha512-8+a9ojzqfgiF3TK4oivGYjlycD8g5igLt8NQw3ndOIgLVKSGJDhUDNAfYSbtyyuTkha3R/R9F8XrwC7/B5TKfQ== graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0: version "4.2.11" @@ -4813,14 +4821,14 @@ has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2: dependencies: es-define-property "^1.0.0" -has-proto@^1.0.1, has-proto@^1.0.3: - version "1.1.0" - resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.1.0.tgz#deb10494cbbe8809bce168a3b961f42969f5ed43" - integrity sha512-QLdzI9IIO1Jg7f9GT1gXpPpXArAn6cS31R1eEZqz08Gc+uQ8/XiqHWt17Fiw+2p6oTTIq5GXEpQkAlA88YRl/Q== +has-proto@^1.0.3: + version "1.2.0" + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.2.0.tgz#5de5a6eabd95fdffd9818b43055e8065e39fe9d5" + integrity sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ== dependencies: - call-bind "^1.0.7" + dunder-proto "^1.0.0" -has-symbols@^1.0.3: +has-symbols@^1.0.3, has-symbols@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.1.0.tgz#fc9c6a783a084951d0b971fe1018de813707a338" integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ== @@ -5011,11 +5019,11 @@ https-browserify@^1.0.0: integrity sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg== https-proxy-agent@^7.0.0, https-proxy-agent@^7.0.5: - version "7.0.5" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz#9e8b5013873299e11fab6fd548405da2d6c602b2" - integrity sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw== + version "7.0.6" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz#da8dfeac7da130b05c2ba4b59c9b6cd66611a6b9" + integrity sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw== dependencies: - agent-base "^7.0.2" + agent-base "^7.1.2" debug "4" humanize-ms@^1.2.1: @@ -5063,9 +5071,9 @@ import-fresh@^3.2.1: resolve-from "^4.0.0" import-in-the-middle@^1.8.1: - version "1.11.2" - resolved "https://registry.yarnpkg.com/import-in-the-middle/-/import-in-the-middle-1.11.2.tgz#dd848e72b63ca6cd7c34df8b8d97fc9baee6174f" - integrity sha512-gK6Rr6EykBcc6cVWRSBR5TWf8nn6hZMYSRYqCcHa0l0d1fPK7JSYo6+Mlmck76jIX9aL/IZ71c06U2VpFwl1zA== + version "1.11.3" + resolved "https://registry.yarnpkg.com/import-in-the-middle/-/import-in-the-middle-1.11.3.tgz#08559f2c05fd65ba7062e747af056ed18a80120c" + integrity sha512-tNpKEb4AjZrCyrxi+Eyu43h5ig0O8ZRFSXPHh/00/o+4P4pKzVEW/m5lsVtsAT7fCIgmQOAPjdqecGDsBXRxsw== dependencies: acorn "^8.8.2" acorn-import-attributes "^1.9.5" @@ -7054,10 +7062,10 @@ path-scurry@^1.11.1: lru-cache "^10.2.0" minipass "^5.0.0 || ^6.0.2 || ^7.0.0" -path-to-regexp@0.1.10: - version "0.1.10" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.10.tgz#67e9108c5c0551b9e5326064387de4763c4d5f8b" - integrity sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w== +path-to-regexp@0.1.12: + version "0.1.12" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.12.tgz#d5e1a12e478a976d432ef3c58d534b9923164bb7" + integrity sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ== path-to-regexp@^8.1.0: version "8.2.0" @@ -7212,9 +7220,9 @@ prettier-linter-helpers@^1.0.0: fast-diff "^1.1.2" prettier@^3.3.3: - version "3.4.1" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.4.1.tgz#e211d451d6452db0a291672ca9154bc8c2579f7b" - integrity sha512-G+YdqtITVZmOJje6QkXQWzl3fSfMxFwm1tjTyo9exhkmWSqC4Yhd1+lug++IlR2mvRVAxEDDWYkQdeSztajqgg== + version "3.4.2" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.4.2.tgz#a5ce1fb522a588bf2b78ca44c6e6fe5aa5a2b13f" + integrity sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ== pretty-hrtime@^1.0.2: version "1.0.3" @@ -7492,17 +7500,18 @@ rechoir@^0.6.2: resolve "^1.1.6" reflect.getprototypeof@^1.0.6: - version "1.0.7" - resolved "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.7.tgz#04311b33a1b713ca5eb7b5aed9950a86481858e5" - integrity sha512-bMvFGIUKlc/eSfXNX+aZ+EL95/EgZzuwA0OBPTbZZDEJw/0AkentjMuM1oiRfwHrshqk4RzdgiTg5CcDalXN5g== + version "1.0.8" + resolved "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.8.tgz#c58afb17a4007b4d1118c07b92c23fca422c5d82" + integrity sha512-B5dj6usc5dkk8uFliwjwDHM8To5/QwdKz9JcBZ8Ic4G1f0YmeeJTtE/ZTdgRFPAfxZFiUaPhZ1Jcs4qeagItGQ== dependencies: - call-bind "^1.0.7" + call-bind "^1.0.8" define-properties "^1.2.1" + dunder-proto "^1.0.0" es-abstract "^1.23.5" es-errors "^1.3.0" get-intrinsic "^1.2.4" - gopd "^1.0.1" - which-builtin-type "^1.1.4" + gopd "^1.2.0" + which-builtin-type "^1.2.0" regenerator-runtime@^0.14.0: version "0.14.1" @@ -7933,7 +7942,7 @@ set-blocking@^2.0.0: resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== -set-function-length@^1.2.1: +set-function-length@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== @@ -8601,9 +8610,9 @@ terser@^4.7.0: source-map-support "~0.5.12" terser@^5.15.1: - version "5.36.0" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.36.0.tgz#8b0dbed459ac40ff7b4c9fd5a3a2029de105180e" - integrity sha512-IYV9eNMuFAV4THUspIRXkLakHnV6XO7FEdtKjf/mDyrnqUg9LnlOn6/RwRvM9SZjR4GUq8Nk8zj67FzVARr74w== + version "5.37.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.37.0.tgz#38aa66d1cfc43d0638fab54e43ff8a4f72a21ba3" + integrity sha512-B8wRRkmre4ERucLM/uXx4MOV5cbnOlVAqUst+1+iLKPI0dOgFO28f84ptoQt9HEI537PMzfYa/d+GEPKTRXmYA== dependencies: "@jridgewell/source-map" "^0.3.3" acorn "^8.8.2" @@ -9290,7 +9299,7 @@ which-boxed-primitive@^1.0.2: is-string "^1.1.0" is-symbol "^1.1.0" -which-builtin-type@^1.1.4: +which-builtin-type@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/which-builtin-type/-/which-builtin-type-1.2.0.tgz#58042ac9602d78a6d117c7e811349df1268ba63c" integrity sha512-I+qLGQ/vucCby4tf5HsLmGueEla4ZhwTBSqaooS+Y0BuxN4Cp+okmGuV+8mXZ84KDI9BA+oklo+RzKg0ONdSUA== From 0f7591e8ef77a1751a834bbc35e4328c3b997144 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 9 Dec 2024 13:51:28 -0800 Subject: [PATCH 12/19] [repo] bump: (deps): Bump github/codeql-action from 3.27.5 to 3.27.6 in the production group (#2223) #minor Bumps the production group with 1 update: [github/codeql-action](https://github.com/github/codeql-action). Updates `github/codeql-action` from 3.27.5 to 3.27.6
Release notes

Sourced from github/codeql-action's releases.

v3.27.6

CodeQL Action Changelog

See the releases page for the relevant changes to the CodeQL CLI and language packs.

Note that the only difference between v2 and v3 of the CodeQL Action is the node version they support, with v3 running on node 20 while we continue to release v2 to support running on node 16. For example 3.22.11 was the first v3 release and is functionally identical to 2.22.11. This approach ensures an easy way to track exactly which features are included in different versions, indicated by the minor and patch version numbers.

3.27.6 - 03 Dec 2024

  • Update default CodeQL bundle version to 2.19.4. #2626

See the full CHANGELOG.md for more information.

Changelog

Sourced from github/codeql-action's changelog.

CodeQL Action Changelog

See the releases page for the relevant changes to the CodeQL CLI and language packs.

Note that the only difference between v2 and v3 of the CodeQL Action is the node version they support, with v3 running on node 20 while we continue to release v2 to support running on node 16. For example 3.22.11 was the first v3 release and is functionally identical to 2.22.11. This approach ensures an easy way to track exactly which features are included in different versions, indicated by the minor and patch version numbers.

[UNRELEASED]

  • We are rolling out a change in December 2024 that will extract the CodeQL bundle directly to the toolcache to improve performance. #2631
  • Update default CodeQL bundle version to 2.20.0. #2636

3.27.6 - 03 Dec 2024

  • Update default CodeQL bundle version to 2.19.4. #2626

3.27.5 - 19 Nov 2024

No user facing changes.

3.27.4 - 14 Nov 2024

No user facing changes.

3.27.3 - 12 Nov 2024

No user facing changes.

3.27.2 - 12 Nov 2024

  • Fixed an issue where setting up the CodeQL tools would sometimes fail with the message "Invalid value 'undefined' for header 'authorization'". #2590

3.27.1 - 08 Nov 2024

  • The CodeQL Action now downloads bundles compressed using Zstandard on GitHub Enterprise Server when using Linux or macOS runners. This speeds up the installation of the CodeQL tools. This feature is already available to GitHub.com users. #2573
  • Update default CodeQL bundle version to 2.19.3. #2576

3.27.0 - 22 Oct 2024

  • Bump the minimum CodeQL bundle version to 2.14.6. #2549
  • Fix an issue where the upload-sarif Action would fail with "upload-sarif post-action step failed: Input required and not supplied: token" when called in a composite Action that had a different set of inputs to the ones expected by the upload-sarif Action. #2557
  • Update default CodeQL bundle version to 2.19.2. #2552

3.26.13 - 14 Oct 2024

No user facing changes.

3.26.12 - 07 Oct 2024

  • Upcoming breaking change: Add a deprecation warning for customers using CodeQL version 2.14.5 and earlier. These versions of CodeQL were discontinued on 24 September 2024 alongside GitHub Enterprise Server 3.10, and will be unsupported by CodeQL Action versions 3.27.0 and later and versions 2.27.0 and later. #2520

... (truncated)

Commits
  • aa57810 Merge pull request #2628 from github/update-v3.27.6-af49565b8
  • 34e77b7 Update changelog for v3.27.6
  • af49565 Merge pull request #2620 from github/cklin/DiffThunkRange-fix
  • 5659f01 Merge pull request #2626 from github/update-bundle/codeql-bundle-v2.19.4
  • 5333ff3 Add changelog note
  • e4fb28d Update default bundle to codeql-bundle-v2.19.4
  • 3d3d628 Merge pull request #2617 from github/update-supported-enterprise-server-versions
  • 2eea97e Fix DiffThunkRange access
  • f8e782a Merge pull request #2618 from github/mergeback/v3.27.5-to-main-f09c1c0a
  • 49b7c97 Update checked-in dependencies
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=github/codeql-action&package-manager=github_actions&previous-version=3.27.5&new-version=3.27.6)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore major version` will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself) - `@dependabot ignore minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself) - `@dependabot ignore ` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself) - `@dependabot unignore ` will remove all of the ignore conditions of the specified dependency - `@dependabot unignore ` will remove the ignore condition of the specified dependency and ignore conditions
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/dotnet-codeql.yml | 4 ++-- .github/workflows/js-codeql.yml | 4 ++-- .github/workflows/python-codeql.yml | 4 ++-- .github/workflows/scorecards.yml | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/workflows/dotnet-codeql.yml b/.github/workflows/dotnet-codeql.yml index 6e91ff779..b0e38c3bc 100644 --- a/.github/workflows/dotnet-codeql.yml +++ b/.github/workflows/dotnet-codeql.yml @@ -39,7 +39,7 @@ jobs: - name: Checkout uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Initialize CodeQL - uses: github/codeql-action/init@f09c1c0a94de965c15400f5634aa42fac8fb8f88 # v3.27.5 + uses: github/codeql-action/init@aa578102511db1f4524ed59b8cc2bae4f6e88195 # v3.27.6 with: languages: csharp - name: Setup .NET @@ -50,6 +50,6 @@ jobs: working-directory: dotnet/packages/Microsoft.TeamsAI/ run: dotnet build Microsoft.Teams.AI.sln --configuration Release - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@f09c1c0a94de965c15400f5634aa42fac8fb8f88 # v3.27.5 + uses: github/codeql-action/analyze@aa578102511db1f4524ed59b8cc2bae4f6e88195 # v3.27.6 with: category: "/language:csharp" diff --git a/.github/workflows/js-codeql.yml b/.github/workflows/js-codeql.yml index 768201763..a445fdc16 100644 --- a/.github/workflows/js-codeql.yml +++ b/.github/workflows/js-codeql.yml @@ -38,10 +38,10 @@ jobs: - name: Checkout uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Initialize CodeQL - uses: github/codeql-action/init@f09c1c0a94de965c15400f5634aa42fac8fb8f88 # v3.27.5 + uses: github/codeql-action/init@aa578102511db1f4524ed59b8cc2bae4f6e88195 # v3.27.6 with: languages: javascript - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@f09c1c0a94de965c15400f5634aa42fac8fb8f88 # v3.27.5 + uses: github/codeql-action/analyze@aa578102511db1f4524ed59b8cc2bae4f6e88195 # v3.27.6 with: category: "/language:javascript" diff --git a/.github/workflows/python-codeql.yml b/.github/workflows/python-codeql.yml index f27a1fd69..ee59bc885 100644 --- a/.github/workflows/python-codeql.yml +++ b/.github/workflows/python-codeql.yml @@ -38,10 +38,10 @@ jobs: - name: Checkout uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Initialize CodeQL - uses: github/codeql-action/init@f09c1c0a94de965c15400f5634aa42fac8fb8f88 # v3.27.5 + uses: github/codeql-action/init@aa578102511db1f4524ed59b8cc2bae4f6e88195 # v3.27.6 with: languages: python - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@f09c1c0a94de965c15400f5634aa42fac8fb8f88 # v3.27.5 + uses: github/codeql-action/analyze@aa578102511db1f4524ed59b8cc2bae4f6e88195 # v3.27.6 with: category: "/language:python" diff --git a/.github/workflows/scorecards.yml b/.github/workflows/scorecards.yml index 9fafeb0dc..30576f521 100644 --- a/.github/workflows/scorecards.yml +++ b/.github/workflows/scorecards.yml @@ -66,6 +66,6 @@ jobs: # Upload the results to GitHub's code scanning dashboard. - name: "Upload to code-scanning" - uses: github/codeql-action/upload-sarif@f09c1c0a94de965c15400f5634aa42fac8fb8f88 # v3.27.5 + uses: github/codeql-action/upload-sarif@aa578102511db1f4524ed59b8cc2bae4f6e88195 # v3.27.6 with: sarif_file: results.sarif From d3356b6ab4258067493a9a617cad782cb1667148 Mon Sep 17 00:00:00 2001 From: Corina <14900841+corinagum@users.noreply.github.com> Date: Mon, 9 Dec 2024 14:53:47 -0800 Subject: [PATCH 13/19] [repo] docs: Update wording in the sample readmes for clarity (#2225) ## Linked issues closes: #minor ## Details I updated the wording in the samples so verifying login and running TTK is more clear. Co-authored-by: Corina Gum <> --- .../01.getting-started/a.echoBot/README.md | 14 +-- .../README.md | 14 +-- .../b.adaptiveCards.typeAheadBot/README.md | 22 ++-- .../a.twentyQuestions/README.md | 24 ++-- .../b.AI-messageExtensions/README.md | 22 ++-- .../c.actionMapping-lightBot/README.md | 39 ++++--- .../d.chainedActions-listBot/README.md | 39 ++++--- .../e.customModel-LLAMA/README.md | 14 +-- .../03.ai-concepts/f.chatModeration/README.md | 22 ++-- .../04.ai-apps/a.teamsChefBot/README.md | 39 ++++--- js/samples/04.ai-apps/b.devOpsBot/README.md | 38 +++--- .../04.ai-apps/c.vision-cardGazer/README.md | 22 ++-- .../04.ai-apps/d.assistants-mathBot/README.md | 20 ++-- .../e.assistants-orderBot/README.md | 20 ++-- js/samples/04.ai-apps/f.whoBot/README.md | 32 +++--- .../g.datasource-azureAISearch/README.md | 16 +-- .../i.teamsChefBot-streaming/README.md | 53 +++++---- .../a.oauth-adaptiveCard/README.md | 14 +-- .../05.authentication/b.oauth-bot/README.md | 14 +-- .../c.oauth-messageExtension/README.md | 15 ++- .../d.teamsSSO-bot/README.md | 18 +-- .../e.teamsSSO-messageExtension/README.md | 8 +- .../samples/01.messaging.a.echoBot/README.md | 14 +-- .../README.md | 28 ++--- .../03.adaptiveCards.a.typeAheadBot/README.md | 24 ++-- .../samples/04.ai.a.twentyQuestions/README.md | 16 +-- .../04.ai.b.messageExtensions.AI-ME/README.md | 17 +-- .../04.ai.c.actionMapping.lightBot/README.md | 16 +-- .../04.ai.d.chainedActions.listBot/README.md | 16 +-- .../README.md | 32 +++--- .../04.ai.f.dataSource.azureOpenAI/README.md | 19 ++- .../README.md | 17 +-- .../README.md | 16 +-- python/samples/05.chatModeration/README.md | 20 ++-- .../samples/06.assistants.a.mathBot/README.md | 16 +-- .../06.assistants.b.orderBot/README.md | 16 +-- python/samples/06.auth.oauth.bot/README.md | 25 ++-- python/samples/06.auth.oauth.bot/poetry.lock | 108 ++++++++++++++++-- .../06.auth.oauth.messageExtensions/README.md | 26 ++--- .../samples/07.planners.a.langchain/README.md | 16 +-- python/samples/README.md | 11 +- 41 files changed, 531 insertions(+), 441 deletions(-) diff --git a/js/samples/01.getting-started/a.echoBot/README.md b/js/samples/01.getting-started/a.echoBot/README.md index 2a2f232cb..51bcb7aa0 100644 --- a/js/samples/01.getting-started/a.echoBot/README.md +++ b/js/samples/01.getting-started/a.echoBot/README.md @@ -6,12 +6,12 @@ This sample shows how to incorporate a basic conversational flow into a Microsof -- [Teams Echo Bot](#teams-echo-bot) - - [Interacting with the bot](#interacting-with-the-bot) - - [Setting up the sample](#setting-up-the-sample) - - [Testing the sample](#testing-the-sample) - - [Using Teams Toolkit for Visual Studio Code](#using-teams-toolkit-for-visual-studio-code) - - [Using Teams App test tool](#using-teams-app-test-tool) +- [Teams Echo Bot](#teams-echo-bot) + - [Interacting with the bot](#interacting-with-the-bot) + - [Setting up the sample](#setting-up-the-sample) + - [Testing the sample](#testing-the-sample) + - [Using Teams Toolkit for Visual Studio Code](#using-teams-toolkit-for-visual-studio-code) + - [Using Teams App test tool](#using-teams-app-test-tool) @@ -77,7 +77,7 @@ The simplest way to run this sample in Teams is to use Teams Toolkit for Visual 1. Copy this sample into a new folder outside of teams-ai 1. Select **File > Open Folder** in VS Code and choose this sample's directory 1. Using the extension, sign in with your Microsoft 365 account where you have permissions to upload custom apps. -1. Ensure that you have set up the sample from the previous step. +1. Verify that the Teams Toolkit extension is connected to your Teams account from the above step. 1. Select **Debug > Start Debugging** or **F5** to run the app in a Teams web client. 1. In the browser that launches, select the **Add** button to install the app to Teams.. diff --git a/js/samples/02.teams-features/a.messageExtensions.searchCommand/README.md b/js/samples/02.teams-features/a.messageExtensions.searchCommand/README.md index aa8e61d5d..a338bbb9f 100644 --- a/js/samples/02.teams-features/a.messageExtensions.searchCommand/README.md +++ b/js/samples/02.teams-features/a.messageExtensions.searchCommand/README.md @@ -7,17 +7,17 @@ This sample shows how to incorporate a basic Message Extension app into a Micros - [Teams Search Command Message Extension](#teams-search-command-message-extension) - - [Interacting with the message extension](#interacting-with-the-message-extension) - - [Setting up the sample](#setting-up-the-sample) - - [Testing the sample](#testing-the-sample) - - [Using Teams Toolkit for Visual Studio Code](#using-teams-toolkit-for-visual-studio-code) + - [Interacting with the message extension](#interacting-with-the-message-extension) + - [Setting up the sample](#setting-up-the-sample) + - [Testing the sample](#testing-the-sample) + - [Using Teams Toolkit for Visual Studio Code](#using-teams-toolkit-for-visual-studio-code) ## Interacting with the message extension -- Message Extensions are convenient ways to add functionality to Teams. -- This sample adds a search command to the compose area of a chat. +- Message Extensions are convenient ways to add functionality to Teams. +- This sample adds a search command to the compose area of a chat. > Note: this is not a chat bot and therefore the bot does not respond if you talk to it. Once it is installed in Teams, you can interact with it by selecting it's app icon in the chat compose area. @@ -79,7 +79,7 @@ The simplest way to run this sample in Teams is to use Teams Toolkit for Visual 1. Copy this sample into a new folder outside of teams-ai 1. Select File > Open Folder in VS Code and choose this sample's directory 1. Using the extension, sign in with your Microsoft 365 account where you have permissions to upload custom apps -1. Ensure that you have set up the sample from the previous step. +1. Verify that the Teams Toolkit extension is connected to your Teams account from the above step. 1. Select **Debug > Start Debugging** or **F5** to run the app in a Teams web client. 1. In the browser that launches, select the **Add** button to install the app to Teams. diff --git a/js/samples/02.teams-features/b.adaptiveCards.typeAheadBot/README.md b/js/samples/02.teams-features/b.adaptiveCards.typeAheadBot/README.md index 0721a2295..eba92a671 100644 --- a/js/samples/02.teams-features/b.adaptiveCards.typeAheadBot/README.md +++ b/js/samples/02.teams-features/b.adaptiveCards.typeAheadBot/README.md @@ -6,20 +6,20 @@ This sample shows how to incorporate Adaptive Cards into a Microsoft Teams appli -- [Type-Ahead Search](#type-ahead-search) - - [Interacting with the bot](#interacting-with-the-bot) - - [Setting up the sample](#setting-up-the-sample) - - [Testing the sample](#testing-the-sample) - - [Using Teams Toolkit for Visual Studio Code](#using-teams-toolkit-for-visual-studio-code) - - [Using Teams App test tool](#using-teams-app-test-tool) +- [Type-Ahead Search](#type-ahead-search) + - [Interacting with the bot](#interacting-with-the-bot) + - [Setting up the sample](#setting-up-the-sample) + - [Testing the sample](#testing-the-sample) + - [Using Teams Toolkit for Visual Studio Code](#using-teams-toolkit-for-visual-studio-code) + - [Using Teams App test tool](#using-teams-app-test-tool) ## Interacting with the bot -- You can interact by sending 'dynamic' or 'static' to the app. The app will respond with an Adaptive Card. -- Typing into the search box will filter the list of options. Selecting an option and submitting will send a message to the bot with the selected option(s). -- The Adaptive Cards used are `json` files located under `/src/cards`. You can use the Teams developer portal to design and host your Adaptive Cards. +- You can interact by sending 'dynamic' or 'static' to the app. The app will respond with an Adaptive Card. +- Typing into the search box will filter the list of options. Selecting an option and submitting will send a message to the bot with the selected option(s). +- The Adaptive Cards used are `json` files located under `/src/cards`. You can use the Teams developer portal to design and host your Adaptive Cards. ## Setting up the sample @@ -77,7 +77,7 @@ The simplest way to run this sample in Teams is to use Teams Toolkit for Visual 1. Copy this sample into a new folder outside of teams-ai 1. Select File > Open Folder in VS Code and choose this sample's directory 1. Using the extension, sign in with your Microsoft 365 account where you have permissions to upload custom apps -1. Ensure that you have set up the sample from the previous step. +1. Verify that the Teams Toolkit extension is connected to your Teams account from the above step. 1. Select **Debug > Start Debugging** or **F5** to run the app in a Teams web client. 1. In the browser that launches, select the **Add** button to install the app to Teams. @@ -93,4 +93,4 @@ Use **Teams App test tool** (integrated into teams Toolkit) to run this sample. 1. Select File > Open Folder in VS Code and choose this sample's directory 1. From the left pane, select **Run and Debug**(Ctrl+Shift+D) and select **Debug in Test Tool** in dropdown list. 1. Select Debug > Start Debugging or F5 to run the app. -1. The browser will pop up to open Teams App Test Tool. \ No newline at end of file +1. The browser will pop up to open Teams App Test Tool. diff --git a/js/samples/03.ai-concepts/a.twentyQuestions/README.md b/js/samples/03.ai-concepts/a.twentyQuestions/README.md index dba47c10f..4475bbfe8 100644 --- a/js/samples/03.ai-concepts/a.twentyQuestions/README.md +++ b/js/samples/03.ai-concepts/a.twentyQuestions/README.md @@ -7,10 +7,10 @@ Welcome to the 20 Questions Bot: The Ultimate Guessing Game! This developer samp - [AI in Microsoft Teams: Twenty Questions](#ai-in-microsoft-teams-twenty-questions) - - [Setting up the sample](#setting-up-the-sample) - - [Testing the sample](#testing-the-sample) - - [Using Teams Toolkit for Visual Studio Code](#using-teams-toolkit-for-visual-studio-code) - - [Using Teams App test tool](#using-teams-app-test-tool) + - [Setting up the sample](#setting-up-the-sample) + - [Testing the sample](#testing-the-sample) + - [Using Teams Toolkit for Visual Studio Code](#using-teams-toolkit-for-visual-studio-code) + - [Using Teams App test tool](#using-teams-app-test-tool) @@ -58,7 +58,6 @@ Welcome to the 20 Questions Bot: The Ultimate Guessing Game! This developer samp 1. If developing without Teams Toolkit, add your OpenAI or Azure OpenAI key to the `OPENAI_KEY` or `AZURE_OPENAI_KEY` and `AZURE_OPENAI_ENDPOINT` variable(s) in `.env` file, which you can copy from `sample.env`. If using TTK, continue following the directions below. - ## Testing the sample The easiest and fastest way to get up and running is with Teams Toolkit as your development guide. @@ -106,7 +105,7 @@ If you are using Azure OpenAI then follow these steps: 1. Copy this sample into a new folder outside of teams-ai 1. Select File > Open Folder in VS Code and choose this sample's directory 1. Using the extension, sign in with your Microsoft 365 account where you have permissions to upload custom apps -1. Ensure that you have set up the sample from the previous step. +1. Verify that the Teams Toolkit extension is connected to your Teams account from the above step. 1. Select **Debug > Start Debugging** or **F5** to run the app in a Teams web client. 1. In the browser that launches, select the **Add** button to install the app to Teams. @@ -123,13 +122,14 @@ If you are using Azure OpenAI then follow these steps: ```yml - uses: file/createOrUpdateEnvironmentFile with: - target: ./.localConfigs.testTool - envs: - TEAMSFX_NOTIFICATION_STORE_FILENAME: ${{TEAMSFX_NOTIFICATION_STORE_FILENAME}} - # OPENAI_KEY: ${{SECRET_OPENAI_KEY}} - AZURE_OPENAI_KEY: ${{SECRET_AZURE_OPENAI_KEY}} - AZURE_OPENAI_ENDPOINT: ${{SECRET_AZURE_OPENAI_ENDPOINT}} + target: ./.localConfigs.testTool + envs: + TEAMSFX_NOTIFICATION_STORE_FILENAME: ${{TEAMSFX_NOTIFICATION_STORE_FILENAME}} + # OPENAI_KEY: ${{SECRET_OPENAI_KEY}} + AZURE_OPENAI_KEY: ${{SECRET_AZURE_OPENAI_KEY}} + AZURE_OPENAI_ENDPOINT: ${{SECRET_AZURE_OPENAI_ENDPOINT}} ``` + 1. Ensure you have downloaded and installed [Visual Studio Code](https://code.visualstudio.com/docs/setup/setup-overview) 1. Install the [Teams Toolkit extension](https://marketplace.visualstudio.com/items?itemName=TeamsDevApp.ms-teams-vscode-extension) 1. Copy this sample into a new folder outside of teams-ai diff --git a/js/samples/03.ai-concepts/b.AI-messageExtensions/README.md b/js/samples/03.ai-concepts/b.AI-messageExtensions/README.md index e23a8aece..f3779bc5d 100644 --- a/js/samples/03.ai-concepts/b.AI-messageExtensions/README.md +++ b/js/samples/03.ai-concepts/b.AI-messageExtensions/README.md @@ -6,11 +6,11 @@ This sample is a message extension (ME) for Microsoft Teams that leverages the g -- [AI in Microsoft Teams Message Extensions: GPT-ME](#ai-in-microsoft-teams-message-extensions-gpt-me) - - [Summary](#summary) - - [Setting up the sample](#setting-up-the-sample) - - [Testing the sample](#testing-the-sample) - - [Using Teams Toolkit for Visual Studio Code](#using-teams-toolkit-for-visual-studio-code) +- [AI in Microsoft Teams Message Extensions: GPT-ME](#ai-in-microsoft-teams-message-extensions-gpt-me) + - [Summary](#summary) + - [Setting up the sample](#setting-up-the-sample) + - [Testing the sample](#testing-the-sample) + - [Using Teams Toolkit for Visual Studio Code](#using-teams-toolkit-for-visual-studio-code) @@ -76,9 +76,9 @@ To use Teams Toolkit, continue following the directions below. If you are using Azure OpenAI then follow these steps: -- Comment the `SECRET_OPENAI_KEY` variable in the `./env/.env.local.user` file. -- Add your Azure OpenAI key and endpoint values to the `SECRET_AZURE_OPENAI_KEY` and `SECRET_AZURE_OPENAI_ENDPOINT` variables -- Open the `teamsapp.local.yml` file and modify the last step to use Azure OpenAI variables instead: +- Comment the `SECRET_OPENAI_KEY` variable in the `./env/.env.local.user` file. +- Add your Azure OpenAI key and endpoint values to the `SECRET_AZURE_OPENAI_KEY` and `SECRET_AZURE_OPENAI_ENDPOINT` variables +- Open the `teamsapp.local.yml` file and modify the last step to use Azure OpenAI variables instead: ```yml - uses: file/createOrUpdateEnvironmentFile @@ -92,8 +92,8 @@ If you are using Azure OpenAI then follow these steps: AZURE_OPENAI_ENDPOINT: ${{SECRET_AZURE_OPENAI_ENDPOINT}} ``` -- Open `./infra/azure.bicep` and comment out lines 72-75 and uncomment lines 76-83. -- Open `./infra/azure.parameters.json` and replace lines 20-22 with: +- Open `./infra/azure.bicep` and comment out lines 72-75 and uncomment lines 76-83. +- Open `./infra/azure.parameters.json` and replace lines 20-22 with: ```json "azureOpenAIKey": { @@ -109,7 +109,7 @@ If you are using Azure OpenAI then follow these steps: 1. Copy this sample into a new folder outside of teams-ai 1. Select File > Open Folder in VS Code and choose this sample's directory 1. Using the extension, sign in with your Microsoft 365 account where you have permissions to upload custom apps -1. Ensure that you have set up the sample from the previous step. +1. Verify that the Teams Toolkit extension is connected to your Teams account from the above step. 1. Select **Debug > Start Debugging** or **F5** to run the app in a Teams web client. 1. In the browser that launches, select the **Add** button to install the app to Teams. diff --git a/js/samples/03.ai-concepts/c.actionMapping-lightBot/README.md b/js/samples/03.ai-concepts/c.actionMapping-lightBot/README.md index 924045bad..19963502e 100644 --- a/js/samples/03.ai-concepts/c.actionMapping-lightBot/README.md +++ b/js/samples/03.ai-concepts/c.actionMapping-lightBot/README.md @@ -6,12 +6,12 @@ LightBot: Your Enlightened Assistant. This example showcases how the LightBot un -- [AI in Microsoft Teams: Light Bot](#ai-in-microsoft-teams-light-bot) - - [Interacting with the bot](#interacting-with-the-bot) - - [Setting up the sample](#setting-up-the-sample) - - [Testing the sample](#testing-the-sample) - - [Using Teams Toolkit for Visual Studio Code](#using-teams-toolkit-for-visual-studio-code) - - [Using Teams App Test Tool](#using-teams-app-test-tool) +- [AI in Microsoft Teams: Light Bot](#ai-in-microsoft-teams-light-bot) + - [Interacting with the bot](#interacting-with-the-bot) + - [Setting up the sample](#setting-up-the-sample) + - [Testing the sample](#testing-the-sample) + - [Using Teams Toolkit for Visual Studio Code](#using-teams-toolkit-for-visual-studio-code) + - [Using Teams App Test Tool](#using-teams-app-test-tool) @@ -81,9 +81,9 @@ To use Teams Toolkit, continue following the directions below. If you are using Azure OpenAI then follow these steps: -- Comment the `SECRET_OPENAI_KEY` variable in the `./env/.env.local.user` file. -- Add your Azure OpenAI key and endpoint values to the `SECRET_AZURE_OPENAI_KEY` and `SECRET_AZURE_OPENAI_ENDPOINT` variables -- Open the `teamsapp.local.yml` file and modify the last step to use Azure OpenAI variables instead: +- Comment the `SECRET_OPENAI_KEY` variable in the `./env/.env.local.user` file. +- Add your Azure OpenAI key and endpoint values to the `SECRET_AZURE_OPENAI_KEY` and `SECRET_AZURE_OPENAI_ENDPOINT` variables +- Open the `teamsapp.local.yml` file and modify the last step to use Azure OpenAI variables instead: ```yml - uses: file/createOrUpdateEnvironmentFile @@ -97,8 +97,8 @@ If you are using Azure OpenAI then follow these steps: AZURE_OPENAI_ENDPOINT: ${{SECRET_AZURE_OPENAI_ENDPOINT}} ``` -- Open `./infra/azure.bicep` and comment out lines 72-75 and uncomment lines 76-83. -- Open `./infra/azure.parameters.json` and replace lines 20-22 with: +- Open `./infra/azure.bicep` and comment out lines 72-75 and uncomment lines 76-83. +- Open `./infra/azure.parameters.json` and replace lines 20-22 with: ```json "azureOpenAIKey": { @@ -114,7 +114,7 @@ If you are using Azure OpenAI then follow these steps: 1. Copy this sample into a new folder outside of teams-ai 1. Select File > Open Folder in VS Code and choose this sample's directory 1. Using the extension, sign in with your Microsoft 365 account where you have permissions to upload custom apps -1. Ensure that you have set up the sample from the previous step. +1. Verify that the Teams Toolkit extension is connected to your Teams account from the above step. 1. Select **Debug > Start Debugging** or **F5** to run the app in a Teams web client. 1. In the browser that launches, select the **Add** button to install the app to Teams. @@ -131,17 +131,18 @@ If you are using Azure OpenAI then follow these steps: ```yml - uses: file/createOrUpdateEnvironmentFile with: - target: ./.localConfigs.testTool - envs: - TEAMSFX_NOTIFICATION_STORE_FILENAME: ${{TEAMSFX_NOTIFICATION_STORE_FILENAME}} - # OPENAI_KEY: ${{SECRET_OPENAI_KEY}} - AZURE_OPENAI_KEY: ${{SECRET_AZURE_OPENAI_KEY}} - AZURE_OPENAI_ENDPOINT: ${{SECRET_AZURE_OPENAI_ENDPOINT}} + target: ./.localConfigs.testTool + envs: + TEAMSFX_NOTIFICATION_STORE_FILENAME: ${{TEAMSFX_NOTIFICATION_STORE_FILENAME}} + # OPENAI_KEY: ${{SECRET_OPENAI_KEY}} + AZURE_OPENAI_KEY: ${{SECRET_AZURE_OPENAI_KEY}} + AZURE_OPENAI_ENDPOINT: ${{SECRET_AZURE_OPENAI_ENDPOINT}} ``` + 1. Ensure you have downloaded and installed [Visual Studio Code](https://code.visualstudio.com/docs/setup/setup-overview) 1. Install the [Teams Toolkit extension](https://marketplace.visualstudio.com/items?itemName=TeamsDevApp.ms-teams-vscode-extension) 1. Copy this sample into a new folder outside of teams-ai 1. Select File > Open Folder in VS Code and choose this sample's directory 1. From the left pane, select **Run and Debug**(Ctrl+Shift+D) and select **Debug in Test Tool** in dropdown list. 1. Select Debug > Start Debugging or F5 to run the app. -1. The browser will pop up to open Teams App Test Tool. \ No newline at end of file +1. The browser will pop up to open Teams App Test Tool. diff --git a/js/samples/03.ai-concepts/d.chainedActions-listBot/README.md b/js/samples/03.ai-concepts/d.chainedActions-listBot/README.md index 4d9d6fb36..d4ce876b5 100644 --- a/js/samples/03.ai-concepts/d.chainedActions-listBot/README.md +++ b/js/samples/03.ai-concepts/d.chainedActions-listBot/README.md @@ -6,12 +6,12 @@ ListBot: Your Ultimate List Management Companion. Powered by advanced AI capabil -- [AI in Microsoft Teams: List Bot](#ai-in-microsoft-teams-list-bot) - - [Interacting with the bot](#interacting-with-the-bot) - - [Setting up the sample](#setting-up-the-sample) - - [Testing the sample](#testing-the-sample) - - [Using Teams Toolkit for Visual Studio Code](#using-teams-toolkit-for-visual-studio-code) - - [Using Teams App Test Tool](#using-teams-app-test-tool) +- [AI in Microsoft Teams: List Bot](#ai-in-microsoft-teams-list-bot) + - [Interacting with the bot](#interacting-with-the-bot) + - [Setting up the sample](#setting-up-the-sample) + - [Testing the sample](#testing-the-sample) + - [Using Teams Toolkit for Visual Studio Code](#using-teams-toolkit-for-visual-studio-code) + - [Using Teams App Test Tool](#using-teams-app-test-tool) @@ -159,9 +159,9 @@ To use Teams Toolkit, continue following the directions below. If you are using Azure OpenAI then follow these steps: -- Comment the `SECRET_OPENAI_KEY` variable in the `./env/.env.local.user` file. -- Add your Azure OpenAI key and endpoint values to the `SECRET_AZURE_OPENAI_KEY` and `SECRET_AZURE_OPENAI_ENDPOINT` variables -- Open the `teamsapp.local.yml` file and modify the last step to use Azure OpenAI variables instead: +- Comment the `SECRET_OPENAI_KEY` variable in the `./env/.env.local.user` file. +- Add your Azure OpenAI key and endpoint values to the `SECRET_AZURE_OPENAI_KEY` and `SECRET_AZURE_OPENAI_ENDPOINT` variables +- Open the `teamsapp.local.yml` file and modify the last step to use Azure OpenAI variables instead: ```yml - uses: file/createOrUpdateEnvironmentFile @@ -175,8 +175,8 @@ If you are using Azure OpenAI then follow these steps: AZURE_OPENAI_ENDPOINT: ${{SECRET_AZURE_OPENAI_ENDPOINT}} ``` -- Open `./infra/azure.bicep` and comment out lines 72-75 and uncomment lines 76-83. -- Open `./infra/azure.parameters.json` and replace lines 20-22 with: +- Open `./infra/azure.bicep` and comment out lines 72-75 and uncomment lines 76-83. +- Open `./infra/azure.parameters.json` and replace lines 20-22 with: ```json "azureOpenAIKey": { @@ -192,7 +192,7 @@ If you are using Azure OpenAI then follow these steps: 1. Copy this sample into a new folder outside of teams-ai 1. Select File > Open Folder in VS Code and choose this sample's directory 1. Using the extension, sign in with your Microsoft 365 account where you have permissions to upload custom apps -1. Ensure that you have set up the sample from the previous step. +1. Verify that the Teams Toolkit extension is connected to your Teams account from the above step. 1. Select **Debug > Start Debugging** or **F5** to run the app in a Teams web client. 1. In the browser that launches, select the **Add** button to install the app to Teams. @@ -209,17 +209,18 @@ If you are using Azure OpenAI then follow these steps: ```yml - uses: file/createOrUpdateEnvironmentFile with: - target: ./.localConfigs.testTool - envs: - TEAMSFX_NOTIFICATION_STORE_FILENAME: ${{TEAMSFX_NOTIFICATION_STORE_FILENAME}} - # OPENAI_KEY: ${{SECRET_OPENAI_KEY}} - AZURE_OPENAI_KEY: ${{SECRET_AZURE_OPENAI_KEY}} - AZURE_OPENAI_ENDPOINT: ${{SECRET_AZURE_OPENAI_ENDPOINT}} + target: ./.localConfigs.testTool + envs: + TEAMSFX_NOTIFICATION_STORE_FILENAME: ${{TEAMSFX_NOTIFICATION_STORE_FILENAME}} + # OPENAI_KEY: ${{SECRET_OPENAI_KEY}} + AZURE_OPENAI_KEY: ${{SECRET_AZURE_OPENAI_KEY}} + AZURE_OPENAI_ENDPOINT: ${{SECRET_AZURE_OPENAI_ENDPOINT}} ``` + 1. Ensure you have downloaded and installed [Visual Studio Code](https://code.visualstudio.com/docs/setup/setup-overview) 1. Install the [Teams Toolkit extension](https://marketplace.visualstudio.com/items?itemName=TeamsDevApp.ms-teams-vscode-extension) 1. Copy this sample into a new folder outside of teams-ai 1. Select File > Open Folder in VS Code and choose this sample's directory 1. From the left pane, select **Run and Debug**(Ctrl+Shift+D) and select **Debug in Test Tool** in dropdown list. 1. Select Debug > Start Debugging or F5 to run the app. -1. The browser will pop up to open Teams App Test Tool. \ No newline at end of file +1. The browser will pop up to open Teams App Test Tool. diff --git a/js/samples/03.ai-concepts/e.customModel-LLAMA/README.md b/js/samples/03.ai-concepts/e.customModel-LLAMA/README.md index 60231688c..b4fa90e25 100644 --- a/js/samples/03.ai-concepts/e.customModel-LLAMA/README.md +++ b/js/samples/03.ai-concepts/e.customModel-LLAMA/README.md @@ -6,12 +6,12 @@ This sample implements a custom model to utilize Meta Llama's capabilities in Mi -- [Meta Llama2 in Microsoft Teams](#meta-llama2-in-microsoft-teams) - - [Summary](#summary) - - [Obtaining a deployed Llama 2 model in Azure](#obtaining-a-deployed-llama-2-model-in-azure) - - [Setting up the sample](#setting-up-the-sample) - - [Testing the sample](#testing-the-sample) - - [Using Teams Toolkit for Visual Studio Code](#using-teams-toolkit-for-visual-studio-code) +- [Meta Llama2 in Microsoft Teams](#meta-llama2-in-microsoft-teams) + - [Summary](#summary) + - [Obtaining a deployed Llama 2 model in Azure](#obtaining-a-deployed-llama-2-model-in-azure) + - [Setting up the sample](#setting-up-the-sample) + - [Testing the sample](#testing-the-sample) + - [Using Teams Toolkit for Visual Studio Code](#using-teams-toolkit-for-visual-studio-code) @@ -106,7 +106,7 @@ To use Teams Toolkit, continue following the directions below. 1. Copy this sample into a new folder outside of teams-ai 1. Select File > Open Folder in VS Code and choose this sample's directory 1. Using the extension, sign in with your Microsoft 365 account where you have permissions to upload custom apps -1. Ensure that you have set up the sample from the previous step. +1. Verify that the Teams Toolkit extension is connected to your Teams account from the above step. 1. Select **Debug > Start Debugging** or **F5** to run the app in a Teams web client. 1. In the browser that launches, select the **Add** button to install the app to Teams. diff --git a/js/samples/03.ai-concepts/f.chatModeration/README.md b/js/samples/03.ai-concepts/f.chatModeration/README.md index e5360145e..a16bd6e15 100644 --- a/js/samples/03.ai-concepts/f.chatModeration/README.md +++ b/js/samples/03.ai-concepts/f.chatModeration/README.md @@ -6,11 +6,11 @@ This sample shows how to incorporate Content Safety control into a Microsoft Tea -- [Chat Bot with Moderation Control](#chat-bot-with-moderation-control) - - [Interacting with the bot](#interacting-with-the-bot) - - [Setting up the sample](#setting-up-the-sample) - - [Testing the sample](#testing-the-sample) - - [Using Teams Toolkit for Visual Studio Code](#using-teams-toolkit-for-visual-studio-code) +- [Chat Bot with Moderation Control](#chat-bot-with-moderation-control) + - [Interacting with the bot](#interacting-with-the-bot) + - [Setting up the sample](#setting-up-the-sample) + - [Testing the sample](#testing-the-sample) + - [Using Teams Toolkit for Visual Studio Code](#using-teams-toolkit-for-visual-studio-code) @@ -76,9 +76,9 @@ To use Teams Toolkit, continue following the directions below. If you are using Azure OpenAI then follow these steps: -- Comment the `SECRET_OPENAI_KEY` variable in the `./env/.env.local.user` file. -- Add your Azure OpenAI key and endpoint values to the `SECRET_AZURE_OPENAI_KEY` and `SECRET_AZURE_OPENAI_ENDPOINT` variables -- Open the `teamsapp.local.yml` file and modify the last step to use Azure OpenAI variables instead: +- Comment the `SECRET_OPENAI_KEY` variable in the `./env/.env.local.user` file. +- Add your Azure OpenAI key and endpoint values to the `SECRET_AZURE_OPENAI_KEY` and `SECRET_AZURE_OPENAI_ENDPOINT` variables +- Open the `teamsapp.local.yml` file and modify the last step to use Azure OpenAI variables instead: ```yml - uses: file/createOrUpdateEnvironmentFile @@ -92,8 +92,8 @@ If you are using Azure OpenAI then follow these steps: AZURE_OPENAI_ENDPOINT: ${{SECRET_AZURE_OPENAI_ENDPOINT}} ``` -- Open `./infra/azure.bicep` and comment out lines 72-75 and uncomment lines 76-83. -- Open `./infra/azure.parameters.json` and replace lines 20-22 with: +- Open `./infra/azure.bicep` and comment out lines 72-75 and uncomment lines 76-83. +- Open `./infra/azure.parameters.json` and replace lines 20-22 with: ```json "azureOpenAIKey": { @@ -109,7 +109,7 @@ If you are using Azure OpenAI then follow these steps: 1. Copy this sample into a new folder outside of teams-ai 1. Select File > Open Folder in VS Code and choose this sample's directory 1. Using the extension, sign in with your Microsoft 365 account where you have permissions to upload custom apps -1. Ensure that you have set up the sample from the previous step. +1. Verify that the Teams Toolkit extension is connected to your Teams account from the above step. 1. Select **Debug > Start Debugging** or **F5** to run the app in a Teams web client. 1. In the browser that launches, select the **Add** button to install the app to Teams. diff --git a/js/samples/04.ai-apps/a.teamsChefBot/README.md b/js/samples/04.ai-apps/a.teamsChefBot/README.md index 122d5101a..1788d48d8 100644 --- a/js/samples/04.ai-apps/a.teamsChefBot/README.md +++ b/js/samples/04.ai-apps/a.teamsChefBot/README.md @@ -6,12 +6,12 @@ This is a conversational bot for Microsoft Teams that thinks it's a Chef to help -- [Microsoft Teams Conversational Bot with AI: Teams Chef](#microsoft-teams-conversational-bot-with-ai-teams-chef) - - [Summary](#summary) - - [Setting up the sample](#setting-up-the-sample) - - [Testing the sample](#testing-the-sample) - - [Using Teams Toolkit for Visual Studio Code](#using-teams-toolkit-for-visual-studio-code) - - [Using Teams App test tool](#using-teams-app-test-tool) +- [Microsoft Teams Conversational Bot with AI: Teams Chef](#microsoft-teams-conversational-bot-with-ai-teams-chef) + - [Summary](#summary) + - [Setting up the sample](#setting-up-the-sample) + - [Testing the sample](#testing-the-sample) + - [Using Teams Toolkit for Visual Studio Code](#using-teams-toolkit-for-visual-studio-code) + - [Using Teams App test tool](#using-teams-app-test-tool) @@ -44,9 +44,9 @@ code . If you are using Azure OpenAI then follow these steps: -- Comment the `SECRET_OPENAI_KEY` variable in the `./env/.env.local.user` file. -- Add your Azure OpenAI key and endpoint values to the `SECRET_AZURE_OPENAI_KEY` and `SECRET_AZURE_OPENAI_ENDPOINT` variables. -- Open the `teamsapp.local.yml` file and modify the last step to use Azure OpenAI variables instead: +- Comment the `SECRET_OPENAI_KEY` variable in the `./env/.env.local.user` file. +- Add your Azure OpenAI key and endpoint values to the `SECRET_AZURE_OPENAI_KEY` and `SECRET_AZURE_OPENAI_ENDPOINT` variables. +- Open the `teamsapp.local.yml` file and modify the last step to use Azure OpenAI variables instead: ```yml - uses: file/createOrUpdateEnvironmentFile @@ -60,8 +60,8 @@ If you are using Azure OpenAI then follow these steps: AZURE_OPENAI_ENDPOINT: ${{SECRET_AZURE_OPENAI_ENDPOINT}} ``` -- Open `./infra/azure.bicep` and comment out lines 72-75 and uncomment lines 76-83. -- Open `./infra/azure.parameters.json` and replace lines 20-22 with: +- Open `./infra/azure.bicep` and comment out lines 72-75 and uncomment lines 76-83. +- Open `./infra/azure.parameters.json` and replace lines 20-22 with: ```json "azureOpenAIKey": { @@ -92,7 +92,7 @@ The simplest way to run this sample in Teams is to use Teams Toolkit for Visual 1. Copy this sample into a new folder outside of teams-ai 1. Select File > Open Folder in VS Code and choose this sample's directory 1. Using the extension, sign in with your Microsoft 365 account where you have permissions to upload custom apps -1. Ensure that you have set up the sample from the previous step. +1. Verify that the Teams Toolkit extension is connected to your Teams account from the above step. 1. Select **Debug > Start Debugging** or **F5** to run the app in a Teams web client. 1. In the browser that launches, select the **Add** button to install the app to Teams. @@ -109,17 +109,18 @@ If you are using Azure OpenAI then follow these steps: ```yml - uses: file/createOrUpdateEnvironmentFile with: - target: ./.localConfigs.testTool - envs: - TEAMSFX_NOTIFICATION_STORE_FILENAME: ${{TEAMSFX_NOTIFICATION_STORE_FILENAME}} - # OPENAI_KEY: ${{SECRET_OPENAI_KEY}} - AZURE_OPENAI_KEY: ${{SECRET_AZURE_OPENAI_KEY}} - AZURE_OPENAI_ENDPOINT: ${{SECRET_AZURE_OPENAI_ENDPOINT}} + target: ./.localConfigs.testTool + envs: + TEAMSFX_NOTIFICATION_STORE_FILENAME: ${{TEAMSFX_NOTIFICATION_STORE_FILENAME}} + # OPENAI_KEY: ${{SECRET_OPENAI_KEY}} + AZURE_OPENAI_KEY: ${{SECRET_AZURE_OPENAI_KEY}} + AZURE_OPENAI_ENDPOINT: ${{SECRET_AZURE_OPENAI_ENDPOINT}} ``` + 1. Ensure you have downloaded and installed [Visual Studio Code](https://code.visualstudio.com/docs/setup/setup-overview) 1. Install the [Teams Toolkit extension](https://marketplace.visualstudio.com/items?itemName=TeamsDevApp.ms-teams-vscode-extension) 1. Copy this sample into a new folder outside of teams-ai 1. Select File > Open Folder in VS Code and choose this sample's directory 1. From the left pane, select **Run and Debug**(Ctrl+Shift+D) and select **Debug in Test Tool** in dropdown list. 1. Select Debug > Start Debugging or F5 to run the app. -1. The browser will pop up to open Teams App Test Tool. \ No newline at end of file +1. The browser will pop up to open Teams App Test Tool. diff --git a/js/samples/04.ai-apps/b.devOpsBot/README.md b/js/samples/04.ai-apps/b.devOpsBot/README.md index 85441c591..eb016023f 100644 --- a/js/samples/04.ai-apps/b.devOpsBot/README.md +++ b/js/samples/04.ai-apps/b.devOpsBot/README.md @@ -6,11 +6,11 @@ This is a conversational bot for Microsoft Teams that demonstrates how you could -- [Microsoft Teams Conversational Bot: DevOps Bot](#microsoft-teams-conversational-bot-devops-bot) - - [Interacting with the bot](#interacting-with-the-bot) - - [Setting up the sample](#setting-up-the-sample) - - [Testing the sample](#testing-the-sample) - - [Using Teams Toolkit for Visual Studio Code](#using-teams-toolkit-for-visual-studio-code) +- [Microsoft Teams Conversational Bot: DevOps Bot](#microsoft-teams-conversational-bot-devops-bot) + - [Interacting with the bot](#interacting-with-the-bot) + - [Setting up the sample](#setting-up-the-sample) + - [Testing the sample](#testing-the-sample) + - [Using Teams Toolkit for Visual Studio Code](#using-teams-toolkit-for-visual-studio-code) @@ -22,23 +22,23 @@ You can interact with this bot by sending it a message. The bot will respond to 1. **create work item to track new functionality in Adaptive card and assign it to John** -- **Result:** The bot will create a tracking item in Azure DevOps and assign it to John -- **Valid Scopes:** personal, group chat, team chat +- **Result:** The bot will create a tracking item in Azure DevOps and assign it to John +- **Valid Scopes:** personal, group chat, team chat 2. **update title of work item 1 to create a new bot in azure** -- **Result:** The bot will update the title of work item 1 to create a new bot in azure. -- **Valid Scopes:** personal, group chat, team chat +- **Result:** The bot will update the title of work item 1 to create a new bot in azure. +- **Valid Scopes:** personal, group chat, team chat 3. **triage work item 1 as "in progress"** -- **Result:** The bot will update the state of work item 1 to "in progress". -- **Valid Scopes:** personal, group chat, team chat +- **Result:** The bot will update the state of work item 1 to "in progress". +- **Valid Scopes:** personal, group chat, team chat 4. **summarize work items"** -- **Result:** The bot will summarize the work items and respond back with an adaptive card. -- **Valid Scopes:** personal, group chat, team chat +- **Result:** The bot will summarize the work items and respond back with an adaptive card. +- **Valid Scopes:** personal, group chat, team chat You can select an option from the command list by typing `@TeamsConversationBot` into the compose message area and `What can I do?` text above the compose area. @@ -100,9 +100,9 @@ To use Teams Toolkit, continue following the directions below. If you are using Azure OpenAI then follow these steps: -- Comment the `SECRET_OPENAI_KEY` variable in the `./env/.env.local.user` file. -- Add your Azure OpenAI key and endpoint values to the `SECRET_AZURE_OPENAI_KEY` and `SECRET_AZURE_OPENAI_ENDPOINT` variables -- Open the `teamsapp.local.yml` file and modify the last step to use Azure OpenAI variables instead: +- Comment the `SECRET_OPENAI_KEY` variable in the `./env/.env.local.user` file. +- Add your Azure OpenAI key and endpoint values to the `SECRET_AZURE_OPENAI_KEY` and `SECRET_AZURE_OPENAI_ENDPOINT` variables +- Open the `teamsapp.local.yml` file and modify the last step to use Azure OpenAI variables instead: ```yml - uses: file/createOrUpdateEnvironmentFile @@ -116,8 +116,8 @@ If you are using Azure OpenAI then follow these steps: AZURE_OPENAI_ENDPOINT: ${{SECRET_AZURE_OPENAI_ENDPOINT}} ``` -- Open `./infra/azure.bicep` and comment out lines 72-75 and uncomment lines 76-83. -- Open `./infra/azure.parameters.json` and replace lines 20-22 with: +- Open `./infra/azure.bicep` and comment out lines 72-75 and uncomment lines 76-83. +- Open `./infra/azure.parameters.json` and replace lines 20-22 with: ```json "azureOpenAIKey": { @@ -133,7 +133,7 @@ If you are using Azure OpenAI then follow these steps: 1. Copy this sample into a new folder outside of teams-ai 1. Select File > Open Folder in VS Code and choose this sample's directory 1. Using the extension, sign in with your Microsoft 365 account where you have permissions to upload custom apps -1. Ensure that you have set up the sample from the previous step. +1. Verify that the Teams Toolkit extension is connected to your Teams account from the above step. 1. Select **Debug > Start Debugging** or **F5** to run the app in a Teams web client. 1. In the browser that launches, select the **Add** button to install the app to Teams. diff --git a/js/samples/04.ai-apps/c.vision-cardGazer/README.md b/js/samples/04.ai-apps/c.vision-cardGazer/README.md index 54f270083..d24b20414 100644 --- a/js/samples/04.ai-apps/c.vision-cardGazer/README.md +++ b/js/samples/04.ai-apps/c.vision-cardGazer/README.md @@ -8,11 +8,11 @@ _Table of contents_ -- [Microsoft Teams Vision Enabled Bot : Card Gazer](#microsoft-teams-vision-enabled-bot--card-gazer) - - [Interacting with the bot](#interacting-with-the-bot) - - [Setting up the sample](#setting-up-the-sample) - - [Testing the sample](#testing-the-sample) - - [Using Teams Toolkit for Visual Studio Code](#using-teams-toolkit-for-visual-studio-code) +- [Microsoft Teams Vision Enabled Bot : Card Gazer](#microsoft-teams-vision-enabled-bot--card-gazer) + - [Interacting with the bot](#interacting-with-the-bot) + - [Setting up the sample](#setting-up-the-sample) + - [Testing the sample](#testing-the-sample) + - [Using Teams Toolkit for Visual Studio Code](#using-teams-toolkit-for-visual-studio-code) @@ -78,9 +78,9 @@ To use Teams Toolkit, continue following the directions below. If you are using Azure OpenAI then follow these steps: -- Comment the `SECRET_OPENAI_KEY` variable in the `./env/.env.local.user` file. -- Add your Azure OpenAI key and endpoint values to the `SECRET_AZURE_OPENAI_KEY` and `SECRET_AZURE_OPENAI_ENDPOINT` variables -- Open the `teamsapp.local.yml` file and modify the last step to use Azure OpenAI variables instead: +- Comment the `SECRET_OPENAI_KEY` variable in the `./env/.env.local.user` file. +- Add your Azure OpenAI key and endpoint values to the `SECRET_AZURE_OPENAI_KEY` and `SECRET_AZURE_OPENAI_ENDPOINT` variables +- Open the `teamsapp.local.yml` file and modify the last step to use Azure OpenAI variables instead: ```yml - uses: file/createOrUpdateEnvironmentFile @@ -94,8 +94,8 @@ If you are using Azure OpenAI then follow these steps: AZURE_OPENAI_ENDPOINT: ${{SECRET_AZURE_OPENAI_ENDPOINT}} ``` -- Open `./infra/azure.bicep` and comment out lines 72-75 and uncomment lines 76-83. -- Open `./infra/azure.parameters.json` and replace lines 20-22 with: +- Open `./infra/azure.bicep` and comment out lines 72-75 and uncomment lines 76-83. +- Open `./infra/azure.parameters.json` and replace lines 20-22 with: ```json "azureOpenAIKey": { @@ -111,7 +111,7 @@ If you are using Azure OpenAI then follow these steps: 1. Copy this sample into a new folder outside of teams-ai 1. Select File > Open Folder in VS Code and choose this sample's directory 1. Using the extension, sign in with your Microsoft 365 account where you have permissions to upload custom apps -1. Ensure that you have set up the sample from the previous step. +1. Verify that the Teams Toolkit extension is connected to your Teams account from the above step. 1. Select **Debug > Start Debugging** or **F5** to run the app in a Teams web client. 1. In the browser that launches, select the **Add** button to install the app to Teams. diff --git a/js/samples/04.ai-apps/d.assistants-mathBot/README.md b/js/samples/04.ai-apps/d.assistants-mathBot/README.md index ea7a7078f..c2a23e229 100644 --- a/js/samples/04.ai-apps/d.assistants-mathBot/README.md +++ b/js/samples/04.ai-apps/d.assistants-mathBot/README.md @@ -7,10 +7,10 @@ This example shows how to create a basic conversational experience using OpenAI' - [Math Tutor Assistant](#math-tutor-assistant) - - [Interacting with the bot](#interacting-with-the-bot) - - [Setting up the sample](#setting-up-the-sample) - - [Testing the sample](#testing-the-sample) - - [Using Teams Toolkit for Visual Studio Code](#using-teams-toolkit-for-visual-studio-code) + - [Interacting with the bot](#interacting-with-the-bot) + - [Setting up the sample](#setting-up-the-sample) + - [Testing the sample](#testing-the-sample) + - [Using Teams Toolkit for Visual Studio Code](#using-teams-toolkit-for-visual-studio-code) @@ -74,9 +74,9 @@ To use Teams Toolkit, continue following the directions below. If you are using OpenAI then follow these steps: -- Comment out the the `SECRET_AZURE_OPENAI_KEY` and `SECRET_AZURE_OPENAI_ENDPOINT` variables in the `./env/.env.local.user` file. -- Add your OpenAI key to the `SECRET_OPENAI_KEY` variable -- Open the `teamsapp.local.yml` file and modify the last step to use OpenAI variables instead. Be sure to comment out the Azure credentials: +- Comment out the the `SECRET_AZURE_OPENAI_KEY` and `SECRET_AZURE_OPENAI_ENDPOINT` variables in the `./env/.env.local.user` file. +- Add your OpenAI key to the `SECRET_OPENAI_KEY` variable +- Open the `teamsapp.local.yml` file and modify the last step to use OpenAI variables instead. Be sure to comment out the Azure credentials: ```yml - uses: file/createOrUpdateEnvironmentFile @@ -90,8 +90,8 @@ If you are using OpenAI then follow these steps: # AZURE_OPENAI_ENDPOINT: ${{SECRET_AZURE_OPENAI_ENDPOINT}} ``` -- Open `./infra/azure.bicep` and comment out lines 69-76 and uncomment lines 77-80. -- Open `./infra/azure.parameters.json` and replace lines 20-25 with: +- Open `./infra/azure.bicep` and comment out lines 69-76 and uncomment lines 77-80. +- Open `./infra/azure.parameters.json` and replace lines 20-25 with: ```json "openAIKey": { @@ -104,7 +104,7 @@ If you are using OpenAI then follow these steps: 3. Copy this sample into a new folder outside of teams-ai 4. Select File > Open Folder in VS Code and choose this sample's directory 5. Using the extension, sign in with your Microsoft 365 account where you have permissions to upload custom apps -6. Ensure that you have set up the sample from the previous step. +6. Verify that the Teams Toolkit extension is connected to your Teams account from the above step. 7. Select **Debug > Start Debugging** or **F5** to run the app in a Teams web client. 8. In the browser that launches, select the **Add** button to install the app to Teams. diff --git a/js/samples/04.ai-apps/e.assistants-orderBot/README.md b/js/samples/04.ai-apps/e.assistants-orderBot/README.md index 0ccc258d8..301c0118c 100644 --- a/js/samples/04.ai-apps/e.assistants-orderBot/README.md +++ b/js/samples/04.ai-apps/e.assistants-orderBot/README.md @@ -7,10 +7,10 @@ This example shows how to create a conversational assistant that uses tools to c - [Food Ordering Assistant](#food-ordering-assistant) - - [Interacting with the bot](#interacting-with-the-bot) - - [Setting up the sample](#setting-up-the-sample) - - [Testing the sample](#testing-the-sample) - - [Using Teams Toolkit for Visual Studio Code](#using-teams-toolkit-for-visual-studio-code) + - [Interacting with the bot](#interacting-with-the-bot) + - [Setting up the sample](#setting-up-the-sample) + - [Testing the sample](#testing-the-sample) + - [Using Teams Toolkit for Visual Studio Code](#using-teams-toolkit-for-visual-studio-code) @@ -74,9 +74,9 @@ To use Teams Toolkit, continue following the directions below. If you are using OpenAI then follow these steps: -- Comment the the `SECRET_AZURE_OPENAI_KEY` and `SECRET_AZURE_OPENAI_ENDPOINT` variables in the `./env/.env.local.user` file. -- Add your OpenAI key to the `SECRET_OPENAI_KEY` variable -- Open the `teamsapp.local.yml` file and modify the last step to use OpenAI variables instead. Be sure to comment out the Azure credentials: +- Comment the the `SECRET_AZURE_OPENAI_KEY` and `SECRET_AZURE_OPENAI_ENDPOINT` variables in the `./env/.env.local.user` file. +- Add your OpenAI key to the `SECRET_OPENAI_KEY` variable +- Open the `teamsapp.local.yml` file and modify the last step to use OpenAI variables instead. Be sure to comment out the Azure credentials: ```yml - uses: file/createOrUpdateEnvironmentFile @@ -90,8 +90,8 @@ If you are using OpenAI then follow these steps: # AZURE_OPENAI_ENDPOINT: ${{SECRET_AZURE_OPENAI_ENDPOINT}} ``` -- Open `./infra/azure.bicep` and comment out lines 69-76 and uncomment lines 77-80. -- Open `./infra/azure.parameters.json` and replace lines 20-25 with: +- Open `./infra/azure.bicep` and comment out lines 69-76 and uncomment lines 77-80. +- Open `./infra/azure.parameters.json` and replace lines 20-25 with: ```json "openAIKey": { @@ -104,7 +104,7 @@ If you are using OpenAI then follow these steps: 1. Copy this sample into a new folder outside of teams-ai 1. Select File > Open Folder in VS Code and choose this sample's directory 1. Using the extension, sign in with your Microsoft 365 account where you have permissions to upload custom apps -1. Ensure that you have set up the sample from the previous step. +1. Verify that the Teams Toolkit extension is connected to your Teams account from the above step. 1. Select **Debug > Start Debugging** or **F5** to run the app in a Teams web client. 1. In the browser that launches, select the **Add** button to install the app to Teams. diff --git a/js/samples/04.ai-apps/f.whoBot/README.md b/js/samples/04.ai-apps/f.whoBot/README.md index dc41e64fe..ad0b87828 100644 --- a/js/samples/04.ai-apps/f.whoBot/README.md +++ b/js/samples/04.ai-apps/f.whoBot/README.md @@ -4,11 +4,11 @@ This bot can tell you about your personal work-related information, who your man Note that this bot will only work in tenants where the following graph scopes are permitted: -- `User.Read` -- `User.ReadBasic.All` -- `People.Read` -- `Mail.Read` -- `Calendar.Read.Shared` +- `User.Read` +- `User.ReadBasic.All` +- `People.Read` +- `Mail.Read` +- `Calendar.Read.Shared` _Table of contents_ @@ -16,11 +16,11 @@ _Table of contents_ -- [Who Bot](#who-bot) - - [Interacting with the bot](#interacting-with-the-bot) - - [Setting up the sample](#setting-up-the-sample) - - [Testing the sample](#testing-the-sample) - - [Using Teams Toolkit for Visual Studio Code](#using-teams-toolkit-for-visual-studio-code) +- [Who Bot](#who-bot) + - [Interacting with the bot](#interacting-with-the-bot) + - [Setting up the sample](#setting-up-the-sample) + - [Testing the sample](#testing-the-sample) + - [Using Teams Toolkit for Visual Studio Code](#using-teams-toolkit-for-visual-studio-code) @@ -86,9 +86,9 @@ To use Teams Toolkit, continue following the directions below. If you are using Azure OpenAI then follow these steps: -- Comment the `SECRET_OPENAI_KEY` variable in the `./env/.env.local.user` file. -- Add your Azure OpenAI key and endpoint values to the `SECRET_AZURE_OPENAI_KEY` and `SECRET_AZURE_OPENAI_ENDPOINT` variables -- Open the `teamsapp.local.yml` file and modify the last step to use Azure OpenAI variables instead: +- Comment the `SECRET_OPENAI_KEY` variable in the `./env/.env.local.user` file. +- Add your Azure OpenAI key and endpoint values to the `SECRET_AZURE_OPENAI_KEY` and `SECRET_AZURE_OPENAI_ENDPOINT` variables +- Open the `teamsapp.local.yml` file and modify the last step to use Azure OpenAI variables instead: ```yml - uses: file/createOrUpdateEnvironmentFile @@ -102,8 +102,8 @@ If you are using Azure OpenAI then follow these steps: AZURE_OPENAI_ENDPOINT: ${{SECRET_AZURE_OPENAI_ENDPOINT}} ``` -- Open `./infra/azure.bicep` and comment out lines 72-75 and uncomment lines 76-83. -- Open `./infra/azure.parameters.json` and replace lines 20-22 with: +- Open `./infra/azure.bicep` and comment out lines 72-75 and uncomment lines 76-83. +- Open `./infra/azure.parameters.json` and replace lines 20-22 with: ```json "azureOpenAIKey": { @@ -119,7 +119,7 @@ If you are using Azure OpenAI then follow these steps: 1. Copy this sample into a new folder outside of teams-ai 1. Select File > Open Folder in VS Code and choose this sample's directory 1. Using the extension, sign in with your Microsoft 365 account where you have permissions to upload custom apps -1. Ensure that you have set up the sample from the previous step. +1. Verify that the Teams Toolkit extension is connected to your Teams account from the above step. 1. Select **Debug > Start Debugging** or **F5** to run the app in a Teams web client. 1. In the browser that launches, select the **Add** button to install the app to Teams. diff --git a/js/samples/04.ai-apps/g.datasource-azureAISearch/README.md b/js/samples/04.ai-apps/g.datasource-azureAISearch/README.md index a1e76858f..444217af3 100644 --- a/js/samples/04.ai-apps/g.datasource-azureAISearch/README.md +++ b/js/samples/04.ai-apps/g.datasource-azureAISearch/README.md @@ -6,13 +6,13 @@ The following is a conversational bot that is hooked on to GPT models but with c -- [Chat with Azure AI Search Data](#chat-with-azure-ai-search-data) - - [Summary](#summary) - - [Example Interaction](#example-interaction) - - [Observing the added context in the terminal](#observing-the-added-context-in-the-terminal) - - [Setting up the sample](#setting-up-the-sample) - - [Testing the sample](#testing-the-sample) - - [Using Teams Toolkit for Visual Studio Code](#using-teams-toolkit-for-visual-studio-code) +- [Chat with Azure AI Search Data](#chat-with-azure-ai-search-data) + - [Summary](#summary) + - [Example Interaction](#example-interaction) + - [Observing the added context in the terminal](#observing-the-added-context-in-the-terminal) + - [Setting up the sample](#setting-up-the-sample) + - [Testing the sample](#testing-the-sample) + - [Using Teams Toolkit for Visual Studio Code](#using-teams-toolkit-for-visual-studio-code) @@ -96,7 +96,7 @@ To use Teams Toolkit, continue following the directions below. 1. Copy this sample into a new folder outside of teams-ai 1. Select File > Open Folder in VS Code and choose this sample's directory 1. Using the extension, sign in with your Microsoft 365 account where you have permissions to upload custom apps -1. Ensure that you have set up the sample from the previous step. +1. Verify that the Teams Toolkit extension is connected to your Teams account from the above step. 1. Select **Debug > Start Debugging** or **F5** to run the app in a Teams web client. 1. In the browser that launches, select the **Add** button to install the app to Teams. diff --git a/js/samples/04.ai-apps/i.teamsChefBot-streaming/README.md b/js/samples/04.ai-apps/i.teamsChefBot-streaming/README.md index 1d03f6096..7d5d777f9 100644 --- a/js/samples/04.ai-apps/i.teamsChefBot-streaming/README.md +++ b/js/samples/04.ai-apps/i.teamsChefBot-streaming/README.md @@ -6,12 +6,12 @@ This is a conversational streaming bot for Microsoft Teams that thinks it's a Ch -- [Microsoft Teams Conversational Bot with AI: Teams Chef](#microsoft-teams-conversational-bot-with-ai-teams-chef) - - [Summary](#summary) - - [Setting up the sample](#setting-up-the-sample) - - [Testing the sample](#testing-the-sample) - - [Using Teams Toolkit for Visual Studio Code](#using-teams-toolkit-for-visual-studio-code) - - [Using Teams App test tool](#using-teams-app-test-tool) +- [Microsoft Teams Conversational Bot with AI: Teams Chef](#microsoft-teams-conversational-bot-with-ai-teams-chef) + - [Summary](#summary) + - [Setting up the sample](#setting-up-the-sample) + - [Testing the sample](#testing-the-sample) + - [Using Teams Toolkit for Visual Studio Code](#using-teams-toolkit-for-visual-studio-code) + - [Using Teams App test tool](#using-teams-app-test-tool) @@ -22,20 +22,22 @@ This sample illustrates how to use [Retrieval Augmented Generation (RAG)](https: The sample uses a local Vector Database, called [Vectra](https://github.com/Stevenic/vectra), and [Semantic Search](https://en.wikipedia.org/wiki/Semantic_search) to find the most relevant information to include in the prompt for the users input. The index can be found in `./index/teams-ai` and includes all of the projects Getting Started docs and the source code for the Teams AI Library. This means you can ask the Teams Chef Bot anything about the library and it can answer it. You can even ask it to write sample code for you! ## Streaming -In addition, the sample illustrates our streaming feature. + +In addition, the sample illustrates our streaming feature. The following configurations are needed: + - Use the `DefaultAugmentation` class - Set `stream: true` in the `OpenAIModel` declaration Optional additions: -- Set the informative message in the `ActionPlanner` declaration via the `startStreamingMessage` config. -- Set attachments in the final chunk via the `endStreamHandler` in the `ActionPlanner` declaration. - - Useful methods include - - `streamer.setAttachments([...attachments])` - - `streamer.getMessage()` +- Set the informative message in the `ActionPlanner` declaration via the `startStreamingMessage` config. +- Set attachments in the final chunk via the `endStreamHandler` in the `ActionPlanner` declaration. + - Useful methods include + - `streamer.setAttachments([...attachments])` + - `streamer.getMessage()` ```js const model = new OpenAIModel({ @@ -80,9 +82,9 @@ code . If you are using Azure OpenAI then follow these steps: -- Comment the `SECRET_OPENAI_KEY` variable in the `./env/.env.local.user` file. -- Add your Azure OpenAI key and endpoint values to the `SECRET_AZURE_OPENAI_KEY` and `SECRET_AZURE_OPENAI_ENDPOINT` variables. -- Open the `teamsapp.local.yml` file and modify the last step to use Azure OpenAI variables instead: +- Comment the `SECRET_OPENAI_KEY` variable in the `./env/.env.local.user` file. +- Add your Azure OpenAI key and endpoint values to the `SECRET_AZURE_OPENAI_KEY` and `SECRET_AZURE_OPENAI_ENDPOINT` variables. +- Open the `teamsapp.local.yml` file and modify the last step to use Azure OpenAI variables instead: ```yml - uses: file/createOrUpdateEnvironmentFile @@ -96,8 +98,8 @@ If you are using Azure OpenAI then follow these steps: AZURE_OPENAI_ENDPOINT: ${{SECRET_AZURE_OPENAI_ENDPOINT}} ``` -- Open `./infra/azure.bicep` and comment out lines 72-75 and uncomment lines 76-83. -- Open `./infra/azure.parameters.json` and replace lines 20-22 with: +- Open `./infra/azure.bicep` and comment out lines 72-75 and uncomment lines 76-83. +- Open `./infra/azure.parameters.json` and replace lines 20-22 with: ```json "azureOpenAIKey": { @@ -128,7 +130,7 @@ The simplest way to run this sample in Teams is to use Teams Toolkit for Visual 1. Copy this sample into a new folder outside of teams-ai 1. Select File > Open Folder in VS Code and choose this sample's directory 1. Using the extension, sign in with your Microsoft 365 account where you have permissions to upload custom apps -1. Ensure that you have set up the sample from the previous step. +1. Verify that the Teams Toolkit extension is connected to your Teams account from the above step. 1. Select **Debug > Start Debugging** or **F5** to run the app in a Teams web client. 1. In the browser that launches, select the **Add** button to install the app to Teams. @@ -145,17 +147,18 @@ If you are using Azure OpenAI then follow these steps: ```yml - uses: file/createOrUpdateEnvironmentFile with: - target: ./.localConfigs.testTool - envs: - TEAMSFX_NOTIFICATION_STORE_FILENAME: ${{TEAMSFX_NOTIFICATION_STORE_FILENAME}} - # OPENAI_KEY: ${{SECRET_OPENAI_KEY}} - AZURE_OPENAI_KEY: ${{SECRET_AZURE_OPENAI_KEY}} - AZURE_OPENAI_ENDPOINT: ${{SECRET_AZURE_OPENAI_ENDPOINT}} + target: ./.localConfigs.testTool + envs: + TEAMSFX_NOTIFICATION_STORE_FILENAME: ${{TEAMSFX_NOTIFICATION_STORE_FILENAME}} + # OPENAI_KEY: ${{SECRET_OPENAI_KEY}} + AZURE_OPENAI_KEY: ${{SECRET_AZURE_OPENAI_KEY}} + AZURE_OPENAI_ENDPOINT: ${{SECRET_AZURE_OPENAI_ENDPOINT}} ``` + 1. Ensure you have downloaded and installed [Visual Studio Code](https://code.visualstudio.com/docs/setup/setup-overview) 1. Install the [Teams Toolkit extension](https://marketplace.visualstudio.com/items?itemName=TeamsDevApp.ms-teams-vscode-extension) 1. Copy this sample into a new folder outside of teams-ai 1. Select File > Open Folder in VS Code and choose this sample's directory 1. From the left pane, select **Run and Debug**(Ctrl+Shift+D) and select **Debug in Test Tool** in dropdown list. 1. Select Debug > Start Debugging or F5 to run the app. -1. The browser will pop up to open Teams App Test Tool. \ No newline at end of file +1. The browser will pop up to open Teams App Test Tool. diff --git a/js/samples/05.authentication/a.oauth-adaptiveCard/README.md b/js/samples/05.authentication/a.oauth-adaptiveCard/README.md index 80a31f222..05088adaf 100644 --- a/js/samples/05.authentication/a.oauth-adaptiveCard/README.md +++ b/js/samples/05.authentication/a.oauth-adaptiveCard/README.md @@ -6,17 +6,17 @@ This sample requires creating an OAuth Connection in Azure Bot Service, which pr Note that this bot will only work in tenants where the following graph scopes are permitted: -- `User.Read` +- `User.Read` -- [Teams Adaptive Card SSO Bot](#teams-adaptive-card-sso-bot) - - [Interacting with the bot](#interacting-with-the-bot) - - [Setting up the sample](#setting-up-the-sample) - - [Testing the sample](#testing-the-sample) - - [Using Teams Toolkit for Visual Studio Code](#using-teams-toolkit-for-visual-studio-code) +- [Teams Adaptive Card SSO Bot](#teams-adaptive-card-sso-bot) + - [Interacting with the bot](#interacting-with-the-bot) + - [Setting up the sample](#setting-up-the-sample) + - [Testing the sample](#testing-the-sample) + - [Using Teams Toolkit for Visual Studio Code](#using-teams-toolkit-for-visual-studio-code) @@ -74,7 +74,7 @@ The simplest way to run this sample in Teams is to use Teams Toolkit for Visual 1. Copy this sample into a new folder outside of teams-ai 1. Select File > Open Folder in VS Code and choose this sample's directory 1. Using the extension, sign in with your Microsoft 365 account where you have permissions to upload custom apps -1. Ensure that you have set up the sample from the previous step. +1. Verify that the Teams Toolkit extension is connected to your Teams account from the above step. 1. Select **Debug > Start Debugging** or **F5** to run the app in a Teams web client. 1. In the browser that launches, select the **Add** button to install the app to Teams. diff --git a/js/samples/05.authentication/b.oauth-bot/README.md b/js/samples/05.authentication/b.oauth-bot/README.md index 7feb2852d..f4b51e574 100644 --- a/js/samples/05.authentication/b.oauth-bot/README.md +++ b/js/samples/05.authentication/b.oauth-bot/README.md @@ -6,17 +6,17 @@ This sample requires creating an OAuth Connection in Azure Bot Service, which pr Note that this bot will only work in tenants where the following graph scopes are permitted: -- `User.Read` +- `User.Read` -- [OAuth Bot](#oauth-bot) - - [Interacting with the bot](#interacting-with-the-bot) - - [Setting up the sample](#setting-up-the-sample) - - [Testing the sample](#testing-the-sample) - - [Using Teams Toolkit for Visual Studio Code](#using-teams-toolkit-for-visual-studio-code) +- [OAuth Bot](#oauth-bot) + - [Interacting with the bot](#interacting-with-the-bot) + - [Setting up the sample](#setting-up-the-sample) + - [Testing the sample](#testing-the-sample) + - [Using Teams Toolkit for Visual Studio Code](#using-teams-toolkit-for-visual-studio-code) @@ -78,7 +78,7 @@ The simplest way to run this sample in Teams is to use Teams Toolkit for Visual 1. Copy this sample into a new folder outside of teams-ai 1. Select File > Open Folder in VS Code and choose this sample's directory 1. Using the extension, sign in with your Microsoft 365 account where you have permissions to upload custom apps -1. Ensure that you have set up the sample from the previous step. +1. Verify that the Teams Toolkit extension is connected to your Teams account from the above step. 1. Select **Debug > Start Debugging** or **F5** to run the app in a Teams web client. 1. In the browser that launches, select the **Add** button to install the app to Teams. diff --git a/js/samples/05.authentication/c.oauth-messageExtension/README.md b/js/samples/05.authentication/c.oauth-messageExtension/README.md index 74a4901b1..43224e50d 100644 --- a/js/samples/05.authentication/c.oauth-messageExtension/README.md +++ b/js/samples/05.authentication/c.oauth-messageExtension/README.md @@ -6,17 +6,17 @@ This sample requires creating an OAuth Connection in Azure Bot Service, which pr Note that this bot will only work in tenants where the following graph scopes are permitted: -- `User.Read` +- `User.Read` -- [Teams Message Extension SSO Bot](#teams-message-extension-sso-bot) - - [Interacting with the bot](#interacting-with-the-bot) - - [Setting up the sample](#setting-up-the-sample) - - [Testing the sample](#testing-the-sample) - - [Using Teams Toolkit for Visual Studio Code](#using-teams-toolkit-for-visual-studio-code) +- [Teams Message Extension SSO Bot](#teams-message-extension-sso-bot) + - [Interacting with the bot](#interacting-with-the-bot) + - [Setting up the sample](#setting-up-the-sample) + - [Testing the sample](#testing-the-sample) + - [Using Teams Toolkit for Visual Studio Code](#using-teams-toolkit-for-visual-studio-code) @@ -32,7 +32,6 @@ Note that this bot will only work in tenants where the following graph scopes ar git clone https://github.com/Microsoft/teams-ai.git ``` - > [!IMPORTANT] > To prevent issues when installing dependencies after cloning the repo, copy or move the sample directory to it's own location first. @@ -84,7 +83,7 @@ The simplest way to run this sample in Teams is to use Teams Toolkit for Visual 1. Copy this sample into a new folder outside of teams-ai 1. Select File > Open Folder in VS Code and choose this sample's directory 1. Using the extension, sign in with your Microsoft 365 account where you have permissions to upload custom apps -1. Ensure that you have set up the sample from the previous step. +1. Verify that the Teams Toolkit extension is connected to your Teams account from the above step. 1. Select **Debug > Start Debugging** or **F5** to run the app in a Teams web client. 1. In the browser that launches, select the **Add** button to install the app to Teams. diff --git a/js/samples/05.authentication/d.teamsSSO-bot/README.md b/js/samples/05.authentication/d.teamsSSO-bot/README.md index d7d2abac4..37a6687ac 100644 --- a/js/samples/05.authentication/d.teamsSSO-bot/README.md +++ b/js/samples/05.authentication/d.teamsSSO-bot/README.md @@ -6,10 +6,10 @@ This sample depends on Teams SSO and gives you more flexibility on how to config ## Showcase -- The bot echos back any message it receives. That's it! -- This app is the bot-equivalent of 'Hello world'. -- The minimum setup shows how to set up a bot with the Teams AI SDK. -- This sample leverages Teams SSO to acquire a token for app user. +- The bot echos back any message it receives. That's it! +- This app is the bot-equivalent of 'Hello world'. +- The minimum setup shows how to set up a bot with the Teams AI SDK. +- This sample leverages Teams SSO to acquire a token for app user. ## Setting up the sample @@ -70,7 +70,7 @@ The simplest way to run this sample in Teams is to use Teams Toolkit for Visual 1. Copy this sample into a new folder outside of teams-ai 1. Select File > Open Folder in VS Code and choose this sample's directory 1. Using the extension, sign in with your Microsoft 365 account where you have permissions to upload custom apps -1. Ensure that you have set up the sample from the previous step. +1. Verify that the Teams Toolkit extension is connected to your Teams account from the above step. 1. Select **Debug > Start Debugging** or **F5** to run the app in a Teams web client. 1. In the browser that launches, select the **Add** button to install the app to Teams. @@ -86,13 +86,13 @@ This sample is configured to work only in the tenant in which the Azure app regi ``` 1. Navigate to the `teamsapp.local.yml` file and set ```yml - signInAudience: "AzureADMultipleOrgs" # Authenticate users with a Microsoft work or school account in your organization's Azure AD tenant (for example, single tenant). + signInAudience: 'AzureADMultipleOrgs' # Authenticate users with a Microsoft work or school account in your organization's Azure AD tenant (for example, single tenant). ``` 1. Navigate to the `src/auth-start.html` page and set ```js let authorizeEndpoint = `https://login.microsoftonline.com/common/oauth2/v2.0/authorize?${toQueryString(queryParams)}`; ``` -2. Navigate to the `src/index.ts` file and on line 81 set +1. Navigate to the `src/index.ts` file and on line 81 set ```js - authority: `${process.env.AAD_APP_OAUTH_AUTHORITY_HOST}/common` - ``` \ No newline at end of file + authority: `${process.env.AAD_APP_OAUTH_AUTHORITY_HOST}/common`; + ``` diff --git a/js/samples/05.authentication/e.teamsSSO-messageExtension/README.md b/js/samples/05.authentication/e.teamsSSO-messageExtension/README.md index dc8448911..fabd54558 100644 --- a/js/samples/05.authentication/e.teamsSSO-messageExtension/README.md +++ b/js/samples/05.authentication/e.teamsSSO-messageExtension/README.md @@ -6,9 +6,9 @@ This sample depends on Teams SSO and gives you more flexibility on how to config ## Showcase -- Message Extensions are convenient ways to add functionality to Teams. -- This sample adds a search command to the compose area of a chat. -- This sample leverages Teams SSO to acquire a token to call Microsoft Graph APIs. +- Message Extensions are convenient ways to add functionality to Teams. +- This sample adds a search command to the compose area of a chat. +- This sample leverages Teams SSO to acquire a token to call Microsoft Graph APIs. > Note: this is not a chat bot and therefore the bot does not respond if you talk to it. Once it is installed in Teams, you can interact with it by selecting it's app icon in the chat compose area. @@ -53,7 +53,7 @@ The simplest way to run this sample in Teams is to use Teams Toolkit for Visual 1. Install the [Teams Toolkit extension](https://marketplace.visualstudio.com/items?itemName=TeamsDevApp.ms-teams-vscode-extension) 1. Select **File > Open Folder** in VS Code and choose this sample's directory from the repo 1. Using the extension, sign in with your Microsoft 365 account where you have permissions to upload custom apps -1. Ensure that you have set up the sample from the previous step. +1. Verify that the Teams Toolkit extension is connected to your Teams account from the above step. 1. Select **Debug > Start Debugging** or **F5** to run the app in a Teams web client. 1. In the browser that launches, select the **Add** button to install the app to Teams. diff --git a/python/samples/01.messaging.a.echoBot/README.md b/python/samples/01.messaging.a.echoBot/README.md index 46ad5eb16..32068150d 100644 --- a/python/samples/01.messaging.a.echoBot/README.md +++ b/python/samples/01.messaging.a.echoBot/README.md @@ -22,9 +22,9 @@ You can interact with the bot by messaging it and it will echo that back to you. 1. Clone the repository - ```bash - git clone https://github.com/Microsoft/teams-ai.git - ``` + ```bash + git clone https://github.com/Microsoft/teams-ai.git + ``` 1. Follow below instructions to run the sample @@ -37,7 +37,7 @@ The easiest and fastest way to get up and running is with Teams Toolkit as your Otherwise, if you only want to run the bot locally and build manually, please jump to the [BotFramework Emulator](../README.md#testing-in-botframework-emulator) section. For different ways to test a sample see: [Multiple ways to test](../README.md#multiple-ways-to-test) -### Using Teams Toolkit for Visual Studio Code +### Using Teams Toolkit for Visual Studio Code The simplest way to run this sample in Teams is to use Teams Toolkit for Visual Studio Code. @@ -47,9 +47,9 @@ The simplest way to run this sample in Teams is to use Teams Toolkit for Visual 1. Install [Poetry](https://python-poetry.org/docs/#installation) 1. Select **File > Open Folder** in VS Code and choose this sample's directory from the repo 1. Using the extension, sign in with your Microsoft 365 account where you have permissions to upload custom apps -1. Ensure that you have set up the sample from the previous step. -1. Trigger **Python: Create Environment** from command palette and create a virtual environment +1. Verify that the Teams Toolkit extension is connected to your Teams account from the above step. +1. In the debugger, play the Debug (Edge) script 1. Select **Debug > Start Debugging** or **F5** to run the app in a Teams web client. 1. In the browser that launches, select the **Add** button to install the app to Teams. -> If you do not have permission to upload custom apps (sideloading), Teams Toolkit will recommend creating and using a Microsoft 365 Developer Program account - a free program to get your own dev environment sandbox that includes Teams. \ No newline at end of file +> If you do not have permission to upload custom apps (sideloading), Teams Toolkit will recommend creating and using a Microsoft 365 Developer Program account - a free program to get your own dev environment sandbox that includes Teams. diff --git a/python/samples/02.messageExtensions.a.searchCommand/README.md b/python/samples/02.messageExtensions.a.searchCommand/README.md index 03c98e504..17b5ba7f4 100644 --- a/python/samples/02.messageExtensions.a.searchCommand/README.md +++ b/python/samples/02.messageExtensions.a.searchCommand/README.md @@ -6,18 +6,18 @@ This sample shows how to incorporate a basic Message Extension app into a Micros -- [Teams Search Command Message Extension](#teams-search-command-message-extension) - - [Interacting with the bot](#interacting-with-the-bot) - - [Setting up the sample](#setting-up-the-sample) - - [Testing the sample](#testing-the-sample) - - [Using Teams Toolkit for Visual Studio Code](#using-teams-toolkit-for-visual-studio-code) +- [Teams Search Command Message Extension](#teams-search-command-message-extension) + - [Interacting with the bot](#interacting-with-the-bot) + - [Setting up the sample](#setting-up-the-sample) + - [Testing the sample](#testing-the-sample) + - [Using Teams Toolkit for Visual Studio Code](#using-teams-toolkit-for-visual-studio-code) ## Interacting with the bot -- Message Extensions are convenient ways to add functionality to Teams. -- This sample adds a search command to the compose area of a chat. +- Message Extensions are convenient ways to add functionality to Teams. +- This sample adds a search command to the compose area of a chat. > Note: this is not a chat bot and therefore the bot does not respond if you talk to it. Once it is installed in Teams, you can interact with it by selecting it's app icon in the chat compose area. @@ -25,9 +25,9 @@ This sample shows how to incorporate a basic Message Extension app into a Micros 1. Clone the repository - ```bash - git clone https://github.com/Microsoft/teams-ai.git - ``` + ```bash + git clone https://github.com/Microsoft/teams-ai.git + ``` ## Testing the sample @@ -36,7 +36,7 @@ The easiest and fastest way to get up and running is with Teams Toolkit as your Otherwise, if you only want to run the bot locally and build manually, please jump to the [BotFramework Emulator](../README.md#testing-in-botframework-emulator) section. For different ways to test a sample see: [Multiple ways to test](../README.md#multiple-ways-to-test) -### Using Teams Toolkit for Visual Studio Code +### Using Teams Toolkit for Visual Studio Code The simplest way to run this sample in Teams is to use Teams Toolkit for Visual Studio Code. @@ -46,9 +46,9 @@ The simplest way to run this sample in Teams is to use Teams Toolkit for Visual 4. Install [Poetry](https://python-poetry.org/docs/#installation) 5. Select **File > Open Folder** in VS Code and choose this sample's directory from the repo 6. Using the extension, sign in with your Microsoft 365 account where you have permissions to upload custom apps -7. Ensure that you have set up the sample from the previous step. -8. Trigger **Python: Create Environment** from command palette and create a virtual environment +7. Verify that the Teams Toolkit extension is connected to your Teams account from the above step. +8. In the debugger, play the Debug (Edge) script 9. Select **Debug > Start Debugging** or **F5** to run the app in a Teams web client. 10. In the browser that launches, select the **Add** button to install the app to Teams. -> If you do not have permission to upload custom apps (sideloading), Teams Toolkit will recommend creating and using a Microsoft 365 Developer Program account - a free program to get your own dev environment sandbox that includes Teams. \ No newline at end of file +> If you do not have permission to upload custom apps (sideloading), Teams Toolkit will recommend creating and using a Microsoft 365 Developer Program account - a free program to get your own dev environment sandbox that includes Teams. diff --git a/python/samples/03.adaptiveCards.a.typeAheadBot/README.md b/python/samples/03.adaptiveCards.a.typeAheadBot/README.md index 58cda6038..d0c071f9f 100644 --- a/python/samples/03.adaptiveCards.a.typeAheadBot/README.md +++ b/python/samples/03.adaptiveCards.a.typeAheadBot/README.md @@ -6,11 +6,11 @@ This sample shows how to incorporate Adaptive Cards into a Microsoft Teams appli -- [Teams Type-Ahead Bot](#teams-type-ahead-bot) - - [Interacting with the bot](#interacting-with-the-bot) - - [Setting up the sample](#setting-up-the-sample) - - [Testing the sample](#testing-the-sample) - - [Using Teams Toolkit for Visual Studio Code](#using-teams-toolkit-for-visual-studio-code) +- [Teams Type-Ahead Bot](#teams-type-ahead-bot) + - [Interacting with the bot](#interacting-with-the-bot) + - [Setting up the sample](#setting-up-the-sample) + - [Testing the sample](#testing-the-sample) + - [Using Teams Toolkit for Visual Studio Code](#using-teams-toolkit-for-visual-studio-code) @@ -24,9 +24,9 @@ You can interact with this bot by sending it a message. Send it a message of `st 1. Clone the repository - ```bash - git clone https://github.com/Microsoft/teams-ai.git - ``` + ```bash + git clone https://github.com/Microsoft/teams-ai.git + ``` ## Testing the sample @@ -35,7 +35,7 @@ The easiest and fastest way to get up and running is with Teams Toolkit as your Otherwise, if you only want to run the bot locally and build manually, please jump to the [BotFramework Emulator](../README.md#testing-in-botframework-emulator) section. For different ways to test a sample see: [Multiple ways to test](../README.md#multiple-ways-to-test) -### Using Teams Toolkit for Visual Studio Code +### Using Teams Toolkit for Visual Studio Code The simplest way to run this sample in Teams is to use Teams Toolkit for Visual Studio Code. @@ -45,9 +45,9 @@ The simplest way to run this sample in Teams is to use Teams Toolkit for Visual 4. Install [Poetry](https://python-poetry.org/docs/#installation) 5. Select **File > Open Folder** in VS Code and choose this sample's directory from the repo 6. Using the extension, sign in with your Microsoft 365 account where you have permissions to upload custom apps -7. Ensure that you have set up the sample from the previous step. -8. Trigger **Python: Create Environment** from command palette and create a virtual environment +7. Verify that the Teams Toolkit extension is connected to your Teams account from the above step. +8. In the debugger, play the Debug (Edge) script 9. Select **Debug > Start Debugging** or **F5** to run the app in a Teams web client. 10. In the browser that launches, select the **Add** button to install the app to Teams. -> If you do not have permission to upload custom apps (sideloading), Teams Toolkit will recommend creating and using a Microsoft 365 Developer Program account - a free program to get your own dev environment sandbox that includes Teams. \ No newline at end of file +> If you do not have permission to upload custom apps (sideloading), Teams Toolkit will recommend creating and using a Microsoft 365 Developer Program account - a free program to get your own dev environment sandbox that includes Teams. diff --git a/python/samples/04.ai.a.twentyQuestions/README.md b/python/samples/04.ai.a.twentyQuestions/README.md index d4adb9896..5af04641d 100644 --- a/python/samples/04.ai.a.twentyQuestions/README.md +++ b/python/samples/04.ai.a.twentyQuestions/README.md @@ -22,11 +22,11 @@ You can interact with the bot by asking questions to lead towards the secret wor 1. Clone the repository - ```bash - git clone https://github.com/Microsoft/teams-ai.git - ``` + ```bash + git clone https://github.com/Microsoft/teams-ai.git + ``` -2. Duplicate the `sample.env` in the `teams-ai/python/samples/04.ai.a.twentyQuestions` folder. Rename the file to `.env`. +2. Duplicate the `sample.env` in the `teams-ai/python/samples/04.ai.a.twentyQuestions` folder. Rename the file to `.env`. 3. If you are using OpenAI then only keep the `OPENAI_KEY` and add in your key. Otherwise if you are using AzureOpenAI then only keep the `AZURE_OPENAI_KEY`, `AZURE_OPENAI_ENDPOINT` variables and fill them in appropriately. @@ -39,7 +39,7 @@ The easiest and fastest way to get up and running is with Teams Toolkit as your Otherwise, if you only want to run the bot locally and build manually, please jump to the [BotFramework Emulator](../README.md#testing-in-botframework-emulator) section. For different ways to test a sample see: [Multiple ways to test](../README.md#multiple-ways-to-test) -### Using Teams Toolkit for Visual Studio Code +### Using Teams Toolkit for Visual Studio Code The simplest way to run this sample in Teams is to use Teams Toolkit for Visual Studio Code. @@ -49,9 +49,9 @@ The simplest way to run this sample in Teams is to use Teams Toolkit for Visual 4. Install [Poetry](https://python-poetry.org/docs/#installation) 5. Select **File > Open Folder** in VS Code and choose this sample's directory from the repo 6. Using the extension, sign in with your Microsoft 365 account where you have permissions to upload custom apps -7. Ensure that you have set up the sample from the previous step. -8. Trigger **Python: Create Environment** from command palette and create a virtual environment +7. Verify that the Teams Toolkit extension is connected to your Teams account from the above step. +8. In the debugger, play the Debug (Edge) script 9. Select **Debug > Start Debugging** or **F5** to run the app in a Teams web client. 10. In the browser that launches, select the **Add** button to install the app to Teams. -> If you do not have permission to upload custom apps (sideloading), Teams Toolkit will recommend creating and using a Microsoft 365 Developer Program account - a free program to get your own dev environment sandbox that includes Teams. \ No newline at end of file +> If you do not have permission to upload custom apps (sideloading), Teams Toolkit will recommend creating and using a Microsoft 365 Developer Program account - a free program to get your own dev environment sandbox that includes Teams. diff --git a/python/samples/04.ai.b.messageExtensions.AI-ME/README.md b/python/samples/04.ai.b.messageExtensions.AI-ME/README.md index b295cee03..f9ab24760 100644 --- a/python/samples/04.ai.b.messageExtensions.AI-ME/README.md +++ b/python/samples/04.ai.b.messageExtensions.AI-ME/README.md @@ -1,4 +1,5 @@ # AI in Microsoft Teams Message Extensions: GPT-ME + This sample is a message extension (ME) for Microsoft Teams that leverages the text-davinci-003 model to help users generate and update posts. The extension is designed to assist users in creating posts that are appropriate for a business environment. @@ -21,11 +22,11 @@ This sample illustrates basic ME behavior in Microsoft Teams. The ME is built to 1. Clone the repository - ```bash - git clone https://github.com/Microsoft/teams-ai.git - ``` + ```bash + git clone https://github.com/Microsoft/teams-ai.git + ``` -2. Duplicate the `sample.env` in the `teams-ai/python/samples/04.ai.b.messageExtensions.AI-ME` folder. Rename the file to `.env`. +2. Duplicate the `sample.env` in the `teams-ai/python/samples/04.ai.b.messageExtensions.AI-ME` folder. Rename the file to `.env`. 3. If you are using OpenAI then only keep the `OPENAI_KEY` and add in your key. Otherwise if you are using AzureOpenAI then only keep the `AZURE_OPENAI_KEY`, `AZURE_OPENAI_ENDPOINT`variables and fill them in appropriately. @@ -38,7 +39,7 @@ The easiest and fastest way to get up and running is with Teams Toolkit as your Otherwise, if you only want to run the bot locally and build manually, please jump to the [BotFramework Emulator](../README.md#testing-in-botframework-emulator) section. For different ways to test a sample see: [Multiple ways to test](../README.md#multiple-ways-to-test) -### Using Teams Toolkit for Visual Studio Code +### Using Teams Toolkit for Visual Studio Code The simplest way to run this sample in Teams is to use Teams Toolkit for Visual Studio Code. @@ -48,9 +49,9 @@ The simplest way to run this sample in Teams is to use Teams Toolkit for Visual 1. Install [Poetry](https://python-poetry.org/docs/#installation) 1. Select **File > Open Folder** in VS Code and choose this sample's directory from the repo 1. Using the extension, sign in with your Microsoft 365 account where you have permissions to upload custom apps -1. Ensure that you have set up the sample from the previous step. -1. Trigger **Python: Create Environment** from command palette and create a virtual environment +1. Verify that the Teams Toolkit extension is connected to your Teams account from the above step. +1. In the debugger, play the Debug (Edge) script 1. Select **Debug > Start Debugging** or **F5** to run the app in a Teams web client. 1. In the browser that launches, select the **Add** button to install the app to Teams. -> If you do not have permission to upload custom apps (sideloading), Teams Toolkit will recommend creating and using a Microsoft 365 Developer Program account - a free program to get your own dev environment sandbox that includes Teams. \ No newline at end of file +> If you do not have permission to upload custom apps (sideloading), Teams Toolkit will recommend creating and using a Microsoft 365 Developer Program account - a free program to get your own dev environment sandbox that includes Teams. diff --git a/python/samples/04.ai.c.actionMapping.lightBot/README.md b/python/samples/04.ai.c.actionMapping.lightBot/README.md index 54f03ccbc..21360dea9 100644 --- a/python/samples/04.ai.c.actionMapping.lightBot/README.md +++ b/python/samples/04.ai.c.actionMapping.lightBot/README.md @@ -24,11 +24,11 @@ You can interact with the bot by messaging it. 1. Clone the repository - ```bash - git clone https://github.com/Microsoft/teams-ai.git - ``` + ```bash + git clone https://github.com/Microsoft/teams-ai.git + ``` -2. Duplicate the `sample.env` in the `teams-ai/python/samples/04.ai.c.actionMapping.lightBot` folder. Rename the file to `.env`. +2. Duplicate the `sample.env` in the `teams-ai/python/samples/04.ai.c.actionMapping.lightBot` folder. Rename the file to `.env`. 3. If you are using OpenAI then only keep the `OPENAI_KEY` and add in your key. Otherwise if you are using AzureOpenAI then only keep the `AZURE_OPENAI_KEY`, `AZURE_OPENAI_ENDPOINT` variables and fill them in appropriately. @@ -41,7 +41,7 @@ The easiest and fastest way to get up and running is with Teams Toolkit as your Otherwise, if you only want to run the bot locally and build manually, please jump to the [BotFramework Emulator](../README.md#testing-in-botframework-emulator) section. For different ways to test a sample see: [Multiple ways to test](../README.md#multiple-ways-to-test) -### Using Teams Toolkit for Visual Studio Code +### Using Teams Toolkit for Visual Studio Code The simplest way to run this sample in Teams is to use Teams Toolkit for Visual Studio Code. @@ -51,9 +51,9 @@ The simplest way to run this sample in Teams is to use Teams Toolkit for Visual 4. Install [Poetry](https://python-poetry.org/docs/#installation) 5. Select **File > Open Folder** in VS Code and choose this sample's directory from the repo 6. Using the extension, sign in with your Microsoft 365 account where you have permissions to upload custom apps -7. Ensure that you have set up the sample from the previous step. -8. Trigger **Python: Create Environment** from command palette and create a virtual environment +7. Verify that the Teams Toolkit extension is connected to your Teams account from the above step. +8. In the debugger, play the Debug (Edge) script 9. Select **Debug > Start Debugging** or **F5** to run the app in a Teams web client. 10. In the browser that launches, select the **Add** button to install the app to Teams. -> If you do not have permission to upload custom apps (sideloading), Teams Toolkit will recommend creating and using a Microsoft 365 Developer Program account - a free program to get your own dev environment sandbox that includes Teams. \ No newline at end of file +> If you do not have permission to upload custom apps (sideloading), Teams Toolkit will recommend creating and using a Microsoft 365 Developer Program account - a free program to get your own dev environment sandbox that includes Teams. diff --git a/python/samples/04.ai.d.chainedActions.listBot/README.md b/python/samples/04.ai.d.chainedActions.listBot/README.md index fb2373b92..26192b928 100644 --- a/python/samples/04.ai.d.chainedActions.listBot/README.md +++ b/python/samples/04.ai.d.chainedActions.listBot/README.md @@ -22,11 +22,11 @@ You can interact with the bot by asking for a summary of the list, adding new it 1. Clone the repository - ```bash - git clone https://github.com/Microsoft/teams-ai.git - ``` + ```bash + git clone https://github.com/Microsoft/teams-ai.git + ``` -2. Duplicate the `sample.env` in the `teams-ai/python/samples/04.ai.d.chainedActions.listBot` folder. Rename the file to `.env`. +2. Duplicate the `sample.env` in the `teams-ai/python/samples/04.ai.d.chainedActions.listBot` folder. Rename the file to `.env`. 3. If you are using OpenAI then only keep the `OPENAI_KEY` and add in your key. Otherwise if you are using AzureOpenAI then only keep the `AZURE_OPENAI_KEY`, `AZURE_OPENAI_ENDPOINT` variables and fill them in appropriately. @@ -39,7 +39,7 @@ The easiest and fastest way to get up and running is with Teams Toolkit as your Otherwise, if you only want to run the bot locally and build manually, please jump to the [BotFramework Emulator](../README.md#testing-in-botframework-emulator) section. For different ways to test a sample see: [Multiple ways to test](../README.md#multiple-ways-to-test) -### Using Teams Toolkit for Visual Studio Code +### Using Teams Toolkit for Visual Studio Code The simplest way to run this sample in Teams is to use Teams Toolkit for Visual Studio Code. @@ -49,9 +49,9 @@ The simplest way to run this sample in Teams is to use Teams Toolkit for Visual 4. Install [Poetry](https://python-poetry.org/docs/#installation) 5. Select **File > Open Folder** in VS Code and choose this sample's directory from the repo 6. Using the extension, sign in with your Microsoft 365 account where you have permissions to upload custom apps -7. Ensure that you have set up the sample from the previous step. -8. Trigger **Python: Create Environment** from command palette and create a virtual environment +7. Verify that the Teams Toolkit extension is connected to your Teams account from the above step. +8. In the debugger, play the Debug (Edge) script 9. Select **Debug > Start Debugging** or **F5** to run the app in a Teams web client. 10. In the browser that launches, select the **Add** button to install the app to Teams. -> If you do not have permission to upload custom apps (sideloading), Teams Toolkit will recommend creating and using a Microsoft 365 Developer Program account - a free program to get your own dev environment sandbox that includes Teams. \ No newline at end of file +> If you do not have permission to upload custom apps (sideloading), Teams Toolkit will recommend creating and using a Microsoft 365 Developer Program account - a free program to get your own dev environment sandbox that includes Teams. diff --git a/python/samples/04.ai.e.chainedActions.devOpsBot/README.md b/python/samples/04.ai.e.chainedActions.devOpsBot/README.md index db6d8fb59..bb021c382 100644 --- a/python/samples/04.ai.e.chainedActions.devOpsBot/README.md +++ b/python/samples/04.ai.e.chainedActions.devOpsBot/README.md @@ -20,23 +20,23 @@ You can interact with this bot by sending it a message. The bot will respond to 1. **create work item to track new functionality in Adaptive card and assign it to John** -- **Result:** The bot will create a tracking item in Azure DevOps and assign it to John -- **Valid Scopes:** personal, group chat, team chat +- **Result:** The bot will create a tracking item in Azure DevOps and assign it to John +- **Valid Scopes:** personal, group chat, team chat 2. **update title of work item 1 to create a new bot in azure** -- **Result:** The bot will update the title of work item 1 to create a new bot in azure. -- **Valid Scopes:** personal, group chat, team chat +- **Result:** The bot will update the title of work item 1 to create a new bot in azure. +- **Valid Scopes:** personal, group chat, team chat 3. **triage work item 1 as "in progress"** -- **Result:** The bot will update the state of work item 1 to "in progress". -- **Valid Scopes:** personal, group chat, team chat +- **Result:** The bot will update the state of work item 1 to "in progress". +- **Valid Scopes:** personal, group chat, team chat 4. **summarize work items"** -- **Result:** The bot will summarize the work items and respond back with an adaptive card. -- **Valid Scopes:** personal, group chat, team chat +- **Result:** The bot will summarize the work items and respond back with an adaptive card. +- **Valid Scopes:** personal, group chat, team chat You can select an option from the command list by typing `@TeamsConversationBot` into the compose message area and `What can I do?` text above the compose area. @@ -44,11 +44,11 @@ You can select an option from the command list by typing `@TeamsConversationBot` 1. Clone the repository - ```bash - git clone https://github.com/Microsoft/teams-ai.git - ``` + ```bash + git clone https://github.com/Microsoft/teams-ai.git + ``` -2. Duplicate the `sample.env` in the `teams-ai/python/samples/04.ai.e.chainedActions.devOpsBot` folder. Rename the file to `.env`. +2. Duplicate the `sample.env` in the `teams-ai/python/samples/04.ai.e.chainedActions.devOpsBot` folder. Rename the file to `.env`. 3. If you are using OpenAI then only keep the `OPENAI_KEY` and add in your key. Otherwise if you are using AzureOpenAI then only keep the `AZURE_OPENAI_KEY`, `AZURE_OPENAI_ENDPOINT` variables and fill them in appropriately. @@ -61,7 +61,7 @@ The easiest and fastest way to get up and running is with Teams Toolkit as your Otherwise, if you only want to run the bot locally and build manually, please jump to the [BotFramework Emulator](../README.md#testing-in-botframework-emulator) section. For different ways to test a sample see: [Multiple ways to test](../README.md#multiple-ways-to-test) -### Using Teams Toolkit for Visual Studio Code +### Using Teams Toolkit for Visual Studio Code The simplest way to run this sample in Teams is to use Teams Toolkit for Visual Studio Code. @@ -71,9 +71,9 @@ The simplest way to run this sample in Teams is to use Teams Toolkit for Visual 4. Install [Poetry](https://python-poetry.org/docs/#installation) 5. Select **File > Open Folder** in VS Code and choose this sample's directory from the repo 6. Using the extension, sign in with your Microsoft 365 account where you have permissions to upload custom apps -7. Ensure that you have set up the sample from the previous step. -8. Trigger **Python: Create Environment** from command palette and create a virtual environment +7. Verify that the Teams Toolkit extension is connected to your Teams account from the above step. +8. In the debugger, play the Debug (Edge) script 9. Select **Debug > Start Debugging** or **F5** to run the app in a Teams web client. 10. In the browser that launches, select the **Add** button to install the app to Teams. -> If you do not have permission to upload custom apps (sideloading), Teams Toolkit will recommend creating and using a Microsoft 365 Developer Program account - a free program to get your own dev environment sandbox that includes Teams. \ No newline at end of file +> If you do not have permission to upload custom apps (sideloading), Teams Toolkit will recommend creating and using a Microsoft 365 Developer Program account - a free program to get your own dev environment sandbox that includes Teams. diff --git a/python/samples/04.ai.f.dataSource.azureOpenAI/README.md b/python/samples/04.ai.f.dataSource.azureOpenAI/README.md index 3927d591e..800a83a50 100644 --- a/python/samples/04.ai.f.dataSource.azureOpenAI/README.md +++ b/python/samples/04.ai.f.dataSource.azureOpenAI/README.md @@ -58,7 +58,7 @@ The Azure OpenAI OYD configuration can be added to the prompt templates `config. "authentication": { "type": 'system_assigned_managed_identity' } - } + } } ] }, @@ -94,7 +94,7 @@ async def get_default_prompt(context: TurnContext, state: AppTurnState, planner: "authentication": { "type": 'system_assigned_managed_identity' } - } + } } ] @@ -118,17 +118,16 @@ ActionPlannerOptions(model=model, prompts=prompts, default_prompt=get_default_pr 1. Clone the repository - ```bash - git clone https://github.com/Microsoft/teams-ai.git - ``` + ```bash + git clone https://github.com/Microsoft/teams-ai.git + ``` -2. Duplicate the `sample.env` in the `teams-ai/python/samples/04.ai.f.dataSource.azureOpenAI` folder. Rename the file to `.env`. +2. Duplicate the `sample.env` in the `teams-ai/python/samples/04.ai.f.dataSource.azureOpenAI` folder. Rename the file to `.env`. 3. Fill the `AZURE_OPENAI_ENDPOINT`, `AZURE_SEARCH_ENDPOINT`, and `AZURE_SEARCH_INDEX` variables appropriately. 4. Follow the [use your data quickstart instructions](https://learn.microsoft.com/en-us/azure/ai-services/openai/use-your-data-quickstart?tabs=command-line%2Cpython-new&pivots=programming-language-studio#add-your-data-using-azure-openai-studio) to add your data using Azure OpenAI Studio. Select `Upload files` as the data source. You can upload the `nba.pdf` file. Take note of the index name. - ## Testing the sample The easiest and fastest way to get up and running is with Teams Toolkit as your development guide. To use Teams Toolkit to automate setup and debugging, please [continue below](#using-teams-toolkit-for-visual-studio-code). @@ -136,7 +135,7 @@ The easiest and fastest way to get up and running is with Teams Toolkit as your Otherwise, if you only want to run the bot locally and build manually, please jump to the [BotFramework Emulator](../README.md#testing-in-botframework-emulator) section. For different ways to test a sample see: [Multiple ways to test](../README.md#multiple-ways-to-test) -### Using Teams Toolkit for Visual Studio Code +### Using Teams Toolkit for Visual Studio Code The simplest way to run this sample in Teams is to use Teams Toolkit for Visual Studio Code. @@ -147,8 +146,8 @@ The simplest way to run this sample in Teams is to use Teams Toolkit for Visual 1. Install [Poetry](https://python-poetry.org/docs/#installation) 1. Select **File > Open Folder** in VS Code and choose this sample's directory from the repo 1. Using the extension, sign in with your Microsoft 365 account where you have permissions to upload custom apps -1. Ensure that you have set up the sample from the previous step. -1. Trigger **Python: Create Environment** from command palette and create a virtual environment +1. Verify that the Teams Toolkit extension is connected to your Teams account from the above step. +1. In the debugger, play the Debug (Edge) script 1. Select **Debug > Start Debugging** or **F5** to run the app in a Teams web client. 1. In the browser that launches, select the **Add** button to install the app to Teams. diff --git a/python/samples/04.ai.g.autogen.product-spec-critique/README.md b/python/samples/04.ai.g.autogen.product-spec-critique/README.md index 8d5917be7..ccdf4b3a4 100644 --- a/python/samples/04.ai.g.autogen.product-spec-critique/README.md +++ b/python/samples/04.ai.g.autogen.product-spec-critique/README.md @@ -1,9 +1,10 @@ ## Teams Autogen Bot This is a simple project that demonstrates the use of [autogen](https://github.com/microsoft/autogen) in the context of a Microsoft Teams AI bot. -This bot models a product-spec critiquing team. +This bot models a product-spec critiquing team. The team consists of: + 1. A questioner agent - the role of this agent is to ask questions based on some criteria for product specs at a company. 2. An answerer agent - the role of this agent is to answer the questions asked by the questioner agent based on a product spec 3. An evaluator agent - the role of this agent is to evaluate the answers given by the answerer agent based on the criteria given by the questioner agent. @@ -32,11 +33,11 @@ You can interact with the bot by messaging it. 1. Clone the repository - ```bash - git clone https://github.com/Microsoft/teams-ai.git - ``` + ```bash + git clone https://github.com/Microsoft/teams-ai.git + ``` -2. Duplicate the `sample.env` in the `teams-ai/python/samples/04.ai.g.autogen.product-spec-critique` folder. Rename the file to `.env`. +2. Duplicate the `sample.env` in the `teams-ai/python/samples/04.ai.g.autogen.product-spec-critique` folder. Rename the file to `.env`. 3. Update .env. Make sure it includes either `OPENAI_KEY` or `AZURE_OPENAI_API_KEY` with `AZURE_OPENAI_ENDPOINT`. If you look for `build_llm_config` in the code, you will see how it builds the config for the model. You may need to modify it to suit your needs. @@ -47,7 +48,7 @@ The easiest and fastest way to get up and running is with Teams Toolkit as your Otherwise, if you only want to run the bot locally and build manually, please jump to the [Bot Framework Emulator](../README.md#testing-in-botframework-emulator) section. For different ways to test a sample see: [Multiple ways to test](../README.md#multiple-ways-to-test) -### Using Teams Toolkit for Visual Studio Code +### Using Teams Toolkit for Visual Studio Code The simplest way to run this sample in Teams is to use Teams Toolkit for Visual Studio Code. @@ -57,8 +58,8 @@ The simplest way to run this sample in Teams is to use Teams Toolkit for Visual 4. Install [Poetry](https://python-poetry.org/docs/#installation) 5. Select **File > Open Folder** in VS Code and choose this sample's directory from the repo 6. Using the extension, sign in with your Microsoft 365 account where you have permissions to upload custom apps -7. Ensure that you have set up the sample from the previous step. -8. Trigger **Python: Create Environment** from command palette and create a virtual environment +7. Verify that the Teams Toolkit extension is connected to your Teams account from the above step. +8. In the debugger, play the Debug (Edge) script 9. Select **Debug > Start Debugging** or **F5** to run the app in a Teams web client. 10. In the browser that launches, select the **Add** button to install the app to Teams. diff --git a/python/samples/04.ai.h.chainedActions.listBot-streaming/README.md b/python/samples/04.ai.h.chainedActions.listBot-streaming/README.md index fb2373b92..26192b928 100644 --- a/python/samples/04.ai.h.chainedActions.listBot-streaming/README.md +++ b/python/samples/04.ai.h.chainedActions.listBot-streaming/README.md @@ -22,11 +22,11 @@ You can interact with the bot by asking for a summary of the list, adding new it 1. Clone the repository - ```bash - git clone https://github.com/Microsoft/teams-ai.git - ``` + ```bash + git clone https://github.com/Microsoft/teams-ai.git + ``` -2. Duplicate the `sample.env` in the `teams-ai/python/samples/04.ai.d.chainedActions.listBot` folder. Rename the file to `.env`. +2. Duplicate the `sample.env` in the `teams-ai/python/samples/04.ai.d.chainedActions.listBot` folder. Rename the file to `.env`. 3. If you are using OpenAI then only keep the `OPENAI_KEY` and add in your key. Otherwise if you are using AzureOpenAI then only keep the `AZURE_OPENAI_KEY`, `AZURE_OPENAI_ENDPOINT` variables and fill them in appropriately. @@ -39,7 +39,7 @@ The easiest and fastest way to get up and running is with Teams Toolkit as your Otherwise, if you only want to run the bot locally and build manually, please jump to the [BotFramework Emulator](../README.md#testing-in-botframework-emulator) section. For different ways to test a sample see: [Multiple ways to test](../README.md#multiple-ways-to-test) -### Using Teams Toolkit for Visual Studio Code +### Using Teams Toolkit for Visual Studio Code The simplest way to run this sample in Teams is to use Teams Toolkit for Visual Studio Code. @@ -49,9 +49,9 @@ The simplest way to run this sample in Teams is to use Teams Toolkit for Visual 4. Install [Poetry](https://python-poetry.org/docs/#installation) 5. Select **File > Open Folder** in VS Code and choose this sample's directory from the repo 6. Using the extension, sign in with your Microsoft 365 account where you have permissions to upload custom apps -7. Ensure that you have set up the sample from the previous step. -8. Trigger **Python: Create Environment** from command palette and create a virtual environment +7. Verify that the Teams Toolkit extension is connected to your Teams account from the above step. +8. In the debugger, play the Debug (Edge) script 9. Select **Debug > Start Debugging** or **F5** to run the app in a Teams web client. 10. In the browser that launches, select the **Add** button to install the app to Teams. -> If you do not have permission to upload custom apps (sideloading), Teams Toolkit will recommend creating and using a Microsoft 365 Developer Program account - a free program to get your own dev environment sandbox that includes Teams. \ No newline at end of file +> If you do not have permission to upload custom apps (sideloading), Teams Toolkit will recommend creating and using a Microsoft 365 Developer Program account - a free program to get your own dev environment sandbox that includes Teams. diff --git a/python/samples/05.chatModeration/README.md b/python/samples/05.chatModeration/README.md index 4f87897be..abf572b99 100644 --- a/python/samples/05.chatModeration/README.md +++ b/python/samples/05.chatModeration/README.md @@ -22,11 +22,11 @@ You can interact with the bot by messaging it. 1. Clone the repository - ```bash - git clone https://github.com/Microsoft/teams-ai.git - ``` + ```bash + git clone https://github.com/Microsoft/teams-ai.git + ``` -2. Duplicate the `sample.env` in the `teams-ai/python/samples/05.chatModeration` folder. Rename the file to `.env`. +2. Duplicate the `sample.env` in the `teams-ai/python/samples/05.chatModeration` folder. Rename the file to `.env`. 3. If you are using OpenAI then only keep the `OPENAI_KEY` and add in your key. Otherwise if you are using AzureOpenAI then only keep the `AZURE_OPENAI_KEY`, `AZURE_OPENAI_ENDPOINT`, `AZURE_CONTENT_SAFETY_KEY`, and `AZURE_CONTENT_SAFETY_ENDPOINT` variables and fill them in appropriately. @@ -39,7 +39,7 @@ The easiest and fastest way to get up and running is with Teams Toolkit as your Otherwise, if you only want to run the bot locally and build manually, please jump to the [BotFramework Emulator](../README.md#testing-in-botframework-emulator) section. For different ways to test a sample see: [Multiple ways to test](../README.md#multiple-ways-to-test) -### Using Teams Toolkit for Visual Studio Code +### Using Teams Toolkit for Visual Studio Code The simplest way to run this sample in Teams is to use Teams Toolkit for Visual Studio Code. @@ -49,9 +49,9 @@ The simplest way to run this sample in Teams is to use Teams Toolkit for Visual 4. Install [Poetry](https://python-poetry.org/docs/#installation) 5. Select **File > Open Folder** in VS Code and choose this sample's directory from the repo 6. Using the extension, sign in with your Microsoft 365 account where you have permissions to upload custom apps -8. Ensure that you have set up the sample from the previous step. -9. Trigger **Python: Create Environment** from command palette and create a virtual environment -10. Select **Debug > Start Debugging** or **F5** to run the app in a Teams web client. -11. In the browser that launches, select the **Add** button to install the app to Teams. +7. Verify that the Teams Toolkit extension is connected to your Teams account from the above step. +8. In the debugger, play the Debug (Edge) script +9. Select **Debug > Start Debugging** or **F5** to run the app in a Teams web client. +10. In the browser that launches, select the **Add** button to install the app to Teams. -> If you do not have permission to upload custom apps (sideloading), Teams Toolkit will recommend creating and using a Microsoft 365 Developer Program account - a free program to get your own dev environment sandbox that includes Teams. \ No newline at end of file +> If you do not have permission to upload custom apps (sideloading), Teams Toolkit will recommend creating and using a Microsoft 365 Developer Program account - a free program to get your own dev environment sandbox that includes Teams. diff --git a/python/samples/06.assistants.a.mathBot/README.md b/python/samples/06.assistants.a.mathBot/README.md index f5a36242b..d0d7d289c 100644 --- a/python/samples/06.assistants.a.mathBot/README.md +++ b/python/samples/06.assistants.a.mathBot/README.md @@ -22,11 +22,11 @@ You can interact with the bot by messaging it. 1. Clone the repository - ```bash - git clone https://github.com/Microsoft/teams-ai.git - ``` + ```bash + git clone https://github.com/Microsoft/teams-ai.git + ``` -2. Duplicate the `sample.env` in the `teams-ai/python/samples/06.assistants.a.mathBot` folder. Rename the file to `.env`. +2. Duplicate the `sample.env` in the `teams-ai/python/samples/06.assistants.a.mathBot` folder. Rename the file to `.env`. 3. If you are using OpenAI then only keep the `OPENAI_KEY` and add in your key. Otherwise if you are using AzureOpenAI then only keep the `AZURE_OPENAI_KEY`, `AZURE_OPENAI_ENDPOINT` variables and fill them in appropriately. @@ -41,7 +41,7 @@ The easiest and fastest way to get up and running is with Teams Toolkit as your Otherwise, if you only want to run the bot locally and build manually, please jump to the [BotFramework Emulator](../README.md#testing-in-botframework-emulator) section. For different ways to test a sample see: [Multiple ways to test](../README.md#multiple-ways-to-test) -### Using Teams Toolkit for Visual Studio Code +### Using Teams Toolkit for Visual Studio Code The simplest way to run this sample in Teams is to use Teams Toolkit for Visual Studio Code. @@ -51,9 +51,9 @@ The simplest way to run this sample in Teams is to use Teams Toolkit for Visual 4. Install [Poetry](https://python-poetry.org/docs/#installation) 5. Select **File > Open Folder** in VS Code and choose this sample's directory from the repo 6. Using the extension, sign in with your Microsoft 365 account where you have permissions to upload custom apps -7. Ensure that you have set up the sample from the previous step. -8. Trigger **Python: Create Environment** from command palette and create a virtual environment +7. Verify that the Teams Toolkit extension is connected to your Teams account from the above step. +8. In the debugger, play the Debug (Edge) script 9. Select **Debug > Start Debugging** or **F5** to run the app in a Teams web client. 10. In the browser that launches, select the **Add** button to install the app to Teams. -> If you do not have permission to upload custom apps (sideloading), Teams Toolkit will recommend creating and using a Microsoft 365 Developer Program account - a free program to get your own dev environment sandbox that includes Teams. \ No newline at end of file +> If you do not have permission to upload custom apps (sideloading), Teams Toolkit will recommend creating and using a Microsoft 365 Developer Program account - a free program to get your own dev environment sandbox that includes Teams. diff --git a/python/samples/06.assistants.b.orderBot/README.md b/python/samples/06.assistants.b.orderBot/README.md index 11f5f3eac..f4dee3c85 100644 --- a/python/samples/06.assistants.b.orderBot/README.md +++ b/python/samples/06.assistants.b.orderBot/README.md @@ -22,11 +22,11 @@ You can interact with this bot by sending it a message, and the bot will reply t 1. Clone the repository - ```bash - git clone https://github.com/Microsoft/teams-ai.git - ``` + ```bash + git clone https://github.com/Microsoft/teams-ai.git + ``` -2. Duplicate the `sample.env` in the `teams-ai/python/samples/06.assistants.b.orderBot` folder. Rename the file to `.env`. +2. Duplicate the `sample.env` in the `teams-ai/python/samples/06.assistants.b.orderBot` folder. Rename the file to `.env`. 3. If you are using OpenAI then only keep the `OPENAI_KEY` and add in your key. Otherwise if you are using AzureOpenAI then only keep the `AZURE_OPENAI_KEY`, `AZURE_OPENAI_ENDPOINT` variables and fill them in appropriately. @@ -41,7 +41,7 @@ The easiest and fastest way to get up and running is with Teams Toolkit as your Otherwise, if you only want to run the bot locally and build manually, please jump to the [BotFramework Emulator](../README.md#testing-in-botframework-emulator) section. For different ways to test a sample see: [Multiple ways to test](../README.md#multiple-ways-to-test) -### Using Teams Toolkit for Visual Studio Code +### Using Teams Toolkit for Visual Studio Code The simplest way to run this sample in Teams is to use Teams Toolkit for Visual Studio Code. @@ -51,9 +51,9 @@ The simplest way to run this sample in Teams is to use Teams Toolkit for Visual 4. Install [Poetry](https://python-poetry.org/docs/#installation) 5. Select **File > Open Folder** in VS Code and choose this sample's directory from the repo 6. Using the extension, sign in with your Microsoft 365 account where you have permissions to upload custom apps -7. Ensure that you have set up the sample from the previous step. -8. Trigger **Python: Create Environment** from command palette and create a virtual environment +7. Verify that the Teams Toolkit extension is connected to your Teams account from the above step. +8. In the debugger, play the Debug (Edge) script 9. Select **Debug > Start Debugging** or **F5** to run the app in a Teams web client. 10. In the browser that launches, select the **Add** button to install the app to Teams. -> If you do not have permission to upload custom apps (sideloading), Teams Toolkit will recommend creating and using a Microsoft 365 Developer Program account - a free program to get your own dev environment sandbox that includes Teams. \ No newline at end of file +> If you do not have permission to upload custom apps (sideloading), Teams Toolkit will recommend creating and using a Microsoft 365 Developer Program account - a free program to get your own dev environment sandbox that includes Teams. diff --git a/python/samples/06.auth.oauth.bot/README.md b/python/samples/06.auth.oauth.bot/README.md index 56d06d923..acbcacac7 100644 --- a/python/samples/06.auth.oauth.bot/README.md +++ b/python/samples/06.auth.oauth.bot/README.md @@ -6,17 +6,17 @@ This sample requires creating an OAuth Connection in Azure Bot Service, which pr Note that this bot will only work in tenants where the following graph scopes are permitted: -- `User.Read` +- `User.Read` -- [OAuth Bot](#oauth-bot) - - [Interacting with the bot](#interacting-with-the-bot) - - [Setting up the sample](#setting-up-the-sample) - - [Testing the sample](#testing-the-sample) - - [Using Teams Toolkit for Visual Studio Code](#using-teams-toolkit-for-visual-studio-code) +- [OAuth Bot](#oauth-bot) + - [Interacting with the bot](#interacting-with-the-bot) + - [Setting up the sample](#setting-up-the-sample) + - [Testing the sample](#testing-the-sample) + - [Using Teams Toolkit for Visual Studio Code](#using-teams-toolkit-for-visual-studio-code) @@ -24,14 +24,13 @@ Note that this bot will only work in tenants where the following graph scopes ar You can interact with this bot by sending it a message, which will echo back to you. - ## Setting up the sample 1. Clone the repository - ```bash - git clone https://github.com/Microsoft/teams-ai.git - ``` + ```bash + git clone https://github.com/Microsoft/teams-ai.git + ``` 2. Duplicate the `sample.env`. Rename the file to .env and fill in the variables with your keys. @@ -44,7 +43,7 @@ The easiest and fastest way to get up and running is with Teams Toolkit as your Otherwise, if you only want to run the bot locally and build manually, please jump to the [BotFramework Emulator](../README.md#testing-in-botframework-emulator) section. For different ways to test a sample see: [Multiple ways to test](../README.md#multiple-ways-to-test) -### Using Teams Toolkit for Visual Studio Code +### Using Teams Toolkit for Visual Studio Code The simplest way to run this sample in Teams is to use Teams Toolkit for Visual Studio Code. @@ -54,8 +53,8 @@ The simplest way to run this sample in Teams is to use Teams Toolkit for Visual 1. Install [Poetry](https://python-poetry.org/docs/#installation) 1. Select **File > Open Folder** in VS Code and choose this sample's directory from the repo 1. Using the extension, sign in with your Microsoft 365 account where you have permissions to upload custom apps -1. Ensure that you have set up the sample from the previous step. -1. Trigger **Python: Create Environment** from command palette and create a virtual environment +1. Ensure that you are showing as logged in in the sample window. +1. In the debugger, play the Debug (Edge) script 1. Select **Debug > Start Debugging** or **F5** to run the app in a Teams web client. 1. In the browser that launches, select the **Add** button to install the app to Teams. diff --git a/python/samples/06.auth.oauth.bot/poetry.lock b/python/samples/06.auth.oauth.bot/poetry.lock index bde8763eb..51d17e974 100644 --- a/python/samples/06.auth.oauth.bot/poetry.lock +++ b/python/samples/06.auth.oauth.bot/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.8.4 and should not be changed by hand. [[package]] name = "aiohttp" @@ -1017,6 +1017,91 @@ files = [ [package.extras] colors = ["colorama (>=0.4.6)"] +[[package]] +name = "jiter" +version = "0.8.2" +description = "Fast iterable JSON parser." +optional = false +python-versions = ">=3.8" +files = [ + {file = "jiter-0.8.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:ca8577f6a413abe29b079bc30f907894d7eb07a865c4df69475e868d73e71c7b"}, + {file = "jiter-0.8.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b25bd626bde7fb51534190c7e3cb97cee89ee76b76d7585580e22f34f5e3f393"}, + {file = "jiter-0.8.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d5c826a221851a8dc028eb6d7d6429ba03184fa3c7e83ae01cd6d3bd1d4bd17d"}, + {file = "jiter-0.8.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d35c864c2dff13dfd79fb070fc4fc6235d7b9b359efe340e1261deb21b9fcb66"}, + {file = "jiter-0.8.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f557c55bc2b7676e74d39d19bcb8775ca295c7a028246175d6a8b431e70835e5"}, + {file = "jiter-0.8.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:580ccf358539153db147e40751a0b41688a5ceb275e6f3e93d91c9467f42b2e3"}, + {file = "jiter-0.8.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:af102d3372e917cffce49b521e4c32c497515119dc7bd8a75665e90a718bbf08"}, + {file = "jiter-0.8.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:cadcc978f82397d515bb2683fc0d50103acff2a180552654bb92d6045dec2c49"}, + {file = "jiter-0.8.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:ba5bdf56969cad2019d4e8ffd3f879b5fdc792624129741d3d83fc832fef8c7d"}, + {file = "jiter-0.8.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:3b94a33a241bee9e34b8481cdcaa3d5c2116f575e0226e421bed3f7a6ea71cff"}, + {file = "jiter-0.8.2-cp310-cp310-win32.whl", hash = "sha256:6e5337bf454abddd91bd048ce0dca5134056fc99ca0205258766db35d0a2ea43"}, + {file = "jiter-0.8.2-cp310-cp310-win_amd64.whl", hash = "sha256:4a9220497ca0cb1fe94e3f334f65b9b5102a0b8147646118f020d8ce1de70105"}, + {file = "jiter-0.8.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:2dd61c5afc88a4fda7d8b2cf03ae5947c6ac7516d32b7a15bf4b49569a5c076b"}, + {file = "jiter-0.8.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a6c710d657c8d1d2adbbb5c0b0c6bfcec28fd35bd6b5f016395f9ac43e878a15"}, + {file = "jiter-0.8.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a9584de0cd306072635fe4b89742bf26feae858a0683b399ad0c2509011b9dc0"}, + {file = "jiter-0.8.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5a90a923338531b7970abb063cfc087eebae6ef8ec8139762007188f6bc69a9f"}, + {file = "jiter-0.8.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d21974d246ed0181558087cd9f76e84e8321091ebfb3a93d4c341479a736f099"}, + {file = "jiter-0.8.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:32475a42b2ea7b344069dc1e81445cfc00b9d0e3ca837f0523072432332e9f74"}, + {file = "jiter-0.8.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b9931fd36ee513c26b5bf08c940b0ac875de175341cbdd4fa3be109f0492586"}, + {file = "jiter-0.8.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ce0820f4a3a59ddced7fce696d86a096d5cc48d32a4183483a17671a61edfddc"}, + {file = "jiter-0.8.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:8ffc86ae5e3e6a93765d49d1ab47b6075a9c978a2b3b80f0f32628f39caa0c88"}, + {file = "jiter-0.8.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5127dc1abd809431172bc3fbe8168d6b90556a30bb10acd5ded41c3cfd6f43b6"}, + {file = "jiter-0.8.2-cp311-cp311-win32.whl", hash = "sha256:66227a2c7b575720c1871c8800d3a0122bb8ee94edb43a5685aa9aceb2782d44"}, + {file = "jiter-0.8.2-cp311-cp311-win_amd64.whl", hash = "sha256:cde031d8413842a1e7501e9129b8e676e62a657f8ec8166e18a70d94d4682855"}, + {file = "jiter-0.8.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:e6ec2be506e7d6f9527dae9ff4b7f54e68ea44a0ef6b098256ddf895218a2f8f"}, + {file = "jiter-0.8.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:76e324da7b5da060287c54f2fabd3db5f76468006c811831f051942bf68c9d44"}, + {file = "jiter-0.8.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:180a8aea058f7535d1c84183c0362c710f4750bef66630c05f40c93c2b152a0f"}, + {file = "jiter-0.8.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:025337859077b41548bdcbabe38698bcd93cfe10b06ff66617a48ff92c9aec60"}, + {file = "jiter-0.8.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ecff0dc14f409599bbcafa7e470c00b80f17abc14d1405d38ab02e4b42e55b57"}, + {file = "jiter-0.8.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ffd9fee7d0775ebaba131f7ca2e2d83839a62ad65e8e02fe2bd8fc975cedeb9e"}, + {file = "jiter-0.8.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:14601dcac4889e0a1c75ccf6a0e4baf70dbc75041e51bcf8d0e9274519df6887"}, + {file = "jiter-0.8.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:92249669925bc1c54fcd2ec73f70f2c1d6a817928480ee1c65af5f6b81cdf12d"}, + {file = "jiter-0.8.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:e725edd0929fa79f8349ab4ec7f81c714df51dc4e991539a578e5018fa4a7152"}, + {file = "jiter-0.8.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:bf55846c7b7a680eebaf9c3c48d630e1bf51bdf76c68a5f654b8524335b0ad29"}, + {file = "jiter-0.8.2-cp312-cp312-win32.whl", hash = "sha256:7efe4853ecd3d6110301665a5178b9856be7e2a9485f49d91aa4d737ad2ae49e"}, + {file = "jiter-0.8.2-cp312-cp312-win_amd64.whl", hash = "sha256:83c0efd80b29695058d0fd2fa8a556490dbce9804eac3e281f373bbc99045f6c"}, + {file = "jiter-0.8.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:ca1f08b8e43dc3bd0594c992fb1fd2f7ce87f7bf0d44358198d6da8034afdf84"}, + {file = "jiter-0.8.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5672a86d55416ccd214c778efccf3266b84f87b89063b582167d803246354be4"}, + {file = "jiter-0.8.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:58dc9bc9767a1101f4e5e22db1b652161a225874d66f0e5cb8e2c7d1c438b587"}, + {file = "jiter-0.8.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:37b2998606d6dadbb5ccda959a33d6a5e853252d921fec1792fc902351bb4e2c"}, + {file = "jiter-0.8.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4ab9a87f3784eb0e098f84a32670cfe4a79cb6512fd8f42ae3d0709f06405d18"}, + {file = "jiter-0.8.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:79aec8172b9e3c6d05fd4b219d5de1ac616bd8da934107325a6c0d0e866a21b6"}, + {file = "jiter-0.8.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:711e408732d4e9a0208008e5892c2966b485c783cd2d9a681f3eb147cf36c7ef"}, + {file = "jiter-0.8.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:653cf462db4e8c41995e33d865965e79641ef45369d8a11f54cd30888b7e6ff1"}, + {file = "jiter-0.8.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:9c63eaef32b7bebac8ebebf4dabebdbc6769a09c127294db6babee38e9f405b9"}, + {file = "jiter-0.8.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:eb21aaa9a200d0a80dacc7a81038d2e476ffe473ffdd9c91eb745d623561de05"}, + {file = "jiter-0.8.2-cp313-cp313-win32.whl", hash = "sha256:789361ed945d8d42850f919342a8665d2dc79e7e44ca1c97cc786966a21f627a"}, + {file = "jiter-0.8.2-cp313-cp313-win_amd64.whl", hash = "sha256:ab7f43235d71e03b941c1630f4b6e3055d46b6cb8728a17663eaac9d8e83a865"}, + {file = "jiter-0.8.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:b426f72cd77da3fec300ed3bc990895e2dd6b49e3bfe6c438592a3ba660e41ca"}, + {file = "jiter-0.8.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b2dd880785088ff2ad21ffee205e58a8c1ddabc63612444ae41e5e4b321b39c0"}, + {file = "jiter-0.8.2-cp313-cp313t-win_amd64.whl", hash = "sha256:3ac9f578c46f22405ff7f8b1f5848fb753cc4b8377fbec8470a7dc3997ca7566"}, + {file = "jiter-0.8.2-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:9e1fa156ee9454642adb7e7234a383884452532bc9d53d5af2d18d98ada1d79c"}, + {file = "jiter-0.8.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:0cf5dfa9956d96ff2efb0f8e9c7d055904012c952539a774305aaaf3abdf3d6c"}, + {file = "jiter-0.8.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e52bf98c7e727dd44f7c4acb980cb988448faeafed8433c867888268899b298b"}, + {file = "jiter-0.8.2-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a2ecaa3c23e7a7cf86d00eda3390c232f4d533cd9ddea4b04f5d0644faf642c5"}, + {file = "jiter-0.8.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:08d4c92bf480e19fc3f2717c9ce2aa31dceaa9163839a311424b6862252c943e"}, + {file = "jiter-0.8.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:99d9a1eded738299ba8e106c6779ce5c3893cffa0e32e4485d680588adae6db8"}, + {file = "jiter-0.8.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d20be8b7f606df096e08b0b1b4a3c6f0515e8dac296881fe7461dfa0fb5ec817"}, + {file = "jiter-0.8.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d33f94615fcaf872f7fd8cd98ac3b429e435c77619777e8a449d9d27e01134d1"}, + {file = "jiter-0.8.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:317b25e98a35ffec5c67efe56a4e9970852632c810d35b34ecdd70cc0e47b3b6"}, + {file = "jiter-0.8.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:fc9043259ee430ecd71d178fccabd8c332a3bf1e81e50cae43cc2b28d19e4cb7"}, + {file = "jiter-0.8.2-cp38-cp38-win32.whl", hash = "sha256:fc5adda618205bd4678b146612ce44c3cbfdee9697951f2c0ffdef1f26d72b63"}, + {file = "jiter-0.8.2-cp38-cp38-win_amd64.whl", hash = "sha256:cd646c827b4f85ef4a78e4e58f4f5854fae0caf3db91b59f0d73731448a970c6"}, + {file = "jiter-0.8.2-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:e41e75344acef3fc59ba4765df29f107f309ca9e8eace5baacabd9217e52a5ee"}, + {file = "jiter-0.8.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:7f22b16b35d5c1df9dfd58843ab2cd25e6bf15191f5a236bed177afade507bfc"}, + {file = "jiter-0.8.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f7200b8f7619d36aa51c803fd52020a2dfbea36ffec1b5e22cab11fd34d95a6d"}, + {file = "jiter-0.8.2-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:70bf4c43652cc294040dbb62256c83c8718370c8b93dd93d934b9a7bf6c4f53c"}, + {file = "jiter-0.8.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f9d471356dc16f84ed48768b8ee79f29514295c7295cb41e1133ec0b2b8d637d"}, + {file = "jiter-0.8.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:859e8eb3507894093d01929e12e267f83b1d5f6221099d3ec976f0c995cb6bd9"}, + {file = "jiter-0.8.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eaa58399c01db555346647a907b4ef6d4f584b123943be6ed5588c3f2359c9f4"}, + {file = "jiter-0.8.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8f2d5ed877f089862f4c7aacf3a542627c1496f972a34d0474ce85ee7d939c27"}, + {file = "jiter-0.8.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:03c9df035d4f8d647f8c210ddc2ae0728387275340668fb30d2421e17d9a0841"}, + {file = "jiter-0.8.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8bd2a824d08d8977bb2794ea2682f898ad3d8837932e3a74937e93d62ecbb637"}, + {file = "jiter-0.8.2-cp39-cp39-win32.whl", hash = "sha256:ca29b6371ebc40e496995c94b988a101b9fbbed48a51190a4461fcb0a68b4a36"}, + {file = "jiter-0.8.2-cp39-cp39-win_amd64.whl", hash = "sha256:1c0dfbd1be3cbefc7510102370d86e35d1d53e5a93d48519688b1bf0f761160a"}, + {file = "jiter-0.8.2.tar.gz", hash = "sha256:cd73d3e740666d0e639f678adb176fad25c1bcbdae88d8d7b857e1783bb4212d"}, +] + [[package]] name = "jsonpickle" version = "1.4.2" @@ -1373,23 +1458,24 @@ signedtoken = ["cryptography (>=3.0.0)", "pyjwt (>=2.0.0,<3)"] [[package]] name = "openai" -version = "1.35.10" +version = "1.57.1" description = "The official Python library for the openai API" optional = false -python-versions = ">=3.7.1" +python-versions = ">=3.8" files = [ - {file = "openai-1.35.10-py3-none-any.whl", hash = "sha256:962cb5c23224b5cbd16078308dabab97a08b0a5ad736a4fdb3dc2ffc44ac974f"}, - {file = "openai-1.35.10.tar.gz", hash = "sha256:85966949f4f960f3e4b239a659f9fd64d3a97ecc43c44dc0a044b5c7f11cccc6"}, + {file = "openai-1.57.1-py3-none-any.whl", hash = "sha256:3865686c927e93492d1145938d4a24b634951531c4b2769d43ca5dbd4b25d8fd"}, + {file = "openai-1.57.1.tar.gz", hash = "sha256:a95f22e04ab3df26e64a15d958342265e802314131275908b3b3e36f8c5d4377"}, ] [package.dependencies] anyio = ">=3.5.0,<5" distro = ">=1.7.0,<2" httpx = ">=0.23.0,<1" +jiter = ">=0.4.0,<1" pydantic = ">=1.9.0,<3" sniffio = "*" tqdm = ">4" -typing-extensions = ">=4.7,<5" +typing-extensions = ">=4.11,<5" [package.extras] datalib = ["numpy (>=1)", "pandas (>=1.2.3)", "pandas-stubs (>=1.1.0.11)"] @@ -2138,13 +2224,13 @@ files = [ [[package]] name = "teams-ai" -version = "1.2.2" +version = "1.5.0" description = "SDK focused on building AI based applications for Microsoft Teams." optional = false python-versions = "<4.0,>=3.8" files = [ - {file = "teams_ai-1.2.2-py3-none-any.whl", hash = "sha256:1914b5dccf12385a8aa493e10ea02a81555afa174d73fd10ecfd501541753ab3"}, - {file = "teams_ai-1.2.2.tar.gz", hash = "sha256:0eba0002735f412a0d101a3b2044c227ceebe3641744b1f48ad07e236dd8a3b4"}, + {file = "teams_ai-1.5.0-py3-none-any.whl", hash = "sha256:7bbf16244ef0471329fafe89a21bf35afb7bd03cdcdf5efb05048dddb5789464"}, + {file = "teams_ai-1.5.0.tar.gz", hash = "sha256:8a4f6b809633a88459a8c20315e324a9609732aea728e1ef316342e628203149"}, ] [package.dependencies] @@ -2157,7 +2243,7 @@ botframework-connector = ">=4.15.0,<5.0.0" dataclasses-json = ">=0.6.4,<0.7.0" jsonschema = ">=4.21.1,<5.0.0" msal = ">=1.28.0,<2.0.0" -openai = ">=1.27.0,<2.0.0" +openai = ">=v1.52.0,<2.0.0" pyyaml = ">=6.0.1,<7.0.0" tiktoken = ">=0.7.0,<0.8.0" types-pyyaml = ">=6.0.12.12,<7.0.0.0" @@ -2509,4 +2595,4 @@ test = ["big-O", "importlib-resources", "jaraco.functools", "jaraco.itertools", [metadata] lock-version = "2.0" python-versions = ">=3.8,<4.0" -content-hash = "ea9096124101780e63bbbe3c2b354793e856f04516986e991729aecf8c1a72fb" +content-hash = "d27aeae755ac1b8f04568c8752cb69ceafb09cef140e5224f3614549418b4da4" diff --git a/python/samples/06.auth.oauth.messageExtensions/README.md b/python/samples/06.auth.oauth.messageExtensions/README.md index 552d300e3..0ba16c99f 100644 --- a/python/samples/06.auth.oauth.messageExtensions/README.md +++ b/python/samples/06.auth.oauth.messageExtensions/README.md @@ -6,17 +6,17 @@ This sample requires creating an OAuth Connection in Azure Bot Service, which pr Note that this bot will only work in tenants where the following graph scopes are permitted: -- `User.Read` +- `User.Read` -- [Teams Message Extension Oauth Bot](#teams-message-extension-oauth-bot) - - [Interacting with the bot](#interacting-with-the-bot) - - [Setting up the sample](#setting-up-the-sample) - - [Testing the sample](#testing-the-sample) - - [Using Teams Toolkit for Visual Studio Code](#using-teams-toolkit-for-visual-studio-code) +- [Teams Message Extension Oauth Bot](#teams-message-extension-oauth-bot) + - [Interacting with the bot](#interacting-with-the-bot) + - [Setting up the sample](#setting-up-the-sample) + - [Testing the sample](#testing-the-sample) + - [Using Teams Toolkit for Visual Studio Code](#using-teams-toolkit-for-visual-studio-code) @@ -28,9 +28,9 @@ Note that this bot will only work in tenants where the following graph scopes ar 1. Clone the repository - ```bash - git clone https://github.com/Microsoft/teams-ai.git - ``` + ```bash + git clone https://github.com/Microsoft/teams-ai.git + ``` 2. Duplicate the `sample.env`. Rename the file to .env and fill in the variables with your keys. @@ -43,7 +43,7 @@ The easiest and fastest way to get up and running is with Teams Toolkit as your Otherwise, if you only want to run the bot locally and build manually, please jump to the [BotFramework Emulator](../README.md#testing-in-botframework-emulator) section. For different ways to test a sample see: [Multiple ways to test](../README.md#multiple-ways-to-test) -### Using Teams Toolkit for Visual Studio Code +### Using Teams Toolkit for Visual Studio Code The simplest way to run this sample in Teams is to use Teams Toolkit for Visual Studio Code. @@ -53,9 +53,9 @@ The simplest way to run this sample in Teams is to use Teams Toolkit for Visual 1. Install [Poetry](https://python-poetry.org/docs/#installation) 1. Select **File > Open Folder** in VS Code and choose this sample's directory from the repo 1. Using the extension, sign in with your Microsoft 365 account where you have permissions to upload custom apps -1. Ensure that you have set up the sample from the previous step. -1. Trigger **Python: Create Environment** from command palette and create a virtual environment +1. Verify that the Teams Toolkit extension is connected to your Teams account from the above step. +1. In the debugger, play the Debug (Edge) script 1. Select **Debug > Start Debugging** or **F5** to run the app in a Teams web client. 1. In the browser that launches, select the **Add** button to install the app to Teams. -> If you do not have permission to upload custom apps (sideloading), Teams Toolkit will recommend creating and using a Microsoft 365 Developer Program account - a free program to get your own dev environment sandbox that includes Teams. \ No newline at end of file +> If you do not have permission to upload custom apps (sideloading), Teams Toolkit will recommend creating and using a Microsoft 365 Developer Program account - a free program to get your own dev environment sandbox that includes Teams. diff --git a/python/samples/07.planners.a.langchain/README.md b/python/samples/07.planners.a.langchain/README.md index 725370273..0898cb484 100644 --- a/python/samples/07.planners.a.langchain/README.md +++ b/python/samples/07.planners.a.langchain/README.md @@ -24,11 +24,11 @@ You can interact with the bot by messaging it. 1. Clone the repository - ```bash - git clone https://github.com/Microsoft/teams-ai.git - ``` + ```bash + git clone https://github.com/Microsoft/teams-ai.git + ``` -2. Duplicate the `sample.env` in the `teams-ai/python/samples/07.planners.a.langchain` folder. Rename the file to `.env`. +2. Duplicate the `sample.env` in the `teams-ai/python/samples/07.planners.a.langchain` folder. Rename the file to `.env`. 3. If you are using OpenAI then only keep the `OPENAI_KEY` and add in your key. Otherwise if you are using AzureOpenAI then only keep the `AZURE_OPENAI_KEY`, `AZURE_OPENAI_ENDPOINT` variables and fill them in appropriately. @@ -41,7 +41,7 @@ The easiest and fastest way to get up and running is with Teams Toolkit as your Otherwise, if you only want to run the bot locally and build manually, please jump to the [BotFramework Emulator](../README.md#testing-in-botframework-emulator) section. For different ways to test a sample see: [Multiple ways to test](../README.md#multiple-ways-to-test) -### Using Teams Toolkit for Visual Studio Code +### Using Teams Toolkit for Visual Studio Code The simplest way to run this sample in Teams is to use Teams Toolkit for Visual Studio Code. @@ -51,9 +51,9 @@ The simplest way to run this sample in Teams is to use Teams Toolkit for Visual 4. Install [Poetry](https://python-poetry.org/docs/#installation) 5. Select **File > Open Folder** in VS Code and choose this sample's directory from the repo 6. Using the extension, sign in with your Microsoft 365 account where you have permissions to upload custom apps -7. Ensure that you have set up the sample from the previous step. -8. Trigger **Python: Create Environment** from command palette and create a virtual environment +7. Verify that the Teams Toolkit extension is connected to your Teams account from the above step. +8. In the debugger, play the Debug (Edge) script 9. Select **Debug > Start Debugging** or **F5** to run the app in a Teams web client. 10. In the browser that launches, select the **Add** button to install the app to Teams. -> If you do not have permission to upload custom apps (sideloading), Teams Toolkit will recommend creating and using a Microsoft 365 Developer Program account - a free program to get your own dev environment sandbox that includes Teams. \ No newline at end of file +> If you do not have permission to upload custom apps (sideloading), Teams Toolkit will recommend creating and using a Microsoft 365 Developer Program account - a free program to get your own dev environment sandbox that includes Teams. diff --git a/python/samples/README.md b/python/samples/README.md index b78009cc3..6af06fe31 100644 --- a/python/samples/README.md +++ b/python/samples/README.md @@ -4,11 +4,10 @@ In this folder, you will find various examples showcasing the different capabili ## Appendix -It is recommended to use the Teams Toolkit for Visual Studio Code way to test a sample. +It is recommended to use the Teams Toolkit for Visual Studio Code way to test a sample. The easiest and fastest way to get up and running is with Teams Toolkit as your development guide. To use Teams Toolkit to automate setup and debugging, please [continue below](#using-teams-toolkit-for-visual-studio-code). - #### Using Teams Toolkit for Visual Studio Code The simplest way to run this sample in Teams is to use Teams Toolkit for Visual Studio Code. @@ -19,8 +18,8 @@ The simplest way to run this sample in Teams is to use Teams Toolkit for Visual 1. Install [Poetry](https://python-poetry.org/docs/#installation) 1. Select **File > Open Folder** in VS Code and choose this sample's directory from the repo 1. Using the extension, sign in with your Microsoft 365 account where you have permissions to upload custom apps -1. Ensure that you have set up the sample from the previous step. -1. Trigger **Python: Create Environment** from command palette and create a virtual environment +1. Verify that the Teams Toolkit extension is connected to your Teams account from the above step. +1. In the debugger, play the Debug (Edge) script 1. Select **Debug > Start Debugging** or **F5** to run the app in a Teams web client. 1. In the browser that launches, select the **Add** button to install the app to Teams. @@ -28,5 +27,5 @@ The simplest way to run this sample in Teams is to use Teams Toolkit for Visual ### Further reading -- [Teams Toolkit overview](https://learn.microsoft.com/en-us/microsoftteams/platform/toolkit/teams-toolkit-fundamentals) -- [How Microsoft Teams bots work](https://docs.microsoft.com/en-us/azure/bot-service/bot-builder-basics-teams?view=azure-bot-service-4.0&tabs=javascript) +- [Teams Toolkit overview](https://learn.microsoft.com/en-us/microsoftteams/platform/toolkit/teams-toolkit-fundamentals) +- [How Microsoft Teams bots work](https://docs.microsoft.com/en-us/azure/bot-service/bot-builder-basics-teams?view=azure-bot-service-4.0&tabs=javascript) From 5d1cf55405557ee2c56aa4bd893a6d565ae211aa Mon Sep 17 00:00:00 2001 From: kavin <115390646+singhk97@users.noreply.github.com> Date: Wed, 11 Dec 2024 15:09:45 -0500 Subject: [PATCH 14/19] [C#] bump: dotnet to 1.9.0 (#2230) ## Linked issues closes: #minor ## Details - https://github.com/microsoft/teams-ai/pull/2210 - https://github.com/microsoft/teams-ai/pull/2214 - https://github.com/microsoft/teams-ai/pull/2227 --------- Signed-off-by: dependabot[bot] Co-authored-by: Lily Du Co-authored-by: lilydu Co-authored-by: Tarek Mahmoud Sayed <10833894+tarekgh@users.noreply.github.com> Co-authored-by: Steven Ickman Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Corina <14900841+corinagum@users.noreply.github.com> Co-authored-by: Yiqing Zhao Co-authored-by: Yiqing Zhao Co-authored-by: Alex Acebo --- .../AITests/LLMClientTests.cs | 7 +- .../Microsoft.TeamsAI/AI/Clients/LLMClient.cs | 78 ++++++++++++------- .../AI/Models/OpenAIModel.cs | 32 +++++++- .../AI/Models/SequenceBuilder.cs | 65 ++++++++++++++++ .../Models/StreamingChatToolCallsBuilder.cs | 59 ++++++++++++++ .../AI/Tokenizers/GPTTokenizer.cs | 2 +- .../Microsoft.Teams.AI.csproj | 9 ++- .../01.messaging.echoBot/EchoBot.csproj | 2 +- .../SearchCommand.csproj | 2 +- .../TypeAheadBot.csproj | 2 +- .../04.ai.a.teamsChefBot/TeamsChefBot.csproj | 2 +- .../GPT.csproj | 2 +- .../LightBot.csproj | 7 +- .../LightBotActions.cs | 13 ++-- .../04.ai.c.actionMapping.lightBot/Program.cs | 6 +- .../ListBot.csproj | 2 +- .../DevOpsBot.csproj | 2 +- .../CardGazer.csproj | 2 +- .../TeamsChefBot.csproj | 2 +- .../TwentyQuestions.csproj | 2 +- .../05.chatModeration/ChatModeration.csproj | 2 +- .../06.assistants.a.mathBot/MathBot.csproj | 2 +- .../06.assistants.b.orderBot/OrderBot.csproj | 2 +- .../samples/06.auth.oauth.bot/BotAuth.csproj | 2 +- .../MessageExtensionAuth.csproj | 2 +- .../06.auth.teamsSSO.bot/BotAuth.csproj | 2 +- .../MessageExtensionAuth.csproj | 2 +- .../AzureAISearchBot/AzureAISearchBot.csproj | 2 +- .../AzureOpenAIBot.csproj | 2 +- 29 files changed, 248 insertions(+), 68 deletions(-) create mode 100644 dotnet/packages/Microsoft.TeamsAI/Microsoft.TeamsAI/AI/Models/SequenceBuilder.cs create mode 100644 dotnet/packages/Microsoft.TeamsAI/Microsoft.TeamsAI/AI/Models/StreamingChatToolCallsBuilder.cs diff --git a/dotnet/packages/Microsoft.TeamsAI/Microsoft.TeamsAI.Tests/AITests/LLMClientTests.cs b/dotnet/packages/Microsoft.TeamsAI/Microsoft.TeamsAI.Tests/AITests/LLMClientTests.cs index 4db309d8f..9278c1477 100644 --- a/dotnet/packages/Microsoft.TeamsAI/Microsoft.TeamsAI.Tests/AITests/LLMClientTests.cs +++ b/dotnet/packages/Microsoft.TeamsAI/Microsoft.TeamsAI.Tests/AITests/LLMClientTests.cs @@ -99,8 +99,10 @@ public async Task Test_CompletePromptAsync_PromptResponse_NotSuccess() LLMClientOptions options = new(promptCompletionModel, promptTemplate) { MaxHistoryMessages = 1 }; LLMClient client = new(options, null); TestMemory memory = new(); + ChatMessage message = new ChatMessage("Hi there"); promptCompletionModel.Results.Enqueue(new() { + Input = new List() { message }, Status = PromptResponseStatus.Error, Error = new TeamsAIException("test") }); @@ -113,7 +115,10 @@ public async Task Test_CompletePromptAsync_PromptResponse_NotSuccess() Assert.Equal(PromptResponseStatus.Error, response.Status); Assert.NotNull(response.Error); Assert.Equal("test", response.Error.Message); - Assert.Empty(memory.Values); + Assert.Single(memory.Values); + + IList conversation_history = (IList)memory.GetValue("conversation.history")!; + Assert.True(conversation_history[0].Content == message.Content); } [Fact] diff --git a/dotnet/packages/Microsoft.TeamsAI/Microsoft.TeamsAI/AI/Clients/LLMClient.cs b/dotnet/packages/Microsoft.TeamsAI/Microsoft.TeamsAI/AI/Clients/LLMClient.cs index bee3b26ab..3b07e4a9d 100644 --- a/dotnet/packages/Microsoft.TeamsAI/Microsoft.TeamsAI/AI/Clients/LLMClient.cs +++ b/dotnet/packages/Microsoft.TeamsAI/Microsoft.TeamsAI/AI/Clients/LLMClient.cs @@ -1,4 +1,5 @@ -using Microsoft.Bot.Builder; +using Google.Protobuf.WellKnownTypes; +using Microsoft.Bot.Builder; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Abstractions; using Microsoft.Teams.AI.AI.Models; @@ -155,7 +156,6 @@ public async Task CompletePromptAsync( ) { // Define event handlers - bool isStreaming = false; StreamingResponse? streamer = null; BeforeCompletionHandler handleBeforeCompletion = new((object sender, BeforeCompletionEventArgs args) => @@ -168,22 +168,26 @@ public async Task CompletePromptAsync( if (args.Streaming) { - isStreaming = true; - - // Create streamer and send initial message - streamer = new StreamingResponse(context); - memory.SetValue("temp.streamer", streamer); - - if (this._enableFeedbackLoop != null) + // Attach to any existing streamer + // - see tool call note below to understand. + streamer = (StreamingResponse?)memory.GetValue("temp.streamer"); + if (streamer == null) { - streamer.EnableFeedbackLoop = this._enableFeedbackLoop; - } + // Create streamer and send initial message + streamer = new StreamingResponse(context); + memory.SetValue("temp.streamer", streamer); - streamer.EnableGeneratedByAILabel = true; + if (this._enableFeedbackLoop != null) + { + streamer.EnableFeedbackLoop = this._enableFeedbackLoop; + } - if (!string.IsNullOrEmpty(this._startStreamingMessage)) - { - streamer.QueueInformativeUpdate(this._startStreamingMessage!); + streamer.EnableGeneratedByAILabel = true; + + if (!string.IsNullOrEmpty(this._startStreamingMessage)) + { + streamer.QueueInformativeUpdate(this._startStreamingMessage!); + } } } }); @@ -195,6 +199,15 @@ public async Task CompletePromptAsync( return; } + + // Ignore content without text + // - The chunk is likely for a Tool Call. + // - See the tool call note below to understand why we're ignoring them. + if (args.Chunk.delta?.GetContent() == null) + { + return; + } + // Send chunk to client string text = args.Chunk.delta?.GetContent() ?? ""; IList? citations = args.Chunk.delta?.Context?.Citations ?? null; @@ -234,23 +247,32 @@ public async Task CompletePromptAsync( cancellationToken ); - if (response.Status != PromptResponseStatus.Success) - { - return response; - } - else + // Handle streaming responses + if (streamer != null) { - if (isStreaming) + // Tool call handling + // - We need to keep the streamer around during tool calls so we're just letting them return as normal + // messages minus the message content. The text content is being streamed to the client in chunks. + // - When the tool call completes we'll call back into ActionPlanner and end up re-attaching to the + // streamer. This will result in us continuing to stream the response to the client. + if (response.Message?.ActionCalls != null && response.Message.ActionCalls.Count > 0) { - // Delete the message from the response to avoid sending it twice. - response.Message = null; + // Ensure content is empty for tool calls + response.Message.Content = ""; } - } + else + { + if (response.Status == PromptResponseStatus.Success) + { + // Delete message from response to avoid sending it twice + response.Message = null; + } - // End the stream - if (streamer != null) - { - await streamer.EndStream(); + // End the stream and remove pointer from memory + // - We're not listening for the response received event because we can't await the completion of events. + await streamer.EndStream(); + memory.DeleteValue("temp.streamer"); + } } // Get input message/s diff --git a/dotnet/packages/Microsoft.TeamsAI/Microsoft.TeamsAI/AI/Models/OpenAIModel.cs b/dotnet/packages/Microsoft.TeamsAI/Microsoft.TeamsAI/AI/Models/OpenAIModel.cs index 8fa533e15..be0723385 100644 --- a/dotnet/packages/Microsoft.TeamsAI/Microsoft.TeamsAI/AI/Models/OpenAIModel.cs +++ b/dotnet/packages/Microsoft.TeamsAI/Microsoft.TeamsAI/AI/Models/OpenAIModel.cs @@ -21,6 +21,7 @@ using Microsoft.Teams.AI.Application; using System.Reflection; using System.Runtime.CompilerServices; +using Microsoft.Extensions.Options; [assembly: InternalsVisibleTo("Microsoft.Teams.AI.Tests")] #pragma warning disable AOAI001 // Type is for evaluation purposes only and is subject to change or removal in future updates. Suppress this diagnostic to proceed. @@ -214,7 +215,6 @@ public async Task CompletePromptAsync(ITurnContext turnContext, ChatCompletionOptions chatCompletionOptions = new() { - MaxOutputTokenCount = completion.MaxTokens, Temperature = (float)completion.Temperature, TopP = (float)completion.TopP, PresencePenalty = (float)completion.PresencePenalty, @@ -223,6 +223,7 @@ public async Task CompletePromptAsync(ITurnContext turnContext, if (isO1Model) { + chatCompletionOptions.MaxOutputTokenCount = completion.MaxTokens; chatCompletionOptions.Temperature = 1; chatCompletionOptions.TopP = 1; chatCompletionOptions.PresencePenalty = 0; @@ -282,6 +283,7 @@ public async Task CompletePromptAsync(ITurnContext turnContext, }; AsyncCollectionResult streamCompletion = _openAIClient.GetChatClient(_deploymentName).CompleteChatStreamingAsync(chatMessages, chatCompletionOptions, cancellationToken); + var toolCallBuilder = new StreamingChatToolCallsBuilder(); await foreach (StreamingChatCompletionUpdate delta in streamCompletion) { if (delta.Role != null) @@ -295,9 +297,19 @@ public async Task CompletePromptAsync(ITurnContext turnContext, message.Content += delta.ContentUpdate[0].Text; } - // TODO: Handle tool calls + // Handle tool calls + if (isToolsAugmentation && delta.ToolCallUpdates != null && delta.ToolCallUpdates.Count > 0) + { + foreach (var toolCallUpdate in delta.ToolCallUpdates) + { + toolCallBuilder.Append(toolCallUpdate); + } + } - ChatMessage currDeltaMessage = new(delta); + ChatMessage currDeltaMessage = new(delta) + { + ActionCalls = message.ActionCalls // Ensure ActionCalls are included + }; PromptChunk chunk = new() { delta = currDeltaMessage @@ -311,7 +323,19 @@ public async Task CompletePromptAsync(ITurnContext turnContext, _logger.LogTrace("CHUNK", delta); } - Events!.OnChunkReceived(args); + Events!.OnChunkReceived(args); + } + + // Add any tool calls to message + var toolCalls = toolCallBuilder.Build(); + if (toolCalls.Count > 0) + { + message.ActionCalls = new List(); + foreach (var toolCall in toolCalls) + { + var actionCall = new ActionCall(toolCall); + message.ActionCalls.Add(actionCall); + } } promptResponse.Message = message; diff --git a/dotnet/packages/Microsoft.TeamsAI/Microsoft.TeamsAI/AI/Models/SequenceBuilder.cs b/dotnet/packages/Microsoft.TeamsAI/Microsoft.TeamsAI/AI/Models/SequenceBuilder.cs new file mode 100644 index 000000000..17105b53a --- /dev/null +++ b/dotnet/packages/Microsoft.TeamsAI/Microsoft.TeamsAI/AI/Models/SequenceBuilder.cs @@ -0,0 +1,65 @@ +using System.Buffers; +using System.Diagnostics; + +namespace Microsoft.Teams.AI.AI.Models +{ + public class SequenceBuilder + { + private Segment _first; + private Segment _last; + + public void Append(ReadOnlyMemory data) + { + if (_first == null) + { + Debug.Assert(_last == null); + _first = new Segment(data); + _last = _first; + } + else + { + _last = _last!.Append(data); + } + } + + public ReadOnlySequence Build() + { + if (_first == null) + { + Debug.Assert(_last == null); + return ReadOnlySequence.Empty; + } + + if (_first == _last) + { + Debug.Assert(_first.Next == null); + return new ReadOnlySequence(_first.Memory); + } + + return new ReadOnlySequence(_first, 0, _last!, _last!.Memory.Length); + } + + private sealed class Segment : ReadOnlySequenceSegment + { + public Segment(ReadOnlyMemory items) : this(items, 0) + { + } + + private Segment(ReadOnlyMemory items, long runningIndex) + { + Debug.Assert(runningIndex >= 0); + Memory = items; + RunningIndex = runningIndex; + } + + public Segment Append(ReadOnlyMemory items) + { + long runningIndex; + checked { runningIndex = RunningIndex + Memory.Length; } + Segment segment = new(items, runningIndex); + Next = segment; + return segment; + } + } + } +} diff --git a/dotnet/packages/Microsoft.TeamsAI/Microsoft.TeamsAI/AI/Models/StreamingChatToolCallsBuilder.cs b/dotnet/packages/Microsoft.TeamsAI/Microsoft.TeamsAI/AI/Models/StreamingChatToolCallsBuilder.cs new file mode 100644 index 000000000..80f10c10f --- /dev/null +++ b/dotnet/packages/Microsoft.TeamsAI/Microsoft.TeamsAI/AI/Models/StreamingChatToolCallsBuilder.cs @@ -0,0 +1,59 @@ +using OpenAI.Chat; +using System.Buffers; + +namespace Microsoft.Teams.AI.AI.Models +{ + public class StreamingChatToolCallsBuilder + { + private readonly Dictionary _indexToToolCallId = []; + private readonly Dictionary _indexToFunctionName = []; + private readonly Dictionary> _indexToFunctionArguments = []; + + public void Append(StreamingChatToolCallUpdate toolCallUpdate) + { + // Keep track of which tool call ID belongs to this update index. + if (toolCallUpdate.ToolCallId != null) + { + _indexToToolCallId[toolCallUpdate.Index] = toolCallUpdate.ToolCallId; + } + + // Keep track of which function name belongs to this update index. + if (toolCallUpdate.FunctionName != null) + { + _indexToFunctionName[toolCallUpdate.Index] = toolCallUpdate.FunctionName; + } + + // Keep track of which function arguments belong to this update index, + // and accumulate the arguments as new updates arrive. + if (toolCallUpdate.FunctionArgumentsUpdate != null && !toolCallUpdate.FunctionArgumentsUpdate.ToMemory().IsEmpty) + { + if (!_indexToFunctionArguments.TryGetValue(toolCallUpdate.Index, out SequenceBuilder argumentsBuilder)) + { + argumentsBuilder = new SequenceBuilder(); + _indexToFunctionArguments[toolCallUpdate.Index] = argumentsBuilder; + } + + argumentsBuilder.Append(toolCallUpdate.FunctionArgumentsUpdate); + } + } + + public IReadOnlyList Build() + { + List toolCalls = []; + + foreach (KeyValuePair indexToToolCallIdPair in _indexToToolCallId) + { + ReadOnlySequence sequence = _indexToFunctionArguments[indexToToolCallIdPair.Key].Build(); + + ChatToolCall toolCall = ChatToolCall.CreateFunctionToolCall( + id: indexToToolCallIdPair.Value, + functionName: _indexToFunctionName[indexToToolCallIdPair.Key], + functionArguments: BinaryData.FromBytes(sequence.ToArray())); + + toolCalls.Add(toolCall); + } + + return toolCalls; + } + } +} diff --git a/dotnet/packages/Microsoft.TeamsAI/Microsoft.TeamsAI/AI/Tokenizers/GPTTokenizer.cs b/dotnet/packages/Microsoft.TeamsAI/Microsoft.TeamsAI/AI/Tokenizers/GPTTokenizer.cs index 72b6e52cd..ab140f8b8 100644 --- a/dotnet/packages/Microsoft.TeamsAI/Microsoft.TeamsAI/AI/Tokenizers/GPTTokenizer.cs +++ b/dotnet/packages/Microsoft.TeamsAI/Microsoft.TeamsAI/AI/Tokenizers/GPTTokenizer.cs @@ -24,7 +24,7 @@ public class GPTTokenizer : ITokenizer /// Creates an instance of `GPTTokenizer` /// /// model to encode/decode for - public GPTTokenizer(string model) => this._encoding = TiktokenTokenizer.CreateForModel("gpt-4"); + public GPTTokenizer(string model) => this._encoding = TiktokenTokenizer.CreateForModel(model); /// /// Encode diff --git a/dotnet/packages/Microsoft.TeamsAI/Microsoft.TeamsAI/Microsoft.Teams.AI.csproj b/dotnet/packages/Microsoft.TeamsAI/Microsoft.TeamsAI/Microsoft.Teams.AI.csproj index 5550baf0c..1955d60e7 100644 --- a/dotnet/packages/Microsoft.TeamsAI/Microsoft.TeamsAI/Microsoft.Teams.AI.csproj +++ b/dotnet/packages/Microsoft.TeamsAI/Microsoft.TeamsAI/Microsoft.Teams.AI.csproj @@ -7,7 +7,7 @@ enable Microsoft.Teams.AI Microsoft Teams AI SDK - 1.8.1 + 1.9.0 Microsoft Microsoft © Microsoft Corporation. All rights reserved. @@ -38,16 +38,17 @@ - + - + + - + diff --git a/dotnet/samples/01.messaging.echoBot/EchoBot.csproj b/dotnet/samples/01.messaging.echoBot/EchoBot.csproj index e41f28dc3..8ba0a6dc7 100644 --- a/dotnet/samples/01.messaging.echoBot/EchoBot.csproj +++ b/dotnet/samples/01.messaging.echoBot/EchoBot.csproj @@ -17,7 +17,7 @@ - + diff --git a/dotnet/samples/02.messageExtensions.a.searchCommand/SearchCommand.csproj b/dotnet/samples/02.messageExtensions.a.searchCommand/SearchCommand.csproj index c6af635c8..65eebfb9d 100644 --- a/dotnet/samples/02.messageExtensions.a.searchCommand/SearchCommand.csproj +++ b/dotnet/samples/02.messageExtensions.a.searchCommand/SearchCommand.csproj @@ -14,7 +14,7 @@ - + diff --git a/dotnet/samples/03.adaptiveCards.a.typeAheadBot/TypeAheadBot.csproj b/dotnet/samples/03.adaptiveCards.a.typeAheadBot/TypeAheadBot.csproj index 5292b9795..3cab8fadc 100644 --- a/dotnet/samples/03.adaptiveCards.a.typeAheadBot/TypeAheadBot.csproj +++ b/dotnet/samples/03.adaptiveCards.a.typeAheadBot/TypeAheadBot.csproj @@ -13,7 +13,7 @@ - + diff --git a/dotnet/samples/04.ai.a.teamsChefBot/TeamsChefBot.csproj b/dotnet/samples/04.ai.a.teamsChefBot/TeamsChefBot.csproj index 9ce3c4a91..5a23842c0 100644 --- a/dotnet/samples/04.ai.a.teamsChefBot/TeamsChefBot.csproj +++ b/dotnet/samples/04.ai.a.teamsChefBot/TeamsChefBot.csproj @@ -16,7 +16,7 @@ - + diff --git a/dotnet/samples/04.ai.b.messageExtensions.gptME/GPT.csproj b/dotnet/samples/04.ai.b.messageExtensions.gptME/GPT.csproj index d2efcaea5..5f07b0e89 100644 --- a/dotnet/samples/04.ai.b.messageExtensions.gptME/GPT.csproj +++ b/dotnet/samples/04.ai.b.messageExtensions.gptME/GPT.csproj @@ -15,7 +15,7 @@ - + diff --git a/dotnet/samples/04.ai.c.actionMapping.lightBot/LightBot.csproj b/dotnet/samples/04.ai.c.actionMapping.lightBot/LightBot.csproj index 1fcd96b55..0e58338c3 100644 --- a/dotnet/samples/04.ai.c.actionMapping.lightBot/LightBot.csproj +++ b/dotnet/samples/04.ai.c.actionMapping.lightBot/LightBot.csproj @@ -1,7 +1,7 @@  - net6.0 + net8.0 enable enable @@ -16,13 +16,12 @@ - + - + - diff --git a/dotnet/samples/04.ai.c.actionMapping.lightBot/LightBotActions.cs b/dotnet/samples/04.ai.c.actionMapping.lightBot/LightBotActions.cs index 19f9cd42f..a34a842b0 100644 --- a/dotnet/samples/04.ai.c.actionMapping.lightBot/LightBotActions.cs +++ b/dotnet/samples/04.ai.c.actionMapping.lightBot/LightBotActions.cs @@ -2,6 +2,9 @@ using Microsoft.Bot.Builder; using Microsoft.Teams.AI.AI.Action; using Microsoft.Teams.AI.AI; +using System.Diagnostics; +using System.Threading; +using Microsoft.Teams.AI.State; namespace LightBot { @@ -11,7 +14,7 @@ public class LightBotActions public async Task LightsOn([ActionTurnContext] ITurnContext turnContext, [ActionTurnState] AppState turnState) { turnState.Conversation.LightsOn = true; - await turnContext.SendActivityAsync(MessageFactory.Text("[lights on]")); + Trace.WriteLine("[The lights are on]"); return "the lights are now on"; } @@ -19,7 +22,7 @@ public async Task LightsOn([ActionTurnContext] ITurnContext turnContext, public async Task LightsOff([ActionTurnContext] ITurnContext turnContext, [ActionTurnState] AppState turnState) { turnState.Conversation.LightsOn = false; - await turnContext.SendActivityAsync(MessageFactory.Text("[lights off]")); + Trace.WriteLine("[The lights are off]"); return "the lights are now off"; } @@ -33,7 +36,7 @@ public async Task LightsOff([ActionTurnContext] ITurnContext turnContext if (time != null && time is long timeLong) { int timeInt = (int)timeLong; - await turnContext.SendActivityAsync(MessageFactory.Text($"[pausing for {timeInt / 1000} seconds]")); + Trace.WriteLine($"[pausing for {timeInt / 1000} seconds]"); await Task.Delay(timeInt); } } @@ -44,14 +47,14 @@ public async Task LightsOff([ActionTurnContext] ITurnContext turnContext [Action("LightStatus")] public async Task LightStatus([ActionTurnContext] ITurnContext turnContext, [ActionTurnState] AppState turnState) { - await turnContext.SendActivityAsync(ResponseGenerator.LightStatus(turnState.Conversation.LightsOn)); + Trace.WriteLine(ResponseGenerator.LightStatus(turnState.Conversation.LightsOn)); return turnState.Conversation.LightsOn ? "the lights are on" : "the lights are off"; } [Action(AIConstants.UnknownActionName)] public async Task UnknownAction([ActionTurnContext] TurnContext turnContext, [ActionName] string action) { - await turnContext.SendActivityAsync(ResponseGenerator.UnknownAction(action ?? "Unknown")); + Trace.WriteLine(ResponseGenerator.UnknownAction(action ?? "Unknown")); return "unknown action"; } } diff --git a/dotnet/samples/04.ai.c.actionMapping.lightBot/Program.cs b/dotnet/samples/04.ai.c.actionMapping.lightBot/Program.cs index 9fcdd736a..b3d8785fe 100644 --- a/dotnet/samples/04.ai.c.actionMapping.lightBot/Program.cs +++ b/dotnet/samples/04.ai.c.actionMapping.lightBot/Program.cs @@ -37,7 +37,8 @@ builder.Services.AddSingleton(sp => new( new OpenAIModelOptions(config.OpenAI.ApiKey, "gpt-4o") { - LogRequests = true + LogRequests = true, + Stream = true }, sp.GetService() )); @@ -51,7 +52,8 @@ config.Azure.OpenAIEndpoint ) { - LogRequests = true + LogRequests = true, + Stream = true }, sp.GetService() )); diff --git a/dotnet/samples/04.ai.d.chainedActions.listBot/ListBot.csproj b/dotnet/samples/04.ai.d.chainedActions.listBot/ListBot.csproj index 4503d835c..18cc40f3c 100644 --- a/dotnet/samples/04.ai.d.chainedActions.listBot/ListBot.csproj +++ b/dotnet/samples/04.ai.d.chainedActions.listBot/ListBot.csproj @@ -12,7 +12,7 @@ - + diff --git a/dotnet/samples/04.ai.e.chainedActions.devOpsBot/DevOpsBot.csproj b/dotnet/samples/04.ai.e.chainedActions.devOpsBot/DevOpsBot.csproj index 9a92bcaa4..ef01b0fe1 100644 --- a/dotnet/samples/04.ai.e.chainedActions.devOpsBot/DevOpsBot.csproj +++ b/dotnet/samples/04.ai.e.chainedActions.devOpsBot/DevOpsBot.csproj @@ -14,7 +14,7 @@ - + diff --git a/dotnet/samples/04.ai.f.vision.cardMaster/CardGazer.csproj b/dotnet/samples/04.ai.f.vision.cardMaster/CardGazer.csproj index 05a7a3cb3..2c53b795b 100644 --- a/dotnet/samples/04.ai.f.vision.cardMaster/CardGazer.csproj +++ b/dotnet/samples/04.ai.f.vision.cardMaster/CardGazer.csproj @@ -18,7 +18,7 @@ - + diff --git a/dotnet/samples/04.ai.g.teamsChefBot-streaming/TeamsChefBot.csproj b/dotnet/samples/04.ai.g.teamsChefBot-streaming/TeamsChefBot.csproj index 00a762075..6287e4799 100644 --- a/dotnet/samples/04.ai.g.teamsChefBot-streaming/TeamsChefBot.csproj +++ b/dotnet/samples/04.ai.g.teamsChefBot-streaming/TeamsChefBot.csproj @@ -16,7 +16,7 @@ - + diff --git a/dotnet/samples/04.e.twentyQuestions/TwentyQuestions.csproj b/dotnet/samples/04.e.twentyQuestions/TwentyQuestions.csproj index 33faa98f3..5e402169a 100644 --- a/dotnet/samples/04.e.twentyQuestions/TwentyQuestions.csproj +++ b/dotnet/samples/04.e.twentyQuestions/TwentyQuestions.csproj @@ -13,7 +13,7 @@ - + diff --git a/dotnet/samples/05.chatModeration/ChatModeration.csproj b/dotnet/samples/05.chatModeration/ChatModeration.csproj index fe4bf3898..8cc1a1b59 100644 --- a/dotnet/samples/05.chatModeration/ChatModeration.csproj +++ b/dotnet/samples/05.chatModeration/ChatModeration.csproj @@ -16,7 +16,7 @@ - + diff --git a/dotnet/samples/06.assistants.a.mathBot/MathBot.csproj b/dotnet/samples/06.assistants.a.mathBot/MathBot.csproj index 3bad03104..a6cbd3452 100644 --- a/dotnet/samples/06.assistants.a.mathBot/MathBot.csproj +++ b/dotnet/samples/06.assistants.a.mathBot/MathBot.csproj @@ -14,7 +14,7 @@ - + diff --git a/dotnet/samples/06.assistants.b.orderBot/OrderBot.csproj b/dotnet/samples/06.assistants.b.orderBot/OrderBot.csproj index b33d917d4..f0bb03bc9 100644 --- a/dotnet/samples/06.assistants.b.orderBot/OrderBot.csproj +++ b/dotnet/samples/06.assistants.b.orderBot/OrderBot.csproj @@ -17,7 +17,7 @@ - + diff --git a/dotnet/samples/06.auth.oauth.bot/BotAuth.csproj b/dotnet/samples/06.auth.oauth.bot/BotAuth.csproj index 6b080750f..a5140f973 100644 --- a/dotnet/samples/06.auth.oauth.bot/BotAuth.csproj +++ b/dotnet/samples/06.auth.oauth.bot/BotAuth.csproj @@ -18,7 +18,7 @@ - + diff --git a/dotnet/samples/06.auth.oauth.messageExtension/MessageExtensionAuth.csproj b/dotnet/samples/06.auth.oauth.messageExtension/MessageExtensionAuth.csproj index e06ba9bf8..a7eb6ec24 100644 --- a/dotnet/samples/06.auth.oauth.messageExtension/MessageExtensionAuth.csproj +++ b/dotnet/samples/06.auth.oauth.messageExtension/MessageExtensionAuth.csproj @@ -16,7 +16,7 @@ - + diff --git a/dotnet/samples/06.auth.teamsSSO.bot/BotAuth.csproj b/dotnet/samples/06.auth.teamsSSO.bot/BotAuth.csproj index 86e26b01c..25f422de2 100644 --- a/dotnet/samples/06.auth.teamsSSO.bot/BotAuth.csproj +++ b/dotnet/samples/06.auth.teamsSSO.bot/BotAuth.csproj @@ -18,7 +18,7 @@ - + diff --git a/dotnet/samples/06.auth.teamsSSO.messageExtension/MessageExtensionAuth.csproj b/dotnet/samples/06.auth.teamsSSO.messageExtension/MessageExtensionAuth.csproj index 26cb4a83e..696aa3eba 100644 --- a/dotnet/samples/06.auth.teamsSSO.messageExtension/MessageExtensionAuth.csproj +++ b/dotnet/samples/06.auth.teamsSSO.messageExtension/MessageExtensionAuth.csproj @@ -16,7 +16,7 @@ - + diff --git a/dotnet/samples/08.datasource.azureaisearch/AzureAISearchBot/AzureAISearchBot.csproj b/dotnet/samples/08.datasource.azureaisearch/AzureAISearchBot/AzureAISearchBot.csproj index 1ea7d35da..fef679bcf 100644 --- a/dotnet/samples/08.datasource.azureaisearch/AzureAISearchBot/AzureAISearchBot.csproj +++ b/dotnet/samples/08.datasource.azureaisearch/AzureAISearchBot/AzureAISearchBot.csproj @@ -15,7 +15,7 @@ - + diff --git a/dotnet/samples/08.datasource.azureopenai/AzureOpenAIBot.csproj b/dotnet/samples/08.datasource.azureopenai/AzureOpenAIBot.csproj index fbc8b66b1..1157e6d6c 100644 --- a/dotnet/samples/08.datasource.azureopenai/AzureOpenAIBot.csproj +++ b/dotnet/samples/08.datasource.azureopenai/AzureOpenAIBot.csproj @@ -15,7 +15,7 @@ - + From 9292bb87dc02d1f95b11ec26386a95de50e76c1a Mon Sep 17 00:00:00 2001 From: kavin <115390646+singhk97@users.noreply.github.com> Date: Wed, 11 Dec 2024 16:49:54 -0500 Subject: [PATCH 15/19] [C#] fix: Remove `[]` intializer notation (#2232) ## Linked issues closes: #minor ## Details remove `[]` notation because it is not supported in version < C#12. That includes .NET 6 which is a framework we target. ## Attestation Checklist - [x] My code follows the style guidelines of this project - I have checked for/fixed spelling, linting, and other errors - I have commented my code for clarity - I have made corresponding changes to the documentation (updating the doc strings in the code is sufficient) - My changes generate no new warnings - I have added tests that validates my changes, and provides sufficient test coverage. I have tested with: - Local testing - E2E testing in Teams - New and existing unit tests pass locally with my changes --------- Signed-off-by: dependabot[bot] Co-authored-by: Lily Du Co-authored-by: lilydu Co-authored-by: Tarek Mahmoud Sayed <10833894+tarekgh@users.noreply.github.com> Co-authored-by: Steven Ickman Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Corina <14900841+corinagum@users.noreply.github.com> Co-authored-by: Yiqing Zhao Co-authored-by: Yiqing Zhao Co-authored-by: Alex Acebo --- .../Microsoft.TeamsAI/Microsoft.TeamsAI/.editorconfig | 3 +++ .../Microsoft.TeamsAI/AI/Models/SequenceBuilder.cs | 6 +++--- .../AI/Models/StreamingChatToolCallsBuilder.cs | 10 +++++----- 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/dotnet/packages/Microsoft.TeamsAI/Microsoft.TeamsAI/.editorconfig b/dotnet/packages/Microsoft.TeamsAI/Microsoft.TeamsAI/.editorconfig index 5e51edaf1..24b8ee970 100644 --- a/dotnet/packages/Microsoft.TeamsAI/Microsoft.TeamsAI/.editorconfig +++ b/dotnet/packages/Microsoft.TeamsAI/Microsoft.TeamsAI/.editorconfig @@ -2,3 +2,6 @@ # CS0618: Type or member is obsolete dotnet_diagnostic.CS0618.severity = silent + +# IDE0028: Simplify collection initialization +dotnet_diagnostic.IDE0028.severity = silent diff --git a/dotnet/packages/Microsoft.TeamsAI/Microsoft.TeamsAI/AI/Models/SequenceBuilder.cs b/dotnet/packages/Microsoft.TeamsAI/Microsoft.TeamsAI/AI/Models/SequenceBuilder.cs index 17105b53a..979105d67 100644 --- a/dotnet/packages/Microsoft.TeamsAI/Microsoft.TeamsAI/AI/Models/SequenceBuilder.cs +++ b/dotnet/packages/Microsoft.TeamsAI/Microsoft.TeamsAI/AI/Models/SequenceBuilder.cs @@ -3,10 +3,10 @@ namespace Microsoft.Teams.AI.AI.Models { - public class SequenceBuilder + internal class SequenceBuilder { - private Segment _first; - private Segment _last; + private Segment? _first; + private Segment? _last; public void Append(ReadOnlyMemory data) { diff --git a/dotnet/packages/Microsoft.TeamsAI/Microsoft.TeamsAI/AI/Models/StreamingChatToolCallsBuilder.cs b/dotnet/packages/Microsoft.TeamsAI/Microsoft.TeamsAI/AI/Models/StreamingChatToolCallsBuilder.cs index 80f10c10f..78b1f23b7 100644 --- a/dotnet/packages/Microsoft.TeamsAI/Microsoft.TeamsAI/AI/Models/StreamingChatToolCallsBuilder.cs +++ b/dotnet/packages/Microsoft.TeamsAI/Microsoft.TeamsAI/AI/Models/StreamingChatToolCallsBuilder.cs @@ -3,11 +3,11 @@ namespace Microsoft.Teams.AI.AI.Models { - public class StreamingChatToolCallsBuilder + internal class StreamingChatToolCallsBuilder { - private readonly Dictionary _indexToToolCallId = []; - private readonly Dictionary _indexToFunctionName = []; - private readonly Dictionary> _indexToFunctionArguments = []; + private readonly Dictionary _indexToToolCallId = new(); + private readonly Dictionary _indexToFunctionName = new(); + private readonly Dictionary> _indexToFunctionArguments = new(); public void Append(StreamingChatToolCallUpdate toolCallUpdate) { @@ -39,7 +39,7 @@ public void Append(StreamingChatToolCallUpdate toolCallUpdate) public IReadOnlyList Build() { - List toolCalls = []; + List toolCalls = new(); foreach (KeyValuePair indexToToolCallIdPair in _indexToToolCallId) { From e119b57eae4233d43480eddb8650ba66d138e27d Mon Sep 17 00:00:00 2001 From: Corina <14900841+corinagum@users.noreply.github.com> Date: Thu, 12 Dec 2024 14:42:57 -0800 Subject: [PATCH 16/19] [repo] fix: C# Citations' `encodingFormat` to not be hardcoded. Fix JS AssistantsPlanner options to set api version (#2235) ## Linked issues closes: #2234 closes: #2233 ## Details - Fix C# `AIEntity` to make `encodingFormat` optional and not hardcoded. - Change inline docs to indicate `encodingFormat` is for `citation.appearance.text` - Update `AssistantsPlannerOptions` to include `api_version` field - Update `AssistantsPlanner` to set `api_version` ## Attestation Checklist - [x] My code follows the style guidelines of this project - I have checked for/fixed spelling, linting, and other errors - I have commented my code for clarity - I have made corresponding changes to the documentation (updating the doc strings in the code is sufficient) - My changes generate no new warnings - I have added tests that validates my changes, and provides sufficient test coverage. I have tested with: - Local testing - E2E testing in Teams - New and existing unit tests pass locally with my changes --------- Co-authored-by: Corina Gum <> --- .../Microsoft.TeamsAI/AI/Action/AIEntity.cs | 6 +++--- js/packages/teams-ai/src/planners/AssistantsPlanner.spec.ts | 3 ++- js/packages/teams-ai/src/planners/AssistantsPlanner.ts | 6 ++++++ js/packages/teams-ai/src/types/ClientCitation.ts | 2 +- js/samples/04.ai-apps/d.assistants-mathBot/src/bot.ts | 3 ++- js/samples/04.ai-apps/e.assistants-orderBot/src/bot.ts | 3 ++- python/packages/ai/teams/ai/citations/citations.py | 6 +++--- 7 files changed, 19 insertions(+), 10 deletions(-) diff --git a/dotnet/packages/Microsoft.TeamsAI/Microsoft.TeamsAI/AI/Action/AIEntity.cs b/dotnet/packages/Microsoft.TeamsAI/Microsoft.TeamsAI/AI/Action/AIEntity.cs index 79ebe7139..12f7c597d 100644 --- a/dotnet/packages/Microsoft.TeamsAI/Microsoft.TeamsAI/AI/Action/AIEntity.cs +++ b/dotnet/packages/Microsoft.TeamsAI/Microsoft.TeamsAI/AI/Action/AIEntity.cs @@ -94,7 +94,7 @@ public class ClientCitationAppearance public string Name { get; set; } = string.Empty; /// - /// Optional. The citation appreance text. It is ignored in Teams. + /// Optional. The citation appearance text. /// [JsonProperty(PropertyName = "text")] public string? Text { get; set; } @@ -112,10 +112,10 @@ public class ClientCitationAppearance public string Abstract { get; set; } = string.Empty; /// - /// The encoding format used for the icon. + /// Optional. Encoding format of the `citation.appearance.text` field. /// [JsonProperty(PropertyName = "encodingFormat")] - public string EncodingFormat { get; set; } = "text/html"; + public string? EncodingFormat { get; set; } /// /// The icon provided in the citation ui. diff --git a/js/packages/teams-ai/src/planners/AssistantsPlanner.spec.ts b/js/packages/teams-ai/src/planners/AssistantsPlanner.spec.ts index 40a116844..10b47ed1a 100644 --- a/js/packages/teams-ai/src/planners/AssistantsPlanner.spec.ts +++ b/js/packages/teams-ai/src/planners/AssistantsPlanner.spec.ts @@ -53,7 +53,8 @@ describe('AssistantsPlanner', () => { const options: AssistantsPlannerOptions = { apiKey: 'test-key', - assistant_id: 'test-assistant-id' + assistant_id: 'test-assistant-id', + api_version: '2024-02-15' }; planner = new AssistantsPlanner(options); diff --git a/js/packages/teams-ai/src/planners/AssistantsPlanner.ts b/js/packages/teams-ai/src/planners/AssistantsPlanner.ts index b6e4e5dd5..4ca211e87 100644 --- a/js/packages/teams-ai/src/planners/AssistantsPlanner.ts +++ b/js/packages/teams-ai/src/planners/AssistantsPlanner.ts @@ -68,6 +68,11 @@ export interface AssistantsPlannerOptions { * Defaults to 'conversation.assistants_state'. */ assistants_state_variable?: string; + + /** + * Optional. Version of the API being called. Default is '2024-02-15-preview'. + */ + api_version?: string; } /** @@ -92,6 +97,7 @@ export class AssistantsPlanner implements this._options = { polling_interval: DEFAULT_POLLING_INTERVAL, assistants_state_variable: DEFAULT_ASSISTANTS_STATE_VARIABLE, + api_version: '2024-02-15-preview', ...options }; diff --git a/js/packages/teams-ai/src/types/ClientCitation.ts b/js/packages/teams-ai/src/types/ClientCitation.ts index cc42f1079..00df974cd 100644 --- a/js/packages/teams-ai/src/types/ClientCitation.ts +++ b/js/packages/teams-ai/src/types/ClientCitation.ts @@ -73,7 +73,7 @@ export interface ClientCitation { abstract: string; /** - * Encoding format of the ` citation.appearance.text` field. + * Encoding format of the `citation.appearance.text` field. */ encodingFormat?: 'application/vnd.microsoft.card.adaptive'; diff --git a/js/samples/04.ai-apps/d.assistants-mathBot/src/bot.ts b/js/samples/04.ai-apps/d.assistants-mathBot/src/bot.ts index b5c3907ba..71bd1bf42 100644 --- a/js/samples/04.ai-apps/d.assistants-mathBot/src/bot.ts +++ b/js/samples/04.ai-apps/d.assistants-mathBot/src/bot.ts @@ -40,7 +40,8 @@ if (!process.env.ASSISTANT_ID) { const planner = new AssistantsPlanner({ apiKey: apiKey, endpoint: endpoint, - assistant_id: process.env.ASSISTANT_ID! + assistant_id: process.env.ASSISTANT_ID!, + api_version: '2024-02-15-preview' }); // Define storage and application diff --git a/js/samples/04.ai-apps/e.assistants-orderBot/src/bot.ts b/js/samples/04.ai-apps/e.assistants-orderBot/src/bot.ts index 1121751e2..0e818c22d 100644 --- a/js/samples/04.ai-apps/e.assistants-orderBot/src/bot.ts +++ b/js/samples/04.ai-apps/e.assistants-orderBot/src/bot.ts @@ -61,7 +61,8 @@ if (!process.env.ASSISTANT_ID) { const planner = new AssistantsPlanner({ apiKey: apiKey, endpoint: endpoint, - assistant_id: process.env.ASSISTANT_ID ?? assistantId + assistant_id: process.env.ASSISTANT_ID ?? assistantId, + api_version: '2024-02-15-preview' }); // Define storage and application diff --git a/python/packages/ai/teams/ai/citations/citations.py b/python/packages/ai/teams/ai/citations/citations.py index 100a62fd5..97cd57c50 100644 --- a/python/packages/ai/teams/ai/citations/citations.py +++ b/python/packages/ai/teams/ai/citations/citations.py @@ -64,11 +64,11 @@ class Appearance(Model): Attributes: @type (str): Required; must be 'DigitalDocument' name (str): The name of the document - text (str): Optional; ignored in Teams + text (str): Optional; the appearance text of the citation. url (str): The url of the document abstract (str): Content of the citation. Must be clipped if longer than 480 characters - encodingFormat (str): The encoding format of the citation - image (str): Used for icon; for not it is ignored + encodingFormat (str): Encoding format of the `citation.appearance.text` field. + image (str): Used for icon; for now it is ignored keywords (list[str]): The optional keywords to the citation usageInfo (SensitivityUsageInfo): The optional sensitivity content information """ From a36bd76f8d78c106874545365a5e9e500f0c8dd1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 17 Dec 2024 09:47:14 -0800 Subject: [PATCH 17/19] [repo] bump: (deps): Bump github/codeql-action from 3.27.6 to 3.27.9 in the production group (#2239) #minor Bumps the production group with 1 update: [github/codeql-action](https://github.com/github/codeql-action). Updates `github/codeql-action` from 3.27.6 to 3.27.9
Release notes

Sourced from github/codeql-action's releases.

v3.27.9

CodeQL Action Changelog

See the releases page for the relevant changes to the CodeQL CLI and language packs.

Note that the only difference between v2 and v3 of the CodeQL Action is the node version they support, with v3 running on node 20 while we continue to release v2 to support running on node 16. For example 3.22.11 was the first v3 release and is functionally identical to 2.22.11. This approach ensures an easy way to track exactly which features are included in different versions, indicated by the minor and patch version numbers.

3.27.9 - 12 Dec 2024

No user facing changes.

See the full CHANGELOG.md for more information.

v3.27.7

CodeQL Action Changelog

See the releases page for the relevant changes to the CodeQL CLI and language packs.

Note that the only difference between v2 and v3 of the CodeQL Action is the node version they support, with v3 running on node 20 while we continue to release v2 to support running on node 16. For example 3.22.11 was the first v3 release and is functionally identical to 2.22.11. This approach ensures an easy way to track exactly which features are included in different versions, indicated by the minor and patch version numbers.

3.27.7 - 10 Dec 2024

  • We are rolling out a change in December 2024 that will extract the CodeQL bundle directly to the toolcache to improve performance. #2631
  • Update default CodeQL bundle version to 2.20.0. #2636

See the full CHANGELOG.md for more information.

Changelog

Sourced from github/codeql-action's changelog.

CodeQL Action Changelog

See the releases page for the relevant changes to the CodeQL CLI and language packs.

Note that the only difference between v2 and v3 of the CodeQL Action is the node version they support, with v3 running on node 20 while we continue to release v2 to support running on node 16. For example 3.22.11 was the first v3 release and is functionally identical to 2.22.11. This approach ensures an easy way to track exactly which features are included in different versions, indicated by the minor and patch version numbers.

[UNRELEASED]

No user facing changes.

3.27.9 - 12 Dec 2024

No user facing changes.

3.27.8 - 12 Dec 2024

  • Fixed an issue where streaming the download and extraction of the CodeQL bundle did not respect proxy settings. #2624

3.27.7 - 10 Dec 2024

  • We are rolling out a change in December 2024 that will extract the CodeQL bundle directly to the toolcache to improve performance. #2631
  • Update default CodeQL bundle version to 2.20.0. #2636

3.27.6 - 03 Dec 2024

  • Update default CodeQL bundle version to 2.19.4. #2626

3.27.5 - 19 Nov 2024

No user facing changes.

3.27.4 - 14 Nov 2024

No user facing changes.

3.27.3 - 12 Nov 2024

No user facing changes.

3.27.2 - 12 Nov 2024

  • Fixed an issue where setting up the CodeQL tools would sometimes fail with the message "Invalid value 'undefined' for header 'authorization'". #2590

3.27.1 - 08 Nov 2024

  • The CodeQL Action now downloads bundles compressed using Zstandard on GitHub Enterprise Server when using Linux or macOS runners. This speeds up the installation of the CodeQL tools. This feature is already available to GitHub.com users. #2573
  • Update default CodeQL bundle version to 2.19.3. #2576

3.27.0 - 22 Oct 2024

... (truncated)

Commits
  • df409f7 Merge pull request #2649 from github/update-v3.27.9-7972a42f3
  • feca44d Update changelog for v3.27.9
  • 7972a42 Merge pull request #2648 from github/aeisenberg/add-environment
  • 44bf16d Merge pull request #2646 from github/mergeback/v3.27.8-to-main-8a93837a
  • f124ad0 Adds an environment for creating releases
  • 9275370 Update checked-in dependencies
  • a059a7a Update changelog and version after v3.27.8
  • 8a93837 Merge pull request #2645 from github/update-v3.27.8-9cfbef4bd
  • 90a2700 Update changelog for v3.27.8
  • 9cfbef4 Merge pull request #2644 from github/aeisenberg/use-app-token-for-release
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=github/codeql-action&package-manager=github_actions&previous-version=3.27.6&new-version=3.27.9)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore major version` will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself) - `@dependabot ignore minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself) - `@dependabot ignore ` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself) - `@dependabot unignore ` will remove all of the ignore conditions of the specified dependency - `@dependabot unignore ` will remove the ignore condition of the specified dependency and ignore conditions
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/dotnet-codeql.yml | 4 ++-- .github/workflows/js-codeql.yml | 4 ++-- .github/workflows/python-codeql.yml | 4 ++-- .github/workflows/scorecards.yml | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/workflows/dotnet-codeql.yml b/.github/workflows/dotnet-codeql.yml index b0e38c3bc..f7181eadf 100644 --- a/.github/workflows/dotnet-codeql.yml +++ b/.github/workflows/dotnet-codeql.yml @@ -39,7 +39,7 @@ jobs: - name: Checkout uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Initialize CodeQL - uses: github/codeql-action/init@aa578102511db1f4524ed59b8cc2bae4f6e88195 # v3.27.6 + uses: github/codeql-action/init@df409f7d9260372bd5f19e5b04e83cb3c43714ae # v3.27.9 with: languages: csharp - name: Setup .NET @@ -50,6 +50,6 @@ jobs: working-directory: dotnet/packages/Microsoft.TeamsAI/ run: dotnet build Microsoft.Teams.AI.sln --configuration Release - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@aa578102511db1f4524ed59b8cc2bae4f6e88195 # v3.27.6 + uses: github/codeql-action/analyze@df409f7d9260372bd5f19e5b04e83cb3c43714ae # v3.27.9 with: category: "/language:csharp" diff --git a/.github/workflows/js-codeql.yml b/.github/workflows/js-codeql.yml index a445fdc16..a0825a395 100644 --- a/.github/workflows/js-codeql.yml +++ b/.github/workflows/js-codeql.yml @@ -38,10 +38,10 @@ jobs: - name: Checkout uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Initialize CodeQL - uses: github/codeql-action/init@aa578102511db1f4524ed59b8cc2bae4f6e88195 # v3.27.6 + uses: github/codeql-action/init@df409f7d9260372bd5f19e5b04e83cb3c43714ae # v3.27.9 with: languages: javascript - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@aa578102511db1f4524ed59b8cc2bae4f6e88195 # v3.27.6 + uses: github/codeql-action/analyze@df409f7d9260372bd5f19e5b04e83cb3c43714ae # v3.27.9 with: category: "/language:javascript" diff --git a/.github/workflows/python-codeql.yml b/.github/workflows/python-codeql.yml index ee59bc885..6d4e699af 100644 --- a/.github/workflows/python-codeql.yml +++ b/.github/workflows/python-codeql.yml @@ -38,10 +38,10 @@ jobs: - name: Checkout uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Initialize CodeQL - uses: github/codeql-action/init@aa578102511db1f4524ed59b8cc2bae4f6e88195 # v3.27.6 + uses: github/codeql-action/init@df409f7d9260372bd5f19e5b04e83cb3c43714ae # v3.27.9 with: languages: python - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@aa578102511db1f4524ed59b8cc2bae4f6e88195 # v3.27.6 + uses: github/codeql-action/analyze@df409f7d9260372bd5f19e5b04e83cb3c43714ae # v3.27.9 with: category: "/language:python" diff --git a/.github/workflows/scorecards.yml b/.github/workflows/scorecards.yml index 30576f521..65b413076 100644 --- a/.github/workflows/scorecards.yml +++ b/.github/workflows/scorecards.yml @@ -66,6 +66,6 @@ jobs: # Upload the results to GitHub's code scanning dashboard. - name: "Upload to code-scanning" - uses: github/codeql-action/upload-sarif@aa578102511db1f4524ed59b8cc2bae4f6e88195 # v3.27.6 + uses: github/codeql-action/upload-sarif@df409f7d9260372bd5f19e5b04e83cb3c43714ae # v3.27.9 with: sarif_file: results.sarif From dfeb5b16fd044f4405b97ed0c99514bbc259d7f9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 17 Dec 2024 09:48:13 -0800 Subject: [PATCH 18/19] [JS] bump: (deps-dev): Bump @microsoft/api-extractor from 7.48.0 to 7.48.1 in /js in the development group (#2238) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit #minor Bumps the development group in /js with 1 update: [@microsoft/api-extractor](https://github.com/microsoft/rushstack/tree/HEAD/apps/api-extractor). Updates `@microsoft/api-extractor` from 7.48.0 to 7.48.1
Changelog

Sourced from @​microsoft/api-extractor's changelog.

7.48.1

Sat, 14 Dec 2024 01:11:07 GMT

Version update only

Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=@microsoft/api-extractor&package-manager=npm_and_yarn&previous-version=7.48.0&new-version=7.48.1)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore major version` will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself) - `@dependabot ignore minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself) - `@dependabot ignore ` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself) - `@dependabot unignore ` will remove all of the ignore conditions of the specified dependency - `@dependabot unignore ` will remove the ignore condition of the specified dependency and ignore conditions
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- js/package.json | 2 +- js/yarn.lock | 54 ++++++++++++++++++++++++------------------------- 2 files changed, 28 insertions(+), 28 deletions(-) diff --git a/js/package.json b/js/package.json index 6b38b07ab..0b5300b1a 100644 --- a/js/package.json +++ b/js/package.json @@ -26,7 +26,7 @@ "devDependencies": { "@azure/logger": "^1.1.4", "@azure/ms-rest-js": "2.7.0", - "@microsoft/api-extractor": "^7.47.11", + "@microsoft/api-extractor": "^7.48.1", "@standardlabs/is-private": "^1.0.1", "@types/jsonwebtoken": "9.0.4", "@types/lodash": "^4.17.13", diff --git a/js/yarn.lock b/js/yarn.lock index 52227566b..ec404a125 100644 --- a/js/yarn.lock +++ b/js/yarn.lock @@ -592,27 +592,27 @@ "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" -"@microsoft/api-extractor-model@7.30.0": - version "7.30.0" - resolved "https://registry.yarnpkg.com/@microsoft/api-extractor-model/-/api-extractor-model-7.30.0.tgz#18a0528350124015b2c08397474e9309a8b3c807" - integrity sha512-26/LJZBrsWDKAkOWRiQbdVgcfd1F3nyJnAiJzsAgpouPk7LtOIj7PK9aJtBaw/pUXrkotEg27RrT+Jm/q0bbug== +"@microsoft/api-extractor-model@7.30.1": + version "7.30.1" + resolved "https://registry.yarnpkg.com/@microsoft/api-extractor-model/-/api-extractor-model-7.30.1.tgz#719e2ab8afe8fe3a5dd65aaa8783dbba90f7c802" + integrity sha512-CTS2PlASJHxVY8hqHORVb1HdECWOEMcMnM6/kDkPr0RZapAFSIHhg9D4jxuE8g+OWYHtPc10LCpmde5pylTRlA== dependencies: "@microsoft/tsdoc" "~0.15.1" "@microsoft/tsdoc-config" "~0.17.1" - "@rushstack/node-core-library" "5.10.0" + "@rushstack/node-core-library" "5.10.1" -"@microsoft/api-extractor@^7.47.11": - version "7.48.0" - resolved "https://registry.yarnpkg.com/@microsoft/api-extractor/-/api-extractor-7.48.0.tgz#d87243bdafbfadcf87b336b2b4e5de71ecc7caab" - integrity sha512-FMFgPjoilMUWeZXqYRlJ3gCVRhB7WU/HN88n8OLqEsmsG4zBdX/KQdtJfhq95LQTQ++zfu0Em1LLb73NqRCLYQ== +"@microsoft/api-extractor@^7.48.1": + version "7.48.1" + resolved "https://registry.yarnpkg.com/@microsoft/api-extractor/-/api-extractor-7.48.1.tgz#792197cfc5113cd2efc04524c065d682ef58d2ba" + integrity sha512-HN9Osa1WxqLM66RaqB5nPAadx+nTIQmY/XtkFdaJvusjG8Tus++QqZtD7KPZDSkhEMGHsYeSyeU8qUzCDUXPjg== dependencies: - "@microsoft/api-extractor-model" "7.30.0" + "@microsoft/api-extractor-model" "7.30.1" "@microsoft/tsdoc" "~0.15.1" "@microsoft/tsdoc-config" "~0.17.1" - "@rushstack/node-core-library" "5.10.0" + "@rushstack/node-core-library" "5.10.1" "@rushstack/rig-package" "0.5.3" - "@rushstack/terminal" "0.14.3" - "@rushstack/ts-command-line" "4.23.1" + "@rushstack/terminal" "0.14.4" + "@rushstack/ts-command-line" "4.23.2" lodash "~4.17.15" minimatch "~3.0.3" resolve "~1.22.1" @@ -839,10 +839,10 @@ resolved "https://registry.yarnpkg.com/@rtsao/scc/-/scc-1.1.0.tgz#927dd2fae9bc3361403ac2c7a00c32ddce9ad7e8" integrity sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g== -"@rushstack/node-core-library@5.10.0": - version "5.10.0" - resolved "https://registry.yarnpkg.com/@rushstack/node-core-library/-/node-core-library-5.10.0.tgz#84173c913761a7d1edef5c818ce03d9e22cab9d7" - integrity sha512-2pPLCuS/3x7DCd7liZkqOewGM0OzLyCacdvOe8j6Yrx9LkETGnxul1t7603bIaB8nUAooORcct9fFDOQMbWAgw== +"@rushstack/node-core-library@5.10.1": + version "5.10.1" + resolved "https://registry.yarnpkg.com/@rushstack/node-core-library/-/node-core-library-5.10.1.tgz#14c10c918ed12da003c21af9d5bf0e76633215d2" + integrity sha512-BSb/KcyBHmUQwINrgtzo6jiH0HlGFmrUy33vO6unmceuVKTEyL2q+P0fQq2oB5hvXVWOEUhxB2QvlkZluvUEmg== dependencies: ajv "~8.13.0" ajv-draft-04 "~1.0.0" @@ -861,20 +861,20 @@ resolve "~1.22.1" strip-json-comments "~3.1.1" -"@rushstack/terminal@0.14.3": - version "0.14.3" - resolved "https://registry.yarnpkg.com/@rushstack/terminal/-/terminal-0.14.3.tgz#eae0198e73eac56c901f6e00d0d4254c50a3f655" - integrity sha512-csXbZsAdab/v8DbU1sz7WC2aNaKArcdS/FPmXMOXEj/JBBZMvDK0+1b4Qao0kkG0ciB1Qe86/Mb68GjH6/TnMw== +"@rushstack/terminal@0.14.4": + version "0.14.4" + resolved "https://registry.yarnpkg.com/@rushstack/terminal/-/terminal-0.14.4.tgz#37e160b0878a324cf3e0fecab25fe48a030e29ed" + integrity sha512-NxACqERW0PHq8Rpq1V6v5iTHEwkRGxenjEW+VWqRYQ8T9puUzgmGHmEZUaUEDHAe9Qyvp0/Ew04sAiQw9XjhJg== dependencies: - "@rushstack/node-core-library" "5.10.0" + "@rushstack/node-core-library" "5.10.1" supports-color "~8.1.1" -"@rushstack/ts-command-line@4.23.1": - version "4.23.1" - resolved "https://registry.yarnpkg.com/@rushstack/ts-command-line/-/ts-command-line-4.23.1.tgz#d5e33dbb1a016d9440b3a20010b82ccfe9abd34a" - integrity sha512-40jTmYoiu/xlIpkkRsVfENtBq4CW3R4azbL0Vmda+fMwHWqss6wwf/Cy/UJmMqIzpfYc2OTnjYP1ZLD3CmyeCA== +"@rushstack/ts-command-line@4.23.2": + version "4.23.2" + resolved "https://registry.yarnpkg.com/@rushstack/ts-command-line/-/ts-command-line-4.23.2.tgz#37b28a418db84d04f6a1c787390dd02ad8dfadf0" + integrity sha512-JJ7XZX5K3ThBBva38aomgsPv1L7FV6XmSOcR6HtM7HDFZJkepqT65imw26h9ggGqMjsY0R9jcl30tzKcVj9aOQ== dependencies: - "@rushstack/terminal" "0.14.3" + "@rushstack/terminal" "0.14.4" "@types/argparse" "1.0.38" argparse "~1.0.9" string-argv "~0.3.1" From 41ed04ceac9382150fde2850695fe67a7a4e33f3 Mon Sep 17 00:00:00 2001 From: Corina <14900841+corinagum@users.noreply.github.com> Date: Tue, 17 Dec 2024 11:35:49 -0800 Subject: [PATCH 19/19] [JS] Bump Teams AI for patch release 1.7.1 (#2236) ## Linked issues closes: #minor --------- Co-authored-by: Corina Gum <> --- .github/CODEOWNERS | 6 +++--- js/packages/teams-ai/package.json | 2 +- js/samples/01.getting-started/a.echoBot/package.json | 2 +- .../a.messageExtensions.searchCommand/package.json | 2 +- .../b.adaptiveCards.typeAheadBot/package.json | 2 +- js/samples/03.ai-concepts/a.twentyQuestions/package.json | 2 +- .../03.ai-concepts/b.AI-messageExtensions/package.json | 2 +- .../03.ai-concepts/c.actionMapping-lightBot/package.json | 2 +- .../03.ai-concepts/d.chainedActions-listBot/package.json | 2 +- js/samples/03.ai-concepts/e.customModel-LLAMA/package.json | 2 +- js/samples/03.ai-concepts/f.chatModeration/package.json | 2 +- js/samples/04.ai-apps/a.teamsChefBot/package.json | 2 +- js/samples/04.ai-apps/b.devOpsBot/package.json | 2 +- js/samples/04.ai-apps/c.vision-cardGazer/package.json | 2 +- js/samples/04.ai-apps/d.assistants-mathBot/package.json | 2 +- js/samples/04.ai-apps/e.assistants-orderBot/package.json | 2 +- js/samples/04.ai-apps/f.whoBot/package.json | 2 +- .../04.ai-apps/g.datasource-azureAISearch/package.json | 2 +- js/samples/04.ai-apps/h.datasource-azureOpenAI/package.json | 2 +- js/samples/04.ai-apps/i.teamsChefBot-streaming/package.json | 2 +- .../05.authentication/a.oauth-adaptiveCard/package.json | 2 +- js/samples/05.authentication/b.oauth-bot/package.json | 2 +- .../05.authentication/c.oauth-messageExtension/package.json | 2 +- js/samples/05.authentication/d.teamsSSO-bot/package.json | 2 +- .../e.teamsSSO-messageExtension/package.json | 2 +- 25 files changed, 27 insertions(+), 27 deletions(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index e4fd95f41..8f3d768b7 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -2,15 +2,15 @@ # JS -/js @aacebo @corinagum @lilyydu @singhk97 @rajan-chari +/js @aacebo @corinagum @lilyydu @singhk97 @rajan-chari @heyitsaamir # .NET -/dotnet @aacebo @corinagum @lilyydu @singhk97 @rajan-chari +/dotnet @aacebo @corinagum @lilyydu @singhk97 @rajan-chari @heyitsaamir # Python -/python @aacebo @corinagum @lilyydu @singhk97 @rajan-chari +/python @aacebo @corinagum @lilyydu @singhk97 @rajan-chari @heyitsaamir # TTK diff --git a/js/packages/teams-ai/package.json b/js/packages/teams-ai/package.json index 5762a3dae..fb705f1bb 100644 --- a/js/packages/teams-ai/package.json +++ b/js/packages/teams-ai/package.json @@ -2,7 +2,7 @@ "name": "@microsoft/teams-ai", "author": "Microsoft Corp.", "description": "SDK focused on building AI based applications for Microsoft Teams.", - "version": "1.7.0", + "version": "1.7.1", "license": "MIT", "keywords": [ "botbuilder", diff --git a/js/samples/01.getting-started/a.echoBot/package.json b/js/samples/01.getting-started/a.echoBot/package.json index c56f8a3df..a2dccddda 100644 --- a/js/samples/01.getting-started/a.echoBot/package.json +++ b/js/samples/01.getting-started/a.echoBot/package.json @@ -22,7 +22,7 @@ "url": "https://github.com/microsoft/teams-ai/" }, "dependencies": { - "@microsoft/teams-ai": "~1.7.0", + "@microsoft/teams-ai": "~1.7.1", "botbuilder": "^4.23.1", "dotenv": "^16.4.5", "openai": "4.68.2", diff --git a/js/samples/02.teams-features/a.messageExtensions.searchCommand/package.json b/js/samples/02.teams-features/a.messageExtensions.searchCommand/package.json index 084f972bf..54524083e 100644 --- a/js/samples/02.teams-features/a.messageExtensions.searchCommand/package.json +++ b/js/samples/02.teams-features/a.messageExtensions.searchCommand/package.json @@ -19,7 +19,7 @@ "url": "https://github.com/microsoft/teams-ai" }, "dependencies": { - "@microsoft/teams-ai": "~1.7.0", + "@microsoft/teams-ai": "~1.7.1", "axios": "^1.7.5", "botbuilder": "^4.23.1", "dotenv": "^16.4.5", diff --git a/js/samples/02.teams-features/b.adaptiveCards.typeAheadBot/package.json b/js/samples/02.teams-features/b.adaptiveCards.typeAheadBot/package.json index 004296494..2c974e22d 100644 --- a/js/samples/02.teams-features/b.adaptiveCards.typeAheadBot/package.json +++ b/js/samples/02.teams-features/b.adaptiveCards.typeAheadBot/package.json @@ -22,7 +22,7 @@ "url": "https://github.com/microsoft/teams-ai" }, "dependencies": { - "@microsoft/teams-ai": "~1.7.0", + "@microsoft/teams-ai": "~1.7.1", "axios": "^1.7.5", "botbuilder": "^4.23.1", "dotenv": "^16.4.5", diff --git a/js/samples/03.ai-concepts/a.twentyQuestions/package.json b/js/samples/03.ai-concepts/a.twentyQuestions/package.json index de41ddaf8..8da4cecab 100644 --- a/js/samples/03.ai-concepts/a.twentyQuestions/package.json +++ b/js/samples/03.ai-concepts/a.twentyQuestions/package.json @@ -21,7 +21,7 @@ "url": "https://github.com/microsoft/teams-ai" }, "dependencies": { - "@microsoft/teams-ai": "~1.7.0", + "@microsoft/teams-ai": "~1.7.1", "botbuilder": "^4.23.1", "dotenv": "^16.4.5", "openai": "4.68.2", diff --git a/js/samples/03.ai-concepts/b.AI-messageExtensions/package.json b/js/samples/03.ai-concepts/b.AI-messageExtensions/package.json index 60cd5f00f..3e16a9e21 100644 --- a/js/samples/03.ai-concepts/b.AI-messageExtensions/package.json +++ b/js/samples/03.ai-concepts/b.AI-messageExtensions/package.json @@ -20,7 +20,7 @@ }, "dependencies": { "botbuilder": "^4.23.1", - "@microsoft/teams-ai": "~1.7.0", + "@microsoft/teams-ai": "~1.7.1", "dotenv": "^16.4.5", "openai": "4.68.2", "replace": "~1.2.0", diff --git a/js/samples/03.ai-concepts/c.actionMapping-lightBot/package.json b/js/samples/03.ai-concepts/c.actionMapping-lightBot/package.json index e87eb4514..3e4f2dec9 100644 --- a/js/samples/03.ai-concepts/c.actionMapping-lightBot/package.json +++ b/js/samples/03.ai-concepts/c.actionMapping-lightBot/package.json @@ -21,7 +21,7 @@ "url": "https://github.com/microsoft/teams-ai" }, "dependencies": { - "@microsoft/teams-ai": "~1.7.0", + "@microsoft/teams-ai": "~1.7.1", "botbuilder": "^4.23.1", "dotenv": "^16.4.5", "openai": "4.68.2", diff --git a/js/samples/03.ai-concepts/d.chainedActions-listBot/package.json b/js/samples/03.ai-concepts/d.chainedActions-listBot/package.json index 1b40a97ac..e15b02a7b 100644 --- a/js/samples/03.ai-concepts/d.chainedActions-listBot/package.json +++ b/js/samples/03.ai-concepts/d.chainedActions-listBot/package.json @@ -21,7 +21,7 @@ "url": "https://github.com/microsoft/teams-ai" }, "dependencies": { - "@microsoft/teams-ai": "~1.7.0", + "@microsoft/teams-ai": "~1.7.1", "botbuilder": "^4.23.1", "dotenv": "^16.4.5", "openai": "4.68.2", diff --git a/js/samples/03.ai-concepts/e.customModel-LLAMA/package.json b/js/samples/03.ai-concepts/e.customModel-LLAMA/package.json index 69e3dd178..62744906c 100644 --- a/js/samples/03.ai-concepts/e.customModel-LLAMA/package.json +++ b/js/samples/03.ai-concepts/e.customModel-LLAMA/package.json @@ -23,7 +23,7 @@ }, "dependencies": { "botbuilder": "^4.23.1", - "@microsoft/teams-ai": "~1.7.0", + "@microsoft/teams-ai": "~1.7.1", "openai": "4.68.2", "dotenv": "^16.4.1", "replace": "~1.2.0", diff --git a/js/samples/03.ai-concepts/f.chatModeration/package.json b/js/samples/03.ai-concepts/f.chatModeration/package.json index 3d8c7e6b2..81f215745 100644 --- a/js/samples/03.ai-concepts/f.chatModeration/package.json +++ b/js/samples/03.ai-concepts/f.chatModeration/package.json @@ -19,7 +19,7 @@ "url": "https://github.com/microsoft/teams-ai" }, "dependencies": { - "@microsoft/teams-ai": "~1.7.0", + "@microsoft/teams-ai": "~1.7.1", "axios": "^1.7.5", "botbuilder": "^4.23.1", "dotenv": "^16.4.5", diff --git a/js/samples/04.ai-apps/a.teamsChefBot/package.json b/js/samples/04.ai-apps/a.teamsChefBot/package.json index ea600adbd..432623e90 100644 --- a/js/samples/04.ai-apps/a.teamsChefBot/package.json +++ b/js/samples/04.ai-apps/a.teamsChefBot/package.json @@ -22,7 +22,7 @@ "url": "https://github.com/microsoft/teams-ai" }, "dependencies": { - "@microsoft/teams-ai": "~1.7.0", + "@microsoft/teams-ai": "~1.7.1", "@microsoft/teams-js": "^2.31.0", "botbuilder": "^4.23.1", "dotenv": "^16.4.5", diff --git a/js/samples/04.ai-apps/b.devOpsBot/package.json b/js/samples/04.ai-apps/b.devOpsBot/package.json index 99fdad521..e974b2dd7 100644 --- a/js/samples/04.ai-apps/b.devOpsBot/package.json +++ b/js/samples/04.ai-apps/b.devOpsBot/package.json @@ -20,7 +20,7 @@ }, "dependencies": { "botbuilder": "^4.23.1", - "@microsoft/teams-ai": "~1.7.0", + "@microsoft/teams-ai": "~1.7.1", "dotenv": "^16.4.5", "replace": "~1.2.0", "restify": "~11.1.0", diff --git a/js/samples/04.ai-apps/c.vision-cardGazer/package.json b/js/samples/04.ai-apps/c.vision-cardGazer/package.json index e2dc668c3..7647f7669 100644 --- a/js/samples/04.ai-apps/c.vision-cardGazer/package.json +++ b/js/samples/04.ai-apps/c.vision-cardGazer/package.json @@ -20,7 +20,7 @@ "url": "https://github.com/microsoft/teams-ai" }, "dependencies": { - "@microsoft/teams-ai": "~1.7.0", + "@microsoft/teams-ai": "~1.7.1", "botbuilder": "^4.23.1", "dotenv": "^16.4.5", "openai": "4.68.2", diff --git a/js/samples/04.ai-apps/d.assistants-mathBot/package.json b/js/samples/04.ai-apps/d.assistants-mathBot/package.json index ed4c9d4e4..69280a74e 100644 --- a/js/samples/04.ai-apps/d.assistants-mathBot/package.json +++ b/js/samples/04.ai-apps/d.assistants-mathBot/package.json @@ -19,7 +19,7 @@ "url": "https://github.com/microsoft/teams-ai" }, "dependencies": { - "@microsoft/teams-ai": "~1.7.0", + "@microsoft/teams-ai": "~1.7.1", "axios": "^1.7.5", "botbuilder": "^4.23.1", "dotenv": "^16.4.5", diff --git a/js/samples/04.ai-apps/e.assistants-orderBot/package.json b/js/samples/04.ai-apps/e.assistants-orderBot/package.json index b8a0888ec..454522b12 100644 --- a/js/samples/04.ai-apps/e.assistants-orderBot/package.json +++ b/js/samples/04.ai-apps/e.assistants-orderBot/package.json @@ -21,7 +21,7 @@ "url": "https://github.com/microsoft/teams-ai" }, "dependencies": { - "@microsoft/teams-ai": "~1.7.0", + "@microsoft/teams-ai": "~1.7.1", "axios": "^1.7.5", "botbuilder": "^4.23.1", "dotenv": "^16.4.5", diff --git a/js/samples/04.ai-apps/f.whoBot/package.json b/js/samples/04.ai-apps/f.whoBot/package.json index 2fcbf4fee..45b334321 100644 --- a/js/samples/04.ai-apps/f.whoBot/package.json +++ b/js/samples/04.ai-apps/f.whoBot/package.json @@ -19,7 +19,7 @@ "url": "https://github.com/microsoft/teams-ai" }, "dependencies": { - "@microsoft/teams-ai": "~1.7.0", + "@microsoft/teams-ai": "~1.7.1", "botbuilder": "^4.23.1", "botbuilder-dialogs": "^4.23.1", "dotenv": "^16.4.5", diff --git a/js/samples/04.ai-apps/g.datasource-azureAISearch/package.json b/js/samples/04.ai-apps/g.datasource-azureAISearch/package.json index a785f1c4d..0a3bb436d 100644 --- a/js/samples/04.ai-apps/g.datasource-azureAISearch/package.json +++ b/js/samples/04.ai-apps/g.datasource-azureAISearch/package.json @@ -28,7 +28,7 @@ }, "dependencies": { "@azure/search-documents": "12.1.0", - "@microsoft/teams-ai": "~1.7.0", + "@microsoft/teams-ai": "~1.7.1", "botbuilder": "^4.23.1", "debug": "^4.3.7", "dotenv": "^16.4.1", diff --git a/js/samples/04.ai-apps/h.datasource-azureOpenAI/package.json b/js/samples/04.ai-apps/h.datasource-azureOpenAI/package.json index 0665a95ae..b8116aa88 100644 --- a/js/samples/04.ai-apps/h.datasource-azureOpenAI/package.json +++ b/js/samples/04.ai-apps/h.datasource-azureOpenAI/package.json @@ -27,7 +27,7 @@ "dependencies": { "@azure/identity": "^4.5.0", "@azure/search-documents": "12.1.0", - "@microsoft/teams-ai": "~1.7.0", + "@microsoft/teams-ai": "~1.7.1", "botbuilder": "^4.23.1", "dotenv": "^16.4.1", "openai": "4.68.2", diff --git a/js/samples/04.ai-apps/i.teamsChefBot-streaming/package.json b/js/samples/04.ai-apps/i.teamsChefBot-streaming/package.json index c05f96742..f2880b884 100644 --- a/js/samples/04.ai-apps/i.teamsChefBot-streaming/package.json +++ b/js/samples/04.ai-apps/i.teamsChefBot-streaming/package.json @@ -22,7 +22,7 @@ "url": "https://github.com/microsoft/teams-ai" }, "dependencies": { - "@microsoft/teams-ai": "~1.7.0", + "@microsoft/teams-ai": "~1.7.1", "@microsoft/teams-js": "^2.31.0", "botbuilder": "^4.23.1", "dotenv": "^16.4.5", diff --git a/js/samples/05.authentication/a.oauth-adaptiveCard/package.json b/js/samples/05.authentication/a.oauth-adaptiveCard/package.json index e8d6e49aa..f20adac42 100644 --- a/js/samples/05.authentication/a.oauth-adaptiveCard/package.json +++ b/js/samples/05.authentication/a.oauth-adaptiveCard/package.json @@ -20,7 +20,7 @@ }, "dependencies": { "@microsoft/microsoft-graph-client": "^3.0.7", - "@microsoft/teams-ai": "~1.7.0", + "@microsoft/teams-ai": "~1.7.1", "botbuilder": "^4.23.1", "dotenv": "^16.4.5", "openai": "4.68.2", diff --git a/js/samples/05.authentication/b.oauth-bot/package.json b/js/samples/05.authentication/b.oauth-bot/package.json index c62d89b3b..c097fa744 100644 --- a/js/samples/05.authentication/b.oauth-bot/package.json +++ b/js/samples/05.authentication/b.oauth-bot/package.json @@ -19,7 +19,7 @@ "url": "https://github.com/microsoft/teams-ai" }, "dependencies": { - "@microsoft/teams-ai": "~1.7.0", + "@microsoft/teams-ai": "~1.7.1", "botbuilder": "^4.23.1", "botbuilder-dialogs": "^4.23.1", "dotenv": "^16.4.5", diff --git a/js/samples/05.authentication/c.oauth-messageExtension/package.json b/js/samples/05.authentication/c.oauth-messageExtension/package.json index 5d3e0877a..67525e557 100644 --- a/js/samples/05.authentication/c.oauth-messageExtension/package.json +++ b/js/samples/05.authentication/c.oauth-messageExtension/package.json @@ -20,7 +20,7 @@ }, "dependencies": { "@microsoft/microsoft-graph-client": "^3.0.7", - "@microsoft/teams-ai": "~1.7.0", + "@microsoft/teams-ai": "~1.7.1", "botbuilder": "^4.23.1", "dotenv": "^16.4.5", "isomorphic-fetch": "^3.0.0", diff --git a/js/samples/05.authentication/d.teamsSSO-bot/package.json b/js/samples/05.authentication/d.teamsSSO-bot/package.json index 9e6f05bdd..429a4e126 100644 --- a/js/samples/05.authentication/d.teamsSSO-bot/package.json +++ b/js/samples/05.authentication/d.teamsSSO-bot/package.json @@ -19,7 +19,7 @@ "url": "https://github.com/microsoft/teams-ai" }, "dependencies": { - "@microsoft/teams-ai": "~1.7.0", + "@microsoft/teams-ai": "~1.7.1", "botbuilder": "^4.23.1", "botbuilder-dialogs": "^4.23.1", "dotenv": "^16.4.5", diff --git a/js/samples/05.authentication/e.teamsSSO-messageExtension/package.json b/js/samples/05.authentication/e.teamsSSO-messageExtension/package.json index 3d8f165a6..6a5e1a8b7 100644 --- a/js/samples/05.authentication/e.teamsSSO-messageExtension/package.json +++ b/js/samples/05.authentication/e.teamsSSO-messageExtension/package.json @@ -20,7 +20,7 @@ }, "dependencies": { "@microsoft/microsoft-graph-client": "^3.0.7", - "@microsoft/teams-ai": "~1.7.0", + "@microsoft/teams-ai": "~1.7.1", "botbuilder": "^4.23.1", "botbuilder-azure-blobs": "^4.23.1", "dotenv": "^16.4.5",