From a6566245d98a13df395fb29538d986f440181ecb Mon Sep 17 00:00:00 2001 From: vishalgtingre Date: Mon, 23 Oct 2023 02:10:55 +0530 Subject: [PATCH] Squashed commit of the following: commit ba88bd6484a4e0869f4e8b7c535ae07a342d781c Author: Pamela Fox Date: Thu Oct 19 17:37:00 2023 -0700 Add front-matter needed for Sample browser (#816) * Sample markup * Sample browser * Sample browser * Move less interesting things to the end * Move less interesting things to the end * Less descrip * Add ACS commit d53fdb18d9955b47a896593f390c45cebf72343d Author: Pamela Fox Date: Thu Oct 19 16:26:17 2023 -0700 Run prettier on files and add to precommit/CI (#834) * Lint the frontend * Revert repo changes * Use prettier config in app/frontend * Use prettier config in app/frontend * Update comment commit 1dd756fd6cda48bdbdc724b1911acec8bfdd4490 Author: Pamela Fox Date: Thu Oct 19 15:00:27 2023 -0700 Fix if for tests running (#833) commit 97433c1644fc6496fd96b3ba38fdc44a0861587b Author: Chris Harris Date: Wed Oct 18 20:42:30 2023 -0700 Update README.md - Dev Containers (#829) Replace Remote Containers with Dev Containers Add instructions for using Dev Containers commit a4801f905a6b6dabcfffcbd4a1d3563a9e08847e Author: Pamela Fox Date: Wed Oct 18 15:27:35 2023 -0700 Support windows by using uvicorn without extras (#815) * Support windows by using no extras * Try tests on Windows * jsonlines endings * debugging win * Try retry * Try retry * Warmup test * Warmup test * Warmup test * Add conditional to only run in Ubuntu * Revert other changes * Revert other changes * Revert other changes --------- Co-authored-by: Anthony Shaw commit 3475bb63319024313b07c8d2274d09c2c71ef598 Author: Tim Date: Wed Oct 18 06:47:48 2023 -0700 Change role from bot to assistant to fix bug when asking follow-up question in chat (#823) commit f50db7489bf0d41daeec2800d74a2da803e83c57 Author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue Oct 17 22:06:09 2023 -0700 Bump urllib3 from 2.0.6 to 2.0.7 in /app/backend (#820) * Bump urllib3 from 2.0.6 to 2.0.7 in /app/backend Bumps [urllib3](https://github.com/urllib3/urllib3) from 2.0.6 to 2.0.7. - [Release notes](https://github.com/urllib3/urllib3/releases) - [Changelog](https://github.com/urllib3/urllib3/blob/main/CHANGES.rst) - [Commits](https://github.com/urllib3/urllib3/compare/2.0.6...2.0.7) --- updated-dependencies: - dependency-name: urllib3 dependency-type: indirect ... Signed-off-by: dependabot[bot] * Update scripts too --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Pamela Fox Co-authored-by: Pamela Fox commit 1844b005ab62c301d7b62fbc3b6aed7267e46eae Author: Matt <57731498+mattmsft@users.noreply.github.com> Date: Tue Oct 17 21:51:32 2023 -0700 Add scheduler package (#822) * add scheduler package * Fix new test --------- Co-authored-by: Pamela Fox commit 07c2afa40c6d46210562a692c997ce68286b1bc8 Author: Pamela Fox Date: Tue Oct 17 12:35:54 2023 -0700 Message builder fixes for history format and token count (#778) * Message builder fixes * Fix types * Address Sri's comments * Update logic per Sris feedback * Test and log commit 69c41476f4f62485fa76569183474e4fd11c801f Author: Kesavaraja Krishnan <115058367+KesavarajaRK@users.noreply.github.com> Date: Mon Oct 16 22:57:07 2023 +0530 Increased maxtoken to avoid malformed JSON in chatreadretrieveread.py (#681) * Increased maxtoken to chatgpt_token_limit in chatreadretrieveread. * Modified to 1024 characters. * Change to 100 --------- Co-authored-by: Pamela Fox commit 774c47cd3f8fe09cff938c7e13dbc0fa3475a90a Author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon Oct 16 09:34:03 2023 -0700 Bump @babel/traverse from 7.23.0 to 7.23.2 in /app/frontend (#812) Bumps [@babel/traverse](https://github.com/babel/babel/tree/HEAD/packages/babel-traverse) from 7.23.0 to 7.23.2. - [Release notes](https://github.com/babel/babel/releases) - [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md) - [Commits](https://github.com/babel/babel/commits/v7.23.2/packages/babel-traverse) --- updated-dependencies: - dependency-name: "@babel/traverse" dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> commit e02b347883b91924f715b1bd62869a90eb48de08 Author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon Oct 16 09:27:11 2023 -0700 Bump the node-packages group in /app/frontend with 5 updates (#800) Bumps the node-packages group in /app/frontend with 5 updates: | Package | From | To | | --- | --- | --- | | [@fluentui/react](https://github.com/microsoft/fluentui) | `8.112.2` | `8.112.3` | | [@fluentui/react-components](https://github.com/microsoft/fluentui) | `9.34.2` | `9.35.0` | | [@fluentui/react-icons](https://github.com/microsoft/fluentui-system-icons) | `2.0.219` | `2.0.220` | | [@types/react](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/react) | `18.2.27` | `18.2.28` | | [@types/react-dom](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/react-dom) | `18.2.12` | `18.2.13` | Updates `@fluentui/react` from 8.112.2 to 8.112.3 - [Release notes](https://github.com/microsoft/fluentui/releases) - [Changelog](https://github.com/microsoft/fluentui/blob/master/azure-pipelines.release-fluentui.yml) - [Commits](https://github.com/microsoft/fluentui/compare/@fluentui/react_v8.112.2...@fluentui/react_v8.112.3) Updates `@fluentui/react-components` from 9.34.2 to 9.35.0 - [Release notes](https://github.com/microsoft/fluentui/releases) - [Changelog](https://github.com/microsoft/fluentui/blob/master/azure-pipelines.release-fluentui.yml) - [Commits](https://github.com/microsoft/fluentui/compare/@fluentui/react-components_v9.34.2...@fluentui/react-components_v9.35.0) Updates `@fluentui/react-icons` from 2.0.219 to 2.0.220 - [Commits](https://github.com/microsoft/fluentui-system-icons/commits) Updates `@types/react` from 18.2.27 to 18.2.28 - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/react) Updates `@types/react-dom` from 18.2.12 to 18.2.13 - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/react-dom) --- updated-dependencies: - dependency-name: "@fluentui/react" dependency-type: direct:production update-type: version-update:semver-patch dependency-group: node-packages - dependency-name: "@fluentui/react-components" dependency-type: direct:production update-type: version-update:semver-minor dependency-group: node-packages - dependency-name: "@fluentui/react-icons" dependency-type: direct:production update-type: version-update:semver-patch dependency-group: node-packages - dependency-name: "@types/react" dependency-type: direct:development update-type: version-update:semver-patch dependency-group: node-packages - dependency-name: "@types/react-dom" dependency-type: direct:development update-type: version-update:semver-patch dependency-group: node-packages ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> commit 8c83284e127bf08cc3905875d367efb786e1fe45 Author: Will Fox Date: Sat Oct 14 12:37:12 2023 -0500 Add arguments required for OpenAI connection (#796) * Add arguments required for OpenAI connection * Remove unnecessary args commit 5300bb5ad2eb39e3f81a505907678fc640581f78 Author: ks6088ts Date: Sat Oct 14 09:01:32 2023 +0900 support non English languages (#780) * add search analyzer name option to prepdocs script * parameterize search query language and search query speller * update IaC codes to inject environment variables to app service * apply formatter via `black .` * update reference links * update descriptions to reflect review comments commit 08fdbd1c3456a9a210488790b9bac5b8faa03748 Author: Pamela Fox Date: Fri Oct 13 13:58:21 2023 -0700 Improvements to VS Code and Vite debug experience (#786) * Initial launch improvements * Fix up extensions commit 475885e57175d614d37cdbe9d5d2f7b7085199db Author: Pamela Fox Date: Fri Oct 13 13:54:56 2023 -0700 Daily tests (#787) commit ca096279be2ce19daa71704beeec6d3bed9fcf03 Author: Matt <57731498+mattmsft@users.noreply.github.com> Date: Thu Oct 12 11:04:00 2023 -0700 Use absolute redirect uris for login and fetching tokens (#784) commit 7c614bbe7470ed5cf8cba524943de09aea29a604 Author: Pamela Fox Date: Thu Oct 12 09:12:33 2023 -0700 Adding session_state to conform to ChatApp protocol (#773) * Adding session_state * Pass null vs undef commit ff273c2636e6035eb1f96da22bb9f47e7e353c66 Author: Pamela Fox Date: Tue Oct 10 14:51:24 2023 -0700 Rm print statements (#772) commit 3324bdb3ec36163adb88db17c9cbe4dd8c1b0bff Author: Pamela Fox Date: Tue Oct 10 14:22:45 2023 -0700 Chat response (#748) * Adding anchors * Prelim change to support chatresponse schema * Update test data to use role properly * Change log level back * Remove debugging * Remove debugging * Fix role location * Use chat response protocol * Updates e2e tests per response change commit 7b2e88733f1557aa5480f0b1324aee73ac4e2845 Author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue Oct 10 11:17:14 2023 -0700 Bump the node-packages group in /app/frontend with 7 updates (#771) Bumps the node-packages group in /app/frontend with 7 updates: | Package | From | To | | --- | --- | --- | | [@fluentui/react-components](https://github.com/microsoft/fluentui) | `9.33.0` | `9.34.2` | | [@fluentui/react-icons](https://github.com/microsoft/fluentui-system-icons) | `2.0.218` | `2.0.219` | | [@types/react](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/react) | `18.2.14` | `18.2.27` | | [@types/react-dom](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/react-dom) | `18.2.8` | `18.2.12` | | [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/tree/HEAD/packages/plugin-react) | `4.0.2` | `4.1.0` | | [typescript](https://github.com/Microsoft/TypeScript) | `5.1.6` | `5.2.2` | | [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) | `4.4.2` | `4.4.11` | Updates `@fluentui/react-components` from 9.33.0 to 9.34.2 - [Release notes](https://github.com/microsoft/fluentui/releases) - [Changelog](https://github.com/microsoft/fluentui/blob/master/azure-pipelines.release-fluentui.yml) - [Commits](https://github.com/microsoft/fluentui/compare/@fluentui/react-components_v9.33.0...@fluentui/react-components_v9.34.2) Updates `@fluentui/react-icons` from 2.0.218 to 2.0.219 - [Commits](https://github.com/microsoft/fluentui-system-icons/commits) Updates `@types/react` from 18.2.14 to 18.2.27 - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/react) Updates `@types/react-dom` from 18.2.8 to 18.2.12 - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/react-dom) Updates `@vitejs/plugin-react` from 4.0.2 to 4.1.0 - [Release notes](https://github.com/vitejs/vite-plugin-react/releases) - [Changelog](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/CHANGELOG.md) - [Commits](https://github.com/vitejs/vite-plugin-react/commits/v4.1.0/packages/plugin-react) Updates `typescript` from 5.1.6 to 5.2.2 - [Release notes](https://github.com/Microsoft/TypeScript/releases) - [Commits](https://github.com/Microsoft/TypeScript/compare/v5.1.6...v5.2.2) Updates `vite` from 4.4.2 to 4.4.11 - [Release notes](https://github.com/vitejs/vite/releases) - [Changelog](https://github.com/vitejs/vite/blob/v4.4.11/packages/vite/CHANGELOG.md) - [Commits](https://github.com/vitejs/vite/commits/v4.4.11/packages/vite) --- updated-dependencies: - dependency-name: "@fluentui/react-components" dependency-type: direct:production update-type: version-update:semver-minor dependency-group: node-packages - dependency-name: "@fluentui/react-icons" dependency-type: direct:production update-type: version-update:semver-patch dependency-group: node-packages - dependency-name: "@types/react" dependency-type: direct:development update-type: version-update:semver-patch dependency-group: node-packages - dependency-name: "@types/react-dom" dependency-type: direct:development update-type: version-update:semver-patch dependency-group: node-packages - dependency-name: "@vitejs/plugin-react" dependency-type: direct:development update-type: version-update:semver-minor dependency-group: node-packages - dependency-name: typescript dependency-type: direct:development update-type: version-update:semver-minor dependency-group: node-packages - dependency-name: vite dependency-type: direct:development update-type: version-update:semver-patch dependency-group: node-packages ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> commit 2b9119ad642e93500260e69b2578275b0c1412ca Author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue Oct 10 11:06:31 2023 -0700 Bump @fluentui/react from 8.110.7 to 8.112.2 in /app/frontend (#759) Bumps [@fluentui/react](https://github.com/microsoft/fluentui) from 8.110.7 to 8.112.2. - [Release notes](https://github.com/microsoft/fluentui/releases) - [Changelog](https://github.com/microsoft/fluentui/blob/master/azure-pipelines.release-fluentui.yml) - [Commits](https://github.com/microsoft/fluentui/compare/@fluentui/react_v8.110.7...@fluentui/react_v8.112.2) --- updated-dependencies: - dependency-name: "@fluentui/react" dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> commit 79bfb0f17d9ae676541f6c8c609d763365dcd9c0 Author: Pamela Fox Date: Tue Oct 10 10:54:06 2023 -0700 Add more Playwright tests to check all routes and buttons (#743) * Adding anchors * E2E tests commit e69e8848ffe59cae4ba7a4a5f1724439e687d1d6 Author: Pamela Fox Date: Mon Oct 9 17:32:42 2023 -0700 Urllib3 update for security issue (#728) * Adding anchors * update urllib3 commit 25a2e0ed3c165d6da22a25dbfe149d1dd323fdbb Author: Pamela Fox Date: Mon Oct 9 17:32:07 2023 -0700 Fixed type annotations per mypy and added mypy to CICD (#749) * Adding anchors * Fix mypy types commit dd5dcea08348f25e5ef3c8081606a02b359c912a Author: Pamela Fox Date: Mon Oct 9 14:37:53 2023 -0700 Grouped updates (#729) * Adding anchors * Grouped updates commit 0c31808f237f02ced61f322dac98a84b134a2532 Author: Pamela Fox Date: Mon Oct 9 14:32:25 2023 -0700 Python version updates (#761) * Adding anchors * Python version changes --- .devcontainer/devcontainer.json | 5 +- .gitattributes | 3 +- .github/dependabot.yaml | 17 + .github/workflows/frontend.yaml | 18 + .github/workflows/python-test.yaml | 10 +- .pre-commit-config.yaml | 5 + .vscode/extensions.json | 8 +- .vscode/launch.json | 21 +- README.md | 41 +- app/backend/app.py | 65 +- app/backend/approaches/approach.py | 9 +- .../approaches/chatreadretrieveread.py | 250 +- app/backend/approaches/retrievethenread.py | 28 +- app/backend/core/authentication.py | 16 +- app/backend/core/messagebuilder.py | 5 +- app/backend/requirements.in | 2 +- app/backend/requirements.txt | 21 +- app/frontend/.prettierignore | 2 + app/frontend/index.html | 2 +- app/frontend/package-lock.json | 3599 +++++++---------- app/frontend/package.json | 21 +- app/frontend/src/api/api.ts | 57 +- app/frontend/src/api/models.ts | 54 +- app/frontend/src/authConfig.ts | 54 +- .../AnalysisPanel/AnalysisPanel.tsx | 8 +- .../src/components/Answer/Answer.module.css | 4 +- app/frontend/src/components/Answer/Answer.tsx | 6 +- .../src/components/Answer/AnswerParser.tsx | 8 +- .../src/components/Example/Example.module.css | 4 +- .../LoginButton/LoginButton.module.css | 2 +- .../components/LoginButton/LoginButton.tsx | 69 +- .../src/components/LoginButton/index.tsx | 2 +- .../QuestionInput/QuestionInput.module.css | 4 +- .../SupportingContent.module.css | 4 +- .../TokenClaimsDisplay/TokenClaimsDisplay.tsx | 57 +- .../components/TokenClaimsDisplay/index.tsx | 2 +- .../UserChatMessage.module.css | 4 +- app/frontend/src/index.css | 12 +- app/frontend/src/index.tsx | 12 +- app/frontend/src/pages/chat/Chat.tsx | 64 +- app/frontend/src/pages/layout/Layout.tsx | 6 +- app/frontend/src/pages/oneshot/OneShot.tsx | 49 +- app/frontend/vite.config.ts | 2 + infra/main.bicep | 6 +- infra/main.parameters.json | 6 + locustfile.py | 14 +- pyproject.toml | 11 + requirements-dev.txt | 1 + scripts/adlsgen2setup.py | 7 +- scripts/manageacl.py | 10 +- scripts/prepdocs.ps1 | 6 +- scripts/prepdocs.py | 55 +- scripts/prepdocs.sh | 9 +- scripts/requirements.txt | 4 +- tests/conftest.py | 2 +- tests/e2e.py | 139 +- .../test_ask_rtr_hybrid/client0/result.json | 7 +- .../test_ask_rtr_hybrid/client1/result.json | 7 +- .../test_ask_rtr_text/client0/result.json | 7 +- .../test_ask_rtr_text/client1/result.json | 7 +- .../auth_client0/result.json | 7 +- .../client0/result.json | 7 +- .../client1/result.json | 7 +- .../client0/result.json | 7 +- .../client1/result.json | 7 +- .../client0/result.json | 20 + .../client1/result.json | 20 + .../test_chat_hybrid/client0/result.json | 7 +- .../test_chat_hybrid/client1/result.json | 7 +- .../client0/result.json | 7 +- .../client1/result.json | 7 +- .../client0/result.json | 7 +- .../client1/result.json | 7 +- .../client0/result.json | 20 + .../client1/result.json | 20 + .../client0/result.jsonlines | 3 + .../client1/result.jsonlines | 3 + .../client0/result.jsonlines | 4 +- .../client1/result.jsonlines | 4 +- .../auth_client0/result.jsonlines | 4 +- .../test_chat_text/client0/result.json | 7 +- .../test_chat_text/client1/result.json | 7 +- .../auth_client0/result.json | 7 +- .../client0/result.json | 7 +- .../client1/result.json | 7 +- .../client0/result.json | 7 +- .../client1/result.json | 7 +- .../test_chat_vector/client0/result.json | 7 +- .../test_chat_vector/client1/result.json | 7 +- .../client0/result.json | 18 + .../client1/result.json | 18 + .../client0/result.json | 18 + .../client1/result.json | 18 + tests/test_app.py | 217 +- tests/test_chatapproach.py | 95 +- tests/test_messagebuilder.py | 10 +- 96 files changed, 2674 insertions(+), 2888 deletions(-) create mode 100644 .github/workflows/frontend.yaml create mode 100644 app/frontend/.prettierignore create mode 100644 tests/snapshots/test_app/test_ask_session_state_persists/client0/result.json create mode 100644 tests/snapshots/test_app/test_ask_session_state_persists/client1/result.json create mode 100644 tests/snapshots/test_app/test_chat_session_state_persists/client0/result.json create mode 100644 tests/snapshots/test_app/test_chat_session_state_persists/client1/result.json create mode 100644 tests/snapshots/test_app/test_chat_stream_session_state_persists/client0/result.jsonlines create mode 100644 tests/snapshots/test_app/test_chat_stream_session_state_persists/client1/result.jsonlines create mode 100644 tests/snapshots/test_app/test_chat_with_history/client0/result.json create mode 100644 tests/snapshots/test_app/test_chat_with_history/client1/result.json create mode 100644 tests/snapshots/test_app/test_chat_with_long_history/client0/result.json create mode 100644 tests/snapshots/test_app/test_chat_with_long_history/client1/result.json diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 71b2d3aead..1e1641fbf4 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -1,6 +1,6 @@ { "name": "Azure Search OpenAI Demo", - "image": "mcr.microsoft.com/devcontainers/python:3.10", + "image": "mcr.microsoft.com/devcontainers/python:3.11", "features": { "ghcr.io/devcontainers/features/node:1": { "version": "16", @@ -15,7 +15,8 @@ "extensions": [ "ms-azuretools.azure-dev", "ms-azuretools.vscode-bicep", - "ms-python.python" + "ms-python.python", + "esbenp.prettier-vscode" ] } }, diff --git a/.gitattributes b/.gitattributes index 526c8a38d4..99f84ac39d 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1 +1,2 @@ -*.sh text eol=lf \ No newline at end of file +*.sh text eol=lf +*.jsonlines text eol=lf diff --git a/.github/dependabot.yaml b/.github/dependabot.yaml index db648e4d58..b8645e7f37 100644 --- a/.github/dependabot.yaml +++ b/.github/dependabot.yaml @@ -6,19 +6,36 @@ updates: directory: "/" schedule: interval: "weekly" + groups: + github-actions: + patterns: + - "*" # Maintain dependencies for npm - package-ecosystem: "npm" directory: "/app/frontend" schedule: interval: "weekly" + groups: + node-packages: + patterns: + - "*" # Maintain dependencies for pip - package-ecosystem: "pip" directory: "/app/backend" schedule: interval: "weekly" + groups: + python-requirements: + patterns: + - "*" + - package-ecosystem: "pip" directory: "/scripts" schedule: interval: "weekly" + groups: + python-requirements: + patterns: + - "*" diff --git a/.github/workflows/frontend.yaml b/.github/workflows/frontend.yaml new file mode 100644 index 0000000000..14d04cbf36 --- /dev/null +++ b/.github/workflows/frontend.yaml @@ -0,0 +1,18 @@ +name: Frontend linting + +on: + push: + branches: [ main ] + pull_request: + branches: [ main ] + +jobs: + prettier: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Run prettier on frontend + run: | + cd ./app/frontend + npm install + npx prettier --check . diff --git a/.github/workflows/python-test.yaml b/.github/workflows/python-test.yaml index b70070f888..5a6ae9d267 100644 --- a/.github/workflows/python-test.yaml +++ b/.github/workflows/python-test.yaml @@ -5,6 +5,8 @@ on: branches: [ main ] pull_request: branches: [ main ] + schedule: + - cron: '0 0 * * *' # Run at midnight every day jobs: test_package: @@ -13,7 +15,7 @@ jobs: strategy: fail-fast: false matrix: - os: ["ubuntu-20.04"] + os: ["ubuntu-20.04", "windows-latest"] python_version: ["3.9", "3.10", "3.11"] steps: - uses: actions/checkout@v4 @@ -37,11 +39,15 @@ jobs: pip install -r requirements-dev.txt - name: Lint with ruff run: ruff . + - name: Check types with mypy + run: python3 -m mypy scripts/ app/ - name: Check formatting with black run: black . --check --verbose - name: Run Python tests - run: python3 -m pytest --cov --cov-fail-under=78 + if: runner.os != 'Windows' + run: python3 -m pytest -s -vv --cov --cov-fail-under=78 - name: Run E2E tests with Playwright + if: runner.os != 'Windows' run: | playwright install --with-deps python3 -m pytest tests/e2e.py diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 00e7f489d2..85af29b74f 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -14,3 +14,8 @@ repos: rev: 23.9.1 hooks: - id: black +- repo: https://github.com/pre-commit/mirrors-prettier + rev: v3.0.3 + hooks: + - id: prettier + types_or: [css, javascript, ts, tsx, html] diff --git a/.vscode/extensions.json b/.vscode/extensions.json index 12faf24039..c38e4736dc 100644 --- a/.vscode/extensions.json +++ b/.vscode/extensions.json @@ -1,6 +1,8 @@ { "recommendations": [ - "esbenp.prettier-vscode", - "ms-azuretools.azure-dev" + "ms-azuretools.azure-dev", + "ms-azuretools.vscode-bicep", + "ms-python.python", + "esbenp.prettier-vscode" ] -} \ No newline at end of file +} diff --git a/.vscode/launch.json b/.vscode/launch.json index 52c350c703..97633e0d85 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -26,27 +26,10 @@ }, { "name": "Frontend: watch", - "type": "node", + "type": "node-terminal", "request": "launch", + "command": "npm run dev", "cwd": "${workspaceFolder}/app/frontend", - "runtimeExecutable": "npm", - "runtimeArgs": [ - "run-script", - "watch" - ], - "console": "integratedTerminal", - }, - { - "name": "Frontend: build", - "type": "node", - "request": "launch", - "cwd": "${workspaceFolder}/app/frontend", - "runtimeExecutable": "npm", - "runtimeArgs": [ - "run-script", - "build" - ], - "console": "integratedTerminal", } ], "inputs": [ diff --git a/README.md b/README.md index afaabe3937..4cc545d33e 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,20 @@ +--- +name: ChatGPT + Enterprise data +description: Chat with your data using OpenAI and Cognitive Search. +languages: +- azdeveloper +- typescript +- python +- bicep +products: +- azure +- azure-cognitive-search +- azure-openai +- azure-app-service +page_type: sample +urlFragment: azure-search-openai-demo +--- + # ChatGPT + Enterprise data with Azure OpenAI and Cognitive Search ## Table of Contents @@ -8,7 +25,7 @@ - [Cost estimation](#cost-estimation) - [Project setup](#project-setup) - [GitHub Codespaces](#github-codespaces) - - [VS Code Remote Containers](#vs-code-remote-containers) + - [VS Code Dev Containers](#vs-code-dev-containers) - [Local environment](#local-environment) - [Deploying from scratch](#deploying-from-scratch) - [Deploying with existing Azure resources](#deploying-with-existing-azure-resources) @@ -28,7 +45,7 @@ - [Troubleshooting](#troubleshooting) [![Open in GitHub Codespaces](https://img.shields.io/static/v1?style=for-the-badge&label=GitHub+Codespaces&message=Open&color=brightgreen&logo=github)](https://github.com/codespaces/new?hide_repo_select=true&ref=main&repo=599293758&machine=standardLinux32gb&devcontainer_path=.devcontainer%2Fdevcontainer.json&location=WestUs2) -[![Open in Remote - Containers](https://img.shields.io/static/v1?style=for-the-badge&label=Remote%20-%20Containers&message=Open&color=blue&logo=visualstudiocode)](https://vscode.dev/redirect?url=vscode://ms-vscode-remote.remote-containers/cloneInVolume?url=https://github.com/azure-samples/azure-search-openai-demo) +[![Open in Dev Containers](https://img.shields.io/static/v1?style=for-the-badge&label=Dev%20Containers&message=Open&color=blue&logo=visualstudiocode)](https://vscode.dev/redirect?url=vscode://ms-vscode-remote.remote-containers/cloneInVolume?url=https://github.com/azure-samples/azure-search-openai-demo) This sample demonstrates a few approaches for creating ChatGPT-like experiences over your own data using the Retrieval Augmented Generation pattern. It uses Azure OpenAI Service to access the ChatGPT model (gpt-35-turbo), and Azure Cognitive Search for data indexing and retrieval. @@ -87,18 +104,23 @@ You can run this repo virtually by using GitHub Codespaces, which will open a we [![Open in GitHub Codespaces](https://img.shields.io/static/v1?style=for-the-badge&label=GitHub+Codespaces&message=Open&color=brightgreen&logo=github)](https://github.com/codespaces/new?hide_repo_select=true&ref=main&repo=599293758&machine=standardLinux32gb&devcontainer_path=.devcontainer%2Fdevcontainer.json&location=WestUs2) -#### VS Code Remote Containers +#### VS Code Dev Containers -A related option is VS Code Remote Containers, which will open the project in your local VS Code using the [Dev Containers extension](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers): +A related option is VS Code Dev Containers, which will open the project in your local VS Code using the [Dev Containers extension](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers): -[![Open in Remote - Containers](https://img.shields.io/static/v1?style=for-the-badge&label=Remote%20-%20Containers&message=Open&color=blue&logo=visualstudiocode)](https://vscode.dev/redirect?url=vscode://ms-vscode-remote.remote-containers/cloneInVolume?url=https://github.com/azure-samples/azure-search-openai-demo) +1. Start Docker Desktop (install it if not already installed) +1. Open the project: + [![Open in Dev Containers](https://img.shields.io/static/v1?style=for-the-badge&label=Dev%20Containers&message=Open&color=blue&logo=visualstudiocode)](https://vscode.dev/redirect?url=vscode://ms-vscode-remote.remote-containers/cloneInVolume?url=https://github.com/azure-samples/azure-search-openai-demo) +1. In the VS Code window that opens, once the project files show up (this may take several minutes), open a terminal window +1. Run `azd auth login` +1. Now you can follow the instructions in [Deploying from scratch](#deploying-from-scratch) below #### Local environment First install the required tools: * [Azure Developer CLI](https://aka.ms/azure-dev/install) -* [Python 3.9+](https://www.python.org/downloads/) +* [Python 3.9, 3.10, or 3.11](https://www.python.org/downloads/) * **Important**: Python and the pip package manager must be in the path in Windows for the setup scripts to work. * **Important**: Ensure you can run `python --version` from console. On Ubuntu, you might need to run `sudo apt install python-is-python3` to link `python` to `python3`. * [Node.js 14+](https://nodejs.org/en/download/) @@ -170,6 +192,11 @@ When you run `azd up` after and are prompted to select a value for `openAiResour 1. If the search service's SKU is not standard, then run `azd env set AZURE_SEARCH_SERVICE_SKU {Name of SKU}`. The free tier won't work as it doesn't support managed identity. ([See other possible values](https://learn.microsoft.com/azure/templates/microsoft.search/searchservices?pivots=deployment-language-bicep#sku)) 1. If you have an existing index that is set up with all the expected fields, then run `azd env set AZURE_SEARCH_INDEX {Name of existing index}`. Otherwise, the `azd up` command will create a new index. +You can also customize the search service (new or existing) for non-English searches: + +1. To configure the language of the search query to a value other than "en-us", run `azd env set AZURE_SEARCH_QUERY_LANGUAGE {Name of query language}`. ([See other possible values](https://learn.microsoft.com/python/api/azure-search-documents/azure.search.documents.models.querylanguage?view=azure-python-preview)) +1. To turn off the spell checker, run `azd env set AZURE_SEARCH_QUERY_SPELLER none`. ([See other possible values](https://learn.microsoft.com/python/api/azure-search-documents/azure.search.documents.models.queryspellertype?view=azure-python-preview)) +1. To configure the name of the analyzer to use for a searchable text field to a value other than "en.microsoft", run `azd env set AZURE_SEARCH_ANALYZER_NAME {Name of analyzer name}`. ([See other possible values](https://learn.microsoft.com/dotnet/api/microsoft.azure.search.models.field.analyzer?view=azure-dotnet-legacy&viewFallbackFrom=azure-dotnet)) #### Other existing Azure resources @@ -418,7 +445,7 @@ to one of the [allowed log levels](https://docs.python.org/3/library/logging.htm If you need to log in a route handler, use the the global variable `current_app`'s logger: ```python -async def chat_stream(): +async def chat(): current_app.logger.info("Received /chat request") ``` diff --git a/app/backend/app.py b/app/backend/app.py index dfde68dae4..6785aeefc9 100644 --- a/app/backend/app.py +++ b/app/backend/app.py @@ -88,38 +88,20 @@ async def ask(): if not request.is_json: return jsonify({"error": "request must be json"}), 415 request_json = await request.get_json() + context = request_json.get("context", {}) auth_helper = current_app.config[CONFIG_AUTH_CLIENT] - auth_claims = await auth_helper.get_auth_claims_if_enabled(request.headers) + context["auth_claims"] = await auth_helper.get_auth_claims_if_enabled(request.headers) try: - impl = current_app.config[CONFIG_ASK_APPROACH] + approach = current_app.config[CONFIG_ASK_APPROACH] # Workaround for: https://github.com/openai/openai-python/issues/371 async with aiohttp.ClientSession() as s: openai.aiosession.set(s) - r = await impl.run(request_json["question"], request_json.get("overrides") or {}, auth_claims) - return jsonify(r) - except Exception as e: - logging.exception("Exception in /ask") - return jsonify({"error": str(e)}), 500 - - -@bp.route("/chat", methods=["POST"]) -async def chat(): - if not request.is_json: - return jsonify({"error": "request must be json"}), 415 - request_json = await request.get_json() - auth_helper = current_app.config[CONFIG_AUTH_CLIENT] - auth_claims = await auth_helper.get_auth_claims_if_enabled(request.headers) - try: - impl = current_app.config[CONFIG_CHAT_APPROACH] - # Workaround for: https://github.com/openai/openai-python/issues/371 - async with aiohttp.ClientSession() as s: - openai.aiosession.set(s) - r = await impl.run_without_streaming( - request_json["history"], request_json.get("overrides", {}), auth_claims + r = await approach.run( + request_json["messages"], context=context, session_state=request_json.get("session_state") ) return jsonify(r) except Exception as e: - logging.exception("Exception in /chat") + logging.exception("Exception in /ask") return jsonify({"error": str(e)}), 500 @@ -128,24 +110,30 @@ async def format_as_ndjson(r: AsyncGenerator[dict, None]) -> AsyncGenerator[str, yield json.dumps(event, ensure_ascii=False) + "\n" -@bp.route("/chat_stream", methods=["POST"]) -async def chat_stream(): +@bp.route("/chat", methods=["POST"]) +async def chat(): if not request.is_json: return jsonify({"error": "request must be json"}), 415 print("Iam in app.py in chat stream") request_json = await request.get_json() + context = request_json.get("context", {}) auth_helper = current_app.config[CONFIG_AUTH_CLIENT] - auth_claims = await auth_helper.get_auth_claims_if_enabled(request.headers) + context["auth_claims"] = await auth_helper.get_auth_claims_if_enabled(request.headers) try: - impl = current_app.config[CONFIG_CHAT_APPROACH] - response_generator = impl.run_with_streaming( - request_json["history"], request_json.get("overrides", {}), auth_claims + approach = current_app.config[CONFIG_CHAT_APPROACH] + result = await approach.run( + request_json["messages"], + stream=request_json.get("stream", False), + context=context, + session_state=request_json.get("session_state"), ) - response = await make_response(format_as_ndjson(response_generator)) - response.timeout = None # type: ignore - print ("Before response in app") - return response + if isinstance(result, dict): + return jsonify(result) + else: + response = await make_response(format_as_ndjson(result)) + response.timeout = None # type: ignore + return response except Exception as e: logging.exception("Exception in /chat") return jsonify({"error": str(e)}), 500 @@ -199,6 +187,9 @@ async def setup_clients(): KB_FIELDS_CONTENT = os.getenv("KB_FIELDS_CONTENT", "content") KB_FIELDS_SOURCEPAGE = os.getenv("KB_FIELDS_SOURCEPAGE", "sourcepage") + AZURE_SEARCH_QUERY_LANGUAGE = os.getenv("AZURE_SEARCH_QUERY_LANGUAGE", "en-us") + AZURE_SEARCH_QUERY_SPELLER = os.getenv("AZURE_SEARCH_QUERY_SPELLER", "lexicon") + # Use the current user identity to authenticate with Azure OpenAI, Cognitive Search and Blob Storage (no secrets needed, # just use 'az login' locally, and managed identity when deployed on Azure). If you need to use keys, use separate AzureKeyCredential instances with the # keys for each service @@ -256,6 +247,8 @@ async def setup_clients(): OPENAI_EMB_MODEL, KB_FIELDS_SOURCEPAGE, KB_FIELDS_CONTENT, + AZURE_SEARCH_QUERY_LANGUAGE, + AZURE_SEARCH_QUERY_SPELLER, ) current_app.config[CONFIG_CHAT_APPROACH] = ChatReadRetrieveReadApproach( @@ -267,6 +260,8 @@ async def setup_clients(): OPENAI_EMB_MODEL, KB_FIELDS_SOURCEPAGE, KB_FIELDS_CONTENT, + AZURE_SEARCH_QUERY_LANGUAGE, + AZURE_SEARCH_QUERY_SPELLER, ) @@ -276,7 +271,7 @@ def create_app(): AioHttpClientInstrumentor().instrument() app = Quart(__name__) app.register_blueprint(bp) - app.asgi_app = OpenTelemetryMiddleware(app.asgi_app) + app.asgi_app = OpenTelemetryMiddleware(app.asgi_app) # type: ignore[method-assign] # Level should be one of https://docs.python.org/3/library/logging.html#logging-levels default_level = "INFO" # In development, log more verbosely diff --git a/app/backend/approaches/approach.py b/app/backend/approaches/approach.py index 6117c8d148..32ae7d0143 100644 --- a/app/backend/approaches/approach.py +++ b/app/backend/approaches/approach.py @@ -1,11 +1,11 @@ from abc import ABC -from typing import Any +from typing import Any, AsyncGenerator, Optional, Union from core.authentication import AuthenticationHelper class Approach(ABC): - def build_filter(self, overrides: dict[str, Any], auth_claims: dict[str, Any]) -> str: + def build_filter(self, overrides: dict[str, Any], auth_claims: dict[str, Any]) -> Optional[str]: exclude_category = overrides.get("exclude_category") or None security_filter = AuthenticationHelper.build_security_filters(overrides, auth_claims) filters = [] @@ -14,3 +14,8 @@ def build_filter(self, overrides: dict[str, Any], auth_claims: dict[str, Any]) - if security_filter: filters.append(security_filter) return None if len(filters) == 0 else " and ".join(filters) + + async def run( + self, messages: list[dict], stream: bool = False, session_state: Any = None, context: dict[str, Any] = {} + ) -> Union[dict[str, Any], AsyncGenerator[dict[str, Any], None]]: + raise NotImplementedError diff --git a/app/backend/approaches/chatreadretrieveread.py b/app/backend/approaches/chatreadretrieveread.py index 65e988da56..285d278cf1 100644 --- a/app/backend/approaches/chatreadretrieveread.py +++ b/app/backend/approaches/chatreadretrieveread.py @@ -1,6 +1,8 @@ import json -from typing import Any, AsyncGenerator +import logging +from typing import Any, AsyncGenerator, Optional, Union +import aiohttp import openai import pandas as pd import json @@ -142,12 +144,14 @@ def __init__( self, search_client: SearchClient, openai_host: str, - chatgpt_deployment: str, + chatgpt_deployment: Optional[str], # Not needed for non-Azure OpenAI chatgpt_model: str, - embedding_deployment: str, + embedding_deployment: Optional[str], # Not needed for non-Azure OpenAI or for retrieval_mode="text" embedding_model: str, sourcepage_field: str, content_field: str, + query_language: str, + query_speller: str, ): self.search_client = search_client self.openai_host = openai_host @@ -157,6 +161,8 @@ def __init__( self.embedding_model = embedding_model self.sourcepage_field = sourcepage_field self.content_field = content_field + self.query_language = query_language + self.query_speller = query_speller self.chatgpt_token_limit = get_token_limit(chatgpt_model) self.functions = [ @@ -250,17 +256,34 @@ async def run_until_final_call( top = overrides.get("top", 3) filter = self.build_filter(overrides, auth_claims) - user_query_request = history[-1]["user"] - print(user_query_request) + original_user_query = history[-1]["content"] + user_query_request = "Generate search query for: " + original_user_query + + functions = [ + { + "name": "search_sources", + "description": "Retrieve sources from the Azure Cognitive Search index", + "parameters": { + "type": "object", + "properties": { + "search_query": { + "type": "string", + "description": "Query string to retrieve documents from azure search eg: 'Health care plan'", + } + }, + "required": ["search_query"], + }, + } + ] # STEP 1: Generate an optimized keyword search query based on the chat history and the last question messages = self.get_messages_from_history( - self.query_prompt_template, - self.chatgpt_model, - history, - user_query_request, - self.query_prompt_few_shots, - self.chatgpt_token_limit - len(user_query_request), + system_prompt=self.query_prompt_template, + model_id=self.chatgpt_model, + history=history, + user_content=user_query_request, + max_tokens=self.chatgpt_token_limit - len(user_query_request), + few_shots=self.query_prompt_few_shots, ) chatgpt_args = {"deployment_id": self.chatgpt_deployment} if self.openai_host == "azure" else {} @@ -270,12 +293,13 @@ async def run_until_final_call( model=self.chatgpt_model, messages=messages, temperature=0.0, - max_tokens=32, + max_tokens=100, # Setting too low risks malformed JSON, setting too high may affect performance n=1, functions=self.functions, function_call="auto", ) + query_text = self.get_search_query(chat_completion, original_user_query) response_message = chat_completion["choices"][0]["message"] print (chat_completion) @@ -288,32 +312,20 @@ async def run_until_final_call( # Step 3: call the function # Note: the JSON response may not always be valid; be sure to handle errors - function_name = response_message["function_call"]["name"] - available_functions = self.available_functions - # verify function exists - if function_name not in available_functions: - query_text = "Function " + function_name + " does not exist" - function_to_call = available_functions[function_name] - - # verify function has correct number of arguments - function_args = json.loads(response_message["function_call"]["arguments"]) - if check_args(function_to_call, function_args) is False: - query_text = "Invalid number of arguments for function: " + function_name - function_response = function_to_call(**function_args) - - print("Output of function call:") - print(function_response) - query_text = function_response - - messages.append( - { - "role": response_message["role"], - "function_call": { - "name": response_message["function_call"]["name"], - "arguments": response_message["function_call"]["arguments"], - }, - "content": function_response - } + # Use semantic L2 reranker if requested and if retrieval mode is text or hybrid (vectors + text) + if overrides.get("semantic_ranker") and has_text: + r = await self.search_client.search( + query_text, + filter=filter, + query_type=QueryType.SEMANTIC, + query_language=self.query_language, + query_speller=self.query_speller, + semantic_configuration_name="default", + top=top, + query_caption="extractive|highlight-false" if use_semantic_captions else None, + vector=query_vector, + top_k=50 if query_vector else None, + vector_fields="embedding" if query_vector else None, ) # adding function response to messages @@ -330,10 +342,20 @@ async def run_until_final_call( print(message) - msg_to_display = "\n\n".join([str(message) for message in messages]) - #print(msg_to_display) - extra_info = { - "data_points": function_name, + response_token_limit = 1024 + messages_token_limit = self.chatgpt_token_limit - response_token_limit + messages = self.get_messages_from_history( + system_prompt=system_message, + model_id=self.chatgpt_model, + history=history, + # Model does not handle lengthy system messages well. Moving sources to latest user conversation to solve follow up questions prompt. + user_content=original_user_query + "\n\nSources:\n" + content, + max_tokens=messages_token_limit, + ) + msg_to_display = "\n\n".join([str(message) for message in messages]) + + extra_info = { + "data_points": results, "thoughts": f"Searched for:
{query_text}

Conversations:
" + msg_to_display.replace("\n", "
"), } @@ -429,34 +451,49 @@ async def run_until_final_call( model=self.chatgpt_model, messages=messages, temperature=overrides.get("temperature") or 0.7, - max_tokens=1024, + max_tokens=response_token_limit, n=1, stream=should_stream, ) - print ("final chat_completion : ") + print ("final chat_completion : ") print (chat_completion) #print (second_response ) return (extra_info, chat_coroutine) async def run_without_streaming( - self, history: list[dict[str, str]], overrides: dict[str, Any], auth_claims: dict[str, Any] + self, + history: list[dict[str, str]], + overrides: dict[str, Any], + auth_claims: dict[str, Any], + session_state: Any = None, ) -> dict[str, Any]: extra_info, chat_coroutine = await self.run_until_final_call( history, overrides, auth_claims, should_stream=False ) - chat_resp = await chat_coroutine - chat_resp.choices[0]["extra_args"] = extra_info + chat_resp = dict(await chat_coroutine) + chat_resp["choices"][0]["context"] = extra_info + chat_resp["choices"][0]["session_state"] = session_state return chat_resp async def run_with_streaming( - self, history: list[dict[str, str]], overrides: dict[str, Any], auth_claims: dict[str, Any] + self, + history: list[dict[str, str]], + overrides: dict[str, Any], + auth_claims: dict[str, Any], + session_state: Any = None, ) -> AsyncGenerator[dict, None]: extra_info, chat_coroutine = await self.run_until_final_call( history, overrides, auth_claims, should_stream=True ) yield { "choices": [ - {"delta": {"role": self.ASSISTANT}, "extra_args": extra_info, "finish_reason": None, "index": 0} + { + "delta": {"role": self.ASSISTANT}, + "context": extra_info, + "session_state": session_state, + "finish_reason": None, + "index": 0, + } ], "object": "chat.completion.chunk", } @@ -466,14 +503,28 @@ async def run_with_streaming( if event["choices"]: yield event + async def run( + self, messages: list[dict], stream: bool = False, session_state: Any = None, context: dict[str, Any] = {} + ) -> Union[dict[str, Any], AsyncGenerator[dict[str, Any], None]]: + overrides = context.get("overrides", {}) + auth_claims = context.get("auth_claims", {}) + if stream is False: + # Workaround for: https://github.com/openai/openai-python/issues/371 + async with aiohttp.ClientSession() as s: + openai.aiosession.set(s) + response = await self.run_without_streaming(messages, overrides, auth_claims, session_state) + return response + else: + return self.run_with_streaming(messages, overrides, auth_claims, session_state) + def get_messages_from_history( self, system_prompt: str, model_id: str, history: list[dict[str, str]], user_content: str, + max_tokens: int, few_shots=[], - max_tokens: int = 4096, ) -> list: message_builder = MessageBuilder(system_prompt, model_id) @@ -484,86 +535,27 @@ def get_messages_from_history( append_index = len(few_shots) + 1 message_builder.append_message(self.USER, user_content, index=append_index) + total_token_count = message_builder.count_tokens_for_message(message_builder.messages[-1]) - for h in reversed(history[:-1]): - if message_builder.token_length > max_tokens: + newest_to_oldest = list(reversed(history[:-1])) + for message in newest_to_oldest: + potential_message_count = message_builder.count_tokens_for_message(message) + if (total_token_count + potential_message_count) > max_tokens: + logging.debug("Reached max tokens of %d, history will be truncated", max_tokens) break - if bot_msg := h.get("bot"): - message_builder.append_message(self.ASSISTANT, bot_msg, index=append_index) - message_builder.append_message(self.ASSISTANT, "Perform Function requests for the user", index=append_index) - if user_msg := h.get("user"): - message_builder.append_message(self.USER, user_msg, index=append_index) - + message_builder.append_message(message["role"], message["content"], index=append_index) + total_token_count += potential_message_count return message_builder.messages - def run_conversation(messages, functions, available_functions, deployment_id): - # Step 1: send the conversation and available functions to GPT - response = openai.ChatCompletion.create( - deployment_id=deployment_id, - messages=messages, - functions=functions, - function_call="auto", - ) - response_message = response["choices"][0]["message"] - - - # Step 2: check if GPT wanted to call a function - if response_message.get("function_call"): - print("Recommended Function call:") - print(response_message.get("function_call")) - print() - - # Step 3: call the function - # Note: the JSON response may not always be valid; be sure to handle errors - - function_name = response_message["function_call"]["name"] - - # verify function exists - if function_name not in available_functions: - return "Function " + function_name + " does not exist" - function_to_call = available_functions[function_name] - - # verify function has correct number of arguments - function_args = json.loads(response_message["function_call"]["arguments"]) - if check_args(function_to_call, function_args) is False: - return "Invalid number of arguments for function: " + function_name - function_response = function_to_call(**function_args) - - print("Output of function call:") - print(function_response) - print() - - # Step 4: send the info on the function call and function response to GPT - - # adding assistant response to messages - messages.append( - { - "role": response_message["role"], - "function_call": { - "name": response_message["function_call"]["name"], - "arguments": response_message["function_call"]["arguments"], - }, - "content": function_response - } - ) - - # adding function response to messages - messages.append( - { - "role": "function", - "name": function_name, - "content": function_response, - } - ) # extend conversation with function response - - print("Messages in second request:") - for message in messages: - print(message) - print() - - second_response = openai.ChatCompletion.create( - messages=messages, - deployment_id=deployment_id - ) # get a new response from GPT where it can see the function response - - return second_response + def get_search_query(self, chat_completion: dict[str, Any], user_query: str): + response_message = chat_completion["choices"][0]["message"] + if function_call := response_message.get("function_call"): + if function_call["name"] == "search_sources": + arg = json.loads(function_call["arguments"]) + search_query = arg.get("search_query", self.NO_RESPONSE) + if search_query != self.NO_RESPONSE: + return search_query + elif query_text := response_message.get("content"): + if query_text.strip() != self.NO_RESPONSE: + return query_text + return user_query diff --git a/app/backend/approaches/retrievethenread.py b/app/backend/approaches/retrievethenread.py index 3b5a71ef2a..151c94f907 100644 --- a/app/backend/approaches/retrievethenread.py +++ b/app/backend/approaches/retrievethenread.py @@ -1,4 +1,4 @@ -from typing import Any +from typing import Any, AsyncGenerator, Optional, Union import openai from azure.search.documents.aio import SearchClient @@ -40,12 +40,14 @@ def __init__( self, search_client: SearchClient, openai_host: str, - chatgpt_deployment: str, + chatgpt_deployment: Optional[str], # Not needed for non-Azure OpenAI chatgpt_model: str, - embedding_deployment: str, + embedding_deployment: Optional[str], # Not needed for non-Azure OpenAI or for retrieval_mode="text" embedding_model: str, sourcepage_field: str, content_field: str, + query_language: str, + query_speller: str, ): self.search_client = search_client self.openai_host = openai_host @@ -55,8 +57,19 @@ def __init__( self.embedding_deployment = embedding_deployment self.sourcepage_field = sourcepage_field self.content_field = content_field + self.query_language = query_language + self.query_speller = query_speller - async def run(self, q: str, overrides: dict[str, Any], auth_claims: dict[str, Any]) -> dict[str, Any]: + async def run( + self, + messages: list[dict], + stream: bool = False, # Stream is not used in this approach + session_state: Any = None, + context: dict[str, Any] = {}, + ) -> Union[dict[str, Any], AsyncGenerator[dict[str, Any], None]]: + q = messages[-1]["content"] + overrides = context.get("overrides", {}) + auth_claims = context.get("auth_claims", {}) has_text = overrides.get("retrieval_mode") in ["text", "hybrid", None] has_vector = overrides.get("retrieval_mode") in ["vectors", "hybrid", None] use_semantic_captions = True if overrides.get("semantic_captions") and has_text else False @@ -80,8 +93,8 @@ async def run(self, q: str, overrides: dict[str, Any], auth_claims: dict[str, An query_text, filter=filter, query_type=QueryType.SEMANTIC, - query_language="en-us", - query_speller="lexicon", + query_language=self.query_language, + query_speller=self.query_speller, semantic_configuration_name="default", top=top, query_caption="extractive|highlight-false" if use_semantic_captions else None, @@ -135,5 +148,6 @@ async def run(self, q: str, overrides: dict[str, Any], auth_claims: dict[str, An "thoughts": f"Question:
{query_text}

Prompt:
" + "\n\n".join([str(message) for message in messages]), } - chat_completion.choices[0]["extra_args"] = extra_info + chat_completion.choices[0]["context"] = extra_info + chat_completion.choices[0]["session_state"] = session_state return chat_completion diff --git a/app/backend/core/authentication.py b/app/backend/core/authentication.py index d31964d351..ac6e20196e 100644 --- a/app/backend/core/authentication.py +++ b/app/backend/core/authentication.py @@ -4,7 +4,7 @@ import logging import os from tempfile import TemporaryDirectory -from typing import Any +from typing import Any, Optional import aiohttp from msal import ConfidentialClientApplication @@ -28,11 +28,11 @@ class AuthenticationHelper: def __init__( self, use_authentication: bool, - server_app_id: str, - server_app_secret: str, - client_app_id: str, - tenant_id: str, - token_cache_path: str = None, + server_app_id: Optional[str], + server_app_secret: Optional[str], + client_app_id: Optional[str], + tenant_id: Optional[str], + token_cache_path: Optional[str] = None, ): self.use_authentication = use_authentication self.server_app_id = server_app_id @@ -143,7 +143,7 @@ def build_security_filters(overrides: dict[str, Any], auth_claims: dict[str, Any return None @staticmethod - async def list_groups(graph_resource_access_token: str) -> [str]: + async def list_groups(graph_resource_access_token: dict) -> list[str]: headers = {"Authorization": "Bearer " + graph_resource_access_token["access_token"]} groups = [] async with aiohttp.ClientSession(headers=headers) as session: @@ -171,7 +171,7 @@ async def list_groups(graph_resource_access_token: str) -> [str]: return groups - async def get_auth_claims_if_enabled(self, headers: dict) -> dict[str:Any]: + async def get_auth_claims_if_enabled(self, headers: dict) -> dict[str, Any]: if not self.use_authentication: return {} try: diff --git a/app/backend/core/messagebuilder.py b/app/backend/core/messagebuilder.py index 9409ae7e93..b071511a65 100644 --- a/app/backend/core/messagebuilder.py +++ b/app/backend/core/messagebuilder.py @@ -18,11 +18,12 @@ class MessageBuilder: def __init__(self, system_content: str, chatgpt_model: str): self.messages = [{"role": "system", "content": self.normalize_content(system_content)}] self.model = chatgpt_model - self.token_length = num_tokens_from_messages(self.messages[-1], self.model) def append_message(self, role: str, content: str, index: int = 1): self.messages.insert(index, {"role": role, "content": self.normalize_content(content)}) - self.token_length += num_tokens_from_messages(self.messages[index], self.model) + + def count_tokens_for_message(self, message: dict[str, str]): + return num_tokens_from_messages(message, self.model) def normalize_content(self, content: str): return unicodedata.normalize("NFC", content) diff --git a/app/backend/requirements.in b/app/backend/requirements.in index 85044a4c42..635191e756 100644 --- a/app/backend/requirements.in +++ b/app/backend/requirements.in @@ -5,7 +5,7 @@ openai[datalib] tiktoken azure-search-documents==11.4.0b6 azure-storage-blob -uvicorn[standard] +uvicorn aiohttp azure-monitor-opentelemetry opentelemetry-instrumentation-asgi diff --git a/app/backend/requirements.txt b/app/backend/requirements.txt index 303225a470..f6f4bdf12c 100644 --- a/app/backend/requirements.txt +++ b/app/backend/requirements.txt @@ -12,8 +12,6 @@ aiohttp==3.8.5 # openai aiosignal==1.3.1 # via aiohttp -anyio==3.7.1 - # via watchfiles asgiref==3.7.2 # via opentelemetry-instrumentation-asgi async-timeout==4.0.3 @@ -89,15 +87,12 @@ h2==4.1.0 # via hypercorn hpack==4.0.0 # via h2 -httptools==0.6.0 - # via uvicorn hypercorn==0.14.4 # via quart hyperframe==6.0.1 # via h2 idna==3.4 # via - # anyio # requests # yarl importlib-metadata==6.8.0 @@ -250,12 +245,8 @@ pyjwt[crypto]==2.8.0 # via msal python-dateutil==2.8.2 # via pandas -python-dotenv==1.0.0 - # via uvicorn pytz==2023.3.post1 # via pandas -pyyaml==6.0.1 - # via uvicorn quart==0.19.3 # via # -r requirements.in @@ -279,8 +270,6 @@ six==1.16.0 # azure-core # isodate # python-dateutil -sniffio==1.3.0 - # via anyio tiktoken==0.5.1 # via -r requirements.in tqdm==4.66.1 @@ -294,16 +283,10 @@ typing-extensions==4.8.0 # opentelemetry-sdk tzdata==2023.3 # via pandas -urllib3==2.0.5 +urllib3==2.0.7 # via requests -uvicorn[standard]==0.23.2 +uvicorn==0.23.2 # via -r requirements.in -uvloop==0.17.0 - # via uvicorn -watchfiles==0.20.0 - # via uvicorn -websockets==11.0.3 - # via uvicorn werkzeug==3.0.0 # via # flask diff --git a/app/frontend/.prettierignore b/app/frontend/.prettierignore new file mode 100644 index 0000000000..fc355bcdfb --- /dev/null +++ b/app/frontend/.prettierignore @@ -0,0 +1,2 @@ +# Ignore JSON +**/*.json diff --git a/app/frontend/index.html b/app/frontend/index.html index 32115e9197..e935a63d78 100644 --- a/app/frontend/index.html +++ b/app/frontend/index.html @@ -1,4 +1,4 @@ - + diff --git a/app/frontend/package-lock.json b/app/frontend/package-lock.json index 380af006cd..b5a6e360f3 100644 --- a/app/frontend/package-lock.json +++ b/app/frontend/package-lock.json @@ -10,24 +10,25 @@ "dependencies": { "@azure/msal-browser": "^3.1.0", "@azure/msal-react": "^2.0.4", - "@fluentui/react": "^8.110.7", - "@fluentui/react-components": "^9.33.0", - "@fluentui/react-icons": "^2.0.206", + "@fluentui/react": "^8.112.3", + "@fluentui/react-components": "^9.35.0", + "@fluentui/react-icons": "^2.0.220", "@react-spring/web": "^9.7.3", "dompurify": "^3.0.6", "ndjson-readablestream": "^1.0.7", "react": "^18.2.0", "react-dom": "^18.2.0", - "react-router-dom": "^6.16.0" + "react-router-dom": "^6.16.0", + "scheduler": "^0.20.2" }, "devDependencies": { "@types/dompurify": "^3.0.3", - "@types/react": "^18.2.14", - "@types/react-dom": "^18.2.8", - "@vitejs/plugin-react": "^4.0.2", + "@types/react": "^18.2.28", + "@types/react-dom": "^18.2.13", + "@vitejs/plugin-react": "^4.1.0", "prettier": "^3.0.3", - "typescript": "^5.1.6", - "vite": "^4.4.2" + "typescript": "^5.2.2", + "vite": "^4.4.11" }, "engines": { "node": ">=14.0.0" @@ -82,47 +83,48 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.5.tgz", - "integrity": "sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==", + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", + "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", "dev": true, "dependencies": { - "@babel/highlight": "^7.22.5" + "@babel/highlight": "^7.22.13", + "chalk": "^2.4.2" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/compat-data": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.6.tgz", - "integrity": "sha512-29tfsWTq2Ftu7MXmimyC0C5FDZv5DYxOZkh3XD3+QW4V/BYuv/LyEsjj3c0hqedEaDt6DBfDvexMKU8YevdqFg==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.20.tgz", + "integrity": "sha512-BQYjKbpXjoXwFW5jGqiizJQQT/aC7pFm9Ok1OWssonuguICi264lbgMzRp2ZMmRSlfkX6DsWDDcsrctK8Rwfiw==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.22.8", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.8.tgz", - "integrity": "sha512-75+KxFB4CZqYRXjx4NlR4J7yGvKumBuZTmV4NV6v09dVXXkuYVYLT68N6HCzLvfJ+fWCxQsntNzKwwIXL4bHnw==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.0.tgz", + "integrity": "sha512-97z/ju/Jy1rZmDxybphrBuI+jtJjFVoz7Mr9yUQVVVi+DNZE333uFQeMOqcCIy1x3WYBIbWftUSLmbNXNT7qFQ==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.22.5", - "@babel/generator": "^7.22.7", - "@babel/helper-compilation-targets": "^7.22.6", - "@babel/helper-module-transforms": "^7.22.5", - "@babel/helpers": "^7.22.6", - "@babel/parser": "^7.22.7", - "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.8", - "@babel/types": "^7.22.5", - "@nicolo-ribaudo/semver-v6": "^6.3.3", - "convert-source-map": "^1.7.0", + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.0", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-module-transforms": "^7.23.0", + "@babel/helpers": "^7.23.0", + "@babel/parser": "^7.23.0", + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.0", + "@babel/types": "^7.23.0", + "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", - "json5": "^2.2.2" + "json5": "^2.2.3", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -133,12 +135,12 @@ } }, "node_modules/@babel/generator": { - "version": "7.22.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.7.tgz", - "integrity": "sha512-p+jPjMG+SI8yvIaxGgeW24u7q9+5+TGpZh8/CuB7RhBKd7RCy8FayNEFNNKrNK/eUcY/4ExQqLmyrvBXKsIcwQ==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", + "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", "dev": true, "dependencies": { - "@babel/types": "^7.22.5", + "@babel/types": "^7.23.0", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" @@ -148,41 +150,38 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.6.tgz", - "integrity": "sha512-534sYEqWD9VfUm3IPn2SLcH4Q3P86XL+QvqdC7ZsFrzyyPF3T4XGiVghF6PTYNdWg6pXuoqXxNQAhbYeEInTzA==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz", + "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.22.6", - "@babel/helper-validator-option": "^7.22.5", - "@nicolo-ribaudo/semver-v6": "^6.3.3", + "@babel/compat-data": "^7.22.9", + "@babel/helper-validator-option": "^7.22.15", "browserslist": "^4.21.9", - "lru-cache": "^5.1.1" + "lru-cache": "^5.1.1", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz", - "integrity": "sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-function-name": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", - "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", "dev": true, "dependencies": { - "@babel/template": "^7.22.5", - "@babel/types": "^7.22.5" + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" }, "engines": { "node": ">=6.9.0" @@ -201,34 +200,34 @@ } }, "node_modules/@babel/helper-module-imports": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz", - "integrity": "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", + "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", "dev": true, "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.5.tgz", - "integrity": "sha512-+hGKDt/Ze8GFExiVHno/2dvG5IdstpzCq0y4Qc9OJ25D4q3pKfiIP/4Vp3/JvhDkLKsDK2api3q3fpIgiIF5bw==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.0.tgz", + "integrity": "sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-module-imports": "^7.22.15", "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.5", - "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.5", - "@babel/types": "^7.22.5" + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.20" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-plugin-utils": { @@ -274,45 +273,45 @@ } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", - "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz", - "integrity": "sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz", + "integrity": "sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.6.tgz", - "integrity": "sha512-YjDs6y/fVOYFV8hAf1rxd1QvR9wJe1pDBZ2AREKq/SDayfPzgk0PBnVuTCE5X1acEpMMNOVUqoe+OwiZGJ+OaA==", + "version": "7.23.1", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.1.tgz", + "integrity": "sha512-chNpneuK18yW5Oxsr+t553UZzzAs3aZnFm4bxhebsNTeshrC95yA7l5yl7GBAG+JG1rF0F7zzD2EixK9mWSDoA==", "dev": true, "dependencies": { - "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.6", - "@babel/types": "^7.22.5" + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.0", + "@babel/types": "^7.23.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.5.tgz", - "integrity": "sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", + "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.22.5", - "chalk": "^2.0.0", + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", "js-tokens": "^4.0.0" }, "engines": { @@ -320,9 +319,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.22.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.7.tgz", - "integrity": "sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", + "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -373,33 +372,33 @@ } }, "node_modules/@babel/template": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz", - "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.22.5", - "@babel/parser": "^7.22.5", - "@babel/types": "^7.22.5" + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.22.8", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.8.tgz", - "integrity": "sha512-y6LPR+wpM2I3qJrsheCTwhIinzkETbplIgPBbwvqPKc+uljeA5gP+3nP8irdYt1mjQaDnlIcG+dw8OjAco4GXw==", + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", + "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.22.5", - "@babel/generator": "^7.22.7", - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-function-name": "^7.22.5", + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.0", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.22.7", - "@babel/types": "^7.22.5", + "@babel/parser": "^7.23.0", + "@babel/types": "^7.23.0", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -408,13 +407,13 @@ } }, "node_modules/@babel/types": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.5.tgz", - "integrity": "sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", + "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", "dev": true, "dependencies": { "@babel/helper-string-parser": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20", "to-fast-properties": "^2.0.0" }, "engines": { @@ -819,25 +818,25 @@ } }, "node_modules/@fluentui/font-icons-mdl2": { - "version": "8.5.23", - "resolved": "https://registry.npmjs.org/@fluentui/font-icons-mdl2/-/font-icons-mdl2-8.5.23.tgz", - "integrity": "sha512-jZjUtfQm9/84jX34zhwwsoZME86xXXgKAgBYuMvRStKzXGdZcd7YSOlmuT8lbISmtFL/SWwUGOEal1nLCUNeNA==", + "version": "8.5.25", + "resolved": "https://registry.npmjs.org/@fluentui/font-icons-mdl2/-/font-icons-mdl2-8.5.25.tgz", + "integrity": "sha512-L14GBWeRmeVSO1hjollOye+Xl4ULR9yvltTJNkwoNFfrks0nf+HTAOje5QU5+bPCzjR0mCmp/VCArsTtDwL0Zw==", "dependencies": { "@fluentui/set-version": "^8.2.11", - "@fluentui/style-utilities": "^8.9.16", - "@fluentui/utilities": "^8.13.18", + "@fluentui/style-utilities": "^8.9.18", + "@fluentui/utilities": "^8.13.19", "tslib": "^2.1.0" } }, "node_modules/@fluentui/foundation-legacy": { - "version": "8.2.43", - "resolved": "https://registry.npmjs.org/@fluentui/foundation-legacy/-/foundation-legacy-8.2.43.tgz", - "integrity": "sha512-rXr71KxNcWDH2LmTsFZbP75p8HssLlVLaFAqEdLE+sKf/LNKmqkDVTNhDbHZxzxy0QnguI4aNHcyGhMZUH3MPA==", + "version": "8.2.45", + "resolved": "https://registry.npmjs.org/@fluentui/foundation-legacy/-/foundation-legacy-8.2.45.tgz", + "integrity": "sha512-KVgWNEFIwEUEyoX2x1GBvczPPsi9/st+b2BhcwGR1W7+za7mKe+bYS5nkM2jA7BHV+E9V0rVPNw+jJil9jjT8Q==", "dependencies": { "@fluentui/merge-styles": "^8.5.12", "@fluentui/set-version": "^8.2.11", - "@fluentui/style-utilities": "^8.9.16", - "@fluentui/utilities": "^8.13.18", + "@fluentui/style-utilities": "^8.9.18", + "@fluentui/utilities": "^8.13.19", "tslib": "^2.1.0" }, "peerDependencies": { @@ -861,14 +860,6 @@ "@swc/helpers": "^0.5.1" } }, - "node_modules/@fluentui/keyboard-keys/node_modules/@swc/helpers": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", - "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", - "dependencies": { - "tslib": "^2.4.0" - } - }, "node_modules/@fluentui/merge-styles": { "version": "8.5.12", "resolved": "https://registry.npmjs.org/@fluentui/merge-styles/-/merge-styles-8.5.12.tgz", @@ -886,31 +877,23 @@ "@swc/helpers": "^0.5.1" } }, - "node_modules/@fluentui/priority-overflow/node_modules/@swc/helpers": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", - "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", - "dependencies": { - "tslib": "^2.4.0" - } - }, "node_modules/@fluentui/react": { - "version": "8.110.7", - "resolved": "https://registry.npmjs.org/@fluentui/react/-/react-8.110.7.tgz", - "integrity": "sha512-3sn4HZL10jghiYFF+Ouc7pNDJ5pR2ueU6ZY1IdmVFgYXTJJ/IwQhVc37mXVf8VoUM7hF4vRcGE4z+loNTpTX0w==", + "version": "8.112.3", + "resolved": "https://registry.npmjs.org/@fluentui/react/-/react-8.112.3.tgz", + "integrity": "sha512-2yDtzw8AvSkSO1B//Lj+E6Wy0RrWV0ai2hXN3q0SRkFocudvek5riHHK89OJAcKaAxqe/VUg7OJQ9P+Bqd77fA==", "dependencies": { "@fluentui/date-time-utilities": "^8.5.13", - "@fluentui/font-icons-mdl2": "^8.5.23", - "@fluentui/foundation-legacy": "^8.2.43", + "@fluentui/font-icons-mdl2": "^8.5.25", + "@fluentui/foundation-legacy": "^8.2.45", "@fluentui/merge-styles": "^8.5.12", - "@fluentui/react-focus": "^8.8.30", - "@fluentui/react-hooks": "^8.6.29", - "@fluentui/react-portal-compat-context": "^9.0.6", + "@fluentui/react-focus": "^8.8.32", + "@fluentui/react-hooks": "^8.6.30", + "@fluentui/react-portal-compat-context": "^9.0.9", "@fluentui/react-window-provider": "^2.2.15", "@fluentui/set-version": "^8.2.11", - "@fluentui/style-utilities": "^8.9.16", - "@fluentui/theme": "^2.6.34", - "@fluentui/utilities": "^8.13.18", + "@fluentui/style-utilities": "^8.9.18", + "@fluentui/theme": "^2.6.36", + "@fluentui/utilities": "^8.13.19", "@microsoft/load-themed-styles": "^1.10.26", "tslib": "^2.1.0" }, @@ -922,18 +905,18 @@ } }, "node_modules/@fluentui/react-accordion": { - "version": "9.3.17", - "resolved": "https://registry.npmjs.org/@fluentui/react-accordion/-/react-accordion-9.3.17.tgz", - "integrity": "sha512-/MxcATCvI9ktQSoNOidXF6ISCFeSyeKCBMJaxFyzzNCKdT0LshRXBOf003JsxJv4N1v4etCS6f1aTUMVGWXUnA==", + "version": "9.3.22", + "resolved": "https://registry.npmjs.org/@fluentui/react-accordion/-/react-accordion-9.3.22.tgz", + "integrity": "sha512-AaTPJjCQgA1x8VzgrJ/8AijQ+lkKHoaYoULdFrLvzL0RNw8w0cBUcL91XWY3ymCqfzmkscUBXYRLS9A0ixV47w==", "dependencies": { - "@fluentui/react-aria": "^9.3.38", - "@fluentui/react-context-selector": "^9.1.36", + "@fluentui/react-aria": "^9.3.42", + "@fluentui/react-context-selector": "^9.1.40", "@fluentui/react-icons": "^2.0.217", - "@fluentui/react-jsx-runtime": "^9.0.12", - "@fluentui/react-shared-contexts": "^9.9.2", - "@fluentui/react-tabster": "^9.13.2", + "@fluentui/react-jsx-runtime": "^9.0.17", + "@fluentui/react-shared-contexts": "^9.10.0", + "@fluentui/react-tabster": "^9.13.6", "@fluentui/react-theme": "^9.1.14", - "@fluentui/react-utilities": "^9.13.5", + "@fluentui/react-utilities": "^9.15.0", "@griffel/react": "^1.5.14", "@swc/helpers": "^0.5.1" }, @@ -945,26 +928,18 @@ "scheduler": "^0.19.0 || ^0.20.0" } }, - "node_modules/@fluentui/react-accordion/node_modules/@swc/helpers": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", - "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", - "dependencies": { - "tslib": "^2.4.0" - } - }, "node_modules/@fluentui/react-alert": { - "version": "9.0.0-beta.81", - "resolved": "https://registry.npmjs.org/@fluentui/react-alert/-/react-alert-9.0.0-beta.81.tgz", - "integrity": "sha512-8VnaE+M7cqdRVfGshDcZRwJ2wBpAbbypkwM5/pZRnq4rcmZflWWgC5wk58mBwtj8EufJljz80+PFOXb4HONFhw==", + "version": "9.0.0-beta.86", + "resolved": "https://registry.npmjs.org/@fluentui/react-alert/-/react-alert-9.0.0-beta.86.tgz", + "integrity": "sha512-1yz62O6rBmUKHvxfEbYTba9vCyk/MDsn86nDPLiEYVAC94PkiAazLd9QT5DL8uqlxi9ygXHEJlMLcmCxXyGyqw==", "dependencies": { - "@fluentui/react-avatar": "^9.5.35", - "@fluentui/react-button": "^9.3.44", + "@fluentui/react-avatar": "^9.5.40", + "@fluentui/react-button": "^9.3.49", "@fluentui/react-icons": "^2.0.217", - "@fluentui/react-jsx-runtime": "^9.0.12", - "@fluentui/react-tabster": "^9.13.2", + "@fluentui/react-jsx-runtime": "^9.0.17", + "@fluentui/react-tabster": "^9.13.6", "@fluentui/react-theme": "^9.1.14", - "@fluentui/react-utilities": "^9.13.5", + "@fluentui/react-utilities": "^9.15.0", "@griffel/react": "^1.5.14", "@swc/helpers": "^0.5.1" }, @@ -975,21 +950,13 @@ "react-dom": ">=16.14.0 <19.0.0" } }, - "node_modules/@fluentui/react-alert/node_modules/@swc/helpers": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", - "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", - "dependencies": { - "tslib": "^2.4.0" - } - }, "node_modules/@fluentui/react-aria": { - "version": "9.3.38", - "resolved": "https://registry.npmjs.org/@fluentui/react-aria/-/react-aria-9.3.38.tgz", - "integrity": "sha512-ZdK5hI08hs4BWdGVjxWibQb4hLamAD6q6VsXXL264BOsK5oY0rQLsUx186KAOgY3yI26YHU6YrqwcxEQWPs30Q==", + "version": "9.3.42", + "resolved": "https://registry.npmjs.org/@fluentui/react-aria/-/react-aria-9.3.42.tgz", + "integrity": "sha512-RZArlsmkCbzTIM1B20QmUuERrxijB8erxC0nXdwcqViXDOJB3/Sgg47mCrm1zwDaD2efp3Tjf8QwIKNmONd5OQ==", "dependencies": { "@fluentui/keyboard-keys": "^9.0.6", - "@fluentui/react-utilities": "^9.13.5", + "@fluentui/react-utilities": "^9.15.0", "@swc/helpers": "^0.5.1" }, "peerDependencies": { @@ -999,29 +966,21 @@ "react-dom": ">=16.14.0 <19.0.0" } }, - "node_modules/@fluentui/react-aria/node_modules/@swc/helpers": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", - "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", - "dependencies": { - "tslib": "^2.4.0" - } - }, "node_modules/@fluentui/react-avatar": { - "version": "9.5.35", - "resolved": "https://registry.npmjs.org/@fluentui/react-avatar/-/react-avatar-9.5.35.tgz", - "integrity": "sha512-NTLotNpZA4qM0TKI8ELAkU69DebdZ+VGY0yzuK7sVMMMvH7ofjkOAHGfPhvSt4O6lAi1E96Hbt1/boHI/jH5sw==", + "version": "9.5.40", + "resolved": "https://registry.npmjs.org/@fluentui/react-avatar/-/react-avatar-9.5.40.tgz", + "integrity": "sha512-1VD/YaHXr3i5IxWJWreF1ppk/50abiYuBXCrS4jt/P9bGKWTbiItdMrm1FqzH34gofeqbufbIJxWuwptqrrGwQ==", "dependencies": { - "@fluentui/react-badge": "^9.2.4", - "@fluentui/react-context-selector": "^9.1.36", + "@fluentui/react-badge": "^9.2.9", + "@fluentui/react-context-selector": "^9.1.40", "@fluentui/react-icons": "^2.0.217", - "@fluentui/react-jsx-runtime": "^9.0.12", - "@fluentui/react-popover": "^9.8.10", - "@fluentui/react-shared-contexts": "^9.9.2", - "@fluentui/react-tabster": "^9.13.2", + "@fluentui/react-jsx-runtime": "^9.0.17", + "@fluentui/react-popover": "^9.8.15", + "@fluentui/react-shared-contexts": "^9.10.0", + "@fluentui/react-tabster": "^9.13.6", "@fluentui/react-theme": "^9.1.14", - "@fluentui/react-tooltip": "^9.3.11", - "@fluentui/react-utilities": "^9.13.5", + "@fluentui/react-tooltip": "^9.3.16", + "@fluentui/react-utilities": "^9.15.0", "@griffel/react": "^1.5.14", "@swc/helpers": "^0.5.1" }, @@ -1033,24 +992,16 @@ "scheduler": "^0.19.0 || ^0.20.0" } }, - "node_modules/@fluentui/react-avatar/node_modules/@swc/helpers": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", - "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", - "dependencies": { - "tslib": "^2.4.0" - } - }, "node_modules/@fluentui/react-badge": { - "version": "9.2.4", - "resolved": "https://registry.npmjs.org/@fluentui/react-badge/-/react-badge-9.2.4.tgz", - "integrity": "sha512-TR9B1EQnizeXtITZepVSeniTEoas8Hfhh70F+hjgH66o7g781GihO33D6ZtoM7OSDDCMF0L1zzDzzUzwRtVc6w==", + "version": "9.2.9", + "resolved": "https://registry.npmjs.org/@fluentui/react-badge/-/react-badge-9.2.9.tgz", + "integrity": "sha512-epgNV6M48M4ZhZB02Qybk8kmsP0Vxl9x4wuK/MAWj3p0ZUN48DQp77NwWBqfF13AH8i2zx2/5h5m7/p0USnY3w==", "dependencies": { "@fluentui/react-icons": "^2.0.217", - "@fluentui/react-jsx-runtime": "^9.0.12", - "@fluentui/react-shared-contexts": "^9.9.2", + "@fluentui/react-jsx-runtime": "^9.0.17", + "@fluentui/react-shared-contexts": "^9.10.0", "@fluentui/react-theme": "^9.1.14", - "@fluentui/react-utilities": "^9.13.5", + "@fluentui/react-utilities": "^9.15.0", "@griffel/react": "^1.5.14", "@swc/helpers": "^0.5.1" }, @@ -1061,27 +1012,19 @@ "react-dom": ">=16.14.0 <19.0.0" } }, - "node_modules/@fluentui/react-badge/node_modules/@swc/helpers": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", - "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", - "dependencies": { - "tslib": "^2.4.0" - } - }, "node_modules/@fluentui/react-button": { - "version": "9.3.44", - "resolved": "https://registry.npmjs.org/@fluentui/react-button/-/react-button-9.3.44.tgz", - "integrity": "sha512-s5tEb+v9m7+EXd3DNFM5xeNXniSkmec09DyDEvcgMG6p79qLV5lkKRC17Ih0B1P5v74kSzoSSTzUqy0rFVT+rw==", + "version": "9.3.49", + "resolved": "https://registry.npmjs.org/@fluentui/react-button/-/react-button-9.3.49.tgz", + "integrity": "sha512-hWI7fVG039b1AsMcgRrHrd9rGdjQoBzzEfkeko9JRtvOmyrsyoczLbj/uT1NVfkO3RHAozybPwt+BzJ45FSWqA==", "dependencies": { "@fluentui/keyboard-keys": "^9.0.6", - "@fluentui/react-aria": "^9.3.38", + "@fluentui/react-aria": "^9.3.42", "@fluentui/react-icons": "^2.0.217", - "@fluentui/react-jsx-runtime": "^9.0.12", - "@fluentui/react-shared-contexts": "^9.9.2", - "@fluentui/react-tabster": "^9.13.2", + "@fluentui/react-jsx-runtime": "^9.0.17", + "@fluentui/react-shared-contexts": "^9.10.0", + "@fluentui/react-tabster": "^9.13.6", "@fluentui/react-theme": "^9.1.14", - "@fluentui/react-utilities": "^9.13.5", + "@fluentui/react-utilities": "^9.15.0", "@griffel/react": "^1.5.14", "@swc/helpers": "^0.5.1" }, @@ -1092,24 +1035,16 @@ "react-dom": ">=16.14.0 <19.0.0" } }, - "node_modules/@fluentui/react-button/node_modules/@swc/helpers": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", - "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", - "dependencies": { - "tslib": "^2.4.0" - } - }, "node_modules/@fluentui/react-card": { - "version": "9.0.43", - "resolved": "https://registry.npmjs.org/@fluentui/react-card/-/react-card-9.0.43.tgz", - "integrity": "sha512-Vif0giU5kTMX6dd34+xBsAgwtGoliZz5T/HQSFo7OaGW3lOx8g+ccqFRJY2DV8+eNLayc3RSdY7LR4Tif2kr0A==", + "version": "9.0.48", + "resolved": "https://registry.npmjs.org/@fluentui/react-card/-/react-card-9.0.48.tgz", + "integrity": "sha512-tjEjoN8ICIuI5i6RTe+40aRC5JAlvQgX2O7FzcHTF+OcA+Fo+1haLRTlDOvc7b6hcaapCHSP3gD5G7kNHucFvQ==", "dependencies": { "@fluentui/keyboard-keys": "^9.0.6", - "@fluentui/react-jsx-runtime": "^9.0.12", - "@fluentui/react-tabster": "^9.13.2", + "@fluentui/react-jsx-runtime": "^9.0.17", + "@fluentui/react-tabster": "^9.13.6", "@fluentui/react-theme": "^9.1.14", - "@fluentui/react-utilities": "^9.13.5", + "@fluentui/react-utilities": "^9.15.0", "@griffel/react": "^1.5.14", "@swc/helpers": "^0.5.1" }, @@ -1120,27 +1055,19 @@ "react-dom": ">=16.14.0 <19.0.0" } }, - "node_modules/@fluentui/react-card/node_modules/@swc/helpers": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", - "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", - "dependencies": { - "tslib": "^2.4.0" - } - }, "node_modules/@fluentui/react-checkbox": { - "version": "9.1.45", - "resolved": "https://registry.npmjs.org/@fluentui/react-checkbox/-/react-checkbox-9.1.45.tgz", - "integrity": "sha512-wGqCnsBqko2JV+YnuKxTog9fz3gTjwXCiTEvXPvUEAbzd+j6MhHUA7zCSp7WOc2mBQQEMtSDovnwMDVGnQ/kLw==", + "version": "9.1.50", + "resolved": "https://registry.npmjs.org/@fluentui/react-checkbox/-/react-checkbox-9.1.50.tgz", + "integrity": "sha512-UmBfpys1AR3ToTnzArKGzwiwker/2ZuP8JE3vKVpOjtk3bFj8TbuLt+JsHMXVsPSk3zHkH32McwBG81itytLQg==", "dependencies": { - "@fluentui/react-field": "^9.1.32", + "@fluentui/react-field": "^9.1.37", "@fluentui/react-icons": "^2.0.217", - "@fluentui/react-jsx-runtime": "^9.0.12", - "@fluentui/react-label": "^9.1.40", - "@fluentui/react-shared-contexts": "^9.9.2", - "@fluentui/react-tabster": "^9.13.2", + "@fluentui/react-jsx-runtime": "^9.0.17", + "@fluentui/react-label": "^9.1.45", + "@fluentui/react-shared-contexts": "^9.10.0", + "@fluentui/react-tabster": "^9.13.6", "@fluentui/react-theme": "^9.1.14", - "@fluentui/react-utilities": "^9.13.5", + "@fluentui/react-utilities": "^9.15.0", "@griffel/react": "^1.5.14", "@swc/helpers": "^0.5.1" }, @@ -1151,29 +1078,21 @@ "react-dom": ">=16.14.0 <19.0.0" } }, - "node_modules/@fluentui/react-checkbox/node_modules/@swc/helpers": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", - "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", - "dependencies": { - "tslib": "^2.4.0" - } - }, "node_modules/@fluentui/react-combobox": { - "version": "9.5.19", - "resolved": "https://registry.npmjs.org/@fluentui/react-combobox/-/react-combobox-9.5.19.tgz", - "integrity": "sha512-NiB0Bs1SMZ9vhVY7Xl3GRZuM3jZSPcBiFXAqqBnH1AJkw46oWL35+1jRA8pvBGq3udjPcdUPa3NpANclY3Fvcg==", + "version": "9.5.24", + "resolved": "https://registry.npmjs.org/@fluentui/react-combobox/-/react-combobox-9.5.24.tgz", + "integrity": "sha512-D6fDZKMMa3/kQsKBGSIgUlm/EBdEuPFutPHPih0dQb1ObqyAGQUqBe9oZEvSxTVVFXpueGD/GZRkqx3n2fet/Q==", "dependencies": { "@fluentui/keyboard-keys": "^9.0.6", - "@fluentui/react-context-selector": "^9.1.36", - "@fluentui/react-field": "^9.1.32", + "@fluentui/react-context-selector": "^9.1.40", + "@fluentui/react-field": "^9.1.37", "@fluentui/react-icons": "^2.0.217", - "@fluentui/react-jsx-runtime": "^9.0.12", - "@fluentui/react-portal": "^9.3.19", - "@fluentui/react-positioning": "^9.9.16", - "@fluentui/react-shared-contexts": "^9.9.2", + "@fluentui/react-jsx-runtime": "^9.0.17", + "@fluentui/react-portal": "^9.3.23", + "@fluentui/react-positioning": "^9.9.20", + "@fluentui/react-shared-contexts": "^9.10.0", "@fluentui/react-theme": "^9.1.14", - "@fluentui/react-utilities": "^9.13.5", + "@fluentui/react-utilities": "^9.15.0", "@griffel/react": "^1.5.14", "@swc/helpers": "^0.5.1" }, @@ -1185,64 +1104,58 @@ "scheduler": "^0.19.0 || ^0.20.0" } }, - "node_modules/@fluentui/react-combobox/node_modules/@swc/helpers": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", - "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", - "dependencies": { - "tslib": "^2.4.0" - } - }, "node_modules/@fluentui/react-components": { - "version": "9.33.0", - "resolved": "https://registry.npmjs.org/@fluentui/react-components/-/react-components-9.33.0.tgz", - "integrity": "sha512-BFm3yNmBreti0QJAAJmvRep1qjiLO8eX/bz2VLgxXK1Ga+S0BOl6e021Lvg1+hg2jyYFPn732RE6sD5qTsKfMQ==", - "dependencies": { - "@fluentui/react-accordion": "^9.3.17", - "@fluentui/react-alert": "9.0.0-beta.81", - "@fluentui/react-avatar": "^9.5.35", - "@fluentui/react-badge": "^9.2.4", - "@fluentui/react-button": "^9.3.44", - "@fluentui/react-card": "^9.0.43", - "@fluentui/react-checkbox": "^9.1.45", - "@fluentui/react-combobox": "^9.5.19", - "@fluentui/react-dialog": "^9.7.4", - "@fluentui/react-divider": "^9.2.40", - "@fluentui/react-drawer": "9.0.0-beta.30", - "@fluentui/react-field": "^9.1.32", - "@fluentui/react-image": "^9.1.37", - "@fluentui/react-infobutton": "9.0.0-beta.65", - "@fluentui/react-input": "^9.4.42", - "@fluentui/react-label": "^9.1.40", - "@fluentui/react-link": "^9.1.23", - "@fluentui/react-menu": "^9.12.21", - "@fluentui/react-overflow": "^9.0.35", - "@fluentui/react-persona": "^9.2.45", - "@fluentui/react-popover": "^9.8.10", - "@fluentui/react-portal": "^9.3.19", - "@fluentui/react-positioning": "^9.9.16", - "@fluentui/react-progress": "^9.1.42", - "@fluentui/react-provider": "^9.10.2", - "@fluentui/react-radio": "^9.1.45", - "@fluentui/react-select": "^9.1.42", - "@fluentui/react-shared-contexts": "^9.9.2", - "@fluentui/react-skeleton": "^9.0.30", - "@fluentui/react-slider": "^9.1.45", - "@fluentui/react-spinbutton": "^9.2.42", - "@fluentui/react-spinner": "^9.3.20", - "@fluentui/react-switch": "^9.1.45", - "@fluentui/react-table": "^9.10.0", - "@fluentui/react-tabs": "^9.3.46", - "@fluentui/react-tabster": "^9.13.2", - "@fluentui/react-text": "^9.3.37", - "@fluentui/react-textarea": "^9.3.42", + "version": "9.35.0", + "resolved": "https://registry.npmjs.org/@fluentui/react-components/-/react-components-9.35.0.tgz", + "integrity": "sha512-nr3r7oAfftBlLbXxjNfQDb4qqvJ4MoyPxUpqj/sordgGtdeUGRg7CWIe3ZhV+z0nVvq02Qa50DqfNRkfGmRuhw==", + "dependencies": { + "@fluentui/react-accordion": "^9.3.22", + "@fluentui/react-alert": "9.0.0-beta.86", + "@fluentui/react-avatar": "^9.5.40", + "@fluentui/react-badge": "^9.2.9", + "@fluentui/react-button": "^9.3.49", + "@fluentui/react-card": "^9.0.48", + "@fluentui/react-checkbox": "^9.1.50", + "@fluentui/react-combobox": "^9.5.24", + "@fluentui/react-dialog": "^9.7.9", + "@fluentui/react-divider": "^9.2.45", + "@fluentui/react-drawer": "9.0.0-beta.35", + "@fluentui/react-field": "^9.1.37", + "@fluentui/react-image": "^9.1.42", + "@fluentui/react-infobutton": "9.0.0-beta.70", + "@fluentui/react-input": "^9.4.47", + "@fluentui/react-label": "^9.1.45", + "@fluentui/react-link": "^9.1.28", + "@fluentui/react-menu": "^9.12.26", + "@fluentui/react-message-bar": "9.0.0", + "@fluentui/react-overflow": "^9.0.39", + "@fluentui/react-persona": "^9.2.50", + "@fluentui/react-popover": "^9.8.15", + "@fluentui/react-portal": "^9.3.23", + "@fluentui/react-positioning": "^9.9.20", + "@fluentui/react-progress": "^9.1.47", + "@fluentui/react-provider": "^9.10.7", + "@fluentui/react-radio": "^9.1.50", + "@fluentui/react-select": "^9.1.47", + "@fluentui/react-shared-contexts": "^9.10.0", + "@fluentui/react-skeleton": "^9.0.35", + "@fluentui/react-slider": "^9.1.50", + "@fluentui/react-spinbutton": "^9.2.47", + "@fluentui/react-spinner": "^9.3.25", + "@fluentui/react-switch": "^9.1.50", + "@fluentui/react-table": "^9.10.5", + "@fluentui/react-tabs": "^9.3.51", + "@fluentui/react-tabster": "^9.13.6", + "@fluentui/react-tags": "^9.0.4", + "@fluentui/react-text": "^9.3.42", + "@fluentui/react-textarea": "^9.3.47", "@fluentui/react-theme": "^9.1.14", - "@fluentui/react-toast": "^9.3.6", - "@fluentui/react-toolbar": "^9.1.45", - "@fluentui/react-tooltip": "^9.3.11", - "@fluentui/react-tree": "^9.4.0", - "@fluentui/react-utilities": "^9.13.5", - "@fluentui/react-virtualizer": "9.0.0-alpha.46", + "@fluentui/react-toast": "^9.3.11", + "@fluentui/react-toolbar": "^9.1.50", + "@fluentui/react-tooltip": "^9.3.16", + "@fluentui/react-tree": "^9.4.5", + "@fluentui/react-utilities": "^9.15.0", + "@fluentui/react-virtualizer": "9.0.0-alpha.51", "@griffel/react": "^1.5.14", "@swc/helpers": "^0.5.1" }, @@ -1254,20 +1167,12 @@ "scheduler": "^0.19.0 || ^0.20.0" } }, - "node_modules/@fluentui/react-components/node_modules/@swc/helpers": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.1.tgz", - "integrity": "sha512-sJ902EfIzn1Fa+qYmjdQqh8tPsoxyBz+8yBKC2HKUxyezKJFwPGOn7pv4WY6QuQW//ySQi5lJjA/ZT9sNWWNTg==", - "dependencies": { - "tslib": "^2.4.0" - } - }, "node_modules/@fluentui/react-context-selector": { - "version": "9.1.36", - "resolved": "https://registry.npmjs.org/@fluentui/react-context-selector/-/react-context-selector-9.1.36.tgz", - "integrity": "sha512-9l7EnrTqhV8PWGBel+nykjf5gfBroOJG0kHkDAmL65FWxYhaRoAlam69GRmOSmbJl0Q5kosf9bnNlvdLjKRQtw==", + "version": "9.1.40", + "resolved": "https://registry.npmjs.org/@fluentui/react-context-selector/-/react-context-selector-9.1.40.tgz", + "integrity": "sha512-//oxMK9ItVNQBZDNwb20KZGsNqATPFWskhUG3zPc4dkyewfJBAGAytjkpOAAWwPZkN/GLk3il11slgvSmtOZHw==", "dependencies": { - "@fluentui/react-utilities": "^9.13.5", + "@fluentui/react-utilities": "^9.15.0", "@swc/helpers": "^0.5.1" }, "peerDependencies": { @@ -1278,29 +1183,21 @@ "scheduler": "^0.19.0 || ^0.20.0" } }, - "node_modules/@fluentui/react-context-selector/node_modules/@swc/helpers": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", - "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", - "dependencies": { - "tslib": "^2.4.0" - } - }, "node_modules/@fluentui/react-dialog": { - "version": "9.7.4", - "resolved": "https://registry.npmjs.org/@fluentui/react-dialog/-/react-dialog-9.7.4.tgz", - "integrity": "sha512-QLmcuB/z0BDCUACu4bgZkoUg3GMa69cEyd0xqyq/yyfnVw8tgWWBLLVncIO2qKl3BtcONpPAzVuuU2MbyxaQhg==", + "version": "9.7.9", + "resolved": "https://registry.npmjs.org/@fluentui/react-dialog/-/react-dialog-9.7.9.tgz", + "integrity": "sha512-XEUV42d+zgjE/bJS+WFuCsKCmeuAkB+V67YpbZknnIJE4QXMf5GRWgesVHsHSMP8HlZEx9NZN9wlrjwl4n7yqg==", "dependencies": { "@fluentui/keyboard-keys": "^9.0.6", - "@fluentui/react-aria": "^9.3.38", - "@fluentui/react-context-selector": "^9.1.36", + "@fluentui/react-aria": "^9.3.42", + "@fluentui/react-context-selector": "^9.1.40", "@fluentui/react-icons": "^2.0.217", - "@fluentui/react-jsx-runtime": "^9.0.12", - "@fluentui/react-portal": "^9.3.19", - "@fluentui/react-shared-contexts": "^9.9.2", - "@fluentui/react-tabster": "^9.13.2", + "@fluentui/react-jsx-runtime": "^9.0.17", + "@fluentui/react-portal": "^9.3.23", + "@fluentui/react-shared-contexts": "^9.10.0", + "@fluentui/react-tabster": "^9.13.6", "@fluentui/react-theme": "^9.1.14", - "@fluentui/react-utilities": "^9.13.5", + "@fluentui/react-utilities": "^9.15.0", "@griffel/react": "^1.5.14", "@swc/helpers": "^0.5.1" }, @@ -1311,23 +1208,15 @@ "react-dom": ">=16.14.0 <19.0.0" } }, - "node_modules/@fluentui/react-dialog/node_modules/@swc/helpers": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", - "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", - "dependencies": { - "tslib": "^2.4.0" - } - }, "node_modules/@fluentui/react-divider": { - "version": "9.2.40", - "resolved": "https://registry.npmjs.org/@fluentui/react-divider/-/react-divider-9.2.40.tgz", - "integrity": "sha512-2sj2GUcktpfMWrTmyRfhB1NCyVpf5Tqy81RB5169ZAMLpIkhvxeZiwDlpDix+szJSIEmbX1HEOYb/fPxkNia9Q==", + "version": "9.2.45", + "resolved": "https://registry.npmjs.org/@fluentui/react-divider/-/react-divider-9.2.45.tgz", + "integrity": "sha512-Oped8aMwKD9Oo/W43Nwq6l+ShmgnAxTnAwOkZ0207BOWuCmuOgpEz+kRUgqWsRiim299o+pLjeBBWUd2Tsbmzw==", "dependencies": { - "@fluentui/react-jsx-runtime": "^9.0.12", - "@fluentui/react-shared-contexts": "^9.9.2", + "@fluentui/react-jsx-runtime": "^9.0.17", + "@fluentui/react-shared-contexts": "^9.10.0", "@fluentui/react-theme": "^9.1.14", - "@fluentui/react-utilities": "^9.13.5", + "@fluentui/react-utilities": "^9.15.0", "@griffel/react": "^1.5.14", "@swc/helpers": "^0.5.1" }, @@ -1338,25 +1227,18 @@ "react-dom": ">=16.14.0 <19.0.0" } }, - "node_modules/@fluentui/react-divider/node_modules/@swc/helpers": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", - "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", - "dependencies": { - "tslib": "^2.4.0" - } - }, "node_modules/@fluentui/react-drawer": { - "version": "9.0.0-beta.30", - "resolved": "https://registry.npmjs.org/@fluentui/react-drawer/-/react-drawer-9.0.0-beta.30.tgz", - "integrity": "sha512-1BRXwtr1zp6HykKrXc2O2l+mO2pVTlRgl/ahBo+z3/uz4w8hEomdqd1R0gXqG7rLKMpGj6V+PGKNIIH+bJY8xg==", - "dependencies": { - "@fluentui/react-dialog": "^9.7.4", - "@fluentui/react-jsx-runtime": "^9.0.12", - "@fluentui/react-motion-preview": "^0.2.9", - "@fluentui/react-shared-contexts": "^9.9.2", + "version": "9.0.0-beta.35", + "resolved": "https://registry.npmjs.org/@fluentui/react-drawer/-/react-drawer-9.0.0-beta.35.tgz", + "integrity": "sha512-UihTfl1Fl38hOL48cY0SwW+MU/RWOY3M6wvaK9EKm1ipaPMblhNMNsUYvMu2v3G5fbhLtxGWrGNrtzqBsGaAsQ==", + "dependencies": { + "@fluentui/react-dialog": "^9.7.9", + "@fluentui/react-jsx-runtime": "^9.0.17", + "@fluentui/react-motion-preview": "^0.3.3", + "@fluentui/react-shared-contexts": "^9.10.0", + "@fluentui/react-tabster": "^9.13.6", "@fluentui/react-theme": "^9.1.14", - "@fluentui/react-utilities": "^9.13.5", + "@fluentui/react-utilities": "^9.15.0", "@griffel/react": "^1.5.14", "@swc/helpers": "^0.5.1" }, @@ -1367,25 +1249,17 @@ "react-dom": ">=16.14.0 <19.0.0" } }, - "node_modules/@fluentui/react-drawer/node_modules/@swc/helpers": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", - "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", - "dependencies": { - "tslib": "^2.4.0" - } - }, "node_modules/@fluentui/react-field": { - "version": "9.1.32", - "resolved": "https://registry.npmjs.org/@fluentui/react-field/-/react-field-9.1.32.tgz", - "integrity": "sha512-35VJCueXE8lr1/yNpMIwT97Jvo8c72tJZaN87HLrBXpkC8zm2hb1SpeV59raUHBGw7AdLUBLkrqYSrNN5uTUEg==", + "version": "9.1.37", + "resolved": "https://registry.npmjs.org/@fluentui/react-field/-/react-field-9.1.37.tgz", + "integrity": "sha512-niAikmjtShof2pOmJKzHHw2DLYcHkewWqKmxyEtUEpKjuuEczlfQ1YU/vS0H0x/Pjz8DFAxCf/AsP8saCGvYww==", "dependencies": { - "@fluentui/react-context-selector": "^9.1.36", + "@fluentui/react-context-selector": "^9.1.40", "@fluentui/react-icons": "^2.0.217", - "@fluentui/react-jsx-runtime": "^9.0.12", - "@fluentui/react-label": "^9.1.40", + "@fluentui/react-jsx-runtime": "^9.0.17", + "@fluentui/react-label": "^9.1.45", "@fluentui/react-theme": "^9.1.14", - "@fluentui/react-utilities": "^9.13.5", + "@fluentui/react-utilities": "^9.15.0", "@griffel/react": "^1.5.14", "@swc/helpers": "^0.5.1" }, @@ -1396,24 +1270,16 @@ "react-dom": ">=16.14.0 <19.0.0" } }, - "node_modules/@fluentui/react-field/node_modules/@swc/helpers": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", - "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", - "dependencies": { - "tslib": "^2.4.0" - } - }, "node_modules/@fluentui/react-focus": { - "version": "8.8.30", - "resolved": "https://registry.npmjs.org/@fluentui/react-focus/-/react-focus-8.8.30.tgz", - "integrity": "sha512-dKQQtNTZbQOE+u/Tmh7AbtJPSpzQNI0L8o55a22y4U7s33rizUd++CIiToXsB+bPvlotcmpZswZQ8V06zM4KIw==", + "version": "8.8.32", + "resolved": "https://registry.npmjs.org/@fluentui/react-focus/-/react-focus-8.8.32.tgz", + "integrity": "sha512-ALYMkDRG8qKCRuf5f3w5suWLFBT/65e4vC2EXKhYTcb/AGAH4wGMdWC+b4ek12D4u6L6tOegTMqC64fLp/RT3Q==", "dependencies": { "@fluentui/keyboard-key": "^0.4.11", "@fluentui/merge-styles": "^8.5.12", "@fluentui/set-version": "^8.2.11", - "@fluentui/style-utilities": "^8.9.16", - "@fluentui/utilities": "^8.13.18", + "@fluentui/style-utilities": "^8.9.18", + "@fluentui/utilities": "^8.13.19", "tslib": "^2.1.0" }, "peerDependencies": { @@ -1422,13 +1288,13 @@ } }, "node_modules/@fluentui/react-hooks": { - "version": "8.6.29", - "resolved": "https://registry.npmjs.org/@fluentui/react-hooks/-/react-hooks-8.6.29.tgz", - "integrity": "sha512-MeVevmGJtrYxdhoarrkVWE0Hs4XdzOc9A3tiOjMBIcwOvoOYOAoOELoHK/wuulPVwUn2R9Y+7JpJ6oCe4ImdJw==", + "version": "8.6.30", + "resolved": "https://registry.npmjs.org/@fluentui/react-hooks/-/react-hooks-8.6.30.tgz", + "integrity": "sha512-+EhJY2+C7wbWP+36zM4llc1KGY4/XWu36BnDumoKLJdcrnGilJHHQJ3pXhvJPf2f2mc7LoasCtQDmCQ5Tfzi3A==", "dependencies": { "@fluentui/react-window-provider": "^2.2.15", "@fluentui/set-version": "^8.2.11", - "@fluentui/utilities": "^8.13.18", + "@fluentui/utilities": "^8.13.19", "tslib": "^2.1.0" }, "peerDependencies": { @@ -1437,9 +1303,9 @@ } }, "node_modules/@fluentui/react-icons": { - "version": "2.0.218", - "resolved": "https://registry.npmjs.org/@fluentui/react-icons/-/react-icons-2.0.218.tgz", - "integrity": "sha512-9XoxrPQ4+fvYr6cUTTz4BRHl7UZMZRKL4j8nfJd+wix87AQqFVfloeFO2qUqxD/4uiJyt62VJJMfQCaxLdZCyA==", + "version": "2.0.220", + "resolved": "https://registry.npmjs.org/@fluentui/react-icons/-/react-icons-2.0.220.tgz", + "integrity": "sha512-AIe0y3QuG2dATGVlszyt/xCzVhyBcDulQnDepSLZvDXkuu8zL/zqQaSuiOizwZUVxxuF0SvePyf4zgi86zgtjg==", "dependencies": { "@griffel/react": "^1.0.0", "tslib": "^2.1.0" @@ -1449,14 +1315,14 @@ } }, "node_modules/@fluentui/react-image": { - "version": "9.1.37", - "resolved": "https://registry.npmjs.org/@fluentui/react-image/-/react-image-9.1.37.tgz", - "integrity": "sha512-xxajfywqcsqTOXXj2sWEA7101+wyNzprJ7W3uKzSOvp0A3NWNppuWc3mGUh7T784IPGs8g3J9wLJE7C/5B2+Gw==", + "version": "9.1.42", + "resolved": "https://registry.npmjs.org/@fluentui/react-image/-/react-image-9.1.42.tgz", + "integrity": "sha512-Wxv4EGvK93fnw/hRonZxQTtzA5O6g0FTCLawXmnE8/X4URiMQdccO8v5iztPfYXEbjcQ+/08t2b7PaO4p5AIew==", "dependencies": { - "@fluentui/react-jsx-runtime": "^9.0.12", - "@fluentui/react-shared-contexts": "^9.9.2", + "@fluentui/react-jsx-runtime": "^9.0.17", + "@fluentui/react-shared-contexts": "^9.10.0", "@fluentui/react-theme": "^9.1.14", - "@fluentui/react-utilities": "^9.13.5", + "@fluentui/react-utilities": "^9.15.0", "@griffel/react": "^1.5.14", "@swc/helpers": "^0.5.1" }, @@ -1467,27 +1333,18 @@ "react-dom": ">=16.14.0 <19.0.0" } }, - "node_modules/@fluentui/react-image/node_modules/@swc/helpers": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", - "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", - "dependencies": { - "tslib": "^2.4.0" - } - }, "node_modules/@fluentui/react-infobutton": { - "version": "9.0.0-beta.65", - "resolved": "https://registry.npmjs.org/@fluentui/react-infobutton/-/react-infobutton-9.0.0-beta.65.tgz", - "integrity": "sha512-/0R40+BSKtDZqrg4buaFju3VUEf39lNNLdVypoQwaiKAqC1JCGJt+JTffzmC4wAhzFlFfgNajcwnQc4CjeuB6A==", + "version": "9.0.0-beta.70", + "resolved": "https://registry.npmjs.org/@fluentui/react-infobutton/-/react-infobutton-9.0.0-beta.70.tgz", + "integrity": "sha512-rrqotdiMJqpfQuHYW4QYs8O0nZyPIPfUsvQqpfkFmbGXfn1NvRdZt3AOfHEAIIUEP2Na4UMnM1UhAXyXnvAZ9A==", "dependencies": { "@fluentui/react-icons": "^2.0.217", - "@fluentui/react-jsx-runtime": "^9.0.12", - "@fluentui/react-label": "^9.1.40", - "@fluentui/react-popover": "^9.8.10", - "@fluentui/react-portal": "^9.3.19", - "@fluentui/react-tabster": "^9.13.2", + "@fluentui/react-jsx-runtime": "^9.0.17", + "@fluentui/react-label": "^9.1.45", + "@fluentui/react-popover": "^9.8.15", + "@fluentui/react-tabster": "^9.13.6", "@fluentui/react-theme": "^9.1.14", - "@fluentui/react-utilities": "^9.13.5", + "@fluentui/react-utilities": "^9.15.0", "@griffel/react": "^1.5.14", "@swc/helpers": "^0.5.1" }, @@ -1498,24 +1355,16 @@ "react-dom": ">=16.14.0 <19.0.0" } }, - "node_modules/@fluentui/react-infobutton/node_modules/@swc/helpers": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", - "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", - "dependencies": { - "tslib": "^2.4.0" - } - }, "node_modules/@fluentui/react-input": { - "version": "9.4.42", - "resolved": "https://registry.npmjs.org/@fluentui/react-input/-/react-input-9.4.42.tgz", - "integrity": "sha512-Kv7F+6k3vIQ2p/lozkD8TN+sBXdhUag/biRGaGJVo5SYYAAfij4ajcBU0G4cZRNBRLeoMgzsQQLZXuZrrZuPsQ==", + "version": "9.4.47", + "resolved": "https://registry.npmjs.org/@fluentui/react-input/-/react-input-9.4.47.tgz", + "integrity": "sha512-WaTErvxo1CUPy/nHbataSuxWkuhpVhwYl+JbwbdYOktZVDIvM/us+YGmtEr2mA/FXCVqQ839k2mlmZCma4Hkwg==", "dependencies": { - "@fluentui/react-field": "^9.1.32", - "@fluentui/react-jsx-runtime": "^9.0.12", - "@fluentui/react-shared-contexts": "^9.9.2", + "@fluentui/react-field": "^9.1.37", + "@fluentui/react-jsx-runtime": "^9.0.17", + "@fluentui/react-shared-contexts": "^9.10.0", "@fluentui/react-theme": "^9.1.14", - "@fluentui/react-utilities": "^9.13.5", + "@fluentui/react-utilities": "^9.15.0", "@griffel/react": "^1.5.14", "@swc/helpers": "^0.5.1" }, @@ -1526,44 +1375,29 @@ "react-dom": ">=16.14.0 <19.0.0" } }, - "node_modules/@fluentui/react-input/node_modules/@swc/helpers": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", - "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", - "dependencies": { - "tslib": "^2.4.0" - } - }, "node_modules/@fluentui/react-jsx-runtime": { - "version": "9.0.12", - "resolved": "https://registry.npmjs.org/@fluentui/react-jsx-runtime/-/react-jsx-runtime-9.0.12.tgz", - "integrity": "sha512-fsnoz8xRGMGm9aePoetXrW3jqaDYB1GsziJbLhYB5HqgzsOcwOyL05TWL9nHjGu7hR6vXmfQTc715BXFYT6H7Q==", + "version": "9.0.17", + "resolved": "https://registry.npmjs.org/@fluentui/react-jsx-runtime/-/react-jsx-runtime-9.0.17.tgz", + "integrity": "sha512-gTwrWs0I4RkP9TmumGHGp5us8RU6tCf3Wjmx34DEutsDfsMmxzOHbsnhsymEBuhDIbHe6kricQ9McTkGhYP9SQ==", "dependencies": { - "@fluentui/react-utilities": "^9.13.5", - "@swc/helpers": "^0.5.1" + "@fluentui/react-utilities": "^9.15.0", + "@swc/helpers": "^0.5.1", + "react-is": "^17.0.2" }, "peerDependencies": { "@types/react": ">=16.14.0 <19.0.0", "react": ">=16.14.0 <19.0.0" } }, - "node_modules/@fluentui/react-jsx-runtime/node_modules/@swc/helpers": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", - "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", - "dependencies": { - "tslib": "^2.4.0" - } - }, "node_modules/@fluentui/react-label": { - "version": "9.1.40", - "resolved": "https://registry.npmjs.org/@fluentui/react-label/-/react-label-9.1.40.tgz", - "integrity": "sha512-LNfc/rniXb7SlQR4ryctLO2bX8vG8wkv/q/P0DNXJpsBXlYURW+YVKiM5sSWamIF/Jn1zxsnhyuxBd5hN2TO4g==", + "version": "9.1.45", + "resolved": "https://registry.npmjs.org/@fluentui/react-label/-/react-label-9.1.45.tgz", + "integrity": "sha512-d5lOvlSChf8uyWSpoPVjXcjHdHVLJCH2+ox6Ad+fQK/onKByzIGNPBwXAbZX7IHRVgg14PAJXvdXQNvHzc99Tg==", "dependencies": { - "@fluentui/react-jsx-runtime": "^9.0.12", - "@fluentui/react-shared-contexts": "^9.9.2", + "@fluentui/react-jsx-runtime": "^9.0.17", + "@fluentui/react-shared-contexts": "^9.10.0", "@fluentui/react-theme": "^9.1.14", - "@fluentui/react-utilities": "^9.13.5", + "@fluentui/react-utilities": "^9.15.0", "@griffel/react": "^1.5.14", "@swc/helpers": "^0.5.1" }, @@ -1574,25 +1408,17 @@ "react-dom": ">=16.14.0 <19.0.0" } }, - "node_modules/@fluentui/react-label/node_modules/@swc/helpers": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", - "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", - "dependencies": { - "tslib": "^2.4.0" - } - }, "node_modules/@fluentui/react-link": { - "version": "9.1.23", - "resolved": "https://registry.npmjs.org/@fluentui/react-link/-/react-link-9.1.23.tgz", - "integrity": "sha512-2lbQIFx5B6GkCkfo6VsiRY0q6W1+tss8hVt+KfoFf77wjjvFO+OSDMVUuJz+Is+pkacVWDt1XSXJIhHoIKo2ug==", + "version": "9.1.28", + "resolved": "https://registry.npmjs.org/@fluentui/react-link/-/react-link-9.1.28.tgz", + "integrity": "sha512-kJaev1RSxGYVNwJ5ABqknwXMsfIFuGJ7scczpNstmNqvuNE5mJ5OC+XF6u29a2kg6AGnQthI/k6xC4Ipo9EuTQ==", "dependencies": { "@fluentui/keyboard-keys": "^9.0.6", - "@fluentui/react-jsx-runtime": "^9.0.12", - "@fluentui/react-shared-contexts": "^9.9.2", - "@fluentui/react-tabster": "^9.13.2", + "@fluentui/react-jsx-runtime": "^9.0.17", + "@fluentui/react-shared-contexts": "^9.10.0", + "@fluentui/react-tabster": "^9.13.6", "@fluentui/react-theme": "^9.1.14", - "@fluentui/react-utilities": "^9.13.5", + "@fluentui/react-utilities": "^9.15.0", "@griffel/react": "^1.5.14", "@swc/helpers": "^0.5.1" }, @@ -1603,30 +1429,22 @@ "react-dom": ">=16.14.0 <19.0.0" } }, - "node_modules/@fluentui/react-link/node_modules/@swc/helpers": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", - "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", - "dependencies": { - "tslib": "^2.4.0" - } - }, "node_modules/@fluentui/react-menu": { - "version": "9.12.21", - "resolved": "https://registry.npmjs.org/@fluentui/react-menu/-/react-menu-9.12.21.tgz", - "integrity": "sha512-mmjh9S1+Bq9CPKzkaMVj3aMI04W2+IWZ2aQOiQvZBpksjjvj+EqG2aFrrGGoC0skAaV+Z0kdWxYbvOj3k9OddQ==", + "version": "9.12.26", + "resolved": "https://registry.npmjs.org/@fluentui/react-menu/-/react-menu-9.12.26.tgz", + "integrity": "sha512-oCwxmyMC4/mG1FfRhh1nHqcvNp5ONukbsi8TKhY+YVPDAd5C0CrTGrVyTB+vz873gUdnVpXSZnv6ZlneANbjxA==", "dependencies": { "@fluentui/keyboard-keys": "^9.0.6", - "@fluentui/react-aria": "^9.3.38", - "@fluentui/react-context-selector": "^9.1.36", + "@fluentui/react-aria": "^9.3.42", + "@fluentui/react-context-selector": "^9.1.40", "@fluentui/react-icons": "^2.0.217", - "@fluentui/react-jsx-runtime": "^9.0.12", - "@fluentui/react-portal": "^9.3.19", - "@fluentui/react-positioning": "^9.9.16", - "@fluentui/react-shared-contexts": "^9.9.2", - "@fluentui/react-tabster": "^9.13.2", + "@fluentui/react-jsx-runtime": "^9.0.17", + "@fluentui/react-portal": "^9.3.23", + "@fluentui/react-positioning": "^9.9.20", + "@fluentui/react-shared-contexts": "^9.10.0", + "@fluentui/react-tabster": "^9.13.6", "@fluentui/react-theme": "^9.1.14", - "@fluentui/react-utilities": "^9.13.5", + "@fluentui/react-utilities": "^9.15.0", "@griffel/react": "^1.5.14", "@swc/helpers": "^0.5.1" }, @@ -1638,23 +1456,37 @@ "scheduler": "^0.19.0 || ^0.20.0" } }, - "node_modules/@fluentui/react-menu/node_modules/@swc/helpers": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", - "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", + "node_modules/@fluentui/react-message-bar": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/@fluentui/react-message-bar/-/react-message-bar-9.0.0.tgz", + "integrity": "sha512-pm2+xzKOEPfUm6gqckMHybD6mqjj9N5WVfm0ssFcLuE6FqXT8wiGvvhdUb0kd8ctzrAfdysPKCZY35BXVw8zTQ==", "dependencies": { - "tslib": "^2.4.0" + "@fluentui/react-button": "^9.3.49", + "@fluentui/react-icons": "^2.0.217", + "@fluentui/react-jsx-runtime": "^9.0.17", + "@fluentui/react-shared-contexts": "^9.10.0", + "@fluentui/react-theme": "^9.1.14", + "@fluentui/react-utilities": "^9.15.0", + "@griffel/react": "^1.5.14", + "@swc/helpers": "^0.5.1", + "react-transition-group": "^4.4.1" + }, + "peerDependencies": { + "@types/react": ">=16.8.0 <19.0.0", + "@types/react-dom": ">=16.8.0 <19.0.0", + "react": ">=16.8.0 <19.0.0", + "react-dom": ">=16.8.0 <19.0.0" } }, "node_modules/@fluentui/react-motion-preview": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/@fluentui/react-motion-preview/-/react-motion-preview-0.2.9.tgz", - "integrity": "sha512-saEOO1t0T6S+WVGgz3fKISCx38CQ7jETpRM8uow3MtwDQWmg94Vkkp/V+pgTTRoHmFKLMzS+XpjUnTBdOL+LeA==", + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@fluentui/react-motion-preview/-/react-motion-preview-0.3.3.tgz", + "integrity": "sha512-IcUmrmhhaaznqJm+qwjEOj4d7NQEDaJHJ0AEWou7s4ggX5kU71mJBXssNsyXmBgMQ6xSvtaXXEtlHYvK+qKyDA==", "dependencies": { - "@fluentui/react-jsx-runtime": "^9.0.12", - "@fluentui/react-shared-contexts": "^9.9.2", + "@fluentui/react-jsx-runtime": "^9.0.17", + "@fluentui/react-shared-contexts": "^9.10.0", "@fluentui/react-theme": "^9.1.14", - "@fluentui/react-utilities": "^9.13.5", + "@fluentui/react-utilities": "^9.15.0", "@griffel/react": "^1.5.14", "@swc/helpers": "^0.5.1" }, @@ -1665,23 +1497,15 @@ "react-dom": ">=16.14.0 <19.0.0" } }, - "node_modules/@fluentui/react-motion-preview/node_modules/@swc/helpers": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", - "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", - "dependencies": { - "tslib": "^2.4.0" - } - }, "node_modules/@fluentui/react-overflow": { - "version": "9.0.35", - "resolved": "https://registry.npmjs.org/@fluentui/react-overflow/-/react-overflow-9.0.35.tgz", - "integrity": "sha512-npq8sX3VMBnpPdARkFxWXw8rFZoT93mOS/xvX7/cQ0WLWo1kyrKpVjq4r55ngvdgUCP5zx8Ed6UvnhEMQrqK2A==", + "version": "9.0.39", + "resolved": "https://registry.npmjs.org/@fluentui/react-overflow/-/react-overflow-9.0.39.tgz", + "integrity": "sha512-u4VxKA+n9HhEngubM+MDonpu9Z0bN72iTAU95LCL0pAdesczh6SPKupnz5M1bzFvDkEELij6m+hmNF+py3Z30A==", "dependencies": { "@fluentui/priority-overflow": "^9.1.7", - "@fluentui/react-context-selector": "^9.1.36", + "@fluentui/react-context-selector": "^9.1.40", "@fluentui/react-theme": "^9.1.14", - "@fluentui/react-utilities": "^9.13.5", + "@fluentui/react-utilities": "^9.15.0", "@griffel/react": "^1.5.14", "@swc/helpers": "^0.5.1" }, @@ -1693,25 +1517,17 @@ "scheduler": "^0.19.0 || ^0.20.0" } }, - "node_modules/@fluentui/react-overflow/node_modules/@swc/helpers": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", - "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", - "dependencies": { - "tslib": "^2.4.0" - } - }, "node_modules/@fluentui/react-persona": { - "version": "9.2.45", - "resolved": "https://registry.npmjs.org/@fluentui/react-persona/-/react-persona-9.2.45.tgz", - "integrity": "sha512-xGmBL6go2ONuxzufCYxe2WD9Xf5uRH2At7IYcMKnyc7TgL+BXlkonkxC4VVb6sZhNBSrQkug2Iopp2kEfhN+Pw==", - "dependencies": { - "@fluentui/react-avatar": "^9.5.35", - "@fluentui/react-badge": "^9.2.4", - "@fluentui/react-jsx-runtime": "^9.0.12", - "@fluentui/react-shared-contexts": "^9.9.2", + "version": "9.2.50", + "resolved": "https://registry.npmjs.org/@fluentui/react-persona/-/react-persona-9.2.50.tgz", + "integrity": "sha512-qEA2ud4qtWirKFvfuN57PZSLO2aKP2RN/lGkNRucapu9+MJ8q7+ugHYGqXTIrjigK6rUQf2lFDDc6ghjJD20CA==", + "dependencies": { + "@fluentui/react-avatar": "^9.5.40", + "@fluentui/react-badge": "^9.2.9", + "@fluentui/react-jsx-runtime": "^9.0.17", + "@fluentui/react-shared-contexts": "^9.10.0", "@fluentui/react-theme": "^9.1.14", - "@fluentui/react-utilities": "^9.13.5", + "@fluentui/react-utilities": "^9.15.0", "@griffel/react": "^1.5.14", "@swc/helpers": "^0.5.1" }, @@ -1722,29 +1538,21 @@ "react-dom": ">=16.14.0 <19.0.0" } }, - "node_modules/@fluentui/react-persona/node_modules/@swc/helpers": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", - "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", - "dependencies": { - "tslib": "^2.4.0" - } - }, "node_modules/@fluentui/react-popover": { - "version": "9.8.10", - "resolved": "https://registry.npmjs.org/@fluentui/react-popover/-/react-popover-9.8.10.tgz", - "integrity": "sha512-axQIwLPUlcjRmx5qEvhkkT/fgiIVA7n+INOfs6wQ1LTM4yi7YoNtwmgPDuXYxkLUHrGTEt8IHGK/JooGOP7amQ==", + "version": "9.8.15", + "resolved": "https://registry.npmjs.org/@fluentui/react-popover/-/react-popover-9.8.15.tgz", + "integrity": "sha512-phCp8RORWzKZDrysPhiiShosXzfE1D/hYTJn7pSmyJ7uTWCdNU2wT5Z93LoPZv8gwaiBZUmIE0TW4W9xBEpwnw==", "dependencies": { "@fluentui/keyboard-keys": "^9.0.6", - "@fluentui/react-aria": "^9.3.38", - "@fluentui/react-context-selector": "^9.1.36", - "@fluentui/react-jsx-runtime": "^9.0.12", - "@fluentui/react-portal": "^9.3.19", - "@fluentui/react-positioning": "^9.9.16", - "@fluentui/react-shared-contexts": "^9.9.2", - "@fluentui/react-tabster": "^9.13.2", + "@fluentui/react-aria": "^9.3.42", + "@fluentui/react-context-selector": "^9.1.40", + "@fluentui/react-jsx-runtime": "^9.0.17", + "@fluentui/react-portal": "^9.3.23", + "@fluentui/react-positioning": "^9.9.20", + "@fluentui/react-shared-contexts": "^9.10.0", + "@fluentui/react-tabster": "^9.13.6", "@fluentui/react-theme": "^9.1.14", - "@fluentui/react-utilities": "^9.13.5", + "@fluentui/react-utilities": "^9.15.0", "@griffel/react": "^1.5.14", "@swc/helpers": "^0.5.1" }, @@ -1756,22 +1564,14 @@ "scheduler": "^0.19.0 || ^0.20.0" } }, - "node_modules/@fluentui/react-popover/node_modules/@swc/helpers": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", - "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", - "dependencies": { - "tslib": "^2.4.0" - } - }, "node_modules/@fluentui/react-portal": { - "version": "9.3.19", - "resolved": "https://registry.npmjs.org/@fluentui/react-portal/-/react-portal-9.3.19.tgz", - "integrity": "sha512-ac6PzAlg3fFogHx3h6ScEFvWV3+HimhMtsS7xqk55bHbODq8ySyBLHWfLfb5gGWccUQXbVtNvKR2m2Q3EPWkew==", + "version": "9.3.23", + "resolved": "https://registry.npmjs.org/@fluentui/react-portal/-/react-portal-9.3.23.tgz", + "integrity": "sha512-8GdKXPZSD9s+KuGnPfc8npzBYd9hNmchZjgExMuv7BUqHPcuRIwHhMtvW+OvWseC5BxeybDFzlhNG1ZpzbigTg==", "dependencies": { - "@fluentui/react-shared-contexts": "^9.9.2", - "@fluentui/react-tabster": "^9.13.2", - "@fluentui/react-utilities": "^9.13.5", + "@fluentui/react-shared-contexts": "^9.10.0", + "@fluentui/react-tabster": "^9.13.6", + "@fluentui/react-utilities": "^9.15.0", "@griffel/react": "^1.5.14", "@swc/helpers": "^0.5.1", "use-disposable": "^1.0.1" @@ -1784,34 +1584,26 @@ } }, "node_modules/@fluentui/react-portal-compat-context": { - "version": "9.0.6", - "resolved": "https://registry.npmjs.org/@fluentui/react-portal-compat-context/-/react-portal-compat-context-9.0.6.tgz", - "integrity": "sha512-HUt0/YXKRB4chtzlGbZ+7y7FHFyqaI0CeMFAe/QBXVOiOwA01QOr2j4Uky+30vupspIt6mjodLanuw1jMybmqQ==", + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/@fluentui/react-portal-compat-context/-/react-portal-compat-context-9.0.9.tgz", + "integrity": "sha512-Qt4zBJjBf3QihWqDNfZ4D9ha0QdcUvw4zIErp6IkT4uFIkV2VSgEjIKXm0h2iDEZZQtzbGlFG+9hPPhH13HaPQ==", "dependencies": { - "@swc/helpers": "^0.4.14" + "@swc/helpers": "^0.5.1" }, "peerDependencies": { - "@types/react": ">=16.8.0 <19.0.0", - "react": ">=16.8.0 <19.0.0" - } - }, - "node_modules/@fluentui/react-portal/node_modules/@swc/helpers": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", - "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", - "dependencies": { - "tslib": "^2.4.0" + "@types/react": ">=16.14.0 <19.0.0", + "react": ">=16.14.0 <19.0.0" } }, "node_modules/@fluentui/react-positioning": { - "version": "9.9.16", - "resolved": "https://registry.npmjs.org/@fluentui/react-positioning/-/react-positioning-9.9.16.tgz", - "integrity": "sha512-oLEyAr5wmNYiwJX/xJuY28pNtfPl5T9aXfaGlneM3MrN+ARuCm5PUkNFtua8r0IIVptck0Dp5T41OTH437YBZQ==", + "version": "9.9.20", + "resolved": "https://registry.npmjs.org/@fluentui/react-positioning/-/react-positioning-9.9.20.tgz", + "integrity": "sha512-XrB4d+PDKFf9Z14nry8JwJ62YLI1OV5EqDw4Rw2g1qgbGYYQSz0T/1ouYlpa9oE367xRnawYBGpPYuUdo4S0Vw==", "dependencies": { "@floating-ui/dom": "^1.2.0", - "@fluentui/react-shared-contexts": "^9.9.2", + "@fluentui/react-shared-contexts": "^9.10.0", "@fluentui/react-theme": "^9.1.14", - "@fluentui/react-utilities": "^9.13.5", + "@fluentui/react-utilities": "^9.15.0", "@griffel/react": "^1.5.14", "@swc/helpers": "^0.5.1" }, @@ -1822,24 +1614,16 @@ "react-dom": ">=16.14.0 <19.0.0" } }, - "node_modules/@fluentui/react-positioning/node_modules/@swc/helpers": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", - "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", - "dependencies": { - "tslib": "^2.4.0" - } - }, "node_modules/@fluentui/react-progress": { - "version": "9.1.42", - "resolved": "https://registry.npmjs.org/@fluentui/react-progress/-/react-progress-9.1.42.tgz", - "integrity": "sha512-w2DBdHvYe767PXGrZIB7wbq62WkOv5Wq6jq012T5tOIkoUX8LtXjV/BIRgWez32feYw/dICbnkMCWWja8Tgm1A==", + "version": "9.1.47", + "resolved": "https://registry.npmjs.org/@fluentui/react-progress/-/react-progress-9.1.47.tgz", + "integrity": "sha512-fm0Ho6nVEZ8i9r+ZT91EAyc88I66xkPBXqmYL5Vz/9qHE23+IoYg4pExINm525N6Do/Gs0zwEqcnFKJ7G52eGg==", "dependencies": { - "@fluentui/react-field": "^9.1.32", - "@fluentui/react-jsx-runtime": "^9.0.12", - "@fluentui/react-shared-contexts": "^9.9.2", + "@fluentui/react-field": "^9.1.37", + "@fluentui/react-jsx-runtime": "^9.0.17", + "@fluentui/react-shared-contexts": "^9.10.0", "@fluentui/react-theme": "^9.1.14", - "@fluentui/react-utilities": "^9.13.5", + "@fluentui/react-utilities": "^9.15.0", "@griffel/react": "^1.5.14", "@swc/helpers": "^0.5.1" }, @@ -1850,25 +1634,17 @@ "react-dom": ">=16.14.0 <19.0.0" } }, - "node_modules/@fluentui/react-progress/node_modules/@swc/helpers": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", - "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", - "dependencies": { - "tslib": "^2.4.0" - } - }, "node_modules/@fluentui/react-provider": { - "version": "9.10.2", - "resolved": "https://registry.npmjs.org/@fluentui/react-provider/-/react-provider-9.10.2.tgz", - "integrity": "sha512-ti+EOLS8ZKxMDKCAqXavsVco0av1tEj71Z63Z1oITHXgasuB2/5tyB9XFc7j3cCIU+wdbLGBpzb2qMz1ntmy1g==", + "version": "9.10.7", + "resolved": "https://registry.npmjs.org/@fluentui/react-provider/-/react-provider-9.10.7.tgz", + "integrity": "sha512-i/dWzfaQwIU+yb5+/dBqFKQ3ixbh667lGOnEn+Pk4TABOEDXoLXX+muykP/Mdgj8MZppXR3HcaUkn5zc6w6HqA==", "dependencies": { "@fluentui/react-icons": "^2.0.217", - "@fluentui/react-jsx-runtime": "^9.0.12", - "@fluentui/react-shared-contexts": "^9.9.2", - "@fluentui/react-tabster": "^9.13.2", + "@fluentui/react-jsx-runtime": "^9.0.17", + "@fluentui/react-shared-contexts": "^9.10.0", + "@fluentui/react-tabster": "^9.13.6", "@fluentui/react-theme": "^9.1.14", - "@fluentui/react-utilities": "^9.13.5", + "@fluentui/react-utilities": "^9.15.0", "@griffel/core": "^1.14.1", "@griffel/react": "^1.5.14", "@swc/helpers": "^0.5.1" @@ -1880,27 +1656,19 @@ "react-dom": ">=16.14.0 <19.0.0" } }, - "node_modules/@fluentui/react-provider/node_modules/@swc/helpers": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", - "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", - "dependencies": { - "tslib": "^2.4.0" - } - }, "node_modules/@fluentui/react-radio": { - "version": "9.1.45", - "resolved": "https://registry.npmjs.org/@fluentui/react-radio/-/react-radio-9.1.45.tgz", - "integrity": "sha512-bSENYylQYE7S2se6jLmP2p7CWk2Ez6cWcXGwJqezrsV1uvLlfOhAwYHy2I2joGFfzznCXpzKff7OndAWFg/eKA==", + "version": "9.1.50", + "resolved": "https://registry.npmjs.org/@fluentui/react-radio/-/react-radio-9.1.50.tgz", + "integrity": "sha512-WIE31WS5120xJ0FEQUclTSlK2g+D3k+rIvj68PW0maL8D0yCRS81jD/pJeqd885v+KEU1aFbAYmMvY+3l5s1Gg==", "dependencies": { - "@fluentui/react-field": "^9.1.32", + "@fluentui/react-field": "^9.1.37", "@fluentui/react-icons": "^2.0.217", - "@fluentui/react-jsx-runtime": "^9.0.12", - "@fluentui/react-label": "^9.1.40", - "@fluentui/react-shared-contexts": "^9.9.2", - "@fluentui/react-tabster": "^9.13.2", + "@fluentui/react-jsx-runtime": "^9.0.17", + "@fluentui/react-label": "^9.1.45", + "@fluentui/react-shared-contexts": "^9.10.0", + "@fluentui/react-tabster": "^9.13.6", "@fluentui/react-theme": "^9.1.14", - "@fluentui/react-utilities": "^9.13.5", + "@fluentui/react-utilities": "^9.15.0", "@griffel/react": "^1.5.14", "@swc/helpers": "^0.5.1" }, @@ -1912,25 +1680,17 @@ "scheduler": "^0.19.0 || ^0.20.0" } }, - "node_modules/@fluentui/react-radio/node_modules/@swc/helpers": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", - "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", - "dependencies": { - "tslib": "^2.4.0" - } - }, "node_modules/@fluentui/react-select": { - "version": "9.1.42", - "resolved": "https://registry.npmjs.org/@fluentui/react-select/-/react-select-9.1.42.tgz", - "integrity": "sha512-pvqCX81UhWo53AVyxhvpaTih1vzfCfJWEM1YUhI3DchcZniYbUekvyMc2YjfWm/c6hWmY0mfwAvxqbA54atmJw==", + "version": "9.1.47", + "resolved": "https://registry.npmjs.org/@fluentui/react-select/-/react-select-9.1.47.tgz", + "integrity": "sha512-VZoY0pzSiecte9Ln+QG2vNMi8GqDUqLuipsi+KQ5ybrgfWuIYfo2R7kEZKSlJb5zFrZG+e4Y14P0dHKUQkCClQ==", "dependencies": { - "@fluentui/react-field": "^9.1.32", + "@fluentui/react-field": "^9.1.37", "@fluentui/react-icons": "^2.0.217", - "@fluentui/react-jsx-runtime": "^9.0.12", - "@fluentui/react-shared-contexts": "^9.9.2", + "@fluentui/react-jsx-runtime": "^9.0.17", + "@fluentui/react-shared-contexts": "^9.10.0", "@fluentui/react-theme": "^9.1.14", - "@fluentui/react-utilities": "^9.13.5", + "@fluentui/react-utilities": "^9.15.0", "@griffel/react": "^1.5.14", "@swc/helpers": "^0.5.1" }, @@ -1941,18 +1701,10 @@ "react-dom": ">=16.14.0 <19.0.0" } }, - "node_modules/@fluentui/react-select/node_modules/@swc/helpers": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", - "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", - "dependencies": { - "tslib": "^2.4.0" - } - }, "node_modules/@fluentui/react-shared-contexts": { - "version": "9.9.2", - "resolved": "https://registry.npmjs.org/@fluentui/react-shared-contexts/-/react-shared-contexts-9.9.2.tgz", - "integrity": "sha512-Vl6I6PVHbU1jU3WCrCjLOcmbxDCEpw8bxUZsk61BbAMxBlXa0uqQBitZBBelAm8C0UxgK9nqHG4gZXaTFytozw==", + "version": "9.10.0", + "resolved": "https://registry.npmjs.org/@fluentui/react-shared-contexts/-/react-shared-contexts-9.10.0.tgz", + "integrity": "sha512-2ubHqWnnd2VX82wAuGV0VVOXuQMQPz3x+8cgcGDI+z0lGrBF679N8W55QuEisvnDojoe6iASxJmc311N3aRzSQ==", "dependencies": { "@fluentui/react-theme": "^9.1.14", "@swc/helpers": "^0.5.1" @@ -1962,24 +1714,16 @@ "react": ">=16.14.0 <19.0.0" } }, - "node_modules/@fluentui/react-shared-contexts/node_modules/@swc/helpers": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", - "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", - "dependencies": { - "tslib": "^2.4.0" - } - }, "node_modules/@fluentui/react-skeleton": { - "version": "9.0.30", - "resolved": "https://registry.npmjs.org/@fluentui/react-skeleton/-/react-skeleton-9.0.30.tgz", - "integrity": "sha512-/+qDjQvlwcvUUcKe22jUEIfp+zeYltB+TZ3UQwkAsaumIFTZxkz1i7CIFhO2EqZVSZwLXG46+QaZtoz3W4fjIw==", + "version": "9.0.35", + "resolved": "https://registry.npmjs.org/@fluentui/react-skeleton/-/react-skeleton-9.0.35.tgz", + "integrity": "sha512-Em8bFv+Wp4gjiEH9YF9G+pzxIM6zJVVo5L6XWx8rAKMwP5gTwxr1mGOoHtLma2bzUhZYeKSfbGP54/Wr63aUsg==", "dependencies": { - "@fluentui/react-field": "^9.1.32", - "@fluentui/react-jsx-runtime": "^9.0.12", - "@fluentui/react-shared-contexts": "^9.9.2", + "@fluentui/react-field": "^9.1.37", + "@fluentui/react-jsx-runtime": "^9.0.17", + "@fluentui/react-shared-contexts": "^9.10.0", "@fluentui/react-theme": "^9.1.14", - "@fluentui/react-utilities": "^9.13.5", + "@fluentui/react-utilities": "^9.15.0", "@griffel/react": "^1.5.14", "@swc/helpers": "^0.5.1" }, @@ -1990,25 +1734,17 @@ "react-dom": ">=16.14.0 <19.0.0" } }, - "node_modules/@fluentui/react-skeleton/node_modules/@swc/helpers": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", - "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", - "dependencies": { - "tslib": "^2.4.0" - } - }, "node_modules/@fluentui/react-slider": { - "version": "9.1.45", - "resolved": "https://registry.npmjs.org/@fluentui/react-slider/-/react-slider-9.1.45.tgz", - "integrity": "sha512-/yAmuzmWWmf+yy+4gEOMDqXI0sMHYSETPsqM5SGmAtLwPCgi1rCy6Bvl9FoYR0LvBe/T80qgoyAuWQZ4Q0xnyw==", - "dependencies": { - "@fluentui/react-field": "^9.1.32", - "@fluentui/react-jsx-runtime": "^9.0.12", - "@fluentui/react-shared-contexts": "^9.9.2", - "@fluentui/react-tabster": "^9.13.2", + "version": "9.1.50", + "resolved": "https://registry.npmjs.org/@fluentui/react-slider/-/react-slider-9.1.50.tgz", + "integrity": "sha512-/qWK6/aRNwl/I3GU5NQK/CSRV9TKL5KpS4SOpGb5eSAUYrAKCY6GfYqDiNYKCZZ0rbX8L9VbSL+i+autdV8YNQ==", + "dependencies": { + "@fluentui/react-field": "^9.1.37", + "@fluentui/react-jsx-runtime": "^9.0.17", + "@fluentui/react-shared-contexts": "^9.10.0", + "@fluentui/react-tabster": "^9.13.6", "@fluentui/react-theme": "^9.1.14", - "@fluentui/react-utilities": "^9.13.5", + "@fluentui/react-utilities": "^9.15.0", "@griffel/react": "^1.5.14", "@swc/helpers": "^0.5.1" }, @@ -2019,26 +1755,18 @@ "react-dom": ">=16.14.0 <19.0.0" } }, - "node_modules/@fluentui/react-slider/node_modules/@swc/helpers": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", - "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", - "dependencies": { - "tslib": "^2.4.0" - } - }, "node_modules/@fluentui/react-spinbutton": { - "version": "9.2.42", - "resolved": "https://registry.npmjs.org/@fluentui/react-spinbutton/-/react-spinbutton-9.2.42.tgz", - "integrity": "sha512-bTSQH11gfrc2GMcT6XX+/EfsfOJwv7hQPa+pJzD97kkZoxbVIbJ7gI3DelSj5vsDXzWPr4cQBoADWXolSPx4Ow==", + "version": "9.2.47", + "resolved": "https://registry.npmjs.org/@fluentui/react-spinbutton/-/react-spinbutton-9.2.47.tgz", + "integrity": "sha512-dj3tCIw1XwZHq4Mbqsheit8RSsPyNXn6XytEZPOGVaegJItF/cbfzIKOVcwXjjfGNU4iDPuDkSo97QqHZUFhig==", "dependencies": { "@fluentui/keyboard-keys": "^9.0.6", - "@fluentui/react-field": "^9.1.32", + "@fluentui/react-field": "^9.1.37", "@fluentui/react-icons": "^2.0.217", - "@fluentui/react-jsx-runtime": "^9.0.12", - "@fluentui/react-shared-contexts": "^9.9.2", + "@fluentui/react-jsx-runtime": "^9.0.17", + "@fluentui/react-shared-contexts": "^9.10.0", "@fluentui/react-theme": "^9.1.14", - "@fluentui/react-utilities": "^9.13.5", + "@fluentui/react-utilities": "^9.15.0", "@griffel/react": "^1.5.14", "@swc/helpers": "^0.5.1" }, @@ -2049,24 +1777,16 @@ "react-dom": ">=16.14.0 <19.0.0" } }, - "node_modules/@fluentui/react-spinbutton/node_modules/@swc/helpers": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", - "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", - "dependencies": { - "tslib": "^2.4.0" - } - }, "node_modules/@fluentui/react-spinner": { - "version": "9.3.20", - "resolved": "https://registry.npmjs.org/@fluentui/react-spinner/-/react-spinner-9.3.20.tgz", - "integrity": "sha512-DNjTmO/0LwitTAHHRNpClxPabuBvD9Ot23Ki4XMUVFbKul99EP6cSN6Wi+B0ir531qzZYqIG++yZfdPIHoSnvg==", + "version": "9.3.25", + "resolved": "https://registry.npmjs.org/@fluentui/react-spinner/-/react-spinner-9.3.25.tgz", + "integrity": "sha512-8LyIQgv1nUSE3VuuHzFjMy9VQFw4oCd5kMOqOB4Hjog8AV2GW58Umb4fc+0tDrwfcGmX3ORi71fWyIivVs4Nzg==", "dependencies": { - "@fluentui/react-jsx-runtime": "^9.0.12", - "@fluentui/react-label": "^9.1.40", - "@fluentui/react-shared-contexts": "^9.9.2", + "@fluentui/react-jsx-runtime": "^9.0.17", + "@fluentui/react-label": "^9.1.45", + "@fluentui/react-shared-contexts": "^9.10.0", "@fluentui/react-theme": "^9.1.14", - "@fluentui/react-utilities": "^9.13.5", + "@fluentui/react-utilities": "^9.15.0", "@griffel/react": "^1.5.14", "@swc/helpers": "^0.5.1" }, @@ -2077,27 +1797,19 @@ "react-dom": ">=16.14.0 <19.0.0" } }, - "node_modules/@fluentui/react-spinner/node_modules/@swc/helpers": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", - "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", - "dependencies": { - "tslib": "^2.4.0" - } - }, "node_modules/@fluentui/react-switch": { - "version": "9.1.45", - "resolved": "https://registry.npmjs.org/@fluentui/react-switch/-/react-switch-9.1.45.tgz", - "integrity": "sha512-1AXGzpmFdmrOjRsUyDwdjBj4jUKesAiFEVpIjflRODhpp91k7ldfIYaNI65FlB73w7gwMftwUhY9HCj49c2iUw==", + "version": "9.1.50", + "resolved": "https://registry.npmjs.org/@fluentui/react-switch/-/react-switch-9.1.50.tgz", + "integrity": "sha512-kNsaknbutksBSR6VVvsuEbeaKUB2rVHsYSERkdsIcLhfpgJHmbFCtgHHuPNjUU1xgDpg1uLXRqH0aJiwZD8h5w==", "dependencies": { - "@fluentui/react-field": "^9.1.32", + "@fluentui/react-field": "^9.1.37", "@fluentui/react-icons": "^2.0.217", - "@fluentui/react-jsx-runtime": "^9.0.12", - "@fluentui/react-label": "^9.1.40", - "@fluentui/react-shared-contexts": "^9.9.2", - "@fluentui/react-tabster": "^9.13.2", + "@fluentui/react-jsx-runtime": "^9.0.17", + "@fluentui/react-label": "^9.1.45", + "@fluentui/react-shared-contexts": "^9.10.0", + "@fluentui/react-tabster": "^9.13.6", "@fluentui/react-theme": "^9.1.14", - "@fluentui/react-utilities": "^9.13.5", + "@fluentui/react-utilities": "^9.15.0", "@griffel/react": "^1.5.14", "@swc/helpers": "^0.5.1" }, @@ -2108,31 +1820,23 @@ "react-dom": ">=16.14.0 <19.0.0" } }, - "node_modules/@fluentui/react-switch/node_modules/@swc/helpers": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", - "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", - "dependencies": { - "tslib": "^2.4.0" - } - }, "node_modules/@fluentui/react-table": { - "version": "9.10.0", - "resolved": "https://registry.npmjs.org/@fluentui/react-table/-/react-table-9.10.0.tgz", - "integrity": "sha512-Zi+RkkX2oF7JMhLsgmAOlEku9+KGvN7w/Mc3lYXylcak4ljWJb/n8sGXrHqV/HU8divI/DPnom7JA9cPAs45zg==", + "version": "9.10.5", + "resolved": "https://registry.npmjs.org/@fluentui/react-table/-/react-table-9.10.5.tgz", + "integrity": "sha512-SgSXeBJdnQz23Kr1qyw3i+nCMJxYwgI3N6RWQHs6Lm/GZ4e2ddSHhZxnizwsAnLQhXYy+IU+veJk8K+f8UEFKw==", "dependencies": { "@fluentui/keyboard-keys": "^9.0.6", - "@fluentui/react-aria": "^9.3.38", - "@fluentui/react-avatar": "^9.5.35", - "@fluentui/react-checkbox": "^9.1.45", - "@fluentui/react-context-selector": "^9.1.36", + "@fluentui/react-aria": "^9.3.42", + "@fluentui/react-avatar": "^9.5.40", + "@fluentui/react-checkbox": "^9.1.50", + "@fluentui/react-context-selector": "^9.1.40", "@fluentui/react-icons": "^2.0.217", - "@fluentui/react-jsx-runtime": "^9.0.12", - "@fluentui/react-radio": "^9.1.45", - "@fluentui/react-shared-contexts": "^9.9.2", - "@fluentui/react-tabster": "^9.13.2", + "@fluentui/react-jsx-runtime": "^9.0.17", + "@fluentui/react-radio": "^9.1.50", + "@fluentui/react-shared-contexts": "^9.10.0", + "@fluentui/react-tabster": "^9.13.6", "@fluentui/react-theme": "^9.1.14", - "@fluentui/react-utilities": "^9.13.5", + "@fluentui/react-utilities": "^9.15.0", "@griffel/react": "^1.5.14", "@swc/helpers": "^0.5.1" }, @@ -2143,25 +1847,17 @@ "react-dom": ">=16.14.0 <19.0.0" } }, - "node_modules/@fluentui/react-table/node_modules/@swc/helpers": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", - "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", - "dependencies": { - "tslib": "^2.4.0" - } - }, "node_modules/@fluentui/react-tabs": { - "version": "9.3.46", - "resolved": "https://registry.npmjs.org/@fluentui/react-tabs/-/react-tabs-9.3.46.tgz", - "integrity": "sha512-Vb6L6E5x0Dy2Yj/UnvRhKrOqlZtr/ZgrrF+0vPrBj1Eqy5iwUH+kPVP0EYcvdRg3QCfbHNxAiNSvlXnLxQz24A==", - "dependencies": { - "@fluentui/react-context-selector": "^9.1.36", - "@fluentui/react-jsx-runtime": "^9.0.12", - "@fluentui/react-shared-contexts": "^9.9.2", - "@fluentui/react-tabster": "^9.13.2", + "version": "9.3.51", + "resolved": "https://registry.npmjs.org/@fluentui/react-tabs/-/react-tabs-9.3.51.tgz", + "integrity": "sha512-+oQeZSoIuWSZ79/7VRc4GCjJBTEI6EBHCKCU1JEwGWStRbtRRJPblyq/3sagkHU/Qyz3uas5+Bq7Ll31jI2Big==", + "dependencies": { + "@fluentui/react-context-selector": "^9.1.40", + "@fluentui/react-jsx-runtime": "^9.0.17", + "@fluentui/react-shared-contexts": "^9.10.0", + "@fluentui/react-tabster": "^9.13.6", "@fluentui/react-theme": "^9.1.14", - "@fluentui/react-utilities": "^9.13.5", + "@fluentui/react-utilities": "^9.15.0", "@griffel/react": "^1.5.14", "@swc/helpers": "^0.5.1" }, @@ -2173,22 +1869,14 @@ "scheduler": "^0.19.0 || ^0.20.0" } }, - "node_modules/@fluentui/react-tabs/node_modules/@swc/helpers": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", - "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", - "dependencies": { - "tslib": "^2.4.0" - } - }, "node_modules/@fluentui/react-tabster": { - "version": "9.13.2", - "resolved": "https://registry.npmjs.org/@fluentui/react-tabster/-/react-tabster-9.13.2.tgz", - "integrity": "sha512-ooh4WGI3CL4shLeGGIS4g7eCVXnPPTBDITpZMZlwXq/JExetwpGTniCHSmWtlPnTcOFIpzdHVOS9ubJWH66GBQ==", + "version": "9.13.6", + "resolved": "https://registry.npmjs.org/@fluentui/react-tabster/-/react-tabster-9.13.6.tgz", + "integrity": "sha512-NjSFil+JfGSC92upv/FIjSzvfoOn/Lh87hABCR+5FN/bQIyAduB/293qOztV63KLaEdrqC3yJyQbPV2Nz4DwQg==", "dependencies": { - "@fluentui/react-shared-contexts": "^9.9.2", + "@fluentui/react-shared-contexts": "^9.10.0", "@fluentui/react-theme": "^9.1.14", - "@fluentui/react-utilities": "^9.13.5", + "@fluentui/react-utilities": "^9.15.0", "@griffel/react": "^1.5.14", "@swc/helpers": "^0.5.1", "keyborg": "^2.0.0", @@ -2201,23 +1889,39 @@ "react-dom": ">=16.14.0 <19.0.0" } }, - "node_modules/@fluentui/react-tabster/node_modules/@swc/helpers": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", - "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", + "node_modules/@fluentui/react-tags": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/@fluentui/react-tags/-/react-tags-9.0.4.tgz", + "integrity": "sha512-tgS2/u6rCzFWCovvev6Ey1OiH1dSi756rVvWTJyCEha3PPqXahmbs3EL+60npiIEur89nAA/aEVbSFbMDqwV5g==", "dependencies": { - "tslib": "^2.4.0" + "@fluentui/keyboard-keys": "^9.0.6", + "@fluentui/react-aria": "^9.3.42", + "@fluentui/react-avatar": "^9.5.40", + "@fluentui/react-icons": "^2.0.217", + "@fluentui/react-jsx-runtime": "^9.0.17", + "@fluentui/react-shared-contexts": "^9.10.0", + "@fluentui/react-tabster": "^9.13.6", + "@fluentui/react-theme": "^9.1.14", + "@fluentui/react-utilities": "^9.15.0", + "@griffel/react": "^1.5.14", + "@swc/helpers": "^0.5.1" + }, + "peerDependencies": { + "@types/react": ">=16.14.0 <19.0.0", + "@types/react-dom": ">=16.14.0 <19.0.0", + "react": ">=16.14.0 <19.0.0", + "react-dom": ">=16.14.0 <19.0.0" } }, "node_modules/@fluentui/react-text": { - "version": "9.3.37", - "resolved": "https://registry.npmjs.org/@fluentui/react-text/-/react-text-9.3.37.tgz", - "integrity": "sha512-4ibOuYc1zx+YBoCLn5bjCpcjz+GGlKigvFcohefFd2+wVUbrwK4rT1yEOvKqVsoQRLTMXjc3kivx9qlpUaG/5A==", + "version": "9.3.42", + "resolved": "https://registry.npmjs.org/@fluentui/react-text/-/react-text-9.3.42.tgz", + "integrity": "sha512-PxBsOh6Bk10FpKUhcTN3PnAGh3uIK6gRSKWuzT+h23A/RTZP5UrCmGLaxPMJXFm9cltWRiwqfC4AMiBYF1RLZg==", "dependencies": { - "@fluentui/react-jsx-runtime": "^9.0.12", - "@fluentui/react-shared-contexts": "^9.9.2", + "@fluentui/react-jsx-runtime": "^9.0.17", + "@fluentui/react-shared-contexts": "^9.10.0", "@fluentui/react-theme": "^9.1.14", - "@fluentui/react-utilities": "^9.13.5", + "@fluentui/react-utilities": "^9.15.0", "@griffel/react": "^1.5.14", "@swc/helpers": "^0.5.1" }, @@ -2228,24 +1932,16 @@ "react-dom": ">=16.14.0 <19.0.0" } }, - "node_modules/@fluentui/react-text/node_modules/@swc/helpers": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", - "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", - "dependencies": { - "tslib": "^2.4.0" - } - }, "node_modules/@fluentui/react-textarea": { - "version": "9.3.42", - "resolved": "https://registry.npmjs.org/@fluentui/react-textarea/-/react-textarea-9.3.42.tgz", - "integrity": "sha512-wJh+HaH+odfnC1kTqB63lktXnVHbhDvA/ejhfUntPfVt56vhmmYjdA0M2BNFu/5SVh4mVBdmt1iU1+KslcEozg==", + "version": "9.3.47", + "resolved": "https://registry.npmjs.org/@fluentui/react-textarea/-/react-textarea-9.3.47.tgz", + "integrity": "sha512-ebC9u8Swl7ajUTm55WG6k6QqXvaoPFTGqdagtXLSEPQ0Dt7otqKnQh39jS4SmGVmRT4Oh4LGnuh7Fe6aJW/rvw==", "dependencies": { - "@fluentui/react-field": "^9.1.32", - "@fluentui/react-jsx-runtime": "^9.0.12", - "@fluentui/react-shared-contexts": "^9.9.2", + "@fluentui/react-field": "^9.1.37", + "@fluentui/react-jsx-runtime": "^9.0.17", + "@fluentui/react-shared-contexts": "^9.10.0", "@fluentui/react-theme": "^9.1.14", - "@fluentui/react-utilities": "^9.13.5", + "@fluentui/react-utilities": "^9.15.0", "@griffel/react": "^1.5.14", "@swc/helpers": "^0.5.1" }, @@ -2256,14 +1952,6 @@ "react-dom": ">=16.14.0 <19.0.0" } }, - "node_modules/@fluentui/react-textarea/node_modules/@swc/helpers": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", - "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", - "dependencies": { - "tslib": "^2.4.0" - } - }, "node_modules/@fluentui/react-theme": { "version": "9.1.14", "resolved": "https://registry.npmjs.org/@fluentui/react-theme/-/react-theme-9.1.14.tgz", @@ -2273,28 +1961,20 @@ "@swc/helpers": "^0.5.1" } }, - "node_modules/@fluentui/react-theme/node_modules/@swc/helpers": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", - "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", - "dependencies": { - "tslib": "^2.4.0" - } - }, "node_modules/@fluentui/react-toast": { - "version": "9.3.6", - "resolved": "https://registry.npmjs.org/@fluentui/react-toast/-/react-toast-9.3.6.tgz", - "integrity": "sha512-3Of3BG1a6fTMJ4OdPAhlNezjdN9xiTat0u7+ZvqapyiXSKJNqG5IccZsQ7svb42+4LtVKJgENULsBvplmYoxSw==", + "version": "9.3.11", + "resolved": "https://registry.npmjs.org/@fluentui/react-toast/-/react-toast-9.3.11.tgz", + "integrity": "sha512-fIFMQMDcekgMpX3+f934cyrFNJ8vF4/k8CxK6vvWzE3B8z+2zLKwHye5dYFKoeG4c8o4c9CAHWjiAP/R3fENOA==", "dependencies": { "@fluentui/keyboard-keys": "^9.0.6", - "@fluentui/react-aria": "^9.3.38", + "@fluentui/react-aria": "^9.3.42", "@fluentui/react-icons": "^2.0.217", - "@fluentui/react-jsx-runtime": "^9.0.12", - "@fluentui/react-portal": "^9.3.19", - "@fluentui/react-shared-contexts": "^9.9.2", - "@fluentui/react-tabster": "^9.13.2", + "@fluentui/react-jsx-runtime": "^9.0.17", + "@fluentui/react-portal": "^9.3.23", + "@fluentui/react-shared-contexts": "^9.10.0", + "@fluentui/react-tabster": "^9.13.6", "@fluentui/react-theme": "^9.1.14", - "@fluentui/react-utilities": "^9.13.5", + "@fluentui/react-utilities": "^9.15.0", "@griffel/react": "^1.5.14", "@swc/helpers": "^0.5.1", "react-transition-group": "^4.4.1" @@ -2306,28 +1986,20 @@ "react-dom": ">=16.14.0 <19.0.0" } }, - "node_modules/@fluentui/react-toast/node_modules/@swc/helpers": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", - "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", - "dependencies": { - "tslib": "^2.4.0" - } - }, "node_modules/@fluentui/react-toolbar": { - "version": "9.1.45", - "resolved": "https://registry.npmjs.org/@fluentui/react-toolbar/-/react-toolbar-9.1.45.tgz", - "integrity": "sha512-G9A0h1TgPn3OfpYYG9AU5+Ej/OTZw5FcC1ouLjZNWCL5NhQgMnh4He5C/vJwLrC8fAQJXWcss7xzTNi+/vfsrQ==", - "dependencies": { - "@fluentui/react-button": "^9.3.44", - "@fluentui/react-context-selector": "^9.1.36", - "@fluentui/react-divider": "^9.2.40", - "@fluentui/react-jsx-runtime": "^9.0.12", - "@fluentui/react-radio": "^9.1.45", - "@fluentui/react-shared-contexts": "^9.9.2", - "@fluentui/react-tabster": "^9.13.2", + "version": "9.1.50", + "resolved": "https://registry.npmjs.org/@fluentui/react-toolbar/-/react-toolbar-9.1.50.tgz", + "integrity": "sha512-/3TSImj6YLHf0nNRODdE53allFOoOwiHesp4+El7CUvRey6EoDXATbPCVC4jcsB62bIKif4DqVPsCGrdmJIs8Q==", + "dependencies": { + "@fluentui/react-button": "^9.3.49", + "@fluentui/react-context-selector": "^9.1.40", + "@fluentui/react-divider": "^9.2.45", + "@fluentui/react-jsx-runtime": "^9.0.17", + "@fluentui/react-radio": "^9.1.50", + "@fluentui/react-shared-contexts": "^9.10.0", + "@fluentui/react-tabster": "^9.13.6", "@fluentui/react-theme": "^9.1.14", - "@fluentui/react-utilities": "^9.13.5", + "@fluentui/react-utilities": "^9.15.0", "@griffel/react": "^1.5.14", "@swc/helpers": "^0.5.1" }, @@ -2338,26 +2010,18 @@ "react-dom": ">=16.14.0 <19.0.0" } }, - "node_modules/@fluentui/react-toolbar/node_modules/@swc/helpers": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", - "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", - "dependencies": { - "tslib": "^2.4.0" - } - }, "node_modules/@fluentui/react-tooltip": { - "version": "9.3.11", - "resolved": "https://registry.npmjs.org/@fluentui/react-tooltip/-/react-tooltip-9.3.11.tgz", - "integrity": "sha512-GZd8qGrOZ4CAD+P0UGLdqEazViDePhYhabgyL6oFLlwz3T6dPFaJWdvS0njCznc4pHuaEW/+vAJ6O7VJCnk7wA==", + "version": "9.3.16", + "resolved": "https://registry.npmjs.org/@fluentui/react-tooltip/-/react-tooltip-9.3.16.tgz", + "integrity": "sha512-dFk2uq1QWk4pI3+FrJdZ1jFg1tnIUT3Zu70rsUHzIfnE/HDDSQ014baCbNJJpYblSdEad6FLyw42zEAO+gwvmA==", "dependencies": { "@fluentui/keyboard-keys": "^9.0.6", - "@fluentui/react-jsx-runtime": "^9.0.12", - "@fluentui/react-portal": "^9.3.19", - "@fluentui/react-positioning": "^9.9.16", - "@fluentui/react-shared-contexts": "^9.9.2", + "@fluentui/react-jsx-runtime": "^9.0.17", + "@fluentui/react-portal": "^9.3.23", + "@fluentui/react-positioning": "^9.9.20", + "@fluentui/react-shared-contexts": "^9.10.0", "@fluentui/react-theme": "^9.1.14", - "@fluentui/react-utilities": "^9.13.5", + "@fluentui/react-utilities": "^9.15.0", "@griffel/react": "^1.5.14", "@swc/helpers": "^0.5.1" }, @@ -2368,33 +2032,24 @@ "react-dom": ">=16.14.0 <19.0.0" } }, - "node_modules/@fluentui/react-tooltip/node_modules/@swc/helpers": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", - "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", - "dependencies": { - "tslib": "^2.4.0" - } - }, "node_modules/@fluentui/react-tree": { - "version": "9.4.0", - "resolved": "https://registry.npmjs.org/@fluentui/react-tree/-/react-tree-9.4.0.tgz", - "integrity": "sha512-XFzvtBzwimmwh88iN79C43IFRNE0NbJ8gnFdyOCoQ/rjVib2RxHtnOZtww2DroOdWZtRyXYRiymmogoQdYV0pg==", + "version": "9.4.5", + "resolved": "https://registry.npmjs.org/@fluentui/react-tree/-/react-tree-9.4.5.tgz", + "integrity": "sha512-awIJG252HwzyYLKidw8OKZWZOMW1S6ytiaQuK8cd029FO4CUTCkiXmWkg8Fxs6isQhcmaUTsuBvlBD5MYXCdww==", "dependencies": { "@fluentui/keyboard-keys": "^9.0.6", - "@fluentui/react-aria": "^9.3.38", - "@fluentui/react-avatar": "^9.5.35", - "@fluentui/react-button": "^9.3.44", - "@fluentui/react-checkbox": "^9.1.45", - "@fluentui/react-context-selector": "^9.1.36", + "@fluentui/react-aria": "^9.3.42", + "@fluentui/react-avatar": "^9.5.40", + "@fluentui/react-button": "^9.3.49", + "@fluentui/react-checkbox": "^9.1.50", + "@fluentui/react-context-selector": "^9.1.40", "@fluentui/react-icons": "^2.0.217", - "@fluentui/react-jsx-runtime": "^9.0.12", - "@fluentui/react-portal": "^9.3.19", - "@fluentui/react-radio": "^9.1.45", - "@fluentui/react-shared-contexts": "^9.9.2", - "@fluentui/react-tabster": "^9.13.2", + "@fluentui/react-jsx-runtime": "^9.0.17", + "@fluentui/react-radio": "^9.1.50", + "@fluentui/react-shared-contexts": "^9.10.0", + "@fluentui/react-tabster": "^9.13.6", "@fluentui/react-theme": "^9.1.14", - "@fluentui/react-utilities": "^9.13.5", + "@fluentui/react-utilities": "^9.15.0", "@griffel/react": "^1.5.14", "@swc/helpers": "^0.5.1" }, @@ -2405,18 +2060,10 @@ "react-dom": ">=16.14.0 <19.0.0" } }, - "node_modules/@fluentui/react-tree/node_modules/@swc/helpers": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", - "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", - "dependencies": { - "tslib": "^2.4.0" - } - }, "node_modules/@fluentui/react-utilities": { - "version": "9.13.5", - "resolved": "https://registry.npmjs.org/@fluentui/react-utilities/-/react-utilities-9.13.5.tgz", - "integrity": "sha512-WDwBfX0IYZcZAyrSKdCpc/vAXHXLPX8lYZ9yHCI68cJXJKyeupOidK+sCrdZnwgtNMV8Qyl8CwIeaWdbcfi14g==", + "version": "9.15.0", + "resolved": "https://registry.npmjs.org/@fluentui/react-utilities/-/react-utilities-9.15.0.tgz", + "integrity": "sha512-kWuWKN8Ygd3HMlkSBmgZjvVC/jbOpnNC916sTPKCRv9ZYUwfkViV3UCeTNonRjzAhI8g+o+sP9/XQxp6QN5C5Q==", "dependencies": { "@fluentui/keyboard-keys": "^9.0.6", "@swc/helpers": "^0.5.1" @@ -2426,21 +2073,13 @@ "react": ">=16.14.0 <19.0.0" } }, - "node_modules/@fluentui/react-utilities/node_modules/@swc/helpers": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", - "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", - "dependencies": { - "tslib": "^2.4.0" - } - }, "node_modules/@fluentui/react-virtualizer": { - "version": "9.0.0-alpha.46", - "resolved": "https://registry.npmjs.org/@fluentui/react-virtualizer/-/react-virtualizer-9.0.0-alpha.46.tgz", - "integrity": "sha512-mpU4Wj3XtKvAgbfteicfXUgmJEHAuvuIM4/lPPGkOMzeiPByFUmJT3+CB96SreDjhDS9K3Psoa2PlPDAWzxOyg==", + "version": "9.0.0-alpha.51", + "resolved": "https://registry.npmjs.org/@fluentui/react-virtualizer/-/react-virtualizer-9.0.0-alpha.51.tgz", + "integrity": "sha512-1DhsNUovlp3fvZAsJAKINyDweUOsLR83gu7Pu00PmIHb5Y32gmsMm5CkGddMsrWiPB6duKuhDAkTjHI6VV/23w==", "dependencies": { - "@fluentui/react-jsx-runtime": "^9.0.12", - "@fluentui/react-utilities": "^9.13.5", + "@fluentui/react-jsx-runtime": "^9.0.17", + "@fluentui/react-utilities": "^9.15.0", "@griffel/react": "^1.5.14", "@swc/helpers": "^0.5.1" }, @@ -2451,14 +2090,6 @@ "react-dom": ">=16.14.0 <19.0.0" } }, - "node_modules/@fluentui/react-virtualizer/node_modules/@swc/helpers": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", - "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", - "dependencies": { - "tslib": "^2.4.0" - } - }, "node_modules/@fluentui/react-window-provider": { "version": "2.2.15", "resolved": "https://registry.npmjs.org/@fluentui/react-window-provider/-/react-window-provider-2.2.15.tgz", @@ -2481,26 +2112,26 @@ } }, "node_modules/@fluentui/style-utilities": { - "version": "8.9.16", - "resolved": "https://registry.npmjs.org/@fluentui/style-utilities/-/style-utilities-8.9.16.tgz", - "integrity": "sha512-8hS5HscCFYvcWjAdk37frPZJZthr7f/cu5db7gjrPy+DEhf13WAZRHsropWm17+8GhJhvKt98BQf/Kzxtt34Eg==", + "version": "8.9.18", + "resolved": "https://registry.npmjs.org/@fluentui/style-utilities/-/style-utilities-8.9.18.tgz", + "integrity": "sha512-bWRcN8q2JDLZJOxJ3ov+2MLP+XqK3tHMGyLWjDAkUYUzgsM3ppA0HAroo/MLkn8vrFcoUYCuL/jtv7IXR6SZBw==", "dependencies": { "@fluentui/merge-styles": "^8.5.12", "@fluentui/set-version": "^8.2.11", - "@fluentui/theme": "^2.6.34", - "@fluentui/utilities": "^8.13.18", + "@fluentui/theme": "^2.6.36", + "@fluentui/utilities": "^8.13.19", "@microsoft/load-themed-styles": "^1.10.26", "tslib": "^2.1.0" } }, "node_modules/@fluentui/theme": { - "version": "2.6.34", - "resolved": "https://registry.npmjs.org/@fluentui/theme/-/theme-2.6.34.tgz", - "integrity": "sha512-2Ssi3sX2snnbPJ4PmxbpCDCGePRE36tvGj2qKgdKiSh/fPVsg1b+Q50YlpFl9sXmbhl1uFmxjAx6WPsVGTl7vQ==", + "version": "2.6.36", + "resolved": "https://registry.npmjs.org/@fluentui/theme/-/theme-2.6.36.tgz", + "integrity": "sha512-rSP+LNmOJ9woiZzicdgtKFHt8Tyq7Jqu4KpczW0zXOYR9orgwFecpiUwRpZs1zD6lb3pAUNw4oYrM1tc7FH5AA==", "dependencies": { "@fluentui/merge-styles": "^8.5.12", "@fluentui/set-version": "^8.2.11", - "@fluentui/utilities": "^8.13.18", + "@fluentui/utilities": "^8.13.19", "tslib": "^2.1.0" }, "peerDependencies": { @@ -2516,18 +2147,10 @@ "@swc/helpers": "^0.5.1" } }, - "node_modules/@fluentui/tokens/node_modules/@swc/helpers": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", - "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", - "dependencies": { - "tslib": "^2.4.0" - } - }, "node_modules/@fluentui/utilities": { - "version": "8.13.18", - "resolved": "https://registry.npmjs.org/@fluentui/utilities/-/utilities-8.13.18.tgz", - "integrity": "sha512-/0rX9EzltLKwU1SS14VV7agWoOzruVTU3oagZq1QgFAvoj8qi7fNqvSX/VEeRy+0gmbsCkrEViUPkmC7drKzPg==", + "version": "8.13.19", + "resolved": "https://registry.npmjs.org/@fluentui/utilities/-/utilities-8.13.19.tgz", + "integrity": "sha512-v0WNV6NNQKi9nLttvc6btzxX3XOVRA817fZ7zBqsV6JWQGRfyrBwhskh6TUIgANJjPejz5nk05U6rvSWNUM+FQ==", "dependencies": { "@fluentui/dom-utilities": "^2.2.11", "@fluentui/merge-styles": "^8.5.12", @@ -2631,15 +2254,6 @@ "resolved": "https://registry.npmjs.org/@microsoft/load-themed-styles/-/load-themed-styles-1.10.295.tgz", "integrity": "sha512-W+IzEBw8a6LOOfRJM02dTT7BDZijxm+Z7lhtOAz1+y9vQm1Kdz9jlAO+qCEKsfxtUOmKilW8DIRqFw2aUgKeGg==" }, - "node_modules/@nicolo-ribaudo/semver-v6": { - "version": "6.3.3", - "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/semver-v6/-/semver-v6-6.3.3.tgz", - "integrity": "sha512-3Yc1fUTs69MG/uZbJlLSI3JISMn2UV2rg+1D/vROUqZyh3l6iYHCs7GMp+M40ZD7yOdDbYjJcU1oTJhrc+dGKg==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/@react-spring/animated": { "version": "9.7.3", "resolved": "https://registry.npmjs.org/@react-spring/animated/-/animated-9.7.3.tgz", @@ -2755,13 +2369,54 @@ } }, "node_modules/@swc/helpers": { - "version": "0.4.14", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.4.14.tgz", - "integrity": "sha512-4C7nX/dvpzB7za4Ql9K81xK3HPxCpHMgwTZVyf+9JQ6VUbn9jjZVN7/Nkdz/Ugzs2CSjqnL/UPXroiVBVHUWUw==", + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.3.tgz", + "integrity": "sha512-FaruWX6KdudYloq1AHD/4nU+UsMTdNE8CKyrseXWEcgjDAbvkwJg2QGPAnfIJLIWsjZOSPLOAykK6fuYp4vp4A==", "dependencies": { "tslib": "^2.4.0" } }, + "node_modules/@types/babel__core": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.2.tgz", + "integrity": "sha512-pNpr1T1xLUc2l3xJKuPtsEky3ybxN3m4fJkknfIpTCTfIZCDW57oAg+EfCgIIp2rvCe0Wn++/FfodDS4YXxBwA==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.5", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.5.tgz", + "integrity": "sha512-h9yIuWbJKdOPLJTbmSpPzkF67e659PbQDba7ifWm5BJ8xTv+sDmS7rFmywkWOvXedGTivCdeGSIIX8WLcRTz8w==", + "dev": true, + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.2.tgz", + "integrity": "sha512-/AVzPICMhMOMYoSx9MoKpGDKdBRsIXMNByh1PXSZoa+v6ZoLa8xxtsT/uLQ/NJm0XVAWl/BvId4MlDeXJaeIZQ==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.2.tgz", + "integrity": "sha512-ojlGK1Hsfce93J0+kn3H5R73elidKUaZonirN33GSmgTUMpzI/MIFfSpF3haANe3G1bEBS9/9/QEqwTzwqFsKw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.20.7" + } + }, "node_modules/@types/dompurify": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@types/dompurify/-/dompurify-3.0.3.tgz", @@ -2782,9 +2437,9 @@ "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==" }, "node_modules/@types/react": { - "version": "18.2.14", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.14.tgz", - "integrity": "sha512-A0zjq+QN/O0Kpe30hA1GidzyFjatVvrpIvWLxD+xv67Vt91TWWgco9IvrJBkeyHm1trGaFS/FSGqPlhyeZRm0g==", + "version": "18.2.28", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.28.tgz", + "integrity": "sha512-ad4aa/RaaJS3hyGz0BGegdnSRXQBkd1CCYDCdNjBPg90UUpLgo+WlJqb9fMYUxtehmzF3PJaTWqRZjko6BRzBg==", "dependencies": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -2792,9 +2447,9 @@ } }, "node_modules/@types/react-dom": { - "version": "18.2.8", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.8.tgz", - "integrity": "sha512-bAIvO5lN/U8sPGvs1Xm61rlRHHaq5rp5N3kp9C+NJ/Q41P8iqjkXSu0+/qu8POsjH9pNWb0OYabFez7taP7omw==", + "version": "18.2.13", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.13.tgz", + "integrity": "sha512-eJIUv7rPP+EC45uNYp/ThhSpE16k22VJUknt5OLoH9tbXoi8bMhwLf5xRuWMywamNbWzhrSmU7IBJfPup1+3fw==", "dependencies": { "@types/react": "*" } @@ -2811,14 +2466,15 @@ "dev": true }, "node_modules/@vitejs/plugin-react": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.0.2.tgz", - "integrity": "sha512-zbnVp3Esfg33zDaoLrjxG+p/dPiOtpvJA+1oOEQwSxMMTRL9zi1eghIcd2WtLjkcKnPsa3S15LzS/OzDn2BOCA==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.1.0.tgz", + "integrity": "sha512-rM0SqazU9iqPUraQ2JlIvReeaxOoRj6n+PzB1C0cBzIbd8qP336nC39/R9yPi3wVcah7E7j/kdU1uCUqMEU4OQ==", "dev": true, "dependencies": { - "@babel/core": "^7.22.5", + "@babel/core": "^7.22.20", "@babel/plugin-transform-react-jsx-self": "^7.22.5", "@babel/plugin-transform-react-jsx-source": "^7.22.5", + "@types/babel__core": "^7.20.2", "react-refresh": "^0.14.0" }, "engines": { @@ -2841,9 +2497,9 @@ } }, "node_modules/browserslist": { - "version": "4.21.9", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.9.tgz", - "integrity": "sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==", + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.1.tgz", + "integrity": "sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==", "dev": true, "funding": [ { @@ -2860,10 +2516,10 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001503", - "electron-to-chromium": "^1.4.431", - "node-releases": "^2.0.12", - "update-browserslist-db": "^1.0.11" + "caniuse-lite": "^1.0.30001541", + "electron-to-chromium": "^1.4.535", + "node-releases": "^2.0.13", + "update-browserslist-db": "^1.0.13" }, "bin": { "browserslist": "cli.js" @@ -2873,9 +2529,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001513", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001513.tgz", - "integrity": "sha512-pnjGJo7SOOjAGytZZ203Em95MRM8Cr6jhCXNF/FAXTpCTRTECnqQWLpiTRqrFtdYcth8hf4WECUpkezuYsMVww==", + "version": "1.0.30001547", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001547.tgz", + "integrity": "sha512-W7CrtIModMAxobGhz8iXmDfuJiiKg1WADMO/9x7/CLNin5cpSbuBjooyoIUVB5eyCc36QuTVlkVa1iB2S5+/eA==", "dev": true, "funding": [ { @@ -2922,9 +2578,9 @@ "dev": true }, "node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", "dev": true }, "node_modules/csstype": { @@ -2964,9 +2620,9 @@ "integrity": "sha512-ilkD8YEnnGh1zJ240uJsW7AzE+2qpbOUYjacomn3AvJ6J4JhKGSZ2nh4wUIXPZrEPppaCLx5jFe8T89Rk8tQ7w==" }, "node_modules/electron-to-chromium": { - "version": "1.4.454", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.454.tgz", - "integrity": "sha512-pmf1rbAStw8UEQ0sr2cdJtWl48ZMuPD9Sto8HVQOq9vx9j2WgDEN6lYoaqFvqEHYOmGA9oRGn7LqWI9ta0YugQ==", + "version": "1.4.549", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.549.tgz", + "integrity": "sha512-gpXfJslSi4hYDkA0mTLEpYKRv9siAgSUgZ+UWyk+J5Cttpd1ThCVwdclzIwQSclz3hYn049+M2fgrP1WpvF8xg==", "dev": true }, "node_modules/esbuild": { @@ -3126,9 +2782,9 @@ } }, "node_modules/keyborg": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/keyborg/-/keyborg-2.0.0.tgz", - "integrity": "sha512-RWY8nWrzRkwTQLaKyDtbTu5SOb5L4B20UzAsBHlQDFZqVY/+Mid0bQ7MVTC8vbOTrWY2xkkzj8gZF9Ua7re4xA==" + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/keyborg/-/keyborg-2.1.0.tgz", + "integrity": "sha512-0+v3/GIYG6gClwBOXrHet31n1UJW49xbKgVPUu6we41aq9tAmMosVXEdctZxsQdebyxtrcxVTkvHjBD1XPOHwg==" }, "node_modules/loose-envify": { "version": "1.4.0", @@ -3268,6 +2924,11 @@ "react-is": "^16.13.1" } }, + "node_modules/prop-types/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, "node_modules/react": { "version": "18.2.0", "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", @@ -3300,9 +2961,9 @@ } }, "node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" }, "node_modules/react-refresh": { "version": "0.14.0", @@ -3380,9 +3041,9 @@ } }, "node_modules/rollup": { - "version": "3.26.2", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.26.2.tgz", - "integrity": "sha512-6umBIGVz93er97pMgQO08LuH3m6PUb3jlDUUGFsNJB6VgTCUaDFpupf5JfU30529m/UKOgmiX+uY6Sx8cOYpLA==", + "version": "3.29.4", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.4.tgz", + "integrity": "sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==", "bin": { "rollup": "dist/bin/rollup" }, @@ -3406,12 +3067,20 @@ "version": "0.20.2", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", - "peer": true, "dependencies": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1" } }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/source-map-js": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", @@ -3450,9 +3119,9 @@ } }, "node_modules/tabster": { - "version": "4.7.3", - "resolved": "https://registry.npmjs.org/tabster/-/tabster-4.7.3.tgz", - "integrity": "sha512-z34vfwtYefjk/rAnhf/2sd1EuYbefF6jR4cqUAx5bjwXwWsMaM7139/yUXreaiRxbySQqqL59pQaodzA8uPYBA==", + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/tabster/-/tabster-4.8.0.tgz", + "integrity": "sha512-R1ib3x0Rd+iepvrzXdEkd2Qa2O5dV7jaZtR4BhkhE9sBYMolbVc6EgHGTHBQvdXQBdU8I2MXCMn0c6jarJb+GA==", "dependencies": { "keyborg": "^2.0.0", "tslib": "^2.3.1" @@ -3473,9 +3142,9 @@ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==" }, "node_modules/typescript": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", - "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", + "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -3485,9 +3154,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", - "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", "dev": true, "funding": [ { @@ -3526,14 +3195,14 @@ } }, "node_modules/vite": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/vite/-/vite-4.4.2.tgz", - "integrity": "sha512-zUcsJN+UvdSyHhYa277UHhiJ3iq4hUBwHavOpsNUGsTgjBeoBlK8eDt+iT09pBq0h9/knhG/SPrZiM7cGmg7NA==", + "version": "4.4.11", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.4.11.tgz", + "integrity": "sha512-ksNZJlkcU9b0lBwAGZGGaZHCMqHsc8OpgtoYhsQ4/I2v5cnpmmmqe5pM4nv/4Hn6G/2GhTdj0DhZh2e+Er1q5A==", "dev": true, "dependencies": { "esbuild": "^0.18.10", - "postcss": "^8.4.24", - "rollup": "^3.25.2" + "postcss": "^8.4.27", + "rollup": "^3.27.1" }, "bin": { "vite": "bin/vite.js" @@ -3621,82 +3290,83 @@ } }, "@babel/code-frame": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.5.tgz", - "integrity": "sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==", + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", + "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", "dev": true, "requires": { - "@babel/highlight": "^7.22.5" + "@babel/highlight": "^7.22.13", + "chalk": "^2.4.2" } }, "@babel/compat-data": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.6.tgz", - "integrity": "sha512-29tfsWTq2Ftu7MXmimyC0C5FDZv5DYxOZkh3XD3+QW4V/BYuv/LyEsjj3c0hqedEaDt6DBfDvexMKU8YevdqFg==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.20.tgz", + "integrity": "sha512-BQYjKbpXjoXwFW5jGqiizJQQT/aC7pFm9Ok1OWssonuguICi264lbgMzRp2ZMmRSlfkX6DsWDDcsrctK8Rwfiw==", "dev": true }, "@babel/core": { - "version": "7.22.8", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.8.tgz", - "integrity": "sha512-75+KxFB4CZqYRXjx4NlR4J7yGvKumBuZTmV4NV6v09dVXXkuYVYLT68N6HCzLvfJ+fWCxQsntNzKwwIXL4bHnw==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.0.tgz", + "integrity": "sha512-97z/ju/Jy1rZmDxybphrBuI+jtJjFVoz7Mr9yUQVVVi+DNZE333uFQeMOqcCIy1x3WYBIbWftUSLmbNXNT7qFQ==", "dev": true, "requires": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.22.5", - "@babel/generator": "^7.22.7", - "@babel/helper-compilation-targets": "^7.22.6", - "@babel/helper-module-transforms": "^7.22.5", - "@babel/helpers": "^7.22.6", - "@babel/parser": "^7.22.7", - "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.8", - "@babel/types": "^7.22.5", - "@nicolo-ribaudo/semver-v6": "^6.3.3", - "convert-source-map": "^1.7.0", + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.0", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-module-transforms": "^7.23.0", + "@babel/helpers": "^7.23.0", + "@babel/parser": "^7.23.0", + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.0", + "@babel/types": "^7.23.0", + "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", - "json5": "^2.2.2" + "json5": "^2.2.3", + "semver": "^6.3.1" } }, "@babel/generator": { - "version": "7.22.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.7.tgz", - "integrity": "sha512-p+jPjMG+SI8yvIaxGgeW24u7q9+5+TGpZh8/CuB7RhBKd7RCy8FayNEFNNKrNK/eUcY/4ExQqLmyrvBXKsIcwQ==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", + "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", "dev": true, "requires": { - "@babel/types": "^7.22.5", + "@babel/types": "^7.23.0", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" } }, "@babel/helper-compilation-targets": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.6.tgz", - "integrity": "sha512-534sYEqWD9VfUm3IPn2SLcH4Q3P86XL+QvqdC7ZsFrzyyPF3T4XGiVghF6PTYNdWg6pXuoqXxNQAhbYeEInTzA==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz", + "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==", "dev": true, "requires": { - "@babel/compat-data": "^7.22.6", - "@babel/helper-validator-option": "^7.22.5", - "@nicolo-ribaudo/semver-v6": "^6.3.3", + "@babel/compat-data": "^7.22.9", + "@babel/helper-validator-option": "^7.22.15", "browserslist": "^4.21.9", - "lru-cache": "^5.1.1" + "lru-cache": "^5.1.1", + "semver": "^6.3.1" } }, "@babel/helper-environment-visitor": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz", - "integrity": "sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", "dev": true }, "@babel/helper-function-name": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", - "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", "dev": true, "requires": { - "@babel/template": "^7.22.5", - "@babel/types": "^7.22.5" + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" } }, "@babel/helper-hoist-variables": { @@ -3709,28 +3379,25 @@ } }, "@babel/helper-module-imports": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz", - "integrity": "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", + "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", "dev": true, "requires": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.22.15" } }, "@babel/helper-module-transforms": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.5.tgz", - "integrity": "sha512-+hGKDt/Ze8GFExiVHno/2dvG5IdstpzCq0y4Qc9OJ25D4q3pKfiIP/4Vp3/JvhDkLKsDK2api3q3fpIgiIF5bw==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.0.tgz", + "integrity": "sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw==", "dev": true, "requires": { - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-module-imports": "^7.22.15", "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.5", - "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.5", - "@babel/types": "^7.22.5" + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.20" } }, "@babel/helper-plugin-utils": { @@ -3764,43 +3431,43 @@ "dev": true }, "@babel/helper-validator-identifier": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", - "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", "dev": true }, "@babel/helper-validator-option": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz", - "integrity": "sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz", + "integrity": "sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==", "dev": true }, "@babel/helpers": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.6.tgz", - "integrity": "sha512-YjDs6y/fVOYFV8hAf1rxd1QvR9wJe1pDBZ2AREKq/SDayfPzgk0PBnVuTCE5X1acEpMMNOVUqoe+OwiZGJ+OaA==", + "version": "7.23.1", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.1.tgz", + "integrity": "sha512-chNpneuK18yW5Oxsr+t553UZzzAs3aZnFm4bxhebsNTeshrC95yA7l5yl7GBAG+JG1rF0F7zzD2EixK9mWSDoA==", "dev": true, "requires": { - "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.6", - "@babel/types": "^7.22.5" + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.0", + "@babel/types": "^7.23.0" } }, "@babel/highlight": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.5.tgz", - "integrity": "sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", + "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.22.5", - "chalk": "^2.0.0", + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", "js-tokens": "^4.0.0" } }, "@babel/parser": { - "version": "7.22.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.7.tgz", - "integrity": "sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", + "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", "dev": true }, "@babel/plugin-transform-react-jsx-self": { @@ -3830,42 +3497,42 @@ } }, "@babel/template": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz", - "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", "dev": true, "requires": { - "@babel/code-frame": "^7.22.5", - "@babel/parser": "^7.22.5", - "@babel/types": "^7.22.5" + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" } }, "@babel/traverse": { - "version": "7.22.8", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.8.tgz", - "integrity": "sha512-y6LPR+wpM2I3qJrsheCTwhIinzkETbplIgPBbwvqPKc+uljeA5gP+3nP8irdYt1mjQaDnlIcG+dw8OjAco4GXw==", + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", + "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", "dev": true, "requires": { - "@babel/code-frame": "^7.22.5", - "@babel/generator": "^7.22.7", - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-function-name": "^7.22.5", + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.0", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.22.7", - "@babel/types": "^7.22.5", + "@babel/parser": "^7.23.0", + "@babel/types": "^7.23.0", "debug": "^4.1.0", "globals": "^11.1.0" } }, "@babel/types": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.5.tgz", - "integrity": "sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", + "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", "dev": true, "requires": { "@babel/helper-string-parser": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20", "to-fast-properties": "^2.0.0" } }, @@ -4069,25 +3736,25 @@ } }, "@fluentui/font-icons-mdl2": { - "version": "8.5.23", - "resolved": "https://registry.npmjs.org/@fluentui/font-icons-mdl2/-/font-icons-mdl2-8.5.23.tgz", - "integrity": "sha512-jZjUtfQm9/84jX34zhwwsoZME86xXXgKAgBYuMvRStKzXGdZcd7YSOlmuT8lbISmtFL/SWwUGOEal1nLCUNeNA==", + "version": "8.5.25", + "resolved": "https://registry.npmjs.org/@fluentui/font-icons-mdl2/-/font-icons-mdl2-8.5.25.tgz", + "integrity": "sha512-L14GBWeRmeVSO1hjollOye+Xl4ULR9yvltTJNkwoNFfrks0nf+HTAOje5QU5+bPCzjR0mCmp/VCArsTtDwL0Zw==", "requires": { "@fluentui/set-version": "^8.2.11", - "@fluentui/style-utilities": "^8.9.16", - "@fluentui/utilities": "^8.13.18", + "@fluentui/style-utilities": "^8.9.18", + "@fluentui/utilities": "^8.13.19", "tslib": "^2.1.0" } }, "@fluentui/foundation-legacy": { - "version": "8.2.43", - "resolved": "https://registry.npmjs.org/@fluentui/foundation-legacy/-/foundation-legacy-8.2.43.tgz", - "integrity": "sha512-rXr71KxNcWDH2LmTsFZbP75p8HssLlVLaFAqEdLE+sKf/LNKmqkDVTNhDbHZxzxy0QnguI4aNHcyGhMZUH3MPA==", + "version": "8.2.45", + "resolved": "https://registry.npmjs.org/@fluentui/foundation-legacy/-/foundation-legacy-8.2.45.tgz", + "integrity": "sha512-KVgWNEFIwEUEyoX2x1GBvczPPsi9/st+b2BhcwGR1W7+za7mKe+bYS5nkM2jA7BHV+E9V0rVPNw+jJil9jjT8Q==", "requires": { "@fluentui/merge-styles": "^8.5.12", "@fluentui/set-version": "^8.2.11", - "@fluentui/style-utilities": "^8.9.16", - "@fluentui/utilities": "^8.13.18", + "@fluentui/style-utilities": "^8.9.18", + "@fluentui/utilities": "^8.13.19", "tslib": "^2.1.0" } }, @@ -4105,16 +3772,6 @@ "integrity": "sha512-WvJrCKvt8Om04S+IwypeJ3FG2tP2TSNFMSMYouDdeKspKD1EmQyQybs7YA9+Fh98X5ERF14zBCurgtNjpDH6gQ==", "requires": { "@swc/helpers": "^0.5.1" - }, - "dependencies": { - "@swc/helpers": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", - "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", - "requires": { - "tslib": "^2.4.0" - } - } } }, "@fluentui/merge-styles": { @@ -4132,1187 +3789,784 @@ "integrity": "sha512-+SzSmEr5+/n7c1vmqAb2Ykk3Z5Dh2yqIl/dDbQjuiSaQzZHjr/b59A06x6t/JXKWFH8g4yG6A2LpSeLIbRBP9Q==", "requires": { "@swc/helpers": "^0.5.1" - }, - "dependencies": { - "@swc/helpers": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", - "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", - "requires": { - "tslib": "^2.4.0" - } - } } }, "@fluentui/react": { - "version": "8.110.7", - "resolved": "https://registry.npmjs.org/@fluentui/react/-/react-8.110.7.tgz", - "integrity": "sha512-3sn4HZL10jghiYFF+Ouc7pNDJ5pR2ueU6ZY1IdmVFgYXTJJ/IwQhVc37mXVf8VoUM7hF4vRcGE4z+loNTpTX0w==", + "version": "8.112.3", + "resolved": "https://registry.npmjs.org/@fluentui/react/-/react-8.112.3.tgz", + "integrity": "sha512-2yDtzw8AvSkSO1B//Lj+E6Wy0RrWV0ai2hXN3q0SRkFocudvek5riHHK89OJAcKaAxqe/VUg7OJQ9P+Bqd77fA==", "requires": { "@fluentui/date-time-utilities": "^8.5.13", - "@fluentui/font-icons-mdl2": "^8.5.23", - "@fluentui/foundation-legacy": "^8.2.43", + "@fluentui/font-icons-mdl2": "^8.5.25", + "@fluentui/foundation-legacy": "^8.2.45", "@fluentui/merge-styles": "^8.5.12", - "@fluentui/react-focus": "^8.8.30", - "@fluentui/react-hooks": "^8.6.29", - "@fluentui/react-portal-compat-context": "^9.0.6", + "@fluentui/react-focus": "^8.8.32", + "@fluentui/react-hooks": "^8.6.30", + "@fluentui/react-portal-compat-context": "^9.0.9", "@fluentui/react-window-provider": "^2.2.15", "@fluentui/set-version": "^8.2.11", - "@fluentui/style-utilities": "^8.9.16", - "@fluentui/theme": "^2.6.34", - "@fluentui/utilities": "^8.13.18", + "@fluentui/style-utilities": "^8.9.18", + "@fluentui/theme": "^2.6.36", + "@fluentui/utilities": "^8.13.19", "@microsoft/load-themed-styles": "^1.10.26", "tslib": "^2.1.0" } }, "@fluentui/react-accordion": { - "version": "9.3.17", - "resolved": "https://registry.npmjs.org/@fluentui/react-accordion/-/react-accordion-9.3.17.tgz", - "integrity": "sha512-/MxcATCvI9ktQSoNOidXF6ISCFeSyeKCBMJaxFyzzNCKdT0LshRXBOf003JsxJv4N1v4etCS6f1aTUMVGWXUnA==", + "version": "9.3.22", + "resolved": "https://registry.npmjs.org/@fluentui/react-accordion/-/react-accordion-9.3.22.tgz", + "integrity": "sha512-AaTPJjCQgA1x8VzgrJ/8AijQ+lkKHoaYoULdFrLvzL0RNw8w0cBUcL91XWY3ymCqfzmkscUBXYRLS9A0ixV47w==", "requires": { - "@fluentui/react-aria": "^9.3.38", - "@fluentui/react-context-selector": "^9.1.36", + "@fluentui/react-aria": "^9.3.42", + "@fluentui/react-context-selector": "^9.1.40", "@fluentui/react-icons": "^2.0.217", - "@fluentui/react-jsx-runtime": "^9.0.12", - "@fluentui/react-shared-contexts": "^9.9.2", - "@fluentui/react-tabster": "^9.13.2", + "@fluentui/react-jsx-runtime": "^9.0.17", + "@fluentui/react-shared-contexts": "^9.10.0", + "@fluentui/react-tabster": "^9.13.6", "@fluentui/react-theme": "^9.1.14", - "@fluentui/react-utilities": "^9.13.5", + "@fluentui/react-utilities": "^9.15.0", "@griffel/react": "^1.5.14", "@swc/helpers": "^0.5.1" - }, - "dependencies": { - "@swc/helpers": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", - "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", - "requires": { - "tslib": "^2.4.0" - } - } } }, "@fluentui/react-alert": { - "version": "9.0.0-beta.81", - "resolved": "https://registry.npmjs.org/@fluentui/react-alert/-/react-alert-9.0.0-beta.81.tgz", - "integrity": "sha512-8VnaE+M7cqdRVfGshDcZRwJ2wBpAbbypkwM5/pZRnq4rcmZflWWgC5wk58mBwtj8EufJljz80+PFOXb4HONFhw==", + "version": "9.0.0-beta.86", + "resolved": "https://registry.npmjs.org/@fluentui/react-alert/-/react-alert-9.0.0-beta.86.tgz", + "integrity": "sha512-1yz62O6rBmUKHvxfEbYTba9vCyk/MDsn86nDPLiEYVAC94PkiAazLd9QT5DL8uqlxi9ygXHEJlMLcmCxXyGyqw==", "requires": { - "@fluentui/react-avatar": "^9.5.35", - "@fluentui/react-button": "^9.3.44", + "@fluentui/react-avatar": "^9.5.40", + "@fluentui/react-button": "^9.3.49", "@fluentui/react-icons": "^2.0.217", - "@fluentui/react-jsx-runtime": "^9.0.12", - "@fluentui/react-tabster": "^9.13.2", + "@fluentui/react-jsx-runtime": "^9.0.17", + "@fluentui/react-tabster": "^9.13.6", "@fluentui/react-theme": "^9.1.14", - "@fluentui/react-utilities": "^9.13.5", + "@fluentui/react-utilities": "^9.15.0", "@griffel/react": "^1.5.14", "@swc/helpers": "^0.5.1" - }, - "dependencies": { - "@swc/helpers": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", - "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", - "requires": { - "tslib": "^2.4.0" - } - } } }, "@fluentui/react-aria": { - "version": "9.3.38", - "resolved": "https://registry.npmjs.org/@fluentui/react-aria/-/react-aria-9.3.38.tgz", - "integrity": "sha512-ZdK5hI08hs4BWdGVjxWibQb4hLamAD6q6VsXXL264BOsK5oY0rQLsUx186KAOgY3yI26YHU6YrqwcxEQWPs30Q==", + "version": "9.3.42", + "resolved": "https://registry.npmjs.org/@fluentui/react-aria/-/react-aria-9.3.42.tgz", + "integrity": "sha512-RZArlsmkCbzTIM1B20QmUuERrxijB8erxC0nXdwcqViXDOJB3/Sgg47mCrm1zwDaD2efp3Tjf8QwIKNmONd5OQ==", "requires": { "@fluentui/keyboard-keys": "^9.0.6", - "@fluentui/react-utilities": "^9.13.5", + "@fluentui/react-utilities": "^9.15.0", "@swc/helpers": "^0.5.1" - }, - "dependencies": { - "@swc/helpers": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", - "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", - "requires": { - "tslib": "^2.4.0" - } - } } }, "@fluentui/react-avatar": { - "version": "9.5.35", - "resolved": "https://registry.npmjs.org/@fluentui/react-avatar/-/react-avatar-9.5.35.tgz", - "integrity": "sha512-NTLotNpZA4qM0TKI8ELAkU69DebdZ+VGY0yzuK7sVMMMvH7ofjkOAHGfPhvSt4O6lAi1E96Hbt1/boHI/jH5sw==", + "version": "9.5.40", + "resolved": "https://registry.npmjs.org/@fluentui/react-avatar/-/react-avatar-9.5.40.tgz", + "integrity": "sha512-1VD/YaHXr3i5IxWJWreF1ppk/50abiYuBXCrS4jt/P9bGKWTbiItdMrm1FqzH34gofeqbufbIJxWuwptqrrGwQ==", "requires": { - "@fluentui/react-badge": "^9.2.4", - "@fluentui/react-context-selector": "^9.1.36", + "@fluentui/react-badge": "^9.2.9", + "@fluentui/react-context-selector": "^9.1.40", "@fluentui/react-icons": "^2.0.217", - "@fluentui/react-jsx-runtime": "^9.0.12", - "@fluentui/react-popover": "^9.8.10", - "@fluentui/react-shared-contexts": "^9.9.2", - "@fluentui/react-tabster": "^9.13.2", + "@fluentui/react-jsx-runtime": "^9.0.17", + "@fluentui/react-popover": "^9.8.15", + "@fluentui/react-shared-contexts": "^9.10.0", + "@fluentui/react-tabster": "^9.13.6", "@fluentui/react-theme": "^9.1.14", - "@fluentui/react-tooltip": "^9.3.11", - "@fluentui/react-utilities": "^9.13.5", + "@fluentui/react-tooltip": "^9.3.16", + "@fluentui/react-utilities": "^9.15.0", "@griffel/react": "^1.5.14", "@swc/helpers": "^0.5.1" - }, - "dependencies": { - "@swc/helpers": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", - "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", - "requires": { - "tslib": "^2.4.0" - } - } } }, "@fluentui/react-badge": { - "version": "9.2.4", - "resolved": "https://registry.npmjs.org/@fluentui/react-badge/-/react-badge-9.2.4.tgz", - "integrity": "sha512-TR9B1EQnizeXtITZepVSeniTEoas8Hfhh70F+hjgH66o7g781GihO33D6ZtoM7OSDDCMF0L1zzDzzUzwRtVc6w==", + "version": "9.2.9", + "resolved": "https://registry.npmjs.org/@fluentui/react-badge/-/react-badge-9.2.9.tgz", + "integrity": "sha512-epgNV6M48M4ZhZB02Qybk8kmsP0Vxl9x4wuK/MAWj3p0ZUN48DQp77NwWBqfF13AH8i2zx2/5h5m7/p0USnY3w==", "requires": { "@fluentui/react-icons": "^2.0.217", - "@fluentui/react-jsx-runtime": "^9.0.12", - "@fluentui/react-shared-contexts": "^9.9.2", + "@fluentui/react-jsx-runtime": "^9.0.17", + "@fluentui/react-shared-contexts": "^9.10.0", "@fluentui/react-theme": "^9.1.14", - "@fluentui/react-utilities": "^9.13.5", + "@fluentui/react-utilities": "^9.15.0", "@griffel/react": "^1.5.14", "@swc/helpers": "^0.5.1" - }, - "dependencies": { - "@swc/helpers": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", - "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", - "requires": { - "tslib": "^2.4.0" - } - } } }, "@fluentui/react-button": { - "version": "9.3.44", - "resolved": "https://registry.npmjs.org/@fluentui/react-button/-/react-button-9.3.44.tgz", - "integrity": "sha512-s5tEb+v9m7+EXd3DNFM5xeNXniSkmec09DyDEvcgMG6p79qLV5lkKRC17Ih0B1P5v74kSzoSSTzUqy0rFVT+rw==", + "version": "9.3.49", + "resolved": "https://registry.npmjs.org/@fluentui/react-button/-/react-button-9.3.49.tgz", + "integrity": "sha512-hWI7fVG039b1AsMcgRrHrd9rGdjQoBzzEfkeko9JRtvOmyrsyoczLbj/uT1NVfkO3RHAozybPwt+BzJ45FSWqA==", "requires": { "@fluentui/keyboard-keys": "^9.0.6", - "@fluentui/react-aria": "^9.3.38", + "@fluentui/react-aria": "^9.3.42", "@fluentui/react-icons": "^2.0.217", - "@fluentui/react-jsx-runtime": "^9.0.12", - "@fluentui/react-shared-contexts": "^9.9.2", - "@fluentui/react-tabster": "^9.13.2", + "@fluentui/react-jsx-runtime": "^9.0.17", + "@fluentui/react-shared-contexts": "^9.10.0", + "@fluentui/react-tabster": "^9.13.6", "@fluentui/react-theme": "^9.1.14", - "@fluentui/react-utilities": "^9.13.5", + "@fluentui/react-utilities": "^9.15.0", "@griffel/react": "^1.5.14", "@swc/helpers": "^0.5.1" - }, - "dependencies": { - "@swc/helpers": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", - "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", - "requires": { - "tslib": "^2.4.0" - } - } } }, "@fluentui/react-card": { - "version": "9.0.43", - "resolved": "https://registry.npmjs.org/@fluentui/react-card/-/react-card-9.0.43.tgz", - "integrity": "sha512-Vif0giU5kTMX6dd34+xBsAgwtGoliZz5T/HQSFo7OaGW3lOx8g+ccqFRJY2DV8+eNLayc3RSdY7LR4Tif2kr0A==", + "version": "9.0.48", + "resolved": "https://registry.npmjs.org/@fluentui/react-card/-/react-card-9.0.48.tgz", + "integrity": "sha512-tjEjoN8ICIuI5i6RTe+40aRC5JAlvQgX2O7FzcHTF+OcA+Fo+1haLRTlDOvc7b6hcaapCHSP3gD5G7kNHucFvQ==", "requires": { "@fluentui/keyboard-keys": "^9.0.6", - "@fluentui/react-jsx-runtime": "^9.0.12", - "@fluentui/react-tabster": "^9.13.2", + "@fluentui/react-jsx-runtime": "^9.0.17", + "@fluentui/react-tabster": "^9.13.6", "@fluentui/react-theme": "^9.1.14", - "@fluentui/react-utilities": "^9.13.5", + "@fluentui/react-utilities": "^9.15.0", "@griffel/react": "^1.5.14", "@swc/helpers": "^0.5.1" - }, - "dependencies": { - "@swc/helpers": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", - "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", - "requires": { - "tslib": "^2.4.0" - } - } } }, "@fluentui/react-checkbox": { - "version": "9.1.45", - "resolved": "https://registry.npmjs.org/@fluentui/react-checkbox/-/react-checkbox-9.1.45.tgz", - "integrity": "sha512-wGqCnsBqko2JV+YnuKxTog9fz3gTjwXCiTEvXPvUEAbzd+j6MhHUA7zCSp7WOc2mBQQEMtSDovnwMDVGnQ/kLw==", + "version": "9.1.50", + "resolved": "https://registry.npmjs.org/@fluentui/react-checkbox/-/react-checkbox-9.1.50.tgz", + "integrity": "sha512-UmBfpys1AR3ToTnzArKGzwiwker/2ZuP8JE3vKVpOjtk3bFj8TbuLt+JsHMXVsPSk3zHkH32McwBG81itytLQg==", "requires": { - "@fluentui/react-field": "^9.1.32", + "@fluentui/react-field": "^9.1.37", "@fluentui/react-icons": "^2.0.217", - "@fluentui/react-jsx-runtime": "^9.0.12", - "@fluentui/react-label": "^9.1.40", - "@fluentui/react-shared-contexts": "^9.9.2", - "@fluentui/react-tabster": "^9.13.2", + "@fluentui/react-jsx-runtime": "^9.0.17", + "@fluentui/react-label": "^9.1.45", + "@fluentui/react-shared-contexts": "^9.10.0", + "@fluentui/react-tabster": "^9.13.6", "@fluentui/react-theme": "^9.1.14", - "@fluentui/react-utilities": "^9.13.5", + "@fluentui/react-utilities": "^9.15.0", "@griffel/react": "^1.5.14", "@swc/helpers": "^0.5.1" - }, - "dependencies": { - "@swc/helpers": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", - "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", - "requires": { - "tslib": "^2.4.0" - } - } } }, "@fluentui/react-combobox": { - "version": "9.5.19", - "resolved": "https://registry.npmjs.org/@fluentui/react-combobox/-/react-combobox-9.5.19.tgz", - "integrity": "sha512-NiB0Bs1SMZ9vhVY7Xl3GRZuM3jZSPcBiFXAqqBnH1AJkw46oWL35+1jRA8pvBGq3udjPcdUPa3NpANclY3Fvcg==", + "version": "9.5.24", + "resolved": "https://registry.npmjs.org/@fluentui/react-combobox/-/react-combobox-9.5.24.tgz", + "integrity": "sha512-D6fDZKMMa3/kQsKBGSIgUlm/EBdEuPFutPHPih0dQb1ObqyAGQUqBe9oZEvSxTVVFXpueGD/GZRkqx3n2fet/Q==", "requires": { "@fluentui/keyboard-keys": "^9.0.6", - "@fluentui/react-context-selector": "^9.1.36", - "@fluentui/react-field": "^9.1.32", + "@fluentui/react-context-selector": "^9.1.40", + "@fluentui/react-field": "^9.1.37", "@fluentui/react-icons": "^2.0.217", - "@fluentui/react-jsx-runtime": "^9.0.12", - "@fluentui/react-portal": "^9.3.19", - "@fluentui/react-positioning": "^9.9.16", - "@fluentui/react-shared-contexts": "^9.9.2", + "@fluentui/react-jsx-runtime": "^9.0.17", + "@fluentui/react-portal": "^9.3.23", + "@fluentui/react-positioning": "^9.9.20", + "@fluentui/react-shared-contexts": "^9.10.0", "@fluentui/react-theme": "^9.1.14", - "@fluentui/react-utilities": "^9.13.5", + "@fluentui/react-utilities": "^9.15.0", "@griffel/react": "^1.5.14", "@swc/helpers": "^0.5.1" - }, - "dependencies": { - "@swc/helpers": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", - "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", - "requires": { - "tslib": "^2.4.0" - } - } } }, "@fluentui/react-components": { - "version": "9.33.0", - "resolved": "https://registry.npmjs.org/@fluentui/react-components/-/react-components-9.33.0.tgz", - "integrity": "sha512-BFm3yNmBreti0QJAAJmvRep1qjiLO8eX/bz2VLgxXK1Ga+S0BOl6e021Lvg1+hg2jyYFPn732RE6sD5qTsKfMQ==", - "requires": { - "@fluentui/react-accordion": "^9.3.17", - "@fluentui/react-alert": "9.0.0-beta.81", - "@fluentui/react-avatar": "^9.5.35", - "@fluentui/react-badge": "^9.2.4", - "@fluentui/react-button": "^9.3.44", - "@fluentui/react-card": "^9.0.43", - "@fluentui/react-checkbox": "^9.1.45", - "@fluentui/react-combobox": "^9.5.19", - "@fluentui/react-dialog": "^9.7.4", - "@fluentui/react-divider": "^9.2.40", - "@fluentui/react-drawer": "9.0.0-beta.30", - "@fluentui/react-field": "^9.1.32", - "@fluentui/react-image": "^9.1.37", - "@fluentui/react-infobutton": "9.0.0-beta.65", - "@fluentui/react-input": "^9.4.42", - "@fluentui/react-label": "^9.1.40", - "@fluentui/react-link": "^9.1.23", - "@fluentui/react-menu": "^9.12.21", - "@fluentui/react-overflow": "^9.0.35", - "@fluentui/react-persona": "^9.2.45", - "@fluentui/react-popover": "^9.8.10", - "@fluentui/react-portal": "^9.3.19", - "@fluentui/react-positioning": "^9.9.16", - "@fluentui/react-progress": "^9.1.42", - "@fluentui/react-provider": "^9.10.2", - "@fluentui/react-radio": "^9.1.45", - "@fluentui/react-select": "^9.1.42", - "@fluentui/react-shared-contexts": "^9.9.2", - "@fluentui/react-skeleton": "^9.0.30", - "@fluentui/react-slider": "^9.1.45", - "@fluentui/react-spinbutton": "^9.2.42", - "@fluentui/react-spinner": "^9.3.20", - "@fluentui/react-switch": "^9.1.45", - "@fluentui/react-table": "^9.10.0", - "@fluentui/react-tabs": "^9.3.46", - "@fluentui/react-tabster": "^9.13.2", - "@fluentui/react-text": "^9.3.37", - "@fluentui/react-textarea": "^9.3.42", + "version": "9.35.0", + "resolved": "https://registry.npmjs.org/@fluentui/react-components/-/react-components-9.35.0.tgz", + "integrity": "sha512-nr3r7oAfftBlLbXxjNfQDb4qqvJ4MoyPxUpqj/sordgGtdeUGRg7CWIe3ZhV+z0nVvq02Qa50DqfNRkfGmRuhw==", + "requires": { + "@fluentui/react-accordion": "^9.3.22", + "@fluentui/react-alert": "9.0.0-beta.86", + "@fluentui/react-avatar": "^9.5.40", + "@fluentui/react-badge": "^9.2.9", + "@fluentui/react-button": "^9.3.49", + "@fluentui/react-card": "^9.0.48", + "@fluentui/react-checkbox": "^9.1.50", + "@fluentui/react-combobox": "^9.5.24", + "@fluentui/react-dialog": "^9.7.9", + "@fluentui/react-divider": "^9.2.45", + "@fluentui/react-drawer": "9.0.0-beta.35", + "@fluentui/react-field": "^9.1.37", + "@fluentui/react-image": "^9.1.42", + "@fluentui/react-infobutton": "9.0.0-beta.70", + "@fluentui/react-input": "^9.4.47", + "@fluentui/react-label": "^9.1.45", + "@fluentui/react-link": "^9.1.28", + "@fluentui/react-menu": "^9.12.26", + "@fluentui/react-message-bar": "9.0.0", + "@fluentui/react-overflow": "^9.0.39", + "@fluentui/react-persona": "^9.2.50", + "@fluentui/react-popover": "^9.8.15", + "@fluentui/react-portal": "^9.3.23", + "@fluentui/react-positioning": "^9.9.20", + "@fluentui/react-progress": "^9.1.47", + "@fluentui/react-provider": "^9.10.7", + "@fluentui/react-radio": "^9.1.50", + "@fluentui/react-select": "^9.1.47", + "@fluentui/react-shared-contexts": "^9.10.0", + "@fluentui/react-skeleton": "^9.0.35", + "@fluentui/react-slider": "^9.1.50", + "@fluentui/react-spinbutton": "^9.2.47", + "@fluentui/react-spinner": "^9.3.25", + "@fluentui/react-switch": "^9.1.50", + "@fluentui/react-table": "^9.10.5", + "@fluentui/react-tabs": "^9.3.51", + "@fluentui/react-tabster": "^9.13.6", + "@fluentui/react-tags": "^9.0.4", + "@fluentui/react-text": "^9.3.42", + "@fluentui/react-textarea": "^9.3.47", "@fluentui/react-theme": "^9.1.14", - "@fluentui/react-toast": "^9.3.6", - "@fluentui/react-toolbar": "^9.1.45", - "@fluentui/react-tooltip": "^9.3.11", - "@fluentui/react-tree": "^9.4.0", - "@fluentui/react-utilities": "^9.13.5", - "@fluentui/react-virtualizer": "9.0.0-alpha.46", + "@fluentui/react-toast": "^9.3.11", + "@fluentui/react-toolbar": "^9.1.50", + "@fluentui/react-tooltip": "^9.3.16", + "@fluentui/react-tree": "^9.4.5", + "@fluentui/react-utilities": "^9.15.0", + "@fluentui/react-virtualizer": "9.0.0-alpha.51", "@griffel/react": "^1.5.14", "@swc/helpers": "^0.5.1" - }, - "dependencies": { - "@swc/helpers": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.1.tgz", - "integrity": "sha512-sJ902EfIzn1Fa+qYmjdQqh8tPsoxyBz+8yBKC2HKUxyezKJFwPGOn7pv4WY6QuQW//ySQi5lJjA/ZT9sNWWNTg==", - "requires": { - "tslib": "^2.4.0" - } - } } }, "@fluentui/react-context-selector": { - "version": "9.1.36", - "resolved": "https://registry.npmjs.org/@fluentui/react-context-selector/-/react-context-selector-9.1.36.tgz", - "integrity": "sha512-9l7EnrTqhV8PWGBel+nykjf5gfBroOJG0kHkDAmL65FWxYhaRoAlam69GRmOSmbJl0Q5kosf9bnNlvdLjKRQtw==", + "version": "9.1.40", + "resolved": "https://registry.npmjs.org/@fluentui/react-context-selector/-/react-context-selector-9.1.40.tgz", + "integrity": "sha512-//oxMK9ItVNQBZDNwb20KZGsNqATPFWskhUG3zPc4dkyewfJBAGAytjkpOAAWwPZkN/GLk3il11slgvSmtOZHw==", "requires": { - "@fluentui/react-utilities": "^9.13.5", + "@fluentui/react-utilities": "^9.15.0", "@swc/helpers": "^0.5.1" - }, - "dependencies": { - "@swc/helpers": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", - "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", - "requires": { - "tslib": "^2.4.0" - } - } } }, "@fluentui/react-dialog": { - "version": "9.7.4", - "resolved": "https://registry.npmjs.org/@fluentui/react-dialog/-/react-dialog-9.7.4.tgz", - "integrity": "sha512-QLmcuB/z0BDCUACu4bgZkoUg3GMa69cEyd0xqyq/yyfnVw8tgWWBLLVncIO2qKl3BtcONpPAzVuuU2MbyxaQhg==", + "version": "9.7.9", + "resolved": "https://registry.npmjs.org/@fluentui/react-dialog/-/react-dialog-9.7.9.tgz", + "integrity": "sha512-XEUV42d+zgjE/bJS+WFuCsKCmeuAkB+V67YpbZknnIJE4QXMf5GRWgesVHsHSMP8HlZEx9NZN9wlrjwl4n7yqg==", "requires": { "@fluentui/keyboard-keys": "^9.0.6", - "@fluentui/react-aria": "^9.3.38", - "@fluentui/react-context-selector": "^9.1.36", + "@fluentui/react-aria": "^9.3.42", + "@fluentui/react-context-selector": "^9.1.40", "@fluentui/react-icons": "^2.0.217", - "@fluentui/react-jsx-runtime": "^9.0.12", - "@fluentui/react-portal": "^9.3.19", - "@fluentui/react-shared-contexts": "^9.9.2", - "@fluentui/react-tabster": "^9.13.2", + "@fluentui/react-jsx-runtime": "^9.0.17", + "@fluentui/react-portal": "^9.3.23", + "@fluentui/react-shared-contexts": "^9.10.0", + "@fluentui/react-tabster": "^9.13.6", "@fluentui/react-theme": "^9.1.14", - "@fluentui/react-utilities": "^9.13.5", + "@fluentui/react-utilities": "^9.15.0", "@griffel/react": "^1.5.14", "@swc/helpers": "^0.5.1" - }, - "dependencies": { - "@swc/helpers": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", - "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", - "requires": { - "tslib": "^2.4.0" - } - } } }, "@fluentui/react-divider": { - "version": "9.2.40", - "resolved": "https://registry.npmjs.org/@fluentui/react-divider/-/react-divider-9.2.40.tgz", - "integrity": "sha512-2sj2GUcktpfMWrTmyRfhB1NCyVpf5Tqy81RB5169ZAMLpIkhvxeZiwDlpDix+szJSIEmbX1HEOYb/fPxkNia9Q==", + "version": "9.2.45", + "resolved": "https://registry.npmjs.org/@fluentui/react-divider/-/react-divider-9.2.45.tgz", + "integrity": "sha512-Oped8aMwKD9Oo/W43Nwq6l+ShmgnAxTnAwOkZ0207BOWuCmuOgpEz+kRUgqWsRiim299o+pLjeBBWUd2Tsbmzw==", "requires": { - "@fluentui/react-jsx-runtime": "^9.0.12", - "@fluentui/react-shared-contexts": "^9.9.2", + "@fluentui/react-jsx-runtime": "^9.0.17", + "@fluentui/react-shared-contexts": "^9.10.0", "@fluentui/react-theme": "^9.1.14", - "@fluentui/react-utilities": "^9.13.5", + "@fluentui/react-utilities": "^9.15.0", "@griffel/react": "^1.5.14", "@swc/helpers": "^0.5.1" - }, - "dependencies": { - "@swc/helpers": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", - "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", - "requires": { - "tslib": "^2.4.0" - } - } } }, "@fluentui/react-drawer": { - "version": "9.0.0-beta.30", - "resolved": "https://registry.npmjs.org/@fluentui/react-drawer/-/react-drawer-9.0.0-beta.30.tgz", - "integrity": "sha512-1BRXwtr1zp6HykKrXc2O2l+mO2pVTlRgl/ahBo+z3/uz4w8hEomdqd1R0gXqG7rLKMpGj6V+PGKNIIH+bJY8xg==", - "requires": { - "@fluentui/react-dialog": "^9.7.4", - "@fluentui/react-jsx-runtime": "^9.0.12", - "@fluentui/react-motion-preview": "^0.2.9", - "@fluentui/react-shared-contexts": "^9.9.2", + "version": "9.0.0-beta.35", + "resolved": "https://registry.npmjs.org/@fluentui/react-drawer/-/react-drawer-9.0.0-beta.35.tgz", + "integrity": "sha512-UihTfl1Fl38hOL48cY0SwW+MU/RWOY3M6wvaK9EKm1ipaPMblhNMNsUYvMu2v3G5fbhLtxGWrGNrtzqBsGaAsQ==", + "requires": { + "@fluentui/react-dialog": "^9.7.9", + "@fluentui/react-jsx-runtime": "^9.0.17", + "@fluentui/react-motion-preview": "^0.3.3", + "@fluentui/react-shared-contexts": "^9.10.0", + "@fluentui/react-tabster": "^9.13.6", "@fluentui/react-theme": "^9.1.14", - "@fluentui/react-utilities": "^9.13.5", + "@fluentui/react-utilities": "^9.15.0", "@griffel/react": "^1.5.14", "@swc/helpers": "^0.5.1" - }, - "dependencies": { - "@swc/helpers": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", - "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", - "requires": { - "tslib": "^2.4.0" - } - } } }, "@fluentui/react-field": { - "version": "9.1.32", - "resolved": "https://registry.npmjs.org/@fluentui/react-field/-/react-field-9.1.32.tgz", - "integrity": "sha512-35VJCueXE8lr1/yNpMIwT97Jvo8c72tJZaN87HLrBXpkC8zm2hb1SpeV59raUHBGw7AdLUBLkrqYSrNN5uTUEg==", + "version": "9.1.37", + "resolved": "https://registry.npmjs.org/@fluentui/react-field/-/react-field-9.1.37.tgz", + "integrity": "sha512-niAikmjtShof2pOmJKzHHw2DLYcHkewWqKmxyEtUEpKjuuEczlfQ1YU/vS0H0x/Pjz8DFAxCf/AsP8saCGvYww==", "requires": { - "@fluentui/react-context-selector": "^9.1.36", + "@fluentui/react-context-selector": "^9.1.40", "@fluentui/react-icons": "^2.0.217", - "@fluentui/react-jsx-runtime": "^9.0.12", - "@fluentui/react-label": "^9.1.40", + "@fluentui/react-jsx-runtime": "^9.0.17", + "@fluentui/react-label": "^9.1.45", "@fluentui/react-theme": "^9.1.14", - "@fluentui/react-utilities": "^9.13.5", + "@fluentui/react-utilities": "^9.15.0", "@griffel/react": "^1.5.14", "@swc/helpers": "^0.5.1" - }, - "dependencies": { - "@swc/helpers": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", - "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", - "requires": { - "tslib": "^2.4.0" - } - } } }, "@fluentui/react-focus": { - "version": "8.8.30", - "resolved": "https://registry.npmjs.org/@fluentui/react-focus/-/react-focus-8.8.30.tgz", - "integrity": "sha512-dKQQtNTZbQOE+u/Tmh7AbtJPSpzQNI0L8o55a22y4U7s33rizUd++CIiToXsB+bPvlotcmpZswZQ8V06zM4KIw==", + "version": "8.8.32", + "resolved": "https://registry.npmjs.org/@fluentui/react-focus/-/react-focus-8.8.32.tgz", + "integrity": "sha512-ALYMkDRG8qKCRuf5f3w5suWLFBT/65e4vC2EXKhYTcb/AGAH4wGMdWC+b4ek12D4u6L6tOegTMqC64fLp/RT3Q==", "requires": { "@fluentui/keyboard-key": "^0.4.11", "@fluentui/merge-styles": "^8.5.12", "@fluentui/set-version": "^8.2.11", - "@fluentui/style-utilities": "^8.9.16", - "@fluentui/utilities": "^8.13.18", + "@fluentui/style-utilities": "^8.9.18", + "@fluentui/utilities": "^8.13.19", "tslib": "^2.1.0" } }, "@fluentui/react-hooks": { - "version": "8.6.29", - "resolved": "https://registry.npmjs.org/@fluentui/react-hooks/-/react-hooks-8.6.29.tgz", - "integrity": "sha512-MeVevmGJtrYxdhoarrkVWE0Hs4XdzOc9A3tiOjMBIcwOvoOYOAoOELoHK/wuulPVwUn2R9Y+7JpJ6oCe4ImdJw==", + "version": "8.6.30", + "resolved": "https://registry.npmjs.org/@fluentui/react-hooks/-/react-hooks-8.6.30.tgz", + "integrity": "sha512-+EhJY2+C7wbWP+36zM4llc1KGY4/XWu36BnDumoKLJdcrnGilJHHQJ3pXhvJPf2f2mc7LoasCtQDmCQ5Tfzi3A==", "requires": { "@fluentui/react-window-provider": "^2.2.15", "@fluentui/set-version": "^8.2.11", - "@fluentui/utilities": "^8.13.18", + "@fluentui/utilities": "^8.13.19", "tslib": "^2.1.0" } }, "@fluentui/react-icons": { - "version": "2.0.218", - "resolved": "https://registry.npmjs.org/@fluentui/react-icons/-/react-icons-2.0.218.tgz", - "integrity": "sha512-9XoxrPQ4+fvYr6cUTTz4BRHl7UZMZRKL4j8nfJd+wix87AQqFVfloeFO2qUqxD/4uiJyt62VJJMfQCaxLdZCyA==", + "version": "2.0.220", + "resolved": "https://registry.npmjs.org/@fluentui/react-icons/-/react-icons-2.0.220.tgz", + "integrity": "sha512-AIe0y3QuG2dATGVlszyt/xCzVhyBcDulQnDepSLZvDXkuu8zL/zqQaSuiOizwZUVxxuF0SvePyf4zgi86zgtjg==", "requires": { "@griffel/react": "^1.0.0", "tslib": "^2.1.0" } }, "@fluentui/react-image": { - "version": "9.1.37", - "resolved": "https://registry.npmjs.org/@fluentui/react-image/-/react-image-9.1.37.tgz", - "integrity": "sha512-xxajfywqcsqTOXXj2sWEA7101+wyNzprJ7W3uKzSOvp0A3NWNppuWc3mGUh7T784IPGs8g3J9wLJE7C/5B2+Gw==", + "version": "9.1.42", + "resolved": "https://registry.npmjs.org/@fluentui/react-image/-/react-image-9.1.42.tgz", + "integrity": "sha512-Wxv4EGvK93fnw/hRonZxQTtzA5O6g0FTCLawXmnE8/X4URiMQdccO8v5iztPfYXEbjcQ+/08t2b7PaO4p5AIew==", "requires": { - "@fluentui/react-jsx-runtime": "^9.0.12", - "@fluentui/react-shared-contexts": "^9.9.2", + "@fluentui/react-jsx-runtime": "^9.0.17", + "@fluentui/react-shared-contexts": "^9.10.0", "@fluentui/react-theme": "^9.1.14", - "@fluentui/react-utilities": "^9.13.5", + "@fluentui/react-utilities": "^9.15.0", "@griffel/react": "^1.5.14", "@swc/helpers": "^0.5.1" - }, - "dependencies": { - "@swc/helpers": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", - "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", - "requires": { - "tslib": "^2.4.0" - } - } } }, "@fluentui/react-infobutton": { - "version": "9.0.0-beta.65", - "resolved": "https://registry.npmjs.org/@fluentui/react-infobutton/-/react-infobutton-9.0.0-beta.65.tgz", - "integrity": "sha512-/0R40+BSKtDZqrg4buaFju3VUEf39lNNLdVypoQwaiKAqC1JCGJt+JTffzmC4wAhzFlFfgNajcwnQc4CjeuB6A==", + "version": "9.0.0-beta.70", + "resolved": "https://registry.npmjs.org/@fluentui/react-infobutton/-/react-infobutton-9.0.0-beta.70.tgz", + "integrity": "sha512-rrqotdiMJqpfQuHYW4QYs8O0nZyPIPfUsvQqpfkFmbGXfn1NvRdZt3AOfHEAIIUEP2Na4UMnM1UhAXyXnvAZ9A==", "requires": { "@fluentui/react-icons": "^2.0.217", - "@fluentui/react-jsx-runtime": "^9.0.12", - "@fluentui/react-label": "^9.1.40", - "@fluentui/react-popover": "^9.8.10", - "@fluentui/react-portal": "^9.3.19", - "@fluentui/react-tabster": "^9.13.2", + "@fluentui/react-jsx-runtime": "^9.0.17", + "@fluentui/react-label": "^9.1.45", + "@fluentui/react-popover": "^9.8.15", + "@fluentui/react-tabster": "^9.13.6", "@fluentui/react-theme": "^9.1.14", - "@fluentui/react-utilities": "^9.13.5", + "@fluentui/react-utilities": "^9.15.0", "@griffel/react": "^1.5.14", "@swc/helpers": "^0.5.1" - }, - "dependencies": { - "@swc/helpers": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", - "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", - "requires": { - "tslib": "^2.4.0" - } - } } }, "@fluentui/react-input": { - "version": "9.4.42", - "resolved": "https://registry.npmjs.org/@fluentui/react-input/-/react-input-9.4.42.tgz", - "integrity": "sha512-Kv7F+6k3vIQ2p/lozkD8TN+sBXdhUag/biRGaGJVo5SYYAAfij4ajcBU0G4cZRNBRLeoMgzsQQLZXuZrrZuPsQ==", + "version": "9.4.47", + "resolved": "https://registry.npmjs.org/@fluentui/react-input/-/react-input-9.4.47.tgz", + "integrity": "sha512-WaTErvxo1CUPy/nHbataSuxWkuhpVhwYl+JbwbdYOktZVDIvM/us+YGmtEr2mA/FXCVqQ839k2mlmZCma4Hkwg==", "requires": { - "@fluentui/react-field": "^9.1.32", - "@fluentui/react-jsx-runtime": "^9.0.12", - "@fluentui/react-shared-contexts": "^9.9.2", + "@fluentui/react-field": "^9.1.37", + "@fluentui/react-jsx-runtime": "^9.0.17", + "@fluentui/react-shared-contexts": "^9.10.0", "@fluentui/react-theme": "^9.1.14", - "@fluentui/react-utilities": "^9.13.5", + "@fluentui/react-utilities": "^9.15.0", "@griffel/react": "^1.5.14", "@swc/helpers": "^0.5.1" - }, - "dependencies": { - "@swc/helpers": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", - "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", - "requires": { - "tslib": "^2.4.0" - } - } } }, "@fluentui/react-jsx-runtime": { - "version": "9.0.12", - "resolved": "https://registry.npmjs.org/@fluentui/react-jsx-runtime/-/react-jsx-runtime-9.0.12.tgz", - "integrity": "sha512-fsnoz8xRGMGm9aePoetXrW3jqaDYB1GsziJbLhYB5HqgzsOcwOyL05TWL9nHjGu7hR6vXmfQTc715BXFYT6H7Q==", + "version": "9.0.17", + "resolved": "https://registry.npmjs.org/@fluentui/react-jsx-runtime/-/react-jsx-runtime-9.0.17.tgz", + "integrity": "sha512-gTwrWs0I4RkP9TmumGHGp5us8RU6tCf3Wjmx34DEutsDfsMmxzOHbsnhsymEBuhDIbHe6kricQ9McTkGhYP9SQ==", "requires": { - "@fluentui/react-utilities": "^9.13.5", - "@swc/helpers": "^0.5.1" - }, - "dependencies": { - "@swc/helpers": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", - "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", - "requires": { - "tslib": "^2.4.0" - } - } + "@fluentui/react-utilities": "^9.15.0", + "@swc/helpers": "^0.5.1", + "react-is": "^17.0.2" } }, "@fluentui/react-label": { - "version": "9.1.40", - "resolved": "https://registry.npmjs.org/@fluentui/react-label/-/react-label-9.1.40.tgz", - "integrity": "sha512-LNfc/rniXb7SlQR4ryctLO2bX8vG8wkv/q/P0DNXJpsBXlYURW+YVKiM5sSWamIF/Jn1zxsnhyuxBd5hN2TO4g==", + "version": "9.1.45", + "resolved": "https://registry.npmjs.org/@fluentui/react-label/-/react-label-9.1.45.tgz", + "integrity": "sha512-d5lOvlSChf8uyWSpoPVjXcjHdHVLJCH2+ox6Ad+fQK/onKByzIGNPBwXAbZX7IHRVgg14PAJXvdXQNvHzc99Tg==", "requires": { - "@fluentui/react-jsx-runtime": "^9.0.12", - "@fluentui/react-shared-contexts": "^9.9.2", + "@fluentui/react-jsx-runtime": "^9.0.17", + "@fluentui/react-shared-contexts": "^9.10.0", "@fluentui/react-theme": "^9.1.14", - "@fluentui/react-utilities": "^9.13.5", + "@fluentui/react-utilities": "^9.15.0", "@griffel/react": "^1.5.14", "@swc/helpers": "^0.5.1" - }, - "dependencies": { - "@swc/helpers": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", - "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", - "requires": { - "tslib": "^2.4.0" - } - } } }, "@fluentui/react-link": { - "version": "9.1.23", - "resolved": "https://registry.npmjs.org/@fluentui/react-link/-/react-link-9.1.23.tgz", - "integrity": "sha512-2lbQIFx5B6GkCkfo6VsiRY0q6W1+tss8hVt+KfoFf77wjjvFO+OSDMVUuJz+Is+pkacVWDt1XSXJIhHoIKo2ug==", + "version": "9.1.28", + "resolved": "https://registry.npmjs.org/@fluentui/react-link/-/react-link-9.1.28.tgz", + "integrity": "sha512-kJaev1RSxGYVNwJ5ABqknwXMsfIFuGJ7scczpNstmNqvuNE5mJ5OC+XF6u29a2kg6AGnQthI/k6xC4Ipo9EuTQ==", "requires": { "@fluentui/keyboard-keys": "^9.0.6", - "@fluentui/react-jsx-runtime": "^9.0.12", - "@fluentui/react-shared-contexts": "^9.9.2", - "@fluentui/react-tabster": "^9.13.2", + "@fluentui/react-jsx-runtime": "^9.0.17", + "@fluentui/react-shared-contexts": "^9.10.0", + "@fluentui/react-tabster": "^9.13.6", "@fluentui/react-theme": "^9.1.14", - "@fluentui/react-utilities": "^9.13.5", + "@fluentui/react-utilities": "^9.15.0", "@griffel/react": "^1.5.14", "@swc/helpers": "^0.5.1" - }, - "dependencies": { - "@swc/helpers": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", - "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", - "requires": { - "tslib": "^2.4.0" - } - } } }, "@fluentui/react-menu": { - "version": "9.12.21", - "resolved": "https://registry.npmjs.org/@fluentui/react-menu/-/react-menu-9.12.21.tgz", - "integrity": "sha512-mmjh9S1+Bq9CPKzkaMVj3aMI04W2+IWZ2aQOiQvZBpksjjvj+EqG2aFrrGGoC0skAaV+Z0kdWxYbvOj3k9OddQ==", + "version": "9.12.26", + "resolved": "https://registry.npmjs.org/@fluentui/react-menu/-/react-menu-9.12.26.tgz", + "integrity": "sha512-oCwxmyMC4/mG1FfRhh1nHqcvNp5ONukbsi8TKhY+YVPDAd5C0CrTGrVyTB+vz873gUdnVpXSZnv6ZlneANbjxA==", "requires": { "@fluentui/keyboard-keys": "^9.0.6", - "@fluentui/react-aria": "^9.3.38", - "@fluentui/react-context-selector": "^9.1.36", + "@fluentui/react-aria": "^9.3.42", + "@fluentui/react-context-selector": "^9.1.40", "@fluentui/react-icons": "^2.0.217", - "@fluentui/react-jsx-runtime": "^9.0.12", - "@fluentui/react-portal": "^9.3.19", - "@fluentui/react-positioning": "^9.9.16", - "@fluentui/react-shared-contexts": "^9.9.2", - "@fluentui/react-tabster": "^9.13.2", + "@fluentui/react-jsx-runtime": "^9.0.17", + "@fluentui/react-portal": "^9.3.23", + "@fluentui/react-positioning": "^9.9.20", + "@fluentui/react-shared-contexts": "^9.10.0", + "@fluentui/react-tabster": "^9.13.6", "@fluentui/react-theme": "^9.1.14", - "@fluentui/react-utilities": "^9.13.5", + "@fluentui/react-utilities": "^9.15.0", "@griffel/react": "^1.5.14", "@swc/helpers": "^0.5.1" - }, - "dependencies": { - "@swc/helpers": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", - "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", - "requires": { - "tslib": "^2.4.0" - } - } + } + }, + "@fluentui/react-message-bar": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/@fluentui/react-message-bar/-/react-message-bar-9.0.0.tgz", + "integrity": "sha512-pm2+xzKOEPfUm6gqckMHybD6mqjj9N5WVfm0ssFcLuE6FqXT8wiGvvhdUb0kd8ctzrAfdysPKCZY35BXVw8zTQ==", + "requires": { + "@fluentui/react-button": "^9.3.49", + "@fluentui/react-icons": "^2.0.217", + "@fluentui/react-jsx-runtime": "^9.0.17", + "@fluentui/react-shared-contexts": "^9.10.0", + "@fluentui/react-theme": "^9.1.14", + "@fluentui/react-utilities": "^9.15.0", + "@griffel/react": "^1.5.14", + "@swc/helpers": "^0.5.1", + "react-transition-group": "^4.4.1" } }, "@fluentui/react-motion-preview": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/@fluentui/react-motion-preview/-/react-motion-preview-0.2.9.tgz", - "integrity": "sha512-saEOO1t0T6S+WVGgz3fKISCx38CQ7jETpRM8uow3MtwDQWmg94Vkkp/V+pgTTRoHmFKLMzS+XpjUnTBdOL+LeA==", + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@fluentui/react-motion-preview/-/react-motion-preview-0.3.3.tgz", + "integrity": "sha512-IcUmrmhhaaznqJm+qwjEOj4d7NQEDaJHJ0AEWou7s4ggX5kU71mJBXssNsyXmBgMQ6xSvtaXXEtlHYvK+qKyDA==", "requires": { - "@fluentui/react-jsx-runtime": "^9.0.12", - "@fluentui/react-shared-contexts": "^9.9.2", + "@fluentui/react-jsx-runtime": "^9.0.17", + "@fluentui/react-shared-contexts": "^9.10.0", "@fluentui/react-theme": "^9.1.14", - "@fluentui/react-utilities": "^9.13.5", + "@fluentui/react-utilities": "^9.15.0", "@griffel/react": "^1.5.14", "@swc/helpers": "^0.5.1" - }, - "dependencies": { - "@swc/helpers": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", - "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", - "requires": { - "tslib": "^2.4.0" - } - } } }, "@fluentui/react-overflow": { - "version": "9.0.35", - "resolved": "https://registry.npmjs.org/@fluentui/react-overflow/-/react-overflow-9.0.35.tgz", - "integrity": "sha512-npq8sX3VMBnpPdARkFxWXw8rFZoT93mOS/xvX7/cQ0WLWo1kyrKpVjq4r55ngvdgUCP5zx8Ed6UvnhEMQrqK2A==", + "version": "9.0.39", + "resolved": "https://registry.npmjs.org/@fluentui/react-overflow/-/react-overflow-9.0.39.tgz", + "integrity": "sha512-u4VxKA+n9HhEngubM+MDonpu9Z0bN72iTAU95LCL0pAdesczh6SPKupnz5M1bzFvDkEELij6m+hmNF+py3Z30A==", "requires": { "@fluentui/priority-overflow": "^9.1.7", - "@fluentui/react-context-selector": "^9.1.36", + "@fluentui/react-context-selector": "^9.1.40", "@fluentui/react-theme": "^9.1.14", - "@fluentui/react-utilities": "^9.13.5", + "@fluentui/react-utilities": "^9.15.0", "@griffel/react": "^1.5.14", "@swc/helpers": "^0.5.1" - }, - "dependencies": { - "@swc/helpers": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", - "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", - "requires": { - "tslib": "^2.4.0" - } - } } }, "@fluentui/react-persona": { - "version": "9.2.45", - "resolved": "https://registry.npmjs.org/@fluentui/react-persona/-/react-persona-9.2.45.tgz", - "integrity": "sha512-xGmBL6go2ONuxzufCYxe2WD9Xf5uRH2At7IYcMKnyc7TgL+BXlkonkxC4VVb6sZhNBSrQkug2Iopp2kEfhN+Pw==", - "requires": { - "@fluentui/react-avatar": "^9.5.35", - "@fluentui/react-badge": "^9.2.4", - "@fluentui/react-jsx-runtime": "^9.0.12", - "@fluentui/react-shared-contexts": "^9.9.2", + "version": "9.2.50", + "resolved": "https://registry.npmjs.org/@fluentui/react-persona/-/react-persona-9.2.50.tgz", + "integrity": "sha512-qEA2ud4qtWirKFvfuN57PZSLO2aKP2RN/lGkNRucapu9+MJ8q7+ugHYGqXTIrjigK6rUQf2lFDDc6ghjJD20CA==", + "requires": { + "@fluentui/react-avatar": "^9.5.40", + "@fluentui/react-badge": "^9.2.9", + "@fluentui/react-jsx-runtime": "^9.0.17", + "@fluentui/react-shared-contexts": "^9.10.0", "@fluentui/react-theme": "^9.1.14", - "@fluentui/react-utilities": "^9.13.5", + "@fluentui/react-utilities": "^9.15.0", "@griffel/react": "^1.5.14", "@swc/helpers": "^0.5.1" - }, - "dependencies": { - "@swc/helpers": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", - "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", - "requires": { - "tslib": "^2.4.0" - } - } } }, "@fluentui/react-popover": { - "version": "9.8.10", - "resolved": "https://registry.npmjs.org/@fluentui/react-popover/-/react-popover-9.8.10.tgz", - "integrity": "sha512-axQIwLPUlcjRmx5qEvhkkT/fgiIVA7n+INOfs6wQ1LTM4yi7YoNtwmgPDuXYxkLUHrGTEt8IHGK/JooGOP7amQ==", + "version": "9.8.15", + "resolved": "https://registry.npmjs.org/@fluentui/react-popover/-/react-popover-9.8.15.tgz", + "integrity": "sha512-phCp8RORWzKZDrysPhiiShosXzfE1D/hYTJn7pSmyJ7uTWCdNU2wT5Z93LoPZv8gwaiBZUmIE0TW4W9xBEpwnw==", "requires": { "@fluentui/keyboard-keys": "^9.0.6", - "@fluentui/react-aria": "^9.3.38", - "@fluentui/react-context-selector": "^9.1.36", - "@fluentui/react-jsx-runtime": "^9.0.12", - "@fluentui/react-portal": "^9.3.19", - "@fluentui/react-positioning": "^9.9.16", - "@fluentui/react-shared-contexts": "^9.9.2", - "@fluentui/react-tabster": "^9.13.2", + "@fluentui/react-aria": "^9.3.42", + "@fluentui/react-context-selector": "^9.1.40", + "@fluentui/react-jsx-runtime": "^9.0.17", + "@fluentui/react-portal": "^9.3.23", + "@fluentui/react-positioning": "^9.9.20", + "@fluentui/react-shared-contexts": "^9.10.0", + "@fluentui/react-tabster": "^9.13.6", "@fluentui/react-theme": "^9.1.14", - "@fluentui/react-utilities": "^9.13.5", + "@fluentui/react-utilities": "^9.15.0", "@griffel/react": "^1.5.14", "@swc/helpers": "^0.5.1" - }, - "dependencies": { - "@swc/helpers": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", - "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", - "requires": { - "tslib": "^2.4.0" - } - } } }, "@fluentui/react-portal": { - "version": "9.3.19", - "resolved": "https://registry.npmjs.org/@fluentui/react-portal/-/react-portal-9.3.19.tgz", - "integrity": "sha512-ac6PzAlg3fFogHx3h6ScEFvWV3+HimhMtsS7xqk55bHbODq8ySyBLHWfLfb5gGWccUQXbVtNvKR2m2Q3EPWkew==", + "version": "9.3.23", + "resolved": "https://registry.npmjs.org/@fluentui/react-portal/-/react-portal-9.3.23.tgz", + "integrity": "sha512-8GdKXPZSD9s+KuGnPfc8npzBYd9hNmchZjgExMuv7BUqHPcuRIwHhMtvW+OvWseC5BxeybDFzlhNG1ZpzbigTg==", "requires": { - "@fluentui/react-shared-contexts": "^9.9.2", - "@fluentui/react-tabster": "^9.13.2", - "@fluentui/react-utilities": "^9.13.5", + "@fluentui/react-shared-contexts": "^9.10.0", + "@fluentui/react-tabster": "^9.13.6", + "@fluentui/react-utilities": "^9.15.0", "@griffel/react": "^1.5.14", "@swc/helpers": "^0.5.1", "use-disposable": "^1.0.1" - }, - "dependencies": { - "@swc/helpers": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", - "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", - "requires": { - "tslib": "^2.4.0" - } - } } }, "@fluentui/react-portal-compat-context": { - "version": "9.0.6", - "resolved": "https://registry.npmjs.org/@fluentui/react-portal-compat-context/-/react-portal-compat-context-9.0.6.tgz", - "integrity": "sha512-HUt0/YXKRB4chtzlGbZ+7y7FHFyqaI0CeMFAe/QBXVOiOwA01QOr2j4Uky+30vupspIt6mjodLanuw1jMybmqQ==", + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/@fluentui/react-portal-compat-context/-/react-portal-compat-context-9.0.9.tgz", + "integrity": "sha512-Qt4zBJjBf3QihWqDNfZ4D9ha0QdcUvw4zIErp6IkT4uFIkV2VSgEjIKXm0h2iDEZZQtzbGlFG+9hPPhH13HaPQ==", "requires": { - "@swc/helpers": "^0.4.14" + "@swc/helpers": "^0.5.1" } }, "@fluentui/react-positioning": { - "version": "9.9.16", - "resolved": "https://registry.npmjs.org/@fluentui/react-positioning/-/react-positioning-9.9.16.tgz", - "integrity": "sha512-oLEyAr5wmNYiwJX/xJuY28pNtfPl5T9aXfaGlneM3MrN+ARuCm5PUkNFtua8r0IIVptck0Dp5T41OTH437YBZQ==", + "version": "9.9.20", + "resolved": "https://registry.npmjs.org/@fluentui/react-positioning/-/react-positioning-9.9.20.tgz", + "integrity": "sha512-XrB4d+PDKFf9Z14nry8JwJ62YLI1OV5EqDw4Rw2g1qgbGYYQSz0T/1ouYlpa9oE367xRnawYBGpPYuUdo4S0Vw==", "requires": { "@floating-ui/dom": "^1.2.0", - "@fluentui/react-shared-contexts": "^9.9.2", + "@fluentui/react-shared-contexts": "^9.10.0", "@fluentui/react-theme": "^9.1.14", - "@fluentui/react-utilities": "^9.13.5", + "@fluentui/react-utilities": "^9.15.0", "@griffel/react": "^1.5.14", "@swc/helpers": "^0.5.1" - }, - "dependencies": { - "@swc/helpers": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", - "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", - "requires": { - "tslib": "^2.4.0" - } - } } }, "@fluentui/react-progress": { - "version": "9.1.42", - "resolved": "https://registry.npmjs.org/@fluentui/react-progress/-/react-progress-9.1.42.tgz", - "integrity": "sha512-w2DBdHvYe767PXGrZIB7wbq62WkOv5Wq6jq012T5tOIkoUX8LtXjV/BIRgWez32feYw/dICbnkMCWWja8Tgm1A==", + "version": "9.1.47", + "resolved": "https://registry.npmjs.org/@fluentui/react-progress/-/react-progress-9.1.47.tgz", + "integrity": "sha512-fm0Ho6nVEZ8i9r+ZT91EAyc88I66xkPBXqmYL5Vz/9qHE23+IoYg4pExINm525N6Do/Gs0zwEqcnFKJ7G52eGg==", "requires": { - "@fluentui/react-field": "^9.1.32", - "@fluentui/react-jsx-runtime": "^9.0.12", - "@fluentui/react-shared-contexts": "^9.9.2", + "@fluentui/react-field": "^9.1.37", + "@fluentui/react-jsx-runtime": "^9.0.17", + "@fluentui/react-shared-contexts": "^9.10.0", "@fluentui/react-theme": "^9.1.14", - "@fluentui/react-utilities": "^9.13.5", + "@fluentui/react-utilities": "^9.15.0", "@griffel/react": "^1.5.14", "@swc/helpers": "^0.5.1" - }, - "dependencies": { - "@swc/helpers": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", - "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", - "requires": { - "tslib": "^2.4.0" - } - } } }, "@fluentui/react-provider": { - "version": "9.10.2", - "resolved": "https://registry.npmjs.org/@fluentui/react-provider/-/react-provider-9.10.2.tgz", - "integrity": "sha512-ti+EOLS8ZKxMDKCAqXavsVco0av1tEj71Z63Z1oITHXgasuB2/5tyB9XFc7j3cCIU+wdbLGBpzb2qMz1ntmy1g==", + "version": "9.10.7", + "resolved": "https://registry.npmjs.org/@fluentui/react-provider/-/react-provider-9.10.7.tgz", + "integrity": "sha512-i/dWzfaQwIU+yb5+/dBqFKQ3ixbh667lGOnEn+Pk4TABOEDXoLXX+muykP/Mdgj8MZppXR3HcaUkn5zc6w6HqA==", "requires": { "@fluentui/react-icons": "^2.0.217", - "@fluentui/react-jsx-runtime": "^9.0.12", - "@fluentui/react-shared-contexts": "^9.9.2", - "@fluentui/react-tabster": "^9.13.2", + "@fluentui/react-jsx-runtime": "^9.0.17", + "@fluentui/react-shared-contexts": "^9.10.0", + "@fluentui/react-tabster": "^9.13.6", "@fluentui/react-theme": "^9.1.14", - "@fluentui/react-utilities": "^9.13.5", + "@fluentui/react-utilities": "^9.15.0", "@griffel/core": "^1.14.1", "@griffel/react": "^1.5.14", "@swc/helpers": "^0.5.1" - }, - "dependencies": { - "@swc/helpers": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", - "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", - "requires": { - "tslib": "^2.4.0" - } - } } }, "@fluentui/react-radio": { - "version": "9.1.45", - "resolved": "https://registry.npmjs.org/@fluentui/react-radio/-/react-radio-9.1.45.tgz", - "integrity": "sha512-bSENYylQYE7S2se6jLmP2p7CWk2Ez6cWcXGwJqezrsV1uvLlfOhAwYHy2I2joGFfzznCXpzKff7OndAWFg/eKA==", + "version": "9.1.50", + "resolved": "https://registry.npmjs.org/@fluentui/react-radio/-/react-radio-9.1.50.tgz", + "integrity": "sha512-WIE31WS5120xJ0FEQUclTSlK2g+D3k+rIvj68PW0maL8D0yCRS81jD/pJeqd885v+KEU1aFbAYmMvY+3l5s1Gg==", "requires": { - "@fluentui/react-field": "^9.1.32", + "@fluentui/react-field": "^9.1.37", "@fluentui/react-icons": "^2.0.217", - "@fluentui/react-jsx-runtime": "^9.0.12", - "@fluentui/react-label": "^9.1.40", - "@fluentui/react-shared-contexts": "^9.9.2", - "@fluentui/react-tabster": "^9.13.2", + "@fluentui/react-jsx-runtime": "^9.0.17", + "@fluentui/react-label": "^9.1.45", + "@fluentui/react-shared-contexts": "^9.10.0", + "@fluentui/react-tabster": "^9.13.6", "@fluentui/react-theme": "^9.1.14", - "@fluentui/react-utilities": "^9.13.5", + "@fluentui/react-utilities": "^9.15.0", "@griffel/react": "^1.5.14", "@swc/helpers": "^0.5.1" - }, - "dependencies": { - "@swc/helpers": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", - "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", - "requires": { - "tslib": "^2.4.0" - } - } } }, "@fluentui/react-select": { - "version": "9.1.42", - "resolved": "https://registry.npmjs.org/@fluentui/react-select/-/react-select-9.1.42.tgz", - "integrity": "sha512-pvqCX81UhWo53AVyxhvpaTih1vzfCfJWEM1YUhI3DchcZniYbUekvyMc2YjfWm/c6hWmY0mfwAvxqbA54atmJw==", + "version": "9.1.47", + "resolved": "https://registry.npmjs.org/@fluentui/react-select/-/react-select-9.1.47.tgz", + "integrity": "sha512-VZoY0pzSiecte9Ln+QG2vNMi8GqDUqLuipsi+KQ5ybrgfWuIYfo2R7kEZKSlJb5zFrZG+e4Y14P0dHKUQkCClQ==", "requires": { - "@fluentui/react-field": "^9.1.32", + "@fluentui/react-field": "^9.1.37", "@fluentui/react-icons": "^2.0.217", - "@fluentui/react-jsx-runtime": "^9.0.12", - "@fluentui/react-shared-contexts": "^9.9.2", + "@fluentui/react-jsx-runtime": "^9.0.17", + "@fluentui/react-shared-contexts": "^9.10.0", "@fluentui/react-theme": "^9.1.14", - "@fluentui/react-utilities": "^9.13.5", + "@fluentui/react-utilities": "^9.15.0", "@griffel/react": "^1.5.14", "@swc/helpers": "^0.5.1" - }, - "dependencies": { - "@swc/helpers": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", - "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", - "requires": { - "tslib": "^2.4.0" - } - } } }, "@fluentui/react-shared-contexts": { - "version": "9.9.2", - "resolved": "https://registry.npmjs.org/@fluentui/react-shared-contexts/-/react-shared-contexts-9.9.2.tgz", - "integrity": "sha512-Vl6I6PVHbU1jU3WCrCjLOcmbxDCEpw8bxUZsk61BbAMxBlXa0uqQBitZBBelAm8C0UxgK9nqHG4gZXaTFytozw==", + "version": "9.10.0", + "resolved": "https://registry.npmjs.org/@fluentui/react-shared-contexts/-/react-shared-contexts-9.10.0.tgz", + "integrity": "sha512-2ubHqWnnd2VX82wAuGV0VVOXuQMQPz3x+8cgcGDI+z0lGrBF679N8W55QuEisvnDojoe6iASxJmc311N3aRzSQ==", "requires": { "@fluentui/react-theme": "^9.1.14", "@swc/helpers": "^0.5.1" - }, - "dependencies": { - "@swc/helpers": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", - "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", - "requires": { - "tslib": "^2.4.0" - } - } } }, "@fluentui/react-skeleton": { - "version": "9.0.30", - "resolved": "https://registry.npmjs.org/@fluentui/react-skeleton/-/react-skeleton-9.0.30.tgz", - "integrity": "sha512-/+qDjQvlwcvUUcKe22jUEIfp+zeYltB+TZ3UQwkAsaumIFTZxkz1i7CIFhO2EqZVSZwLXG46+QaZtoz3W4fjIw==", + "version": "9.0.35", + "resolved": "https://registry.npmjs.org/@fluentui/react-skeleton/-/react-skeleton-9.0.35.tgz", + "integrity": "sha512-Em8bFv+Wp4gjiEH9YF9G+pzxIM6zJVVo5L6XWx8rAKMwP5gTwxr1mGOoHtLma2bzUhZYeKSfbGP54/Wr63aUsg==", "requires": { - "@fluentui/react-field": "^9.1.32", - "@fluentui/react-jsx-runtime": "^9.0.12", - "@fluentui/react-shared-contexts": "^9.9.2", + "@fluentui/react-field": "^9.1.37", + "@fluentui/react-jsx-runtime": "^9.0.17", + "@fluentui/react-shared-contexts": "^9.10.0", "@fluentui/react-theme": "^9.1.14", - "@fluentui/react-utilities": "^9.13.5", + "@fluentui/react-utilities": "^9.15.0", "@griffel/react": "^1.5.14", "@swc/helpers": "^0.5.1" - }, - "dependencies": { - "@swc/helpers": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", - "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", - "requires": { - "tslib": "^2.4.0" - } - } } }, "@fluentui/react-slider": { - "version": "9.1.45", - "resolved": "https://registry.npmjs.org/@fluentui/react-slider/-/react-slider-9.1.45.tgz", - "integrity": "sha512-/yAmuzmWWmf+yy+4gEOMDqXI0sMHYSETPsqM5SGmAtLwPCgi1rCy6Bvl9FoYR0LvBe/T80qgoyAuWQZ4Q0xnyw==", - "requires": { - "@fluentui/react-field": "^9.1.32", - "@fluentui/react-jsx-runtime": "^9.0.12", - "@fluentui/react-shared-contexts": "^9.9.2", - "@fluentui/react-tabster": "^9.13.2", + "version": "9.1.50", + "resolved": "https://registry.npmjs.org/@fluentui/react-slider/-/react-slider-9.1.50.tgz", + "integrity": "sha512-/qWK6/aRNwl/I3GU5NQK/CSRV9TKL5KpS4SOpGb5eSAUYrAKCY6GfYqDiNYKCZZ0rbX8L9VbSL+i+autdV8YNQ==", + "requires": { + "@fluentui/react-field": "^9.1.37", + "@fluentui/react-jsx-runtime": "^9.0.17", + "@fluentui/react-shared-contexts": "^9.10.0", + "@fluentui/react-tabster": "^9.13.6", "@fluentui/react-theme": "^9.1.14", - "@fluentui/react-utilities": "^9.13.5", + "@fluentui/react-utilities": "^9.15.0", "@griffel/react": "^1.5.14", "@swc/helpers": "^0.5.1" - }, - "dependencies": { - "@swc/helpers": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", - "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", - "requires": { - "tslib": "^2.4.0" - } - } } }, "@fluentui/react-spinbutton": { - "version": "9.2.42", - "resolved": "https://registry.npmjs.org/@fluentui/react-spinbutton/-/react-spinbutton-9.2.42.tgz", - "integrity": "sha512-bTSQH11gfrc2GMcT6XX+/EfsfOJwv7hQPa+pJzD97kkZoxbVIbJ7gI3DelSj5vsDXzWPr4cQBoADWXolSPx4Ow==", + "version": "9.2.47", + "resolved": "https://registry.npmjs.org/@fluentui/react-spinbutton/-/react-spinbutton-9.2.47.tgz", + "integrity": "sha512-dj3tCIw1XwZHq4Mbqsheit8RSsPyNXn6XytEZPOGVaegJItF/cbfzIKOVcwXjjfGNU4iDPuDkSo97QqHZUFhig==", "requires": { "@fluentui/keyboard-keys": "^9.0.6", - "@fluentui/react-field": "^9.1.32", + "@fluentui/react-field": "^9.1.37", "@fluentui/react-icons": "^2.0.217", - "@fluentui/react-jsx-runtime": "^9.0.12", - "@fluentui/react-shared-contexts": "^9.9.2", + "@fluentui/react-jsx-runtime": "^9.0.17", + "@fluentui/react-shared-contexts": "^9.10.0", "@fluentui/react-theme": "^9.1.14", - "@fluentui/react-utilities": "^9.13.5", + "@fluentui/react-utilities": "^9.15.0", "@griffel/react": "^1.5.14", "@swc/helpers": "^0.5.1" - }, - "dependencies": { - "@swc/helpers": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", - "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", - "requires": { - "tslib": "^2.4.0" - } - } } }, "@fluentui/react-spinner": { - "version": "9.3.20", - "resolved": "https://registry.npmjs.org/@fluentui/react-spinner/-/react-spinner-9.3.20.tgz", - "integrity": "sha512-DNjTmO/0LwitTAHHRNpClxPabuBvD9Ot23Ki4XMUVFbKul99EP6cSN6Wi+B0ir531qzZYqIG++yZfdPIHoSnvg==", + "version": "9.3.25", + "resolved": "https://registry.npmjs.org/@fluentui/react-spinner/-/react-spinner-9.3.25.tgz", + "integrity": "sha512-8LyIQgv1nUSE3VuuHzFjMy9VQFw4oCd5kMOqOB4Hjog8AV2GW58Umb4fc+0tDrwfcGmX3ORi71fWyIivVs4Nzg==", "requires": { - "@fluentui/react-jsx-runtime": "^9.0.12", - "@fluentui/react-label": "^9.1.40", - "@fluentui/react-shared-contexts": "^9.9.2", + "@fluentui/react-jsx-runtime": "^9.0.17", + "@fluentui/react-label": "^9.1.45", + "@fluentui/react-shared-contexts": "^9.10.0", "@fluentui/react-theme": "^9.1.14", - "@fluentui/react-utilities": "^9.13.5", + "@fluentui/react-utilities": "^9.15.0", "@griffel/react": "^1.5.14", "@swc/helpers": "^0.5.1" - }, - "dependencies": { - "@swc/helpers": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", - "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", - "requires": { - "tslib": "^2.4.0" - } - } } }, "@fluentui/react-switch": { - "version": "9.1.45", - "resolved": "https://registry.npmjs.org/@fluentui/react-switch/-/react-switch-9.1.45.tgz", - "integrity": "sha512-1AXGzpmFdmrOjRsUyDwdjBj4jUKesAiFEVpIjflRODhpp91k7ldfIYaNI65FlB73w7gwMftwUhY9HCj49c2iUw==", + "version": "9.1.50", + "resolved": "https://registry.npmjs.org/@fluentui/react-switch/-/react-switch-9.1.50.tgz", + "integrity": "sha512-kNsaknbutksBSR6VVvsuEbeaKUB2rVHsYSERkdsIcLhfpgJHmbFCtgHHuPNjUU1xgDpg1uLXRqH0aJiwZD8h5w==", "requires": { - "@fluentui/react-field": "^9.1.32", + "@fluentui/react-field": "^9.1.37", "@fluentui/react-icons": "^2.0.217", - "@fluentui/react-jsx-runtime": "^9.0.12", - "@fluentui/react-label": "^9.1.40", - "@fluentui/react-shared-contexts": "^9.9.2", - "@fluentui/react-tabster": "^9.13.2", + "@fluentui/react-jsx-runtime": "^9.0.17", + "@fluentui/react-label": "^9.1.45", + "@fluentui/react-shared-contexts": "^9.10.0", + "@fluentui/react-tabster": "^9.13.6", "@fluentui/react-theme": "^9.1.14", - "@fluentui/react-utilities": "^9.13.5", + "@fluentui/react-utilities": "^9.15.0", "@griffel/react": "^1.5.14", "@swc/helpers": "^0.5.1" - }, - "dependencies": { - "@swc/helpers": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", - "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", - "requires": { - "tslib": "^2.4.0" - } - } } }, "@fluentui/react-table": { - "version": "9.10.0", - "resolved": "https://registry.npmjs.org/@fluentui/react-table/-/react-table-9.10.0.tgz", - "integrity": "sha512-Zi+RkkX2oF7JMhLsgmAOlEku9+KGvN7w/Mc3lYXylcak4ljWJb/n8sGXrHqV/HU8divI/DPnom7JA9cPAs45zg==", + "version": "9.10.5", + "resolved": "https://registry.npmjs.org/@fluentui/react-table/-/react-table-9.10.5.tgz", + "integrity": "sha512-SgSXeBJdnQz23Kr1qyw3i+nCMJxYwgI3N6RWQHs6Lm/GZ4e2ddSHhZxnizwsAnLQhXYy+IU+veJk8K+f8UEFKw==", "requires": { "@fluentui/keyboard-keys": "^9.0.6", - "@fluentui/react-aria": "^9.3.38", - "@fluentui/react-avatar": "^9.5.35", - "@fluentui/react-checkbox": "^9.1.45", - "@fluentui/react-context-selector": "^9.1.36", + "@fluentui/react-aria": "^9.3.42", + "@fluentui/react-avatar": "^9.5.40", + "@fluentui/react-checkbox": "^9.1.50", + "@fluentui/react-context-selector": "^9.1.40", "@fluentui/react-icons": "^2.0.217", - "@fluentui/react-jsx-runtime": "^9.0.12", - "@fluentui/react-radio": "^9.1.45", - "@fluentui/react-shared-contexts": "^9.9.2", - "@fluentui/react-tabster": "^9.13.2", + "@fluentui/react-jsx-runtime": "^9.0.17", + "@fluentui/react-radio": "^9.1.50", + "@fluentui/react-shared-contexts": "^9.10.0", + "@fluentui/react-tabster": "^9.13.6", "@fluentui/react-theme": "^9.1.14", - "@fluentui/react-utilities": "^9.13.5", + "@fluentui/react-utilities": "^9.15.0", "@griffel/react": "^1.5.14", "@swc/helpers": "^0.5.1" - }, - "dependencies": { - "@swc/helpers": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", - "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", - "requires": { - "tslib": "^2.4.0" - } - } } }, "@fluentui/react-tabs": { - "version": "9.3.46", - "resolved": "https://registry.npmjs.org/@fluentui/react-tabs/-/react-tabs-9.3.46.tgz", - "integrity": "sha512-Vb6L6E5x0Dy2Yj/UnvRhKrOqlZtr/ZgrrF+0vPrBj1Eqy5iwUH+kPVP0EYcvdRg3QCfbHNxAiNSvlXnLxQz24A==", - "requires": { - "@fluentui/react-context-selector": "^9.1.36", - "@fluentui/react-jsx-runtime": "^9.0.12", - "@fluentui/react-shared-contexts": "^9.9.2", - "@fluentui/react-tabster": "^9.13.2", + "version": "9.3.51", + "resolved": "https://registry.npmjs.org/@fluentui/react-tabs/-/react-tabs-9.3.51.tgz", + "integrity": "sha512-+oQeZSoIuWSZ79/7VRc4GCjJBTEI6EBHCKCU1JEwGWStRbtRRJPblyq/3sagkHU/Qyz3uas5+Bq7Ll31jI2Big==", + "requires": { + "@fluentui/react-context-selector": "^9.1.40", + "@fluentui/react-jsx-runtime": "^9.0.17", + "@fluentui/react-shared-contexts": "^9.10.0", + "@fluentui/react-tabster": "^9.13.6", "@fluentui/react-theme": "^9.1.14", - "@fluentui/react-utilities": "^9.13.5", + "@fluentui/react-utilities": "^9.15.0", "@griffel/react": "^1.5.14", "@swc/helpers": "^0.5.1" - }, - "dependencies": { - "@swc/helpers": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", - "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", - "requires": { - "tslib": "^2.4.0" - } - } } }, "@fluentui/react-tabster": { - "version": "9.13.2", - "resolved": "https://registry.npmjs.org/@fluentui/react-tabster/-/react-tabster-9.13.2.tgz", - "integrity": "sha512-ooh4WGI3CL4shLeGGIS4g7eCVXnPPTBDITpZMZlwXq/JExetwpGTniCHSmWtlPnTcOFIpzdHVOS9ubJWH66GBQ==", + "version": "9.13.6", + "resolved": "https://registry.npmjs.org/@fluentui/react-tabster/-/react-tabster-9.13.6.tgz", + "integrity": "sha512-NjSFil+JfGSC92upv/FIjSzvfoOn/Lh87hABCR+5FN/bQIyAduB/293qOztV63KLaEdrqC3yJyQbPV2Nz4DwQg==", "requires": { - "@fluentui/react-shared-contexts": "^9.9.2", + "@fluentui/react-shared-contexts": "^9.10.0", "@fluentui/react-theme": "^9.1.14", - "@fluentui/react-utilities": "^9.13.5", + "@fluentui/react-utilities": "^9.15.0", "@griffel/react": "^1.5.14", "@swc/helpers": "^0.5.1", "keyborg": "^2.0.0", "tabster": "^4.7.0" - }, - "dependencies": { - "@swc/helpers": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", - "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", - "requires": { - "tslib": "^2.4.0" - } - } + } + }, + "@fluentui/react-tags": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/@fluentui/react-tags/-/react-tags-9.0.4.tgz", + "integrity": "sha512-tgS2/u6rCzFWCovvev6Ey1OiH1dSi756rVvWTJyCEha3PPqXahmbs3EL+60npiIEur89nAA/aEVbSFbMDqwV5g==", + "requires": { + "@fluentui/keyboard-keys": "^9.0.6", + "@fluentui/react-aria": "^9.3.42", + "@fluentui/react-avatar": "^9.5.40", + "@fluentui/react-icons": "^2.0.217", + "@fluentui/react-jsx-runtime": "^9.0.17", + "@fluentui/react-shared-contexts": "^9.10.0", + "@fluentui/react-tabster": "^9.13.6", + "@fluentui/react-theme": "^9.1.14", + "@fluentui/react-utilities": "^9.15.0", + "@griffel/react": "^1.5.14", + "@swc/helpers": "^0.5.1" } }, "@fluentui/react-text": { - "version": "9.3.37", - "resolved": "https://registry.npmjs.org/@fluentui/react-text/-/react-text-9.3.37.tgz", - "integrity": "sha512-4ibOuYc1zx+YBoCLn5bjCpcjz+GGlKigvFcohefFd2+wVUbrwK4rT1yEOvKqVsoQRLTMXjc3kivx9qlpUaG/5A==", + "version": "9.3.42", + "resolved": "https://registry.npmjs.org/@fluentui/react-text/-/react-text-9.3.42.tgz", + "integrity": "sha512-PxBsOh6Bk10FpKUhcTN3PnAGh3uIK6gRSKWuzT+h23A/RTZP5UrCmGLaxPMJXFm9cltWRiwqfC4AMiBYF1RLZg==", "requires": { - "@fluentui/react-jsx-runtime": "^9.0.12", - "@fluentui/react-shared-contexts": "^9.9.2", + "@fluentui/react-jsx-runtime": "^9.0.17", + "@fluentui/react-shared-contexts": "^9.10.0", "@fluentui/react-theme": "^9.1.14", - "@fluentui/react-utilities": "^9.13.5", + "@fluentui/react-utilities": "^9.15.0", "@griffel/react": "^1.5.14", "@swc/helpers": "^0.5.1" - }, - "dependencies": { - "@swc/helpers": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", - "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", - "requires": { - "tslib": "^2.4.0" - } - } } }, "@fluentui/react-textarea": { - "version": "9.3.42", - "resolved": "https://registry.npmjs.org/@fluentui/react-textarea/-/react-textarea-9.3.42.tgz", - "integrity": "sha512-wJh+HaH+odfnC1kTqB63lktXnVHbhDvA/ejhfUntPfVt56vhmmYjdA0M2BNFu/5SVh4mVBdmt1iU1+KslcEozg==", + "version": "9.3.47", + "resolved": "https://registry.npmjs.org/@fluentui/react-textarea/-/react-textarea-9.3.47.tgz", + "integrity": "sha512-ebC9u8Swl7ajUTm55WG6k6QqXvaoPFTGqdagtXLSEPQ0Dt7otqKnQh39jS4SmGVmRT4Oh4LGnuh7Fe6aJW/rvw==", "requires": { - "@fluentui/react-field": "^9.1.32", - "@fluentui/react-jsx-runtime": "^9.0.12", - "@fluentui/react-shared-contexts": "^9.9.2", + "@fluentui/react-field": "^9.1.37", + "@fluentui/react-jsx-runtime": "^9.0.17", + "@fluentui/react-shared-contexts": "^9.10.0", "@fluentui/react-theme": "^9.1.14", - "@fluentui/react-utilities": "^9.13.5", + "@fluentui/react-utilities": "^9.15.0", "@griffel/react": "^1.5.14", "@swc/helpers": "^0.5.1" - }, - "dependencies": { - "@swc/helpers": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", - "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", - "requires": { - "tslib": "^2.4.0" - } - } } }, "@fluentui/react-theme": { @@ -5322,172 +4576,101 @@ "requires": { "@fluentui/tokens": "1.0.0-alpha.11", "@swc/helpers": "^0.5.1" - }, - "dependencies": { - "@swc/helpers": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", - "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", - "requires": { - "tslib": "^2.4.0" - } - } } }, "@fluentui/react-toast": { - "version": "9.3.6", - "resolved": "https://registry.npmjs.org/@fluentui/react-toast/-/react-toast-9.3.6.tgz", - "integrity": "sha512-3Of3BG1a6fTMJ4OdPAhlNezjdN9xiTat0u7+ZvqapyiXSKJNqG5IccZsQ7svb42+4LtVKJgENULsBvplmYoxSw==", + "version": "9.3.11", + "resolved": "https://registry.npmjs.org/@fluentui/react-toast/-/react-toast-9.3.11.tgz", + "integrity": "sha512-fIFMQMDcekgMpX3+f934cyrFNJ8vF4/k8CxK6vvWzE3B8z+2zLKwHye5dYFKoeG4c8o4c9CAHWjiAP/R3fENOA==", "requires": { "@fluentui/keyboard-keys": "^9.0.6", - "@fluentui/react-aria": "^9.3.38", + "@fluentui/react-aria": "^9.3.42", "@fluentui/react-icons": "^2.0.217", - "@fluentui/react-jsx-runtime": "^9.0.12", - "@fluentui/react-portal": "^9.3.19", - "@fluentui/react-shared-contexts": "^9.9.2", - "@fluentui/react-tabster": "^9.13.2", + "@fluentui/react-jsx-runtime": "^9.0.17", + "@fluentui/react-portal": "^9.3.23", + "@fluentui/react-shared-contexts": "^9.10.0", + "@fluentui/react-tabster": "^9.13.6", "@fluentui/react-theme": "^9.1.14", - "@fluentui/react-utilities": "^9.13.5", + "@fluentui/react-utilities": "^9.15.0", "@griffel/react": "^1.5.14", "@swc/helpers": "^0.5.1", "react-transition-group": "^4.4.1" - }, - "dependencies": { - "@swc/helpers": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", - "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", - "requires": { - "tslib": "^2.4.0" - } - } } }, "@fluentui/react-toolbar": { - "version": "9.1.45", - "resolved": "https://registry.npmjs.org/@fluentui/react-toolbar/-/react-toolbar-9.1.45.tgz", - "integrity": "sha512-G9A0h1TgPn3OfpYYG9AU5+Ej/OTZw5FcC1ouLjZNWCL5NhQgMnh4He5C/vJwLrC8fAQJXWcss7xzTNi+/vfsrQ==", - "requires": { - "@fluentui/react-button": "^9.3.44", - "@fluentui/react-context-selector": "^9.1.36", - "@fluentui/react-divider": "^9.2.40", - "@fluentui/react-jsx-runtime": "^9.0.12", - "@fluentui/react-radio": "^9.1.45", - "@fluentui/react-shared-contexts": "^9.9.2", - "@fluentui/react-tabster": "^9.13.2", + "version": "9.1.50", + "resolved": "https://registry.npmjs.org/@fluentui/react-toolbar/-/react-toolbar-9.1.50.tgz", + "integrity": "sha512-/3TSImj6YLHf0nNRODdE53allFOoOwiHesp4+El7CUvRey6EoDXATbPCVC4jcsB62bIKif4DqVPsCGrdmJIs8Q==", + "requires": { + "@fluentui/react-button": "^9.3.49", + "@fluentui/react-context-selector": "^9.1.40", + "@fluentui/react-divider": "^9.2.45", + "@fluentui/react-jsx-runtime": "^9.0.17", + "@fluentui/react-radio": "^9.1.50", + "@fluentui/react-shared-contexts": "^9.10.0", + "@fluentui/react-tabster": "^9.13.6", "@fluentui/react-theme": "^9.1.14", - "@fluentui/react-utilities": "^9.13.5", + "@fluentui/react-utilities": "^9.15.0", "@griffel/react": "^1.5.14", "@swc/helpers": "^0.5.1" - }, - "dependencies": { - "@swc/helpers": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", - "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", - "requires": { - "tslib": "^2.4.0" - } - } } }, "@fluentui/react-tooltip": { - "version": "9.3.11", - "resolved": "https://registry.npmjs.org/@fluentui/react-tooltip/-/react-tooltip-9.3.11.tgz", - "integrity": "sha512-GZd8qGrOZ4CAD+P0UGLdqEazViDePhYhabgyL6oFLlwz3T6dPFaJWdvS0njCznc4pHuaEW/+vAJ6O7VJCnk7wA==", + "version": "9.3.16", + "resolved": "https://registry.npmjs.org/@fluentui/react-tooltip/-/react-tooltip-9.3.16.tgz", + "integrity": "sha512-dFk2uq1QWk4pI3+FrJdZ1jFg1tnIUT3Zu70rsUHzIfnE/HDDSQ014baCbNJJpYblSdEad6FLyw42zEAO+gwvmA==", "requires": { "@fluentui/keyboard-keys": "^9.0.6", - "@fluentui/react-jsx-runtime": "^9.0.12", - "@fluentui/react-portal": "^9.3.19", - "@fluentui/react-positioning": "^9.9.16", - "@fluentui/react-shared-contexts": "^9.9.2", + "@fluentui/react-jsx-runtime": "^9.0.17", + "@fluentui/react-portal": "^9.3.23", + "@fluentui/react-positioning": "^9.9.20", + "@fluentui/react-shared-contexts": "^9.10.0", "@fluentui/react-theme": "^9.1.14", - "@fluentui/react-utilities": "^9.13.5", + "@fluentui/react-utilities": "^9.15.0", "@griffel/react": "^1.5.14", "@swc/helpers": "^0.5.1" - }, - "dependencies": { - "@swc/helpers": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", - "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", - "requires": { - "tslib": "^2.4.0" - } - } } }, "@fluentui/react-tree": { - "version": "9.4.0", - "resolved": "https://registry.npmjs.org/@fluentui/react-tree/-/react-tree-9.4.0.tgz", - "integrity": "sha512-XFzvtBzwimmwh88iN79C43IFRNE0NbJ8gnFdyOCoQ/rjVib2RxHtnOZtww2DroOdWZtRyXYRiymmogoQdYV0pg==", + "version": "9.4.5", + "resolved": "https://registry.npmjs.org/@fluentui/react-tree/-/react-tree-9.4.5.tgz", + "integrity": "sha512-awIJG252HwzyYLKidw8OKZWZOMW1S6ytiaQuK8cd029FO4CUTCkiXmWkg8Fxs6isQhcmaUTsuBvlBD5MYXCdww==", "requires": { "@fluentui/keyboard-keys": "^9.0.6", - "@fluentui/react-aria": "^9.3.38", - "@fluentui/react-avatar": "^9.5.35", - "@fluentui/react-button": "^9.3.44", - "@fluentui/react-checkbox": "^9.1.45", - "@fluentui/react-context-selector": "^9.1.36", + "@fluentui/react-aria": "^9.3.42", + "@fluentui/react-avatar": "^9.5.40", + "@fluentui/react-button": "^9.3.49", + "@fluentui/react-checkbox": "^9.1.50", + "@fluentui/react-context-selector": "^9.1.40", "@fluentui/react-icons": "^2.0.217", - "@fluentui/react-jsx-runtime": "^9.0.12", - "@fluentui/react-portal": "^9.3.19", - "@fluentui/react-radio": "^9.1.45", - "@fluentui/react-shared-contexts": "^9.9.2", - "@fluentui/react-tabster": "^9.13.2", + "@fluentui/react-jsx-runtime": "^9.0.17", + "@fluentui/react-radio": "^9.1.50", + "@fluentui/react-shared-contexts": "^9.10.0", + "@fluentui/react-tabster": "^9.13.6", "@fluentui/react-theme": "^9.1.14", - "@fluentui/react-utilities": "^9.13.5", + "@fluentui/react-utilities": "^9.15.0", "@griffel/react": "^1.5.14", "@swc/helpers": "^0.5.1" - }, - "dependencies": { - "@swc/helpers": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", - "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", - "requires": { - "tslib": "^2.4.0" - } - } } }, "@fluentui/react-utilities": { - "version": "9.13.5", - "resolved": "https://registry.npmjs.org/@fluentui/react-utilities/-/react-utilities-9.13.5.tgz", - "integrity": "sha512-WDwBfX0IYZcZAyrSKdCpc/vAXHXLPX8lYZ9yHCI68cJXJKyeupOidK+sCrdZnwgtNMV8Qyl8CwIeaWdbcfi14g==", + "version": "9.15.0", + "resolved": "https://registry.npmjs.org/@fluentui/react-utilities/-/react-utilities-9.15.0.tgz", + "integrity": "sha512-kWuWKN8Ygd3HMlkSBmgZjvVC/jbOpnNC916sTPKCRv9ZYUwfkViV3UCeTNonRjzAhI8g+o+sP9/XQxp6QN5C5Q==", "requires": { "@fluentui/keyboard-keys": "^9.0.6", "@swc/helpers": "^0.5.1" - }, - "dependencies": { - "@swc/helpers": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", - "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", - "requires": { - "tslib": "^2.4.0" - } - } } }, "@fluentui/react-virtualizer": { - "version": "9.0.0-alpha.46", - "resolved": "https://registry.npmjs.org/@fluentui/react-virtualizer/-/react-virtualizer-9.0.0-alpha.46.tgz", - "integrity": "sha512-mpU4Wj3XtKvAgbfteicfXUgmJEHAuvuIM4/lPPGkOMzeiPByFUmJT3+CB96SreDjhDS9K3Psoa2PlPDAWzxOyg==", + "version": "9.0.0-alpha.51", + "resolved": "https://registry.npmjs.org/@fluentui/react-virtualizer/-/react-virtualizer-9.0.0-alpha.51.tgz", + "integrity": "sha512-1DhsNUovlp3fvZAsJAKINyDweUOsLR83gu7Pu00PmIHb5Y32gmsMm5CkGddMsrWiPB6duKuhDAkTjHI6VV/23w==", "requires": { - "@fluentui/react-jsx-runtime": "^9.0.12", - "@fluentui/react-utilities": "^9.13.5", + "@fluentui/react-jsx-runtime": "^9.0.17", + "@fluentui/react-utilities": "^9.15.0", "@griffel/react": "^1.5.14", "@swc/helpers": "^0.5.1" - }, - "dependencies": { - "@swc/helpers": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", - "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", - "requires": { - "tslib": "^2.4.0" - } - } } }, "@fluentui/react-window-provider": { @@ -5508,26 +4691,26 @@ } }, "@fluentui/style-utilities": { - "version": "8.9.16", - "resolved": "https://registry.npmjs.org/@fluentui/style-utilities/-/style-utilities-8.9.16.tgz", - "integrity": "sha512-8hS5HscCFYvcWjAdk37frPZJZthr7f/cu5db7gjrPy+DEhf13WAZRHsropWm17+8GhJhvKt98BQf/Kzxtt34Eg==", + "version": "8.9.18", + "resolved": "https://registry.npmjs.org/@fluentui/style-utilities/-/style-utilities-8.9.18.tgz", + "integrity": "sha512-bWRcN8q2JDLZJOxJ3ov+2MLP+XqK3tHMGyLWjDAkUYUzgsM3ppA0HAroo/MLkn8vrFcoUYCuL/jtv7IXR6SZBw==", "requires": { "@fluentui/merge-styles": "^8.5.12", "@fluentui/set-version": "^8.2.11", - "@fluentui/theme": "^2.6.34", - "@fluentui/utilities": "^8.13.18", + "@fluentui/theme": "^2.6.36", + "@fluentui/utilities": "^8.13.19", "@microsoft/load-themed-styles": "^1.10.26", "tslib": "^2.1.0" } }, "@fluentui/theme": { - "version": "2.6.34", - "resolved": "https://registry.npmjs.org/@fluentui/theme/-/theme-2.6.34.tgz", - "integrity": "sha512-2Ssi3sX2snnbPJ4PmxbpCDCGePRE36tvGj2qKgdKiSh/fPVsg1b+Q50YlpFl9sXmbhl1uFmxjAx6WPsVGTl7vQ==", + "version": "2.6.36", + "resolved": "https://registry.npmjs.org/@fluentui/theme/-/theme-2.6.36.tgz", + "integrity": "sha512-rSP+LNmOJ9woiZzicdgtKFHt8Tyq7Jqu4KpczW0zXOYR9orgwFecpiUwRpZs1zD6lb3pAUNw4oYrM1tc7FH5AA==", "requires": { "@fluentui/merge-styles": "^8.5.12", "@fluentui/set-version": "^8.2.11", - "@fluentui/utilities": "^8.13.18", + "@fluentui/utilities": "^8.13.19", "tslib": "^2.1.0" } }, @@ -5537,22 +4720,12 @@ "integrity": "sha512-kHKR1/JIGcBXA0qr+MyNg8KQZL4RLJXlhaSV6yNn50rJ0kTdQHUCKbbficvNZoeQBj3x0A8/WgAbPmfppZo0Zg==", "requires": { "@swc/helpers": "^0.5.1" - }, - "dependencies": { - "@swc/helpers": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", - "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", - "requires": { - "tslib": "^2.4.0" - } - } } }, "@fluentui/utilities": { - "version": "8.13.18", - "resolved": "https://registry.npmjs.org/@fluentui/utilities/-/utilities-8.13.18.tgz", - "integrity": "sha512-/0rX9EzltLKwU1SS14VV7agWoOzruVTU3oagZq1QgFAvoj8qi7fNqvSX/VEeRy+0gmbsCkrEViUPkmC7drKzPg==", + "version": "8.13.19", + "resolved": "https://registry.npmjs.org/@fluentui/utilities/-/utilities-8.13.19.tgz", + "integrity": "sha512-v0WNV6NNQKi9nLttvc6btzxX3XOVRA817fZ7zBqsV6JWQGRfyrBwhskh6TUIgANJjPejz5nk05U6rvSWNUM+FQ==", "requires": { "@fluentui/dom-utilities": "^2.2.11", "@fluentui/merge-styles": "^8.5.12", @@ -5642,12 +4815,6 @@ "resolved": "https://registry.npmjs.org/@microsoft/load-themed-styles/-/load-themed-styles-1.10.295.tgz", "integrity": "sha512-W+IzEBw8a6LOOfRJM02dTT7BDZijxm+Z7lhtOAz1+y9vQm1Kdz9jlAO+qCEKsfxtUOmKilW8DIRqFw2aUgKeGg==" }, - "@nicolo-ribaudo/semver-v6": { - "version": "6.3.3", - "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/semver-v6/-/semver-v6-6.3.3.tgz", - "integrity": "sha512-3Yc1fUTs69MG/uZbJlLSI3JISMn2UV2rg+1D/vROUqZyh3l6iYHCs7GMp+M40ZD7yOdDbYjJcU1oTJhrc+dGKg==", - "dev": true - }, "@react-spring/animated": { "version": "9.7.3", "resolved": "https://registry.npmjs.org/@react-spring/animated/-/animated-9.7.3.tgz", @@ -5716,13 +4883,54 @@ } }, "@swc/helpers": { - "version": "0.4.14", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.4.14.tgz", - "integrity": "sha512-4C7nX/dvpzB7za4Ql9K81xK3HPxCpHMgwTZVyf+9JQ6VUbn9jjZVN7/Nkdz/Ugzs2CSjqnL/UPXroiVBVHUWUw==", + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.3.tgz", + "integrity": "sha512-FaruWX6KdudYloq1AHD/4nU+UsMTdNE8CKyrseXWEcgjDAbvkwJg2QGPAnfIJLIWsjZOSPLOAykK6fuYp4vp4A==", "requires": { "tslib": "^2.4.0" } }, + "@types/babel__core": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.2.tgz", + "integrity": "sha512-pNpr1T1xLUc2l3xJKuPtsEky3ybxN3m4fJkknfIpTCTfIZCDW57oAg+EfCgIIp2rvCe0Wn++/FfodDS4YXxBwA==", + "dev": true, + "requires": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "@types/babel__generator": { + "version": "7.6.5", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.5.tgz", + "integrity": "sha512-h9yIuWbJKdOPLJTbmSpPzkF67e659PbQDba7ifWm5BJ8xTv+sDmS7rFmywkWOvXedGTivCdeGSIIX8WLcRTz8w==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@types/babel__template": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.2.tgz", + "integrity": "sha512-/AVzPICMhMOMYoSx9MoKpGDKdBRsIXMNByh1PXSZoa+v6ZoLa8xxtsT/uLQ/NJm0XVAWl/BvId4MlDeXJaeIZQ==", + "dev": true, + "requires": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@types/babel__traverse": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.2.tgz", + "integrity": "sha512-ojlGK1Hsfce93J0+kn3H5R73elidKUaZonirN33GSmgTUMpzI/MIFfSpF3haANe3G1bEBS9/9/QEqwTzwqFsKw==", + "dev": true, + "requires": { + "@babel/types": "^7.20.7" + } + }, "@types/dompurify": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@types/dompurify/-/dompurify-3.0.3.tgz", @@ -5743,9 +4951,9 @@ "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==" }, "@types/react": { - "version": "18.2.14", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.14.tgz", - "integrity": "sha512-A0zjq+QN/O0Kpe30hA1GidzyFjatVvrpIvWLxD+xv67Vt91TWWgco9IvrJBkeyHm1trGaFS/FSGqPlhyeZRm0g==", + "version": "18.2.28", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.28.tgz", + "integrity": "sha512-ad4aa/RaaJS3hyGz0BGegdnSRXQBkd1CCYDCdNjBPg90UUpLgo+WlJqb9fMYUxtehmzF3PJaTWqRZjko6BRzBg==", "requires": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -5753,9 +4961,9 @@ } }, "@types/react-dom": { - "version": "18.2.8", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.8.tgz", - "integrity": "sha512-bAIvO5lN/U8sPGvs1Xm61rlRHHaq5rp5N3kp9C+NJ/Q41P8iqjkXSu0+/qu8POsjH9pNWb0OYabFez7taP7omw==", + "version": "18.2.13", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.13.tgz", + "integrity": "sha512-eJIUv7rPP+EC45uNYp/ThhSpE16k22VJUknt5OLoH9tbXoi8bMhwLf5xRuWMywamNbWzhrSmU7IBJfPup1+3fw==", "requires": { "@types/react": "*" } @@ -5772,14 +4980,15 @@ "dev": true }, "@vitejs/plugin-react": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.0.2.tgz", - "integrity": "sha512-zbnVp3Esfg33zDaoLrjxG+p/dPiOtpvJA+1oOEQwSxMMTRL9zi1eghIcd2WtLjkcKnPsa3S15LzS/OzDn2BOCA==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.1.0.tgz", + "integrity": "sha512-rM0SqazU9iqPUraQ2JlIvReeaxOoRj6n+PzB1C0cBzIbd8qP336nC39/R9yPi3wVcah7E7j/kdU1uCUqMEU4OQ==", "dev": true, "requires": { - "@babel/core": "^7.22.5", + "@babel/core": "^7.22.20", "@babel/plugin-transform-react-jsx-self": "^7.22.5", "@babel/plugin-transform-react-jsx-source": "^7.22.5", + "@types/babel__core": "^7.20.2", "react-refresh": "^0.14.0" } }, @@ -5793,21 +5002,21 @@ } }, "browserslist": { - "version": "4.21.9", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.9.tgz", - "integrity": "sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==", + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.1.tgz", + "integrity": "sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001503", - "electron-to-chromium": "^1.4.431", - "node-releases": "^2.0.12", - "update-browserslist-db": "^1.0.11" + "caniuse-lite": "^1.0.30001541", + "electron-to-chromium": "^1.4.535", + "node-releases": "^2.0.13", + "update-browserslist-db": "^1.0.13" } }, "caniuse-lite": { - "version": "1.0.30001513", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001513.tgz", - "integrity": "sha512-pnjGJo7SOOjAGytZZ203Em95MRM8Cr6jhCXNF/FAXTpCTRTECnqQWLpiTRqrFtdYcth8hf4WECUpkezuYsMVww==", + "version": "1.0.30001547", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001547.tgz", + "integrity": "sha512-W7CrtIModMAxobGhz8iXmDfuJiiKg1WADMO/9x7/CLNin5cpSbuBjooyoIUVB5eyCc36QuTVlkVa1iB2S5+/eA==", "dev": true }, "chalk": { @@ -5837,9 +5046,9 @@ "dev": true }, "convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", "dev": true }, "csstype": { @@ -5871,9 +5080,9 @@ "integrity": "sha512-ilkD8YEnnGh1zJ240uJsW7AzE+2qpbOUYjacomn3AvJ6J4JhKGSZ2nh4wUIXPZrEPppaCLx5jFe8T89Rk8tQ7w==" }, "electron-to-chromium": { - "version": "1.4.454", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.454.tgz", - "integrity": "sha512-pmf1rbAStw8UEQ0sr2cdJtWl48ZMuPD9Sto8HVQOq9vx9j2WgDEN6lYoaqFvqEHYOmGA9oRGn7LqWI9ta0YugQ==", + "version": "1.4.549", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.549.tgz", + "integrity": "sha512-gpXfJslSi4hYDkA0mTLEpYKRv9siAgSUgZ+UWyk+J5Cttpd1ThCVwdclzIwQSclz3hYn049+M2fgrP1WpvF8xg==", "dev": true }, "esbuild": { @@ -5986,9 +5195,9 @@ "dev": true }, "keyborg": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/keyborg/-/keyborg-2.0.0.tgz", - "integrity": "sha512-RWY8nWrzRkwTQLaKyDtbTu5SOb5L4B20UzAsBHlQDFZqVY/+Mid0bQ7MVTC8vbOTrWY2xkkzj8gZF9Ua7re4xA==" + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/keyborg/-/keyborg-2.1.0.tgz", + "integrity": "sha512-0+v3/GIYG6gClwBOXrHet31n1UJW49xbKgVPUu6we41aq9tAmMosVXEdctZxsQdebyxtrcxVTkvHjBD1XPOHwg==" }, "loose-envify": { "version": "1.4.0", @@ -6076,6 +5285,13 @@ "loose-envify": "^1.4.0", "object-assign": "^4.1.1", "react-is": "^16.13.1" + }, + "dependencies": { + "react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + } } }, "react": { @@ -6106,9 +5322,9 @@ } }, "react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" }, "react-refresh": { "version": "0.14.0", @@ -6160,9 +5376,9 @@ } }, "rollup": { - "version": "3.26.2", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.26.2.tgz", - "integrity": "sha512-6umBIGVz93er97pMgQO08LuH3m6PUb3jlDUUGFsNJB6VgTCUaDFpupf5JfU30529m/UKOgmiX+uY6Sx8cOYpLA==", + "version": "3.29.4", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.4.tgz", + "integrity": "sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==", "requires": { "fsevents": "~2.3.2" } @@ -6179,12 +5395,17 @@ "version": "0.20.2", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", - "peer": true, "requires": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1" } }, + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true + }, "source-map-js": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", @@ -6211,9 +5432,9 @@ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" }, "tabster": { - "version": "4.7.3", - "resolved": "https://registry.npmjs.org/tabster/-/tabster-4.7.3.tgz", - "integrity": "sha512-z34vfwtYefjk/rAnhf/2sd1EuYbefF6jR4cqUAx5bjwXwWsMaM7139/yUXreaiRxbySQqqL59pQaodzA8uPYBA==", + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/tabster/-/tabster-4.8.0.tgz", + "integrity": "sha512-R1ib3x0Rd+iepvrzXdEkd2Qa2O5dV7jaZtR4BhkhE9sBYMolbVc6EgHGTHBQvdXQBdU8I2MXCMn0c6jarJb+GA==", "requires": { "keyborg": "^2.0.0", "tslib": "^2.3.1" @@ -6231,14 +5452,14 @@ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==" }, "typescript": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", - "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==" + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", + "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==" }, "update-browserslist-db": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", - "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", "dev": true, "requires": { "escalade": "^3.1.1", @@ -6252,15 +5473,15 @@ "requires": {} }, "vite": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/vite/-/vite-4.4.2.tgz", - "integrity": "sha512-zUcsJN+UvdSyHhYa277UHhiJ3iq4hUBwHavOpsNUGsTgjBeoBlK8eDt+iT09pBq0h9/knhG/SPrZiM7cGmg7NA==", + "version": "4.4.11", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.4.11.tgz", + "integrity": "sha512-ksNZJlkcU9b0lBwAGZGGaZHCMqHsc8OpgtoYhsQ4/I2v5cnpmmmqe5pM4nv/4Hn6G/2GhTdj0DhZh2e+Er1q5A==", "dev": true, "requires": { "esbuild": "^0.18.10", "fsevents": "~2.3.2", - "postcss": "^8.4.24", - "rollup": "^3.25.2" + "postcss": "^8.4.27", + "rollup": "^3.27.1" } }, "yallist": { diff --git a/app/frontend/package.json b/app/frontend/package.json index 644d4e7a39..d5b90fff11 100644 --- a/app/frontend/package.json +++ b/app/frontend/package.json @@ -9,28 +9,29 @@ "scripts": { "dev": "vite", "build": "tsc && vite build", - "watch": "tsc && vite build --watch" + "preview": "vite preview" }, "dependencies": { "@azure/msal-react": "^2.0.4", "@azure/msal-browser": "^3.1.0", - "@fluentui/react": "^8.110.7", - "@fluentui/react-components": "^9.33.0", - "@fluentui/react-icons": "^2.0.206", + "@fluentui/react": "^8.112.3", + "@fluentui/react-components": "^9.35.0", + "@fluentui/react-icons": "^2.0.220", "@react-spring/web": "^9.7.3", "dompurify": "^3.0.6", "react": "^18.2.0", "react-dom": "^18.2.0", "react-router-dom": "^6.16.0", - "ndjson-readablestream": "^1.0.7" + "ndjson-readablestream": "^1.0.7", + "scheduler": "^0.20.2" }, "devDependencies": { "@types/dompurify": "^3.0.3", - "@types/react": "^18.2.14", - "@types/react-dom": "^18.2.8", - "@vitejs/plugin-react": "^4.0.2", + "@types/react": "^18.2.28", + "@types/react-dom": "^18.2.13", + "@vitejs/plugin-react": "^4.1.0", "prettier": "^3.0.3", - "typescript": "^5.1.6", - "vite": "^4.4.2" + "typescript": "^5.2.2", + "vite": "^4.4.11" } } diff --git a/app/frontend/src/api/api.ts b/app/frontend/src/api/api.ts index 2e61ac506c..f2fe0480ea 100644 --- a/app/frontend/src/api/api.ts +++ b/app/frontend/src/api/api.ts @@ -1,45 +1,27 @@ const BACKEND_URI = ""; -import { AskRequest, ChatAppResponse, ChatAppResponseOrError, ChatRequest } from "./models"; +import { ChatAppResponse, ChatAppResponseOrError, ChatAppRequest } from "./models"; import { useLogin } from "../authConfig"; function getHeaders(idToken: string | undefined): Record { - var headers : Record = { + var headers: Record = { "Content-Type": "application/json" }; // If using login, add the id token of the logged in account as the authorization if (useLogin) { if (idToken) { - headers["Authorization"] = `Bearer ${idToken}` + headers["Authorization"] = `Bearer ${idToken}`; } } return headers; } -export async function askApi(options: AskRequest): Promise { +export async function askApi(request: ChatAppRequest, idToken: string | undefined): Promise { const response = await fetch(`${BACKEND_URI}/ask`, { method: "POST", - headers: getHeaders(options.idToken), - body: JSON.stringify({ - question: options.question, - overrides: { - retrieval_mode: options.overrides?.retrievalMode, - semantic_ranker: options.overrides?.semanticRanker, - semantic_captions: options.overrides?.semanticCaptions, - top: options.overrides?.top, - temperature: options.overrides?.temperature, - prompt_template: options.overrides?.promptTemplate, - prompt_template_prefix: options.overrides?.promptTemplatePrefix, - prompt_template_suffix: options.overrides?.promptTemplateSuffix, - exclude_category: options.overrides?.excludeCategory, - expect_code_output: options.overrides?.expectcodeoutput, - //latest change - use_oid_security_filter: options.overrides?.useOidSecurityFilter, - use_groups_security_filter: options.overrides?.useGroupsSecurityFilter - //latest change - } - }) + headers: getHeaders(idToken), + body: JSON.stringify(request) }); const parsedResponse: ChatAppResponseOrError = await response.json(); @@ -50,30 +32,11 @@ export async function askApi(options: AskRequest): Promise { return parsedResponse as ChatAppResponse; } -export async function chatApi(options: ChatRequest): Promise { - const url = options.shouldStream ? "chat_stream" : "chat"; - return await fetch(`${BACKEND_URI}/${url}`, { +export async function chatApi(request: ChatAppRequest, idToken: string | undefined): Promise { + return await fetch(`${BACKEND_URI}/chat`, { method: "POST", - headers: getHeaders(options.idToken), - body: JSON.stringify({ - history: options.history, - overrides: { - retrieval_mode: options.overrides?.retrievalMode, - semantic_ranker: options.overrides?.semanticRanker, - semantic_captions: options.overrides?.semanticCaptions, - top: options.overrides?.top, - temperature: options.overrides?.temperature, - prompt_template: options.overrides?.promptTemplate, - prompt_template_prefix: options.overrides?.promptTemplatePrefix, - prompt_template_suffix: options.overrides?.promptTemplateSuffix, - exclude_category: options.overrides?.excludeCategory, - suggest_followup_questions: options.overrides?.suggestFollowupQuestions, - //latest change - expect_code_output: options.overrides?.expectcodeoutput, - use_oid_security_filter: options.overrides?.useOidSecurityFilter, - use_groups_security_filter: options.overrides?.useGroupsSecurityFilter - } - }) + headers: getHeaders(idToken), + body: JSON.stringify(request) }); } diff --git a/app/frontend/src/api/models.ts b/app/frontend/src/api/models.ts index d26c9811c0..d66f23de17 100644 --- a/app/frontend/src/api/models.ts +++ b/app/frontend/src/api/models.ts @@ -4,43 +4,36 @@ export const enum RetrievalMode { Text = "text" } -export type AskRequestOverrides = { - retrievalMode?: RetrievalMode; - semanticRanker?: boolean; - semanticCaptions?: boolean; - excludeCategory?: string; +export type ChatAppRequestOverrides = { + retrieval_mode?: RetrievalMode; + semantic_ranker?: boolean; + semantic_captions?: boolean; + exclude_category?: string; top?: number; temperature?: number; - promptTemplate?: string; - promptTemplatePrefix?: string; - promptTemplateSuffix?: string; - suggestFollowupQuestions?: boolean; -//======= - expectcodeoutput?: boolean; - useOidSecurityFilter?: boolean; - useGroupsSecurityFilter?: boolean; -}; - -export type AskRequest = { - question: string; - overrides?: AskRequestOverrides; - idToken?: string; + prompt_template?: string; + prompt_template_prefix?: string; + prompt_template_suffix?: string; + suggest_followup_questions?: boolean; + use_oid_security_filter?: boolean; + use_groups_security_filter?: boolean; }; export type ResponseMessage = { content: string; role: string; -} +}; -export type ResponseExtraArgs = { +export type ResponseContext = { thoughts: string | null; data_points: string[]; -} +}; export type ResponseChoice = { index: number; message: ResponseMessage; - extra_args: ResponseExtraArgs; + context: ResponseContext; + session_state: any; }; export type ChatAppResponseOrError = { @@ -52,14 +45,13 @@ export type ChatAppResponse = { choices: ResponseChoice[]; }; -export type ChatTurn = { - user: string; - bot?: string; +export type ChatAppRequestContext = { + overrides?: ChatAppRequestOverrides; }; -export type ChatRequest = { - history: ChatTurn[]; - overrides?: AskRequestOverrides; - idToken?: string; - shouldStream?: boolean; +export type ChatAppRequest = { + messages: ResponseMessage[]; + context?: ChatAppRequestContext; + stream?: boolean; + session_state: any; }; diff --git a/app/frontend/src/authConfig.ts b/app/frontend/src/authConfig.ts index e3a96ee0a6..bb4f5cc256 100644 --- a/app/frontend/src/authConfig.ts +++ b/app/frontend/src/authConfig.ts @@ -12,17 +12,17 @@ interface AuthSetup { */ msalConfig: { auth: { - clientId: string, // Client app id used for login - authority: string, // Directory to use for login https://learn.microsoft.com/azure/active-directory/develop/msal-client-application-configuration#authority - redirectUri: string, // Points to window.location.origin. You must register this URI on Azure Portal/App Registration. - postLogoutRedirectUri: string, // Indicates the page to navigate after logout. - navigateToLoginRequestUrl: boolean // If "true", will navigate back to the original request location before processing the auth code response. - }, + clientId: string; // Client app id used for login + authority: string; // Directory to use for login https://learn.microsoft.com/azure/active-directory/develop/msal-client-application-configuration#authority + redirectUri: string; // Points to window.location.origin. You must register this URI on Azure Portal/App Registration. + postLogoutRedirectUri: string; // Indicates the page to navigate after logout. + navigateToLoginRequestUrl: boolean; // If "true", will navigate back to the original request location before processing the auth code response. + }; cache: { - cacheLocation: string, // Configures cache location. "sessionStorage" is more secure, but "localStorage" gives you SSO between tabs. - storeAuthStateInCookie: boolean // Set this to "true" if you are having issues on IE11 or Edge - } - }, + cacheLocation: string; // Configures cache location. "sessionStorage" is more secure, but "localStorage" gives you SSO between tabs. + storeAuthStateInCookie: boolean; // Set this to "true" if you are having issues on IE11 or Edge + }; + }; loginRequest: { /** * Scopes you add here will be prompted for user consent during sign-in. @@ -30,16 +30,16 @@ interface AuthSetup { * For more information about OIDC scopes, visit: * https://docs.microsoft.com/azure/active-directory/develop/v2-permissions-and-consent#openid-connect-scopes */ - scopes: Array - }, + scopes: Array; + }; tokenRequest: { - scopes: Array - } + scopes: Array; + }; } // Fetch the auth setup JSON data from the API if not already cached async function fetchAuthSetup(): Promise { - const response = await fetch('/auth_setup'); + const response = await fetch("/auth_setup"); if (!response.ok) { throw new Error(`auth setup response was not ok: ${response.status}`); } @@ -67,15 +67,21 @@ export const loginRequest = authSetup.loginRequest; const tokenRequest = authSetup.tokenRequest; +// Build an absolute redirect URI using the current window's location and the relative redirect URI from auth setup +export const getRedirectUri = () => { + return window.location.origin + authSetup.msalConfig.auth.redirectUri; +}; + // Get an access token for use with the API server. // ID token received when logging in may not be used for this purpose because it has the incorrect audience export const getToken = (client: IPublicClientApplication): Promise => { - return client.acquireTokenSilent({ - ...tokenRequest, - redirectUri: authSetup.msalConfig.auth.redirectUri - }) - .catch((error) => { - console.log(error); - return undefined; - }) -} + return client + .acquireTokenSilent({ + ...tokenRequest, + redirectUri: getRedirectUri() + }) + .catch(error => { + console.log(error); + return undefined; + }); +}; diff --git a/app/frontend/src/components/AnalysisPanel/AnalysisPanel.tsx b/app/frontend/src/components/AnalysisPanel/AnalysisPanel.tsx index 8f54582c6c..4b99a41d20 100644 --- a/app/frontend/src/components/AnalysisPanel/AnalysisPanel.tsx +++ b/app/frontend/src/components/AnalysisPanel/AnalysisPanel.tsx @@ -19,11 +19,11 @@ interface Props { const pivotItemDisabledStyle = { disabled: true, style: { color: "grey" } }; export const AnalysisPanel = ({ answer, activeTab, activeCitation, citationHeight, className, onActiveTabChanged }: Props) => { - const isDisabledThoughtProcessTab: boolean = !answer.choices[0].extra_args.thoughts; - const isDisabledSupportingContentTab: boolean = !answer.choices[0].extra_args.data_points.length; + const isDisabledThoughtProcessTab: boolean = !answer.choices[0].context.thoughts; + const isDisabledSupportingContentTab: boolean = !answer.choices[0].context.data_points.length; const isDisabledCitationTab: boolean = !activeCitation; - const sanitizedThoughts = DOMPurify.sanitize(answer.choices[0].extra_args.thoughts!); + const sanitizedThoughts = DOMPurify.sanitize(answer.choices[0].context.thoughts!); return ( - + { const messageContent = answer.choices[0].message.content; - const parsedAnswer = useMemo(() => parseAnswerToHtml(messageContent, isStreaming, onCitationClicked ), [answer]); + const parsedAnswer = useMemo(() => parseAnswerToHtml(messageContent, isStreaming, onCitationClicked), [answer]); const sanitizedAnswerHtml = DOMPurify.sanitize(parsedAnswer.answerHtml); @@ -46,7 +46,7 @@ export const Answer = ({ title="Show thought process" ariaLabel="Show thought process" onClick={() => onThoughtProcessClicked()} - disabled={!answer.choices[0].extra_args.thoughts?.length} + disabled={!answer.choices[0].context.thoughts?.length} /> onSupportingContentClicked()} - disabled={!answer.choices[0].extra_args.data_points?.length} + disabled={!answer.choices[0].context.data_points?.length} /> diff --git a/app/frontend/src/components/Answer/AnswerParser.tsx b/app/frontend/src/components/Answer/AnswerParser.tsx index 984216df2e..bf09a614e0 100644 --- a/app/frontend/src/components/Answer/AnswerParser.tsx +++ b/app/frontend/src/components/Answer/AnswerParser.tsx @@ -21,19 +21,19 @@ export function parseAnswerToHtml(answer: string, isStreaming: boolean, onCitati parsedAnswer = parsedAnswer.trim(); // Omit a citation that is still being typed during streaming - if (isStreaming){ + if (isStreaming) { let lastIndex = parsedAnswer.length; for (let i = parsedAnswer.length - 1; i >= 0; i--) { - if (parsedAnswer[i] === ']') { + if (parsedAnswer[i] === "]") { break; - } else if (parsedAnswer[i] === '[') { + } else if (parsedAnswer[i] === "[") { lastIndex = i; break; } } const truncatedAnswer = parsedAnswer.substring(0, lastIndex); parsedAnswer = truncatedAnswer; - } + } const parts = parsedAnswer.split(/\[([^\]]+)\]/g); diff --git a/app/frontend/src/components/Example/Example.module.css b/app/frontend/src/components/Example/Example.module.css index 796f2172f5..2911450d15 100644 --- a/app/frontend/src/components/Example/Example.module.css +++ b/app/frontend/src/components/Example/Example.module.css @@ -20,7 +20,9 @@ } .example:hover { - box-shadow: 0px 8px 16px rgba(0, 0, 0, 0.14), 0px 0px 2px rgba(0, 0, 0, 0.12); + box-shadow: + 0px 8px 16px rgba(0, 0, 0, 0.14), + 0px 0px 2px rgba(0, 0, 0, 0.12); outline: 2px solid rgba(115, 118, 225, 1); } diff --git a/app/frontend/src/components/LoginButton/LoginButton.module.css b/app/frontend/src/components/LoginButton/LoginButton.module.css index 25bbabab73..f808ac94cf 100644 --- a/app/frontend/src/components/LoginButton/LoginButton.module.css +++ b/app/frontend/src/components/LoginButton/LoginButton.module.css @@ -2,4 +2,4 @@ border-radius: 5px; padding: 30px 30px; font-weight: 100; -} \ No newline at end of file +} diff --git a/app/frontend/src/components/LoginButton/LoginButton.tsx b/app/frontend/src/components/LoginButton/LoginButton.tsx index f2a52d998a..7378ecf5a7 100644 --- a/app/frontend/src/components/LoginButton/LoginButton.tsx +++ b/app/frontend/src/components/LoginButton/LoginButton.tsx @@ -1,40 +1,39 @@ -import { DefaultButton } from '@fluentui/react'; -import { useMsal } from '@azure/msal-react'; +import { DefaultButton } from "@fluentui/react"; +import { useMsal } from "@azure/msal-react"; import styles from "./LoginButton.module.css"; -import { loginRequest } from '../../authConfig'; - +import { getRedirectUri, loginRequest } from "../../authConfig"; export const LoginButton = () => { - const { instance } = useMsal(); - const activeAccount = instance.getActiveAccount(); - const handleLoginPopup = () => { - /** - * When using popup and silent APIs, we recommend setting the redirectUri to a blank page or a page - * that does not implement MSAL. Keep in mind that all redirect routes must be registered with the application - * For more information, please follow this link: https://github.com/AzureAD/microsoft-authentication-library-for-js/blob/dev/lib/msal-browser/docs/login-user.md#redirecturi-considerations - */ - instance - .loginPopup({ - ...loginRequest, - redirectUri: '/redirect', - }) - .catch((error) => console.log(error)); - }; - const handleLogoutPopup = () => { - instance - .logoutPopup({ - mainWindowRedirectUri: '/', // redirects the top level app after logout - account: instance.getActiveAccount(), - }) - .catch((error) => console.log(error)); - }; - const logoutText = `Logout\n${activeAccount?.username}` - return ( - - - ) + const { instance } = useMsal(); + const activeAccount = instance.getActiveAccount(); + const handleLoginPopup = () => { + /** + * When using popup and silent APIs, we recommend setting the redirectUri to a blank page or a page + * that does not implement MSAL. Keep in mind that all redirect routes must be registered with the application + * For more information, please follow this link: https://github.com/AzureAD/microsoft-authentication-library-for-js/blob/dev/lib/msal-browser/docs/login-user.md#redirecturi-considerations + */ + instance + .loginPopup({ + ...loginRequest, + redirectUri: getRedirectUri() + }) + .catch(error => console.log(error)); + }; + const handleLogoutPopup = () => { + instance + .logoutPopup({ + mainWindowRedirectUri: "/", // redirects the top level app after logout + account: instance.getActiveAccount() + }) + .catch(error => console.log(error)); + }; + const logoutText = `Logout\n${activeAccount?.username}`; + return ( + + ); }; diff --git a/app/frontend/src/components/LoginButton/index.tsx b/app/frontend/src/components/LoginButton/index.tsx index 06bd34e105..06a844c6bd 100644 --- a/app/frontend/src/components/LoginButton/index.tsx +++ b/app/frontend/src/components/LoginButton/index.tsx @@ -1 +1 @@ -export * from "./LoginButton" +export * from "./LoginButton"; diff --git a/app/frontend/src/components/QuestionInput/QuestionInput.module.css b/app/frontend/src/components/QuestionInput/QuestionInput.module.css index 8fa6d53d42..419523e453 100644 --- a/app/frontend/src/components/QuestionInput/QuestionInput.module.css +++ b/app/frontend/src/components/QuestionInput/QuestionInput.module.css @@ -1,6 +1,8 @@ .questionInputContainer { border-radius: 8px; - box-shadow: 0px 8px 16px rgba(0, 0, 0, 0.14), 0px 0px 2px rgba(0, 0, 0, 0.12); + box-shadow: + 0px 8px 16px rgba(0, 0, 0, 0.14), + 0px 0px 2px rgba(0, 0, 0, 0.12); height: 90px; width: 100%; padding: 15px; diff --git a/app/frontend/src/components/SupportingContent/SupportingContent.module.css b/app/frontend/src/components/SupportingContent/SupportingContent.module.css index 3ce11a6a88..b38d5d9d0b 100644 --- a/app/frontend/src/components/SupportingContent/SupportingContent.module.css +++ b/app/frontend/src/components/SupportingContent/SupportingContent.module.css @@ -10,7 +10,9 @@ word-break: break-word; background: rgb(249, 249, 249); border-radius: 8px; - box-shadow: rgb(0 0 0 / 5%) 0px 0px 0px 1px, rgb(0 0 0 / 10%) 0px 2px 3px 0px; + box-shadow: + rgb(0 0 0 / 5%) 0px 0px 0px 1px, + rgb(0 0 0 / 10%) 0px 2px 3px 0px; outline: transparent solid 1px; display: flex; diff --git a/app/frontend/src/components/TokenClaimsDisplay/TokenClaimsDisplay.tsx b/app/frontend/src/components/TokenClaimsDisplay/TokenClaimsDisplay.tsx index fc1c948762..53035a1673 100644 --- a/app/frontend/src/components/TokenClaimsDisplay/TokenClaimsDisplay.tsx +++ b/app/frontend/src/components/TokenClaimsDisplay/TokenClaimsDisplay.tsx @@ -1,5 +1,5 @@ -import { Label } from '@fluentui/react'; -import { useMsal } from '@azure/msal-react'; +import { Label } from "@fluentui/react"; +import { useMsal } from "@azure/msal-react"; import { DataGridBody, DataGridRow, @@ -9,80 +9,69 @@ import { DataGridCell, createTableColumn, TableColumnDefinition -} from '@fluentui/react-table'; +} from "@fluentui/react-table"; type Claim = { name: string; value: string; -} - +}; export const TokenClaimsDisplay = () => { const { instance } = useMsal(); const activeAccount = instance.getActiveAccount(); const ToString = (a: string | any) => { - if (typeof a === 'string') { + if (typeof a === "string") { return a; } else { return JSON.stringify(a); } }; - const items: Claim[] = activeAccount?.idTokenClaims ? - Object.keys(activeAccount.idTokenClaims).map( - (key: string) => { return { name: key, value: ToString((activeAccount.idTokenClaims ?? {})[key]) }; }) : - [] + const items: Claim[] = activeAccount?.idTokenClaims + ? Object.keys(activeAccount.idTokenClaims).map((key: string) => { + return { name: key, value: ToString((activeAccount.idTokenClaims ?? {})[key]) }; + }) + : []; const columns: TableColumnDefinition[] = [ createTableColumn({ - columnId: 'name', + columnId: "name", compare: (a: Claim, b: Claim) => { return a.name.localeCompare(b.name); }, renderHeaderCell: () => { - return 'Name'; + return "Name"; }, renderCell: item => { - return item.name - }, + return item.name; + } }), createTableColumn({ - columnId: 'value', + columnId: "value", compare: (a: Claim, b: Claim) => { return a.value.localeCompare(b.value); }, renderHeaderCell: () => { - return 'Value'; + return "Value"; }, renderCell: item => { - return item.value - }, + return item.value; + } }) - ] + ]; return (
- item.name} - > + item.name}> - - {({ renderHeaderCell }) => {renderHeaderCell()}} - + {({ renderHeaderCell }) => {renderHeaderCell()}} > - {({ item, rowId }) => ( - key={rowId}> - {({ renderCell }) => {renderCell(item)}} - - )} + {({ item, rowId }) => key={rowId}>{({ renderCell }) => {renderCell(item)}}}
- ) + ); }; diff --git a/app/frontend/src/components/TokenClaimsDisplay/index.tsx b/app/frontend/src/components/TokenClaimsDisplay/index.tsx index 52c4634fbe..baec9b59a1 100644 --- a/app/frontend/src/components/TokenClaimsDisplay/index.tsx +++ b/app/frontend/src/components/TokenClaimsDisplay/index.tsx @@ -1 +1 @@ -export * from './TokenClaimsDisplay' \ No newline at end of file +export * from "./TokenClaimsDisplay"; diff --git a/app/frontend/src/components/UserChatMessage/UserChatMessage.module.css b/app/frontend/src/components/UserChatMessage/UserChatMessage.module.css index c80bea6f7d..591f3144c3 100644 --- a/app/frontend/src/components/UserChatMessage/UserChatMessage.module.css +++ b/app/frontend/src/components/UserChatMessage/UserChatMessage.module.css @@ -10,6 +10,8 @@ padding: 20px; background: #e8ebfa; border-radius: 8px; - box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.14), 0px 0px 2px rgba(0, 0, 0, 0.12); + box-shadow: + 0px 2px 4px rgba(0, 0, 0, 0.14), + 0px 0px 2px rgba(0, 0, 0, 0.12); outline: transparent solid 1px; } diff --git a/app/frontend/src/index.css b/app/frontend/src/index.css index 2efb29b41f..44e9bf2eea 100644 --- a/app/frontend/src/index.css +++ b/app/frontend/src/index.css @@ -12,7 +12,17 @@ body { html { background: #f2f2f2; - font-family: "Segoe UI", -apple-system, BlinkMacSystemFont, "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", + font-family: + "Segoe UI", + -apple-system, + BlinkMacSystemFont, + "Roboto", + "Oxygen", + "Ubuntu", + "Cantarell", + "Fira Sans", + "Droid Sans", + "Helvetica Neue", sans-serif; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; diff --git a/app/frontend/src/index.tsx b/app/frontend/src/index.tsx index 47b068989b..d0c06c381d 100644 --- a/app/frontend/src/index.tsx +++ b/app/frontend/src/index.tsx @@ -2,9 +2,9 @@ import React from "react"; import ReactDOM from "react-dom/client"; import { createHashRouter, RouterProvider } from "react-router-dom"; import { initializeIcons } from "@fluentui/react"; -import { MsalProvider } from '@azure/msal-react'; -import { PublicClientApplication, EventType, AccountInfo } from '@azure/msal-browser'; -import { msalConfig, useLogin } from './authConfig'; +import { MsalProvider } from "@azure/msal-react"; +import { PublicClientApplication, EventType, AccountInfo } from "@azure/msal-browser"; +import { msalConfig, useLogin } from "./authConfig"; import "./index.css"; @@ -22,7 +22,7 @@ if (useLogin) { } // Listen for sign-in event and set active account - msalInstance.addEventCallback((event) => { + msalInstance.addEventCallback(event => { if (event.eventType === EventType.LOGIN_SUCCESS && event.payload) { const account = event.payload as AccountInfo; msalInstance.setActiveAccount(account); @@ -33,9 +33,9 @@ if (useLogin) { - ) + ); } else { - layout = + layout = ; } initializeIcons(); diff --git a/app/frontend/src/pages/chat/Chat.tsx b/app/frontend/src/pages/chat/Chat.tsx index 567aaa4526..e09e13564e 100644 --- a/app/frontend/src/pages/chat/Chat.tsx +++ b/app/frontend/src/pages/chat/Chat.tsx @@ -5,7 +5,7 @@ import readNDJSONStream from "ndjson-readablestream"; import styles from "./Chat.module.css"; -import { chatApi, RetrievalMode, ChatAppResponse, ChatAppResponseOrError, ChatRequest, ChatTurn } from "../../api"; +import { chatApi, RetrievalMode, ChatAppResponse, ChatAppResponseOrError, ChatAppRequest, ResponseMessage } from "../../api"; import { Answer, AnswerError, AnswerLoading } from "../../components/Answer"; import { QuestionInput } from "../../components/QuestionInput"; import { ExampleList } from "../../components/Example"; @@ -52,12 +52,9 @@ const Chat = () => { return new Promise(resolve => { setTimeout(() => { answer += newContent; - const latestResponse: ChatAppResponse = { ...askResponse, - choices: [{ ...askResponse.choices[0], - message: { content: answer, - role: askResponse.choices[0].message.role - } } - ] + const latestResponse: ChatAppResponse = { + ...askResponse, + choices: [{ ...askResponse.choices[0], message: { content: answer, role: askResponse.choices[0].message.role } }] }; setStreamedAnswers([...answers, [question, latestResponse]]); resolve(null); @@ -67,7 +64,7 @@ const Chat = () => { try { setIsStreaming(true); for await (const event of readNDJSONStream(responseBody)) { - if (event["choices"] && event["choices"][0]["extra_args"] && event["choices"][0]["extra_args"]["data_points"]) { + if (event["choices"] && event["choices"][0]["context"] && event["choices"][0]["context"]["data_points"]) { event["choices"][0]["message"] = event["choices"][0]["delta"]; askResponse = event; } else if (event["choices"] && event["choices"][0]["delta"]["content"]) { @@ -78,12 +75,9 @@ const Chat = () => { } finally { setIsStreaming(false); } - const fullResponse: ChatAppResponse = { ...askResponse, - choices: [{ ...askResponse.choices[0], - message: { content: answer, - role: askResponse.choices[0].message.role - } } - ] + const fullResponse: ChatAppResponse = { + ...askResponse, + choices: [{ ...askResponse.choices[0], message: { content: answer, role: askResponse.choices[0].message.role } }] }; return fullResponse; }; @@ -101,28 +95,32 @@ const Chat = () => { const token = client ? await getToken(client) : undefined; try { - const history: ChatTurn[] = answers.map(a => ({ - user: a[0], - bot: a[1].choices[0].message.content - })); - const request: ChatRequest = { - history: [...history, { user: question, bot: undefined }], - shouldStream: shouldStream, - overrides: { - promptTemplate: promptTemplate.length === 0 ? undefined : promptTemplate, - excludeCategory: excludeCategory.length === 0 ? undefined : excludeCategory, - top: retrieveCount, - retrievalMode: retrievalMode, - semanticRanker: useSemanticRanker, - semanticCaptions: useSemanticCaptions, - suggestFollowupQuestions: useSuggestFollowupQuestions, - useOidSecurityFilter: useOidSecurityFilter, - useGroupsSecurityFilter: useGroupsSecurityFilter + const messages: ResponseMessage[] = answers.flatMap(a => [ + { content: a[0], role: "user" }, + { content: a[1].choices[0].message.content, role: "assistant" } + ]); + + const request: ChatAppRequest = { + messages: [...messages, { content: question, role: "user" }], + stream: shouldStream, + context: { + overrides: { + prompt_template: promptTemplate.length === 0 ? undefined : promptTemplate, + exclude_category: excludeCategory.length === 0 ? undefined : excludeCategory, + top: retrieveCount, + retrieval_mode: retrievalMode, + semantic_ranker: useSemanticRanker, + semantic_captions: useSemanticCaptions, + suggest_followup_questions: useSuggestFollowupQuestions, + use_oid_security_filter: useOidSecurityFilter, + use_groups_security_filter: useGroupsSecurityFilter + } }, - idToken: token?.accessToken + // ChatAppProtocol: Client must pass on any session state received from the server + session_state: answers.length ? answers[answers.length - 1][1].choices[0].session_state : null }; - const response = await chatApi(request); + const response = await chatApi(request, token?.accessToken); if (!response.body) { throw Error("No response body"); } diff --git a/app/frontend/src/pages/layout/Layout.tsx b/app/frontend/src/pages/layout/Layout.tsx index b9c9d2ed04..5795ec2263 100644 --- a/app/frontend/src/pages/layout/Layout.tsx +++ b/app/frontend/src/pages/layout/Layout.tsx @@ -4,9 +4,9 @@ import github from "../../assets/github.svg"; import styles from "./Layout.module.css"; -import { useLogin } from "../../authConfig" +import { useLogin } from "../../authConfig"; -import { LoginButton } from "../../components/LoginButton" +import { LoginButton } from "../../components/LoginButton"; const Layout = () => { return ( @@ -43,7 +43,7 @@ const Layout = () => {

Azure OpenAI + Cognitive Search

- {useLogin && } + {useLogin && } diff --git a/app/frontend/src/pages/oneshot/OneShot.tsx b/app/frontend/src/pages/oneshot/OneShot.tsx index bb048ca5fb..eb73ad5394 100644 --- a/app/frontend/src/pages/oneshot/OneShot.tsx +++ b/app/frontend/src/pages/oneshot/OneShot.tsx @@ -3,7 +3,7 @@ import { Checkbox, ChoiceGroup, IChoiceGroupOption, Panel, DefaultButton, Spinne import styles from "./OneShot.module.css"; -import { askApi, ChatAppResponse, AskRequest, RetrievalMode } from "../../api"; +import { askApi, ChatAppResponse, ChatAppRequest, RetrievalMode } from "../../api"; import { Answer, AnswerError } from "../../components/Answer"; import { QuestionInput } from "../../components/QuestionInput"; import { ExampleList } from "../../components/Example"; @@ -35,7 +35,7 @@ export function Component(): JSX.Element { const [activeCitation, setActiveCitation] = useState(); const [activeAnalysisPanelTab, setActiveAnalysisPanelTab] = useState(undefined); - const client = useLogin ? useMsal().instance : undefined + const client = useLogin ? useMsal().instance : undefined; const makeApiRequest = async (question: string) => { lastQuestionRef.current = question; @@ -45,26 +45,34 @@ export function Component(): JSX.Element { setActiveCitation(undefined); setActiveAnalysisPanelTab(undefined); - const token = client ? await getToken(client) : undefined + const token = client ? await getToken(client) : undefined; try { - const request: AskRequest = { - question, - overrides: { - promptTemplate: promptTemplate.length === 0 ? undefined : promptTemplate, - promptTemplatePrefix: promptTemplatePrefix.length === 0 ? undefined : promptTemplatePrefix, - promptTemplateSuffix: promptTemplateSuffix.length === 0 ? undefined : promptTemplateSuffix, - excludeCategory: excludeCategory.length === 0 ? undefined : excludeCategory, - top: retrieveCount, - retrievalMode: retrievalMode, - semanticRanker: useSemanticRanker, - semanticCaptions: useSemanticCaptions, - useOidSecurityFilter: useOidSecurityFilter, - useGroupsSecurityFilter: useGroupsSecurityFilter + const request: ChatAppRequest = { + messages: [ + { + content: question, + role: "user" + } + ], + context: { + overrides: { + prompt_template: promptTemplate.length === 0 ? undefined : promptTemplate, + prompt_template_prefix: promptTemplatePrefix.length === 0 ? undefined : promptTemplatePrefix, + prompt_template_suffix: promptTemplateSuffix.length === 0 ? undefined : promptTemplateSuffix, + exclude_category: excludeCategory.length === 0 ? undefined : excludeCategory, + top: retrieveCount, + retrieval_mode: retrievalMode, + semantic_ranker: useSemanticRanker, + semantic_captions: useSemanticCaptions, + use_oid_security_filter: useOidSecurityFilter, + use_groups_security_filter: useGroupsSecurityFilter + } }, - idToken: token?.accessToken + // ChatAppProtocol: Client must pass on any session state received from the server + session_state: answer ? answer.choices[0].session_state : null }; - const result = await askApi(request); + const result = await askApi(request, token?.accessToken); setAnswer(result); } catch (e) { setError(e); @@ -183,7 +191,6 @@ export function Component(): JSX.Element { onRenderFooterContent={() => setIsConfigPanelOpen(false)}>Close} isFooterAtBottom={true} > - )} - {useLogin && ( + {useLogin && ( - { useLogin && } + {useLogin && } ); diff --git a/app/frontend/vite.config.ts b/app/frontend/vite.config.ts index b5ff872f32..1e8c4efa2b 100644 --- a/app/frontend/vite.config.ts +++ b/app/frontend/vite.config.ts @@ -25,6 +25,8 @@ export default defineConfig({ }, server: { proxy: { + "/content/": "http://localhost:50505", + "/auth_setup": "http://localhost:50505", "/ask": "http://localhost:50505", "/chat": "http://localhost:50505" } diff --git a/infra/main.bicep b/infra/main.bicep index 5ddcf80316..6bd548f873 100644 --- a/infra/main.bicep +++ b/infra/main.bicep @@ -22,6 +22,8 @@ param searchServiceLocation string = '' @allowed(['basic', 'standard', 'standard2', 'standard3', 'storage_optimized_l1', 'storage_optimized_l2']) param searchServiceSkuName string // Set in main.parameters.json param searchIndexName string // Set in main.parameters.json +param searchQueryLanguage string // Set in main.parameters.json +param searchQuerySpeller string // Set in main.parameters.json param storageAccountName string = '' param storageResourceGroupName string = '' @@ -142,7 +144,7 @@ module backend 'core/host/appservice.bicep' = { tags: union(tags, { 'azd-service-name': 'backend' }) appServicePlanId: appServicePlan.outputs.id runtimeName: 'python' - runtimeVersion: '3.10' + runtimeVersion: '3.11' appCommandLine: 'python3 -m gunicorn main:app' scmDoBuildDuringDeployment: true managedIdentity: true @@ -152,6 +154,8 @@ module backend 'core/host/appservice.bicep' = { AZURE_STORAGE_CONTAINER: storageContainerName AZURE_SEARCH_INDEX: searchIndexName AZURE_SEARCH_SERVICE: searchService.outputs.name + AZURE_SEARCH_QUERY_LANGUAGE: searchQueryLanguage + AZURE_SEARCH_QUERY_SPELLER: searchQuerySpeller APPLICATIONINSIGHTS_CONNECTION_STRING: useApplicationInsights ? monitoring.outputs.applicationInsightsConnectionString : '' // Shared by all OpenAI deployments OPENAI_HOST: openAiHost diff --git a/infra/main.parameters.json b/infra/main.parameters.json index 15ddc8289c..3c5719161e 100644 --- a/infra/main.parameters.json +++ b/infra/main.parameters.json @@ -47,6 +47,12 @@ "searchServiceSkuName": { "value": "${AZURE_SEARCH_SERVICE_SKU=standard}" }, + "searchQueryLanguage": { + "value": "${AZURE_SEARCH_QUERY_LANGUAGE=en-us}" + }, + "searchQuerySpeller": { + "value": "${AZURE_SEARCH_QUERY_SPELLER=lexicon}" + }, "storageAccountName": { "value": "${AZURE_STORAGE_ACCOUNT}" }, diff --git a/locustfile.py b/locustfile.py index 3bcf62d05a..0bc5f0cbfc 100644 --- a/locustfile.py +++ b/locustfile.py @@ -16,15 +16,16 @@ def ask_question(self): json={ "history": [ { - "user": random.choice( + "content": random.choice( [ "What is included in my Northwind Health Plus plan that is not in standard?", "What does a Product Manager do?", "What happens in a performance review?", "Whats your whistleblower policy?", ] - ) - } + ), + "role": "user", + }, ], "overrides": { "retrieval_mode": "hybrid", @@ -40,11 +41,12 @@ def ask_question(self): "/chat", json={ "history": [ + {"content": "What happens in a performance review?", "role": "user"}, { - "user": "What happens in a performance review?", - "bot": "During the performance review at Contoso Electronics, the supervisor will discuss the employee's performance over the past year and provide feedback on areas for improvement. They will also provide an opportunity for the employee to discuss their goals and objectives for the upcoming year. The review is a two-way dialogue between managers and employees, and employees will receive a written summary of their performance review which will include a rating of their performance, feedback, and goals and objectives for the upcoming year [employee_handbook-3.pdf].", + "content": "During a performance review, employees will receive feedback on their performance over the past year, including both successes and areas for improvement. The feedback will be provided by the employee's supervisor and is intended to help the employee develop and grow in their role [employee_handbook-3.pdf]. The review is a two-way dialogue between the employee and their manager, so employees are encouraged to be honest and open during the process [employee_handbook-3.pdf]. The employee will also have the opportunity to discuss their goals and objectives for the upcoming year [employee_handbook-3.pdf]. A written summary of the performance review will be provided to the employee, which will include a rating of their performance, feedback, and goals and objectives for the upcoming year [employee_handbook-3.pdf].", + "role": "assistant", }, - {"user": "Does my plan cover eye exams?"}, + {"content": "Does my plan cover eye exams?", "role": "user"}, ], "overrides": { "retrieval_mode": "hybrid", diff --git a/pyproject.toml b/pyproject.toml index 26d8bcc1d6..def1afefd7 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -16,3 +16,14 @@ source = ["scripts", "app"] [tool.coverage.report] show_missing = true + +[tool.mypy] +check_untyped_defs = true +python_version = 3.9 + +[[tool.mypy.overrides]] +module = [ + "msal.*", + "msal_extensions.*", +] +ignore_missing_imports = true diff --git a/requirements-dev.txt b/requirements-dev.txt index 4108af173b..f5408b2b29 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -12,3 +12,4 @@ pytest-playwright pre-commit locust pip-tools +mypy diff --git a/scripts/adlsgen2setup.py b/scripts/adlsgen2setup.py index 0c4bd59c14..00de15eb25 100644 --- a/scripts/adlsgen2setup.py +++ b/scripts/adlsgen2setup.py @@ -3,6 +3,7 @@ import json import logging import os +from typing import Any, Optional import aiohttp from azure.core.credentials_async import AsyncTokenCredential @@ -24,7 +25,7 @@ def __init__( storage_account_name: str, filesystem_name: str, security_enabled_groups: bool, - data_access_control_format: dict[str, any], + data_access_control_format: dict[str, Any], credentials: AsyncTokenCredential, ): """ @@ -49,7 +50,7 @@ def __init__( self.credentials = credentials self.security_enabled_groups = security_enabled_groups self.data_access_control_format = data_access_control_format - self.graph_headers = None + self.graph_headers: Optional[dict[str, str]] = None async def run(self): async with self.create_service_client() as service_client: @@ -143,7 +144,7 @@ async def create_or_get_group(self, group_name: str): return group_id -async def main(args: any): +async def main(args: Any): async with AzureDeveloperCliCredential() as credentials: with open(args.data_access_control) as f: data_access_control_format = json.load(f) diff --git a/scripts/manageacl.py b/scripts/manageacl.py index 6b49ae4b75..fa02bd2a4f 100644 --- a/scripts/manageacl.py +++ b/scripts/manageacl.py @@ -2,11 +2,11 @@ import asyncio import json import logging -from typing import Union +from typing import Any, Union from azure.core.credentials import AzureKeyCredential from azure.core.credentials_async import AsyncTokenCredential -from azure.identity import AzureDeveloperCliCredential +from azure.identity.aio import AzureDeveloperCliCredential from azure.search.documents.aio import SearchClient from azure.search.documents.indexes.aio import SearchIndexClient from azure.search.documents.indexes.models import ( @@ -143,14 +143,16 @@ async def enable_acls(self, endpoint: str): await search_index_client.create_or_update_index(index_definition) -async def main(args: any): +async def main(args: Any): # Use the current user identity to connect to Azure services unless a key is explicitly set for any of them azd_credential = ( AzureDeveloperCliCredential() if args.tenant_id is None else AzureDeveloperCliCredential(tenant_id=args.tenant_id, process_timeout=60) ) - search_credential = azd_credential if args.search_key is None else AzureKeyCredential(args.search_key) + search_credential: Union[AsyncTokenCredential, AzureKeyCredential] = azd_credential + if args.search_key is not None: + search_credential = AzureKeyCredential(args.search_key) command = ManageAcl( service_name=args.search_service, diff --git a/scripts/prepdocs.ps1 b/scripts/prepdocs.ps1 index e01f99b468..8097b3d2c2 100755 --- a/scripts/prepdocs.ps1 +++ b/scripts/prepdocs.ps1 @@ -27,7 +27,11 @@ if ($env:AZURE_ADLS_GEN2_STORAGE_ACCOUNT) { } $aclArg = "--useacls" } -$argumentList = "./scripts/prepdocs.py `"$cwd/data/*`" $adlsGen2StorageAccountArg $adlsGen2FilesystemArg $adlsGen2FilesystemPathArg " + ` +# Optional Search Analyzer name if using a custom analyzer +if ($env:AZURE_SEARCH_ANALYZER_NAME) { + $searchAnalyzerNameArg = "--searchanalyzername $env:AZURE_SEARCH_ANALYZER_NAME" +} +$argumentList = "./scripts/prepdocs.py `"$cwd/data/*`" $adlsGen2StorageAccountArg $adlsGen2FilesystemArg $adlsGen2FilesystemPathArg $searchAnalyzerNameArg " + ` "$aclArg --storageaccount $env:AZURE_STORAGE_ACCOUNT --container $env:AZURE_STORAGE_CONTAINER " + ` "--searchservice $env:AZURE_SEARCH_SERVICE --openaihost `"$env:OPENAI_HOST`" " + ` "--openaiservice `"$env:AZURE_OPENAI_SERVICE`" --openaikey `"$env:OPENAI_API_KEY`" " + ` diff --git a/scripts/prepdocs.py b/scripts/prepdocs.py index c555928fe3..90c8001551 100644 --- a/scripts/prepdocs.py +++ b/scripts/prepdocs.py @@ -7,11 +7,12 @@ import re import tempfile import time +from typing import Any, Optional, Union import openai import tiktoken from azure.ai.formrecognizer import DocumentAnalysisClient -from azure.core.credentials import AzureKeyCredential +from azure.core.credentials import AzureKeyCredential, TokenCredential from azure.identity import AzureDeveloperCliCredential from azure.search.documents import SearchClient from azure.search.documents.indexes import SearchIndexClient @@ -60,7 +61,7 @@ SENTENCE_SEARCH_LIMIT = 100 SECTION_OVERLAP = 100 -open_ai_token_cache = {} +open_ai_token_cache: dict[str, Any] = {} CACHE_KEY_TOKEN_CRED = "openai_token_cred" CACHE_KEY_CREATED_TIME = "created_time" CACHE_KEY_TOKEN_TYPE = "token_type" @@ -118,7 +119,7 @@ def remove_blobs(filename): blob_container = blob_service.get_container_client(args.container) if blob_container.exists(): if filename is None: - blobs = blob_container.list_blob_names() + blobs = iter(blob_container.list_blob_names()) else: prefix = os.path.splitext(os.path.basename(filename))[0] blobs = filter( @@ -177,8 +178,8 @@ def get_document_text(filename): for page_num, page in enumerate(form_recognizer_results.pages): tables_on_page = [ table - for table in form_recognizer_results.tables - if table.bounding_regions[0].page_number == page_num + 1 + for table in (form_recognizer_results.tables or []) + if table.bounding_regions and table.bounding_regions[0].page_number == page_num + 1 ] # mark all positions of the table spans in the page @@ -289,7 +290,9 @@ def filename_to_id(filename): return f"file-{filename_ascii}-{filename_hash}" -def create_sections(filename, page_map, use_vectors, embedding_deployment: str = None, embedding_model: str = None): +def create_sections( + filename, page_map, use_vectors, embedding_deployment: Optional[str] = None, embedding_model: Optional[str] = None +): file_id = filename_to_id(filename) for i, (content, pagenum) in enumerate(split_text(page_map, filename)): section = { @@ -342,7 +345,7 @@ def create_search_index(): ) fields = [ SimpleField(name="id", type="Edm.String", key=True), - SearchableField(name="content", type="Edm.String", analyzer_name="en.microsoft"), + SearchableField(name="content", type="Edm.String", analyzer_name=args.searchanalyzername), SearchField( name="embedding", type=SearchFieldDataType.Collection(SearchFieldDataType.Single), @@ -397,7 +400,7 @@ def create_search_index(): def update_embeddings_in_batch(sections): - batch_queue = [] + batch_queue: list = [] copy_s = [] batch_response = {} token_count = 0 @@ -469,9 +472,9 @@ def remove_from_index(filename): r = search_client.search("", filter=filter, top=1000, include_total_count=True) if r.get_count() == 0: break - r = search_client.delete_documents(documents=[{"id": d["id"]} for d in r]) + removed_docs = search_client.delete_documents(documents=[{"id": d["id"]} for d in r]) if args.verbose: - print(f"\tRemoved {len(r)} sections from index") + print(f"\tRemoved {len(removed_docs)} sections from index") # It can take a few seconds for search results to reflect changes, so wait a bit time.sleep(2) @@ -494,8 +497,8 @@ def read_files( path_pattern: str, use_vectors: bool, vectors_batch_support: bool, - embedding_deployment: str = None, - embedding_model: str = None, + embedding_deployment: Optional[str] = None, + embedding_model: Optional[str] = None, ): """ Recursively read directory structure under `path_pattern` @@ -530,7 +533,10 @@ def read_files( def read_adls_gen2_files( - use_vectors: bool, vectors_batch_support: bool, embedding_deployment: str = None, embedding_model: str = None + use_vectors: bool, + vectors_batch_support: bool, + embedding_deployment: Optional[str] = None, + embedding_model: Optional[str] = None, ): datalake_service = DataLakeServiceClient( account_url=f"https://{args.datalakestorageaccount}.dfs.core.windows.net", credential=adls_gen2_creds @@ -549,7 +555,7 @@ def read_adls_gen2_files( file_client = filesystem_client.get_file_client(path) file_client.download_file().readinto(temp_file) - acls = None + acls: Optional[dict[str, list]] = None if args.useacls: # Parse out user ids and group ids acls = {"oids": [], "groups": []} @@ -560,7 +566,7 @@ def read_adls_gen2_files( # ACL Format: user::rwx,group::r-x,other::r--,user:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx:r-- acl_list = acl_list.split(",") for acl in acl_list: - acl_parts = acl.split(":") + acl_parts: list = acl.split(":") if len(acl_parts) != 3: continue if len(acl_parts[1]) == 0: @@ -648,6 +654,12 @@ def read_adls_gen2_files( required=False, help="Optional. Use this Azure Cognitive Search account key instead of the current user identity to login (use az login to set current user for Azure)", ) + parser.add_argument( + "--searchanalyzername", + required=False, + default="en.microsoft", + help="Optional. Name of the Azure Cognitive Search analyzer to use for the content field in the index", + ) parser.add_argument("--openaihost", help="Host of the API used to compute embeddings ('azure' or 'openai')") parser.add_argument("--openaiservice", help="Name of the Azure OpenAI service used to compute embeddings") parser.add_argument( @@ -706,14 +718,15 @@ def read_adls_gen2_files( if args.tenantid is None else AzureDeveloperCliCredential(tenant_id=args.tenantid, process_timeout=60) ) - default_creds = azd_credential if args.searchkey is None or args.storagekey is None else None adls_gen2_creds = azd_credential if args.datalakekey is None else AzureKeyCredential(args.datalakekey) - search_creds = default_creds if args.searchkey is None else AzureKeyCredential(args.searchkey) + search_creds: Union[TokenCredential, AzureKeyCredential] = azd_credential + if args.searchkey is not None: + search_creds = AzureKeyCredential(args.searchkey) use_vectors = not args.novectors compute_vectors_in_batch = not args.disablebatchvectors and args.openaimodelname in SUPPORTED_BATCH_AOAI_MODEL if not args.skipblobs: - storage_creds = default_creds if args.storagekey is None else args.storagekey + storage_creds = azd_credential if args.storagekey is None else args.storagekey if not args.localpdfparser: # check if Azure Form Recognizer credentials are provided if args.formrecognizerservice is None: @@ -721,9 +734,9 @@ def read_adls_gen2_files( "Error: Azure Form Recognizer service is not provided. Please provide formrecognizerservice or use --localpdfparser for local pypdf parser." ) exit(1) - formrecognizer_creds = ( - default_creds if args.formrecognizerkey is None else AzureKeyCredential(args.formrecognizerkey) - ) + formrecognizer_creds: Union[TokenCredential, AzureKeyCredential] = azd_credential + if args.formrecognizerkey is not None: + formrecognizer_creds = AzureKeyCredential(args.formrecognizerkey) if use_vectors: if args.openaihost != "openai": diff --git a/scripts/prepdocs.sh b/scripts/prepdocs.sh index b58e2b7f55..8411b1c684 100755 --- a/scripts/prepdocs.sh +++ b/scripts/prepdocs.sh @@ -17,11 +17,16 @@ if [ -n "$AZURE_ADLS_GEN2_STORAGE_ACCOUNT" ]; then aclArg="--useacls" fi +if [ -n "$AZURE_SEARCH_ANALYZER_NAME" ]; then + searchAnalyzerNameArg="--searchanalyzername $AZURE_SEARCH_ANALYZER_NAME" +fi + ./scripts/.venv/bin/python ./scripts/prepdocs.py \ -'./data/*' $adlsGen2StorageAccountArg $adlsGen2FilesystemArg $adlsGen2FilesystemPathArg \ +'./data/*' $adlsGen2StorageAccountArg $adlsGen2FilesystemArg $adlsGen2FilesystemPathArg $searchAnalyzerNameArg \ $aclArg --storageaccount "$AZURE_STORAGE_ACCOUNT" \ --container "$AZURE_STORAGE_CONTAINER" --searchservice "$AZURE_SEARCH_SERVICE" \ --openaiservice "$AZURE_OPENAI_SERVICE" --openaideployment "$AZURE_OPENAI_EMB_DEPLOYMENT" \ --openaimodelname "$AZURE_OPENAI_EMB_MODEL_NAME" --index "$AZURE_SEARCH_INDEX" \ --formrecognizerservice "$AZURE_FORMRECOGNIZER_SERVICE" --openaimodelname "$AZURE_OPENAI_EMB_MODEL_NAME" \ ---tenantid "$AZURE_TENANT_ID" -v +--tenantid "$AZURE_TENANT_ID" --openaihost "$OPENAI_HOST" \ +--openaikey "$OPENAI_API_KEY" -v diff --git a/scripts/requirements.txt b/scripts/requirements.txt index f84b25693f..cb2f3493d6 100644 --- a/scripts/requirements.txt +++ b/scripts/requirements.txt @@ -2,7 +2,7 @@ # This file is autogenerated by pip-compile with Python 3.11 # by the following command: # -# pip-compile scripts/requirements.in +# pip-compile requirements.in # aiohttp==3.8.5 # via openai @@ -140,7 +140,7 @@ typing-extensions==4.8.0 # azure-storage-file-datalake tzdata==2023.3 # via pandas -urllib3==2.0.5 +urllib3==2.0.7 # via requests yarl==1.9.2 # via aiohttp diff --git a/tests/conftest.py b/tests/conftest.py index 5f2c262a90..a2309c5953 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -64,7 +64,7 @@ async def mock_acreate(*args, **kwargs): if messages[-1]["content"] == "Generate search query for: What is the capital of France?": answer = "capital of France" else: - answer = "The capital of France is Paris." + answer = "The capital of France is Paris. [Benefit_Options-2.pdf]." if "stream" in kwargs and kwargs["stream"] is True: return AsyncChatCompletionIterator(answer) else: diff --git a/tests/e2e.py b/tests/e2e.py index 6abcb2c71a..234676d083 100644 --- a/tests/e2e.py +++ b/tests/e2e.py @@ -53,15 +53,18 @@ def test_home(page: Page, live_server_url: str): def test_chat(page: Page, live_server_url: str): - # Set up a mock route to the /chat_stream endpoint + # Set up a mock route to the /chat endpoint with streaming results def handle(route: Route): + # Assert that session_state is specified in the request (None for now) + session_state = route.request.post_data_json["session_state"] + assert session_state is None # Read the JSONL from our snapshot results and return as the response f = open("tests/snapshots/test_app/test_chat_stream_text/client0/result.jsonlines") jsonl = f.read() f.close() route.fulfill(body=jsonl, status=200, headers={"Transfer-encoding": "Chunked"}) - page.route("*/**/chat_stream", handle) + page.route("*/**/chat", handle) # Check initial page state page.goto(live_server_url) @@ -80,3 +83,135 @@ def handle(route: Route): expect(page.get_by_text("Whats the dental plan?")).to_be_visible() expect(page.get_by_text("The capital of France is Paris.")).to_be_visible() expect(page.get_by_role("button", name="Clear chat")).to_be_enabled() + + # Show the citation document + page.get_by_text("1. Benefit_Options-2.pdf").click() + expect(page.get_by_role("tab", name="Citation")).to_be_visible() + expect(page.get_by_title("Citation")).to_be_visible() + + # Show the thought process + page.get_by_label("Show thought process").click() + expect(page.get_by_title("Thought process")).to_be_visible() + expect(page.get_by_text("Searched for:")).to_be_visible() + + # Show the supporting content + page.get_by_label("Show supporting content").click() + expect(page.get_by_title("Supporting content")).to_be_visible() + expect(page.get_by_role("heading", name="Benefit_Options-2.pdf")).to_be_visible() + + # Clear the chat + page.get_by_role("button", name="Clear chat").click() + expect(page.get_by_text("Whats the dental plan?")).not_to_be_visible() + expect(page.get_by_text("The capital of France is Paris.")).not_to_be_visible() + expect(page.get_by_role("button", name="Clear chat")).to_be_disabled() + + +def test_chat_customization(page: Page, live_server_url: str): + # Set up a mock route to the /chat endpoint + def handle(route: Route): + overrides = route.request.post_data_json["context"]["overrides"] + assert overrides["retrieval_mode"] == "vectors" + assert overrides["semantic_ranker"] is False + assert overrides["semantic_captions"] is True + assert overrides["top"] == 1 + assert overrides["prompt_template"] == "You are a cat and only talk about tuna." + assert overrides["exclude_category"] == "dogs" + assert overrides["suggest_followup_questions"] is True + assert overrides["use_oid_security_filter"] is False + assert overrides["use_groups_security_filter"] is False + + # Read the JSON from our snapshot results and return as the response + f = open("tests/snapshots/test_app/test_chat_text/client0/result.json") + json = f.read() + f.close() + route.fulfill(body=json, status=200) + + page.route("*/**/chat", handle) + + # Check initial page state + page.goto(live_server_url) + expect(page).to_have_title("GPT + Enterprise data | Sample") + + # Customize all the settings + page.get_by_role("button", name="Developer settings").click() + page.get_by_label("Override prompt template").click() + page.get_by_label("Override prompt template").fill("You are a cat and only talk about tuna.") + page.get_by_label("Retrieve this many search results:").click() + page.get_by_label("Retrieve this many search results:").fill("1") + page.get_by_label("Exclude category").click() + page.get_by_label("Exclude category").fill("dogs") + page.get_by_text("Use query-contextual summaries instead of whole documents").click() + page.get_by_text("Suggest follow-up questions").click() + page.get_by_text("Use semantic ranker for retrieval").click() + page.get_by_text("Vectors + Text (Hybrid)").click() + page.get_by_role("option", name="Vectors", exact=True).click() + page.get_by_text("Stream chat completion responses").click() + page.locator("button").filter(has_text="Close").click() + + # Ask a question and wait for the message to appear + page.get_by_placeholder("Type a new question (e.g. does my plan cover annual eye exams?)").click() + page.get_by_placeholder("Type a new question (e.g. does my plan cover annual eye exams?)").fill( + "Whats the dental plan?" + ) + page.get_by_role("button", name="Ask question button").click() + + expect(page.get_by_text("Whats the dental plan?")).to_be_visible() + expect(page.get_by_text("The capital of France is Paris.")).to_be_visible() + expect(page.get_by_role("button", name="Clear chat")).to_be_enabled() + + +def test_chat_nonstreaming(page: Page, live_server_url: str): + # Set up a mock route to the /chat_stream endpoint + def handle(route: Route): + # Read the JSON from our snapshot results and return as the response + f = open("tests/snapshots/test_app/test_chat_text/client0/result.json") + json = f.read() + f.close() + route.fulfill(body=json, status=200) + + page.route("*/**/chat", handle) + + # Check initial page state + page.goto(live_server_url) + expect(page).to_have_title("GPT + Enterprise data | Sample") + expect(page.get_by_role("button", name="Developer settings")).to_be_enabled() + page.get_by_role("button", name="Developer settings").click() + page.get_by_text("Stream chat completion responses").click() + page.locator("button").filter(has_text="Close").click() + + # Ask a question and wait for the message to appear + page.get_by_placeholder("Type a new question (e.g. does my plan cover annual eye exams?)").click() + page.get_by_placeholder("Type a new question (e.g. does my plan cover annual eye exams?)").fill( + "Whats the dental plan?" + ) + page.get_by_label("Ask question button").click() + + expect(page.get_by_text("Whats the dental plan?")).to_be_visible() + expect(page.get_by_text("The capital of France is Paris.")).to_be_visible() + expect(page.get_by_role("button", name="Clear chat")).to_be_enabled() + + +def test_ask(page: Page, live_server_url: str): + # Set up a mock route to the /ask endpoint + def handle(route: Route): + # Assert that session_state is specified in the request (None for now) + session_state = route.request.post_data_json["session_state"] + assert session_state is None + # Read the JSON from our snapshot results and return as the response + f = open("tests/snapshots/test_app/test_ask_rtr_hybrid/client0/result.json") + json = f.read() + f.close() + route.fulfill(body=json, status=200) + + page.route("*/**/ask", handle) + page.goto(live_server_url) + expect(page).to_have_title("GPT + Enterprise data | Sample") + + page.get_by_role("link", name="Ask a question").click() + page.get_by_placeholder("Example: Does my plan cover annual eye exams?").click() + page.get_by_placeholder("Example: Does my plan cover annual eye exams?").fill("Whats the dental plan?") + page.get_by_placeholder("Example: Does my plan cover annual eye exams?").click() + page.get_by_label("Ask question button").click() + + expect(page.get_by_text("Whats the dental plan?")).to_be_visible() + expect(page.get_by_text("The capital of France is Paris.")).to_be_visible() diff --git a/tests/snapshots/test_app/test_ask_rtr_hybrid/client0/result.json b/tests/snapshots/test_app/test_ask_rtr_hybrid/client0/result.json index fba6d28157..809a74e7a8 100644 --- a/tests/snapshots/test_app/test_ask_rtr_hybrid/client0/result.json +++ b/tests/snapshots/test_app/test_ask_rtr_hybrid/client0/result.json @@ -1,16 +1,17 @@ { "choices": [ { - "extra_args": { + "context": { "data_points": [ "Benefit_Options-2.pdf: There is a whistleblower policy." ], "thoughts": "Question:
What is the capital of France?

Prompt:
{'role': 'system', 'content': \"You are an intelligent assistant helping Contoso Inc employees with their healthcare plan questions and employee handbook questions. Use 'you' to refer to the individual asking the questions even if they ask with 'I'. Answer the following question using only the data provided in the sources below. For tabular information return it as an html table. Do not return markdown format. Each source has a name followed by colon and the actual information, always include the source name for each fact you use in the response. If you cannot answer using the sources below, say you don't know. Use below example to answer\"}\n\n{'role': 'user', 'content': \"\\n'What is the deductible for the employee plan for a visit to Overlake in Bellevue?'\\n\\nSources:\\ninfo1.txt: deductibles depend on whether you are in-network or out-of-network. In-network deductibles are $500 for employee and $1000 for family. Out-of-network deductibles are $1000 for employee and $2000 for family.\\ninfo2.pdf: Overlake is in-network for the employee plan.\\ninfo3.pdf: Overlake is the name of the area that includes a park and ride near Bellevue.\\ninfo4.pdf: In-network institutions include Overlake, Swedish and others in the region\\n\"}\n\n{'role': 'assistant', 'content': 'In-network deductibles are $500 for employee and $1000 for family [info1.txt] and Overlake is in-network for the employee plan [info2.pdf][info4.pdf].'}\n\n{'role': 'user', 'content': 'What is the capital of France?\\nSources:\\n Benefit_Options-2.pdf: There is a whistleblower policy.'}" }, "message": { - "content": "The capital of France is Paris.", + "content": "The capital of France is Paris. [Benefit_Options-2.pdf].", "role": "assistant" - } + }, + "session_state": null } ], "object": "chat.completion" diff --git a/tests/snapshots/test_app/test_ask_rtr_hybrid/client1/result.json b/tests/snapshots/test_app/test_ask_rtr_hybrid/client1/result.json index fba6d28157..809a74e7a8 100644 --- a/tests/snapshots/test_app/test_ask_rtr_hybrid/client1/result.json +++ b/tests/snapshots/test_app/test_ask_rtr_hybrid/client1/result.json @@ -1,16 +1,17 @@ { "choices": [ { - "extra_args": { + "context": { "data_points": [ "Benefit_Options-2.pdf: There is a whistleblower policy." ], "thoughts": "Question:
What is the capital of France?

Prompt:
{'role': 'system', 'content': \"You are an intelligent assistant helping Contoso Inc employees with their healthcare plan questions and employee handbook questions. Use 'you' to refer to the individual asking the questions even if they ask with 'I'. Answer the following question using only the data provided in the sources below. For tabular information return it as an html table. Do not return markdown format. Each source has a name followed by colon and the actual information, always include the source name for each fact you use in the response. If you cannot answer using the sources below, say you don't know. Use below example to answer\"}\n\n{'role': 'user', 'content': \"\\n'What is the deductible for the employee plan for a visit to Overlake in Bellevue?'\\n\\nSources:\\ninfo1.txt: deductibles depend on whether you are in-network or out-of-network. In-network deductibles are $500 for employee and $1000 for family. Out-of-network deductibles are $1000 for employee and $2000 for family.\\ninfo2.pdf: Overlake is in-network for the employee plan.\\ninfo3.pdf: Overlake is the name of the area that includes a park and ride near Bellevue.\\ninfo4.pdf: In-network institutions include Overlake, Swedish and others in the region\\n\"}\n\n{'role': 'assistant', 'content': 'In-network deductibles are $500 for employee and $1000 for family [info1.txt] and Overlake is in-network for the employee plan [info2.pdf][info4.pdf].'}\n\n{'role': 'user', 'content': 'What is the capital of France?\\nSources:\\n Benefit_Options-2.pdf: There is a whistleblower policy.'}" }, "message": { - "content": "The capital of France is Paris.", + "content": "The capital of France is Paris. [Benefit_Options-2.pdf].", "role": "assistant" - } + }, + "session_state": null } ], "object": "chat.completion" diff --git a/tests/snapshots/test_app/test_ask_rtr_text/client0/result.json b/tests/snapshots/test_app/test_ask_rtr_text/client0/result.json index fba6d28157..809a74e7a8 100644 --- a/tests/snapshots/test_app/test_ask_rtr_text/client0/result.json +++ b/tests/snapshots/test_app/test_ask_rtr_text/client0/result.json @@ -1,16 +1,17 @@ { "choices": [ { - "extra_args": { + "context": { "data_points": [ "Benefit_Options-2.pdf: There is a whistleblower policy." ], "thoughts": "Question:
What is the capital of France?

Prompt:
{'role': 'system', 'content': \"You are an intelligent assistant helping Contoso Inc employees with their healthcare plan questions and employee handbook questions. Use 'you' to refer to the individual asking the questions even if they ask with 'I'. Answer the following question using only the data provided in the sources below. For tabular information return it as an html table. Do not return markdown format. Each source has a name followed by colon and the actual information, always include the source name for each fact you use in the response. If you cannot answer using the sources below, say you don't know. Use below example to answer\"}\n\n{'role': 'user', 'content': \"\\n'What is the deductible for the employee plan for a visit to Overlake in Bellevue?'\\n\\nSources:\\ninfo1.txt: deductibles depend on whether you are in-network or out-of-network. In-network deductibles are $500 for employee and $1000 for family. Out-of-network deductibles are $1000 for employee and $2000 for family.\\ninfo2.pdf: Overlake is in-network for the employee plan.\\ninfo3.pdf: Overlake is the name of the area that includes a park and ride near Bellevue.\\ninfo4.pdf: In-network institutions include Overlake, Swedish and others in the region\\n\"}\n\n{'role': 'assistant', 'content': 'In-network deductibles are $500 for employee and $1000 for family [info1.txt] and Overlake is in-network for the employee plan [info2.pdf][info4.pdf].'}\n\n{'role': 'user', 'content': 'What is the capital of France?\\nSources:\\n Benefit_Options-2.pdf: There is a whistleblower policy.'}" }, "message": { - "content": "The capital of France is Paris.", + "content": "The capital of France is Paris. [Benefit_Options-2.pdf].", "role": "assistant" - } + }, + "session_state": null } ], "object": "chat.completion" diff --git a/tests/snapshots/test_app/test_ask_rtr_text/client1/result.json b/tests/snapshots/test_app/test_ask_rtr_text/client1/result.json index fba6d28157..809a74e7a8 100644 --- a/tests/snapshots/test_app/test_ask_rtr_text/client1/result.json +++ b/tests/snapshots/test_app/test_ask_rtr_text/client1/result.json @@ -1,16 +1,17 @@ { "choices": [ { - "extra_args": { + "context": { "data_points": [ "Benefit_Options-2.pdf: There is a whistleblower policy." ], "thoughts": "Question:
What is the capital of France?

Prompt:
{'role': 'system', 'content': \"You are an intelligent assistant helping Contoso Inc employees with their healthcare plan questions and employee handbook questions. Use 'you' to refer to the individual asking the questions even if they ask with 'I'. Answer the following question using only the data provided in the sources below. For tabular information return it as an html table. Do not return markdown format. Each source has a name followed by colon and the actual information, always include the source name for each fact you use in the response. If you cannot answer using the sources below, say you don't know. Use below example to answer\"}\n\n{'role': 'user', 'content': \"\\n'What is the deductible for the employee plan for a visit to Overlake in Bellevue?'\\n\\nSources:\\ninfo1.txt: deductibles depend on whether you are in-network or out-of-network. In-network deductibles are $500 for employee and $1000 for family. Out-of-network deductibles are $1000 for employee and $2000 for family.\\ninfo2.pdf: Overlake is in-network for the employee plan.\\ninfo3.pdf: Overlake is the name of the area that includes a park and ride near Bellevue.\\ninfo4.pdf: In-network institutions include Overlake, Swedish and others in the region\\n\"}\n\n{'role': 'assistant', 'content': 'In-network deductibles are $500 for employee and $1000 for family [info1.txt] and Overlake is in-network for the employee plan [info2.pdf][info4.pdf].'}\n\n{'role': 'user', 'content': 'What is the capital of France?\\nSources:\\n Benefit_Options-2.pdf: There is a whistleblower policy.'}" }, "message": { - "content": "The capital of France is Paris.", + "content": "The capital of France is Paris. [Benefit_Options-2.pdf].", "role": "assistant" - } + }, + "session_state": null } ], "object": "chat.completion" diff --git a/tests/snapshots/test_app/test_ask_rtr_text_filter/auth_client0/result.json b/tests/snapshots/test_app/test_ask_rtr_text_filter/auth_client0/result.json index 87ebda374c..635be8acc9 100644 --- a/tests/snapshots/test_app/test_ask_rtr_text_filter/auth_client0/result.json +++ b/tests/snapshots/test_app/test_ask_rtr_text_filter/auth_client0/result.json @@ -1,14 +1,15 @@ { "choices": [ { - "extra_args": { + "context": { "data_points": [], "thoughts": "Question:
What is the capital of France?

Prompt:
{'role': 'system', 'content': \"You are an intelligent assistant helping Contoso Inc employees with their healthcare plan questions and employee handbook questions. Use 'you' to refer to the individual asking the questions even if they ask with 'I'. Answer the following question using only the data provided in the sources below. For tabular information return it as an html table. Do not return markdown format. Each source has a name followed by colon and the actual information, always include the source name for each fact you use in the response. If you cannot answer using the sources below, say you don't know. Use below example to answer\"}\n\n{'role': 'user', 'content': \"\\n'What is the deductible for the employee plan for a visit to Overlake in Bellevue?'\\n\\nSources:\\ninfo1.txt: deductibles depend on whether you are in-network or out-of-network. In-network deductibles are $500 for employee and $1000 for family. Out-of-network deductibles are $1000 for employee and $2000 for family.\\ninfo2.pdf: Overlake is in-network for the employee plan.\\ninfo3.pdf: Overlake is the name of the area that includes a park and ride near Bellevue.\\ninfo4.pdf: In-network institutions include Overlake, Swedish and others in the region\\n\"}\n\n{'role': 'assistant', 'content': 'In-network deductibles are $500 for employee and $1000 for family [info1.txt] and Overlake is in-network for the employee plan [info2.pdf][info4.pdf].'}\n\n{'role': 'user', 'content': 'What is the capital of France?\\nSources:\\n '}" }, "message": { - "content": "The capital of France is Paris.", + "content": "The capital of France is Paris. [Benefit_Options-2.pdf].", "role": "assistant" - } + }, + "session_state": null } ], "object": "chat.completion" diff --git a/tests/snapshots/test_app/test_ask_rtr_text_semanticcaptions/client0/result.json b/tests/snapshots/test_app/test_ask_rtr_text_semanticcaptions/client0/result.json index c400f9f5e9..0b2118eb52 100644 --- a/tests/snapshots/test_app/test_ask_rtr_text_semanticcaptions/client0/result.json +++ b/tests/snapshots/test_app/test_ask_rtr_text_semanticcaptions/client0/result.json @@ -1,16 +1,17 @@ { "choices": [ { - "extra_args": { + "context": { "data_points": [ "Benefit_Options-2.pdf: Caption: A whistleblower policy." ], "thoughts": "Question:
What is the capital of France?

Prompt:
{'role': 'system', 'content': \"You are an intelligent assistant helping Contoso Inc employees with their healthcare plan questions and employee handbook questions. Use 'you' to refer to the individual asking the questions even if they ask with 'I'. Answer the following question using only the data provided in the sources below. For tabular information return it as an html table. Do not return markdown format. Each source has a name followed by colon and the actual information, always include the source name for each fact you use in the response. If you cannot answer using the sources below, say you don't know. Use below example to answer\"}\n\n{'role': 'user', 'content': \"\\n'What is the deductible for the employee plan for a visit to Overlake in Bellevue?'\\n\\nSources:\\ninfo1.txt: deductibles depend on whether you are in-network or out-of-network. In-network deductibles are $500 for employee and $1000 for family. Out-of-network deductibles are $1000 for employee and $2000 for family.\\ninfo2.pdf: Overlake is in-network for the employee plan.\\ninfo3.pdf: Overlake is the name of the area that includes a park and ride near Bellevue.\\ninfo4.pdf: In-network institutions include Overlake, Swedish and others in the region\\n\"}\n\n{'role': 'assistant', 'content': 'In-network deductibles are $500 for employee and $1000 for family [info1.txt] and Overlake is in-network for the employee plan [info2.pdf][info4.pdf].'}\n\n{'role': 'user', 'content': 'What is the capital of France?\\nSources:\\n Benefit_Options-2.pdf: Caption: A whistleblower policy.'}" }, "message": { - "content": "The capital of France is Paris.", + "content": "The capital of France is Paris. [Benefit_Options-2.pdf].", "role": "assistant" - } + }, + "session_state": null } ], "object": "chat.completion" diff --git a/tests/snapshots/test_app/test_ask_rtr_text_semanticcaptions/client1/result.json b/tests/snapshots/test_app/test_ask_rtr_text_semanticcaptions/client1/result.json index c400f9f5e9..0b2118eb52 100644 --- a/tests/snapshots/test_app/test_ask_rtr_text_semanticcaptions/client1/result.json +++ b/tests/snapshots/test_app/test_ask_rtr_text_semanticcaptions/client1/result.json @@ -1,16 +1,17 @@ { "choices": [ { - "extra_args": { + "context": { "data_points": [ "Benefit_Options-2.pdf: Caption: A whistleblower policy." ], "thoughts": "Question:
What is the capital of France?

Prompt:
{'role': 'system', 'content': \"You are an intelligent assistant helping Contoso Inc employees with their healthcare plan questions and employee handbook questions. Use 'you' to refer to the individual asking the questions even if they ask with 'I'. Answer the following question using only the data provided in the sources below. For tabular information return it as an html table. Do not return markdown format. Each source has a name followed by colon and the actual information, always include the source name for each fact you use in the response. If you cannot answer using the sources below, say you don't know. Use below example to answer\"}\n\n{'role': 'user', 'content': \"\\n'What is the deductible for the employee plan for a visit to Overlake in Bellevue?'\\n\\nSources:\\ninfo1.txt: deductibles depend on whether you are in-network or out-of-network. In-network deductibles are $500 for employee and $1000 for family. Out-of-network deductibles are $1000 for employee and $2000 for family.\\ninfo2.pdf: Overlake is in-network for the employee plan.\\ninfo3.pdf: Overlake is the name of the area that includes a park and ride near Bellevue.\\ninfo4.pdf: In-network institutions include Overlake, Swedish and others in the region\\n\"}\n\n{'role': 'assistant', 'content': 'In-network deductibles are $500 for employee and $1000 for family [info1.txt] and Overlake is in-network for the employee plan [info2.pdf][info4.pdf].'}\n\n{'role': 'user', 'content': 'What is the capital of France?\\nSources:\\n Benefit_Options-2.pdf: Caption: A whistleblower policy.'}" }, "message": { - "content": "The capital of France is Paris.", + "content": "The capital of France is Paris. [Benefit_Options-2.pdf].", "role": "assistant" - } + }, + "session_state": null } ], "object": "chat.completion" diff --git a/tests/snapshots/test_app/test_ask_rtr_text_semanticranker/client0/result.json b/tests/snapshots/test_app/test_ask_rtr_text_semanticranker/client0/result.json index fba6d28157..809a74e7a8 100644 --- a/tests/snapshots/test_app/test_ask_rtr_text_semanticranker/client0/result.json +++ b/tests/snapshots/test_app/test_ask_rtr_text_semanticranker/client0/result.json @@ -1,16 +1,17 @@ { "choices": [ { - "extra_args": { + "context": { "data_points": [ "Benefit_Options-2.pdf: There is a whistleblower policy." ], "thoughts": "Question:
What is the capital of France?

Prompt:
{'role': 'system', 'content': \"You are an intelligent assistant helping Contoso Inc employees with their healthcare plan questions and employee handbook questions. Use 'you' to refer to the individual asking the questions even if they ask with 'I'. Answer the following question using only the data provided in the sources below. For tabular information return it as an html table. Do not return markdown format. Each source has a name followed by colon and the actual information, always include the source name for each fact you use in the response. If you cannot answer using the sources below, say you don't know. Use below example to answer\"}\n\n{'role': 'user', 'content': \"\\n'What is the deductible for the employee plan for a visit to Overlake in Bellevue?'\\n\\nSources:\\ninfo1.txt: deductibles depend on whether you are in-network or out-of-network. In-network deductibles are $500 for employee and $1000 for family. Out-of-network deductibles are $1000 for employee and $2000 for family.\\ninfo2.pdf: Overlake is in-network for the employee plan.\\ninfo3.pdf: Overlake is the name of the area that includes a park and ride near Bellevue.\\ninfo4.pdf: In-network institutions include Overlake, Swedish and others in the region\\n\"}\n\n{'role': 'assistant', 'content': 'In-network deductibles are $500 for employee and $1000 for family [info1.txt] and Overlake is in-network for the employee plan [info2.pdf][info4.pdf].'}\n\n{'role': 'user', 'content': 'What is the capital of France?\\nSources:\\n Benefit_Options-2.pdf: There is a whistleblower policy.'}" }, "message": { - "content": "The capital of France is Paris.", + "content": "The capital of France is Paris. [Benefit_Options-2.pdf].", "role": "assistant" - } + }, + "session_state": null } ], "object": "chat.completion" diff --git a/tests/snapshots/test_app/test_ask_rtr_text_semanticranker/client1/result.json b/tests/snapshots/test_app/test_ask_rtr_text_semanticranker/client1/result.json index fba6d28157..809a74e7a8 100644 --- a/tests/snapshots/test_app/test_ask_rtr_text_semanticranker/client1/result.json +++ b/tests/snapshots/test_app/test_ask_rtr_text_semanticranker/client1/result.json @@ -1,16 +1,17 @@ { "choices": [ { - "extra_args": { + "context": { "data_points": [ "Benefit_Options-2.pdf: There is a whistleblower policy." ], "thoughts": "Question:
What is the capital of France?

Prompt:
{'role': 'system', 'content': \"You are an intelligent assistant helping Contoso Inc employees with their healthcare plan questions and employee handbook questions. Use 'you' to refer to the individual asking the questions even if they ask with 'I'. Answer the following question using only the data provided in the sources below. For tabular information return it as an html table. Do not return markdown format. Each source has a name followed by colon and the actual information, always include the source name for each fact you use in the response. If you cannot answer using the sources below, say you don't know. Use below example to answer\"}\n\n{'role': 'user', 'content': \"\\n'What is the deductible for the employee plan for a visit to Overlake in Bellevue?'\\n\\nSources:\\ninfo1.txt: deductibles depend on whether you are in-network or out-of-network. In-network deductibles are $500 for employee and $1000 for family. Out-of-network deductibles are $1000 for employee and $2000 for family.\\ninfo2.pdf: Overlake is in-network for the employee plan.\\ninfo3.pdf: Overlake is the name of the area that includes a park and ride near Bellevue.\\ninfo4.pdf: In-network institutions include Overlake, Swedish and others in the region\\n\"}\n\n{'role': 'assistant', 'content': 'In-network deductibles are $500 for employee and $1000 for family [info1.txt] and Overlake is in-network for the employee plan [info2.pdf][info4.pdf].'}\n\n{'role': 'user', 'content': 'What is the capital of France?\\nSources:\\n Benefit_Options-2.pdf: There is a whistleblower policy.'}" }, "message": { - "content": "The capital of France is Paris.", + "content": "The capital of France is Paris. [Benefit_Options-2.pdf].", "role": "assistant" - } + }, + "session_state": null } ], "object": "chat.completion" diff --git a/tests/snapshots/test_app/test_ask_session_state_persists/client0/result.json b/tests/snapshots/test_app/test_ask_session_state_persists/client0/result.json new file mode 100644 index 0000000000..f194c956e5 --- /dev/null +++ b/tests/snapshots/test_app/test_ask_session_state_persists/client0/result.json @@ -0,0 +1,20 @@ +{ + "choices": [ + { + "context": { + "data_points": [ + "Benefit_Options-2.pdf: There is a whistleblower policy." + ], + "thoughts": "Question:
What is the capital of France?

Prompt:
{'role': 'system', 'content': \"You are an intelligent assistant helping Contoso Inc employees with their healthcare plan questions and employee handbook questions. Use 'you' to refer to the individual asking the questions even if they ask with 'I'. Answer the following question using only the data provided in the sources below. For tabular information return it as an html table. Do not return markdown format. Each source has a name followed by colon and the actual information, always include the source name for each fact you use in the response. If you cannot answer using the sources below, say you don't know. Use below example to answer\"}\n\n{'role': 'user', 'content': \"\\n'What is the deductible for the employee plan for a visit to Overlake in Bellevue?'\\n\\nSources:\\ninfo1.txt: deductibles depend on whether you are in-network or out-of-network. In-network deductibles are $500 for employee and $1000 for family. Out-of-network deductibles are $1000 for employee and $2000 for family.\\ninfo2.pdf: Overlake is in-network for the employee plan.\\ninfo3.pdf: Overlake is the name of the area that includes a park and ride near Bellevue.\\ninfo4.pdf: In-network institutions include Overlake, Swedish and others in the region\\n\"}\n\n{'role': 'assistant', 'content': 'In-network deductibles are $500 for employee and $1000 for family [info1.txt] and Overlake is in-network for the employee plan [info2.pdf][info4.pdf].'}\n\n{'role': 'user', 'content': 'What is the capital of France?\\nSources:\\n Benefit_Options-2.pdf: There is a whistleblower policy.'}" + }, + "message": { + "content": "The capital of France is Paris. [Benefit_Options-2.pdf].", + "role": "assistant" + }, + "session_state": { + "conversation_id": 1234 + } + } + ], + "object": "chat.completion" +} \ No newline at end of file diff --git a/tests/snapshots/test_app/test_ask_session_state_persists/client1/result.json b/tests/snapshots/test_app/test_ask_session_state_persists/client1/result.json new file mode 100644 index 0000000000..f194c956e5 --- /dev/null +++ b/tests/snapshots/test_app/test_ask_session_state_persists/client1/result.json @@ -0,0 +1,20 @@ +{ + "choices": [ + { + "context": { + "data_points": [ + "Benefit_Options-2.pdf: There is a whistleblower policy." + ], + "thoughts": "Question:
What is the capital of France?

Prompt:
{'role': 'system', 'content': \"You are an intelligent assistant helping Contoso Inc employees with their healthcare plan questions and employee handbook questions. Use 'you' to refer to the individual asking the questions even if they ask with 'I'. Answer the following question using only the data provided in the sources below. For tabular information return it as an html table. Do not return markdown format. Each source has a name followed by colon and the actual information, always include the source name for each fact you use in the response. If you cannot answer using the sources below, say you don't know. Use below example to answer\"}\n\n{'role': 'user', 'content': \"\\n'What is the deductible for the employee plan for a visit to Overlake in Bellevue?'\\n\\nSources:\\ninfo1.txt: deductibles depend on whether you are in-network or out-of-network. In-network deductibles are $500 for employee and $1000 for family. Out-of-network deductibles are $1000 for employee and $2000 for family.\\ninfo2.pdf: Overlake is in-network for the employee plan.\\ninfo3.pdf: Overlake is the name of the area that includes a park and ride near Bellevue.\\ninfo4.pdf: In-network institutions include Overlake, Swedish and others in the region\\n\"}\n\n{'role': 'assistant', 'content': 'In-network deductibles are $500 for employee and $1000 for family [info1.txt] and Overlake is in-network for the employee plan [info2.pdf][info4.pdf].'}\n\n{'role': 'user', 'content': 'What is the capital of France?\\nSources:\\n Benefit_Options-2.pdf: There is a whistleblower policy.'}" + }, + "message": { + "content": "The capital of France is Paris. [Benefit_Options-2.pdf].", + "role": "assistant" + }, + "session_state": { + "conversation_id": 1234 + } + } + ], + "object": "chat.completion" +} \ No newline at end of file diff --git a/tests/snapshots/test_app/test_chat_hybrid/client0/result.json b/tests/snapshots/test_app/test_chat_hybrid/client0/result.json index 8ab51eb41c..1bb8a6fc64 100644 --- a/tests/snapshots/test_app/test_chat_hybrid/client0/result.json +++ b/tests/snapshots/test_app/test_chat_hybrid/client0/result.json @@ -1,16 +1,17 @@ { "choices": [ { - "extra_args": { + "context": { "data_points": [ "Benefit_Options-2.pdf: There is a whistleblower policy." ], "thoughts": "Searched for:
capital of France

Conversations:
{'role': 'system', 'content': \"Assistant helps the company employees with their healthcare plan questions, and questions about the employee handbook. Be brief in your answers.\\nAnswer ONLY with the facts listed in the list of sources below. If there isn't enough information below, say you don't know. Do not generate answers that don't use the sources below. If asking a clarifying question to the user would help, ask the question.\\nFor tabular information return it as an html table. Do not return markdown format. If the question is not in English, answer in the language used in the question.\\nEach source has a name followed by colon and the actual information, always include the source name for each fact you use in the response. Use square brackets to reference the source, e.g. [info1.txt]. Don't combine sources, list each source separately, e.g. [info1.txt][info2.pdf].\\n\\n\\n\"}

{'role': 'user', 'content': 'What is the capital of France?\\n\\nSources:\\nBenefit_Options-2.pdf: There is a whistleblower policy.'}" }, "message": { - "content": "The capital of France is Paris.", + "content": "The capital of France is Paris. [Benefit_Options-2.pdf].", "role": "assistant" - } + }, + "session_state": null } ], "object": "chat.completion" diff --git a/tests/snapshots/test_app/test_chat_hybrid/client1/result.json b/tests/snapshots/test_app/test_chat_hybrid/client1/result.json index 8ab51eb41c..1bb8a6fc64 100644 --- a/tests/snapshots/test_app/test_chat_hybrid/client1/result.json +++ b/tests/snapshots/test_app/test_chat_hybrid/client1/result.json @@ -1,16 +1,17 @@ { "choices": [ { - "extra_args": { + "context": { "data_points": [ "Benefit_Options-2.pdf: There is a whistleblower policy." ], "thoughts": "Searched for:
capital of France

Conversations:
{'role': 'system', 'content': \"Assistant helps the company employees with their healthcare plan questions, and questions about the employee handbook. Be brief in your answers.\\nAnswer ONLY with the facts listed in the list of sources below. If there isn't enough information below, say you don't know. Do not generate answers that don't use the sources below. If asking a clarifying question to the user would help, ask the question.\\nFor tabular information return it as an html table. Do not return markdown format. If the question is not in English, answer in the language used in the question.\\nEach source has a name followed by colon and the actual information, always include the source name for each fact you use in the response. Use square brackets to reference the source, e.g. [info1.txt]. Don't combine sources, list each source separately, e.g. [info1.txt][info2.pdf].\\n\\n\\n\"}

{'role': 'user', 'content': 'What is the capital of France?\\n\\nSources:\\nBenefit_Options-2.pdf: There is a whistleblower policy.'}" }, "message": { - "content": "The capital of France is Paris.", + "content": "The capital of France is Paris. [Benefit_Options-2.pdf].", "role": "assistant" - } + }, + "session_state": null } ], "object": "chat.completion" diff --git a/tests/snapshots/test_app/test_chat_prompt_template/client0/result.json b/tests/snapshots/test_app/test_chat_prompt_template/client0/result.json index 2a92fc548e..5e1b1726a1 100644 --- a/tests/snapshots/test_app/test_chat_prompt_template/client0/result.json +++ b/tests/snapshots/test_app/test_chat_prompt_template/client0/result.json @@ -1,16 +1,17 @@ { "choices": [ { - "extra_args": { + "context": { "data_points": [ "Benefit_Options-2.pdf: There is a whistleblower policy." ], "thoughts": "Searched for:
capital of France

Conversations:
{'role': 'system', 'content': 'You are a cat.'}

{'role': 'user', 'content': 'What is the capital of France?\\n\\nSources:\\nBenefit_Options-2.pdf: There is a whistleblower policy.'}" }, "message": { - "content": "The capital of France is Paris.", + "content": "The capital of France is Paris. [Benefit_Options-2.pdf].", "role": "assistant" - } + }, + "session_state": null } ], "object": "chat.completion" diff --git a/tests/snapshots/test_app/test_chat_prompt_template/client1/result.json b/tests/snapshots/test_app/test_chat_prompt_template/client1/result.json index 2a92fc548e..5e1b1726a1 100644 --- a/tests/snapshots/test_app/test_chat_prompt_template/client1/result.json +++ b/tests/snapshots/test_app/test_chat_prompt_template/client1/result.json @@ -1,16 +1,17 @@ { "choices": [ { - "extra_args": { + "context": { "data_points": [ "Benefit_Options-2.pdf: There is a whistleblower policy." ], "thoughts": "Searched for:
capital of France

Conversations:
{'role': 'system', 'content': 'You are a cat.'}

{'role': 'user', 'content': 'What is the capital of France?\\n\\nSources:\\nBenefit_Options-2.pdf: There is a whistleblower policy.'}" }, "message": { - "content": "The capital of France is Paris.", + "content": "The capital of France is Paris. [Benefit_Options-2.pdf].", "role": "assistant" - } + }, + "session_state": null } ], "object": "chat.completion" diff --git a/tests/snapshots/test_app/test_chat_prompt_template_concat/client0/result.json b/tests/snapshots/test_app/test_chat_prompt_template_concat/client0/result.json index 2d64cd3486..c000a96511 100644 --- a/tests/snapshots/test_app/test_chat_prompt_template_concat/client0/result.json +++ b/tests/snapshots/test_app/test_chat_prompt_template_concat/client0/result.json @@ -1,16 +1,17 @@ { "choices": [ { - "extra_args": { + "context": { "data_points": [ "Benefit_Options-2.pdf: There is a whistleblower policy." ], "thoughts": "Searched for:
capital of France

Conversations:
{'role': 'system', 'content': \"Assistant helps the company employees with their healthcare plan questions, and questions about the employee handbook. Be brief in your answers.\\nAnswer ONLY with the facts listed in the list of sources below. If there isn't enough information below, say you don't know. Do not generate answers that don't use the sources below. If asking a clarifying question to the user would help, ask the question.\\nFor tabular information return it as an html table. Do not return markdown format. If the question is not in English, answer in the language used in the question.\\nEach source has a name followed by colon and the actual information, always include the source name for each fact you use in the response. Use square brackets to reference the source, e.g. [info1.txt]. Don't combine sources, list each source separately, e.g. [info1.txt][info2.pdf].\\n\\n Meow like a cat.\\n\\n\"}

{'role': 'user', 'content': 'What is the capital of France?\\n\\nSources:\\nBenefit_Options-2.pdf: There is a whistleblower policy.'}" }, "message": { - "content": "The capital of France is Paris.", + "content": "The capital of France is Paris. [Benefit_Options-2.pdf].", "role": "assistant" - } + }, + "session_state": null } ], "object": "chat.completion" diff --git a/tests/snapshots/test_app/test_chat_prompt_template_concat/client1/result.json b/tests/snapshots/test_app/test_chat_prompt_template_concat/client1/result.json index 2d64cd3486..c000a96511 100644 --- a/tests/snapshots/test_app/test_chat_prompt_template_concat/client1/result.json +++ b/tests/snapshots/test_app/test_chat_prompt_template_concat/client1/result.json @@ -1,16 +1,17 @@ { "choices": [ { - "extra_args": { + "context": { "data_points": [ "Benefit_Options-2.pdf: There is a whistleblower policy." ], "thoughts": "Searched for:
capital of France

Conversations:
{'role': 'system', 'content': \"Assistant helps the company employees with their healthcare plan questions, and questions about the employee handbook. Be brief in your answers.\\nAnswer ONLY with the facts listed in the list of sources below. If there isn't enough information below, say you don't know. Do not generate answers that don't use the sources below. If asking a clarifying question to the user would help, ask the question.\\nFor tabular information return it as an html table. Do not return markdown format. If the question is not in English, answer in the language used in the question.\\nEach source has a name followed by colon and the actual information, always include the source name for each fact you use in the response. Use square brackets to reference the source, e.g. [info1.txt]. Don't combine sources, list each source separately, e.g. [info1.txt][info2.pdf].\\n\\n Meow like a cat.\\n\\n\"}

{'role': 'user', 'content': 'What is the capital of France?\\n\\nSources:\\nBenefit_Options-2.pdf: There is a whistleblower policy.'}" }, "message": { - "content": "The capital of France is Paris.", + "content": "The capital of France is Paris. [Benefit_Options-2.pdf].", "role": "assistant" - } + }, + "session_state": null } ], "object": "chat.completion" diff --git a/tests/snapshots/test_app/test_chat_session_state_persists/client0/result.json b/tests/snapshots/test_app/test_chat_session_state_persists/client0/result.json new file mode 100644 index 0000000000..a9325a1f9d --- /dev/null +++ b/tests/snapshots/test_app/test_chat_session_state_persists/client0/result.json @@ -0,0 +1,20 @@ +{ + "choices": [ + { + "context": { + "data_points": [ + "Benefit_Options-2.pdf: There is a whistleblower policy." + ], + "thoughts": "Searched for:
capital of France

Conversations:
{'role': 'system', 'content': \"Assistant helps the company employees with their healthcare plan questions, and questions about the employee handbook. Be brief in your answers.\\nAnswer ONLY with the facts listed in the list of sources below. If there isn't enough information below, say you don't know. Do not generate answers that don't use the sources below. If asking a clarifying question to the user would help, ask the question.\\nFor tabular information return it as an html table. Do not return markdown format. If the question is not in English, answer in the language used in the question.\\nEach source has a name followed by colon and the actual information, always include the source name for each fact you use in the response. Use square brackets to reference the source, e.g. [info1.txt]. Don't combine sources, list each source separately, e.g. [info1.txt][info2.pdf].\\n\\n\\n\"}

{'role': 'user', 'content': 'What is the capital of France?\\n\\nSources:\\nBenefit_Options-2.pdf: There is a whistleblower policy.'}" + }, + "message": { + "content": "The capital of France is Paris. [Benefit_Options-2.pdf].", + "role": "assistant" + }, + "session_state": { + "conversation_id": 1234 + } + } + ], + "object": "chat.completion" +} \ No newline at end of file diff --git a/tests/snapshots/test_app/test_chat_session_state_persists/client1/result.json b/tests/snapshots/test_app/test_chat_session_state_persists/client1/result.json new file mode 100644 index 0000000000..a9325a1f9d --- /dev/null +++ b/tests/snapshots/test_app/test_chat_session_state_persists/client1/result.json @@ -0,0 +1,20 @@ +{ + "choices": [ + { + "context": { + "data_points": [ + "Benefit_Options-2.pdf: There is a whistleblower policy." + ], + "thoughts": "Searched for:
capital of France

Conversations:
{'role': 'system', 'content': \"Assistant helps the company employees with their healthcare plan questions, and questions about the employee handbook. Be brief in your answers.\\nAnswer ONLY with the facts listed in the list of sources below. If there isn't enough information below, say you don't know. Do not generate answers that don't use the sources below. If asking a clarifying question to the user would help, ask the question.\\nFor tabular information return it as an html table. Do not return markdown format. If the question is not in English, answer in the language used in the question.\\nEach source has a name followed by colon and the actual information, always include the source name for each fact you use in the response. Use square brackets to reference the source, e.g. [info1.txt]. Don't combine sources, list each source separately, e.g. [info1.txt][info2.pdf].\\n\\n\\n\"}

{'role': 'user', 'content': 'What is the capital of France?\\n\\nSources:\\nBenefit_Options-2.pdf: There is a whistleblower policy.'}" + }, + "message": { + "content": "The capital of France is Paris. [Benefit_Options-2.pdf].", + "role": "assistant" + }, + "session_state": { + "conversation_id": 1234 + } + } + ], + "object": "chat.completion" +} \ No newline at end of file diff --git a/tests/snapshots/test_app/test_chat_stream_session_state_persists/client0/result.jsonlines b/tests/snapshots/test_app/test_chat_stream_session_state_persists/client0/result.jsonlines new file mode 100644 index 0000000000..904ca7edf9 --- /dev/null +++ b/tests/snapshots/test_app/test_chat_stream_session_state_persists/client0/result.jsonlines @@ -0,0 +1,3 @@ +{"choices": [{"delta": {"role": "assistant"}, "context": {"data_points": ["Benefit_Options-2.pdf: There is a whistleblower policy."], "thoughts": "Searched for:
capital of France

Conversations:
{'role': 'system', 'content': \"Assistant helps the company employees with their healthcare plan questions, and questions about the employee handbook. Be brief in your answers.\\nAnswer ONLY with the facts listed in the list of sources below. If there isn't enough information below, say you don't know. Do not generate answers that don't use the sources below. If asking a clarifying question to the user would help, ask the question.\\nFor tabular information return it as an html table. Do not return markdown format. If the question is not in English, answer in the language used in the question.\\nEach source has a name followed by colon and the actual information, always include the source name for each fact you use in the response. Use square brackets to reference the source, e.g. [info1.txt]. Don't combine sources, list each source separately, e.g. [info1.txt][info2.pdf].\\n\\n\\n\"}

{'role': 'user', 'content': 'What is the capital of France?\\n\\nSources:\\nBenefit_Options-2.pdf: There is a whistleblower policy.'}"}, "session_state": {"conversation_id": 1234}, "finish_reason": null, "index": 0}], "object": "chat.completion.chunk"} +{"object": "chat.completion.chunk", "choices": [{"delta": {"role": "assistant"}}]} +{"object": "chat.completion.chunk", "choices": [{"delta": {"content": "The capital of France is Paris. [Benefit_Options-2.pdf]."}}]} diff --git a/tests/snapshots/test_app/test_chat_stream_session_state_persists/client1/result.jsonlines b/tests/snapshots/test_app/test_chat_stream_session_state_persists/client1/result.jsonlines new file mode 100644 index 0000000000..904ca7edf9 --- /dev/null +++ b/tests/snapshots/test_app/test_chat_stream_session_state_persists/client1/result.jsonlines @@ -0,0 +1,3 @@ +{"choices": [{"delta": {"role": "assistant"}, "context": {"data_points": ["Benefit_Options-2.pdf: There is a whistleblower policy."], "thoughts": "Searched for:
capital of France

Conversations:
{'role': 'system', 'content': \"Assistant helps the company employees with their healthcare plan questions, and questions about the employee handbook. Be brief in your answers.\\nAnswer ONLY with the facts listed in the list of sources below. If there isn't enough information below, say you don't know. Do not generate answers that don't use the sources below. If asking a clarifying question to the user would help, ask the question.\\nFor tabular information return it as an html table. Do not return markdown format. If the question is not in English, answer in the language used in the question.\\nEach source has a name followed by colon and the actual information, always include the source name for each fact you use in the response. Use square brackets to reference the source, e.g. [info1.txt]. Don't combine sources, list each source separately, e.g. [info1.txt][info2.pdf].\\n\\n\\n\"}

{'role': 'user', 'content': 'What is the capital of France?\\n\\nSources:\\nBenefit_Options-2.pdf: There is a whistleblower policy.'}"}, "session_state": {"conversation_id": 1234}, "finish_reason": null, "index": 0}], "object": "chat.completion.chunk"} +{"object": "chat.completion.chunk", "choices": [{"delta": {"role": "assistant"}}]} +{"object": "chat.completion.chunk", "choices": [{"delta": {"content": "The capital of France is Paris. [Benefit_Options-2.pdf]."}}]} diff --git a/tests/snapshots/test_app/test_chat_stream_text/client0/result.jsonlines b/tests/snapshots/test_app/test_chat_stream_text/client0/result.jsonlines index 4ad2e5c111..a702fe72d5 100644 --- a/tests/snapshots/test_app/test_chat_stream_text/client0/result.jsonlines +++ b/tests/snapshots/test_app/test_chat_stream_text/client0/result.jsonlines @@ -1,3 +1,3 @@ -{"choices": [{"delta": {"role": "assistant"}, "extra_args": {"data_points": ["Benefit_Options-2.pdf: There is a whistleblower policy."], "thoughts": "Searched for:
capital of France

Conversations:
{'role': 'system', 'content': \"Assistant helps the company employees with their healthcare plan questions, and questions about the employee handbook. Be brief in your answers.\\nAnswer ONLY with the facts listed in the list of sources below. If there isn't enough information below, say you don't know. Do not generate answers that don't use the sources below. If asking a clarifying question to the user would help, ask the question.\\nFor tabular information return it as an html table. Do not return markdown format. If the question is not in English, answer in the language used in the question.\\nEach source has a name followed by colon and the actual information, always include the source name for each fact you use in the response. Use square brackets to reference the source, e.g. [info1.txt]. Don't combine sources, list each source separately, e.g. [info1.txt][info2.pdf].\\n\\n\\n\"}

{'role': 'user', 'content': 'What is the capital of France?\\n\\nSources:\\nBenefit_Options-2.pdf: There is a whistleblower policy.'}"}, "finish_reason": null, "index": 0}], "object": "chat.completion.chunk"} +{"choices": [{"delta": {"role": "assistant"}, "context": {"data_points": ["Benefit_Options-2.pdf: There is a whistleblower policy."], "thoughts": "Searched for:
capital of France

Conversations:
{'role': 'system', 'content': \"Assistant helps the company employees with their healthcare plan questions, and questions about the employee handbook. Be brief in your answers.\\nAnswer ONLY with the facts listed in the list of sources below. If there isn't enough information below, say you don't know. Do not generate answers that don't use the sources below. If asking a clarifying question to the user would help, ask the question.\\nFor tabular information return it as an html table. Do not return markdown format. If the question is not in English, answer in the language used in the question.\\nEach source has a name followed by colon and the actual information, always include the source name for each fact you use in the response. Use square brackets to reference the source, e.g. [info1.txt]. Don't combine sources, list each source separately, e.g. [info1.txt][info2.pdf].\\n\\n\\n\"}

{'role': 'user', 'content': 'What is the capital of France?\\n\\nSources:\\nBenefit_Options-2.pdf: There is a whistleblower policy.'}"}, "session_state": null, "finish_reason": null, "index": 0}], "object": "chat.completion.chunk"} {"object": "chat.completion.chunk", "choices": [{"delta": {"role": "assistant"}}]} -{"object": "chat.completion.chunk", "choices": [{"delta": {"content": "The capital of France is Paris."}}]} +{"object": "chat.completion.chunk", "choices": [{"delta": {"content": "The capital of France is Paris. [Benefit_Options-2.pdf]."}}]} diff --git a/tests/snapshots/test_app/test_chat_stream_text/client1/result.jsonlines b/tests/snapshots/test_app/test_chat_stream_text/client1/result.jsonlines index 4ad2e5c111..a702fe72d5 100644 --- a/tests/snapshots/test_app/test_chat_stream_text/client1/result.jsonlines +++ b/tests/snapshots/test_app/test_chat_stream_text/client1/result.jsonlines @@ -1,3 +1,3 @@ -{"choices": [{"delta": {"role": "assistant"}, "extra_args": {"data_points": ["Benefit_Options-2.pdf: There is a whistleblower policy."], "thoughts": "Searched for:
capital of France

Conversations:
{'role': 'system', 'content': \"Assistant helps the company employees with their healthcare plan questions, and questions about the employee handbook. Be brief in your answers.\\nAnswer ONLY with the facts listed in the list of sources below. If there isn't enough information below, say you don't know. Do not generate answers that don't use the sources below. If asking a clarifying question to the user would help, ask the question.\\nFor tabular information return it as an html table. Do not return markdown format. If the question is not in English, answer in the language used in the question.\\nEach source has a name followed by colon and the actual information, always include the source name for each fact you use in the response. Use square brackets to reference the source, e.g. [info1.txt]. Don't combine sources, list each source separately, e.g. [info1.txt][info2.pdf].\\n\\n\\n\"}

{'role': 'user', 'content': 'What is the capital of France?\\n\\nSources:\\nBenefit_Options-2.pdf: There is a whistleblower policy.'}"}, "finish_reason": null, "index": 0}], "object": "chat.completion.chunk"} +{"choices": [{"delta": {"role": "assistant"}, "context": {"data_points": ["Benefit_Options-2.pdf: There is a whistleblower policy."], "thoughts": "Searched for:
capital of France

Conversations:
{'role': 'system', 'content': \"Assistant helps the company employees with their healthcare plan questions, and questions about the employee handbook. Be brief in your answers.\\nAnswer ONLY with the facts listed in the list of sources below. If there isn't enough information below, say you don't know. Do not generate answers that don't use the sources below. If asking a clarifying question to the user would help, ask the question.\\nFor tabular information return it as an html table. Do not return markdown format. If the question is not in English, answer in the language used in the question.\\nEach source has a name followed by colon and the actual information, always include the source name for each fact you use in the response. Use square brackets to reference the source, e.g. [info1.txt]. Don't combine sources, list each source separately, e.g. [info1.txt][info2.pdf].\\n\\n\\n\"}

{'role': 'user', 'content': 'What is the capital of France?\\n\\nSources:\\nBenefit_Options-2.pdf: There is a whistleblower policy.'}"}, "session_state": null, "finish_reason": null, "index": 0}], "object": "chat.completion.chunk"} {"object": "chat.completion.chunk", "choices": [{"delta": {"role": "assistant"}}]} -{"object": "chat.completion.chunk", "choices": [{"delta": {"content": "The capital of France is Paris."}}]} +{"object": "chat.completion.chunk", "choices": [{"delta": {"content": "The capital of France is Paris. [Benefit_Options-2.pdf]."}}]} diff --git a/tests/snapshots/test_app/test_chat_stream_text_filter/auth_client0/result.jsonlines b/tests/snapshots/test_app/test_chat_stream_text_filter/auth_client0/result.jsonlines index cc6d520bcd..9f0c584b47 100644 --- a/tests/snapshots/test_app/test_chat_stream_text_filter/auth_client0/result.jsonlines +++ b/tests/snapshots/test_app/test_chat_stream_text_filter/auth_client0/result.jsonlines @@ -1,3 +1,3 @@ -{"choices": [{"delta": {"role": "assistant"}, "extra_args": {"data_points": [], "thoughts": "Searched for:
capital of France

Conversations:
{'role': 'system', 'content': \"Assistant helps the company employees with their healthcare plan questions, and questions about the employee handbook. Be brief in your answers.\\nAnswer ONLY with the facts listed in the list of sources below. If there isn't enough information below, say you don't know. Do not generate answers that don't use the sources below. If asking a clarifying question to the user would help, ask the question.\\nFor tabular information return it as an html table. Do not return markdown format. If the question is not in English, answer in the language used in the question.\\nEach source has a name followed by colon and the actual information, always include the source name for each fact you use in the response. Use square brackets to reference the source, e.g. [info1.txt]. Don't combine sources, list each source separately, e.g. [info1.txt][info2.pdf].\\n\\n\\n\"}

{'role': 'user', 'content': 'What is the capital of France?\\n\\nSources:\\n'}"}, "finish_reason": null, "index": 0}], "object": "chat.completion.chunk"} +{"choices": [{"delta": {"role": "assistant"}, "context": {"data_points": [], "thoughts": "Searched for:
capital of France

Conversations:
{'role': 'system', 'content': \"Assistant helps the company employees with their healthcare plan questions, and questions about the employee handbook. Be brief in your answers.\\nAnswer ONLY with the facts listed in the list of sources below. If there isn't enough information below, say you don't know. Do not generate answers that don't use the sources below. If asking a clarifying question to the user would help, ask the question.\\nFor tabular information return it as an html table. Do not return markdown format. If the question is not in English, answer in the language used in the question.\\nEach source has a name followed by colon and the actual information, always include the source name for each fact you use in the response. Use square brackets to reference the source, e.g. [info1.txt]. Don't combine sources, list each source separately, e.g. [info1.txt][info2.pdf].\\n\\n\\n\"}

{'role': 'user', 'content': 'What is the capital of France?\\n\\nSources:\\n'}"}, "session_state": null, "finish_reason": null, "index": 0}], "object": "chat.completion.chunk"} {"object": "chat.completion.chunk", "choices": [{"delta": {"role": "assistant"}}]} -{"object": "chat.completion.chunk", "choices": [{"delta": {"content": "The capital of France is Paris."}}]} +{"object": "chat.completion.chunk", "choices": [{"delta": {"content": "The capital of France is Paris. [Benefit_Options-2.pdf]."}}]} diff --git a/tests/snapshots/test_app/test_chat_text/client0/result.json b/tests/snapshots/test_app/test_chat_text/client0/result.json index 8ab51eb41c..1bb8a6fc64 100644 --- a/tests/snapshots/test_app/test_chat_text/client0/result.json +++ b/tests/snapshots/test_app/test_chat_text/client0/result.json @@ -1,16 +1,17 @@ { "choices": [ { - "extra_args": { + "context": { "data_points": [ "Benefit_Options-2.pdf: There is a whistleblower policy." ], "thoughts": "Searched for:
capital of France

Conversations:
{'role': 'system', 'content': \"Assistant helps the company employees with their healthcare plan questions, and questions about the employee handbook. Be brief in your answers.\\nAnswer ONLY with the facts listed in the list of sources below. If there isn't enough information below, say you don't know. Do not generate answers that don't use the sources below. If asking a clarifying question to the user would help, ask the question.\\nFor tabular information return it as an html table. Do not return markdown format. If the question is not in English, answer in the language used in the question.\\nEach source has a name followed by colon and the actual information, always include the source name for each fact you use in the response. Use square brackets to reference the source, e.g. [info1.txt]. Don't combine sources, list each source separately, e.g. [info1.txt][info2.pdf].\\n\\n\\n\"}

{'role': 'user', 'content': 'What is the capital of France?\\n\\nSources:\\nBenefit_Options-2.pdf: There is a whistleblower policy.'}" }, "message": { - "content": "The capital of France is Paris.", + "content": "The capital of France is Paris. [Benefit_Options-2.pdf].", "role": "assistant" - } + }, + "session_state": null } ], "object": "chat.completion" diff --git a/tests/snapshots/test_app/test_chat_text/client1/result.json b/tests/snapshots/test_app/test_chat_text/client1/result.json index 8ab51eb41c..1bb8a6fc64 100644 --- a/tests/snapshots/test_app/test_chat_text/client1/result.json +++ b/tests/snapshots/test_app/test_chat_text/client1/result.json @@ -1,16 +1,17 @@ { "choices": [ { - "extra_args": { + "context": { "data_points": [ "Benefit_Options-2.pdf: There is a whistleblower policy." ], "thoughts": "Searched for:
capital of France

Conversations:
{'role': 'system', 'content': \"Assistant helps the company employees with their healthcare plan questions, and questions about the employee handbook. Be brief in your answers.\\nAnswer ONLY with the facts listed in the list of sources below. If there isn't enough information below, say you don't know. Do not generate answers that don't use the sources below. If asking a clarifying question to the user would help, ask the question.\\nFor tabular information return it as an html table. Do not return markdown format. If the question is not in English, answer in the language used in the question.\\nEach source has a name followed by colon and the actual information, always include the source name for each fact you use in the response. Use square brackets to reference the source, e.g. [info1.txt]. Don't combine sources, list each source separately, e.g. [info1.txt][info2.pdf].\\n\\n\\n\"}

{'role': 'user', 'content': 'What is the capital of France?\\n\\nSources:\\nBenefit_Options-2.pdf: There is a whistleblower policy.'}" }, "message": { - "content": "The capital of France is Paris.", + "content": "The capital of France is Paris. [Benefit_Options-2.pdf].", "role": "assistant" - } + }, + "session_state": null } ], "object": "chat.completion" diff --git a/tests/snapshots/test_app/test_chat_text_filter/auth_client0/result.json b/tests/snapshots/test_app/test_chat_text_filter/auth_client0/result.json index ddcb422b12..6dfbd05bc1 100644 --- a/tests/snapshots/test_app/test_chat_text_filter/auth_client0/result.json +++ b/tests/snapshots/test_app/test_chat_text_filter/auth_client0/result.json @@ -1,14 +1,15 @@ { "choices": [ { - "extra_args": { + "context": { "data_points": [], "thoughts": "Searched for:
capital of France

Conversations:
{'role': 'system', 'content': \"Assistant helps the company employees with their healthcare plan questions, and questions about the employee handbook. Be brief in your answers.\\nAnswer ONLY with the facts listed in the list of sources below. If there isn't enough information below, say you don't know. Do not generate answers that don't use the sources below. If asking a clarifying question to the user would help, ask the question.\\nFor tabular information return it as an html table. Do not return markdown format. If the question is not in English, answer in the language used in the question.\\nEach source has a name followed by colon and the actual information, always include the source name for each fact you use in the response. Use square brackets to reference the source, e.g. [info1.txt]. Don't combine sources, list each source separately, e.g. [info1.txt][info2.pdf].\\n\\n\\n\"}

{'role': 'user', 'content': 'What is the capital of France?\\n\\nSources:\\n'}" }, "message": { - "content": "The capital of France is Paris.", + "content": "The capital of France is Paris. [Benefit_Options-2.pdf].", "role": "assistant" - } + }, + "session_state": null } ], "object": "chat.completion" diff --git a/tests/snapshots/test_app/test_chat_text_semanticcaptions/client0/result.json b/tests/snapshots/test_app/test_chat_text_semanticcaptions/client0/result.json index 2ce4879228..47b36ea79d 100644 --- a/tests/snapshots/test_app/test_chat_text_semanticcaptions/client0/result.json +++ b/tests/snapshots/test_app/test_chat_text_semanticcaptions/client0/result.json @@ -1,16 +1,17 @@ { "choices": [ { - "extra_args": { + "context": { "data_points": [ "Benefit_Options-2.pdf: Caption: A whistleblower policy." ], "thoughts": "Searched for:
capital of France

Conversations:
{'role': 'system', 'content': \"Assistant helps the company employees with their healthcare plan questions, and questions about the employee handbook. Be brief in your answers.\\nAnswer ONLY with the facts listed in the list of sources below. If there isn't enough information below, say you don't know. Do not generate answers that don't use the sources below. If asking a clarifying question to the user would help, ask the question.\\nFor tabular information return it as an html table. Do not return markdown format. If the question is not in English, answer in the language used in the question.\\nEach source has a name followed by colon and the actual information, always include the source name for each fact you use in the response. Use square brackets to reference the source, e.g. [info1.txt]. Don't combine sources, list each source separately, e.g. [info1.txt][info2.pdf].\\n\\n\\n\"}

{'role': 'user', 'content': 'What is the capital of France?\\n\\nSources:\\nBenefit_Options-2.pdf: Caption: A whistleblower policy.'}" }, "message": { - "content": "The capital of France is Paris.", + "content": "The capital of France is Paris. [Benefit_Options-2.pdf].", "role": "assistant" - } + }, + "session_state": null } ], "object": "chat.completion" diff --git a/tests/snapshots/test_app/test_chat_text_semanticcaptions/client1/result.json b/tests/snapshots/test_app/test_chat_text_semanticcaptions/client1/result.json index 2ce4879228..47b36ea79d 100644 --- a/tests/snapshots/test_app/test_chat_text_semanticcaptions/client1/result.json +++ b/tests/snapshots/test_app/test_chat_text_semanticcaptions/client1/result.json @@ -1,16 +1,17 @@ { "choices": [ { - "extra_args": { + "context": { "data_points": [ "Benefit_Options-2.pdf: Caption: A whistleblower policy." ], "thoughts": "Searched for:
capital of France

Conversations:
{'role': 'system', 'content': \"Assistant helps the company employees with their healthcare plan questions, and questions about the employee handbook. Be brief in your answers.\\nAnswer ONLY with the facts listed in the list of sources below. If there isn't enough information below, say you don't know. Do not generate answers that don't use the sources below. If asking a clarifying question to the user would help, ask the question.\\nFor tabular information return it as an html table. Do not return markdown format. If the question is not in English, answer in the language used in the question.\\nEach source has a name followed by colon and the actual information, always include the source name for each fact you use in the response. Use square brackets to reference the source, e.g. [info1.txt]. Don't combine sources, list each source separately, e.g. [info1.txt][info2.pdf].\\n\\n\\n\"}

{'role': 'user', 'content': 'What is the capital of France?\\n\\nSources:\\nBenefit_Options-2.pdf: Caption: A whistleblower policy.'}" }, "message": { - "content": "The capital of France is Paris.", + "content": "The capital of France is Paris. [Benefit_Options-2.pdf].", "role": "assistant" - } + }, + "session_state": null } ], "object": "chat.completion" diff --git a/tests/snapshots/test_app/test_chat_text_semanticranker/client0/result.json b/tests/snapshots/test_app/test_chat_text_semanticranker/client0/result.json index 8ab51eb41c..1bb8a6fc64 100644 --- a/tests/snapshots/test_app/test_chat_text_semanticranker/client0/result.json +++ b/tests/snapshots/test_app/test_chat_text_semanticranker/client0/result.json @@ -1,16 +1,17 @@ { "choices": [ { - "extra_args": { + "context": { "data_points": [ "Benefit_Options-2.pdf: There is a whistleblower policy." ], "thoughts": "Searched for:
capital of France

Conversations:
{'role': 'system', 'content': \"Assistant helps the company employees with their healthcare plan questions, and questions about the employee handbook. Be brief in your answers.\\nAnswer ONLY with the facts listed in the list of sources below. If there isn't enough information below, say you don't know. Do not generate answers that don't use the sources below. If asking a clarifying question to the user would help, ask the question.\\nFor tabular information return it as an html table. Do not return markdown format. If the question is not in English, answer in the language used in the question.\\nEach source has a name followed by colon and the actual information, always include the source name for each fact you use in the response. Use square brackets to reference the source, e.g. [info1.txt]. Don't combine sources, list each source separately, e.g. [info1.txt][info2.pdf].\\n\\n\\n\"}

{'role': 'user', 'content': 'What is the capital of France?\\n\\nSources:\\nBenefit_Options-2.pdf: There is a whistleblower policy.'}" }, "message": { - "content": "The capital of France is Paris.", + "content": "The capital of France is Paris. [Benefit_Options-2.pdf].", "role": "assistant" - } + }, + "session_state": null } ], "object": "chat.completion" diff --git a/tests/snapshots/test_app/test_chat_text_semanticranker/client1/result.json b/tests/snapshots/test_app/test_chat_text_semanticranker/client1/result.json index 8ab51eb41c..1bb8a6fc64 100644 --- a/tests/snapshots/test_app/test_chat_text_semanticranker/client1/result.json +++ b/tests/snapshots/test_app/test_chat_text_semanticranker/client1/result.json @@ -1,16 +1,17 @@ { "choices": [ { - "extra_args": { + "context": { "data_points": [ "Benefit_Options-2.pdf: There is a whistleblower policy." ], "thoughts": "Searched for:
capital of France

Conversations:
{'role': 'system', 'content': \"Assistant helps the company employees with their healthcare plan questions, and questions about the employee handbook. Be brief in your answers.\\nAnswer ONLY with the facts listed in the list of sources below. If there isn't enough information below, say you don't know. Do not generate answers that don't use the sources below. If asking a clarifying question to the user would help, ask the question.\\nFor tabular information return it as an html table. Do not return markdown format. If the question is not in English, answer in the language used in the question.\\nEach source has a name followed by colon and the actual information, always include the source name for each fact you use in the response. Use square brackets to reference the source, e.g. [info1.txt]. Don't combine sources, list each source separately, e.g. [info1.txt][info2.pdf].\\n\\n\\n\"}

{'role': 'user', 'content': 'What is the capital of France?\\n\\nSources:\\nBenefit_Options-2.pdf: There is a whistleblower policy.'}" }, "message": { - "content": "The capital of France is Paris.", + "content": "The capital of France is Paris. [Benefit_Options-2.pdf].", "role": "assistant" - } + }, + "session_state": null } ], "object": "chat.completion" diff --git a/tests/snapshots/test_app/test_chat_vector/client0/result.json b/tests/snapshots/test_app/test_chat_vector/client0/result.json index 4117f95583..60234c9f81 100644 --- a/tests/snapshots/test_app/test_chat_vector/client0/result.json +++ b/tests/snapshots/test_app/test_chat_vector/client0/result.json @@ -1,16 +1,17 @@ { "choices": [ { - "extra_args": { + "context": { "data_points": [ "Benefit_Options-2.pdf: There is a whistleblower policy." ], "thoughts": "Searched for:
None

Conversations:
{'role': 'system', 'content': \"Assistant helps the company employees with their healthcare plan questions, and questions about the employee handbook. Be brief in your answers.\\nAnswer ONLY with the facts listed in the list of sources below. If there isn't enough information below, say you don't know. Do not generate answers that don't use the sources below. If asking a clarifying question to the user would help, ask the question.\\nFor tabular information return it as an html table. Do not return markdown format. If the question is not in English, answer in the language used in the question.\\nEach source has a name followed by colon and the actual information, always include the source name for each fact you use in the response. Use square brackets to reference the source, e.g. [info1.txt]. Don't combine sources, list each source separately, e.g. [info1.txt][info2.pdf].\\n\\n\\n\"}

{'role': 'user', 'content': 'What is the capital of France?\\n\\nSources:\\nBenefit_Options-2.pdf: There is a whistleblower policy.'}" }, "message": { - "content": "The capital of France is Paris.", + "content": "The capital of France is Paris. [Benefit_Options-2.pdf].", "role": "assistant" - } + }, + "session_state": null } ], "object": "chat.completion" diff --git a/tests/snapshots/test_app/test_chat_vector/client1/result.json b/tests/snapshots/test_app/test_chat_vector/client1/result.json index 4117f95583..60234c9f81 100644 --- a/tests/snapshots/test_app/test_chat_vector/client1/result.json +++ b/tests/snapshots/test_app/test_chat_vector/client1/result.json @@ -1,16 +1,17 @@ { "choices": [ { - "extra_args": { + "context": { "data_points": [ "Benefit_Options-2.pdf: There is a whistleblower policy." ], "thoughts": "Searched for:
None

Conversations:
{'role': 'system', 'content': \"Assistant helps the company employees with their healthcare plan questions, and questions about the employee handbook. Be brief in your answers.\\nAnswer ONLY with the facts listed in the list of sources below. If there isn't enough information below, say you don't know. Do not generate answers that don't use the sources below. If asking a clarifying question to the user would help, ask the question.\\nFor tabular information return it as an html table. Do not return markdown format. If the question is not in English, answer in the language used in the question.\\nEach source has a name followed by colon and the actual information, always include the source name for each fact you use in the response. Use square brackets to reference the source, e.g. [info1.txt]. Don't combine sources, list each source separately, e.g. [info1.txt][info2.pdf].\\n\\n\\n\"}

{'role': 'user', 'content': 'What is the capital of France?\\n\\nSources:\\nBenefit_Options-2.pdf: There is a whistleblower policy.'}" }, "message": { - "content": "The capital of France is Paris.", + "content": "The capital of France is Paris. [Benefit_Options-2.pdf].", "role": "assistant" - } + }, + "session_state": null } ], "object": "chat.completion" diff --git a/tests/snapshots/test_app/test_chat_with_history/client0/result.json b/tests/snapshots/test_app/test_chat_with_history/client0/result.json new file mode 100644 index 0000000000..089c1e8f9d --- /dev/null +++ b/tests/snapshots/test_app/test_chat_with_history/client0/result.json @@ -0,0 +1,18 @@ +{ + "choices": [ + { + "context": { + "data_points": [ + "Benefit_Options-2.pdf: There is a whistleblower policy." + ], + "thoughts": "Searched for:
The capital of France is Paris. [Benefit_Options-2.pdf].

Conversations:
{'role': 'system', 'content': \"Assistant helps the company employees with their healthcare plan questions, and questions about the employee handbook. Be brief in your answers.\\nAnswer ONLY with the facts listed in the list of sources below. If there isn't enough information below, say you don't know. Do not generate answers that don't use the sources below. If asking a clarifying question to the user would help, ask the question.\\nFor tabular information return it as an html table. Do not return markdown format. If the question is not in English, answer in the language used in the question.\\nEach source has a name followed by colon and the actual information, always include the source name for each fact you use in the response. Use square brackets to reference the source, e.g. [info1.txt]. Don't combine sources, list each source separately, e.g. [info1.txt][info2.pdf].\\n\\n\\n\"}

{'role': 'user', 'content': 'What happens in a performance review?'}

{'role': 'assistant', 'content': \"During a performance review, employees will receive feedback on their performance over the past year, including both successes and areas for improvement. The feedback will be provided by the employee's supervisor and is intended to help the employee develop and grow in their role [employee_handbook-3.pdf]. The review is a two-way dialogue between the employee and their manager, so employees are encouraged to be honest and open during the process [employee_handbook-3.pdf]. The employee will also have the opportunity to discuss their goals and objectives for the upcoming year [employee_handbook-3.pdf]. A written summary of the performance review will be provided to the employee, which will include a rating of their performance, feedback, and goals and objectives for the upcoming year [employee_handbook-3.pdf].\"}

{'role': 'user', 'content': 'Is dental covered?\\n\\nSources:\\nBenefit_Options-2.pdf: There is a whistleblower policy.'}" + }, + "message": { + "content": "The capital of France is Paris. [Benefit_Options-2.pdf].", + "role": "assistant" + }, + "session_state": null + } + ], + "object": "chat.completion" +} \ No newline at end of file diff --git a/tests/snapshots/test_app/test_chat_with_history/client1/result.json b/tests/snapshots/test_app/test_chat_with_history/client1/result.json new file mode 100644 index 0000000000..089c1e8f9d --- /dev/null +++ b/tests/snapshots/test_app/test_chat_with_history/client1/result.json @@ -0,0 +1,18 @@ +{ + "choices": [ + { + "context": { + "data_points": [ + "Benefit_Options-2.pdf: There is a whistleblower policy." + ], + "thoughts": "Searched for:
The capital of France is Paris. [Benefit_Options-2.pdf].

Conversations:
{'role': 'system', 'content': \"Assistant helps the company employees with their healthcare plan questions, and questions about the employee handbook. Be brief in your answers.\\nAnswer ONLY with the facts listed in the list of sources below. If there isn't enough information below, say you don't know. Do not generate answers that don't use the sources below. If asking a clarifying question to the user would help, ask the question.\\nFor tabular information return it as an html table. Do not return markdown format. If the question is not in English, answer in the language used in the question.\\nEach source has a name followed by colon and the actual information, always include the source name for each fact you use in the response. Use square brackets to reference the source, e.g. [info1.txt]. Don't combine sources, list each source separately, e.g. [info1.txt][info2.pdf].\\n\\n\\n\"}

{'role': 'user', 'content': 'What happens in a performance review?'}

{'role': 'assistant', 'content': \"During a performance review, employees will receive feedback on their performance over the past year, including both successes and areas for improvement. The feedback will be provided by the employee's supervisor and is intended to help the employee develop and grow in their role [employee_handbook-3.pdf]. The review is a two-way dialogue between the employee and their manager, so employees are encouraged to be honest and open during the process [employee_handbook-3.pdf]. The employee will also have the opportunity to discuss their goals and objectives for the upcoming year [employee_handbook-3.pdf]. A written summary of the performance review will be provided to the employee, which will include a rating of their performance, feedback, and goals and objectives for the upcoming year [employee_handbook-3.pdf].\"}

{'role': 'user', 'content': 'Is dental covered?\\n\\nSources:\\nBenefit_Options-2.pdf: There is a whistleblower policy.'}" + }, + "message": { + "content": "The capital of France is Paris. [Benefit_Options-2.pdf].", + "role": "assistant" + }, + "session_state": null + } + ], + "object": "chat.completion" +} \ No newline at end of file diff --git a/tests/snapshots/test_app/test_chat_with_long_history/client0/result.json b/tests/snapshots/test_app/test_chat_with_long_history/client0/result.json new file mode 100644 index 0000000000..ec5a666c11 --- /dev/null +++ b/tests/snapshots/test_app/test_chat_with_long_history/client0/result.json @@ -0,0 +1,18 @@ +{ + "choices": [ + { + "context": { + "data_points": [ + "Benefit_Options-2.pdf: There is a whistleblower policy." + ], + "thoughts": "Searched for:
The capital of France is Paris. [Benefit_Options-2.pdf].

Conversations:
{'role': 'system', 'content': \"Assistant helps the company employees with their healthcare plan questions, and questions about the employee handbook. Be brief in your answers.\\nAnswer ONLY with the facts listed in the list of sources below. If there isn't enough information below, say you don't know. Do not generate answers that don't use the sources below. If asking a clarifying question to the user would help, ask the question.\\nFor tabular information return it as an html table. Do not return markdown format. If the question is not in English, answer in the language used in the question.\\nEach source has a name followed by colon and the actual information, always include the source name for each fact you use in the response. Use square brackets to reference the source, e.g. [info1.txt]. Don't combine sources, list each source separately, e.g. [info1.txt][info2.pdf].\\n\\n\\n\"}

{'role': 'user', 'content': 'What does a product manager do?\\n\\nSources:\\nBenefit_Options-2.pdf: There is a whistleblower policy.'}" + }, + "message": { + "content": "The capital of France is Paris. [Benefit_Options-2.pdf].", + "role": "assistant" + }, + "session_state": null + } + ], + "object": "chat.completion" +} \ No newline at end of file diff --git a/tests/snapshots/test_app/test_chat_with_long_history/client1/result.json b/tests/snapshots/test_app/test_chat_with_long_history/client1/result.json new file mode 100644 index 0000000000..ec5a666c11 --- /dev/null +++ b/tests/snapshots/test_app/test_chat_with_long_history/client1/result.json @@ -0,0 +1,18 @@ +{ + "choices": [ + { + "context": { + "data_points": [ + "Benefit_Options-2.pdf: There is a whistleblower policy." + ], + "thoughts": "Searched for:
The capital of France is Paris. [Benefit_Options-2.pdf].

Conversations:
{'role': 'system', 'content': \"Assistant helps the company employees with their healthcare plan questions, and questions about the employee handbook. Be brief in your answers.\\nAnswer ONLY with the facts listed in the list of sources below. If there isn't enough information below, say you don't know. Do not generate answers that don't use the sources below. If asking a clarifying question to the user would help, ask the question.\\nFor tabular information return it as an html table. Do not return markdown format. If the question is not in English, answer in the language used in the question.\\nEach source has a name followed by colon and the actual information, always include the source name for each fact you use in the response. Use square brackets to reference the source, e.g. [info1.txt]. Don't combine sources, list each source separately, e.g. [info1.txt][info2.pdf].\\n\\n\\n\"}

{'role': 'user', 'content': 'What does a product manager do?\\n\\nSources:\\nBenefit_Options-2.pdf: There is a whistleblower policy.'}" + }, + "message": { + "content": "The capital of France is Paris. [Benefit_Options-2.pdf].", + "role": "assistant" + }, + "session_state": null + } + ], + "object": "chat.completion" +} \ No newline at end of file diff --git a/tests/test_app.py b/tests/test_app.py index 843dbcbb2e..d14c53bcb1 100644 --- a/tests/test_app.py +++ b/tests/test_app.py @@ -1,4 +1,5 @@ import json +import logging import os from unittest import mock @@ -50,8 +51,10 @@ async def test_ask_rtr_text(client, snapshot): response = await client.post( "/ask", json={ - "question": "What is the capital of France?", - "overrides": {"retrieval_mode": "text"}, + "messages": [{"content": "What is the capital of France?", "role": "user"}], + "context": { + "overrides": {"retrieval_mode": "text"}, + }, }, ) assert response.status_code == 200 @@ -65,12 +68,14 @@ async def test_ask_rtr_text_filter(auth_client, snapshot): "/ask", headers={"Authorization": "Bearer MockToken"}, json={ - "question": "What is the capital of France?", - "overrides": { - "retrieval_mode": "text", - "use_oid_security_filter": True, - "use_groups_security_filter": True, - "exclude_category": "excluded", + "messages": [{"content": "What is the capital of France?", "role": "user"}], + "context": { + "overrides": { + "retrieval_mode": "text", + "use_oid_security_filter": True, + "use_groups_security_filter": True, + "exclude_category": "excluded", + }, }, }, ) @@ -88,8 +93,10 @@ async def test_ask_rtr_text_semanticranker(client, snapshot): response = await client.post( "/ask", json={ - "question": "What is the capital of France?", - "overrides": {"retrieval_mode": "text", "semantic_ranker": True}, + "messages": [{"content": "What is the capital of France?", "role": "user"}], + "context": { + "overrides": {"retrieval_mode": "text", "semantic_ranker": True}, + }, }, ) assert response.status_code == 200 @@ -102,8 +109,10 @@ async def test_ask_rtr_text_semanticcaptions(client, snapshot): response = await client.post( "/ask", json={ - "question": "What is the capital of France?", - "overrides": {"retrieval_mode": "text", "semantic_captions": True}, + "messages": [{"content": "What is the capital of France?", "role": "user"}], + "context": { + "overrides": {"retrieval_mode": "text", "semantic_captions": True}, + }, }, ) assert response.status_code == 200 @@ -116,8 +125,10 @@ async def test_ask_rtr_hybrid(client, snapshot): response = await client.post( "/ask", json={ - "question": "What is the capital of France?", - "overrides": {"retrieval_mode": "hybrid"}, + "messages": [{"content": "What is the capital of France?", "role": "user"}], + "context": { + "overrides": {"retrieval_mode": "hybrid"}, + }, }, ) assert response.status_code == 200 @@ -138,8 +149,10 @@ async def test_chat_text(client, snapshot): response = await client.post( "/chat", json={ - "history": [{"user": "What is the capital of France?"}], - "overrides": {"retrieval_mode": "text"}, + "messages": [{"content": "What is the capital of France?", "role": "user"}], + "context": { + "overrides": {"retrieval_mode": "text"}, + }, }, ) assert response.status_code == 200 @@ -153,12 +166,14 @@ async def test_chat_text_filter(auth_client, snapshot): "/chat", headers={"Authorization": "Bearer MockToken"}, json={ - "history": [{"user": "What is the capital of France?"}], - "overrides": { - "retrieval_mode": "text", - "use_oid_security_filter": True, - "use_groups_security_filter": True, - "exclude_category": "excluded", + "messages": [{"content": "What is the capital of France?", "role": "user"}], + "context": { + "overrides": { + "retrieval_mode": "text", + "use_oid_security_filter": True, + "use_groups_security_filter": True, + "exclude_category": "excluded", + }, }, }, ) @@ -176,8 +191,10 @@ async def test_chat_text_semanticranker(client, snapshot): response = await client.post( "/chat", json={ - "history": [{"user": "What is the capital of France?"}], - "overrides": {"retrieval_mode": "text", "semantic_ranker": True}, + "messages": [{"content": "What is the capital of France?", "role": "user"}], + "context": { + "overrides": {"retrieval_mode": "text", "semantic_ranker": True}, + }, }, ) assert response.status_code == 200 @@ -190,8 +207,10 @@ async def test_chat_text_semanticcaptions(client, snapshot): response = await client.post( "/chat", json={ - "history": [{"user": "What is the capital of France?"}], - "overrides": {"retrieval_mode": "text", "semantic_captions": True}, + "messages": [{"content": "What is the capital of France?", "role": "user"}], + "context": { + "overrides": {"retrieval_mode": "text", "semantic_captions": True}, + }, }, ) assert response.status_code == 200 @@ -204,8 +223,10 @@ async def test_chat_prompt_template(client, snapshot): response = await client.post( "/chat", json={ - "history": [{"user": "What is the capital of France?"}], - "overrides": {"retrieval_mode": "text", "prompt_template": "You are a cat."}, + "messages": [{"content": "What is the capital of France?", "role": "user"}], + "context": { + "overrides": {"retrieval_mode": "text", "prompt_template": "You are a cat."}, + }, }, ) assert response.status_code == 200 @@ -218,8 +239,10 @@ async def test_chat_prompt_template_concat(client, snapshot): response = await client.post( "/chat", json={ - "history": [{"user": "What is the capital of France?"}], - "overrides": {"retrieval_mode": "text", "prompt_template": ">>> Meow like a cat."}, + "messages": [{"content": "What is the capital of France?", "role": "user"}], + "context": { + "overrides": {"retrieval_mode": "text", "prompt_template": ">>> Meow like a cat."}, + }, }, ) assert response.status_code == 200 @@ -232,8 +255,10 @@ async def test_chat_hybrid(client, snapshot): response = await client.post( "/chat", json={ - "history": [{"user": "What is the capital of France?"}], - "overrides": {"retrieval_mode": "hybrid"}, + "messages": [{"content": "What is the capital of France?", "role": "user"}], + "context": { + "overrides": {"retrieval_mode": "hybrid"}, + }, }, ) assert response.status_code == 200 @@ -246,8 +271,10 @@ async def test_chat_vector(client, snapshot): response = await client.post( "/chat", json={ - "history": [{"user": "What is the capital of France?"}], - "overrides": {"retrieval_mode": "vector"}, + "messages": [{"content": "What is the capital of France?", "role": "user"}], + "context": { + "overrides": {"retrieval_mode": "vector"}, + }, }, ) assert response.status_code == 200 @@ -255,21 +282,16 @@ async def test_chat_vector(client, snapshot): snapshot.assert_match(json.dumps(result, indent=4), "result.json") -@pytest.mark.asyncio -async def test_chat_stream_request_must_be_json(client): - response = await client.post("/chat_stream") - assert response.status_code == 415 - result = await response.get_json() - assert result["error"] == "request must be json" - - @pytest.mark.asyncio async def test_chat_stream_text(client, snapshot): response = await client.post( - "/chat_stream", + "/chat", json={ - "history": [{"user": "What is the capital of France?"}], - "overrides": {"retrieval_mode": "text"}, + "stream": True, + "messages": [{"content": "What is the capital of France?", "role": "user"}], + "context": { + "overrides": {"retrieval_mode": "text"}, + }, }, ) assert response.status_code == 200 @@ -280,15 +302,18 @@ async def test_chat_stream_text(client, snapshot): @pytest.mark.asyncio async def test_chat_stream_text_filter(auth_client, snapshot): response = await auth_client.post( - "/chat_stream", + "/chat", headers={"Authorization": "Bearer MockToken"}, json={ - "history": [{"user": "What is the capital of France?"}], - "overrides": { - "retrieval_mode": "text", - "use_oid_security_filter": True, - "use_groups_security_filter": True, - "exclude_category": "excluded", + "stream": True, + "messages": [{"content": "What is the capital of France?", "role": "user"}], + "context": { + "overrides": { + "retrieval_mode": "text", + "use_oid_security_filter": True, + "use_groups_security_filter": True, + "exclude_category": "excluded", + } }, }, ) @@ -301,6 +326,94 @@ async def test_chat_stream_text_filter(auth_client, snapshot): snapshot.assert_match(result, "result.jsonlines") +@pytest.mark.asyncio +async def test_chat_with_history(client, snapshot): + response = await client.post( + "/chat", + json={ + "messages": [ + {"content": "What happens in a performance review?", "role": "user"}, + { + "content": "During a performance review, employees will receive feedback on their performance over the past year, including both successes and areas for improvement. The feedback will be provided by the employee's supervisor and is intended to help the employee develop and grow in their role [employee_handbook-3.pdf]. The review is a two-way dialogue between the employee and their manager, so employees are encouraged to be honest and open during the process [employee_handbook-3.pdf]. The employee will also have the opportunity to discuss their goals and objectives for the upcoming year [employee_handbook-3.pdf]. A written summary of the performance review will be provided to the employee, which will include a rating of their performance, feedback, and goals and objectives for the upcoming year [employee_handbook-3.pdf].", + "role": "assistant", + }, + {"content": "Is dental covered?", "role": "user"}, + ], + "context": { + "overrides": {"retrieval_mode": "text"}, + }, + }, + ) + assert response.status_code == 200 + result = await response.get_json() + assert result["choices"][0]["context"]["thoughts"].find("performance review") != -1 + snapshot.assert_match(json.dumps(result, indent=4), "result.json") + + +@pytest.mark.asyncio +async def test_chat_with_long_history(client, snapshot, caplog): + """This test makes sure that the history is truncated to max tokens minus 1024.""" + caplog.set_level(logging.DEBUG) + response = await client.post( + "/chat", + json={ + "messages": [ + {"role": "user", "content": "Is there a dress code?"}, # 9 tokens + { + "role": "assistant", + "content": "Yes, there is a dress code at Contoso Electronics. Look sharp! [employee_handbook-1.pdf]" + * 150, + }, # 3900 tokens + {"role": "user", "content": "What does a product manager do?"}, # 10 tokens + ], + "context": { + "overrides": {"retrieval_mode": "text"}, + }, + }, + ) + assert response.status_code == 200 + result = await response.get_json() + # Assert that it doesn't find the first message, since it wouldn't fit in the max tokens. + assert result["choices"][0]["context"]["thoughts"].find("Is there a dress code?") == -1 + assert "Reached max tokens" in caplog.text + snapshot.assert_match(json.dumps(result, indent=4), "result.json") + + +@pytest.mark.asyncio +async def test_chat_session_state_persists(client, snapshot): + response = await client.post( + "/chat", + json={ + "messages": [{"content": "What is the capital of France?", "role": "user"}], + "context": { + "overrides": {"retrieval_mode": "text"}, + }, + "session_state": {"conversation_id": 1234}, + }, + ) + assert response.status_code == 200 + result = await response.get_json() + snapshot.assert_match(json.dumps(result, indent=4), "result.json") + + +@pytest.mark.asyncio +async def test_chat_stream_session_state_persists(client, snapshot): + response = await client.post( + "/chat", + json={ + "messages": [{"content": "What is the capital of France?", "role": "user"}], + "context": { + "overrides": {"retrieval_mode": "text"}, + }, + "stream": True, + "session_state": {"conversation_id": 1234}, + }, + ) + assert response.status_code == 200 + result = await response.get_data() + snapshot.assert_match(result, "result.jsonlines") + + @pytest.mark.asyncio async def test_format_as_ndjson(): async def gen(): diff --git a/tests/test_chatapproach.py b/tests/test_chatapproach.py index 4dc40d2fce..fa81ebffe7 100644 --- a/tests/test_chatapproach.py +++ b/tests/test_chatapproach.py @@ -4,7 +4,9 @@ def test_get_search_query(): - chat_approach = ChatReadRetrieveReadApproach(None, "", "gpt-35-turbo", "gpt-35-turbo", "", "", "", "") + chat_approach = ChatReadRetrieveReadApproach( + None, "", "gpt-35-turbo", "gpt-35-turbo", "", "", "", "", "en-us", "lexicon" + ) payload = '{"id":"chatcmpl-81JkxYqYppUkPtOAia40gki2vJ9QM","object":"chat.completion","created":1695324963,"model":"gpt-35-turbo","prompt_filter_results":[{"prompt_index":0,"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}}}],"choices":[{"index":0,"finish_reason":"function_call","message":{"role":"assistant","function_call":{"name":"search_sources","arguments":"{\\n\\"search_query\\":\\"accesstelemedicineservices\\"\\n}"}},"content_filter_results":{}}],"usage":{"completion_tokens":19,"prompt_tokens":425,"total_tokens":444}}' default_query = "hello" @@ -14,7 +16,9 @@ def test_get_search_query(): def test_get_search_query_returns_default(): - chat_approach = ChatReadRetrieveReadApproach(None, "", "gpt-35-turbo", "gpt-35-turbo", "", "", "", "") + chat_approach = ChatReadRetrieveReadApproach( + None, "", "gpt-35-turbo", "gpt-35-turbo", "", "", "", "", "en-us", "lexicon" + ) payload = '{"id":"chatcmpl-81JkxYqYppUkPtOAia40gki2vJ9QM","object":"chat.completion","created":1695324963,"model":"gpt-35-turbo","prompt_filter_results":[{"prompt_index":0,"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}}}],"choices":[{"index":0,"finish_reason":"function_call","message":{"role":"assistant"},"content_filter_results":{}}],"usage":{"completion_tokens":19,"prompt_tokens":425,"total_tokens":444}}' default_query = "hello" @@ -24,19 +28,23 @@ def test_get_search_query_returns_default(): def test_get_messages_from_history(): - chat_approach = ChatReadRetrieveReadApproach(None, "", "gpt-35-turbo", "gpt-35-turbo", "", "", "", "") + chat_approach = ChatReadRetrieveReadApproach( + None, "", "gpt-35-turbo", "gpt-35-turbo", "", "", "", "", "en-us", "lexicon" + ) messages = chat_approach.get_messages_from_history( system_prompt="You are a bot.", model_id="gpt-35-turbo", history=[ + {"role": "user", "content": "What happens in a performance review?"}, { - "user": "What happens in a performance review?", - "bot": "During the performance review at Contoso Electronics, the supervisor will discuss the employee's performance over the past year and provide feedback on areas for improvement. They will also provide an opportunity for the employee to discuss their goals and objectives for the upcoming year. The review is a two-way dialogue between managers and employees, and employees will receive a written summary of their performance review which will include a rating of their performance, feedback, and goals and objectives for the upcoming year [employee_handbook-3.pdf].", + "role": "assistant", + "content": "During the performance review at Contoso Electronics, the supervisor will discuss the employee's performance over the past year and provide feedback on areas for improvement. They will also provide an opportunity for the employee to discuss their goals and objectives for the upcoming year. The review is a two-way dialogue between managers and employees, and employees will receive a written summary of their performance review which will include a rating of their performance, feedback, and goals and objectives for the upcoming year [employee_handbook-3.pdf].", }, - {"user": "What does a Product Manager do?"}, + {"role": "user", "content": "What does a Product Manager do?"}, ], user_content="What does a Product Manager do?", + max_tokens=3000, ) assert messages == [ {"role": "system", "content": "You are a bot."}, @@ -50,17 +58,20 @@ def test_get_messages_from_history(): def test_get_messages_from_history_truncated(): - chat_approach = ChatReadRetrieveReadApproach(None, "", "gpt-35-turbo", "gpt-35-turbo", "", "", "", "") + chat_approach = ChatReadRetrieveReadApproach( + None, "", "gpt-35-turbo", "gpt-35-turbo", "", "", "", "", "en-us", "lexicon" + ) messages = chat_approach.get_messages_from_history( system_prompt="You are a bot.", model_id="gpt-35-turbo", history=[ + {"role": "user", "content": "What happens in a performance review?"}, { - "user": "What happens in a performance review?", - "bot": "During the performance review at Contoso Electronics, the supervisor will discuss the employee's performance over the past year and provide feedback on areas for improvement. They will also provide an opportunity for the employee to discuss their goals and objectives for the upcoming year. The review is a two-way dialogue between managers and employees, and employees will receive a written summary of their performance review which will include a rating of their performance, feedback, and goals and objectives for the upcoming year [employee_handbook-3.pdf].", + "role": "assistant", + "content": "During the performance review at Contoso Electronics, the supervisor will discuss the employee's performance over the past year and provide feedback on areas for improvement. They will also provide an opportunity for the employee to discuss their goals and objectives for the upcoming year. The review is a two-way dialogue between managers and employees, and employees will receive a written summary of their performance review which will include a rating of their performance, feedback, and goals and objectives for the upcoming year [employee_handbook-3.pdf].", }, - {"user": "What does a Product Manager do?"}, + {"role": "user", "content": "What does a Product Manager do?"}, ], user_content="What does a Product Manager do?", max_tokens=10, @@ -72,24 +83,28 @@ def test_get_messages_from_history_truncated(): def test_get_messages_from_history_truncated_longer(): - chat_approach = ChatReadRetrieveReadApproach(None, "", "gpt-35-turbo", "gpt-35-turbo", "", "", "", "") + chat_approach = ChatReadRetrieveReadApproach( + None, "", "gpt-35-turbo", "gpt-35-turbo", "", "", "", "", "en-us", "lexicon" + ) messages = chat_approach.get_messages_from_history( - system_prompt="You are a bot.", + system_prompt="You are a bot.", # 8 tokens model_id="gpt-35-turbo", history=[ + {"role": "user", "content": "What happens in a performance review?"}, # 10 tokens { - "user": "What happens in a performance review?", - "bot": "During the performance review at Contoso Electronics, the supervisor will discuss the employee's performance over the past year and provide feedback on areas for improvement. They will also provide an opportunity for the employee to discuss their goals and objectives for the upcoming year. The review is a two-way dialogue between managers and employees, and employees will receive a written summary of their performance review which will include a rating of their performance, feedback, and goals and objectives for the upcoming year [employee_handbook-3.pdf].", - }, + "role": "assistant", + "content": "During the performance review at Contoso Electronics, the supervisor will discuss the employee's performance over the past year and provide feedback on areas for improvement. They will also provide an opportunity for the employee to discuss their goals and objectives for the upcoming year. The review is a two-way dialogue between managers and employees, and employees will receive a written summary of their performance review which will include a rating of their performance, feedback, and goals and objectives for the upcoming year [employee_handbook-3.pdf].", + }, # 102 tokens + {"role": "user", "content": "Is there a dress code?"}, # 9 tokens { - "user": "Is there a dress code?", - "bot": "Yes, there is a dress code at Contoso Electronics. Look sharp! [employee_handbook-1.pdf]", - }, - {"user": "What does a Product Manager do?"}, + "role": "assistant", + "content": "Yes, there is a dress code at Contoso Electronics. Look sharp! [employee_handbook-1.pdf]", + }, # 26 tokens + {"role": "user", "content": "What does a Product Manager do?"}, # 10 tokens ], user_content="What does a Product Manager do?", - max_tokens=30, + max_tokens=55, ) assert messages == [ {"role": "system", "content": "You are a bot."}, @@ -100,3 +115,43 @@ def test_get_messages_from_history_truncated_longer(): }, {"role": "user", "content": "What does a Product Manager do?"}, ] + + +def test_get_messages_from_history_truncated_break_pair(): + """Tests that the truncation breaks the pair of messages.""" + chat_approach = ChatReadRetrieveReadApproach( + None, "", "gpt-35-turbo", "gpt-35-turbo", "", "", "", "", "en-us", "lexicon" + ) + + messages = chat_approach.get_messages_from_history( + system_prompt="You are a bot.", # 8 tokens + model_id="gpt-35-turbo", + history=[ + {"role": "user", "content": "What happens in a performance review?"}, # 10 tokens + { + "role": "assistant", + "content": "During the performance review at Contoso Electronics, the supervisor will discuss the employee's performance over the past year and provide feedback on areas for improvement. They will also provide an opportunity for the employee to discuss their goals and objectives for the upcoming year. The review is a two-way dialogue between managers and employees, and employees will receive a written summary of their performance review which will include a rating of their performance, feedback, and goals and objectives for the upcoming year [employee_handbook-3.pdf].", + }, # 102 tokens + {"role": "user", "content": "Is there a dress code?"}, # 9 tokens + { + "role": "assistant", + "content": "Yes, there is a dress code at Contoso Electronics. Look sharp! [employee_handbook-1.pdf]", + }, # 26 tokens + {"role": "user", "content": "What does a Product Manager do?"}, # 10 tokens + ], + user_content="What does a Product Manager do?", + max_tokens=147, + ) + assert messages == [ + {"role": "system", "content": "You are a bot."}, + { + "role": "assistant", + "content": "During the performance review at Contoso Electronics, the supervisor will discuss the employee's performance over the past year and provide feedback on areas for improvement. They will also provide an opportunity for the employee to discuss their goals and objectives for the upcoming year. The review is a two-way dialogue between managers and employees, and employees will receive a written summary of their performance review which will include a rating of their performance, feedback, and goals and objectives for the upcoming year [employee_handbook-3.pdf].", + }, + {"role": "user", "content": "Is there a dress code?"}, + { + "role": "assistant", + "content": "Yes, there is a dress code at Contoso Electronics. Look sharp! [employee_handbook-1.pdf]", + }, + {"role": "user", "content": "What does a Product Manager do?"}, + ] diff --git a/tests/test_messagebuilder.py b/tests/test_messagebuilder.py index 85a5497904..3b6cb687fa 100644 --- a/tests/test_messagebuilder.py +++ b/tests/test_messagebuilder.py @@ -8,7 +8,7 @@ def test_messagebuilder(): {"role": "system", "content": "You are a bot."} ] assert builder.model == "gpt-35-turbo" - assert builder.token_length == 8 + assert builder.count_tokens_for_message(builder.messages[0]) == 8 def test_messagebuilder_append(): @@ -21,7 +21,8 @@ def test_messagebuilder_append(): {"role": "user", "content": "Hello, how are you?"}, ] assert builder.model == "gpt-35-turbo" - assert builder.token_length == 17 + assert builder.count_tokens_for_message(builder.messages[0]) == 8 + assert builder.count_tokens_for_message(builder.messages[1]) == 9 def test_messagebuilder_unicode(): @@ -31,7 +32,7 @@ def test_messagebuilder_unicode(): {"role": "system", "content": "á"} ] assert builder.model == "gpt-35-turbo" - assert builder.token_length == 4 + assert builder.count_tokens_for_message(builder.messages[0]) == 4 def test_messagebuilder_unicode_append(): @@ -44,4 +45,5 @@ def test_messagebuilder_unicode_append(): {"role": "user", "content": "á"}, ] assert builder.model == "gpt-35-turbo" - assert builder.token_length == 8 + assert builder.count_tokens_for_message(builder.messages[0]) == 4 + assert builder.count_tokens_for_message(builder.messages[1]) == 4