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