diff --git a/.env.example b/.env.example new file mode 100644 index 00000000..7df3bb12 --- /dev/null +++ b/.env.example @@ -0,0 +1,99 @@ +# Since the ".env" file is gitignored, you can use this ".env.example" file to +# build a new ".env" file when you clone the repo. Keep this file up-to-date +# when you add new variables to `.env`. + +# This file will be committed to version control, so make sure not to have any +# secrets in it. If you are cloning this repo, create a copy of this file named +# ".env" and populate it with your secrets. + +############################################# +# OpenAPI variables +############################################# +OPENAI_API_KEY= # OpenAI API key +OPENAI_ORGANIZATION= # OpenAI organization ID +ENABLE_LLM_CACHE=false # flag to enable or disable LLM cache in redis + +############################################# +# Authentication variables +############################################# +ENABLE_AUTH=false # flag to enable or disable authentication +NEXTAUTH_SECRET= # Add the same secret as in the FE .env file + +############################################# +# FastAPI environment variables +############################################# +PROJECT_NAME=agent-x +ENCRYPT_KEY=TshgGacKPYrm35m89UqbRg46JAbUm2yRtxOCQFdqa3w= +SECRET_KEY=09d25e0sas4faa6c52gf6c818166b7a9563b93f7sdsdef6f0f4caa6cf63b88e8d3e7 +BACKEND_CORS_ORIGINS='["*"]' # The origins that are allowed to make cross-origin requests to your FastAPI backend. Set to Vercel deployment URL to avoid CORS error. + +############################################# +# PostgreSQL database environment variables +############################################# +DATABASE_HOST=database +DATABASE_USER=postgres +DATABASE_PASSWORD=postgres +DATABASE_NAME=fastapi_db +DATABASE_CELERY_NAME=celery_schedule_jobs +DATABASE_PORT=5432 + +############################################# +# Caddy variables +############################################# +EXT_ENDPOINT1=localhost +LOCAL_1=localhost +LOCAL_2=127.0.0.1 + +############################################# +# Redis variables +############################################# +REDIS_HOST=redis_server +REDIS_PORT=6379 + +############################################# +# Minio variables +############################################# +MINIO_URL=storage.localhost +MINIO_BUCKET=fastapi-minio +MINIO_ROOT_USER=minioadmin +MINIO_ROOT_PASSWORD=minioadmin + +############################################# +# SQL Tool DB +############################################# +SQL_TOOL_DB_ENABLED="true" # Set to "true" to enable the SQL database tool. +SQL_TOOL_DB_URI='postgresql://postgres:postgres@database/postgres?connect_timeout=10' # docker url +SQL_TOOL_DB_SCHEMAS='["public"]' +SQL_TOOL_DB_INFO_PATH='app/tool_constants/sql_tool_db_info.json' +SQL_TOOL_DB_OVERWRITE_ON_START="true" + +############################################# +# YAML config paths +############################################# +EXTRACTION_CONFIG_PATH='app/config/extraction.yml' +AGENT_CONFIG_PATH='app/config/agent.yml' + +############################################# +# PDF Tool +############################################# +PDF_PATH='app/tool_constants/pdf_data' +PDF_TOOL_ENABLED="true" +PDF_TOOL_DATA_PATH='app/tool_constants/pdf_data' # backend/app/app/tool_constants/pdf_data for local dev +PDF_TOOL_DATABASE='pdf_indexing_1' +PDF_TOOL_EXTRACTION_CONFIG_PATH='app/config/extraction.yml' # backend/app/app/config/extraction.yml for local dev + +############################################# +# Code Tool +############################################# +CODE_TOOL_ENABLED=true +CODE_TOOL_DATABASE=code_indexing_1 +CODE_TOOL_DATA_PATH=app/tool_constants/public_demo_data/agent_x_to_ingest +TOOL_PROMPTS_PATH=app/tool_constants/public_demo_data/agent_x_to_ingest/config/tools.yml + +############################################# +# Langsmith variables +############################################# +# LANGCHAIN_TRACING_V2="true" +# LANGCHAIN_ENDPOINT="https://api.langchain.plus" # change to "http://langchain-backend:1984" for self-hosted +# LANGCHAIN_API_KEY="" # must be set to real key if using hosted - key must be set for self-hosted +# LANGCHAIN_PROJECT="default" diff --git a/.github/nodejs.version b/.github/nodejs.version new file mode 100644 index 00000000..805b5a4e --- /dev/null +++ b/.github/nodejs.version @@ -0,0 +1 @@ +v20.9.0 diff --git a/.github/workflows/lint-backend.yml b/.github/workflows/lint-backend.yml new file mode 100644 index 00000000..1d1f376f --- /dev/null +++ b/.github/workflows/lint-backend.yml @@ -0,0 +1,32 @@ +name: lint-backend + +on: + push: + branches: + - '**' + +jobs: + lint-backend: + name: lint-backend + runs-on: Linux + + steps: + - name: Checkout + uses: actions/checkout@v2 + + - name: Set up Python 3.10 + uses: actions/setup-python@v3 + with: + python-version: '3.10' + + - name: Create empty .env file + run: touch .env + + - name: Install dependencies + run: | + make env-create + + - name: Check linting + run: | + source backend/app/.venv/bin/activate + make lint diff --git a/.github/workflows/lint-frontend.yml b/.github/workflows/lint-frontend.yml new file mode 100644 index 00000000..198697dd --- /dev/null +++ b/.github/workflows/lint-frontend.yml @@ -0,0 +1,43 @@ + +name: lint-frontend + +on: + push: + branches: + - '**' + +defaults: + run: + working-directory: ./frontend + +jobs: + lint-frontend: + name: lint-frontend + runs-on: Linux + steps: + - uses: actions/checkout@v4 + - run: echo "node_version=$(cat .github/nodejs.version)" >> $GITHUB_ENV + - name: "use node ${{ env.node_version }}" + uses: actions/setup-node@v3 + with: + node-version: "${{ env.node_version }}" + - name: install pnpm + uses: pnpm/action-setup@v2 + with: + version: 8 + - name: Install dependencies + run: pnpm install + - name: Lint check + run: pnpm lint + env: + NEXTAUTH_SECRET: bxgh3SAToI/dvtS8/FPNcJbH2Lq+KKuS3KbKvc0x6v0= + NEXTAUTH_URL: http://localhost:3000 + GITHUB_ID: ${{ secrets.GH_AUTH_ID }} + GITHUB_SECRET: ${{ secrets.GH_AUTH_SECRET }} + GOOGLE_AUTH_ID: ${{ secrets.GOOGLE_AUTH_ID }} + GOOGLE_AUTH_SECRET: ${{ secrets.GOOGLE_AUTH_SECRET }} + NEXT_PUBLIC_API_URL: http://localhost:3000/api/v1 + - name: Format check + run: pnpm prettier + # - name: Unit & Integration tests + # run: pnpm test diff --git a/.github/workflows/main.yml.disabled b/.github/workflows/main.yml.disabled new file mode 100644 index 00000000..7c9e4f38 --- /dev/null +++ b/.github/workflows/main.yml.disabled @@ -0,0 +1,91 @@ +# Example of CI/CD pushing your images to artifactory. +# name: agent-x-app +# on: +# # Trigger the workflow on push or pull request, +# # but only for the master branch + +# push: +# branches: [ main, staging ] +# tags: +# - 'v*' +# #pull_request: +# # branches: [ main ] + +# jobs: + # push_to_registry: + # name: Push Docker image to Artifactory + # runs-on: [self-hosted, Linux] + # if: github.ref == 'refs/heads/main' + # steps: + # - name: Check out the repo + # uses: actions/checkout@v3 + + # - name: Set up Docker Buildx + # uses: docker/setup-buildx-action@v1 + + # - name: Log in to Artifactory + # uses: docker/login-action@v2 + # with: + # registry: artifactoryyourdomain.jfrog.io + # username: ${{ secrets.ARTIFACTORY_EMAIL }} + # password: ${{ secrets.ARTIFACTORY_API_KEY }} + + # - name: Build and push Docker image Backend + # uses: docker/build-push-action@v3 + # with: + # context: ./backend + # push: true + # tags: artifactoryyourdomain.jfrog.io/your-repository/agent-x-app-backend:latest + + # - name: Build and push Docker image Frontend + # uses: docker/build-push-action@v3 + # with: + # context: ./frontend + # push: true + # tags: artifactoryyourdomain.jfrog.io/your-repository/agent-x-app-frontend:latest + # build-args: | + # GITHUB_ID=${{ secrets.OAUTH_GITHUB_ID }} + # GITHUB_SECRET=${{ secrets.OAUTH_GITHUB_SECRET }} + # NEXTAUTH_SECRET=${{ secrets.NEXTAUTH_SECRET }} + # NEXTAUTH_URL=https://your.domain.com + # NEXT_PUBLIC_API_URL=https://your.domain.com/api/v1 + + # push_to_registry_staging: + # name: Push Docker image to Artifactory Staging + # runs-on: [self-hosted, Linux] + # if: github.ref == 'refs/heads/staging' + # steps: + # - name: Check out the repo + # uses: actions/checkout@v3 + # with: + # ref: staging + + # - name: Set up Docker Buildx + # uses: docker/setup-buildx-action@v1 + + # - name: Log in to Artifactory + # uses: docker/login-action@v2 + # with: + # registry: artifactoryyourdomain.jfrog.io + # username: ${{ secrets.ARTIFACTORY_EMAIL }} + # password: ${{ secrets.ARTIFACTORY_API_KEY }} + + # - name: Build and push Docker image Backend Staging + # uses: docker/build-push-action@v3 + # with: + # context: ./backend + # push: true + # tags: artifactoryyourdomain.jfrog.io/your-repository/agent-x-app-backend-staging:latest + + # - name: Build and push Docker image Frontend Staging + # uses: docker/build-push-action@v3 + # with: + # context: ./frontend + # push: true + # tags: artifactoryyourdomain.jfrog.io/your-repository/agent-x-app-frontend-staging:latest + # build-args: | + # GITHUB_ID=${{ secrets.OAUTH_GITHUB_ID }} + # GITHUB_SECRET=${{ secrets.OAUTH_GITHUB_SECRET }} + # NEXTAUTH_SECRET=${{ secrets.NEXTAUTH_SECRET }} + # NEXTAUTH_URL=https://your.domain.com + # NEXT_PUBLIC_API_URL=https://your.domain.com/api/v1 diff --git a/.github/workflows/nextjs_bundle_analysis.yml.disabled b/.github/workflows/nextjs_bundle_analysis.yml.disabled new file mode 100644 index 00000000..6af9cdbd --- /dev/null +++ b/.github/workflows/nextjs_bundle_analysis.yml.disabled @@ -0,0 +1,128 @@ +# # Copyright (c) HashiCorp, Inc. +# # SPDX-License-Identifier: MPL-2.0 + +# name: 'Next.js Bundle Analysis' + +# on: +# pull_request: +# branches: +# - develop +# - staging +# - main + +# defaults: +# run: +# working-directory: ./frontend + +# permissions: +# contents: read # for checkout repository +# actions: read # for fetching base branch bundle stats +# pull-requests: write # for comments + +# jobs: +# analyze: +# runs-on: ubuntu-latest +# steps: +# - uses: actions/checkout@v3 + +# - name: Install Node.js +# uses: actions/setup-node@v3 +# with: +# node-version: 18 + +# - name: Install dependencies +# uses: bahmutov/npm-install@v1 + +# # If pnpm is used, you need to switch the previous step with the following one. pnpm does not create a package-lock.json +# # so the step above will fail to pull dependencies +# # - uses: pnpm/action-setup@v2 +# # name: Install pnpm +# # id: pnpm-install +# # with: +# # version: 7 +# # run_install: true + +# - name: Restore next build +# uses: actions/cache@v3 +# id: restore-build-cache +# env: +# cache-name: cache-next-build +# with: +# # if you use a custom build directory, replace all instances of `.next` in this file with your build directory +# # ex: if your app builds to `dist`, replace `.next` with `dist` +# path: .next/cache +# # change this if you prefer a more strict cache +# key: ${{ runner.os }}-build-${{ env.cache-name }} + +# - name: Build next.js app +# # change this if your site requires a custom build command +# run: ./node_modules/.bin/next build + +# # Here's the first place where next-bundle-analysis' own script is used +# # This step pulls the raw bundle stats for the current bundle +# - name: Analyze bundle +# run: npx -p nextjs-bundle-analysis report + +# - name: Upload bundle +# uses: actions/upload-artifact@v3 +# with: +# name: bundle +# path: .next/analyze/__bundle_analysis.json + +# - name: Download base branch bundle stats +# uses: dawidd6/action-download-artifact@v2 +# if: success() && github.event.number +# with: +# workflow: nextjs_bundle_analysis.yml +# branch: ${{ github.event.pull_request.base.ref }} +# path: .next/analyze/base + +# # And here's the second place - this runs after we have both the current and +# # base branch bundle stats, and will compare them to determine what changed. +# # There are two configurable arguments that come from package.json: +# # +# # - budget: optional, set a budget (bytes) against which size changes are measured +# # it's set to 350kb here by default, as informed by the following piece: +# # https://infrequently.org/2021/03/the-performance-inequality-gap/ +# # +# # - red-status-percentage: sets the percent size increase where you get a red +# # status indicator, defaults to 20% +# # +# # Either of these arguments can be changed or removed by editing the `nextBundleAnalysis` +# # entry in your package.json file. +# - name: Compare with base branch bundle +# if: success() && github.event.number +# run: ls -laR .next/analyze/base && npx -p nextjs-bundle-analysis compare + +# - name: Get Comment Body +# id: get-comment-body +# if: success() && github.event.number +# # https://docs.github.com/en/actions/using-workflows/workflow-commands-for-github-actions#multiline-strings +# run: | +# echo "body<> $GITHUB_OUTPUT +# echo "$(cat .next/analyze/__bundle_analysis_comment.txt)" >> $GITHUB_OUTPUT +# echo EOF >> $GITHUB_OUTPUT + +# - name: Find Comment +# uses: peter-evans/find-comment@v2 +# if: success() && github.event.number +# id: fc +# with: +# issue-number: ${{ github.event.number }} +# body-includes: '' + +# - name: Create Comment +# uses: peter-evans/create-or-update-comment@v2 +# if: success() && github.event.number && steps.fc.outputs.comment-id == 0 +# with: +# issue-number: ${{ github.event.number }} +# body: ${{ steps.get-comment-body.outputs.body }} + +# - name: Update Comment +# uses: peter-evans/create-or-update-comment@v2 +# if: success() && github.event.number && steps.fc.outputs.comment-id != 0 +# with: +# issue-number: ${{ github.event.number }} +# body: ${{ steps.get-comment-body.outputs.body }} +# comment-id: ${{ steps.fc.outputs.comment-id }} +# edit-mode: replace diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 00000000..f00bf023 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,25 @@ +name: Release + +on: + push: + branches: + - main + +defaults: + run: + working-directory: ./frontend + +jobs: + release: + name: Release + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + persist-credentials: false + - name: Semantic Release + uses: cycjimmy/semantic-release-action@v4 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + GH_TOKEN: ${{ secrets.GH_TOKEN }} diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml new file mode 100644 index 00000000..c02260d8 --- /dev/null +++ b/.github/workflows/tests.yml @@ -0,0 +1,32 @@ +name: tests-backend + +on: + push: + branches: + - '**' + +jobs: + tests-backend: + name: tests-backend + runs-on: Linux + + steps: + - name: Checkout + uses: actions/checkout@v2 + + - name: Set up Python 3.10 + uses: actions/setup-python@v3 + with: + python-version: '3.10' + + - name: Create empty .env file + run: touch .env + + - name: Install dependencies + run: | + make env-create + + - name: Run tests + run: | + source backend/app/.venv/bin/activate + make test diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..611d0cea --- /dev/null +++ b/.gitignore @@ -0,0 +1,152 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class +*.DS_Store + +# C extensions +*.so + +#Pycharm +.idea + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +pip-wheel-metadata/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +.python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.env.production +.env.development +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +db_docker +minio + +.scannerwork +.ruff_cache + +.terraform + +.vscode + + +# application specific +backend/app/app/tool_constants/sql_tool_db_info.json +backend/app/app/opt/project_scheduling/output +backend/app/app/opt/project_scheduling/output_data +backend/app/app/opt/project_scheduling/config diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 00000000..cb0f9700 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,26 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "name": "Debug: Attach to FastAPI Docker", + "type": "python", + "request": "attach", + "host": "localhost", + "port": 5678, + "pathMappings": [ + { + "localRoot": "${workspaceFolder}/backend/app", + "remoteRoot": "/code" + } + ], + }, + { + "name": "Run current file", + "type": "python", + "request": "launch", + "program": "${file}", + "console": "integratedTerminal", + "envFile": "${workspaceFolder}/.env" + }, + ] +} diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 00000000..aa6bc024 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,20 @@ +{ + "python.defaultInterpreterPath": "${workspaceFolder}/backend/app/.venv/bin/python", + "python.analysis.extraPaths": ["backend/app"], + "python.autoComplete.extraPaths": ["backend/app"], + "python.analysis.autoImportCompletions": true, + "python.languageServer": "Pylance", + "pylint.args": [ + "--rcfile=${workspaceFolder}/backend/app/.pylintrc" + ], + "pylint.interpreter": ["${workspaceFolder}/backend/app/.venv/bin/python"], + "pylint.cwd": "${workspaceFolder}/backend/app/app", + "pylint.importStrategy": "fromEnvironment", + "eslint.options": { + "overrideConfigFile": "${workspaceFolder}/frontend/.eslintrc.json" + }, + "editor.codeActionsOnSave": { + "source.fixAll": "explicit", + "source.fixAll.eslint": "explicit" + }, +} diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 00000000..ec9e744f --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1 @@ +# Project Changelog diff --git a/CODEOWNERS b/CODEOWNERS new file mode 100644 index 00000000..555848cb --- /dev/null +++ b/CODEOWNERS @@ -0,0 +1 @@ +* @heyder-jakob diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 00000000..0b6234bc --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,29 @@ +# Contributing to AgentKit + +We want to make contributing to this project as easy and transparent as possible, whether it's: +- Reporting a bug and ideally submitting a fix +- Proposing new features +- Adding a tool to the library + +## Guidelines +We use Github to host code, to track issues and feature requests, as well as accept pull requests. + +We actively welcome your pull requests: +1. Fork the repo and create your branch from `develop`. +2. If you've changed key features (tools, APIs etc), update the documentation. +3. Ensure the code is clean: passes the set of tests, lints etc. +5. Issue a pull request to the main repo + +## Report bugs and add feature requests using Github issues +Please not that *currently* there is no central team working on this repository that is actively resolving bugs and responding to feature requests. + +### Bugs: +Provide +1) Summary of the issue +2) Steps to reproduce +3) What you expected vs what actually happened +4) Any notes on why you think this might be happening or things you tried that didn't work + + +### Features: +Provide a description of the feature you would like. You're encouraged to build it yourself and open a PR :-) diff --git a/Chinook.db b/Chinook.db new file mode 100644 index 00000000..290370a7 Binary files /dev/null and b/Chinook.db differ diff --git a/LICENSE b/LICENSE new file mode 100644 index 00000000..fcfcb34d --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) Boston Consulting Group. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/Makefile b/Makefile new file mode 100644 index 00000000..9c0d9fc2 --- /dev/null +++ b/Makefile @@ -0,0 +1,170 @@ +#!/usr/bin/make + +include .env + +define SERVERS_JSON +{ + "Servers": { + "1": { + "Name": "fastapi-alembic", + "Group": "Servers", + "Host": "$(DATABASE_HOST)", + "Port": 5432, + "MaintenanceDB": "postgres", + "Username": "$(DATABASE_USER)", + "SSLMode": "prefer", + "PassFile": "/tmp/pgpassfile" + } + } +} +endef +export SERVERS_JSON + +help: + @echo "make" + @echo " install" + @echo " Install all packages of poetry project locally." + @echo " run-dev-build" + @echo " Run development docker compose and force build containers." + @echo " run-dev" + @echo " Run development docker compose." + @echo " stop-dev" + @echo " Stop development docker compose." + @echo " run-prod" + @echo " Run production docker compose." + @echo " stop-prod" + @echo " Run production docker compose." + @echo " init-db" + @echo " Init database with sample data." + @echo " add-dev-migration" + @echo " Add new database migration using alembic." + @echo " formatter" + @echo " Apply black formatting to code." + @echo " lint" + @echo " Lint code with ruff, and check if black formatter should be applied." + @echo " lint-watch" + @echo " Lint code with ruff in watch mode." + @echo " lint-fix" + @echo " Lint code with ruff and try to fix." + +install: + cd backend/app && \ + poetry shell && \ + poetry install + +run-dev-build: + docker compose -f docker-compose-dev.yml up --build + +run-dev: + docker compose -f docker-compose-dev.yml up + +stop-dev: + docker compose -f docker-compose-dev.yml down + +run-prod: + docker compose up + +stop-prod: + docker compose down + +create-celery-db: + if ! docker compose -f docker-compose-dev.yml exec database psql -U ${DATABASE_USER} -h localhost -lqt | cut -d \| -f 1 | grep -qw ${DATABASE_CELERY_NAME}; then \ + docker compose -f docker-compose-dev.yml exec database createdb -U ${DATABASE_USER} -W ${DATABASE_PASSWORD} -h localhost -O ${DATABASE_USER} ${DATABASE_CELERY_NAME}; \ + fi + +add-dev-migration: + docker compose -f docker-compose-dev.yml exec fastapi_server alembic revision --autogenerate && \ + docker compose -f docker-compose-dev.yml exec fastapi_server alembic upgrade head && \ + echo "Migration added and applied." + +install-pre-commit: + cp "pre-commit/pre-commit.git" ".git/hooks/pre-commit" + +pre-commit: + exec docker-compose -f docker-compose-dev.yml run pre-commit + +############################################################################################## +# CREATING THE ENVIRONMENT # +############################################################################################## +PYTHON = python3.10 +PROJECT_NAME = Agent-X +APP_FOLDER = backend/app +SOURCE_FOLDER = app + +.PHONY: env-create +env-create: + $(PYTHON) -m venv $(APP_FOLDER)/.venv --prompt $(PROJECT_NAME) + cd $(APP_FOLDER) \ + && . .venv/bin/activate \ + && pip install "poetry~=1.7.0" \ + && poetry install --no-ansi --with dev + # Don't forget to activate the environment before proceeding! You can run: + # source .venv/bin/activate + + +.PHONY: env-update +env-update: + cd $(APP_FOLDER) && poetry update --with dev + + +.PHONY: env-delete +env-delete: + rm -rf $(APP_FOLDER)/.venv + + +############################################################################################## +# BUILD STEPS: LINTING, TESTING, COVERAGE, DOCS # +############################################################################################## + +.PHONY: build-all +build-all: clean lint build + + +.PHONY: clean +clean: + cd $(APP_FOLDER) && find $(SOURCE_FOLDER) -name __pycache__ | xargs rm -rf + cd $(APP_FOLDER) && find $(SOURCE_FOLDER) -name '*.pyc' -delete + cd $(APP_FOLDER) && rm -rf reports .coverage + cd $(APP_FOLDER) && rm -rf .*cache + + +.PHONY: reformat +reformat: + $(PYTHON) -m isort --sp $(APP_FOLDER)/pyproject.toml $(APP_FOLDER)/$(SOURCE_FOLDER) + $(PYTHON) -m black --config $(APP_FOLDER)/pyproject.toml $(APP_FOLDER)/$(SOURCE_FOLDER) + + +.PHONY: lint +lint: + $(PYTHON) -m pycodestyle --config $(APP_FOLDER)/setup.cfg --exclude '.venv,setup.py,docs/*,notebooks/.,backend/app/app/tool_constants/*' $(APP_FOLDER)/$(SOURCE_FOLDER) + $(PYTHON) -m isort --check-only --settings-path $(APP_FOLDER)/pyproject.toml --sp $(APP_FOLDER) $(APP_FOLDER)/$(SOURCE_FOLDER) + $(PYTHON) -m black --check --config $(APP_FOLDER)/pyproject.toml $(APP_FOLDER)/$(SOURCE_FOLDER) + $(PYTHON) -m pylint --rc-file $(APP_FOLDER)/.pylintrc $(APP_FOLDER)/$(SOURCE_FOLDER) + $(PYTHON) -m mypy --config-file $(APP_FOLDER)/setup.cfg $(APP_FOLDER)/$(SOURCE_FOLDER) + + +.PHONY: test +test: + cd $(APP_FOLDER) && CONFIG_PATH=tests/config $(PYTHON) -m pytest -c tests/pytest.ini + + +.PHONY: radon +radon: + cd $(APP_FOLDER) && radon cc $(SOURCE_FOLDER) --min c + cd $(APP_FOLDER) && xenon --max-absolute C --max-modules C --max-average A $(SOURCE_FOLDER)/ + + +.PHONY: coverage +coverage: + cd $(APP_FOLDER) && \ + CONFIG_PATH=tests/config $(PYTHON) -m pytest tests/ -m 'not system' \ + --junitxml=reports/test-result-all.xml \ + --cov=$(SOURCE_FOLDER) \ + --cov-report term-missing \ + --cov-report html:reports/coverage-all.html \ + --cov-report xml:reports/coverage-all.xml + + +.PHONY: build +build: + poetry build diff --git a/README.md b/README.md new file mode 100644 index 00000000..86919c26 --- /dev/null +++ b/README.md @@ -0,0 +1,110 @@ +AgentKit logo + +[![Lint-Backend](https://github.com/bcgx-pi-genAI/agent-x/actions/workflows/lint-backend.yml/badge.svg?branch=main)](https://github.com/bcgx-pi-genAI/agent-x/actions/workflows/lint-backend.yml?query=branch%3Amain) +[![Lint-Frontend](https://github.com/bcgx-pi-genAI/agent-x/actions/workflows/lint-frontend.yml/badge.svg?branch=main)](https://github.com/bcgx-pi-genAI/agent-x/actions/workflows/lint-frontend.yml?query=branch%3Amain) +[![Tests](https://github.com/bcgx-pi-genAI/agent-x/actions/workflows/tests.yml/badge.svg?branch=main)](https://github.com/bcgx-pi-genAI/agent-x/actions/workflows/tests.yml?query=branch%3Amain) + +# AgentKit: rapidly build high quality Agent apps +AgentKit is a LangChain-based starter kit developed by BCG X to build Agent apps. Developers can use AgentKit to +- Quickly experiment on your constrained agent architecture with a beautiful UI +- Build a full stack chat-based Agent app that can scale to production-grade MVP + +Key advantages of the AgentKit toolkit include: +- 🚀 **Quickly build high quality Agent apps**: Build a strong demo in a few hours using a modular, easy to configure tech stack based on FastAPI/Nextjs and a library of useful GenAI tools +- 💻 **Flexible, reactive UI/UX designed for Agents**: React/Nextjs chat-based UI that is easy to configure, with features such as streaming, rendering of tables/visualizations/code, status of Agent actions and more +- 🛡️ **Focus on reliability**: Easy to configure routing architecture gives control of possible paths Agent can take, increasing reliability and making it suited for real-life use cases +- 📈 **Set up to scale**: Set up to scale to MVP with ready made Queue Management, Auth, Caching, Monitoring etc. + + +https://github.com/bcgx-pi-genAI/agent-x/assets/125347044/32bf632e-a7e0-4cbd-a172-4ba014e64db0 + + +### Tech stack +The starter pack is based on the latest technologies for optimal performance, security and developer experience. +* 💫 Nextjs 14 with tailwind and daisyui +* 🔥 Python 3.10 with fastapi, sqlmodel and pydantic 2.x. +* 🦜 Langchain and Langsmith e2e configuration +* 🗝 Authentication: NextAuth integrated with FastAPI +* 🥬 Celery and redis for long running tasks, caching etc. +* 💾 Local Postgres with pgvector extension +* ⬆️ Docker-compose for simple deployments and DX +* 🖍 Linting, tests and pre-commit hooks pre-configured + +## Quickstart +For a quick setup of AgentKit, use the steps below, where both the backend app and frontend app are run inside a Docker container. More elaborate setup instructions can be found at [setup.md](docs/setup.md). + +### Prerequisites +- Docker: https://www.docker.com/get-started + +### Installation steps +1. Clone the repository containing the source code for the backend and frontend apps. + +2. Copy the `frontend/.env.example` file in the frontend directory and change the name to `.env`. Also, copy the `.env.example` file in the root directory of the repository and change the name to `.env`. + - Change the OPENAI_API_KEY and OPENAI_ORGANIZATION to your own (n.b. OPENAI_ORGANIZATION should be your OpenAI 'Organization ID') + +3. In the terminal, navigate to the root directory of the cloned repository. Build and start the Docker containers with the following command: + ``` + docker-compose -f docker-compose.yml up -d + ``` + Wait for the containers to build and start, which may take a few minutes depending on your system. Once the containers are up and running, you can access the apps in your browser at [http://localhost](http://localhost/). + +## Chinook music database demo +- Ensure you are on the `develop` branch +- Follow the installation instructions above and swap `docker-compose.yml` with `docker-compose-demo.yml` to run the app +- Try the prompt "How many artists and songs are there in the database?" to see AgentKit in action! + +## Set up your own app +- Configure your Agent and Tools [link](docs/docusaurus/docs/configuration/configure_agent_and_tools.md) +- (Optional) Adjust the UI to your use case [link](docs/docusaurus/docs/configuration/configure_ui.md) +- (Optional) Set up evaluation with LangSmith [link](docs/docusaurus/docs/advanced/evaluation.md) + +## Documentation +- [Installation instructions for running frontend or entire app outside Docker](docs/docusaurus/docs/setup/setup_development.md) +- [Key concepts](docs/docusaurus/docs/how_it_works/key_concepts.md) +- [Agent and Tools configuration](docs/docusaurus/docs/configuration/configure_agent_and_tools.md) +- [UI configuration](docs/docusaurus/docs/configuration/configure_ui.md) +- [Optional features](docs/docusaurus/docs/advanced/optional_features.md) +- [Tool library](docs/docusaurus/docs/tool_library/) + +## How it works + +### Reliability +AgentKit attempts to solve the reliability issue of agents such as ReAct agents by constraining the potential routes the agent can take to a pre-configured sets of routes, or **Action Plans**. Since for many use cases the potential routes the agent can take are known, we can use our human domain expertise to steer the agent in the right direction, and reduce it going into unexpected directions or rabbit holes. This is achieved by combining a **Meta Agent** with **Action Plans**: A set of tools which are executed linearily and in parallel, similar to a Chain. The Meta Agent takes in the user prompt and outputs the most suited Action Plan to generate an answer. Note: implementing multiple Meta Agents is possible, generating a tree of possible routes. + +### User experience +To optimize user experience, the intermediary output of every step in the Action Plan can be shown to the user. For example, consider an Action Plan consisting of 2 toolsets: `[[sql_tool, pdf_tool], [generate_summary_tool, visualize_tool]]`. In the first action step, information from a SQL database and a vector database with embedded PDFs are retrieved in parallel. The retrieved data and most relevant PDF are streamed to the UI as soon as the first action step finishes. In the second action step, the output from step 1 is passed to a tool that generates a text summary and a tool that creates a JSX visualization from the data, which is streamed to the UI to create the final answer. + +For a high level overview of the routing flow and connection the UI, please see below diagram: +AgentKit framework + +## Additional optional features + +- **Feedback integration**: collect feedback on generated answers from users + +Feedback + +- **User settings**: Allow users to specify default settings in the app that can be used to customize prompts for the user + +Feedback + +- **User authentication**: Enable NextAuth on your app to authenticate users with Github or with email/password + +Feedback + +See [optional feature documentation](docs/docusaurus/docs/advanced/optional_features.md) for more detailed info. + +## Support and Maintenance + +The project spun of a combination of different templates. One great inspiration is [fastapi-alembic-sqlmodel-async](https://github.com/jonra1993/fastapi-alembic-sqlmodel-async), which provided the foundations for the FastAPI setup. Please check them out! + +Great thanks to all the contributors: +[Placeholder for contributor list] + +Please read `CONTRIBUTING.md` for more details on how to contribute. +PRs are welcome ❤️ + +## License + +[![License](http://img.shields.io/:license-mit-blue.svg?style=flat-square)](http://badges.mit-license.org) + +- This project is licensed under the terms of the **[MIT license](LICENSE)** diff --git a/backend/Dockerfile b/backend/Dockerfile new file mode 100644 index 00000000..3bfdec5f --- /dev/null +++ b/backend/Dockerfile @@ -0,0 +1,19 @@ +FROM tiangolo/uvicorn-gunicorn-fastapi:python3.10-slim-2022-11-25 +ENV PYTHONUNBUFFERED=1 +WORKDIR /code +# Install Poetry +RUN apt clean && apt update && apt install curl -y +RUN curl -sSL https://install.python-poetry.org | POETRY_HOME=/opt/poetry python && \ + cd /usr/local/bin && \ + ln -s /opt/poetry/bin/poetry && \ + poetry config virtualenvs.create false + +# Copy poetry.lock* in case it doesn't exist in the repo +COPY app/pyproject.toml app/poetry.lock* /code/ + +# Allow installing dev dependencies to run tests +ARG INSTALL_DEV=false +RUN bash -c "if [ $INSTALL_DEV == 'true' ] ; then poetry install --with dev --no-root ; else poetry install --no-root --no-dev ; fi" + +ENV PYTHONPATH=/code +EXPOSE 9090 diff --git a/backend/app/.pylintrc b/backend/app/.pylintrc new file mode 100644 index 00000000..57c76594 --- /dev/null +++ b/backend/app/.pylintrc @@ -0,0 +1,493 @@ +[MASTER] + +# Avoid 'no-name-in-module' error in pydantic v1 +# see https://stackoverflow.com/questions/62152885/pydantic-basemodel-not-found-in-fastapi +extension-pkg-allow-list=pydantic + +# A comma-separated list of package or module names from where C extensions may +# be loaded. Extensions are loading into the active Python interpreter and may +# run arbitrary code +extension-pkg-whitelist=cv2,PyQt5 + +# Add files or directories to the blacklist. They should be base names, not +# paths. +ignore=CVS, alembic + +# Add files or directories matching the regex patterns to the blacklist. The +# regex matches against base names, not paths. +ignore-patterns=__init__ + +# Python code to execute, usually for sys.path manipulation such as +# pygtk.require(). +#init-hook= + +# Use multiple processes to speed up Pylint. +jobs=2 + +# List of plugins (as comma separated values of python modules names) to load, +# usually to register additional checkers. +load-plugins=pylint.extensions.no_self_use,pylint_pydantic + +# Pickle collected data for later comparisons. +persistent=no + +# Specify a configuration file. +#rcfile= + +# When enabled, pylint would attempt to guess common misconfiguration and emit +# user-friendly hints instead of false-positive error messages +suggestion-mode=yes + +# Allow loading of arbitrary C extensions. Extensions are imported into the +# active Python interpreter and may run arbitrary code. +unsafe-load-any-extension=no + + +[MESSAGES CONTROL] + +# Only show warnings with the listed confidence levels. Leave empty to show +# all. Valid levels: HIGH, INFERENCE, INFERENCE_FAILURE, UNDEFINED +confidence= + +# Disable the message, report, category or checker with the given id(s). You +# can either give multiple identifiers separated by comma (,) or put this +# option multiple times (only on the command line, not in the configuration +# file where it should appear only once).You can also use "--disable=all" to +# disable everything first and then reenable specific checks. For example, if +# you want to run only the similarities checker, you can use "--disable=all +# --enable=similarities". If you want to run only the classes checker, but have +# no Warning level messages displayed, use"--disable=all --enable=classes +# --disable=W" +disable= +# Disabled (not applicable, false positives, or checked by other tool) + logging-format-interpolation, + logging-not-lazy, + unsubscriptable-object, + missing-module-docstring, + consider-using-from-import, + raw-checker-failed, + bad-inline-option, + locally-disabled, + file-ignored, + suppressed-message, + deprecated-pragma, + missing-docstring, + invalid-name, + too-few-public-methods, + fixme, + too-many-arguments, + too-many-branches, + unpacking-non-sequence, + wildcard-import, + unused-wildcard-import, + singleton-comparison, + no-name-in-module, + import-error, + line-too-long, + logging-fstring-interpolation, + R0801, + consider-using-with, + raise-missing-from, + too-many-lines + +# Enable the message, report, category or checker with the given id(s). You can +# either give multiple identifier separated by comma (,) or put this option +# multiple time (only on the command line, not in the configuration file where +# it should appear only once). See also the "--disable" option for examples. +enable=c-extension-no-member, useless-suppression + + +[REPORTS] + +# Python expression which should return a note less than 10 (10 is the highest +# note). You have access to the variables errors warning, statement which +# respectively contain the number of errors / warnings messages and the total +# number of statements analyzed. This is used by the global evaluation report +# (RP0004). +evaluation=10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10) + +# Template used to display messages. This is a python new-style format string +# used to format the message information. See doc for all details +#msg-template= + +# Set the output format. Available formats are text, parseable, colorized, json +# and msvs (visual studio).You can also give a reporter class, eg +# mypackage.mymodule.MyReporterClass. +output-format=text + +# Tells whether to display a full report or only the messages +reports=no + +# Activate the evaluation score. +score=no + + +[REFACTORING] + +# Maximum number of nested blocks for function / method body +max-nested-blocks=10 + +# Complete name of functions that never returns. When checking for +# inconsistent-return-statements if a never returning function is called then +# it will be considered as an explicit return statement and no message will be +# printed. +never-returning-functions=optparse.Values,sys.exit + + +[SIMILARITIES] + +# Ignore comments when computing similarities. +ignore-comments=yes + +# Ignore docstrings when computing similarities. +ignore-docstrings=yes + +# Ignore imports when computing similarities. +ignore-imports=no + +# Minimum lines number of a similarity. +min-similarity-lines=4 + + +[VARIABLES] + +# List of additional names supposed to be defined in builtins. Remember that +# you should avoid to define new builtins when possible. +additional-builtins= + +# Tells whether unused global variables should be treated as a violation. +allow-global-unused-variables=yes + +# List of strings which can identify a callback function by name. A callback +# name must start or end with one of those strings. +callbacks=cb_, + _cb + +# A regular expression matching the name of dummy variables (i.e. expectedly +# not used). +dummy-variables-rgx=_+$|(_[a-zA-Z0-9_]*[a-zA-Z0-9]+?$)|dummy|^ignored_|^unused_ + +# Argument names that match this expression will be ignored. Default to name +# with leading underscore +ignored-argument-names=_.*|^ignored_|^unused_ + +# Tells whether we should check for unused import in __init__ files. +init-import=no + +# List of qualified module names which can have objects that can redefine +# builtins. +redefining-builtins-modules=six.moves,past.builtins,future.builtins,io + + +[MISCELLANEOUS] + +# List of note tags to take in consideration, separated by a comma. +notes=FIXME, + XXX, + TODO + + +[TYPECHECK] + +# List of decorators that produce context managers, such as +# contextlib.contextmanager. Add to this list to register other decorators that +# produce valid context managers. +contextmanager-decorators=contextlib.contextmanager + +# List of members which are set dynamically and missed by pylint inference +# system, and so shouldn't trigger E1101 when accessed. Python regular +# expressions are accepted. +generated-members= + +# Tells whether missing members accessed in mixin class should be ignored. A +# mixin class is detected if its name ends with "mixin" (case insensitive). +ignore-mixin-members=yes + +# This flag controls whether pylint should warn about no-member and similar +# checks whenever an opaque object is returned when inferring. The inference +# can return multiple potential results while evaluating a Python object, but +# some branches might not be evaluated, which results in partial inference. In +# that case, it might be useful to still emit no-member and other checks for +# the rest of the inferred objects. +ignore-on-opaque-inference=yes + +# List of class names for which member attributes should not be checked (useful +# for classes with dynamically set attributes). This supports the use of +# qualified names. +ignored-classes=optparse.Values,thread._local,_thread._local + +# List of module names for which member attributes should not be checked +# (useful for modules/projects where namespaces are manipulated during runtime +# and thus existing member attributes cannot be deduced by static analysis. It +# supports qualified module names, as well as Unix pattern matching. +ignored-modules= + +# Show a hint with possible names when a member name was not found. The aspect +# of finding the hint is based on edit distance. +missing-member-hint=yes + +# The minimum edit distance a name should have in order to be considered a +# similar match for a missing member name. +missing-member-hint-distance=1 + +# The total number of similar names that should be taken in consideration when +# showing a hint for a missing member. +missing-member-max-choices=1 + + +[LOGGING] + +# Logging modules to check that the string format arguments are in logging +# function parameter format +logging-modules=logging + + +[FORMAT] + +# Expected format of line ending, e.g. empty (any line ending), LF or CRLF. +expected-line-ending-format= + +# Regexp for a line that is allowed to be longer than the limit. +ignore-long-lines=^\s*(# )??$ + +# Number of spaces of indent required inside a hanging or continued line. +indent-after-paren=4 + +# String used as indentation unit. This is usually " " (4 spaces) or "\t" (1 +# tab). +indent-string=' ' + +# Maximum number of characters on a single line. +max-line-length=120 + +# Maximum number of lines in a module +max-module-lines=1000 + +# Allow the body of a class to be on the same line as the declaration if body +# contains single statement. +single-line-class-stmt=no + +# Allow the body of an if to be on the same line as the test if there is no +# else. +single-line-if-stmt=no + + +[SPELLING] + +# Limits count of emitted suggestions for spelling mistakes +max-spelling-suggestions=4 + +# Spelling dictionary name. Available dictionaries: none. To make it working +# install python-enchant package. +spelling-dict= + +# List of comma separated words that should not be checked. +spelling-ignore-words= + +# A path to a file that contains private dictionary; one word per line. +spelling-private-dict-file= + +# Tells whether to store unknown words to indicated private dictionary in +# --spelling-private-dict-file option instead of raising a message. +spelling-store-unknown-words=no + + +[BASIC] + +# Naming style matching correct argument names +argument-naming-style=snake_case + +# Regular expression matching correct argument names. Overrides argument- +# naming-style +#argument-rgx= + +# Naming style matching correct attribute names +attr-naming-style=snake_case + +# Regular expression matching correct attribute names. Overrides attr-naming- +# style +#attr-rgx= + +# Bad variable names which should always be refused, separated by a comma +bad-names=foo, + bar, + baz, + toto, + tutu, + tata + +# Naming style matching correct class attribute names +class-attribute-naming-style=any + +# Regular expression matching correct class attribute names. Overrides class- +# attribute-naming-style +#class-attribute-rgx= + +# Naming style matching correct class names +class-naming-style=PascalCase + +# Regular expression matching correct class names. Overrides class-naming-style +#class-rgx= + +# Naming style matching correct constant names +const-naming-style=UPPER_CASE + +# Regular expression matching correct constant names. Overrides const-naming- +# style +#const-rgx= + +# Minimum line length for functions/classes that require docstrings, shorter +# ones are exempt. +docstring-min-length=20 + +# Naming style matching correct function names +function-naming-style=snake_case + +# Regular expression matching correct function names. Overrides function- +# naming-style +#function-rgx= + +# Good variable names which should always be accepted, separated by a comma +good-names=i, + j, + k, + f, + _ + +# Include a hint for the correct naming format with invalid-name +include-naming-hint=no + +# Naming style matching correct inline iteration names +inlinevar-naming-style=any + +# Regular expression matching correct inline iteration names. Overrides +# inlinevar-naming-style +#inlinevar-rgx= + +# Naming style matching correct method names +method-naming-style=snake_case + +# Regular expression matching correct method names. Overrides method-naming- +# style +#method-rgx= + +# Naming style matching correct module names +module-naming-style=snake_case + +# Regular expression matching correct module names. Overrides module-naming- +# style +#module-rgx= + +# Colon-delimited sets of names that determine each other's naming style when +# the name regexes allow several styles. +name-group= + +# Regular expression which should only match function or class names that do +# not require a docstring. +no-docstring-rgx=(^_)|(parser)|(^main$) + +# List of decorators that produce properties, such as abc.abstractproperty. Add +# to this list to register other decorators that produce valid properties. +property-classes=abc.abstractproperty + +# Naming style matching correct variable names +variable-naming-style=snake_case + +# Regular expression matching correct variable names. Overrides variable- +# naming-style +#variable-rgx= + + +[IMPORTS] + +# Allow wildcard imports from modules that define __all__. +allow-wildcard-with-all=no + +# Analyse import fallback blocks. This can be used to support both Python 2 and +# 3 compatible code, which means that the block might have code that exists +# only in one or another interpreter, leading to false positives when analysed. +analyse-fallback-blocks=no + +# Deprecated modules which should not be used, separated by a comma +deprecated-modules=optparse,tkinter.tix + +# Create a graph of external dependencies in the given file (report RP0402 must +# not be disabled) +ext-import-graph= + +# Create a graph of every (i.e. internal and external) dependencies in the +# given file (report RP0402 must not be disabled) +import-graph= + +# Create a graph of internal dependencies in the given file (report RP0402 must +# not be disabled) +int-import-graph= + +# Force import order to recognize a module as part of the standard +# compatibility libraries. +known-standard-library= + +# Force import order to recognize a module as part of a third party library. +known-third-party=enchant + + +[DESIGN] + +# Maximum number of arguments for function / method +max-args=13 + +# Maximum number of attributes for a class (see R0902). +max-attributes=20 + +# Maximum number of boolean expressions in a if statement +max-bool-expr=5 + +# Maximum number of branch for function / method body +max-branches=20 + +# Maximum number of locals for function / method body +max-locals=35 + +# Maximum number of parents for a class (see R0901). +max-parents=7 + +# Maximum number of public methods for a class (see R0904). +max-public-methods=25 + +# Maximum number of return / yield for function / method body +max-returns=12 + +# Maximum number of statements in function / method body +max-statements=70 + +# Minimum number of public methods for a class (see R0903). +min-public-methods=0 + + +[CLASSES] + +# List of method names used to declare (i.e. assign) instance attributes. +defining-attr-methods=__init__, + __new__, + setUp + +# List of member names, which should be excluded from the protected access +# warning. +exclude-protected=_asdict, + _fields, + _replace, + _source, + _make + +# List of valid names for the first argument in a class method. +valid-classmethod-first-arg=cls + +# List of valid names for the first argument in a metaclass class method. +valid-metaclass-classmethod-first-arg=mcs + + +[EXCEPTIONS] + +# Exceptions that will emit a warning when being caught. Defaults to +# "Exception" +overgeneral-exceptions=builtin.Exception diff --git a/backend/app/alembic.ini b/backend/app/alembic.ini new file mode 100644 index 00000000..9eeab9b7 --- /dev/null +++ b/backend/app/alembic.ini @@ -0,0 +1,72 @@ +# A generic, single database configuration. + +[alembic] +# path to migration scripts +script_location = alembic + +# template used to generate migration files +# file_template = %%(rev)s_%%(slug)s +file_template = %%(year)d-%%(month).2d-%%(day).2d-%%(hour).2d-%%(minute).2d_%%(rev)s + +# timezone to use when rendering the date +# within the migration file as well as the filename. +# string value is passed to dateutil.tz.gettz() +# leave blank for localtime +# timezone = + +# max length of characters to apply to the +# "slug" field +#truncate_slug_length = 40 + +# set to 'true' to run the environment during +# the 'revision' command, regardless of autogenerate +# revision_environment = false + +# set to 'true' to allow .pyc and .pyo files without +# a source .py file to be detected as revisions in the +# versions/ directory +# sourceless = false + +# version location specification; this defaults +# to alembic/versions. When using multiple version +# directories, initial revisions must be specified with --version-path +# version_locations = %(here)s/bar %(here)s/bat alembic/versions + +# the output encoding used when revision files +# are written from script.py.mako +# output_encoding = utf-8 + +# Logging configuration +[loggers] +keys = root,sqlalchemy,alembic + +[handlers] +keys = console + +[formatters] +keys = generic + +[logger_root] +level = WARN +handlers = console +qualname = + +[logger_sqlalchemy] +level = WARN +handlers = +qualname = sqlalchemy.engine + +[logger_alembic] +level = INFO +handlers = +qualname = alembic + +[handler_console] +class = StreamHandler +args = (sys.stderr,) +level = NOTSET +formatter = generic + +[formatter_generic] +format = %(levelname)-5.5s [%(name)s] %(message)s +datefmt = %H:%M:%S diff --git a/backend/app/alembic/env.py b/backend/app/alembic/env.py new file mode 100644 index 00000000..a1783b7a --- /dev/null +++ b/backend/app/alembic/env.py @@ -0,0 +1,87 @@ +# -*- coding: utf-8 -*- +from __future__ import with_statement + +import asyncio +import pathlib +import sys +from logging.config import fileConfig + +from sqlalchemy.ext.asyncio import create_async_engine +from sqlmodel import SQLModel + +from alembic import context + +# necessarily to import something from file where your models are stored +sys.path.append(str(pathlib.Path(__file__).resolve().parents[1])) + +from app.core.config import Settings # noqa: E402 +from app.models import * # noqa: E402,F403 + +settings = Settings() +# this is the Alembic Config object, which provides +# access to the values within the .ini file in use. +config = context.config + +# Interpret the config file for Python logging. +# This line sets up loggers basically. +fileConfig(config.config_file_name) + + +target_metadata = SQLModel.metadata + +# other values from the config, defined by the needs of env.py, +# can be acquired: +# my_important_option = config.get_main_option("my_important_option") +# ... etc. + + +def run_migrations_offline(): + """ + Run migrations in 'offline' mode. + + This configures the context with just a URL and not an Engine, though an Engine is + acceptable here as well. By skipping the Engine creation we don't even need a DBAPI + to be available. Calls to context.execute() here emit the given string to the script + output. + """ + url = settings.ASYNC_DATABASE_URI + context.configure( + url=url, + target_metadata=target_metadata, + literal_binds=True, + compare_type=True, + dialect_opts={"paramstyle": "named"}, + ) + + with context.begin_transaction(): + context.run_migrations() + + +def do_run_migrations(connection): + context.configure(connection=connection, target_metadata=target_metadata) + + with context.begin_transaction(): + context.run_migrations() + + +async def run_migrations_online(): + """ + Run migrations in 'online' mode. + + In this scenario we need to create an Engine and associate a connection with the + context. + """ + connectable = create_async_engine( + settings.ASYNC_DATABASE_URI, + echo=True, + future=True, + ) + + async with connectable.connect() as connection: + await connection.run_sync(do_run_migrations) + + +if context.is_offline_mode(): + run_migrations_offline() +else: + asyncio.run(run_migrations_online()) diff --git a/backend/app/alembic/script.py.mako b/backend/app/alembic/script.py.mako new file mode 100644 index 00000000..1a35d3b4 --- /dev/null +++ b/backend/app/alembic/script.py.mako @@ -0,0 +1,27 @@ +"""${message} + +Revision ID: ${up_revision} +Revises: ${down_revision | comma,n} +Create Date: ${create_date} + +""" +from alembic import op +import sqlalchemy as sa +import sqlalchemy_utils +import sqlmodel # added +${imports if imports else ""} + +# revision identifiers, used by Alembic. +revision = ${repr(up_revision)} +down_revision = ${repr(down_revision)} +branch_labels = ${repr(branch_labels)} +depends_on = ${repr(depends_on)} + + +def upgrade(): + op.execute("CREATE EXTENSION IF NOT EXISTS pg_trgm") + ${upgrades if upgrades else "pass"} + + +def downgrade(): + ${downgrades if downgrades else "pass"} diff --git a/backend/app/alembic/versions/2023-06-02-15-48_adbe2344fb23.py b/backend/app/alembic/versions/2023-06-02-15-48_adbe2344fb23.py new file mode 100644 index 00000000..ba1a3531 --- /dev/null +++ b/backend/app/alembic/versions/2023-06-02-15-48_adbe2344fb23.py @@ -0,0 +1,91 @@ +# -*- coding: utf-8 -*- +""" +empty message. + +Revision ID: adbe2344fb23 +Revises: +Create Date: 2023-06-02 15:48:22.171547 +""" +import sqlalchemy as sa +import sqlmodel # added + +from alembic import op + +# revision identifiers, used by Alembic. +revision = "adbe2344fb23" +down_revision = None +branch_labels = None +depends_on = None + + +def upgrade(): + op.execute("CREATE EXTENSION IF NOT EXISTS pg_trgm") + # ### commands auto generated by Alembic - please adjust! ### + op.create_table( + "Account", + sa.Column("id", sqlmodel.sql.sqltypes.AutoString(), nullable=True), + sa.Column("updated_at", sa.DateTime(), nullable=True), + sa.Column("created_at", sa.DateTime(), nullable=True), + sa.Column("userId", sqlmodel.sql.sqltypes.AutoString(), nullable=True), + sa.Column("type", sqlmodel.sql.sqltypes.AutoString(), nullable=True), + sa.Column("provider", sqlmodel.sql.sqltypes.AutoString(), nullable=True), + sa.Column("providerAccountId", sqlmodel.sql.sqltypes.AutoString(), nullable=True), + sa.Column("refresh_token", sqlmodel.sql.sqltypes.AutoString(), nullable=True), + sa.Column("access_token", sqlmodel.sql.sqltypes.AutoString(), nullable=True), + sa.Column("expires_at", sa.Integer(), nullable=True), + sa.Column("token_type", sqlmodel.sql.sqltypes.AutoString(), nullable=True), + sa.Column("scope", sqlmodel.sql.sqltypes.AutoString(), nullable=True), + sa.Column("id_token", sqlmodel.sql.sqltypes.AutoString(), nullable=True), + sa.Column("session_state", sqlmodel.sql.sqltypes.AutoString(), nullable=True), + sa.PrimaryKeyConstraint("id"), + sa.UniqueConstraint("provider", "providerAccountId"), + ) + op.create_table( + "Session", + sa.Column("id", sqlmodel.sql.sqltypes.AutoString(), nullable=True), + sa.Column("updated_at", sa.DateTime(), nullable=True), + sa.Column("created_at", sa.DateTime(), nullable=True), + sa.Column("sessionToken", sqlmodel.sql.sqltypes.AutoString(), nullable=True), + sa.Column("userId", sqlmodel.sql.sqltypes.AutoString(), nullable=True), + sa.Column("expires", sa.DateTime(), nullable=True), + sa.PrimaryKeyConstraint("id"), + sa.UniqueConstraint("sessionToken"), + ) + op.create_table( + "User", + sa.Column("id", sqlmodel.sql.sqltypes.AutoString(), nullable=True), + sa.Column("updated_at", sa.DateTime(), nullable=True), + sa.Column("created_at", sa.DateTime(), nullable=True), + sa.Column("name", sqlmodel.sql.sqltypes.AutoString(), nullable=True), + sa.Column("email", sqlmodel.sql.sqltypes.AutoString(), nullable=True), + sa.Column("emailVerified", sa.DateTime(), nullable=True), + sa.Column("image", sqlmodel.sql.sqltypes.AutoString(), nullable=True), + sa.Column("credits", sa.Integer(), nullable=False), + sa.Column("location", sqlmodel.sql.sqltypes.AutoString(), nullable=True), + sa.PrimaryKeyConstraint("id"), + sa.UniqueConstraint("email"), + ) + op.create_table( + "VerificationToken", + sa.Column("id", sqlmodel.sql.sqltypes.GUID(), nullable=False), + sa.Column("updated_at", sa.DateTime(), nullable=True), + sa.Column("created_at", sa.DateTime(), nullable=True), + sa.Column("identifier", sqlmodel.sql.sqltypes.AutoString(), nullable=True), + sa.Column("token", sqlmodel.sql.sqltypes.AutoString(), nullable=True), + sa.Column("expires", sa.DateTime(), nullable=True), + sa.PrimaryKeyConstraint("id"), + sa.UniqueConstraint("identifier", "token"), + sa.UniqueConstraint("token"), + ) + op.create_index(op.f("ix_VerificationToken_id"), "VerificationToken", ["id"], unique=False) + # ### end Alembic commands ### + + +def downgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.drop_index(op.f("ix_VerificationToken_id"), table_name="VerificationToken") + op.drop_table("VerificationToken") + op.drop_table("User") + op.drop_table("Session") + op.drop_table("Account") + # ### end Alembic commands ### diff --git a/backend/app/app/__init__.py b/backend/app/app/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/backend/app/app/api/__init__.py b/backend/app/app/api/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/backend/app/app/api/deps.py b/backend/app/app/api/deps.py new file mode 100644 index 00000000..5f378766 --- /dev/null +++ b/backend/app/app/api/deps.py @@ -0,0 +1,108 @@ +# -*- coding: utf-8 -*- +""" +This python module provides a set of utility functions which can be used to create and +handle connections and sessions to various services such as Redis, PostgreSQL (via +SQLModel's AsyncSession), and Minio, as well as for handling OAuth2 authentication using +FastAPI's OAuth2PasswordBearer. + +Example usage: +from fastapi import Depends +from .db_utils import get_db, get_redis_client, reusable_oauth2 + +@app.get("/users/") +async def read_users( + redis=Depends(get_redis_client), + db: AsyncSession = Depends(get_db), + token: str = Depends(reusable_oauth2) +): + ... +""" +from collections.abc import AsyncGenerator + +import redis.asyncio as aioredis +from fastapi.security import OAuth2PasswordBearer +from fastapi_nextauth_jwt import NextAuthJWT +from langchain_community.storage import RedisStore +from redis import Redis as RedisSync +from redis.asyncio import Redis +from sqlmodel.ext.asyncio.session import AsyncSession +from starlette.requests import Request + +from app.core.config import settings +from app.db.session import SessionLocal, SessionLocalCelery +from app.utils.minio_client import MinioClient + +reusable_oauth2 = OAuth2PasswordBearer(tokenUrl=f"{settings.API_V1_STR}/login/access-token") + + +def get_redis_store() -> RedisStore: + store = RedisStore( + redis_url=f"redis://{settings.REDIS_HOST}:{settings.REDIS_PORT}", + client_kwargs={"db": 2}, + namespace="embedding_caches", + ) + return store + + +def get_redis_client_sync() -> RedisSync: + """Returns a synchronous Redis client.""" + return RedisSync( + host=settings.REDIS_HOST, + port=settings.REDIS_PORT, + db=0, + decode_responses=True, + ) + + +async def get_redis_client() -> Redis: + """Returns an asynchronous Redis client as a coroutine function which should be + awaited.""" + return await aioredis.from_url( + f"redis://{settings.REDIS_HOST}:{settings.REDIS_PORT}", + max_connections=10, + encoding="utf8", + decode_responses=True, + ) + + +async def get_db() -> AsyncGenerator[ + AsyncSession, + None, +]: + """Returns an asynchronous database session as a coroutine function which should be + awaited.""" + async with SessionLocal() as session: + yield session + + +async def get_jobs_db() -> AsyncGenerator[ + AsyncSession, + None, +]: + """Returns an asynchronous database session as a coroutine function which should be + awaited.""" + async with SessionLocalCelery() as session: + yield session + + +def minio_auth() -> MinioClient: + """Returns a MinioClient instance.""" + return MinioClient( + access_key=settings.MINIO_ROOT_USER, + secret_key=settings.MINIO_ROOT_PASSWORD, + bucket_name=settings.MINIO_BUCKET, + minio_url=settings.MINIO_URL, + ) + + +def get_jwt(req: Request) -> NextAuthJWT: + """Returns a NextAuthJWT instance.""" + if not settings.ENABLE_AUTH: + return None + if not settings.NEXTAUTH_SECRET: + raise ValueError("Authentication enabled, but NextAuth secret is not set") + + return NextAuthJWT( + secret=settings.NEXTAUTH_SECRET, + csrf_prevention_enabled=False, + )(req) diff --git a/backend/app/app/api/v1/__init__.py b/backend/app/app/api/v1/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/backend/app/app/api/v1/api.py b/backend/app/app/api/v1/api.py new file mode 100644 index 00000000..c6aef092 --- /dev/null +++ b/backend/app/app/api/v1/api.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- +from fastapi import APIRouter + +from app.api.v1.endpoints import chat, sql, statistics + +api_router = APIRouter() +api_router.include_router( + sql.router, + prefix="/sql", + tags=["sql"], +) +api_router.include_router( + chat.router, + prefix="/chat", + tags=["chat"], +) +api_router.include_router( + statistics.router, + prefix="/statistics", + tags=["statistics"], +) diff --git a/backend/app/app/api/v1/endpoints/__init__.py b/backend/app/app/api/v1/endpoints/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/backend/app/app/api/v1/endpoints/chat.py b/backend/app/app/api/v1/endpoints/chat.py new file mode 100644 index 00000000..eb327773 --- /dev/null +++ b/backend/app/app/api/v1/endpoints/chat.py @@ -0,0 +1,112 @@ +# -*- coding: utf-8 -*- +import asyncio +import logging +from datetime import datetime +from typing import Annotated + +from fastapi import APIRouter, Depends +from fastapi.responses import StreamingResponse +from langchain.agents import AgentExecutor + +from app.api.deps import get_jwt +from app.core.config import settings +from app.deps import agent_deps +from app.schemas.message_schema import IChatQuery +from app.services.chat_agent.helpers.run_helper import is_running, stop_run +from app.services.chat_agent.meta_agent import get_conv_token_buffer_memory +from app.utils.streaming.callbacks.stream import AsyncIteratorCallbackHandler +from app.utils.streaming.helpers import event_generator, handle_exceptions +from app.utils.streaming.StreamingJsonListResponse import StreamingJsonListResponse + +router = APIRouter() +logger = logging.getLogger(__name__) + + +def get_meta_agent_with_api_key( + chat: IChatQuery, +) -> AgentExecutor: + """ + Returns a MetaAgent instance with the API key specified in the chat query. + + Args: + chat (IChatQuery): The chat query containing the API key. + + Returns: + MetaAgent: The MetaAgent instance with the specified API key. + """ + return agent_deps.get_meta_agent(chat.api_key) + + +@router.get("/run/{run_id}/status", response_model=bool) +async def run_status( + run_id: str, +) -> bool: + return await is_running(run_id) + + +@router.get("/run/{run_id}/cancel", response_model=bool) +async def run_cancel( + run_id: str, +) -> bool: + await stop_run(run_id) + return True + + +@router.post("/agent", dependencies=[Depends(agent_deps.set_global_tool_context)]) +async def agent_chat( + chat: IChatQuery, + jwt: Annotated[dict, Depends(get_jwt)], + meta_agent: AgentExecutor = Depends(get_meta_agent_with_api_key), +) -> StreamingResponse: + """ + This function handles the chat interaction with an agent. It converts the chat + messages to the Langchain format, creates a memory of the conversation, and sets up + a stream handler. It then creates an asyncio task to handle the conversation with + the agent and returns a streaming response of the conversation. + + Args: + chat (IChatQuery): The chat query containing the messages and other details. + jwt (Annotated[dict, Depends(get_jwt)]): The JWT token from the request. + meta_agent (AgentExecutor, optional): The MetaAgent instance. Defaults to the one returned by get_ + meta_agent_with_api_key. + + Returns: + StreamingResponse: The streaming response of the conversation. + """ + logger.info(f"User JWT from request: {jwt}") + + api_key = chat.api_key + if api_key is None or api_key == "": + api_key = settings.OPENAI_API_KEY + + chat_messages = [m.to_langchain() for m in chat.messages] + memory = get_conv_token_buffer_memory( + chat_messages[:-1], # type: ignore + api_key, + ) + stream_handler = AsyncIteratorCallbackHandler() + chat_content = chat_messages[-1].content if chat_messages[-1] is not None else "" + asyncio.create_task( + handle_exceptions( + meta_agent.arun( + input=chat_content, + chat_history=memory.load_memory_variables({})["chat_history"], + callbacks=[stream_handler], + user_settings=chat.settings, + tags=[ + "agent_chat", + f"user_email={chat.user_email}", + f"conversation_id={chat.conversation_id}", + f"message_id={chat.new_message_id}", + f"timestamp={datetime.now()}", + f"version={chat.settings.version if chat.settings is not None else 'N/A'}", + ], + ), + stream_handler, + ) + ) + + return StreamingJsonListResponse( + event_generator(stream_handler), + media_type="text/plain", + ) diff --git a/backend/app/app/api/v1/endpoints/sql.py b/backend/app/app/api/v1/endpoints/sql.py new file mode 100644 index 00000000..ef8e5ce6 --- /dev/null +++ b/backend/app/app/api/v1/endpoints/sql.py @@ -0,0 +1,60 @@ +# -*- coding: utf-8 -*- +# mypy: disable-error-code="attr-defined" +from fastapi import APIRouter +from fastapi_cache.decorator import cache + +from app.db.session import sql_tool_db +from app.schemas.response_schema import IGetResponseBase, create_response +from app.schemas.tool_schemas.sql_tool_schema import ExecutionResult +from app.utils.sql import is_sql_query_safe + +router = APIRouter() + + +@router.get("/execute") +@cache(expire=600) # -> Bug on POST requests https://github.com/long2ice/fastapi-cache/issues/113 +async def execute_sql( + statement: str, +) -> IGetResponseBase[ExecutionResult]: + """Executes an SQL query on the database and returns the result.""" + if not is_sql_query_safe(statement): + return create_response( + message="SQL query contains forbidden keywords (DML, DDL statements)", + data=None, + meta={}, + ) + if sql_tool_db is None: + return create_response( + message="SQL query execution is disabled", + data=None, + meta={}, + ) + + try: + ( + columns, + rows, + ) = sql_tool_db.execute(statement) + execution_result = ExecutionResult( + raw_result=[ + dict( + zip( + columns, + row, + ) + ) + for row in rows + ], + affected_rows=None, + error=None, + ) + except Exception as e: + return create_response( + message=repr(e), + data=None, + ) + + return create_response( + message="Successfully executed SQL query", + data=execution_result, + ) diff --git a/backend/app/app/api/v1/endpoints/statistics.py b/backend/app/app/api/v1/endpoints/statistics.py new file mode 100644 index 00000000..c8da7f8d --- /dev/null +++ b/backend/app/app/api/v1/endpoints/statistics.py @@ -0,0 +1,51 @@ +# -*- coding: utf-8 -*- +from os import getenv +from typing import List + +from fastapi import APIRouter +from langsmith import Client +from langsmith.schemas import Run + +from app.schemas.message_schema import FeedbackLangchain, FeedbackSourceBaseLangchain, IFeedback + +router = APIRouter() + + +@router.post("/feedback") +async def send_feedback( + feedback: IFeedback, +) -> FeedbackLangchain: + """Send feedback to the Langsmith API.""" + client = Client() + runs: List[Run] = list( + client.list_runs( + project_name=getenv("LANGCHAIN_PROJECT"), + filter=f'has(tags, "message_id={feedback.message_id}")', + execution_order=1, + ) + ) + run: Run = runs[0] + + if feedback.previous_id: + client.delete_feedback(feedback.previous_id) + + feedback_res = client.create_feedback( + run.id, + feedback.key, + score=feedback.score, + comment=feedback.comment, + source_info={ + "user": feedback.user, + "conversation_id": feedback.conversation_id, + "message_id": feedback.message_id, + "settings_version": feedback.settings.version if feedback.settings is not None else "N/A", + }, + ) + + feedback_pydanticv2 = FeedbackLangchain( + **feedback_res.dict(), + feedback_source=( + FeedbackSourceBaseLangchain(**feedback_res.feedback_source.dict()) if feedback_res.feedback_source else None + ), + ) + return feedback_pydanticv2 diff --git a/backend/app/app/config/__init__.py b/backend/app/app/config/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/backend/app/app/config/agent.yml b/backend/app/app/config/agent.yml new file mode 100644 index 00000000..d79c35c3 --- /dev/null +++ b/backend/app/app/config/agent.yml @@ -0,0 +1,103 @@ +--- +tools_library: !include tools.yml +common: # settings shared by agent and all tools (can be overwritten by passing explicitly to constructors) + llm: 'gpt-4' + fast_llm: 'gpt-3.5-turbo' + fast_llm_token_limit: 2500 + max_token_length: 4000 +tools: + - expert_tool + - clarify_tool + - chain_tool + - image_generation_tool + - pdf_tool + - sql_tool + - sql_expert_tool + - visualizer_tool + - code_search_tool + - code_expert_tool + - generate_config_tool + - generate_optim_input_tool + - summarize_config_changes_tool + - run_optimizer_tool + - summarize_kpi_tool + +action_plans: + '0': + name: '' + description: Use this plan to answer technical questions about AgentKit - related to setup, code, codebase navigation, or other technical questions. + actions: + - - memory + - pdf_tool + - code_search_tool + - - code_expert_tool + '1': + name: '' + description: Ask the user to clarify the input question + actions: + - - memory + - clarify_tool + '2': + name: '' + description: |- + Use this plan to fetch Github-related information from the repository of AgentKit, such as commits, issues, pull requests. + Always use this action plan when asked about issues, pull requests, or commits - unless there is a specific request to make a visualization. + actions: + - - memory + - sql_tool + - - sql_expert_tool + '3': + name: '' + description: |- + Make a visualization regarding GitHub information of AgentKit, such as PRs, issues, or commits. + **ONLY use this action plan if there is a specific request to make a visualization** + actions: + - - memory + - sql_tool + - - visualizer_tool + '4': + name: '' + description: |- + Use this plan if the user wants to update the technical team resources configuration to create a new optimal schedule. + Also use it if the user gives a description of a software project they want a schedule for. + ONLY use this action plan in relation to optimization of a software project. + actions: + - - generate_optim_input_tool + - - summarize_config_changes_tool + '5': + name: '' + description: Use this plan if the user only wants to run the optimizer without any change of resources or configuration. + actions: + - - run_optimizer_tool + - - summarize_kpi_tool + '6': + name: '' + description: |- + Use this plan if the user gives a description of the software project or provide a number of technical resources AND wants to run the optimization engine. + Don't use this plan if the user only wants to run the optimizer without any change of resources. + actions: + - - generate_optim_input_tool + - - summarize_config_changes_tool + - - run_optimizer_tool + - - summarize_kpi_tool + +prompt_message: |- + Given the chat history and the user question, what action plan would be best to follow? + Remember to only put out the number of the action plan you want to follow. + + User question: {input} +system_context: |- + You are a software development copilot meant to help developers navigate a complex codebase. You are currently helping with + the "AgentKit" codebase, an LLM-powered agent with access to several tools. + + Your goal is to select the right action plan for the question of the user in the fastest way possible, given the chat history. + + Consider the following principles: + - Always seek to retrieve specific information to answer the user's question + - If you are unsure which action plan to select, select "1" + - Any ".md" file considered is a documentation file: it cannot be executed and cannot configure the code in any way + + Action plans: + {action_plans} + + Only reply with the number of the action plan you want to follow and nothing else. Your answer MUST be a single number, e.g. "0", "1", "2", "3", "4" or "5". diff --git a/backend/app/app/config/extraction.yml b/backend/app/app/config/extraction.yml new file mode 100644 index 00000000..86aeb6f0 --- /dev/null +++ b/backend/app/app/config/extraction.yml @@ -0,0 +1,5 @@ +indexing_config: + tokenizer_chunk_size: 2000 + tokenizer_chunk_overlap: 200 + pdf_parser: "PyMuPDF" + embedding_model: "text-embedding-ada-002" diff --git a/backend/app/app/config/tools.yml b/backend/app/app/config/tools.yml new file mode 100644 index 00000000..11031f8f --- /dev/null +++ b/backend/app/app/config/tools.yml @@ -0,0 +1,892 @@ +library: + + image_generation_tool: + description: >- + Tool to generate sample images for new products based on the product descriptions input from the user prompt. + Input is a string of description. Output is an url to the image. + prompt_message: |- + Here is decription of the item: {{description}} + system_context: |- + You are a specialized in answering questions about generating a sample image based on an input description to an item. + + You must follow the principles: + - Generate only one description for generating the image + - Do not rephrase the original description given in the prompt + - Do not repeat the original description given in the prompt multiple times + - Keep the description for generating the image to one to two sentences. + - Reference the appendix that the full information is shown in e.g. "Image Appendix" + - The output should start with "The prompt for generating the image is", then followed by pasting the image description with the quotation marks + - The description for generating the image must be as close to the original description given in the prompt as possible + - Do not change the ingredients + + Example: + input: {input} + output: {output} + prompt_inputs: + - name: input + content: |- + Can you generate an image according to the description: a sandwich with cheese and ham + - name: output + content: |- + The prompt for generating an image of the item is ... + clarify_tool: + default_llm: "gpt-4" + default_fast_llm: "gpt-3.5-turbo-1106" + description: >- + Tool to engage the user for additional input when the initial question lacks enough detail to determine the appropriate action plan. + Utilize this tool to solicit clarifications from the user, enabling a more informed action plan selection within the AgentKit codebase environment. + prompt_message: |- + {{question}} + system_context: |- + You are a software development copilot assisting developers in navigating the AgentKit codebase, powered by LLM technology and coupled with various tools. + Your task is to ensure that the user's question is sufficiently clear to determine the correct action. You are facilitating this by asking for more specifics or rephrasing the question for clarity. + + When answering the questions, make sure to follow the principles: + - Be concise + - Always ask the user to clarify the question + - Always give the user an example of how to rephrase their question so you can answer it using the AgentKit codebase + + {examples} + prompt_inputs: + - name: examples + content: |- + Example Input: "How can I debug the API endpoint?" + Example Output: "I'm not sure which resource to refer you to. Can you clarify which API endpoint you need, and provide some details about the issue you are facing?" + pdf_tool: + description: >- + Search tool to answer questions about codebase documentation, e.g., how to setup the codebase for development, how to add new tools, etc. + The tool extracts information from codebase documentation to answer a technical question by a developer. + Input is a query string, output is a list of documents joined with \n\n characters. No LLM calls are made here. + {examples} + prompt_inputs: + - name: examples + content: |- + n_docs: 2 + system_context: "" + prompt_message: "" + + sql_tool: + description: >- + "SQL tool to query structured tables containing information from the Github repository of AgentKit, an LLM powered agent. + Tables include git commits, issues, and pull requests. + "Input is a question about the data in natural lanaguage, output is a string that contains an SQL query in markdown format, the number of rows the query returns and the first 3 rows." + {examples} + prompt_message: |- + Given the database schema: + --- + {{table_schemas}} + --- + And the following notes about the tables: + --- + {table_notes} + --- + Please answer the following user questions with an SQL query: + {{question}} + system_context: |- + You are an expert on the GitHub repository of AgentKit, an LLM-powered agent. Your main task is to use + SQL queries to retrieve information from structured tables containing information on commits, issues, and + pull requests in this repository. + + During answering, the following principles MUST be followed: + 1. Set the language to the markdown code block for each code block. For example, \```sql SELECT * FROM public.Artist``` is SQL. + 2. Use the postgreSQL dialect, i.e. only functions that are supported + 3. DO NOT make any DML statements (INSERT, UPDATE, DELETE, DROP etc.) to the database. + 4. In WHERE clauses use substring comparison to account for unknown string formulations (e.g. commit -> LIKE '%commit%') + 6. Make sure the final SQL query starts with '```sql' and ends with '```' + 7. Only use field and table names from the provided database schemas + 8. Ensure to include the schema name before the table, for example, \```sql SELECT * FROM public.COMMITS``` is correct but \```sql SELECT * FROM COMMITS``` is INCORRECT + 9. When asked to give time aggregated data (e.g. monthly), provide the time unit as an integer. For example, months should be 1-12, where you can the EXTRACT statement + 10. Always keep in mind that each `commit_hash` can correspond to multiple rows public.COMMITS; when counting commits, only count DISTINCT values of `commit_hash` + 11. When asked to summarize a user's contributions to the codebase, look at their 20 most recent commits. + prompt_inputs: + - name: examples + content: |- + Example Input: \"List all users who have made commits to the AgentKit repository" + Example Output: \"`sql SELECT DISTINCT commit_user FROM public.COMMITS;`, total rows from SQL query: 8, first 3 rows: Ilyass El Mansouri, Gustaf Halvardsson, Casper Lindberg\" + - name: table_definitions + content: |- + public.db_table | description + public.COMMITS | Table with all commits made to the AgentKit repository; columns include commit user, commit message, commit timestamp, and file change. Each (commit, file changed) is a single row + public.ISSUES | Table with all issues (not counting PRs) raised in the AgentKit repository; columns include user, timestamp, issue title, whether the issue is open or closed, and number of comments on issue + public.PULL_REQUESTS | Table with all pull requests raised in the AgentKit repository; columns include user, timestamp, title, number of comments, whether PR is open or closed, whether PR is mergeable or not, change metrics + - name: table_notes + content: |- + *** Table 1: public.COMMITS *** + Table name: + public.COMMITS + Table description: + Table with all commits made to the AgentKit repository. + Columns include commit user, commit message, commit timestamp, and file change. + + NOTE: Each (commit, file changed) is a single row, so a single commit will occupy multiple rows if multiple files were changed. + So, for example, When asked to count the total number of commits, only count unique values of column `commit_hash`. + + *** Table 2: public.ISSUES *** + Table name: + public.ISSUES + Table description: + Table with all issues (not counting PRs) raised in the AgentKit repository. + Columns include user, timestamp, issue title, whether the issue is open or closed, and number of comments on issue. + If the user asks about all issues ever opened, consider both open and closed issues. Otherwise, only consider open issues. + + *** Table 3: public.PULL_REQUESTS *** + Table name: + public.PULL_REQUESTS + Table description: + Table with all pull requests raised in the AgentKit repository. + Columns include user, timestamp, title, number of comments, whether PR is open or closed, whether PR is mergeable or not, change metrics + + prompt_selection: |- + Given the following tables: + --- + {table_definitions} + --- + Please reply only with a comma separated list of the db and the table names. + Select the tables that can be most useful for answering to the question: + {{question}} + system_context_selection: |- + You are a software engineering expert on the AgentKit codebase, an LLM-powered assistant. You have access to a + PostgreSQL database which has tables consisting of data from the AgentKit GitHub repository, including commits, + issues, and pull requests. + Your task is to define which tables are useful to answer the question of the user. + Please follow the instructions to answer the questions: + 1. Only reply with a comma separated list of db and table names. For example, "public.ISSUES, public.PULL_REQUESTS" + 2. Only answer with valid table names from the list + 3. Always format the table names to include the database schema, for example "public.ISSUES", NOT "ISSUES" + 3. Reply with the least amount of tables necessary for the question + prompt_validation: |- + Given the following SQL query: + {{query}} + and the following results executing the query with a LIMIT 5: + {{result}} + Does the query answer the following question: + {{question}} + You must reply in the following format: + Valid: [yes/no] + Reason: [your reason for the validation] + system_context_validation: |- + You are a software engineering expert on the AgentKit codebase, an LLM-powered assistant. You have access to a + PostgreSQL database which has tables consisting of data from the AgentKit GitHub repository, including commits, + issues, and pull requests. + You should validate that the constructed SQL query is answering the question of the user. + You must reply in the following format: + Valid: [yes/no] + Reason: [your reason for the validation] + prompt_refinement: |- + Given the database schema: + --- + {{table_schemas}} + --- + Given your previous answer and the complaint from the user, please improve the SQL query to answer the question of the user. + If the SQL query does not contain the database schema before a table, correct it. For example "SELECT * FROM COMMITS" should be corrected to "SELECT * FROM public.COMMITS". + User question: {{question}} + Previous answer: {{previous_answer}} + Complaints: {{complaints}} + nb_example_rows: 3 + validate_empty_results: True + validate_with_llm: False + always_limit_query: False + max_rows_in_output: 30 + + expert_tool: + default_llm: "gpt-4" + default_fast_llm: "gpt-3.5-turbo-1106" + description: >- + Tool to answer the user question based on the documents retrieved by the pdf_tool. It analyzes the documents to provide reliable, helpful answers to specific technical queries related to the codebase, such as setup procedures or tool additions. + {examples} + prompt_message: |- + Based on the user's question, chat history and the documentation retrieved by the 'pdf_tool', each between the <<< and >>> symbols respectively, provide a precise and informative answer. + The retrieved documentation is a list of documents joined with \n\n characters, not all retreived sources are necessarily releavent. Each document has a corresponding source, which you must cite if you use the document in your answer. + + User question: + <<< + {{question}} + User latest chat history: + <<< + {{chat_history}} + >>> + Retrieved Codebase documentation: + <<< + {{retrieved_docs}} + >>> + Corresponding sources: + <<< + {{sources}} + >>> + Concise Answer: + system_context: |- + You are an expert in software engineering and communicating technical ideas. Your goal is to answer the user question SOLELY based on the given documents. you MUST adhere to the following guidelines: + - Answer Precisely: Directly address the query using only the provided codebase documentation. + - Markdown Format: Answer in Markdown. Use headings, lists, bold text, code snippets and paths links for clarity. Whenever possible, include technical details and code snippets. + - Cite Sources: ALWAYS Cite the source of your information clearly, labeled as "Document Source". If the same source is cited multiple times, include it only once. + - Always include the full AgentKit repository URL when referencing Markdown (.md) files. For example, utilize "https://github.com/BCG-X-Official/agentkit/blob/develop/docs/setup.md" rather than just "setup.md". NEVER use different prefixes for .md files. + - Environment-Specific Guidance: in your answer differentiate between local (from `setup_development.md`) and Docker (from `setup.md`) setups. Emphasize user should only follow ONE of them. + - Note optional steps: When using `optional_features.md` make sure to mention these steps are optional. + prompt_inputs: + - name: examples + content: |- + Example Input: "What are the steps to set up the development environment?" + Example Output: "You can set up your development envirnment locally or on Docker. To set up on Docker follow these steps: ..." + max_token_length: 8000 + + sql_expert_tool: + default_llm: "gpt-4" + default_fast_llm: "gpt-3.5-turbo" + description: >- + Tool to answer the user question based on the structured data retrieved by the sql_tool. This data has been retrieved + from a database consisting of commits, issues, and PRs from the AgentKit GitHub repository. This tool uses this data to provide + a clear answer to the user's question. + prompt_message: |- + Answer the user's question based on SQL query data, using the query and the first three rows of the query output for your response. + The format is: "Column titles (comma-separated); Row 1 data (comma-separated); Row 2 data; Row 3 data". Each row is separated by a ";". + Provide a summary based on this data and guide the user to refer to the full dataset (which the user can see) for more information. + + #### CONTEXT #### + {{query}} + #### END #### + + Concise Answer: + system_context: |- + ### INTRODUCTION ### + You are an expert in software engineering, SQL, and the GitHub repository of AgentKit, and LLM powered assistant with access to tools. + Your goal is to answer the user question in a human-readable format SOLELY based on the retrieved SQL data. + The user is also able to see the data, so please don't print out the entire data again. The idea is to summarize + what the data says in words to supplement the actual data. + + ### REPOSITORY CONTEXT ### + The AgentKit repository includes a backend for processing input text with LLMs and a chatbot web interface frontend. + It also features database ingestion, configuration, networking, and package management functionalities. + + ### RULES ### + You MUST adhere to the following guidelines: + - Summarization : The user CAN see the data, so don't copy the data word-for-word. If the data is self-explanatory, give a one-sentence answer introducing the data. + - Writing style: Your tone should be helpful and authoritative. Write in full sentences, rather than listing down the data point-by-point. + - Human-readability: Make the answer human-readable, do not copy the data in its native format. + - Answer Precisely: Directly address the query using only the provided data + - Markdown Format: Answer in Markdown. Use headings, lists, bold text, code snippets and paths links for clarity. Whenever possible, include technical details and code snippets. + - Don't directly refer to table names, column names, or anything related to the query. + - When responding, always consider file names or paths and frame your answers within the "REPOSITORY CONTEXT". This is especially crucial when summarizing a user's commit history or contributions. + - When summarizing a user's experience, summarize their commits and/or pull requests in full English sentences. + + ### EXAMPLE ### + {example} + prompt_inputs: + - name: example + content: |- + For example: if the question is "list down all open pull requests", then the context provided to you will look like: + User question: + <<< + please list down the current open PRs + >>> + Retrieved Data: + <<< + pr_number,pr_title,pr_state,pr_user,pr_created_at,pr_updated_at,pr_closed_at,pr_merged_at,pr_merged,pr_num_additions,pr_num_deletions,pr_num_changed_files,pr_num_comments,pr_num_review_comments,pr_num_commits,pr_mergeable,pr_mergeable_state; + 47,Implement BaseLLM Class and Refactor Clarity, Entertainer, and Expert Tools,open,Scheel-Bech-Jacob,2023-08-14 12:55:07,2023-08-14 12:56:44,None,None,False,44,73,5,0,0,1,False,dirty; + 54,docs: reference nano-agent-x in README,open,Cambiaghi-Luca,2023-09-26 12:37:32,2023-09-28 12:48:14,None,None,False,19,2,1,0,2,1,False,dirty; + 69,[WIP] Add Behave end-to-end tests for backend,open,Halvardsson-Gustaf,2023-10-31 11:58:15,2023-11-20 23:59:51,None,None,False,690,374,9,0,0,2,False,dirty; + >>> + SQL Query: + <<< + ```sql + SELECT * + FROM public.pull_requests + WHERE pr_state = 'open' + ```, total rows from SQL query: 6, first 3 rows: 47,Implement BaseLLM Class and Refactor Clarity, Entertainer, and Expert Tools,open,Scheel-Bech-Jacob,2023-08-14 12:55:07,2023-08-14 12:56:44,None,None,False,44,73,5,0,0,1,False,dirty;54,docs: reference nano-agent-x in README,open,Cambiaghi-Luca,2023-09-26 12:37:32,2023-09-28 12:48:14,None,None,False,19,2,1,0,2,1,False,dirty;69,[WIP] Add Behave end-to-end tests for backend,open,Halvardsson-Gustaf,2023-10-31 11:58:15,2023-11-20 23:59:51,None,None,False,690,374,9,0,0,2,False,dirty + >>> + Current conversation history: + <<< + [] + >>> + """ + Since the user can see this data, don't re-state it. Say something like "6 PRs are currently open, and you can see them below:" + max_token_length: 6000 + + visualizer_tool: + description: >- + Visualisation tool to display data as a graph or chart using JSX code. + The tool can visualize the result of SQL queries or API calls by providing recharts-JSX code. + Make sure that the data is grouped to maximum of 10 categories, to make the visualization possible. + Input is a user query and information needed to visualize (SQL or API results), output is a string that contains JSX code in markdown format. + Example Input: "{recharts_example_input}" + Example Output: "{recharts_example_output}" + prompt_message: |- + Given the results: + {{results}} + Please write the JSX code for the visualization to answer the user question: + {{question}} + Remember to only reference dataKeys from the SQL or API results. + system_context: |- + You are an expert software engineer. + Given the information retrieved from the tools (e.g. SQL rows, API results), you need to visualize the data in a way that is easy to understand. + If there is no data with clear dataKeys or the user does not ask for a visualisation return "no data". + For the given user question, please write JSX code. + You must follow the principles: + - Only output the JSX code + - Assume the following variables are defined: ref, width, height, data, getColors, groupAndMerge, getObjectKeys, func + - The data variable is an array of JSON objects with the SQL fields OR API result fields as field names + - The getColors variable is a function that returns a different color each time it is called, use it if you need different colors (e.g. for a stacked barchart) + - The groupAndMerge variable is a function with the signature: (data: any[], groupField: string, keyField: string, valueField: string), which returns a JSON object with keyField: valueField pairs, grouped by groupField + - The getObjectKeys variable is a function that takes as input an object and returns the keys of that object, if the object is undefined, it returns an empty array + - The func variable is a function that takes as input (funcBody, ...args) and then returns Function(...args, funcBody), ONLY use this function if you need to create a function dynamically otherwise the functions won't work! + - The dataKey should only reference fields from the user question + - The dataKey should always be exactly as in the SQL / API result, never use a dataKey that is not in the results + - If the total rows (SQL or API results) are larger than 10, group / aggregate the data into 10 categories + - Labels and Legends should have human readable names (not the field names) + - Use only components from Recharts (prefixed with "Recharts.X") defined in the following List: {recharts_components} + - If you have to choose a color for the charts: choose: #095a5a + Examples: + Input: + {recharts_example_input} + Output: + {recharts_example_output} + Treemap output example: + {treemap_example_output} + prompt_inputs: + - name: recharts_example_input + content: |- + "User question: Can you display the information in the previous table as a stacked barchart, x-axis is the sponsor name, y-axis is the count and colors are country_name + ######### + Information gathered: + sql_tool: ```sql + SELECT s.FirstName AS customer, c.Country AS country, COUNT(*) AS count + FROM customer + GROUP BY s.FirstName, c.Country + ORDER BY count DESC, FirstName, country; + ``` + This query will return the number of customers for each country, sorted by the count in descending order. You can use this data to create a bar chart in your preferred visualization tool., total rows from SQL query: 176, first 3 rows: United States,20;Germany,15;United Kingdom,10" + - name: recharts_example_output + content: |- + "```jsx + + + + + + + {{getObjectKeys(groupAndMerge(data, "sponsor_name", "country", "number_of_trials")).map((key, idx) => ( + + ))}} + + ```" + - name: treemap_example_output + content: |- + "```jsx + ({{ + ...item, + total_trials: item.total_trials, + name: item.sponsor_name, + fill: getColors(), + }}))`, 'data', 'getColors')(data, getColors)}} + dataKey="total_trials" + ratio={{1}} + stroke="#fff" + ref={{ref}} + > + + + ```" + - name: recharts_components + content: |- + XAxis, YAxis, ZAxis, CartesianGrid, Tooltip, Legend, + Cell, Brush, ReferenceArea, ReferenceDot, ReferenceLine, ErrorBar, Label, LabelList, Customized" + defs, linearGradient, stop, + BarChart, Bar, AreaChart, Area, PieChart, Pie, LineChart, Line, ComposedChart + RadarChart, PolarGrid, PolarAngleAxis, PolarRadiusAxis, Radar, + RadialBarChart, RadialBar + ScatterChart, Scatter, + FunnelChart, Funnel, + Treemap, + Sankey + code_search_tool: + description: >- + Search tool to answer questions about python source code, e.g., where to find a specific function, logic explanation. + The tool extracts information from python source code to answer a technical question by a developer. + Input is a query string, output is a list of code extracts joined with \n\n characters. No LLM calls are made here. + {examples} + prompt_inputs: # Required by ToolConfig + - name: examples + content: |- + n_docs: 2 + max_tokens_chat_history: 800 + system_context: "" + prompt_message: "" + + code_expert_tool: + default_llm: "gpt-4" + default_fast_llm: "gpt-3.5-turbo-1106" + description: >- + Tool to answer the user question based on the python source code and codebase documentation. + It analyzes the context to provide reliable, helpful answers to specific technical queries related to the codebase, such as setup procedures or tool additions. + prompt_message: |- + Based on the user's question, chat history, python source code, and codebase documentation retrieved, each between the <<< and >>> symbols respectively, provide a precise and informative answer. + The retrieved documentation is a list of python code extracts and MD documentation joined with \n\n characters. + Not all retrieved code sources are necessarily relevant. + Each document has a corresponding source, which you must cite if you use the document in your answer. + + User question: + <<< + {{question}} + >>> + User latest chat history: + <<< + {{chat_history}} + >>> + Retrieved python source code: + <<< + {{retrieved_code}} + >>> + Retrieved codebase MD documentation: + <<< + {{retrieved_documentation}} + >>> + Concise Answer: + system_context: |- + You are an expert in python code, software engineering, and communicating technical ideas. + You are currently assisting the user with the code repository of AgentKit, which is an + LLM-based agent which can use various tools. + + Your task is to answer the user question SOLELY based on the given code and documentation. + + ### AgentKit OVERVIEW ### + AgentKit is a versatile LLM-powered assistant equipped with multiple tools for different tasks, such as SQL query generation and text embedding vectorstore searching. + Users can enhance it by adding new tools and connecting data sources through repository configuration. + + On receiving a query, AgentKit selects one action plan, comprised of various tools executed in sequence or parallel, as detailed in the YAML example below. + Tools within the same sublist ("--") run concurrently, whereas sublists are processed sequentially. + + ```yaml + action_plans: + '0': + name: '' + description: Gather new information, summarize and visualize + actions: # each sublist is 1 action step, i.e. add tools as subitems if you want to execute in parallel + - - sql_tool + - entertainer_tool + - - summarizer_tool + - visualizer_tool + '1': + name: '' + description: Gather new information and summarize + actions: + - - sql_tool + - pdf_tool + - entertainer_tool + - - summarizer_tool + ``` + + + ### DATA ### + You have access to: + - Python Code in the AgentKit Repository: Includes LLM Agent Definition, Tools Library (`ExtendedBaseTool` subclasses), JSON Tool Configurations, PGVector Database Ingestion Scripts, and Pydantic Data Models. + - Developer Documentation in Markdown: Covers Setup Instructions, Contribution Guidelines, and Tools and Classes Documentation. + + + ### CODEBASE STRUCTURE ### + The codebase is structured as follows: + - chat_agent/ + - meta_agent.py + - helpers/ + - llm.py + - utils.py + - router_agent/ + - SimpleRouterAgent.py + - tools/ + - ExtendedBaseTool.py + - library/ + - entertainer_tool/ + - entertainer_tool.py + - expert_tool/ + - expert_tool.py + - image_gen_with_input_tool/ + - image_gen_with_input_tool.py + - image_generation_tool/ + - image_generation_tool.py + - pdf_tool/ + - pdf_tool.py + - sql_tool/ + - sql_tool.py + - summarizer_tool/ + - summarizer_tool.py + - visualizer_tool/ + - visualizer_tool.py + - tools.py + - config/ + - agent.yml + - tools.yml + - schemas/ + - agent_schema.py + - auth_schema.py + - common_schema.py + - message_schema.py + - response_schema.py + - streaming_schema.py + - tool_schema.py + - tool_schemas/ + - pdf_tool_schema.py + - sql_tool_schema.py + - user_schema.py + - core/ + - config.py + - db/ + - SQLDatabaseExtended.py + - session.py + - vector_db_code_ingestion.py + - vector_db_pdf_ingestion.py + + ### RULES ### + + You MUST adhere to the following rules: + - Precision: Respond using only the provided code and documentation. + - Relevant Context: Ignore irrelevant context. + - Markdown Format: Utilize headings, lists, bold text, code snippets, and path links. + - Code Snippets: Provide concise, comment-annotated code snippets. You can "..." irrelevant sections of the code. + - Tool-Specific Excerpts: Include `_arun` method and class header snippets with explanations. + - Tool explanation: Reference source code and "prompts for tool". You should share Python code snippets ONLY, but NEVER directly YAML tool configurations with the user. + - Examples: Wherever possible, include specific examples of use-cases for a tool, e.g. "You can connect the SQL Tool to a database of all your employees and retrieve information through natural language queries." + - Creating New Tools: Assist users in developing new tools by guiding them in writing the `_arun` method and structuring YAML prompts. Follow the format in the 'prompts for tool' section, and handle as much of the work as possible. When asked to help with prompt writing, replace "[PLACEHOLDER]" in "system_context" with real context based on the user's query. + - Cite Sources: Guide users to further information. Please format all citations in Markdown hyperlinks, but ensure that every link used in citations points exclusively to 'https://github.com/BCG-X-Official/agentkit'. For example: `[file name](https://github.com/BCG-X-Official/agentkit)` + - Overall Style: Be helpful and technical, yet brief. + prompt_inputs: + - name: examples + content: |- + Example Input: "What are the steps to set up the development environment?" + Example Output: "You can set up your development envirnment locally or on Docker. To set up on Docker follow these steps: ..." + max_token_length: 8000 + fast_llm_token_threshold: 7800 + + generate_config_tool: + default_llm: "gpt-4" + default_fast_llm: "gpt-3.5-turbo" + description: >- + Generation of a new parameter configuration as input into a optimization problem. + The tool generates a new parameter configuration based on the user input. + Input is a user request (string) to change a parameter configuration. Output is a full parameter configuration in the exact format as the current parameter configuration with the changes. + Example Input: "{config_example_input}" + Example Output: "{config_example_output}" + prompt_message: |- + Based on the user input: + {{question}} + Create a new parameter configuration with relevant resources. The current parameter configuration is: + {{parameter_config}} + + Your response must consist only of the JSON code block and nothing more. + system_context: |- + Your task as an advanced AI model is to modify a product development backlog optimizer's parameter configuration based on user instructions. The updated configuration should follow the exact format of the current one, only incorporating the changes requested. + The config paramters are: + {config_parameters} + + Follow the below formatting guidelines: + - Begin your output directly with "```json" and conclude with "```". + - Output only the modified JSON code, without additional text, comments, or suggestions. + - Do not include any text before or after these JSON code block indicators. + - The output JSON structure should match the structure of the output in the example given below. + + Follow the below guidelines in choosing the number of resources: + - Do not change any resource available number if the user doesn't explicitly specify a specific number of resources. + + Remember, your response should consist only of the JSON code block and nothing more. + + Example input: {config_example_input} + Example output: {config_example_output} + + prompt_inputs: + - name: config_example_input + content: |- + Please generate a config where where there are 2 resources available per specialty + - name: config_example_output + content: |- + ```json + { + "available_resources": { + "UX_Designer": 2, + "Data_Scientist": 2, + "Software_Engineer": 2 + } + }``` + - name: config_parameters + content: |- + available_resources: + - UX_Designer: Number of resources available for UX_Designer speciality + - Data_Scientist: Number of resources available for Data_Scientist speciality + - Software_Engineer: Number of resources available for Software_Engineer speciality + + generate_optim_input_tool: + default_llm: "gpt-4" + default_fast_llm: "gpt-3.5-turbo" + description: >- + Generation of a new configuration as input into a optimization problem. + The tool generates a new parameter configuration based on the user input. + Input is a user request (string) to change a parameter configuration. Output is a full parameter configuration in the exact format as the current parameter configuration with the changes. + Example Input: "{config_example_input}" + Example Output: "{config_example_output}" + prompt_message: |- + Based on the user input: + {{question}} + Create a new parameter configuration if applicable. The current parameter configuration is: {{parameter_config}} + + Your response must consist only of the JSON code block and nothing more. + system_context: |- + Your task as an advanced AI model is to modify a product development backlog optimizer's parameter configuration based on user instructions. The updated configuration should follow the exact format of the current one, only incorporating the changes requested. + The config parameters are: + {config_parameters} + + Your output most follow these guidelines: + - Begin your output directly with "```json" and conclude with "```". + - Output only the modified JSON code, without additional text, comments, or suggestions. + - Do not include any text before or after these JSON code block indicators. + - The output JSON structure should match the structure of the output in the example given below + - Create a completely new config file, do not append new features to the current config file, unless the user specifically asks to add features + - If the user does not specify all parameters in the config, make a first suggestion of which resources would be required from the set UX Designer, Data Scientist, Software Engineer and what the other parameters could be + - You should always put all the parameters for each config item: every item should have a 'dur', a 'prec' and a 'resource_req'. + - If the user asks for changes not related to the features or any parameters in this config, output the current parameter configuration unchanged, even if it is empty. Do not output the example output. + + Remember, your response should consist only of the JSON code block and nothing more. + + Example input: {config_example_input} + Example output: {config_example_output} + + prompt_inputs: + - name: config_example_input + content: |- + Please generate a config for a product development sprint where we have have to develop two tasks 'Adding a new FE functionality' (requires a UX designer and a Software Engineer) and 'Creating a new tool' (requires a Data Scientist and a Software Engineer). + - name: config_example_output + content: |- + ```json + { + "Add_New_FE_Functionality": { + "UX_Designer": { + "dur": 3, + "prec": null, + "resource_req": 1 + }, + "Software_Engineer": { + "dur": 3, + "prec": [ + "Add_New_FE_Functionality", + "UX_Designer" + ], + "resource_req": 1 + } + }, + "Introduce_New_Tool": { + "Data_Scientist": { + "dur": 2, + "prec": null, + "resource_req": 1 + }, + "Software_Engineer": { + "dur": 4, + "prec": [ + "Introduce_New_Tool", + "Data_Scientist" + ], + "resource_req": 1 + } + }, + }``` + - name: config_parameters + content: |- + The structure is as follows, with names in [] as examples: + { + "[feature_name_1]": { + "[specialty_1]": { + "dur": [3], + "prec": [null] + "resource_req": [1] + }, + } + } + - [feature_name_1] is the name of the feature specified by the user + - [speciality_1] is the name of the specialty ("Software_Engineer", "Data_Scientist", "UX_Designer") + - dur is the duration to execute the feature + - prec are required preceding features to be completed + - resource_req is the number of resources required for the feature (standard 1) + + run_optimizer_tool: + default_llm: "gpt-4" + default_fast_llm: "gpt-3.5-turbo" + description: >- + Execution of the product development backlog optimization algorithm. + Tool to run an optimization with a given configuration. Input is a simple command "Run optimizer". Output is a string of the output KPIs. + prompt_message: '' + system_context: '' + prompt_inputs: + - name: examples + content: |- + placeholder + + summarize_config_changes_tool: + default_llm: "gpt-4" + default_fast_llm: "gpt-3.5-turbo" + description: >- + Summarizes the changes between two parameter configuration. + Input is two parameter configurations: a new and current parameter configuration + Output is a string with the changes between the parameter configurations. + prompt_message: |- + Please summarize the difference between the new and current optimization configuration: + + ## Optimization configurations: + # New optimization configurations: {{new_parameter_tasks}} + # Current optimization configurations: {{current_parameter_tasks}} + + ## Here is the initial request from the user: {{question}} + + If New parameter configurations are empty don't say anything about it. + system_context: |- + You are an expert in summarizing the key differences between a current parameter configuration and a new parameter configuration. + + You must follow the following instructions: + - Output should be in bullet point form. + - Always start with "Here are the changes to the optimisation configuration:" + - Only output information on the parameters that has been changed. DO NOT add any text on the parameters that is not changed + - Write from the point of view of the new parameter configuration. For example if the Data Scientst ressource have been increased from 2 to 4 in the new parameter configuration, output "Data Science ressource was increased to 4" + - If part of the initial request was to change a parameter to a value identical to the current parameter configuration, you should specify that it is indeed the case. + Example input: {summarize_config_example_input} + Example output: {summarize_config_example_output} + prompt_inputs: + - name: summarize_config_example_input + content: |- + New parameter configurations: + { + "Add_New_FE_Functionality": { + "UX_Designer": { + "dur": 3, + "prec": null, + "resource_req": 1 + }, + "Software_Engineer": { + "dur": 3, + "prec": [ + "Add_New_FE_Functionality", + "UX_Designer" + ], + "resource_req": 1 + } + }, + "Introduce_New_Tool": { + "Data_Scientist": { + "dur": 2, + "prec": null, + "resource_req": 1 + }, + "Software_Engineer": { + "dur": 4, + "prec": [ + "Introduce_New_Tool", + "Data_Scientist" + ], + "resource_req": 1 + } + } + } + Current parameter configurations: + { + "Add_New_FE_Functionality": { + "UX_Designer": { + "dur": 3, + "prec": null, + "resource_req": 1 + }, + "Software_Engineer": { + "dur": 3, + "prec": [ + "Add_New_FE_Functionality", + "UX_Designer" + ], + "resource_req": 1 + } + } + } + Here is the initial request from the user: Please add a new feature 'Introduce_New_Tool' that requires a Data Scientist and a Software Engineer + - name: summarize_config_example_output + content: |- + Here are the changes to the configuration: + - New feature 'Introduce_New_Tool' was added with the following parameters: 'Data_Scientist' and 'Software_Engineer' + + summarize_kpi_tool: + default_llm: "gpt-4" + default_fast_llm: "gpt-3.5-turbo" + description: >- + Optimizer output summarization. + Tool to summarize the overall KPI output of the optimizer. + Input is a user query and a KPI table + prompt_message: |- + Please summarize the KPI output table of the product development backlog optimizer: {{kpi_table}} + Follow the INSTRUCTIONS when summarizing. + system_context: |- + You are a specialized in summarizing the output of an optimization to the human user in simple, clear terms. + The optimization algorithm optimizes a schedule of activities to complete in the shortest amount of time. It works like this: + {optimizer_description} + A table with KPIs will be fed to you in table format. Your tasks is to summarize the key points in the table in bullet point format. + You must follow the following instructions: + INSTRUCTIONS + - Start by writing "Here is a summary of the optimization run:" + - Output should be bullet format in markdown formnat + - If you need to specify a number of days, round it to the next integer. + - Don't return anything if there is no data or table in the product development backlog optimizer output + Here is an explanation of all of the KPIs in the table: + {kpi_descriptions} + prompt_inputs: + - name: kpi_descriptions + content: |- + schedule_length: The total length of the schedule in days + - name: optimizer_description + content: |- + The optimizer finds the shortest schedule to complete all tasks to build a feature for a software project + chain_tool: + description: Nested meta-agent tool + prompt_inputs: [] + additional: + tools: + - visualizer_tool + - expert_tool + - entertainer_tool + action_plans: + '3': + name: '' + description: Sufficient information in chat history, visualize + actions: + - - memory + - entertainer_tool + - visualizer_tool + '4': + name: '' + description: Sufficient information in chat history, answer question + actions: + - - memory + - expert_tool + + prompt_message: >- + Given the chat history and the user question, what action plan would be best to follow? + Remember to only put out the number of the action plan you want to follow. + + User question: {input} + system_context: |- + You are an expert in digital media and music. + Your goal is to select the right action plan for the question of the user in the fastest way possible, given the chat history. + + Action plans: + {action_plans} + + Only reply with the number of the action plan you want to follow and nothing else. For example: "0" or "1" or "2" or "3" or "4" diff --git a/backend/app/app/core/__init__.py b/backend/app/app/core/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/backend/app/app/core/celery.py b/backend/app/app/core/celery.py new file mode 100644 index 00000000..5c0ce9b5 --- /dev/null +++ b/backend/app/app/core/celery.py @@ -0,0 +1,17 @@ +# -*- coding: utf-8 -*- +# Celery is good for data-intensive application or some long-running tasks in other simple cases use Fastapi background +# tasks +# Reference https://towardsdatascience.com/deploying-ml-models-in-production-with-fastapi-and-celery-7063e539a5db +from celery import Celery + +from app.core.config import settings + +celery = Celery( + "async_task", + broker=f"redis://{settings.REDIS_HOST}:{settings.REDIS_PORT}", + backend=settings.SYNC_CELERY_DATABASE_URI, + include="app.api.celery_task", # route where tasks are defined +) + +celery.conf.update({"beat_dburi": settings.SYNC_CELERY_BEAT_DATABASE_URI}) +celery.autodiscover_tasks() diff --git a/backend/app/app/core/config.py b/backend/app/app/core/config.py new file mode 100644 index 00000000..dbfaabcd --- /dev/null +++ b/backend/app/app/core/config.py @@ -0,0 +1,227 @@ +# -*- coding: utf-8 -*- +# pylint: disable=no-member +import os +import secrets +from typing import Any, Optional + +from pydantic import AnyHttpUrl, PostgresDsn, validator +from pydantic_settings import BaseSettings +from sqlalchemy.engine import make_url + + +class Settings(BaseSettings): + """Settings for the app.""" + + API_VERSION: str = "v1" + API_V1_STR: str = f"/api/{API_VERSION}" + PROJECT_NAME: str + ENABLE_LLM_CACHE: bool = False + OPENAI_API_KEY: str + OPENAI_ORGANIZATION: Optional[str] = None + OPENAI_API_BASE: Optional[str] = None + DATABASE_USER: str + DATABASE_PASSWORD: str + DATABASE_HOST: str + DATABASE_PORT: int | str + DATABASE_NAME: str + DATABASE_CELERY_NAME: str = "celery_schedule_jobs" + REDIS_HOST: str + REDIS_PORT: int + DB_POOL_SIZE: int = 83 + WEB_CONCURRENCY: int = 9 + POOL_SIZE: int = max( + DB_POOL_SIZE // WEB_CONCURRENCY, + 5, + ) + ASYNC_DATABASE_URI: Optional[str] = None + + @validator( + "ASYNC_DATABASE_URI", + pre=True, + ) + def assemble_db_connection( + cls, + v: str | None, + values: dict[ + str, + Any, + ], + ) -> Any: + if isinstance( + v, + str, + ): + return v + return PostgresDsn.build( + scheme="postgresql+asyncpg", + username=values.get("DATABASE_USER"), + password=values.get("DATABASE_PASSWORD"), + host=f"{values.get('DATABASE_HOST')}:{values.get('DATABASE_PORT')}", + path=f"{values.get('DATABASE_NAME') or ''}", + ).unicode_string() + + SYNC_CELERY_DATABASE_URI: Optional[str] = None + + @validator( + "SYNC_CELERY_DATABASE_URI", + pre=True, + ) + def assemble_celery_db_connection( + cls, + v: str | None, + values: dict[ + str, + Any, + ], + ) -> Any: + if isinstance( + v, + str, + ): + return v + return PostgresDsn.build( + scheme="postgresql", + username=values.get("DATABASE_USER"), + password=values.get("DATABASE_PASSWORD"), + host=f"{values.get('DATABASE_HOST')}:{values.get('DATABASE_PORT')}", + path=f"{values.get('DATABASE_CELERY_NAME') or ''}", + ).unicode_string() + + SYNC_CELERY_BEAT_DATABASE_URI: Optional[str] = None + + @validator( + "SYNC_CELERY_BEAT_DATABASE_URI", + pre=True, + ) + def assemble_celery_beat_db_connection( + cls, + v: str | None, + values: dict[ + str, + Any, + ], + ) -> Any: + if isinstance( + v, + str, + ): + return v + return PostgresDsn.build( + scheme="postgresql", + username=values.get("DATABASE_USER"), + password=values.get("DATABASE_PASSWORD"), + host=f"{values.get('DATABASE_HOST')}:{values.get('DATABASE_PORT')}", + path=f"{values.get('DATABASE_CELERY_NAME') or ''}", + ).unicode_string() + + ASYNC_CELERY_BEAT_DATABASE_URI: Optional[str] = None + + @validator( + "ASYNC_CELERY_BEAT_DATABASE_URI", + pre=True, + ) + def assemble_async_celery_beat_db_connection( + cls, + v: str | None, + values: dict[ + str, + Any, + ], + ) -> Any: + if isinstance( + v, + str, + ): + return v + return PostgresDsn.build( + scheme="postgresql+asyncpg", + username=values.get("DATABASE_USER"), + password=values.get("DATABASE_PASSWORD"), + host=f"{values.get('DATABASE_HOST')}:{values.get('DATABASE_PORT')}", + path=f"{values.get('DATABASE_CELERY_NAME') or ''}", + ).unicode_string() + + MINIO_ROOT_USER: str + MINIO_ROOT_PASSWORD: str + MINIO_URL: str + MINIO_BUCKET: str + + ENABLE_AUTH: bool = False + NEXTAUTH_SECRET: Optional[str] = None + + SECRET_KEY: str = secrets.token_urlsafe(32) + BACKEND_CORS_ORIGINS: list[str] | list[AnyHttpUrl] + + @validator( + "BACKEND_CORS_ORIGINS", + pre=True, + ) + def assemble_cors_origins( + cls, + v: str | list[str], + ) -> list[str] | str: + """Assemble CORS origins.""" + if isinstance( + v, + str, + ) and not v.startswith("["): + return [i.strip() for i in v.split(",")] + if isinstance( + v, + ( + list, + str, + ), + ): + return v + raise ValueError(v) + + PDF_TOOL_EXTRACTION_CONFIG_PATH: str + AGENT_CONFIG_PATH: str + + ################################ + # Tool specific configuration + ################################ + SQL_TOOL_DB_ENABLED: bool + SQL_TOOL_DB_SCHEMAS: list[str] = [] + SQL_TOOL_DB_INFO_PATH: str + SQL_TOOL_DB_URI: str + SQL_TOOL_DB_OVERWRITE_ON_START: bool = True + + @validator( + "SQL_TOOL_DB_URI", + pre=True, + ) + def assemble_sql_tool_db_connection( + cls, + v: str | None, + values: dict[ + str, + Any, + ], + ) -> Any: + if not values.get("SQL_TOOL_DB_ENABLED"): + return "" + if isinstance( + v, + str, + ): + return make_url(v).render_as_string(hide_password=False) + raise ValueError(v) + + PDF_TOOL_ENABLED: bool + PDF_TOOL_DATA_PATH: str + PDF_TOOL_DATABASE: str + + CODE_TOOL_ENABLED: bool + CODE_TOOL_DATA_PATH: str + CODE_TOOL_DATABASE: str + TOOL_PROMPTS_PATH: str + + class Config: + case_sensitive = True + env_file = "./.env" if os.path.isfile("./.env") else os.path.expanduser("~/.env") + + +settings = Settings() +yaml_configs: dict[str, Any] = {} diff --git a/backend/app/app/core/fastapi.py b/backend/app/app/core/fastapi.py new file mode 100644 index 00000000..c1a53efe --- /dev/null +++ b/backend/app/app/core/fastapi.py @@ -0,0 +1,37 @@ +# -*- coding: utf-8 -*- +from typing import Any + +from fastapi import FastAPI + +from app.schemas.streaming_schema import StreamingData, StreamingDataTypeEnum, StreamingSignalsEnum + + +class FastAPIWithInternalModels(FastAPI): + """ + FastAPI subclass that adds internal models (which are not already exposed via API + return types) to the OpenAPI schema. + + This allows sharing the same models between the backend and the frontend via + `openapi-typescript-codegen`. + """ + + def openapi(self) -> dict[str, Any]: + openapi_schema = super().openapi() + + enums = [StreamingSignalsEnum, StreamingDataTypeEnum] + models = [StreamingData] + + for model in models: + model_schema = model.model_json_schema(ref_template="#/components/schemas/{model}") + model_name = model.__name__ + openapi_schema["components"]["schemas"][model_name] = model_schema + + for enum in enums: + enum_schema = { + "type": "string", + "enum": [e.value for e in enum], + "description": "Description of your enum", + } + openapi_schema["components"]["schemas"][enum.__name__] = enum_schema + + return openapi_schema diff --git a/backend/app/app/db/SQLDatabaseExtended.py b/backend/app/app/db/SQLDatabaseExtended.py new file mode 100644 index 00000000..75ac05f8 --- /dev/null +++ b/backend/app/app/db/SQLDatabaseExtended.py @@ -0,0 +1,96 @@ +# -*- coding: utf-8 -*- +from __future__ import annotations + +import logging +from typing import Any, List, Optional, Sequence, Tuple + +from langchain.utilities.sql_database import SQLDatabase +from sqlalchemy import create_engine, text +from sqlalchemy.engine import Engine +from sqlalchemy.engine.result import Row + +from app.schemas.tool_schemas.sql_tool_schema import DatabaseInfo + +logger = logging.getLogger(__name__) + + +class SQLDatabaseExtended(SQLDatabase): + """SQL database wrapper.""" + + db_info: Optional[DatabaseInfo] + + def __init__( + self, + engine: Engine, + db_info: Optional[DatabaseInfo] = None, + **kwargs: Any, + ): + """Initialize the SQL database.""" + super().__init__( + engine, + **kwargs, + ) + self.db_info = db_info + + def execute( + self, + command: str, + ) -> Tuple[list[str], list[Row],]: + with self._engine.begin() as connection: + if self._schema is not None: + if self.dialect == "snowflake": + connection.exec_driver_sql(f"ALTER SESSION SET search_path='{self._schema}'") + else: + connection.exec_driver_sql(f"SET search_path TO {self._schema}") + cursor = connection.execute(text(command)) + columns: List[str] = list(cursor.keys()) + rows: List[Row] = cursor.all() # type: ignore + return ( + columns, + rows, + ) + + def run_no_str( + self, + command: str, + fetch: str = "all", + ) -> Sequence | Row | List[Row] | None: + """ + Execute a SQL command and return the results. + + If the statement returns rows, the results are returned. If the statement + returns no rows, None is returned. + """ + with self._engine.begin() as connection: + if self._schema is not None: + if self.dialect == "snowflake": + connection.exec_driver_sql(f"ALTER SESSION SET search_path='{self._schema}'") + else: + connection.exec_driver_sql(f"SET search_path TO {self._schema}") + cursor = connection.execute(text(command)) + if cursor.returns_rows: + if fetch == "all": + result = cursor.fetchall() + elif fetch == "one": + result = cursor.fetchone()[0] # type: ignore + else: + raise ValueError("Fetch parameter must be either 'one' or 'all'") + return result + return None + + @classmethod + def from_uri( + cls, + database_uri: str, + engine_args: Optional[dict] = None, + **kwargs: Any, + ) -> SQLDatabaseExtended: + """Construct a SQLAlchemy engine from URI.""" + _engine_args = engine_args or {} + return cls( + create_engine( + database_uri, + **_engine_args, + ), + **kwargs, + ) diff --git a/backend/app/app/db/__init__.py b/backend/app/app/db/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/backend/app/app/db/session.py b/backend/app/app/db/session.py new file mode 100644 index 00000000..3f584ae3 --- /dev/null +++ b/backend/app/app/db/session.py @@ -0,0 +1,118 @@ +# -*- coding: utf-8 -*- +import logging +import os.path +from typing import List + +from sqlalchemy.ext.asyncio import create_async_engine +from sqlalchemy.orm import sessionmaker +from sqlmodel.ext.asyncio.session import AsyncSession + +from app.core.config import settings +from app.db.SQLDatabaseExtended import SQLDatabaseExtended +from app.schemas.tool_schemas.sql_tool_schema import DatabaseInfo, TableInfo + +DB_POOL_SIZE = 83 +WEB_CONCURRENCY = 9 +POOL_SIZE = max( + DB_POOL_SIZE // WEB_CONCURRENCY, + 5, +) + +logger = logging.getLogger(__name__) + + +def _get_local_session() -> sessionmaker: + engine = ( + create_async_engine( + url=settings.ASYNC_DATABASE_URI, + future=True, + pool_size=POOL_SIZE, + max_overflow=64, + ) + if settings.ASYNC_DATABASE_URI is not None + else None + ) + return sessionmaker( + autocommit=False, + autoflush=False, + bind=engine, # type: ignore + class_=AsyncSession, + expire_on_commit=False, + ) + + +def _get_local_celery_session() -> sessionmaker: + engine_celery = ( + create_async_engine( + url=settings.ASYNC_CELERY_BEAT_DATABASE_URI, + future=True, + pool_size=POOL_SIZE, + max_overflow=64, + ) + if settings.ASYNC_CELERY_BEAT_DATABASE_URI is not None + else None + ) + return sessionmaker( + autocommit=False, + autoflush=False, + bind=engine_celery, # type: ignore + class_=AsyncSession, + expire_on_commit=False, + ) + + +def get_sql_tool_db() -> SQLDatabaseExtended: + """Get the SQL database.""" + if os.path.isfile(settings.SQL_TOOL_DB_INFO_PATH) and settings.SQL_TOOL_DB_OVERWRITE_ON_START is False: + db_info = DatabaseInfo.parse_file(settings.SQL_TOOL_DB_INFO_PATH) + else: + os.makedirs( + "app/tool_constants", + exist_ok=True, + ) + db_info = _get_table_infos_multi_db(settings.SQL_TOOL_DB_SCHEMAS) + with open( + settings.SQL_TOOL_DB_INFO_PATH, + "w", + encoding="utf-8", + ) as f: + f.write(db_info.model_dump_json(indent=4)) + + return SQLDatabaseExtended.from_uri( + settings.SQL_TOOL_DB_URI, + db_info=db_info, + ) + + +def _get_table_infos_multi_db( + schema_names: List[str], +) -> DatabaseInfo: + """Get the table information for multiple databases.""" + tables = [] + for schema_name in schema_names: + database = SQLDatabaseExtended.from_uri( + settings.SQL_TOOL_DB_URI, + schema=schema_name, + ) + table_names = list(set(database.get_usable_table_names())) + for table_name in table_names: + try: + table_info = database.get_table_info_no_throw([table_name]) + except Exception as e: + logger.error(f"Failed to get table info for {table_name}: {e}") + table_info = f"Failed to get table info for {table_name}: {e}" + tables.append( + TableInfo( + schema_name=schema_name, + table_name=table_name, + structure=table_info, + ) + ) + + return DatabaseInfo(tables=tables) + + +sql_tool_db = get_sql_tool_db() if settings.SQL_TOOL_DB_ENABLED else None + +SessionLocal = _get_local_session() +SessionLocalCelery = _get_local_celery_session() diff --git a/backend/app/app/db/vector_db_code_ingestion.py b/backend/app/app/db/vector_db_code_ingestion.py new file mode 100755 index 00000000..19c11cce --- /dev/null +++ b/backend/app/app/db/vector_db_code_ingestion.py @@ -0,0 +1,133 @@ +# -*- coding: utf-8 -*- +# pylint: disable=no-self-use +import logging +import os +from pathlib import Path +from typing import List, Optional + +from dotenv import load_dotenv +from langchain.docstore.document import Document +from langchain_community.embeddings import OpenAIEmbeddings +from langchain_community.vectorstores.pgvector import PGVector + +from app.core.config import settings +from app.utils.config import Config + +logger = logging.getLogger(__name__) + + +class CodeIngestionPipeline: + """Pipeline for ingesting python code in PGVector DB.""" + + db: PGVector | None = None + embedding: OpenAIEmbeddings + + def __init__(self, db_name: str): + load_dotenv() + self.embedding = OpenAIEmbeddings() + self.connection_str = PGVector.connection_string_from_db_params( + driver="psycopg2", + host=settings.DATABASE_HOST, + port=int(settings.DATABASE_PORT), + database=db_name, + user=settings.DATABASE_USER, + password=settings.DATABASE_PASSWORD, + ) + + def get_db(self, collection_name: str = "code_indexing_1") -> PGVector: + """ + Get vector database instance for specified collection name. + + Args: + collection_name (str): Vector database collection name + + Returns: + PGVector: Vector database + """ + db = PGVector( + embedding_function=self.embedding, + collection_name=collection_name, + connection_string=self.connection_str, + ) + return db + + def run( + self, + folder_path: Optional[str] = None, + load_index: bool = True, + collection_name: str = "code_indexing_1", + ) -> PGVector: + """ + Run the PDF ingestion pipeline. + + Args: + folder_path (str, optional): Ingest docs from this folder. Defaults to None. + load_index (bool, optional): Whether to load the index or ingest new docs. Defaults to True. + collection_name (str, optional): PGVector collection name. Defaults to "pdf_indexing_1". + + Returns: + PGVector: Vector database + """ + if load_index: + logger.info(f"**Getting vectore database collection:{collection_name}...**") + return self.get_db(collection_name=collection_name) + if folder_path is None: + raise ValueError("Please provide a folder_path to ingest documents from.") + logger.info(f"**Ingesting files from {folder_path} to collection {collection_name}...**") + return self._ingest_documents(folder_path=folder_path, collection_name=collection_name) + + def _ingest_documents(self, folder_path: str, collection_name: str) -> PGVector: + """Run documents ingestion pipeline.""" + code_db = self._ingest_code(folder_path=folder_path, collection_name=collection_name) + return code_db + + def _code_to_docs(self, code_dir_path: str) -> List[Document]: + tool_prompts = Config(Path(settings.TOOL_PROMPTS_PATH)).read() + documents = [] + for folder, _, files in os.walk(code_dir_path): + for file in files: + if file[-3:] == ".py" and file != "__init__.py": + metadata = {"source": file} + if file[-7:] == "tool.py": + metadata["tool_prompt"] = getattr(tool_prompts.library, file[:-3]) + else: + metadata["tool_prompt"] = None # type: ignore + + filepath = os.path.join(folder, file) + logger.info(f"Loading code file: {filepath}") + with open(filepath, "r", encoding="utf-8") as f: + code_file_content = f.read() + doc = Document(page_content=code_file_content, metadata=metadata) + documents.append(doc) + return documents + + def _ingest_code(self, folder_path: str, collection_name: str) -> PGVector: + docs = self._code_to_docs(folder_path) + logger.info(f"Loading {len(docs)} code files into vectorstore...") + return PGVector.from_documents( + embedding=self.embedding, + documents=docs, + collection_name=collection_name, + connection_string=self.connection_str, + pre_delete_collection=True, + ) + + +def get_code_pipeline() -> CodeIngestionPipeline: + pdf_pipeline = CodeIngestionPipeline( + db_name=settings.CODE_TOOL_DATABASE, + ) + return pdf_pipeline + + +def run_code_ingestion_pipeline(load_index: bool = False) -> None: + """Run the Code ingestion pipeline.""" + get_code_pipeline().run( + settings.CODE_TOOL_DATA_PATH, + collection_name="code_indexing_1", + load_index=load_index, + ) + + +if __name__ == "__main__": + run_code_ingestion_pipeline(load_index=False) diff --git a/backend/app/app/db/vector_db_pdf_ingestion.py b/backend/app/app/db/vector_db_pdf_ingestion.py new file mode 100755 index 00000000..bd9af108 --- /dev/null +++ b/backend/app/app/db/vector_db_pdf_ingestion.py @@ -0,0 +1,170 @@ +# -*- coding: utf-8 -*- +import logging +import os +from typing import Any, List + +from dotenv import load_dotenv +from langchain.document_loaders.base import BaseLoader +from langchain.embeddings import CacheBackedEmbeddings +from langchain.schema import Document +from langchain.text_splitter import TokenTextSplitter +from langchain.vectorstores.pgvector import PGVector + +from app.core.config import settings +from app.schemas.ingestion_schema import LOADER_DICT, IndexingConfig +from app.schemas.tool_schemas.pdf_tool_schema import CodebaseDocumentationMetadata +from app.services.chat_agent.helpers.embedding_models import get_embedding_model +from app.utils.config_loader import get_ingestion_configs + +logger = logging.getLogger(__name__) + + +class PDFExtractionPipeline: + """Pipeline for extracting text from PDFs and load them into a vectorstore.""" + + pipeline_config: IndexingConfig + pdf_loader: type[BaseLoader] + db: PGVector | None = None + embedding: CacheBackedEmbeddings + + def __init__(self, pipeline_config: IndexingConfig, db_name: str): + load_dotenv() + + self.pipeline_config = pipeline_config + self.pdf_loader = LOADER_DICT[pipeline_config.pdf_parser.name] + self.embedding = get_embedding_model(pipeline_config.embedding_model) + self.connection_str = PGVector.connection_string_from_db_params( + driver="psycopg2", + host=settings.DATABASE_HOST, + port=int(settings.DATABASE_PORT), + database=db_name, + user=settings.DATABASE_USER, + password=settings.DATABASE_PASSWORD, + ) + + def run( + self, + folder_path: str | None = None, + collection_name: str = "pdf_indexing_1", + load_index: bool = True, + ) -> PGVector: + """Run the PDF extraction pipeline.""" + if load_index: + logger.info("Loading index from PSQL") + db = PGVector( + embedding_function=self.embedding, + collection_name=collection_name, + connection_string=self.connection_str, + ) + return db + if folder_path is not None: + return self._load_documents(folder_path=folder_path, collection_name=collection_name) + raise ValueError("folder_path must be provided if load_index is False") + + def _pdf_to_docs( + self, + pdf_dir_path: str, + ) -> List[Document]: + """ + Using specified PDF miner to convert PDF documents to raw text chunks. + + Fallback: PyPDF + """ + documents = [] + for file_name in os.listdir(pdf_dir_path): + file_extension = os.path.splitext(file_name)[1].lower() + if file_extension == ".pdf": + logger.info(f"Loading {file_name} into vectorstore") + file_path = f"{pdf_dir_path}/{file_name}" + try: + loader: Any = self.pdf_loader(file_path) # type: ignore + file_docs = loader.load() + documents.extend(file_docs) + logger.info(f"{file_name} loaded successfully") + except Exception as e: + logger.error( + f"Could not extract text from PDF {file_name} with {self.pipeline_config.pdf_parser}: {repr(e)}" + ) + + return documents + + def _md_to_docs(self, md_dir_path: str) -> List[Document]: + """ + Load and split markdown files into documents. + + Args: + md_dir_path (str): Path to markdown files + + Returns: + List[Document]: List of processed documents + """ + documents = [] + + for file_name in os.listdir(md_dir_path): + file_extension = os.path.splitext(file_name)[1].lower() + + if file_extension == ".md": + logger.info(f"Loading data from {file_name} as Document...") + file_path = f"{md_dir_path}/{file_name}" + + try: + # Load md files as single document + with open(file_path, "r", encoding="utf-8") as f: + md_file = f.read() + + md_doc = Document( + page_content=md_file, + metadata=CodebaseDocumentationMetadata.parse_obj({"source": file_name, "type": "text"}).dict(), + ) + + # Further split at token-level, when splits are above chunk_size configuration (rare) + text_splitter = TokenTextSplitter( + chunk_size=self.pipeline_config.tokenizer_chunk_size, + chunk_overlap=self.pipeline_config.tokenizer_chunk_overlap, + ) + file_docs = text_splitter.split_documents([md_doc]) + + documents.extend(file_docs) + if len(file_docs) > 1: + logger.info( + f"Split {file_name} to {len(file_docs)} documents due to " + f"chunk_size: ({self.pipeline_config.tokenizer_chunk_size})" + ) + + except Exception as e: + logger.error(f"Could not load MD file {file_name}: {repr(e)}") + + return documents + + def _load_documents(self, folder_path: str, collection_name: str = "pdf_indexing_1") -> PGVector: + """Load documents into vectorstore.""" + docs = self._md_to_docs(folder_path) + logger.info(f"Adding {len(docs)} codebase documentation docs into vectorstore") + + return PGVector.from_documents( + embedding=self.embedding, + documents=docs, + collection_name=collection_name, + connection_string=self.connection_str, + pre_delete_collection=True, + ) + + +def get_pdf_pipeline() -> PDFExtractionPipeline: + pdf_pipeline = PDFExtractionPipeline( + pipeline_config=get_ingestion_configs().indexing_config, + db_name=settings.PDF_TOOL_DATABASE, + ) + return pdf_pipeline + + +def run_pdf_ingestion_pipeline(load_index: bool = True) -> None: + get_pdf_pipeline().run( + settings.PDF_TOOL_DATA_PATH, + collection_name="pdf_indexing_1", + load_index=load_index, + ) + + +if __name__ == "__main__": + run_pdf_ingestion_pipeline(load_index=False) diff --git a/backend/app/app/deps/__init__.py b/backend/app/app/deps/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/backend/app/app/deps/agent_deps.py b/backend/app/app/deps/agent_deps.py new file mode 100644 index 00000000..a50f3856 --- /dev/null +++ b/backend/app/app/deps/agent_deps.py @@ -0,0 +1,28 @@ +# -*- coding: utf-8 -*- +from typing import Optional + +from langchain.agents import AgentExecutor + +from app.api.deps import get_redis_client +from app.services.chat_agent.meta_agent import create_meta_agent +from app.utils.config_loader import get_agent_config +from app.utils.fastapi_globals import g +from app.utils.uuid7 import uuid7 + + +async def set_global_tool_context() -> None: + run_id = str(uuid7()) + g.tool_context = {} + g.query_context = { + "run_id": run_id, + } + redis_client = await get_redis_client() + await redis_client.set(run_id, "True") + + +def get_meta_agent( + api_key: Optional[str] = None, +) -> AgentExecutor: + agent_config = get_agent_config() + agent_config.api_key = api_key + return create_meta_agent(agent_config) diff --git a/backend/app/app/deps/celery_deps.py b/backend/app/app/deps/celery_deps.py new file mode 100644 index 00000000..caad1e96 --- /dev/null +++ b/backend/app/app/deps/celery_deps.py @@ -0,0 +1,17 @@ +# -*- coding: utf-8 -*- +from typing import Generator + +from celery_sqlalchemy_scheduler.session import SessionManager + +from app.core.config import settings + + +def get_job_db() -> Generator: + session_manager = SessionManager() + ( + _, + _session, + ) = session_manager.create_session(settings.SYNC_CELERY_BEAT_DATABASE_URI) + + with _session() as session: + yield session diff --git a/backend/app/app/document_ingestion.py b/backend/app/app/document_ingestion.py new file mode 100644 index 00000000..0318b477 --- /dev/null +++ b/backend/app/app/document_ingestion.py @@ -0,0 +1,14 @@ +# -*- coding: utf-8 -*- +from app.core.config import settings +from app.db.vector_db_code_ingestion import run_code_ingestion_pipeline +from app.db.vector_db_pdf_ingestion import run_pdf_ingestion_pipeline + + +def pdf_pipeline() -> None: + if settings.PDF_TOOL_ENABLED: + run_pdf_ingestion_pipeline(load_index=False) + if settings.CODE_TOOL_ENABLED: + run_code_ingestion_pipeline(load_index=False) + + +pdf_pipeline() diff --git a/backend/app/app/main.py b/backend/app/app/main.py new file mode 100644 index 00000000..923c3a30 --- /dev/null +++ b/backend/app/app/main.py @@ -0,0 +1,158 @@ +# -*- coding: utf-8 -*- +import gc +import logging +from contextlib import asynccontextmanager +from typing import AsyncGenerator, Dict + +from fastapi import FastAPI, HTTPException, Request, status +from fastapi.exceptions import RequestValidationError +from fastapi.responses import JSONResponse +from fastapi_async_sqlalchemy import SQLAlchemyMiddleware +from fastapi_cache import FastAPICache +from fastapi_cache.backends.redis import RedisBackend +from fastapi_limiter import FastAPILimiter +from fastapi_pagination import add_pagination +from jose import jwt +from langchain.cache import RedisCache +from langchain.globals import set_llm_cache +from pydantic import ValidationError +from starlette.middleware.cors import CORSMiddleware + +from app.api.deps import get_redis_client, get_redis_client_sync +from app.api.v1.api import api_router as api_router_v1 +from app.core.config import settings, yaml_configs +from app.core.fastapi import FastAPIWithInternalModels +from app.utils.config_loader import load_agent_config, load_ingestion_configs +from app.utils.fastapi_globals import GlobalsMiddleware, g + + +async def user_id_identifier(request: Request) -> str: + """Identify the user from the request.""" + if request.scope["type"] == "http": + # Retrieve the Authorization header from the request + auth_header = request.headers.get("Authorization") + + if auth_header is not None: + # Check that the header is in the correct format + header_parts = auth_header.split() + if len(header_parts) == 2 and header_parts[0].lower() == "bearer": + token = header_parts[1] + try: + payload = jwt.decode( + token, + settings.SECRET_KEY, + algorithms=["HS256"], + ) + except ( + jwt.JWTError, + ValidationError, + ): + raise HTTPException( + status_code=status.HTTP_403_FORBIDDEN, + detail="Could not validate credentials", + ) + user_id = payload["sub"] + print( + "here2", + user_id, + ) + return user_id + + if request.scope["type"] == "websocket": + return request.scope["path"] + + forwarded = request.headers.get("X-Forwarded-For") + if forwarded: + return forwarded.split(",")[0] + + ip = request.client.host if request.client else "" + return ip + ":" + request.scope["path"] + + +@asynccontextmanager +async def lifespan(_app: FastAPI) -> AsyncGenerator[None, None]: + """Start up and shutdown tasks.""" + # startup + yaml_configs["agent_config"] = load_agent_config() + yaml_configs["ingestion_config"] = load_ingestion_configs() + + redis_client = await get_redis_client() + + if settings.ENABLE_LLM_CACHE: + set_llm_cache(RedisCache(redis_=get_redis_client_sync())) + + FastAPICache.init( + RedisBackend(redis_client), + prefix="fastapi-cache", + ) + await FastAPILimiter.init( + redis_client, + identifier=user_id_identifier, + ) + + logging.info("Start up FastAPI [Full dev mode]") + yield + + # shutdown + await FastAPICache.clear() + await FastAPILimiter.close() + g.cleanup() + gc.collect() + yaml_configs.clear() + + +logging.basicConfig(level=logging.INFO) + +# Core Application Instance +app = FastAPIWithInternalModels( + title=settings.PROJECT_NAME, + version=settings.API_VERSION, + openapi_url=f"{settings.API_V1_STR}/openapi.json", + docs_url=f"{settings.API_V1_STR}/docs", + lifespan=lifespan, +) + + +app.add_middleware( + SQLAlchemyMiddleware, + db_url=settings.ASYNC_DATABASE_URI, + engine_args={ + "echo": False, + "pool_pre_ping": True, + "pool_size": settings.POOL_SIZE, + "max_overflow": 64, + }, +) +app.add_middleware(GlobalsMiddleware) + +# Set all CORS origins enabled +if settings.BACKEND_CORS_ORIGINS: + app.add_middleware( + CORSMiddleware, + allow_origins=[str(origin) for origin in settings.BACKEND_CORS_ORIGINS], + allow_credentials=True, + allow_methods=["*"], + allow_headers=["*"], + ) + + +@app.exception_handler(RequestValidationError) +async def validation_exception_handler(request: Request, exc: RequestValidationError) -> JSONResponse: + exc_str = f"{exc}".replace("\n", " ").replace(" ", " ") + logging.error(f"{request}: {exc_str}") + content = {"status_code": 10422, "message": exc_str, "data": None} + return JSONResponse(content=content, status_code=status.HTTP_422_UNPROCESSABLE_ENTITY) + + +@app.get("/") +async def root() -> Dict[str, str]: + """An example "Hello world" FastAPI route.""" + return {"message": "FastAPI backend"} + + +# Add Routers +app.include_router( + api_router_v1, + prefix=settings.API_V1_STR, +) +add_pagination(app) diff --git a/backend/app/app/models/__init__.py b/backend/app/app/models/__init__.py new file mode 100644 index 00000000..1de42ea9 --- /dev/null +++ b/backend/app/app/models/__init__.py @@ -0,0 +1,2 @@ +# -*- coding: utf-8 -*- +from .auth_model import Account, Session, User, VerificationToken diff --git a/backend/app/app/models/auth_model.py b/backend/app/app/models/auth_model.py new file mode 100644 index 00000000..d07f167b --- /dev/null +++ b/backend/app/app/models/auth_model.py @@ -0,0 +1,140 @@ +# -*- coding: utf-8 -*- + +from datetime import datetime +from typing import List + +from sqlalchemy import UniqueConstraint +from sqlmodel import Field, Relationship, SQLModel + +from app.models.base_uuid_model import BaseUUIDModel +from app.utils import UUID_ + + +class Account( + BaseUUIDModel, + SQLModel, + table=True, +): + """Account model.""" + + id: UUID_ = Field( + default=None, + sa_column_kwargs={"primary_key": True}, + ) + userId: str = Field(default=None) + type: str = Field(default=None) + provider: str = Field(default=None) + providerAccountId: str = Field(default=None) + refresh_token: str = Field( + default=None, + nullable=True, + ) + access_token: str = Field( + default=None, + nullable=True, + ) + expires_at: int = Field( + default=None, + nullable=True, + ) + token_type: str = Field( + default=None, + nullable=True, + ) + scope: str = Field( + default=None, + nullable=True, + ) + id_token: str = Field( + default=None, + nullable=True, + ) + session_state: str = Field( + default=None, + nullable=True, + ) + user: "User" = Relationship(back_populates="accounts") + + __table_args__ = ( + UniqueConstraint( + "provider", + "providerAccountId", + ), + ) + + +class Session( + BaseUUIDModel, + SQLModel, + table=True, +): + id: UUID_ = Field( + default=None, + sa_column_kwargs={"primary_key": True}, + ) + sessionToken: str = Field( + default=None, + unique=True, + ) + userId: str = Field(default=None) + expires: datetime = Field(default=None) + user: "User" = Relationship(back_populates="sessions") + + +class User( + BaseUUIDModel, + SQLModel, + table=True, +): + """User model.""" + + id: UUID_ = Field( + default=None, + sa_column_kwargs={"primary_key": True}, + ) + name: str = Field( + default=None, + nullable=True, + ) + email: str = Field( + default=None, + unique=True, + nullable=True, + ) + emailVerified: datetime = Field( + default=None, + nullable=True, + ) + image: str = Field( + default=None, + nullable=True, + ) + credits: int = Field(default=3) + location: str = Field( + default=None, + nullable=True, + ) + accounts: List[Account] = Relationship(back_populates="user") + sessions: List[Session] = Relationship(back_populates="user") + + +class VerificationToken( + BaseUUIDModel, + SQLModel, + table=True, +): + """Verification token model.""" + + identifier: str = Field(default=None) + token: str = Field( + default=None, + unique=True, + ) + expires: datetime = Field(default=None) + + __table_args__ = ( + UniqueConstraint( + "identifier", + "token", + ), + ) diff --git a/backend/app/app/models/base_uuid_model.py b/backend/app/app/models/base_uuid_model.py new file mode 100644 index 00000000..48b36b2d --- /dev/null +++ b/backend/app/app/models/base_uuid_model.py @@ -0,0 +1,34 @@ +# -*- coding: utf-8 -*- +from datetime import datetime + +from pydantic import ConfigDict +from sqlalchemy.orm import declared_attr +from sqlmodel import Field, SQLModel + +from app.utils import UUID_, uuid7 + +# id: implements proposal uuid7 draft4 + + +class _SQLModel(SQLModel): + @declared_attr # type: ignore + def __tablename__( + self, + ) -> str: + return self.__name__ + + +class BaseUUIDModel(_SQLModel): + model_config = ConfigDict(arbitrary_types_allowed=True) # type: ignore + + id: UUID_ = Field( + default_factory=uuid7, + primary_key=True, + index=True, + nullable=False, + ) + updated_at: datetime | None = Field( + default_factory=datetime.utcnow, + sa_column_kwargs={"onupdate": datetime.utcnow}, + ) + created_at: datetime | None = Field(default_factory=datetime.utcnow) diff --git a/backend/app/app/opt/project_scheduling/__init__.py b/backend/app/app/opt/project_scheduling/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/backend/app/app/opt/project_scheduling/config/optimization_config.json b/backend/app/app/opt/project_scheduling/config/optimization_config.json new file mode 100644 index 00000000..86736b58 --- /dev/null +++ b/backend/app/app/opt/project_scheduling/config/optimization_config.json @@ -0,0 +1,7 @@ +{ + "available_resources": { + "UX_Designer": 1, + "Data_Scientist": 1, + "Software_Engineer": 1 + } +} diff --git a/backend/app/app/opt/project_scheduling/config/optimization_input.json b/backend/app/app/opt/project_scheduling/config/optimization_input.json new file mode 100644 index 00000000..0967ef42 --- /dev/null +++ b/backend/app/app/opt/project_scheduling/config/optimization_input.json @@ -0,0 +1 @@ +{} diff --git a/backend/app/app/opt/project_scheduling/optimizer.py b/backend/app/app/opt/project_scheduling/optimizer.py new file mode 100644 index 00000000..9b7d0c00 --- /dev/null +++ b/backend/app/app/opt/project_scheduling/optimizer.py @@ -0,0 +1,103 @@ +# mypy: ignore-errors +# -*- coding: utf-8 -*- +from typing import Any, Dict + +import pyomo.environ as pyo +from pyomo.environ import SolverFactory + + +def transform_json_to_dict(tasks_json: Dict[Any, Any]) -> Dict[Any, Any]: + TASKS = {} + for asset, specialties in tasks_json.items(): + for specialty, details in specialties.items(): + if details["prec"] is not None: + details["prec"] = tuple(details["prec"]) + TASKS[(asset, specialty)] = details + return TASKS + + +def solver_launch(tasks: Dict[Any, Any], config: Dict[Any, Any]) -> pyo.ConcreteModel: + tasks = transform_json_to_dict(tasks) + model = pyo.ConcreteModel() + + # tasks is a two dimensional set of (j,m) constructed from the dictionary keys + model.TASKS = pyo.Set(initialize=tasks.keys(), dimen=2) + + # the set of jobs is constructed from a python set + model.JOBS = pyo.Set(initialize=list(set([j for (j, m) in model.TASKS]))) + + # set of resources is constructed from a python set + model.RESOURCES = pyo.Set(initialize=list(set([m for (j, m) in model.TASKS]))) + + # the order of tasks is constructed as a cross-product of tasks and filtering + model.TASKORDER = pyo.Set( + initialize=model.TASKS * model.TASKS, + dimen=4, + filter=lambda model, j, m, k, n: (k, n) == tasks[(j, m)]["prec"], + ) + # time points at which resource availability is checked + model.TIMEPOINTS = pyo.Set(initialize=list(range(0, int(sum(tasks[(j, m)]["dur"] for (j, m) in tasks.keys())) + 1))) + + # the set of disjunctions is cross-product of jobs, jobs, and machines + model.DISJUNCTIONS = pyo.Set( + initialize=model.JOBS * model.JOBS * model.RESOURCES, + dimen=3, + filter=lambda model, j, k, m: j < k and (j, m) in model.TASKS and (k, m) in model.TASKS, + ) + + # variable for each task and time point that indicates whether the task is scheduled at that time + model.scheduled = pyo.Var(model.TASKS, model.TIMEPOINTS, within=pyo.Binary) + + # load duration data into a model parameter for later access + @model.Param(model.TASKS) + def dur(model, j, m): + return tasks[(j, m)]["dur"] + + @model.Param(model.TASKS, default=0) + def resource_req(model, j, m): + return tasks[(j, m)].get("resource_req", 0) + + @model.Param(model.RESOURCES) + def available_resources(model, r): + return config["available_resources"][r] + + ub = sum([model.dur[j, m] for (j, m) in model.TASKS]) + + # create decision variables + model.makespan = pyo.Var(bounds=(0, ub)) + model.start = pyo.Var(model.TASKS, bounds=(0, ub)) + + # The objective to minimize. TODO: make objective function more complex + @model.Objective(sense=pyo.minimize) + def minimize_makespan(model): + return model.makespan + + # Constraint to ensure all tasks are finished at the model makespan + @model.Constraint(model.TASKS) + def finish_tasks(model, j, m): + return model.start[j, m] + model.dur[j, m] <= model.makespan + + # Constraint the enforces the 'preceding' requirements + @model.Constraint(model.TASKORDER) + def preceding(model, j, m, k, n): + return model.start[k, n] + model.dur[k, n] <= model.start[j, m] + + # Ensures tasks on the same 'asset' don't overlap + @model.Disjunction(model.DISJUNCTIONS) + def no_overlap(model, j, k, m): + return [ + model.start[j, m] + model.dur[j, m] <= model.start[k, m], + model.start[k, m] + model.dur[k, m] <= model.start[j, m], + ] + + @model.Constraint(model.RESOURCES, model.TIMEPOINTS) + def resource_constraints(model, r, t): + return ( + sum(model.resource_req[j, m] * model.scheduled[j, m, t] for (j, m) in model.TASKS if m == r) + <= model.available_resources[r] + ) + + pyo.TransformationFactory("gdp.bigm").apply_to(model) + SolverFactory("appsi_highs").solve(model) + + return model diff --git a/backend/app/app/opt/project_scheduling/plots.py b/backend/app/app/opt/project_scheduling/plots.py new file mode 100644 index 00000000..fe7c47fb --- /dev/null +++ b/backend/app/app/opt/project_scheduling/plots.py @@ -0,0 +1,68 @@ +# -*- coding: utf-8 -*- +from typing import Optional + +import pandas as pd +import plotly.express as px + + +def call_plotly( + df: pd.DataFrame, + ship_column: str, + nr_features: int, + title_text: str, +) -> px.timeline: + """Creates the plotly figure.""" + color_params = { + "color": "specialty", + "color_discrete_map": { + "Specialty_1": "#f8ce50", + "Specialty_2": "#b8c7ff", + "Specialty_3": "#fff44f", + }, + } + + fig = px.timeline( + df, + x_start="start_dt", + x_end="end_dt", + y=ship_column, + hover_data=[ + "duration", + "start_dt", + "end_dt", + ], + **color_params, + ) + + fig.update_layout( + title_text=title_text, + height=300 + 20 * nr_features, # 1500 before looked nice + title_x=0.3, + ) + + fig.update_yaxes(categoryorder="category descending") + + return fig + + +def plot_gantt_chart( + df: pd.DataFrame, + output_name: str = "schedule_", + feature_column: str = "s", + save: Optional[bool] = None, + title_text: str = "New schedule", + time_tag: str = "xx", + folder_path: str = "", +) -> px.timeline: + nr_features = len(df[feature_column].unique()) + fig = call_plotly( + df, + feature_column, + nr_features, + title_text, + ) + + if save: + fig.write_html(folder_path + time_tag + output_name + ".html") + + return fig diff --git a/backend/app/app/opt/project_scheduling/post_processing.py b/backend/app/app/opt/project_scheduling/post_processing.py new file mode 100644 index 00000000..9f6acc3b --- /dev/null +++ b/backend/app/app/opt/project_scheduling/post_processing.py @@ -0,0 +1,27 @@ +# -*- coding: utf-8 -*- +from typing import Any, Dict, Tuple + +import pandas as pd +from pyomo.environ import ConcreteModel + + +def post_processing(model: ConcreteModel) -> Tuple[pd.DataFrame, Dict[str, Any]]: + """Post-process by reformatting to a schedule dataframe and extracting KPI's.""" + today = pd.Timestamp.today().round("d") + results = [ + { + "feature": j, + "start_dt": today + pd.to_timedelta(model.start[j, m](), "d"), + "duration": model.dur[j, m], + "end_dt": today + pd.to_timedelta(model.start[(j, m)]() + model.dur[j, m], "d"), + "specialty": m, + } + for j, m in model.TASKS + ] + kpis = { + "schedule_length": max([model.start[(j, m)]() + model.dur[j, m] for j, m in model.TASKS]), + } + + schedule_df = pd.DataFrame(results) + + return schedule_df, kpis diff --git a/backend/app/app/opt/project_scheduling/run_schedule_optimization.py b/backend/app/app/opt/project_scheduling/run_schedule_optimization.py new file mode 100755 index 00000000..65a4465e --- /dev/null +++ b/backend/app/app/opt/project_scheduling/run_schedule_optimization.py @@ -0,0 +1,67 @@ +# -*- coding: utf-8 -*- +import json +import logging +import os +from datetime import datetime +from typing import Any, Dict, Tuple, Union + +import plotly +import yaml + +import app.opt.project_scheduling.optimizer as op +import app.opt.project_scheduling.plots as pl +import app.opt.project_scheduling.post_processing as post + +logger = logging.getLogger(__name__) + + +def load_config(current_dir: str, conversationId: str) -> Tuple[Dict[str, Any], Dict[str, Any]]: + try: + config_file = ( + f"optimization_config_{conversationId}_new.json" + if os.path.exists(os.path.join(current_dir, "config", f"optimization_config_{conversationId}_new.json")) + else "optimization_config.json" + ) + logger.info("Loading config file: {}".format(config_file)) + with open(os.path.join(current_dir, "config", config_file)) as f: + CONFIG: Dict[str, Any] = json.load(f) + tasks_file = ( + f"optimization_input_{conversationId}_new.json" + if os.path.exists(os.path.join(current_dir, "config", f"optimization_input_{conversationId}_new.json")) + else "optimization_input.json" + ) + logger.info("Loading task file: {}".format(tasks_file)) + with open(os.path.join(current_dir, "config", tasks_file)) as f: + TASKS: Dict[str, Any] = json.load(f) + return CONFIG, TASKS + except yaml.YAMLError as exc: + print(exc) + raise ValueError + + +def run_scheduling_opt(conversationId: str) -> Tuple[Dict[str, Any], Dict[Any, Any]]: + # load input and config + current_dir = os.path.dirname(os.path.realpath(__file__)) + config, tasks = load_config(current_dir=current_dir, conversationId=conversationId) + + # launch solver + logger.info("Launching optimization run...") + solution_model = op.solver_launch(tasks, config) + + # post-processing + time_tag = datetime.now().strftime("%Y_%m_%d_%Hh_%MM") + + schedule_df, kpis = post.post_processing(solution_model) + + gant_figure = pl.plot_gantt_chart( + schedule_df, + feature_column="feature", + save=False, + title_text="Optimal schedule", + time_tag=time_tag, + folder_path=os.path.join(current_dir, "output_data/"), + output_name="schedule_gantt", + ) + graphJSON = plotly.io.to_json(gant_figure, pretty=True) + + return kpis, graphJSON diff --git a/backend/app/app/schemas/__init__.py b/backend/app/app/schemas/__init__.py new file mode 100644 index 00000000..54d00814 --- /dev/null +++ b/backend/app/app/schemas/__init__.py @@ -0,0 +1,3 @@ +# -*- coding: utf-8 -*- +from .auth_schema import AccountSchema, SessionSchema, VerificationTokenSchema +from .user_schema import UserSchema diff --git a/backend/app/app/schemas/agent_schema.py b/backend/app/app/schemas/agent_schema.py new file mode 100644 index 00000000..83a2a3b6 --- /dev/null +++ b/backend/app/app/schemas/agent_schema.py @@ -0,0 +1,33 @@ +# -*- coding: utf-8 -*- +from typing import Dict, Optional + +from pydantic.v1 import BaseModel # TODO: Remove this line when langchain upgrades to pydantic v2 + +from app.schemas.tool_schema import LLMType, ToolsLibrary + + +class ActionPlan(BaseModel): + name: str + description: str + actions: list[list[str]] + + +class ActionPlans(BaseModel): + action_plans: Dict[str, ActionPlan] + + +class AgentAndToolsConfig(BaseModel): + llm: LLMType + fast_llm: LLMType + fast_llm_token_limit: int + max_token_length: int + + +class AgentConfig(BaseModel): + common: AgentAndToolsConfig + tools: list[str] + action_plans: ActionPlans + prompt_message: str + system_context: str + tools_library: ToolsLibrary + api_key: Optional[str] = None diff --git a/backend/app/app/schemas/auth_schema.py b/backend/app/app/schemas/auth_schema.py new file mode 100644 index 00000000..10772cda --- /dev/null +++ b/backend/app/app/schemas/auth_schema.py @@ -0,0 +1,47 @@ +# -*- coding: utf-8 -*- +from datetime import datetime + +from pydantic import BaseModel + +from .user_schema import UserSchema + + +class AccountSchema(BaseModel): + id: str + userId: str + type: str + provider: str + providerAccountId: str + refresh_token: str | None = None + access_token: str | None = None + expires_at: int | None = None + token_type: str | None = None + scope: str | None = None + id_token: str | None = None + session_state: str | None = None + + user: UserSchema | None = None + + class Config: + from_attributes = True + + +class SessionSchema(BaseModel): + id: str + sessionToken: str + userId: str + expires: datetime + + user: UserSchema | None = None + + class Config: + from_attributes = True + + +class VerificationTokenSchema(BaseModel): + identifier: str + token: str + expires: datetime + + class Config: + from_attributes = True diff --git a/backend/app/app/schemas/common_schema.py b/backend/app/app/schemas/common_schema.py new file mode 100644 index 00000000..12ca9171 --- /dev/null +++ b/backend/app/app/schemas/common_schema.py @@ -0,0 +1,16 @@ +# -*- coding: utf-8 -*- +from caseconverter import camelcase +from pydantic import BaseModel + + +class QueryBase(BaseModel): + """Query base schema.""" + + class Config: + populate_by_name = True + + @staticmethod + def alias_generator( + s: str, + ) -> str: + return camelcase(s) diff --git a/backend/app/app/schemas/ingestion_schema.py b/backend/app/app/schemas/ingestion_schema.py new file mode 100644 index 00000000..36fe526c --- /dev/null +++ b/backend/app/app/schemas/ingestion_schema.py @@ -0,0 +1,50 @@ +# -*- coding: utf-8 -*- +from enum import Enum +from typing import Optional + +from langchain.document_loaders.base import BaseLoader +from langchain_community.document_loaders import ( + PDFMinerLoader, + PDFMinerPDFasHTMLLoader, + PyMuPDFLoader, + PyPDFLoader, + UnstructuredMarkdownLoader, + UnstructuredPDFLoader, +) +from pydantic import BaseModel + + +class PDFParserEnum(Enum): + PyMuPDF = "PyMuPDF" + PDFMiner_HTML = "PDFMiner_HTML" + PDFMiner = "PDFMiner" + PyPDF = "PyPDF" + Unstructured = "Unstructured" + PyPDF2Custom = "PyPDF2Custom" + + +class MDParserEnum(Enum): + MDUnstructured = "MDUnstructured" + + +LOADER_DICT: dict[str, type[BaseLoader]] = { + PDFParserEnum.PyPDF.name: PyPDFLoader, + PDFParserEnum.PyMuPDF.name: PyMuPDFLoader, + PDFParserEnum.PDFMiner.name: PDFMinerLoader, + PDFParserEnum.PDFMiner_HTML.name: PDFMinerPDFasHTMLLoader, + PDFParserEnum.Unstructured.name: UnstructuredPDFLoader, + MDParserEnum.MDUnstructured.name: UnstructuredMarkdownLoader, +} + + +class IndexingConfig(BaseModel): + tokenizer_chunk_size: int = 3000 + tokenizer_chunk_overlap: int = 200 + large_file_tokenizer_chunk_size: int = 4000 + large_file_tokenizer_chunk_overlap: int = 200 + pdf_parser: PDFParserEnum = PDFParserEnum.PyMuPDF + embedding_model: Optional[str] = None + + +class IngestionPipelineConfigs(BaseModel): + indexing_config: IndexingConfig diff --git a/backend/app/app/schemas/message_schema.py b/backend/app/app/schemas/message_schema.py new file mode 100644 index 00000000..5799580d --- /dev/null +++ b/backend/app/app/schemas/message_schema.py @@ -0,0 +1,95 @@ +# -*- coding: utf-8 -*- +from datetime import datetime +from enum import Enum +from typing import Any, Dict, Optional, Union +from uuid import UUID + +from langchain.schema import AIMessage, HumanMessage, SystemMessage +from pydantic import BaseModel, Field, StrictBool, StrictFloat, StrictInt + +from app.schemas.common_schema import QueryBase + +LangchainMessage = Union[ + AIMessage, + HumanMessage, + SystemMessage, +] + + +class ICreatorRole( + str, + Enum, +): + SYSTEM = "system" + USER = "user" + AGENT = "agent" + + +class IChatMessage(QueryBase): + role: ICreatorRole + content: str + + def to_langchain( + self, + ) -> LangchainMessage | None: + match self.role: + case ICreatorRole.SYSTEM: + return SystemMessage(content=self.content) + case ICreatorRole.USER: + return HumanMessage(content=self.content) + case ICreatorRole.AGENT: + return AIMessage(content=self.content) + case _: + return None + + +class UserSettings(BaseModel): + data: dict[ + str, + Any, + ] + version: Optional[int] = None + + +class IChatQuery(QueryBase): + messages: list[IChatMessage] + api_key: Optional[str] = None + conversation_id: UUID + new_message_id: UUID + user_email: str + settings: Optional[UserSettings] = None + + +class IFeedback(QueryBase): + conversation_id: UUID + message_id: UUID + user: str + score: int + comment: str + key: str + settings: Optional[UserSettings] = None + previous_id: Optional[str] = None + + +SCORE_TYPE = Union[StrictBool, StrictInt, StrictFloat, None] +VALUE_TYPE = Union[Dict, StrictBool, StrictInt, StrictFloat, str, None] + + +class FeedbackSourceBaseLangchain(BaseModel): + type: str + metadata: Optional[Dict[str, Any]] = Field(default_factory=dict) + + +class FeedbackLangchain(BaseModel): + """Schema for getting feedback, copy of langchain Feedback type (pydantic v2).""" + + id: UUID + created_at: datetime + modified_at: datetime + run_id: UUID + key: str + score: SCORE_TYPE = None + value: VALUE_TYPE = None + comment: Optional[str] = None + correction: Union[str, dict, None] = None + feedback_source: Optional[FeedbackSourceBaseLangchain] = None diff --git a/backend/app/app/schemas/response_schema.py b/backend/app/app/schemas/response_schema.py new file mode 100644 index 00000000..7a740fa9 --- /dev/null +++ b/backend/app/app/schemas/response_schema.py @@ -0,0 +1,94 @@ +# -*- coding: utf-8 -*- +# type: ignore +from collections.abc import Sequence +from math import ceil +from typing import Any, Generic, TypeVar + +from fastapi_pagination import Page, Params +from fastapi_pagination.bases import AbstractPage, AbstractParams +from pydantic import BaseModel + +DataType = TypeVar("DataType") +T = TypeVar("T") + + +class PageBase( + Page[T], + Generic[T], +): + pages: int + next_page: int | None + previous_page: int | None + + +class IResponseBase( + BaseModel, + Generic[T], +): + message: str = "" + meta: dict = {} + data: T | None + + +class IResponsePage( + AbstractPage[T], + Generic[T], +): + """Response page schema.""" + + message: str = "" + meta: dict = {} + data: PageBase[T] + + __params_type__ = Params # Set params related to Page + + @classmethod + def create( + cls, + items: Sequence[T], + total: int, + params: AbstractParams, + ) -> PageBase[T] | None: + if params.size is not None and total is not None and params.size != 0: + pages = ceil(total / params.size) + else: + pages = 0 + + return cls( + data=PageBase( + items=items, + page=params.page, + size=params.size, + total=total, + pages=pages, + next_page=params.page + 1 if params.page < pages else None, + previous_page=params.page - 1 if params.page > 1 else None, + ) + ) + + +class IGetResponseBase( + IResponseBase[DataType], + Generic[DataType], +): + message: str = "Data got correctly" + + +def create_response( + data: DataType | None, + message: str | None = "", + meta: dict | Any | None = None, +) -> DataType: + meta = {} if meta is None else meta + if isinstance( + data, + IResponsePage, + ): + data.message = "Data paginated correctly" if not message else message + data.meta = meta + return data + return { + "data": data, + "message": message, + "meta": meta, + } diff --git a/backend/app/app/schemas/streaming_schema.py b/backend/app/app/schemas/streaming_schema.py new file mode 100644 index 00000000..17c2eca3 --- /dev/null +++ b/backend/app/app/schemas/streaming_schema.py @@ -0,0 +1,29 @@ +# -*- coding: utf-8 -*- +from enum import Enum +from typing import Any + +from pydantic import BaseModel + + +class StreamingDataTypeEnum(Enum): + TEXT = "text" + LLM = "llm" + APPENDIX = "appendix" + ACTION = "action" + SIGNAL = "signal" + + +class StreamingSignalsEnum(Enum): + START = "START" + END = "END" + TOOL_END = "TOOL_END" + LLM_END = "LLM_END" + + +class StreamingData(BaseModel): + data: str + data_type: StreamingDataTypeEnum = StreamingDataTypeEnum.TEXT + metadata: dict[ + str, + Any, + ] = {} diff --git a/backend/app/app/schemas/tool_schema.py b/backend/app/app/schemas/tool_schema.py new file mode 100644 index 00000000..b5b03b69 --- /dev/null +++ b/backend/app/app/schemas/tool_schema.py @@ -0,0 +1,81 @@ +# -*- coding: utf-8 -*- +from typing import Any, List, Literal, Optional, Union + +from box import Box +from langchain.schema import AIMessage, HumanMessage +from pydantic.v1 import BaseModel # TODO: Remove this line when langchain upgrades to pydantic v2 + +LLMType = Literal[ + "gpt-4", + "gpt-3.5-turbo", + "azure-4-32k", + "azure-3.5", + "gpt-3.5-turbo-1106", +] + + +class PromptInput(BaseModel): + name: str + content: str + + +class ToolConfig(BaseModel): + description: str + prompt_message: Optional[str] + image_description_prompt: Optional[str] + system_context: Optional[str] + prompt_selection: Optional[str] + system_context_selection: Optional[str] + prompt_validation: Optional[str] + system_context_validation: Optional[str] + prompt_refinement: Optional[str] + system_context_refinement: Optional[str] + prompt_inputs: list[PromptInput] + additional: Optional[Box] = None + fast_llm_token_threshold: Optional[int] + + +class SqlToolConfig(ToolConfig): + nb_example_rows: int + validate_empty_results: bool + validate_with_llm: bool + always_limit_query: bool + + +class RetrievalToolConfig(ToolConfig): + n_docs: int + max_tokens_chat_history: Optional[int] + + +class ToolsLibrary(BaseModel): + library: dict[ + str, + ToolConfig, + ] + + +class UserSettings(BaseModel): + data: dict[ + str, + Any, + ] + version: Optional[int] = None + + +class ToolInputSchema(BaseModel): + chat_history: List[ + Union[ + HumanMessage, + AIMessage, + ] + ] + latest_human_message: str + + # Practice configurations + user_settings: Optional[UserSettings] + + # Tool outputs (intermediate results) + intermediate_steps: dict[ + str, + Any, + ] diff --git a/backend/app/app/schemas/tool_schemas/__init__.py b/backend/app/app/schemas/tool_schemas/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/backend/app/app/schemas/tool_schemas/pdf_tool_schema.py b/backend/app/app/schemas/tool_schemas/pdf_tool_schema.py new file mode 100644 index 00000000..254ae03a --- /dev/null +++ b/backend/app/app/schemas/tool_schemas/pdf_tool_schema.py @@ -0,0 +1,16 @@ +# -*- coding: utf-8 -*- +from typing import List, Optional + +from pydantic import BaseModel, Field + + +class PdfAppendix(BaseModel): + doc_id: str + page_numbers: List[int] + reference_text: str + + +class CodebaseDocumentationMetadata(BaseModel): + type: str + source: str + header1: Optional[str] = Field(None, alias="Header 1") diff --git a/backend/app/app/schemas/tool_schemas/sql_tool_schema.py b/backend/app/app/schemas/tool_schemas/sql_tool_schema.py new file mode 100644 index 00000000..2aa44ad8 --- /dev/null +++ b/backend/app/app/schemas/tool_schemas/sql_tool_schema.py @@ -0,0 +1,37 @@ +# -*- coding: utf-8 -*- +from typing import Any, List + +from pydantic import BaseModel + +from app.schemas.common_schema import QueryBase + + +class TableInfo(BaseModel): + """Table information.""" + + schema_name: str + table_name: str + structure: str + + @property + def name( + self, + ) -> str: + return self.schema_name + "." + self.table_name + + +class DatabaseInfo(BaseModel): + """Database information.""" + + tables: List[TableInfo] + + +class ExecutionResult(QueryBase): + raw_result: List[ + dict[ + str, + Any, + ] + ] + affected_rows: int | None = None + error: str | None = None diff --git a/backend/app/app/schemas/user_schema.py b/backend/app/app/schemas/user_schema.py new file mode 100644 index 00000000..3b6039ca --- /dev/null +++ b/backend/app/app/schemas/user_schema.py @@ -0,0 +1,22 @@ +# -*- coding: utf-8 -*- +from datetime import datetime +from typing import Any + +from pydantic import BaseModel + + +# Define schemas +class UserSchema(BaseModel): + id: str + name: str | None = None + email: str | None = None + emailVerified: datetime | None = None + image: str | None = None + credits: int = 3 + location: str | None = None + + accounts: list[Any] = [] + sessions: list[Any] = [] + + class Config: + from_attributes = True diff --git a/backend/app/app/services/__init__.py b/backend/app/app/services/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/backend/app/app/services/chat_agent/__init__.py b/backend/app/app/services/chat_agent/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/backend/app/app/services/chat_agent/helpers/__init__.py b/backend/app/app/services/chat_agent/helpers/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/backend/app/app/services/chat_agent/helpers/embedding_models.py b/backend/app/app/services/chat_agent/helpers/embedding_models.py new file mode 100644 index 00000000..12e23070 --- /dev/null +++ b/backend/app/app/services/chat_agent/helpers/embedding_models.py @@ -0,0 +1,72 @@ +# -*- coding: utf-8 -*- +# mypy: disable-error-code="call-arg" +# TODO: Change langchain param names to match the new langchain version + +import logging +from typing import List, Optional, Union + +from langchain.embeddings import CacheBackedEmbeddings +from langchain_openai.embeddings import OpenAIEmbeddings + +from app.api.deps import get_redis_store +from app.core.config import settings + +logger = logging.getLogger(__name__) + + +class CacheBackedEmbeddingsExtended(CacheBackedEmbeddings): + def embed_query(self, text: str) -> List[float]: + """ + Embed query text. + + Extended to support caching + + Args: + text: The text to embed. + + Returns: + The embedding for the given text. + """ + vectors: List[Union[List[float], None]] = self.document_embedding_store.mget([text]) + text_embeddings = vectors[0] + + if text_embeddings is None: + text_embeddings = self.underlying_embeddings.embed_query(text) + self.document_embedding_store.mset(list(zip([text], [text_embeddings]))) + + return text_embeddings + + +def get_embedding_model(emb_model: Optional[str]) -> CacheBackedEmbeddings: + """ + Get the embedding model from the embedding model type. + + If "OPENAI_API_BASE" is set, it will load Azure GPT models, otherwise it will load + OpenAI GPT models. + """ + if emb_model is None: + emb_model = "text-embedding-ada-002" + + underlying_embeddings = None + match emb_model: + case "text-embedding-ada-002": + if settings.OPENAI_API_BASE is not None: + underlying_embeddings = OpenAIEmbeddings( + deployment="text-embedding-ada-002-2", + model="text-embedding-ada-002", + openai_api_base=settings.OPENAI_API_BASE, + openai_api_type="azure", + openai_api_key=settings.OPENAI_API_KEY, + chunk_size=1, # Maximum number of texts to embed in each batch + ) + else: + underlying_embeddings = OpenAIEmbeddings() + case _: + logger.warning(f"embedding model {emb_model} not found, using default emb_model") + underlying_embeddings = OpenAIEmbeddings() + + store = get_redis_store() + embedder = CacheBackedEmbeddingsExtended.from_bytes_store( + underlying_embeddings, store, namespace=underlying_embeddings.model + ) + return embedder diff --git a/backend/app/app/services/chat_agent/helpers/llm.py b/backend/app/app/services/chat_agent/helpers/llm.py new file mode 100644 index 00000000..7ed9f155 --- /dev/null +++ b/backend/app/app/services/chat_agent/helpers/llm.py @@ -0,0 +1,78 @@ +# -*- coding: utf-8 -*- +# mypy: disable-error-code="call-arg" +# TODO: Change langchain param names to match the new langchain version + +import logging +from typing import Optional + +import tiktoken +from langchain.base_language import BaseLanguageModel +from langchain_openai import AzureChatOpenAI, ChatOpenAI + +from app.core.config import settings +from app.schemas.tool_schema import LLMType + +logger = logging.getLogger(__name__) + + +def get_token_length( + string: str, + model: str = "gpt-4", +) -> int: + """Get the token length of a string.""" + enc = tiktoken.encoding_for_model(model) + encoded = enc.encode(string) + return len(encoded) + + +def get_llm( + llm: LLMType, + api_key: Optional[str] = settings.OPENAI_API_KEY, +) -> BaseLanguageModel: + """Get the LLM instance for the given LLM type.""" + match llm: + case "azure-3.5": + if settings.OPENAI_API_BASE is None: + raise ValueError("OPENAI_API_BASE must be set to use Azure LLM") + return AzureChatOpenAI( + openai_api_base=settings.OPENAI_API_BASE, + openai_api_version="2023-03-15-preview", + deployment_name="rnd-gpt-35-turbo", + openai_api_key=api_key if api_key is not None else settings.OPENAI_API_KEY, + openai_api_type="azure", + streaming=True, + ) + case "gpt-3.5-turbo-1106": + return ChatOpenAI( + temperature=0, + model_name="gpt-3.5-turbo-1106", + openai_organization=settings.OPENAI_ORGANIZATION, + openai_api_key=api_key if api_key is not None else settings.OPENAI_API_KEY, + streaming=True, + ) + case "gpt-3.5-turbo": + return ChatOpenAI( + temperature=0, + model_name="gpt-3.5-turbo", + openai_organization=settings.OPENAI_ORGANIZATION, + openai_api_key=api_key if api_key is not None else settings.OPENAI_API_KEY, + streaming=True, + ) + case "gpt-4": + return ChatOpenAI( + temperature=0, + model_name="gpt-4", + openai_organization=settings.OPENAI_ORGANIZATION, + openai_api_key=api_key if api_key is not None else settings.OPENAI_API_KEY, + streaming=True, + ) + # If an exact match is not confirmed, this last case will be used if provided + case _: + logger.warning(f"LLM {llm} not found, using default LLM") + return ChatOpenAI( + temperature=0, + model_name="gpt-4", + openai_organization=settings.OPENAI_ORGANIZATION, + openai_api_key=settings.OPENAI_API_KEY, + streaming=True, + ) diff --git a/backend/app/app/services/chat_agent/helpers/query_formatting.py b/backend/app/app/services/chat_agent/helpers/query_formatting.py new file mode 100644 index 00000000..779da2b3 --- /dev/null +++ b/backend/app/app/services/chat_agent/helpers/query_formatting.py @@ -0,0 +1,38 @@ +# -*- coding: utf-8 -*- +from langchain.schema import HumanMessage + +from app.schemas.tool_schema import ToolInputSchema + + +def standard_query_format(tool_input: ToolInputSchema) -> str: + if "entertainer_tool" in tool_input.intermediate_steps: + del tool_input.intermediate_steps["entertainer_tool"] + for message in tool_input.chat_history: + if isinstance(message.content, str): + message.content = "\n".join( + [line for line in message.content.split("\n") if not line.startswith(("action:", "signal:"))] + ) + else: + raise Exception("Message content is not a string.") + query = ( + ( + "\nChat history: \n" + + "\n".join( + [ + f"Human: {message.content}" if isinstance(message, HumanMessage) else f"AI: {message.content}" + for message in tool_input.chat_history + ] + ) + if tool_input.chat_history + else "" + ) + + ( + "\nIntermediate tool outputs: " + + "\n".join([f"{key}: {value}" for key, value in tool_input.intermediate_steps.items()]) + if tool_input.intermediate_steps + else "" + ) + + "Latest user question: " + + tool_input.latest_human_message + ) + return query diff --git a/backend/app/app/services/chat_agent/helpers/run_helper.py b/backend/app/app/services/chat_agent/helpers/run_helper.py new file mode 100644 index 00000000..d20bf0e3 --- /dev/null +++ b/backend/app/app/services/chat_agent/helpers/run_helper.py @@ -0,0 +1,17 @@ +# -*- coding: utf-8 -*- +from typing import Optional + +from app.api.deps import get_redis_client +from app.utils.fastapi_globals import g + + +async def is_running(run_id: Optional[str] = None) -> bool: + redis_client = await get_redis_client() + run_id = run_id or g.query_context["run_id"] + is_running_bool = await redis_client.get(run_id) + return is_running_bool is not None + + +async def stop_run(run_id: str) -> None: + redis_client = await get_redis_client() + await redis_client.delete(run_id) diff --git a/backend/app/app/services/chat_agent/helpers/utils.py b/backend/app/app/services/chat_agent/helpers/utils.py new file mode 100644 index 00000000..4764f63e --- /dev/null +++ b/backend/app/app/services/chat_agent/helpers/utils.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- +import logging +from typing import List + +import tiktoken + +logger = logging.getLogger(__name__) + + +def get_token_length(string: str, model: str = "gpt-4") -> int: + """Get the token length of a string for a given model.""" + enc = tiktoken.encoding_for_model(model) + encoded = enc.encode(string) + return len(encoded) + + +def get_conversation_id(tags: List) -> str: + for tag in tags: + if "conversation_id" in tag: + return tag.split("=")[1] + raise ValueError("No conversation_id found in tags.") diff --git a/backend/app/app/services/chat_agent/meta_agent.py b/backend/app/app/services/chat_agent/meta_agent.py new file mode 100644 index 00000000..21a4c8e0 --- /dev/null +++ b/backend/app/app/services/chat_agent/meta_agent.py @@ -0,0 +1,117 @@ +# -*- coding: utf-8 -*- +from typing import Callable, List, Optional + +from langchain.agents import AgentExecutor +from langchain.base_language import BaseLanguageModel +from langchain.memory import ChatMessageHistory, ConversationTokenBufferMemory +from langchain.schema import AIMessage, HumanMessage + +from app.core.config import settings +from app.schemas.agent_schema import AgentConfig +from app.schemas.tool_schema import LLMType +from app.services.chat_agent.helpers.llm import get_llm +from app.services.chat_agent.router_agent.SimpleRouterAgent import SimpleRouterAgent +from app.services.chat_agent.tools.tools import get_tools +from app.utils.config_loader import get_agent_config + + +def get_conv_token_buffer_memory( + chat_messages: List[AIMessage | HumanMessage], + api_key: str, +) -> ConversationTokenBufferMemory: + """ + Get a ConversationTokenBufferMemory from a list of chat messages. + + This function takes a list of chat messages and returns a ConversationTokenBufferMemory object. + It first gets the agent configuration and the language model, and then creates a ConversationTokenBufferMemory + object. It then iterates over the chat messages, saving the context of the conversation to the memory. + + Args: + chat_messages (List[Union[AIMessage, HumanMessage]]): The list of chat messages. + api_key (str): The API key. + + Returns: + ConversationTokenBufferMemory: The ConversationTokenBufferMemory object. + """ + agent_config = get_agent_config() + llm = get_llm( + agent_config.common.llm, + api_key=api_key, + ) + chat_history = ChatMessageHistory() + memory = ConversationTokenBufferMemory( + memory_key="chat_history", + return_messages=True, + max_token_limit=agent_config.common.max_token_length, + llm=llm, + chat_memory=chat_history, + ) + + i = 0 + while i < len(chat_messages): + if isinstance( + chat_messages[i], + HumanMessage, + ): + if isinstance( + chat_messages[i + 1], + AIMessage, + ): + memory.save_context( + inputs={"input": chat_messages[i].content}, + outputs={"output": chat_messages[i + 1].content}, # type: ignore + ) + i += 1 + else: + memory.save_context( + inputs={"input": chat_messages[i].content}, + outputs={"output": ""}, + ) + i += 1 + + return memory + + +def create_meta_agent( + agent_config: AgentConfig, + get_llm_hook: Callable[[LLMType, Optional[str]], BaseLanguageModel] = get_llm, +) -> AgentExecutor: + """ + Create a meta agent from a config. + + This function takes an AgentConfig object and creates a MetaAgent. + It retrieves the language models and the list tools, with which a SimpleRouterAgent is created. + Then, it returns an AgentExecutor. + + Args: + agent_config (AgentConfig): The AgentConfig object. + + Returns: + AgentExecutor: The AgentExecutor object. + """ + api_key = agent_config.api_key + if api_key is None or api_key == "": + api_key = settings.OPENAI_API_KEY + + llm = get_llm_hook( + agent_config.common.llm, + api_key, + ) + + tools = get_tools(tools=agent_config.tools) + simple_router_agent = SimpleRouterAgent.from_llm_and_tools( + tools=tools, + llm=llm, + prompt_message=agent_config.prompt_message, + system_context=agent_config.system_context, + action_plans=agent_config.action_plans, + ) + return AgentExecutor.from_agent_and_tools( + agent=simple_router_agent, + tools=tools, + verbose=True, + max_iterations=15, + max_execution_time=300, + early_stopping_method="generate", + handle_parsing_errors=True, + ) diff --git a/backend/app/app/services/chat_agent/router_agent/SimpleRouterAgent.py b/backend/app/app/services/chat_agent/router_agent/SimpleRouterAgent.py new file mode 100644 index 00000000..5c55239e --- /dev/null +++ b/backend/app/app/services/chat_agent/router_agent/SimpleRouterAgent.py @@ -0,0 +1,233 @@ +# -*- coding: utf-8 -*- +import logging +from typing import Any, List, Optional, Tuple, Union + +import openai +from langchain.agents import BaseMultiActionAgent +from langchain.base_language import BaseLanguageModel +from langchain.callbacks.manager import Callbacks +from langchain.chains.llm import LLMChain +from langchain.prompts.base import BasePromptTemplate +from langchain.prompts.chat import ( + BaseChatPromptTemplate, + BaseMessagePromptTemplate, + ChatPromptTemplate, + HumanMessagePromptTemplate, + MessagesPlaceholder, + SystemMessagePromptTemplate, +) +from langchain.schema import AgentAction, AgentFinish, BaseMessage +from langchain.tools import BaseTool + +from app.schemas.agent_schema import ActionPlan, ActionPlans +from app.schemas.tool_schema import ToolInputSchema, UserSettings +from app.services.chat_agent.helpers.run_helper import is_running +from app.utils.exceptions.common_exceptions import AgentCancelledException + +logger = logging.getLogger(__name__) + + +class SimpleRouterAgent(BaseMultiActionAgent): + """Agent that, given input, decides what to do.""" + + tools: List[BaseTool] + llm_chain: LLMChain + + action_plans: ActionPlans = ActionPlans(action_plans={}) + action_plan: Optional[ActionPlan] = None + + @property + def input_keys( + self, + ) -> List[str]: + return [ + "input", + "chat_history", + ] + + def plan( + self, + intermediate_steps: List[ + Tuple[ + AgentAction, + str, + ] + ], + callbacks: Callbacks = None, + **kwargs: Any, + ) -> Union[List[AgentAction], AgentFinish,]: + """ + Given input, decided what to do. (Not implemented for this agent type) + + Args: + intermediate_steps: Steps the LLM has taken to date, + along with observations + callbacks: Callbacks to run. + **kwargs: User inputs. + + Returns: + Action specifying what tool to use. + """ + raise NotImplementedError("SimpleRouterAgent does not support sync") + + async def aplan( + self, + intermediate_steps: List[ + Tuple[ + AgentAction, + str, + ] + ], + callbacks: Callbacks | None = None, + **kwargs: Any, + ) -> Union[List[AgentAction], AgentFinish,]: + """ + Given input, decides what to do. + + This function takes a list of intermediate steps and user inputs, and decides what action to take next. + It first tries to select an action plan. + If an action plan is selected, it follows the action plan and returns the next actions. + If all actions in the action plan are completed, it returns an AgentFinish object. + + Args: + intermediate_steps (List[Tuple[AgentAction, str]]): Steps the LLM has taken so far, along with observations. + callbacks (Callbacks | None, optional): Callbacks to run. Defaults to None. + **kwargs: User inputs. + + Returns: + Union[List[AgentAction], AgentFinish]: The next actions to take or an AgentFinish object if all + actions are completed. + """ + if not await is_running(): + raise AgentCancelledException("The agent is cancelled.") + + # Router agent makes initial template + retries = 0 + while self.action_plan is None: + try: + full_output = await self.llm_chain.apredict(**kwargs) + action_plan = ActionPlan(**self.action_plans.action_plans[full_output].dict()) + self.action_plan = action_plan + logger.info(f"Action plan selected: {full_output}, {str(action_plan)}") + except openai.AuthenticationError as e: + retries += 1 + if retries > 3: + raise ValueError( + "Oops! It seems like your OPENAPI key is invalid. Please check your Settings." + ) from e + except Exception as e: + retries += 1 + if retries > 3: + raise ValueError(f"Invalid action plan selected ({retries}x)") from e + + # Router agent follows action plan + if len(self.action_plan.actions) > 0: + logger.info(f"Next action plan step ({len(self.action_plan.actions)} remaining)") + next_actions = self.action_plan.actions.pop(0) + tool_input = ToolInputSchema( + latest_human_message=kwargs["input"], + chat_history=[], + user_settings=UserSettings(**kwargs["user_settings"].dict()) if kwargs["user_settings"] else None, + intermediate_steps={}, + ) + if len(intermediate_steps) > 0: + tool_input.intermediate_steps = {step[0].tool: step[1] for step in intermediate_steps} + elif "memory" in next_actions and "chat_history" in kwargs: + tool_input.chat_history = kwargs["chat_history"] + + tool_input_str = tool_input.json() # pydantic v2: model_dump_json + actions = [ + AgentAction( + tool=a, + tool_input=tool_input_str, + log="", + ) + for a in next_actions + if a != "memory" + ] + return actions + # Router agent is done + output = "\n\n".join([f"{step[0].tool}:\n{step[1]}" for step in intermediate_steps]) + return AgentFinish( + return_values={"output": output}, + log="", + ) + + @classmethod + def create_prompt( + cls, + prompt_message: str, + system_context: str, + action_plans: ActionPlans, + ) -> BasePromptTemplate: + """ + Create a prompt for the router agent. + + This function takes a prompt message, system context, and action plans, and returns a BasePromptTemplate object. + + Args: + prompt_message (str): The prompt message. + system_context (str): The system context. + action_plans (ActionPlans): The available action plans. + + Returns: + BasePromptTemplate: A BasePromptTemplate object. + """ + messages: list[BaseMessagePromptTemplate | BaseMessage | BaseChatPromptTemplate] = [ + SystemMessagePromptTemplate.from_template( + system_context.format( + action_plans="\n".join([f"{k}: {v.description}" for k, v in action_plans.action_plans.items()]) + ) + ), + MessagesPlaceholder(variable_name="chat_history"), + HumanMessagePromptTemplate.from_template(prompt_message), + ] + return ChatPromptTemplate( + input_variables=[ + "input", + "chat_history", + ], + messages=messages, + ) + + @classmethod + def from_llm_and_tools( + cls, + llm: BaseLanguageModel, + tools: List[BaseTool], + prompt_message: str, + system_context: str, + action_plans: ActionPlans, + **kwargs: Any, + ) -> BaseMultiActionAgent: + """ + Construct an agent from an LLM and tools. + + This function creates a BaseMultiActionAgent object from a language model, a list of tools, + a prompt message, system context, and action plans. + + Args: + llm (BaseLanguageModel): The language model. + tools (List[BaseTool]): The list of tools. + prompt_message (str): The prompt message. + system_context (str): The system context. + action_plans (ActionPlans): The action plans. + **kwargs: Additional parameters. + + Returns: + BaseMultiActionAgent: The BaseMultiActionAgent object. + """ + llm_chain = LLMChain( + llm=llm, + prompt=cls.create_prompt( + prompt_message=prompt_message, + system_context=system_context, + action_plans=action_plans, + ), + ) + return cls( + tools=tools, + llm_chain=llm_chain, + action_plans=action_plans, + **kwargs, + ) diff --git a/backend/app/app/services/chat_agent/router_agent/__init__.py b/backend/app/app/services/chat_agent/router_agent/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/backend/app/app/services/chat_agent/tools/ExtendedBaseTool.py b/backend/app/app/services/chat_agent/tools/ExtendedBaseTool.py new file mode 100644 index 00000000..bb0d7c13 --- /dev/null +++ b/backend/app/app/services/chat_agent/tools/ExtendedBaseTool.py @@ -0,0 +1,130 @@ +# -*- coding: utf-8 -*- +# mypy: disable-error-code="attr-defined,union-attr" + +from __future__ import annotations + +from typing import Any, List, Optional + +from langchain.base_language import BaseLanguageModel +from langchain.callbacks.manager import AsyncCallbackManagerForToolRun, CallbackManagerForToolRun +from langchain.schema import BaseMessage +from langchain.tools import BaseTool + +from app.schemas.agent_schema import AgentAndToolsConfig +from app.schemas.tool_schema import ToolConfig +from app.services.chat_agent.helpers.llm import get_llm, get_token_length + + +class ExtendedBaseTool(BaseTool): + """Base tool for all tools in the agent.""" + + name: str = "extended_base_tool" + llm: BaseLanguageModel + fast_llm: BaseLanguageModel + fast_llm_token_limit: Optional[int] = None + max_token_length: Optional[int] = None + + prompt_message: str + system_context: str + + prompt_selection: Optional[str] = None + system_context_selection: Optional[str] = None + + prompt_validation: Optional[str] = None + system_context_validation: Optional[str] = None + + prompt_refinement: Optional[str] = None + system_context_refinement: Optional[str] = None + + image_description_prompt: Optional[str] = None + + @classmethod + def from_config( + cls, + config: ToolConfig, + common_config: AgentAndToolsConfig, + **kwargs: Any, + ) -> ExtendedBaseTool: + """Create a tool from a config.""" + llm = kwargs.get( + "llm", + get_llm(common_config.llm), + ) + fast_llm = kwargs.get( + "fast_llm", + get_llm(common_config.fast_llm), + ) + fast_llm_token_limit = kwargs.get( + "fast_llm_token_limit", + common_config.fast_llm_token_limit, + ) + max_token_length = kwargs.get( + "max_token_length", + common_config.max_token_length, + ) + + return cls( + llm=llm, + fast_llm=fast_llm, + fast_llm_token_limit=fast_llm_token_limit, + max_token_length=max_token_length, + description=config.description.format(**{e.name: e.content for e in config.prompt_inputs}), + prompt_message=config.prompt_message.format(**{e.name: e.content for e in config.prompt_inputs}), + image_description_prompt=config.image_description_prompt.format( + **{e.name: e.content for e in config.prompt_inputs} + ) + if config.image_description_prompt + else None, + system_context=config.system_context.format(**{e.name: e.content for e in config.prompt_inputs}), + prompt_selection=config.prompt_selection.format(**{e.name: e.content for e in config.prompt_inputs}) + if config.prompt_selection + else None, + system_context_selection=config.system_context_selection.format( + **{e.name: e.content for e in config.prompt_inputs} + ) + if config.system_context_selection + else None, + prompt_validation=config.prompt_validation.format(**{e.name: e.content for e in config.prompt_inputs}) + if config.prompt_validation + else None, + system_context_validation=config.system_context_validation.format( + **{e.name: e.content for e in config.prompt_inputs} + ) + if config.system_context_validation + else None, + prompt_refinement=config.prompt_refinement.format(**{e.name: e.content for e in config.prompt_inputs}) + if config.prompt_refinement + else None, + system_context_refinement=config.system_context_refinement.format( + **{e.name: e.content for e in config.prompt_inputs} + ) + if config.system_context_refinement + else None, + ) + + async def _agenerate_response( + self, + messages: List[BaseMessage], + discard_fast_llm: bool = False, + run_manager: Optional[AsyncCallbackManagerForToolRun] = None, + ) -> str: + """Generate a response asynchronously with the preferential llm.""" + if self.fast_llm_token_limit is None: + raise ValueError("fast_llm_token_limit must be set in the config, current value `None`") + llm = ( + self.fast_llm + if get_token_length("".join([m.content if isinstance(m.content, str) else "" for m in messages])) + < self.fast_llm_token_limit + and not discard_fast_llm + else self.llm + ) + llm_response = await llm.agenerate([messages], callbacks=run_manager.get_child() if run_manager else None) + return llm_response.generations[0][0].text + + def _run( + self, + *args: Any, + run_manager: Optional[CallbackManagerForToolRun] = None, + **kwargs: Any, + ) -> Any: + raise NotImplementedError(f"{self.name} does not implement _run") diff --git a/backend/app/app/services/chat_agent/tools/__init__.py b/backend/app/app/services/chat_agent/tools/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/backend/app/app/services/chat_agent/tools/applications/project_scheduling/clarify_tool/clarify_tool.py b/backend/app/app/services/chat_agent/tools/applications/project_scheduling/clarify_tool/clarify_tool.py new file mode 100644 index 00000000..b91ce0b5 --- /dev/null +++ b/backend/app/app/services/chat_agent/tools/applications/project_scheduling/clarify_tool/clarify_tool.py @@ -0,0 +1,70 @@ +# -*- coding: utf-8 -*- +# mypy: ignore-errors +from __future__ import annotations + +import logging +from typing import Any, Optional + +from langchain.callbacks.manager import AsyncCallbackManagerForToolRun, CallbackManagerForToolRun +from langchain.schema import HumanMessage, SystemMessage + +from app.schemas.agent_schema import AgentAndToolsConfig +from app.schemas.tool_schema import ToolConfig +from app.services.chat_agent.helpers.llm import get_llm +from app.services.chat_agent.tools.ExtendedBaseTool import ExtendedBaseTool + +logger = logging.getLogger(__name__) + + +class ProjectSchedulingClarifyTool(ExtendedBaseTool): + name = "clarify_tool" + + @classmethod + def from_config( + cls, + config: ToolConfig, + common_config: AgentAndToolsConfig, + **kwargs: Any, + ) -> ProjectSchedulingClarifyTool: + llm = kwargs.get("llm", get_llm(common_config.llm)) + fast_llm = kwargs.get("fast_llm", get_llm(common_config.fast_llm)) + fast_llm_token_limit = kwargs.get("fast_llm_token_limit", common_config.fast_llm_token_limit) + + return cls( + llm=llm, + fast_llm=fast_llm, + fast_llm_token_limit=fast_llm_token_limit, + description=config.description.format(**{e.name: e.content for e in config.prompt_inputs}), + prompt_message=config.prompt_message.format(**{e.name: e.content for e in config.prompt_inputs}), + system_context=config.system_context.format(**{e.name: e.content for e in config.prompt_inputs}), + ) + + def _run( + self, + *args: Any, + run_manager: Optional[CallbackManagerForToolRun] = None, + **kwargs: Any, + ) -> Any: + """Use the tool.""" + + raise NotImplementedError("ProjectSchedulingClarifyTool does not support sync") + + async def _arun(self, query: str, run_manager: Optional[AsyncCallbackManagerForToolRun] = None) -> str: + """Use the tool asynchronously.""" + try: + messages = [ + SystemMessage(content=self.system_context), + HumanMessage(content=self.prompt_message.format(question=query)), + ] + response = await self._agenerate_response(messages, discard_fast_llm=True, run_manager=run_manager) + + logger.info(f"Clarify Tool response - {response}") + + return response + + except Exception as e: + if run_manager is not None: + await run_manager.on_tool_error(e, tool=self.name) + return repr(e) + else: + raise e diff --git a/backend/app/app/services/chat_agent/tools/applications/project_scheduling/code_expert_tool/__init__.py b/backend/app/app/services/chat_agent/tools/applications/project_scheduling/code_expert_tool/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/backend/app/app/services/chat_agent/tools/applications/project_scheduling/code_expert_tool/code_expert_tool.py b/backend/app/app/services/chat_agent/tools/applications/project_scheduling/code_expert_tool/code_expert_tool.py new file mode 100644 index 00000000..0858d2ba --- /dev/null +++ b/backend/app/app/services/chat_agent/tools/applications/project_scheduling/code_expert_tool/code_expert_tool.py @@ -0,0 +1,109 @@ +# -*- coding: utf-8 -*- +# mypy: ignore-errors +from __future__ import annotations + +import logging +from typing import Any, Optional + +from langchain.callbacks.manager import AsyncCallbackManagerForToolRun, CallbackManagerForToolRun +from langchain.schema import HumanMessage, SystemMessage + +from app.schemas.agent_schema import AgentAndToolsConfig +from app.schemas.tool_schema import ToolConfig, ToolInputSchema +from app.services.chat_agent.helpers.llm import get_llm +from app.services.chat_agent.tools.ExtendedBaseTool import ExtendedBaseTool +from app.utils.llm import get_token_length + +logger = logging.getLogger(__name__) + + +class CodeExpertTool(ExtendedBaseTool): + """Expert Tool.""" + + name = "code_expert_tool" + fast_llm_token_threshold: int = 8000 + + @classmethod + def from_config(cls, config: ToolConfig, common_config: AgentAndToolsConfig, **kwargs) -> CodeExpertTool: + """Create an expert tool from a config.""" + llm = kwargs.get( + "llm", + get_llm(common_config.llm), + ) + fast_llm = kwargs.get( + "fast_llm", + get_llm(common_config.fast_llm), + ) + fast_llm_token_limit = kwargs.get( + "fast_llm_token_limit", + common_config.fast_llm_token_limit, + ) + return cls( + llm=llm, + fast_llm=fast_llm, + fast_llm_token_limit=fast_llm_token_limit, + fast_llm_token_threshold=config.fast_llm_token_threshold + if config.fast_llm_token_threshold + else cls.fast_llm_token_threshold, + description=config.description.format(**{e.name: e.content for e in config.prompt_inputs}), + prompt_message=config.prompt_message.format(**{e.name: e.content for e in config.prompt_inputs}), + system_context=config.system_context.format(**{e.name: e.content for e in config.prompt_inputs}), + ) + + def _run( + self, + *args: Any, + run_manager: Optional[CallbackManagerForToolRun] = None, + **kwargs: Any, + ) -> str: + raise NotImplementedError("Tool does not support sync") + + async def _arun( + self, + *args: Any, + run_manager: Optional[AsyncCallbackManagerForToolRun] = None, + **kwargs: Any, + ) -> str: + """Use the tool asynchronously.""" + query = kwargs.get( + "query", + args[0], + ) + try: + tool_input = ToolInputSchema.parse_raw(query) + user_question = tool_input.latest_human_message + + retrieved_code = tool_input.intermediate_steps["code_search_tool"]["result"] + latest_chat_history = tool_input.intermediate_steps["code_search_tool"]["chat_history"] + retrieved_documentation = tool_input.intermediate_steps["pdf_tool"]["result"] + + messages = [ + SystemMessage(content=self.system_context), + HumanMessage( + content=self.prompt_message.format( + question=user_question, + chat_history=latest_chat_history, + retrieved_code=retrieved_code, + retrieved_documentation=retrieved_documentation, + ) + ), + ] + input_token_length = get_token_length("".join([m.content for m in messages])) + if input_token_length > self.fast_llm_token_threshold: + logger.info( + f"[TOKEN PROBLEM] Code expert tool: Input token length {input_token_length}, using fast_llm" + ) + response = await self._agenerate_response(messages, discard_fast_llm=False, run_manager=run_manager) + else: + response = await self._agenerate_response(messages, discard_fast_llm=True, run_manager=run_manager) + + logger.info(f"Expert Tool response - {response}") + + return response + + except Exception as e: + if run_manager is not None: + await run_manager.on_tool_error(e, tool=self.name) + return repr(e) + else: + raise e diff --git a/backend/app/app/services/chat_agent/tools/applications/project_scheduling/code_search_tool/__init__.py b/backend/app/app/services/chat_agent/tools/applications/project_scheduling/code_search_tool/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/backend/app/app/services/chat_agent/tools/applications/project_scheduling/code_search_tool/code_search_tool.py b/backend/app/app/services/chat_agent/tools/applications/project_scheduling/code_search_tool/code_search_tool.py new file mode 100644 index 00000000..c2ecaff1 --- /dev/null +++ b/backend/app/app/services/chat_agent/tools/applications/project_scheduling/code_search_tool/code_search_tool.py @@ -0,0 +1,164 @@ +# -*- coding: utf-8 -*- +# mypy: ignore-errors +from __future__ import annotations + +import logging +from typing import Any, Optional, Union + +from langchain.callbacks.manager import AsyncCallbackManagerForToolRun, CallbackManagerForToolRun +from langchain.schema import Document + +from app.db.vector_db_code_ingestion import get_code_pipeline +from app.schemas.agent_schema import AgentAndToolsConfig +from app.schemas.streaming_schema import StreamingDataTypeEnum +from app.schemas.tool_schema import RetrievalToolConfig, ToolInputSchema +from app.services.chat_agent.helpers.llm import get_llm +from app.services.chat_agent.tools.ExtendedBaseTool import ExtendedBaseTool +from app.utils.llm import truncate_to_token_length + +logger = logging.getLogger(__name__) + + +class CodeSearchTool(ExtendedBaseTool): + """Code search tool.""" + + name = "code_search_tool" + appendix_title = "Code Search Tool" + + n_docs: int = 2 + max_tokens_chat_history: int = 3000 + + @classmethod + def from_config( + cls, + config: RetrievalToolConfig, + common_config: AgentAndToolsConfig, + **kwargs: Any, + ) -> CodeSearchTool: + """Create a code search tool from a config.""" + llm = kwargs.get( + "llm", + get_llm(common_config.llm), + ) + fast_llm = kwargs.get( + "fast_llm", + get_llm(common_config.fast_llm), + ) + fast_llm_token_limit = kwargs.get( + "fast_llm_token_limit", + common_config.fast_llm_token_limit, + ) + max_token_length = kwargs.get("max_token_length", common_config.max_token_length) + + return cls( + llm=llm, + fast_llm=fast_llm, + fast_llm_token_limit=fast_llm_token_limit, + description=config.description, + prompt_message=config.prompt_message.format(**{e.name: e.content for e in config.prompt_inputs}), + system_context=config.system_context.format(**{e.name: e.content for e in config.prompt_inputs}), + max_token_length=max_token_length, + n_docs=config.n_docs, + max_tokens_chat_history=config.max_tokens_chat_history, + ) + + def _run( + self, + *args: Any, + run_manager: Optional[CallbackManagerForToolRun] = None, + **kwargs: Any, + ) -> str: + raise NotImplementedError("Tool does not support sync") + + async def _arun( + self, + *args: Any, + run_manager: Optional[AsyncCallbackManagerForToolRun] = None, + **kwargs: Any, + ) -> Union[dict, str]: + """Use the tool asynchronously.""" + query = kwargs.get( + "query", + args[0], + ) + try: + logger.info("Get DB...") + db_code = get_code_pipeline().run(load_index=True) + + # Filter search query to only include user's questions and remove retrieved docs + tool_input = ToolInputSchema.parse_raw(query) + chat_history = tool_input.chat_history[-4:] + user_question = tool_input.latest_human_message.split("Tool outputs streamed to the user:")[0].strip() + human_messages = [ + msg.content.split("Tool outputs streamed to the user:")[0].strip() + for msg in chat_history + if msg.type == "human" + ] + search_query = "\n".join([user_question] + human_messages) + + logger.info("Retrieving documents from DB...") + logger.info(f"Code Tool Search Query - {search_query}") + docs = db_code.as_retriever( + search_kwargs={ + "k": self.n_docs, + } # tbd search_kwargs + ).get_relevant_documents(search_query) + + retrieved_docs = "\n\n".join([self._format_doc(doc) for doc in docs]) + sources = [self._format_source(doc) for doc in docs] + uniq_sources = set(sources) + + logger.info(f"Code Search Tool {len(sources)} Sources - {sources}") + logger.info(f"Code Search Tool Retreived Code files - {retrieved_docs}") + + # Add step in steps view with number of sources and sources + if run_manager is not None: + await run_manager.on_text( + "retreived_sources", + data_type=StreamingDataTypeEnum.ACTION, + tool=self.name, + step=2, + number_sources=len(uniq_sources), + sources=", ".join(uniq_sources), + ) + + if len(chat_history) == 0: + truncated_chat_history = chat_history + else: + truncated_chat_history = truncate_to_token_length( + string=str(chat_history), max_length=self.max_tokens_chat_history + ) + + result = { + "result": retrieved_docs, + "metadata": sources, + "chat_history": truncated_chat_history, + } + return result + + except Exception as e: + if run_manager is not None: + await run_manager.on_tool_error(e, tool=self.name) + return repr(e) + else: + raise e + + def _format_source(self, doc: Document) -> str: + header = doc.metadata.get("header1", "") + source = f"{doc.metadata['source']}{f'#{header}' if header else ''}" + return source + + def _format_doc(self, doc: Document) -> str: + source_label = "Python file Source:" + content_label = "Python file Content:" + content = doc.page_content + + if doc.metadata["tool_prompt"]: + prompt = doc.metadata["tool_prompt"] + formatted_doc = ( + f"{source_label} {self._format_source(doc)}\n{content_label}\n{content}\n--prompt for tool:\n{prompt}" + ) + else: + formatted_doc = f"{source_label} {self._format_source(doc)}\n{content_label}\n{content}" + + return formatted_doc diff --git a/backend/app/app/services/chat_agent/tools/applications/project_scheduling/generate_config_tool/generate_config_tool.py b/backend/app/app/services/chat_agent/tools/applications/project_scheduling/generate_config_tool/generate_config_tool.py new file mode 100755 index 00000000..0a7e3304 --- /dev/null +++ b/backend/app/app/services/chat_agent/tools/applications/project_scheduling/generate_config_tool/generate_config_tool.py @@ -0,0 +1,121 @@ +# -*- coding: utf-8 -*- +# mypy: ignore-errors +from __future__ import annotations + +import logging +import os +from pathlib import Path +from typing import Any, Optional + +import yaml +from langchain.callbacks.manager import AsyncCallbackManagerForToolRun, CallbackManagerForToolRun +from langchain.schema import HumanMessage, SystemMessage + +from app.schemas.agent_schema import AgentAndToolsConfig +from app.schemas.streaming_schema import StreamingDataTypeEnum +from app.schemas.tool_schema import ToolConfig +from app.services.chat_agent.helpers.llm import get_llm +from app.services.chat_agent.helpers.utils import get_conversation_id +from app.services.chat_agent.tools.ExtendedBaseTool import ExtendedBaseTool + +logger = logging.getLogger(__name__) + +OPTIMIZATION_CONFIG_PATH = "./app/opt/project_scheduling/config/" +DEFAULT_OPTIMIZATION_CONFIG_NAME = "optimization_config.json" + + +class ProjectSchedulingGenConfigTool(ExtendedBaseTool): + name = "generate_config_tool" + appendix_title = "Available resources Appendix" + + @classmethod + def from_config( + cls, config: ToolConfig, common_config: AgentAndToolsConfig, **kwargs + ) -> ProjectSchedulingGenConfigTool: + llm = kwargs.get("llm", get_llm(common_config.llm)) + fast_llm = kwargs.get("fast_llm", get_llm(common_config.fast_llm)) + fast_llm_token_limit = kwargs.get("fast_llm_token_limit", common_config.fast_llm_token_limit) + + return cls( + llm=llm, + fast_llm=fast_llm, + fast_llm_token_limit=fast_llm_token_limit, + description=config.description.format(**{e.name: e.content for e in config.prompt_inputs}), + prompt_message=config.prompt_message.format(**{e.name: e.content for e in config.prompt_inputs}), + system_context=config.system_context.format(**{e.name: e.content for e in config.prompt_inputs}), + ) + + def _run(self, *args: Any, run_manager: Optional[CallbackManagerForToolRun] = None, **kwargs: Any) -> str: + """Use the tool.""" + + raise NotImplementedError("ProjectSchedulingGenConfigTool does not support sync") + + async def _arun(self, query: str, run_manager: AsyncCallbackManagerForToolRun) -> str: + """Use the tool asynchronously.""" + try: + conv_id = get_conversation_id(run_manager.tags) + + conv_id_config_path_new = Path(OPTIMIZATION_CONFIG_PATH) / f"optimization_config_{conv_id}_new.json" + + if os.path.isfile(conv_id_config_path_new): + current_parameter_config = self.load_yaml_file(conv_id_config_path_new) + else: + current_parameter_config = self.load_yaml_file( + Path(OPTIMIZATION_CONFIG_PATH) / DEFAULT_OPTIMIZATION_CONFIG_NAME + ) + + messages = [ + SystemMessage(content=self.system_context), + HumanMessage( + content=self.prompt_message.format(question=query, parameter_config=current_parameter_config) + ), + ] + response = await self._agenerate_response(messages, discard_fast_llm=False) + is_valid = "json" in response + + if run_manager is not None: + if is_valid: + await run_manager.on_text( + response, + data_type=StreamingDataTypeEnum.APPENDIX, + tool=self.name, + step=1, + title=self.appendix_title, + ) + + self.parse_and_load_output(response=response, conversation_id=conv_id) + else: + await run_manager.on_text( + "no_data", + data_type=StreamingDataTypeEnum.ACTION, + tool=self.name, + step=1, + result=response, + ) + return response + except Exception as e: + if run_manager is not None: + await run_manager.on_tool_error(e, tool=self.name) + return repr(e) + else: + raise e + + def parse_and_load_output(self, response: str, conversation_id: str) -> None: + save_path = Path(OPTIMIZATION_CONFIG_PATH) / f"optimization_config_{conversation_id}_new.json" + response = response.replace("```json", "").replace("`", "").replace("New parameter configuration:", "") + old_config_path = Path(OPTIMIZATION_CONFIG_PATH) / f"optimization_config_{conversation_id}_old.json" + + # if config_new exists, rename it to old config and save new config + if os.path.isfile(save_path): + if os.path.isfile(old_config_path): + os.remove(old_config_path) + os.rename(save_path, old_config_path) + logger.info("Old parameter configuration renamed to {}".format(old_config_path)) + with open(save_path, "w") as file: + file.write(response) + logger.info("New parameter configuration saved to {}".format(save_path)) + + @staticmethod + def load_yaml_file(file_path: Path) -> Any: + with open(file_path, "r") as file: + return yaml.safe_load(file) diff --git a/backend/app/app/services/chat_agent/tools/applications/project_scheduling/generate_optim_input_tool/generate_optim_input_tool.py b/backend/app/app/services/chat_agent/tools/applications/project_scheduling/generate_optim_input_tool/generate_optim_input_tool.py new file mode 100644 index 00000000..3c2d10f7 --- /dev/null +++ b/backend/app/app/services/chat_agent/tools/applications/project_scheduling/generate_optim_input_tool/generate_optim_input_tool.py @@ -0,0 +1,121 @@ +# -*- coding: utf-8 -*- +# mypy: ignore-errors +from __future__ import annotations + +import logging +import os +from pathlib import Path +from typing import Any, Optional + +import yaml +from langchain.callbacks.manager import AsyncCallbackManagerForToolRun, CallbackManagerForToolRun +from langchain.schema import HumanMessage, SystemMessage + +from app.schemas.agent_schema import AgentAndToolsConfig +from app.schemas.streaming_schema import StreamingDataTypeEnum +from app.schemas.tool_schema import ToolConfig +from app.services.chat_agent.helpers.llm import get_llm +from app.services.chat_agent.helpers.utils import get_conversation_id +from app.services.chat_agent.tools.ExtendedBaseTool import ExtendedBaseTool + +logger = logging.getLogger(__name__) + +OPTIMIZATION_CONFIG_PATH = "./app/opt/project_scheduling/config/" +DEFAULT_OPTIMIZATION_INPUT_NAME = "optimization_input.json" + + +class ProjectSchedulingGenOptimInputTool(ExtendedBaseTool): + name = "generate_optim_input_tool" + appendix_title = "Optimization input generator Appendix" + + @classmethod + def from_config( + cls, config: ToolConfig, common_config: AgentAndToolsConfig, **kwargs + ) -> ProjectSchedulingGenOptimInputTool: + llm = kwargs.get("llm", get_llm(common_config.llm)) + fast_llm = kwargs.get("fast_llm", get_llm(common_config.fast_llm)) + fast_llm_token_limit = kwargs.get("fast_llm_token_limit", common_config.fast_llm_token_limit) + + return cls( + llm=llm, + fast_llm=fast_llm, + fast_llm_token_limit=fast_llm_token_limit, + description=config.description.format(**{e.name: e.content for e in config.prompt_inputs}), + prompt_message=config.prompt_message.format(**{e.name: e.content for e in config.prompt_inputs}), + system_context=config.system_context.format(**{e.name: e.content for e in config.prompt_inputs}), + ) + + def _run(self, *args: Any, run_manager: Optional[CallbackManagerForToolRun] = None, **kwargs: Any) -> str: + """Use the tool.""" + + raise NotImplementedError("ProjectSchedulingGenOptimInputTool does not support sync") + + async def _arun(self, query: str, run_manager: AsyncCallbackManagerForToolRun) -> str: + """Use the tool asynchronously.""" + try: + conv_id = get_conversation_id(run_manager.tags) + + conv_id_config_path = Path(OPTIMIZATION_CONFIG_PATH) / f"optimization_input_{conv_id}_new.json" + + if os.path.isfile(conv_id_config_path): + current_parameter_config = self.load_yaml_file(conv_id_config_path) + else: + current_parameter_config = self.load_yaml_file( + Path(OPTIMIZATION_CONFIG_PATH) / DEFAULT_OPTIMIZATION_INPUT_NAME + ) + + messages = [ + SystemMessage(content=self.system_context), + HumanMessage( + content=self.prompt_message.format(question=query, parameter_config=current_parameter_config) + ), + ] + response = await self._agenerate_response(messages, discard_fast_llm=False) + is_valid = "json" in response + + if run_manager is not None: + if is_valid: + await run_manager.on_text( + response, + data_type=StreamingDataTypeEnum.APPENDIX, + tool=self.name, + step=1, + title=self.appendix_title, + ) + + self.parse_and_load_output(response=response, conversation_id=conv_id) + else: + await run_manager.on_text( + "no_data", + data_type=StreamingDataTypeEnum.ACTION, + tool=self.name, + step=1, + result=response, + ) + return response + except Exception as e: + if run_manager is not None: + await run_manager.on_tool_error(e, tool=self.name) + return repr(e) + else: + raise e + + def parse_and_load_output(self, response: str, conversation_id: str) -> None: + save_path = Path(OPTIMIZATION_CONFIG_PATH) / f"optimization_input_{conversation_id}_new.json" + response = response.replace("```json", "").replace("`", "").replace("New parameter configuration:", "") + old_config_path = Path(OPTIMIZATION_CONFIG_PATH) / f"optimization_input_{conversation_id}_old.json" + + # if config_new exists, rename it to old config and save new config + if os.path.isfile(save_path): + if os.path.isfile(old_config_path): + os.remove(old_config_path) + os.rename(save_path, old_config_path) + logger.info("Old opt input renamed to {}".format(old_config_path)) + with open(save_path, "w") as file: + file.write(response) + logger.info("New opt input saved to {}".format(save_path)) + + @staticmethod + def load_yaml_file(file_path: Path) -> Any: + with open(file_path, "r") as file: + return yaml.safe_load(file) diff --git a/backend/app/app/services/chat_agent/tools/applications/project_scheduling/run_code_tool/run_code_tool.py b/backend/app/app/services/chat_agent/tools/applications/project_scheduling/run_code_tool/run_code_tool.py new file mode 100644 index 00000000..2626cb7c --- /dev/null +++ b/backend/app/app/services/chat_agent/tools/applications/project_scheduling/run_code_tool/run_code_tool.py @@ -0,0 +1,55 @@ +# -*- coding: utf-8 -*- +# mypy: ignore-errors +from __future__ import annotations + +import logging +from typing import Any, Optional + +from langchain.callbacks.manager import AsyncCallbackManagerForToolRun, CallbackManagerForToolRun +from langchain.schema import HumanMessage, SystemMessage + +from app.schemas.agent_schema import AgentAndToolsConfig +from app.schemas.tool_schema import ToolConfig +from app.services.chat_agent.helpers.llm import get_llm +from app.services.chat_agent.tools.ExtendedBaseTool import ExtendedBaseTool + +logger = logging.getLogger(__name__) + + +class ProjectSchedulingRunCodeTool(ExtendedBaseTool): + name = "run_code_tool" + + @classmethod + def from_config( + cls, config: ToolConfig, common_config: AgentAndToolsConfig, **kwargs + ) -> ProjectSchedulingRunCodeTool: + llm = kwargs.get("llm", get_llm(common_config.llm)) + fast_llm = kwargs.get("fast_llm", get_llm(common_config.fast_llm)) + return cls( + llm=llm, + fast_llm=fast_llm, + description=config.description.format(**{e.name: e.content for e in config.prompt_inputs}), + prompt_message=config.prompt_message.format(**{e.name: e.content for e in config.prompt_inputs}), + system_context=config.system_context.format(**{e.name: e.content for e in config.prompt_inputs}), + ) + + def _run(self, *args: Any, run_manager: Optional[CallbackManagerForToolRun] = None, **kwargs: Any) -> str: + """Use the tool.""" + + raise NotImplementedError("ProjectSchedulingRunCodeTool does not support sync") + + async def _arun(self, query: str, run_manager: Optional[AsyncCallbackManagerForToolRun] = None) -> str: + """Use the tool asynchronously.""" + try: + messages = [ + SystemMessage(content=self.system_context), + HumanMessage(content=self.prompt_message.format(question=query)), + ] + response = await self._agenerate_response(messages, discard_fast_llm=True, run_manager=run_manager) + return response + except Exception as e: + if run_manager is not None: + await run_manager.on_tool_error(e, tool=self.name) + return repr(e) + else: + raise e diff --git a/backend/app/app/services/chat_agent/tools/applications/project_scheduling/run_optimizer_tool/run_optimizer_tool.py b/backend/app/app/services/chat_agent/tools/applications/project_scheduling/run_optimizer_tool/run_optimizer_tool.py new file mode 100644 index 00000000..81744564 --- /dev/null +++ b/backend/app/app/services/chat_agent/tools/applications/project_scheduling/run_optimizer_tool/run_optimizer_tool.py @@ -0,0 +1,76 @@ +# -*- coding: utf-8 -*- +# mypy: ignore-errors +import logging +from typing import Any, Optional + +from langchain.callbacks.manager import AsyncCallbackManagerForToolRun, CallbackManagerForToolRun + +from app.opt.project_scheduling.run_schedule_optimization import run_scheduling_opt +from app.schemas.agent_schema import AgentAndToolsConfig +from app.schemas.streaming_schema import StreamingDataTypeEnum +from app.schemas.tool_schema import ToolConfig, ToolInputSchema +from app.services.chat_agent.helpers.llm import get_llm +from app.services.chat_agent.helpers.query_formatting import standard_query_format +from app.services.chat_agent.helpers.utils import get_conversation_id +from app.services.chat_agent.tools.ExtendedBaseTool import ExtendedBaseTool + +logger = logging.getLogger(__name__) + + +class ProjectSchedulingRunOptimizerTool(ExtendedBaseTool): + name = "run_optimizer_tool" + appendix_title = "KPIs of optimization run" + + @classmethod + def from_config(cls, config: ToolConfig, common_config: AgentAndToolsConfig, **kwargs): + llm = kwargs.get("llm", get_llm(common_config.llm)) + fast_llm = kwargs.get("fast_llm", get_llm(common_config.fast_llm)) + return cls( + llm=llm, + fast_llm=fast_llm, + description=config.description.format(**{e.name: e.content for e in config.prompt_inputs}), + prompt_message=config.prompt_message.format(**{e.name: e.content for e in config.prompt_inputs}), + system_context=config.system_context.format(**{e.name: e.content for e in config.prompt_inputs}), + ) + + def _run(self, *args: Any, run_manager: Optional[CallbackManagerForToolRun] = None, **kwargs: Any) -> str: + """Use the tool.""" + + raise NotImplementedError("ProjectSchedulingRunOptimizerTool does not support sync") + + async def _arun( + self, + *args: Any, + run_manager: AsyncCallbackManagerForToolRun, + **kwargs: Any, + ) -> str: + """Use the tool asynchronously.""" + query = kwargs.get( + "query", + args[0], + ) + query = standard_query_format(ToolInputSchema.parse_raw(query)) + try: + if run_manager is not None: + logger.info(f"Running Optimization model for {get_conversation_id(run_manager.tags)}") + kpis, graphJSON = run_scheduling_opt(conversationId=get_conversation_id(run_manager.tags)) + + # return kpis as str as input for summarize_kpi_tool + response = str(kpis) + logger.info("KPIs generated: {}".format(response)) + graphJSON = "```plotly" + graphJSON + "```" + + await run_manager.on_text( + graphJSON, + data_type=StreamingDataTypeEnum.APPENDIX, + tool=self.name, + step=1, + title="Visualization of optimization results", + ) + return response + except Exception as e: + if run_manager is not None: + await run_manager.on_tool_error(e, tool=self.name) + return repr(e) + else: + raise e diff --git a/backend/app/app/services/chat_agent/tools/applications/project_scheduling/sql_expert_tool/__init__.py b/backend/app/app/services/chat_agent/tools/applications/project_scheduling/sql_expert_tool/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/backend/app/app/services/chat_agent/tools/applications/project_scheduling/sql_expert_tool/sql_expert_tool.py b/backend/app/app/services/chat_agent/tools/applications/project_scheduling/sql_expert_tool/sql_expert_tool.py new file mode 100644 index 00000000..48045c8d --- /dev/null +++ b/backend/app/app/services/chat_agent/tools/applications/project_scheduling/sql_expert_tool/sql_expert_tool.py @@ -0,0 +1,65 @@ +# -*- coding: utf-8 -*- +# mypy: ignore-errors +from __future__ import annotations + +import logging +from typing import Any, Optional + +from langchain.callbacks.manager import AsyncCallbackManagerForToolRun +from langchain.schema import HumanMessage, SystemMessage + +from app.schemas.agent_schema import AgentAndToolsConfig +from app.schemas.tool_schema import ToolConfig, ToolInputSchema +from app.services.chat_agent.helpers.llm import get_llm +from app.services.chat_agent.helpers.query_formatting import standard_query_format +from app.services.chat_agent.tools.ExtendedBaseTool import ExtendedBaseTool + +logger = logging.getLogger(__name__) + + +class SQLExpertTool(ExtendedBaseTool): + """Expert Tool.""" + + name = "sql_expert_tool" + + @classmethod + def from_config( + cls, + config: ToolConfig, + common_config: AgentAndToolsConfig, + **kwargs: Any, + ) -> SQLExpertTool: + """Create an expert tool from a config.""" + llm = kwargs.get("llm", get_llm(common_config.llm)) + fast_llm = kwargs.get("fast_llm", get_llm(common_config.fast_llm)) + fast_llm_token_limit = kwargs.get("fast_llm_token_limit", common_config.fast_llm_token_limit) + return cls( + llm=llm, + fast_llm=fast_llm, + fast_llm_token_limit=fast_llm_token_limit, + description=config.description.format(**{e.name: e.content for e in config.prompt_inputs}), + prompt_message=config.prompt_message.format(**{e.name: e.content for e in config.prompt_inputs}), + system_context=config.system_context.format(**{e.name: e.content for e in config.prompt_inputs}), + ) + + async def _arun(self, query: str, run_manager: Optional[AsyncCallbackManagerForToolRun] = None) -> str: + """Use the tool asynchronously.""" + try: + query = standard_query_format(ToolInputSchema.parse_raw(query)) + + messages = [ + SystemMessage(content=self.system_context), + HumanMessage(content=self.prompt_message.format(query=query)), + ] + response = await self._agenerate_response(messages, discard_fast_llm=True, run_manager=run_manager) + + logger.info(f"SQL Expert Tool response - {response}") + + return response + + except Exception as e: + if run_manager is not None: + await run_manager.on_tool_error(e, tool=self.name) + return repr(e) + else: + raise e diff --git a/backend/app/app/services/chat_agent/tools/applications/project_scheduling/summarize_config_changes_tool/summarize_config_changes_tool.py b/backend/app/app/services/chat_agent/tools/applications/project_scheduling/summarize_config_changes_tool/summarize_config_changes_tool.py new file mode 100644 index 00000000..3b548440 --- /dev/null +++ b/backend/app/app/services/chat_agent/tools/applications/project_scheduling/summarize_config_changes_tool/summarize_config_changes_tool.py @@ -0,0 +1,90 @@ +# -*- coding: utf-8 -*- +# mypy: ignore-errors +from __future__ import annotations + +import logging +import os +from pathlib import Path +from typing import Any, Optional + +from langchain.callbacks.manager import AsyncCallbackManagerForToolRun, CallbackManagerForToolRun +from langchain.schema import HumanMessage, SystemMessage + +from app.schemas.agent_schema import AgentAndToolsConfig +from app.schemas.tool_schema import ToolConfig +from app.services.chat_agent.helpers.llm import get_llm +from app.services.chat_agent.helpers.utils import get_conversation_id +from app.services.chat_agent.tools.ExtendedBaseTool import ExtendedBaseTool + +logger = logging.getLogger(__name__) + +OPTIMIZATION_CONFIG_PATH = "./app/opt/project_scheduling/config/" +DEFAULT_OPTIMIZATION_CONFIG_NAME = "optimization_config.json" +DEFAULT_OPTIMIZATION_INPUT_NAME = "optimization_input.json" + + +class ProjectSchedulingSummarizeConfigChangesTool(ExtendedBaseTool): + name = "summarize_config_changes_tool" + + @classmethod + def from_config( + cls, config: ToolConfig, common_config: AgentAndToolsConfig, **kwargs + ) -> ProjectSchedulingSummarizeConfigChangesTool: + llm = kwargs.get("llm", get_llm(common_config.llm)) + fast_llm = kwargs.get("fast_llm", get_llm(common_config.fast_llm)) + fast_llm_token_limit = kwargs.get("fast_llm_token_limit", common_config.fast_llm_token_limit) + return cls( + llm=llm, + fast_llm=fast_llm, + fast_llm_token_limit=fast_llm_token_limit, + description=config.description.format(**{e.name: e.content for e in config.prompt_inputs}), + prompt_message=config.prompt_message.format(**{e.name: e.content for e in config.prompt_inputs}), + system_context=config.system_context.format(**{e.name: e.content for e in config.prompt_inputs}), + ) + + def _run(self, *args: Any, run_manager: Optional[CallbackManagerForToolRun] = None, **kwargs: Any) -> str: + """Use the tool.""" + + raise NotImplementedError("ProjectSchedulingSummarizeConfigChangesTool does not support sync") + + async def _arun(self, query: str, run_manager: AsyncCallbackManagerForToolRun) -> str: + """Use the tool asynchronously.""" + try: + old_parameter_input_path = ( + Path(OPTIMIZATION_CONFIG_PATH) / f"optimization_input_{get_conversation_id(run_manager.tags)}_old.json" + ) + + new_parameter_tasks = self.load_config_file( + Path(OPTIMIZATION_CONFIG_PATH) / f"optimization_input_{get_conversation_id(run_manager.tags)}_new.json" + ) + if os.path.isfile(old_parameter_input_path): + current_parameter_tasks = self.load_config_file(old_parameter_input_path) + else: + current_parameter_tasks = self.load_config_file( + Path(OPTIMIZATION_CONFIG_PATH) / DEFAULT_OPTIMIZATION_INPUT_NAME + ) + + messages = [ + SystemMessage(content=self.system_context), + HumanMessage( + content=self.prompt_message.format( + new_parameter_tasks=new_parameter_tasks, + current_parameter_tasks=current_parameter_tasks, + question=query, + ) + ), + ] + response = await self._agenerate_response(messages, discard_fast_llm=True, run_manager=run_manager) + return response + except Exception as e: + if run_manager is not None: + await run_manager.on_tool_error(e, tool=self.name) + return repr(e) + else: + raise e + + @staticmethod + def load_config_file(file_path: Path) -> Any: + print(f"Trying to open file at: {file_path}") + with open(file_path, "r") as file: + return file.read() diff --git a/backend/app/app/services/chat_agent/tools/applications/project_scheduling/summarize_kpi_tool/summarize_kpi_tool.py b/backend/app/app/services/chat_agent/tools/applications/project_scheduling/summarize_kpi_tool/summarize_kpi_tool.py new file mode 100644 index 00000000..575a1f4e --- /dev/null +++ b/backend/app/app/services/chat_agent/tools/applications/project_scheduling/summarize_kpi_tool/summarize_kpi_tool.py @@ -0,0 +1,86 @@ +# -*- coding: utf-8 -*- +# mypy: ignore-errors +from __future__ import annotations + +import logging +from typing import Any, Optional, Union + +from langchain.callbacks.manager import AsyncCallbackManagerForToolRun, CallbackManagerForToolRun +from langchain.schema import HumanMessage, SystemMessage + +from app.schemas.agent_schema import AgentAndToolsConfig +from app.schemas.tool_schema import ToolConfig, ToolInputSchema +from app.services.chat_agent.helpers.llm import get_llm +from app.services.chat_agent.tools.ExtendedBaseTool import ExtendedBaseTool + +logger = logging.getLogger(__name__) + + +class ProjectSchedulingSummarizeKPITool(ExtendedBaseTool): + name = "summarize_kpi_tool" + + @classmethod + def from_config( + cls, + config: ToolConfig, + common_config: AgentAndToolsConfig, + **kwargs: Any, + ) -> ProjectSchedulingSummarizeKPITool: + llm = kwargs.get("llm", get_llm(common_config.llm)) + fast_llm = kwargs.get("fast_llm", get_llm(common_config.fast_llm)) + fast_llm_token_limit = kwargs.get("fast_llm_token_limit", common_config.fast_llm_token_limit) + return cls( + llm=llm, + fast_llm=fast_llm, + fast_llm_token_limit=fast_llm_token_limit, + description=config.description.format(**{e.name: e.content for e in config.prompt_inputs}), + prompt_message=config.prompt_message.format(**{e.name: e.content for e in config.prompt_inputs}), + system_context=config.system_context.format(**{e.name: e.content for e in config.prompt_inputs}), + ) + + def _run( + self, + *args: Any, + run_manager: Optional[CallbackManagerForToolRun] = None, + **kwargs: Any, + ) -> Any: + """Use the tool.""" + + raise NotImplementedError("ProjectSchedulingSummarizeKPITool does not support sync") + + async def _arun(self, query: str, run_manager: Optional[AsyncCallbackManagerForToolRun] = None) -> str: + """Use the tool asynchronously.""" + try: + tool_input = ToolInputSchema.parse_raw(query) + logger.info("tool input summarizer: {}".format(tool_input)) + kpis = tool_input.intermediate_steps["run_optimizer_tool"] + + messages = [ + SystemMessage(content=self.system_context), + HumanMessage(content=self.prompt_message.format(kpi_table=kpis)), + ] + logger.info("Messages generated: {}".format(messages)) + response = await self._agenerate_response(messages, discard_fast_llm=False, run_manager=run_manager) + return response + except Exception as e: + if run_manager is not None: + await run_manager.on_tool_error(e, tool=self.name) + return repr(e) + else: + raise e + + @staticmethod + def load_yaml_file(file_path: str) -> Union[str, None]: + try: + print(f"Trying to open file at: {file_path}") + with open(file_path, "r") as file: + return file.read() + except Exception: + # if error, optimizer has not created plots because there is not new bundles - this can be because the + # optimizer was ran with the same config as base + return None + + @staticmethod + def get_latest_output() -> str: + latest_directory = "app/opt/project_scheduling/output_data/optimization_kpis.csv" + return latest_directory diff --git a/backend/app/app/services/chat_agent/tools/library/__init__.py b/backend/app/app/services/chat_agent/tools/library/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/backend/app/app/services/chat_agent/tools/library/basellm_tool/__init__.py b/backend/app/app/services/chat_agent/tools/library/basellm_tool/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/backend/app/app/services/chat_agent/tools/library/basellm_tool/basellm_tool.py b/backend/app/app/services/chat_agent/tools/library/basellm_tool/basellm_tool.py new file mode 100644 index 00000000..86bdd534 --- /dev/null +++ b/backend/app/app/services/chat_agent/tools/library/basellm_tool/basellm_tool.py @@ -0,0 +1,88 @@ +# -*- coding: utf-8 -*- +# mypy: ignore-errors +from __future__ import annotations + +import logging +from typing import Any, Optional + +from langchain.callbacks.manager import AsyncCallbackManagerForToolRun, CallbackManagerForToolRun +from langchain.schema import HumanMessage, SystemMessage + +from app.schemas.agent_schema import AgentAndToolsConfig +from app.schemas.tool_schema import ToolConfig, ToolInputSchema +from app.services.chat_agent.helpers.llm import get_llm +from app.services.chat_agent.tools.ExtendedBaseTool import ExtendedBaseTool + +logger = logging.getLogger(__name__) + + +class BaseLLM(ExtendedBaseTool): + """BaseLLM Tool.""" + + name = "basellm_tool" + + @classmethod + def from_config( + cls, + config: ToolConfig, + common_config: AgentAndToolsConfig, + **kwargs: Any, + ) -> BaseLLM: + llm = kwargs.get( + "llm", + get_llm(common_config.llm), + ) + fast_llm = kwargs.get( + "fast_llm", + get_llm(common_config.fast_llm), + ) + fast_llm_token_limit = kwargs.get( + "fast_llm_token_limit", + common_config.fast_llm_token_limit, + ) + return cls( + llm=llm, + fast_llm=fast_llm, + fast_llm_token_limit=fast_llm_token_limit, + description=config.description.format(**{e.name: e.content for e in config.prompt_inputs}), + prompt_message=config.prompt_message.format(**{e.name: e.content for e in config.prompt_inputs}), + system_context=config.system_context.format(**{e.name: e.content for e in config.prompt_inputs}), + name=kwargs.get("name", "basellm_tool"), + ) + + def _run( + self, + *args: Any, + run_manager: Optional[CallbackManagerForToolRun] = None, + **kwargs: Any, + ) -> str: + """Use the tool.""" + + raise NotImplementedError("BaseLLM does not support sync") + + async def _arun( + self, + *args: Any, + run_manager: Optional[AsyncCallbackManagerForToolRun] = None, + **kwargs: Any, + ) -> str: + """Use the tool asynchronously.""" + query = kwargs.get( + "query", + args[0], + ) + # Only use the latest human message + query = ToolInputSchema.parse_raw(query).latest_human_message + + try: + messages = [ + SystemMessage(content=self.system_context), + HumanMessage(content=self.prompt_message.format(question=query)), + ] + response = await self._agenerate_response(messages, discard_fast_llm=True, run_manager=run_manager) + return response + except Exception as e: + if run_manager is not None: + await run_manager.on_tool_error(e, tool=self.name) + return repr(e) + raise e diff --git a/backend/app/app/services/chat_agent/tools/library/chain_tool/__init__.py b/backend/app/app/services/chat_agent/tools/library/chain_tool/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/backend/app/app/services/chat_agent/tools/library/chain_tool/nested_meta_agent_tool.py b/backend/app/app/services/chat_agent/tools/library/chain_tool/nested_meta_agent_tool.py new file mode 100644 index 00000000..afb538cd --- /dev/null +++ b/backend/app/app/services/chat_agent/tools/library/chain_tool/nested_meta_agent_tool.py @@ -0,0 +1,134 @@ +# -*- coding: utf-8 -*- +"""Example of a chain nested inside a tool.""" +import logging +from typing import Any, Optional + +from langchain.agents import AgentExecutor +from langchain.base_language import BaseLanguageModel +from langchain.callbacks.manager import AsyncCallbackManagerForToolRun, CallbackManagerForToolRun +from langchain.chains.base import Chain + +from app.schemas.agent_schema import ActionPlan, ActionPlans, AgentAndToolsConfig, AgentConfig +from app.schemas.streaming_schema import StreamingDataTypeEnum +from app.schemas.tool_schema import ToolConfig +from app.services.chat_agent.helpers.llm import get_llm +from app.services.chat_agent.router_agent.SimpleRouterAgent import SimpleRouterAgent +from app.services.chat_agent.tools.ExtendedBaseTool import ExtendedBaseTool +from app.services.chat_agent.tools.tools import get_tools +from app.utils.config_loader import load_agent_config_override + + +def get_chain(llm: BaseLanguageModel, config: AgentConfig) -> Chain: + """create an agent executor to run a SimpleRouterAgent (similar to + create_meta_agent)""" + tools = get_tools(tools=config.tools, load_nested=False) + agent = SimpleRouterAgent.from_llm_and_tools( + tools=tools, + llm=llm, + prompt_message=config.prompt_message, + system_context=config.system_context, + action_plans=config.action_plans, + ) + executor = AgentExecutor.from_agent_and_tools( + agent=agent, # conv_agent, + tools=tools, + verbose=True, + max_iterations=15, + max_execution_time=300, + early_stopping_method="generate", + handle_parsing_errors=True, + ) + return executor + + +class ChainTool(ExtendedBaseTool): + """Chain Tool to run a nested meta agent as a chain.""" + + # define the name of your tool, matching the name in the config + name = "chain_tool" + appendix_title = "Chain Appendix" + agent_config: AgentConfig + + @classmethod + def from_config( + cls, + config: ToolConfig, + common_config: AgentAndToolsConfig, + **kwargs: Any, + ) -> ExtendedBaseTool: + llm = kwargs.get("llm", get_llm(common_config.llm)) + fast_llm = kwargs.get("fast_llm", get_llm(common_config.fast_llm)) + fast_llm_token_limit = kwargs.get("fast_llm_token_limit", common_config.fast_llm_token_limit) + + if config.additional is None: + raise ValueError("Chain Tool requires an additional config for the agent") + + agent_config = load_agent_config_override( + { + "tools": config.additional.tools, + "action_plans": ActionPlans( + action_plans={k: ActionPlan(**v) for k, v in config.additional.action_plans.items()} + ), + "prompt_message": config.prompt_message, + "system_context": config.system_context, + } + ) + # add all custom prompts from your config, below are the standard ones + return cls( + agent_config=agent_config, + llm=llm, + fast_llm=fast_llm, + fast_llm_token_limit=fast_llm_token_limit, + description=config.description.format(**{e.name: e.content for e in config.prompt_inputs}), + prompt_message="", + system_context="", + ) + + def _run( + self, + *args: Any, + run_manager: Optional[CallbackManagerForToolRun] = None, + **kwargs: Any, + ) -> str: + raise NotImplementedError("Tool does not support sync") + + async def _arun( + self, + *args: Any, + run_manager: Optional[AsyncCallbackManagerForToolRun] = None, + **kwargs: Any, + ) -> str: + """Use the tool asynchronously.""" + query = kwargs.get( + "query", + args[0], + ) + try: + # if you want to stream the action signal to the frontend (appears in 'Steps') + if run_manager is not None: + await run_manager.on_text( + "chain_action", data_type=StreamingDataTypeEnum.ACTION, tool=self.name, step=1 + ) + + chain = get_chain(llm=self.llm, config=self.agent_config) + + response = await chain.acall( + { + "input": query, + }, + callbacks=run_manager.get_child() if run_manager else None, + ) + + if run_manager is not None: + # ensure output from second chain is returned to FE + await run_manager.on_text(response["output"], data_type=StreamingDataTypeEnum.LLM) + # if you want to stream the response to an Appendix + + return response["output"] + + except Exception as e: + if run_manager is not None: + logging.exception(e) + await run_manager.on_tool_error(e, tool=self.name) + return repr(e) + raise e diff --git a/backend/app/app/services/chat_agent/tools/library/image_generation_tool/__init__.py b/backend/app/app/services/chat_agent/tools/library/image_generation_tool/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/backend/app/app/services/chat_agent/tools/library/image_generation_tool/image_generation_tool.py b/backend/app/app/services/chat_agent/tools/library/image_generation_tool/image_generation_tool.py new file mode 100644 index 00000000..fe4bdac2 --- /dev/null +++ b/backend/app/app/services/chat_agent/tools/library/image_generation_tool/image_generation_tool.py @@ -0,0 +1,131 @@ +# -*- coding: utf-8 -*- +# mypy: ignore-errors +from __future__ import annotations + +import logging +import os +from typing import Any, Optional + +import openai +from langchain.callbacks.manager import AsyncCallbackManagerForToolRun, CallbackManagerForToolRun +from langchain.schema import HumanMessage, SystemMessage + +from app.schemas.agent_schema import AgentAndToolsConfig +from app.schemas.streaming_schema import StreamingDataTypeEnum +from app.schemas.tool_schema import ToolConfig, ToolInputSchema +from app.services.chat_agent.helpers.llm import get_llm +from app.services.chat_agent.helpers.query_formatting import standard_query_format +from app.services.chat_agent.tools.ExtendedBaseTool import ExtendedBaseTool + +logger = logging.getLogger(__name__) + + +class ImageGenerationTool(ExtendedBaseTool): + """Image Generation Tool.""" + + name = "image_generation_tool" + appendix_title = "Image Appendix" + + @classmethod + def from_config( + cls, + config: ToolConfig, + common_config: AgentAndToolsConfig, + **kwargs: Any, + ) -> ImageGenerationTool: + """Generate an image based on the input from the user.""" + llm = kwargs.get( + "llm", + get_llm(common_config.llm), + ) + fast_llm = kwargs.get( + "fast_llm", + get_llm(common_config.fast_llm), + ) + fast_llm_token_limit = kwargs.get( + "fast_llm_token_limit", + common_config.fast_llm_token_limit, + ) + + return cls( + llm=llm, + fast_llm=fast_llm, + fast_llm_token_limit=fast_llm_token_limit, + description=config.description.format(**{e.name: e.content for e in config.prompt_inputs}), + prompt_message=config.prompt_message.format(**{e.name: e.content for e in config.prompt_inputs}), + system_context=config.system_context.format(**{e.name: e.content for e in config.prompt_inputs}), + ) + + def _run( + self, + *args: Any, + run_manager: Optional[CallbackManagerForToolRun] = None, + **kwargs: Any, + ) -> str: + raise NotImplementedError("Tool does not support sync") + + async def _arun( + self, + *args: Any, + run_manager: Optional[AsyncCallbackManagerForToolRun] = None, + **kwargs: Any, + ) -> str: + """Use the tool asynchronously.""" + query = kwargs.get( + "query", + args[0], + ) + + # Use standard query formatting + query = standard_query_format(ToolInputSchema.parse_raw(query)) + + try: + logger.info("Generating the image") + image_url = self.generate_image(str(query)) + messages = [ + SystemMessage(content=self.system_context), + HumanMessage(content=self.prompt_message.format(description=query)), + ] + response = await self._agenerate_response( + messages, + discard_fast_llm=True, + run_manager=run_manager, + ) + + image_url_link = "```ImageURL" + image_url + "```" + + if run_manager is not None: + await run_manager.on_text( + image_url_link, + data_type=StreamingDataTypeEnum.APPENDIX, + tool=self.name, + step=1, + title=self.appendix_title, + ) + return response + + except Exception as e: + if run_manager is not None: + await run_manager.on_tool_error( + e, + tool=self.name, + ) + return repr(e) + raise e + + @staticmethod + def generate_image( + description: str, + ) -> str: + """Generate an image based on the description.""" + try: + openai.api_key = os.getenv("OPENAI_API_KEY") + response = openai.images.generate( + prompt=description, + n=1, + size="1024x1024", + ) + image_url = str(response.data[0].url) + return image_url + except Exception: + return "ERROR: could not generate the image based on the description: " + description diff --git a/backend/app/app/services/chat_agent/tools/library/pdf_tool/__init__.py b/backend/app/app/services/chat_agent/tools/library/pdf_tool/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/backend/app/app/services/chat_agent/tools/library/pdf_tool/pdf_tool.py b/backend/app/app/services/chat_agent/tools/library/pdf_tool/pdf_tool.py new file mode 100644 index 00000000..49b5063b --- /dev/null +++ b/backend/app/app/services/chat_agent/tools/library/pdf_tool/pdf_tool.py @@ -0,0 +1,206 @@ +# -*- coding: utf-8 -*- +# pylint: disable=no-self-use +# mypy: ignore-errors +from __future__ import annotations + +import logging +from typing import Any, Optional + +from langchain.callbacks.manager import AsyncCallbackManagerForToolRun, CallbackManagerForToolRun +from langchain.schema import Document, HumanMessage, SystemMessage + +from app.core.config import settings +from app.db.vector_db_pdf_ingestion import PDFExtractionPipeline, get_pdf_pipeline +from app.schemas.agent_schema import AgentAndToolsConfig +from app.schemas.streaming_schema import StreamingDataTypeEnum +from app.schemas.tool_schema import RetrievalToolConfig, ToolInputSchema +from app.services.chat_agent.helpers.llm import get_llm +from app.services.chat_agent.tools.ExtendedBaseTool import ExtendedBaseTool +from app.utils.llm import get_token_length + +logger = logging.getLogger(__name__) + + +class PDFTool(ExtendedBaseTool): + """PDF Tool.""" + + name = "pdf_tool" + appendix_title = "PDF Appendix" + pdf_pipeline: PDFExtractionPipeline + + n_docs: int = 2 + + @classmethod + def from_config( + cls, + config: RetrievalToolConfig, + common_config: AgentAndToolsConfig, + **kwargs: Any, + ) -> PDFTool: + """Create a PDF tool from a config.""" + llm = kwargs.get( + "llm", + get_llm(common_config.llm), + ) + fast_llm = kwargs.get( + "fast_llm", + get_llm(common_config.fast_llm), + ) + fast_llm_token_limit = kwargs.get( + "fast_llm_token_limit", + common_config.fast_llm_token_limit, + ) + max_token_length = kwargs.get("max_token_length", common_config.max_token_length) + + if not settings.PDF_TOOL_ENABLED: + raise ValueError( + "The PDF Tool is not enabled. " + "Please set the environment variables to enable it if used in the configuration." + ) + + return cls( + llm=llm, + fast_llm=fast_llm, + fast_llm_token_limit=fast_llm_token_limit, + description=config.description.format(**{e.name: e.content for e in config.prompt_inputs}), + prompt_message=config.prompt_message.format(**{e.name: e.content for e in config.prompt_inputs}), + system_context=config.system_context.format(**{e.name: e.content for e in config.prompt_inputs}), + pdf_pipeline=get_pdf_pipeline(), + n_docs=config.n_docs, + max_token_length=max_token_length, + ) + + def _run( + self, + *args: Any, + run_manager: Optional[CallbackManagerForToolRun] = None, + **kwargs: Any, + ) -> str: + raise NotImplementedError("Tool does not support sync") + + async def _arun( + self, + *args: Any, + run_manager: Optional[AsyncCallbackManagerForToolRun] = None, + **kwargs: Any, + ) -> str: + """Use the tool asynchronously.""" + query = kwargs.get( + "query", + args[0], + ) + try: + logger.info("Filtering relevant documents") + db_pdf_docs = self.pdf_pipeline.run(load_index=True) + + # Filter search query to only include user's questions and remove retrieved docs + tool_input = ToolInputSchema.parse_raw(query) + chat_history = tool_input.chat_history + user_question = tool_input.latest_human_message.split("Tool outputs streamed to the user:")[0].strip() + human_messages = [ + msg.content.split("Tool outputs streamed to the user:")[0].strip() + for msg in chat_history + if msg.type == "human" + ] + search_query = "\n".join([user_question] + human_messages) + + logger.info("Retrieving documents from DB...") + logger.info(f"PDF Tool Search Query - {search_query}") + docs = db_pdf_docs.as_retriever( + search_kwargs={ + "k": self.n_docs, + } # tbd search_kwargs + ).get_relevant_documents(search_query) + + retrieved_docs = "\n\n".join([self._format_doc(doc) for doc in docs]) + sources = [self._format_source(doc) for doc in docs] + uniq_sources = set(sources) + + logger.info(f"PDF Tool {len(sources)} Sources - {sources}") + logger.info(f"PDF Tool Retreived Docs - {retrieved_docs}") + + # Add step in steps view with number of sources and sources + if run_manager is not None: + await run_manager.on_text( + "retreived_sources", + data_type=StreamingDataTypeEnum.ACTION, + tool=self.name, + step=2, + number_sources=len(uniq_sources), + sources=", ".join(uniq_sources), + ) + + # Latest chat history: Get as many chat history messages, + # till `max_number_of_chat_history_messages` + # # of messages limit, or token limit is reached + max_number_of_chat_history_messages = 6 + latest_chat_history = [] + current_token_length = get_token_length(retrieved_docs) + logger.info(f"PDF Tool retreived docs tokens length - {current_token_length}") + + # Iterate backwards through the chat history, adding messages until the token limit is reached + for i, message in enumerate(reversed(chat_history), start=1): + message_token_length = get_token_length(message.content) + if ((current_token_length + message_token_length) > self.max_token_length) or ( + i > max_number_of_chat_history_messages + ): + break + latest_chat_history.append(message) + current_token_length += message_token_length + + logger.info(f"PDF Tool added history messages to chat history with {current_token_length} tokens") + + result = { + "result": retrieved_docs, + "metadata": sources, + "chat_history": latest_chat_history[::-1], # reverse back the chat history + } + return result + + except Exception as e: + if run_manager is not None: + await run_manager.on_tool_error( + e, + tool=self.name, + ) + return repr(e) + raise e + + def _format_source(self, doc: Document) -> str: + source = f"{doc.metadata['source']}" if "source" in doc.metadata else "" + return source + + def _format_doc(self, doc: Document) -> str: + source_label = "Document Source:" + content_label = "Document Content:" + content = doc.page_content + + formatted_doc = f"{source_label} {self._format_source(doc)}\n{content_label}\n{content}" + + return formatted_doc + + async def _aqa_pdf_chunks( + self, + query: str, + docs: str | None = None, + run_manager: Optional[AsyncCallbackManagerForToolRun] = None, + ) -> str: + if run_manager is not None: + await run_manager.on_text( + "qa_pdf_docs", + data_type=StreamingDataTypeEnum.ACTION, + tool=self.name, + step=1, + ) + question_messages = [ + SystemMessage(content=self.system_context), + HumanMessage( + content=self.prompt_message.format( + question=query, + retrieved_docs=docs, + ) + ), + ] + response = await self._agenerate_response(question_messages) + logger.info(response) + return response diff --git a/backend/app/app/services/chat_agent/tools/library/sql_tool/__init__.py b/backend/app/app/services/chat_agent/tools/library/sql_tool/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/backend/app/app/services/chat_agent/tools/library/sql_tool/sql_tool.py b/backend/app/app/services/chat_agent/tools/library/sql_tool/sql_tool.py new file mode 100644 index 00000000..2c24cec3 --- /dev/null +++ b/backend/app/app/services/chat_agent/tools/library/sql_tool/sql_tool.py @@ -0,0 +1,468 @@ +# -*- coding: utf-8 -*- +# mypy: ignore-errors +from __future__ import annotations + +import logging +import re +from typing import Any, List, Optional, Tuple + +from langchain.callbacks.manager import AsyncCallbackManagerForToolRun, CallbackManagerForToolRun +from langchain.schema import HumanMessage, SystemMessage + +from app.core.config import settings +from app.db.session import sql_tool_db +from app.schemas.agent_schema import AgentAndToolsConfig +from app.schemas.streaming_schema import StreamingDataTypeEnum +from app.schemas.tool_schema import SqlToolConfig, ToolInputSchema +from app.services.chat_agent.helpers.llm import get_llm +from app.services.chat_agent.helpers.query_formatting import standard_query_format +from app.services.chat_agent.tools.ExtendedBaseTool import ExtendedBaseTool + +logger = logging.getLogger(__name__) + + +class SQLTool(ExtendedBaseTool): + """SQL Tool.""" + + name = "sql_tool" + appendix_title = "Table Appendix" + + nb_example_rows: int = 3 + validate_empty_results: bool = False + validate_with_llm: bool = False + always_limit_query: bool = False + + @classmethod + def from_config( + cls, + config: SqlToolConfig, + common_config: AgentAndToolsConfig, + **kwargs: Any, + ) -> SQLTool: + """Create a SQL tool from a config.""" + llm = kwargs.get( + "llm", + get_llm(common_config.llm), + ) + fast_llm = kwargs.get( + "fast_llm", + get_llm(common_config.fast_llm), + ) + fast_llm_token_limit = kwargs.get( + "fast_llm_token_limit", + common_config.fast_llm_token_limit, + ) + + SQLTool.check_init(warning=True) + + return cls( + llm=llm, + fast_llm=fast_llm, + fast_llm_token_limit=fast_llm_token_limit, + description=config.description.format(**{e.name: e.content for e in config.prompt_inputs}), + prompt_message=config.prompt_message.format(**{e.name: e.content for e in config.prompt_inputs}), + system_context=config.system_context.format(**{e.name: e.content for e in config.prompt_inputs}), + prompt_selection=config.prompt_selection.format(**{e.name: e.content for e in config.prompt_inputs}) + if config.prompt_selection + else None, + system_context_selection=config.system_context_selection.format( + **{e.name: e.content for e in config.prompt_inputs} + ) + if config.system_context_selection + else None, + prompt_validation=config.prompt_validation.format(**{e.name: e.content for e in config.prompt_inputs}) + if config.prompt_validation + else None, + system_context_validation=config.system_context_validation.format( + **{e.name: e.content for e in config.prompt_inputs} + ) + if config.system_context_validation + else None, + prompt_refinement=config.prompt_refinement.format(**{e.name: e.content for e in config.prompt_inputs}) + if config.prompt_refinement + else None, + nb_example_rows=config.nb_example_rows, + validate_empty_results=config.validate_empty_results, + validate_with_llm=config.validate_with_llm, + always_limit_query=config.always_limit_query, + ) + + @staticmethod + def check_init(warning: bool) -> None: + if not settings.SQL_TOOL_DB_ENABLED: + msg = ( + "The SQL Tool is not enabled. Please set the environment" + " variables to enable it if used in the configuration." + ) + if warning: + logger.warning(msg) + else: + raise ValueError(msg) + if sql_tool_db is None: + msg = "Database is not initialized" + if warning: + logger.warning(msg) + else: + raise ValueError(msg) + elif sql_tool_db.db_info is None: + msg = "Database schema information is not initialized" + if warning: + logger.warning(msg) + else: + raise ValueError(msg) + + def _run( + self, + *args: Any, + run_manager: Optional[CallbackManagerForToolRun] = None, + **kwargs: Any, + ) -> str: + raise NotImplementedError("Tool does not support sync") + + async def _arun( + self, + *args: Any, + run_manager: Optional[AsyncCallbackManagerForToolRun] = None, + **kwargs: Any, + ) -> str: + """Use the tool asynchronously.""" + SQLTool.check_init(warning=False) + + query = kwargs.get( + "query", + args[0], + ) + query = standard_query_format(ToolInputSchema.parse_raw(query)) + try: + filtered_tables = await self._alist_sql_tables( + query, + run_manager, + ) + + logger.info(f"Filtered tables: {filtered_tables}") + + ( + schemas, + response, + ) = await self._aquery_with_schemas( + query, + filtered_tables, + run_manager, + ) + + logger.info(f"resposne: {response}") + logger.info(f"schemas: {schemas}") + + result: str | None = None + retries: int = 0 + is_valid = False + + if schemas == "": + result = "no_data" + + while result is None: + ( + is_valid, + results_str, + complaints, + ) = await self._avalidate_response( + query, + response, + run_manager, + ) + if is_valid or retries > 3: + result = response + logger.info("Validation successful") + else: + response = await self._aimprove_query( + query, + response, + complaints, + schemas, + run_manager, + ) + retries += 1 + + if run_manager is not None: + if is_valid: + await run_manager.on_text( + result, + data_type=StreamingDataTypeEnum.APPENDIX, + tool=self.name, + step=1, + title=self.appendix_title, + ) + return self._construct_final_response( + response, + results_str, + ) + await run_manager.on_text( + "no_data", + data_type=StreamingDataTypeEnum.ACTION, + tool=self.name, + step=1, + result=result, + ) + return result + except Exception as e: + if run_manager is not None: + await run_manager.on_tool_error( + e, + tool=self.name, + ) + return repr(e) + raise e + + @staticmethod + def _construct_final_response( + markdown_sql_query: str, + results_str: str, + ) -> str: + """Construct the final response.""" + return f"{markdown_sql_query}, {results_str}" + + async def _avalidate_response( + self, + question: str, + response: str, + run_manager: Optional[AsyncCallbackManagerForToolRun] = None, + ) -> Tuple[bool, Any, Any]: + """ + Validate the response. + + Returns: + Tuple[bool, List[Any], str]: (is_valid, results_str, complaints) + """ + try: + query = await self._parse_query(response) + if sql_tool_db is None: + raise ValueError("Database is not initialized") + results = sql_tool_db.run_no_str(query) + if results is None: + validation: Tuple[bool, Any, Any] = ( + False, + [], + f"The SQL query did not return any results: {results}", + ) + elif self.validate_empty_results and len(results) == 0: + validation = ( + False, + [], + "The SQL query executed but did not return any result rows.", + ) + else: + sample_rows_result = results[0 : self.nb_example_rows] + sample_rows = list( + map( + lambda ls: [f"{str(i)[:100]}..." if len(str(i)) > 100 else str(i) for i in ls], + sample_rows_result, + ) + ) + sample_rows_str = ";".join([",".join(row) for row in sample_rows]).replace( + "\n", + "", + ) + results_str = ( + f"total rows from SQL query: {len(results)}, first {self.nb_example_rows} rows: {sample_rows_str}" + ) + if self.validate_with_llm: + validation_messages = [ + SystemMessage(content=self.system_context_validation or ""), + HumanMessage( + content=self.prompt_validation.format( + query=response, + result=results_str, + question=question, + ) + if self.prompt_validation + else "" + ), + ] + response = await self._agenerate_response(validation_messages) + validation = await self._parse_validation(response) + else: + validation = ( + True, + results_str, + None, + ) + logger.info(f"Validation: {validation} (success={validation[0]})") + if run_manager is not None: + await run_manager.on_text( + "validate_sql_query", + data_type=StreamingDataTypeEnum.ACTION, + tool=self.name, + step=1, + success=validation[0], + ) + return validation + except Exception as e: + if run_manager is not None: + await run_manager.on_tool_error( + e, + tool=self.name, + ) + return ( + False, + [], + repr(e), + ) + raise e + + async def _aimprove_query( + self, + query: str, + response: str, + complaints: str, + schemas: str, + run_manager: Optional[AsyncCallbackManagerForToolRun] = None, + ) -> str: + """Improve the query async.""" + if run_manager is not None: + await run_manager.on_text( + "improve_sql_query", + data_type=StreamingDataTypeEnum.ACTION, + tool=self.name, + step=1, + ) + improvement_messages = [ + SystemMessage(content=self.system_context), + HumanMessage( + content=self.prompt_refinement.format( + previous_answer=response, + complaints=complaints, + table_schemas=schemas, + question=query, + ) + if self.prompt_refinement + else "" + ), + ] + response = await self._agenerate_response(improvement_messages) + return response + + async def _alist_sql_tables( + self, + query: str, + run_manager: Optional[AsyncCallbackManagerForToolRun] = None, + ) -> List[str]: + """List the SQL tables.""" + if run_manager is not None: + await run_manager.on_text( + "list_tables_sql_db", + data_type=StreamingDataTypeEnum.ACTION, + tool=self.name, + step=1, + ) + table_messages = [ + SystemMessage(content=self.system_context_selection if self.system_context_selection else ""), + HumanMessage(content=self.prompt_selection.format(question=query) if self.prompt_selection else ""), + ] + response = await self._agenerate_response( + table_messages, + discard_fast_llm=True, + ) + filtered_tables = [x.strip() for x in response.split(",")] + logger.info(f"Filtered tables: {filtered_tables}") + return filtered_tables + + async def _aquery_with_schemas( + self, + query: str, + filtered_tables: List[str], + run_manager: Optional[AsyncCallbackManagerForToolRun] = None, + ) -> Tuple[str, str,]: + """Query with schemas.""" + if run_manager is not None: + await run_manager.on_text( + "schema_sql_db", + data_type=StreamingDataTypeEnum.ACTION, + tool=self.name, + step=1, + ) + logger.info(f"Filtered tables: {filtered_tables}") + filtered_tables_upper_case = [x.upper() for x in filtered_tables] + logger.info(f"Filtered tables upper case: {filtered_tables_upper_case}") + db_table_infos = sql_tool_db.db_info.tables if sql_tool_db and sql_tool_db.db_info is not None else [] + logger.info(f"DB table infos: {db_table_infos}") + table_schemas = "\n".join( + [ + ("DB.TABLE name: " + s.name + ", Table structure: " + s.structure) + for s in db_table_infos + if s.name.upper() in filtered_tables_upper_case + ] + ) + logger.info(f"Table schemas1: {table_schemas}") + question_messages = [ + SystemMessage(content=self.system_context), + HumanMessage( + content=self.prompt_message.format( + table_schemas=table_schemas, + question=query, + ) + ), + ] + response = await self._agenerate_response( + question_messages, + discard_fast_llm=True, + ) + logger.info(f"Response: {response}") + + return ( + table_schemas, + response, + ) + + @staticmethod + async def _parse_validation( + response: str, + ) -> Tuple[bool, str, str,]: + """Parse the validation from the response.""" + pattern = r"^Valid:\s*(?Pyes|no)\s*Reason:\s*(?P.*)$" + match = re.search( + pattern, + response, + flags=re.MULTILINE, + ) + + return ( + ("y" in match.group("valid")) if match else False, + "", + match.group("reason") if match else response, + ) + + async def _parse_query( + self, + response: str, + ) -> str: + """Parse the query from the response.""" + response = response.replace( + "\n", + " ", + ).replace( + "\r", + " ", + ) + query_start = response.lower().find("```sql") + if query_start == -1: + query_start = response.lower().find("`sql") + query_end = response.find( + "```", + query_start + 1, + ) + if query_end == -1: + query_end = response.find( + "`", + query_start + 1, + ) + + if query_start == -1 or query_end == -1: + raise ValueError("Could not parse query from response") + query = response[query_start + 6 : query_end] + if self.always_limit_query and "LIMIT" not in query.upper(): + for i in range(3): + if query[len(query) - 1 - i] == ";": + query = query[: -1 - i] + break + query += f" LIMIT {self.nb_example_rows}" + return query diff --git a/backend/app/app/services/chat_agent/tools/library/summarizer_tool/__init__.py b/backend/app/app/services/chat_agent/tools/library/summarizer_tool/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/backend/app/app/services/chat_agent/tools/library/summarizer_tool/summarizer_tool.py b/backend/app/app/services/chat_agent/tools/library/summarizer_tool/summarizer_tool.py new file mode 100644 index 00000000..26ad5b58 --- /dev/null +++ b/backend/app/app/services/chat_agent/tools/library/summarizer_tool/summarizer_tool.py @@ -0,0 +1,125 @@ +# -*- coding: utf-8 -*- +# mypy: ignore-errors +from __future__ import annotations + +import logging +from typing import Any, Optional + +from langchain.callbacks.manager import AsyncCallbackManagerForToolRun, CallbackManagerForToolRun +from langchain.chains.summarize import load_summarize_chain +from langchain.docstore.document import Document +from langchain.prompts import PromptTemplate +from langchain.text_splitter import TokenTextSplitter + +from app.schemas.agent_schema import AgentAndToolsConfig +from app.schemas.tool_schema import ToolConfig, ToolInputSchema +from app.services.chat_agent.helpers.llm import get_llm, get_token_length +from app.services.chat_agent.tools.ExtendedBaseTool import ExtendedBaseTool + +logger = logging.getLogger(__name__) + + +class SummarizerTool(ExtendedBaseTool): + """Summarizer Tool.""" + + name = "summarizer_tool" + + summarize_prompt_template: PromptTemplate + + @classmethod + def from_config( + cls, + config: ToolConfig, + common_config: AgentAndToolsConfig, + **kwargs: Any, + ) -> SummarizerTool: + llm = kwargs.get( + "llm", + get_llm(common_config.llm), + ) + fast_llm = kwargs.get( + "fast_llm", + get_llm(common_config.fast_llm), + ) + fast_llm_token_limit = kwargs.get( + "fast_llm_token_limit", + common_config.fast_llm_token_limit, + ) + max_token_length = kwargs.get( + "max_token_length", + common_config.max_token_length, + ) + prompt_template_message = config.prompt_message.format(**{e.name: e.content for e in config.prompt_inputs}) + return cls( + llm=llm, + fast_llm=fast_llm, + fast_llm_token_limit=fast_llm_token_limit, + description=config.description.format(**{e.name: e.content for e in config.prompt_inputs}), + max_token_length=max_token_length, + system_context=config.system_context.format(**{e.name: e.content for e in config.prompt_inputs}), + prompt_message=config.prompt_message.format(**{e.name: e.content for e in config.prompt_inputs}), + summarize_prompt_template=PromptTemplate( + template=prompt_template_message, + input_variables=["text"], + ), + ) + + def _run( + self, + *args: Any, + run_manager: Optional[CallbackManagerForToolRun] = None, + **kwargs: Any, + ) -> str: + raise NotImplementedError("Tool does not support sync") + + async def _arun( + self, + *args: Any, + run_manager: Optional[AsyncCallbackManagerForToolRun] = None, + **kwargs: Any, + ) -> str: + """Use the tool asynchronously.""" + query = kwargs.get( + "query", + args[0], + ) + try: + callbacks = run_manager.get_child() if run_manager else None + tool_input = ToolInputSchema.parse_raw(query) + tool_outputs = [f"{k}: {v}" for k, v in tool_input.intermediate_steps.items()] + assert self.max_token_length is not None, "max_token_length must not be None" + if get_token_length(query) <= self.max_token_length: + docs = [Document(page_content=tool_output) for tool_output in tool_outputs] + chain = load_summarize_chain( + self.llm, + chain_type="stuff", + prompt=self.summarize_prompt_template, + ) + else: + logger.info("Splitting text into chunks") + text_splitter = TokenTextSplitter( + chunk_size=10, + chunk_overlap=0, + ) + texts = [text for tool_output in tool_outputs for text in text_splitter.split_text(tool_output)] + docs = [Document(page_content=t) for t in texts] + chain = load_summarize_chain( + self.llm, + chain_type="map_reduce", + map_prompt=self.summarize_prompt_template, + combine_prompt=self.summarize_prompt_template, + ) + + response = await chain.arun( + docs, + callbacks=callbacks, + ) + return response + except Exception as e: + if run_manager is not None: + await run_manager.on_tool_error( + e, + tool=self.name, + ) + return repr(e) + raise e diff --git a/backend/app/app/services/chat_agent/tools/library/visualizer_tool/__init__.py b/backend/app/app/services/chat_agent/tools/library/visualizer_tool/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/backend/app/app/services/chat_agent/tools/library/visualizer_tool/visualizer_tool.py b/backend/app/app/services/chat_agent/tools/library/visualizer_tool/visualizer_tool.py new file mode 100644 index 00000000..9e777b66 --- /dev/null +++ b/backend/app/app/services/chat_agent/tools/library/visualizer_tool/visualizer_tool.py @@ -0,0 +1,130 @@ +# -*- coding: utf-8 -*- +# mypy: ignore-errors +from __future__ import annotations + +import logging +from typing import Any, Optional + +from langchain.callbacks.manager import AsyncCallbackManagerForToolRun, CallbackManagerForToolRun +from langchain.schema import HumanMessage, SystemMessage + +from app.schemas.agent_schema import AgentAndToolsConfig +from app.schemas.streaming_schema import StreamingDataTypeEnum +from app.schemas.tool_schema import ToolConfig, ToolInputSchema +from app.services.chat_agent.helpers.llm import get_llm +from app.services.chat_agent.tools.ExtendedBaseTool import ExtendedBaseTool + +logger = logging.getLogger(__name__) + + +class JsxVisualizerTool(ExtendedBaseTool): + """Jsx Visualizer Tool.""" + + name = "visualizer_tool" + appendix_title = "Visualisation Appendix" + + @classmethod + def from_config( + cls, + config: ToolConfig, + common_config: AgentAndToolsConfig, + **kwargs: Any, + ) -> JsxVisualizerTool: + llm = kwargs.get( + "llm", + get_llm(common_config.llm), + ) + fast_llm = kwargs.get( + "fast_llm", + get_llm(common_config.fast_llm), + ) + fast_llm_token_limit = kwargs.get( + "fast_llm_token_limit", + common_config.fast_llm_token_limit, + ) + return cls( + llm=llm, + fast_llm=fast_llm, + fast_llm_token_limit=fast_llm_token_limit, + description=config.description.format(**{e.name: e.content for e in config.prompt_inputs}), + prompt_message=config.prompt_message.format(**{e.name: e.content for e in config.prompt_inputs}), + system_context=config.system_context.format(**{e.name: e.content for e in config.prompt_inputs}), + ) + + def _run( + self, + *args: Any, + run_manager: Optional[CallbackManagerForToolRun] = None, + **kwargs: Any, + ) -> str: + raise NotImplementedError("Tool does not support sync") + + async def _arun( + self, + *args: Any, + run_manager: Optional[AsyncCallbackManagerForToolRun] = None, + **kwargs: Any, + ) -> str: + """Use the tool asynchronously.""" + query = kwargs.get( + "query", + args[0], + ) + + try: + if run_manager is not None: + await run_manager.on_text( + "build_visualization", + data_type=StreamingDataTypeEnum.ACTION, + tool=self.name, + step=1, + ) + + tool_input = ToolInputSchema.parse_raw(query) + if "sql_tool" in tool_input.intermediate_steps: + results = tool_input.intermediate_steps["sql_tool"] + else: # no intermediate steps when using memory + results = tool_input.chat_history[-1].content + logger.info(f"Viz results: {results}") + messages = [ + SystemMessage(content=self.system_context.format()), + HumanMessage( + content=self.prompt_message.format( + question=tool_input.latest_human_message, + results=results, + ) + ), + ] + result = await self._agenerate_response( + messages, + discard_fast_llm=True, + ) + + is_valid = "jsx" in result + + if run_manager is not None: + if is_valid: + await run_manager.on_text( + result, + data_type=StreamingDataTypeEnum.APPENDIX, + tool=self.name, + step=1, + title=self.appendix_title, + ) + else: + await run_manager.on_text( + "no_data", + data_type=StreamingDataTypeEnum.ACTION, + tool=self.name, + step=1, + result=result, + ) + return result + except Exception as e: + if run_manager is not None: + await run_manager.on_tool_error( + e, + tool=self.name, + ) + return repr(e) + raise e diff --git a/backend/app/app/services/chat_agent/tools/tools.py b/backend/app/app/services/chat_agent/tools/tools.py new file mode 100644 index 00000000..4035ac75 --- /dev/null +++ b/backend/app/app/services/chat_agent/tools/tools.py @@ -0,0 +1,132 @@ +# -*- coding: utf-8 -*- +# pylint: disable=cyclic-import +from typing import List, Tuple, Type + +from langchain.tools import BaseTool + +from app.services.chat_agent.tools.applications.project_scheduling.clarify_tool.clarify_tool import ( + ProjectSchedulingClarifyTool, +) +from app.services.chat_agent.tools.applications.project_scheduling.code_expert_tool.code_expert_tool import ( + CodeExpertTool, +) +from app.services.chat_agent.tools.applications.project_scheduling.code_search_tool.code_search_tool import ( + CodeSearchTool, +) +from app.services.chat_agent.tools.applications.project_scheduling.generate_config_tool.generate_config_tool import ( + ProjectSchedulingGenConfigTool, +) +from app.services.chat_agent.tools.applications.project_scheduling.generate_optim_input_tool.generate_optim_input_tool import ( # noqa: E501 + ProjectSchedulingGenOptimInputTool, +) +from app.services.chat_agent.tools.applications.project_scheduling.run_optimizer_tool.run_optimizer_tool import ( + ProjectSchedulingRunOptimizerTool, +) +from app.services.chat_agent.tools.applications.project_scheduling.sql_expert_tool.sql_expert_tool import SQLExpertTool +from app.services.chat_agent.tools.applications.project_scheduling.summarize_config_changes_tool.summarize_config_changes_tool import ( # noqa: E501 + ProjectSchedulingSummarizeConfigChangesTool, +) +from app.services.chat_agent.tools.applications.project_scheduling.summarize_kpi_tool.summarize_kpi_tool import ( + ProjectSchedulingSummarizeKPITool, +) +from app.services.chat_agent.tools.ExtendedBaseTool import ExtendedBaseTool +from app.services.chat_agent.tools.library.basellm_tool.basellm_tool import BaseLLM +from app.services.chat_agent.tools.library.image_generation_tool.image_generation_tool import ImageGenerationTool +from app.services.chat_agent.tools.library.pdf_tool.pdf_tool import PDFTool +from app.services.chat_agent.tools.library.sql_tool.sql_tool import SQLTool +from app.services.chat_agent.tools.library.summarizer_tool.summarizer_tool import SummarizerTool +from app.services.chat_agent.tools.library.visualizer_tool.visualizer_tool import JsxVisualizerTool +from app.utils.config_loader import get_agent_config + + +def get_nested_classes() -> List[Tuple[str, Type[ExtendedBaseTool]]]: + """separated to avoid circular imports.""" + from app.services.chat_agent.tools.library.chain_tool.nested_meta_agent_tool import ( # pylint: disable=import-outside-toplevel # noqa:E501 + ChainTool, + ) + + nested_classes = [ + ("chain_tool", ChainTool), + ] + return nested_classes # type: ignore + + +def get_tools(tools: List[str], load_nested: bool = True) -> List[BaseTool]: + """ + Retrieves the tools based on a list of tool names. + + This function takes a list of tool names and returns a list of BaseTool objects. + It first gets the agent configuration and a list of all available tool classes. It then creates a list of all tools + specified in the agent configuration. If any tool name in the input list is not in the list of all tools, + it raises a ValueError. + + Args: + tools (list[str]): The list of tool names. + load_nested (bool): Whether to load nested chains too. Included to avoid circular imports + + Returns: + list[BaseTool]: The list of BaseTool objects. + + Raises: + ValueError: If any tool name in the input list is not in the list of all tools. + """ + agent_config = get_agent_config() + all_tool_classes = [ + ( + "sql_tool", + SQLTool, + ), + ( + "visualizer_tool", + JsxVisualizerTool, + ), + ( + "summarizer_tool", + SummarizerTool, + ), + ( + "pdf_tool", + PDFTool, + ), + ( + "image_generation_tool", + ImageGenerationTool, + ), + ("clarify_tool", BaseLLM), + ("visualizer_tool", JsxVisualizerTool), + ("summarizer_tool", SummarizerTool), + ("expert_tool", BaseLLM), + ("entertainer_tool", BaseLLM), + ("generate_config_tool", ProjectSchedulingGenConfigTool), + ("generate_optim_input_tool", ProjectSchedulingGenOptimInputTool), + ("run_optimizer_tool", ProjectSchedulingRunOptimizerTool), + ("summarize_config_changes_tool", ProjectSchedulingSummarizeConfigChangesTool), + ("summarize_kpi_tool", ProjectSchedulingSummarizeKPITool), + ("clarify_tool", ProjectSchedulingClarifyTool), + ("pdf_tool", PDFTool), + ("sql_tool", SQLTool), + ("sql_expert_tool", SQLExpertTool), + ("visualizer_tool", JsxVisualizerTool), + ("code_search_tool", CodeSearchTool), + ("code_expert_tool", CodeExpertTool), + ] + if load_nested: + all_tool_classes.extend(get_nested_classes()) + all_tools: list[ExtendedBaseTool] = [ + c.from_config( # type: ignore + config=agent_config.tools_library.library[name], + common_config=agent_config.common, + **({"name": name} if issubclass(c, BaseLLM) else {}), + ) + for ( + name, + c, + ) in all_tool_classes + if name in agent_config.tools + ] + tools_map = {tool.name: tool for tool in all_tools} + + if any(tool_name not in tools_map for tool_name in tools): + raise ValueError(f"Invalid tool name(s): {[tool_name for tool_name in tools if tool_name not in tools_map]}") + + return [tools_map[tool_name] for tool_name in tools] diff --git a/backend/app/app/tool_constants/pdf_data/117764782-Aerosmith.pdf b/backend/app/app/tool_constants/pdf_data/117764782-Aerosmith.pdf new file mode 100644 index 00000000..44135264 Binary files /dev/null and b/backend/app/app/tool_constants/pdf_data/117764782-Aerosmith.pdf differ diff --git a/backend/app/app/tool_constants/pdf_data/253814116-Led-Zeppelin.pdf b/backend/app/app/tool_constants/pdf_data/253814116-Led-Zeppelin.pdf new file mode 100644 index 00000000..69bac506 Binary files /dev/null and b/backend/app/app/tool_constants/pdf_data/253814116-Led-Zeppelin.pdf differ diff --git a/backend/app/app/tool_constants/pdf_data/423121661-Black-Sabbath-PDFDrive-com-pdf.pdf b/backend/app/app/tool_constants/pdf_data/423121661-Black-Sabbath-PDFDrive-com-pdf.pdf new file mode 100644 index 00000000..1447b907 Binary files /dev/null and b/backend/app/app/tool_constants/pdf_data/423121661-Black-Sabbath-PDFDrive-com-pdf.pdf differ diff --git a/backend/app/app/tool_constants/pdf_data/henderson-agm-nohm1.pdf b/backend/app/app/tool_constants/pdf_data/henderson-agm-nohm1.pdf new file mode 100644 index 00000000..eb0d7b0a Binary files /dev/null and b/backend/app/app/tool_constants/pdf_data/henderson-agm-nohm1.pdf differ diff --git a/backend/app/app/tool_constants/pdf_data/history_of_acdc_band.pdf b/backend/app/app/tool_constants/pdf_data/history_of_acdc_band.pdf new file mode 100644 index 00000000..bb577da3 Binary files /dev/null and b/backend/app/app/tool_constants/pdf_data/history_of_acdc_band.pdf differ diff --git a/backend/app/app/tool_constants/public_demo_data/CONTRIBUTING.md b/backend/app/app/tool_constants/public_demo_data/CONTRIBUTING.md new file mode 100644 index 00000000..0b6234bc --- /dev/null +++ b/backend/app/app/tool_constants/public_demo_data/CONTRIBUTING.md @@ -0,0 +1,29 @@ +# Contributing to AgentKit + +We want to make contributing to this project as easy and transparent as possible, whether it's: +- Reporting a bug and ideally submitting a fix +- Proposing new features +- Adding a tool to the library + +## Guidelines +We use Github to host code, to track issues and feature requests, as well as accept pull requests. + +We actively welcome your pull requests: +1. Fork the repo and create your branch from `develop`. +2. If you've changed key features (tools, APIs etc), update the documentation. +3. Ensure the code is clean: passes the set of tests, lints etc. +5. Issue a pull request to the main repo + +## Report bugs and add feature requests using Github issues +Please not that *currently* there is no central team working on this repository that is actively resolving bugs and responding to feature requests. + +### Bugs: +Provide +1) Summary of the issue +2) Steps to reproduce +3) What you expected vs what actually happened +4) Any notes on why you think this might be happening or things you tried that didn't work + + +### Features: +Provide a description of the feature you would like. You're encouraged to build it yourself and open a PR :-) diff --git a/backend/app/app/tool_constants/public_demo_data/README.md b/backend/app/app/tool_constants/public_demo_data/README.md new file mode 100644 index 00000000..5ad99351 --- /dev/null +++ b/backend/app/app/tool_constants/public_demo_data/README.md @@ -0,0 +1,77 @@ +AgentKit logo + +# AgentKit: rapidly build Agent apps +AgentKit is a LangChain-based toolkit developed by BCG X to build Agent apps. Key advantages of the AgentKit framework include: +- 🚀 **Quickly build high quality Agent apps**: Build a strong demo in a few hours using a modular, easy to configure tech stack based on FastAPI/Nextjs and a library of useful GenAI tools +- 💻 **Flexible, reactive UI/UX designed for Agents**: React/Nextjs chat-based UI that is easy to configure, with features such as streaming, rendering of tables/visualizations/code, status of Agent actions and more +- 🛡️ **Focus on reliability**: Easy to configure routing architecture gives control of possible paths Agent can take, increasing reliability and making it suited for real-life use cases + +[Placeholder for demo video] + +## Quickstart +For a quick setup of AgentKit, use the steps below, where both the backend app and frontend app are run inside a Docker container. More elaborate setup instructions can be found at [setup.md](docs/setup.md). + +### Prerequisites +- Docker: https://www.docker.com/get-started + +### Installation steps +1. Clone the repository containing the source code for the backend and frontend apps. + +2. Copy the `frontend/.env.example` file in the frontend directory and change the name to `.env`. Also, copy the `.env.example` file in the root directory of the repository and change the name to `.env`. + - Change the OPENAI_API_KEY and OPENAI_ORGANIZATION to your own (n.b. OPENAI_ORGANIZATION should be your OpenAI 'Organization ID') + +3. In the terminal, navigate to the root directory of the cloned repository. Build and start the Docker containers with the following command: + ``` + docker-compose -f docker-compose.yml up -d + ``` + Wait for the containers to build and start, which may take a few minutes depending on your system. Once the containers are up and running, you can access the apps in your browser at [http://localhost](http://localhost/). + +## Chinook music database demo +- Ensure you are on the `develop` branch +- Follow the installation instructions above and run the app +- Try the prompt "When was AC/DC founded?" to see AgentKit in action! + +## Set up your own app +- Configure your Agent and Tools [link](docs/configure_agent_and_tools.md) +- (Optional) Adjust the UI to your use case [link](docs/configure_ui.md) +- (Optional) Set up evaluation with LangSmith [link](docs/evaluation.md) + +## Documentation +- [Installation instructions for running frontend or entire app outside Docker](docs/setup_development.md) +- [Key concepts](docs/key_concepts.md) +- [Agent configuration](docs/configure_agent.md) +- [UI configuration](docs/configure_ui.md) +- [Optional features](docs/optional_features.md) +- [Tool library](docs/tool_library.md) + +## How it works + +### Reliability +AgentKit attempts to solve the reliability issue of agents such as ReAct agents by constraining the potential routes the agent can take to a pre-configured sets of routes, or **Action Plans**. Since for many use cases the potential routes the agent can take are known, we can use our human domain expertise to steer the agent in the right direction, and reduce it going into unexpected directions or rabbit holes. This is achieved by combining a **Meta Agent** with **Action Plans**: A set of tools which are executed linearily and in parallel, similar to a Chain. The Meta Agent takes in the user prompt and outputs the most suited Action Plan to generate an answer. Note: implementing multiple Meta Agents is possible, generating a tree of possible routes. + +### User experience +To optimize user experience, the intermediary output of every step in the Action Plan can be shown to the user. For example, consider an Action Plan consisting of 2 toolsets: `[[sql_tool, pdf_tool], [generate_summary_tool, visualize_tool]]`. In the first action step, information from a SQL database and a vector database with embedded PDFs are retrieved in parallel. The retrieved data and most relevant PDF are streamed to the UI as soon as the first action step finishes. In the second action step, the output from step 1 is passed to a tool that generates a text summary and a tool that creates a JSX visualization from the data, which is streamed to the UI to create the final answer. + +For a high level overview of the routing flow and connection the UI, please see below diagram: +AgentKit framework + +## Additional optional features + +- **Feedback integration**: allow users to give feedback on generated answers by showing a pop up after each message with quantitative (thumbs up/down) and qualitative (comment) feedback + +[placeholder for picture of feedback feature] + +- **User settings**: Allow users to specify default settings in the app that can be used to customize prompts for the user + +[placeholder for picture of settings feature] + +- **User authentication**: Enable NextAuth on your app to authenticate users with Github or with email/password + +[placeholder for picture of authentication feature] + +See [optional feature documentation](docs/optional_features.md) for more detailed info. + +## Contributors + +[Placeholder for contributor list] +Please read `CONTRIBUTING.md` for more details on how to contribute. diff --git a/backend/app/app/tool_constants/public_demo_data/agent_x_to_ingest/chat_agent/__init__.py b/backend/app/app/tool_constants/public_demo_data/agent_x_to_ingest/chat_agent/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/backend/app/app/tool_constants/public_demo_data/agent_x_to_ingest/chat_agent/helpers/__init__.py b/backend/app/app/tool_constants/public_demo_data/agent_x_to_ingest/chat_agent/helpers/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/backend/app/app/tool_constants/public_demo_data/agent_x_to_ingest/chat_agent/helpers/llm.py b/backend/app/app/tool_constants/public_demo_data/agent_x_to_ingest/chat_agent/helpers/llm.py new file mode 100644 index 00000000..5388a881 --- /dev/null +++ b/backend/app/app/tool_constants/public_demo_data/agent_x_to_ingest/chat_agent/helpers/llm.py @@ -0,0 +1,53 @@ +# -*- coding: utf-8 -*- +import logging +from typing import Optional + +from langchain.base_language import BaseLanguageModel +from langchain.chat_models import AzureChatOpenAI, ChatOpenAI + +from app.core.config import settings +from app.schemas.tool_schema import LLMType + +logger = logging.getLogger(__name__) + + +def get_llm(llm: LLMType, api_key: Optional[str] = settings.OPENAI_API_KEY) -> BaseLanguageModel: + """Get the LLM instance for the given LLM type.""" + match llm: + case "azure-3.5": + if settings.OPENAI_API_BASE is None: + raise ValueError("OPENAI_API_BASE must be set to use Azure LLM") + return AzureChatOpenAI( + openai_api_base=settings.OPENAI_API_BASE, + openai_api_version="2023-03-15-preview", + deployment_name="rnd-gpt-35-turbo", + openai_api_key=api_key if api_key is not None else settings.OPENAI_API_KEY, + openai_api_type="azure", + streaming=True, + ) + case "gpt-3.5-turbo": + return ChatOpenAI( + temperature=0, + model_name="gpt-3.5-turbo", + openai_organization=settings.OPENAI_ORGANIZATION, + openai_api_key=api_key if api_key is not None else settings.OPENAI_API_KEY, + streaming=True, + ) + case "gpt-4": + return ChatOpenAI( + temperature=0, + model_name="gpt-4", + openai_organization=settings.OPENAI_ORGANIZATION, + openai_api_key=api_key if api_key is not None else settings.OPENAI_API_KEY, + streaming=True, + ) + # If an exact match is not confirmed, this last case will be used if provided + case _: + logger.warning(f"LLM {llm} not found, using default LLM") + return ChatOpenAI( + temperature=0, + model_name="gpt-4", + openai_organization=settings.OPENAI_ORGANIZATION, + openai_api_key=settings.OPENAI_API_KEY, + streaming=True, + ) diff --git a/backend/app/app/tool_constants/public_demo_data/agent_x_to_ingest/chat_agent/helpers/utils.py b/backend/app/app/tool_constants/public_demo_data/agent_x_to_ingest/chat_agent/helpers/utils.py new file mode 100644 index 00000000..529f33fb --- /dev/null +++ b/backend/app/app/tool_constants/public_demo_data/agent_x_to_ingest/chat_agent/helpers/utils.py @@ -0,0 +1,16 @@ +# -*- coding: utf-8 -*- +import logging +from itertools import groupby +from operator import itemgetter +from typing import Dict, List, Tuple, TypeVar + +import tiktoken + +logger = logging.getLogger(__name__) + + +def get_token_length(string: str, model="gpt-4") -> int: + """Get the token length of a string for a given model.""" + enc = tiktoken.encoding_for_model(model) + encoded = enc.encode(string) + return len(encoded) diff --git a/backend/app/app/tool_constants/public_demo_data/agent_x_to_ingest/chat_agent/meta_agent.py b/backend/app/app/tool_constants/public_demo_data/agent_x_to_ingest/chat_agent/meta_agent.py new file mode 100644 index 00000000..7e81376a --- /dev/null +++ b/backend/app/app/tool_constants/public_demo_data/agent_x_to_ingest/chat_agent/meta_agent.py @@ -0,0 +1,72 @@ +# -*- coding: utf-8 -*- +from typing import List, Union + +from langchain.agents import AgentExecutor +from langchain.memory import ChatMessageHistory, ConversationTokenBufferMemory +from langchain.schema import AIMessage, HumanMessage + +from app.core.config import settings +from app.schemas.agent_schema import AgentConfig +from app.services.chat_agent.helpers.llm import get_llm +from app.services.chat_agent.router_agent.SimpleRouterAgent import SimpleRouterAgent +from app.services.chat_agent.tools.tools import get_tools +from app.utils.config_loader import get_agent_config + + +def get_conv_token_buffer_memory( + chat_messages: List[Union[AIMessage, HumanMessage]], api_key: str +) -> ConversationTokenBufferMemory: + """Get a ConversationTokenBufferMemory from a list of chat messages.""" + agent_config = get_agent_config() + llm = get_llm(agent_config.default_llm, api_key=api_key) + chat_history = ChatMessageHistory(memory_key="chat_history") + memory = ConversationTokenBufferMemory( + memory_key="chat_history", + return_messages=True, + max_token_limit=2000, + llm=llm, + chat_memory=chat_history, + ) + + i = 0 + while i < len(chat_messages): + if isinstance(chat_messages[i], HumanMessage): + if isinstance(chat_messages[i + 1], AIMessage): + memory.save_context( + inputs={"input": chat_messages[i].content}, + outputs={"output": chat_messages[i + 1].content}, + ) + i += 1 + else: + memory.save_context(inputs={"input": chat_messages[i].content}, outputs={"output": ""}) + i += 1 + + return memory + + +def create_meta_agent(agent_config: AgentConfig) -> AgentExecutor: + """Create a meta agent from a config.""" + api_key = agent_config.API_KEY + if api_key == "": + api_key = settings.OPENAI_API_KEY + + llm = get_llm(agent_config.default_llm, api_key=api_key) + fast_llm = get_llm(agent_config.default_fast_llm, api_key=api_key) + + tools = get_tools(tools=agent_config.tools, llm=llm, fast_llm=fast_llm) + simple_router_agent = SimpleRouterAgent.from_llm_and_tools( + tools=tools, + llm=llm, + prompt_message=agent_config.prompt_message, + system_context=agent_config.system_context, + action_plans=agent_config.action_plans, + ) + return AgentExecutor.from_agent_and_tools( + agent=simple_router_agent, + tools=tools, + verbose=True, + max_iterations=15, + max_execution_time=300, + early_stopping_method="generate", + handle_parsing_errors=True, + ) diff --git a/backend/app/app/tool_constants/public_demo_data/agent_x_to_ingest/chat_agent/router_agent/SimpleRouterAgent.py b/backend/app/app/tool_constants/public_demo_data/agent_x_to_ingest/chat_agent/router_agent/SimpleRouterAgent.py new file mode 100644 index 00000000..213c72cb --- /dev/null +++ b/backend/app/app/tool_constants/public_demo_data/agent_x_to_ingest/chat_agent/router_agent/SimpleRouterAgent.py @@ -0,0 +1,160 @@ +# -*- coding: utf-8 -*- +import logging +from typing import Any, List, Optional, Tuple, Union + +import openai +from langchain.agents import BaseMultiActionAgent +from langchain.base_language import BaseLanguageModel +from langchain.callbacks.manager import Callbacks +from langchain.chains.llm import LLMChain +from langchain.prompts.base import BasePromptTemplate +from langchain.prompts.chat import ( + ChatPromptTemplate, + HumanMessagePromptTemplate, + MessagesPlaceholder, + SystemMessagePromptTemplate, +) +from langchain.schema import AgentAction, AgentFinish +from langchain.tools import BaseTool + +from app.schemas.agent_schema import ActionPlan, ActionPlans +from app.schemas.tool_schema import ToolInputSchema + +logger = logging.getLogger(__name__) + + +class SimpleRouterAgent(BaseMultiActionAgent): + """Simple Router Agent.""" + + tools: List[BaseTool] + llm_chain: LLMChain + + action_plans: ActionPlans(action_plans={}) + action_plan: Optional[ActionPlan] = None + + @property + def input_keys(self): + return ["input", "chat_history"] + + def plan( + self, intermediate_steps: List[Tuple[AgentAction, str]], **kwargs: Any + ) -> Union[List[AgentAction], AgentFinish]: + """ + Given input, decided what to do. + + Args: + intermediate_steps: Steps the LLM has taken to date, + along with observations + **kwargs: User inputs. + + Returns: + Action specifying what tool to use. + """ + raise NotImplementedError("SimpleRouterAgent does not support sync") + + async def aplan( + self, + intermediate_steps: List[Tuple[AgentAction, str]], + callbacks: Callbacks | None = None, + **kwargs: Any, + ) -> Union[List[AgentAction], AgentFinish]: + """ + Given input, decided what to do. + + Args: + intermediate_steps: Steps the LLM has taken to date, + along with observations + callbacks: Callbacks to run. + **kwargs: User inputs. + + Returns: + Action specifying what tool to use. + """ + # Router agent makes initial template + retries = 0 + while self.action_plan is None: + try: + full_output = await self.llm_chain.apredict(**kwargs) + action_plan = self.action_plans.action_plans[full_output] + self.action_plan = action_plan + logger.info(f"Action plan selected: {full_output}, {str(action_plan)}") + except openai.error.AuthenticationError as e: + retries += 1 + if retries > 3: + raise ValueError( + "Oops! It seems like your OPENAPI key is invalid. Please check your Settings." + ) from e + except Exception as e: + retries += 1 + if retries > 3: + raise ValueError(f"Invalid action plan selected ({retries}x)") from e + + # Router agent follows action plan + if len(self.action_plan.actions) > 0: + next_actions = self.action_plan.actions.pop(0) + tool_input = ToolInputSchema( + latest_human_message=kwargs["input"], + chat_history=[], + user_settings=kwargs["user_settings"], + intermediate_steps={}, + ) + if len(intermediate_steps) > 0: + tool_appendix_titles = {tool.name: getattr(tool, "appendix_title", "") for tool in self.tools} + tool_input.intermediate_steps = { + tool_appendix_titles[step[0].tool]: step[1] for step in intermediate_steps + } + elif "memory" in next_actions and "chat_history" in kwargs: + tool_input.chat_history = kwargs["chat_history"] + + tool_input_str = tool_input.json() + actions = [AgentAction(tool=a, tool_input=tool_input_str, log="") for a in next_actions if a != "memory"] + return actions + # Router agent is done + else: + output = "\n\n".join([f"{step[0].tool}:\n{step[1]}" for step in intermediate_steps]) + return AgentFinish(return_values={"output": output}, log="") + + @classmethod + def create_prompt( + cls, + prompt_message: str, + system_context: str, + action_plans: ActionPlans, + ) -> BasePromptTemplate: + """Create a prompt for the router agent.""" + messages = [ + SystemMessagePromptTemplate.from_template( + system_context.format( + action_plans="\n".join([f"{k}: {v.description}" for k, v in action_plans.action_plans.items()]) + ) + ), + MessagesPlaceholder(variable_name="chat_history"), + HumanMessagePromptTemplate.from_template(prompt_message), + ] + return ChatPromptTemplate(input_variables=["input", "chat_history"], messages=messages) + + @classmethod + def from_llm_and_tools( + cls, + llm: BaseLanguageModel, + tools: List[BaseTool], + prompt_message: str, + system_context: str, + action_plans: ActionPlans, + **kwargs: Any, + ) -> BaseMultiActionAgent: + """Construct an agent from an LLM and tools.""" + llm_chain = LLMChain( + llm=llm, + prompt=cls.create_prompt( + prompt_message=prompt_message, + system_context=system_context, + action_plans=action_plans, + ), + ) + return cls( + tools=tools, + llm_chain=llm_chain, + action_plans=action_plans, + **kwargs, + ) diff --git a/backend/app/app/tool_constants/public_demo_data/agent_x_to_ingest/chat_agent/router_agent/__init__.py b/backend/app/app/tool_constants/public_demo_data/agent_x_to_ingest/chat_agent/router_agent/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/backend/app/app/tool_constants/public_demo_data/agent_x_to_ingest/chat_agent/tools/ExtendedBaseTool.py b/backend/app/app/tool_constants/public_demo_data/agent_x_to_ingest/chat_agent/tools/ExtendedBaseTool.py new file mode 100644 index 00000000..0d47b210 --- /dev/null +++ b/backend/app/app/tool_constants/public_demo_data/agent_x_to_ingest/chat_agent/tools/ExtendedBaseTool.py @@ -0,0 +1,89 @@ +# -*- coding: utf-8 -*- +from typing import Any, List, Optional, Union + +from langchain.base_language import BaseLanguageModel +from langchain.callbacks.manager import AsyncCallbackManagerForToolRun +from langchain.schema import AIMessage, HumanMessage, SystemMessage +from langchain.tools import BaseTool + +from app.schemas.tool_schema import ToolConfig +from app.services.chat_agent.helpers.llm import get_llm +from app.utils.llm import get_token_length + + +class ExtendedBaseTool(BaseTool): + """Base tool for all tools in the agent.""" + + llm: BaseLanguageModel + fast_llm: BaseLanguageModel + + prompt_message: Optional[str] + image_description_prompt: Optional[str] + system_context: Optional[str] + + prompt_selection: Optional[str] + system_context_selection: Optional[str] + + prompt_validation: Optional[str] + system_context_validation: Optional[str] + + prompt_refinement: Optional[str] + system_context_refinement: Optional[str] + + @classmethod + def from_config(cls, config: ToolConfig, **kwargs): + """Create a tool from a config.""" + llm = kwargs.get("llm", get_llm(config.default_llm)) + fast_llm = kwargs.get("fast_llm", get_llm(config.default_fast_llm)) + return cls( + llm=llm, + fast_llm=fast_llm, + description=config.description.format(**{e.name: e.content for e in config.prompt_inputs}), + prompt_message=config.prompt_message.format(**{e.name: e.content for e in config.prompt_inputs}), + image_description_prompt=config.image_description_prompt.format( + **{e.name: e.content for e in config.prompt_inputs} + ), + system_context=config.system_context.format(**{e.name: e.content for e in config.prompt_inputs}), + prompt_selection=config.prompt_selection.format(**{e.name: e.content for e in config.prompt_inputs}) + if config.prompt_selection + else None, + system_context_selection=config.system_context_selection.format( + **{e.name: e.content for e in config.prompt_inputs} + ) + if config.system_context_selection + else None, + prompt_validation=config.prompt_validation.format(**{e.name: e.content for e in config.prompt_inputs}) + if config.prompt_validation + else None, + system_context_validation=config.system_context_validation.format( + **{e.name: e.content for e in config.prompt_inputs} + ) + if config.system_context_validation + else None, + prompt_refinement=config.prompt_refinement.format(**{e.name: e.content for e in config.prompt_inputs}) + if config.prompt_refinement + else None, + system_context_refinement=config.system_context_refinement.format( + **{e.name: e.content for e in config.prompt_inputs} + ) + if config.system_context_refinement + else None, + ) + + async def _agenerate_response( + self, + messages: List[Union[HumanMessage, AIMessage, SystemMessage]], + force_gpt4: bool = False, + run_manager: Optional[AsyncCallbackManagerForToolRun] = None, + ) -> str: + """Generate a response asynchronously with the preferential llm.""" + llm = ( + self.fast_llm + if get_token_length("".join([m.content for m in messages])) < 2500 and not force_gpt4 + else self.llm + ) + llm_response = await llm.agenerate([messages], callbacks=run_manager.get_child() if run_manager else None) + return llm_response.generations[0][0].text + + def _run(self, *args: Any, **kwargs: Any) -> Any: + raise NotImplementedError(f"{self.name} does not implement _run") diff --git a/backend/app/app/tool_constants/public_demo_data/agent_x_to_ingest/chat_agent/tools/__init__.py b/backend/app/app/tool_constants/public_demo_data/agent_x_to_ingest/chat_agent/tools/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/backend/app/app/tool_constants/public_demo_data/agent_x_to_ingest/chat_agent/tools/library/__init__.py b/backend/app/app/tool_constants/public_demo_data/agent_x_to_ingest/chat_agent/tools/library/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/backend/app/app/tool_constants/public_demo_data/agent_x_to_ingest/chat_agent/tools/library/entertainer_tool/__init__.py b/backend/app/app/tool_constants/public_demo_data/agent_x_to_ingest/chat_agent/tools/library/entertainer_tool/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/backend/app/app/tool_constants/public_demo_data/agent_x_to_ingest/chat_agent/tools/library/entertainer_tool/entertainer_tool.py b/backend/app/app/tool_constants/public_demo_data/agent_x_to_ingest/chat_agent/tools/library/entertainer_tool/entertainer_tool.py new file mode 100644 index 00000000..33ca4bc9 --- /dev/null +++ b/backend/app/app/tool_constants/public_demo_data/agent_x_to_ingest/chat_agent/tools/library/entertainer_tool/entertainer_tool.py @@ -0,0 +1,48 @@ +# -*- coding: utf-8 -*- +import logging +from typing import Optional + +from langchain.callbacks.manager import AsyncCallbackManagerForToolRun, CallbackManagerForToolRun +from langchain.schema import HumanMessage, SystemMessage + +from app.schemas.tool_schema import ToolConfig +from app.services.chat_agent.helpers.llm import get_llm +from app.services.chat_agent.tools.ExtendedBaseTool import ExtendedBaseTool + +logger = logging.getLogger(__name__) + + +class EntertainerTool(ExtendedBaseTool): + """Entertainer Tool.""" + + name = "entertainer_tool" + + appendix_title: str = "Preliminary Answer" + + @classmethod + def from_config(cls, config: ToolConfig, **kwargs): + llm = kwargs.get("llm", get_llm(config.default_llm)) + fast_llm = kwargs.get("fast_llm", get_llm(config.default_fast_llm)) + return cls( + llm=llm, + fast_llm=fast_llm, + description=config.description.format(**{e.name: e.content for e in config.prompt_inputs}), + prompt_message=config.prompt_message.format(**{e.name: e.content for e in config.prompt_inputs}), + system_context=config.system_context.format(**{e.name: e.content for e in config.prompt_inputs}), + ) + + async def _arun(self, query: str, run_manager: Optional[AsyncCallbackManagerForToolRun] = None) -> str: + """Use the tool asynchronously.""" + try: + messages = [ + SystemMessage(content=self.system_context), + HumanMessage(content=self.prompt_message.format(question=query)), + ] + response = await self._agenerate_response(messages, force_gpt4=True, run_manager=run_manager) + return response + except Exception as e: + if run_manager is not None: + await run_manager.on_tool_error(e, tool=self.name) + return repr(e) + else: + raise e diff --git a/backend/app/app/tool_constants/public_demo_data/agent_x_to_ingest/chat_agent/tools/library/expert_tool/__init__.py b/backend/app/app/tool_constants/public_demo_data/agent_x_to_ingest/chat_agent/tools/library/expert_tool/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/backend/app/app/tool_constants/public_demo_data/agent_x_to_ingest/chat_agent/tools/library/expert_tool/expert_tool.py b/backend/app/app/tool_constants/public_demo_data/agent_x_to_ingest/chat_agent/tools/library/expert_tool/expert_tool.py new file mode 100644 index 00000000..677f4bbc --- /dev/null +++ b/backend/app/app/tool_constants/public_demo_data/agent_x_to_ingest/chat_agent/tools/library/expert_tool/expert_tool.py @@ -0,0 +1,47 @@ +# -*- coding: utf-8 -*- +import logging +from typing import Optional + +from langchain.callbacks.manager import AsyncCallbackManagerForToolRun, CallbackManagerForToolRun +from langchain.schema import HumanMessage, SystemMessage + +from app.schemas.tool_schema import ToolConfig +from app.services.chat_agent.helpers.llm import get_llm +from app.services.chat_agent.tools.ExtendedBaseTool import ExtendedBaseTool + +logger = logging.getLogger(__name__) + + +class ExpertTool(ExtendedBaseTool): + """Expert Tool.""" + + name = "expert_tool" + + @classmethod + def from_config(cls, config: ToolConfig, **kwargs): + """Create an expert tool from a config.""" + llm = kwargs.get("llm", get_llm(config.default_llm)) + fast_llm = kwargs.get("fast_llm", get_llm(config.default_fast_llm)) + return cls( + llm=llm, + fast_llm=fast_llm, + description=config.description.format(**{e.name: e.content for e in config.prompt_inputs}), + prompt_message=config.prompt_message.format(**{e.name: e.content for e in config.prompt_inputs}), + system_context=config.system_context.format(**{e.name: e.content for e in config.prompt_inputs}), + ) + + async def _arun(self, query: str, run_manager: Optional[AsyncCallbackManagerForToolRun] = None) -> str: + """Use the tool asynchronously.""" + try: + messages = [ + SystemMessage(content=self.system_context), + HumanMessage(content=self.prompt_message.format(question=query)), + ] + response = await self._agenerate_response(messages, force_gpt4=True, run_manager=run_manager) + return response + except Exception as e: + if run_manager is not None: + await run_manager.on_tool_error(e, tool=self.name) + return repr(e) + else: + raise e diff --git a/backend/app/app/tool_constants/public_demo_data/agent_x_to_ingest/chat_agent/tools/library/image_gen_with_input_tool/__init__.py b/backend/app/app/tool_constants/public_demo_data/agent_x_to_ingest/chat_agent/tools/library/image_gen_with_input_tool/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/backend/app/app/tool_constants/public_demo_data/agent_x_to_ingest/chat_agent/tools/library/image_gen_with_input_tool/image_gen_with_input_tool.py b/backend/app/app/tool_constants/public_demo_data/agent_x_to_ingest/chat_agent/tools/library/image_gen_with_input_tool/image_gen_with_input_tool.py new file mode 100644 index 00000000..471aca24 --- /dev/null +++ b/backend/app/app/tool_constants/public_demo_data/agent_x_to_ingest/chat_agent/tools/library/image_gen_with_input_tool/image_gen_with_input_tool.py @@ -0,0 +1,77 @@ +# -*- coding: utf-8 -*- +import logging +import os +from typing import Optional + +import openai +from langchain.callbacks.manager import AsyncCallbackManagerForToolRun +from langchain.schema import HumanMessage, SystemMessage + +from app.schemas.streaming_schema import StreamingDataTypeEnum +from app.schemas.tool_schema import ToolConfig +from app.services.chat_agent.helpers.llm import get_llm +from app.services.chat_agent.tools.ExtendedBaseTool import ExtendedBaseTool + +logger = logging.getLogger(__name__) + + +class ImageGenerationWithInputTool(ExtendedBaseTool): + """Image Generation With Input Tool.""" + + name = "image_gen_with_input_tool" + appendix_title = "Image Appendix" + + @classmethod + def from_config(cls, config: ToolConfig, **kwargs): + """Create an image generation with input tool from a config.""" + llm = kwargs.get("llm", get_llm(config.default_llm)) + fast_llm = kwargs.get("fast_llm", get_llm(config.default_fast_llm)) + + return cls( + llm=llm, + fast_llm=fast_llm, + description=config.description.format(**{e.name: e.content for e in config.prompt_inputs}), + prompt_message=config.prompt_message.format(**{e.name: e.content for e in config.prompt_inputs}), + system_context=config.system_context.format(**{e.name: e.content for e in config.prompt_inputs}), + ) + + async def _arun(self, query: str, run_manager: Optional[AsyncCallbackManagerForToolRun] = None) -> str: + """Use the tool asynchronously.""" + try: + logger.info("Generating the image") + image_url = self.generate_image(str(query)) + messages = [ + SystemMessage(content=self.system_context), + HumanMessage(content=self.prompt_message.format(description=query)), + ] + response = await self._agenerate_response(messages, force_gpt4=True, run_manager=run_manager) + + image_url_link = "```ImageURL" + image_url + "```" + + if run_manager is not None: + await run_manager.on_text( + image_url_link, + data_type=StreamingDataTypeEnum.appendix, + tool=self.name, + step=1, + title=self.appendix_title, + ) + return response + + except Exception as e: + if run_manager is not None: + await run_manager.on_tool_error(e, tool=self.name) + return repr(e) + else: + raise e + + @staticmethod + def generate_image(description: str) -> str: + """Generate an image based on the description.""" + try: + openai.api_key = os.getenv("OPENAI_API_KEY") + response = openai.Image.create(prompt=description, n=1, size="1024x1024") + image_url = str(response["data"][0]["url"]) + return image_url + except Exception: + return "ERROR: could not generate the image based on the description: " + description diff --git a/backend/app/app/tool_constants/public_demo_data/agent_x_to_ingest/chat_agent/tools/library/image_generation_tool/__init__.py b/backend/app/app/tool_constants/public_demo_data/agent_x_to_ingest/chat_agent/tools/library/image_generation_tool/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/backend/app/app/tool_constants/public_demo_data/agent_x_to_ingest/chat_agent/tools/library/image_generation_tool/image_generation_tool.py b/backend/app/app/tool_constants/public_demo_data/agent_x_to_ingest/chat_agent/tools/library/image_generation_tool/image_generation_tool.py new file mode 100644 index 00000000..1da291b5 --- /dev/null +++ b/backend/app/app/tool_constants/public_demo_data/agent_x_to_ingest/chat_agent/tools/library/image_generation_tool/image_generation_tool.py @@ -0,0 +1,98 @@ +# -*- coding: utf-8 -*- +import logging +import os +from typing import Optional + +import openai +from langchain.callbacks.manager import AsyncCallbackManagerForToolRun +from langchain.chains.summarize import load_summarize_chain +from langchain.docstore.document import Document +from langchain.prompts import PromptTemplate +from langchain.schema import HumanMessage, SystemMessage +from langchain.text_splitter import TokenTextSplitter + +from app.schemas.streaming_schema import StreamingDataTypeEnum +from app.schemas.tool_schema import ToolConfig, ToolInputSchema +from app.services.chat_agent.helpers.llm import get_llm +from app.services.chat_agent.tools.ExtendedBaseTool import ExtendedBaseTool + +logger = logging.getLogger(__name__) + + +class ImageGenerationTool(ExtendedBaseTool): + """Image Generation Tool.""" + + name = "image_generation_tool" + appendix_title = "Image Appendix" + + image_generation_prompt_template: PromptTemplate + + @classmethod + def from_config(cls, config: ToolConfig, **kwargs): + """Create an image generation tool from a config.""" + llm = kwargs.get("llm", get_llm(config.default_llm)) + fast_llm = kwargs.get("fast_llm", get_llm(config.default_fast_llm)) + + description_prompt = config.image_description_prompt.format(**{e.name: e.content for e in config.prompt_inputs}) + + return cls( + llm=llm, + fast_llm=fast_llm, + description=config.description.format(**{e.name: e.content for e in config.prompt_inputs}), + prompt_message=config.prompt_message.format(**{e.name: e.content for e in config.prompt_inputs}), + system_context=config.system_context.format(**{e.name: e.content for e in config.prompt_inputs}), + image_generation_prompt_template=PromptTemplate(template=description_prompt, input_variables=["text"]), + ) + + async def _arun(self, query: str, run_manager: Optional[AsyncCallbackManagerForToolRun] = None) -> str: + """Use the tool asynchronously.""" + try: + logger.info("Generating the image") + tool_input = ToolInputSchema.parse_raw(query) + tool_outputs = [f"{k}: {v}" for k, v in tool_input.intermediate_steps.items()] + text_splitter = TokenTextSplitter(chunk_size=10, chunk_overlap=0) + texts = [text for tool_output in tool_outputs for text in text_splitter.split_text(tool_output)] + docs = [Document(page_content=t) for t in texts] + chain = load_summarize_chain( + self.llm, + chain_type="map_reduce", + map_prompt=self.image_generation_prompt_template, + combine_prompt=self.image_generation_prompt_template, + ) + image_description = await chain.arun(docs) + image_url = self.generate_image(str(image_description)) + + messages = [ + SystemMessage(content=self.system_context), + HumanMessage(content=self.prompt_message.format(description=image_description)), + ] + response = await self._agenerate_response(messages, force_gpt4=True, run_manager=run_manager) + + image_url_link = "```ImageURL" + image_url + "```" + + if run_manager is not None: + await run_manager.on_text( + image_url_link, + data_type=StreamingDataTypeEnum.appendix, + tool=self.name, + step=1, + title=self.appendix_title, + ) + return response + + except Exception as e: + if run_manager is not None: + await run_manager.on_tool_error(e, tool=self.name) + return repr(e) + else: + raise e + + @staticmethod + def generate_image(description): + try: + openai.api_key = os.getenv("OPENAI_API_KEY") + response = openai.Image.create(prompt=description, n=1, size="1024x1024") + image_url = str(response["data"][0]["url"]) + return image_url + except Exception: + return "ERROR: could not generate the image based on the description: " + description diff --git a/backend/app/app/tool_constants/public_demo_data/agent_x_to_ingest/chat_agent/tools/library/pdf_tool/__init__.py b/backend/app/app/tool_constants/public_demo_data/agent_x_to_ingest/chat_agent/tools/library/pdf_tool/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/backend/app/app/tool_constants/public_demo_data/agent_x_to_ingest/chat_agent/tools/library/pdf_tool/pdf_tool.py b/backend/app/app/tool_constants/public_demo_data/agent_x_to_ingest/chat_agent/tools/library/pdf_tool/pdf_tool.py new file mode 100644 index 00000000..7be47b08 --- /dev/null +++ b/backend/app/app/tool_constants/public_demo_data/agent_x_to_ingest/chat_agent/tools/library/pdf_tool/pdf_tool.py @@ -0,0 +1,137 @@ +# -*- coding: utf-8 -*- +import logging +from typing import List, Optional + +from langchain.callbacks.manager import AsyncCallbackManagerForToolRun +from langchain.schema import HumanMessage, SystemMessage + +from app.core.config import settings +from app.db.vector_db_pdf_ingestion import pdf_pipeline +from app.schemas.streaming_schema import StreamingDataTypeEnum +from app.schemas.tool_schema import ToolConfig +from app.schemas.tool_schemas.pdf_tool_schema import PdfAppendix +from app.services.chat_agent.helpers.llm import get_llm +from app.services.chat_agent.tools.ExtendedBaseTool import ExtendedBaseTool + +logger = logging.getLogger(__name__) + + +class PDFTool(ExtendedBaseTool): + """PDF Tool.""" + + name = "pdf_tool" + appendix_title = "PDF Appendix" + + @classmethod + def from_config(cls, config: ToolConfig, **kwargs): + """Create a PDF tool from a config.""" + llm = kwargs.get("llm", get_llm(config.default_llm)) + fast_llm = kwargs.get("fast_llm", get_llm(config.default_fast_llm)) + + if not settings.PDF_TOOL_ENABLED: + raise ValueError( + "The PDF Tool is not enabled. Please set the environment" + "variables to enable it if used in the configuration." + ) + + return cls( + llm=llm, + fast_llm=fast_llm, + description=config.description.format(**{e.name: e.content for e in config.prompt_inputs}), + prompt_message=config.prompt_message.format(**{e.name: e.content for e in config.prompt_inputs}), + system_context=config.system_context.format(**{e.name: e.content for e in config.prompt_inputs}), + prompt_selection=config.prompt_selection.format(**{e.name: e.content for e in config.prompt_inputs}) + if config.prompt_selection + else None, + system_context_selection=config.system_context_selection.format( + **{e.name: e.content for e in config.prompt_inputs} + ) + if config.system_context_selection + else None, + prompt_validation=config.prompt_validation.format(**{e.name: e.content for e in config.prompt_inputs}) + if config.prompt_validation + else None, + system_context_validation=config.system_context_validation.format( + **{e.name: e.content for e in config.prompt_inputs} + ) + if config.system_context_validation + else None, + prompt_refinement=config.prompt_refinement.format(**{e.name: e.content for e in config.prompt_inputs}) + if config.prompt_refinement + else None, + system_context_refinement=config.system_context_refinement.format( + **{e.name: e.content for e in config.prompt_inputs} + ) + if config.system_context_refinement + else None, + ) + + async def _arun(self, query: str, run_manager: Optional[AsyncCallbackManagerForToolRun] = None) -> str: + """Use the tool asynchronously.""" + try: + logger.info("Filtering relevant documents") + db_pdf_docs = pdf_pipeline.run(load_index=True) + + logger.info("Filtering DB for relevant info...") + docs = db_pdf_docs.as_retriever( + search_kwargs={ + "k": 4, + } # tbd search_kwargs + ).get_relevant_documents(query) + retrieved_docs = "\n".join([doc.page_content for doc in docs]) + + result = await self._aqa_pdf_chunks(query, retrieved_docs, run_manager) + + if run_manager is not None: + await run_manager.on_text( + self.format_appendix(["Found PDFs"]), + data_type=StreamingDataTypeEnum.appendix, + tool=self.name, + title=self.appendix_title, + references=self.appendix_context(["Found PDFs"]), + ) + return result + + except Exception as e: + if run_manager is not None: + await run_manager.on_tool_error(e, tool=self.name) + return repr(e) + else: + raise e + + def appendix_context(self, documents: List[str]) -> List[PdfAppendix]: + """Create the appendix context.""" + return [ + PdfAppendix( + doc_id=d, + page_numbers=[], + reference_text="", + ) + for d in documents + ] + + def format_appendix(self, documents: List[str]) -> str: + """Format the appendix.""" + documents_str = ",".join(documents) + return f"```pdf\nDocuments: {documents_str}\n```" + + async def _aqa_pdf_chunks( + self, + query: str, + docs: str = None, + run_manager: Optional[AsyncCallbackManagerForToolRun] = None, + ) -> str: + if run_manager is not None: + await run_manager.on_text( + "qa_pdf_docs", + data_type=StreamingDataTypeEnum.action, + tool=self.name, + step=1, + ) + question_messages = [ + SystemMessage(content=self.system_context), + HumanMessage(content=self.prompt_message.format(question=query, retrieved_docs=docs)), + ] + response = await self._agenerate_response(question_messages) + logger.info(response) + return response diff --git a/backend/app/app/tool_constants/public_demo_data/agent_x_to_ingest/chat_agent/tools/library/sql_tool/__init__.py b/backend/app/app/tool_constants/public_demo_data/agent_x_to_ingest/chat_agent/tools/library/sql_tool/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/backend/app/app/tool_constants/public_demo_data/agent_x_to_ingest/chat_agent/tools/library/sql_tool/sql_tool.py b/backend/app/app/tool_constants/public_demo_data/agent_x_to_ingest/chat_agent/tools/library/sql_tool/sql_tool.py new file mode 100644 index 00000000..2ca82d7f --- /dev/null +++ b/backend/app/app/tool_constants/public_demo_data/agent_x_to_ingest/chat_agent/tools/library/sql_tool/sql_tool.py @@ -0,0 +1,302 @@ +# -*- coding: utf-8 -*- +import logging +import re +from typing import List, Optional, Tuple + +from langchain.callbacks.manager import AsyncCallbackManagerForToolRun +from langchain.schema import HumanMessage, SystemMessage + +from app.core.config import settings +from app.db.session import sql_tool_db +from app.schemas.streaming_schema import StreamingDataTypeEnum +from app.schemas.tool_schema import SqlToolConfig +from app.services.chat_agent.helpers.llm import get_llm +from app.services.chat_agent.tools.ExtendedBaseTool import ExtendedBaseTool + +logger = logging.getLogger(__name__) + + +class SQLTool(ExtendedBaseTool): + """SQL Tool.""" + + name = "sql_tool" + appendix_title = "Table Appendix" + + nb_example_rows: int = 3 + validate_empty_results: bool = False + validate_with_llm: bool = False + always_limit_query: bool = False + + @classmethod + def from_config(cls, config: SqlToolConfig, **kwargs): + """Create a SQL tool from a config.""" + llm = kwargs.get("llm", get_llm(config.default_llm)) + fast_llm = kwargs.get("fast_llm", get_llm(config.default_fast_llm)) + + if not settings.SQL_TOOL_DB_ENABLED: + raise ValueError( + "The SQL Tool is not enabled. Please set the environment" + "variables to enable it if used in the configuration." + ) + + if sql_tool_db is None: + raise ValueError("Database is not initialized") + + if sql_tool_db.db_info is None: + raise ValueError("Database schema information is not initialized") + + return cls( + llm=llm, + fast_llm=fast_llm, + description=config.description.format(**{e.name: e.content for e in config.prompt_inputs}), + prompt_message=config.prompt_message.format(**{e.name: e.content for e in config.prompt_inputs}), + system_context=config.system_context.format(**{e.name: e.content for e in config.prompt_inputs}), + prompt_selection=config.prompt_selection.format(**{e.name: e.content for e in config.prompt_inputs}), + system_context_selection=config.system_context_selection.format( + **{e.name: e.content for e in config.prompt_inputs} + ), + prompt_validation=config.prompt_validation.format(**{e.name: e.content for e in config.prompt_inputs}), + system_context_validation=config.system_context_validation.format( + **{e.name: e.content for e in config.prompt_inputs} + ), + prompt_refinement=config.prompt_refinement.format(**{e.name: e.content for e in config.prompt_inputs}), + nb_example_rows=config.nb_example_rows, + validate_empty_results=config.validate_empty_results, + validate_with_llm=config.validate_with_llm, + always_limit_query=config.always_limit_query, + ) + + async def _arun(self, query: str, run_manager: Optional[AsyncCallbackManagerForToolRun] = None) -> str: + """Use the tool asynchronously.""" + try: + filtered_tables = await self._alist_sql_tables(query, run_manager) + (schemas, response) = await self._aquery_with_schemas(query, filtered_tables, run_manager) + + result: str | None = None + retries: int = 0 + is_valid = False + + if schemas == "": + result = "no_data" + + while result is None: + (is_valid, results_str, complaints) = await self._avalidate_response(query, response, run_manager) + if is_valid or retries > 3: + result = response + else: + response = await self._aimprove_query(query, response, complaints, schemas, run_manager) + retries += 1 + + if run_manager is not None: + if is_valid: + await run_manager.on_text( + result, + data_type=StreamingDataTypeEnum.appendix, + tool=self.name, + step=1, + title=self.appendix_title, + ) + return self._construct_final_response(response, results_str) + else: + await run_manager.on_text( + "no_data", + data_type=StreamingDataTypeEnum.action, + tool=self.name, + step=1, + result=result, + ) + return result + + except Exception as e: + if run_manager is not None: + await run_manager.on_tool_error(e, tool=self.name) + return repr(e) + else: + raise e + + def _construct_final_response( + self, + markdown_sql_query: str, + results_str: str, + ) -> str: + """Construct the final response.""" + return f"{markdown_sql_query}, {results_str}" + + async def _avalidate_response( + self, + question: str, + response: str, + run_manager: Optional[AsyncCallbackManagerForToolRun] = None, + ) -> Tuple[bool, str, str]: + """ + Validate the response. + + Returns: + Tuple[bool, List[Any], str]: (is_valid, results_str, complaints) + """ + try: + query = await self._parse_query(response) + results = sql_tool_db.run_no_str(query) + if results is None: + validation = ( + False, + [], + f"The SQL query did not return any results: {results}", + ) + elif self.validate_empty_results and len(results) == 0: + validation = ( + False, + [], + "The SQL query executed but did not return any result rows.", + ) + else: + sample_rows_result = results[0 : self.nb_example_rows] + sample_rows = list( + map( + lambda ls: [f"{str(i)[:100]}..." if len(str(i)) > 100 else str(i) for i in ls], + sample_rows_result, + ) + ) + sample_rows_str = ";".join([",".join(row) for row in sample_rows]).replace("\n", "") + results_str = f"total rows from SQL query: {len(results)}, " + f"first {self.nb_example_rows} rows: {sample_rows_str}" + if self.validate_with_llm: + validation_messages = [ + SystemMessage(content=self.system_context_validation), + HumanMessage( + content=self.prompt_validation.format(query=response, result=results_str, question=question) + ), + ] + response = await self._agenerate_response(validation_messages) + validation = await self._parse_validation(response) + else: + validation = (True, results_str, None) + logger.info(f"Validation: {validation} (success={validation[0]})") + if run_manager is not None: + await run_manager.on_text( + "validate_sql_query", + data_type=StreamingDataTypeEnum.action, + tool=self.name, + step=1, + success=validation[0], + ) + return validation + except Exception as e: + if run_manager is not None: + await run_manager.on_tool_error(e, tool=self.name) + return (False, [], repr(e)) + else: + raise e + + async def _aimprove_query( + self, + query: str, + response: str, + complaints: str, + schemas: str, + run_manager: Optional[AsyncCallbackManagerForToolRun] = None, + ) -> str: + """Improve the query async.""" + if run_manager is not None: + await run_manager.on_text( + "improve_sql_query", + data_type=StreamingDataTypeEnum.action, + tool=self.name, + step=1, + ) + improvement_messages = [ + SystemMessage(content=self.system_context), + HumanMessage( + content=self.prompt_refinement.format( + previous_answer=response, + complaints=complaints, + table_schemas=schemas, + question=query, + ) + ), + ] + response = await self._agenerate_response(improvement_messages) + return response + + async def _alist_sql_tables( + self, query: str, run_manager: Optional[AsyncCallbackManagerForToolRun] = None + ) -> List[str]: + """List the SQL tables.""" + if run_manager is not None: + await run_manager.on_text( + "list_tables_sql_db", + data_type=StreamingDataTypeEnum.action, + tool=self.name, + step=1, + ) + table_messages = [ + SystemMessage(content=self.system_context_selection), + HumanMessage(content=self.prompt_selection.format(question=query)), + ] + response = await self._agenerate_response(table_messages, force_gpt4=True) + filtered_tables = [x.strip() for x in response.split(",")] + logger.info(f"Filtered tables: {filtered_tables}") + return filtered_tables + + async def _aquery_with_schemas( + self, + query: str, + filtered_tables: List[str], + run_manager: Optional[AsyncCallbackManagerForToolRun] = None, + ) -> Tuple[str, str]: + """Query with schemas.""" + if run_manager is not None: + await run_manager.on_text( + "schema_sql_db", + data_type=StreamingDataTypeEnum.action, + tool=self.name, + step=1, + ) + filtered_tables_upper_case = [x.upper() for x in filtered_tables] + db_table_infos = sql_tool_db.db_info.tables if sql_tool_db.db_info is not None else [] + table_schemas = "\n".join( + [ + ("DB.TABLE name: " + s.name + ", Table structure: " + s.structure) + for s in db_table_infos + if s.name.upper() in filtered_tables_upper_case + ] + ) + question_messages = [ + SystemMessage(content=self.system_context), + HumanMessage(content=self.prompt_message.format(table_schemas=table_schemas, question=query)), + ] + response = await self._agenerate_response(question_messages, force_gpt4=True) + + return table_schemas, response + + async def _parse_validation(self, response: str) -> Tuple[bool, str, str]: + """Parse the validation from the response.""" + pattern = r"^Valid:\s*(?Pyes|no)\s*Reason:\s*(?P.*)$" + match = re.search(pattern, response, flags=re.MULTILINE) + + return ( + ("y" in match.group("valid")) if match else False, + "", + match.group("reason") if match else response, + ) + + async def _parse_query(self, response: str) -> str: + """Parse the query from the response.""" + response = response.replace("\n", " ").replace("\r", " ") + query_start = response.lower().find("```sql") + if query_start == -1: + query_start = response.lower().find("`sql") + query_end = response.find("```", query_start + 1) + if query_end == -1: + query_end = response.find("`", query_start + 1) + + if query_start == -1 or query_end == -1: + raise ValueError("Could not parse query from response") + query = response[query_start + 6 : query_end] + if self.always_limit_query and "LIMIT" not in query.upper(): + for i in range(3): + if query[len(query) - 1 - i] == ";": + query = query[: -1 - i] + break + query += f" LIMIT {self.nb_example_rows}" + return query diff --git a/backend/app/app/tool_constants/public_demo_data/agent_x_to_ingest/chat_agent/tools/library/summarizer_tool/__init__.py b/backend/app/app/tool_constants/public_demo_data/agent_x_to_ingest/chat_agent/tools/library/summarizer_tool/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/backend/app/app/tool_constants/public_demo_data/agent_x_to_ingest/chat_agent/tools/library/summarizer_tool/summarizer_tool.py b/backend/app/app/tool_constants/public_demo_data/agent_x_to_ingest/chat_agent/tools/library/summarizer_tool/summarizer_tool.py new file mode 100644 index 00000000..6a62492b --- /dev/null +++ b/backend/app/app/tool_constants/public_demo_data/agent_x_to_ingest/chat_agent/tools/library/summarizer_tool/summarizer_tool.py @@ -0,0 +1,69 @@ +# -*- coding: utf-8 -*- +import logging +from typing import Optional + +from langchain.callbacks.manager import AsyncCallbackManagerForToolRun, CallbackManagerForToolRun +from langchain.chains.summarize import load_summarize_chain +from langchain.docstore.document import Document +from langchain.prompts import PromptTemplate +from langchain.text_splitter import TokenTextSplitter + +from app.schemas.agent_schema import AgentAndToolsConfig +from app.schemas.tool_schema import ToolConfig, ToolInputSchema +from app.services.chat_agent.helpers.llm import get_llm +from app.services.chat_agent.tools.ExtendedBaseTool import ExtendedBaseTool +from app.utils.llm import get_token_length + +logger = logging.getLogger(__name__) + + +class SummarizerTool(ExtendedBaseTool): + """Summarizer Tool.""" + + name = "summarizer_tool" + + max_token_length: int = 4000 + summarize_prompt_template: PromptTemplate + + @classmethod + def from_config(cls, config: ToolConfig, common_config: AgentAndToolsConfig, **kwargs): + llm = kwargs.get("llm", get_llm(config.default_llm)) + fast_llm = kwargs.get("fast_llm", get_llm(config.default_fast_llm)) + prompt_template_message = config.prompt_message.format(**{e.name: e.content for e in config.prompt_inputs}) + return cls( + llm=llm, + fast_llm=fast_llm, + description=config.description.format(**{e.name: e.content for e in config.prompt_inputs}), + max_token_length=common_config.max_token_length, + summarize_prompt_template=PromptTemplate(template=prompt_template_message, input_variables=["text"]), + ) + + async def _arun(self, query: str, run_manager: Optional[AsyncCallbackManagerForToolRun] = None) -> str: + """Use the tool asynchronously.""" + try: + callbacks = run_manager.get_child() if run_manager else None + tool_input = ToolInputSchema.parse_raw(query) + tool_outputs = [f"{k}: {v}" for k, v in tool_input.intermediate_steps.items()] + if get_token_length(query) <= self.max_token_length: + docs = [Document(page_content=tool_output) for tool_output in tool_outputs] + chain = load_summarize_chain(self.llm, chain_type="stuff", prompt=self.summarize_prompt_template) + else: + logger.info("Splitting text into chunks") + text_splitter = TokenTextSplitter(chunk_size=10, chunk_overlap=0) + texts = [text for tool_output in tool_outputs for text in text_splitter.split_text(tool_output)] + docs = [Document(page_content=t) for t in texts] + chain = load_summarize_chain( + self.llm, + chain_type="map_reduce", + map_prompt=self.summarize_prompt_template, + combine_prompt=self.summarize_prompt_template, + ) + + response = await chain.arun(docs, callbacks=callbacks) + return response + except Exception as e: + if run_manager is not None: + await run_manager.on_tool_error(e, tool=self.name) + return repr(e) + else: + raise e diff --git a/backend/app/app/tool_constants/public_demo_data/agent_x_to_ingest/chat_agent/tools/library/visualizer_tool/__init__.py b/backend/app/app/tool_constants/public_demo_data/agent_x_to_ingest/chat_agent/tools/library/visualizer_tool/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/backend/app/app/tool_constants/public_demo_data/agent_x_to_ingest/chat_agent/tools/library/visualizer_tool/visualizer_tool.py b/backend/app/app/tool_constants/public_demo_data/agent_x_to_ingest/chat_agent/tools/library/visualizer_tool/visualizer_tool.py new file mode 100644 index 00000000..64a65d40 --- /dev/null +++ b/backend/app/app/tool_constants/public_demo_data/agent_x_to_ingest/chat_agent/tools/library/visualizer_tool/visualizer_tool.py @@ -0,0 +1,88 @@ +# -*- coding: utf-8 -*- +import logging +import re +from typing import List, Optional, Tuple + +from langchain.callbacks.manager import AsyncCallbackManagerForToolRun, CallbackManagerForToolRun +from langchain.schema import HumanMessage, SystemMessage + +from app.schemas.agent_schema import AgentAndToolsConfig +from app.schemas.streaming_schema import StreamingDataTypeEnum +from app.schemas.tool_schema import ToolConfig, ToolInputSchema +from app.services.chat_agent.helpers.llm import get_llm +from app.services.chat_agent.tools.ExtendedBaseTool import ExtendedBaseTool + +logger = logging.getLogger(__name__) + + +class JsxVisualizerTool(ExtendedBaseTool): + """Jsx Visualizer Tool.""" + + name = "visualizer_tool" + appendix_title = "Visualisation Appendix" + + @classmethod + def from_config(cls, config: ToolConfig, **kwargs): + llm = kwargs.get("llm", get_llm(config.default_llm)) + fast_llm = kwargs.get("fast_llm", get_llm(config.default_fast_llm)) + return cls( + llm=llm, + fast_llm=fast_llm, + description=config.description.format(**{e.name: e.content for e in config.prompt_inputs}), + prompt_message=config.prompt_message.format(**{e.name: e.content for e in config.prompt_inputs}), + system_context=config.system_context.format(**{e.name: e.content for e in config.prompt_inputs}), + ) + + async def _arun(self, query: str, run_manager: Optional[AsyncCallbackManagerForToolRun] = None) -> str: + """Use the tool asynchronously.""" + try: + if run_manager is not None: + await run_manager.on_text( + "build_visualization", + data_type=StreamingDataTypeEnum.action, + tool=self.name, + step=1, + ) + + tool_input = ToolInputSchema.parse_raw(query) + outputs = [f"{k}: {v}" for k, v in tool_input.intermediate_steps.items()] + results = "\n".join(outputs[1:]) + messages = [ + SystemMessage(content=self.system_context.format()), + HumanMessage(content=self.prompt_message.format(question=outputs[0], results=results)), + ] + result = await self._agenerate_response(messages, force_gpt4=True) + + is_valid = "jsx" in result + + if run_manager is not None: + if is_valid: + await run_manager.on_text( + result, + data_type=StreamingDataTypeEnum.appendix, + tool=self.name, + step=1, + title=self.appendix_title, + ) + else: + await run_manager.on_text( + "no_data", + data_type=StreamingDataTypeEnum.action, + tool=self.name, + step=1, + result=result, + ) + return result + except Exception as e: + if run_manager is not None: + await run_manager.on_tool_error(e, tool=self.name) + return repr(e) + else: + raise e + + async def _parse_inputs(self, response: str) -> Tuple[List[str], str]: + pattern = r"^fields:\[\s*(?P.*)\]\s*description:\s*(?P.*)$" + match = re.search(pattern, response, flags=re.MULTILINE) + fields = match.group("fields").split(",") if match else [] + description = match.group("description") if match else "" + return (fields, description) diff --git a/backend/app/app/tool_constants/public_demo_data/agent_x_to_ingest/chat_agent/tools/tools.py b/backend/app/app/tool_constants/public_demo_data/agent_x_to_ingest/chat_agent/tools/tools.py new file mode 100644 index 00000000..522e5520 --- /dev/null +++ b/backend/app/app/tool_constants/public_demo_data/agent_x_to_ingest/chat_agent/tools/tools.py @@ -0,0 +1,47 @@ +# -*- coding: utf-8 -*- +from langchain.base_language import BaseLanguageModel +from langchain.tools import BaseTool + +from app.services.chat_agent.tools.ExtendedBaseTool import ExtendedBaseTool +from app.services.chat_agent.tools.library.entertainer_tool.entertainer_tool import EntertainerTool +from app.services.chat_agent.tools.library.expert_tool.expert_tool import ExpertTool +from app.services.chat_agent.tools.library.image_gen_with_input_tool.image_gen_with_input_tool import ( + ImageGenerationWithInputTool, +) +from app.services.chat_agent.tools.library.image_generation_tool.image_generation_tool import ImageGenerationTool +from app.services.chat_agent.tools.library.pdf_tool.pdf_tool import PDFTool +from app.services.chat_agent.tools.library.sql_tool.sql_tool import SQLTool +from app.services.chat_agent.tools.library.summarizer_tool.summarizer_tool import SummarizerTool +from app.services.chat_agent.tools.library.visualizer_tool.visualizer_tool import JsxVisualizerTool +from app.utils.config_loader import get_agent_config + + +def get_tools(tools: list[str], llm: BaseLanguageModel, fast_llm: BaseLanguageModel) -> list[BaseTool]: + """Get tools from a list of tool names.""" + agent_config = get_agent_config() + all_tool_classes: list[tuple[str, ExtendedBaseTool]] = [ + ("sql_tool", SQLTool), + ("visualizer_tool", JsxVisualizerTool), + ("summarizer_tool", SummarizerTool), + ("expert_tool", ExpertTool), + ("entertainer_tool", EntertainerTool), + ("pdf_tool", PDFTool), + ("image_generation_tool", ImageGenerationTool), + ("image_gen_with_input_tool", ImageGenerationWithInputTool), + ] + all_tools: list[ExtendedBaseTool] = [ + c.from_config( + config=agent_config.tools_library.library[name], + common_config=agent_config.common, + llm=llm, + fast_llm=fast_llm, + ) + for (name, c) in all_tool_classes + if name in agent_config.tools + ] + tools_map = {tool.name: tool for tool in all_tools} + + if any(tool_name not in tools_map for tool_name in tools): + raise ValueError(f"Invalid tool name(s): {tools}") + + return [tools_map[tool_name] for tool_name in tools] diff --git a/backend/app/app/tool_constants/public_demo_data/agent_x_to_ingest/config/__init__.py b/backend/app/app/tool_constants/public_demo_data/agent_x_to_ingest/config/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/backend/app/app/tool_constants/public_demo_data/agent_x_to_ingest/config/agent.yml b/backend/app/app/tool_constants/public_demo_data/agent_x_to_ingest/config/agent.yml new file mode 100644 index 00000000..dd75a586 --- /dev/null +++ b/backend/app/app/tool_constants/public_demo_data/agent_x_to_ingest/config/agent.yml @@ -0,0 +1,71 @@ +--- +default_llm: "gpt-4" +default_fast_llm: "gpt-3.5-turbo" +tools_library: !include tools.yml +common: + max_token_length: 4000 +tools: # list of all tools available for the agent + - sql_tool + - visualizer_tool + - summarizer_tool + - expert_tool + - entertainer_tool + - pdf_tool +action_plans: # list of all action plans available for the meta agent + '0': + name: '' + description: Gather new information, summarize and visualize + actions: # each sublist is 1 action step, i.e. add tools as subitems if you want to execute in parallel + - - sql_tool + - entertainer_tool + - - summarizer_tool + - visualizer_tool + '1': + name: '' + description: Gather new information and summarize + actions: + - - sql_tool + - pdf_tool + - entertainer_tool + - - summarizer_tool + '2': + name: '' + description: Gather new information and write a draft protocol + actions: + - - sql_tool + - entertainer_tool + - - expert_tool + '3': + name: '' + description: Sufficient information in chat history, visualize + actions: + - - memory + - entertainer_tool + - visualizer_tool + '4': + name: '' + description: Sufficient information in chat history, answer question + actions: + - - memory + - expert_tool +prompt_message: |- + Given the chat history and the user question, what action plan would be best to follow? + Remember to only put out the number of the action plan you want to follow. + + User question: {input} +system_context: |- + You are an expert in digital media and music. + Your goal is to select the right action plan for the question of the user in the fastest way possible, given the chat history. + + The information that can be gathered are from a digital media store database and PDFs with general information about specific artists. + The digital media database includes details on tracks, artists and albums, as well as information about the business such as employees, customers and purchases. + + Consider the following principles: + - Gathering new information takes time, only do it if necessary + - Only visualize if the user asks for it + - If the question is referring to information provided in the chat history, answer with "3" or "4" + + Action plans: + {action_plans} + + Only reply with the number of the action plan you want to follow and nothing else. For example: "0" or "1" or "2" or "3" or "4" diff --git a/backend/app/app/tool_constants/public_demo_data/agent_x_to_ingest/config/extraction.yml b/backend/app/app/tool_constants/public_demo_data/agent_x_to_ingest/config/extraction.yml new file mode 100644 index 00000000..d00d57f2 --- /dev/null +++ b/backend/app/app/tool_constants/public_demo_data/agent_x_to_ingest/config/extraction.yml @@ -0,0 +1,4 @@ +indexing: + tokenizer_chunk_size: 2000 + tokenizer_chunk_overlap: 200 + pdf_parser: "PyMuPDF" diff --git a/backend/app/app/tool_constants/public_demo_data/agent_x_to_ingest/config/tools.yml b/backend/app/app/tool_constants/public_demo_data/agent_x_to_ingest/config/tools.yml new file mode 100644 index 00000000..d27b8cb2 --- /dev/null +++ b/backend/app/app/tool_constants/public_demo_data/agent_x_to_ingest/config/tools.yml @@ -0,0 +1,225 @@ +library: + expert_tool: + default_llm: "gpt-4" + default_fast_llm: "gpt-3.5-turbo" + description: >- + Expert tool to answer general questions given information as context. + Input is a user question and context information as a long string, output is an answer to the user question. + {examples} + prompt_message: |- + {{question}} + system_context: |- + [PLACEHOLDER] Use-case specific system context here. + + When answering the questions, make sure to follow the principles: + - Use as much context as possible + - Do not repeat the information from the preliminary answer (if correct) but instead reference & complement it. + - Write your answer in markdown format, make sure it is beautiful and easy to read (e.g. use headings, lists, bold, italic, etc.) + Always try to answer the question. + prompt_inputs: + - name: examples + content: |- + Example Input: \"User question: Could you find a list of tracks that Daan Peeters has purchased?\" + Example Output: \"Daan Peters has purchased a total of X tracks, please see a list below...\" + entertainer_tool: + default_llm: "gpt-4" + default_fast_llm: "gpt-3.5-turbo" + description: >- + Entertainer tool to write a small concise output from memory while the information is loading. + Input is a user question, output are related facts to the user question. Always start your answer with: "This is just a preliminary answer, but"... + {examples} + prompt_message: |- + {{question}} + system_context: |- + [PLACEHOLDER] Use-case specific system context here. + + Given a user question, please reply following the principles: + - Answer as short and concise as possible + - Add interesting facts about the query if applicable + - Write your answer in markdown format, make sure it is beautiful and easy to read (e.g. use headings, lists, bold, italic, etc.) + prompt_inputs: + - name: examples + content: |- + summarizer_tool: + default_llm: "gpt-4" + default_fast_llm: "gpt-3.5-turbo" + description: >- + Summarizer tool to reduce the length of a text to a few sentences. + Input is a long string, output is a short summary of the input. + {examples} + prompt_message: |- + You are an expert on digital media and music. Given the following user question and provided information: + "{{text}}" + + Write a concise summary in markdown format answering the user question. + Follow the following principles: + - Be concise + - Write your answer in markdown format, make sure it is beautiful and easy to read (e.g. use headings, lists, bold, italic, etc.) + + CONCISE SUMMARY: + prompt_inputs: + - name: examples + content: |- + Example Input: \"This is a long string that I want to summarize. I want to summarize this long string.\" + Example Output: \"This is a summary of the long string.\" + max_token_length: 4000 + visualizer_tool: + default_llm: "gpt-4" + default_fast_llm: "gpt-3.5-turbo" + description: >- + Visualisation tool to display data as a graph or chart using JSX code. + Input is a user query and information needed to visualize (SQL or API results), output is a string that contains JSX code in markdown format. + prompt_message: |- + Given the results: + {{results}} + + Please write the JSX code for the visualization to answer the user question: + {{question}} + + Remember to only reference dataKeys from the SQL or API results. + system_context: |- + [PLACEHOLDER] Use-case specific system context here. + + Given the information retrieved from the tools (e.g. SQL rows, API results), you need to visualize the data in a way that is easy to understand. + If there is no data with clear dataKeys or the user does not ask for a visualisation return "no data". + + For the given user question, please write JSX code. + You must follow the principles: + - Only output the JSX code + - Assume the following variables are defined: ref, width, height, data, getColors, groupAndMerge, getObjectKeys, func + - The data variable is an array of JSON objects with the SQL fields OR API result fields as field names + + prompt_inputs: + - name: examples + content: |- + pdf_tool: + default_llm: "gpt-4" + default_fast_llm: "gpt-3.5-turbo" + description: >- + Summarization and Q&A tool to answer questions about embedded documents. + The tool extracts documents and answers the question in context. + Input is a query string, output is a string the answer to the user question. + {examples} + prompt_message: |- + Extracts: + {{retrieved_docs}} + + User Question: + {{question}} + system_context: |- + [PLACEHOLDER] Use-case specific system context here. + prompt_inputs: + - name: examples + content: |- + Example Input: \"User question: Could you tell me some information about artist X?\" + Example Output: \"Artist X is from..\" + sql_tool: + default_llm: "gpt-4" + default_fast_llm: "gpt-3.5-turbo" + description: >- + "SQL tool to query the connected database." + "Input is a question about the data in natural lanaguage, output is a string that contains an SQL query in markdown format, the number of rows the query returns and the first 3 rows." + prompt_message: |- + Given the database schema: + --- + {{table_schemas}} + --- + Please answer the following user questions with an SQL query: + {{question}} + system_context: |- + [PLACEHOLDER] Use-case specific system context here. + Follow these rules: + 1. Set the language to the markdown code block for each code block. For example, \```sql SELECT * FROM public.Artist``` is SQL. + 2. Use the postgreSQL dialect, i.e. only functions that are supported + prompt_inputs: + - name: examples + content: |- + - name: table_definitions + content: |- + public.db_table | description + (database table definitions here in format above) + + prompt_selection: |- + Given the following tables: + --- + {table_definitions} + --- + Select the tables that can be most useful for answering to the question: + {{question}} + system_context_selection: |- + [PLACEHOLDER] Use-case specific system context here. + You define which tables are useful to answer the question of the user. + prompt_validation: |- + Given the following SQL query: + {{query}} + and the following results executing the query with a LIMIT 5: + {{result}} + Does the query answer the following question? + {{question}} + + system_context_validation: |- + [PLACEHOLDER] Use-case specific system context here. + You should validate that the constructed SQL query is answering the question of the user. + prompt_refinement: |- + Given the database schema: + --- + {{table_schemas}} + --- + Given your previous answer and the complaint from the user, please improve the SQL query to answer the question of the user. + User question: {{question}} + Previous answer: {{previous_answer}} + Complaints: {{complaints}} + nb_example_rows: 3 + validate_empty_results: False + validate_with_llm: False + always_limit_query: False + image_generation_tool: + default_llm: "gpt-4" + default_fast_llm: "gpt-3.5-turbo" + description: >- + Tool to generate sample images for new products based on the product descriptions. Input is a string of description. Output is an url to the image. + prompt_message: |- + Here is decription of the item: {{description}} + image_description_prompt: |- + [PLACEHOLDER] Use-case specific system context here.. Given the full description of the item: + "{{text}}" + Generate a descriptive prompt message for generating an image of that item + + Follow the following principles: + - Keep the prompt message to one paragraph + - Be concise + - Be as close to the full description as possible + system_context: |- + You are a specialized in answering questions about generating a sample image based on an input description to an item. + Example: + input: {input} + output: {output} + prompt_inputs: + - name: input + content: |- + Can you generate an image according to the description: a sandwich with cheese and ham + - name: output + content: |- + The prompt for generating an image of the item is... + image_gen_with_input_tool: + default_llm: "gpt-4" + default_fast_llm: "gpt-3.5-turbo" + description: >- + Tool to generate sample images for new products based on the product descriptions input from the user prompt. + Input is a string of description. Output is an url to the image. + prompt_message: |- + Here is decription of the item: {{description}} + system_context: |- + You are a specialized in answering questions about generating a sample image based on an input description to an item. + + You must follow the principles: + - Generate only one description for generating the image + - The output should start with "The prompt for generating the image is", then followed by pasting the image description with the quotation marks + - The description for generating the image must be as close to the original description given in the prompt as possible + + Example: + {example} + prompt_inputs: + - name: example + content: |- + enter example here. diff --git a/backend/app/app/tool_constants/public_demo_data/agent_x_to_ingest/core/__init__.py b/backend/app/app/tool_constants/public_demo_data/agent_x_to_ingest/core/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/backend/app/app/tool_constants/public_demo_data/agent_x_to_ingest/core/config.py b/backend/app/app/tool_constants/public_demo_data/agent_x_to_ingest/core/config.py new file mode 100644 index 00000000..68dba398 --- /dev/null +++ b/backend/app/app/tool_constants/public_demo_data/agent_x_to_ingest/core/config.py @@ -0,0 +1,134 @@ +# -*- coding: utf-8 -*- +import os +import secrets +from typing import Any, Optional + +from pydantic import AnyHttpUrl, BaseSettings, PostgresDsn, validator +from sqlalchemy.engine import make_url + + +class Settings(BaseSettings): + DEV_MODE_LIGHT: bool = False + API_VERSION: str = "v1" + API_V1_STR: str = f"/api/{API_VERSION}" + PROJECT_NAME: str + OPENAI_API_KEY: str + OPENAI_ORGANIZATION: Optional[str] = None + OPENAI_API_BASE: Optional[str] = None + DATABASE_USER: str + DATABASE_PASSWORD: str + DATABASE_HOST: str + DATABASE_PORT: int | str + DATABASE_NAME: str + DATABASE_CELERY_NAME: str = "celery_schedule_jobs" + REDIS_HOST: str + REDIS_PORT: str + DB_POOL_SIZE = 83 + WEB_CONCURRENCY = 9 + POOL_SIZE = max(DB_POOL_SIZE // WEB_CONCURRENCY, 5) + ASYNC_DATABASE_URI: PostgresDsn | None + + @validator("ASYNC_DATABASE_URI", pre=True) + def assemble_db_connection(cls, v: str | None, values: dict[str, Any]) -> Any: + if isinstance(v, str): + return v + return PostgresDsn.build( + scheme="postgresql+asyncpg", + user=values.get("DATABASE_USER"), + password=values.get("DATABASE_PASSWORD"), + host=values.get("DATABASE_HOST"), + port=str(values.get("DATABASE_PORT")), + path=f"/{values.get('DATABASE_NAME') or ''}", + ) + + SYNC_CELERY_DATABASE_URI: str | None + + @validator("SYNC_CELERY_DATABASE_URI", pre=True) + def assemble_celery_db_connection(cls, v: str | None, values: dict[str, Any]) -> Any: + if isinstance(v, str): + return v + return PostgresDsn.build( + scheme="db+postgresql", + user=values.get("DATABASE_USER"), + password=values.get("DATABASE_PASSWORD"), + host=values.get("DATABASE_HOST"), + port=str(values.get("DATABASE_PORT")), + path=f"/{values.get('DATABASE_CELERY_NAME') or ''}", + ) + + SYNC_CELERY_BEAT_DATABASE_URI: str | None + + @validator("SYNC_CELERY_BEAT_DATABASE_URI", pre=True) + def assemble_celery_beat_db_connection(cls, v: str | None, values: dict[str, Any]) -> Any: + if isinstance(v, str): + return v + return PostgresDsn.build( + scheme="postgresql+psycopg2", + user=values.get("DATABASE_USER"), + password=values.get("DATABASE_PASSWORD"), + host=values.get("DATABASE_HOST"), + port=str(values.get("DATABASE_PORT")), + path=f"/{values.get('DATABASE_CELERY_NAME') or ''}", + ) + + ASYNC_CELERY_BEAT_DATABASE_URI: str | None + + @validator("ASYNC_CELERY_BEAT_DATABASE_URI", pre=True) + def assemble_async_celery_beat_db_connection(cls, v: str | None, values: dict[str, Any]) -> Any: + if isinstance(v, str): + return v + return PostgresDsn.build( + scheme="postgresql+asyncpg", + user=values.get("DATABASE_USER"), + password=values.get("DATABASE_PASSWORD"), + host=values.get("DATABASE_HOST"), + port=str(values.get("DATABASE_PORT")), + path=f"/{values.get('DATABASE_CELERY_NAME') or ''}", + ) + + MINIO_ROOT_USER: str + MINIO_ROOT_PASSWORD: str + MINIO_URL: str + MINIO_BUCKET: str + + SECRET_KEY: str = secrets.token_urlsafe(32) + BACKEND_CORS_ORIGINS: list[str] | list[AnyHttpUrl] + + @validator("BACKEND_CORS_ORIGINS", pre=True) + def assemble_cors_origins(cls, v: str | list[str]) -> list[str] | str: + if isinstance(v, str) and not v.startswith("["): + return [i.strip() for i in v.split(",")] + elif isinstance(v, (list, str)): + return v + raise ValueError(v) + + PDF_TOOL_EXTRACTION_CONFIG_PATH: str + AGENT_CONFIG_PATH: str + + ################################ + # Tool specific configuration + ################################ + SQL_TOOL_DB_ENABLED: bool + SQL_TOOL_DB_SCHEMAS: list[str] = [] + SQL_TOOL_DB_INFO_PATH: str + SQL_TOOL_DB_URI: str + SQL_TOOL_DB_OVERWRITE_ON_START: bool = True + + @validator("SQL_TOOL_DB_URI", pre=True) + def assemble_sql_tool_db_connection(cls, v: str | None, values: dict[str, Any]) -> Any: + if not values.get("SQL_TOOL_DB_ENABLED"): + return "" + if isinstance(v, str): + return make_url(v).render_as_string(hide_password=False) + raise ValueError(v) + + PDF_TOOL_ENABLED: bool + PDF_TOOL_DATA_PATH: str + PDF_TOOL_DATABASE: str + + class Config: + case_sensitive = True + env_file = "./.env" if os.path.isfile("./.env") else os.path.expanduser("~/.env") + + +settings = Settings() diff --git a/backend/app/app/tool_constants/public_demo_data/agent_x_to_ingest/db/__init__.py b/backend/app/app/tool_constants/public_demo_data/agent_x_to_ingest/db/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/backend/app/app/tool_constants/public_demo_data/agent_x_to_ingest/db/vector_db_pdf_ingestion.py b/backend/app/app/tool_constants/public_demo_data/agent_x_to_ingest/db/vector_db_pdf_ingestion.py new file mode 100755 index 00000000..b3513cf2 --- /dev/null +++ b/backend/app/app/tool_constants/public_demo_data/agent_x_to_ingest/db/vector_db_pdf_ingestion.py @@ -0,0 +1,151 @@ +# -*- coding: utf-8 -*- +import logging +import os +from enum import Enum +from typing import List + +from dotenv import load_dotenv +from langchain.document_loaders import ( + PDFMinerLoader, + PDFMinerPDFasHTMLLoader, + PyMuPDFLoader, + PyPDFLoader, + UnstructuredPDFLoader, +) +from langchain.document_loaders.base import BaseLoader +from langchain.embeddings import OpenAIEmbeddings +from langchain.schema import Document +from langchain.text_splitter import TokenTextSplitter +from langchain.vectorstores.pgvector import PGVector +from pydantic import BaseModel + +from app.core.config import settings +from app.utils.config import Config + +logger = logging.getLogger(__name__) + + +class PDFParserEnum(Enum): + PyMuPDF = "PyMuPDF" + PDFMiner_HTML = "PDFMiner_HTML" + PDFMiner = "PDFMiner" + PyPDF = "PyPDF" + Unstructured = "Unstructured" + + +class IndexingConfig(BaseModel): + tokenizer_chunk_size: int = 3000 + tokenizer_chunk_overlap: int = 200 + pdf_parser: PDFParserEnum = PDFParserEnum.PyMuPDF.name + + +LOADER_DICT = { + PDFParserEnum.PyPDF.name: PyPDFLoader, + PDFParserEnum.PyMuPDF.name: PyMuPDFLoader, + PDFParserEnum.PDFMiner.name: PDFMinerLoader, + PDFParserEnum.PDFMiner_HTML.name: PDFMinerPDFasHTMLLoader, + PDFParserEnum.Unstructured.name: UnstructuredPDFLoader, +} + + +class PDFExtractionPipeline: + """Pipeline for extracting text from PDFs and load them into a vectorstore.""" + + pipeline_config: IndexingConfig + pdf_loader: BaseLoader + db: PGVector | None = None + embedding: OpenAIEmbeddings + + def __init__(self, pipeline_config: IndexingConfig): + load_dotenv() + + self.pipeline_config = pipeline_config + self.pdf_loader = LOADER_DICT[pipeline_config.pdf_parser] + self.embedding = OpenAIEmbeddings() + self.connection_str = PGVector.connection_string_from_db_params( + driver="psycopg2", + host=settings.DATABASE_HOST, + port=int(settings.DATABASE_PORT), + database=settings.PDF_TOOL_DATABASE, + user=settings.DATABASE_USER, + password=settings.DATABASE_PASSWORD, + ) + + def run(self, folder_path: str = None, load_index: bool = True) -> PGVector: + """Run the PDF extraction pipeline.""" + if load_index: + logger.info("Loading index from PSQL") + db = PGVector( + embedding_function=self.embedding, + collection_name="pdf_indexing_1", + connection_string=self.connection_str, + ) + return db + else: + return self._load_documents(folder_path) + + def _pdf_to_docs(self, pdf_dir_path: str) -> List[Document]: + """ + Using specified PDF miner to convert PDF documents to raw text chunks. + + Fallback: PyPDF + """ + documents = [] + for file_name in os.listdir(pdf_dir_path): + file_extension = os.path.splitext(file_name)[1].lower() + if file_extension == ".pdf": + logger.info(f"Loading {file_name} into vectorstore") + file_path = "{}/{}".format(pdf_dir_path, file_name) + try: + loader: BaseLoader = self.pdf_loader(file_path) + file_docs = loader.load() + documents.extend(file_docs) + logger.info(f"{file_name} loaded successfully") + except Exception as e: + logger.error( + "Could not extract text from PDF {} with {}: {}".format( + file_name, self.pipeline_config.pdf_parser, repr(e) + ) + ) + + return documents + + def _load_documents(self, folder_path: str) -> PGVector: + """Load documents into vectorstore.""" + text_documents = self._pdf_to_docs(folder_path) + text_splitter = TokenTextSplitter( + chunk_size=self.pipeline_config.tokenizer_chunk_size, + chunk_overlap=self.pipeline_config.tokenizer_chunk_overlap, + ) + texts = text_splitter.split_documents(text_documents) + + # Add metadata for separate filtering + for text in texts: + text.metadata["type"] = "Text" + + docs = [*texts] + + logger.info("Loading {} text-documents into vectorstore".format(len(texts))) + return PGVector.from_documents( + embedding=self.embedding, + documents=docs, + collection_name="pdf_indexing_1", + connection_string=self.connection_str, + pre_delete_collection=True, + ) + + +def run_pdf_ingestion_pipeline(load_index: bool = True) -> None: + """Run the PDF ingestion pipeline.""" + pdf_pipeline.run(settings.PDF_TOOL_DATA_PATH, load_index) + + +if settings.PDF_TOOL_ENABLED: + extraction_pipeline_config = Config(settings.PDF_TOOL_EXTRACTION_CONFIG_PATH).read() + pdf_pipeline = PDFExtractionPipeline(pipeline_config=extraction_pipeline_config.indexing) +else: + pdf_pipeline = PDFExtractionPipeline(pipeline_config=IndexingConfig()) + + +if __name__ == "__main__": + run_pdf_ingestion_pipeline(load_index=False) diff --git a/backend/app/app/tool_constants/public_demo_data/agent_x_to_ingest/schemas/__init__.py b/backend/app/app/tool_constants/public_demo_data/agent_x_to_ingest/schemas/__init__.py new file mode 100644 index 00000000..54d00814 --- /dev/null +++ b/backend/app/app/tool_constants/public_demo_data/agent_x_to_ingest/schemas/__init__.py @@ -0,0 +1,3 @@ +# -*- coding: utf-8 -*- +from .auth_schema import AccountSchema, SessionSchema, VerificationTokenSchema +from .user_schema import UserSchema diff --git a/backend/app/app/tool_constants/public_demo_data/agent_x_to_ingest/schemas/agent_schema.py b/backend/app/app/tool_constants/public_demo_data/agent_x_to_ingest/schemas/agent_schema.py new file mode 100644 index 00000000..f0739ce5 --- /dev/null +++ b/backend/app/app/tool_constants/public_demo_data/agent_x_to_ingest/schemas/agent_schema.py @@ -0,0 +1,30 @@ +# -*- coding: utf-8 -*- +from pydantic import BaseModel + +from app.schemas.tool_schema import LLMType, ToolsLibrary + + +class ActionPlan(BaseModel): + name: str + description: str + actions: list[list[str]] + + +class ActionPlans(BaseModel): + action_plans: dict[str, ActionPlan] + + +class AgentAndToolsConfig(BaseModel): + llm: LLMType + fast_llm: LLMType + fast_llm_token_limit: int + max_token_length: int + + +class AgentConfig(BaseModel): + common: AgentAndToolsConfig + tools: list[str] + action_plans: ActionPlans + prompt_message: str + system_context: str + tools_library: ToolsLibrary diff --git a/backend/app/app/tool_constants/public_demo_data/agent_x_to_ingest/schemas/auth_schema.py b/backend/app/app/tool_constants/public_demo_data/agent_x_to_ingest/schemas/auth_schema.py new file mode 100644 index 00000000..0891883d --- /dev/null +++ b/backend/app/app/tool_constants/public_demo_data/agent_x_to_ingest/schemas/auth_schema.py @@ -0,0 +1,47 @@ +# -*- coding: utf-8 -*- +from datetime import datetime + +from pydantic import BaseModel + +from .user_schema import UserSchema + + +class AccountSchema(BaseModel): + id: str + userId: str + type: str + provider: str + providerAccountId: str + refresh_token: str | None = None + access_token: str | None = None + expires_at: int | None = None + token_type: str | None = None + scope: str | None = None + id_token: str | None = None + session_state: str | None = None + + user: UserSchema = None + + class Config: + orm_mode = True + + +class SessionSchema(BaseModel): + id: str + sessionToken: str + userId: str + expires: datetime + + user: UserSchema = None + + class Config: + orm_mode = True + + +class VerificationTokenSchema(BaseModel): + identifier: str + token: str + expires: datetime + + class Config: + orm_mode = True diff --git a/backend/app/app/tool_constants/public_demo_data/agent_x_to_ingest/schemas/common_schema.py b/backend/app/app/tool_constants/public_demo_data/agent_x_to_ingest/schemas/common_schema.py new file mode 100644 index 00000000..9e31a532 --- /dev/null +++ b/backend/app/app/tool_constants/public_demo_data/agent_x_to_ingest/schemas/common_schema.py @@ -0,0 +1,14 @@ +# -*- coding: utf-8 -*- +from humps.camel import case +from pydantic import BaseModel + + +class QueryBase(BaseModel): + """Query base schema.""" + + class Config: + allow_population_by_field_name = True + + @staticmethod + def alias_generator(s): + return case(s) diff --git a/backend/app/app/tool_constants/public_demo_data/agent_x_to_ingest/schemas/message_schema.py b/backend/app/app/tool_constants/public_demo_data/agent_x_to_ingest/schemas/message_schema.py new file mode 100644 index 00000000..4d944295 --- /dev/null +++ b/backend/app/app/tool_constants/public_demo_data/agent_x_to_ingest/schemas/message_schema.py @@ -0,0 +1,58 @@ +# -*- coding: utf-8 -*- +from enum import Enum +from typing import Any, Optional, Union +from uuid import UUID + +from langchain.schema import AIMessage, HumanMessage, SystemMessage +from pydantic import BaseModel + +from app.schemas.common_schema import QueryBase + +LangchainMessage = Union[AIMessage, HumanMessage, SystemMessage] + + +class ICreatorRole(str, Enum): + system = "system" + user = "user" + agent = "agent" + + +class IChatMessage(QueryBase): + role: ICreatorRole + content: str + + def to_langchain(self) -> LangchainMessage | None: + match self.role: + case ICreatorRole.system: + return SystemMessage(content=self.content) + case ICreatorRole.user: + return HumanMessage(content=self.content) + case ICreatorRole.agent: + return AIMessage(content=self.content) + case _: + return None + + +class UserSettings(BaseModel): + data: dict[str, Any] + version: Optional[str] = None + + +class IChatQuery(QueryBase): + messages: list[IChatMessage] + api_key: str + conversation_id: UUID + new_message_id: UUID + user_email: str + settings: Optional[UserSettings] = None + + +class IFeedback(QueryBase): + conversation_id: UUID + message_id: UUID + user: str + score: int + comment: str + key: str + settings: Optional[UserSettings] = None + previous_id: Optional[str] = None diff --git a/backend/app/app/tool_constants/public_demo_data/agent_x_to_ingest/schemas/response_schema.py b/backend/app/app/tool_constants/public_demo_data/agent_x_to_ingest/schemas/response_schema.py new file mode 100644 index 00000000..39c1908d --- /dev/null +++ b/backend/app/app/tool_constants/public_demo_data/agent_x_to_ingest/schemas/response_schema.py @@ -0,0 +1,71 @@ +# -*- coding: utf-8 -*- +from collections.abc import Sequence +from math import ceil +from typing import Any, Generic, TypeVar + +from fastapi_pagination import Page, Params +from fastapi_pagination.bases import AbstractPage, AbstractParams +from pydantic.generics import GenericModel + +DataType = TypeVar("DataType") +T = TypeVar("T") + + +class PageBase(Page[T], Generic[T]): + pages: int + next_page: int | None + previous_page: int | None + + +class IResponseBase(GenericModel, Generic[T]): + message: str = "" + meta: dict = {} + data: T | None + + +class IResponsePage(AbstractPage[T], Generic[T]): + message: str = "" + meta: dict = {} + data: PageBase[T] + + __params_type__ = Params # Set params related to Page + + @classmethod + def create( + cls, + items: Sequence[T], + total: int, + params: AbstractParams, + ) -> PageBase[T] | None: + if params.size is not None and total is not None and params.size != 0: + pages = ceil(total / params.size) + else: + pages = 0 + + return cls( + data=PageBase( + items=items, + page=params.page, + size=params.size, + total=total, + pages=pages, + next_page=params.page + 1 if params.page < pages else None, + previous_page=params.page - 1 if params.page > 1 else None, + ) + ) + + +class IGetResponseBase(IResponseBase[DataType], Generic[DataType]): + message: str = "Data got correctly" + + +def create_response( + data: DataType | None, + message: str | None = "", + meta: dict | Any | None = {}, +) -> dict[str, DataType] | DataType: + if isinstance(data, IResponsePage): + data.message = "Data paginated correctly" if not message else message + data.meta = meta + return data + return {"data": data, "message": message, "meta": meta} diff --git a/backend/app/app/tool_constants/public_demo_data/agent_x_to_ingest/schemas/streaming_schema.py b/backend/app/app/tool_constants/public_demo_data/agent_x_to_ingest/schemas/streaming_schema.py new file mode 100644 index 00000000..8ced4fdd --- /dev/null +++ b/backend/app/app/tool_constants/public_demo_data/agent_x_to_ingest/schemas/streaming_schema.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- +from enum import Enum +from typing import Any + +from pydantic import BaseModel + + +class StreamingDataTypeEnum(Enum): + text = "text" + llm = "llm" + appendix = "appendix" + action = "action" + signal = "signal" + + +class StreamingData(BaseModel): + data: str + data_type: StreamingDataTypeEnum = StreamingDataTypeEnum.text + metadata: dict[str, Any] = {} diff --git a/backend/app/app/tool_constants/public_demo_data/agent_x_to_ingest/schemas/tool_schema.py b/backend/app/app/tool_constants/public_demo_data/agent_x_to_ingest/schemas/tool_schema.py new file mode 100644 index 00000000..ae29f3b3 --- /dev/null +++ b/backend/app/app/tool_constants/public_demo_data/agent_x_to_ingest/schemas/tool_schema.py @@ -0,0 +1,54 @@ +# -*- coding: utf-8 -*- +from typing import Any, List, Literal, Optional, Union + +from langchain.schema import AIMessage, HumanMessage +from pydantic import BaseModel + +from app.schemas.message_schema import UserSettings + +LLMType = Literal["gpt-4", "gpt-3.5-turbo-1106", "azure-4-32k", "azure-3.5"] + + +class PromptInput(BaseModel): + name: str + content: str + + +class ToolConfig(BaseModel): + description: str + prompt_message: Optional[str] + image_description_prompt: Optional[str] + system_context: Optional[str] + prompt_selection: Optional[str] + system_context_selection: Optional[str] + prompt_validation: Optional[str] + system_context_validation: Optional[str] + prompt_refinement: Optional[str] + system_context_refinement: Optional[str] + prompt_inputs: list[PromptInput] + + +class SqlToolConfig(ToolConfig): + nb_example_rows: int + validate_empty_results: bool + validate_with_llm: bool + always_limit_query: bool + + +class RetrievalToolConfig(ToolConfig): + n_docs: int + + +class ToolsLibrary(BaseModel): + library: dict[str, ToolConfig] + + +class ToolInputSchema(BaseModel): + chat_history: List[Union[HumanMessage, AIMessage]] + latest_human_message: str + + # Practice configurations + user_settings: UserSettings + + # Tool outputs (intermediate results) + intermediate_steps: dict[str, Any] diff --git a/backend/app/app/tool_constants/public_demo_data/agent_x_to_ingest/schemas/tool_schemas/__init__.py b/backend/app/app/tool_constants/public_demo_data/agent_x_to_ingest/schemas/tool_schemas/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/backend/app/app/tool_constants/public_demo_data/agent_x_to_ingest/schemas/tool_schemas/pdf_tool_schema.py b/backend/app/app/tool_constants/public_demo_data/agent_x_to_ingest/schemas/tool_schemas/pdf_tool_schema.py new file mode 100644 index 00000000..254ae03a --- /dev/null +++ b/backend/app/app/tool_constants/public_demo_data/agent_x_to_ingest/schemas/tool_schemas/pdf_tool_schema.py @@ -0,0 +1,16 @@ +# -*- coding: utf-8 -*- +from typing import List, Optional + +from pydantic import BaseModel, Field + + +class PdfAppendix(BaseModel): + doc_id: str + page_numbers: List[int] + reference_text: str + + +class CodebaseDocumentationMetadata(BaseModel): + type: str + source: str + header1: Optional[str] = Field(None, alias="Header 1") diff --git a/backend/app/app/tool_constants/public_demo_data/agent_x_to_ingest/schemas/tool_schemas/sql_tool_schema.py b/backend/app/app/tool_constants/public_demo_data/agent_x_to_ingest/schemas/tool_schemas/sql_tool_schema.py new file mode 100644 index 00000000..778d28fb --- /dev/null +++ b/backend/app/app/tool_constants/public_demo_data/agent_x_to_ingest/schemas/tool_schemas/sql_tool_schema.py @@ -0,0 +1,30 @@ +# -*- coding: utf-8 -*- +from typing import Any, List + +from pydantic import BaseModel + +from app.schemas.common_schema import QueryBase + + +class TableInfo(BaseModel): + """Table information.""" + + schema_name: str + table_name: str + structure: str + + @property + def name(self) -> str: + return self.schema_name + "." + self.table_name + + +class DatabaseInfo(BaseModel): + """Database information.""" + + tables: List[TableInfo] + + +class ExecutionResult(QueryBase): + raw_result: List[dict[str, Any]] + affected_rows: int | None = None + error: str | None = None diff --git a/backend/app/app/tool_constants/public_demo_data/agent_x_to_ingest/schemas/user_schema.py b/backend/app/app/tool_constants/public_demo_data/agent_x_to_ingest/schemas/user_schema.py new file mode 100644 index 00000000..d1ce5d46 --- /dev/null +++ b/backend/app/app/tool_constants/public_demo_data/agent_x_to_ingest/schemas/user_schema.py @@ -0,0 +1,22 @@ +# -*- coding: utf-8 -*- +from datetime import datetime +from typing import Any + +from pydantic import BaseModel + + +# Define schemas +class UserSchema(BaseModel): + id: str + name: str | None = None + email: str | None = None + emailVerified: datetime | None = None + image: str | None = None + credits: int = 3 + location: str | None = None + + accounts: list[Any] = [] + sessions: list[Any] = [] + + class Config: + orm_mode = True diff --git a/backend/app/app/tool_constants/public_demo_data/backend_flow.md b/backend/app/app/tool_constants/public_demo_data/backend_flow.md new file mode 100644 index 00000000..ace2a499 --- /dev/null +++ b/backend/app/app/tool_constants/public_demo_data/backend_flow.md @@ -0,0 +1,45 @@ +# AgentKit Backend Flow + +The general backend flow is mainly constructed through the following four Python files, each serving a specific purpose. + +## chat.py + +This is the main backend entry point of AgentKit. It exposes a FastAPI endpoint at `/agent` which accepts POST requests. +The request body should contain a chat query, which is processed by the `agent_chat` function. This function creates a +conversation with an agent and returns an `StreamingJsonListResponse` object. + +## meta_agent.py + +This file contains functions for creating and managing a meta agent. A meta agent is an instance of the `AgentExecutor` +class, which is responsible for executing AgentKit's logic. +- The `create_meta_agent` function creates a meta agent from a given configuration. +- The `get_conv_token_buffer_memory` function retrieves the chat history and stores it in a +`ConversationTokenBufferMemory` object. + +## SimpleRouterAgent.py + +This file contains the `SimpleRouterAgent` class. This class is +responsible for managing AgentKit's actions based on the input it receives. +- The `aplan` function decides what actions the agent should take based on the input and the intermediate steps taken so far. +- The `create_prompt` function creates a prompt for the agent. +- The `from_llm_and_tools` function constructs an agent from a language model and a set of tools. + +## get_tools.py + +This file contains the `get_tools` function, which retrieves a list of tools from a list of tool names. Each tool class +is responsible for a specific functionality of AgentKit. + +## Flow + +1. A POST request is sent to the `/agent` endpoint with a chat query in the request body. +2. The `agent_chat` function in `chat.py` is called. This function retrieves the meta agent associated with the API key +specified in the chat query. +3. The `agent_chat` function creates a conversation with the agent, handles exceptions, and returns a streaming response. +4. The meta agent, which is an instance of the `AgentExecutor` class, executes AgentKit's logic. This logic is +determined by the `SimpleRouterAgent` class in `SimpleRouterAgent.py`. +5. The `SimpleRouterAgent` class decides what actions the agent should take based on the input it receives and the +intermediate steps taken so far. +6. The `get_tools` function in `get_tools.py` is called to retrieve the tools needed by the agent. These tools are used +to perform various tasks, such as generating images, summarizing text, executing SQL queries, etc. +7. The conversation continues until the agent decides to stop, at which point the `agent_chat` function returns a +`StreamingJsonListResponse` object containing the conversation history. diff --git a/backend/app/app/tool_constants/public_demo_data/commit_history.csv b/backend/app/app/tool_constants/public_demo_data/commit_history.csv new file mode 100644 index 00000000..3505a2a7 --- /dev/null +++ b/backend/app/app/tool_constants/public_demo_data/commit_history.csv @@ -0,0 +1,4350 @@ +commit_hash,commit_timestamp,commit_user,commit_message,file_changed +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",.DS_Store +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",.env.example +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",.github/workflows/main.yml +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",.gitignore +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",CHANGELOG.md +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",Makefile +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",README.md +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",backend/Dockerfile +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",backend/app/alembic.ini +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",backend/app/alembic/README +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",backend/app/alembic/env.py +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",backend/app/alembic/script.py.mako +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",backend/app/app/.DS_Store +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",backend/app/app/__init__.py +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",backend/app/app/api/__init__.py +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",backend/app/app/api/celery_task.py +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",backend/app/app/api/deps.py +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",backend/app/app/api/v1/__init__.py +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",backend/app/app/api/v1/api.py +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",backend/app/app/api/v1/endpoints/__init__.py +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",backend/app/app/api/v1/endpoints/cache.py +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",backend/app/app/api/v1/endpoints/chat.py +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",backend/app/app/api/v1/endpoints/group.py +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",backend/app/app/api/v1/endpoints/login.py +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",backend/app/app/api/v1/endpoints/natural_language.py +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",backend/app/app/api/v1/endpoints/periodic_tasks.py +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",backend/app/app/api/v1/endpoints/report.py +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",backend/app/app/api/v1/endpoints/role.py +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",backend/app/app/api/v1/endpoints/sql.py +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",backend/app/app/api/v1/endpoints/user.py +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",backend/app/app/core/__init__.py +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",backend/app/app/core/authz.polar +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",backend/app/app/core/authz.py +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",backend/app/app/core/celery.py +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",backend/app/app/core/config.py +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",backend/app/app/core/security.py +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",backend/app/app/crud/__init__.py +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",backend/app/app/crud/base_crud.py +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",backend/app/app/crud/group_crud.py +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",backend/app/app/crud/image_media_crud.py +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",backend/app/app/crud/role_crud.py +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",backend/app/app/crud/user_crud.py +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",backend/app/app/db/.DS_Store +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",backend/app/app/db/__init__.py +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",backend/app/app/db/init_db.py +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",backend/app/app/db/session.py +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",backend/app/app/deps/celery_deps.py +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",backend/app/app/deps/group_deps.py +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",backend/app/app/deps/role_deps.py +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",backend/app/app/deps/user_deps.py +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",backend/app/app/initial_data.py +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",backend/app/app/main.py +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",backend/app/app/models/__init__.py +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",backend/app/app/models/base_uuid_model.py +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",backend/app/app/models/conversation_model.py +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",backend/app/app/models/group_model.py +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",backend/app/app/models/group_user_model.py +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",backend/app/app/models/image_media_model.py +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",backend/app/app/models/media_model.py +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",backend/app/app/models/message_model.py +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",backend/app/app/models/role_model.py +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",backend/app/app/models/user_model.py +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",backend/app/app/schemas/common_schema.py +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",backend/app/app/schemas/execution_schema.py +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",backend/app/app/schemas/group_schema.py +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",backend/app/app/schemas/image_media_schema.py +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",backend/app/app/schemas/media_schema.py +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",backend/app/app/schemas/message_schema.py +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",backend/app/app/schemas/response_schema.py +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",backend/app/app/schemas/role_schema.py +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",backend/app/app/schemas/sql_schema.py +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",backend/app/app/schemas/token_schema.py +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",backend/app/app/schemas/user_schema.py +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",backend/app/app/services/sql_chat/prompts.py +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",backend/app/app/services/sql_chat/sql_chat.py +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",backend/app/app/utils/__init__.py +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",backend/app/app/utils/exceptions/__init__.py +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",backend/app/app/utils/exceptions/common_exception.py +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",backend/app/app/utils/exceptions/user_exceptions.py +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",backend/app/app/utils/fastapi_globals.py +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",backend/app/app/utils/map_schema.py +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",backend/app/app/utils/minio_client.py +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",backend/app/app/utils/partial.py +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",backend/app/app/utils/print_model.py +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",backend/app/app/utils/requestvars.py +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",backend/app/app/utils/resize_image.py +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",backend/app/app/utils/snowflake.py +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",backend/app/app/utils/sql.py +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",backend/app/app/utils/streaming.py +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",backend/app/app/utils/token.py +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",backend/app/app/utils/uuid6.py +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",backend/app/poetry.lock +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",backend/app/poetry.toml +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",backend/app/pyproject.toml +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",caddy/Caddyfile +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",docker-compose-dev.yml +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",docker-compose.yml +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",frontend/.dockerignore +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",frontend/.env.example +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",frontend/.eslintrc.json +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",frontend/.gitignore +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",frontend/Dockerfile +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",frontend/next.config.mjs +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",frontend/package.json +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",frontend/pnpm-lock.yaml +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",frontend/postcss.config.cjs +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",frontend/prettier.config.cjs +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",frontend/public/catalog-bg.png +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",frontend/public/favicon.ico +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",frontend/public/protocol-chat.webp +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",frontend/src/components/CodeBlock.tsx +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",frontend/src/components/ConversationView/ClearConversationButton/ClearConversationConfirmModal.tsx +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",frontend/src/components/ConversationView/ClearConversationButton/index.tsx +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",frontend/src/components/ConversationView/Header.tsx +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",frontend/src/components/ConversationView/MessageTextarea.tsx +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",frontend/src/components/ConversationView/MessageView.tsx +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",frontend/src/components/ConversationView/ThreeDotsLoader.tsx +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",frontend/src/components/ConversationView/index.tsx +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",frontend/src/components/CustomIcons/AgentIcon.tsx +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",frontend/src/components/CustomIcons/BcgX.tsx +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",frontend/src/components/CustomIcons/GammaSpinner.tsx +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",frontend/src/components/DarkmodeSwitch.tsx +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",frontend/src/components/DataStorageBanner.tsx +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",frontend/src/components/EmptyView.tsx +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",frontend/src/components/ExecutionView/DataTableView.tsx +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",frontend/src/components/ExecutionView/ExecutionWarningBanner.tsx +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",frontend/src/components/ExecutionView/NotificationView.tsx +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",frontend/src/components/Icon.tsx +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",frontend/src/components/QueryDrawer.tsx +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",frontend/src/components/Sidebar.tsx +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",frontend/src/components/SqlSnippet.tsx +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",frontend/src/components/UpdateConversationModal.tsx +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",frontend/src/components/kit/Dropdown.tsx +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",frontend/src/components/kit/Modal.tsx +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",frontend/src/components/kit/Select.tsx +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",frontend/src/components/kit/TextField.tsx +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",frontend/src/components/kit/Tooltip.tsx +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",frontend/src/env.mjs +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",frontend/src/hooks/useDarkmode.ts +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",frontend/src/middleware.js +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",frontend/src/pages/_app.tsx +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",frontend/src/pages/api/auth/[...nextauth].ts +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",frontend/src/pages/index.tsx +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",frontend/src/server/auth.ts +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",frontend/src/server/githubEnterprise.ts +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",frontend/src/store/assistants.ts +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",frontend/src/store/conversation.ts +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",frontend/src/store/index.ts +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",frontend/src/store/layout.ts +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",frontend/src/store/message.ts +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",frontend/src/store/query.ts +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",frontend/src/store/settings.ts +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",frontend/src/store/user.ts +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",frontend/src/styles/data-table.css +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",frontend/src/styles/globals.css +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",frontend/src/styles/mui.css +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",frontend/src/styles/tailwind.css +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",frontend/src/types/assistant.ts +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",frontend/src/types/common.ts +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",frontend/src/types/connector.ts +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",frontend/src/types/conversation.ts +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",frontend/src/types/index.ts +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",frontend/src/types/message.ts +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",frontend/src/types/settings.ts +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",frontend/src/types/user.ts +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",frontend/src/utils/constants.ts +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",frontend/src/utils/id.ts +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",frontend/src/utils/index.ts +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",frontend/src/utils/sql.ts +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",frontend/tailwind.config.ts +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",frontend/tsconfig.json +647c6aa6c28aa8c3f31a21c7a6247b3deb0e9881,05-09-2023 07:44:56,Jakob Heyder,"Protocol app v0, t3 nextjs template, fastapi async template",scripts/create-dbs.sql +81528376a35247698bbb47a168218c0c2115d931,05-09-2023 10:44:12,Jakob Heyder,"Add langchain tracing, and v0 untested sql_agent",README.md +81528376a35247698bbb47a168218c0c2115d931,05-09-2023 10:44:12,Jakob Heyder,"Add langchain tracing, and v0 untested sql_agent",backend/Dockerfile +81528376a35247698bbb47a168218c0c2115d931,05-09-2023 10:44:12,Jakob Heyder,"Add langchain tracing, and v0 untested sql_agent",backend/app/app/api/v1/endpoints/chat.py +81528376a35247698bbb47a168218c0c2115d931,05-09-2023 10:44:12,Jakob Heyder,"Add langchain tracing, and v0 untested sql_agent",backend/app/app/services/chat_agent/chat_agent.py +81528376a35247698bbb47a168218c0c2115d931,05-09-2023 10:44:12,Jakob Heyder,"Add langchain tracing, and v0 untested sql_agent",backend/app/app/services/chat_agent/helpers/constants.py +81528376a35247698bbb47a168218c0c2115d931,05-09-2023 10:44:12,Jakob Heyder,"Add langchain tracing, and v0 untested sql_agent",backend/app/app/services/chat_agent/helpers/utils.py +81528376a35247698bbb47a168218c0c2115d931,05-09-2023 10:44:12,Jakob Heyder,"Add langchain tracing, and v0 untested sql_agent",backend/app/app/services/chat_agent/sql_agent/output_parser.py +81528376a35247698bbb47a168218c0c2115d931,05-09-2023 10:44:12,Jakob Heyder,"Add langchain tracing, and v0 untested sql_agent",backend/app/app/services/chat_agent/sql_agent/prompts.py +81528376a35247698bbb47a168218c0c2115d931,05-09-2023 10:44:12,Jakob Heyder,"Add langchain tracing, and v0 untested sql_agent",backend/app/app/services/chat_agent/sql_agent/sql_agent.py +81528376a35247698bbb47a168218c0c2115d931,05-09-2023 10:44:12,Jakob Heyder,"Add langchain tracing, and v0 untested sql_agent",backend/app/app/services/chat_agent/sql_agent/toolkit.py +81528376a35247698bbb47a168218c0c2115d931,05-09-2023 10:44:12,Jakob Heyder,"Add langchain tracing, and v0 untested sql_agent",backend/app/app/services/chat_agent/sql_agent/tools.py +81528376a35247698bbb47a168218c0c2115d931,05-09-2023 10:44:12,Jakob Heyder,"Add langchain tracing, and v0 untested sql_agent",backend/app/app/services/sql_chat/sql_chat.py +81528376a35247698bbb47a168218c0c2115d931,05-09-2023 10:44:12,Jakob Heyder,"Add langchain tracing, and v0 untested sql_agent",backend/app/poetry.lock +81528376a35247698bbb47a168218c0c2115d931,05-09-2023 10:44:12,Jakob Heyder,"Add langchain tracing, and v0 untested sql_agent",backend/app/pyproject.toml +81528376a35247698bbb47a168218c0c2115d931,05-09-2023 10:44:12,Jakob Heyder,"Add langchain tracing, and v0 untested sql_agent",caddy/Caddyfile +81528376a35247698bbb47a168218c0c2115d931,05-09-2023 10:44:12,Jakob Heyder,"Add langchain tracing, and v0 untested sql_agent",docker-compose-dev.yml +81528376a35247698bbb47a168218c0c2115d931,05-09-2023 10:44:12,Jakob Heyder,"Add langchain tracing, and v0 untested sql_agent",docker-compose.yml +81528376a35247698bbb47a168218c0c2115d931,05-09-2023 10:44:12,Jakob Heyder,"Add langchain tracing, and v0 untested sql_agent",frontend/.env.example +81528376a35247698bbb47a168218c0c2115d931,05-09-2023 10:44:12,Jakob Heyder,"Add langchain tracing, and v0 untested sql_agent",frontend/src/env.mjs +81528376a35247698bbb47a168218c0c2115d931,05-09-2023 10:44:12,Jakob Heyder,"Add langchain tracing, and v0 untested sql_agent",frontend/src/server/auth.ts +39001848c594535d328b4bd3a974ab1802c23905,05-10-2023 08:47:59,Ilyass El Mansouri,feat: ingestion script,backend/app/app/services/chat_agent/summerization_agent/pdf_loader.py +39001848c594535d328b4bd3a974ab1802c23905,05-10-2023 08:47:59,Ilyass El Mansouri,feat: ingestion script,backend/app/app/services/chat_agent/summerization_agent/summarization_agent.py +39001848c594535d328b4bd3a974ab1802c23905,05-10-2023 08:47:59,Ilyass El Mansouri,feat: ingestion script,backend/app/poetry.lock +39001848c594535d328b4bd3a974ab1802c23905,05-10-2023 08:47:59,Ilyass El Mansouri,feat: ingestion script,backend/app/pyproject.toml +ee872eecd2d797fd52fefc58a9c67822d963aaae,05-10-2023 08:48:38,Ilyass El Mansouri,feat: add required data and config,.DS_Store +ee872eecd2d797fd52fefc58a9c67822d963aaae,05-10-2023 08:48:38,Ilyass El Mansouri,feat: add required data and config,.gitignore +ee872eecd2d797fd52fefc58a9c67822d963aaae,05-10-2023 08:48:38,Ilyass El Mansouri,feat: add required data and config,.idea/.gitignore +ee872eecd2d797fd52fefc58a9c67822d963aaae,05-10-2023 08:48:38,Ilyass El Mansouri,feat: add required data and config,.idea/aws.xml +ee872eecd2d797fd52fefc58a9c67822d963aaae,05-10-2023 08:48:38,Ilyass El Mansouri,feat: add required data and config,.idea/inspectionProfiles/Project_Default.xml +ee872eecd2d797fd52fefc58a9c67822d963aaae,05-10-2023 08:48:38,Ilyass El Mansouri,feat: add required data and config,.idea/inspectionProfiles/profiles_settings.xml +ee872eecd2d797fd52fefc58a9c67822d963aaae,05-10-2023 08:48:38,Ilyass El Mansouri,feat: add required data and config,.idea/jupyter-settings.xml +ee872eecd2d797fd52fefc58a9c67822d963aaae,05-10-2023 08:48:38,Ilyass El Mansouri,feat: add required data and config,.idea/misc.xml +ee872eecd2d797fd52fefc58a9c67822d963aaae,05-10-2023 08:48:38,Ilyass El Mansouri,feat: add required data and config,.idea/modules.xml +ee872eecd2d797fd52fefc58a9c67822d963aaae,05-10-2023 08:48:38,Ilyass El Mansouri,feat: add required data and config,.idea/protocol-app.iml +ee872eecd2d797fd52fefc58a9c67822d963aaae,05-10-2023 08:48:38,Ilyass El Mansouri,feat: add required data and config,.idea/vcs.xml +ee872eecd2d797fd52fefc58a9c67822d963aaae,05-10-2023 08:48:38,Ilyass El Mansouri,feat: add required data and config,backend/poetry.toml +ee872eecd2d797fd52fefc58a9c67822d963aaae,05-10-2023 08:48:38,Ilyass El Mansouri,feat: add required data and config,docker-compose.yml +ee872eecd2d797fd52fefc58a9c67822d963aaae,05-10-2023 08:48:38,Ilyass El Mansouri,feat: add required data and config,scripts/create-dbs.sql +ee872eecd2d797fd52fefc58a9c67822d963aaae,05-10-2023 08:48:38,Ilyass El Mansouri,feat: add required data and config,test_data/protocol_pdf/NCT03414047.pdf +ee872eecd2d797fd52fefc58a9c67822d963aaae,05-10-2023 08:48:38,Ilyass El Mansouri,feat: add required data and config,test_data/protocol_pdf/NCT03463525.pdf +ee872eecd2d797fd52fefc58a9c67822d963aaae,05-10-2023 08:48:38,Ilyass El Mansouri,feat: add required data and config,test_data/protocol_pdf/NCT03469336.pdf +ee872eecd2d797fd52fefc58a9c67822d963aaae,05-10-2023 08:48:38,Ilyass El Mansouri,feat: add required data and config,test_data/protocol_pdf/NCT03525678.pdf +ee872eecd2d797fd52fefc58a9c67822d963aaae,05-10-2023 08:48:38,Ilyass El Mansouri,feat: add required data and config,test_data/protocol_pdf/NCT03535740.pdf +ee872eecd2d797fd52fefc58a9c67822d963aaae,05-10-2023 08:48:38,Ilyass El Mansouri,feat: add required data and config,test_data/protocol_pdf/NCT03662659.pdf +ee872eecd2d797fd52fefc58a9c67822d963aaae,05-10-2023 08:48:38,Ilyass El Mansouri,feat: add required data and config,test_data/protocol_pdf/NCT03922477.pdf +ee872eecd2d797fd52fefc58a9c67822d963aaae,05-10-2023 08:48:38,Ilyass El Mansouri,feat: add required data and config,test_data/protocol_pdf/NCT03989232.pdf +ee872eecd2d797fd52fefc58a9c67822d963aaae,05-10-2023 08:48:38,Ilyass El Mansouri,feat: add required data and config,test_data/protocol_pdf/NCT04059484.pdf +ee872eecd2d797fd52fefc58a9c67822d963aaae,05-10-2023 08:48:38,Ilyass El Mansouri,feat: add required data and config,test_data/protocol_pdf/NCT04490499.pdf +ed6547748ff8c9c51ede13726e6719df50b88ab0,05-10-2023 13:32:00,Ilyass El Mansouri,refactor: create extraction pipeline and deployment to db,backend/app/app/config/__init__.py +ed6547748ff8c9c51ede13726e6719df50b88ab0,05-10-2023 13:32:00,Ilyass El Mansouri,refactor: create extraction pipeline and deployment to db,backend/app/app/config/extraction.yml +ed6547748ff8c9c51ede13726e6719df50b88ab0,05-10-2023 13:32:00,Ilyass El Mansouri,refactor: create extraction pipeline and deployment to db,backend/app/app/db/models.py +ed6547748ff8c9c51ede13726e6719df50b88ab0,05-10-2023 13:32:00,Ilyass El Mansouri,refactor: create extraction pipeline and deployment to db,backend/app/app/db/protocol_pdf_ingestion.py +ed6547748ff8c9c51ede13726e6719df50b88ab0,05-10-2023 13:32:00,Ilyass El Mansouri,refactor: create extraction pipeline and deployment to db,backend/app/app/services/chat_agent/summerization_agent/summarization_agent.py +ed6547748ff8c9c51ede13726e6719df50b88ab0,05-10-2023 13:32:00,Ilyass El Mansouri,refactor: create extraction pipeline and deployment to db,backend/app/app/utils/config.py +ed6547748ff8c9c51ede13726e6719df50b88ab0,05-10-2023 13:32:00,Ilyass El Mansouri,refactor: create extraction pipeline and deployment to db,backend/app/poetry.lock +ed6547748ff8c9c51ede13726e6719df50b88ab0,05-10-2023 13:32:00,Ilyass El Mansouri,refactor: create extraction pipeline and deployment to db,backend/app/pyproject.toml +ed6547748ff8c9c51ede13726e6719df50b88ab0,05-10-2023 13:32:00,Ilyass El Mansouri,refactor: create extraction pipeline and deployment to db,test_data/protocol_pdf/NCT03414047.pdf +ed6547748ff8c9c51ede13726e6719df50b88ab0,05-10-2023 13:32:00,Ilyass El Mansouri,refactor: create extraction pipeline and deployment to db,test_data/protocol_pdf/NCT03463525.pdf +ed6547748ff8c9c51ede13726e6719df50b88ab0,05-10-2023 13:32:00,Ilyass El Mansouri,refactor: create extraction pipeline and deployment to db,test_data/protocol_pdf/NCT03469336.pdf +ed6547748ff8c9c51ede13726e6719df50b88ab0,05-10-2023 13:32:00,Ilyass El Mansouri,refactor: create extraction pipeline and deployment to db,test_data/protocol_pdf/NCT03525678.pdf +ed6547748ff8c9c51ede13726e6719df50b88ab0,05-10-2023 13:32:00,Ilyass El Mansouri,refactor: create extraction pipeline and deployment to db,test_data/protocol_pdf/NCT03535740.pdf +ed6547748ff8c9c51ede13726e6719df50b88ab0,05-10-2023 13:32:00,Ilyass El Mansouri,refactor: create extraction pipeline and deployment to db,test_data/protocol_pdf/NCT03662659.pdf +ed6547748ff8c9c51ede13726e6719df50b88ab0,05-10-2023 13:32:00,Ilyass El Mansouri,refactor: create extraction pipeline and deployment to db,test_data/protocol_pdf/NCT03922477.pdf +ed6547748ff8c9c51ede13726e6719df50b88ab0,05-10-2023 13:32:00,Ilyass El Mansouri,refactor: create extraction pipeline and deployment to db,test_data/protocol_pdf/NCT03989232.pdf +ed6547748ff8c9c51ede13726e6719df50b88ab0,05-10-2023 13:32:00,Ilyass El Mansouri,refactor: create extraction pipeline and deployment to db,test_data/protocol_pdf/NCT04059484.pdf +ed6547748ff8c9c51ede13726e6719df50b88ab0,05-10-2023 13:32:00,Ilyass El Mansouri,refactor: create extraction pipeline and deployment to db,test_data/protocol_pdf/NCT04490499.pdf +affe1dd3a92e69f5531b4a75e8fdb3650eaeff89,05-10-2023 13:32:46,Ilyass El Mansouri,fix: pgvector extension,scripts/create-dbs.sql +f5f7450641554a4f79b21e6afa4ee00b85783adf,05-10-2023 13:38:51,Ilyass El Mansouri,refactor: remove pycharm metadata,.DS_Store +f5f7450641554a4f79b21e6afa4ee00b85783adf,05-10-2023 13:38:51,Ilyass El Mansouri,refactor: remove pycharm metadata,.gitignore +f5f7450641554a4f79b21e6afa4ee00b85783adf,05-10-2023 13:38:51,Ilyass El Mansouri,refactor: remove pycharm metadata,.idea/.gitignore +f5f7450641554a4f79b21e6afa4ee00b85783adf,05-10-2023 13:38:51,Ilyass El Mansouri,refactor: remove pycharm metadata,.idea/aws.xml +f5f7450641554a4f79b21e6afa4ee00b85783adf,05-10-2023 13:38:51,Ilyass El Mansouri,refactor: remove pycharm metadata,.idea/inspectionProfiles/Project_Default.xml +f5f7450641554a4f79b21e6afa4ee00b85783adf,05-10-2023 13:38:51,Ilyass El Mansouri,refactor: remove pycharm metadata,.idea/inspectionProfiles/profiles_settings.xml +f5f7450641554a4f79b21e6afa4ee00b85783adf,05-10-2023 13:38:51,Ilyass El Mansouri,refactor: remove pycharm metadata,.idea/jupyter-settings.xml +f5f7450641554a4f79b21e6afa4ee00b85783adf,05-10-2023 13:38:51,Ilyass El Mansouri,refactor: remove pycharm metadata,.idea/misc.xml +f5f7450641554a4f79b21e6afa4ee00b85783adf,05-10-2023 13:38:51,Ilyass El Mansouri,refactor: remove pycharm metadata,.idea/modules.xml +f5f7450641554a4f79b21e6afa4ee00b85783adf,05-10-2023 13:38:51,Ilyass El Mansouri,refactor: remove pycharm metadata,.idea/protocol-app.iml +f5f7450641554a4f79b21e6afa4ee00b85783adf,05-10-2023 13:38:51,Ilyass El Mansouri,refactor: remove pycharm metadata,.idea/vcs.xml +31ecebd45cad7b7927509f4dc83e381165add09c,05-10-2023 13:40:59,Ilyass El Mansouri,refactor: remove unused file,backend/app/app/services/chat_agent/summerization_agent/pdf_loader.py +529fde1fc129a675cb7a462bd3c5b3df2fc26772,05-10-2023 19:03:26,Ilyass El Mansouri,feat: add pdf chat agent,.gitignore +529fde1fc129a675cb7a462bd3c5b3df2fc26772,05-10-2023 19:03:26,Ilyass El Mansouri,feat: add pdf chat agent,backend/app/app/.DS_Store +529fde1fc129a675cb7a462bd3c5b3df2fc26772,05-10-2023 19:03:26,Ilyass El Mansouri,feat: add pdf chat agent,backend/app/app/db/protocol_pdf_ingestion.py +529fde1fc129a675cb7a462bd3c5b3df2fc26772,05-10-2023 19:03:26,Ilyass El Mansouri,feat: add pdf chat agent,backend/app/app/services/chat_agent/summerization_agent/__init__.py +529fde1fc129a675cb7a462bd3c5b3df2fc26772,05-10-2023 19:03:26,Ilyass El Mansouri,feat: add pdf chat agent,backend/app/app/services/chat_agent/summerization_agent/prompts.py +529fde1fc129a675cb7a462bd3c5b3df2fc26772,05-10-2023 19:03:26,Ilyass El Mansouri,feat: add pdf chat agent,backend/app/app/services/chat_agent/summerization_agent/summarization_agent.py +8ae38dabadc5de0e3eac9199d57290dfcf67df24,05-10-2023 19:04:47,Ilyass El Mansouri,refactor: remove unneeded comments,backend/app/app/services/chat_agent/summerization_agent/summarization_agent.py +b0e590231735b1012fcfc2d5dbc38f939761022c,05-11-2023 11:35:47,Jakob Heyder,v0 meta agent,.env.example +b0e590231735b1012fcfc2d5dbc38f939761022c,05-11-2023 11:35:47,Jakob Heyder,v0 meta agent,README.md +b0e590231735b1012fcfc2d5dbc38f939761022c,05-11-2023 11:35:47,Jakob Heyder,v0 meta agent,backend/app/app/api/v1/endpoints/chat.py +b0e590231735b1012fcfc2d5dbc38f939761022c,05-11-2023 11:35:47,Jakob Heyder,v0 meta agent,backend/app/app/constants/clinical_trial_db_info/clinical_trial_db_info.json +b0e590231735b1012fcfc2d5dbc38f939761022c,05-11-2023 11:35:47,Jakob Heyder,v0 meta agent,backend/app/app/constants/clinical_trial_db_info/clinical_trial_db_info.py +b0e590231735b1012fcfc2d5dbc38f939761022c,05-11-2023 11:35:47,Jakob Heyder,v0 meta agent,backend/app/app/core/config.py +b0e590231735b1012fcfc2d5dbc38f939761022c,05-11-2023 11:35:47,Jakob Heyder,v0 meta agent,backend/app/app/db/session.py +b0e590231735b1012fcfc2d5dbc38f939761022c,05-11-2023 11:35:47,Jakob Heyder,v0 meta agent,backend/app/app/deps/websocket_deps.py +b0e590231735b1012fcfc2d5dbc38f939761022c,05-11-2023 11:35:47,Jakob Heyder,v0 meta agent,backend/app/app/services/chat_agent/chat_agent.py +b0e590231735b1012fcfc2d5dbc38f939761022c,05-11-2023 11:35:47,Jakob Heyder,v0 meta agent,backend/app/app/services/chat_agent/executor.py +b0e590231735b1012fcfc2d5dbc38f939761022c,05-11-2023 11:35:47,Jakob Heyder,v0 meta agent,backend/app/app/services/chat_agent/prompts.py +b0e590231735b1012fcfc2d5dbc38f939761022c,05-11-2023 11:35:47,Jakob Heyder,v0 meta agent,backend/app/app/services/chat_agent/sql_agent/output_parser.py +b0e590231735b1012fcfc2d5dbc38f939761022c,05-11-2023 11:35:47,Jakob Heyder,v0 meta agent,backend/app/app/services/chat_agent/sql_agent/sql_agent.py +b0e590231735b1012fcfc2d5dbc38f939761022c,05-11-2023 11:35:47,Jakob Heyder,v0 meta agent,backend/app/app/services/chat_agent/sql_agent/tools.py +b0e590231735b1012fcfc2d5dbc38f939761022c,05-11-2023 11:35:47,Jakob Heyder,v0 meta agent,backend/app/app/services/chat_agent/sql_tool/prompts.py +b0e590231735b1012fcfc2d5dbc38f939761022c,05-11-2023 11:35:47,Jakob Heyder,v0 meta agent,backend/app/app/services/chat_agent/sql_tool/sql_tool.py +b0e590231735b1012fcfc2d5dbc38f939761022c,05-11-2023 11:35:47,Jakob Heyder,v0 meta agent,backend/app/app/services/sql_chat/sql_chat.py +b0e590231735b1012fcfc2d5dbc38f939761022c,05-11-2023 11:35:47,Jakob Heyder,v0 meta agent,backend/app/app/utils/llm.py +b0e590231735b1012fcfc2d5dbc38f939761022c,05-11-2023 11:35:47,Jakob Heyder,v0 meta agent,backend/app/app/utils/streaming.py +b0e590231735b1012fcfc2d5dbc38f939761022c,05-11-2023 11:35:47,Jakob Heyder,v0 meta agent,backend/app/app/utils/streaming/callbacks/stream.py +b0e590231735b1012fcfc2d5dbc38f939761022c,05-11-2023 11:35:47,Jakob Heyder,v0 meta agent,backend/app/poetry.lock +b0e590231735b1012fcfc2d5dbc38f939761022c,05-11-2023 11:35:47,Jakob Heyder,v0 meta agent,backend/app/pyproject.toml +b0e590231735b1012fcfc2d5dbc38f939761022c,05-11-2023 11:35:47,Jakob Heyder,v0 meta agent,frontend/src/components/ConversationView/index.tsx +b63043d50a093c5b2cc473cc61cb994cb7f5e003,05-11-2023 11:36:20,GitHub Enterprise,"Merge pull request #3 from ClinicalTrials/feat/v0-meta-agent + +v0 meta agent",.env.example +b63043d50a093c5b2cc473cc61cb994cb7f5e003,05-11-2023 11:36:20,GitHub Enterprise,"Merge pull request #3 from ClinicalTrials/feat/v0-meta-agent + +v0 meta agent",README.md +b63043d50a093c5b2cc473cc61cb994cb7f5e003,05-11-2023 11:36:20,GitHub Enterprise,"Merge pull request #3 from ClinicalTrials/feat/v0-meta-agent + +v0 meta agent",backend/app/app/api/v1/endpoints/chat.py +b63043d50a093c5b2cc473cc61cb994cb7f5e003,05-11-2023 11:36:20,GitHub Enterprise,"Merge pull request #3 from ClinicalTrials/feat/v0-meta-agent + +v0 meta agent",backend/app/app/constants/clinical_trial_db_info/clinical_trial_db_info.json +b63043d50a093c5b2cc473cc61cb994cb7f5e003,05-11-2023 11:36:20,GitHub Enterprise,"Merge pull request #3 from ClinicalTrials/feat/v0-meta-agent + +v0 meta agent",backend/app/app/constants/clinical_trial_db_info/clinical_trial_db_info.py +b63043d50a093c5b2cc473cc61cb994cb7f5e003,05-11-2023 11:36:20,GitHub Enterprise,"Merge pull request #3 from ClinicalTrials/feat/v0-meta-agent + +v0 meta agent",backend/app/app/core/config.py +b63043d50a093c5b2cc473cc61cb994cb7f5e003,05-11-2023 11:36:20,GitHub Enterprise,"Merge pull request #3 from ClinicalTrials/feat/v0-meta-agent + +v0 meta agent",backend/app/app/db/session.py +b63043d50a093c5b2cc473cc61cb994cb7f5e003,05-11-2023 11:36:20,GitHub Enterprise,"Merge pull request #3 from ClinicalTrials/feat/v0-meta-agent + +v0 meta agent",backend/app/app/deps/websocket_deps.py +b63043d50a093c5b2cc473cc61cb994cb7f5e003,05-11-2023 11:36:20,GitHub Enterprise,"Merge pull request #3 from ClinicalTrials/feat/v0-meta-agent + +v0 meta agent",backend/app/app/services/chat_agent/chat_agent.py +b63043d50a093c5b2cc473cc61cb994cb7f5e003,05-11-2023 11:36:20,GitHub Enterprise,"Merge pull request #3 from ClinicalTrials/feat/v0-meta-agent + +v0 meta agent",backend/app/app/services/chat_agent/executor.py +b63043d50a093c5b2cc473cc61cb994cb7f5e003,05-11-2023 11:36:20,GitHub Enterprise,"Merge pull request #3 from ClinicalTrials/feat/v0-meta-agent + +v0 meta agent",backend/app/app/services/chat_agent/prompts.py +b63043d50a093c5b2cc473cc61cb994cb7f5e003,05-11-2023 11:36:20,GitHub Enterprise,"Merge pull request #3 from ClinicalTrials/feat/v0-meta-agent + +v0 meta agent",backend/app/app/services/chat_agent/sql_agent/output_parser.py +b63043d50a093c5b2cc473cc61cb994cb7f5e003,05-11-2023 11:36:20,GitHub Enterprise,"Merge pull request #3 from ClinicalTrials/feat/v0-meta-agent + +v0 meta agent",backend/app/app/services/chat_agent/sql_agent/sql_agent.py +b63043d50a093c5b2cc473cc61cb994cb7f5e003,05-11-2023 11:36:20,GitHub Enterprise,"Merge pull request #3 from ClinicalTrials/feat/v0-meta-agent + +v0 meta agent",backend/app/app/services/chat_agent/sql_agent/tools.py +b63043d50a093c5b2cc473cc61cb994cb7f5e003,05-11-2023 11:36:20,GitHub Enterprise,"Merge pull request #3 from ClinicalTrials/feat/v0-meta-agent + +v0 meta agent",backend/app/app/services/chat_agent/sql_tool/prompts.py +b63043d50a093c5b2cc473cc61cb994cb7f5e003,05-11-2023 11:36:20,GitHub Enterprise,"Merge pull request #3 from ClinicalTrials/feat/v0-meta-agent + +v0 meta agent",backend/app/app/services/chat_agent/sql_tool/sql_tool.py +b63043d50a093c5b2cc473cc61cb994cb7f5e003,05-11-2023 11:36:20,GitHub Enterprise,"Merge pull request #3 from ClinicalTrials/feat/v0-meta-agent + +v0 meta agent",backend/app/app/services/sql_chat/sql_chat.py +b63043d50a093c5b2cc473cc61cb994cb7f5e003,05-11-2023 11:36:20,GitHub Enterprise,"Merge pull request #3 from ClinicalTrials/feat/v0-meta-agent + +v0 meta agent",backend/app/app/utils/llm.py +b63043d50a093c5b2cc473cc61cb994cb7f5e003,05-11-2023 11:36:20,GitHub Enterprise,"Merge pull request #3 from ClinicalTrials/feat/v0-meta-agent + +v0 meta agent",backend/app/app/utils/streaming.py +b63043d50a093c5b2cc473cc61cb994cb7f5e003,05-11-2023 11:36:20,GitHub Enterprise,"Merge pull request #3 from ClinicalTrials/feat/v0-meta-agent + +v0 meta agent",backend/app/app/utils/streaming/callbacks/stream.py +b63043d50a093c5b2cc473cc61cb994cb7f5e003,05-11-2023 11:36:20,GitHub Enterprise,"Merge pull request #3 from ClinicalTrials/feat/v0-meta-agent + +v0 meta agent",backend/app/poetry.lock +b63043d50a093c5b2cc473cc61cb994cb7f5e003,05-11-2023 11:36:20,GitHub Enterprise,"Merge pull request #3 from ClinicalTrials/feat/v0-meta-agent + +v0 meta agent",backend/app/pyproject.toml +b63043d50a093c5b2cc473cc61cb994cb7f5e003,05-11-2023 11:36:20,GitHub Enterprise,"Merge pull request #3 from ClinicalTrials/feat/v0-meta-agent + +v0 meta agent",frontend/src/components/ConversationView/index.tsx +43b0b276b81e7f3c6d2b2b51806868b49606931c,05-11-2023 11:50:44,Ilyass El Mansouri,feat: pdf agent as tool,backend/app/app/services/chat_agent/summerization_agent/summarization_agent.py +43b0b276b81e7f3c6d2b2b51806868b49606931c,05-11-2023 11:50:44,Ilyass El Mansouri,feat: pdf agent as tool,backend/app/app/services/chat_agent/summerization_agent/summarization_agent_v2.py +4501c2e950e0fdec6a4437467f7ab96bbc31c4a0,05-11-2023 12:08:34,Ilyass El Mansouri,fix: conflict,.env.example +4501c2e950e0fdec6a4437467f7ab96bbc31c4a0,05-11-2023 12:08:34,Ilyass El Mansouri,fix: conflict,README.md +4501c2e950e0fdec6a4437467f7ab96bbc31c4a0,05-11-2023 12:08:34,Ilyass El Mansouri,fix: conflict,backend/app/app/api/v1/endpoints/chat.py +4501c2e950e0fdec6a4437467f7ab96bbc31c4a0,05-11-2023 12:08:34,Ilyass El Mansouri,fix: conflict,backend/app/app/constants/clinical_trial_db_info/clinical_trial_db_info.json +4501c2e950e0fdec6a4437467f7ab96bbc31c4a0,05-11-2023 12:08:34,Ilyass El Mansouri,fix: conflict,backend/app/app/constants/clinical_trial_db_info/clinical_trial_db_info.py +4501c2e950e0fdec6a4437467f7ab96bbc31c4a0,05-11-2023 12:08:34,Ilyass El Mansouri,fix: conflict,backend/app/app/core/config.py +4501c2e950e0fdec6a4437467f7ab96bbc31c4a0,05-11-2023 12:08:34,Ilyass El Mansouri,fix: conflict,backend/app/app/db/session.py +4501c2e950e0fdec6a4437467f7ab96bbc31c4a0,05-11-2023 12:08:34,Ilyass El Mansouri,fix: conflict,backend/app/app/deps/websocket_deps.py +4501c2e950e0fdec6a4437467f7ab96bbc31c4a0,05-11-2023 12:08:34,Ilyass El Mansouri,fix: conflict,backend/app/app/services/chat_agent/chat_agent.py +4501c2e950e0fdec6a4437467f7ab96bbc31c4a0,05-11-2023 12:08:34,Ilyass El Mansouri,fix: conflict,backend/app/app/services/chat_agent/executor.py +4501c2e950e0fdec6a4437467f7ab96bbc31c4a0,05-11-2023 12:08:34,Ilyass El Mansouri,fix: conflict,backend/app/app/services/chat_agent/prompts.py +4501c2e950e0fdec6a4437467f7ab96bbc31c4a0,05-11-2023 12:08:34,Ilyass El Mansouri,fix: conflict,backend/app/app/services/chat_agent/sql_agent/output_parser.py +4501c2e950e0fdec6a4437467f7ab96bbc31c4a0,05-11-2023 12:08:34,Ilyass El Mansouri,fix: conflict,backend/app/app/services/chat_agent/sql_agent/sql_agent.py +4501c2e950e0fdec6a4437467f7ab96bbc31c4a0,05-11-2023 12:08:34,Ilyass El Mansouri,fix: conflict,backend/app/app/services/chat_agent/sql_agent/tools.py +4501c2e950e0fdec6a4437467f7ab96bbc31c4a0,05-11-2023 12:08:34,Ilyass El Mansouri,fix: conflict,backend/app/app/services/chat_agent/sql_tool/prompts.py +4501c2e950e0fdec6a4437467f7ab96bbc31c4a0,05-11-2023 12:08:34,Ilyass El Mansouri,fix: conflict,backend/app/app/services/chat_agent/sql_tool/sql_tool.py +4501c2e950e0fdec6a4437467f7ab96bbc31c4a0,05-11-2023 12:08:34,Ilyass El Mansouri,fix: conflict,backend/app/app/services/sql_chat/sql_chat.py +4501c2e950e0fdec6a4437467f7ab96bbc31c4a0,05-11-2023 12:08:34,Ilyass El Mansouri,fix: conflict,backend/app/app/utils/llm.py +4501c2e950e0fdec6a4437467f7ab96bbc31c4a0,05-11-2023 12:08:34,Ilyass El Mansouri,fix: conflict,backend/app/app/utils/streaming.py +4501c2e950e0fdec6a4437467f7ab96bbc31c4a0,05-11-2023 12:08:34,Ilyass El Mansouri,fix: conflict,backend/app/app/utils/streaming/callbacks/stream.py +4501c2e950e0fdec6a4437467f7ab96bbc31c4a0,05-11-2023 12:08:34,Ilyass El Mansouri,fix: conflict,backend/app/pyproject.toml +4501c2e950e0fdec6a4437467f7ab96bbc31c4a0,05-11-2023 12:08:34,Ilyass El Mansouri,fix: conflict,frontend/src/components/ConversationView/index.tsx +cd0b995ae0b605fca916da33751cce5fefbad82a,05-11-2023 12:42:39,Ilyass El Mansouri,feat: introduce summerizer as tool,backend/app/app/services/chat_agent/summerization_agent/summarization_agent.py +cd0b995ae0b605fca916da33751cce5fefbad82a,05-11-2023 12:42:39,Ilyass El Mansouri,feat: introduce summerizer as tool,backend/app/app/services/chat_agent/summerization_agent/summarization_agent_v2.py +cd0b995ae0b605fca916da33751cce5fefbad82a,05-11-2023 12:42:39,Ilyass El Mansouri,feat: introduce summerizer as tool,backend/app/app/services/chat_agent/summerization_agent/summarization_tool.py +cc0cc92676e5605d0212979f19ee7196d3181fd6,05-11-2023 13:21:30,Jakob Heyder,v0 UI Agent display,backend/app/app/services/chat_agent/sql_tool/sql_tool.py +cc0cc92676e5605d0212979f19ee7196d3181fd6,05-11-2023 13:21:30,Jakob Heyder,v0 UI Agent display,backend/app/app/utils/streaming/callbacks/stream.py +cc0cc92676e5605d0212979f19ee7196d3181fd6,05-11-2023 13:21:30,Jakob Heyder,v0 UI Agent display,frontend/package.json +cc0cc92676e5605d0212979f19ee7196d3181fd6,05-11-2023 13:21:30,Jakob Heyder,v0 UI Agent display,frontend/pnpm-lock.yaml +cc0cc92676e5605d0212979f19ee7196d3181fd6,05-11-2023 13:21:30,Jakob Heyder,v0 UI Agent display,frontend/src/components/ConversationView/Action.tsx +cc0cc92676e5605d0212979f19ee7196d3181fd6,05-11-2023 13:21:30,Jakob Heyder,v0 UI Agent display,frontend/src/components/ConversationView/LLMResponse.tsx +cc0cc92676e5605d0212979f19ee7196d3181fd6,05-11-2023 13:21:30,Jakob Heyder,v0 UI Agent display,frontend/src/components/ConversationView/MessageView.tsx +cc0cc92676e5605d0212979f19ee7196d3181fd6,05-11-2023 13:21:30,Jakob Heyder,v0 UI Agent display,frontend/src/components/Icon.tsx +2bd57abb57944c631aca47f1cc71b0c316c33b9d,05-11-2023 13:29:59,Ilyass El Mansouri,Merge remote-tracking branch 'origin/main' into feature/summerization,backend/app/app/services/chat_agent/sql_tool/sql_tool.py +2bd57abb57944c631aca47f1cc71b0c316c33b9d,05-11-2023 13:29:59,Ilyass El Mansouri,Merge remote-tracking branch 'origin/main' into feature/summerization,backend/app/app/utils/streaming/callbacks/stream.py +2bd57abb57944c631aca47f1cc71b0c316c33b9d,05-11-2023 13:29:59,Ilyass El Mansouri,Merge remote-tracking branch 'origin/main' into feature/summerization,frontend/package.json +2bd57abb57944c631aca47f1cc71b0c316c33b9d,05-11-2023 13:29:59,Ilyass El Mansouri,Merge remote-tracking branch 'origin/main' into feature/summerization,frontend/pnpm-lock.yaml +2bd57abb57944c631aca47f1cc71b0c316c33b9d,05-11-2023 13:29:59,Ilyass El Mansouri,Merge remote-tracking branch 'origin/main' into feature/summerization,frontend/src/components/ConversationView/Action.tsx +2bd57abb57944c631aca47f1cc71b0c316c33b9d,05-11-2023 13:29:59,Ilyass El Mansouri,Merge remote-tracking branch 'origin/main' into feature/summerization,frontend/src/components/ConversationView/LLMResponse.tsx +2bd57abb57944c631aca47f1cc71b0c316c33b9d,05-11-2023 13:29:59,Ilyass El Mansouri,Merge remote-tracking branch 'origin/main' into feature/summerization,frontend/src/components/ConversationView/MessageView.tsx +2bd57abb57944c631aca47f1cc71b0c316c33b9d,05-11-2023 13:29:59,Ilyass El Mansouri,Merge remote-tracking branch 'origin/main' into feature/summerization,frontend/src/components/Icon.tsx +4ead89765f0f86d4b6d06726cfddb544c52d6c5a,05-11-2023 14:38:13,Ilyass El Mansouri,feat: update summerization tool,README.md +4ead89765f0f86d4b6d06726cfddb544c52d6c5a,05-11-2023 14:38:13,Ilyass El Mansouri,feat: update summerization tool,backend/app/app/services/chat_agent/chat_agent.py +4ead89765f0f86d4b6d06726cfddb544c52d6c5a,05-11-2023 14:38:13,Ilyass El Mansouri,feat: update summerization tool,backend/app/app/services/chat_agent/summerization_agent/prompts.py +4ead89765f0f86d4b6d06726cfddb544c52d6c5a,05-11-2023 14:38:13,Ilyass El Mansouri,feat: update summerization tool,backend/app/app/services/chat_agent/summerization_agent/summarization_tool.py +bb5d7f0b305ea3390a4a9a2655a6b45b25871449,05-11-2023 15:14:27,Ilyass El Mansouri,refactor: breakdown summerization tool into two steps,backend/app/app/services/chat_agent/summerization_agent/prompts.py +bb5d7f0b305ea3390a4a9a2655a6b45b25871449,05-11-2023 15:14:27,Ilyass El Mansouri,refactor: breakdown summerization tool into two steps,backend/app/app/services/chat_agent/summerization_agent/summarization_tool.py +16a713a9785eefaee5780e3cdd7b4291722198ad,05-11-2023 15:57:27,Jakob Heyder,Fix: Meta agent prompt,backend/app/app/db/protocol_pdf_ingestion.py +16a713a9785eefaee5780e3cdd7b4291722198ad,05-11-2023 15:57:27,Jakob Heyder,Fix: Meta agent prompt,backend/app/app/services/chat_agent/prompts.py +16a713a9785eefaee5780e3cdd7b4291722198ad,05-11-2023 15:57:27,Jakob Heyder,Fix: Meta agent prompt,backend/app/app/services/chat_agent/summerization_agent/summarization_tool.py +16a713a9785eefaee5780e3cdd7b4291722198ad,05-11-2023 15:57:27,Jakob Heyder,Fix: Meta agent prompt,frontend/src/components/ConversationView/Action.tsx +16a713a9785eefaee5780e3cdd7b4291722198ad,05-11-2023 15:57:27,Jakob Heyder,Fix: Meta agent prompt,frontend/src/components/ConversationView/LLMResponse.tsx +3cf13dff3e0da47cc290d723d16f5e397edb423b,05-11-2023 16:15:31,Ilyass El Mansouri,fix: nct id filtering,backend/app/app/services/chat_agent/summerization_agent/prompts.py +3cf13dff3e0da47cc290d723d16f5e397edb423b,05-11-2023 16:15:31,Ilyass El Mansouri,fix: nct id filtering,backend/app/app/services/chat_agent/summerization_agent/summarization_tool.py +3c933cad8e1a643898571de5c02298e69b77991b,05-11-2023 16:15:56,Ilyass El Mansouri,Merge branch 'feature/summerization' of https://github.gamma.bcg.com/ClinicalTrials/protocol-app into feature/summerization,backend/app/app/db/protocol_pdf_ingestion.py +3c933cad8e1a643898571de5c02298e69b77991b,05-11-2023 16:15:56,Ilyass El Mansouri,Merge branch 'feature/summerization' of https://github.gamma.bcg.com/ClinicalTrials/protocol-app into feature/summerization,backend/app/app/services/chat_agent/prompts.py +3c933cad8e1a643898571de5c02298e69b77991b,05-11-2023 16:15:56,Ilyass El Mansouri,Merge branch 'feature/summerization' of https://github.gamma.bcg.com/ClinicalTrials/protocol-app into feature/summerization,backend/app/app/services/chat_agent/summerization_agent/summarization_tool.py +3c933cad8e1a643898571de5c02298e69b77991b,05-11-2023 16:15:56,Ilyass El Mansouri,Merge branch 'feature/summerization' of https://github.gamma.bcg.com/ClinicalTrials/protocol-app into feature/summerization,frontend/src/components/ConversationView/Action.tsx +3c933cad8e1a643898571de5c02298e69b77991b,05-11-2023 16:15:56,Ilyass El Mansouri,Merge branch 'feature/summerization' of https://github.gamma.bcg.com/ClinicalTrials/protocol-app into feature/summerization,frontend/src/components/ConversationView/LLMResponse.tsx +11ecde8deea2f2c74e1bfd064071e59bb48ed14a,05-11-2023 17:47:15,Ilyass El Mansouri,feat: prompt engineering pdf tool,backend/app/app/db/protocol_pdf_ingestion.py +11ecde8deea2f2c74e1bfd064071e59bb48ed14a,05-11-2023 17:47:15,Ilyass El Mansouri,feat: prompt engineering pdf tool,backend/app/app/services/chat_agent/summerization_agent/prompts.py +11ecde8deea2f2c74e1bfd064071e59bb48ed14a,05-11-2023 17:47:15,Ilyass El Mansouri,feat: prompt engineering pdf tool,backend/app/app/services/chat_agent/summerization_agent/summarization_agent.py +11ecde8deea2f2c74e1bfd064071e59bb48ed14a,05-11-2023 17:47:15,Ilyass El Mansouri,feat: prompt engineering pdf tool,backend/app/app/services/chat_agent/summerization_agent/summarization_tool.py +972e2c93a8c46f801e006359e52fd1480e3f42de,05-11-2023 17:54:36,Jakob Heyder,"Update sql-tool, validation and improvements loop v0",backend/app/app/services/chat_agent/chat_agent.py +972e2c93a8c46f801e006359e52fd1480e3f42de,05-11-2023 17:54:36,Jakob Heyder,"Update sql-tool, validation and improvements loop v0",backend/app/app/services/chat_agent/sql_tool/prompts.py +972e2c93a8c46f801e006359e52fd1480e3f42de,05-11-2023 17:54:36,Jakob Heyder,"Update sql-tool, validation and improvements loop v0",backend/app/app/services/chat_agent/sql_tool/sql_tool.py +972e2c93a8c46f801e006359e52fd1480e3f42de,05-11-2023 17:54:36,Jakob Heyder,"Update sql-tool, validation and improvements loop v0",backend/app/app/services/chat_agent/summerization_agent/summarization_tool.py +972e2c93a8c46f801e006359e52fd1480e3f42de,05-11-2023 17:54:36,Jakob Heyder,"Update sql-tool, validation and improvements loop v0",frontend/src/components/ConversationView/Action.tsx +972e2c93a8c46f801e006359e52fd1480e3f42de,05-11-2023 17:54:36,Jakob Heyder,"Update sql-tool, validation and improvements loop v0",frontend/src/components/ConversationView/LLMResponse.tsx +972e2c93a8c46f801e006359e52fd1480e3f42de,05-11-2023 17:54:36,Jakob Heyder,"Update sql-tool, validation and improvements loop v0",frontend/src/components/ConversationView/MessageView.tsx +972e2c93a8c46f801e006359e52fd1480e3f42de,05-11-2023 17:54:36,Jakob Heyder,"Update sql-tool, validation and improvements loop v0",frontend/tailwind.config.ts +46fb0c3084cea46b551a6d84b1effaa3e696a256,05-12-2023 07:10:42,GitHub Enterprise,"Merge pull request #1 from ClinicalTrials/feature/summerization + +[feature] PDF Q&A agent",.DS_Store +46fb0c3084cea46b551a6d84b1effaa3e696a256,05-12-2023 07:10:42,GitHub Enterprise,"Merge pull request #1 from ClinicalTrials/feature/summerization + +[feature] PDF Q&A agent",.gitignore +46fb0c3084cea46b551a6d84b1effaa3e696a256,05-12-2023 07:10:42,GitHub Enterprise,"Merge pull request #1 from ClinicalTrials/feature/summerization + +[feature] PDF Q&A agent",README.md +46fb0c3084cea46b551a6d84b1effaa3e696a256,05-12-2023 07:10:42,GitHub Enterprise,"Merge pull request #1 from ClinicalTrials/feature/summerization + +[feature] PDF Q&A agent",backend/app/app/.DS_Store +46fb0c3084cea46b551a6d84b1effaa3e696a256,05-12-2023 07:10:42,GitHub Enterprise,"Merge pull request #1 from ClinicalTrials/feature/summerization + +[feature] PDF Q&A agent",backend/app/app/config/__init__.py +46fb0c3084cea46b551a6d84b1effaa3e696a256,05-12-2023 07:10:42,GitHub Enterprise,"Merge pull request #1 from ClinicalTrials/feature/summerization + +[feature] PDF Q&A agent",backend/app/app/config/extraction.yml +46fb0c3084cea46b551a6d84b1effaa3e696a256,05-12-2023 07:10:42,GitHub Enterprise,"Merge pull request #1 from ClinicalTrials/feature/summerization + +[feature] PDF Q&A agent",backend/app/app/db/models.py +46fb0c3084cea46b551a6d84b1effaa3e696a256,05-12-2023 07:10:42,GitHub Enterprise,"Merge pull request #1 from ClinicalTrials/feature/summerization + +[feature] PDF Q&A agent",backend/app/app/db/protocol_pdf_ingestion.py +46fb0c3084cea46b551a6d84b1effaa3e696a256,05-12-2023 07:10:42,GitHub Enterprise,"Merge pull request #1 from ClinicalTrials/feature/summerization + +[feature] PDF Q&A agent",backend/app/app/services/chat_agent/chat_agent.py +46fb0c3084cea46b551a6d84b1effaa3e696a256,05-12-2023 07:10:42,GitHub Enterprise,"Merge pull request #1 from ClinicalTrials/feature/summerization + +[feature] PDF Q&A agent",backend/app/app/services/chat_agent/prompts.py +46fb0c3084cea46b551a6d84b1effaa3e696a256,05-12-2023 07:10:42,GitHub Enterprise,"Merge pull request #1 from ClinicalTrials/feature/summerization + +[feature] PDF Q&A agent",backend/app/app/services/chat_agent/sql_tool/prompts.py +46fb0c3084cea46b551a6d84b1effaa3e696a256,05-12-2023 07:10:42,GitHub Enterprise,"Merge pull request #1 from ClinicalTrials/feature/summerization + +[feature] PDF Q&A agent",backend/app/app/services/chat_agent/sql_tool/sql_tool.py +46fb0c3084cea46b551a6d84b1effaa3e696a256,05-12-2023 07:10:42,GitHub Enterprise,"Merge pull request #1 from ClinicalTrials/feature/summerization + +[feature] PDF Q&A agent",backend/app/app/services/chat_agent/summerization_agent/__init__.py +46fb0c3084cea46b551a6d84b1effaa3e696a256,05-12-2023 07:10:42,GitHub Enterprise,"Merge pull request #1 from ClinicalTrials/feature/summerization + +[feature] PDF Q&A agent",backend/app/app/services/chat_agent/summerization_agent/prompts.py +46fb0c3084cea46b551a6d84b1effaa3e696a256,05-12-2023 07:10:42,GitHub Enterprise,"Merge pull request #1 from ClinicalTrials/feature/summerization + +[feature] PDF Q&A agent",backend/app/app/services/chat_agent/summerization_agent/summarization_tool.py +46fb0c3084cea46b551a6d84b1effaa3e696a256,05-12-2023 07:10:42,GitHub Enterprise,"Merge pull request #1 from ClinicalTrials/feature/summerization + +[feature] PDF Q&A agent",backend/app/app/test_data/protocol_pdf/NCT03414047.pdf +46fb0c3084cea46b551a6d84b1effaa3e696a256,05-12-2023 07:10:42,GitHub Enterprise,"Merge pull request #1 from ClinicalTrials/feature/summerization + +[feature] PDF Q&A agent",backend/app/app/test_data/protocol_pdf/NCT03463525.pdf +46fb0c3084cea46b551a6d84b1effaa3e696a256,05-12-2023 07:10:42,GitHub Enterprise,"Merge pull request #1 from ClinicalTrials/feature/summerization + +[feature] PDF Q&A agent",backend/app/app/test_data/protocol_pdf/NCT03469336.pdf +46fb0c3084cea46b551a6d84b1effaa3e696a256,05-12-2023 07:10:42,GitHub Enterprise,"Merge pull request #1 from ClinicalTrials/feature/summerization + +[feature] PDF Q&A agent",backend/app/app/test_data/protocol_pdf/NCT03525678.pdf +46fb0c3084cea46b551a6d84b1effaa3e696a256,05-12-2023 07:10:42,GitHub Enterprise,"Merge pull request #1 from ClinicalTrials/feature/summerization + +[feature] PDF Q&A agent",backend/app/app/test_data/protocol_pdf/NCT03535740.pdf +46fb0c3084cea46b551a6d84b1effaa3e696a256,05-12-2023 07:10:42,GitHub Enterprise,"Merge pull request #1 from ClinicalTrials/feature/summerization + +[feature] PDF Q&A agent",backend/app/app/test_data/protocol_pdf/NCT03662659.pdf +46fb0c3084cea46b551a6d84b1effaa3e696a256,05-12-2023 07:10:42,GitHub Enterprise,"Merge pull request #1 from ClinicalTrials/feature/summerization + +[feature] PDF Q&A agent",backend/app/app/test_data/protocol_pdf/NCT03922477.pdf +46fb0c3084cea46b551a6d84b1effaa3e696a256,05-12-2023 07:10:42,GitHub Enterprise,"Merge pull request #1 from ClinicalTrials/feature/summerization + +[feature] PDF Q&A agent",backend/app/app/test_data/protocol_pdf/NCT03989232.pdf +46fb0c3084cea46b551a6d84b1effaa3e696a256,05-12-2023 07:10:42,GitHub Enterprise,"Merge pull request #1 from ClinicalTrials/feature/summerization + +[feature] PDF Q&A agent",backend/app/app/test_data/protocol_pdf/NCT04059484.pdf +46fb0c3084cea46b551a6d84b1effaa3e696a256,05-12-2023 07:10:42,GitHub Enterprise,"Merge pull request #1 from ClinicalTrials/feature/summerization + +[feature] PDF Q&A agent",backend/app/app/test_data/protocol_pdf/NCT04490499.pdf +46fb0c3084cea46b551a6d84b1effaa3e696a256,05-12-2023 07:10:42,GitHub Enterprise,"Merge pull request #1 from ClinicalTrials/feature/summerization + +[feature] PDF Q&A agent",backend/app/app/utils/config.py +46fb0c3084cea46b551a6d84b1effaa3e696a256,05-12-2023 07:10:42,GitHub Enterprise,"Merge pull request #1 from ClinicalTrials/feature/summerization + +[feature] PDF Q&A agent",backend/app/poetry.lock +46fb0c3084cea46b551a6d84b1effaa3e696a256,05-12-2023 07:10:42,GitHub Enterprise,"Merge pull request #1 from ClinicalTrials/feature/summerization + +[feature] PDF Q&A agent",backend/app/pyproject.toml +46fb0c3084cea46b551a6d84b1effaa3e696a256,05-12-2023 07:10:42,GitHub Enterprise,"Merge pull request #1 from ClinicalTrials/feature/summerization + +[feature] PDF Q&A agent",backend/poetry.toml +46fb0c3084cea46b551a6d84b1effaa3e696a256,05-12-2023 07:10:42,GitHub Enterprise,"Merge pull request #1 from ClinicalTrials/feature/summerization + +[feature] PDF Q&A agent",docker-compose.yml +46fb0c3084cea46b551a6d84b1effaa3e696a256,05-12-2023 07:10:42,GitHub Enterprise,"Merge pull request #1 from ClinicalTrials/feature/summerization + +[feature] PDF Q&A agent",frontend/src/components/ConversationView/Action.tsx +46fb0c3084cea46b551a6d84b1effaa3e696a256,05-12-2023 07:10:42,GitHub Enterprise,"Merge pull request #1 from ClinicalTrials/feature/summerization + +[feature] PDF Q&A agent",frontend/src/components/ConversationView/LLMResponse.tsx +46fb0c3084cea46b551a6d84b1effaa3e696a256,05-12-2023 07:10:42,GitHub Enterprise,"Merge pull request #1 from ClinicalTrials/feature/summerization + +[feature] PDF Q&A agent",frontend/src/components/ConversationView/MessageView.tsx +46fb0c3084cea46b551a6d84b1effaa3e696a256,05-12-2023 07:10:42,GitHub Enterprise,"Merge pull request #1 from ClinicalTrials/feature/summerization + +[feature] PDF Q&A agent",frontend/tailwind.config.ts +46fb0c3084cea46b551a6d84b1effaa3e696a256,05-12-2023 07:10:42,GitHub Enterprise,"Merge pull request #1 from ClinicalTrials/feature/summerization + +[feature] PDF Q&A agent",scripts/create-dbs.sql +96ec9a6113e1334988cd49cb1330233a9ee39c0d,05-12-2023 07:12:02,Jakob Heyder,Fix: remove printout and ingestion from root-dir,backend/app/app/db/protocol_pdf_ingestion.py +96ec9a6113e1334988cd49cb1330233a9ee39c0d,05-12-2023 07:12:02,Jakob Heyder,Fix: remove printout and ingestion from root-dir,frontend/src/components/ExecutionView/DataTableView.tsx +abdb3dacb2985212dd699ff01e8dc287cb4c6506,05-12-2023 07:38:28,Jakob Heyder,Fix: Sync docker-compose and dev,docker-compose-dev.yml +abdb3dacb2985212dd699ff01e8dc287cb4c6506,05-12-2023 07:38:28,Jakob Heyder,Fix: Sync docker-compose and dev,docker-compose.yml +79a5de07c50945353decbebe02b711dd6370c12b,05-12-2023 07:42:07,Jakob Heyder,Quickfix: docker-compose,docker-compose-dev.yml +59ceb4081c9626b9e1e8ba767ea31673dda473a0,05-12-2023 08:13:58,Jakob Heyder,Devops: Add docker-push artifactory action,.github/workflows/main.yml +59ceb4081c9626b9e1e8ba767ea31673dda473a0,05-12-2023 08:13:58,Jakob Heyder,Devops: Add docker-push artifactory action,backend/app/app/services/chat_agent/chat_agent.py +59ceb4081c9626b9e1e8ba767ea31673dda473a0,05-12-2023 08:13:58,Jakob Heyder,Devops: Add docker-push artifactory action,backend/app/app/services/chat_agent/executor.py +59ceb4081c9626b9e1e8ba767ea31673dda473a0,05-12-2023 08:13:58,Jakob Heyder,Devops: Add docker-push artifactory action,backend/app/poetry.lock +59ceb4081c9626b9e1e8ba767ea31673dda473a0,05-12-2023 08:13:58,Jakob Heyder,Devops: Add docker-push artifactory action,backend/app/pyproject.toml +dfc574c6416e99f200ba38ba6aa88e4027f9e776,05-12-2023 08:15:25,Jakob Heyder,Devops: Fix meta-id,.github/workflows/main.yml +6d27c9482b3fd5ba51fe7e79c666c50763ef8152,05-12-2023 08:37:52,Jakob Heyder,Devops: Run on self-hosted,.github/workflows/main.yml +2fd3aee265b2924d254fe606f1e3dbe9b96c65a4,05-12-2023 08:40:47,Jakob Heyder,Devops: Only run on linux,.github/workflows/main.yml +aa68267963f124c6e74f9411974dc482a82f1ab2,05-12-2023 08:52:36,Jakob Heyder,Devops: Artifactory deployment push,.github/workflows/main.yml +99c9ca16d3acc2e7f89307d43d005728835b0221,05-12-2023 11:18:34,Jakob Heyder,Devops: Fix prepare build,.github/workflows/main.yml +82790dc7d0d723e3776fd668c2e7e4b210c87bf6,05-12-2023 11:54:43,Jakob Heyder,Devops: Fix frontend build,.github/workflows/main.yml +2ae01fd303e0c1c0272dc9c5d2f9ef49246aba35,05-12-2023 12:09:21,Jakob Heyder,Devops: Build args as env variables (nextauth),frontend/Dockerfile +c025db5629ea4f39d93059eb6bbc0f6868babd57,05-12-2023 12:25:30,Jakob Heyder,Devops: Fix auth url,.github/workflows/main.yml +5669e7d30c227477cd1f5cbcf6d6a83423a07f87,05-12-2023 12:30:30,Jakob Heyder,Devops: Fix URL,.github/workflows/main.yml +6dd17dc0842ae0fdbb10b6ad62cdc31cf648ca5b,05-12-2023 12:37:40,Jakob Heyder,Devops: Artifactory images in docker-compose,docker-compose.yml +7b1ba767022758f28a2fd5a9cfedb3ab50983419,05-12-2023 13:30:04,Jakob Heyder,Fix: UI improvements for stream rendering,frontend/src/components/ConversationView/Action.tsx +7b1ba767022758f28a2fd5a9cfedb3ab50983419,05-12-2023 13:30:04,Jakob Heyder,Fix: UI improvements for stream rendering,frontend/src/components/ConversationView/LLMResponse.tsx +7b1ba767022758f28a2fd5a9cfedb3ab50983419,05-12-2023 13:30:04,Jakob Heyder,Fix: UI improvements for stream rendering,frontend/src/components/ConversationView/MessageView.tsx +7b1ba767022758f28a2fd5a9cfedb3ab50983419,05-12-2023 13:30:04,Jakob Heyder,Fix: UI improvements for stream rendering,frontend/src/components/QueryDrawer.tsx +5ac5e0f602e916fc1df82a24122517186d7bf63a,05-12-2023 14:59:34,Jakob Heyder,"Fix: Frontend stabilisation, stream display",backend/app/app/services/chat_agent/sql_tool/sql_tool.py +5ac5e0f602e916fc1df82a24122517186d7bf63a,05-12-2023 14:59:34,Jakob Heyder,"Fix: Frontend stabilisation, stream display",frontend/src/components/ConversationView/Action.tsx +5ac5e0f602e916fc1df82a24122517186d7bf63a,05-12-2023 14:59:34,Jakob Heyder,"Fix: Frontend stabilisation, stream display",frontend/src/components/ConversationView/LLMResponse.tsx +5ac5e0f602e916fc1df82a24122517186d7bf63a,05-12-2023 14:59:34,Jakob Heyder,"Fix: Frontend stabilisation, stream display",frontend/src/components/ConversationView/MessageView.tsx +c33e37bc07406d827daf644281fd457bfbae71ab,05-15-2023 07:13:03,Jakob Heyder,Add inline tables (commented out),frontend/src/components/CodeBlock.tsx +c33e37bc07406d827daf644281fd457bfbae71ab,05-15-2023 07:13:03,Jakob Heyder,Add inline tables (commented out),frontend/src/components/CodeFlipCard.tsx +c33e37bc07406d827daf644281fd457bfbae71ab,05-15-2023 07:13:03,Jakob Heyder,Add inline tables (commented out),frontend/src/components/ConversationView/MessageView.tsx +c33e37bc07406d827daf644281fd457bfbae71ab,05-15-2023 07:13:03,Jakob Heyder,Add inline tables (commented out),frontend/src/components/ExecutionView/AutoExecutorTableView.tsx +c33e37bc07406d827daf644281fd457bfbae71ab,05-15-2023 07:13:03,Jakob Heyder,Add inline tables (commented out),frontend/src/components/ExecutionView/DataTableView.tsx +c33e37bc07406d827daf644281fd457bfbae71ab,05-15-2023 07:13:03,Jakob Heyder,Add inline tables (commented out),frontend/src/components/SqlSnippet.tsx +596eee4a8d99ceebed5231df30ba7d9854232594,05-15-2023 14:30:17,Jakob Heyder,Fix: Enable table shown inline by default,frontend/src/components/CodeFlipCard.tsx +596eee4a8d99ceebed5231df30ba7d9854232594,05-15-2023 14:30:17,Jakob Heyder,Fix: Enable table shown inline by default,frontend/src/components/ConversationView/MessageView.tsx +47c2ca1822e1cfc360fa79921106389d760f82c3,05-15-2023 14:34:49,Jakob Heyder,Cleanup,frontend/src/components/CodeBlock.tsx +47c2ca1822e1cfc360fa79921106389d760f82c3,05-15-2023 14:34:49,Jakob Heyder,Cleanup,frontend/src/components/CodeFlipCard.tsx +813bff4e9015abf0596b780de82f9521b44c79d5,05-15-2023 14:35:20,GitHub Enterprise,"Merge pull request #4 from ClinicalTrials/feat/inline-table-views + +Feat/inline table views",frontend/src/components/CodeBlock.tsx +813bff4e9015abf0596b780de82f9521b44c79d5,05-15-2023 14:35:20,GitHub Enterprise,"Merge pull request #4 from ClinicalTrials/feat/inline-table-views + +Feat/inline table views",frontend/src/components/CodeFlipCard.tsx +813bff4e9015abf0596b780de82f9521b44c79d5,05-15-2023 14:35:20,GitHub Enterprise,"Merge pull request #4 from ClinicalTrials/feat/inline-table-views + +Feat/inline table views",frontend/src/components/ConversationView/MessageView.tsx +813bff4e9015abf0596b780de82f9521b44c79d5,05-15-2023 14:35:20,GitHub Enterprise,"Merge pull request #4 from ClinicalTrials/feat/inline-table-views + +Feat/inline table views",frontend/src/components/ExecutionView/AutoExecutorTableView.tsx +813bff4e9015abf0596b780de82f9521b44c79d5,05-15-2023 14:35:20,GitHub Enterprise,"Merge pull request #4 from ClinicalTrials/feat/inline-table-views + +Feat/inline table views",frontend/src/components/ExecutionView/DataTableView.tsx +813bff4e9015abf0596b780de82f9521b44c79d5,05-15-2023 14:35:20,GitHub Enterprise,"Merge pull request #4 from ClinicalTrials/feat/inline-table-views + +Feat/inline table views",frontend/src/components/SqlSnippet.tsx +543b515a84024f3d3d63030d377fbc609651d182,05-15-2023 15:44:37,Ilyass El Mansouri,feat: add multiple db query,.env.example +543b515a84024f3d3d63030d377fbc609651d182,05-15-2023 15:44:37,Ilyass El Mansouri,feat: add multiple db query,backend/app/app/constants/clinical_trial_db_info/clinical_trial_db_info.json +543b515a84024f3d3d63030d377fbc609651d182,05-15-2023 15:44:37,Ilyass El Mansouri,feat: add multiple db query,backend/app/app/constants/clinical_trial_db_info/clinical_trial_db_info.py +543b515a84024f3d3d63030d377fbc609651d182,05-15-2023 15:44:37,Ilyass El Mansouri,feat: add multiple db query,backend/app/app/constants/clinical_trial_db_info/pc_db_info.json +543b515a84024f3d3d63030d377fbc609651d182,05-15-2023 15:44:37,Ilyass El Mansouri,feat: add multiple db query,backend/app/app/core/config.py +543b515a84024f3d3d63030d377fbc609651d182,05-15-2023 15:44:37,Ilyass El Mansouri,feat: add multiple db query,backend/app/app/db/session.py +543b515a84024f3d3d63030d377fbc609651d182,05-15-2023 15:44:37,Ilyass El Mansouri,feat: add multiple db query,backend/app/app/services/chat_agent/sql_tool/prompts.py +543b515a84024f3d3d63030d377fbc609651d182,05-15-2023 15:44:37,Ilyass El Mansouri,feat: add multiple db query,backend/app/app/services/chat_agent/sql_tool/sql_tool.py +543b515a84024f3d3d63030d377fbc609651d182,05-15-2023 15:44:37,Ilyass El Mansouri,feat: add multiple db query,frontend/src/components/CodeFlipCard.tsx +543b515a84024f3d3d63030d377fbc609651d182,05-15-2023 15:44:37,Ilyass El Mansouri,feat: add multiple db query,frontend/src/components/ConversationView/MessageView.tsx +18f5f9f10f01ee964f1c6ab996099804ea36db5f,05-15-2023 15:50:04,Ilyass El Mansouri,fix: conflict,frontend/src/components/CodeBlock.tsx +18f5f9f10f01ee964f1c6ab996099804ea36db5f,05-15-2023 15:50:04,Ilyass El Mansouri,fix: conflict,frontend/src/components/CodeFlipCard.tsx +18f5f9f10f01ee964f1c6ab996099804ea36db5f,05-15-2023 15:50:04,Ilyass El Mansouri,fix: conflict,frontend/src/components/ConversationView/MessageView.tsx +0b77c94ee2862c62de374f50a2cfca14ec46baf6,05-15-2023 16:13:22,Ilyass El Mansouri,feat: fine tune prompts,backend/app/app/services/chat_agent/sql_tool/prompts.py +0b77c94ee2862c62de374f50a2cfca14ec46baf6,05-15-2023 16:13:22,Ilyass El Mansouri,feat: fine tune prompts,backend/app/app/services/chat_agent/sql_tool/sql_tool.py +52fbdf78d9a0423dc4ced29a1f60a62c88501bdd,05-15-2023 16:21:15,Ilyass El Mansouri,refactor: remove unneeded comments,backend/app/app/constants/clinical_trial_db_info/clinical_trial_db_info.py +52fbdf78d9a0423dc4ced29a1f60a62c88501bdd,05-15-2023 16:21:15,Ilyass El Mansouri,refactor: remove unneeded comments,backend/app/app/core/config.py +52fbdf78d9a0423dc4ced29a1f60a62c88501bdd,05-15-2023 16:21:15,Ilyass El Mansouri,refactor: remove unneeded comments,backend/app/app/db/session.py +52fbdf78d9a0423dc4ced29a1f60a62c88501bdd,05-15-2023 16:21:15,Ilyass El Mansouri,refactor: remove unneeded comments,backend/app/app/services/chat_agent/sql_tool/sql_tool.py +f3d052b36b8e2b5b57b6caf9f9373c9e8324b52d,05-15-2023 16:30:41,Ilyass El Mansouri,refactor: remove unneeded comments,.env.example +315792874463b9557079e612e0bf9e6adfb0e514,05-15-2023 17:40:01,GitHub Enterprise,"Merge pull request #5 from ClinicalTrials/feat/multi-db-query + +[feature] multi-database query",.env.example +315792874463b9557079e612e0bf9e6adfb0e514,05-15-2023 17:40:01,GitHub Enterprise,"Merge pull request #5 from ClinicalTrials/feat/multi-db-query + +[feature] multi-database query",backend/app/app/constants/clinical_trial_db_info/clinical_trial_db_info.json +315792874463b9557079e612e0bf9e6adfb0e514,05-15-2023 17:40:01,GitHub Enterprise,"Merge pull request #5 from ClinicalTrials/feat/multi-db-query + +[feature] multi-database query",backend/app/app/constants/clinical_trial_db_info/clinical_trial_db_info.py +315792874463b9557079e612e0bf9e6adfb0e514,05-15-2023 17:40:01,GitHub Enterprise,"Merge pull request #5 from ClinicalTrials/feat/multi-db-query + +[feature] multi-database query",backend/app/app/constants/clinical_trial_db_info/pc_db_info.json +315792874463b9557079e612e0bf9e6adfb0e514,05-15-2023 17:40:01,GitHub Enterprise,"Merge pull request #5 from ClinicalTrials/feat/multi-db-query + +[feature] multi-database query",backend/app/app/core/config.py +315792874463b9557079e612e0bf9e6adfb0e514,05-15-2023 17:40:01,GitHub Enterprise,"Merge pull request #5 from ClinicalTrials/feat/multi-db-query + +[feature] multi-database query",backend/app/app/db/session.py +315792874463b9557079e612e0bf9e6adfb0e514,05-15-2023 17:40:01,GitHub Enterprise,"Merge pull request #5 from ClinicalTrials/feat/multi-db-query + +[feature] multi-database query",backend/app/app/services/chat_agent/sql_tool/prompts.py +315792874463b9557079e612e0bf9e6adfb0e514,05-15-2023 17:40:01,GitHub Enterprise,"Merge pull request #5 from ClinicalTrials/feat/multi-db-query + +[feature] multi-database query",backend/app/app/services/chat_agent/sql_tool/sql_tool.py +61b914a8b6b3146bb4a4d8308719621b7f595dd9,05-16-2023 07:46:44,Jakob Heyder,Feat: V0 visualizer e2e,.github/workflows/main.yml +61b914a8b6b3146bb4a4d8308719621b7f595dd9,05-16-2023 07:46:44,Jakob Heyder,Feat: V0 visualizer e2e,backend/app/app/db/session.py +61b914a8b6b3146bb4a4d8308719621b7f595dd9,05-16-2023 07:46:44,Jakob Heyder,Feat: V0 visualizer e2e,backend/app/app/services/chat_agent/chat_agent.py +61b914a8b6b3146bb4a4d8308719621b7f595dd9,05-16-2023 07:46:44,Jakob Heyder,Feat: V0 visualizer e2e,backend/app/app/services/chat_agent/sql_tool/sql_tool.py +61b914a8b6b3146bb4a4d8308719621b7f595dd9,05-16-2023 07:46:44,Jakob Heyder,Feat: V0 visualizer e2e,backend/app/app/services/chat_agent/visualizer_tool/prompts.py +61b914a8b6b3146bb4a4d8308719621b7f595dd9,05-16-2023 07:46:44,Jakob Heyder,Feat: V0 visualizer e2e,backend/app/app/services/chat_agent/visualizer_tool/visualizer_tool.py +61b914a8b6b3146bb4a4d8308719621b7f595dd9,05-16-2023 07:46:44,Jakob Heyder,Feat: V0 visualizer e2e,frontend/package.json +61b914a8b6b3146bb4a4d8308719621b7f595dd9,05-16-2023 07:46:44,Jakob Heyder,Feat: V0 visualizer e2e,frontend/pnpm-lock.yaml +61b914a8b6b3146bb4a4d8308719621b7f595dd9,05-16-2023 07:46:44,Jakob Heyder,Feat: V0 visualizer e2e,frontend/src/components/CodeFlipCard.tsx +61b914a8b6b3146bb4a4d8308719621b7f595dd9,05-16-2023 07:46:44,Jakob Heyder,Feat: V0 visualizer e2e,frontend/src/components/ConversationView/Action.tsx +61b914a8b6b3146bb4a4d8308719621b7f595dd9,05-16-2023 07:46:44,Jakob Heyder,Feat: V0 visualizer e2e,frontend/src/components/ConversationView/MessageView.tsx +61b914a8b6b3146bb4a4d8308719621b7f595dd9,05-16-2023 07:46:44,Jakob Heyder,Feat: V0 visualizer e2e,frontend/src/components/ConversationView/index.tsx +61b914a8b6b3146bb4a4d8308719621b7f595dd9,05-16-2023 07:46:44,Jakob Heyder,Feat: V0 visualizer e2e,frontend/src/components/ExecutionView/AutoExecutorTableView.tsx +61b914a8b6b3146bb4a4d8308719621b7f595dd9,05-16-2023 07:46:44,Jakob Heyder,Feat: V0 visualizer e2e,frontend/src/components/JsxDisplay.tsx +61b914a8b6b3146bb4a4d8308719621b7f595dd9,05-16-2023 07:46:44,Jakob Heyder,Feat: V0 visualizer e2e,frontend/src/store/query.ts +61b914a8b6b3146bb4a4d8308719621b7f595dd9,05-16-2023 07:46:44,Jakob Heyder,Feat: V0 visualizer e2e,frontend/src/types/common.ts +5eb195d6f0d00dd3b17c2d03fa54e0fdb5205117,05-16-2023 16:40:04,Jakob Heyder,Fix: Small stabilisation update,backend/app/app/services/chat_agent/ConversationalChatAgent.py +5eb195d6f0d00dd3b17c2d03fa54e0fdb5205117,05-16-2023 16:40:04,Jakob Heyder,Fix: Small stabilisation update,backend/app/app/services/chat_agent/chat_agent.py +5eb195d6f0d00dd3b17c2d03fa54e0fdb5205117,05-16-2023 16:40:04,Jakob Heyder,Fix: Small stabilisation update,backend/app/app/services/chat_agent/prompts.py +5eb195d6f0d00dd3b17c2d03fa54e0fdb5205117,05-16-2023 16:40:04,Jakob Heyder,Fix: Small stabilisation update,backend/app/app/services/chat_agent/visualizer_tool/prompts.py +5eb195d6f0d00dd3b17c2d03fa54e0fdb5205117,05-16-2023 16:40:04,Jakob Heyder,Fix: Small stabilisation update,backend/app/app/services/chat_agent/visualizer_tool/visualizer_tool.py +5eb195d6f0d00dd3b17c2d03fa54e0fdb5205117,05-16-2023 16:40:04,Jakob Heyder,Fix: Small stabilisation update,backend/app/app/utils/streaming/callbacks/stream.py +5eb195d6f0d00dd3b17c2d03fa54e0fdb5205117,05-16-2023 16:40:04,Jakob Heyder,Fix: Small stabilisation update,backend/app/poetry.lock +5eb195d6f0d00dd3b17c2d03fa54e0fdb5205117,05-16-2023 16:40:04,Jakob Heyder,Fix: Small stabilisation update,backend/app/pyproject.toml +5eb195d6f0d00dd3b17c2d03fa54e0fdb5205117,05-16-2023 16:40:04,Jakob Heyder,Fix: Small stabilisation update,frontend/src/components/ConversationView/MessageView.tsx +5eb195d6f0d00dd3b17c2d03fa54e0fdb5205117,05-16-2023 16:40:04,Jakob Heyder,Fix: Small stabilisation update,frontend/src/components/ErrorBoundary.tsx +75697f6a2fc861b801bd0cdf2ef6e77fd94f24c2,05-16-2023 16:45:57,Jakob Heyder,Add redis-cache in non-dev mode,backend/app/app/main.py +a36596dc7855b4c4441e64c2ca61ab0b8fd7b980,05-16-2023 19:37:14,GitHub Enterprise,"Merge pull request #7 from ClinicalTrials/feat/jsx-charts + +[Feature] Include data visualizer as a tool",.github/workflows/main.yml +a36596dc7855b4c4441e64c2ca61ab0b8fd7b980,05-16-2023 19:37:14,GitHub Enterprise,"Merge pull request #7 from ClinicalTrials/feat/jsx-charts + +[Feature] Include data visualizer as a tool",backend/app/app/db/session.py +a36596dc7855b4c4441e64c2ca61ab0b8fd7b980,05-16-2023 19:37:14,GitHub Enterprise,"Merge pull request #7 from ClinicalTrials/feat/jsx-charts + +[Feature] Include data visualizer as a tool",backend/app/app/main.py +a36596dc7855b4c4441e64c2ca61ab0b8fd7b980,05-16-2023 19:37:14,GitHub Enterprise,"Merge pull request #7 from ClinicalTrials/feat/jsx-charts + +[Feature] Include data visualizer as a tool",backend/app/app/services/chat_agent/ConversationalChatAgent.py +a36596dc7855b4c4441e64c2ca61ab0b8fd7b980,05-16-2023 19:37:14,GitHub Enterprise,"Merge pull request #7 from ClinicalTrials/feat/jsx-charts + +[Feature] Include data visualizer as a tool",backend/app/app/services/chat_agent/chat_agent.py +a36596dc7855b4c4441e64c2ca61ab0b8fd7b980,05-16-2023 19:37:14,GitHub Enterprise,"Merge pull request #7 from ClinicalTrials/feat/jsx-charts + +[Feature] Include data visualizer as a tool",backend/app/app/services/chat_agent/prompts.py +a36596dc7855b4c4441e64c2ca61ab0b8fd7b980,05-16-2023 19:37:14,GitHub Enterprise,"Merge pull request #7 from ClinicalTrials/feat/jsx-charts + +[Feature] Include data visualizer as a tool",backend/app/app/services/chat_agent/sql_tool/sql_tool.py +a36596dc7855b4c4441e64c2ca61ab0b8fd7b980,05-16-2023 19:37:14,GitHub Enterprise,"Merge pull request #7 from ClinicalTrials/feat/jsx-charts + +[Feature] Include data visualizer as a tool",backend/app/app/services/chat_agent/visualizer_tool/prompts.py +a36596dc7855b4c4441e64c2ca61ab0b8fd7b980,05-16-2023 19:37:14,GitHub Enterprise,"Merge pull request #7 from ClinicalTrials/feat/jsx-charts + +[Feature] Include data visualizer as a tool",backend/app/app/services/chat_agent/visualizer_tool/visualizer_tool.py +a36596dc7855b4c4441e64c2ca61ab0b8fd7b980,05-16-2023 19:37:14,GitHub Enterprise,"Merge pull request #7 from ClinicalTrials/feat/jsx-charts + +[Feature] Include data visualizer as a tool",backend/app/app/utils/streaming/callbacks/stream.py +a36596dc7855b4c4441e64c2ca61ab0b8fd7b980,05-16-2023 19:37:14,GitHub Enterprise,"Merge pull request #7 from ClinicalTrials/feat/jsx-charts + +[Feature] Include data visualizer as a tool",backend/app/poetry.lock +a36596dc7855b4c4441e64c2ca61ab0b8fd7b980,05-16-2023 19:37:14,GitHub Enterprise,"Merge pull request #7 from ClinicalTrials/feat/jsx-charts + +[Feature] Include data visualizer as a tool",backend/app/pyproject.toml +a36596dc7855b4c4441e64c2ca61ab0b8fd7b980,05-16-2023 19:37:14,GitHub Enterprise,"Merge pull request #7 from ClinicalTrials/feat/jsx-charts + +[Feature] Include data visualizer as a tool",frontend/package.json +a36596dc7855b4c4441e64c2ca61ab0b8fd7b980,05-16-2023 19:37:14,GitHub Enterprise,"Merge pull request #7 from ClinicalTrials/feat/jsx-charts + +[Feature] Include data visualizer as a tool",frontend/pnpm-lock.yaml +a36596dc7855b4c4441e64c2ca61ab0b8fd7b980,05-16-2023 19:37:14,GitHub Enterprise,"Merge pull request #7 from ClinicalTrials/feat/jsx-charts + +[Feature] Include data visualizer as a tool",frontend/src/components/CodeFlipCard.tsx +a36596dc7855b4c4441e64c2ca61ab0b8fd7b980,05-16-2023 19:37:14,GitHub Enterprise,"Merge pull request #7 from ClinicalTrials/feat/jsx-charts + +[Feature] Include data visualizer as a tool",frontend/src/components/ConversationView/Action.tsx +a36596dc7855b4c4441e64c2ca61ab0b8fd7b980,05-16-2023 19:37:14,GitHub Enterprise,"Merge pull request #7 from ClinicalTrials/feat/jsx-charts + +[Feature] Include data visualizer as a tool",frontend/src/components/ConversationView/MessageView.tsx +a36596dc7855b4c4441e64c2ca61ab0b8fd7b980,05-16-2023 19:37:14,GitHub Enterprise,"Merge pull request #7 from ClinicalTrials/feat/jsx-charts + +[Feature] Include data visualizer as a tool",frontend/src/components/ConversationView/index.tsx +a36596dc7855b4c4441e64c2ca61ab0b8fd7b980,05-16-2023 19:37:14,GitHub Enterprise,"Merge pull request #7 from ClinicalTrials/feat/jsx-charts + +[Feature] Include data visualizer as a tool",frontend/src/components/ErrorBoundary.tsx +a36596dc7855b4c4441e64c2ca61ab0b8fd7b980,05-16-2023 19:37:14,GitHub Enterprise,"Merge pull request #7 from ClinicalTrials/feat/jsx-charts + +[Feature] Include data visualizer as a tool",frontend/src/components/ExecutionView/AutoExecutorTableView.tsx +a36596dc7855b4c4441e64c2ca61ab0b8fd7b980,05-16-2023 19:37:14,GitHub Enterprise,"Merge pull request #7 from ClinicalTrials/feat/jsx-charts + +[Feature] Include data visualizer as a tool",frontend/src/components/JsxDisplay.tsx +a36596dc7855b4c4441e64c2ca61ab0b8fd7b980,05-16-2023 19:37:14,GitHub Enterprise,"Merge pull request #7 from ClinicalTrials/feat/jsx-charts + +[Feature] Include data visualizer as a tool",frontend/src/store/query.ts +a36596dc7855b4c4441e64c2ca61ab0b8fd7b980,05-16-2023 19:37:14,GitHub Enterprise,"Merge pull request #7 from ClinicalTrials/feat/jsx-charts + +[Feature] Include data visualizer as a tool",frontend/src/types/common.ts +c4d3c8c73f37861dafdc25550679d78f57907b25,05-16-2023 21:34:25,Jakob Heyder,Devops: Fix deployment with env-vars,.env.example +c4d3c8c73f37861dafdc25550679d78f57907b25,05-16-2023 21:34:25,Jakob Heyder,Devops: Fix deployment with env-vars,backend/app/app/core/config.py +c4d3c8c73f37861dafdc25550679d78f57907b25,05-16-2023 21:34:25,Jakob Heyder,Devops: Fix deployment with env-vars,backend/app/app/db/protocol_pdf_ingestion.py +c4d3c8c73f37861dafdc25550679d78f57907b25,05-16-2023 21:34:25,Jakob Heyder,Devops: Fix deployment with env-vars,caddy/Caddyfile +643e0ee62e4e4c193fdf0974de05d0386f624b47,05-16-2023 22:09:46,Jakob Heyder,Devops: Fix FE build variables,.github/workflows/main.yml +643e0ee62e4e4c193fdf0974de05d0386f624b47,05-16-2023 22:09:46,Jakob Heyder,Devops: Fix FE build variables,frontend/Dockerfile +d7a46d1c5d15ff00be9e04b89add5ea6c005c09f,05-17-2023 08:10:06,Ilyass El Mansouri,fix: run pdf ingestion on startup,backend/app/app/db/session.py +86ebc31fcc5b38d7a3f1e86da2b8c7150061ac5e,05-17-2023 08:21:12,Ilyass El Mansouri,fix: add load index config,backend/app/app/db/protocol_pdf_ingestion.py +86ebc31fcc5b38d7a3f1e86da2b8c7150061ac5e,05-17-2023 08:21:12,Ilyass El Mansouri,fix: add load index config,backend/app/app/db/session.py +f92a909803a5301dc73f5f6bc9193cf012eb9abd,05-17-2023 08:57:59,Ilyass El Mansouri,fix: force_gpt in viz tool,backend/app/app/db/protocol_pdf_ingestion.py +f92a909803a5301dc73f5f6bc9193cf012eb9abd,05-17-2023 08:57:59,Ilyass El Mansouri,fix: force_gpt in viz tool,backend/app/app/db/session.py +f92a909803a5301dc73f5f6bc9193cf012eb9abd,05-17-2023 08:57:59,Ilyass El Mansouri,fix: force_gpt in viz tool,backend/app/app/services/chat_agent/visualizer_tool/visualizer_tool.py +5ddf4f79057f3831c385409290bd427fdc0a8575,05-17-2023 09:07:38,Ilyass El Mansouri,fix: load config env var as settings,backend/app/app/db/protocol_pdf_ingestion.py +cd800f2c1592d7e78650d06d7e27bdf0ddda1400,05-17-2023 09:34:26,GitHub Enterprise,"Merge pull request #8 from ClinicalTrials/fix/pdf-init + +[Fix] run pdf ingestion on startup",backend/app/app/db/protocol_pdf_ingestion.py +cd800f2c1592d7e78650d06d7e27bdf0ddda1400,05-17-2023 09:34:26,GitHub Enterprise,"Merge pull request #8 from ClinicalTrials/fix/pdf-init + +[Fix] run pdf ingestion on startup",backend/app/app/db/session.py +cd800f2c1592d7e78650d06d7e27bdf0ddda1400,05-17-2023 09:34:26,GitHub Enterprise,"Merge pull request #8 from ClinicalTrials/fix/pdf-init + +[Fix] run pdf ingestion on startup",backend/app/app/services/chat_agent/visualizer_tool/visualizer_tool.py +08f311011331e682cc7ea79927d4df7c663a57d8,05-17-2023 10:21:11,Jakob Heyder,Fix: Demo fixes for visualization,.env.example +08f311011331e682cc7ea79927d4df7c663a57d8,05-17-2023 10:21:11,Jakob Heyder,Fix: Demo fixes for visualization,backend/app/app/services/chat_agent/prompts.py +08f311011331e682cc7ea79927d4df7c663a57d8,05-17-2023 10:21:11,Jakob Heyder,Fix: Demo fixes for visualization,backend/app/app/services/chat_agent/visualizer_tool/visualizer_tool.py +08f311011331e682cc7ea79927d4df7c663a57d8,05-17-2023 10:21:11,Jakob Heyder,Fix: Demo fixes for visualization,frontend/src/components/CodeFlipCard.tsx +08f311011331e682cc7ea79927d4df7c663a57d8,05-17-2023 10:21:11,Jakob Heyder,Fix: Demo fixes for visualization,frontend/src/components/ConversationView/MessageView.tsx +08f311011331e682cc7ea79927d4df7c663a57d8,05-17-2023 10:21:11,Jakob Heyder,Fix: Demo fixes for visualization,frontend/src/components/ConversationView/index.tsx +08f311011331e682cc7ea79927d4df7c663a57d8,05-17-2023 10:21:11,Jakob Heyder,Fix: Demo fixes for visualization,frontend/src/components/CustomIcons/BcgX.tsx +08f311011331e682cc7ea79927d4df7c663a57d8,05-17-2023 10:21:11,Jakob Heyder,Fix: Demo fixes for visualization,frontend/src/components/JsxDisplay.tsx +08f311011331e682cc7ea79927d4df7c663a57d8,05-17-2023 10:21:11,Jakob Heyder,Fix: Demo fixes for visualization,frontend/src/store/query.ts +86632c8bef64cf69bb939c5d5c1bff6222b13fcb,05-17-2023 10:53:25,Jakob Heyder,Fix: Push env var for protocols path,.env.example +86632c8bef64cf69bb939c5d5c1bff6222b13fcb,05-17-2023 10:53:25,Jakob Heyder,Fix: Push env var for protocols path,backend/app/app/core/config.py +86632c8bef64cf69bb939c5d5c1bff6222b13fcb,05-17-2023 10:53:25,Jakob Heyder,Fix: Push env var for protocols path,caddy/Caddyfile +cfcdbbfcc077a1b6241d68ecd189729cc74a2ad3,05-17-2023 11:01:39,Jakob Heyder,Fix: Deploy only with env vars protocol ingestion,backend/app/app/db/protocol_pdf_ingestion.py +d6827b31204faf189542b8372adedd7f4086c795,05-17-2023 11:30:00,Jakob Heyder,Fix: Sync-Redis caching,backend/app/app/api/deps.py +d6827b31204faf189542b8372adedd7f4086c795,05-17-2023 11:30:00,Jakob Heyder,Fix: Sync-Redis caching,backend/app/app/main.py +d6827b31204faf189542b8372adedd7f4086c795,05-17-2023 11:30:00,Jakob Heyder,Fix: Sync-Redis caching,backend/app/poetry.lock +d6827b31204faf189542b8372adedd7f4086c795,05-17-2023 11:30:00,Jakob Heyder,Fix: Sync-Redis caching,backend/app/pyproject.toml +b865a6b3a61a79dac27e09de08dbb0ccd28400e0,05-17-2023 12:19:35,Jakob Heyder,Fix: Retrigger cache frontend,backend/app/app/constants/clinical_trial_db_info/clinical_trial_db_info.py +b865a6b3a61a79dac27e09de08dbb0ccd28400e0,05-17-2023 12:19:35,Jakob Heyder,Fix: Retrigger cache frontend,backend/app/app/db/session.py +b865a6b3a61a79dac27e09de08dbb0ccd28400e0,05-17-2023 12:19:35,Jakob Heyder,Fix: Retrigger cache frontend,backend/app/app/main.py +b865a6b3a61a79dac27e09de08dbb0ccd28400e0,05-17-2023 12:19:35,Jakob Heyder,Fix: Retrigger cache frontend,frontend/src/components/CodeBlock.tsx +b865a6b3a61a79dac27e09de08dbb0ccd28400e0,05-17-2023 12:19:35,Jakob Heyder,Fix: Retrigger cache frontend,frontend/src/components/CodeFlipCard.tsx +b865a6b3a61a79dac27e09de08dbb0ccd28400e0,05-17-2023 12:19:35,Jakob Heyder,Fix: Retrigger cache frontend,frontend/src/components/QueryDrawer.tsx +b865a6b3a61a79dac27e09de08dbb0ccd28400e0,05-17-2023 12:19:35,Jakob Heyder,Fix: Retrigger cache frontend,frontend/src/store/query.ts +f499d5e90a499e146f87fb69477ceba25364530e,05-17-2023 13:44:48,Ilyass El Mansouri,feat: add default colors and alternative naming,backend/app/app/services/chat_agent/prompts.py +f499d5e90a499e146f87fb69477ceba25364530e,05-17-2023 13:44:48,Ilyass El Mansouri,feat: add default colors and alternative naming,backend/app/app/services/chat_agent/visualizer_tool/prompts.py +bcbe18bbe6def1a52fca423f1fbfb819f9998972,05-17-2023 14:09:04,Jakob Heyder,Fix: Change server port 9090 and cache in backend instead of FE (execute request),README.md +bcbe18bbe6def1a52fca423f1fbfb819f9998972,05-17-2023 14:09:04,Jakob Heyder,Fix: Change server port 9090 and cache in backend instead of FE (execute request),backend/Dockerfile +bcbe18bbe6def1a52fca423f1fbfb819f9998972,05-17-2023 14:09:04,Jakob Heyder,Fix: Change server port 9090 and cache in backend instead of FE (execute request),backend/app/app/api/v1/endpoints/sql.py +bcbe18bbe6def1a52fca423f1fbfb819f9998972,05-17-2023 14:09:04,Jakob Heyder,Fix: Change server port 9090 and cache in backend instead of FE (execute request),backend/app/app/schemas/sql_schema.py +bcbe18bbe6def1a52fca423f1fbfb819f9998972,05-17-2023 14:09:04,Jakob Heyder,Fix: Change server port 9090 and cache in backend instead of FE (execute request),caddy/Caddyfile +bcbe18bbe6def1a52fca423f1fbfb819f9998972,05-17-2023 14:09:04,Jakob Heyder,Fix: Change server port 9090 and cache in backend instead of FE (execute request),docker-compose-dev.yml +bcbe18bbe6def1a52fca423f1fbfb819f9998972,05-17-2023 14:09:04,Jakob Heyder,Fix: Change server port 9090 and cache in backend instead of FE (execute request),docker-compose.yml +bcbe18bbe6def1a52fca423f1fbfb819f9998972,05-17-2023 14:09:04,Jakob Heyder,Fix: Change server port 9090 and cache in backend instead of FE (execute request),frontend/.env.example +bcbe18bbe6def1a52fca423f1fbfb819f9998972,05-17-2023 14:09:04,Jakob Heyder,Fix: Change server port 9090 and cache in backend instead of FE (execute request),frontend/src/components/CodeFlipCard.tsx +bcbe18bbe6def1a52fca423f1fbfb819f9998972,05-17-2023 14:09:04,Jakob Heyder,Fix: Change server port 9090 and cache in backend instead of FE (execute request),frontend/src/components/QueryDrawer.tsx +bcbe18bbe6def1a52fca423f1fbfb819f9998972,05-17-2023 14:09:04,Jakob Heyder,Fix: Change server port 9090 and cache in backend instead of FE (execute request),frontend/src/store/query.ts +87f4c253f7fbe3e28ae755365e66f9952e78dfff,05-17-2023 15:29:08,Ilyass El Mansouri,Merge remote-tracking branch 'origin/main' into feat/prompt-eng,README.md +87f4c253f7fbe3e28ae755365e66f9952e78dfff,05-17-2023 15:29:08,Ilyass El Mansouri,Merge remote-tracking branch 'origin/main' into feat/prompt-eng,backend/Dockerfile +87f4c253f7fbe3e28ae755365e66f9952e78dfff,05-17-2023 15:29:08,Ilyass El Mansouri,Merge remote-tracking branch 'origin/main' into feat/prompt-eng,backend/app/app/api/v1/endpoints/sql.py +87f4c253f7fbe3e28ae755365e66f9952e78dfff,05-17-2023 15:29:08,Ilyass El Mansouri,Merge remote-tracking branch 'origin/main' into feat/prompt-eng,backend/app/app/schemas/sql_schema.py +87f4c253f7fbe3e28ae755365e66f9952e78dfff,05-17-2023 15:29:08,Ilyass El Mansouri,Merge remote-tracking branch 'origin/main' into feat/prompt-eng,caddy/Caddyfile +87f4c253f7fbe3e28ae755365e66f9952e78dfff,05-17-2023 15:29:08,Ilyass El Mansouri,Merge remote-tracking branch 'origin/main' into feat/prompt-eng,docker-compose-dev.yml +87f4c253f7fbe3e28ae755365e66f9952e78dfff,05-17-2023 15:29:08,Ilyass El Mansouri,Merge remote-tracking branch 'origin/main' into feat/prompt-eng,docker-compose.yml +87f4c253f7fbe3e28ae755365e66f9952e78dfff,05-17-2023 15:29:08,Ilyass El Mansouri,Merge remote-tracking branch 'origin/main' into feat/prompt-eng,frontend/.env.example +87f4c253f7fbe3e28ae755365e66f9952e78dfff,05-17-2023 15:29:08,Ilyass El Mansouri,Merge remote-tracking branch 'origin/main' into feat/prompt-eng,frontend/src/components/CodeFlipCard.tsx +87f4c253f7fbe3e28ae755365e66f9952e78dfff,05-17-2023 15:29:08,Ilyass El Mansouri,Merge remote-tracking branch 'origin/main' into feat/prompt-eng,frontend/src/components/QueryDrawer.tsx +87f4c253f7fbe3e28ae755365e66f9952e78dfff,05-17-2023 15:29:08,Ilyass El Mansouri,Merge remote-tracking branch 'origin/main' into feat/prompt-eng,frontend/src/store/query.ts +a7d77f92bac3738ae215c68b12141002415f6aef,05-17-2023 15:30:31,Jakob Heyder,"Fix: Parse JSON and other code, instead of endless loading",frontend/src/components/CodeFlipCard.tsx +a7d77f92bac3738ae215c68b12141002415f6aef,05-17-2023 15:30:31,Jakob Heyder,"Fix: Parse JSON and other code, instead of endless loading",frontend/src/components/ConversationView/MessageView.tsx +a7d77f92bac3738ae215c68b12141002415f6aef,05-17-2023 15:30:31,Jakob Heyder,"Fix: Parse JSON and other code, instead of endless loading",frontend/src/types/common.ts +f8f16269eda434e254fb693695f7ffe549fb0a55,05-17-2023 15:36:20,Ilyass El Mansouri,feat: improve recommender,backend/app/app/services/chat_agent/prompts.py +c3a18634a25cf750117a284021acde56a0fd777a,05-19-2023 07:47:06,Jakob Heyder,Stabilize backend caching SQL queries,backend/app/app/api/v1/endpoints/sql.py +c3a18634a25cf750117a284021acde56a0fd777a,05-19-2023 07:47:06,Jakob Heyder,Stabilize backend caching SQL queries,frontend/src/components/CodeFlipCard.tsx +c3a18634a25cf750117a284021acde56a0fd777a,05-19-2023 07:47:06,Jakob Heyder,Stabilize backend caching SQL queries,frontend/src/components/ExecutionView/AutoExecutorTableView.tsx +c3a18634a25cf750117a284021acde56a0fd777a,05-19-2023 07:47:06,Jakob Heyder,Stabilize backend caching SQL queries,frontend/src/hooks/useCustomState.ts +700e642129b6df90270076d9a41b482e0529e57b,05-19-2023 08:00:31,Jakob Heyder,"Fix: Make a request to execute query (nextjs/react dev=2requests, prod=1)",frontend/src/components/CodeFlipCard.tsx +7fa9a4e8610f8afe89f25a8def1bf4b58178e351,05-19-2023 09:19:15,GitHub Enterprise,"Merge pull request #9 from ClinicalTrials/feat/prompt-eng + +[Feature] prompt engineering",backend/app/app/services/chat_agent/prompts.py +7fa9a4e8610f8afe89f25a8def1bf4b58178e351,05-19-2023 09:19:15,GitHub Enterprise,"Merge pull request #9 from ClinicalTrials/feat/prompt-eng + +[Feature] prompt engineering",backend/app/app/services/chat_agent/visualizer_tool/prompts.py +71bfc40b9232800979176a55a1ffa32b52beb022,05-19-2023 09:26:32,Jakob Heyder,Fix: Chart resizing based on parent,frontend/src/components/JsxDisplay.tsx +05a2fa6bdcf4b28f946e50ef918c7f4e5c9e78e0,05-22-2023 07:44:44,Jakob Heyder,Fix: Keep client session alive (snowflake),backend/app/app/core/config.py +05a2fa6bdcf4b28f946e50ef918c7f4e5c9e78e0,05-22-2023 07:44:44,Jakob Heyder,Fix: Keep client session alive (snowflake),backend/app/app/db/session.py +0afbd2e1656c489b9b51af85409413495976fb18,05-22-2023 13:30:59,Jakob Heyder,Fix: Visualize latest fitting SQL query before JSX,frontend/src/components/CodeFlipCard.tsx +0afbd2e1656c489b9b51af85409413495976fb18,05-22-2023 13:30:59,Jakob Heyder,Fix: Visualize latest fitting SQL query before JSX,frontend/src/components/ConversationView/MessageView.tsx +ff0449f2e67f6d89a00f6eeeb8ed91cff23a4565,05-22-2023 13:31:34,Jakob Heyder,"Feat: Stream directly from tools output as JSON, allow metadata passing & new rendering",backend/app/app/api/v1/endpoints/chat.py +ff0449f2e67f6d89a00f6eeeb8ed91cff23a4565,05-22-2023 13:31:34,Jakob Heyder,"Feat: Stream directly from tools output as JSON, allow metadata passing & new rendering",backend/app/app/schemas/streaming_schema.py +ff0449f2e67f6d89a00f6eeeb8ed91cff23a4565,05-22-2023 13:31:34,Jakob Heyder,"Feat: Stream directly from tools output as JSON, allow metadata passing & new rendering",backend/app/app/services/chat_agent/sql_tool/sql_tool.py +ff0449f2e67f6d89a00f6eeeb8ed91cff23a4565,05-22-2023 13:31:34,Jakob Heyder,"Feat: Stream directly from tools output as JSON, allow metadata passing & new rendering",backend/app/app/services/chat_agent/summerization_agent/summarization_tool.py +ff0449f2e67f6d89a00f6eeeb8ed91cff23a4565,05-22-2023 13:31:34,Jakob Heyder,"Feat: Stream directly from tools output as JSON, allow metadata passing & new rendering",backend/app/app/services/chat_agent/visualizer_tool/visualizer_tool.py +ff0449f2e67f6d89a00f6eeeb8ed91cff23a4565,05-22-2023 13:31:34,Jakob Heyder,"Feat: Stream directly from tools output as JSON, allow metadata passing & new rendering",backend/app/app/utils/streaming/StreamingJsonListResponse.py +ff0449f2e67f6d89a00f6eeeb8ed91cff23a4565,05-22-2023 13:31:34,Jakob Heyder,"Feat: Stream directly from tools output as JSON, allow metadata passing & new rendering",backend/app/app/utils/streaming/callbacks/stream.py +ff0449f2e67f6d89a00f6eeeb8ed91cff23a4565,05-22-2023 13:31:34,Jakob Heyder,"Feat: Stream directly from tools output as JSON, allow metadata passing & new rendering",backend/app/app/utils/streaming/helpers.py +ff0449f2e67f6d89a00f6eeeb8ed91cff23a4565,05-22-2023 13:31:34,Jakob Heyder,"Feat: Stream directly from tools output as JSON, allow metadata passing & new rendering",frontend/custom_typings/can-ndjson-stream/index.d.ts +ff0449f2e67f6d89a00f6eeeb8ed91cff23a4565,05-22-2023 13:31:34,Jakob Heyder,"Feat: Stream directly from tools output as JSON, allow metadata passing & new rendering",frontend/package.json +ff0449f2e67f6d89a00f6eeeb8ed91cff23a4565,05-22-2023 13:31:34,Jakob Heyder,"Feat: Stream directly from tools output as JSON, allow metadata passing & new rendering",frontend/pnpm-lock.yaml +ff0449f2e67f6d89a00f6eeeb8ed91cff23a4565,05-22-2023 13:31:34,Jakob Heyder,"Feat: Stream directly from tools output as JSON, allow metadata passing & new rendering",frontend/src/components/CodeBlock.tsx +ff0449f2e67f6d89a00f6eeeb8ed91cff23a4565,05-22-2023 13:31:34,Jakob Heyder,"Feat: Stream directly from tools output as JSON, allow metadata passing & new rendering",frontend/src/components/CodeFlipCard.tsx +ff0449f2e67f6d89a00f6eeeb8ed91cff23a4565,05-22-2023 13:31:34,Jakob Heyder,"Feat: Stream directly from tools output as JSON, allow metadata passing & new rendering",frontend/src/components/ConversationView/Action.tsx +ff0449f2e67f6d89a00f6eeeb8ed91cff23a4565,05-22-2023 13:31:34,Jakob Heyder,"Feat: Stream directly from tools output as JSON, allow metadata passing & new rendering",frontend/src/components/ConversationView/LLMResponse.tsx +ff0449f2e67f6d89a00f6eeeb8ed91cff23a4565,05-22-2023 13:31:34,Jakob Heyder,"Feat: Stream directly from tools output as JSON, allow metadata passing & new rendering",frontend/src/components/ConversationView/MessageTextarea.tsx +ff0449f2e67f6d89a00f6eeeb8ed91cff23a4565,05-22-2023 13:31:34,Jakob Heyder,"Feat: Stream directly from tools output as JSON, allow metadata passing & new rendering",frontend/src/components/ConversationView/MessageView.tsx +ff0449f2e67f6d89a00f6eeeb8ed91cff23a4565,05-22-2023 13:31:34,Jakob Heyder,"Feat: Stream directly from tools output as JSON, allow metadata passing & new rendering",frontend/src/components/ConversationView/MessageView/MessageEvent/LLMResponse.tsx +ff0449f2e67f6d89a00f6eeeb8ed91cff23a4565,05-22-2023 13:31:34,Jakob Heyder,"Feat: Stream directly from tools output as JSON, allow metadata passing & new rendering",frontend/src/components/ConversationView/MessageView/MessageEvent/index.tsx +ff0449f2e67f6d89a00f6eeeb8ed91cff23a4565,05-22-2023 13:31:34,Jakob Heyder,"Feat: Stream directly from tools output as JSON, allow metadata passing & new rendering",frontend/src/components/ConversationView/index.tsx +ff0449f2e67f6d89a00f6eeeb8ed91cff23a4565,05-22-2023 13:31:34,Jakob Heyder,"Feat: Stream directly from tools output as JSON, allow metadata passing & new rendering",frontend/src/components/EmptyView.tsx +ff0449f2e67f6d89a00f6eeeb8ed91cff23a4565,05-22-2023 13:31:34,Jakob Heyder,"Feat: Stream directly from tools output as JSON, allow metadata passing & new rendering",frontend/src/components/ExecutionView/DataTableView.tsx +ff0449f2e67f6d89a00f6eeeb8ed91cff23a4565,05-22-2023 13:31:34,Jakob Heyder,"Feat: Stream directly from tools output as JSON, allow metadata passing & new rendering",frontend/src/components/ExecutionView/ExecutionWarningBanner.tsx +ff0449f2e67f6d89a00f6eeeb8ed91cff23a4565,05-22-2023 13:31:34,Jakob Heyder,"Feat: Stream directly from tools output as JSON, allow metadata passing & new rendering",frontend/src/components/ExecutionView/Markdown.tsx +ff0449f2e67f6d89a00f6eeeb8ed91cff23a4565,05-22-2023 13:31:34,Jakob Heyder,"Feat: Stream directly from tools output as JSON, allow metadata passing & new rendering",frontend/src/components/ExecutionView/NotificationView.tsx +ff0449f2e67f6d89a00f6eeeb8ed91cff23a4565,05-22-2023 13:31:34,Jakob Heyder,"Feat: Stream directly from tools output as JSON, allow metadata passing & new rendering",frontend/src/components/ExecutionView/ResultsView.tsx +ff0449f2e67f6d89a00f6eeeb8ed91cff23a4565,05-22-2023 13:31:34,Jakob Heyder,"Feat: Stream directly from tools output as JSON, allow metadata passing & new rendering",frontend/src/components/JsxDisplay.tsx +ff0449f2e67f6d89a00f6eeeb8ed91cff23a4565,05-22-2023 13:31:34,Jakob Heyder,"Feat: Stream directly from tools output as JSON, allow metadata passing & new rendering",frontend/src/components/QueryDrawer.tsx +ff0449f2e67f6d89a00f6eeeb8ed91cff23a4565,05-22-2023 13:31:34,Jakob Heyder,"Feat: Stream directly from tools output as JSON, allow metadata passing & new rendering",frontend/src/pages/index.tsx +ff0449f2e67f6d89a00f6eeeb8ed91cff23a4565,05-22-2023 13:31:34,Jakob Heyder,"Feat: Stream directly from tools output as JSON, allow metadata passing & new rendering",frontend/src/types/message.ts +86f79677219944acea6e324710491d28b9912eeb,05-22-2023 16:03:33,Jakob Heyder,Meta-agent prompts for summarisation v0,backend/app/app/services/chat_agent/prompts.py +86f79677219944acea6e324710491d28b9912eeb,05-22-2023 16:03:33,Jakob Heyder,Meta-agent prompts for summarisation v0,backend/app/app/services/chat_agent/sql_tool/sql_tool.py +86f79677219944acea6e324710491d28b9912eeb,05-22-2023 16:03:33,Jakob Heyder,Meta-agent prompts for summarisation v0,backend/app/app/utils/streaming/helpers.py +86f79677219944acea6e324710491d28b9912eeb,05-22-2023 16:03:33,Jakob Heyder,Meta-agent prompts for summarisation v0,frontend/src/components/ConversationView/MessageView/index.tsx +c94ab52e168ded36e70820ec48fc2cfac8d5435d,05-22-2023 17:35:23,Jakob Heyder,Fix: Update langchain version and smaller robustness fixes,backend/app/app/schemas/streaming_schema.py +c94ab52e168ded36e70820ec48fc2cfac8d5435d,05-22-2023 17:35:23,Jakob Heyder,Fix: Update langchain version and smaller robustness fixes,backend/app/app/services/chat_agent/prompts.py +c94ab52e168ded36e70820ec48fc2cfac8d5435d,05-22-2023 17:35:23,Jakob Heyder,Fix: Update langchain version and smaller robustness fixes,backend/app/app/services/chat_agent/sql_tool/sql_tool.py +c94ab52e168ded36e70820ec48fc2cfac8d5435d,05-22-2023 17:35:23,Jakob Heyder,Fix: Update langchain version and smaller robustness fixes,backend/app/app/services/chat_agent/summerization_agent/summarization_tool.py +c94ab52e168ded36e70820ec48fc2cfac8d5435d,05-22-2023 17:35:23,Jakob Heyder,Fix: Update langchain version and smaller robustness fixes,backend/app/app/services/chat_agent/visualizer_tool/prompts.py +c94ab52e168ded36e70820ec48fc2cfac8d5435d,05-22-2023 17:35:23,Jakob Heyder,Fix: Update langchain version and smaller robustness fixes,backend/app/app/services/chat_agent/visualizer_tool/visualizer_tool.py +c94ab52e168ded36e70820ec48fc2cfac8d5435d,05-22-2023 17:35:23,Jakob Heyder,Fix: Update langchain version and smaller robustness fixes,backend/app/app/utils/streaming/callbacks/stream.py +c94ab52e168ded36e70820ec48fc2cfac8d5435d,05-22-2023 17:35:23,Jakob Heyder,Fix: Update langchain version and smaller robustness fixes,backend/app/poetry.lock +c94ab52e168ded36e70820ec48fc2cfac8d5435d,05-22-2023 17:35:23,Jakob Heyder,Fix: Update langchain version and smaller robustness fixes,backend/app/pyproject.toml +c94ab52e168ded36e70820ec48fc2cfac8d5435d,05-22-2023 17:35:23,Jakob Heyder,Fix: Update langchain version and smaller robustness fixes,frontend/package.json +c94ab52e168ded36e70820ec48fc2cfac8d5435d,05-22-2023 17:35:23,Jakob Heyder,Fix: Update langchain version and smaller robustness fixes,frontend/pnpm-lock.yaml +c94ab52e168ded36e70820ec48fc2cfac8d5435d,05-22-2023 17:35:23,Jakob Heyder,Fix: Update langchain version and smaller robustness fixes,frontend/src/components/ConversationView/MessageView/MessageEvent/index.tsx +c94ab52e168ded36e70820ec48fc2cfac8d5435d,05-22-2023 17:35:23,Jakob Heyder,Fix: Update langchain version and smaller robustness fixes,frontend/src/components/ConversationView/MessageView/index.tsx +c94ab52e168ded36e70820ec48fc2cfac8d5435d,05-22-2023 17:35:23,Jakob Heyder,Fix: Update langchain version and smaller robustness fixes,frontend/src/components/ConversationView/index.tsx +c94ab52e168ded36e70820ec48fc2cfac8d5435d,05-22-2023 17:35:23,Jakob Heyder,Fix: Update langchain version and smaller robustness fixes,frontend/src/components/ExecutionView/CodeFlipCard/index.tsx +c94ab52e168ded36e70820ec48fc2cfac8d5435d,05-22-2023 17:35:23,Jakob Heyder,Fix: Update langchain version and smaller robustness fixes,frontend/src/types/message.ts +7595db1956e17ae2e9ecad98db0de82adf112695,05-22-2023 17:36:17,GitHub Enterprise,"Merge pull request #10 from ClinicalTrials/feat/json-streaming + +Feat/json streaming",backend/app/app/api/v1/endpoints/chat.py +7595db1956e17ae2e9ecad98db0de82adf112695,05-22-2023 17:36:17,GitHub Enterprise,"Merge pull request #10 from ClinicalTrials/feat/json-streaming + +Feat/json streaming",backend/app/app/schemas/streaming_schema.py +7595db1956e17ae2e9ecad98db0de82adf112695,05-22-2023 17:36:17,GitHub Enterprise,"Merge pull request #10 from ClinicalTrials/feat/json-streaming + +Feat/json streaming",backend/app/app/services/chat_agent/prompts.py +7595db1956e17ae2e9ecad98db0de82adf112695,05-22-2023 17:36:17,GitHub Enterprise,"Merge pull request #10 from ClinicalTrials/feat/json-streaming + +Feat/json streaming",backend/app/app/services/chat_agent/sql_tool/sql_tool.py +7595db1956e17ae2e9ecad98db0de82adf112695,05-22-2023 17:36:17,GitHub Enterprise,"Merge pull request #10 from ClinicalTrials/feat/json-streaming + +Feat/json streaming",backend/app/app/services/chat_agent/summerization_agent/summarization_tool.py +7595db1956e17ae2e9ecad98db0de82adf112695,05-22-2023 17:36:17,GitHub Enterprise,"Merge pull request #10 from ClinicalTrials/feat/json-streaming + +Feat/json streaming",backend/app/app/services/chat_agent/visualizer_tool/prompts.py +7595db1956e17ae2e9ecad98db0de82adf112695,05-22-2023 17:36:17,GitHub Enterprise,"Merge pull request #10 from ClinicalTrials/feat/json-streaming + +Feat/json streaming",backend/app/app/services/chat_agent/visualizer_tool/visualizer_tool.py +7595db1956e17ae2e9ecad98db0de82adf112695,05-22-2023 17:36:17,GitHub Enterprise,"Merge pull request #10 from ClinicalTrials/feat/json-streaming + +Feat/json streaming",backend/app/app/utils/streaming/StreamingJsonListResponse.py +7595db1956e17ae2e9ecad98db0de82adf112695,05-22-2023 17:36:17,GitHub Enterprise,"Merge pull request #10 from ClinicalTrials/feat/json-streaming + +Feat/json streaming",backend/app/app/utils/streaming/callbacks/stream.py +7595db1956e17ae2e9ecad98db0de82adf112695,05-22-2023 17:36:17,GitHub Enterprise,"Merge pull request #10 from ClinicalTrials/feat/json-streaming + +Feat/json streaming",backend/app/app/utils/streaming/helpers.py +7595db1956e17ae2e9ecad98db0de82adf112695,05-22-2023 17:36:17,GitHub Enterprise,"Merge pull request #10 from ClinicalTrials/feat/json-streaming + +Feat/json streaming",backend/app/poetry.lock +7595db1956e17ae2e9ecad98db0de82adf112695,05-22-2023 17:36:17,GitHub Enterprise,"Merge pull request #10 from ClinicalTrials/feat/json-streaming + +Feat/json streaming",backend/app/pyproject.toml +7595db1956e17ae2e9ecad98db0de82adf112695,05-22-2023 17:36:17,GitHub Enterprise,"Merge pull request #10 from ClinicalTrials/feat/json-streaming + +Feat/json streaming",frontend/custom_typings/can-ndjson-stream/index.d.ts +7595db1956e17ae2e9ecad98db0de82adf112695,05-22-2023 17:36:17,GitHub Enterprise,"Merge pull request #10 from ClinicalTrials/feat/json-streaming + +Feat/json streaming",frontend/package.json +7595db1956e17ae2e9ecad98db0de82adf112695,05-22-2023 17:36:17,GitHub Enterprise,"Merge pull request #10 from ClinicalTrials/feat/json-streaming + +Feat/json streaming",frontend/pnpm-lock.yaml +7595db1956e17ae2e9ecad98db0de82adf112695,05-22-2023 17:36:17,GitHub Enterprise,"Merge pull request #10 from ClinicalTrials/feat/json-streaming + +Feat/json streaming",frontend/src/components/CodeBlock.tsx +7595db1956e17ae2e9ecad98db0de82adf112695,05-22-2023 17:36:17,GitHub Enterprise,"Merge pull request #10 from ClinicalTrials/feat/json-streaming + +Feat/json streaming",frontend/src/components/CodeFlipCard.tsx +7595db1956e17ae2e9ecad98db0de82adf112695,05-22-2023 17:36:17,GitHub Enterprise,"Merge pull request #10 from ClinicalTrials/feat/json-streaming + +Feat/json streaming",frontend/src/components/ConversationView/Action.tsx +7595db1956e17ae2e9ecad98db0de82adf112695,05-22-2023 17:36:17,GitHub Enterprise,"Merge pull request #10 from ClinicalTrials/feat/json-streaming + +Feat/json streaming",frontend/src/components/ConversationView/LLMResponse.tsx +7595db1956e17ae2e9ecad98db0de82adf112695,05-22-2023 17:36:17,GitHub Enterprise,"Merge pull request #10 from ClinicalTrials/feat/json-streaming + +Feat/json streaming",frontend/src/components/ConversationView/MessageTextarea.tsx +7595db1956e17ae2e9ecad98db0de82adf112695,05-22-2023 17:36:17,GitHub Enterprise,"Merge pull request #10 from ClinicalTrials/feat/json-streaming + +Feat/json streaming",frontend/src/components/ConversationView/MessageView.tsx +7595db1956e17ae2e9ecad98db0de82adf112695,05-22-2023 17:36:17,GitHub Enterprise,"Merge pull request #10 from ClinicalTrials/feat/json-streaming + +Feat/json streaming",frontend/src/components/ConversationView/MessageView/MessageEvent/LLMResponse.tsx +7595db1956e17ae2e9ecad98db0de82adf112695,05-22-2023 17:36:17,GitHub Enterprise,"Merge pull request #10 from ClinicalTrials/feat/json-streaming + +Feat/json streaming",frontend/src/components/ConversationView/MessageView/MessageEvent/index.tsx +7595db1956e17ae2e9ecad98db0de82adf112695,05-22-2023 17:36:17,GitHub Enterprise,"Merge pull request #10 from ClinicalTrials/feat/json-streaming + +Feat/json streaming",frontend/src/components/ConversationView/index.tsx +7595db1956e17ae2e9ecad98db0de82adf112695,05-22-2023 17:36:17,GitHub Enterprise,"Merge pull request #10 from ClinicalTrials/feat/json-streaming + +Feat/json streaming",frontend/src/components/EmptyView.tsx +7595db1956e17ae2e9ecad98db0de82adf112695,05-22-2023 17:36:17,GitHub Enterprise,"Merge pull request #10 from ClinicalTrials/feat/json-streaming + +Feat/json streaming",frontend/src/components/ExecutionView/DataTableView.tsx +7595db1956e17ae2e9ecad98db0de82adf112695,05-22-2023 17:36:17,GitHub Enterprise,"Merge pull request #10 from ClinicalTrials/feat/json-streaming + +Feat/json streaming",frontend/src/components/ExecutionView/ExecutionWarningBanner.tsx +7595db1956e17ae2e9ecad98db0de82adf112695,05-22-2023 17:36:17,GitHub Enterprise,"Merge pull request #10 from ClinicalTrials/feat/json-streaming + +Feat/json streaming",frontend/src/components/ExecutionView/Markdown.tsx +7595db1956e17ae2e9ecad98db0de82adf112695,05-22-2023 17:36:17,GitHub Enterprise,"Merge pull request #10 from ClinicalTrials/feat/json-streaming + +Feat/json streaming",frontend/src/components/ExecutionView/NotificationView.tsx +7595db1956e17ae2e9ecad98db0de82adf112695,05-22-2023 17:36:17,GitHub Enterprise,"Merge pull request #10 from ClinicalTrials/feat/json-streaming + +Feat/json streaming",frontend/src/components/ExecutionView/ResultsView.tsx +7595db1956e17ae2e9ecad98db0de82adf112695,05-22-2023 17:36:17,GitHub Enterprise,"Merge pull request #10 from ClinicalTrials/feat/json-streaming + +Feat/json streaming",frontend/src/components/JsxDisplay.tsx +7595db1956e17ae2e9ecad98db0de82adf112695,05-22-2023 17:36:17,GitHub Enterprise,"Merge pull request #10 from ClinicalTrials/feat/json-streaming + +Feat/json streaming",frontend/src/components/QueryDrawer.tsx +7595db1956e17ae2e9ecad98db0de82adf112695,05-22-2023 17:36:17,GitHub Enterprise,"Merge pull request #10 from ClinicalTrials/feat/json-streaming + +Feat/json streaming",frontend/src/pages/index.tsx +7595db1956e17ae2e9ecad98db0de82adf112695,05-22-2023 17:36:17,GitHub Enterprise,"Merge pull request #10 from ClinicalTrials/feat/json-streaming + +Feat/json streaming",frontend/src/types/message.ts +b7ce43dbfc450aab93ace3f4193a8d0b3459b392,05-22-2023 17:54:01,Jakob Heyder,Fix: React formatting rules,frontend/src/components/ConversationView/MessageView/MessageEvent/LLMResponse.tsx +cfc57f939fba139b457ae481f1a394dfac9418c8,05-23-2023 07:16:59,Jakob Heyder,Fix: Unnecessary AST parsing and error handling in sql_tool,backend/app/app/db/SQLDatabaseExtended.py +cfc57f939fba139b457ae481f1a394dfac9418c8,05-23-2023 07:16:59,Jakob Heyder,Fix: Unnecessary AST parsing and error handling in sql_tool,backend/app/app/db/session.py +cfc57f939fba139b457ae481f1a394dfac9418c8,05-23-2023 07:16:59,Jakob Heyder,Fix: Unnecessary AST parsing and error handling in sql_tool,backend/app/app/services/chat_agent/sql_tool/sql_tool.py +9c691a0905e37c7d625f04ea2d58396de39ba132,05-23-2023 07:17:26,GitHub Enterprise,"Merge pull request #11 from ClinicalTrials/fix/ast-parsing + +Fix: Unnecessary AST parsing and error handling in sql_tool",backend/app/app/db/SQLDatabaseExtended.py +9c691a0905e37c7d625f04ea2d58396de39ba132,05-23-2023 07:17:26,GitHub Enterprise,"Merge pull request #11 from ClinicalTrials/fix/ast-parsing + +Fix: Unnecessary AST parsing and error handling in sql_tool",backend/app/app/db/session.py +9c691a0905e37c7d625f04ea2d58396de39ba132,05-23-2023 07:17:26,GitHub Enterprise,"Merge pull request #11 from ClinicalTrials/fix/ast-parsing + +Fix: Unnecessary AST parsing and error handling in sql_tool",backend/app/app/services/chat_agent/sql_tool/sql_tool.py +f7a47cd083c0417ed1c15fb9f2ec851ef2a1413f,05-23-2023 12:56:22,Jakob Heyder,V0 simple api search tool,backend/app/app/api/v1/endpoints/chat.py +f7a47cd083c0417ed1c15fb9f2ec851ef2a1413f,05-23-2023 12:56:22,Jakob Heyder,V0 simple api search tool,backend/app/app/services/chat_agent/chat_agent.py +f7a47cd083c0417ed1c15fb9f2ec851ef2a1413f,05-23-2023 12:56:22,Jakob Heyder,V0 simple api search tool,backend/app/app/services/chat_agent/clinical_trials_gov_api_search_tool/clinical_trials_gov_api_search_tool.py +f7a47cd083c0417ed1c15fb9f2ec851ef2a1413f,05-23-2023 12:56:22,Jakob Heyder,V0 simple api search tool,backend/app/app/services/chat_agent/sql_tool/sql_tool.py +f7a47cd083c0417ed1c15fb9f2ec851ef2a1413f,05-23-2023 12:56:22,Jakob Heyder,V0 simple api search tool,frontend/src/components/ConversationView/MessageView/MessageEvent/Action.tsx +f7a47cd083c0417ed1c15fb9f2ec851ef2a1413f,05-23-2023 12:56:22,Jakob Heyder,V0 simple api search tool,frontend/src/components/ConversationView/MessageView/MessageEvent/index.tsx +f7a47cd083c0417ed1c15fb9f2ec851ef2a1413f,05-23-2023 12:56:22,Jakob Heyder,V0 simple api search tool,frontend/src/components/ConversationView/MessageView/index.tsx +f7a47cd083c0417ed1c15fb9f2ec851ef2a1413f,05-23-2023 12:56:22,Jakob Heyder,V0 simple api search tool,frontend/src/components/ExecutionView/CodeFlipCard/ResultsView.tsx +f7a47cd083c0417ed1c15fb9f2ec851ef2a1413f,05-23-2023 12:56:22,Jakob Heyder,V0 simple api search tool,frontend/src/components/ExecutionView/CodeFlipCard/index.tsx +f7a47cd083c0417ed1c15fb9f2ec851ef2a1413f,05-23-2023 12:56:22,Jakob Heyder,V0 simple api search tool,frontend/src/types/common.ts +b7ba2251222dbeff58bef010da08ee88a520da87,05-23-2023 14:20:30,Jakob Heyder,Add advanced API search tool,backend/app/app/services/chat_agent/clinical_trials_gov_api_search_tool/clinical_trials_gov_api_search_tool.py +b7ba2251222dbeff58bef010da08ee88a520da87,05-23-2023 14:20:30,Jakob Heyder,Add advanced API search tool,backend/app/app/services/chat_agent/clinical_trials_gov_api_tool/clinical_trials_gov_api_tool.py +b7ba2251222dbeff58bef010da08ee88a520da87,05-23-2023 14:20:30,Jakob Heyder,Add advanced API search tool,backend/app/app/services/chat_agent/clinical_trials_gov_api_tool/prompts.py +b7ba2251222dbeff58bef010da08ee88a520da87,05-23-2023 14:20:30,Jakob Heyder,Add advanced API search tool,backend/app/app/services/chat_agent/meta_agent.py +b7ba2251222dbeff58bef010da08ee88a520da87,05-23-2023 14:20:30,Jakob Heyder,Add advanced API search tool,frontend/src/components/ConversationView/MessageView/MessageEvent/Action.tsx +b7ba2251222dbeff58bef010da08ee88a520da87,05-23-2023 14:20:30,Jakob Heyder,Add advanced API search tool,frontend/src/components/ExecutionView/CodeFlipCard/index.tsx +b7ba2251222dbeff58bef010da08ee88a520da87,05-23-2023 14:20:30,Jakob Heyder,Add advanced API search tool,frontend/src/components/Icon.tsx +2c3512042daafca03b4d0c48e613c73d99f327ad,05-24-2023 15:22:10,Jakob Heyder,V0 of router agent architecture,backend/app/app/services/chat_agent/SimpleRouterAgent.py +2c3512042daafca03b4d0c48e613c73d99f327ad,05-24-2023 15:22:10,Jakob Heyder,V0 of router agent architecture,backend/app/app/services/chat_agent/clinical_trials_gov_api_search_tool/clinical_trials_gov_api_search_tool.py +2c3512042daafca03b4d0c48e613c73d99f327ad,05-24-2023 15:22:10,Jakob Heyder,V0 of router agent architecture,backend/app/app/services/chat_agent/clinical_trials_gov_api_tool/clinical_trials_gov_api_tool.py +2c3512042daafca03b4d0c48e613c73d99f327ad,05-24-2023 15:22:10,Jakob Heyder,V0 of router agent architecture,backend/app/app/services/chat_agent/experimental/simple_visualizer_tool/prompts.py +2c3512042daafca03b4d0c48e613c73d99f327ad,05-24-2023 15:22:10,Jakob Heyder,V0 of router agent architecture,backend/app/app/services/chat_agent/experimental/simple_visualizer_tool/visualizer_tool.py +2c3512042daafca03b4d0c48e613c73d99f327ad,05-24-2023 15:22:10,Jakob Heyder,V0 of router agent architecture,backend/app/app/services/chat_agent/meta_agent.py +2c3512042daafca03b4d0c48e613c73d99f327ad,05-24-2023 15:22:10,Jakob Heyder,V0 of router agent architecture,backend/app/app/services/chat_agent/prompts.py +2c3512042daafca03b4d0c48e613c73d99f327ad,05-24-2023 15:22:10,Jakob Heyder,V0 of router agent architecture,backend/app/app/services/chat_agent/sql_agent/prompts.py +2c3512042daafca03b4d0c48e613c73d99f327ad,05-24-2023 15:22:10,Jakob Heyder,V0 of router agent architecture,backend/app/app/services/chat_agent/sql_agent/sql_agent.py +2c3512042daafca03b4d0c48e613c73d99f327ad,05-24-2023 15:22:10,Jakob Heyder,V0 of router agent architecture,backend/app/app/services/chat_agent/sql_agent/toolkit.py +2c3512042daafca03b4d0c48e613c73d99f327ad,05-24-2023 15:22:10,Jakob Heyder,V0 of router agent architecture,backend/app/app/services/chat_agent/sql_agent/tools.py +2c3512042daafca03b4d0c48e613c73d99f327ad,05-24-2023 15:22:10,Jakob Heyder,V0 of router agent architecture,backend/app/app/services/chat_agent/sql_tool/sql_tool.py +2c3512042daafca03b4d0c48e613c73d99f327ad,05-24-2023 15:22:10,Jakob Heyder,V0 of router agent architecture,backend/app/app/services/chat_agent/summarizer_tool/prompts.py +2c3512042daafca03b4d0c48e613c73d99f327ad,05-24-2023 15:22:10,Jakob Heyder,V0 of router agent architecture,backend/app/app/services/chat_agent/summarizer_tool/summarizer_tool.py +2c3512042daafca03b4d0c48e613c73d99f327ad,05-24-2023 15:22:10,Jakob Heyder,V0 of router agent architecture,backend/app/app/services/chat_agent/summerization_agent/__init__.py +2c3512042daafca03b4d0c48e613c73d99f327ad,05-24-2023 15:22:10,Jakob Heyder,V0 of router agent architecture,backend/app/app/services/chat_agent/summerization_agent/prompts.py +2c3512042daafca03b4d0c48e613c73d99f327ad,05-24-2023 15:22:10,Jakob Heyder,V0 of router agent architecture,backend/app/app/services/chat_agent/summerization_agent/summarization_tool.py +2c3512042daafca03b4d0c48e613c73d99f327ad,05-24-2023 15:22:10,Jakob Heyder,V0 of router agent architecture,backend/app/app/services/chat_agent/visualizer_tool/prompts.py +2c3512042daafca03b4d0c48e613c73d99f327ad,05-24-2023 15:22:10,Jakob Heyder,V0 of router agent architecture,backend/app/app/services/chat_agent/visualizer_tool/visualizer_tool.py +2c3512042daafca03b4d0c48e613c73d99f327ad,05-24-2023 15:22:10,Jakob Heyder,V0 of router agent architecture,backend/app/app/utils/streaming/callbacks/stream.py +2c3512042daafca03b4d0c48e613c73d99f327ad,05-24-2023 15:22:10,Jakob Heyder,V0 of router agent architecture,frontend/src/components/ConversationView/MessageView/MessageEvent/Action.tsx +2c3512042daafca03b4d0c48e613c73d99f327ad,05-24-2023 15:22:10,Jakob Heyder,V0 of router agent architecture,frontend/src/components/ConversationView/MessageView/MessageEvent/LLMResponse.tsx +2c3512042daafca03b4d0c48e613c73d99f327ad,05-24-2023 15:22:10,Jakob Heyder,V0 of router agent architecture,frontend/src/components/ConversationView/MessageView/MessageEvent/index.tsx +2c3512042daafca03b4d0c48e613c73d99f327ad,05-24-2023 15:22:10,Jakob Heyder,V0 of router agent architecture,frontend/src/components/ConversationView/MessageView/MessageEvents/MessageEvent/Action.tsx +2c3512042daafca03b4d0c48e613c73d99f327ad,05-24-2023 15:22:10,Jakob Heyder,V0 of router agent architecture,frontend/src/components/ConversationView/MessageView/MessageEvents/MessageEvents.tsx +2c3512042daafca03b4d0c48e613c73d99f327ad,05-24-2023 15:22:10,Jakob Heyder,V0 of router agent architecture,frontend/src/components/ConversationView/MessageView/index.tsx +2c3512042daafca03b4d0c48e613c73d99f327ad,05-24-2023 15:22:10,Jakob Heyder,V0 of router agent architecture,frontend/src/components/ExecutionView/CodeFlipCard/index.tsx +2c3512042daafca03b4d0c48e613c73d99f327ad,05-24-2023 15:22:10,Jakob Heyder,V0 of router agent architecture,frontend/src/utils/group.ts +42d926466a75f0efae3eabd60c699b0a3ea806c9,05-24-2023 16:58:30,Jakob Heyder,"Feat: Png-filesaver, NCT links and steps-collapse",backend/app/app/api/v1/endpoints/sql.py +42d926466a75f0efae3eabd60c699b0a3ea806c9,05-24-2023 16:58:30,Jakob Heyder,"Feat: Png-filesaver, NCT links and steps-collapse",backend/app/app/services/chat_agent/sql_tool/sql_tool.py +42d926466a75f0efae3eabd60c699b0a3ea806c9,05-24-2023 16:58:30,Jakob Heyder,"Feat: Png-filesaver, NCT links and steps-collapse",backend/app/app/services/chat_agent/visualizer_tool/prompts.py +42d926466a75f0efae3eabd60c699b0a3ea806c9,05-24-2023 16:58:30,Jakob Heyder,"Feat: Png-filesaver, NCT links and steps-collapse",frontend/package.json +42d926466a75f0efae3eabd60c699b0a3ea806c9,05-24-2023 16:58:30,Jakob Heyder,"Feat: Png-filesaver, NCT links and steps-collapse",frontend/pnpm-lock.yaml +42d926466a75f0efae3eabd60c699b0a3ea806c9,05-24-2023 16:58:30,Jakob Heyder,"Feat: Png-filesaver, NCT links and steps-collapse",frontend/src/components/ConversationView/MessageView/MessageEvents/MessageEvent/LLMResponse.tsx +42d926466a75f0efae3eabd60c699b0a3ea806c9,05-24-2023 16:58:30,Jakob Heyder,"Feat: Png-filesaver, NCT links and steps-collapse",frontend/src/components/ConversationView/MessageView/index.tsx +42d926466a75f0efae3eabd60c699b0a3ea806c9,05-24-2023 16:58:30,Jakob Heyder,"Feat: Png-filesaver, NCT links and steps-collapse",frontend/src/components/ExecutionView/CodeFlipCard/JsxDisplay.tsx +42d926466a75f0efae3eabd60c699b0a3ea806c9,05-24-2023 16:58:30,Jakob Heyder,"Feat: Png-filesaver, NCT links and steps-collapse",frontend/src/components/ExecutionView/CodeFlipCard/ResultsView.tsx +42d926466a75f0efae3eabd60c699b0a3ea806c9,05-24-2023 16:58:30,Jakob Heyder,"Feat: Png-filesaver, NCT links and steps-collapse",frontend/src/components/ExecutionView/CodeFlipCard/index.tsx +42d926466a75f0efae3eabd60c699b0a3ea806c9,05-24-2023 16:58:30,Jakob Heyder,"Feat: Png-filesaver, NCT links and steps-collapse",frontend/src/components/Icon.tsx +42d926466a75f0efae3eabd60c699b0a3ea806c9,05-24-2023 16:58:30,Jakob Heyder,"Feat: Png-filesaver, NCT links and steps-collapse",frontend/src/styles/globals.css +42d926466a75f0efae3eabd60c699b0a3ea806c9,05-24-2023 16:58:30,Jakob Heyder,"Feat: Png-filesaver, NCT links and steps-collapse",frontend/tailwind.config.ts +7478bec929d0d0961da6ec33c93cd30b41177af7,05-25-2023 14:11:59,Jakob Heyder,"Feat: New router agent improvements, tool refinements, entertainer and expert",backend/app/app/api/v1/endpoints/chat.py +7478bec929d0d0961da6ec33c93cd30b41177af7,05-25-2023 14:11:59,Jakob Heyder,"Feat: New router agent improvements, tool refinements, entertainer and expert",backend/app/app/schemas/message_schema.py +7478bec929d0d0961da6ec33c93cd30b41177af7,05-25-2023 14:11:59,Jakob Heyder,"Feat: New router agent improvements, tool refinements, entertainer and expert",backend/app/app/services/chat_agent/SimpleRouterAgent.py +7478bec929d0d0961da6ec33c93cd30b41177af7,05-25-2023 14:11:59,Jakob Heyder,"Feat: New router agent improvements, tool refinements, entertainer and expert",backend/app/app/services/chat_agent/clinical_trials_gov_api_tool/prompts.py +7478bec929d0d0961da6ec33c93cd30b41177af7,05-25-2023 14:11:59,Jakob Heyder,"Feat: New router agent improvements, tool refinements, entertainer and expert",backend/app/app/services/chat_agent/entertainer_tool/entertainer_tool.py +7478bec929d0d0961da6ec33c93cd30b41177af7,05-25-2023 14:11:59,Jakob Heyder,"Feat: New router agent improvements, tool refinements, entertainer and expert",backend/app/app/services/chat_agent/entertainer_tool/prompts.py +7478bec929d0d0961da6ec33c93cd30b41177af7,05-25-2023 14:11:59,Jakob Heyder,"Feat: New router agent improvements, tool refinements, entertainer and expert",backend/app/app/services/chat_agent/experimental/simple_visualizer_tool/visualizer_tool.py +7478bec929d0d0961da6ec33c93cd30b41177af7,05-25-2023 14:11:59,Jakob Heyder,"Feat: New router agent improvements, tool refinements, entertainer and expert",backend/app/app/services/chat_agent/expert_tool/expert_tool.py +7478bec929d0d0961da6ec33c93cd30b41177af7,05-25-2023 14:11:59,Jakob Heyder,"Feat: New router agent improvements, tool refinements, entertainer and expert",backend/app/app/services/chat_agent/expert_tool/prompts.py +7478bec929d0d0961da6ec33c93cd30b41177af7,05-25-2023 14:11:59,Jakob Heyder,"Feat: New router agent improvements, tool refinements, entertainer and expert",backend/app/app/services/chat_agent/meta_agent.py +7478bec929d0d0961da6ec33c93cd30b41177af7,05-25-2023 14:11:59,Jakob Heyder,"Feat: New router agent improvements, tool refinements, entertainer and expert",backend/app/app/services/chat_agent/router_agent/SimpleRouterAgent.py +7478bec929d0d0961da6ec33c93cd30b41177af7,05-25-2023 14:11:59,Jakob Heyder,"Feat: New router agent improvements, tool refinements, entertainer and expert",backend/app/app/services/chat_agent/router_agent/prompts.py +7478bec929d0d0961da6ec33c93cd30b41177af7,05-25-2023 14:11:59,Jakob Heyder,"Feat: New router agent improvements, tool refinements, entertainer and expert",backend/app/app/services/chat_agent/sql_tool/prompts.py +7478bec929d0d0961da6ec33c93cd30b41177af7,05-25-2023 14:11:59,Jakob Heyder,"Feat: New router agent improvements, tool refinements, entertainer and expert",backend/app/app/services/chat_agent/sql_tool/sql_tool.py +7478bec929d0d0961da6ec33c93cd30b41177af7,05-25-2023 14:11:59,Jakob Heyder,"Feat: New router agent improvements, tool refinements, entertainer and expert",backend/app/app/services/chat_agent/visualizer_tool/prompts.py +7478bec929d0d0961da6ec33c93cd30b41177af7,05-25-2023 14:11:59,Jakob Heyder,"Feat: New router agent improvements, tool refinements, entertainer and expert",backend/app/app/services/chat_agent/visualizer_tool/visualizer_tool.py +7478bec929d0d0961da6ec33c93cd30b41177af7,05-25-2023 14:11:59,Jakob Heyder,"Feat: New router agent improvements, tool refinements, entertainer and expert",frontend/src/components/ConversationView/MessageView/MessageEvents/MessageEvent/Action.tsx +7478bec929d0d0961da6ec33c93cd30b41177af7,05-25-2023 14:11:59,Jakob Heyder,"Feat: New router agent improvements, tool refinements, entertainer and expert",frontend/src/components/ConversationView/MessageView/MessageEvents/MessageEvent/LLMResponse.tsx +7478bec929d0d0961da6ec33c93cd30b41177af7,05-25-2023 14:11:59,Jakob Heyder,"Feat: New router agent improvements, tool refinements, entertainer and expert",frontend/src/components/ConversationView/index.tsx +7478bec929d0d0961da6ec33c93cd30b41177af7,05-25-2023 14:11:59,Jakob Heyder,"Feat: New router agent improvements, tool refinements, entertainer and expert",frontend/src/components/ExecutionView/CodeFlipCard/index.tsx +4dd8e6d025119e1f72fe5023aa02568339228d39,05-25-2023 15:15:26,Jakob Heyder,Fix: smooth printout and show which tools are still loading,backend/app/app/services/chat_agent/summarizer_tool/prompts.py +4dd8e6d025119e1f72fe5023aa02568339228d39,05-25-2023 15:15:26,Jakob Heyder,Fix: smooth printout and show which tools are still loading,backend/app/app/utils/streaming/callbacks/stream.py +4dd8e6d025119e1f72fe5023aa02568339228d39,05-25-2023 15:15:26,Jakob Heyder,Fix: smooth printout and show which tools are still loading,frontend/src/components/ConversationView/MessageView/MessageEvents/MessageEvent/LLMResponse.tsx +4dd8e6d025119e1f72fe5023aa02568339228d39,05-25-2023 15:15:26,Jakob Heyder,Fix: smooth printout and show which tools are still loading,frontend/src/components/ConversationView/MessageView/MessageEvents/MessageEvents.tsx +4dd8e6d025119e1f72fe5023aa02568339228d39,05-25-2023 15:15:26,Jakob Heyder,Fix: smooth printout and show which tools are still loading,frontend/src/components/ConversationView/MessageView/index.tsx +4dd8e6d025119e1f72fe5023aa02568339228d39,05-25-2023 15:15:26,Jakob Heyder,Fix: smooth printout and show which tools are still loading,frontend/src/components/ConversationView/index.tsx +e3f4fef2dc36ffd71fe2f0141d919419fa6e99cf,05-25-2023 19:00:14,Jakob Heyder,Devops: Add staging url (temporary on this branch),.github/workflows/main.yml +e3f4fef2dc36ffd71fe2f0141d919419fa6e99cf,05-25-2023 19:00:14,Jakob Heyder,Devops: Add staging url (temporary on this branch),backend/app/app/services/chat_agent/entertainer_tool/prompts.py +e3f4fef2dc36ffd71fe2f0141d919419fa6e99cf,05-25-2023 19:00:14,Jakob Heyder,Devops: Add staging url (temporary on this branch),caddy/Caddyfile +e3f4fef2dc36ffd71fe2f0141d919419fa6e99cf,05-25-2023 19:00:14,Jakob Heyder,Devops: Add staging url (temporary on this branch),frontend/src/components/ConversationView/MessageView/index.tsx +f663f03c2181364b4ff5d964b5dc3a6737ff827d,05-25-2023 19:05:28,Jakob Heyder,Devops: Run staging / main branch job with if-condition,.github/workflows/main.yml +99c862b20610ec1d5b867e5b56255a642fb60179,05-25-2023 20:15:51,Jakob Heyder,Feat: New stacked bar charts colored,backend/app/app/services/chat_agent/visualizer_tool/prompts.py +99c862b20610ec1d5b867e5b56255a642fb60179,05-25-2023 20:15:51,Jakob Heyder,Feat: New stacked bar charts colored,frontend/src/components/ExecutionView/CodeFlipCard/JsxDisplay.tsx +6c25c0f7bd3d701a93ceb607d6ddea60f24d5878,05-26-2023 09:08:16,Jakob Heyder,"Fix: Smaller fixes, color scheme, prompt refinements",backend/app/app/schemas/pdf_schema.py +6c25c0f7bd3d701a93ceb607d6ddea60f24d5878,05-26-2023 09:08:16,Jakob Heyder,"Fix: Smaller fixes, color scheme, prompt refinements",backend/app/app/services/chat_agent/entertainer_tool/entertainer_tool.py +6c25c0f7bd3d701a93ceb607d6ddea60f24d5878,05-26-2023 09:08:16,Jakob Heyder,"Fix: Smaller fixes, color scheme, prompt refinements",backend/app/app/services/chat_agent/entertainer_tool/prompts.py +6c25c0f7bd3d701a93ceb607d6ddea60f24d5878,05-26-2023 09:08:16,Jakob Heyder,"Fix: Smaller fixes, color scheme, prompt refinements",backend/app/app/services/chat_agent/expert_tool/prompts.py +6c25c0f7bd3d701a93ceb607d6ddea60f24d5878,05-26-2023 09:08:16,Jakob Heyder,"Fix: Smaller fixes, color scheme, prompt refinements",backend/app/app/services/chat_agent/pdf_tool/pdf_tool.py +6c25c0f7bd3d701a93ceb607d6ddea60f24d5878,05-26-2023 09:08:16,Jakob Heyder,"Fix: Smaller fixes, color scheme, prompt refinements",backend/app/app/services/chat_agent/pdf_tool/prompts.py +6c25c0f7bd3d701a93ceb607d6ddea60f24d5878,05-26-2023 09:08:16,Jakob Heyder,"Fix: Smaller fixes, color scheme, prompt refinements",backend/app/app/services/chat_agent/router_agent/SimpleRouterAgent.py +6c25c0f7bd3d701a93ceb607d6ddea60f24d5878,05-26-2023 09:08:16,Jakob Heyder,"Fix: Smaller fixes, color scheme, prompt refinements",backend/app/app/services/chat_agent/router_agent/prompts.py +6c25c0f7bd3d701a93ceb607d6ddea60f24d5878,05-26-2023 09:08:16,Jakob Heyder,"Fix: Smaller fixes, color scheme, prompt refinements",backend/app/app/services/chat_agent/summarizer_tool/prompts.py +6c25c0f7bd3d701a93ceb607d6ddea60f24d5878,05-26-2023 09:08:16,Jakob Heyder,"Fix: Smaller fixes, color scheme, prompt refinements",backend/app/app/utils/streaming/helpers.py +6c25c0f7bd3d701a93ceb607d6ddea60f24d5878,05-26-2023 09:08:16,Jakob Heyder,"Fix: Smaller fixes, color scheme, prompt refinements",frontend/src/components/ExecutionView/CodeFlipCard/JsxDisplay.tsx +717b2178d14511d9ee468adc4dd2eb4b8ddda63a,05-26-2023 11:10:34,Jakob Heyder,Finetune: Add mardown formatting to prompts,backend/app/app/services/chat_agent/entertainer_tool/prompts.py +717b2178d14511d9ee468adc4dd2eb4b8ddda63a,05-26-2023 11:10:34,Jakob Heyder,Finetune: Add mardown formatting to prompts,backend/app/app/services/chat_agent/expert_tool/prompts.py +717b2178d14511d9ee468adc4dd2eb4b8ddda63a,05-26-2023 11:10:34,Jakob Heyder,Finetune: Add mardown formatting to prompts,backend/app/app/services/chat_agent/summarizer_tool/prompts.py +ae98097fc18d98a6011b1f4762b659057c31a5b4,05-26-2023 17:55:13,Jakob Heyder,"Fix: Table 5 elements, Recharts Treemap and bottom margin (axis)",backend/app/app/services/chat_agent/visualizer_tool/prompts.py +ae98097fc18d98a6011b1f4762b659057c31a5b4,05-26-2023 17:55:13,Jakob Heyder,"Fix: Table 5 elements, Recharts Treemap and bottom margin (axis)",frontend/src/components/ExecutionView/CodeFlipCard/JsxDisplay.tsx +ae98097fc18d98a6011b1f4762b659057c31a5b4,05-26-2023 17:55:13,Jakob Heyder,"Fix: Table 5 elements, Recharts Treemap and bottom margin (axis)",frontend/src/components/ExecutionView/QueryDrawer/DataTableView.tsx +2f4e7fb16317adbea654e371b61cd86d397939be,05-30-2023 11:17:18,Jakob Heyder,Cleanup FE and codeowners,CODEOWNERS +2f4e7fb16317adbea654e371b61cd86d397939be,05-30-2023 11:17:18,Jakob Heyder,Cleanup FE and codeowners,frontend/src/components/ConversationView/ClearConversationButton/ClearConversationConfirmModal.tsx +2f4e7fb16317adbea654e371b61cd86d397939be,05-30-2023 11:17:18,Jakob Heyder,Cleanup FE and codeowners,frontend/src/components/ConversationView/ClearConversationButton/index.tsx +2f4e7fb16317adbea654e371b61cd86d397939be,05-30-2023 11:17:18,Jakob Heyder,Cleanup FE and codeowners,frontend/src/components/ConversationView/Header.tsx +2f4e7fb16317adbea654e371b61cd86d397939be,05-30-2023 11:17:18,Jakob Heyder,Cleanup FE and codeowners,frontend/src/components/ConversationView/MessageTextarea.tsx +2f4e7fb16317adbea654e371b61cd86d397939be,05-30-2023 11:17:18,Jakob Heyder,Cleanup FE and codeowners,frontend/src/components/ConversationView/MessageView/MessageEvents/MessageEvent/Action.tsx +2f4e7fb16317adbea654e371b61cd86d397939be,05-30-2023 11:17:18,Jakob Heyder,Cleanup FE and codeowners,frontend/src/components/ConversationView/MessageView/MessageEvents/MessageEvent/LLMResponse.tsx +2f4e7fb16317adbea654e371b61cd86d397939be,05-30-2023 11:17:18,Jakob Heyder,Cleanup FE and codeowners,frontend/src/components/ConversationView/MessageView/index.tsx +2f4e7fb16317adbea654e371b61cd86d397939be,05-30-2023 11:17:18,Jakob Heyder,Cleanup FE and codeowners,frontend/src/components/ConversationView/index.tsx +2f4e7fb16317adbea654e371b61cd86d397939be,05-30-2023 11:17:18,Jakob Heyder,Cleanup FE and codeowners,frontend/src/components/CustomIcons/AgentIcon.tsx +2f4e7fb16317adbea654e371b61cd86d397939be,05-30-2023 11:17:18,Jakob Heyder,Cleanup FE and codeowners,frontend/src/components/DarkmodeSwitch.tsx +2f4e7fb16317adbea654e371b61cd86d397939be,05-30-2023 11:17:18,Jakob Heyder,Cleanup FE and codeowners,frontend/src/components/DataStorageBanner.tsx +2f4e7fb16317adbea654e371b61cd86d397939be,05-30-2023 11:17:18,Jakob Heyder,Cleanup FE and codeowners,frontend/src/components/EmptyView.tsx +2f4e7fb16317adbea654e371b61cd86d397939be,05-30-2023 11:17:18,Jakob Heyder,Cleanup FE and codeowners,frontend/src/components/ErrorBoundary.tsx +2f4e7fb16317adbea654e371b61cd86d397939be,05-30-2023 11:17:18,Jakob Heyder,Cleanup FE and codeowners,frontend/src/components/ExecutionView/CodeBlock.tsx +2f4e7fb16317adbea654e371b61cd86d397939be,05-30-2023 11:17:18,Jakob Heyder,Cleanup FE and codeowners,frontend/src/components/ExecutionView/CodeFlipCard/JsxDisplay.tsx +2f4e7fb16317adbea654e371b61cd86d397939be,05-30-2023 11:17:18,Jakob Heyder,Cleanup FE and codeowners,frontend/src/components/ExecutionView/CodeFlipCard/ResultsView.tsx +2f4e7fb16317adbea654e371b61cd86d397939be,05-30-2023 11:17:18,Jakob Heyder,Cleanup FE and codeowners,frontend/src/components/ExecutionView/CodeFlipCard/index.tsx +2f4e7fb16317adbea654e371b61cd86d397939be,05-30-2023 11:17:18,Jakob Heyder,Cleanup FE and codeowners,frontend/src/components/ExecutionView/Markdown.tsx +2f4e7fb16317adbea654e371b61cd86d397939be,05-30-2023 11:17:18,Jakob Heyder,Cleanup FE and codeowners,frontend/src/components/ExecutionView/QueryDrawer/DataTableView.tsx +2f4e7fb16317adbea654e371b61cd86d397939be,05-30-2023 11:17:18,Jakob Heyder,Cleanup FE and codeowners,frontend/src/components/ExecutionView/QueryDrawer/ExecutionWarningBanner.tsx +2f4e7fb16317adbea654e371b61cd86d397939be,05-30-2023 11:17:18,Jakob Heyder,Cleanup FE and codeowners,frontend/src/components/ExecutionView/QueryDrawer/NotificationView.tsx +2f4e7fb16317adbea654e371b61cd86d397939be,05-30-2023 11:17:18,Jakob Heyder,Cleanup FE and codeowners,frontend/src/components/ExecutionView/QueryDrawer/index.tsx +2f4e7fb16317adbea654e371b61cd86d397939be,05-30-2023 11:17:18,Jakob Heyder,Cleanup FE and codeowners,frontend/src/components/Icon.tsx +2f4e7fb16317adbea654e371b61cd86d397939be,05-30-2023 11:17:18,Jakob Heyder,Cleanup FE and codeowners,frontend/src/components/Sidebar.tsx +2f4e7fb16317adbea654e371b61cd86d397939be,05-30-2023 11:17:18,Jakob Heyder,Cleanup FE and codeowners,frontend/src/components/UpdateConversationModal.tsx +2f4e7fb16317adbea654e371b61cd86d397939be,05-30-2023 11:17:18,Jakob Heyder,Cleanup FE and codeowners,frontend/src/components/kit/Dropdown.tsx +2f4e7fb16317adbea654e371b61cd86d397939be,05-30-2023 11:17:18,Jakob Heyder,Cleanup FE and codeowners,frontend/src/components/kit/Modal.tsx +2f4e7fb16317adbea654e371b61cd86d397939be,05-30-2023 11:17:18,Jakob Heyder,Cleanup FE and codeowners,frontend/src/components/kit/Select.tsx +2f4e7fb16317adbea654e371b61cd86d397939be,05-30-2023 11:17:18,Jakob Heyder,Cleanup FE and codeowners,frontend/src/components/kit/TextField.tsx +2f4e7fb16317adbea654e371b61cd86d397939be,05-30-2023 11:17:18,Jakob Heyder,Cleanup FE and codeowners,frontend/src/components/kit/Tooltip.tsx +2f4e7fb16317adbea654e371b61cd86d397939be,05-30-2023 11:17:18,Jakob Heyder,Cleanup FE and codeowners,frontend/src/pages/index.tsx +2f4e7fb16317adbea654e371b61cd86d397939be,05-30-2023 11:17:18,Jakob Heyder,Cleanup FE and codeowners,frontend/src/store/assistants.ts +2f4e7fb16317adbea654e371b61cd86d397939be,05-30-2023 11:17:18,Jakob Heyder,Cleanup FE and codeowners,frontend/src/store/conversation.ts +2f4e7fb16317adbea654e371b61cd86d397939be,05-30-2023 11:17:18,Jakob Heyder,Cleanup FE and codeowners,frontend/src/store/index.ts +2f4e7fb16317adbea654e371b61cd86d397939be,05-30-2023 11:17:18,Jakob Heyder,Cleanup FE and codeowners,frontend/src/types/conversation.ts +90ab6200aa7089a9811fc27a527a1ce04cde677a,05-30-2023 11:22:35,GitHub Enterprise,"Merge pull request #12 from ClinicalTrials/staging + +Staging",.github/workflows/main.yml +90ab6200aa7089a9811fc27a527a1ce04cde677a,05-30-2023 11:22:35,GitHub Enterprise,"Merge pull request #12 from ClinicalTrials/staging + +Staging",CODEOWNERS +90ab6200aa7089a9811fc27a527a1ce04cde677a,05-30-2023 11:22:35,GitHub Enterprise,"Merge pull request #12 from ClinicalTrials/staging + +Staging",backend/app/app/api/v1/endpoints/chat.py +90ab6200aa7089a9811fc27a527a1ce04cde677a,05-30-2023 11:22:35,GitHub Enterprise,"Merge pull request #12 from ClinicalTrials/staging + +Staging",backend/app/app/api/v1/endpoints/sql.py +90ab6200aa7089a9811fc27a527a1ce04cde677a,05-30-2023 11:22:35,GitHub Enterprise,"Merge pull request #12 from ClinicalTrials/staging + +Staging",backend/app/app/schemas/message_schema.py +90ab6200aa7089a9811fc27a527a1ce04cde677a,05-30-2023 11:22:35,GitHub Enterprise,"Merge pull request #12 from ClinicalTrials/staging + +Staging",backend/app/app/schemas/pdf_schema.py +90ab6200aa7089a9811fc27a527a1ce04cde677a,05-30-2023 11:22:35,GitHub Enterprise,"Merge pull request #12 from ClinicalTrials/staging + +Staging",backend/app/app/services/chat_agent/chat_agent.py +90ab6200aa7089a9811fc27a527a1ce04cde677a,05-30-2023 11:22:35,GitHub Enterprise,"Merge pull request #12 from ClinicalTrials/staging + +Staging",backend/app/app/services/chat_agent/clinical_trials_gov_api_tool/clinical_trials_gov_api_tool.py +90ab6200aa7089a9811fc27a527a1ce04cde677a,05-30-2023 11:22:35,GitHub Enterprise,"Merge pull request #12 from ClinicalTrials/staging + +Staging",backend/app/app/services/chat_agent/clinical_trials_gov_api_tool/prompts.py +90ab6200aa7089a9811fc27a527a1ce04cde677a,05-30-2023 11:22:35,GitHub Enterprise,"Merge pull request #12 from ClinicalTrials/staging + +Staging",backend/app/app/services/chat_agent/entertainer_tool/entertainer_tool.py +90ab6200aa7089a9811fc27a527a1ce04cde677a,05-30-2023 11:22:35,GitHub Enterprise,"Merge pull request #12 from ClinicalTrials/staging + +Staging",backend/app/app/services/chat_agent/entertainer_tool/prompts.py +90ab6200aa7089a9811fc27a527a1ce04cde677a,05-30-2023 11:22:35,GitHub Enterprise,"Merge pull request #12 from ClinicalTrials/staging + +Staging",backend/app/app/services/chat_agent/experimental/clinical_trials_gov_api_search_tool/clinical_trials_gov_api_search_tool.py +90ab6200aa7089a9811fc27a527a1ce04cde677a,05-30-2023 11:22:35,GitHub Enterprise,"Merge pull request #12 from ClinicalTrials/staging + +Staging",backend/app/app/services/chat_agent/experimental/simple_visualizer_tool/prompts.py +90ab6200aa7089a9811fc27a527a1ce04cde677a,05-30-2023 11:22:35,GitHub Enterprise,"Merge pull request #12 from ClinicalTrials/staging + +Staging",backend/app/app/services/chat_agent/experimental/simple_visualizer_tool/visualizer_tool.py +90ab6200aa7089a9811fc27a527a1ce04cde677a,05-30-2023 11:22:35,GitHub Enterprise,"Merge pull request #12 from ClinicalTrials/staging + +Staging",backend/app/app/services/chat_agent/expert_tool/expert_tool.py +90ab6200aa7089a9811fc27a527a1ce04cde677a,05-30-2023 11:22:35,GitHub Enterprise,"Merge pull request #12 from ClinicalTrials/staging + +Staging",backend/app/app/services/chat_agent/expert_tool/prompts.py +90ab6200aa7089a9811fc27a527a1ce04cde677a,05-30-2023 11:22:35,GitHub Enterprise,"Merge pull request #12 from ClinicalTrials/staging + +Staging",backend/app/app/services/chat_agent/prompts.py +90ab6200aa7089a9811fc27a527a1ce04cde677a,05-30-2023 11:22:35,GitHub Enterprise,"Merge pull request #12 from ClinicalTrials/staging + +Staging",backend/app/app/services/chat_agent/router_agent/SimpleRouterAgent.py +90ab6200aa7089a9811fc27a527a1ce04cde677a,05-30-2023 11:22:35,GitHub Enterprise,"Merge pull request #12 from ClinicalTrials/staging + +Staging",backend/app/app/services/chat_agent/router_agent/prompts.py +90ab6200aa7089a9811fc27a527a1ce04cde677a,05-30-2023 11:22:35,GitHub Enterprise,"Merge pull request #12 from ClinicalTrials/staging + +Staging",backend/app/app/services/chat_agent/sql_agent/prompts.py +90ab6200aa7089a9811fc27a527a1ce04cde677a,05-30-2023 11:22:35,GitHub Enterprise,"Merge pull request #12 from ClinicalTrials/staging + +Staging",backend/app/app/services/chat_agent/sql_agent/sql_agent.py +90ab6200aa7089a9811fc27a527a1ce04cde677a,05-30-2023 11:22:35,GitHub Enterprise,"Merge pull request #12 from ClinicalTrials/staging + +Staging",backend/app/app/services/chat_agent/sql_agent/toolkit.py +90ab6200aa7089a9811fc27a527a1ce04cde677a,05-30-2023 11:22:35,GitHub Enterprise,"Merge pull request #12 from ClinicalTrials/staging + +Staging",backend/app/app/services/chat_agent/sql_agent/tools.py +90ab6200aa7089a9811fc27a527a1ce04cde677a,05-30-2023 11:22:35,GitHub Enterprise,"Merge pull request #12 from ClinicalTrials/staging + +Staging",backend/app/app/services/chat_agent/sql_tool/prompts.py +90ab6200aa7089a9811fc27a527a1ce04cde677a,05-30-2023 11:22:35,GitHub Enterprise,"Merge pull request #12 from ClinicalTrials/staging + +Staging",backend/app/app/services/chat_agent/sql_tool/sql_tool.py +90ab6200aa7089a9811fc27a527a1ce04cde677a,05-30-2023 11:22:35,GitHub Enterprise,"Merge pull request #12 from ClinicalTrials/staging + +Staging",backend/app/app/services/chat_agent/summarizer_tool/prompts.py +90ab6200aa7089a9811fc27a527a1ce04cde677a,05-30-2023 11:22:35,GitHub Enterprise,"Merge pull request #12 from ClinicalTrials/staging + +Staging",backend/app/app/services/chat_agent/summarizer_tool/summarizer_tool.py +90ab6200aa7089a9811fc27a527a1ce04cde677a,05-30-2023 11:22:35,GitHub Enterprise,"Merge pull request #12 from ClinicalTrials/staging + +Staging",backend/app/app/services/chat_agent/summerization_agent/__init__.py +90ab6200aa7089a9811fc27a527a1ce04cde677a,05-30-2023 11:22:35,GitHub Enterprise,"Merge pull request #12 from ClinicalTrials/staging + +Staging",backend/app/app/services/chat_agent/summerization_agent/prompts.py +90ab6200aa7089a9811fc27a527a1ce04cde677a,05-30-2023 11:22:35,GitHub Enterprise,"Merge pull request #12 from ClinicalTrials/staging + +Staging",backend/app/app/services/chat_agent/summerization_agent/summarization_tool.py +90ab6200aa7089a9811fc27a527a1ce04cde677a,05-30-2023 11:22:35,GitHub Enterprise,"Merge pull request #12 from ClinicalTrials/staging + +Staging",backend/app/app/services/chat_agent/visualizer_tool/prompts.py +90ab6200aa7089a9811fc27a527a1ce04cde677a,05-30-2023 11:22:35,GitHub Enterprise,"Merge pull request #12 from ClinicalTrials/staging + +Staging",backend/app/app/services/chat_agent/visualizer_tool/visualizer_tool.py +90ab6200aa7089a9811fc27a527a1ce04cde677a,05-30-2023 11:22:35,GitHub Enterprise,"Merge pull request #12 from ClinicalTrials/staging + +Staging",backend/app/app/utils/streaming/callbacks/stream.py +90ab6200aa7089a9811fc27a527a1ce04cde677a,05-30-2023 11:22:35,GitHub Enterprise,"Merge pull request #12 from ClinicalTrials/staging + +Staging",backend/app/app/utils/streaming/helpers.py +90ab6200aa7089a9811fc27a527a1ce04cde677a,05-30-2023 11:22:35,GitHub Enterprise,"Merge pull request #12 from ClinicalTrials/staging + +Staging",caddy/Caddyfile +90ab6200aa7089a9811fc27a527a1ce04cde677a,05-30-2023 11:22:35,GitHub Enterprise,"Merge pull request #12 from ClinicalTrials/staging + +Staging",frontend/package.json +90ab6200aa7089a9811fc27a527a1ce04cde677a,05-30-2023 11:22:35,GitHub Enterprise,"Merge pull request #12 from ClinicalTrials/staging + +Staging",frontend/pnpm-lock.yaml +90ab6200aa7089a9811fc27a527a1ce04cde677a,05-30-2023 11:22:35,GitHub Enterprise,"Merge pull request #12 from ClinicalTrials/staging + +Staging",frontend/src/components/CodeView/CodeFlipCard/JsxDisplay.tsx +90ab6200aa7089a9811fc27a527a1ce04cde677a,05-30-2023 11:22:35,GitHub Enterprise,"Merge pull request #12 from ClinicalTrials/staging + +Staging",frontend/src/components/ConversationView/ClearConversationButton/ClearConversationConfirmModal.tsx +90ab6200aa7089a9811fc27a527a1ce04cde677a,05-30-2023 11:22:35,GitHub Enterprise,"Merge pull request #12 from ClinicalTrials/staging + +Staging",frontend/src/components/ConversationView/ClearConversationButton/index.tsx +90ab6200aa7089a9811fc27a527a1ce04cde677a,05-30-2023 11:22:35,GitHub Enterprise,"Merge pull request #12 from ClinicalTrials/staging + +Staging",frontend/src/components/ConversationView/Header.tsx +90ab6200aa7089a9811fc27a527a1ce04cde677a,05-30-2023 11:22:35,GitHub Enterprise,"Merge pull request #12 from ClinicalTrials/staging + +Staging",frontend/src/components/ConversationView/MessageTextarea.tsx +90ab6200aa7089a9811fc27a527a1ce04cde677a,05-30-2023 11:22:35,GitHub Enterprise,"Merge pull request #12 from ClinicalTrials/staging + +Staging",frontend/src/components/ConversationView/MessageView/MessageEvent/Action.tsx +90ab6200aa7089a9811fc27a527a1ce04cde677a,05-30-2023 11:22:35,GitHub Enterprise,"Merge pull request #12 from ClinicalTrials/staging + +Staging",frontend/src/components/ConversationView/MessageView/MessageEvent/LLMResponse.tsx +90ab6200aa7089a9811fc27a527a1ce04cde677a,05-30-2023 11:22:35,GitHub Enterprise,"Merge pull request #12 from ClinicalTrials/staging + +Staging",frontend/src/components/ConversationView/MessageView/MessageEvent/index.tsx +90ab6200aa7089a9811fc27a527a1ce04cde677a,05-30-2023 11:22:35,GitHub Enterprise,"Merge pull request #12 from ClinicalTrials/staging + +Staging",frontend/src/components/ConversationView/MessageView/MessageEvents/MessageEvent/Action.tsx +90ab6200aa7089a9811fc27a527a1ce04cde677a,05-30-2023 11:22:35,GitHub Enterprise,"Merge pull request #12 from ClinicalTrials/staging + +Staging",frontend/src/components/ConversationView/MessageView/MessageEvents/MessageEvents.tsx +90ab6200aa7089a9811fc27a527a1ce04cde677a,05-30-2023 11:22:35,GitHub Enterprise,"Merge pull request #12 from ClinicalTrials/staging + +Staging",frontend/src/components/ConversationView/MessageView/index.tsx +90ab6200aa7089a9811fc27a527a1ce04cde677a,05-30-2023 11:22:35,GitHub Enterprise,"Merge pull request #12 from ClinicalTrials/staging + +Staging",frontend/src/components/ConversationView/index.tsx +90ab6200aa7089a9811fc27a527a1ce04cde677a,05-30-2023 11:22:35,GitHub Enterprise,"Merge pull request #12 from ClinicalTrials/staging + +Staging",frontend/src/components/CustomIcons/AgentIcon.tsx +90ab6200aa7089a9811fc27a527a1ce04cde677a,05-30-2023 11:22:35,GitHub Enterprise,"Merge pull request #12 from ClinicalTrials/staging + +Staging",frontend/src/components/DarkmodeSwitch.tsx +90ab6200aa7089a9811fc27a527a1ce04cde677a,05-30-2023 11:22:35,GitHub Enterprise,"Merge pull request #12 from ClinicalTrials/staging + +Staging",frontend/src/components/DataStorageBanner.tsx +90ab6200aa7089a9811fc27a527a1ce04cde677a,05-30-2023 11:22:35,GitHub Enterprise,"Merge pull request #12 from ClinicalTrials/staging + +Staging",frontend/src/components/EmptyView.tsx +90ab6200aa7089a9811fc27a527a1ce04cde677a,05-30-2023 11:22:35,GitHub Enterprise,"Merge pull request #12 from ClinicalTrials/staging + +Staging",frontend/src/components/ErrorBoundary.tsx +90ab6200aa7089a9811fc27a527a1ce04cde677a,05-30-2023 11:22:35,GitHub Enterprise,"Merge pull request #12 from ClinicalTrials/staging + +Staging",frontend/src/components/ExecutionView/CodeBlock.tsx +90ab6200aa7089a9811fc27a527a1ce04cde677a,05-30-2023 11:22:35,GitHub Enterprise,"Merge pull request #12 from ClinicalTrials/staging + +Staging",frontend/src/components/ExecutionView/CodeFlipCard/JsxDisplay.tsx +90ab6200aa7089a9811fc27a527a1ce04cde677a,05-30-2023 11:22:35,GitHub Enterprise,"Merge pull request #12 from ClinicalTrials/staging + +Staging",frontend/src/components/ExecutionView/CodeFlipCard/ResultsView.tsx +90ab6200aa7089a9811fc27a527a1ce04cde677a,05-30-2023 11:22:35,GitHub Enterprise,"Merge pull request #12 from ClinicalTrials/staging + +Staging",frontend/src/components/ExecutionView/CodeFlipCard/index.tsx +90ab6200aa7089a9811fc27a527a1ce04cde677a,05-30-2023 11:22:35,GitHub Enterprise,"Merge pull request #12 from ClinicalTrials/staging + +Staging",frontend/src/components/ExecutionView/Markdown.tsx +90ab6200aa7089a9811fc27a527a1ce04cde677a,05-30-2023 11:22:35,GitHub Enterprise,"Merge pull request #12 from ClinicalTrials/staging + +Staging",frontend/src/components/ExecutionView/QueryDrawer/DataTableView.tsx +90ab6200aa7089a9811fc27a527a1ce04cde677a,05-30-2023 11:22:35,GitHub Enterprise,"Merge pull request #12 from ClinicalTrials/staging + +Staging",frontend/src/components/ExecutionView/QueryDrawer/ExecutionWarningBanner.tsx +90ab6200aa7089a9811fc27a527a1ce04cde677a,05-30-2023 11:22:35,GitHub Enterprise,"Merge pull request #12 from ClinicalTrials/staging + +Staging",frontend/src/components/ExecutionView/QueryDrawer/NotificationView.tsx +90ab6200aa7089a9811fc27a527a1ce04cde677a,05-30-2023 11:22:35,GitHub Enterprise,"Merge pull request #12 from ClinicalTrials/staging + +Staging",frontend/src/components/ExecutionView/QueryDrawer/index.tsx +90ab6200aa7089a9811fc27a527a1ce04cde677a,05-30-2023 11:22:35,GitHub Enterprise,"Merge pull request #12 from ClinicalTrials/staging + +Staging",frontend/src/components/Icon.tsx +90ab6200aa7089a9811fc27a527a1ce04cde677a,05-30-2023 11:22:35,GitHub Enterprise,"Merge pull request #12 from ClinicalTrials/staging + +Staging",frontend/src/components/Sidebar.tsx +90ab6200aa7089a9811fc27a527a1ce04cde677a,05-30-2023 11:22:35,GitHub Enterprise,"Merge pull request #12 from ClinicalTrials/staging + +Staging",frontend/src/components/UpdateConversationModal.tsx +90ab6200aa7089a9811fc27a527a1ce04cde677a,05-30-2023 11:22:35,GitHub Enterprise,"Merge pull request #12 from ClinicalTrials/staging + +Staging",frontend/src/components/kit/Dropdown.tsx +90ab6200aa7089a9811fc27a527a1ce04cde677a,05-30-2023 11:22:35,GitHub Enterprise,"Merge pull request #12 from ClinicalTrials/staging + +Staging",frontend/src/components/kit/Modal.tsx +90ab6200aa7089a9811fc27a527a1ce04cde677a,05-30-2023 11:22:35,GitHub Enterprise,"Merge pull request #12 from ClinicalTrials/staging + +Staging",frontend/src/components/kit/Select.tsx +90ab6200aa7089a9811fc27a527a1ce04cde677a,05-30-2023 11:22:35,GitHub Enterprise,"Merge pull request #12 from ClinicalTrials/staging + +Staging",frontend/src/components/kit/TextField.tsx +90ab6200aa7089a9811fc27a527a1ce04cde677a,05-30-2023 11:22:35,GitHub Enterprise,"Merge pull request #12 from ClinicalTrials/staging + +Staging",frontend/src/components/kit/Tooltip.tsx +90ab6200aa7089a9811fc27a527a1ce04cde677a,05-30-2023 11:22:35,GitHub Enterprise,"Merge pull request #12 from ClinicalTrials/staging + +Staging",frontend/src/pages/index.tsx +90ab6200aa7089a9811fc27a527a1ce04cde677a,05-30-2023 11:22:35,GitHub Enterprise,"Merge pull request #12 from ClinicalTrials/staging + +Staging",frontend/src/store/assistants.ts +90ab6200aa7089a9811fc27a527a1ce04cde677a,05-30-2023 11:22:35,GitHub Enterprise,"Merge pull request #12 from ClinicalTrials/staging + +Staging",frontend/src/store/conversation.ts +90ab6200aa7089a9811fc27a527a1ce04cde677a,05-30-2023 11:22:35,GitHub Enterprise,"Merge pull request #12 from ClinicalTrials/staging + +Staging",frontend/src/store/index.ts +90ab6200aa7089a9811fc27a527a1ce04cde677a,05-30-2023 11:22:35,GitHub Enterprise,"Merge pull request #12 from ClinicalTrials/staging + +Staging",frontend/src/styles/globals.css +90ab6200aa7089a9811fc27a527a1ce04cde677a,05-30-2023 11:22:35,GitHub Enterprise,"Merge pull request #12 from ClinicalTrials/staging + +Staging",frontend/src/types/common.ts +90ab6200aa7089a9811fc27a527a1ce04cde677a,05-30-2023 11:22:35,GitHub Enterprise,"Merge pull request #12 from ClinicalTrials/staging + +Staging",frontend/src/types/conversation.ts +90ab6200aa7089a9811fc27a527a1ce04cde677a,05-30-2023 11:22:35,GitHub Enterprise,"Merge pull request #12 from ClinicalTrials/staging + +Staging",frontend/src/utils/group.ts +90ab6200aa7089a9811fc27a527a1ce04cde677a,05-30-2023 11:22:35,GitHub Enterprise,"Merge pull request #12 from ClinicalTrials/staging + +Staging",frontend/tailwind.config.ts +a8a44a7acf6b5ed59e92b4ba75911beaff55f3db,05-30-2023 14:31:43,Jakob Heyder,Fix: Initialize snowflake DB on tool usage,backend/app/app/db/session.py +a8a44a7acf6b5ed59e92b4ba75911beaff55f3db,05-30-2023 14:31:43,Jakob Heyder,Fix: Initialize snowflake DB on tool usage,backend/app/app/services/chat_agent/experimental/sql_agent/sql_agent.py +a8a44a7acf6b5ed59e92b4ba75911beaff55f3db,05-30-2023 14:31:43,Jakob Heyder,Fix: Initialize snowflake DB on tool usage,backend/app/app/services/chat_agent/sql_tool/sql_tool.py +cfa7d232bc4b79dc86a99c02770a1e8b3a07290e,05-30-2023 14:36:34,Jakob Heyder,Fix: New Org for Github Auth,frontend/.env.example +d0d5829276f9dc33dbc389547871c652a8831cec,05-30-2023 16:23:06,Jakob Heyder,Meta-agent yaml-config,.env.example +d0d5829276f9dc33dbc389547871c652a8831cec,05-30-2023 16:23:06,Jakob Heyder,Meta-agent yaml-config,backend/app/app/api/v1/endpoints/chat.py +d0d5829276f9dc33dbc389547871c652a8831cec,05-30-2023 16:23:06,Jakob Heyder,Meta-agent yaml-config,backend/app/app/config/agent.yml +d0d5829276f9dc33dbc389547871c652a8831cec,05-30-2023 16:23:06,Jakob Heyder,Meta-agent yaml-config,backend/app/app/core/config.py +d0d5829276f9dc33dbc389547871c652a8831cec,05-30-2023 16:23:06,Jakob Heyder,Meta-agent yaml-config,backend/app/app/deps/agent_deps.py +d0d5829276f9dc33dbc389547871c652a8831cec,05-30-2023 16:23:06,Jakob Heyder,Meta-agent yaml-config,backend/app/app/schemas/agent_schema.py +d0d5829276f9dc33dbc389547871c652a8831cec,05-30-2023 16:23:06,Jakob Heyder,Meta-agent yaml-config,backend/app/app/services/chat_agent/ConversationalChatAgent.py +d0d5829276f9dc33dbc389547871c652a8831cec,05-30-2023 16:23:06,Jakob Heyder,Meta-agent yaml-config,backend/app/app/services/chat_agent/clinical_trials_gov_api_tool/clinical_trials_gov_api_tool.py +d0d5829276f9dc33dbc389547871c652a8831cec,05-30-2023 16:23:06,Jakob Heyder,Meta-agent yaml-config,backend/app/app/services/chat_agent/clinical_trials_gov_api_tool/prompts.py +d0d5829276f9dc33dbc389547871c652a8831cec,05-30-2023 16:23:06,Jakob Heyder,Meta-agent yaml-config,backend/app/app/services/chat_agent/entertainer_tool/entertainer_tool.py +d0d5829276f9dc33dbc389547871c652a8831cec,05-30-2023 16:23:06,Jakob Heyder,Meta-agent yaml-config,backend/app/app/services/chat_agent/entertainer_tool/prompts.py +d0d5829276f9dc33dbc389547871c652a8831cec,05-30-2023 16:23:06,Jakob Heyder,Meta-agent yaml-config,backend/app/app/services/chat_agent/expert_tool/expert_tool.py +d0d5829276f9dc33dbc389547871c652a8831cec,05-30-2023 16:23:06,Jakob Heyder,Meta-agent yaml-config,backend/app/app/services/chat_agent/expert_tool/prompts.py +d0d5829276f9dc33dbc389547871c652a8831cec,05-30-2023 16:23:06,Jakob Heyder,Meta-agent yaml-config,backend/app/app/services/chat_agent/meta_agent.py +d0d5829276f9dc33dbc389547871c652a8831cec,05-30-2023 16:23:06,Jakob Heyder,Meta-agent yaml-config,backend/app/app/services/chat_agent/output_parser.py +d0d5829276f9dc33dbc389547871c652a8831cec,05-30-2023 16:23:06,Jakob Heyder,Meta-agent yaml-config,backend/app/app/services/chat_agent/pdf_tool/__init__.py +d0d5829276f9dc33dbc389547871c652a8831cec,05-30-2023 16:23:06,Jakob Heyder,Meta-agent yaml-config,backend/app/app/services/chat_agent/pdf_tool/pdf_tool.py +d0d5829276f9dc33dbc389547871c652a8831cec,05-30-2023 16:23:06,Jakob Heyder,Meta-agent yaml-config,backend/app/app/services/chat_agent/pdf_tool/prompts.py +d0d5829276f9dc33dbc389547871c652a8831cec,05-30-2023 16:23:06,Jakob Heyder,Meta-agent yaml-config,backend/app/app/services/chat_agent/prompts.py +d0d5829276f9dc33dbc389547871c652a8831cec,05-30-2023 16:23:06,Jakob Heyder,Meta-agent yaml-config,backend/app/app/services/chat_agent/router_agent/SimpleRouterAgent.py +d0d5829276f9dc33dbc389547871c652a8831cec,05-30-2023 16:23:06,Jakob Heyder,Meta-agent yaml-config,backend/app/app/services/chat_agent/router_agent/prompts.py +d0d5829276f9dc33dbc389547871c652a8831cec,05-30-2023 16:23:06,Jakob Heyder,Meta-agent yaml-config,backend/app/app/services/chat_agent/sql_tool/prompts.py +d0d5829276f9dc33dbc389547871c652a8831cec,05-30-2023 16:23:06,Jakob Heyder,Meta-agent yaml-config,backend/app/app/services/chat_agent/sql_tool/sql_tool.py +d0d5829276f9dc33dbc389547871c652a8831cec,05-30-2023 16:23:06,Jakob Heyder,Meta-agent yaml-config,backend/app/app/services/chat_agent/summarizer_tool/prompts.py +d0d5829276f9dc33dbc389547871c652a8831cec,05-30-2023 16:23:06,Jakob Heyder,Meta-agent yaml-config,backend/app/app/services/chat_agent/summarizer_tool/summarizer_tool.py +d0d5829276f9dc33dbc389547871c652a8831cec,05-30-2023 16:23:06,Jakob Heyder,Meta-agent yaml-config,backend/app/app/services/chat_agent/tools/tools.py +d0d5829276f9dc33dbc389547871c652a8831cec,05-30-2023 16:23:06,Jakob Heyder,Meta-agent yaml-config,backend/app/app/services/chat_agent/visualizer_tool/prompts.py +d0d5829276f9dc33dbc389547871c652a8831cec,05-30-2023 16:23:06,Jakob Heyder,Meta-agent yaml-config,backend/app/app/services/chat_agent/visualizer_tool/visualizer_tool.py +b796d39e71fc442289784db72f964497dd107df8,05-30-2023 18:23:33,Jakob Heyder,"Feat: tools yml file, WIP",.env.example +b796d39e71fc442289784db72f964497dd107df8,05-30-2023 18:23:33,Jakob Heyder,"Feat: tools yml file, WIP",backend/app/app/api/v1/endpoints/chat.py +b796d39e71fc442289784db72f964497dd107df8,05-30-2023 18:23:33,Jakob Heyder,"Feat: tools yml file, WIP",backend/app/app/config/agent.yml +b796d39e71fc442289784db72f964497dd107df8,05-30-2023 18:23:33,Jakob Heyder,"Feat: tools yml file, WIP",backend/app/app/config/tools.yml +b796d39e71fc442289784db72f964497dd107df8,05-30-2023 18:23:33,Jakob Heyder,"Feat: tools yml file, WIP",backend/app/app/core/config.py +b796d39e71fc442289784db72f964497dd107df8,05-30-2023 18:23:33,Jakob Heyder,"Feat: tools yml file, WIP",backend/app/app/db/session.py +b796d39e71fc442289784db72f964497dd107df8,05-30-2023 18:23:33,Jakob Heyder,"Feat: tools yml file, WIP",backend/app/app/deps/agent_deps.py +b796d39e71fc442289784db72f964497dd107df8,05-30-2023 18:23:33,Jakob Heyder,"Feat: tools yml file, WIP",backend/app/app/schemas/agent_schema.py +b796d39e71fc442289784db72f964497dd107df8,05-30-2023 18:23:33,Jakob Heyder,"Feat: tools yml file, WIP",backend/app/app/schemas/tool_schema.py +b796d39e71fc442289784db72f964497dd107df8,05-30-2023 18:23:33,Jakob Heyder,"Feat: tools yml file, WIP",backend/app/app/services/chat_agent/helpers/llm.py +b796d39e71fc442289784db72f964497dd107df8,05-30-2023 18:23:33,Jakob Heyder,"Feat: tools yml file, WIP",backend/app/app/services/chat_agent/meta_agent.py +b796d39e71fc442289784db72f964497dd107df8,05-30-2023 18:23:33,Jakob Heyder,"Feat: tools yml file, WIP",backend/app/app/services/chat_agent/router_agent/SimpleRouterAgent.py +b796d39e71fc442289784db72f964497dd107df8,05-30-2023 18:23:33,Jakob Heyder,"Feat: tools yml file, WIP",backend/app/app/services/chat_agent/router_agent/prompts.py +b796d39e71fc442289784db72f964497dd107df8,05-30-2023 18:23:33,Jakob Heyder,"Feat: tools yml file, WIP",backend/app/app/services/chat_agent/tools/ExtendedBaseTool.py +b796d39e71fc442289784db72f964497dd107df8,05-30-2023 18:23:33,Jakob Heyder,"Feat: tools yml file, WIP",backend/app/app/services/chat_agent/tools/clinical_trials_gov_api_tool/clinical_trials_gov_api_tool.py +b796d39e71fc442289784db72f964497dd107df8,05-30-2023 18:23:33,Jakob Heyder,"Feat: tools yml file, WIP",backend/app/app/services/chat_agent/tools/entertainer_tool/entertainer_tool.py +b796d39e71fc442289784db72f964497dd107df8,05-30-2023 18:23:33,Jakob Heyder,"Feat: tools yml file, WIP",backend/app/app/services/chat_agent/tools/expert_tool/expert_tool.py +b796d39e71fc442289784db72f964497dd107df8,05-30-2023 18:23:33,Jakob Heyder,"Feat: tools yml file, WIP",backend/app/app/services/chat_agent/tools/expert_tool/prompts.py +b796d39e71fc442289784db72f964497dd107df8,05-30-2023 18:23:33,Jakob Heyder,"Feat: tools yml file, WIP",backend/app/app/services/chat_agent/tools/pdf_tool/pdf_tool.py +b796d39e71fc442289784db72f964497dd107df8,05-30-2023 18:23:33,Jakob Heyder,"Feat: tools yml file, WIP",backend/app/app/services/chat_agent/tools/sql_tool/sql_tool.py +b796d39e71fc442289784db72f964497dd107df8,05-30-2023 18:23:33,Jakob Heyder,"Feat: tools yml file, WIP",backend/app/app/services/chat_agent/tools/summarizer_tool/summarizer_tool.py +b796d39e71fc442289784db72f964497dd107df8,05-30-2023 18:23:33,Jakob Heyder,"Feat: tools yml file, WIP",backend/app/app/services/chat_agent/tools/tools.py +b796d39e71fc442289784db72f964497dd107df8,05-30-2023 18:23:33,Jakob Heyder,"Feat: tools yml file, WIP",backend/app/app/services/chat_agent/tools/visualizer_tool/visualizer_tool.py +b796d39e71fc442289784db72f964497dd107df8,05-30-2023 18:23:33,Jakob Heyder,"Feat: tools yml file, WIP",backend/app/app/utils/config_loader.py +9566a4ee7a29e84a34243bf5512707c2b87d6ed4,05-31-2023 10:04:11,GitHub Enterprise,"pre commit config (#2) + +* pre commit config for python(backend) and frontend/every other doc format + +* pre commit config add eslint",.pre-commit-config.yaml +9566a4ee7a29e84a34243bf5512707c2b87d6ed4,05-31-2023 10:04:11,GitHub Enterprise,"pre commit config (#2) + +* pre commit config for python(backend) and frontend/every other doc format + +* pre commit config add eslint",backend/app/pyproject.toml +83638fabfa083b5e4dfea64973ae1a447ae333bf,05-31-2023 15:40:58,Jakob Heyder,Feat: Move tool configurations into yaml files,backend/app/app/config/agent.yml +83638fabfa083b5e4dfea64973ae1a447ae333bf,05-31-2023 15:40:58,Jakob Heyder,Feat: Move tool configurations into yaml files,backend/app/app/config/applications/clinical_trials/agent.yml +83638fabfa083b5e4dfea64973ae1a447ae333bf,05-31-2023 15:40:58,Jakob Heyder,Feat: Move tool configurations into yaml files,backend/app/app/config/applications/clinical_trials/tools.yml +83638fabfa083b5e4dfea64973ae1a447ae333bf,05-31-2023 15:40:58,Jakob Heyder,Feat: Move tool configurations into yaml files,backend/app/app/config/tools.yml +83638fabfa083b5e4dfea64973ae1a447ae333bf,05-31-2023 15:40:58,Jakob Heyder,Feat: Move tool configurations into yaml files,backend/app/app/schemas/agent_schema.py +83638fabfa083b5e4dfea64973ae1a447ae333bf,05-31-2023 15:40:58,Jakob Heyder,Feat: Move tool configurations into yaml files,backend/app/app/schemas/tool_schema.py +83638fabfa083b5e4dfea64973ae1a447ae333bf,05-31-2023 15:40:58,Jakob Heyder,Feat: Move tool configurations into yaml files,backend/app/app/services/chat_agent/experimental/clinical_trials_gov_api_search_tool/clinical_trials_gov_api_search_tool.py +83638fabfa083b5e4dfea64973ae1a447ae333bf,05-31-2023 15:40:58,Jakob Heyder,Feat: Move tool configurations into yaml files,backend/app/app/services/chat_agent/meta_agent.py +83638fabfa083b5e4dfea64973ae1a447ae333bf,05-31-2023 15:40:58,Jakob Heyder,Feat: Move tool configurations into yaml files,backend/app/app/services/chat_agent/router_agent/SimpleRouterAgent.py +83638fabfa083b5e4dfea64973ae1a447ae333bf,05-31-2023 15:40:58,Jakob Heyder,Feat: Move tool configurations into yaml files,backend/app/app/services/chat_agent/tools/ExtendedBaseTool.py +83638fabfa083b5e4dfea64973ae1a447ae333bf,05-31-2023 15:40:58,Jakob Heyder,Feat: Move tool configurations into yaml files,backend/app/app/services/chat_agent/tools/clinical_trials_gov_api_tool/clinical_trials_gov_api_tool.py +83638fabfa083b5e4dfea64973ae1a447ae333bf,05-31-2023 15:40:58,Jakob Heyder,Feat: Move tool configurations into yaml files,backend/app/app/services/chat_agent/tools/clinical_trials_gov_api_tool/prompts.py +83638fabfa083b5e4dfea64973ae1a447ae333bf,05-31-2023 15:40:58,Jakob Heyder,Feat: Move tool configurations into yaml files,backend/app/app/services/chat_agent/tools/entertainer_tool/entertainer_tool.py +83638fabfa083b5e4dfea64973ae1a447ae333bf,05-31-2023 15:40:58,Jakob Heyder,Feat: Move tool configurations into yaml files,backend/app/app/services/chat_agent/tools/entertainer_tool/prompts.py +83638fabfa083b5e4dfea64973ae1a447ae333bf,05-31-2023 15:40:58,Jakob Heyder,Feat: Move tool configurations into yaml files,backend/app/app/services/chat_agent/tools/expert_tool/expert_tool.py +83638fabfa083b5e4dfea64973ae1a447ae333bf,05-31-2023 15:40:58,Jakob Heyder,Feat: Move tool configurations into yaml files,backend/app/app/services/chat_agent/tools/pdf_tool/__init__.py +83638fabfa083b5e4dfea64973ae1a447ae333bf,05-31-2023 15:40:58,Jakob Heyder,Feat: Move tool configurations into yaml files,backend/app/app/services/chat_agent/tools/pdf_tool/pdf_tool.py +83638fabfa083b5e4dfea64973ae1a447ae333bf,05-31-2023 15:40:58,Jakob Heyder,Feat: Move tool configurations into yaml files,backend/app/app/services/chat_agent/tools/pdf_tool/prompts.py +83638fabfa083b5e4dfea64973ae1a447ae333bf,05-31-2023 15:40:58,Jakob Heyder,Feat: Move tool configurations into yaml files,backend/app/app/services/chat_agent/tools/sql_tool/prompts.py +83638fabfa083b5e4dfea64973ae1a447ae333bf,05-31-2023 15:40:58,Jakob Heyder,Feat: Move tool configurations into yaml files,backend/app/app/services/chat_agent/tools/sql_tool/sql_tool.py +83638fabfa083b5e4dfea64973ae1a447ae333bf,05-31-2023 15:40:58,Jakob Heyder,Feat: Move tool configurations into yaml files,backend/app/app/services/chat_agent/tools/summarizer_tool/prompts.py +83638fabfa083b5e4dfea64973ae1a447ae333bf,05-31-2023 15:40:58,Jakob Heyder,Feat: Move tool configurations into yaml files,backend/app/app/services/chat_agent/tools/summarizer_tool/summarizer_tool.py +83638fabfa083b5e4dfea64973ae1a447ae333bf,05-31-2023 15:40:58,Jakob Heyder,Feat: Move tool configurations into yaml files,backend/app/app/services/chat_agent/tools/tools.py +83638fabfa083b5e4dfea64973ae1a447ae333bf,05-31-2023 15:40:58,Jakob Heyder,Feat: Move tool configurations into yaml files,backend/app/app/services/chat_agent/tools/visualizer_tool/prompts.py +83638fabfa083b5e4dfea64973ae1a447ae333bf,05-31-2023 15:40:58,Jakob Heyder,Feat: Move tool configurations into yaml files,backend/app/app/services/chat_agent/tools/visualizer_tool/visualizer_tool.py +83638fabfa083b5e4dfea64973ae1a447ae333bf,05-31-2023 15:40:58,Jakob Heyder,Feat: Move tool configurations into yaml files,backend/app/app/utils/config_loader.py +a82e1e64372f43651de7a4b3dc76246da9aa8b58,06-01-2023 09:00:43,Jakob Heyder,Feat: Generalise SQL Tool (changed env params),.env.example +a82e1e64372f43651de7a4b3dc76246da9aa8b58,06-01-2023 09:00:43,Jakob Heyder,Feat: Generalise SQL Tool (changed env params),.gitignore +a82e1e64372f43651de7a4b3dc76246da9aa8b58,06-01-2023 09:00:43,Jakob Heyder,Feat: Generalise SQL Tool (changed env params),backend/app/app/api/v1/endpoints/sql.py +a82e1e64372f43651de7a4b3dc76246da9aa8b58,06-01-2023 09:00:43,Jakob Heyder,Feat: Generalise SQL Tool (changed env params),backend/app/app/constants/clinical_trial_db_info/clinical_trial_db_info.json +a82e1e64372f43651de7a4b3dc76246da9aa8b58,06-01-2023 09:00:43,Jakob Heyder,Feat: Generalise SQL Tool (changed env params),backend/app/app/constants/clinical_trial_db_info/clinical_trial_db_info.py +a82e1e64372f43651de7a4b3dc76246da9aa8b58,06-01-2023 09:00:43,Jakob Heyder,Feat: Generalise SQL Tool (changed env params),backend/app/app/constants/clinical_trial_db_info/pc_db_info.json +a82e1e64372f43651de7a4b3dc76246da9aa8b58,06-01-2023 09:00:43,Jakob Heyder,Feat: Generalise SQL Tool (changed env params),backend/app/app/core/config.py +a82e1e64372f43651de7a4b3dc76246da9aa8b58,06-01-2023 09:00:43,Jakob Heyder,Feat: Generalise SQL Tool (changed env params),backend/app/app/db/SQLDatabaseExtended.py +a82e1e64372f43651de7a4b3dc76246da9aa8b58,06-01-2023 09:00:43,Jakob Heyder,Feat: Generalise SQL Tool (changed env params),backend/app/app/db/session.py +a82e1e64372f43651de7a4b3dc76246da9aa8b58,06-01-2023 09:00:43,Jakob Heyder,Feat: Generalise SQL Tool (changed env params),backend/app/app/schemas/pdf_schema.py +a82e1e64372f43651de7a4b3dc76246da9aa8b58,06-01-2023 09:00:43,Jakob Heyder,Feat: Generalise SQL Tool (changed env params),backend/app/app/schemas/tool_schemas/sql_tool_schema.py +a82e1e64372f43651de7a4b3dc76246da9aa8b58,06-01-2023 09:00:43,Jakob Heyder,Feat: Generalise SQL Tool (changed env params),backend/app/app/services/chat_agent/experimental/sql_agent/sql_agent.py +a82e1e64372f43651de7a4b3dc76246da9aa8b58,06-01-2023 09:00:43,Jakob Heyder,Feat: Generalise SQL Tool (changed env params),backend/app/app/services/chat_agent/tools/applications/clinical_trials/pdf_tool/pdf_tool.py +a82e1e64372f43651de7a4b3dc76246da9aa8b58,06-01-2023 09:00:43,Jakob Heyder,Feat: Generalise SQL Tool (changed env params),backend/app/app/services/chat_agent/tools/library/sql_tool/sql_tool.py +fbd5ba193367b7d04ae88bd4ef84af6a1830ed86,06-01-2023 12:41:21,GitHub Enterprise,"Feat/sem ver versioning (#3) + +""## impact surface
No services changed
""",.github/workflows/gitversion.yml +fbd5ba193367b7d04ae88bd4ef84af6a1830ed86,06-01-2023 12:41:21,GitHub Enterprise,"Feat/sem ver versioning (#3) + +""## impact surface
No services changed
""",.github/workflows/main.yml +618970590a0713434616623e1f2d7a49bff705d7,06-01-2023 13:22:40,Jakob Heyder,Fix: Cleanup - remove unnecessary BE files,.env.example +618970590a0713434616623e1f2d7a49bff705d7,06-01-2023 13:22:40,Jakob Heyder,Fix: Cleanup - remove unnecessary BE files,Makefile +618970590a0713434616623e1f2d7a49bff705d7,06-01-2023 13:22:40,Jakob Heyder,Fix: Cleanup - remove unnecessary BE files,backend/app/alembic/README +618970590a0713434616623e1f2d7a49bff705d7,06-01-2023 13:22:40,Jakob Heyder,Fix: Cleanup - remove unnecessary BE files,backend/app/app/api/celery_task.py +618970590a0713434616623e1f2d7a49bff705d7,06-01-2023 13:22:40,Jakob Heyder,Fix: Cleanup - remove unnecessary BE files,backend/app/app/api/deps.py +618970590a0713434616623e1f2d7a49bff705d7,06-01-2023 13:22:40,Jakob Heyder,Fix: Cleanup - remove unnecessary BE files,backend/app/app/api/v1/api.py +618970590a0713434616623e1f2d7a49bff705d7,06-01-2023 13:22:40,Jakob Heyder,Fix: Cleanup - remove unnecessary BE files,backend/app/app/api/v1/endpoints/cache.py +618970590a0713434616623e1f2d7a49bff705d7,06-01-2023 13:22:40,Jakob Heyder,Fix: Cleanup - remove unnecessary BE files,backend/app/app/api/v1/endpoints/chat.py +618970590a0713434616623e1f2d7a49bff705d7,06-01-2023 13:22:40,Jakob Heyder,Fix: Cleanup - remove unnecessary BE files,backend/app/app/api/v1/endpoints/group.py +618970590a0713434616623e1f2d7a49bff705d7,06-01-2023 13:22:40,Jakob Heyder,Fix: Cleanup - remove unnecessary BE files,backend/app/app/api/v1/endpoints/login.py +618970590a0713434616623e1f2d7a49bff705d7,06-01-2023 13:22:40,Jakob Heyder,Fix: Cleanup - remove unnecessary BE files,backend/app/app/api/v1/endpoints/natural_language.py +618970590a0713434616623e1f2d7a49bff705d7,06-01-2023 13:22:40,Jakob Heyder,Fix: Cleanup - remove unnecessary BE files,backend/app/app/api/v1/endpoints/periodic_tasks.py +618970590a0713434616623e1f2d7a49bff705d7,06-01-2023 13:22:40,Jakob Heyder,Fix: Cleanup - remove unnecessary BE files,backend/app/app/api/v1/endpoints/report.py +618970590a0713434616623e1f2d7a49bff705d7,06-01-2023 13:22:40,Jakob Heyder,Fix: Cleanup - remove unnecessary BE files,backend/app/app/api/v1/endpoints/role.py +618970590a0713434616623e1f2d7a49bff705d7,06-01-2023 13:22:40,Jakob Heyder,Fix: Cleanup - remove unnecessary BE files,backend/app/app/api/v1/endpoints/sql.py +618970590a0713434616623e1f2d7a49bff705d7,06-01-2023 13:22:40,Jakob Heyder,Fix: Cleanup - remove unnecessary BE files,backend/app/app/api/v1/endpoints/user.py +618970590a0713434616623e1f2d7a49bff705d7,06-01-2023 13:22:40,Jakob Heyder,Fix: Cleanup - remove unnecessary BE files,backend/app/app/core/authz.polar +618970590a0713434616623e1f2d7a49bff705d7,06-01-2023 13:22:40,Jakob Heyder,Fix: Cleanup - remove unnecessary BE files,backend/app/app/core/authz.py +618970590a0713434616623e1f2d7a49bff705d7,06-01-2023 13:22:40,Jakob Heyder,Fix: Cleanup - remove unnecessary BE files,backend/app/app/core/config.py +618970590a0713434616623e1f2d7a49bff705d7,06-01-2023 13:22:40,Jakob Heyder,Fix: Cleanup - remove unnecessary BE files,backend/app/app/core/security.py +618970590a0713434616623e1f2d7a49bff705d7,06-01-2023 13:22:40,Jakob Heyder,Fix: Cleanup - remove unnecessary BE files,backend/app/app/crud/group_crud.py +618970590a0713434616623e1f2d7a49bff705d7,06-01-2023 13:22:40,Jakob Heyder,Fix: Cleanup - remove unnecessary BE files,backend/app/app/crud/image_media_crud.py +618970590a0713434616623e1f2d7a49bff705d7,06-01-2023 13:22:40,Jakob Heyder,Fix: Cleanup - remove unnecessary BE files,backend/app/app/crud/role_crud.py +618970590a0713434616623e1f2d7a49bff705d7,06-01-2023 13:22:40,Jakob Heyder,Fix: Cleanup - remove unnecessary BE files,backend/app/app/crud/user_crud.py +618970590a0713434616623e1f2d7a49bff705d7,06-01-2023 13:22:40,Jakob Heyder,Fix: Cleanup - remove unnecessary BE files,backend/app/app/db/init_db.py +618970590a0713434616623e1f2d7a49bff705d7,06-01-2023 13:22:40,Jakob Heyder,Fix: Cleanup - remove unnecessary BE files,backend/app/app/db/models.py +618970590a0713434616623e1f2d7a49bff705d7,06-01-2023 13:22:40,Jakob Heyder,Fix: Cleanup - remove unnecessary BE files,backend/app/app/db/protocol_pdf_ingestion.py +618970590a0713434616623e1f2d7a49bff705d7,06-01-2023 13:22:40,Jakob Heyder,Fix: Cleanup - remove unnecessary BE files,backend/app/app/deps/group_deps.py +618970590a0713434616623e1f2d7a49bff705d7,06-01-2023 13:22:40,Jakob Heyder,Fix: Cleanup - remove unnecessary BE files,backend/app/app/deps/role_deps.py +618970590a0713434616623e1f2d7a49bff705d7,06-01-2023 13:22:40,Jakob Heyder,Fix: Cleanup - remove unnecessary BE files,backend/app/app/deps/user_deps.py +618970590a0713434616623e1f2d7a49bff705d7,06-01-2023 13:22:40,Jakob Heyder,Fix: Cleanup - remove unnecessary BE files,backend/app/app/initial_data.py +618970590a0713434616623e1f2d7a49bff705d7,06-01-2023 13:22:40,Jakob Heyder,Fix: Cleanup - remove unnecessary BE files,backend/app/app/main.py +618970590a0713434616623e1f2d7a49bff705d7,06-01-2023 13:22:40,Jakob Heyder,Fix: Cleanup - remove unnecessary BE files,backend/app/app/models/conversation_model.py +618970590a0713434616623e1f2d7a49bff705d7,06-01-2023 13:22:40,Jakob Heyder,Fix: Cleanup - remove unnecessary BE files,backend/app/app/models/group_model.py +618970590a0713434616623e1f2d7a49bff705d7,06-01-2023 13:22:40,Jakob Heyder,Fix: Cleanup - remove unnecessary BE files,backend/app/app/models/group_user_model.py +618970590a0713434616623e1f2d7a49bff705d7,06-01-2023 13:22:40,Jakob Heyder,Fix: Cleanup - remove unnecessary BE files,backend/app/app/models/image_media_model.py +618970590a0713434616623e1f2d7a49bff705d7,06-01-2023 13:22:40,Jakob Heyder,Fix: Cleanup - remove unnecessary BE files,backend/app/app/models/media_model.py +618970590a0713434616623e1f2d7a49bff705d7,06-01-2023 13:22:40,Jakob Heyder,Fix: Cleanup - remove unnecessary BE files,backend/app/app/models/message_model.py +618970590a0713434616623e1f2d7a49bff705d7,06-01-2023 13:22:40,Jakob Heyder,Fix: Cleanup - remove unnecessary BE files,backend/app/app/models/role_model.py +618970590a0713434616623e1f2d7a49bff705d7,06-01-2023 13:22:40,Jakob Heyder,Fix: Cleanup - remove unnecessary BE files,backend/app/app/models/user_model.py +618970590a0713434616623e1f2d7a49bff705d7,06-01-2023 13:22:40,Jakob Heyder,Fix: Cleanup - remove unnecessary BE files,backend/app/app/schemas/common_schema.py +618970590a0713434616623e1f2d7a49bff705d7,06-01-2023 13:22:40,Jakob Heyder,Fix: Cleanup - remove unnecessary BE files,backend/app/app/schemas/execution_schema.py +618970590a0713434616623e1f2d7a49bff705d7,06-01-2023 13:22:40,Jakob Heyder,Fix: Cleanup - remove unnecessary BE files,backend/app/app/schemas/group_schema.py +618970590a0713434616623e1f2d7a49bff705d7,06-01-2023 13:22:40,Jakob Heyder,Fix: Cleanup - remove unnecessary BE files,backend/app/app/schemas/image_media_schema.py +618970590a0713434616623e1f2d7a49bff705d7,06-01-2023 13:22:40,Jakob Heyder,Fix: Cleanup - remove unnecessary BE files,backend/app/app/schemas/media_schema.py +618970590a0713434616623e1f2d7a49bff705d7,06-01-2023 13:22:40,Jakob Heyder,Fix: Cleanup - remove unnecessary BE files,backend/app/app/schemas/role_schema.py +618970590a0713434616623e1f2d7a49bff705d7,06-01-2023 13:22:40,Jakob Heyder,Fix: Cleanup - remove unnecessary BE files,backend/app/app/schemas/token_schema.py +618970590a0713434616623e1f2d7a49bff705d7,06-01-2023 13:22:40,Jakob Heyder,Fix: Cleanup - remove unnecessary BE files,backend/app/app/schemas/tool_schemas/sql_tool_schema.py +618970590a0713434616623e1f2d7a49bff705d7,06-01-2023 13:22:40,Jakob Heyder,Fix: Cleanup - remove unnecessary BE files,backend/app/app/schemas/user_schema.py +618970590a0713434616623e1f2d7a49bff705d7,06-01-2023 13:22:40,Jakob Heyder,Fix: Cleanup - remove unnecessary BE files,backend/app/app/services/chat_agent/experimental/clinical_trials_gov_api_search_tool/clinical_trials_gov_api_search_tool.py +618970590a0713434616623e1f2d7a49bff705d7,06-01-2023 13:22:40,Jakob Heyder,Fix: Cleanup - remove unnecessary BE files,backend/app/app/services/chat_agent/experimental/output_parser/output_parser.py +618970590a0713434616623e1f2d7a49bff705d7,06-01-2023 13:22:40,Jakob Heyder,Fix: Cleanup - remove unnecessary BE files,backend/app/app/services/chat_agent/experimental/output_parser/prompts.py +618970590a0713434616623e1f2d7a49bff705d7,06-01-2023 13:22:40,Jakob Heyder,Fix: Cleanup - remove unnecessary BE files,backend/app/app/services/chat_agent/experimental/simple_visualizer_tool/prompts.py +618970590a0713434616623e1f2d7a49bff705d7,06-01-2023 13:22:40,Jakob Heyder,Fix: Cleanup - remove unnecessary BE files,backend/app/app/services/chat_agent/experimental/simple_visualizer_tool/visualizer_tool.py +618970590a0713434616623e1f2d7a49bff705d7,06-01-2023 13:22:40,Jakob Heyder,Fix: Cleanup - remove unnecessary BE files,backend/app/app/services/chat_agent/experimental/sql_agent/prompts.py +618970590a0713434616623e1f2d7a49bff705d7,06-01-2023 13:22:40,Jakob Heyder,Fix: Cleanup - remove unnecessary BE files,backend/app/app/services/chat_agent/experimental/sql_agent/sql_agent.py +618970590a0713434616623e1f2d7a49bff705d7,06-01-2023 13:22:40,Jakob Heyder,Fix: Cleanup - remove unnecessary BE files,backend/app/app/services/chat_agent/experimental/sql_agent/toolkit.py +618970590a0713434616623e1f2d7a49bff705d7,06-01-2023 13:22:40,Jakob Heyder,Fix: Cleanup - remove unnecessary BE files,backend/app/app/services/chat_agent/experimental/sql_agent/tools.py +618970590a0713434616623e1f2d7a49bff705d7,06-01-2023 13:22:40,Jakob Heyder,Fix: Cleanup - remove unnecessary BE files,backend/app/app/services/sql_chat/prompts.py +618970590a0713434616623e1f2d7a49bff705d7,06-01-2023 13:22:40,Jakob Heyder,Fix: Cleanup - remove unnecessary BE files,backend/app/app/services/sql_chat/sql_chat.py +618970590a0713434616623e1f2d7a49bff705d7,06-01-2023 13:22:40,Jakob Heyder,Fix: Cleanup - remove unnecessary BE files,backend/app/app/utils/exceptions/__init__.py +618970590a0713434616623e1f2d7a49bff705d7,06-01-2023 13:22:40,Jakob Heyder,Fix: Cleanup - remove unnecessary BE files,backend/app/app/utils/exceptions/user_exceptions.py +618970590a0713434616623e1f2d7a49bff705d7,06-01-2023 13:22:40,Jakob Heyder,Fix: Cleanup - remove unnecessary BE files,backend/app/app/utils/map_schema.py +618970590a0713434616623e1f2d7a49bff705d7,06-01-2023 13:22:40,Jakob Heyder,Fix: Cleanup - remove unnecessary BE files,backend/app/app/utils/partial.py +618970590a0713434616623e1f2d7a49bff705d7,06-01-2023 13:22:40,Jakob Heyder,Fix: Cleanup - remove unnecessary BE files,backend/app/app/utils/print_model.py +618970590a0713434616623e1f2d7a49bff705d7,06-01-2023 13:22:40,Jakob Heyder,Fix: Cleanup - remove unnecessary BE files,backend/app/app/utils/requestvars.py +618970590a0713434616623e1f2d7a49bff705d7,06-01-2023 13:22:40,Jakob Heyder,Fix: Cleanup - remove unnecessary BE files,backend/app/app/utils/resize_image.py +618970590a0713434616623e1f2d7a49bff705d7,06-01-2023 13:22:40,Jakob Heyder,Fix: Cleanup - remove unnecessary BE files,backend/app/app/utils/snowflake.py +618970590a0713434616623e1f2d7a49bff705d7,06-01-2023 13:22:40,Jakob Heyder,Fix: Cleanup - remove unnecessary BE files,backend/app/app/utils/token.py +618970590a0713434616623e1f2d7a49bff705d7,06-01-2023 13:22:40,Jakob Heyder,Fix: Cleanup - remove unnecessary BE files,docker-compose.yml +1706d4a2a6d0976d248ec9b01cc3865fb8487acd,06-01-2023 13:59:23,Jakob Heyder,Fix: SQL table infos generate bug,backend/app/app/db/SQLDatabaseExtended.py +1706d4a2a6d0976d248ec9b01cc3865fb8487acd,06-01-2023 13:59:23,Jakob Heyder,Fix: SQL table infos generate bug,backend/app/app/services/chat_agent/tools/library/sql_tool/sql_tool.py +620433512fe852a0fa85854fb9a7d848cfaad7b5,06-01-2023 14:06:59,Jakob Heyder,Fix: validate sql_tool_db only if enabled,backend/app/app/core/config.py +9b2a30c95ecac33264400ceb46ac550109030cbe,06-01-2023 14:23:44,Jakob Heyder,Fix: Remove init imports,backend/app/app/crud/__init__.py +9b2a30c95ecac33264400ceb46ac550109030cbe,06-01-2023 14:23:44,Jakob Heyder,Fix: Remove init imports,backend/app/app/models/__init__.py +9b2a30c95ecac33264400ceb46ac550109030cbe,06-01-2023 14:23:44,Jakob Heyder,Fix: Remove init imports,backend/app/app/schemas/__init__.py +9b2a30c95ecac33264400ceb46ac550109030cbe,06-01-2023 14:23:44,Jakob Heyder,Fix: Remove init imports,backend/app/app/schemas/tool_schemas/__init__.py +b1a67a2ec4aaaa6e6d63af57a85ae7c68eb9b328,06-01-2023 16:18:10,Jakob Heyder,Feat: Frontend ToolActionRenderer and ToolAppendixRenderer for customization,.env.example +b1a67a2ec4aaaa6e6d63af57a85ae7c68eb9b328,06-01-2023 16:18:10,Jakob Heyder,Feat: Frontend ToolActionRenderer and ToolAppendixRenderer for customization,backend/app/app/core/config.py +b1a67a2ec4aaaa6e6d63af57a85ae7c68eb9b328,06-01-2023 16:18:10,Jakob Heyder,Feat: Frontend ToolActionRenderer and ToolAppendixRenderer for customization,frontend/src/components/CodeView/CodeFlipCard/JsxDisplay.tsx +b1a67a2ec4aaaa6e6d63af57a85ae7c68eb9b328,06-01-2023 16:18:10,Jakob Heyder,Feat: Frontend ToolActionRenderer and ToolAppendixRenderer for customization,frontend/src/components/CodeView/CodeFlipCard/ResultsView.tsx +b1a67a2ec4aaaa6e6d63af57a85ae7c68eb9b328,06-01-2023 16:18:10,Jakob Heyder,Feat: Frontend ToolActionRenderer and ToolAppendixRenderer for customization,frontend/src/components/CodeView/CodeFlipCard/index.tsx +b1a67a2ec4aaaa6e6d63af57a85ae7c68eb9b328,06-01-2023 16:18:10,Jakob Heyder,Feat: Frontend ToolActionRenderer and ToolAppendixRenderer for customization,frontend/src/components/ConversationView/MessageView/MessageEvents/MessageEvent/Action.tsx +b1a67a2ec4aaaa6e6d63af57a85ae7c68eb9b328,06-01-2023 16:18:10,Jakob Heyder,Feat: Frontend ToolActionRenderer and ToolAppendixRenderer for customization,frontend/src/components/ConversationView/MessageView/MessageEvents/MessageEvent/index.tsx +b1a67a2ec4aaaa6e6d63af57a85ae7c68eb9b328,06-01-2023 16:18:10,Jakob Heyder,Feat: Frontend ToolActionRenderer and ToolAppendixRenderer for customization,frontend/src/components/ConversationView/MessageView/index.tsx +b1a67a2ec4aaaa6e6d63af57a85ae7c68eb9b328,06-01-2023 16:18:10,Jakob Heyder,Feat: Frontend ToolActionRenderer and ToolAppendixRenderer for customization,frontend/src/components/ToolActionRenderer/applications/clinicalTrials/index.tsx +b1a67a2ec4aaaa6e6d63af57a85ae7c68eb9b328,06-01-2023 16:18:10,Jakob Heyder,Feat: Frontend ToolActionRenderer and ToolAppendixRenderer for customization,frontend/src/components/ToolActionRenderer/index.tsx +b1a67a2ec4aaaa6e6d63af57a85ae7c68eb9b328,06-01-2023 16:18:10,Jakob Heyder,Feat: Frontend ToolActionRenderer and ToolAppendixRenderer for customization,frontend/src/components/ToolActionRenderer/library/actions.tsx +b1a67a2ec4aaaa6e6d63af57a85ae7c68eb9b328,06-01-2023 16:18:10,Jakob Heyder,Feat: Frontend ToolActionRenderer and ToolAppendixRenderer for customization,frontend/src/components/ToolAppendixRenderer/index.tsx +b1a67a2ec4aaaa6e6d63af57a85ae7c68eb9b328,06-01-2023 16:18:10,Jakob Heyder,Feat: Frontend ToolActionRenderer and ToolAppendixRenderer for customization,frontend/src/types/message.ts +1220cbe1c6823e847dc4ccd3ca51e87d334565df,06-02-2023 13:46:06,Jakob Heyder,Update langchain version v0.188,backend/app/alembic/env.py +1220cbe1c6823e847dc4ccd3ca51e87d334565df,06-02-2023 13:46:06,Jakob Heyder,Update langchain version v0.188,backend/app/app/config/applications/clinical_trials/tools.yml +1220cbe1c6823e847dc4ccd3ca51e87d334565df,06-02-2023 13:46:06,Jakob Heyder,Update langchain version v0.188,backend/app/poetry.lock +1220cbe1c6823e847dc4ccd3ca51e87d334565df,06-02-2023 13:46:06,Jakob Heyder,Update langchain version v0.188,backend/app/pyproject.toml +12c20aaf41c4625b6e05c529b487d050a465bb31,06-02-2023 15:21:21,GitHub Enterprise,"Arch flow added + initial setup for usage guide (still WIP) (#5) + +""## impact surface
No services changed
""",README.md +8ec685b0296570a71367946ba7840ce579ad1cbf,06-04-2023 19:38:32,GitHub Enterprise,"Feat/authentification saving (#6) + +# Authentification with NextAuth and auth model in SQLModel +""## impact surface
- frontend/Dockerfile - v0.1.0-feat-authentification-saving.1
- frontend/custom_typings - v0.1.0-feat-authentification-saving.1
- frontend/next.config.mjs - v0.1.0-feat-authentification-saving.1
- frontend/package.json - v0.1.0-feat-authentification-saving.1
- frontend/pnpm-lock.yaml - v0.1.0-feat-authentification-saving.1
- frontend/postcss.config.cjs - v0.1.0-feat-authentification-saving.1
- frontend/prettier.config.cjs - v0.1.0-feat-authentification-saving.1
- frontend/prisma - v0.1.0-feat-authentification-saving.1
- frontend/prismalib - v0.1.0-feat-authentification-saving.1
- frontend/public - v0.1.0-feat-authentification-saving.1
- frontend/src - v0.1.0-feat-authentification-saving.1
- frontend/tailwind.config.ts - v0.1.0-feat-authentification-saving.1
- frontend/tsconfig.json - v0.1.0-feat-authentification-saving.1
""",.env.example +8ec685b0296570a71367946ba7840ce579ad1cbf,06-04-2023 19:38:32,GitHub Enterprise,"Feat/authentification saving (#6) + +# Authentification with NextAuth and auth model in SQLModel +""## impact surface
- frontend/Dockerfile - v0.1.0-feat-authentification-saving.1
- frontend/custom_typings - v0.1.0-feat-authentification-saving.1
- frontend/next.config.mjs - v0.1.0-feat-authentification-saving.1
- frontend/package.json - v0.1.0-feat-authentification-saving.1
- frontend/pnpm-lock.yaml - v0.1.0-feat-authentification-saving.1
- frontend/postcss.config.cjs - v0.1.0-feat-authentification-saving.1
- frontend/prettier.config.cjs - v0.1.0-feat-authentification-saving.1
- frontend/prisma - v0.1.0-feat-authentification-saving.1
- frontend/prismalib - v0.1.0-feat-authentification-saving.1
- frontend/public - v0.1.0-feat-authentification-saving.1
- frontend/src - v0.1.0-feat-authentification-saving.1
- frontend/tailwind.config.ts - v0.1.0-feat-authentification-saving.1
- frontend/tsconfig.json - v0.1.0-feat-authentification-saving.1
""",.pre-commit-config.yaml +8ec685b0296570a71367946ba7840ce579ad1cbf,06-04-2023 19:38:32,GitHub Enterprise,"Feat/authentification saving (#6) + +# Authentification with NextAuth and auth model in SQLModel +""## impact surface
- frontend/Dockerfile - v0.1.0-feat-authentification-saving.1
- frontend/custom_typings - v0.1.0-feat-authentification-saving.1
- frontend/next.config.mjs - v0.1.0-feat-authentification-saving.1
- frontend/package.json - v0.1.0-feat-authentification-saving.1
- frontend/pnpm-lock.yaml - v0.1.0-feat-authentification-saving.1
- frontend/postcss.config.cjs - v0.1.0-feat-authentification-saving.1
- frontend/prettier.config.cjs - v0.1.0-feat-authentification-saving.1
- frontend/prisma - v0.1.0-feat-authentification-saving.1
- frontend/prismalib - v0.1.0-feat-authentification-saving.1
- frontend/public - v0.1.0-feat-authentification-saving.1
- frontend/src - v0.1.0-feat-authentification-saving.1
- frontend/tailwind.config.ts - v0.1.0-feat-authentification-saving.1
- frontend/tsconfig.json - v0.1.0-feat-authentification-saving.1
""",README.md +8ec685b0296570a71367946ba7840ce579ad1cbf,06-04-2023 19:38:32,GitHub Enterprise,"Feat/authentification saving (#6) + +# Authentification with NextAuth and auth model in SQLModel +""## impact surface
- frontend/Dockerfile - v0.1.0-feat-authentification-saving.1
- frontend/custom_typings - v0.1.0-feat-authentification-saving.1
- frontend/next.config.mjs - v0.1.0-feat-authentification-saving.1
- frontend/package.json - v0.1.0-feat-authentification-saving.1
- frontend/pnpm-lock.yaml - v0.1.0-feat-authentification-saving.1
- frontend/postcss.config.cjs - v0.1.0-feat-authentification-saving.1
- frontend/prettier.config.cjs - v0.1.0-feat-authentification-saving.1
- frontend/prisma - v0.1.0-feat-authentification-saving.1
- frontend/prismalib - v0.1.0-feat-authentification-saving.1
- frontend/public - v0.1.0-feat-authentification-saving.1
- frontend/src - v0.1.0-feat-authentification-saving.1
- frontend/tailwind.config.ts - v0.1.0-feat-authentification-saving.1
- frontend/tsconfig.json - v0.1.0-feat-authentification-saving.1
""",backend/app/alembic/env.py +8ec685b0296570a71367946ba7840ce579ad1cbf,06-04-2023 19:38:32,GitHub Enterprise,"Feat/authentification saving (#6) + +# Authentification with NextAuth and auth model in SQLModel +""## impact surface
- frontend/Dockerfile - v0.1.0-feat-authentification-saving.1
- frontend/custom_typings - v0.1.0-feat-authentification-saving.1
- frontend/next.config.mjs - v0.1.0-feat-authentification-saving.1
- frontend/package.json - v0.1.0-feat-authentification-saving.1
- frontend/pnpm-lock.yaml - v0.1.0-feat-authentification-saving.1
- frontend/postcss.config.cjs - v0.1.0-feat-authentification-saving.1
- frontend/prettier.config.cjs - v0.1.0-feat-authentification-saving.1
- frontend/prisma - v0.1.0-feat-authentification-saving.1
- frontend/prismalib - v0.1.0-feat-authentification-saving.1
- frontend/public - v0.1.0-feat-authentification-saving.1
- frontend/src - v0.1.0-feat-authentification-saving.1
- frontend/tailwind.config.ts - v0.1.0-feat-authentification-saving.1
- frontend/tsconfig.json - v0.1.0-feat-authentification-saving.1
""",backend/app/alembic/versions/2023-06-02-15-48_adbe2344fb23.py +8ec685b0296570a71367946ba7840ce579ad1cbf,06-04-2023 19:38:32,GitHub Enterprise,"Feat/authentification saving (#6) + +# Authentification with NextAuth and auth model in SQLModel +""## impact surface
- frontend/Dockerfile - v0.1.0-feat-authentification-saving.1
- frontend/custom_typings - v0.1.0-feat-authentification-saving.1
- frontend/next.config.mjs - v0.1.0-feat-authentification-saving.1
- frontend/package.json - v0.1.0-feat-authentification-saving.1
- frontend/pnpm-lock.yaml - v0.1.0-feat-authentification-saving.1
- frontend/postcss.config.cjs - v0.1.0-feat-authentification-saving.1
- frontend/prettier.config.cjs - v0.1.0-feat-authentification-saving.1
- frontend/prisma - v0.1.0-feat-authentification-saving.1
- frontend/prismalib - v0.1.0-feat-authentification-saving.1
- frontend/public - v0.1.0-feat-authentification-saving.1
- frontend/src - v0.1.0-feat-authentification-saving.1
- frontend/tailwind.config.ts - v0.1.0-feat-authentification-saving.1
- frontend/tsconfig.json - v0.1.0-feat-authentification-saving.1
""",backend/app/app/models/__init__.py +8ec685b0296570a71367946ba7840ce579ad1cbf,06-04-2023 19:38:32,GitHub Enterprise,"Feat/authentification saving (#6) + +# Authentification with NextAuth and auth model in SQLModel +""## impact surface
- frontend/Dockerfile - v0.1.0-feat-authentification-saving.1
- frontend/custom_typings - v0.1.0-feat-authentification-saving.1
- frontend/next.config.mjs - v0.1.0-feat-authentification-saving.1
- frontend/package.json - v0.1.0-feat-authentification-saving.1
- frontend/pnpm-lock.yaml - v0.1.0-feat-authentification-saving.1
- frontend/postcss.config.cjs - v0.1.0-feat-authentification-saving.1
- frontend/prettier.config.cjs - v0.1.0-feat-authentification-saving.1
- frontend/prisma - v0.1.0-feat-authentification-saving.1
- frontend/prismalib - v0.1.0-feat-authentification-saving.1
- frontend/public - v0.1.0-feat-authentification-saving.1
- frontend/src - v0.1.0-feat-authentification-saving.1
- frontend/tailwind.config.ts - v0.1.0-feat-authentification-saving.1
- frontend/tsconfig.json - v0.1.0-feat-authentification-saving.1
""",backend/app/app/models/auth_model.py +8ec685b0296570a71367946ba7840ce579ad1cbf,06-04-2023 19:38:32,GitHub Enterprise,"Feat/authentification saving (#6) + +# Authentification with NextAuth and auth model in SQLModel +""## impact surface
- frontend/Dockerfile - v0.1.0-feat-authentification-saving.1
- frontend/custom_typings - v0.1.0-feat-authentification-saving.1
- frontend/next.config.mjs - v0.1.0-feat-authentification-saving.1
- frontend/package.json - v0.1.0-feat-authentification-saving.1
- frontend/pnpm-lock.yaml - v0.1.0-feat-authentification-saving.1
- frontend/postcss.config.cjs - v0.1.0-feat-authentification-saving.1
- frontend/prettier.config.cjs - v0.1.0-feat-authentification-saving.1
- frontend/prisma - v0.1.0-feat-authentification-saving.1
- frontend/prismalib - v0.1.0-feat-authentification-saving.1
- frontend/public - v0.1.0-feat-authentification-saving.1
- frontend/src - v0.1.0-feat-authentification-saving.1
- frontend/tailwind.config.ts - v0.1.0-feat-authentification-saving.1
- frontend/tsconfig.json - v0.1.0-feat-authentification-saving.1
""",backend/app/app/schemas/__init__.py +8ec685b0296570a71367946ba7840ce579ad1cbf,06-04-2023 19:38:32,GitHub Enterprise,"Feat/authentification saving (#6) + +# Authentification with NextAuth and auth model in SQLModel +""## impact surface
- frontend/Dockerfile - v0.1.0-feat-authentification-saving.1
- frontend/custom_typings - v0.1.0-feat-authentification-saving.1
- frontend/next.config.mjs - v0.1.0-feat-authentification-saving.1
- frontend/package.json - v0.1.0-feat-authentification-saving.1
- frontend/pnpm-lock.yaml - v0.1.0-feat-authentification-saving.1
- frontend/postcss.config.cjs - v0.1.0-feat-authentification-saving.1
- frontend/prettier.config.cjs - v0.1.0-feat-authentification-saving.1
- frontend/prisma - v0.1.0-feat-authentification-saving.1
- frontend/prismalib - v0.1.0-feat-authentification-saving.1
- frontend/public - v0.1.0-feat-authentification-saving.1
- frontend/src - v0.1.0-feat-authentification-saving.1
- frontend/tailwind.config.ts - v0.1.0-feat-authentification-saving.1
- frontend/tsconfig.json - v0.1.0-feat-authentification-saving.1
""",backend/app/app/schemas/auth_schema.py +8ec685b0296570a71367946ba7840ce579ad1cbf,06-04-2023 19:38:32,GitHub Enterprise,"Feat/authentification saving (#6) + +# Authentification with NextAuth and auth model in SQLModel +""## impact surface
- frontend/Dockerfile - v0.1.0-feat-authentification-saving.1
- frontend/custom_typings - v0.1.0-feat-authentification-saving.1
- frontend/next.config.mjs - v0.1.0-feat-authentification-saving.1
- frontend/package.json - v0.1.0-feat-authentification-saving.1
- frontend/pnpm-lock.yaml - v0.1.0-feat-authentification-saving.1
- frontend/postcss.config.cjs - v0.1.0-feat-authentification-saving.1
- frontend/prettier.config.cjs - v0.1.0-feat-authentification-saving.1
- frontend/prisma - v0.1.0-feat-authentification-saving.1
- frontend/prismalib - v0.1.0-feat-authentification-saving.1
- frontend/public - v0.1.0-feat-authentification-saving.1
- frontend/src - v0.1.0-feat-authentification-saving.1
- frontend/tailwind.config.ts - v0.1.0-feat-authentification-saving.1
- frontend/tsconfig.json - v0.1.0-feat-authentification-saving.1
""",backend/app/app/schemas/user_schema.py +8ec685b0296570a71367946ba7840ce579ad1cbf,06-04-2023 19:38:32,GitHub Enterprise,"Feat/authentification saving (#6) + +# Authentification with NextAuth and auth model in SQLModel +""## impact surface
- frontend/Dockerfile - v0.1.0-feat-authentification-saving.1
- frontend/custom_typings - v0.1.0-feat-authentification-saving.1
- frontend/next.config.mjs - v0.1.0-feat-authentification-saving.1
- frontend/package.json - v0.1.0-feat-authentification-saving.1
- frontend/pnpm-lock.yaml - v0.1.0-feat-authentification-saving.1
- frontend/postcss.config.cjs - v0.1.0-feat-authentification-saving.1
- frontend/prettier.config.cjs - v0.1.0-feat-authentification-saving.1
- frontend/prisma - v0.1.0-feat-authentification-saving.1
- frontend/prismalib - v0.1.0-feat-authentification-saving.1
- frontend/public - v0.1.0-feat-authentification-saving.1
- frontend/src - v0.1.0-feat-authentification-saving.1
- frontend/tailwind.config.ts - v0.1.0-feat-authentification-saving.1
- frontend/tsconfig.json - v0.1.0-feat-authentification-saving.1
""",backend/app/app/services/chat_agent/tools/tools.py +8ec685b0296570a71367946ba7840ce579ad1cbf,06-04-2023 19:38:32,GitHub Enterprise,"Feat/authentification saving (#6) + +# Authentification with NextAuth and auth model in SQLModel +""## impact surface
- frontend/Dockerfile - v0.1.0-feat-authentification-saving.1
- frontend/custom_typings - v0.1.0-feat-authentification-saving.1
- frontend/next.config.mjs - v0.1.0-feat-authentification-saving.1
- frontend/package.json - v0.1.0-feat-authentification-saving.1
- frontend/pnpm-lock.yaml - v0.1.0-feat-authentification-saving.1
- frontend/postcss.config.cjs - v0.1.0-feat-authentification-saving.1
- frontend/prettier.config.cjs - v0.1.0-feat-authentification-saving.1
- frontend/prisma - v0.1.0-feat-authentification-saving.1
- frontend/prismalib - v0.1.0-feat-authentification-saving.1
- frontend/public - v0.1.0-feat-authentification-saving.1
- frontend/src - v0.1.0-feat-authentification-saving.1
- frontend/tailwind.config.ts - v0.1.0-feat-authentification-saving.1
- frontend/tsconfig.json - v0.1.0-feat-authentification-saving.1
""",docker-compose-dev.yml +8ec685b0296570a71367946ba7840ce579ad1cbf,06-04-2023 19:38:32,GitHub Enterprise,"Feat/authentification saving (#6) + +# Authentification with NextAuth and auth model in SQLModel +""## impact surface
- frontend/Dockerfile - v0.1.0-feat-authentification-saving.1
- frontend/custom_typings - v0.1.0-feat-authentification-saving.1
- frontend/next.config.mjs - v0.1.0-feat-authentification-saving.1
- frontend/package.json - v0.1.0-feat-authentification-saving.1
- frontend/pnpm-lock.yaml - v0.1.0-feat-authentification-saving.1
- frontend/postcss.config.cjs - v0.1.0-feat-authentification-saving.1
- frontend/prettier.config.cjs - v0.1.0-feat-authentification-saving.1
- frontend/prisma - v0.1.0-feat-authentification-saving.1
- frontend/prismalib - v0.1.0-feat-authentification-saving.1
- frontend/public - v0.1.0-feat-authentification-saving.1
- frontend/src - v0.1.0-feat-authentification-saving.1
- frontend/tailwind.config.ts - v0.1.0-feat-authentification-saving.1
- frontend/tsconfig.json - v0.1.0-feat-authentification-saving.1
""",frontend/.env.example +8ec685b0296570a71367946ba7840ce579ad1cbf,06-04-2023 19:38:32,GitHub Enterprise,"Feat/authentification saving (#6) + +# Authentification with NextAuth and auth model in SQLModel +""## impact surface
- frontend/Dockerfile - v0.1.0-feat-authentification-saving.1
- frontend/custom_typings - v0.1.0-feat-authentification-saving.1
- frontend/next.config.mjs - v0.1.0-feat-authentification-saving.1
- frontend/package.json - v0.1.0-feat-authentification-saving.1
- frontend/pnpm-lock.yaml - v0.1.0-feat-authentification-saving.1
- frontend/postcss.config.cjs - v0.1.0-feat-authentification-saving.1
- frontend/prettier.config.cjs - v0.1.0-feat-authentification-saving.1
- frontend/prisma - v0.1.0-feat-authentification-saving.1
- frontend/prismalib - v0.1.0-feat-authentification-saving.1
- frontend/public - v0.1.0-feat-authentification-saving.1
- frontend/src - v0.1.0-feat-authentification-saving.1
- frontend/tailwind.config.ts - v0.1.0-feat-authentification-saving.1
- frontend/tsconfig.json - v0.1.0-feat-authentification-saving.1
""",frontend/package.json +8ec685b0296570a71367946ba7840ce579ad1cbf,06-04-2023 19:38:32,GitHub Enterprise,"Feat/authentification saving (#6) + +# Authentification with NextAuth and auth model in SQLModel +""## impact surface
- frontend/Dockerfile - v0.1.0-feat-authentification-saving.1
- frontend/custom_typings - v0.1.0-feat-authentification-saving.1
- frontend/next.config.mjs - v0.1.0-feat-authentification-saving.1
- frontend/package.json - v0.1.0-feat-authentification-saving.1
- frontend/pnpm-lock.yaml - v0.1.0-feat-authentification-saving.1
- frontend/postcss.config.cjs - v0.1.0-feat-authentification-saving.1
- frontend/prettier.config.cjs - v0.1.0-feat-authentification-saving.1
- frontend/prisma - v0.1.0-feat-authentification-saving.1
- frontend/prismalib - v0.1.0-feat-authentification-saving.1
- frontend/public - v0.1.0-feat-authentification-saving.1
- frontend/src - v0.1.0-feat-authentification-saving.1
- frontend/tailwind.config.ts - v0.1.0-feat-authentification-saving.1
- frontend/tsconfig.json - v0.1.0-feat-authentification-saving.1
""",frontend/pnpm-lock.yaml +8ec685b0296570a71367946ba7840ce579ad1cbf,06-04-2023 19:38:32,GitHub Enterprise,"Feat/authentification saving (#6) + +# Authentification with NextAuth and auth model in SQLModel +""## impact surface
- frontend/Dockerfile - v0.1.0-feat-authentification-saving.1
- frontend/custom_typings - v0.1.0-feat-authentification-saving.1
- frontend/next.config.mjs - v0.1.0-feat-authentification-saving.1
- frontend/package.json - v0.1.0-feat-authentification-saving.1
- frontend/pnpm-lock.yaml - v0.1.0-feat-authentification-saving.1
- frontend/postcss.config.cjs - v0.1.0-feat-authentification-saving.1
- frontend/prettier.config.cjs - v0.1.0-feat-authentification-saving.1
- frontend/prisma - v0.1.0-feat-authentification-saving.1
- frontend/prismalib - v0.1.0-feat-authentification-saving.1
- frontend/public - v0.1.0-feat-authentification-saving.1
- frontend/src - v0.1.0-feat-authentification-saving.1
- frontend/tailwind.config.ts - v0.1.0-feat-authentification-saving.1
- frontend/tsconfig.json - v0.1.0-feat-authentification-saving.1
""",frontend/prisma/migrations/migration_lock.toml +8ec685b0296570a71367946ba7840ce579ad1cbf,06-04-2023 19:38:32,GitHub Enterprise,"Feat/authentification saving (#6) + +# Authentification with NextAuth and auth model in SQLModel +""## impact surface
- frontend/Dockerfile - v0.1.0-feat-authentification-saving.1
- frontend/custom_typings - v0.1.0-feat-authentification-saving.1
- frontend/next.config.mjs - v0.1.0-feat-authentification-saving.1
- frontend/package.json - v0.1.0-feat-authentification-saving.1
- frontend/pnpm-lock.yaml - v0.1.0-feat-authentification-saving.1
- frontend/postcss.config.cjs - v0.1.0-feat-authentification-saving.1
- frontend/prettier.config.cjs - v0.1.0-feat-authentification-saving.1
- frontend/prisma - v0.1.0-feat-authentification-saving.1
- frontend/prismalib - v0.1.0-feat-authentification-saving.1
- frontend/public - v0.1.0-feat-authentification-saving.1
- frontend/src - v0.1.0-feat-authentification-saving.1
- frontend/tailwind.config.ts - v0.1.0-feat-authentification-saving.1
- frontend/tsconfig.json - v0.1.0-feat-authentification-saving.1
""",frontend/prisma/schema.prisma +8ec685b0296570a71367946ba7840ce579ad1cbf,06-04-2023 19:38:32,GitHub Enterprise,"Feat/authentification saving (#6) + +# Authentification with NextAuth and auth model in SQLModel +""## impact surface
- frontend/Dockerfile - v0.1.0-feat-authentification-saving.1
- frontend/custom_typings - v0.1.0-feat-authentification-saving.1
- frontend/next.config.mjs - v0.1.0-feat-authentification-saving.1
- frontend/package.json - v0.1.0-feat-authentification-saving.1
- frontend/pnpm-lock.yaml - v0.1.0-feat-authentification-saving.1
- frontend/postcss.config.cjs - v0.1.0-feat-authentification-saving.1
- frontend/prettier.config.cjs - v0.1.0-feat-authentification-saving.1
- frontend/prisma - v0.1.0-feat-authentification-saving.1
- frontend/prismalib - v0.1.0-feat-authentification-saving.1
- frontend/public - v0.1.0-feat-authentification-saving.1
- frontend/src - v0.1.0-feat-authentification-saving.1
- frontend/tailwind.config.ts - v0.1.0-feat-authentification-saving.1
- frontend/tsconfig.json - v0.1.0-feat-authentification-saving.1
""",frontend/prismalib/prismadb.ts +8ec685b0296570a71367946ba7840ce579ad1cbf,06-04-2023 19:38:32,GitHub Enterprise,"Feat/authentification saving (#6) + +# Authentification with NextAuth and auth model in SQLModel +""## impact surface
- frontend/Dockerfile - v0.1.0-feat-authentification-saving.1
- frontend/custom_typings - v0.1.0-feat-authentification-saving.1
- frontend/next.config.mjs - v0.1.0-feat-authentification-saving.1
- frontend/package.json - v0.1.0-feat-authentification-saving.1
- frontend/pnpm-lock.yaml - v0.1.0-feat-authentification-saving.1
- frontend/postcss.config.cjs - v0.1.0-feat-authentification-saving.1
- frontend/prettier.config.cjs - v0.1.0-feat-authentification-saving.1
- frontend/prisma - v0.1.0-feat-authentification-saving.1
- frontend/prismalib - v0.1.0-feat-authentification-saving.1
- frontend/public - v0.1.0-feat-authentification-saving.1
- frontend/src - v0.1.0-feat-authentification-saving.1
- frontend/tailwind.config.ts - v0.1.0-feat-authentification-saving.1
- frontend/tsconfig.json - v0.1.0-feat-authentification-saving.1
""",frontend/src/components/ConversationView/index.tsx +8ec685b0296570a71367946ba7840ce579ad1cbf,06-04-2023 19:38:32,GitHub Enterprise,"Feat/authentification saving (#6) + +# Authentification with NextAuth and auth model in SQLModel +""## impact surface
- frontend/Dockerfile - v0.1.0-feat-authentification-saving.1
- frontend/custom_typings - v0.1.0-feat-authentification-saving.1
- frontend/next.config.mjs - v0.1.0-feat-authentification-saving.1
- frontend/package.json - v0.1.0-feat-authentification-saving.1
- frontend/pnpm-lock.yaml - v0.1.0-feat-authentification-saving.1
- frontend/postcss.config.cjs - v0.1.0-feat-authentification-saving.1
- frontend/prettier.config.cjs - v0.1.0-feat-authentification-saving.1
- frontend/prisma - v0.1.0-feat-authentification-saving.1
- frontend/prismalib - v0.1.0-feat-authentification-saving.1
- frontend/public - v0.1.0-feat-authentification-saving.1
- frontend/src - v0.1.0-feat-authentification-saving.1
- frontend/tailwind.config.ts - v0.1.0-feat-authentification-saving.1
- frontend/tsconfig.json - v0.1.0-feat-authentification-saving.1
""",frontend/src/middleware.js +8ec685b0296570a71367946ba7840ce579ad1cbf,06-04-2023 19:38:32,GitHub Enterprise,"Feat/authentification saving (#6) + +# Authentification with NextAuth and auth model in SQLModel +""## impact surface
- frontend/Dockerfile - v0.1.0-feat-authentification-saving.1
- frontend/custom_typings - v0.1.0-feat-authentification-saving.1
- frontend/next.config.mjs - v0.1.0-feat-authentification-saving.1
- frontend/package.json - v0.1.0-feat-authentification-saving.1
- frontend/pnpm-lock.yaml - v0.1.0-feat-authentification-saving.1
- frontend/postcss.config.cjs - v0.1.0-feat-authentification-saving.1
- frontend/prettier.config.cjs - v0.1.0-feat-authentification-saving.1
- frontend/prisma - v0.1.0-feat-authentification-saving.1
- frontend/prismalib - v0.1.0-feat-authentification-saving.1
- frontend/public - v0.1.0-feat-authentification-saving.1
- frontend/src - v0.1.0-feat-authentification-saving.1
- frontend/tailwind.config.ts - v0.1.0-feat-authentification-saving.1
- frontend/tsconfig.json - v0.1.0-feat-authentification-saving.1
""",frontend/src/pages/_app.tsx +8ec685b0296570a71367946ba7840ce579ad1cbf,06-04-2023 19:38:32,GitHub Enterprise,"Feat/authentification saving (#6) + +# Authentification with NextAuth and auth model in SQLModel +""## impact surface
- frontend/Dockerfile - v0.1.0-feat-authentification-saving.1
- frontend/custom_typings - v0.1.0-feat-authentification-saving.1
- frontend/next.config.mjs - v0.1.0-feat-authentification-saving.1
- frontend/package.json - v0.1.0-feat-authentification-saving.1
- frontend/pnpm-lock.yaml - v0.1.0-feat-authentification-saving.1
- frontend/postcss.config.cjs - v0.1.0-feat-authentification-saving.1
- frontend/prettier.config.cjs - v0.1.0-feat-authentification-saving.1
- frontend/prisma - v0.1.0-feat-authentification-saving.1
- frontend/prismalib - v0.1.0-feat-authentification-saving.1
- frontend/public - v0.1.0-feat-authentification-saving.1
- frontend/src - v0.1.0-feat-authentification-saving.1
- frontend/tailwind.config.ts - v0.1.0-feat-authentification-saving.1
- frontend/tsconfig.json - v0.1.0-feat-authentification-saving.1
""",frontend/src/pages/index.tsx +8ec685b0296570a71367946ba7840ce579ad1cbf,06-04-2023 19:38:32,GitHub Enterprise,"Feat/authentification saving (#6) + +# Authentification with NextAuth and auth model in SQLModel +""## impact surface
- frontend/Dockerfile - v0.1.0-feat-authentification-saving.1
- frontend/custom_typings - v0.1.0-feat-authentification-saving.1
- frontend/next.config.mjs - v0.1.0-feat-authentification-saving.1
- frontend/package.json - v0.1.0-feat-authentification-saving.1
- frontend/pnpm-lock.yaml - v0.1.0-feat-authentification-saving.1
- frontend/postcss.config.cjs - v0.1.0-feat-authentification-saving.1
- frontend/prettier.config.cjs - v0.1.0-feat-authentification-saving.1
- frontend/prisma - v0.1.0-feat-authentification-saving.1
- frontend/prismalib - v0.1.0-feat-authentification-saving.1
- frontend/public - v0.1.0-feat-authentification-saving.1
- frontend/src - v0.1.0-feat-authentification-saving.1
- frontend/tailwind.config.ts - v0.1.0-feat-authentification-saving.1
- frontend/tsconfig.json - v0.1.0-feat-authentification-saving.1
""",frontend/src/server/auth.ts +bab86986e9bfe0f51742aafe2883bf525c207690,06-05-2023 07:16:21,Jakob Heyder,Fix: README dev section,README.md +b0e35390e69ba0009ed15afcfb7313a8a3ac3b79,06-08-2023 10:05:06,GitHub Enterprise,Custom Login page and API Key (+ validation of the key) + user profile pic (#11),backend/app/app/api/v1/endpoints/chat.py +b0e35390e69ba0009ed15afcfb7313a8a3ac3b79,06-08-2023 10:05:06,GitHub Enterprise,Custom Login page and API Key (+ validation of the key) + user profile pic (#11),backend/app/app/deps/agent_deps.py +b0e35390e69ba0009ed15afcfb7313a8a3ac3b79,06-08-2023 10:05:06,GitHub Enterprise,Custom Login page and API Key (+ validation of the key) + user profile pic (#11),backend/app/app/schemas/message_schema.py +b0e35390e69ba0009ed15afcfb7313a8a3ac3b79,06-08-2023 10:05:06,GitHub Enterprise,Custom Login page and API Key (+ validation of the key) + user profile pic (#11),backend/app/app/services/chat_agent/meta_agent.py +b0e35390e69ba0009ed15afcfb7313a8a3ac3b79,06-08-2023 10:05:06,GitHub Enterprise,Custom Login page and API Key (+ validation of the key) + user profile pic (#11),backend/app/app/services/chat_agent/router_agent/SimpleRouterAgent.py +b0e35390e69ba0009ed15afcfb7313a8a3ac3b79,06-08-2023 10:05:06,GitHub Enterprise,Custom Login page and API Key (+ validation of the key) + user profile pic (#11),frontend/next.config.mjs +b0e35390e69ba0009ed15afcfb7313a8a3ac3b79,06-08-2023 10:05:06,GitHub Enterprise,Custom Login page and API Key (+ validation of the key) + user profile pic (#11),frontend/package.json +b0e35390e69ba0009ed15afcfb7313a8a3ac3b79,06-08-2023 10:05:06,GitHub Enterprise,Custom Login page and API Key (+ validation of the key) + user profile pic (#11),frontend/pnpm-lock.yaml +b0e35390e69ba0009ed15afcfb7313a8a3ac3b79,06-08-2023 10:05:06,GitHub Enterprise,Custom Login page and API Key (+ validation of the key) + user profile pic (#11),frontend/public/icons/Github.png +b0e35390e69ba0009ed15afcfb7313a8a3ac3b79,06-08-2023 10:05:06,GitHub Enterprise,Custom Login page and API Key (+ validation of the key) + user profile pic (#11),frontend/public/icons/google.png +b0e35390e69ba0009ed15afcfb7313a8a3ac3b79,06-08-2023 10:05:06,GitHub Enterprise,Custom Login page and API Key (+ validation of the key) + user profile pic (#11),frontend/public/logo_bcg.png +b0e35390e69ba0009ed15afcfb7313a8a3ac3b79,06-08-2023 10:05:06,GitHub Enterprise,Custom Login page and API Key (+ validation of the key) + user profile pic (#11),frontend/src/components/ConversationView/EmptyView.tsx +b0e35390e69ba0009ed15afcfb7313a8a3ac3b79,06-08-2023 10:05:06,GitHub Enterprise,Custom Login page and API Key (+ validation of the key) + user profile pic (#11),frontend/src/components/ConversationView/MessageView/index.tsx +b0e35390e69ba0009ed15afcfb7313a8a3ac3b79,06-08-2023 10:05:06,GitHub Enterprise,Custom Login page and API Key (+ validation of the key) + user profile pic (#11),frontend/src/components/ConversationView/index.tsx +b0e35390e69ba0009ed15afcfb7313a8a3ac3b79,06-08-2023 10:05:06,GitHub Enterprise,Custom Login page and API Key (+ validation of the key) + user profile pic (#11),frontend/src/components/Sidebar/SettingsModal.tsx +b0e35390e69ba0009ed15afcfb7313a8a3ac3b79,06-08-2023 10:05:06,GitHub Enterprise,Custom Login page and API Key (+ validation of the key) + user profile pic (#11),frontend/src/components/Sidebar/index.tsx +b0e35390e69ba0009ed15afcfb7313a8a3ac3b79,06-08-2023 10:05:06,GitHub Enterprise,Custom Login page and API Key (+ validation of the key) + user profile pic (#11),frontend/src/pages/auth/signin.tsx +b0e35390e69ba0009ed15afcfb7313a8a3ac3b79,06-08-2023 10:05:06,GitHub Enterprise,Custom Login page and API Key (+ validation of the key) + user profile pic (#11),frontend/src/pages/index.tsx +b0e35390e69ba0009ed15afcfb7313a8a3ac3b79,06-08-2023 10:05:06,GitHub Enterprise,Custom Login page and API Key (+ validation of the key) + user profile pic (#11),frontend/src/server/auth.ts +d12e04c1281b2aa1802b4eb8c4ced756f9a3828e,06-08-2023 14:10:49,GitHub Enterprise,"[DRAFT] Chinook simple demo (#7) + +""## impact surface
- frontend/Dockerfile - v0.1.0-chinook-demo-vf.1
- frontend/custom_typings - v0.1.0-chinook-demo-vf.1
- frontend/next.config.mjs - v0.1.0-chinook-demo-vf.1
- frontend/package.json - v0.1.0-chinook-demo-vf.1
- frontend/pnpm-lock.yaml - v0.1.0-chinook-demo-vf.1
- frontend/postcss.config.cjs - v0.1.0-chinook-demo-vf.1
- frontend/prettier.config.cjs - v0.1.0-chinook-demo-vf.1
- frontend/prisma - v0.1.0-chinook-demo-vf.1
- frontend/prismalib - v0.1.0-chinook-demo-vf.1
- frontend/public - v0.1.0-chinook-demo-vf.1
- frontend/src - v0.1.0-chinook-demo-vf.1
- frontend/tailwind.config.ts - v0.1.0-chinook-demo-vf.1
- frontend/tsconfig.json - v0.1.0-chinook-demo-vf.1
"" + +Co-authored-by: AitBaali-Hamza ",.env.example +d12e04c1281b2aa1802b4eb8c4ced756f9a3828e,06-08-2023 14:10:49,GitHub Enterprise,"[DRAFT] Chinook simple demo (#7) + +""## impact surface
- frontend/Dockerfile - v0.1.0-chinook-demo-vf.1
- frontend/custom_typings - v0.1.0-chinook-demo-vf.1
- frontend/next.config.mjs - v0.1.0-chinook-demo-vf.1
- frontend/package.json - v0.1.0-chinook-demo-vf.1
- frontend/pnpm-lock.yaml - v0.1.0-chinook-demo-vf.1
- frontend/postcss.config.cjs - v0.1.0-chinook-demo-vf.1
- frontend/prettier.config.cjs - v0.1.0-chinook-demo-vf.1
- frontend/prisma - v0.1.0-chinook-demo-vf.1
- frontend/prismalib - v0.1.0-chinook-demo-vf.1
- frontend/public - v0.1.0-chinook-demo-vf.1
- frontend/src - v0.1.0-chinook-demo-vf.1
- frontend/tailwind.config.ts - v0.1.0-chinook-demo-vf.1
- frontend/tsconfig.json - v0.1.0-chinook-demo-vf.1
"" + +Co-authored-by: AitBaali-Hamza ",.gitignore +d12e04c1281b2aa1802b4eb8c4ced756f9a3828e,06-08-2023 14:10:49,GitHub Enterprise,"[DRAFT] Chinook simple demo (#7) + +""## impact surface
- frontend/Dockerfile - v0.1.0-chinook-demo-vf.1
- frontend/custom_typings - v0.1.0-chinook-demo-vf.1
- frontend/next.config.mjs - v0.1.0-chinook-demo-vf.1
- frontend/package.json - v0.1.0-chinook-demo-vf.1
- frontend/pnpm-lock.yaml - v0.1.0-chinook-demo-vf.1
- frontend/postcss.config.cjs - v0.1.0-chinook-demo-vf.1
- frontend/prettier.config.cjs - v0.1.0-chinook-demo-vf.1
- frontend/prisma - v0.1.0-chinook-demo-vf.1
- frontend/prismalib - v0.1.0-chinook-demo-vf.1
- frontend/public - v0.1.0-chinook-demo-vf.1
- frontend/src - v0.1.0-chinook-demo-vf.1
- frontend/tailwind.config.ts - v0.1.0-chinook-demo-vf.1
- frontend/tsconfig.json - v0.1.0-chinook-demo-vf.1
"" + +Co-authored-by: AitBaali-Hamza ",Chinook.db +d12e04c1281b2aa1802b4eb8c4ced756f9a3828e,06-08-2023 14:10:49,GitHub Enterprise,"[DRAFT] Chinook simple demo (#7) + +""## impact surface
- frontend/Dockerfile - v0.1.0-chinook-demo-vf.1
- frontend/custom_typings - v0.1.0-chinook-demo-vf.1
- frontend/next.config.mjs - v0.1.0-chinook-demo-vf.1
- frontend/package.json - v0.1.0-chinook-demo-vf.1
- frontend/pnpm-lock.yaml - v0.1.0-chinook-demo-vf.1
- frontend/postcss.config.cjs - v0.1.0-chinook-demo-vf.1
- frontend/prettier.config.cjs - v0.1.0-chinook-demo-vf.1
- frontend/prisma - v0.1.0-chinook-demo-vf.1
- frontend/prismalib - v0.1.0-chinook-demo-vf.1
- frontend/public - v0.1.0-chinook-demo-vf.1
- frontend/src - v0.1.0-chinook-demo-vf.1
- frontend/tailwind.config.ts - v0.1.0-chinook-demo-vf.1
- frontend/tsconfig.json - v0.1.0-chinook-demo-vf.1
"" + +Co-authored-by: AitBaali-Hamza ",README.md +d12e04c1281b2aa1802b4eb8c4ced756f9a3828e,06-08-2023 14:10:49,GitHub Enterprise,"[DRAFT] Chinook simple demo (#7) + +""## impact surface
- frontend/Dockerfile - v0.1.0-chinook-demo-vf.1
- frontend/custom_typings - v0.1.0-chinook-demo-vf.1
- frontend/next.config.mjs - v0.1.0-chinook-demo-vf.1
- frontend/package.json - v0.1.0-chinook-demo-vf.1
- frontend/pnpm-lock.yaml - v0.1.0-chinook-demo-vf.1
- frontend/postcss.config.cjs - v0.1.0-chinook-demo-vf.1
- frontend/prettier.config.cjs - v0.1.0-chinook-demo-vf.1
- frontend/prisma - v0.1.0-chinook-demo-vf.1
- frontend/prismalib - v0.1.0-chinook-demo-vf.1
- frontend/public - v0.1.0-chinook-demo-vf.1
- frontend/src - v0.1.0-chinook-demo-vf.1
- frontend/tailwind.config.ts - v0.1.0-chinook-demo-vf.1
- frontend/tsconfig.json - v0.1.0-chinook-demo-vf.1
"" + +Co-authored-by: AitBaali-Hamza ",backend/app/app/config/agent.yml +d12e04c1281b2aa1802b4eb8c4ced756f9a3828e,06-08-2023 14:10:49,GitHub Enterprise,"[DRAFT] Chinook simple demo (#7) + +""## impact surface
- frontend/Dockerfile - v0.1.0-chinook-demo-vf.1
- frontend/custom_typings - v0.1.0-chinook-demo-vf.1
- frontend/next.config.mjs - v0.1.0-chinook-demo-vf.1
- frontend/package.json - v0.1.0-chinook-demo-vf.1
- frontend/pnpm-lock.yaml - v0.1.0-chinook-demo-vf.1
- frontend/postcss.config.cjs - v0.1.0-chinook-demo-vf.1
- frontend/prettier.config.cjs - v0.1.0-chinook-demo-vf.1
- frontend/prisma - v0.1.0-chinook-demo-vf.1
- frontend/prismalib - v0.1.0-chinook-demo-vf.1
- frontend/public - v0.1.0-chinook-demo-vf.1
- frontend/src - v0.1.0-chinook-demo-vf.1
- frontend/tailwind.config.ts - v0.1.0-chinook-demo-vf.1
- frontend/tsconfig.json - v0.1.0-chinook-demo-vf.1
"" + +Co-authored-by: AitBaali-Hamza ",backend/app/app/config/tools.yml +d12e04c1281b2aa1802b4eb8c4ced756f9a3828e,06-08-2023 14:10:49,GitHub Enterprise,"[DRAFT] Chinook simple demo (#7) + +""## impact surface
- frontend/Dockerfile - v0.1.0-chinook-demo-vf.1
- frontend/custom_typings - v0.1.0-chinook-demo-vf.1
- frontend/next.config.mjs - v0.1.0-chinook-demo-vf.1
- frontend/package.json - v0.1.0-chinook-demo-vf.1
- frontend/pnpm-lock.yaml - v0.1.0-chinook-demo-vf.1
- frontend/postcss.config.cjs - v0.1.0-chinook-demo-vf.1
- frontend/prettier.config.cjs - v0.1.0-chinook-demo-vf.1
- frontend/prisma - v0.1.0-chinook-demo-vf.1
- frontend/prismalib - v0.1.0-chinook-demo-vf.1
- frontend/public - v0.1.0-chinook-demo-vf.1
- frontend/src - v0.1.0-chinook-demo-vf.1
- frontend/tailwind.config.ts - v0.1.0-chinook-demo-vf.1
- frontend/tsconfig.json - v0.1.0-chinook-demo-vf.1
"" + +Co-authored-by: AitBaali-Hamza ",backend/app/app/core/config.py +d12e04c1281b2aa1802b4eb8c4ced756f9a3828e,06-08-2023 14:10:49,GitHub Enterprise,"[DRAFT] Chinook simple demo (#7) + +""## impact surface
- frontend/Dockerfile - v0.1.0-chinook-demo-vf.1
- frontend/custom_typings - v0.1.0-chinook-demo-vf.1
- frontend/next.config.mjs - v0.1.0-chinook-demo-vf.1
- frontend/package.json - v0.1.0-chinook-demo-vf.1
- frontend/pnpm-lock.yaml - v0.1.0-chinook-demo-vf.1
- frontend/postcss.config.cjs - v0.1.0-chinook-demo-vf.1
- frontend/prettier.config.cjs - v0.1.0-chinook-demo-vf.1
- frontend/prisma - v0.1.0-chinook-demo-vf.1
- frontend/prismalib - v0.1.0-chinook-demo-vf.1
- frontend/public - v0.1.0-chinook-demo-vf.1
- frontend/src - v0.1.0-chinook-demo-vf.1
- frontend/tailwind.config.ts - v0.1.0-chinook-demo-vf.1
- frontend/tsconfig.json - v0.1.0-chinook-demo-vf.1
"" + +Co-authored-by: AitBaali-Hamza ",backend/app/app/db/protocol_pdf_ingestion.py +d12e04c1281b2aa1802b4eb8c4ced756f9a3828e,06-08-2023 14:10:49,GitHub Enterprise,"[DRAFT] Chinook simple demo (#7) + +""## impact surface
- frontend/Dockerfile - v0.1.0-chinook-demo-vf.1
- frontend/custom_typings - v0.1.0-chinook-demo-vf.1
- frontend/next.config.mjs - v0.1.0-chinook-demo-vf.1
- frontend/package.json - v0.1.0-chinook-demo-vf.1
- frontend/pnpm-lock.yaml - v0.1.0-chinook-demo-vf.1
- frontend/postcss.config.cjs - v0.1.0-chinook-demo-vf.1
- frontend/prettier.config.cjs - v0.1.0-chinook-demo-vf.1
- frontend/prisma - v0.1.0-chinook-demo-vf.1
- frontend/prismalib - v0.1.0-chinook-demo-vf.1
- frontend/public - v0.1.0-chinook-demo-vf.1
- frontend/src - v0.1.0-chinook-demo-vf.1
- frontend/tailwind.config.ts - v0.1.0-chinook-demo-vf.1
- frontend/tsconfig.json - v0.1.0-chinook-demo-vf.1
"" + +Co-authored-by: AitBaali-Hamza ",backend/app/app/db/session.py +d12e04c1281b2aa1802b4eb8c4ced756f9a3828e,06-08-2023 14:10:49,GitHub Enterprise,"[DRAFT] Chinook simple demo (#7) + +""## impact surface
- frontend/Dockerfile - v0.1.0-chinook-demo-vf.1
- frontend/custom_typings - v0.1.0-chinook-demo-vf.1
- frontend/next.config.mjs - v0.1.0-chinook-demo-vf.1
- frontend/package.json - v0.1.0-chinook-demo-vf.1
- frontend/pnpm-lock.yaml - v0.1.0-chinook-demo-vf.1
- frontend/postcss.config.cjs - v0.1.0-chinook-demo-vf.1
- frontend/prettier.config.cjs - v0.1.0-chinook-demo-vf.1
- frontend/prisma - v0.1.0-chinook-demo-vf.1
- frontend/prismalib - v0.1.0-chinook-demo-vf.1
- frontend/public - v0.1.0-chinook-demo-vf.1
- frontend/src - v0.1.0-chinook-demo-vf.1
- frontend/tailwind.config.ts - v0.1.0-chinook-demo-vf.1
- frontend/tsconfig.json - v0.1.0-chinook-demo-vf.1
"" + +Co-authored-by: AitBaali-Hamza ",backend/app/app/pdf_data/chinook/117764782-Aerosmith.pdf +d12e04c1281b2aa1802b4eb8c4ced756f9a3828e,06-08-2023 14:10:49,GitHub Enterprise,"[DRAFT] Chinook simple demo (#7) + +""## impact surface
- frontend/Dockerfile - v0.1.0-chinook-demo-vf.1
- frontend/custom_typings - v0.1.0-chinook-demo-vf.1
- frontend/next.config.mjs - v0.1.0-chinook-demo-vf.1
- frontend/package.json - v0.1.0-chinook-demo-vf.1
- frontend/pnpm-lock.yaml - v0.1.0-chinook-demo-vf.1
- frontend/postcss.config.cjs - v0.1.0-chinook-demo-vf.1
- frontend/prettier.config.cjs - v0.1.0-chinook-demo-vf.1
- frontend/prisma - v0.1.0-chinook-demo-vf.1
- frontend/prismalib - v0.1.0-chinook-demo-vf.1
- frontend/public - v0.1.0-chinook-demo-vf.1
- frontend/src - v0.1.0-chinook-demo-vf.1
- frontend/tailwind.config.ts - v0.1.0-chinook-demo-vf.1
- frontend/tsconfig.json - v0.1.0-chinook-demo-vf.1
"" + +Co-authored-by: AitBaali-Hamza ",backend/app/app/pdf_data/chinook/253814116-Led-Zeppelin.pdf +d12e04c1281b2aa1802b4eb8c4ced756f9a3828e,06-08-2023 14:10:49,GitHub Enterprise,"[DRAFT] Chinook simple demo (#7) + +""## impact surface
- frontend/Dockerfile - v0.1.0-chinook-demo-vf.1
- frontend/custom_typings - v0.1.0-chinook-demo-vf.1
- frontend/next.config.mjs - v0.1.0-chinook-demo-vf.1
- frontend/package.json - v0.1.0-chinook-demo-vf.1
- frontend/pnpm-lock.yaml - v0.1.0-chinook-demo-vf.1
- frontend/postcss.config.cjs - v0.1.0-chinook-demo-vf.1
- frontend/prettier.config.cjs - v0.1.0-chinook-demo-vf.1
- frontend/prisma - v0.1.0-chinook-demo-vf.1
- frontend/prismalib - v0.1.0-chinook-demo-vf.1
- frontend/public - v0.1.0-chinook-demo-vf.1
- frontend/src - v0.1.0-chinook-demo-vf.1
- frontend/tailwind.config.ts - v0.1.0-chinook-demo-vf.1
- frontend/tsconfig.json - v0.1.0-chinook-demo-vf.1
"" + +Co-authored-by: AitBaali-Hamza ",backend/app/app/pdf_data/chinook/423121661-Black-Sabbath-PDFDrive-com-pdf.pdf +d12e04c1281b2aa1802b4eb8c4ced756f9a3828e,06-08-2023 14:10:49,GitHub Enterprise,"[DRAFT] Chinook simple demo (#7) + +""## impact surface
- frontend/Dockerfile - v0.1.0-chinook-demo-vf.1
- frontend/custom_typings - v0.1.0-chinook-demo-vf.1
- frontend/next.config.mjs - v0.1.0-chinook-demo-vf.1
- frontend/package.json - v0.1.0-chinook-demo-vf.1
- frontend/pnpm-lock.yaml - v0.1.0-chinook-demo-vf.1
- frontend/postcss.config.cjs - v0.1.0-chinook-demo-vf.1
- frontend/prettier.config.cjs - v0.1.0-chinook-demo-vf.1
- frontend/prisma - v0.1.0-chinook-demo-vf.1
- frontend/prismalib - v0.1.0-chinook-demo-vf.1
- frontend/public - v0.1.0-chinook-demo-vf.1
- frontend/src - v0.1.0-chinook-demo-vf.1
- frontend/tailwind.config.ts - v0.1.0-chinook-demo-vf.1
- frontend/tsconfig.json - v0.1.0-chinook-demo-vf.1
"" + +Co-authored-by: AitBaali-Hamza ",backend/app/app/pdf_data/chinook/henderson-agm-nohm1.pdf +d12e04c1281b2aa1802b4eb8c4ced756f9a3828e,06-08-2023 14:10:49,GitHub Enterprise,"[DRAFT] Chinook simple demo (#7) + +""## impact surface
- frontend/Dockerfile - v0.1.0-chinook-demo-vf.1
- frontend/custom_typings - v0.1.0-chinook-demo-vf.1
- frontend/next.config.mjs - v0.1.0-chinook-demo-vf.1
- frontend/package.json - v0.1.0-chinook-demo-vf.1
- frontend/pnpm-lock.yaml - v0.1.0-chinook-demo-vf.1
- frontend/postcss.config.cjs - v0.1.0-chinook-demo-vf.1
- frontend/prettier.config.cjs - v0.1.0-chinook-demo-vf.1
- frontend/prisma - v0.1.0-chinook-demo-vf.1
- frontend/prismalib - v0.1.0-chinook-demo-vf.1
- frontend/public - v0.1.0-chinook-demo-vf.1
- frontend/src - v0.1.0-chinook-demo-vf.1
- frontend/tailwind.config.ts - v0.1.0-chinook-demo-vf.1
- frontend/tsconfig.json - v0.1.0-chinook-demo-vf.1
"" + +Co-authored-by: AitBaali-Hamza ",backend/app/app/pdf_data/chinook/history_of_acdc_band.pdf +d12e04c1281b2aa1802b4eb8c4ced756f9a3828e,06-08-2023 14:10:49,GitHub Enterprise,"[DRAFT] Chinook simple demo (#7) + +""## impact surface
- frontend/Dockerfile - v0.1.0-chinook-demo-vf.1
- frontend/custom_typings - v0.1.0-chinook-demo-vf.1
- frontend/next.config.mjs - v0.1.0-chinook-demo-vf.1
- frontend/package.json - v0.1.0-chinook-demo-vf.1
- frontend/pnpm-lock.yaml - v0.1.0-chinook-demo-vf.1
- frontend/postcss.config.cjs - v0.1.0-chinook-demo-vf.1
- frontend/prettier.config.cjs - v0.1.0-chinook-demo-vf.1
- frontend/prisma - v0.1.0-chinook-demo-vf.1
- frontend/prismalib - v0.1.0-chinook-demo-vf.1
- frontend/public - v0.1.0-chinook-demo-vf.1
- frontend/src - v0.1.0-chinook-demo-vf.1
- frontend/tailwind.config.ts - v0.1.0-chinook-demo-vf.1
- frontend/tsconfig.json - v0.1.0-chinook-demo-vf.1
"" + +Co-authored-by: AitBaali-Hamza ",backend/app/app/services/chat_agent/tools/library/entertainer_tool/entertainer_tool.py +d12e04c1281b2aa1802b4eb8c4ced756f9a3828e,06-08-2023 14:10:49,GitHub Enterprise,"[DRAFT] Chinook simple demo (#7) + +""## impact surface
- frontend/Dockerfile - v0.1.0-chinook-demo-vf.1
- frontend/custom_typings - v0.1.0-chinook-demo-vf.1
- frontend/next.config.mjs - v0.1.0-chinook-demo-vf.1
- frontend/package.json - v0.1.0-chinook-demo-vf.1
- frontend/pnpm-lock.yaml - v0.1.0-chinook-demo-vf.1
- frontend/postcss.config.cjs - v0.1.0-chinook-demo-vf.1
- frontend/prettier.config.cjs - v0.1.0-chinook-demo-vf.1
- frontend/prisma - v0.1.0-chinook-demo-vf.1
- frontend/prismalib - v0.1.0-chinook-demo-vf.1
- frontend/public - v0.1.0-chinook-demo-vf.1
- frontend/src - v0.1.0-chinook-demo-vf.1
- frontend/tailwind.config.ts - v0.1.0-chinook-demo-vf.1
- frontend/tsconfig.json - v0.1.0-chinook-demo-vf.1
"" + +Co-authored-by: AitBaali-Hamza ",backend/app/app/services/chat_agent/tools/library/expert_tool/expert_tool.py +d12e04c1281b2aa1802b4eb8c4ced756f9a3828e,06-08-2023 14:10:49,GitHub Enterprise,"[DRAFT] Chinook simple demo (#7) + +""## impact surface
- frontend/Dockerfile - v0.1.0-chinook-demo-vf.1
- frontend/custom_typings - v0.1.0-chinook-demo-vf.1
- frontend/next.config.mjs - v0.1.0-chinook-demo-vf.1
- frontend/package.json - v0.1.0-chinook-demo-vf.1
- frontend/pnpm-lock.yaml - v0.1.0-chinook-demo-vf.1
- frontend/postcss.config.cjs - v0.1.0-chinook-demo-vf.1
- frontend/prettier.config.cjs - v0.1.0-chinook-demo-vf.1
- frontend/prisma - v0.1.0-chinook-demo-vf.1
- frontend/prismalib - v0.1.0-chinook-demo-vf.1
- frontend/public - v0.1.0-chinook-demo-vf.1
- frontend/src - v0.1.0-chinook-demo-vf.1
- frontend/tailwind.config.ts - v0.1.0-chinook-demo-vf.1
- frontend/tsconfig.json - v0.1.0-chinook-demo-vf.1
"" + +Co-authored-by: AitBaali-Hamza ",backend/app/app/services/chat_agent/tools/library/pdf_tool/pdf_tool.py +d12e04c1281b2aa1802b4eb8c4ced756f9a3828e,06-08-2023 14:10:49,GitHub Enterprise,"[DRAFT] Chinook simple demo (#7) + +""## impact surface
- frontend/Dockerfile - v0.1.0-chinook-demo-vf.1
- frontend/custom_typings - v0.1.0-chinook-demo-vf.1
- frontend/next.config.mjs - v0.1.0-chinook-demo-vf.1
- frontend/package.json - v0.1.0-chinook-demo-vf.1
- frontend/pnpm-lock.yaml - v0.1.0-chinook-demo-vf.1
- frontend/postcss.config.cjs - v0.1.0-chinook-demo-vf.1
- frontend/prettier.config.cjs - v0.1.0-chinook-demo-vf.1
- frontend/prisma - v0.1.0-chinook-demo-vf.1
- frontend/prismalib - v0.1.0-chinook-demo-vf.1
- frontend/public - v0.1.0-chinook-demo-vf.1
- frontend/src - v0.1.0-chinook-demo-vf.1
- frontend/tailwind.config.ts - v0.1.0-chinook-demo-vf.1
- frontend/tsconfig.json - v0.1.0-chinook-demo-vf.1
"" + +Co-authored-by: AitBaali-Hamza ",backend/app/app/services/chat_agent/tools/tools.py +d12e04c1281b2aa1802b4eb8c4ced756f9a3828e,06-08-2023 14:10:49,GitHub Enterprise,"[DRAFT] Chinook simple demo (#7) + +""## impact surface
- frontend/Dockerfile - v0.1.0-chinook-demo-vf.1
- frontend/custom_typings - v0.1.0-chinook-demo-vf.1
- frontend/next.config.mjs - v0.1.0-chinook-demo-vf.1
- frontend/package.json - v0.1.0-chinook-demo-vf.1
- frontend/pnpm-lock.yaml - v0.1.0-chinook-demo-vf.1
- frontend/postcss.config.cjs - v0.1.0-chinook-demo-vf.1
- frontend/prettier.config.cjs - v0.1.0-chinook-demo-vf.1
- frontend/prisma - v0.1.0-chinook-demo-vf.1
- frontend/prismalib - v0.1.0-chinook-demo-vf.1
- frontend/public - v0.1.0-chinook-demo-vf.1
- frontend/src - v0.1.0-chinook-demo-vf.1
- frontend/tailwind.config.ts - v0.1.0-chinook-demo-vf.1
- frontend/tsconfig.json - v0.1.0-chinook-demo-vf.1
"" + +Co-authored-by: AitBaali-Hamza ",backend/app/app/test_data/protocol_pdf/NCT03414047.pdf +d12e04c1281b2aa1802b4eb8c4ced756f9a3828e,06-08-2023 14:10:49,GitHub Enterprise,"[DRAFT] Chinook simple demo (#7) + +""## impact surface
- frontend/Dockerfile - v0.1.0-chinook-demo-vf.1
- frontend/custom_typings - v0.1.0-chinook-demo-vf.1
- frontend/next.config.mjs - v0.1.0-chinook-demo-vf.1
- frontend/package.json - v0.1.0-chinook-demo-vf.1
- frontend/pnpm-lock.yaml - v0.1.0-chinook-demo-vf.1
- frontend/postcss.config.cjs - v0.1.0-chinook-demo-vf.1
- frontend/prettier.config.cjs - v0.1.0-chinook-demo-vf.1
- frontend/prisma - v0.1.0-chinook-demo-vf.1
- frontend/prismalib - v0.1.0-chinook-demo-vf.1
- frontend/public - v0.1.0-chinook-demo-vf.1
- frontend/src - v0.1.0-chinook-demo-vf.1
- frontend/tailwind.config.ts - v0.1.0-chinook-demo-vf.1
- frontend/tsconfig.json - v0.1.0-chinook-demo-vf.1
"" + +Co-authored-by: AitBaali-Hamza ",backend/app/app/test_data/protocol_pdf/NCT03463525.pdf +d12e04c1281b2aa1802b4eb8c4ced756f9a3828e,06-08-2023 14:10:49,GitHub Enterprise,"[DRAFT] Chinook simple demo (#7) + +""## impact surface
- frontend/Dockerfile - v0.1.0-chinook-demo-vf.1
- frontend/custom_typings - v0.1.0-chinook-demo-vf.1
- frontend/next.config.mjs - v0.1.0-chinook-demo-vf.1
- frontend/package.json - v0.1.0-chinook-demo-vf.1
- frontend/pnpm-lock.yaml - v0.1.0-chinook-demo-vf.1
- frontend/postcss.config.cjs - v0.1.0-chinook-demo-vf.1
- frontend/prettier.config.cjs - v0.1.0-chinook-demo-vf.1
- frontend/prisma - v0.1.0-chinook-demo-vf.1
- frontend/prismalib - v0.1.0-chinook-demo-vf.1
- frontend/public - v0.1.0-chinook-demo-vf.1
- frontend/src - v0.1.0-chinook-demo-vf.1
- frontend/tailwind.config.ts - v0.1.0-chinook-demo-vf.1
- frontend/tsconfig.json - v0.1.0-chinook-demo-vf.1
"" + +Co-authored-by: AitBaali-Hamza ",backend/app/app/test_data/protocol_pdf/NCT03469336.pdf +d12e04c1281b2aa1802b4eb8c4ced756f9a3828e,06-08-2023 14:10:49,GitHub Enterprise,"[DRAFT] Chinook simple demo (#7) + +""## impact surface
- frontend/Dockerfile - v0.1.0-chinook-demo-vf.1
- frontend/custom_typings - v0.1.0-chinook-demo-vf.1
- frontend/next.config.mjs - v0.1.0-chinook-demo-vf.1
- frontend/package.json - v0.1.0-chinook-demo-vf.1
- frontend/pnpm-lock.yaml - v0.1.0-chinook-demo-vf.1
- frontend/postcss.config.cjs - v0.1.0-chinook-demo-vf.1
- frontend/prettier.config.cjs - v0.1.0-chinook-demo-vf.1
- frontend/prisma - v0.1.0-chinook-demo-vf.1
- frontend/prismalib - v0.1.0-chinook-demo-vf.1
- frontend/public - v0.1.0-chinook-demo-vf.1
- frontend/src - v0.1.0-chinook-demo-vf.1
- frontend/tailwind.config.ts - v0.1.0-chinook-demo-vf.1
- frontend/tsconfig.json - v0.1.0-chinook-demo-vf.1
"" + +Co-authored-by: AitBaali-Hamza ",backend/app/app/test_data/protocol_pdf/NCT03525678.pdf +d12e04c1281b2aa1802b4eb8c4ced756f9a3828e,06-08-2023 14:10:49,GitHub Enterprise,"[DRAFT] Chinook simple demo (#7) + +""## impact surface
- frontend/Dockerfile - v0.1.0-chinook-demo-vf.1
- frontend/custom_typings - v0.1.0-chinook-demo-vf.1
- frontend/next.config.mjs - v0.1.0-chinook-demo-vf.1
- frontend/package.json - v0.1.0-chinook-demo-vf.1
- frontend/pnpm-lock.yaml - v0.1.0-chinook-demo-vf.1
- frontend/postcss.config.cjs - v0.1.0-chinook-demo-vf.1
- frontend/prettier.config.cjs - v0.1.0-chinook-demo-vf.1
- frontend/prisma - v0.1.0-chinook-demo-vf.1
- frontend/prismalib - v0.1.0-chinook-demo-vf.1
- frontend/public - v0.1.0-chinook-demo-vf.1
- frontend/src - v0.1.0-chinook-demo-vf.1
- frontend/tailwind.config.ts - v0.1.0-chinook-demo-vf.1
- frontend/tsconfig.json - v0.1.0-chinook-demo-vf.1
"" + +Co-authored-by: AitBaali-Hamza ",backend/app/app/test_data/protocol_pdf/NCT03535740.pdf +d12e04c1281b2aa1802b4eb8c4ced756f9a3828e,06-08-2023 14:10:49,GitHub Enterprise,"[DRAFT] Chinook simple demo (#7) + +""## impact surface
- frontend/Dockerfile - v0.1.0-chinook-demo-vf.1
- frontend/custom_typings - v0.1.0-chinook-demo-vf.1
- frontend/next.config.mjs - v0.1.0-chinook-demo-vf.1
- frontend/package.json - v0.1.0-chinook-demo-vf.1
- frontend/pnpm-lock.yaml - v0.1.0-chinook-demo-vf.1
- frontend/postcss.config.cjs - v0.1.0-chinook-demo-vf.1
- frontend/prettier.config.cjs - v0.1.0-chinook-demo-vf.1
- frontend/prisma - v0.1.0-chinook-demo-vf.1
- frontend/prismalib - v0.1.0-chinook-demo-vf.1
- frontend/public - v0.1.0-chinook-demo-vf.1
- frontend/src - v0.1.0-chinook-demo-vf.1
- frontend/tailwind.config.ts - v0.1.0-chinook-demo-vf.1
- frontend/tsconfig.json - v0.1.0-chinook-demo-vf.1
"" + +Co-authored-by: AitBaali-Hamza ",backend/app/app/test_data/protocol_pdf/NCT03662659.pdf +d12e04c1281b2aa1802b4eb8c4ced756f9a3828e,06-08-2023 14:10:49,GitHub Enterprise,"[DRAFT] Chinook simple demo (#7) + +""## impact surface
- frontend/Dockerfile - v0.1.0-chinook-demo-vf.1
- frontend/custom_typings - v0.1.0-chinook-demo-vf.1
- frontend/next.config.mjs - v0.1.0-chinook-demo-vf.1
- frontend/package.json - v0.1.0-chinook-demo-vf.1
- frontend/pnpm-lock.yaml - v0.1.0-chinook-demo-vf.1
- frontend/postcss.config.cjs - v0.1.0-chinook-demo-vf.1
- frontend/prettier.config.cjs - v0.1.0-chinook-demo-vf.1
- frontend/prisma - v0.1.0-chinook-demo-vf.1
- frontend/prismalib - v0.1.0-chinook-demo-vf.1
- frontend/public - v0.1.0-chinook-demo-vf.1
- frontend/src - v0.1.0-chinook-demo-vf.1
- frontend/tailwind.config.ts - v0.1.0-chinook-demo-vf.1
- frontend/tsconfig.json - v0.1.0-chinook-demo-vf.1
"" + +Co-authored-by: AitBaali-Hamza ",backend/app/app/test_data/protocol_pdf/NCT03922477.pdf +d12e04c1281b2aa1802b4eb8c4ced756f9a3828e,06-08-2023 14:10:49,GitHub Enterprise,"[DRAFT] Chinook simple demo (#7) + +""## impact surface
- frontend/Dockerfile - v0.1.0-chinook-demo-vf.1
- frontend/custom_typings - v0.1.0-chinook-demo-vf.1
- frontend/next.config.mjs - v0.1.0-chinook-demo-vf.1
- frontend/package.json - v0.1.0-chinook-demo-vf.1
- frontend/pnpm-lock.yaml - v0.1.0-chinook-demo-vf.1
- frontend/postcss.config.cjs - v0.1.0-chinook-demo-vf.1
- frontend/prettier.config.cjs - v0.1.0-chinook-demo-vf.1
- frontend/prisma - v0.1.0-chinook-demo-vf.1
- frontend/prismalib - v0.1.0-chinook-demo-vf.1
- frontend/public - v0.1.0-chinook-demo-vf.1
- frontend/src - v0.1.0-chinook-demo-vf.1
- frontend/tailwind.config.ts - v0.1.0-chinook-demo-vf.1
- frontend/tsconfig.json - v0.1.0-chinook-demo-vf.1
"" + +Co-authored-by: AitBaali-Hamza ",backend/app/app/test_data/protocol_pdf/NCT03989232.pdf +d12e04c1281b2aa1802b4eb8c4ced756f9a3828e,06-08-2023 14:10:49,GitHub Enterprise,"[DRAFT] Chinook simple demo (#7) + +""## impact surface
- frontend/Dockerfile - v0.1.0-chinook-demo-vf.1
- frontend/custom_typings - v0.1.0-chinook-demo-vf.1
- frontend/next.config.mjs - v0.1.0-chinook-demo-vf.1
- frontend/package.json - v0.1.0-chinook-demo-vf.1
- frontend/pnpm-lock.yaml - v0.1.0-chinook-demo-vf.1
- frontend/postcss.config.cjs - v0.1.0-chinook-demo-vf.1
- frontend/prettier.config.cjs - v0.1.0-chinook-demo-vf.1
- frontend/prisma - v0.1.0-chinook-demo-vf.1
- frontend/prismalib - v0.1.0-chinook-demo-vf.1
- frontend/public - v0.1.0-chinook-demo-vf.1
- frontend/src - v0.1.0-chinook-demo-vf.1
- frontend/tailwind.config.ts - v0.1.0-chinook-demo-vf.1
- frontend/tsconfig.json - v0.1.0-chinook-demo-vf.1
"" + +Co-authored-by: AitBaali-Hamza ",backend/app/app/test_data/protocol_pdf/NCT04059484.pdf +d12e04c1281b2aa1802b4eb8c4ced756f9a3828e,06-08-2023 14:10:49,GitHub Enterprise,"[DRAFT] Chinook simple demo (#7) + +""## impact surface
- frontend/Dockerfile - v0.1.0-chinook-demo-vf.1
- frontend/custom_typings - v0.1.0-chinook-demo-vf.1
- frontend/next.config.mjs - v0.1.0-chinook-demo-vf.1
- frontend/package.json - v0.1.0-chinook-demo-vf.1
- frontend/pnpm-lock.yaml - v0.1.0-chinook-demo-vf.1
- frontend/postcss.config.cjs - v0.1.0-chinook-demo-vf.1
- frontend/prettier.config.cjs - v0.1.0-chinook-demo-vf.1
- frontend/prisma - v0.1.0-chinook-demo-vf.1
- frontend/prismalib - v0.1.0-chinook-demo-vf.1
- frontend/public - v0.1.0-chinook-demo-vf.1
- frontend/src - v0.1.0-chinook-demo-vf.1
- frontend/tailwind.config.ts - v0.1.0-chinook-demo-vf.1
- frontend/tsconfig.json - v0.1.0-chinook-demo-vf.1
"" + +Co-authored-by: AitBaali-Hamza ",backend/app/app/test_data/protocol_pdf/NCT04490499.pdf +d12e04c1281b2aa1802b4eb8c4ced756f9a3828e,06-08-2023 14:10:49,GitHub Enterprise,"[DRAFT] Chinook simple demo (#7) + +""## impact surface
- frontend/Dockerfile - v0.1.0-chinook-demo-vf.1
- frontend/custom_typings - v0.1.0-chinook-demo-vf.1
- frontend/next.config.mjs - v0.1.0-chinook-demo-vf.1
- frontend/package.json - v0.1.0-chinook-demo-vf.1
- frontend/pnpm-lock.yaml - v0.1.0-chinook-demo-vf.1
- frontend/postcss.config.cjs - v0.1.0-chinook-demo-vf.1
- frontend/prettier.config.cjs - v0.1.0-chinook-demo-vf.1
- frontend/prisma - v0.1.0-chinook-demo-vf.1
- frontend/prismalib - v0.1.0-chinook-demo-vf.1
- frontend/public - v0.1.0-chinook-demo-vf.1
- frontend/src - v0.1.0-chinook-demo-vf.1
- frontend/tailwind.config.ts - v0.1.0-chinook-demo-vf.1
- frontend/tsconfig.json - v0.1.0-chinook-demo-vf.1
"" + +Co-authored-by: AitBaali-Hamza ",docker-compose-dev.yml +d12e04c1281b2aa1802b4eb8c4ced756f9a3828e,06-08-2023 14:10:49,GitHub Enterprise,"[DRAFT] Chinook simple demo (#7) + +""## impact surface
- frontend/Dockerfile - v0.1.0-chinook-demo-vf.1
- frontend/custom_typings - v0.1.0-chinook-demo-vf.1
- frontend/next.config.mjs - v0.1.0-chinook-demo-vf.1
- frontend/package.json - v0.1.0-chinook-demo-vf.1
- frontend/pnpm-lock.yaml - v0.1.0-chinook-demo-vf.1
- frontend/postcss.config.cjs - v0.1.0-chinook-demo-vf.1
- frontend/prettier.config.cjs - v0.1.0-chinook-demo-vf.1
- frontend/prisma - v0.1.0-chinook-demo-vf.1
- frontend/prismalib - v0.1.0-chinook-demo-vf.1
- frontend/public - v0.1.0-chinook-demo-vf.1
- frontend/src - v0.1.0-chinook-demo-vf.1
- frontend/tailwind.config.ts - v0.1.0-chinook-demo-vf.1
- frontend/tsconfig.json - v0.1.0-chinook-demo-vf.1
"" + +Co-authored-by: AitBaali-Hamza ",docker-compose.yml +d12e04c1281b2aa1802b4eb8c4ced756f9a3828e,06-08-2023 14:10:49,GitHub Enterprise,"[DRAFT] Chinook simple demo (#7) + +""## impact surface
- frontend/Dockerfile - v0.1.0-chinook-demo-vf.1
- frontend/custom_typings - v0.1.0-chinook-demo-vf.1
- frontend/next.config.mjs - v0.1.0-chinook-demo-vf.1
- frontend/package.json - v0.1.0-chinook-demo-vf.1
- frontend/pnpm-lock.yaml - v0.1.0-chinook-demo-vf.1
- frontend/postcss.config.cjs - v0.1.0-chinook-demo-vf.1
- frontend/prettier.config.cjs - v0.1.0-chinook-demo-vf.1
- frontend/prisma - v0.1.0-chinook-demo-vf.1
- frontend/prismalib - v0.1.0-chinook-demo-vf.1
- frontend/public - v0.1.0-chinook-demo-vf.1
- frontend/src - v0.1.0-chinook-demo-vf.1
- frontend/tailwind.config.ts - v0.1.0-chinook-demo-vf.1
- frontend/tsconfig.json - v0.1.0-chinook-demo-vf.1
"" + +Co-authored-by: AitBaali-Hamza ",frontend/.env.example +d12e04c1281b2aa1802b4eb8c4ced756f9a3828e,06-08-2023 14:10:49,GitHub Enterprise,"[DRAFT] Chinook simple demo (#7) + +""## impact surface
- frontend/Dockerfile - v0.1.0-chinook-demo-vf.1
- frontend/custom_typings - v0.1.0-chinook-demo-vf.1
- frontend/next.config.mjs - v0.1.0-chinook-demo-vf.1
- frontend/package.json - v0.1.0-chinook-demo-vf.1
- frontend/pnpm-lock.yaml - v0.1.0-chinook-demo-vf.1
- frontend/postcss.config.cjs - v0.1.0-chinook-demo-vf.1
- frontend/prettier.config.cjs - v0.1.0-chinook-demo-vf.1
- frontend/prisma - v0.1.0-chinook-demo-vf.1
- frontend/prismalib - v0.1.0-chinook-demo-vf.1
- frontend/public - v0.1.0-chinook-demo-vf.1
- frontend/src - v0.1.0-chinook-demo-vf.1
- frontend/tailwind.config.ts - v0.1.0-chinook-demo-vf.1
- frontend/tsconfig.json - v0.1.0-chinook-demo-vf.1
"" + +Co-authored-by: AitBaali-Hamza ",frontend/src/components/ConversationView/EmptyView.tsx +d12e04c1281b2aa1802b4eb8c4ced756f9a3828e,06-08-2023 14:10:49,GitHub Enterprise,"[DRAFT] Chinook simple demo (#7) + +""## impact surface
- frontend/Dockerfile - v0.1.0-chinook-demo-vf.1
- frontend/custom_typings - v0.1.0-chinook-demo-vf.1
- frontend/next.config.mjs - v0.1.0-chinook-demo-vf.1
- frontend/package.json - v0.1.0-chinook-demo-vf.1
- frontend/pnpm-lock.yaml - v0.1.0-chinook-demo-vf.1
- frontend/postcss.config.cjs - v0.1.0-chinook-demo-vf.1
- frontend/prettier.config.cjs - v0.1.0-chinook-demo-vf.1
- frontend/prisma - v0.1.0-chinook-demo-vf.1
- frontend/prismalib - v0.1.0-chinook-demo-vf.1
- frontend/public - v0.1.0-chinook-demo-vf.1
- frontend/src - v0.1.0-chinook-demo-vf.1
- frontend/tailwind.config.ts - v0.1.0-chinook-demo-vf.1
- frontend/tsconfig.json - v0.1.0-chinook-demo-vf.1
"" + +Co-authored-by: AitBaali-Hamza ",frontend/src/components/ConversationView/MessageView/MessageEvents/MessageEvents.tsx +d12e04c1281b2aa1802b4eb8c4ced756f9a3828e,06-08-2023 14:10:49,GitHub Enterprise,"[DRAFT] Chinook simple demo (#7) + +""## impact surface
- frontend/Dockerfile - v0.1.0-chinook-demo-vf.1
- frontend/custom_typings - v0.1.0-chinook-demo-vf.1
- frontend/next.config.mjs - v0.1.0-chinook-demo-vf.1
- frontend/package.json - v0.1.0-chinook-demo-vf.1
- frontend/pnpm-lock.yaml - v0.1.0-chinook-demo-vf.1
- frontend/postcss.config.cjs - v0.1.0-chinook-demo-vf.1
- frontend/prettier.config.cjs - v0.1.0-chinook-demo-vf.1
- frontend/prisma - v0.1.0-chinook-demo-vf.1
- frontend/prismalib - v0.1.0-chinook-demo-vf.1
- frontend/public - v0.1.0-chinook-demo-vf.1
- frontend/src - v0.1.0-chinook-demo-vf.1
- frontend/tailwind.config.ts - v0.1.0-chinook-demo-vf.1
- frontend/tsconfig.json - v0.1.0-chinook-demo-vf.1
"" + +Co-authored-by: AitBaali-Hamza ",frontend/src/components/CustomIcons/GammaSpinner.tsx +d12e04c1281b2aa1802b4eb8c4ced756f9a3828e,06-08-2023 14:10:49,GitHub Enterprise,"[DRAFT] Chinook simple demo (#7) + +""## impact surface
- frontend/Dockerfile - v0.1.0-chinook-demo-vf.1
- frontend/custom_typings - v0.1.0-chinook-demo-vf.1
- frontend/next.config.mjs - v0.1.0-chinook-demo-vf.1
- frontend/package.json - v0.1.0-chinook-demo-vf.1
- frontend/pnpm-lock.yaml - v0.1.0-chinook-demo-vf.1
- frontend/postcss.config.cjs - v0.1.0-chinook-demo-vf.1
- frontend/prettier.config.cjs - v0.1.0-chinook-demo-vf.1
- frontend/prisma - v0.1.0-chinook-demo-vf.1
- frontend/prismalib - v0.1.0-chinook-demo-vf.1
- frontend/public - v0.1.0-chinook-demo-vf.1
- frontend/src - v0.1.0-chinook-demo-vf.1
- frontend/tailwind.config.ts - v0.1.0-chinook-demo-vf.1
- frontend/tsconfig.json - v0.1.0-chinook-demo-vf.1
"" + +Co-authored-by: AitBaali-Hamza ",frontend/src/components/CustomIcons/MainLogo.tsx +d12e04c1281b2aa1802b4eb8c4ced756f9a3828e,06-08-2023 14:10:49,GitHub Enterprise,"[DRAFT] Chinook simple demo (#7) + +""## impact surface
- frontend/Dockerfile - v0.1.0-chinook-demo-vf.1
- frontend/custom_typings - v0.1.0-chinook-demo-vf.1
- frontend/next.config.mjs - v0.1.0-chinook-demo-vf.1
- frontend/package.json - v0.1.0-chinook-demo-vf.1
- frontend/pnpm-lock.yaml - v0.1.0-chinook-demo-vf.1
- frontend/postcss.config.cjs - v0.1.0-chinook-demo-vf.1
- frontend/prettier.config.cjs - v0.1.0-chinook-demo-vf.1
- frontend/prisma - v0.1.0-chinook-demo-vf.1
- frontend/prismalib - v0.1.0-chinook-demo-vf.1
- frontend/public - v0.1.0-chinook-demo-vf.1
- frontend/src - v0.1.0-chinook-demo-vf.1
- frontend/tailwind.config.ts - v0.1.0-chinook-demo-vf.1
- frontend/tsconfig.json - v0.1.0-chinook-demo-vf.1
"" + +Co-authored-by: AitBaali-Hamza ",frontend/src/components/ToolActionRenderer/applications/clinicalTrials/index.tsx +d12e04c1281b2aa1802b4eb8c4ced756f9a3828e,06-08-2023 14:10:49,GitHub Enterprise,"[DRAFT] Chinook simple demo (#7) + +""## impact surface
- frontend/Dockerfile - v0.1.0-chinook-demo-vf.1
- frontend/custom_typings - v0.1.0-chinook-demo-vf.1
- frontend/next.config.mjs - v0.1.0-chinook-demo-vf.1
- frontend/package.json - v0.1.0-chinook-demo-vf.1
- frontend/pnpm-lock.yaml - v0.1.0-chinook-demo-vf.1
- frontend/postcss.config.cjs - v0.1.0-chinook-demo-vf.1
- frontend/prettier.config.cjs - v0.1.0-chinook-demo-vf.1
- frontend/prisma - v0.1.0-chinook-demo-vf.1
- frontend/prismalib - v0.1.0-chinook-demo-vf.1
- frontend/public - v0.1.0-chinook-demo-vf.1
- frontend/src - v0.1.0-chinook-demo-vf.1
- frontend/tailwind.config.ts - v0.1.0-chinook-demo-vf.1
- frontend/tsconfig.json - v0.1.0-chinook-demo-vf.1
"" + +Co-authored-by: AitBaali-Hamza ",scripts/chinook_psql_load.sql +5d6efb3ab59fdbc3e3c73027662332fb48323276,06-08-2023 16:39:28,Jakob Heyder,"Fix: Cleanup of clinical_trials related demo, full chinook db base-demo",.env.example +5d6efb3ab59fdbc3e3c73027662332fb48323276,06-08-2023 16:39:28,Jakob Heyder,"Fix: Cleanup of clinical_trials related demo, full chinook db base-demo",.gitignore +5d6efb3ab59fdbc3e3c73027662332fb48323276,06-08-2023 16:39:28,Jakob Heyder,"Fix: Cleanup of clinical_trials related demo, full chinook db base-demo",backend/app/app/.DS_Store +5d6efb3ab59fdbc3e3c73027662332fb48323276,06-08-2023 16:39:28,Jakob Heyder,"Fix: Cleanup of clinical_trials related demo, full chinook db base-demo",backend/app/app/config/applications/clinical_trials/agent.yml +5d6efb3ab59fdbc3e3c73027662332fb48323276,06-08-2023 16:39:28,Jakob Heyder,"Fix: Cleanup of clinical_trials related demo, full chinook db base-demo",backend/app/app/config/applications/clinical_trials/tools.yml +5d6efb3ab59fdbc3e3c73027662332fb48323276,06-08-2023 16:39:28,Jakob Heyder,"Fix: Cleanup of clinical_trials related demo, full chinook db base-demo",backend/app/app/core/config.py +5d6efb3ab59fdbc3e3c73027662332fb48323276,06-08-2023 16:39:28,Jakob Heyder,"Fix: Cleanup of clinical_trials related demo, full chinook db base-demo",backend/app/app/db/protocol_pdf_ingestion.py +5d6efb3ab59fdbc3e3c73027662332fb48323276,06-08-2023 16:39:28,Jakob Heyder,"Fix: Cleanup of clinical_trials related demo, full chinook db base-demo",backend/app/app/db/session.py +5d6efb3ab59fdbc3e3c73027662332fb48323276,06-08-2023 16:39:28,Jakob Heyder,"Fix: Cleanup of clinical_trials related demo, full chinook db base-demo",backend/app/app/main.py +5d6efb3ab59fdbc3e3c73027662332fb48323276,06-08-2023 16:39:28,Jakob Heyder,"Fix: Cleanup of clinical_trials related demo, full chinook db base-demo",backend/app/app/pdf_data/chinook/117764782-Aerosmith.pdf +5d6efb3ab59fdbc3e3c73027662332fb48323276,06-08-2023 16:39:28,Jakob Heyder,"Fix: Cleanup of clinical_trials related demo, full chinook db base-demo",backend/app/app/pdf_data/chinook/253814116-Led-Zeppelin.pdf +5d6efb3ab59fdbc3e3c73027662332fb48323276,06-08-2023 16:39:28,Jakob Heyder,"Fix: Cleanup of clinical_trials related demo, full chinook db base-demo",backend/app/app/pdf_data/chinook/423121661-Black-Sabbath-PDFDrive-com-pdf.pdf +5d6efb3ab59fdbc3e3c73027662332fb48323276,06-08-2023 16:39:28,Jakob Heyder,"Fix: Cleanup of clinical_trials related demo, full chinook db base-demo",backend/app/app/pdf_data/chinook/henderson-agm-nohm1.pdf +5d6efb3ab59fdbc3e3c73027662332fb48323276,06-08-2023 16:39:28,Jakob Heyder,"Fix: Cleanup of clinical_trials related demo, full chinook db base-demo",backend/app/app/pdf_data/chinook/history_of_acdc_band.pdf +5d6efb3ab59fdbc3e3c73027662332fb48323276,06-08-2023 16:39:28,Jakob Heyder,"Fix: Cleanup of clinical_trials related demo, full chinook db base-demo",backend/app/app/pdf_data/protocol_pdf/NCT03414047.pdf +5d6efb3ab59fdbc3e3c73027662332fb48323276,06-08-2023 16:39:28,Jakob Heyder,"Fix: Cleanup of clinical_trials related demo, full chinook db base-demo",backend/app/app/pdf_data/protocol_pdf/NCT03463525.pdf +5d6efb3ab59fdbc3e3c73027662332fb48323276,06-08-2023 16:39:28,Jakob Heyder,"Fix: Cleanup of clinical_trials related demo, full chinook db base-demo",backend/app/app/pdf_data/protocol_pdf/NCT03469336.pdf +5d6efb3ab59fdbc3e3c73027662332fb48323276,06-08-2023 16:39:28,Jakob Heyder,"Fix: Cleanup of clinical_trials related demo, full chinook db base-demo",backend/app/app/pdf_data/protocol_pdf/NCT03525678.pdf +5d6efb3ab59fdbc3e3c73027662332fb48323276,06-08-2023 16:39:28,Jakob Heyder,"Fix: Cleanup of clinical_trials related demo, full chinook db base-demo",backend/app/app/pdf_data/protocol_pdf/NCT03535740.pdf +5d6efb3ab59fdbc3e3c73027662332fb48323276,06-08-2023 16:39:28,Jakob Heyder,"Fix: Cleanup of clinical_trials related demo, full chinook db base-demo",backend/app/app/pdf_data/protocol_pdf/NCT03662659.pdf +5d6efb3ab59fdbc3e3c73027662332fb48323276,06-08-2023 16:39:28,Jakob Heyder,"Fix: Cleanup of clinical_trials related demo, full chinook db base-demo",backend/app/app/pdf_data/protocol_pdf/NCT03922477.pdf +5d6efb3ab59fdbc3e3c73027662332fb48323276,06-08-2023 16:39:28,Jakob Heyder,"Fix: Cleanup of clinical_trials related demo, full chinook db base-demo",backend/app/app/pdf_data/protocol_pdf/NCT03989232.pdf +5d6efb3ab59fdbc3e3c73027662332fb48323276,06-08-2023 16:39:28,Jakob Heyder,"Fix: Cleanup of clinical_trials related demo, full chinook db base-demo",backend/app/app/pdf_data/protocol_pdf/NCT04059484.pdf +5d6efb3ab59fdbc3e3c73027662332fb48323276,06-08-2023 16:39:28,Jakob Heyder,"Fix: Cleanup of clinical_trials related demo, full chinook db base-demo",backend/app/app/pdf_data/protocol_pdf/NCT04490499.pdf +5d6efb3ab59fdbc3e3c73027662332fb48323276,06-08-2023 16:39:28,Jakob Heyder,"Fix: Cleanup of clinical_trials related demo, full chinook db base-demo",backend/app/app/schemas/tool_schema.py +5d6efb3ab59fdbc3e3c73027662332fb48323276,06-08-2023 16:39:28,Jakob Heyder,"Fix: Cleanup of clinical_trials related demo, full chinook db base-demo",backend/app/app/schemas/tool_schemas/pdf_tool_schema.py +5d6efb3ab59fdbc3e3c73027662332fb48323276,06-08-2023 16:39:28,Jakob Heyder,"Fix: Cleanup of clinical_trials related demo, full chinook db base-demo",backend/app/app/services/chat_agent/helpers/constants.py +5d6efb3ab59fdbc3e3c73027662332fb48323276,06-08-2023 16:39:28,Jakob Heyder,"Fix: Cleanup of clinical_trials related demo, full chinook db base-demo",backend/app/app/services/chat_agent/tools/applications/clinical_trials/clinical_trials_gov_api_tool/clinical_trials_gov_api_tool.py +5d6efb3ab59fdbc3e3c73027662332fb48323276,06-08-2023 16:39:28,Jakob Heyder,"Fix: Cleanup of clinical_trials related demo, full chinook db base-demo",backend/app/app/services/chat_agent/tools/applications/clinical_trials/pdf_tool/__init__.py +5d6efb3ab59fdbc3e3c73027662332fb48323276,06-08-2023 16:39:28,Jakob Heyder,"Fix: Cleanup of clinical_trials related demo, full chinook db base-demo",backend/app/app/services/chat_agent/tools/applications/clinical_trials/pdf_tool/pdf_tool.py +5d6efb3ab59fdbc3e3c73027662332fb48323276,06-08-2023 16:39:28,Jakob Heyder,"Fix: Cleanup of clinical_trials related demo, full chinook db base-demo",backend/app/app/services/chat_agent/tools/library/pdf_tool/pdf_tool.py +5d6efb3ab59fdbc3e3c73027662332fb48323276,06-08-2023 16:39:28,Jakob Heyder,"Fix: Cleanup of clinical_trials related demo, full chinook db base-demo",backend/app/app/services/chat_agent/tools/library/sql_tool/sql_tool.py +5d6efb3ab59fdbc3e3c73027662332fb48323276,06-08-2023 16:39:28,Jakob Heyder,"Fix: Cleanup of clinical_trials related demo, full chinook db base-demo",backend/app/app/utils/config_loader.py +5d6efb3ab59fdbc3e3c73027662332fb48323276,06-08-2023 16:39:28,Jakob Heyder,"Fix: Cleanup of clinical_trials related demo, full chinook db base-demo",backend/app/poetry.lock +5d6efb3ab59fdbc3e3c73027662332fb48323276,06-08-2023 16:39:28,Jakob Heyder,"Fix: Cleanup of clinical_trials related demo, full chinook db base-demo",backend/app/pyproject.toml +5d6efb3ab59fdbc3e3c73027662332fb48323276,06-08-2023 16:39:28,Jakob Heyder,"Fix: Cleanup of clinical_trials related demo, full chinook db base-demo",docker-compose-dev.yml +5d6efb3ab59fdbc3e3c73027662332fb48323276,06-08-2023 16:39:28,Jakob Heyder,"Fix: Cleanup of clinical_trials related demo, full chinook db base-demo",frontend/.env.example +5d6efb3ab59fdbc3e3c73027662332fb48323276,06-08-2023 16:39:28,Jakob Heyder,"Fix: Cleanup of clinical_trials related demo, full chinook db base-demo",frontend/src/components/CodeView/SideDrawer/index.tsx +5d6efb3ab59fdbc3e3c73027662332fb48323276,06-08-2023 16:39:28,Jakob Heyder,"Fix: Cleanup of clinical_trials related demo, full chinook db base-demo",frontend/src/components/ConversationView/EmptyView.tsx +5d6efb3ab59fdbc3e3c73027662332fb48323276,06-08-2023 16:39:28,Jakob Heyder,"Fix: Cleanup of clinical_trials related demo, full chinook db base-demo",frontend/src/components/ConversationView/MessageView/MessageEvents/MessageEvent/LLMResponse.tsx +5d6efb3ab59fdbc3e3c73027662332fb48323276,06-08-2023 16:39:28,Jakob Heyder,"Fix: Cleanup of clinical_trials related demo, full chinook db base-demo",frontend/src/components/ToolActionRenderer/applications/clinicalTrials/index.tsx +5d6efb3ab59fdbc3e3c73027662332fb48323276,06-08-2023 16:39:28,Jakob Heyder,"Fix: Cleanup of clinical_trials related demo, full chinook db base-demo",frontend/src/components/ToolActionRenderer/index.tsx +5d6efb3ab59fdbc3e3c73027662332fb48323276,06-08-2023 16:39:28,Jakob Heyder,"Fix: Cleanup of clinical_trials related demo, full chinook db base-demo",frontend/src/components/ToolActionRenderer/library/actions.tsx +5d6efb3ab59fdbc3e3c73027662332fb48323276,06-08-2023 16:39:28,Jakob Heyder,"Fix: Cleanup of clinical_trials related demo, full chinook db base-demo",frontend/src/components/ToolAppendixRenderer/library/CodeFlipCard/index.tsx +5d6efb3ab59fdbc3e3c73027662332fb48323276,06-08-2023 16:39:28,Jakob Heyder,"Fix: Cleanup of clinical_trials related demo, full chinook db base-demo",frontend/src/pages/index.tsx +1ae8b172b61cb8a97ee4017c7935357e7af8882c,06-19-2023 16:22:54,GitHub Enterprise,"Chinook fine tuning (#14) + +""## impact surface
- frontend/Dockerfile - v0.1.0-chinook-finetuning.1
- frontend/custom_typings - v0.1.0-chinook-finetuning.1
- frontend/next.config.mjs - v0.1.0-chinook-finetuning.1
- frontend/package.json - v0.1.0-chinook-finetuning.1
- frontend/pnpm-lock.yaml - v0.1.0-chinook-finetuning.1
- frontend/postcss.config.cjs - v0.1.0-chinook-finetuning.1
- frontend/prettier.config.cjs - v0.1.0-chinook-finetuning.1
- frontend/prisma - v0.1.0-chinook-finetuning.1
- frontend/prismalib - v0.1.0-chinook-finetuning.1
- frontend/public - v0.1.0-chinook-finetuning.1
- frontend/src - v0.1.0-chinook-finetuning.1
- frontend/tailwind.config.ts - v0.1.0-chinook-finetuning.1
- frontend/tsconfig.json - v0.1.0-chinook-finetuning.1
"" + +- Added PDF database as a downloadable link in Readme so users can test it",README.md +1ae8b172b61cb8a97ee4017c7935357e7af8882c,06-19-2023 16:22:54,GitHub Enterprise,"Chinook fine tuning (#14) + +""## impact surface
- frontend/Dockerfile - v0.1.0-chinook-finetuning.1
- frontend/custom_typings - v0.1.0-chinook-finetuning.1
- frontend/next.config.mjs - v0.1.0-chinook-finetuning.1
- frontend/package.json - v0.1.0-chinook-finetuning.1
- frontend/pnpm-lock.yaml - v0.1.0-chinook-finetuning.1
- frontend/postcss.config.cjs - v0.1.0-chinook-finetuning.1
- frontend/prettier.config.cjs - v0.1.0-chinook-finetuning.1
- frontend/prisma - v0.1.0-chinook-finetuning.1
- frontend/prismalib - v0.1.0-chinook-finetuning.1
- frontend/public - v0.1.0-chinook-finetuning.1
- frontend/src - v0.1.0-chinook-finetuning.1
- frontend/tailwind.config.ts - v0.1.0-chinook-finetuning.1
- frontend/tsconfig.json - v0.1.0-chinook-finetuning.1
"" + +- Added PDF database as a downloadable link in Readme so users can test it",backend/app/app/config/agent.yml +1ae8b172b61cb8a97ee4017c7935357e7af8882c,06-19-2023 16:22:54,GitHub Enterprise,"Chinook fine tuning (#14) + +""## impact surface
- frontend/Dockerfile - v0.1.0-chinook-finetuning.1
- frontend/custom_typings - v0.1.0-chinook-finetuning.1
- frontend/next.config.mjs - v0.1.0-chinook-finetuning.1
- frontend/package.json - v0.1.0-chinook-finetuning.1
- frontend/pnpm-lock.yaml - v0.1.0-chinook-finetuning.1
- frontend/postcss.config.cjs - v0.1.0-chinook-finetuning.1
- frontend/prettier.config.cjs - v0.1.0-chinook-finetuning.1
- frontend/prisma - v0.1.0-chinook-finetuning.1
- frontend/prismalib - v0.1.0-chinook-finetuning.1
- frontend/public - v0.1.0-chinook-finetuning.1
- frontend/src - v0.1.0-chinook-finetuning.1
- frontend/tailwind.config.ts - v0.1.0-chinook-finetuning.1
- frontend/tsconfig.json - v0.1.0-chinook-finetuning.1
"" + +- Added PDF database as a downloadable link in Readme so users can test it",backend/app/app/config/tools.yml +1ae8b172b61cb8a97ee4017c7935357e7af8882c,06-19-2023 16:22:54,GitHub Enterprise,"Chinook fine tuning (#14) + +""## impact surface
- frontend/Dockerfile - v0.1.0-chinook-finetuning.1
- frontend/custom_typings - v0.1.0-chinook-finetuning.1
- frontend/next.config.mjs - v0.1.0-chinook-finetuning.1
- frontend/package.json - v0.1.0-chinook-finetuning.1
- frontend/pnpm-lock.yaml - v0.1.0-chinook-finetuning.1
- frontend/postcss.config.cjs - v0.1.0-chinook-finetuning.1
- frontend/prettier.config.cjs - v0.1.0-chinook-finetuning.1
- frontend/prisma - v0.1.0-chinook-finetuning.1
- frontend/prismalib - v0.1.0-chinook-finetuning.1
- frontend/public - v0.1.0-chinook-finetuning.1
- frontend/src - v0.1.0-chinook-finetuning.1
- frontend/tailwind.config.ts - v0.1.0-chinook-finetuning.1
- frontend/tsconfig.json - v0.1.0-chinook-finetuning.1
"" + +- Added PDF database as a downloadable link in Readme so users can test it",frontend/src/components/ConversationView/EmptyView.tsx +3b0f9f6912d3d6be1c53063f77c5ec0d0fc62296,06-21-2023 07:05:06,GitHub Enterprise,"Feat/azure model (#17) + +""## impact surface
- frontend/Dockerfile - v0.1.0-feat-azure-model.1
- frontend/custom_typings - v0.1.0-feat-azure-model.1
- frontend/next.config.mjs - v0.1.0-feat-azure-model.1
- frontend/package.json - v0.1.0-feat-azure-model.1
- frontend/pnpm-lock.yaml - v0.1.0-feat-azure-model.1
- frontend/postcss.config.cjs - v0.1.0-feat-azure-model.1
- frontend/prettier.config.cjs - v0.1.0-feat-azure-model.1
- frontend/prisma - v0.1.0-feat-azure-model.1
- frontend/prismalib - v0.1.0-feat-azure-model.1
- frontend/public - v0.1.0-feat-azure-model.1
- frontend/src - v0.1.0-feat-azure-model.1
- frontend/tailwind.config.ts - v0.1.0-feat-azure-model.1
- frontend/tsconfig.json - v0.1.0-feat-azure-model.1
""",.env.example +3b0f9f6912d3d6be1c53063f77c5ec0d0fc62296,06-21-2023 07:05:06,GitHub Enterprise,"Feat/azure model (#17) + +""## impact surface
- frontend/Dockerfile - v0.1.0-feat-azure-model.1
- frontend/custom_typings - v0.1.0-feat-azure-model.1
- frontend/next.config.mjs - v0.1.0-feat-azure-model.1
- frontend/package.json - v0.1.0-feat-azure-model.1
- frontend/pnpm-lock.yaml - v0.1.0-feat-azure-model.1
- frontend/postcss.config.cjs - v0.1.0-feat-azure-model.1
- frontend/prettier.config.cjs - v0.1.0-feat-azure-model.1
- frontend/prisma - v0.1.0-feat-azure-model.1
- frontend/prismalib - v0.1.0-feat-azure-model.1
- frontend/public - v0.1.0-feat-azure-model.1
- frontend/src - v0.1.0-feat-azure-model.1
- frontend/tailwind.config.ts - v0.1.0-feat-azure-model.1
- frontend/tsconfig.json - v0.1.0-feat-azure-model.1
""",backend/app/app/core/config.py +3b0f9f6912d3d6be1c53063f77c5ec0d0fc62296,06-21-2023 07:05:06,GitHub Enterprise,"Feat/azure model (#17) + +""## impact surface
- frontend/Dockerfile - v0.1.0-feat-azure-model.1
- frontend/custom_typings - v0.1.0-feat-azure-model.1
- frontend/next.config.mjs - v0.1.0-feat-azure-model.1
- frontend/package.json - v0.1.0-feat-azure-model.1
- frontend/pnpm-lock.yaml - v0.1.0-feat-azure-model.1
- frontend/postcss.config.cjs - v0.1.0-feat-azure-model.1
- frontend/prettier.config.cjs - v0.1.0-feat-azure-model.1
- frontend/prisma - v0.1.0-feat-azure-model.1
- frontend/prismalib - v0.1.0-feat-azure-model.1
- frontend/public - v0.1.0-feat-azure-model.1
- frontend/src - v0.1.0-feat-azure-model.1
- frontend/tailwind.config.ts - v0.1.0-feat-azure-model.1
- frontend/tsconfig.json - v0.1.0-feat-azure-model.1
""",backend/app/app/schemas/tool_schema.py +3b0f9f6912d3d6be1c53063f77c5ec0d0fc62296,06-21-2023 07:05:06,GitHub Enterprise,"Feat/azure model (#17) + +""## impact surface
- frontend/Dockerfile - v0.1.0-feat-azure-model.1
- frontend/custom_typings - v0.1.0-feat-azure-model.1
- frontend/next.config.mjs - v0.1.0-feat-azure-model.1
- frontend/package.json - v0.1.0-feat-azure-model.1
- frontend/pnpm-lock.yaml - v0.1.0-feat-azure-model.1
- frontend/postcss.config.cjs - v0.1.0-feat-azure-model.1
- frontend/prettier.config.cjs - v0.1.0-feat-azure-model.1
- frontend/prisma - v0.1.0-feat-azure-model.1
- frontend/prismalib - v0.1.0-feat-azure-model.1
- frontend/public - v0.1.0-feat-azure-model.1
- frontend/src - v0.1.0-feat-azure-model.1
- frontend/tailwind.config.ts - v0.1.0-feat-azure-model.1
- frontend/tsconfig.json - v0.1.0-feat-azure-model.1
""",backend/app/app/services/chat_agent/helpers/llm.py +3b0f9f6912d3d6be1c53063f77c5ec0d0fc62296,06-21-2023 07:05:06,GitHub Enterprise,"Feat/azure model (#17) + +""## impact surface
- frontend/Dockerfile - v0.1.0-feat-azure-model.1
- frontend/custom_typings - v0.1.0-feat-azure-model.1
- frontend/next.config.mjs - v0.1.0-feat-azure-model.1
- frontend/package.json - v0.1.0-feat-azure-model.1
- frontend/pnpm-lock.yaml - v0.1.0-feat-azure-model.1
- frontend/postcss.config.cjs - v0.1.0-feat-azure-model.1
- frontend/prettier.config.cjs - v0.1.0-feat-azure-model.1
- frontend/prisma - v0.1.0-feat-azure-model.1
- frontend/prismalib - v0.1.0-feat-azure-model.1
- frontend/public - v0.1.0-feat-azure-model.1
- frontend/src - v0.1.0-feat-azure-model.1
- frontend/tailwind.config.ts - v0.1.0-feat-azure-model.1
- frontend/tsconfig.json - v0.1.0-feat-azure-model.1
""",backend/app/app/services/chat_agent/meta_agent.py +cf9081f000a33884f0d4e32625637f00072dfaf4,06-21-2023 10:09:04,Jakob Heyder,Fix: Add flow diagram to README,README.md +cf9081f000a33884f0d4e32625637f00072dfaf4,06-21-2023 10:09:04,Jakob Heyder,Fix: Add flow diagram to README,docs/010623_flow_diagram.png +45fc617a1ccbb9103b972795e2405121664bef87,06-22-2023 17:26:52,Casper van Langen,initial notebook,backend/app/app/services/chat_agent/tools/README.ipynb +a4734cc3d6df2cb20f222bb33f129603322cd85d,06-23-2023 13:26:46,Casper van Langen,tools readme,backend/app/app/services/chat_agent/tools/README.ipynb +a4734cc3d6df2cb20f222bb33f129603322cd85d,06-23-2023 13:26:46,Casper van Langen,tools readme,backend/app/app/services/chat_agent/tools/README.md +a4734cc3d6df2cb20f222bb33f129603322cd85d,06-23-2023 13:26:46,Casper van Langen,tools readme,backend/app/app/services/chat_agent/tools/template_tool.py +9be3b5e47b8d708436e6189271102f7f6a451d9a,06-23-2023 14:28:56,Casper van Langen,tools readme,README.md +9be3b5e47b8d708436e6189271102f7f6a451d9a,06-23-2023 14:28:56,Casper van Langen,tools readme,backend/app/app/config/agent.yml +9be3b5e47b8d708436e6189271102f7f6a451d9a,06-23-2023 14:28:56,Casper van Langen,tools readme,backend/app/app/services/chat_agent/tools/README.md +e7abc2b7d56d510779806840858597d053d34b34,06-23-2023 14:50:14,Casper van Langen,move to docs,README.md +e7abc2b7d56d510779806840858597d053d34b34,06-23-2023 14:50:14,Casper van Langen,move to docs,backend/app/app/services/chat_agent/tools/README.md +e7abc2b7d56d510779806840858597d053d34b34,06-23-2023 14:50:14,Casper van Langen,move to docs,backend/app/app/services/chat_agent/tools/template_tool.py +e7abc2b7d56d510779806840858597d053d34b34,06-23-2023 14:50:14,Casper van Langen,move to docs,docs/tools_howto/tools_setup.md +28f5b300a0e08a2cd16679085529ef3510fc9087,06-23-2023 14:52:43,GitHub Enterprise,"Update/develop with last changes (#22) + +""## impact surface
- frontend/ - v0.1.0-update-develop-with-last-changes.1
- frontend/Dockerfile - v0.1.0-update-develop-with-last-changes.1
- frontend/next - v0.1.0-update-develop-with-last-changes.1
- frontend/src - v0.1.0-update-develop-with-last-changes.1
- frontend/tailwind - v0.1.0-update-develop-with-last-changes.1
"" + + +## ReadMe and docs +- Provide clearer instructions and guidance for the setup process. +- Provide more options to setup the project. + +## For the frontend, the following updates are required: +- Fix the bug that renames conversations. +- Improve the responsiveness of the sidebar. +- Redesign the layout. +- Change the color scheme to a more visually appealing one, incorporating colors from the BCG X palette. +- Implement collapsible conversations in the sidebar. +- Develop a compact version of the sidebar for when it is collapsed. +- Enhance the functionality by adding additional tools such as JSON, YAML, and Plotly for graphing. +- Change the appearance of the Empty view page.",.env.example +28f5b300a0e08a2cd16679085529ef3510fc9087,06-23-2023 14:52:43,GitHub Enterprise,"Update/develop with last changes (#22) + +""## impact surface
- frontend/ - v0.1.0-update-develop-with-last-changes.1
- frontend/Dockerfile - v0.1.0-update-develop-with-last-changes.1
- frontend/next - v0.1.0-update-develop-with-last-changes.1
- frontend/src - v0.1.0-update-develop-with-last-changes.1
- frontend/tailwind - v0.1.0-update-develop-with-last-changes.1
"" + + +## ReadMe and docs +- Provide clearer instructions and guidance for the setup process. +- Provide more options to setup the project. + +## For the frontend, the following updates are required: +- Fix the bug that renames conversations. +- Improve the responsiveness of the sidebar. +- Redesign the layout. +- Change the color scheme to a more visually appealing one, incorporating colors from the BCG X palette. +- Implement collapsible conversations in the sidebar. +- Develop a compact version of the sidebar for when it is collapsed. +- Enhance the functionality by adding additional tools such as JSON, YAML, and Plotly for graphing. +- Change the appearance of the Empty view page.",.env.example.dev +28f5b300a0e08a2cd16679085529ef3510fc9087,06-23-2023 14:52:43,GitHub Enterprise,"Update/develop with last changes (#22) + +""## impact surface
- frontend/ - v0.1.0-update-develop-with-last-changes.1
- frontend/Dockerfile - v0.1.0-update-develop-with-last-changes.1
- frontend/next - v0.1.0-update-develop-with-last-changes.1
- frontend/src - v0.1.0-update-develop-with-last-changes.1
- frontend/tailwind - v0.1.0-update-develop-with-last-changes.1
"" + + +## ReadMe and docs +- Provide clearer instructions and guidance for the setup process. +- Provide more options to setup the project. + +## For the frontend, the following updates are required: +- Fix the bug that renames conversations. +- Improve the responsiveness of the sidebar. +- Redesign the layout. +- Change the color scheme to a more visually appealing one, incorporating colors from the BCG X palette. +- Implement collapsible conversations in the sidebar. +- Develop a compact version of the sidebar for when it is collapsed. +- Enhance the functionality by adding additional tools such as JSON, YAML, and Plotly for graphing. +- Change the appearance of the Empty view page.",.env.example.local +28f5b300a0e08a2cd16679085529ef3510fc9087,06-23-2023 14:52:43,GitHub Enterprise,"Update/develop with last changes (#22) + +""## impact surface
- frontend/ - v0.1.0-update-develop-with-last-changes.1
- frontend/Dockerfile - v0.1.0-update-develop-with-last-changes.1
- frontend/next - v0.1.0-update-develop-with-last-changes.1
- frontend/src - v0.1.0-update-develop-with-last-changes.1
- frontend/tailwind - v0.1.0-update-develop-with-last-changes.1
"" + + +## ReadMe and docs +- Provide clearer instructions and guidance for the setup process. +- Provide more options to setup the project. + +## For the frontend, the following updates are required: +- Fix the bug that renames conversations. +- Improve the responsiveness of the sidebar. +- Redesign the layout. +- Change the color scheme to a more visually appealing one, incorporating colors from the BCG X palette. +- Implement collapsible conversations in the sidebar. +- Develop a compact version of the sidebar for when it is collapsed. +- Enhance the functionality by adding additional tools such as JSON, YAML, and Plotly for graphing. +- Change the appearance of the Empty view page.",README.md +28f5b300a0e08a2cd16679085529ef3510fc9087,06-23-2023 14:52:43,GitHub Enterprise,"Update/develop with last changes (#22) + +""## impact surface
- frontend/ - v0.1.0-update-develop-with-last-changes.1
- frontend/Dockerfile - v0.1.0-update-develop-with-last-changes.1
- frontend/next - v0.1.0-update-develop-with-last-changes.1
- frontend/src - v0.1.0-update-develop-with-last-changes.1
- frontend/tailwind - v0.1.0-update-develop-with-last-changes.1
"" + + +## ReadMe and docs +- Provide clearer instructions and guidance for the setup process. +- Provide more options to setup the project. + +## For the frontend, the following updates are required: +- Fix the bug that renames conversations. +- Improve the responsiveness of the sidebar. +- Redesign the layout. +- Change the color scheme to a more visually appealing one, incorporating colors from the BCG X palette. +- Implement collapsible conversations in the sidebar. +- Develop a compact version of the sidebar for when it is collapsed. +- Enhance the functionality by adding additional tools such as JSON, YAML, and Plotly for graphing. +- Change the appearance of the Empty view page.",docker-compose-dev.yml +28f5b300a0e08a2cd16679085529ef3510fc9087,06-23-2023 14:52:43,GitHub Enterprise,"Update/develop with last changes (#22) + +""## impact surface
- frontend/ - v0.1.0-update-develop-with-last-changes.1
- frontend/Dockerfile - v0.1.0-update-develop-with-last-changes.1
- frontend/next - v0.1.0-update-develop-with-last-changes.1
- frontend/src - v0.1.0-update-develop-with-last-changes.1
- frontend/tailwind - v0.1.0-update-develop-with-last-changes.1
"" + + +## ReadMe and docs +- Provide clearer instructions and guidance for the setup process. +- Provide more options to setup the project. + +## For the frontend, the following updates are required: +- Fix the bug that renames conversations. +- Improve the responsiveness of the sidebar. +- Redesign the layout. +- Change the color scheme to a more visually appealing one, incorporating colors from the BCG X palette. +- Implement collapsible conversations in the sidebar. +- Develop a compact version of the sidebar for when it is collapsed. +- Enhance the functionality by adding additional tools such as JSON, YAML, and Plotly for graphing. +- Change the appearance of the Empty view page.",docker-compose-local.yml +28f5b300a0e08a2cd16679085529ef3510fc9087,06-23-2023 14:52:43,GitHub Enterprise,"Update/develop with last changes (#22) + +""## impact surface
- frontend/ - v0.1.0-update-develop-with-last-changes.1
- frontend/Dockerfile - v0.1.0-update-develop-with-last-changes.1
- frontend/next - v0.1.0-update-develop-with-last-changes.1
- frontend/src - v0.1.0-update-develop-with-last-changes.1
- frontend/tailwind - v0.1.0-update-develop-with-last-changes.1
"" + + +## ReadMe and docs +- Provide clearer instructions and guidance for the setup process. +- Provide more options to setup the project. + +## For the frontend, the following updates are required: +- Fix the bug that renames conversations. +- Improve the responsiveness of the sidebar. +- Redesign the layout. +- Change the color scheme to a more visually appealing one, incorporating colors from the BCG X palette. +- Implement collapsible conversations in the sidebar. +- Develop a compact version of the sidebar for when it is collapsed. +- Enhance the functionality by adding additional tools such as JSON, YAML, and Plotly for graphing. +- Change the appearance of the Empty view page.",docker-compose.yml +28f5b300a0e08a2cd16679085529ef3510fc9087,06-23-2023 14:52:43,GitHub Enterprise,"Update/develop with last changes (#22) + +""## impact surface
- frontend/ - v0.1.0-update-develop-with-last-changes.1
- frontend/Dockerfile - v0.1.0-update-develop-with-last-changes.1
- frontend/next - v0.1.0-update-develop-with-last-changes.1
- frontend/src - v0.1.0-update-develop-with-last-changes.1
- frontend/tailwind - v0.1.0-update-develop-with-last-changes.1
"" + + +## ReadMe and docs +- Provide clearer instructions and guidance for the setup process. +- Provide more options to setup the project. + +## For the frontend, the following updates are required: +- Fix the bug that renames conversations. +- Improve the responsiveness of the sidebar. +- Redesign the layout. +- Change the color scheme to a more visually appealing one, incorporating colors from the BCG X palette. +- Implement collapsible conversations in the sidebar. +- Develop a compact version of the sidebar for when it is collapsed. +- Enhance the functionality by adding additional tools such as JSON, YAML, and Plotly for graphing. +- Change the appearance of the Empty view page.",frontend/.env.example +28f5b300a0e08a2cd16679085529ef3510fc9087,06-23-2023 14:52:43,GitHub Enterprise,"Update/develop with last changes (#22) + +""## impact surface
- frontend/ - v0.1.0-update-develop-with-last-changes.1
- frontend/Dockerfile - v0.1.0-update-develop-with-last-changes.1
- frontend/next - v0.1.0-update-develop-with-last-changes.1
- frontend/src - v0.1.0-update-develop-with-last-changes.1
- frontend/tailwind - v0.1.0-update-develop-with-last-changes.1
"" + + +## ReadMe and docs +- Provide clearer instructions and guidance for the setup process. +- Provide more options to setup the project. + +## For the frontend, the following updates are required: +- Fix the bug that renames conversations. +- Improve the responsiveness of the sidebar. +- Redesign the layout. +- Change the color scheme to a more visually appealing one, incorporating colors from the BCG X palette. +- Implement collapsible conversations in the sidebar. +- Develop a compact version of the sidebar for when it is collapsed. +- Enhance the functionality by adding additional tools such as JSON, YAML, and Plotly for graphing. +- Change the appearance of the Empty view page.",frontend/.env.example.dev +28f5b300a0e08a2cd16679085529ef3510fc9087,06-23-2023 14:52:43,GitHub Enterprise,"Update/develop with last changes (#22) + +""## impact surface
- frontend/ - v0.1.0-update-develop-with-last-changes.1
- frontend/Dockerfile - v0.1.0-update-develop-with-last-changes.1
- frontend/next - v0.1.0-update-develop-with-last-changes.1
- frontend/src - v0.1.0-update-develop-with-last-changes.1
- frontend/tailwind - v0.1.0-update-develop-with-last-changes.1
"" + + +## ReadMe and docs +- Provide clearer instructions and guidance for the setup process. +- Provide more options to setup the project. + +## For the frontend, the following updates are required: +- Fix the bug that renames conversations. +- Improve the responsiveness of the sidebar. +- Redesign the layout. +- Change the color scheme to a more visually appealing one, incorporating colors from the BCG X palette. +- Implement collapsible conversations in the sidebar. +- Develop a compact version of the sidebar for when it is collapsed. +- Enhance the functionality by adding additional tools such as JSON, YAML, and Plotly for graphing. +- Change the appearance of the Empty view page.",frontend/Dockerfile +28f5b300a0e08a2cd16679085529ef3510fc9087,06-23-2023 14:52:43,GitHub Enterprise,"Update/develop with last changes (#22) + +""## impact surface
- frontend/ - v0.1.0-update-develop-with-last-changes.1
- frontend/Dockerfile - v0.1.0-update-develop-with-last-changes.1
- frontend/next - v0.1.0-update-develop-with-last-changes.1
- frontend/src - v0.1.0-update-develop-with-last-changes.1
- frontend/tailwind - v0.1.0-update-develop-with-last-changes.1
"" + + +## ReadMe and docs +- Provide clearer instructions and guidance for the setup process. +- Provide more options to setup the project. + +## For the frontend, the following updates are required: +- Fix the bug that renames conversations. +- Improve the responsiveness of the sidebar. +- Redesign the layout. +- Change the color scheme to a more visually appealing one, incorporating colors from the BCG X palette. +- Implement collapsible conversations in the sidebar. +- Develop a compact version of the sidebar for when it is collapsed. +- Enhance the functionality by adding additional tools such as JSON, YAML, and Plotly for graphing. +- Change the appearance of the Empty view page.",frontend/next.config.mjs +28f5b300a0e08a2cd16679085529ef3510fc9087,06-23-2023 14:52:43,GitHub Enterprise,"Update/develop with last changes (#22) + +""## impact surface
- frontend/ - v0.1.0-update-develop-with-last-changes.1
- frontend/Dockerfile - v0.1.0-update-develop-with-last-changes.1
- frontend/next - v0.1.0-update-develop-with-last-changes.1
- frontend/src - v0.1.0-update-develop-with-last-changes.1
- frontend/tailwind - v0.1.0-update-develop-with-last-changes.1
"" + + +## ReadMe and docs +- Provide clearer instructions and guidance for the setup process. +- Provide more options to setup the project. + +## For the frontend, the following updates are required: +- Fix the bug that renames conversations. +- Improve the responsiveness of the sidebar. +- Redesign the layout. +- Change the color scheme to a more visually appealing one, incorporating colors from the BCG X palette. +- Implement collapsible conversations in the sidebar. +- Develop a compact version of the sidebar for when it is collapsed. +- Enhance the functionality by adding additional tools such as JSON, YAML, and Plotly for graphing. +- Change the appearance of the Empty view page.",frontend/src/components/CodeView/SideDrawer/ExecutionWarningBanner.tsx +28f5b300a0e08a2cd16679085529ef3510fc9087,06-23-2023 14:52:43,GitHub Enterprise,"Update/develop with last changes (#22) + +""## impact surface
- frontend/ - v0.1.0-update-develop-with-last-changes.1
- frontend/Dockerfile - v0.1.0-update-develop-with-last-changes.1
- frontend/next - v0.1.0-update-develop-with-last-changes.1
- frontend/src - v0.1.0-update-develop-with-last-changes.1
- frontend/tailwind - v0.1.0-update-develop-with-last-changes.1
"" + + +## ReadMe and docs +- Provide clearer instructions and guidance for the setup process. +- Provide more options to setup the project. + +## For the frontend, the following updates are required: +- Fix the bug that renames conversations. +- Improve the responsiveness of the sidebar. +- Redesign the layout. +- Change the color scheme to a more visually appealing one, incorporating colors from the BCG X palette. +- Implement collapsible conversations in the sidebar. +- Develop a compact version of the sidebar for when it is collapsed. +- Enhance the functionality by adding additional tools such as JSON, YAML, and Plotly for graphing. +- Change the appearance of the Empty view page.",frontend/src/components/Common/Modal.tsx +28f5b300a0e08a2cd16679085529ef3510fc9087,06-23-2023 14:52:43,GitHub Enterprise,"Update/develop with last changes (#22) + +""## impact surface
- frontend/ - v0.1.0-update-develop-with-last-changes.1
- frontend/Dockerfile - v0.1.0-update-develop-with-last-changes.1
- frontend/next - v0.1.0-update-develop-with-last-changes.1
- frontend/src - v0.1.0-update-develop-with-last-changes.1
- frontend/tailwind - v0.1.0-update-develop-with-last-changes.1
"" + + +## ReadMe and docs +- Provide clearer instructions and guidance for the setup process. +- Provide more options to setup the project. + +## For the frontend, the following updates are required: +- Fix the bug that renames conversations. +- Improve the responsiveness of the sidebar. +- Redesign the layout. +- Change the color scheme to a more visually appealing one, incorporating colors from the BCG X palette. +- Implement collapsible conversations in the sidebar. +- Develop a compact version of the sidebar for when it is collapsed. +- Enhance the functionality by adding additional tools such as JSON, YAML, and Plotly for graphing. +- Change the appearance of the Empty view page.",frontend/src/components/Common/Select.tsx +28f5b300a0e08a2cd16679085529ef3510fc9087,06-23-2023 14:52:43,GitHub Enterprise,"Update/develop with last changes (#22) + +""## impact surface
- frontend/ - v0.1.0-update-develop-with-last-changes.1
- frontend/Dockerfile - v0.1.0-update-develop-with-last-changes.1
- frontend/next - v0.1.0-update-develop-with-last-changes.1
- frontend/src - v0.1.0-update-develop-with-last-changes.1
- frontend/tailwind - v0.1.0-update-develop-with-last-changes.1
"" + + +## ReadMe and docs +- Provide clearer instructions and guidance for the setup process. +- Provide more options to setup the project. + +## For the frontend, the following updates are required: +- Fix the bug that renames conversations. +- Improve the responsiveness of the sidebar. +- Redesign the layout. +- Change the color scheme to a more visually appealing one, incorporating colors from the BCG X palette. +- Implement collapsible conversations in the sidebar. +- Develop a compact version of the sidebar for when it is collapsed. +- Enhance the functionality by adding additional tools such as JSON, YAML, and Plotly for graphing. +- Change the appearance of the Empty view page.",frontend/src/components/Common/TextField.tsx +28f5b300a0e08a2cd16679085529ef3510fc9087,06-23-2023 14:52:43,GitHub Enterprise,"Update/develop with last changes (#22) + +""## impact surface
- frontend/ - v0.1.0-update-develop-with-last-changes.1
- frontend/Dockerfile - v0.1.0-update-develop-with-last-changes.1
- frontend/next - v0.1.0-update-develop-with-last-changes.1
- frontend/src - v0.1.0-update-develop-with-last-changes.1
- frontend/tailwind - v0.1.0-update-develop-with-last-changes.1
"" + + +## ReadMe and docs +- Provide clearer instructions and guidance for the setup process. +- Provide more options to setup the project. + +## For the frontend, the following updates are required: +- Fix the bug that renames conversations. +- Improve the responsiveness of the sidebar. +- Redesign the layout. +- Change the color scheme to a more visually appealing one, incorporating colors from the BCG X palette. +- Implement collapsible conversations in the sidebar. +- Develop a compact version of the sidebar for when it is collapsed. +- Enhance the functionality by adding additional tools such as JSON, YAML, and Plotly for graphing. +- Change the appearance of the Empty view page.",frontend/src/components/ConversationView/ClearConversationButton/index.tsx +28f5b300a0e08a2cd16679085529ef3510fc9087,06-23-2023 14:52:43,GitHub Enterprise,"Update/develop with last changes (#22) + +""## impact surface
- frontend/ - v0.1.0-update-develop-with-last-changes.1
- frontend/Dockerfile - v0.1.0-update-develop-with-last-changes.1
- frontend/next - v0.1.0-update-develop-with-last-changes.1
- frontend/src - v0.1.0-update-develop-with-last-changes.1
- frontend/tailwind - v0.1.0-update-develop-with-last-changes.1
"" + + +## ReadMe and docs +- Provide clearer instructions and guidance for the setup process. +- Provide more options to setup the project. + +## For the frontend, the following updates are required: +- Fix the bug that renames conversations. +- Improve the responsiveness of the sidebar. +- Redesign the layout. +- Change the color scheme to a more visually appealing one, incorporating colors from the BCG X palette. +- Implement collapsible conversations in the sidebar. +- Develop a compact version of the sidebar for when it is collapsed. +- Enhance the functionality by adding additional tools such as JSON, YAML, and Plotly for graphing. +- Change the appearance of the Empty view page.",frontend/src/components/ConversationView/EmptyView.tsx +28f5b300a0e08a2cd16679085529ef3510fc9087,06-23-2023 14:52:43,GitHub Enterprise,"Update/develop with last changes (#22) + +""## impact surface
- frontend/ - v0.1.0-update-develop-with-last-changes.1
- frontend/Dockerfile - v0.1.0-update-develop-with-last-changes.1
- frontend/next - v0.1.0-update-develop-with-last-changes.1
- frontend/src - v0.1.0-update-develop-with-last-changes.1
- frontend/tailwind - v0.1.0-update-develop-with-last-changes.1
"" + + +## ReadMe and docs +- Provide clearer instructions and guidance for the setup process. +- Provide more options to setup the project. + +## For the frontend, the following updates are required: +- Fix the bug that renames conversations. +- Improve the responsiveness of the sidebar. +- Redesign the layout. +- Change the color scheme to a more visually appealing one, incorporating colors from the BCG X palette. +- Implement collapsible conversations in the sidebar. +- Develop a compact version of the sidebar for when it is collapsed. +- Enhance the functionality by adding additional tools such as JSON, YAML, and Plotly for graphing. +- Change the appearance of the Empty view page.",frontend/src/components/ConversationView/Header.tsx +28f5b300a0e08a2cd16679085529ef3510fc9087,06-23-2023 14:52:43,GitHub Enterprise,"Update/develop with last changes (#22) + +""## impact surface
- frontend/ - v0.1.0-update-develop-with-last-changes.1
- frontend/Dockerfile - v0.1.0-update-develop-with-last-changes.1
- frontend/next - v0.1.0-update-develop-with-last-changes.1
- frontend/src - v0.1.0-update-develop-with-last-changes.1
- frontend/tailwind - v0.1.0-update-develop-with-last-changes.1
"" + + +## ReadMe and docs +- Provide clearer instructions and guidance for the setup process. +- Provide more options to setup the project. + +## For the frontend, the following updates are required: +- Fix the bug that renames conversations. +- Improve the responsiveness of the sidebar. +- Redesign the layout. +- Change the color scheme to a more visually appealing one, incorporating colors from the BCG X palette. +- Implement collapsible conversations in the sidebar. +- Develop a compact version of the sidebar for when it is collapsed. +- Enhance the functionality by adding additional tools such as JSON, YAML, and Plotly for graphing. +- Change the appearance of the Empty view page.",frontend/src/components/ConversationView/MessageTextarea.tsx +28f5b300a0e08a2cd16679085529ef3510fc9087,06-23-2023 14:52:43,GitHub Enterprise,"Update/develop with last changes (#22) + +""## impact surface
- frontend/ - v0.1.0-update-develop-with-last-changes.1
- frontend/Dockerfile - v0.1.0-update-develop-with-last-changes.1
- frontend/next - v0.1.0-update-develop-with-last-changes.1
- frontend/src - v0.1.0-update-develop-with-last-changes.1
- frontend/tailwind - v0.1.0-update-develop-with-last-changes.1
"" + + +## ReadMe and docs +- Provide clearer instructions and guidance for the setup process. +- Provide more options to setup the project. + +## For the frontend, the following updates are required: +- Fix the bug that renames conversations. +- Improve the responsiveness of the sidebar. +- Redesign the layout. +- Change the color scheme to a more visually appealing one, incorporating colors from the BCG X palette. +- Implement collapsible conversations in the sidebar. +- Develop a compact version of the sidebar for when it is collapsed. +- Enhance the functionality by adding additional tools such as JSON, YAML, and Plotly for graphing. +- Change the appearance of the Empty view page.",frontend/src/components/ConversationView/MessageView/index.tsx +28f5b300a0e08a2cd16679085529ef3510fc9087,06-23-2023 14:52:43,GitHub Enterprise,"Update/develop with last changes (#22) + +""## impact surface
- frontend/ - v0.1.0-update-develop-with-last-changes.1
- frontend/Dockerfile - v0.1.0-update-develop-with-last-changes.1
- frontend/next - v0.1.0-update-develop-with-last-changes.1
- frontend/src - v0.1.0-update-develop-with-last-changes.1
- frontend/tailwind - v0.1.0-update-develop-with-last-changes.1
"" + + +## ReadMe and docs +- Provide clearer instructions and guidance for the setup process. +- Provide more options to setup the project. + +## For the frontend, the following updates are required: +- Fix the bug that renames conversations. +- Improve the responsiveness of the sidebar. +- Redesign the layout. +- Change the color scheme to a more visually appealing one, incorporating colors from the BCG X palette. +- Implement collapsible conversations in the sidebar. +- Develop a compact version of the sidebar for when it is collapsed. +- Enhance the functionality by adding additional tools such as JSON, YAML, and Plotly for graphing. +- Change the appearance of the Empty view page.",frontend/src/components/ConversationView/index.tsx +28f5b300a0e08a2cd16679085529ef3510fc9087,06-23-2023 14:52:43,GitHub Enterprise,"Update/develop with last changes (#22) + +""## impact surface
- frontend/ - v0.1.0-update-develop-with-last-changes.1
- frontend/Dockerfile - v0.1.0-update-develop-with-last-changes.1
- frontend/next - v0.1.0-update-develop-with-last-changes.1
- frontend/src - v0.1.0-update-develop-with-last-changes.1
- frontend/tailwind - v0.1.0-update-develop-with-last-changes.1
"" + + +## ReadMe and docs +- Provide clearer instructions and guidance for the setup process. +- Provide more options to setup the project. + +## For the frontend, the following updates are required: +- Fix the bug that renames conversations. +- Improve the responsiveness of the sidebar. +- Redesign the layout. +- Change the color scheme to a more visually appealing one, incorporating colors from the BCG X palette. +- Implement collapsible conversations in the sidebar. +- Develop a compact version of the sidebar for when it is collapsed. +- Enhance the functionality by adding additional tools such as JSON, YAML, and Plotly for graphing. +- Change the appearance of the Empty view page.",frontend/src/components/CustomIcons/BcgX.tsx +28f5b300a0e08a2cd16679085529ef3510fc9087,06-23-2023 14:52:43,GitHub Enterprise,"Update/develop with last changes (#22) + +""## impact surface
- frontend/ - v0.1.0-update-develop-with-last-changes.1
- frontend/Dockerfile - v0.1.0-update-develop-with-last-changes.1
- frontend/next - v0.1.0-update-develop-with-last-changes.1
- frontend/src - v0.1.0-update-develop-with-last-changes.1
- frontend/tailwind - v0.1.0-update-develop-with-last-changes.1
"" + + +## ReadMe and docs +- Provide clearer instructions and guidance for the setup process. +- Provide more options to setup the project. + +## For the frontend, the following updates are required: +- Fix the bug that renames conversations. +- Improve the responsiveness of the sidebar. +- Redesign the layout. +- Change the color scheme to a more visually appealing one, incorporating colors from the BCG X palette. +- Implement collapsible conversations in the sidebar. +- Develop a compact version of the sidebar for when it is collapsed. +- Enhance the functionality by adding additional tools such as JSON, YAML, and Plotly for graphing. +- Change the appearance of the Empty view page.",frontend/src/components/CustomIcons/Icon.tsx +28f5b300a0e08a2cd16679085529ef3510fc9087,06-23-2023 14:52:43,GitHub Enterprise,"Update/develop with last changes (#22) + +""## impact surface
- frontend/ - v0.1.0-update-develop-with-last-changes.1
- frontend/Dockerfile - v0.1.0-update-develop-with-last-changes.1
- frontend/next - v0.1.0-update-develop-with-last-changes.1
- frontend/src - v0.1.0-update-develop-with-last-changes.1
- frontend/tailwind - v0.1.0-update-develop-with-last-changes.1
"" + + +## ReadMe and docs +- Provide clearer instructions and guidance for the setup process. +- Provide more options to setup the project. + +## For the frontend, the following updates are required: +- Fix the bug that renames conversations. +- Improve the responsiveness of the sidebar. +- Redesign the layout. +- Change the color scheme to a more visually appealing one, incorporating colors from the BCG X palette. +- Implement collapsible conversations in the sidebar. +- Develop a compact version of the sidebar for when it is collapsed. +- Enhance the functionality by adding additional tools such as JSON, YAML, and Plotly for graphing. +- Change the appearance of the Empty view page.",frontend/src/components/CustomIcons/MainLogo.tsx +28f5b300a0e08a2cd16679085529ef3510fc9087,06-23-2023 14:52:43,GitHub Enterprise,"Update/develop with last changes (#22) + +""## impact surface
- frontend/ - v0.1.0-update-develop-with-last-changes.1
- frontend/Dockerfile - v0.1.0-update-develop-with-last-changes.1
- frontend/next - v0.1.0-update-develop-with-last-changes.1
- frontend/src - v0.1.0-update-develop-with-last-changes.1
- frontend/tailwind - v0.1.0-update-develop-with-last-changes.1
"" + + +## ReadMe and docs +- Provide clearer instructions and guidance for the setup process. +- Provide more options to setup the project. + +## For the frontend, the following updates are required: +- Fix the bug that renames conversations. +- Improve the responsiveness of the sidebar. +- Redesign the layout. +- Change the color scheme to a more visually appealing one, incorporating colors from the BCG X palette. +- Implement collapsible conversations in the sidebar. +- Develop a compact version of the sidebar for when it is collapsed. +- Enhance the functionality by adding additional tools such as JSON, YAML, and Plotly for graphing. +- Change the appearance of the Empty view page.",frontend/src/components/Sidebar/DarkmodeSwitch.tsx +28f5b300a0e08a2cd16679085529ef3510fc9087,06-23-2023 14:52:43,GitHub Enterprise,"Update/develop with last changes (#22) + +""## impact surface
- frontend/ - v0.1.0-update-develop-with-last-changes.1
- frontend/Dockerfile - v0.1.0-update-develop-with-last-changes.1
- frontend/next - v0.1.0-update-develop-with-last-changes.1
- frontend/src - v0.1.0-update-develop-with-last-changes.1
- frontend/tailwind - v0.1.0-update-develop-with-last-changes.1
"" + + +## ReadMe and docs +- Provide clearer instructions and guidance for the setup process. +- Provide more options to setup the project. + +## For the frontend, the following updates are required: +- Fix the bug that renames conversations. +- Improve the responsiveness of the sidebar. +- Redesign the layout. +- Change the color scheme to a more visually appealing one, incorporating colors from the BCG X palette. +- Implement collapsible conversations in the sidebar. +- Develop a compact version of the sidebar for when it is collapsed. +- Enhance the functionality by adding additional tools such as JSON, YAML, and Plotly for graphing. +- Change the appearance of the Empty view page.",frontend/src/components/Sidebar/DataStorageBanner.tsx +28f5b300a0e08a2cd16679085529ef3510fc9087,06-23-2023 14:52:43,GitHub Enterprise,"Update/develop with last changes (#22) + +""## impact surface
- frontend/ - v0.1.0-update-develop-with-last-changes.1
- frontend/Dockerfile - v0.1.0-update-develop-with-last-changes.1
- frontend/next - v0.1.0-update-develop-with-last-changes.1
- frontend/src - v0.1.0-update-develop-with-last-changes.1
- frontend/tailwind - v0.1.0-update-develop-with-last-changes.1
"" + + +## ReadMe and docs +- Provide clearer instructions and guidance for the setup process. +- Provide more options to setup the project. + +## For the frontend, the following updates are required: +- Fix the bug that renames conversations. +- Improve the responsiveness of the sidebar. +- Redesign the layout. +- Change the color scheme to a more visually appealing one, incorporating colors from the BCG X palette. +- Implement collapsible conversations in the sidebar. +- Develop a compact version of the sidebar for when it is collapsed. +- Enhance the functionality by adding additional tools such as JSON, YAML, and Plotly for graphing. +- Change the appearance of the Empty view page.",frontend/src/components/Sidebar/OpenCloseButton.tsx +28f5b300a0e08a2cd16679085529ef3510fc9087,06-23-2023 14:52:43,GitHub Enterprise,"Update/develop with last changes (#22) + +""## impact surface
- frontend/ - v0.1.0-update-develop-with-last-changes.1
- frontend/Dockerfile - v0.1.0-update-develop-with-last-changes.1
- frontend/next - v0.1.0-update-develop-with-last-changes.1
- frontend/src - v0.1.0-update-develop-with-last-changes.1
- frontend/tailwind - v0.1.0-update-develop-with-last-changes.1
"" + + +## ReadMe and docs +- Provide clearer instructions and guidance for the setup process. +- Provide more options to setup the project. + +## For the frontend, the following updates are required: +- Fix the bug that renames conversations. +- Improve the responsiveness of the sidebar. +- Redesign the layout. +- Change the color scheme to a more visually appealing one, incorporating colors from the BCG X palette. +- Implement collapsible conversations in the sidebar. +- Develop a compact version of the sidebar for when it is collapsed. +- Enhance the functionality by adding additional tools such as JSON, YAML, and Plotly for graphing. +- Change the appearance of the Empty view page.",frontend/src/components/Sidebar/SettingsModal.tsx +28f5b300a0e08a2cd16679085529ef3510fc9087,06-23-2023 14:52:43,GitHub Enterprise,"Update/develop with last changes (#22) + +""## impact surface
- frontend/ - v0.1.0-update-develop-with-last-changes.1
- frontend/Dockerfile - v0.1.0-update-develop-with-last-changes.1
- frontend/next - v0.1.0-update-develop-with-last-changes.1
- frontend/src - v0.1.0-update-develop-with-last-changes.1
- frontend/tailwind - v0.1.0-update-develop-with-last-changes.1
"" + + +## ReadMe and docs +- Provide clearer instructions and guidance for the setup process. +- Provide more options to setup the project. + +## For the frontend, the following updates are required: +- Fix the bug that renames conversations. +- Improve the responsiveness of the sidebar. +- Redesign the layout. +- Change the color scheme to a more visually appealing one, incorporating colors from the BCG X palette. +- Implement collapsible conversations in the sidebar. +- Develop a compact version of the sidebar for when it is collapsed. +- Enhance the functionality by adding additional tools such as JSON, YAML, and Plotly for graphing. +- Change the appearance of the Empty view page.",frontend/src/components/Sidebar/UpdateConversationModal.tsx +28f5b300a0e08a2cd16679085529ef3510fc9087,06-23-2023 14:52:43,GitHub Enterprise,"Update/develop with last changes (#22) + +""## impact surface
- frontend/ - v0.1.0-update-develop-with-last-changes.1
- frontend/Dockerfile - v0.1.0-update-develop-with-last-changes.1
- frontend/next - v0.1.0-update-develop-with-last-changes.1
- frontend/src - v0.1.0-update-develop-with-last-changes.1
- frontend/tailwind - v0.1.0-update-develop-with-last-changes.1
"" + + +## ReadMe and docs +- Provide clearer instructions and guidance for the setup process. +- Provide more options to setup the project. + +## For the frontend, the following updates are required: +- Fix the bug that renames conversations. +- Improve the responsiveness of the sidebar. +- Redesign the layout. +- Change the color scheme to a more visually appealing one, incorporating colors from the BCG X palette. +- Implement collapsible conversations in the sidebar. +- Develop a compact version of the sidebar for when it is collapsed. +- Enhance the functionality by adding additional tools such as JSON, YAML, and Plotly for graphing. +- Change the appearance of the Empty view page.",frontend/src/components/Sidebar/index.tsx +28f5b300a0e08a2cd16679085529ef3510fc9087,06-23-2023 14:52:43,GitHub Enterprise,"Update/develop with last changes (#22) + +""## impact surface
- frontend/ - v0.1.0-update-develop-with-last-changes.1
- frontend/Dockerfile - v0.1.0-update-develop-with-last-changes.1
- frontend/next - v0.1.0-update-develop-with-last-changes.1
- frontend/src - v0.1.0-update-develop-with-last-changes.1
- frontend/tailwind - v0.1.0-update-develop-with-last-changes.1
"" + + +## ReadMe and docs +- Provide clearer instructions and guidance for the setup process. +- Provide more options to setup the project. + +## For the frontend, the following updates are required: +- Fix the bug that renames conversations. +- Improve the responsiveness of the sidebar. +- Redesign the layout. +- Change the color scheme to a more visually appealing one, incorporating colors from the BCG X palette. +- Implement collapsible conversations in the sidebar. +- Develop a compact version of the sidebar for when it is collapsed. +- Enhance the functionality by adding additional tools such as JSON, YAML, and Plotly for graphing. +- Change the appearance of the Empty view page.",frontend/src/components/ToolAppendixRenderer/index.tsx +28f5b300a0e08a2cd16679085529ef3510fc9087,06-23-2023 14:52:43,GitHub Enterprise,"Update/develop with last changes (#22) + +""## impact surface
- frontend/ - v0.1.0-update-develop-with-last-changes.1
- frontend/Dockerfile - v0.1.0-update-develop-with-last-changes.1
- frontend/next - v0.1.0-update-develop-with-last-changes.1
- frontend/src - v0.1.0-update-develop-with-last-changes.1
- frontend/tailwind - v0.1.0-update-develop-with-last-changes.1
"" + + +## ReadMe and docs +- Provide clearer instructions and guidance for the setup process. +- Provide more options to setup the project. + +## For the frontend, the following updates are required: +- Fix the bug that renames conversations. +- Improve the responsiveness of the sidebar. +- Redesign the layout. +- Change the color scheme to a more visually appealing one, incorporating colors from the BCG X palette. +- Implement collapsible conversations in the sidebar. +- Develop a compact version of the sidebar for when it is collapsed. +- Enhance the functionality by adding additional tools such as JSON, YAML, and Plotly for graphing. +- Change the appearance of the Empty view page.",frontend/src/components/ToolAppendixRenderer/library/CodeFlipCard/PlotlyDisplay.tsx +28f5b300a0e08a2cd16679085529ef3510fc9087,06-23-2023 14:52:43,GitHub Enterprise,"Update/develop with last changes (#22) + +""## impact surface
- frontend/ - v0.1.0-update-develop-with-last-changes.1
- frontend/Dockerfile - v0.1.0-update-develop-with-last-changes.1
- frontend/next - v0.1.0-update-develop-with-last-changes.1
- frontend/src - v0.1.0-update-develop-with-last-changes.1
- frontend/tailwind - v0.1.0-update-develop-with-last-changes.1
"" + + +## ReadMe and docs +- Provide clearer instructions and guidance for the setup process. +- Provide more options to setup the project. + +## For the frontend, the following updates are required: +- Fix the bug that renames conversations. +- Improve the responsiveness of the sidebar. +- Redesign the layout. +- Change the color scheme to a more visually appealing one, incorporating colors from the BCG X palette. +- Implement collapsible conversations in the sidebar. +- Develop a compact version of the sidebar for when it is collapsed. +- Enhance the functionality by adding additional tools such as JSON, YAML, and Plotly for graphing. +- Change the appearance of the Empty view page.",frontend/src/components/ToolAppendixRenderer/library/CodeFlipCard/ResultsView.tsx +28f5b300a0e08a2cd16679085529ef3510fc9087,06-23-2023 14:52:43,GitHub Enterprise,"Update/develop with last changes (#22) + +""## impact surface
- frontend/ - v0.1.0-update-develop-with-last-changes.1
- frontend/Dockerfile - v0.1.0-update-develop-with-last-changes.1
- frontend/next - v0.1.0-update-develop-with-last-changes.1
- frontend/src - v0.1.0-update-develop-with-last-changes.1
- frontend/tailwind - v0.1.0-update-develop-with-last-changes.1
"" + + +## ReadMe and docs +- Provide clearer instructions and guidance for the setup process. +- Provide more options to setup the project. + +## For the frontend, the following updates are required: +- Fix the bug that renames conversations. +- Improve the responsiveness of the sidebar. +- Redesign the layout. +- Change the color scheme to a more visually appealing one, incorporating colors from the BCG X palette. +- Implement collapsible conversations in the sidebar. +- Develop a compact version of the sidebar for when it is collapsed. +- Enhance the functionality by adding additional tools such as JSON, YAML, and Plotly for graphing. +- Change the appearance of the Empty view page.",frontend/src/components/ToolAppendixRenderer/library/CodeFlipCard/TextAreaEditor.tsx +28f5b300a0e08a2cd16679085529ef3510fc9087,06-23-2023 14:52:43,GitHub Enterprise,"Update/develop with last changes (#22) + +""## impact surface
- frontend/ - v0.1.0-update-develop-with-last-changes.1
- frontend/Dockerfile - v0.1.0-update-develop-with-last-changes.1
- frontend/next - v0.1.0-update-develop-with-last-changes.1
- frontend/src - v0.1.0-update-develop-with-last-changes.1
- frontend/tailwind - v0.1.0-update-develop-with-last-changes.1
"" + + +## ReadMe and docs +- Provide clearer instructions and guidance for the setup process. +- Provide more options to setup the project. + +## For the frontend, the following updates are required: +- Fix the bug that renames conversations. +- Improve the responsiveness of the sidebar. +- Redesign the layout. +- Change the color scheme to a more visually appealing one, incorporating colors from the BCG X palette. +- Implement collapsible conversations in the sidebar. +- Develop a compact version of the sidebar for when it is collapsed. +- Enhance the functionality by adding additional tools such as JSON, YAML, and Plotly for graphing. +- Change the appearance of the Empty view page.",frontend/src/components/ToolAppendixRenderer/library/CodeFlipCard/index.tsx +28f5b300a0e08a2cd16679085529ef3510fc9087,06-23-2023 14:52:43,GitHub Enterprise,"Update/develop with last changes (#22) + +""## impact surface
- frontend/ - v0.1.0-update-develop-with-last-changes.1
- frontend/Dockerfile - v0.1.0-update-develop-with-last-changes.1
- frontend/next - v0.1.0-update-develop-with-last-changes.1
- frontend/src - v0.1.0-update-develop-with-last-changes.1
- frontend/tailwind - v0.1.0-update-develop-with-last-changes.1
"" + + +## ReadMe and docs +- Provide clearer instructions and guidance for the setup process. +- Provide more options to setup the project. + +## For the frontend, the following updates are required: +- Fix the bug that renames conversations. +- Improve the responsiveness of the sidebar. +- Redesign the layout. +- Change the color scheme to a more visually appealing one, incorporating colors from the BCG X palette. +- Implement collapsible conversations in the sidebar. +- Develop a compact version of the sidebar for when it is collapsed. +- Enhance the functionality by adding additional tools such as JSON, YAML, and Plotly for graphing. +- Change the appearance of the Empty view page.",frontend/src/pages/auth/signin.tsx +28f5b300a0e08a2cd16679085529ef3510fc9087,06-23-2023 14:52:43,GitHub Enterprise,"Update/develop with last changes (#22) + +""## impact surface
- frontend/ - v0.1.0-update-develop-with-last-changes.1
- frontend/Dockerfile - v0.1.0-update-develop-with-last-changes.1
- frontend/next - v0.1.0-update-develop-with-last-changes.1
- frontend/src - v0.1.0-update-develop-with-last-changes.1
- frontend/tailwind - v0.1.0-update-develop-with-last-changes.1
"" + + +## ReadMe and docs +- Provide clearer instructions and guidance for the setup process. +- Provide more options to setup the project. + +## For the frontend, the following updates are required: +- Fix the bug that renames conversations. +- Improve the responsiveness of the sidebar. +- Redesign the layout. +- Change the color scheme to a more visually appealing one, incorporating colors from the BCG X palette. +- Implement collapsible conversations in the sidebar. +- Develop a compact version of the sidebar for when it is collapsed. +- Enhance the functionality by adding additional tools such as JSON, YAML, and Plotly for graphing. +- Change the appearance of the Empty view page.",frontend/src/pages/index.tsx +28f5b300a0e08a2cd16679085529ef3510fc9087,06-23-2023 14:52:43,GitHub Enterprise,"Update/develop with last changes (#22) + +""## impact surface
- frontend/ - v0.1.0-update-develop-with-last-changes.1
- frontend/Dockerfile - v0.1.0-update-develop-with-last-changes.1
- frontend/next - v0.1.0-update-develop-with-last-changes.1
- frontend/src - v0.1.0-update-develop-with-last-changes.1
- frontend/tailwind - v0.1.0-update-develop-with-last-changes.1
"" + + +## ReadMe and docs +- Provide clearer instructions and guidance for the setup process. +- Provide more options to setup the project. + +## For the frontend, the following updates are required: +- Fix the bug that renames conversations. +- Improve the responsiveness of the sidebar. +- Redesign the layout. +- Change the color scheme to a more visually appealing one, incorporating colors from the BCG X palette. +- Implement collapsible conversations in the sidebar. +- Develop a compact version of the sidebar for when it is collapsed. +- Enhance the functionality by adding additional tools such as JSON, YAML, and Plotly for graphing. +- Change the appearance of the Empty view page.",frontend/src/styles/data-table.css +28f5b300a0e08a2cd16679085529ef3510fc9087,06-23-2023 14:52:43,GitHub Enterprise,"Update/develop with last changes (#22) + +""## impact surface
- frontend/ - v0.1.0-update-develop-with-last-changes.1
- frontend/Dockerfile - v0.1.0-update-develop-with-last-changes.1
- frontend/next - v0.1.0-update-develop-with-last-changes.1
- frontend/src - v0.1.0-update-develop-with-last-changes.1
- frontend/tailwind - v0.1.0-update-develop-with-last-changes.1
"" + + +## ReadMe and docs +- Provide clearer instructions and guidance for the setup process. +- Provide more options to setup the project. + +## For the frontend, the following updates are required: +- Fix the bug that renames conversations. +- Improve the responsiveness of the sidebar. +- Redesign the layout. +- Change the color scheme to a more visually appealing one, incorporating colors from the BCG X palette. +- Implement collapsible conversations in the sidebar. +- Develop a compact version of the sidebar for when it is collapsed. +- Enhance the functionality by adding additional tools such as JSON, YAML, and Plotly for graphing. +- Change the appearance of the Empty view page.",frontend/src/styles/tailwind.css +28f5b300a0e08a2cd16679085529ef3510fc9087,06-23-2023 14:52:43,GitHub Enterprise,"Update/develop with last changes (#22) + +""## impact surface
- frontend/ - v0.1.0-update-develop-with-last-changes.1
- frontend/Dockerfile - v0.1.0-update-develop-with-last-changes.1
- frontend/next - v0.1.0-update-develop-with-last-changes.1
- frontend/src - v0.1.0-update-develop-with-last-changes.1
- frontend/tailwind - v0.1.0-update-develop-with-last-changes.1
"" + + +## ReadMe and docs +- Provide clearer instructions and guidance for the setup process. +- Provide more options to setup the project. + +## For the frontend, the following updates are required: +- Fix the bug that renames conversations. +- Improve the responsiveness of the sidebar. +- Redesign the layout. +- Change the color scheme to a more visually appealing one, incorporating colors from the BCG X palette. +- Implement collapsible conversations in the sidebar. +- Develop a compact version of the sidebar for when it is collapsed. +- Enhance the functionality by adding additional tools such as JSON, YAML, and Plotly for graphing. +- Change the appearance of the Empty view page.",frontend/src/types/common.ts +28f5b300a0e08a2cd16679085529ef3510fc9087,06-23-2023 14:52:43,GitHub Enterprise,"Update/develop with last changes (#22) + +""## impact surface
- frontend/ - v0.1.0-update-develop-with-last-changes.1
- frontend/Dockerfile - v0.1.0-update-develop-with-last-changes.1
- frontend/next - v0.1.0-update-develop-with-last-changes.1
- frontend/src - v0.1.0-update-develop-with-last-changes.1
- frontend/tailwind - v0.1.0-update-develop-with-last-changes.1
"" + + +## ReadMe and docs +- Provide clearer instructions and guidance for the setup process. +- Provide more options to setup the project. + +## For the frontend, the following updates are required: +- Fix the bug that renames conversations. +- Improve the responsiveness of the sidebar. +- Redesign the layout. +- Change the color scheme to a more visually appealing one, incorporating colors from the BCG X palette. +- Implement collapsible conversations in the sidebar. +- Develop a compact version of the sidebar for when it is collapsed. +- Enhance the functionality by adding additional tools such as JSON, YAML, and Plotly for graphing. +- Change the appearance of the Empty view page.",frontend/tailwind.config.ts +74e1f0d3363811b9ec92036bcc59e53143af56e1,06-27-2023 13:48:46,Casper van Langen,working changes,README.md +74e1f0d3363811b9ec92036bcc59e53143af56e1,06-27-2023 13:48:46,Casper van Langen,working changes,docker-compose-dev.yml +74e1f0d3363811b9ec92036bcc59e53143af56e1,06-27-2023 13:48:46,Casper van Langen,working changes,docs/tools/pdf_tool.md +74e1f0d3363811b9ec92036bcc59e53143af56e1,06-27-2023 13:48:46,Casper van Langen,working changes,docs/tools/sql_tool.md +74e1f0d3363811b9ec92036bcc59e53143af56e1,06-27-2023 13:48:46,Casper van Langen,working changes,docs/tools_howto/template_tool.py +74e1f0d3363811b9ec92036bcc59e53143af56e1,06-27-2023 13:48:46,Casper van Langen,working changes,docs/tools_howto/tools_setup.md +04b2bae2633d2b9e7798b1b101783d003c0fd734,06-27-2023 15:58:18,GitHub Enterprise,"Draft contribution guidelines (#19) + +""## impact surface
- frontend/ - v0.1.0-contribution-guidelines.1
- frontend/Dockerfile - v0.1.0-contribution-guidelines.1
- frontend/next - v0.1.0-contribution-guidelines.1
- frontend/src - v0.1.0-contribution-guidelines.1
- frontend/tailwind - v0.1.0-contribution-guidelines.1
"" + + + +Open points for discussion @heyder-jakob: +1) Can we track teams using the codebase through forks, or do we need a more formal method? +2) How do we store our 'library of tools'? We could store it in a folder in `develop` with perhaps a readme per key tool, but @AitBaali-Hamza suggested a cleaner way could be to store them in a separate folder on SP or a separate repo.",CONTRIBUTING.md +04b2bae2633d2b9e7798b1b101783d003c0fd734,06-27-2023 15:58:18,GitHub Enterprise,"Draft contribution guidelines (#19) + +""## impact surface
- frontend/ - v0.1.0-contribution-guidelines.1
- frontend/Dockerfile - v0.1.0-contribution-guidelines.1
- frontend/next - v0.1.0-contribution-guidelines.1
- frontend/src - v0.1.0-contribution-guidelines.1
- frontend/tailwind - v0.1.0-contribution-guidelines.1
"" + + + +Open points for discussion @heyder-jakob: +1) Can we track teams using the codebase through forks, or do we need a more formal method? +2) How do we store our 'library of tools'? We could store it in a folder in `develop` with perhaps a readme per key tool, but @AitBaali-Hamza suggested a cleaner way could be to store them in a separate folder on SP or a separate repo.",README.md +ecabd2c96a173e050bb11b6a2d7975ec912bf960,06-28-2023 12:22:02,Casper van Langen,"Caddy fix, API key default fix",.env.example +ecabd2c96a173e050bb11b6a2d7975ec912bf960,06-28-2023 12:22:02,Casper van Langen,"Caddy fix, API key default fix",.env.example.dev +ecabd2c96a173e050bb11b6a2d7975ec912bf960,06-28-2023 12:22:02,Casper van Langen,"Caddy fix, API key default fix",.env.example.local +ecabd2c96a173e050bb11b6a2d7975ec912bf960,06-28-2023 12:22:02,Casper van Langen,"Caddy fix, API key default fix",backend/app/app/services/chat_agent/helpers/llm.py +ecabd2c96a173e050bb11b6a2d7975ec912bf960,06-28-2023 12:22:02,Casper van Langen,"Caddy fix, API key default fix",backend/app/app/services/chat_agent/tools/library/sql_tool/sql_tool.py +ecabd2c96a173e050bb11b6a2d7975ec912bf960,06-28-2023 12:22:02,Casper van Langen,"Caddy fix, API key default fix",caddy/Caddyfile +ecabd2c96a173e050bb11b6a2d7975ec912bf960,06-28-2023 12:22:02,Casper van Langen,"Caddy fix, API key default fix",docker-compose-dev.yml +ecabd2c96a173e050bb11b6a2d7975ec912bf960,06-28-2023 12:22:02,Casper van Langen,"Caddy fix, API key default fix",docker-compose-local.yml +ecabd2c96a173e050bb11b6a2d7975ec912bf960,06-28-2023 12:22:02,Casper van Langen,"Caddy fix, API key default fix",docker-compose.yml +ecabd2c96a173e050bb11b6a2d7975ec912bf960,06-28-2023 12:22:02,Casper van Langen,"Caddy fix, API key default fix",frontend/.env.example +ecabd2c96a173e050bb11b6a2d7975ec912bf960,06-28-2023 12:22:02,Casper van Langen,"Caddy fix, API key default fix",frontend/.env.example.dev +5fa2d861da7e78fbc07072f16c6af510e9078d86,06-28-2023 12:27:18,Casper van Langen,small readme update,README.md +2478b78be6feedb3ab180dd4d36aa6521ae25ff2,06-28-2023 13:35:17,Casper van Langen,doc working changes,backend/app/app/db/vector_db_pdf_ingestion.py +2478b78be6feedb3ab180dd4d36aa6521ae25ff2,06-28-2023 13:35:17,Casper van Langen,doc working changes,docs/tools/sql_tool.md +8b93a3f2495d64ae7689cae0b767023ccd0f3d15,06-28-2023 13:36:46,Casper van Langen,merge develop in,.env.example +8b93a3f2495d64ae7689cae0b767023ccd0f3d15,06-28-2023 13:36:46,Casper van Langen,merge develop in,.env.example.dev +8b93a3f2495d64ae7689cae0b767023ccd0f3d15,06-28-2023 13:36:46,Casper van Langen,merge develop in,.env.example.local +8b93a3f2495d64ae7689cae0b767023ccd0f3d15,06-28-2023 13:36:46,Casper van Langen,merge develop in,CONTRIBUTING.md +8b93a3f2495d64ae7689cae0b767023ccd0f3d15,06-28-2023 13:36:46,Casper van Langen,merge develop in,README.md +8b93a3f2495d64ae7689cae0b767023ccd0f3d15,06-28-2023 13:36:46,Casper van Langen,merge develop in,docker-compose-dev.yml +8b93a3f2495d64ae7689cae0b767023ccd0f3d15,06-28-2023 13:36:46,Casper van Langen,merge develop in,docker-compose-local.yml +8b93a3f2495d64ae7689cae0b767023ccd0f3d15,06-28-2023 13:36:46,Casper van Langen,merge develop in,docker-compose.yml +8b93a3f2495d64ae7689cae0b767023ccd0f3d15,06-28-2023 13:36:46,Casper van Langen,merge develop in,frontend/.env.example +8b93a3f2495d64ae7689cae0b767023ccd0f3d15,06-28-2023 13:36:46,Casper van Langen,merge develop in,frontend/.env.example.dev +8b93a3f2495d64ae7689cae0b767023ccd0f3d15,06-28-2023 13:36:46,Casper van Langen,merge develop in,frontend/Dockerfile +8b93a3f2495d64ae7689cae0b767023ccd0f3d15,06-28-2023 13:36:46,Casper van Langen,merge develop in,frontend/next.config.mjs +8b93a3f2495d64ae7689cae0b767023ccd0f3d15,06-28-2023 13:36:46,Casper van Langen,merge develop in,frontend/src/components/CodeView/SideDrawer/ExecutionWarningBanner.tsx +8b93a3f2495d64ae7689cae0b767023ccd0f3d15,06-28-2023 13:36:46,Casper van Langen,merge develop in,frontend/src/components/Common/Modal.tsx +8b93a3f2495d64ae7689cae0b767023ccd0f3d15,06-28-2023 13:36:46,Casper van Langen,merge develop in,frontend/src/components/Common/Select.tsx +8b93a3f2495d64ae7689cae0b767023ccd0f3d15,06-28-2023 13:36:46,Casper van Langen,merge develop in,frontend/src/components/Common/TextField.tsx +8b93a3f2495d64ae7689cae0b767023ccd0f3d15,06-28-2023 13:36:46,Casper van Langen,merge develop in,frontend/src/components/ConversationView/ClearConversationButton/index.tsx +8b93a3f2495d64ae7689cae0b767023ccd0f3d15,06-28-2023 13:36:46,Casper van Langen,merge develop in,frontend/src/components/ConversationView/EmptyView.tsx +8b93a3f2495d64ae7689cae0b767023ccd0f3d15,06-28-2023 13:36:46,Casper van Langen,merge develop in,frontend/src/components/ConversationView/Header.tsx +8b93a3f2495d64ae7689cae0b767023ccd0f3d15,06-28-2023 13:36:46,Casper van Langen,merge develop in,frontend/src/components/ConversationView/MessageTextarea.tsx +8b93a3f2495d64ae7689cae0b767023ccd0f3d15,06-28-2023 13:36:46,Casper van Langen,merge develop in,frontend/src/components/ConversationView/MessageView/index.tsx +8b93a3f2495d64ae7689cae0b767023ccd0f3d15,06-28-2023 13:36:46,Casper van Langen,merge develop in,frontend/src/components/ConversationView/index.tsx +8b93a3f2495d64ae7689cae0b767023ccd0f3d15,06-28-2023 13:36:46,Casper van Langen,merge develop in,frontend/src/components/CustomIcons/BcgX.tsx +8b93a3f2495d64ae7689cae0b767023ccd0f3d15,06-28-2023 13:36:46,Casper van Langen,merge develop in,frontend/src/components/CustomIcons/Icon.tsx +8b93a3f2495d64ae7689cae0b767023ccd0f3d15,06-28-2023 13:36:46,Casper van Langen,merge develop in,frontend/src/components/CustomIcons/MainLogo.tsx +8b93a3f2495d64ae7689cae0b767023ccd0f3d15,06-28-2023 13:36:46,Casper van Langen,merge develop in,frontend/src/components/Sidebar/DarkmodeSwitch.tsx +8b93a3f2495d64ae7689cae0b767023ccd0f3d15,06-28-2023 13:36:46,Casper van Langen,merge develop in,frontend/src/components/Sidebar/DataStorageBanner.tsx +8b93a3f2495d64ae7689cae0b767023ccd0f3d15,06-28-2023 13:36:46,Casper van Langen,merge develop in,frontend/src/components/Sidebar/OpenCloseButton.tsx +8b93a3f2495d64ae7689cae0b767023ccd0f3d15,06-28-2023 13:36:46,Casper van Langen,merge develop in,frontend/src/components/Sidebar/SettingsModal.tsx +8b93a3f2495d64ae7689cae0b767023ccd0f3d15,06-28-2023 13:36:46,Casper van Langen,merge develop in,frontend/src/components/Sidebar/UpdateConversationModal.tsx +8b93a3f2495d64ae7689cae0b767023ccd0f3d15,06-28-2023 13:36:46,Casper van Langen,merge develop in,frontend/src/components/Sidebar/index.tsx +8b93a3f2495d64ae7689cae0b767023ccd0f3d15,06-28-2023 13:36:46,Casper van Langen,merge develop in,frontend/src/components/ToolAppendixRenderer/index.tsx +8b93a3f2495d64ae7689cae0b767023ccd0f3d15,06-28-2023 13:36:46,Casper van Langen,merge develop in,frontend/src/components/ToolAppendixRenderer/library/CodeFlipCard/PlotlyDisplay.tsx +8b93a3f2495d64ae7689cae0b767023ccd0f3d15,06-28-2023 13:36:46,Casper van Langen,merge develop in,frontend/src/components/ToolAppendixRenderer/library/CodeFlipCard/ResultsView.tsx +8b93a3f2495d64ae7689cae0b767023ccd0f3d15,06-28-2023 13:36:46,Casper van Langen,merge develop in,frontend/src/components/ToolAppendixRenderer/library/CodeFlipCard/TextAreaEditor.tsx +8b93a3f2495d64ae7689cae0b767023ccd0f3d15,06-28-2023 13:36:46,Casper van Langen,merge develop in,frontend/src/components/ToolAppendixRenderer/library/CodeFlipCard/index.tsx +8b93a3f2495d64ae7689cae0b767023ccd0f3d15,06-28-2023 13:36:46,Casper van Langen,merge develop in,frontend/src/pages/auth/signin.tsx +8b93a3f2495d64ae7689cae0b767023ccd0f3d15,06-28-2023 13:36:46,Casper van Langen,merge develop in,frontend/src/pages/index.tsx +8b93a3f2495d64ae7689cae0b767023ccd0f3d15,06-28-2023 13:36:46,Casper van Langen,merge develop in,frontend/src/styles/data-table.css +8b93a3f2495d64ae7689cae0b767023ccd0f3d15,06-28-2023 13:36:46,Casper van Langen,merge develop in,frontend/src/styles/tailwind.css +8b93a3f2495d64ae7689cae0b767023ccd0f3d15,06-28-2023 13:36:46,Casper van Langen,merge develop in,frontend/src/types/common.ts +8b93a3f2495d64ae7689cae0b767023ccd0f3d15,06-28-2023 13:36:46,Casper van Langen,merge develop in,frontend/tailwind.config.ts +ec6dffeeb15472b4a15e39a416fd7c596311d5b8,06-28-2023 15:11:06,Casper van Langen,small update,backend/app/app/db/vector_db_pdf_ingestion.py +ec6dffeeb15472b4a15e39a416fd7c596311d5b8,06-28-2023 15:11:06,Casper van Langen,small update,docs/tools/pdf_tool.md +ec6dffeeb15472b4a15e39a416fd7c596311d5b8,06-28-2023 15:11:06,Casper van Langen,small update,docs/tools/sql_tool.md +e19189b08f7e0ee05a0eb738b5a56b814b70f7f2,06-28-2023 15:43:04,Casper van Langen,"Agent setup docs, split setup from readme",README.md +e19189b08f7e0ee05a0eb738b5a56b814b70f7f2,06-28-2023 15:43:04,Casper van Langen,"Agent setup docs, split setup from readme",docs/agent/agent_setup.md +e19189b08f7e0ee05a0eb738b5a56b814b70f7f2,06-28-2023 15:43:04,Casper van Langen,"Agent setup docs, split setup from readme",docs/tools/tools_setup.md +210d2980e4e30cbcd4a0da22ff9401650ef6b368,06-29-2023 10:23:48,Casper van Langen,"sql tool URI schema, database host for mac",.env.example +210d2980e4e30cbcd4a0da22ff9401650ef6b368,06-29-2023 10:23:48,Casper van Langen,"sql tool URI schema, database host for mac",.env.example.dev +210d2980e4e30cbcd4a0da22ff9401650ef6b368,06-29-2023 10:23:48,Casper van Langen,"sql tool URI schema, database host for mac",.env.example.local +2a0c4087f1d5ee179e7eb9fdfdf01e3bb81ab5ea,06-29-2023 10:30:45,Casper van Langen,markdown links,README.md +17068537099276aaae52be1fe155eb8b5902221c,06-29-2023 10:33:09,Casper van Langen,minor update to sql_tool readme,docs/tools/sql_tool.md +361135f6c8920365e275eb0a55e881df3cf352b0,06-29-2023 10:33:24,GitHub Enterprise,"Merge pull request #23 from genAI/tools_documentation + +Tools documentation",README.md +361135f6c8920365e275eb0a55e881df3cf352b0,06-29-2023 10:33:24,GitHub Enterprise,"Merge pull request #23 from genAI/tools_documentation + +Tools documentation",backend/app/app/config/agent.yml +361135f6c8920365e275eb0a55e881df3cf352b0,06-29-2023 10:33:24,GitHub Enterprise,"Merge pull request #23 from genAI/tools_documentation + +Tools documentation",backend/app/app/db/vector_db_pdf_ingestion.py +361135f6c8920365e275eb0a55e881df3cf352b0,06-29-2023 10:33:24,GitHub Enterprise,"Merge pull request #23 from genAI/tools_documentation + +Tools documentation",docker-compose-dev.yml +361135f6c8920365e275eb0a55e881df3cf352b0,06-29-2023 10:33:24,GitHub Enterprise,"Merge pull request #23 from genAI/tools_documentation + +Tools documentation",docs/agent/agent_setup.md +361135f6c8920365e275eb0a55e881df3cf352b0,06-29-2023 10:33:24,GitHub Enterprise,"Merge pull request #23 from genAI/tools_documentation + +Tools documentation",docs/tools/pdf_tool.md +361135f6c8920365e275eb0a55e881df3cf352b0,06-29-2023 10:33:24,GitHub Enterprise,"Merge pull request #23 from genAI/tools_documentation + +Tools documentation",docs/tools/sql_tool.md +361135f6c8920365e275eb0a55e881df3cf352b0,06-29-2023 10:33:24,GitHub Enterprise,"Merge pull request #23 from genAI/tools_documentation + +Tools documentation",docs/tools/template_tool.py +361135f6c8920365e275eb0a55e881df3cf352b0,06-29-2023 10:33:24,GitHub Enterprise,"Merge pull request #23 from genAI/tools_documentation + +Tools documentation",docs/tools/tools_setup.md +3af401c58170f7d188277e4c67f869f97cd7f6c7,06-29-2023 11:59:03,Casper van Langen,sql script directory,docker-compose-local.yml +3af401c58170f7d188277e4c67f869f97cd7f6c7,06-29-2023 11:59:03,Casper van Langen,sql script directory,scripts/chinook_psql_load.sql +4e3fd0a9fb8ea70109c339a17c01c3a22046e08a,06-29-2023 13:47:46,Casper van Langen,breaking change for me,.env.example +4e3fd0a9fb8ea70109c339a17c01c3a22046e08a,06-29-2023 13:47:46,Casper van Langen,breaking change for me,.env.example.dev +4e3fd0a9fb8ea70109c339a17c01c3a22046e08a,06-29-2023 13:47:46,Casper van Langen,breaking change for me,.env.example.local +a615ddb0afd80193ee439f56c612a35c57153348,06-29-2023 13:48:47,Casper van Langen,forgot to add setup in readme PR,setup.md +fda7d70b369334b711742afbf75095acef5a1ab8,06-29-2023 18:12:14,GitHub Enterprise,Update docker-compose-local.yml,docker-compose-local.yml +2c6b82fb72997223b9a5a65e83e358d7ba89c510,06-29-2023 18:12:30,GitHub Enterprise,Update docker-compose-dev.yml,docker-compose-dev.yml +66620f54f531d530df61a8adb623c4ae6791c914,06-29-2023 18:12:50,GitHub Enterprise,Update docker-compose.yml,docker-compose.yml +1d6965c707553741302a530544e4caa5ea37b51d,06-30-2023 10:19:00,Casper van Langen,"cleaned up example .env, added note for mac users",.env.example +1d6965c707553741302a530544e4caa5ea37b51d,06-30-2023 10:19:00,Casper van Langen,"cleaned up example .env, added note for mac users",.env.example.dev +1d6965c707553741302a530544e4caa5ea37b51d,06-30-2023 10:19:00,Casper van Langen,"cleaned up example .env, added note for mac users",.env.example.local +1d6965c707553741302a530544e4caa5ea37b51d,06-30-2023 10:19:00,Casper van Langen,"cleaned up example .env, added note for mac users",frontend/.env.example +1d6965c707553741302a530544e4caa5ea37b51d,06-30-2023 10:19:00,Casper van Langen,"cleaned up example .env, added note for mac users",frontend/.env.example.dev +77741ff1b1f30e6079c3deac91bb72c876fc38c2,06-30-2023 14:51:01,GitHub Enterprise,"add evaluation framework (#27) + +""## impact surface
- frontend/Dockerfile - v0.1.0-ft-eval-framework.1
- frontend/custom_typings - v0.1.0-ft-eval-framework.1
- frontend/next.config.mjs - v0.1.0-ft-eval-framework.1
- frontend/package.json - v0.1.0-ft-eval-framework.1
- frontend/pnpm-lock.yaml - v0.1.0-ft-eval-framework.1
- frontend/postcss.config.cjs - v0.1.0-ft-eval-framework.1
- frontend/prettier.config.cjs - v0.1.0-ft-eval-framework.1
- frontend/prisma - v0.1.0-ft-eval-framework.1
- frontend/prismalib - v0.1.0-ft-eval-framework.1
- frontend/public - v0.1.0-ft-eval-framework.1
- frontend/src - v0.1.0-ft-eval-framework.1
- frontend/tailwind.config.ts - v0.1.0-ft-eval-framework.1
- frontend/tsconfig.json - v0.1.0-ft-eval-framework.1
"" + + + +1. **Meta-agent - Action Plan Selection**: This evaluates the meta agent's ability to choose the correct action plans. +2. **Tool - Simple QA Evaluation (Right Answer Questions)**: This evaluates simple questions where there is a definitive correct answer. +3. **Tool - Analysis Evaluation (Qualitative Questions)**: This evaluates “summary” or “explanation” type questions where a correct answer contains specific elements. + +This notebook is intended to serve as an inspiration/example of how you can evaluate your tools. You need to add your own eval Qs and edit the prompts for the code to work",experimental/evaluation/data/ConversationId.png +77741ff1b1f30e6079c3deac91bb72c876fc38c2,06-30-2023 14:51:01,GitHub Enterprise,"add evaluation framework (#27) + +""## impact surface
- frontend/Dockerfile - v0.1.0-ft-eval-framework.1
- frontend/custom_typings - v0.1.0-ft-eval-framework.1
- frontend/next.config.mjs - v0.1.0-ft-eval-framework.1
- frontend/package.json - v0.1.0-ft-eval-framework.1
- frontend/pnpm-lock.yaml - v0.1.0-ft-eval-framework.1
- frontend/postcss.config.cjs - v0.1.0-ft-eval-framework.1
- frontend/prettier.config.cjs - v0.1.0-ft-eval-framework.1
- frontend/prisma - v0.1.0-ft-eval-framework.1
- frontend/prismalib - v0.1.0-ft-eval-framework.1
- frontend/public - v0.1.0-ft-eval-framework.1
- frontend/src - v0.1.0-ft-eval-framework.1
- frontend/tailwind.config.ts - v0.1.0-ft-eval-framework.1
- frontend/tsconfig.json - v0.1.0-ft-eval-framework.1
"" + + + +1. **Meta-agent - Action Plan Selection**: This evaluates the meta agent's ability to choose the correct action plans. +2. **Tool - Simple QA Evaluation (Right Answer Questions)**: This evaluates simple questions where there is a definitive correct answer. +3. **Tool - Analysis Evaluation (Qualitative Questions)**: This evaluates “summary” or “explanation” type questions where a correct answer contains specific elements. + +This notebook is intended to serve as an inspiration/example of how you can evaluate your tools. You need to add your own eval Qs and edit the prompts for the code to work",experimental/evaluation/data/meta_agent_eval_qs.csv +77741ff1b1f30e6079c3deac91bb72c876fc38c2,06-30-2023 14:51:01,GitHub Enterprise,"add evaluation framework (#27) + +""## impact surface
- frontend/Dockerfile - v0.1.0-ft-eval-framework.1
- frontend/custom_typings - v0.1.0-ft-eval-framework.1
- frontend/next.config.mjs - v0.1.0-ft-eval-framework.1
- frontend/package.json - v0.1.0-ft-eval-framework.1
- frontend/pnpm-lock.yaml - v0.1.0-ft-eval-framework.1
- frontend/postcss.config.cjs - v0.1.0-ft-eval-framework.1
- frontend/prettier.config.cjs - v0.1.0-ft-eval-framework.1
- frontend/prisma - v0.1.0-ft-eval-framework.1
- frontend/prismalib - v0.1.0-ft-eval-framework.1
- frontend/public - v0.1.0-ft-eval-framework.1
- frontend/src - v0.1.0-ft-eval-framework.1
- frontend/tailwind.config.ts - v0.1.0-ft-eval-framework.1
- frontend/tsconfig.json - v0.1.0-ft-eval-framework.1
"" + + + +1. **Meta-agent - Action Plan Selection**: This evaluates the meta agent's ability to choose the correct action plans. +2. **Tool - Simple QA Evaluation (Right Answer Questions)**: This evaluates simple questions where there is a definitive correct answer. +3. **Tool - Analysis Evaluation (Qualitative Questions)**: This evaluates “summary” or “explanation” type questions where a correct answer contains specific elements. + +This notebook is intended to serve as an inspiration/example of how you can evaluate your tools. You need to add your own eval Qs and edit the prompts for the code to work",experimental/evaluation/data/simple_qa_eval.csv +77741ff1b1f30e6079c3deac91bb72c876fc38c2,06-30-2023 14:51:01,GitHub Enterprise,"add evaluation framework (#27) + +""## impact surface
- frontend/Dockerfile - v0.1.0-ft-eval-framework.1
- frontend/custom_typings - v0.1.0-ft-eval-framework.1
- frontend/next.config.mjs - v0.1.0-ft-eval-framework.1
- frontend/package.json - v0.1.0-ft-eval-framework.1
- frontend/pnpm-lock.yaml - v0.1.0-ft-eval-framework.1
- frontend/postcss.config.cjs - v0.1.0-ft-eval-framework.1
- frontend/prettier.config.cjs - v0.1.0-ft-eval-framework.1
- frontend/prisma - v0.1.0-ft-eval-framework.1
- frontend/prismalib - v0.1.0-ft-eval-framework.1
- frontend/public - v0.1.0-ft-eval-framework.1
- frontend/src - v0.1.0-ft-eval-framework.1
- frontend/tailwind.config.ts - v0.1.0-ft-eval-framework.1
- frontend/tsconfig.json - v0.1.0-ft-eval-framework.1
"" + + + +1. **Meta-agent - Action Plan Selection**: This evaluates the meta agent's ability to choose the correct action plans. +2. **Tool - Simple QA Evaluation (Right Answer Questions)**: This evaluates simple questions where there is a definitive correct answer. +3. **Tool - Analysis Evaluation (Qualitative Questions)**: This evaluates “summary” or “explanation” type questions where a correct answer contains specific elements. + +This notebook is intended to serve as an inspiration/example of how you can evaluate your tools. You need to add your own eval Qs and edit the prompts for the code to work",experimental/evaluation/eval.py +77741ff1b1f30e6079c3deac91bb72c876fc38c2,06-30-2023 14:51:01,GitHub Enterprise,"add evaluation framework (#27) + +""## impact surface
- frontend/Dockerfile - v0.1.0-ft-eval-framework.1
- frontend/custom_typings - v0.1.0-ft-eval-framework.1
- frontend/next.config.mjs - v0.1.0-ft-eval-framework.1
- frontend/package.json - v0.1.0-ft-eval-framework.1
- frontend/pnpm-lock.yaml - v0.1.0-ft-eval-framework.1
- frontend/postcss.config.cjs - v0.1.0-ft-eval-framework.1
- frontend/prettier.config.cjs - v0.1.0-ft-eval-framework.1
- frontend/prisma - v0.1.0-ft-eval-framework.1
- frontend/prismalib - v0.1.0-ft-eval-framework.1
- frontend/public - v0.1.0-ft-eval-framework.1
- frontend/src - v0.1.0-ft-eval-framework.1
- frontend/tailwind.config.ts - v0.1.0-ft-eval-framework.1
- frontend/tsconfig.json - v0.1.0-ft-eval-framework.1
"" + + + +1. **Meta-agent - Action Plan Selection**: This evaluates the meta agent's ability to choose the correct action plans. +2. **Tool - Simple QA Evaluation (Right Answer Questions)**: This evaluates simple questions where there is a definitive correct answer. +3. **Tool - Analysis Evaluation (Qualitative Questions)**: This evaluates “summary” or “explanation” type questions where a correct answer contains specific elements. + +This notebook is intended to serve as an inspiration/example of how you can evaluate your tools. You need to add your own eval Qs and edit the prompts for the code to work",experimental/evaluation/evaluation.ipynb +77741ff1b1f30e6079c3deac91bb72c876fc38c2,06-30-2023 14:51:01,GitHub Enterprise,"add evaluation framework (#27) + +""## impact surface
- frontend/Dockerfile - v0.1.0-ft-eval-framework.1
- frontend/custom_typings - v0.1.0-ft-eval-framework.1
- frontend/next.config.mjs - v0.1.0-ft-eval-framework.1
- frontend/package.json - v0.1.0-ft-eval-framework.1
- frontend/pnpm-lock.yaml - v0.1.0-ft-eval-framework.1
- frontend/postcss.config.cjs - v0.1.0-ft-eval-framework.1
- frontend/prettier.config.cjs - v0.1.0-ft-eval-framework.1
- frontend/prisma - v0.1.0-ft-eval-framework.1
- frontend/prismalib - v0.1.0-ft-eval-framework.1
- frontend/public - v0.1.0-ft-eval-framework.1
- frontend/src - v0.1.0-ft-eval-framework.1
- frontend/tailwind.config.ts - v0.1.0-ft-eval-framework.1
- frontend/tsconfig.json - v0.1.0-ft-eval-framework.1
"" + + + +1. **Meta-agent - Action Plan Selection**: This evaluates the meta agent's ability to choose the correct action plans. +2. **Tool - Simple QA Evaluation (Right Answer Questions)**: This evaluates simple questions where there is a definitive correct answer. +3. **Tool - Analysis Evaluation (Qualitative Questions)**: This evaluates “summary” or “explanation” type questions where a correct answer contains specific elements. + +This notebook is intended to serve as an inspiration/example of how you can evaluate your tools. You need to add your own eval Qs and edit the prompts for the code to work",experimental/evaluation/post_processing.py +77741ff1b1f30e6079c3deac91bb72c876fc38c2,06-30-2023 14:51:01,GitHub Enterprise,"add evaluation framework (#27) + +""## impact surface
- frontend/Dockerfile - v0.1.0-ft-eval-framework.1
- frontend/custom_typings - v0.1.0-ft-eval-framework.1
- frontend/next.config.mjs - v0.1.0-ft-eval-framework.1
- frontend/package.json - v0.1.0-ft-eval-framework.1
- frontend/pnpm-lock.yaml - v0.1.0-ft-eval-framework.1
- frontend/postcss.config.cjs - v0.1.0-ft-eval-framework.1
- frontend/prettier.config.cjs - v0.1.0-ft-eval-framework.1
- frontend/prisma - v0.1.0-ft-eval-framework.1
- frontend/prismalib - v0.1.0-ft-eval-framework.1
- frontend/public - v0.1.0-ft-eval-framework.1
- frontend/src - v0.1.0-ft-eval-framework.1
- frontend/tailwind.config.ts - v0.1.0-ft-eval-framework.1
- frontend/tsconfig.json - v0.1.0-ft-eval-framework.1
"" + + + +1. **Meta-agent - Action Plan Selection**: This evaluates the meta agent's ability to choose the correct action plans. +2. **Tool - Simple QA Evaluation (Right Answer Questions)**: This evaluates simple questions where there is a definitive correct answer. +3. **Tool - Analysis Evaluation (Qualitative Questions)**: This evaluates “summary” or “explanation” type questions where a correct answer contains specific elements. + +This notebook is intended to serve as an inspiration/example of how you can evaluate your tools. You need to add your own eval Qs and edit the prompts for the code to work",experimental/evaluation/pre_processing.py +77741ff1b1f30e6079c3deac91bb72c876fc38c2,06-30-2023 14:51:01,GitHub Enterprise,"add evaluation framework (#27) + +""## impact surface
- frontend/Dockerfile - v0.1.0-ft-eval-framework.1
- frontend/custom_typings - v0.1.0-ft-eval-framework.1
- frontend/next.config.mjs - v0.1.0-ft-eval-framework.1
- frontend/package.json - v0.1.0-ft-eval-framework.1
- frontend/pnpm-lock.yaml - v0.1.0-ft-eval-framework.1
- frontend/postcss.config.cjs - v0.1.0-ft-eval-framework.1
- frontend/prettier.config.cjs - v0.1.0-ft-eval-framework.1
- frontend/prisma - v0.1.0-ft-eval-framework.1
- frontend/prismalib - v0.1.0-ft-eval-framework.1
- frontend/public - v0.1.0-ft-eval-framework.1
- frontend/src - v0.1.0-ft-eval-framework.1
- frontend/tailwind.config.ts - v0.1.0-ft-eval-framework.1
- frontend/tsconfig.json - v0.1.0-ft-eval-framework.1
"" + + + +1. **Meta-agent - Action Plan Selection**: This evaluates the meta agent's ability to choose the correct action plans. +2. **Tool - Simple QA Evaluation (Right Answer Questions)**: This evaluates simple questions where there is a definitive correct answer. +3. **Tool - Analysis Evaluation (Qualitative Questions)**: This evaluates “summary” or “explanation” type questions where a correct answer contains specific elements. + +This notebook is intended to serve as an inspiration/example of how you can evaluate your tools. You need to add your own eval Qs and edit the prompts for the code to work",experimental/evaluation/results/meta.xlsx +77741ff1b1f30e6079c3deac91bb72c876fc38c2,06-30-2023 14:51:01,GitHub Enterprise,"add evaluation framework (#27) + +""## impact surface
- frontend/Dockerfile - v0.1.0-ft-eval-framework.1
- frontend/custom_typings - v0.1.0-ft-eval-framework.1
- frontend/next.config.mjs - v0.1.0-ft-eval-framework.1
- frontend/package.json - v0.1.0-ft-eval-framework.1
- frontend/pnpm-lock.yaml - v0.1.0-ft-eval-framework.1
- frontend/postcss.config.cjs - v0.1.0-ft-eval-framework.1
- frontend/prettier.config.cjs - v0.1.0-ft-eval-framework.1
- frontend/prisma - v0.1.0-ft-eval-framework.1
- frontend/prismalib - v0.1.0-ft-eval-framework.1
- frontend/public - v0.1.0-ft-eval-framework.1
- frontend/src - v0.1.0-ft-eval-framework.1
- frontend/tailwind.config.ts - v0.1.0-ft-eval-framework.1
- frontend/tsconfig.json - v0.1.0-ft-eval-framework.1
"" + + + +1. **Meta-agent - Action Plan Selection**: This evaluates the meta agent's ability to choose the correct action plans. +2. **Tool - Simple QA Evaluation (Right Answer Questions)**: This evaluates simple questions where there is a definitive correct answer. +3. **Tool - Analysis Evaluation (Qualitative Questions)**: This evaluates “summary” or “explanation” type questions where a correct answer contains specific elements. + +This notebook is intended to serve as an inspiration/example of how you can evaluate your tools. You need to add your own eval Qs and edit the prompts for the code to work",experimental/evaluation/results/simple_qa_results.xlsx +77741ff1b1f30e6079c3deac91bb72c876fc38c2,06-30-2023 14:51:01,GitHub Enterprise,"add evaluation framework (#27) + +""## impact surface
- frontend/Dockerfile - v0.1.0-ft-eval-framework.1
- frontend/custom_typings - v0.1.0-ft-eval-framework.1
- frontend/next.config.mjs - v0.1.0-ft-eval-framework.1
- frontend/package.json - v0.1.0-ft-eval-framework.1
- frontend/pnpm-lock.yaml - v0.1.0-ft-eval-framework.1
- frontend/postcss.config.cjs - v0.1.0-ft-eval-framework.1
- frontend/prettier.config.cjs - v0.1.0-ft-eval-framework.1
- frontend/prisma - v0.1.0-ft-eval-framework.1
- frontend/prismalib - v0.1.0-ft-eval-framework.1
- frontend/public - v0.1.0-ft-eval-framework.1
- frontend/src - v0.1.0-ft-eval-framework.1
- frontend/tailwind.config.ts - v0.1.0-ft-eval-framework.1
- frontend/tsconfig.json - v0.1.0-ft-eval-framework.1
"" + + + +1. **Meta-agent - Action Plan Selection**: This evaluates the meta agent's ability to choose the correct action plans. +2. **Tool - Simple QA Evaluation (Right Answer Questions)**: This evaluates simple questions where there is a definitive correct answer. +3. **Tool - Analysis Evaluation (Qualitative Questions)**: This evaluates “summary” or “explanation” type questions where a correct answer contains specific elements. + +This notebook is intended to serve as an inspiration/example of how you can evaluate your tools. You need to add your own eval Qs and edit the prompts for the code to work",frontend/src/utils/constants.ts +47a729bed74499b9f66803d557af50fe493fb2f6,07-02-2023 18:19:46,GitHub Enterprise,"Rebuild sql info file if set in config (#38) + +""## impact surface
- frontend/Dockerfile - v0.1.0-ft-sql-tool-info-rebuild.1
- frontend/custom_typings - v0.1.0-ft-sql-tool-info-rebuild.1
- frontend/next.config.mjs - v0.1.0-ft-sql-tool-info-rebuild.1
- frontend/package.json - v0.1.0-ft-sql-tool-info-rebuild.1
- frontend/pnpm-lock.yaml - v0.1.0-ft-sql-tool-info-rebuild.1
- frontend/postcss.config.cjs - v0.1.0-ft-sql-tool-info-rebuild.1
- frontend/prettier.config.cjs - v0.1.0-ft-sql-tool-info-rebuild.1
- frontend/prisma - v0.1.0-ft-sql-tool-info-rebuild.1
- frontend/prismalib - v0.1.0-ft-sql-tool-info-rebuild.1
- frontend/public - v0.1.0-ft-sql-tool-info-rebuild.1
- frontend/src - v0.1.0-ft-sql-tool-info-rebuild.1
- frontend/tailwind.config.ts - v0.1.0-ft-sql-tool-info-rebuild.1
- frontend/tsconfig.json - v0.1.0-ft-sql-tool-info-rebuild.1
""",.env.example +47a729bed74499b9f66803d557af50fe493fb2f6,07-02-2023 18:19:46,GitHub Enterprise,"Rebuild sql info file if set in config (#38) + +""## impact surface
- frontend/Dockerfile - v0.1.0-ft-sql-tool-info-rebuild.1
- frontend/custom_typings - v0.1.0-ft-sql-tool-info-rebuild.1
- frontend/next.config.mjs - v0.1.0-ft-sql-tool-info-rebuild.1
- frontend/package.json - v0.1.0-ft-sql-tool-info-rebuild.1
- frontend/pnpm-lock.yaml - v0.1.0-ft-sql-tool-info-rebuild.1
- frontend/postcss.config.cjs - v0.1.0-ft-sql-tool-info-rebuild.1
- frontend/prettier.config.cjs - v0.1.0-ft-sql-tool-info-rebuild.1
- frontend/prisma - v0.1.0-ft-sql-tool-info-rebuild.1
- frontend/prismalib - v0.1.0-ft-sql-tool-info-rebuild.1
- frontend/public - v0.1.0-ft-sql-tool-info-rebuild.1
- frontend/src - v0.1.0-ft-sql-tool-info-rebuild.1
- frontend/tailwind.config.ts - v0.1.0-ft-sql-tool-info-rebuild.1
- frontend/tsconfig.json - v0.1.0-ft-sql-tool-info-rebuild.1
""",.env.example.dev +47a729bed74499b9f66803d557af50fe493fb2f6,07-02-2023 18:19:46,GitHub Enterprise,"Rebuild sql info file if set in config (#38) + +""## impact surface
- frontend/Dockerfile - v0.1.0-ft-sql-tool-info-rebuild.1
- frontend/custom_typings - v0.1.0-ft-sql-tool-info-rebuild.1
- frontend/next.config.mjs - v0.1.0-ft-sql-tool-info-rebuild.1
- frontend/package.json - v0.1.0-ft-sql-tool-info-rebuild.1
- frontend/pnpm-lock.yaml - v0.1.0-ft-sql-tool-info-rebuild.1
- frontend/postcss.config.cjs - v0.1.0-ft-sql-tool-info-rebuild.1
- frontend/prettier.config.cjs - v0.1.0-ft-sql-tool-info-rebuild.1
- frontend/prisma - v0.1.0-ft-sql-tool-info-rebuild.1
- frontend/prismalib - v0.1.0-ft-sql-tool-info-rebuild.1
- frontend/public - v0.1.0-ft-sql-tool-info-rebuild.1
- frontend/src - v0.1.0-ft-sql-tool-info-rebuild.1
- frontend/tailwind.config.ts - v0.1.0-ft-sql-tool-info-rebuild.1
- frontend/tsconfig.json - v0.1.0-ft-sql-tool-info-rebuild.1
""",.env.example.local +47a729bed74499b9f66803d557af50fe493fb2f6,07-02-2023 18:19:46,GitHub Enterprise,"Rebuild sql info file if set in config (#38) + +""## impact surface
- frontend/Dockerfile - v0.1.0-ft-sql-tool-info-rebuild.1
- frontend/custom_typings - v0.1.0-ft-sql-tool-info-rebuild.1
- frontend/next.config.mjs - v0.1.0-ft-sql-tool-info-rebuild.1
- frontend/package.json - v0.1.0-ft-sql-tool-info-rebuild.1
- frontend/pnpm-lock.yaml - v0.1.0-ft-sql-tool-info-rebuild.1
- frontend/postcss.config.cjs - v0.1.0-ft-sql-tool-info-rebuild.1
- frontend/prettier.config.cjs - v0.1.0-ft-sql-tool-info-rebuild.1
- frontend/prisma - v0.1.0-ft-sql-tool-info-rebuild.1
- frontend/prismalib - v0.1.0-ft-sql-tool-info-rebuild.1
- frontend/public - v0.1.0-ft-sql-tool-info-rebuild.1
- frontend/src - v0.1.0-ft-sql-tool-info-rebuild.1
- frontend/tailwind.config.ts - v0.1.0-ft-sql-tool-info-rebuild.1
- frontend/tsconfig.json - v0.1.0-ft-sql-tool-info-rebuild.1
""",backend/app/app/core/config.py +47a729bed74499b9f66803d557af50fe493fb2f6,07-02-2023 18:19:46,GitHub Enterprise,"Rebuild sql info file if set in config (#38) + +""## impact surface
- frontend/Dockerfile - v0.1.0-ft-sql-tool-info-rebuild.1
- frontend/custom_typings - v0.1.0-ft-sql-tool-info-rebuild.1
- frontend/next.config.mjs - v0.1.0-ft-sql-tool-info-rebuild.1
- frontend/package.json - v0.1.0-ft-sql-tool-info-rebuild.1
- frontend/pnpm-lock.yaml - v0.1.0-ft-sql-tool-info-rebuild.1
- frontend/postcss.config.cjs - v0.1.0-ft-sql-tool-info-rebuild.1
- frontend/prettier.config.cjs - v0.1.0-ft-sql-tool-info-rebuild.1
- frontend/prisma - v0.1.0-ft-sql-tool-info-rebuild.1
- frontend/prismalib - v0.1.0-ft-sql-tool-info-rebuild.1
- frontend/public - v0.1.0-ft-sql-tool-info-rebuild.1
- frontend/src - v0.1.0-ft-sql-tool-info-rebuild.1
- frontend/tailwind.config.ts - v0.1.0-ft-sql-tool-info-rebuild.1
- frontend/tsconfig.json - v0.1.0-ft-sql-tool-info-rebuild.1
""",backend/app/app/db/session.py +047da24a151cb8547113c19559419b727013c372,07-05-2023 09:25:26,GitHub Enterprise,"Feat: Update langchain version to support ChatModel caching (#28) + +This should work out of the box now if DEV_MODE_LIGHT is not true. + +Did not have much time to test it yet, let me know @vanLangen-Casper , @AitBaali-Hamza",backend/app/poetry.lock +047da24a151cb8547113c19559419b727013c372,07-05-2023 09:25:26,GitHub Enterprise,"Feat: Update langchain version to support ChatModel caching (#28) + +This should work out of the box now if DEV_MODE_LIGHT is not true. + +Did not have much time to test it yet, let me know @vanLangen-Casper , @AitBaali-Hamza",backend/app/pyproject.toml +0466757e6ea71381fc80098dd77fb9b5e56af244,07-07-2023 16:35:22,GitHub Enterprise,"Merge pull request #32 from genAI/dev_bugfix + +Caddy fix, API key default fix, .env.example updates for Chinook",.env.example +0466757e6ea71381fc80098dd77fb9b5e56af244,07-07-2023 16:35:22,GitHub Enterprise,"Merge pull request #32 from genAI/dev_bugfix + +Caddy fix, API key default fix, .env.example updates for Chinook",.env.example.dev +0466757e6ea71381fc80098dd77fb9b5e56af244,07-07-2023 16:35:22,GitHub Enterprise,"Merge pull request #32 from genAI/dev_bugfix + +Caddy fix, API key default fix, .env.example updates for Chinook",.env.example.local +0466757e6ea71381fc80098dd77fb9b5e56af244,07-07-2023 16:35:22,GitHub Enterprise,"Merge pull request #32 from genAI/dev_bugfix + +Caddy fix, API key default fix, .env.example updates for Chinook",README.md +0466757e6ea71381fc80098dd77fb9b5e56af244,07-07-2023 16:35:22,GitHub Enterprise,"Merge pull request #32 from genAI/dev_bugfix + +Caddy fix, API key default fix, .env.example updates for Chinook",backend/app/app/services/chat_agent/helpers/llm.py +0466757e6ea71381fc80098dd77fb9b5e56af244,07-07-2023 16:35:22,GitHub Enterprise,"Merge pull request #32 from genAI/dev_bugfix + +Caddy fix, API key default fix, .env.example updates for Chinook",backend/app/app/services/chat_agent/tools/library/sql_tool/sql_tool.py +0466757e6ea71381fc80098dd77fb9b5e56af244,07-07-2023 16:35:22,GitHub Enterprise,"Merge pull request #32 from genAI/dev_bugfix + +Caddy fix, API key default fix, .env.example updates for Chinook",caddy/Caddyfile +0466757e6ea71381fc80098dd77fb9b5e56af244,07-07-2023 16:35:22,GitHub Enterprise,"Merge pull request #32 from genAI/dev_bugfix + +Caddy fix, API key default fix, .env.example updates for Chinook",docker-compose-dev.yml +0466757e6ea71381fc80098dd77fb9b5e56af244,07-07-2023 16:35:22,GitHub Enterprise,"Merge pull request #32 from genAI/dev_bugfix + +Caddy fix, API key default fix, .env.example updates for Chinook",docker-compose-local.yml +0466757e6ea71381fc80098dd77fb9b5e56af244,07-07-2023 16:35:22,GitHub Enterprise,"Merge pull request #32 from genAI/dev_bugfix + +Caddy fix, API key default fix, .env.example updates for Chinook",docker-compose.yml +0466757e6ea71381fc80098dd77fb9b5e56af244,07-07-2023 16:35:22,GitHub Enterprise,"Merge pull request #32 from genAI/dev_bugfix + +Caddy fix, API key default fix, .env.example updates for Chinook",frontend/.env.example +0466757e6ea71381fc80098dd77fb9b5e56af244,07-07-2023 16:35:22,GitHub Enterprise,"Merge pull request #32 from genAI/dev_bugfix + +Caddy fix, API key default fix, .env.example updates for Chinook",frontend/.env.example.dev +0466757e6ea71381fc80098dd77fb9b5e56af244,07-07-2023 16:35:22,GitHub Enterprise,"Merge pull request #32 from genAI/dev_bugfix + +Caddy fix, API key default fix, .env.example updates for Chinook",frontend/.env.example.local +0466757e6ea71381fc80098dd77fb9b5e56af244,07-07-2023 16:35:22,GitHub Enterprise,"Merge pull request #32 from genAI/dev_bugfix + +Caddy fix, API key default fix, .env.example updates for Chinook",frontend/.gitignore +0466757e6ea71381fc80098dd77fb9b5e56af244,07-07-2023 16:35:22,GitHub Enterprise,"Merge pull request #32 from genAI/dev_bugfix + +Caddy fix, API key default fix, .env.example updates for Chinook",frontend/Dockerfile +0466757e6ea71381fc80098dd77fb9b5e56af244,07-07-2023 16:35:22,GitHub Enterprise,"Merge pull request #32 from genAI/dev_bugfix + +Caddy fix, API key default fix, .env.example updates for Chinook",scripts/chinook_psql_load.sql +38a49c998cf54d5f394827518cfda2375d0baabf,07-07-2023 16:02:09,AitBaali-Hamza,fix sql tool uri and docker compose volumes for sql tool,.env.example +38a49c998cf54d5f394827518cfda2375d0baabf,07-07-2023 16:02:09,AitBaali-Hamza,fix sql tool uri and docker compose volumes for sql tool,.env.example.dev +38a49c998cf54d5f394827518cfda2375d0baabf,07-07-2023 16:02:09,AitBaali-Hamza,fix sql tool uri and docker compose volumes for sql tool,.env.example.local +38a49c998cf54d5f394827518cfda2375d0baabf,07-07-2023 16:02:09,AitBaali-Hamza,fix sql tool uri and docker compose volumes for sql tool,docker-compose-dev.yml +38a49c998cf54d5f394827518cfda2375d0baabf,07-07-2023 16:02:09,AitBaali-Hamza,fix sql tool uri and docker compose volumes for sql tool,docker-compose-local.yml +38a49c998cf54d5f394827518cfda2375d0baabf,07-07-2023 16:02:09,AitBaali-Hamza,fix sql tool uri and docker compose volumes for sql tool,docker-compose.yml +38a49c998cf54d5f394827518cfda2375d0baabf,07-07-2023 16:02:09,AitBaali-Hamza,fix sql tool uri and docker compose volumes for sql tool,frontend/.env.example +38a49c998cf54d5f394827518cfda2375d0baabf,07-07-2023 16:02:09,AitBaali-Hamza,fix sql tool uri and docker compose volumes for sql tool,frontend/Dockerfile +3a9b07d918c9e4b0023d6b8ce9e0fae9e049ac02,07-07-2023 16:09:12,AitBaali-Hamza,updating with develop,README.md +3a9b07d918c9e4b0023d6b8ce9e0fae9e049ac02,07-07-2023 16:09:12,AitBaali-Hamza,updating with develop,backend/app/app/config/agent.yml +3a9b07d918c9e4b0023d6b8ce9e0fae9e049ac02,07-07-2023 16:09:12,AitBaali-Hamza,updating with develop,backend/app/app/core/config.py +3a9b07d918c9e4b0023d6b8ce9e0fae9e049ac02,07-07-2023 16:09:12,AitBaali-Hamza,updating with develop,backend/app/app/db/session.py +3a9b07d918c9e4b0023d6b8ce9e0fae9e049ac02,07-07-2023 16:09:12,AitBaali-Hamza,updating with develop,backend/app/app/db/vector_db_pdf_ingestion.py +3a9b07d918c9e4b0023d6b8ce9e0fae9e049ac02,07-07-2023 16:09:12,AitBaali-Hamza,updating with develop,backend/app/poetry.lock +3a9b07d918c9e4b0023d6b8ce9e0fae9e049ac02,07-07-2023 16:09:12,AitBaali-Hamza,updating with develop,backend/app/pyproject.toml +3a9b07d918c9e4b0023d6b8ce9e0fae9e049ac02,07-07-2023 16:09:12,AitBaali-Hamza,updating with develop,docker-compose-dev.yml +3a9b07d918c9e4b0023d6b8ce9e0fae9e049ac02,07-07-2023 16:09:12,AitBaali-Hamza,updating with develop,docs/agent/agent_setup.md +3a9b07d918c9e4b0023d6b8ce9e0fae9e049ac02,07-07-2023 16:09:12,AitBaali-Hamza,updating with develop,docs/tools/pdf_tool.md +3a9b07d918c9e4b0023d6b8ce9e0fae9e049ac02,07-07-2023 16:09:12,AitBaali-Hamza,updating with develop,docs/tools/sql_tool.md +3a9b07d918c9e4b0023d6b8ce9e0fae9e049ac02,07-07-2023 16:09:12,AitBaali-Hamza,updating with develop,docs/tools/template_tool.py +3a9b07d918c9e4b0023d6b8ce9e0fae9e049ac02,07-07-2023 16:09:12,AitBaali-Hamza,updating with develop,docs/tools/tools_setup.md +3a9b07d918c9e4b0023d6b8ce9e0fae9e049ac02,07-07-2023 16:09:12,AitBaali-Hamza,updating with develop,experimental/evaluation/data/ConversationId.png +3a9b07d918c9e4b0023d6b8ce9e0fae9e049ac02,07-07-2023 16:09:12,AitBaali-Hamza,updating with develop,experimental/evaluation/data/meta_agent_eval_qs.csv +3a9b07d918c9e4b0023d6b8ce9e0fae9e049ac02,07-07-2023 16:09:12,AitBaali-Hamza,updating with develop,experimental/evaluation/data/simple_qa_eval.csv +3a9b07d918c9e4b0023d6b8ce9e0fae9e049ac02,07-07-2023 16:09:12,AitBaali-Hamza,updating with develop,experimental/evaluation/eval.py +3a9b07d918c9e4b0023d6b8ce9e0fae9e049ac02,07-07-2023 16:09:12,AitBaali-Hamza,updating with develop,experimental/evaluation/evaluation.ipynb +3a9b07d918c9e4b0023d6b8ce9e0fae9e049ac02,07-07-2023 16:09:12,AitBaali-Hamza,updating with develop,experimental/evaluation/post_processing.py +3a9b07d918c9e4b0023d6b8ce9e0fae9e049ac02,07-07-2023 16:09:12,AitBaali-Hamza,updating with develop,experimental/evaluation/pre_processing.py +3a9b07d918c9e4b0023d6b8ce9e0fae9e049ac02,07-07-2023 16:09:12,AitBaali-Hamza,updating with develop,experimental/evaluation/results/meta.xlsx +3a9b07d918c9e4b0023d6b8ce9e0fae9e049ac02,07-07-2023 16:09:12,AitBaali-Hamza,updating with develop,experimental/evaluation/results/simple_qa_results.xlsx +3a9b07d918c9e4b0023d6b8ce9e0fae9e049ac02,07-07-2023 16:09:12,AitBaali-Hamza,updating with develop,frontend/src/utils/constants.ts +3a9b07d918c9e4b0023d6b8ce9e0fae9e049ac02,07-07-2023 16:09:12,AitBaali-Hamza,updating with develop,setup.md +4ac3e3e0b372621260bf7efb0c16d096a4d9d9d9,07-07-2023 16:21:29,AitBaali-Hamza,"frontend gitignore modif, and push .env.exp.local",frontend/.env.example.local +4ac3e3e0b372621260bf7efb0c16d096a4d9d9d9,07-07-2023 16:21:29,AitBaali-Hamza,"frontend gitignore modif, and push .env.exp.local",frontend/.gitignore +c389719d38a7622633f3eda49d381a53cc5da62e,08-10-2023 10:00:54,GitHub Enterprise,"Fix/pdf tool flag (#44) + +**Fix - allow AgentKit to run without SQL & pdf tools** +(i.e. with `PDF_TOOL_ENABLED=""false""` and `SQL_TOOL_DB_ENABLED=""false""` in `.env`) +1) **Issue summary:** error starting up the app without pdf tool +2) **Steps to reproduce:** set your .env with pdf and SQL tool off, make sure to remove those tools from the agent actions. +3) **Expected vs what happened**: An agent without unneeded tools should start-up smoothly, but instead the app wasn't able to start. +4) Any notes on **why you think this might be happening**: tools are initiated by default, without checking the env. +5) **Changes**: added small fixes with @Connell-Liam: +- check enabled in the start logic in main.py +- check enabled in `backend/app/app/db/vector_db_pdf_ingestion.py` module, since it's imported in main.py + +Co-authored-by: Connell.Liam@bcg.com ",backend/app/app/db/vector_db_pdf_ingestion.py +c389719d38a7622633f3eda49d381a53cc5da62e,08-10-2023 10:00:54,GitHub Enterprise,"Fix/pdf tool flag (#44) + +**Fix - allow AgentKit to run without SQL & pdf tools** +(i.e. with `PDF_TOOL_ENABLED=""false""` and `SQL_TOOL_DB_ENABLED=""false""` in `.env`) +1) **Issue summary:** error starting up the app without pdf tool +2) **Steps to reproduce:** set your .env with pdf and SQL tool off, make sure to remove those tools from the agent actions. +3) **Expected vs what happened**: An agent without unneeded tools should start-up smoothly, but instead the app wasn't able to start. +4) Any notes on **why you think this might be happening**: tools are initiated by default, without checking the env. +5) **Changes**: added small fixes with @Connell-Liam: +- check enabled in the start logic in main.py +- check enabled in `backend/app/app/db/vector_db_pdf_ingestion.py` module, since it's imported in main.py + +Co-authored-by: Connell.Liam@bcg.com ",backend/app/app/main.py +059b8a3ee0a23d2855bd0cb4a7a03fb51e50bb25,08-10-2023 10:39:05,GitHub Enterprise,"Feat/image generation (#42) + +""## impact surface
- frontend/Dockerfile - v0.1.0-feat-image-generation.1
- frontend/custom_typings - v0.1.0-feat-image-generation.1
- frontend/next.config.mjs - v0.1.0-feat-image-generation.1
- frontend/package.json - v0.1.0-feat-image-generation.1
- frontend/pnpm-lock.yaml - v0.1.0-feat-image-generation.1
- frontend/postcss.config.cjs - v0.1.0-feat-image-generation.1
- frontend/prettier.config.cjs - v0.1.0-feat-image-generation.1
- frontend/prisma - v0.1.0-feat-image-generation.1
- frontend/prismalib - v0.1.0-feat-image-generation.1
- frontend/public - v0.1.0-feat-image-generation.1
- frontend/src - v0.1.0-feat-image-generation.1
- frontend/tailwind.config.ts - v0.1.0-feat-image-generation.1
- frontend/tsconfig.json - v0.1.0-feat-image-generation.1
"" + +-Added the two tools on image generation. One on generating images based on the description in the chat history and the other one on generating images based on the user input in the prompt +-Added the relevant descriptions on the tools in tools.yml +In the frontend: +-Added the lines to render the images generated in the image appendix +-Added message to be shown when the image generation tools are used",backend/app/app/.DS_Store +059b8a3ee0a23d2855bd0cb4a7a03fb51e50bb25,08-10-2023 10:39:05,GitHub Enterprise,"Feat/image generation (#42) + +""## impact surface
- frontend/Dockerfile - v0.1.0-feat-image-generation.1
- frontend/custom_typings - v0.1.0-feat-image-generation.1
- frontend/next.config.mjs - v0.1.0-feat-image-generation.1
- frontend/package.json - v0.1.0-feat-image-generation.1
- frontend/pnpm-lock.yaml - v0.1.0-feat-image-generation.1
- frontend/postcss.config.cjs - v0.1.0-feat-image-generation.1
- frontend/prettier.config.cjs - v0.1.0-feat-image-generation.1
- frontend/prisma - v0.1.0-feat-image-generation.1
- frontend/prismalib - v0.1.0-feat-image-generation.1
- frontend/public - v0.1.0-feat-image-generation.1
- frontend/src - v0.1.0-feat-image-generation.1
- frontend/tailwind.config.ts - v0.1.0-feat-image-generation.1
- frontend/tsconfig.json - v0.1.0-feat-image-generation.1
"" + +-Added the two tools on image generation. One on generating images based on the description in the chat history and the other one on generating images based on the user input in the prompt +-Added the relevant descriptions on the tools in tools.yml +In the frontend: +-Added the lines to render the images generated in the image appendix +-Added message to be shown when the image generation tools are used",backend/app/app/config/tools.yml +059b8a3ee0a23d2855bd0cb4a7a03fb51e50bb25,08-10-2023 10:39:05,GitHub Enterprise,"Feat/image generation (#42) + +""## impact surface
- frontend/Dockerfile - v0.1.0-feat-image-generation.1
- frontend/custom_typings - v0.1.0-feat-image-generation.1
- frontend/next.config.mjs - v0.1.0-feat-image-generation.1
- frontend/package.json - v0.1.0-feat-image-generation.1
- frontend/pnpm-lock.yaml - v0.1.0-feat-image-generation.1
- frontend/postcss.config.cjs - v0.1.0-feat-image-generation.1
- frontend/prettier.config.cjs - v0.1.0-feat-image-generation.1
- frontend/prisma - v0.1.0-feat-image-generation.1
- frontend/prismalib - v0.1.0-feat-image-generation.1
- frontend/public - v0.1.0-feat-image-generation.1
- frontend/src - v0.1.0-feat-image-generation.1
- frontend/tailwind.config.ts - v0.1.0-feat-image-generation.1
- frontend/tsconfig.json - v0.1.0-feat-image-generation.1
"" + +-Added the two tools on image generation. One on generating images based on the description in the chat history and the other one on generating images based on the user input in the prompt +-Added the relevant descriptions on the tools in tools.yml +In the frontend: +-Added the lines to render the images generated in the image appendix +-Added message to be shown when the image generation tools are used",backend/app/app/schemas/tool_schema.py +059b8a3ee0a23d2855bd0cb4a7a03fb51e50bb25,08-10-2023 10:39:05,GitHub Enterprise,"Feat/image generation (#42) + +""## impact surface
- frontend/Dockerfile - v0.1.0-feat-image-generation.1
- frontend/custom_typings - v0.1.0-feat-image-generation.1
- frontend/next.config.mjs - v0.1.0-feat-image-generation.1
- frontend/package.json - v0.1.0-feat-image-generation.1
- frontend/pnpm-lock.yaml - v0.1.0-feat-image-generation.1
- frontend/postcss.config.cjs - v0.1.0-feat-image-generation.1
- frontend/prettier.config.cjs - v0.1.0-feat-image-generation.1
- frontend/prisma - v0.1.0-feat-image-generation.1
- frontend/prismalib - v0.1.0-feat-image-generation.1
- frontend/public - v0.1.0-feat-image-generation.1
- frontend/src - v0.1.0-feat-image-generation.1
- frontend/tailwind.config.ts - v0.1.0-feat-image-generation.1
- frontend/tsconfig.json - v0.1.0-feat-image-generation.1
"" + +-Added the two tools on image generation. One on generating images based on the description in the chat history and the other one on generating images based on the user input in the prompt +-Added the relevant descriptions on the tools in tools.yml +In the frontend: +-Added the lines to render the images generated in the image appendix +-Added message to be shown when the image generation tools are used",backend/app/app/services/chat_agent/tools/ExtendedBaseTool.py +059b8a3ee0a23d2855bd0cb4a7a03fb51e50bb25,08-10-2023 10:39:05,GitHub Enterprise,"Feat/image generation (#42) + +""## impact surface
- frontend/Dockerfile - v0.1.0-feat-image-generation.1
- frontend/custom_typings - v0.1.0-feat-image-generation.1
- frontend/next.config.mjs - v0.1.0-feat-image-generation.1
- frontend/package.json - v0.1.0-feat-image-generation.1
- frontend/pnpm-lock.yaml - v0.1.0-feat-image-generation.1
- frontend/postcss.config.cjs - v0.1.0-feat-image-generation.1
- frontend/prettier.config.cjs - v0.1.0-feat-image-generation.1
- frontend/prisma - v0.1.0-feat-image-generation.1
- frontend/prismalib - v0.1.0-feat-image-generation.1
- frontend/public - v0.1.0-feat-image-generation.1
- frontend/src - v0.1.0-feat-image-generation.1
- frontend/tailwind.config.ts - v0.1.0-feat-image-generation.1
- frontend/tsconfig.json - v0.1.0-feat-image-generation.1
"" + +-Added the two tools on image generation. One on generating images based on the description in the chat history and the other one on generating images based on the user input in the prompt +-Added the relevant descriptions on the tools in tools.yml +In the frontend: +-Added the lines to render the images generated in the image appendix +-Added message to be shown when the image generation tools are used",backend/app/app/services/chat_agent/tools/library/image_gen_with_input_tool/image_gen_with_input_tool.py +059b8a3ee0a23d2855bd0cb4a7a03fb51e50bb25,08-10-2023 10:39:05,GitHub Enterprise,"Feat/image generation (#42) + +""## impact surface
- frontend/Dockerfile - v0.1.0-feat-image-generation.1
- frontend/custom_typings - v0.1.0-feat-image-generation.1
- frontend/next.config.mjs - v0.1.0-feat-image-generation.1
- frontend/package.json - v0.1.0-feat-image-generation.1
- frontend/pnpm-lock.yaml - v0.1.0-feat-image-generation.1
- frontend/postcss.config.cjs - v0.1.0-feat-image-generation.1
- frontend/prettier.config.cjs - v0.1.0-feat-image-generation.1
- frontend/prisma - v0.1.0-feat-image-generation.1
- frontend/prismalib - v0.1.0-feat-image-generation.1
- frontend/public - v0.1.0-feat-image-generation.1
- frontend/src - v0.1.0-feat-image-generation.1
- frontend/tailwind.config.ts - v0.1.0-feat-image-generation.1
- frontend/tsconfig.json - v0.1.0-feat-image-generation.1
"" + +-Added the two tools on image generation. One on generating images based on the description in the chat history and the other one on generating images based on the user input in the prompt +-Added the relevant descriptions on the tools in tools.yml +In the frontend: +-Added the lines to render the images generated in the image appendix +-Added message to be shown when the image generation tools are used",backend/app/app/services/chat_agent/tools/library/image_generation_tool/image_generation_tool.py +059b8a3ee0a23d2855bd0cb4a7a03fb51e50bb25,08-10-2023 10:39:05,GitHub Enterprise,"Feat/image generation (#42) + +""## impact surface
- frontend/Dockerfile - v0.1.0-feat-image-generation.1
- frontend/custom_typings - v0.1.0-feat-image-generation.1
- frontend/next.config.mjs - v0.1.0-feat-image-generation.1
- frontend/package.json - v0.1.0-feat-image-generation.1
- frontend/pnpm-lock.yaml - v0.1.0-feat-image-generation.1
- frontend/postcss.config.cjs - v0.1.0-feat-image-generation.1
- frontend/prettier.config.cjs - v0.1.0-feat-image-generation.1
- frontend/prisma - v0.1.0-feat-image-generation.1
- frontend/prismalib - v0.1.0-feat-image-generation.1
- frontend/public - v0.1.0-feat-image-generation.1
- frontend/src - v0.1.0-feat-image-generation.1
- frontend/tailwind.config.ts - v0.1.0-feat-image-generation.1
- frontend/tsconfig.json - v0.1.0-feat-image-generation.1
"" + +-Added the two tools on image generation. One on generating images based on the description in the chat history and the other one on generating images based on the user input in the prompt +-Added the relevant descriptions on the tools in tools.yml +In the frontend: +-Added the lines to render the images generated in the image appendix +-Added message to be shown when the image generation tools are used",backend/app/app/services/chat_agent/tools/tools.py +059b8a3ee0a23d2855bd0cb4a7a03fb51e50bb25,08-10-2023 10:39:05,GitHub Enterprise,"Feat/image generation (#42) + +""## impact surface
- frontend/Dockerfile - v0.1.0-feat-image-generation.1
- frontend/custom_typings - v0.1.0-feat-image-generation.1
- frontend/next.config.mjs - v0.1.0-feat-image-generation.1
- frontend/package.json - v0.1.0-feat-image-generation.1
- frontend/pnpm-lock.yaml - v0.1.0-feat-image-generation.1
- frontend/postcss.config.cjs - v0.1.0-feat-image-generation.1
- frontend/prettier.config.cjs - v0.1.0-feat-image-generation.1
- frontend/prisma - v0.1.0-feat-image-generation.1
- frontend/prismalib - v0.1.0-feat-image-generation.1
- frontend/public - v0.1.0-feat-image-generation.1
- frontend/src - v0.1.0-feat-image-generation.1
- frontend/tailwind.config.ts - v0.1.0-feat-image-generation.1
- frontend/tsconfig.json - v0.1.0-feat-image-generation.1
"" + +-Added the two tools on image generation. One on generating images based on the description in the chat history and the other one on generating images based on the user input in the prompt +-Added the relevant descriptions on the tools in tools.yml +In the frontend: +-Added the lines to render the images generated in the image appendix +-Added message to be shown when the image generation tools are used",frontend/src/components/ToolActionRenderer/library/actions.tsx +059b8a3ee0a23d2855bd0cb4a7a03fb51e50bb25,08-10-2023 10:39:05,GitHub Enterprise,"Feat/image generation (#42) + +""## impact surface
- frontend/Dockerfile - v0.1.0-feat-image-generation.1
- frontend/custom_typings - v0.1.0-feat-image-generation.1
- frontend/next.config.mjs - v0.1.0-feat-image-generation.1
- frontend/package.json - v0.1.0-feat-image-generation.1
- frontend/pnpm-lock.yaml - v0.1.0-feat-image-generation.1
- frontend/postcss.config.cjs - v0.1.0-feat-image-generation.1
- frontend/prettier.config.cjs - v0.1.0-feat-image-generation.1
- frontend/prisma - v0.1.0-feat-image-generation.1
- frontend/prismalib - v0.1.0-feat-image-generation.1
- frontend/public - v0.1.0-feat-image-generation.1
- frontend/src - v0.1.0-feat-image-generation.1
- frontend/tailwind.config.ts - v0.1.0-feat-image-generation.1
- frontend/tsconfig.json - v0.1.0-feat-image-generation.1
"" + +-Added the two tools on image generation. One on generating images based on the description in the chat history and the other one on generating images based on the user input in the prompt +-Added the relevant descriptions on the tools in tools.yml +In the frontend: +-Added the lines to render the images generated in the image appendix +-Added message to be shown when the image generation tools are used",frontend/src/components/ToolAppendixRenderer/index.tsx +059b8a3ee0a23d2855bd0cb4a7a03fb51e50bb25,08-10-2023 10:39:05,GitHub Enterprise,"Feat/image generation (#42) + +""## impact surface
- frontend/Dockerfile - v0.1.0-feat-image-generation.1
- frontend/custom_typings - v0.1.0-feat-image-generation.1
- frontend/next.config.mjs - v0.1.0-feat-image-generation.1
- frontend/package.json - v0.1.0-feat-image-generation.1
- frontend/pnpm-lock.yaml - v0.1.0-feat-image-generation.1
- frontend/postcss.config.cjs - v0.1.0-feat-image-generation.1
- frontend/prettier.config.cjs - v0.1.0-feat-image-generation.1
- frontend/prisma - v0.1.0-feat-image-generation.1
- frontend/prismalib - v0.1.0-feat-image-generation.1
- frontend/public - v0.1.0-feat-image-generation.1
- frontend/src - v0.1.0-feat-image-generation.1
- frontend/tailwind.config.ts - v0.1.0-feat-image-generation.1
- frontend/tsconfig.json - v0.1.0-feat-image-generation.1
"" + +-Added the two tools on image generation. One on generating images based on the description in the chat history and the other one on generating images based on the user input in the prompt +-Added the relevant descriptions on the tools in tools.yml +In the frontend: +-Added the lines to render the images generated in the image appendix +-Added message to be shown when the image generation tools are used",frontend/src/components/ToolAppendixRenderer/library/CodeFlipCard/ResultsView.tsx +059b8a3ee0a23d2855bd0cb4a7a03fb51e50bb25,08-10-2023 10:39:05,GitHub Enterprise,"Feat/image generation (#42) + +""## impact surface
- frontend/Dockerfile - v0.1.0-feat-image-generation.1
- frontend/custom_typings - v0.1.0-feat-image-generation.1
- frontend/next.config.mjs - v0.1.0-feat-image-generation.1
- frontend/package.json - v0.1.0-feat-image-generation.1
- frontend/pnpm-lock.yaml - v0.1.0-feat-image-generation.1
- frontend/postcss.config.cjs - v0.1.0-feat-image-generation.1
- frontend/prettier.config.cjs - v0.1.0-feat-image-generation.1
- frontend/prisma - v0.1.0-feat-image-generation.1
- frontend/prismalib - v0.1.0-feat-image-generation.1
- frontend/public - v0.1.0-feat-image-generation.1
- frontend/src - v0.1.0-feat-image-generation.1
- frontend/tailwind.config.ts - v0.1.0-feat-image-generation.1
- frontend/tsconfig.json - v0.1.0-feat-image-generation.1
"" + +-Added the two tools on image generation. One on generating images based on the description in the chat history and the other one on generating images based on the user input in the prompt +-Added the relevant descriptions on the tools in tools.yml +In the frontend: +-Added the lines to render the images generated in the image appendix +-Added message to be shown when the image generation tools are used",frontend/src/components/ToolAppendixRenderer/library/CodeFlipCard/index.tsx +059b8a3ee0a23d2855bd0cb4a7a03fb51e50bb25,08-10-2023 10:39:05,GitHub Enterprise,"Feat/image generation (#42) + +""## impact surface
- frontend/Dockerfile - v0.1.0-feat-image-generation.1
- frontend/custom_typings - v0.1.0-feat-image-generation.1
- frontend/next.config.mjs - v0.1.0-feat-image-generation.1
- frontend/package.json - v0.1.0-feat-image-generation.1
- frontend/pnpm-lock.yaml - v0.1.0-feat-image-generation.1
- frontend/postcss.config.cjs - v0.1.0-feat-image-generation.1
- frontend/prettier.config.cjs - v0.1.0-feat-image-generation.1
- frontend/prisma - v0.1.0-feat-image-generation.1
- frontend/prismalib - v0.1.0-feat-image-generation.1
- frontend/public - v0.1.0-feat-image-generation.1
- frontend/src - v0.1.0-feat-image-generation.1
- frontend/tailwind.config.ts - v0.1.0-feat-image-generation.1
- frontend/tsconfig.json - v0.1.0-feat-image-generation.1
"" + +-Added the two tools on image generation. One on generating images based on the description in the chat history and the other one on generating images based on the user input in the prompt +-Added the relevant descriptions on the tools in tools.yml +In the frontend: +-Added the lines to render the images generated in the image appendix +-Added message to be shown when the image generation tools are used",frontend/src/types/common.ts +c67c4b54a3c641ec55f6fc4d3af315b1d91c4317,08-11-2023 13:51:52,GitHub Enterprise,"Feat: Feedback and customisation example integration (#46) + +""## impact surface
- frontend/Dockerfile - v0.1.0-feat-feedback-and-customisation.1
- frontend/custom_typings - v0.1.0-feat-feedback-and-customisation.1
- frontend/next.config.mjs - v0.1.0-feat-feedback-and-customisation.1
- frontend/package.json - v0.1.0-feat-feedback-and-customisation.1
- frontend/pnpm-lock.yaml - v0.1.0-feat-feedback-and-customisation.1
- frontend/postcss.config.cjs - v0.1.0-feat-feedback-and-customisation.1
- frontend/prettier.config.cjs - v0.1.0-feat-feedback-and-customisation.1
- frontend/prisma - v0.1.0-feat-feedback-and-customisation.1
- frontend/prismalib - v0.1.0-feat-feedback-and-customisation.1
- frontend/public - v0.1.0-feat-feedback-and-customisation.1
- frontend/src - v0.1.0-feat-feedback-and-customisation.1
- frontend/tailwind.config.ts - v0.1.0-feat-feedback-and-customisation.1
- frontend/tsconfig.json - v0.1.0-feat-feedback-and-customisation.1
""",.env.example +c67c4b54a3c641ec55f6fc4d3af315b1d91c4317,08-11-2023 13:51:52,GitHub Enterprise,"Feat: Feedback and customisation example integration (#46) + +""## impact surface
- frontend/Dockerfile - v0.1.0-feat-feedback-and-customisation.1
- frontend/custom_typings - v0.1.0-feat-feedback-and-customisation.1
- frontend/next.config.mjs - v0.1.0-feat-feedback-and-customisation.1
- frontend/package.json - v0.1.0-feat-feedback-and-customisation.1
- frontend/pnpm-lock.yaml - v0.1.0-feat-feedback-and-customisation.1
- frontend/postcss.config.cjs - v0.1.0-feat-feedback-and-customisation.1
- frontend/prettier.config.cjs - v0.1.0-feat-feedback-and-customisation.1
- frontend/prisma - v0.1.0-feat-feedback-and-customisation.1
- frontend/prismalib - v0.1.0-feat-feedback-and-customisation.1
- frontend/public - v0.1.0-feat-feedback-and-customisation.1
- frontend/src - v0.1.0-feat-feedback-and-customisation.1
- frontend/tailwind.config.ts - v0.1.0-feat-feedback-and-customisation.1
- frontend/tsconfig.json - v0.1.0-feat-feedback-and-customisation.1
""",.env.example.dev +c67c4b54a3c641ec55f6fc4d3af315b1d91c4317,08-11-2023 13:51:52,GitHub Enterprise,"Feat: Feedback and customisation example integration (#46) + +""## impact surface
- frontend/Dockerfile - v0.1.0-feat-feedback-and-customisation.1
- frontend/custom_typings - v0.1.0-feat-feedback-and-customisation.1
- frontend/next.config.mjs - v0.1.0-feat-feedback-and-customisation.1
- frontend/package.json - v0.1.0-feat-feedback-and-customisation.1
- frontend/pnpm-lock.yaml - v0.1.0-feat-feedback-and-customisation.1
- frontend/postcss.config.cjs - v0.1.0-feat-feedback-and-customisation.1
- frontend/prettier.config.cjs - v0.1.0-feat-feedback-and-customisation.1
- frontend/prisma - v0.1.0-feat-feedback-and-customisation.1
- frontend/prismalib - v0.1.0-feat-feedback-and-customisation.1
- frontend/public - v0.1.0-feat-feedback-and-customisation.1
- frontend/src - v0.1.0-feat-feedback-and-customisation.1
- frontend/tailwind.config.ts - v0.1.0-feat-feedback-and-customisation.1
- frontend/tsconfig.json - v0.1.0-feat-feedback-and-customisation.1
""",.env.example.local +c67c4b54a3c641ec55f6fc4d3af315b1d91c4317,08-11-2023 13:51:52,GitHub Enterprise,"Feat: Feedback and customisation example integration (#46) + +""## impact surface
- frontend/Dockerfile - v0.1.0-feat-feedback-and-customisation.1
- frontend/custom_typings - v0.1.0-feat-feedback-and-customisation.1
- frontend/next.config.mjs - v0.1.0-feat-feedback-and-customisation.1
- frontend/package.json - v0.1.0-feat-feedback-and-customisation.1
- frontend/pnpm-lock.yaml - v0.1.0-feat-feedback-and-customisation.1
- frontend/postcss.config.cjs - v0.1.0-feat-feedback-and-customisation.1
- frontend/prettier.config.cjs - v0.1.0-feat-feedback-and-customisation.1
- frontend/prisma - v0.1.0-feat-feedback-and-customisation.1
- frontend/prismalib - v0.1.0-feat-feedback-and-customisation.1
- frontend/public - v0.1.0-feat-feedback-and-customisation.1
- frontend/src - v0.1.0-feat-feedback-and-customisation.1
- frontend/tailwind.config.ts - v0.1.0-feat-feedback-and-customisation.1
- frontend/tsconfig.json - v0.1.0-feat-feedback-and-customisation.1
""",README.md +c67c4b54a3c641ec55f6fc4d3af315b1d91c4317,08-11-2023 13:51:52,GitHub Enterprise,"Feat: Feedback and customisation example integration (#46) + +""## impact surface
- frontend/Dockerfile - v0.1.0-feat-feedback-and-customisation.1
- frontend/custom_typings - v0.1.0-feat-feedback-and-customisation.1
- frontend/next.config.mjs - v0.1.0-feat-feedback-and-customisation.1
- frontend/package.json - v0.1.0-feat-feedback-and-customisation.1
- frontend/pnpm-lock.yaml - v0.1.0-feat-feedback-and-customisation.1
- frontend/postcss.config.cjs - v0.1.0-feat-feedback-and-customisation.1
- frontend/prettier.config.cjs - v0.1.0-feat-feedback-and-customisation.1
- frontend/prisma - v0.1.0-feat-feedback-and-customisation.1
- frontend/prismalib - v0.1.0-feat-feedback-and-customisation.1
- frontend/public - v0.1.0-feat-feedback-and-customisation.1
- frontend/src - v0.1.0-feat-feedback-and-customisation.1
- frontend/tailwind.config.ts - v0.1.0-feat-feedback-and-customisation.1
- frontend/tsconfig.json - v0.1.0-feat-feedback-and-customisation.1
""",backend/app/app/api/v1/api.py +c67c4b54a3c641ec55f6fc4d3af315b1d91c4317,08-11-2023 13:51:52,GitHub Enterprise,"Feat: Feedback and customisation example integration (#46) + +""## impact surface
- frontend/Dockerfile - v0.1.0-feat-feedback-and-customisation.1
- frontend/custom_typings - v0.1.0-feat-feedback-and-customisation.1
- frontend/next.config.mjs - v0.1.0-feat-feedback-and-customisation.1
- frontend/package.json - v0.1.0-feat-feedback-and-customisation.1
- frontend/pnpm-lock.yaml - v0.1.0-feat-feedback-and-customisation.1
- frontend/postcss.config.cjs - v0.1.0-feat-feedback-and-customisation.1
- frontend/prettier.config.cjs - v0.1.0-feat-feedback-and-customisation.1
- frontend/prisma - v0.1.0-feat-feedback-and-customisation.1
- frontend/prismalib - v0.1.0-feat-feedback-and-customisation.1
- frontend/public - v0.1.0-feat-feedback-and-customisation.1
- frontend/src - v0.1.0-feat-feedback-and-customisation.1
- frontend/tailwind.config.ts - v0.1.0-feat-feedback-and-customisation.1
- frontend/tsconfig.json - v0.1.0-feat-feedback-and-customisation.1
""",backend/app/app/api/v1/endpoints/chat.py +c67c4b54a3c641ec55f6fc4d3af315b1d91c4317,08-11-2023 13:51:52,GitHub Enterprise,"Feat: Feedback and customisation example integration (#46) + +""## impact surface
- frontend/Dockerfile - v0.1.0-feat-feedback-and-customisation.1
- frontend/custom_typings - v0.1.0-feat-feedback-and-customisation.1
- frontend/next.config.mjs - v0.1.0-feat-feedback-and-customisation.1
- frontend/package.json - v0.1.0-feat-feedback-and-customisation.1
- frontend/pnpm-lock.yaml - v0.1.0-feat-feedback-and-customisation.1
- frontend/postcss.config.cjs - v0.1.0-feat-feedback-and-customisation.1
- frontend/prettier.config.cjs - v0.1.0-feat-feedback-and-customisation.1
- frontend/prisma - v0.1.0-feat-feedback-and-customisation.1
- frontend/prismalib - v0.1.0-feat-feedback-and-customisation.1
- frontend/public - v0.1.0-feat-feedback-and-customisation.1
- frontend/src - v0.1.0-feat-feedback-and-customisation.1
- frontend/tailwind.config.ts - v0.1.0-feat-feedback-and-customisation.1
- frontend/tsconfig.json - v0.1.0-feat-feedback-and-customisation.1
""",backend/app/app/api/v1/endpoints/statistics.py +c67c4b54a3c641ec55f6fc4d3af315b1d91c4317,08-11-2023 13:51:52,GitHub Enterprise,"Feat: Feedback and customisation example integration (#46) + +""## impact surface
- frontend/Dockerfile - v0.1.0-feat-feedback-and-customisation.1
- frontend/custom_typings - v0.1.0-feat-feedback-and-customisation.1
- frontend/next.config.mjs - v0.1.0-feat-feedback-and-customisation.1
- frontend/package.json - v0.1.0-feat-feedback-and-customisation.1
- frontend/pnpm-lock.yaml - v0.1.0-feat-feedback-and-customisation.1
- frontend/postcss.config.cjs - v0.1.0-feat-feedback-and-customisation.1
- frontend/prettier.config.cjs - v0.1.0-feat-feedback-and-customisation.1
- frontend/prisma - v0.1.0-feat-feedback-and-customisation.1
- frontend/prismalib - v0.1.0-feat-feedback-and-customisation.1
- frontend/public - v0.1.0-feat-feedback-and-customisation.1
- frontend/src - v0.1.0-feat-feedback-and-customisation.1
- frontend/tailwind.config.ts - v0.1.0-feat-feedback-and-customisation.1
- frontend/tsconfig.json - v0.1.0-feat-feedback-and-customisation.1
""",backend/app/app/config/agent.yml +c67c4b54a3c641ec55f6fc4d3af315b1d91c4317,08-11-2023 13:51:52,GitHub Enterprise,"Feat: Feedback and customisation example integration (#46) + +""## impact surface
- frontend/Dockerfile - v0.1.0-feat-feedback-and-customisation.1
- frontend/custom_typings - v0.1.0-feat-feedback-and-customisation.1
- frontend/next.config.mjs - v0.1.0-feat-feedback-and-customisation.1
- frontend/package.json - v0.1.0-feat-feedback-and-customisation.1
- frontend/pnpm-lock.yaml - v0.1.0-feat-feedback-and-customisation.1
- frontend/postcss.config.cjs - v0.1.0-feat-feedback-and-customisation.1
- frontend/prettier.config.cjs - v0.1.0-feat-feedback-and-customisation.1
- frontend/prisma - v0.1.0-feat-feedback-and-customisation.1
- frontend/prismalib - v0.1.0-feat-feedback-and-customisation.1
- frontend/public - v0.1.0-feat-feedback-and-customisation.1
- frontend/src - v0.1.0-feat-feedback-and-customisation.1
- frontend/tailwind.config.ts - v0.1.0-feat-feedback-and-customisation.1
- frontend/tsconfig.json - v0.1.0-feat-feedback-and-customisation.1
""",backend/app/app/db/vector_db_pdf_ingestion.py +c67c4b54a3c641ec55f6fc4d3af315b1d91c4317,08-11-2023 13:51:52,GitHub Enterprise,"Feat: Feedback and customisation example integration (#46) + +""## impact surface
- frontend/Dockerfile - v0.1.0-feat-feedback-and-customisation.1
- frontend/custom_typings - v0.1.0-feat-feedback-and-customisation.1
- frontend/next.config.mjs - v0.1.0-feat-feedback-and-customisation.1
- frontend/package.json - v0.1.0-feat-feedback-and-customisation.1
- frontend/pnpm-lock.yaml - v0.1.0-feat-feedback-and-customisation.1
- frontend/postcss.config.cjs - v0.1.0-feat-feedback-and-customisation.1
- frontend/prettier.config.cjs - v0.1.0-feat-feedback-and-customisation.1
- frontend/prisma - v0.1.0-feat-feedback-and-customisation.1
- frontend/prismalib - v0.1.0-feat-feedback-and-customisation.1
- frontend/public - v0.1.0-feat-feedback-and-customisation.1
- frontend/src - v0.1.0-feat-feedback-and-customisation.1
- frontend/tailwind.config.ts - v0.1.0-feat-feedback-and-customisation.1
- frontend/tsconfig.json - v0.1.0-feat-feedback-and-customisation.1
""",backend/app/app/main.py +c67c4b54a3c641ec55f6fc4d3af315b1d91c4317,08-11-2023 13:51:52,GitHub Enterprise,"Feat: Feedback and customisation example integration (#46) + +""## impact surface
- frontend/Dockerfile - v0.1.0-feat-feedback-and-customisation.1
- frontend/custom_typings - v0.1.0-feat-feedback-and-customisation.1
- frontend/next.config.mjs - v0.1.0-feat-feedback-and-customisation.1
- frontend/package.json - v0.1.0-feat-feedback-and-customisation.1
- frontend/pnpm-lock.yaml - v0.1.0-feat-feedback-and-customisation.1
- frontend/postcss.config.cjs - v0.1.0-feat-feedback-and-customisation.1
- frontend/prettier.config.cjs - v0.1.0-feat-feedback-and-customisation.1
- frontend/prisma - v0.1.0-feat-feedback-and-customisation.1
- frontend/prismalib - v0.1.0-feat-feedback-and-customisation.1
- frontend/public - v0.1.0-feat-feedback-and-customisation.1
- frontend/src - v0.1.0-feat-feedback-and-customisation.1
- frontend/tailwind.config.ts - v0.1.0-feat-feedback-and-customisation.1
- frontend/tsconfig.json - v0.1.0-feat-feedback-and-customisation.1
""",backend/app/app/schemas/agent_schema.py +c67c4b54a3c641ec55f6fc4d3af315b1d91c4317,08-11-2023 13:51:52,GitHub Enterprise,"Feat: Feedback and customisation example integration (#46) + +""## impact surface
- frontend/Dockerfile - v0.1.0-feat-feedback-and-customisation.1
- frontend/custom_typings - v0.1.0-feat-feedback-and-customisation.1
- frontend/next.config.mjs - v0.1.0-feat-feedback-and-customisation.1
- frontend/package.json - v0.1.0-feat-feedback-and-customisation.1
- frontend/pnpm-lock.yaml - v0.1.0-feat-feedback-and-customisation.1
- frontend/postcss.config.cjs - v0.1.0-feat-feedback-and-customisation.1
- frontend/prettier.config.cjs - v0.1.0-feat-feedback-and-customisation.1
- frontend/prisma - v0.1.0-feat-feedback-and-customisation.1
- frontend/prismalib - v0.1.0-feat-feedback-and-customisation.1
- frontend/public - v0.1.0-feat-feedback-and-customisation.1
- frontend/src - v0.1.0-feat-feedback-and-customisation.1
- frontend/tailwind.config.ts - v0.1.0-feat-feedback-and-customisation.1
- frontend/tsconfig.json - v0.1.0-feat-feedback-and-customisation.1
""",backend/app/app/schemas/message_schema.py +c67c4b54a3c641ec55f6fc4d3af315b1d91c4317,08-11-2023 13:51:52,GitHub Enterprise,"Feat: Feedback and customisation example integration (#46) + +""## impact surface
- frontend/Dockerfile - v0.1.0-feat-feedback-and-customisation.1
- frontend/custom_typings - v0.1.0-feat-feedback-and-customisation.1
- frontend/next.config.mjs - v0.1.0-feat-feedback-and-customisation.1
- frontend/package.json - v0.1.0-feat-feedback-and-customisation.1
- frontend/pnpm-lock.yaml - v0.1.0-feat-feedback-and-customisation.1
- frontend/postcss.config.cjs - v0.1.0-feat-feedback-and-customisation.1
- frontend/prettier.config.cjs - v0.1.0-feat-feedback-and-customisation.1
- frontend/prisma - v0.1.0-feat-feedback-and-customisation.1
- frontend/prismalib - v0.1.0-feat-feedback-and-customisation.1
- frontend/public - v0.1.0-feat-feedback-and-customisation.1
- frontend/src - v0.1.0-feat-feedback-and-customisation.1
- frontend/tailwind.config.ts - v0.1.0-feat-feedback-and-customisation.1
- frontend/tsconfig.json - v0.1.0-feat-feedback-and-customisation.1
""",backend/app/app/schemas/tool_schema.py +c67c4b54a3c641ec55f6fc4d3af315b1d91c4317,08-11-2023 13:51:52,GitHub Enterprise,"Feat: Feedback and customisation example integration (#46) + +""## impact surface
- frontend/Dockerfile - v0.1.0-feat-feedback-and-customisation.1
- frontend/custom_typings - v0.1.0-feat-feedback-and-customisation.1
- frontend/next.config.mjs - v0.1.0-feat-feedback-and-customisation.1
- frontend/package.json - v0.1.0-feat-feedback-and-customisation.1
- frontend/pnpm-lock.yaml - v0.1.0-feat-feedback-and-customisation.1
- frontend/postcss.config.cjs - v0.1.0-feat-feedback-and-customisation.1
- frontend/prettier.config.cjs - v0.1.0-feat-feedback-and-customisation.1
- frontend/prisma - v0.1.0-feat-feedback-and-customisation.1
- frontend/prismalib - v0.1.0-feat-feedback-and-customisation.1
- frontend/public - v0.1.0-feat-feedback-and-customisation.1
- frontend/src - v0.1.0-feat-feedback-and-customisation.1
- frontend/tailwind.config.ts - v0.1.0-feat-feedback-and-customisation.1
- frontend/tsconfig.json - v0.1.0-feat-feedback-and-customisation.1
""",backend/app/app/services/chat_agent/meta_agent.py +c67c4b54a3c641ec55f6fc4d3af315b1d91c4317,08-11-2023 13:51:52,GitHub Enterprise,"Feat: Feedback and customisation example integration (#46) + +""## impact surface
- frontend/Dockerfile - v0.1.0-feat-feedback-and-customisation.1
- frontend/custom_typings - v0.1.0-feat-feedback-and-customisation.1
- frontend/next.config.mjs - v0.1.0-feat-feedback-and-customisation.1
- frontend/package.json - v0.1.0-feat-feedback-and-customisation.1
- frontend/pnpm-lock.yaml - v0.1.0-feat-feedback-and-customisation.1
- frontend/postcss.config.cjs - v0.1.0-feat-feedback-and-customisation.1
- frontend/prettier.config.cjs - v0.1.0-feat-feedback-and-customisation.1
- frontend/prisma - v0.1.0-feat-feedback-and-customisation.1
- frontend/prismalib - v0.1.0-feat-feedback-and-customisation.1
- frontend/public - v0.1.0-feat-feedback-and-customisation.1
- frontend/src - v0.1.0-feat-feedback-and-customisation.1
- frontend/tailwind.config.ts - v0.1.0-feat-feedback-and-customisation.1
- frontend/tsconfig.json - v0.1.0-feat-feedback-and-customisation.1
""",backend/app/app/services/chat_agent/router_agent/SimpleRouterAgent.py +c67c4b54a3c641ec55f6fc4d3af315b1d91c4317,08-11-2023 13:51:52,GitHub Enterprise,"Feat: Feedback and customisation example integration (#46) + +""## impact surface
- frontend/Dockerfile - v0.1.0-feat-feedback-and-customisation.1
- frontend/custom_typings - v0.1.0-feat-feedback-and-customisation.1
- frontend/next.config.mjs - v0.1.0-feat-feedback-and-customisation.1
- frontend/package.json - v0.1.0-feat-feedback-and-customisation.1
- frontend/pnpm-lock.yaml - v0.1.0-feat-feedback-and-customisation.1
- frontend/postcss.config.cjs - v0.1.0-feat-feedback-and-customisation.1
- frontend/prettier.config.cjs - v0.1.0-feat-feedback-and-customisation.1
- frontend/prisma - v0.1.0-feat-feedback-and-customisation.1
- frontend/prismalib - v0.1.0-feat-feedback-and-customisation.1
- frontend/public - v0.1.0-feat-feedback-and-customisation.1
- frontend/src - v0.1.0-feat-feedback-and-customisation.1
- frontend/tailwind.config.ts - v0.1.0-feat-feedback-and-customisation.1
- frontend/tsconfig.json - v0.1.0-feat-feedback-and-customisation.1
""",backend/app/app/services/chat_agent/tools/library/image_generation_tool/image_generation_tool.py +c67c4b54a3c641ec55f6fc4d3af315b1d91c4317,08-11-2023 13:51:52,GitHub Enterprise,"Feat: Feedback and customisation example integration (#46) + +""## impact surface
- frontend/Dockerfile - v0.1.0-feat-feedback-and-customisation.1
- frontend/custom_typings - v0.1.0-feat-feedback-and-customisation.1
- frontend/next.config.mjs - v0.1.0-feat-feedback-and-customisation.1
- frontend/package.json - v0.1.0-feat-feedback-and-customisation.1
- frontend/pnpm-lock.yaml - v0.1.0-feat-feedback-and-customisation.1
- frontend/postcss.config.cjs - v0.1.0-feat-feedback-and-customisation.1
- frontend/prettier.config.cjs - v0.1.0-feat-feedback-and-customisation.1
- frontend/prisma - v0.1.0-feat-feedback-and-customisation.1
- frontend/prismalib - v0.1.0-feat-feedback-and-customisation.1
- frontend/public - v0.1.0-feat-feedback-and-customisation.1
- frontend/src - v0.1.0-feat-feedback-and-customisation.1
- frontend/tailwind.config.ts - v0.1.0-feat-feedback-and-customisation.1
- frontend/tsconfig.json - v0.1.0-feat-feedback-and-customisation.1
""",backend/app/app/services/chat_agent/tools/library/sql_tool/sql_tool.py +c67c4b54a3c641ec55f6fc4d3af315b1d91c4317,08-11-2023 13:51:52,GitHub Enterprise,"Feat: Feedback and customisation example integration (#46) + +""## impact surface
- frontend/Dockerfile - v0.1.0-feat-feedback-and-customisation.1
- frontend/custom_typings - v0.1.0-feat-feedback-and-customisation.1
- frontend/next.config.mjs - v0.1.0-feat-feedback-and-customisation.1
- frontend/package.json - v0.1.0-feat-feedback-and-customisation.1
- frontend/pnpm-lock.yaml - v0.1.0-feat-feedback-and-customisation.1
- frontend/postcss.config.cjs - v0.1.0-feat-feedback-and-customisation.1
- frontend/prettier.config.cjs - v0.1.0-feat-feedback-and-customisation.1
- frontend/prisma - v0.1.0-feat-feedback-and-customisation.1
- frontend/prismalib - v0.1.0-feat-feedback-and-customisation.1
- frontend/public - v0.1.0-feat-feedback-and-customisation.1
- frontend/src - v0.1.0-feat-feedback-and-customisation.1
- frontend/tailwind.config.ts - v0.1.0-feat-feedback-and-customisation.1
- frontend/tsconfig.json - v0.1.0-feat-feedback-and-customisation.1
""",backend/app/app/services/chat_agent/tools/library/summarizer_tool/summarizer_tool.py +c67c4b54a3c641ec55f6fc4d3af315b1d91c4317,08-11-2023 13:51:52,GitHub Enterprise,"Feat: Feedback and customisation example integration (#46) + +""## impact surface
- frontend/Dockerfile - v0.1.0-feat-feedback-and-customisation.1
- frontend/custom_typings - v0.1.0-feat-feedback-and-customisation.1
- frontend/next.config.mjs - v0.1.0-feat-feedback-and-customisation.1
- frontend/package.json - v0.1.0-feat-feedback-and-customisation.1
- frontend/pnpm-lock.yaml - v0.1.0-feat-feedback-and-customisation.1
- frontend/postcss.config.cjs - v0.1.0-feat-feedback-and-customisation.1
- frontend/prettier.config.cjs - v0.1.0-feat-feedback-and-customisation.1
- frontend/prisma - v0.1.0-feat-feedback-and-customisation.1
- frontend/prismalib - v0.1.0-feat-feedback-and-customisation.1
- frontend/public - v0.1.0-feat-feedback-and-customisation.1
- frontend/src - v0.1.0-feat-feedback-and-customisation.1
- frontend/tailwind.config.ts - v0.1.0-feat-feedback-and-customisation.1
- frontend/tsconfig.json - v0.1.0-feat-feedback-and-customisation.1
""",backend/app/app/services/chat_agent/tools/library/visualizer_tool/visualizer_tool.py +c67c4b54a3c641ec55f6fc4d3af315b1d91c4317,08-11-2023 13:51:52,GitHub Enterprise,"Feat: Feedback and customisation example integration (#46) + +""## impact surface
- frontend/Dockerfile - v0.1.0-feat-feedback-and-customisation.1
- frontend/custom_typings - v0.1.0-feat-feedback-and-customisation.1
- frontend/next.config.mjs - v0.1.0-feat-feedback-and-customisation.1
- frontend/package.json - v0.1.0-feat-feedback-and-customisation.1
- frontend/pnpm-lock.yaml - v0.1.0-feat-feedback-and-customisation.1
- frontend/postcss.config.cjs - v0.1.0-feat-feedback-and-customisation.1
- frontend/prettier.config.cjs - v0.1.0-feat-feedback-and-customisation.1
- frontend/prisma - v0.1.0-feat-feedback-and-customisation.1
- frontend/prismalib - v0.1.0-feat-feedback-and-customisation.1
- frontend/public - v0.1.0-feat-feedback-and-customisation.1
- frontend/src - v0.1.0-feat-feedback-and-customisation.1
- frontend/tailwind.config.ts - v0.1.0-feat-feedback-and-customisation.1
- frontend/tsconfig.json - v0.1.0-feat-feedback-and-customisation.1
""",backend/app/poetry.lock +c67c4b54a3c641ec55f6fc4d3af315b1d91c4317,08-11-2023 13:51:52,GitHub Enterprise,"Feat: Feedback and customisation example integration (#46) + +""## impact surface
- frontend/Dockerfile - v0.1.0-feat-feedback-and-customisation.1
- frontend/custom_typings - v0.1.0-feat-feedback-and-customisation.1
- frontend/next.config.mjs - v0.1.0-feat-feedback-and-customisation.1
- frontend/package.json - v0.1.0-feat-feedback-and-customisation.1
- frontend/pnpm-lock.yaml - v0.1.0-feat-feedback-and-customisation.1
- frontend/postcss.config.cjs - v0.1.0-feat-feedback-and-customisation.1
- frontend/prettier.config.cjs - v0.1.0-feat-feedback-and-customisation.1
- frontend/prisma - v0.1.0-feat-feedback-and-customisation.1
- frontend/prismalib - v0.1.0-feat-feedback-and-customisation.1
- frontend/public - v0.1.0-feat-feedback-and-customisation.1
- frontend/src - v0.1.0-feat-feedback-and-customisation.1
- frontend/tailwind.config.ts - v0.1.0-feat-feedback-and-customisation.1
- frontend/tsconfig.json - v0.1.0-feat-feedback-and-customisation.1
""",backend/app/pyproject.toml +c67c4b54a3c641ec55f6fc4d3af315b1d91c4317,08-11-2023 13:51:52,GitHub Enterprise,"Feat: Feedback and customisation example integration (#46) + +""## impact surface
- frontend/Dockerfile - v0.1.0-feat-feedback-and-customisation.1
- frontend/custom_typings - v0.1.0-feat-feedback-and-customisation.1
- frontend/next.config.mjs - v0.1.0-feat-feedback-and-customisation.1
- frontend/package.json - v0.1.0-feat-feedback-and-customisation.1
- frontend/pnpm-lock.yaml - v0.1.0-feat-feedback-and-customisation.1
- frontend/postcss.config.cjs - v0.1.0-feat-feedback-and-customisation.1
- frontend/prettier.config.cjs - v0.1.0-feat-feedback-and-customisation.1
- frontend/prisma - v0.1.0-feat-feedback-and-customisation.1
- frontend/prismalib - v0.1.0-feat-feedback-and-customisation.1
- frontend/public - v0.1.0-feat-feedback-and-customisation.1
- frontend/src - v0.1.0-feat-feedback-and-customisation.1
- frontend/tailwind.config.ts - v0.1.0-feat-feedback-and-customisation.1
- frontend/tsconfig.json - v0.1.0-feat-feedback-and-customisation.1
""",docker-compose-dev.yml +c67c4b54a3c641ec55f6fc4d3af315b1d91c4317,08-11-2023 13:51:52,GitHub Enterprise,"Feat: Feedback and customisation example integration (#46) + +""## impact surface
- frontend/Dockerfile - v0.1.0-feat-feedback-and-customisation.1
- frontend/custom_typings - v0.1.0-feat-feedback-and-customisation.1
- frontend/next.config.mjs - v0.1.0-feat-feedback-and-customisation.1
- frontend/package.json - v0.1.0-feat-feedback-and-customisation.1
- frontend/pnpm-lock.yaml - v0.1.0-feat-feedback-and-customisation.1
- frontend/postcss.config.cjs - v0.1.0-feat-feedback-and-customisation.1
- frontend/prettier.config.cjs - v0.1.0-feat-feedback-and-customisation.1
- frontend/prisma - v0.1.0-feat-feedback-and-customisation.1
- frontend/prismalib - v0.1.0-feat-feedback-and-customisation.1
- frontend/public - v0.1.0-feat-feedback-and-customisation.1
- frontend/src - v0.1.0-feat-feedback-and-customisation.1
- frontend/tailwind.config.ts - v0.1.0-feat-feedback-and-customisation.1
- frontend/tsconfig.json - v0.1.0-feat-feedback-and-customisation.1
""",docker-compose-local.yml +c67c4b54a3c641ec55f6fc4d3af315b1d91c4317,08-11-2023 13:51:52,GitHub Enterprise,"Feat: Feedback and customisation example integration (#46) + +""## impact surface
- frontend/Dockerfile - v0.1.0-feat-feedback-and-customisation.1
- frontend/custom_typings - v0.1.0-feat-feedback-and-customisation.1
- frontend/next.config.mjs - v0.1.0-feat-feedback-and-customisation.1
- frontend/package.json - v0.1.0-feat-feedback-and-customisation.1
- frontend/pnpm-lock.yaml - v0.1.0-feat-feedback-and-customisation.1
- frontend/postcss.config.cjs - v0.1.0-feat-feedback-and-customisation.1
- frontend/prettier.config.cjs - v0.1.0-feat-feedback-and-customisation.1
- frontend/prisma - v0.1.0-feat-feedback-and-customisation.1
- frontend/prismalib - v0.1.0-feat-feedback-and-customisation.1
- frontend/public - v0.1.0-feat-feedback-and-customisation.1
- frontend/src - v0.1.0-feat-feedback-and-customisation.1
- frontend/tailwind.config.ts - v0.1.0-feat-feedback-and-customisation.1
- frontend/tsconfig.json - v0.1.0-feat-feedback-and-customisation.1
""",docker-compose.yml +c67c4b54a3c641ec55f6fc4d3af315b1d91c4317,08-11-2023 13:51:52,GitHub Enterprise,"Feat: Feedback and customisation example integration (#46) + +""## impact surface
- frontend/Dockerfile - v0.1.0-feat-feedback-and-customisation.1
- frontend/custom_typings - v0.1.0-feat-feedback-and-customisation.1
- frontend/next.config.mjs - v0.1.0-feat-feedback-and-customisation.1
- frontend/package.json - v0.1.0-feat-feedback-and-customisation.1
- frontend/pnpm-lock.yaml - v0.1.0-feat-feedback-and-customisation.1
- frontend/postcss.config.cjs - v0.1.0-feat-feedback-and-customisation.1
- frontend/prettier.config.cjs - v0.1.0-feat-feedback-and-customisation.1
- frontend/prisma - v0.1.0-feat-feedback-and-customisation.1
- frontend/prismalib - v0.1.0-feat-feedback-and-customisation.1
- frontend/public - v0.1.0-feat-feedback-and-customisation.1
- frontend/src - v0.1.0-feat-feedback-and-customisation.1
- frontend/tailwind.config.ts - v0.1.0-feat-feedback-and-customisation.1
- frontend/tsconfig.json - v0.1.0-feat-feedback-and-customisation.1
""",frontend/.env.example +c67c4b54a3c641ec55f6fc4d3af315b1d91c4317,08-11-2023 13:51:52,GitHub Enterprise,"Feat: Feedback and customisation example integration (#46) + +""## impact surface
- frontend/Dockerfile - v0.1.0-feat-feedback-and-customisation.1
- frontend/custom_typings - v0.1.0-feat-feedback-and-customisation.1
- frontend/next.config.mjs - v0.1.0-feat-feedback-and-customisation.1
- frontend/package.json - v0.1.0-feat-feedback-and-customisation.1
- frontend/pnpm-lock.yaml - v0.1.0-feat-feedback-and-customisation.1
- frontend/postcss.config.cjs - v0.1.0-feat-feedback-and-customisation.1
- frontend/prettier.config.cjs - v0.1.0-feat-feedback-and-customisation.1
- frontend/prisma - v0.1.0-feat-feedback-and-customisation.1
- frontend/prismalib - v0.1.0-feat-feedback-and-customisation.1
- frontend/public - v0.1.0-feat-feedback-and-customisation.1
- frontend/src - v0.1.0-feat-feedback-and-customisation.1
- frontend/tailwind.config.ts - v0.1.0-feat-feedback-and-customisation.1
- frontend/tsconfig.json - v0.1.0-feat-feedback-and-customisation.1
""",frontend/.env.example.dev +c67c4b54a3c641ec55f6fc4d3af315b1d91c4317,08-11-2023 13:51:52,GitHub Enterprise,"Feat: Feedback and customisation example integration (#46) + +""## impact surface
- frontend/Dockerfile - v0.1.0-feat-feedback-and-customisation.1
- frontend/custom_typings - v0.1.0-feat-feedback-and-customisation.1
- frontend/next.config.mjs - v0.1.0-feat-feedback-and-customisation.1
- frontend/package.json - v0.1.0-feat-feedback-and-customisation.1
- frontend/pnpm-lock.yaml - v0.1.0-feat-feedback-and-customisation.1
- frontend/postcss.config.cjs - v0.1.0-feat-feedback-and-customisation.1
- frontend/prettier.config.cjs - v0.1.0-feat-feedback-and-customisation.1
- frontend/prisma - v0.1.0-feat-feedback-and-customisation.1
- frontend/prismalib - v0.1.0-feat-feedback-and-customisation.1
- frontend/public - v0.1.0-feat-feedback-and-customisation.1
- frontend/src - v0.1.0-feat-feedback-and-customisation.1
- frontend/tailwind.config.ts - v0.1.0-feat-feedback-and-customisation.1
- frontend/tsconfig.json - v0.1.0-feat-feedback-and-customisation.1
""",frontend/.env.example.local +c67c4b54a3c641ec55f6fc4d3af315b1d91c4317,08-11-2023 13:51:52,GitHub Enterprise,"Feat: Feedback and customisation example integration (#46) + +""## impact surface
- frontend/Dockerfile - v0.1.0-feat-feedback-and-customisation.1
- frontend/custom_typings - v0.1.0-feat-feedback-and-customisation.1
- frontend/next.config.mjs - v0.1.0-feat-feedback-and-customisation.1
- frontend/package.json - v0.1.0-feat-feedback-and-customisation.1
- frontend/pnpm-lock.yaml - v0.1.0-feat-feedback-and-customisation.1
- frontend/postcss.config.cjs - v0.1.0-feat-feedback-and-customisation.1
- frontend/prettier.config.cjs - v0.1.0-feat-feedback-and-customisation.1
- frontend/prisma - v0.1.0-feat-feedback-and-customisation.1
- frontend/prismalib - v0.1.0-feat-feedback-and-customisation.1
- frontend/public - v0.1.0-feat-feedback-and-customisation.1
- frontend/src - v0.1.0-feat-feedback-and-customisation.1
- frontend/tailwind.config.ts - v0.1.0-feat-feedback-and-customisation.1
- frontend/tsconfig.json - v0.1.0-feat-feedback-and-customisation.1
""",frontend/package.json +c67c4b54a3c641ec55f6fc4d3af315b1d91c4317,08-11-2023 13:51:52,GitHub Enterprise,"Feat: Feedback and customisation example integration (#46) + +""## impact surface
- frontend/Dockerfile - v0.1.0-feat-feedback-and-customisation.1
- frontend/custom_typings - v0.1.0-feat-feedback-and-customisation.1
- frontend/next.config.mjs - v0.1.0-feat-feedback-and-customisation.1
- frontend/package.json - v0.1.0-feat-feedback-and-customisation.1
- frontend/pnpm-lock.yaml - v0.1.0-feat-feedback-and-customisation.1
- frontend/postcss.config.cjs - v0.1.0-feat-feedback-and-customisation.1
- frontend/prettier.config.cjs - v0.1.0-feat-feedback-and-customisation.1
- frontend/prisma - v0.1.0-feat-feedback-and-customisation.1
- frontend/prismalib - v0.1.0-feat-feedback-and-customisation.1
- frontend/public - v0.1.0-feat-feedback-and-customisation.1
- frontend/src - v0.1.0-feat-feedback-and-customisation.1
- frontend/tailwind.config.ts - v0.1.0-feat-feedback-and-customisation.1
- frontend/tsconfig.json - v0.1.0-feat-feedback-and-customisation.1
""",frontend/pnpm-lock.yaml +c67c4b54a3c641ec55f6fc4d3af315b1d91c4317,08-11-2023 13:51:52,GitHub Enterprise,"Feat: Feedback and customisation example integration (#46) + +""## impact surface
- frontend/Dockerfile - v0.1.0-feat-feedback-and-customisation.1
- frontend/custom_typings - v0.1.0-feat-feedback-and-customisation.1
- frontend/next.config.mjs - v0.1.0-feat-feedback-and-customisation.1
- frontend/package.json - v0.1.0-feat-feedback-and-customisation.1
- frontend/pnpm-lock.yaml - v0.1.0-feat-feedback-and-customisation.1
- frontend/postcss.config.cjs - v0.1.0-feat-feedback-and-customisation.1
- frontend/prettier.config.cjs - v0.1.0-feat-feedback-and-customisation.1
- frontend/prisma - v0.1.0-feat-feedback-and-customisation.1
- frontend/prismalib - v0.1.0-feat-feedback-and-customisation.1
- frontend/public - v0.1.0-feat-feedback-and-customisation.1
- frontend/src - v0.1.0-feat-feedback-and-customisation.1
- frontend/tailwind.config.ts - v0.1.0-feat-feedback-and-customisation.1
- frontend/tsconfig.json - v0.1.0-feat-feedback-and-customisation.1
""",frontend/src/components/ConversationView/MessageView/FeedbackView/index.tsx +c67c4b54a3c641ec55f6fc4d3af315b1d91c4317,08-11-2023 13:51:52,GitHub Enterprise,"Feat: Feedback and customisation example integration (#46) + +""## impact surface
- frontend/Dockerfile - v0.1.0-feat-feedback-and-customisation.1
- frontend/custom_typings - v0.1.0-feat-feedback-and-customisation.1
- frontend/next.config.mjs - v0.1.0-feat-feedback-and-customisation.1
- frontend/package.json - v0.1.0-feat-feedback-and-customisation.1
- frontend/pnpm-lock.yaml - v0.1.0-feat-feedback-and-customisation.1
- frontend/postcss.config.cjs - v0.1.0-feat-feedback-and-customisation.1
- frontend/prettier.config.cjs - v0.1.0-feat-feedback-and-customisation.1
- frontend/prisma - v0.1.0-feat-feedback-and-customisation.1
- frontend/prismalib - v0.1.0-feat-feedback-and-customisation.1
- frontend/public - v0.1.0-feat-feedback-and-customisation.1
- frontend/src - v0.1.0-feat-feedback-and-customisation.1
- frontend/tailwind.config.ts - v0.1.0-feat-feedback-and-customisation.1
- frontend/tsconfig.json - v0.1.0-feat-feedback-and-customisation.1
""",frontend/src/components/ConversationView/MessageView/index.tsx +c67c4b54a3c641ec55f6fc4d3af315b1d91c4317,08-11-2023 13:51:52,GitHub Enterprise,"Feat: Feedback and customisation example integration (#46) + +""## impact surface
- frontend/Dockerfile - v0.1.0-feat-feedback-and-customisation.1
- frontend/custom_typings - v0.1.0-feat-feedback-and-customisation.1
- frontend/next.config.mjs - v0.1.0-feat-feedback-and-customisation.1
- frontend/package.json - v0.1.0-feat-feedback-and-customisation.1
- frontend/pnpm-lock.yaml - v0.1.0-feat-feedback-and-customisation.1
- frontend/postcss.config.cjs - v0.1.0-feat-feedback-and-customisation.1
- frontend/prettier.config.cjs - v0.1.0-feat-feedback-and-customisation.1
- frontend/prisma - v0.1.0-feat-feedback-and-customisation.1
- frontend/prismalib - v0.1.0-feat-feedback-and-customisation.1
- frontend/public - v0.1.0-feat-feedback-and-customisation.1
- frontend/src - v0.1.0-feat-feedback-and-customisation.1
- frontend/tailwind.config.ts - v0.1.0-feat-feedback-and-customisation.1
- frontend/tsconfig.json - v0.1.0-feat-feedback-and-customisation.1
""",frontend/src/components/ConversationView/index.tsx +c67c4b54a3c641ec55f6fc4d3af315b1d91c4317,08-11-2023 13:51:52,GitHub Enterprise,"Feat: Feedback and customisation example integration (#46) + +""## impact surface
- frontend/Dockerfile - v0.1.0-feat-feedback-and-customisation.1
- frontend/custom_typings - v0.1.0-feat-feedback-and-customisation.1
- frontend/next.config.mjs - v0.1.0-feat-feedback-and-customisation.1
- frontend/package.json - v0.1.0-feat-feedback-and-customisation.1
- frontend/pnpm-lock.yaml - v0.1.0-feat-feedback-and-customisation.1
- frontend/postcss.config.cjs - v0.1.0-feat-feedback-and-customisation.1
- frontend/prettier.config.cjs - v0.1.0-feat-feedback-and-customisation.1
- frontend/prisma - v0.1.0-feat-feedback-and-customisation.1
- frontend/prismalib - v0.1.0-feat-feedback-and-customisation.1
- frontend/public - v0.1.0-feat-feedback-and-customisation.1
- frontend/src - v0.1.0-feat-feedback-and-customisation.1
- frontend/tailwind.config.ts - v0.1.0-feat-feedback-and-customisation.1
- frontend/tsconfig.json - v0.1.0-feat-feedback-and-customisation.1
""",frontend/src/components/Sidebar/SettingsModal.tsx +c67c4b54a3c641ec55f6fc4d3af315b1d91c4317,08-11-2023 13:51:52,GitHub Enterprise,"Feat: Feedback and customisation example integration (#46) + +""## impact surface
- frontend/Dockerfile - v0.1.0-feat-feedback-and-customisation.1
- frontend/custom_typings - v0.1.0-feat-feedback-and-customisation.1
- frontend/next.config.mjs - v0.1.0-feat-feedback-and-customisation.1
- frontend/package.json - v0.1.0-feat-feedback-and-customisation.1
- frontend/pnpm-lock.yaml - v0.1.0-feat-feedback-and-customisation.1
- frontend/postcss.config.cjs - v0.1.0-feat-feedback-and-customisation.1
- frontend/prettier.config.cjs - v0.1.0-feat-feedback-and-customisation.1
- frontend/prisma - v0.1.0-feat-feedback-and-customisation.1
- frontend/prismalib - v0.1.0-feat-feedback-and-customisation.1
- frontend/public - v0.1.0-feat-feedback-and-customisation.1
- frontend/src - v0.1.0-feat-feedback-and-customisation.1
- frontend/tailwind.config.ts - v0.1.0-feat-feedback-and-customisation.1
- frontend/tsconfig.json - v0.1.0-feat-feedback-and-customisation.1
""",frontend/src/components/Sidebar/index.tsx +c67c4b54a3c641ec55f6fc4d3af315b1d91c4317,08-11-2023 13:51:52,GitHub Enterprise,"Feat: Feedback and customisation example integration (#46) + +""## impact surface
- frontend/Dockerfile - v0.1.0-feat-feedback-and-customisation.1
- frontend/custom_typings - v0.1.0-feat-feedback-and-customisation.1
- frontend/next.config.mjs - v0.1.0-feat-feedback-and-customisation.1
- frontend/package.json - v0.1.0-feat-feedback-and-customisation.1
- frontend/pnpm-lock.yaml - v0.1.0-feat-feedback-and-customisation.1
- frontend/postcss.config.cjs - v0.1.0-feat-feedback-and-customisation.1
- frontend/prettier.config.cjs - v0.1.0-feat-feedback-and-customisation.1
- frontend/prisma - v0.1.0-feat-feedback-and-customisation.1
- frontend/prismalib - v0.1.0-feat-feedback-and-customisation.1
- frontend/public - v0.1.0-feat-feedback-and-customisation.1
- frontend/src - v0.1.0-feat-feedback-and-customisation.1
- frontend/tailwind.config.ts - v0.1.0-feat-feedback-and-customisation.1
- frontend/tsconfig.json - v0.1.0-feat-feedback-and-customisation.1
""",frontend/src/pages/index.tsx +c67c4b54a3c641ec55f6fc4d3af315b1d91c4317,08-11-2023 13:51:52,GitHub Enterprise,"Feat: Feedback and customisation example integration (#46) + +""## impact surface
- frontend/Dockerfile - v0.1.0-feat-feedback-and-customisation.1
- frontend/custom_typings - v0.1.0-feat-feedback-and-customisation.1
- frontend/next.config.mjs - v0.1.0-feat-feedback-and-customisation.1
- frontend/package.json - v0.1.0-feat-feedback-and-customisation.1
- frontend/pnpm-lock.yaml - v0.1.0-feat-feedback-and-customisation.1
- frontend/postcss.config.cjs - v0.1.0-feat-feedback-and-customisation.1
- frontend/prettier.config.cjs - v0.1.0-feat-feedback-and-customisation.1
- frontend/prisma - v0.1.0-feat-feedback-and-customisation.1
- frontend/prismalib - v0.1.0-feat-feedback-and-customisation.1
- frontend/public - v0.1.0-feat-feedback-and-customisation.1
- frontend/src - v0.1.0-feat-feedback-and-customisation.1
- frontend/tailwind.config.ts - v0.1.0-feat-feedback-and-customisation.1
- frontend/tsconfig.json - v0.1.0-feat-feedback-and-customisation.1
""",frontend/src/store/settings.ts +c67c4b54a3c641ec55f6fc4d3af315b1d91c4317,08-11-2023 13:51:52,GitHub Enterprise,"Feat: Feedback and customisation example integration (#46) + +""## impact surface
- frontend/Dockerfile - v0.1.0-feat-feedback-and-customisation.1
- frontend/custom_typings - v0.1.0-feat-feedback-and-customisation.1
- frontend/next.config.mjs - v0.1.0-feat-feedback-and-customisation.1
- frontend/package.json - v0.1.0-feat-feedback-and-customisation.1
- frontend/pnpm-lock.yaml - v0.1.0-feat-feedback-and-customisation.1
- frontend/postcss.config.cjs - v0.1.0-feat-feedback-and-customisation.1
- frontend/prettier.config.cjs - v0.1.0-feat-feedback-and-customisation.1
- frontend/prisma - v0.1.0-feat-feedback-and-customisation.1
- frontend/prismalib - v0.1.0-feat-feedback-and-customisation.1
- frontend/public - v0.1.0-feat-feedback-and-customisation.1
- frontend/src - v0.1.0-feat-feedback-and-customisation.1
- frontend/tailwind.config.ts - v0.1.0-feat-feedback-and-customisation.1
- frontend/tsconfig.json - v0.1.0-feat-feedback-and-customisation.1
""",frontend/src/types/message.ts +c67c4b54a3c641ec55f6fc4d3af315b1d91c4317,08-11-2023 13:51:52,GitHub Enterprise,"Feat: Feedback and customisation example integration (#46) + +""## impact surface
- frontend/Dockerfile - v0.1.0-feat-feedback-and-customisation.1
- frontend/custom_typings - v0.1.0-feat-feedback-and-customisation.1
- frontend/next.config.mjs - v0.1.0-feat-feedback-and-customisation.1
- frontend/package.json - v0.1.0-feat-feedback-and-customisation.1
- frontend/pnpm-lock.yaml - v0.1.0-feat-feedback-and-customisation.1
- frontend/postcss.config.cjs - v0.1.0-feat-feedback-and-customisation.1
- frontend/prettier.config.cjs - v0.1.0-feat-feedback-and-customisation.1
- frontend/prisma - v0.1.0-feat-feedback-and-customisation.1
- frontend/prismalib - v0.1.0-feat-feedback-and-customisation.1
- frontend/public - v0.1.0-feat-feedback-and-customisation.1
- frontend/src - v0.1.0-feat-feedback-and-customisation.1
- frontend/tailwind.config.ts - v0.1.0-feat-feedback-and-customisation.1
- frontend/tsconfig.json - v0.1.0-feat-feedback-and-customisation.1
""",frontend/src/types/settings.ts +c67c4b54a3c641ec55f6fc4d3af315b1d91c4317,08-11-2023 13:51:52,GitHub Enterprise,"Feat: Feedback and customisation example integration (#46) + +""## impact surface
- frontend/Dockerfile - v0.1.0-feat-feedback-and-customisation.1
- frontend/custom_typings - v0.1.0-feat-feedback-and-customisation.1
- frontend/next.config.mjs - v0.1.0-feat-feedback-and-customisation.1
- frontend/package.json - v0.1.0-feat-feedback-and-customisation.1
- frontend/pnpm-lock.yaml - v0.1.0-feat-feedback-and-customisation.1
- frontend/postcss.config.cjs - v0.1.0-feat-feedback-and-customisation.1
- frontend/prettier.config.cjs - v0.1.0-feat-feedback-and-customisation.1
- frontend/prisma - v0.1.0-feat-feedback-and-customisation.1
- frontend/prismalib - v0.1.0-feat-feedback-and-customisation.1
- frontend/public - v0.1.0-feat-feedback-and-customisation.1
- frontend/src - v0.1.0-feat-feedback-and-customisation.1
- frontend/tailwind.config.ts - v0.1.0-feat-feedback-and-customisation.1
- frontend/tsconfig.json - v0.1.0-feat-feedback-and-customisation.1
""",setup.md +0d0117ca70c5fc164fea600e08cdff8666600222,08-11-2023 13:57:10,Jakob Heyder,Fix: README,README.md +c2b5477f60d3d04f53ee7bf54e0c167bf1824af0,09-22-2023 16:29:06,Howitt-Ben,"Feature/local langsmith (#22) + +* fix: switch to local langsmith (issue in docker-compose networking + +* fix: langchain playground networking + +* fix: revert to langsmith feedback + +* feature: add missing langchain-redis service + ++fix: remove unused network labels in non-local dev",.env.example +c2b5477f60d3d04f53ee7bf54e0c167bf1824af0,09-22-2023 16:29:06,Howitt-Ben,"Feature/local langsmith (#22) + +* fix: switch to local langsmith (issue in docker-compose networking + +* fix: langchain playground networking + +* fix: revert to langsmith feedback + +* feature: add missing langchain-redis service + ++fix: remove unused network labels in non-local dev",.env.example.dev +c2b5477f60d3d04f53ee7bf54e0c167bf1824af0,09-22-2023 16:29:06,Howitt-Ben,"Feature/local langsmith (#22) + +* fix: switch to local langsmith (issue in docker-compose networking + +* fix: langchain playground networking + +* fix: revert to langsmith feedback + +* feature: add missing langchain-redis service + ++fix: remove unused network labels in non-local dev",.env.example.local +c2b5477f60d3d04f53ee7bf54e0c167bf1824af0,09-22-2023 16:29:06,Howitt-Ben,"Feature/local langsmith (#22) + +* fix: switch to local langsmith (issue in docker-compose networking + +* fix: langchain playground networking + +* fix: revert to langsmith feedback + +* feature: add missing langchain-redis service + ++fix: remove unused network labels in non-local dev",backend/app/app/api/v1/endpoints/statistics.py +c2b5477f60d3d04f53ee7bf54e0c167bf1824af0,09-22-2023 16:29:06,Howitt-Ben,"Feature/local langsmith (#22) + +* fix: switch to local langsmith (issue in docker-compose networking + +* fix: langchain playground networking + +* fix: revert to langsmith feedback + +* feature: add missing langchain-redis service + ++fix: remove unused network labels in non-local dev",docker-compose-dev.yml +c2b5477f60d3d04f53ee7bf54e0c167bf1824af0,09-22-2023 16:29:06,Howitt-Ben,"Feature/local langsmith (#22) + +* fix: switch to local langsmith (issue in docker-compose networking + +* fix: langchain playground networking + +* fix: revert to langsmith feedback + +* feature: add missing langchain-redis service + ++fix: remove unused network labels in non-local dev",docker-compose-local.yml +c2b5477f60d3d04f53ee7bf54e0c167bf1824af0,09-22-2023 16:29:06,Howitt-Ben,"Feature/local langsmith (#22) + +* fix: switch to local langsmith (issue in docker-compose networking + +* fix: langchain playground networking + +* fix: revert to langsmith feedback + +* feature: add missing langchain-redis service + ++fix: remove unused network labels in non-local dev",docker-compose.yml +fa5b40e3ae7b4bae23eee692a84e6b72e90751c7,09-25-2023 14:40:48,GitHub Enterprise,"Updated env vars for LangSmith (#48) + +""## impact surface
No services changed
""",.env.example +fa5b40e3ae7b4bae23eee692a84e6b72e90751c7,09-25-2023 14:40:48,GitHub Enterprise,"Updated env vars for LangSmith (#48) + +""## impact surface
No services changed
""",.env.example.dev +fa5b40e3ae7b4bae23eee692a84e6b72e90751c7,09-25-2023 14:40:48,GitHub Enterprise,"Updated env vars for LangSmith (#48) + +""## impact surface
No services changed
""",.env.example.local +23951aed3faed2df71e993c797a9e80881c970ca,09-25-2023 14:41:22,GitHub Enterprise,"Documentation simplification (#49) + +""## impact surface
No services changed
"" + +- Wording simplified",setup.md +f210c789e707b15e897a61aee1e4adc5cd896162,09-25-2023 14:43:37,GitHub Enterprise,"DevEx suggestion to change Readme (#53) + +""## impact surface
No services changed
"" + + +@vanLangen-Casper I'm opening this PR as discussed in the DevEx session.",setup.md +d35aba6eb6e3afe805cee754737ec750a3163f91,10-05-2023 09:38:20,Jakob Heyder,Fix: Cleanup v0,frontend/src/components/CodeView/SideDrawer/ExecutionWarningBanner.tsx +d35aba6eb6e3afe805cee754737ec750a3163f91,10-05-2023 09:38:20,Jakob Heyder,Fix: Cleanup v0,frontend/src/components/CodeView/SideDrawer/index.tsx +d35aba6eb6e3afe805cee754737ec750a3163f91,10-05-2023 09:38:20,Jakob Heyder,Fix: Cleanup v0,frontend/src/components/ConversationView/index.tsx +d35aba6eb6e3afe805cee754737ec750a3163f91,10-05-2023 09:38:20,Jakob Heyder,Fix: Cleanup v0,frontend/src/components/Sidebar/DataStorageBanner.tsx +d35aba6eb6e3afe805cee754737ec750a3163f91,10-05-2023 09:38:20,Jakob Heyder,Fix: Cleanup v0,frontend/src/pages/_app.tsx +d35aba6eb6e3afe805cee754737ec750a3163f91,10-05-2023 09:38:20,Jakob Heyder,Fix: Cleanup v0,frontend/src/pages/index.tsx +d35aba6eb6e3afe805cee754737ec750a3163f91,10-05-2023 09:38:20,Jakob Heyder,Fix: Cleanup v0,frontend/src/store/layout.ts +d35aba6eb6e3afe805cee754737ec750a3163f91,10-05-2023 09:38:20,Jakob Heyder,Fix: Cleanup v0,frontend/src/styles/data-table.css +d35aba6eb6e3afe805cee754737ec750a3163f91,10-05-2023 09:38:20,Jakob Heyder,Fix: Cleanup v0,frontend/src/styles/globals.css +d35aba6eb6e3afe805cee754737ec750a3163f91,10-05-2023 09:38:20,Jakob Heyder,Fix: Cleanup v0,frontend/src/styles/mui.css +5fce6ce88c6250114e468c5ed9c09b4f30a4a4c2,10-06-2023 15:11:37,GitHub Enterprise,Merge branch 'develop' into fix/local-langsmith,.env.example +5fce6ce88c6250114e468c5ed9c09b4f30a4a4c2,10-06-2023 15:11:37,GitHub Enterprise,Merge branch 'develop' into fix/local-langsmith,.env.example.dev +5fce6ce88c6250114e468c5ed9c09b4f30a4a4c2,10-06-2023 15:11:37,GitHub Enterprise,Merge branch 'develop' into fix/local-langsmith,.env.example.local +5fce6ce88c6250114e468c5ed9c09b4f30a4a4c2,10-06-2023 15:11:37,GitHub Enterprise,Merge branch 'develop' into fix/local-langsmith,frontend/src/components/CodeView/SideDrawer/ExecutionWarningBanner.tsx +5fce6ce88c6250114e468c5ed9c09b4f30a4a4c2,10-06-2023 15:11:37,GitHub Enterprise,Merge branch 'develop' into fix/local-langsmith,frontend/src/components/CodeView/SideDrawer/index.tsx +5fce6ce88c6250114e468c5ed9c09b4f30a4a4c2,10-06-2023 15:11:37,GitHub Enterprise,Merge branch 'develop' into fix/local-langsmith,frontend/src/components/ConversationView/index.tsx +5fce6ce88c6250114e468c5ed9c09b4f30a4a4c2,10-06-2023 15:11:37,GitHub Enterprise,Merge branch 'develop' into fix/local-langsmith,frontend/src/components/Sidebar/DataStorageBanner.tsx +5fce6ce88c6250114e468c5ed9c09b4f30a4a4c2,10-06-2023 15:11:37,GitHub Enterprise,Merge branch 'develop' into fix/local-langsmith,frontend/src/pages/_app.tsx +5fce6ce88c6250114e468c5ed9c09b4f30a4a4c2,10-06-2023 15:11:37,GitHub Enterprise,Merge branch 'develop' into fix/local-langsmith,frontend/src/pages/index.tsx +5fce6ce88c6250114e468c5ed9c09b4f30a4a4c2,10-06-2023 15:11:37,GitHub Enterprise,Merge branch 'develop' into fix/local-langsmith,frontend/src/store/layout.ts +5fce6ce88c6250114e468c5ed9c09b4f30a4a4c2,10-06-2023 15:11:37,GitHub Enterprise,Merge branch 'develop' into fix/local-langsmith,frontend/src/styles/data-table.css +5fce6ce88c6250114e468c5ed9c09b4f30a4a4c2,10-06-2023 15:11:37,GitHub Enterprise,Merge branch 'develop' into fix/local-langsmith,frontend/src/styles/globals.css +5fce6ce88c6250114e468c5ed9c09b4f30a4a4c2,10-06-2023 15:11:37,GitHub Enterprise,Merge branch 'develop' into fix/local-langsmith,frontend/src/styles/mui.css +5fce6ce88c6250114e468c5ed9c09b4f30a4a4c2,10-06-2023 15:11:37,GitHub Enterprise,Merge branch 'develop' into fix/local-langsmith,setup.md +cca3e5dfc8603837f2c2cd3266ef7da32046a0e8,10-06-2023 15:14:20,Howitt-Ben,"Add Langsmith queue as images and pin versions (#31) + +* Add Langsmith queue as images and pin versions + +* tidy: remove unused feedback server + +* Update README on how to modify Langsmith versions + +Co-authored-by: Howitt-Ben ",README.md +cca3e5dfc8603837f2c2cd3266ef7da32046a0e8,10-06-2023 15:14:20,Howitt-Ben,"Add Langsmith queue as images and pin versions (#31) + +* Add Langsmith queue as images and pin versions + +* tidy: remove unused feedback server + +* Update README on how to modify Langsmith versions + +Co-authored-by: Howitt-Ben ",docker-compose-dev.yml +cca3e5dfc8603837f2c2cd3266ef7da32046a0e8,10-06-2023 15:14:20,Howitt-Ben,"Add Langsmith queue as images and pin versions (#31) + +* Add Langsmith queue as images and pin versions + +* tidy: remove unused feedback server + +* Update README on how to modify Langsmith versions + +Co-authored-by: Howitt-Ben ",docker-compose-local.yml +cca3e5dfc8603837f2c2cd3266ef7da32046a0e8,10-06-2023 15:14:20,Howitt-Ben,"Add Langsmith queue as images and pin versions (#31) + +* Add Langsmith queue as images and pin versions + +* tidy: remove unused feedback server + +* Update README on how to modify Langsmith versions + +Co-authored-by: Howitt-Ben ",docker-compose.yml +ff6ccaab2ffcdcb34fd2f57ac70e802f2e19810f,10-09-2023 19:00:38,GitHub Enterprise,"Merge pull request #52 from NovoNordisk/fix/local-langsmith + +Fix self-hosted langsmith (#22)",.env.example +ff6ccaab2ffcdcb34fd2f57ac70e802f2e19810f,10-09-2023 19:00:38,GitHub Enterprise,"Merge pull request #52 from NovoNordisk/fix/local-langsmith + +Fix self-hosted langsmith (#22)",.env.example.dev +ff6ccaab2ffcdcb34fd2f57ac70e802f2e19810f,10-09-2023 19:00:38,GitHub Enterprise,"Merge pull request #52 from NovoNordisk/fix/local-langsmith + +Fix self-hosted langsmith (#22)",.env.example.local +ff6ccaab2ffcdcb34fd2f57ac70e802f2e19810f,10-09-2023 19:00:38,GitHub Enterprise,"Merge pull request #52 from NovoNordisk/fix/local-langsmith + +Fix self-hosted langsmith (#22)",README.md +ff6ccaab2ffcdcb34fd2f57ac70e802f2e19810f,10-09-2023 19:00:38,GitHub Enterprise,"Merge pull request #52 from NovoNordisk/fix/local-langsmith + +Fix self-hosted langsmith (#22)",backend/app/app/api/v1/endpoints/statistics.py +ff6ccaab2ffcdcb34fd2f57ac70e802f2e19810f,10-09-2023 19:00:38,GitHub Enterprise,"Merge pull request #52 from NovoNordisk/fix/local-langsmith + +Fix self-hosted langsmith (#22)",docker-compose-dev.yml +ff6ccaab2ffcdcb34fd2f57ac70e802f2e19810f,10-09-2023 19:00:38,GitHub Enterprise,"Merge pull request #52 from NovoNordisk/fix/local-langsmith + +Fix self-hosted langsmith (#22)",docker-compose-local.yml +ff6ccaab2ffcdcb34fd2f57ac70e802f2e19810f,10-09-2023 19:00:38,GitHub Enterprise,"Merge pull request #52 from NovoNordisk/fix/local-langsmith + +Fix self-hosted langsmith (#22)",docker-compose.yml +6b5bc98002ef66c5ccc1db2ce3dfc764c5543fc4,10-09-2023 19:38:59,Howitt-Ben,fix: add missing key that must be set for self-hosted langsmith,.env.example +6b5bc98002ef66c5ccc1db2ce3dfc764c5543fc4,10-09-2023 19:38:59,Howitt-Ben,fix: add missing key that must be set for self-hosted langsmith,.env.example.dev +6b5bc98002ef66c5ccc1db2ce3dfc764c5543fc4,10-09-2023 19:38:59,Howitt-Ben,fix: add missing key that must be set for self-hosted langsmith,.env.example.local +1ab65beb3cee646b9b97d0118813d64e4ffcaa3d,10-09-2023 19:39:37,Howitt-Ben,fix: typo,.env.example +1ab65beb3cee646b9b97d0118813d64e4ffcaa3d,10-09-2023 19:39:37,Howitt-Ben,fix: typo,.env.example.dev +1ab65beb3cee646b9b97d0118813d64e4ffcaa3d,10-09-2023 19:39:37,Howitt-Ben,fix: typo,.env.example.local +459f7ea2a1183e848ad2d5c919bea9cf12f979d6,10-11-2023 09:37:48,GitHub Enterprise,"Merge pull request #56 from Howitt-Ben/develop + +fix: typos in self-hosted langchain solutions",.env.example +459f7ea2a1183e848ad2d5c919bea9cf12f979d6,10-11-2023 09:37:48,GitHub Enterprise,"Merge pull request #56 from Howitt-Ben/develop + +fix: typos in self-hosted langchain solutions",.env.example.dev +459f7ea2a1183e848ad2d5c919bea9cf12f979d6,10-11-2023 09:37:48,GitHub Enterprise,"Merge pull request #56 from Howitt-Ben/develop + +fix: typos in self-hosted langchain solutions",.env.example.local +46c8674540477488d50fa11783bc02cd963e490d,10-11-2023 20:07:31,Howitt-Ben,feat: run pre-commit on backend/*,.pre-commit-config.yaml +46c8674540477488d50fa11783bc02cd963e490d,10-11-2023 20:07:31,Howitt-Ben,feat: run pre-commit on backend/*,backend/app/alembic/env.py +46c8674540477488d50fa11783bc02cd963e490d,10-11-2023 20:07:31,Howitt-Ben,feat: run pre-commit on backend/*,backend/app/app/api/deps.py +46c8674540477488d50fa11783bc02cd963e490d,10-11-2023 20:07:31,Howitt-Ben,feat: run pre-commit on backend/*,backend/app/app/api/v1/api.py +46c8674540477488d50fa11783bc02cd963e490d,10-11-2023 20:07:31,Howitt-Ben,feat: run pre-commit on backend/*,backend/app/app/api/v1/endpoints/chat.py +46c8674540477488d50fa11783bc02cd963e490d,10-11-2023 20:07:31,Howitt-Ben,feat: run pre-commit on backend/*,backend/app/app/api/v1/endpoints/sql.py +46c8674540477488d50fa11783bc02cd963e490d,10-11-2023 20:07:31,Howitt-Ben,feat: run pre-commit on backend/*,backend/app/app/api/v1/endpoints/statistics.py +46c8674540477488d50fa11783bc02cd963e490d,10-11-2023 20:07:31,Howitt-Ben,feat: run pre-commit on backend/*,backend/app/app/core/celery.py +46c8674540477488d50fa11783bc02cd963e490d,10-11-2023 20:07:31,Howitt-Ben,feat: run pre-commit on backend/*,backend/app/app/core/config.py +46c8674540477488d50fa11783bc02cd963e490d,10-11-2023 20:07:31,Howitt-Ben,feat: run pre-commit on backend/*,backend/app/app/crud/base_crud.py +46c8674540477488d50fa11783bc02cd963e490d,10-11-2023 20:07:31,Howitt-Ben,feat: run pre-commit on backend/*,backend/app/app/db/SQLDatabaseExtended.py +46c8674540477488d50fa11783bc02cd963e490d,10-11-2023 20:07:31,Howitt-Ben,feat: run pre-commit on backend/*,backend/app/app/db/session.py +46c8674540477488d50fa11783bc02cd963e490d,10-11-2023 20:07:31,Howitt-Ben,feat: run pre-commit on backend/*,backend/app/app/db/vector_db_pdf_ingestion.py +46c8674540477488d50fa11783bc02cd963e490d,10-11-2023 20:07:31,Howitt-Ben,feat: run pre-commit on backend/*,backend/app/app/deps/agent_deps.py +46c8674540477488d50fa11783bc02cd963e490d,10-11-2023 20:07:31,Howitt-Ben,feat: run pre-commit on backend/*,backend/app/app/deps/celery_deps.py +46c8674540477488d50fa11783bc02cd963e490d,10-11-2023 20:07:31,Howitt-Ben,feat: run pre-commit on backend/*,backend/app/app/deps/websocket_deps.py +46c8674540477488d50fa11783bc02cd963e490d,10-11-2023 20:07:31,Howitt-Ben,feat: run pre-commit on backend/*,backend/app/app/main.py +46c8674540477488d50fa11783bc02cd963e490d,10-11-2023 20:07:31,Howitt-Ben,feat: run pre-commit on backend/*,backend/app/app/models/base_uuid_model.py +46c8674540477488d50fa11783bc02cd963e490d,10-11-2023 20:07:31,Howitt-Ben,feat: run pre-commit on backend/*,backend/app/app/schemas/agent_schema.py +46c8674540477488d50fa11783bc02cd963e490d,10-11-2023 20:07:31,Howitt-Ben,feat: run pre-commit on backend/*,backend/app/app/schemas/common_schema.py +46c8674540477488d50fa11783bc02cd963e490d,10-11-2023 20:07:31,Howitt-Ben,feat: run pre-commit on backend/*,backend/app/app/schemas/message_schema.py +46c8674540477488d50fa11783bc02cd963e490d,10-11-2023 20:07:31,Howitt-Ben,feat: run pre-commit on backend/*,backend/app/app/schemas/response_schema.py +46c8674540477488d50fa11783bc02cd963e490d,10-11-2023 20:07:31,Howitt-Ben,feat: run pre-commit on backend/*,backend/app/app/schemas/streaming_schema.py +46c8674540477488d50fa11783bc02cd963e490d,10-11-2023 20:07:31,Howitt-Ben,feat: run pre-commit on backend/*,backend/app/app/schemas/tool_schema.py +46c8674540477488d50fa11783bc02cd963e490d,10-11-2023 20:07:31,Howitt-Ben,feat: run pre-commit on backend/*,backend/app/app/schemas/tool_schemas/pdf_tool_schema.py +46c8674540477488d50fa11783bc02cd963e490d,10-11-2023 20:07:31,Howitt-Ben,feat: run pre-commit on backend/*,backend/app/app/schemas/tool_schemas/sql_tool_schema.py +46c8674540477488d50fa11783bc02cd963e490d,10-11-2023 20:07:31,Howitt-Ben,feat: run pre-commit on backend/*,backend/app/app/services/chat_agent/helpers/llm.py +46c8674540477488d50fa11783bc02cd963e490d,10-11-2023 20:07:31,Howitt-Ben,feat: run pre-commit on backend/*,backend/app/app/services/chat_agent/helpers/utils.py +46c8674540477488d50fa11783bc02cd963e490d,10-11-2023 20:07:31,Howitt-Ben,feat: run pre-commit on backend/*,backend/app/app/services/chat_agent/meta_agent.py +46c8674540477488d50fa11783bc02cd963e490d,10-11-2023 20:07:31,Howitt-Ben,feat: run pre-commit on backend/*,backend/app/app/services/chat_agent/router_agent/SimpleRouterAgent.py +46c8674540477488d50fa11783bc02cd963e490d,10-11-2023 20:07:31,Howitt-Ben,feat: run pre-commit on backend/*,backend/app/app/services/chat_agent/tools/ExtendedBaseTool.py +46c8674540477488d50fa11783bc02cd963e490d,10-11-2023 20:07:31,Howitt-Ben,feat: run pre-commit on backend/*,backend/app/app/services/chat_agent/tools/library/entertainer_tool/entertainer_tool.py +46c8674540477488d50fa11783bc02cd963e490d,10-11-2023 20:07:31,Howitt-Ben,feat: run pre-commit on backend/*,backend/app/app/services/chat_agent/tools/library/expert_tool/expert_tool.py +46c8674540477488d50fa11783bc02cd963e490d,10-11-2023 20:07:31,Howitt-Ben,feat: run pre-commit on backend/*,backend/app/app/services/chat_agent/tools/library/image_gen_with_input_tool/image_gen_with_input_tool.py +46c8674540477488d50fa11783bc02cd963e490d,10-11-2023 20:07:31,Howitt-Ben,feat: run pre-commit on backend/*,backend/app/app/services/chat_agent/tools/library/image_generation_tool/image_generation_tool.py +46c8674540477488d50fa11783bc02cd963e490d,10-11-2023 20:07:31,Howitt-Ben,feat: run pre-commit on backend/*,backend/app/app/services/chat_agent/tools/library/pdf_tool/pdf_tool.py +46c8674540477488d50fa11783bc02cd963e490d,10-11-2023 20:07:31,Howitt-Ben,feat: run pre-commit on backend/*,backend/app/app/services/chat_agent/tools/library/sql_tool/sql_tool.py +46c8674540477488d50fa11783bc02cd963e490d,10-11-2023 20:07:31,Howitt-Ben,feat: run pre-commit on backend/*,backend/app/app/services/chat_agent/tools/library/summarizer_tool/summarizer_tool.py +46c8674540477488d50fa11783bc02cd963e490d,10-11-2023 20:07:31,Howitt-Ben,feat: run pre-commit on backend/*,backend/app/app/services/chat_agent/tools/library/visualizer_tool/visualizer_tool.py +46c8674540477488d50fa11783bc02cd963e490d,10-11-2023 20:07:31,Howitt-Ben,feat: run pre-commit on backend/*,backend/app/app/services/chat_agent/tools/tools.py +46c8674540477488d50fa11783bc02cd963e490d,10-11-2023 20:07:31,Howitt-Ben,feat: run pre-commit on backend/*,backend/app/app/utils/config.py +46c8674540477488d50fa11783bc02cd963e490d,10-11-2023 20:07:31,Howitt-Ben,feat: run pre-commit on backend/*,backend/app/app/utils/config_loader.py +46c8674540477488d50fa11783bc02cd963e490d,10-11-2023 20:07:31,Howitt-Ben,feat: run pre-commit on backend/*,backend/app/app/utils/exceptions/__init__.py +46c8674540477488d50fa11783bc02cd963e490d,10-11-2023 20:07:31,Howitt-Ben,feat: run pre-commit on backend/*,backend/app/app/utils/exceptions/common_exception.py +46c8674540477488d50fa11783bc02cd963e490d,10-11-2023 20:07:31,Howitt-Ben,feat: run pre-commit on backend/*,backend/app/app/utils/fastapi_globals.py +46c8674540477488d50fa11783bc02cd963e490d,10-11-2023 20:07:31,Howitt-Ben,feat: run pre-commit on backend/*,backend/app/app/utils/llm.py +46c8674540477488d50fa11783bc02cd963e490d,10-11-2023 20:07:31,Howitt-Ben,feat: run pre-commit on backend/*,backend/app/app/utils/minio_client.py +46c8674540477488d50fa11783bc02cd963e490d,10-11-2023 20:07:31,Howitt-Ben,feat: run pre-commit on backend/*,backend/app/app/utils/requestvars.py +46c8674540477488d50fa11783bc02cd963e490d,10-11-2023 20:07:31,Howitt-Ben,feat: run pre-commit on backend/*,backend/app/app/utils/sql.py +46c8674540477488d50fa11783bc02cd963e490d,10-11-2023 20:07:31,Howitt-Ben,feat: run pre-commit on backend/*,backend/app/app/utils/streaming/StreamingJsonListResponse.py +46c8674540477488d50fa11783bc02cd963e490d,10-11-2023 20:07:31,Howitt-Ben,feat: run pre-commit on backend/*,backend/app/app/utils/streaming/callbacks/stream.py +46c8674540477488d50fa11783bc02cd963e490d,10-11-2023 20:07:31,Howitt-Ben,feat: run pre-commit on backend/*,backend/app/app/utils/streaming/helpers.py +46c8674540477488d50fa11783bc02cd963e490d,10-11-2023 20:07:31,Howitt-Ben,feat: run pre-commit on backend/*,backend/app/app/utils/uuid6.py +46c8674540477488d50fa11783bc02cd963e490d,10-11-2023 20:07:31,Howitt-Ben,feat: run pre-commit on backend/*,backend/app/pyproject.toml +e701647adcc4e1ed3bc28dcfe154d4c261dc466b,10-11-2023 20:49:06,Howitt-Ben,feat: run pre-commit on frontend/*,frontend/Dockerfile +e701647adcc4e1ed3bc28dcfe154d4c261dc466b,10-11-2023 20:49:06,Howitt-Ben,feat: run pre-commit on frontend/*,frontend/custom_typings/can-ndjson-stream/index.d.ts +e701647adcc4e1ed3bc28dcfe154d4c261dc466b,10-11-2023 20:49:06,Howitt-Ben,feat: run pre-commit on frontend/*,frontend/src/components/CodeView/Markdown.tsx +e701647adcc4e1ed3bc28dcfe154d4c261dc466b,10-11-2023 20:49:06,Howitt-Ben,feat: run pre-commit on frontend/*,frontend/src/components/CodeView/SideDrawer/index.tsx +e701647adcc4e1ed3bc28dcfe154d4c261dc466b,10-11-2023 20:49:06,Howitt-Ben,feat: run pre-commit on frontend/*,frontend/src/components/Common/ErrorBoundary.tsx +e701647adcc4e1ed3bc28dcfe154d4c261dc466b,10-11-2023 20:49:06,Howitt-Ben,feat: run pre-commit on frontend/*,frontend/src/components/Common/Select.tsx +e701647adcc4e1ed3bc28dcfe154d4c261dc466b,10-11-2023 20:49:06,Howitt-Ben,feat: run pre-commit on frontend/*,frontend/src/components/ConversationView/MessageView/FeedbackView/index.tsx +e701647adcc4e1ed3bc28dcfe154d4c261dc466b,10-11-2023 20:49:06,Howitt-Ben,feat: run pre-commit on frontend/*,frontend/src/components/ConversationView/MessageView/MessageEvents/MessageEvent/LLMResponse.tsx +e701647adcc4e1ed3bc28dcfe154d4c261dc466b,10-11-2023 20:49:06,Howitt-Ben,feat: run pre-commit on frontend/*,frontend/src/components/ConversationView/MessageView/MessageEvents/MessageEvent/index.tsx +e701647adcc4e1ed3bc28dcfe154d4c261dc466b,10-11-2023 20:49:06,Howitt-Ben,feat: run pre-commit on frontend/*,frontend/src/components/ConversationView/MessageView/MessageEvents/MessageEvents.tsx +e701647adcc4e1ed3bc28dcfe154d4c261dc466b,10-11-2023 20:49:06,Howitt-Ben,feat: run pre-commit on frontend/*,frontend/src/components/ConversationView/MessageView/index.tsx +e701647adcc4e1ed3bc28dcfe154d4c261dc466b,10-11-2023 20:49:06,Howitt-Ben,feat: run pre-commit on frontend/*,frontend/src/components/CustomIcons/AgentIcon.tsx +e701647adcc4e1ed3bc28dcfe154d4c261dc466b,10-11-2023 20:49:06,Howitt-Ben,feat: run pre-commit on frontend/*,frontend/src/components/CustomIcons/BcgX.tsx +e701647adcc4e1ed3bc28dcfe154d4c261dc466b,10-11-2023 20:49:06,Howitt-Ben,feat: run pre-commit on frontend/*,frontend/src/components/CustomIcons/GammaSpinner.tsx +e701647adcc4e1ed3bc28dcfe154d4c261dc466b,10-11-2023 20:49:06,Howitt-Ben,feat: run pre-commit on frontend/*,frontend/src/components/CustomIcons/MainLogo.tsx +e701647adcc4e1ed3bc28dcfe154d4c261dc466b,10-11-2023 20:49:06,Howitt-Ben,feat: run pre-commit on frontend/*,frontend/src/components/Sidebar/OpenCloseButton.tsx +e701647adcc4e1ed3bc28dcfe154d4c261dc466b,10-11-2023 20:49:06,Howitt-Ben,feat: run pre-commit on frontend/*,frontend/src/components/Sidebar/SettingsModal.tsx +e701647adcc4e1ed3bc28dcfe154d4c261dc466b,10-11-2023 20:49:06,Howitt-Ben,feat: run pre-commit on frontend/*,frontend/src/components/ToolActionRenderer/index.tsx +e701647adcc4e1ed3bc28dcfe154d4c261dc466b,10-11-2023 20:49:06,Howitt-Ben,feat: run pre-commit on frontend/*,frontend/src/components/ToolActionRenderer/library/actions.tsx +e701647adcc4e1ed3bc28dcfe154d4c261dc466b,10-11-2023 20:49:06,Howitt-Ben,feat: run pre-commit on frontend/*,frontend/src/components/ToolAppendixRenderer/index.tsx +e701647adcc4e1ed3bc28dcfe154d4c261dc466b,10-11-2023 20:49:06,Howitt-Ben,feat: run pre-commit on frontend/*,frontend/src/components/ToolAppendixRenderer/library/CodeFlipCard/JsxDisplay.tsx +e701647adcc4e1ed3bc28dcfe154d4c261dc466b,10-11-2023 20:49:06,Howitt-Ben,feat: run pre-commit on frontend/*,frontend/src/components/ToolAppendixRenderer/library/CodeFlipCard/PlotlyDisplay.tsx +e701647adcc4e1ed3bc28dcfe154d4c261dc466b,10-11-2023 20:49:06,Howitt-Ben,feat: run pre-commit on frontend/*,frontend/src/components/ToolAppendixRenderer/library/CodeFlipCard/ResultsView.tsx +e701647adcc4e1ed3bc28dcfe154d4c261dc466b,10-11-2023 20:49:06,Howitt-Ben,feat: run pre-commit on frontend/*,frontend/src/components/ToolAppendixRenderer/library/CodeFlipCard/TextAreaEditor.tsx +e701647adcc4e1ed3bc28dcfe154d4c261dc466b,10-11-2023 20:49:06,Howitt-Ben,feat: run pre-commit on frontend/*,frontend/src/components/ToolAppendixRenderer/library/CodeFlipCard/index.tsx +e701647adcc4e1ed3bc28dcfe154d4c261dc466b,10-11-2023 20:49:06,Howitt-Ben,feat: run pre-commit on frontend/*,frontend/src/hooks/useCustomState.ts +e701647adcc4e1ed3bc28dcfe154d4c261dc466b,10-11-2023 20:49:06,Howitt-Ben,feat: run pre-commit on frontend/*,frontend/src/pages/auth/signin.tsx +e701647adcc4e1ed3bc28dcfe154d4c261dc466b,10-11-2023 20:49:06,Howitt-Ben,feat: run pre-commit on frontend/*,frontend/src/store/index.ts +e701647adcc4e1ed3bc28dcfe154d4c261dc466b,10-11-2023 20:49:06,Howitt-Ben,feat: run pre-commit on frontend/*,frontend/src/types/assistant.ts +e701647adcc4e1ed3bc28dcfe154d4c261dc466b,10-11-2023 20:49:06,Howitt-Ben,feat: run pre-commit on frontend/*,frontend/src/types/common.ts +e701647adcc4e1ed3bc28dcfe154d4c261dc466b,10-11-2023 20:49:06,Howitt-Ben,feat: run pre-commit on frontend/*,frontend/src/types/connector.ts +e701647adcc4e1ed3bc28dcfe154d4c261dc466b,10-11-2023 20:49:06,Howitt-Ben,feat: run pre-commit on frontend/*,frontend/src/types/index.ts +e701647adcc4e1ed3bc28dcfe154d4c261dc466b,10-11-2023 20:49:06,Howitt-Ben,feat: run pre-commit on frontend/*,frontend/src/types/message.ts +e701647adcc4e1ed3bc28dcfe154d4c261dc466b,10-11-2023 20:49:06,Howitt-Ben,feat: run pre-commit on frontend/*,frontend/src/types/user.ts +e701647adcc4e1ed3bc28dcfe154d4c261dc466b,10-11-2023 20:49:06,Howitt-Ben,feat: run pre-commit on frontend/*,frontend/src/utils/constants.ts +e701647adcc4e1ed3bc28dcfe154d4c261dc466b,10-11-2023 20:49:06,Howitt-Ben,feat: run pre-commit on frontend/*,frontend/src/utils/group.ts +e701647adcc4e1ed3bc28dcfe154d4c261dc466b,10-11-2023 20:49:06,Howitt-Ben,feat: run pre-commit on frontend/*,frontend/src/utils/index.ts +e701647adcc4e1ed3bc28dcfe154d4c261dc466b,10-11-2023 20:49:06,Howitt-Ben,feat: run pre-commit on frontend/*,frontend/src/utils/sql.ts +e701647adcc4e1ed3bc28dcfe154d4c261dc466b,10-11-2023 20:49:06,Howitt-Ben,feat: run pre-commit on frontend/*,frontend/tailwind.config.ts +12d76b71e156e03aba1208f859a604bca43405e3,10-11-2023 20:54:46,Howitt-Ben,feat: add dockerized service with pre-commit hooks,docker-compose-dev.yml +12d76b71e156e03aba1208f859a604bca43405e3,10-11-2023 20:54:46,Howitt-Ben,feat: add dockerized service with pre-commit hooks,pre-commit/Dockerfile +12d76b71e156e03aba1208f859a604bca43405e3,10-11-2023 20:54:46,Howitt-Ben,feat: add dockerized service with pre-commit hooks,setup.md +7aad33d135a166b64e4221f4278ef30c870067ab,10-11-2023 21:02:59,Howitt-Ben,fix: tidy vol mappings,docker-compose-dev.yml +3cb85e92c4b4d0adf283ef306a389b50801042e3,10-11-2023 21:03:49,Howitt-Ben,fix: tidy readme for pre-commit,setup.md +9ccafc5cdd8b95eace8992aa88e512f11d59f37f,10-11-2023 21:21:48,Howitt-Ben,feature: make dockerized pre-commit default,.pre-commit-config.yaml +9ccafc5cdd8b95eace8992aa88e512f11d59f37f,10-11-2023 21:21:48,Howitt-Ben,feature: make dockerized pre-commit default,Makefile +9ccafc5cdd8b95eace8992aa88e512f11d59f37f,10-11-2023 21:21:48,Howitt-Ben,feature: make dockerized pre-commit default,docker-compose-dev.yml +9ccafc5cdd8b95eace8992aa88e512f11d59f37f,10-11-2023 21:21:48,Howitt-Ben,feature: make dockerized pre-commit default,pre-commit/pre-commit.git +9ccafc5cdd8b95eace8992aa88e512f11d59f37f,10-11-2023 21:21:48,Howitt-Ben,feature: make dockerized pre-commit default,setup.md +e72308b2fedfc2ee12d11f127de662ccc19447b4,10-12-2023 12:45:48,Howitt-Ben,feature: update eslint and add prettier,docker-compose-dev.yml +e72308b2fedfc2ee12d11f127de662ccc19447b4,10-12-2023 12:45:48,Howitt-Ben,feature: update eslint and add prettier,pre-commit/.pre-commit-config.yaml +5596627458a186594ebec5f74620ced90df34e15,10-12-2023 12:52:38,Howitt-Ben,feature: rerun pre-commit on frontend with prettier,frontend/custom_typings/can-ndjson-stream/index.d.ts +5596627458a186594ebec5f74620ced90df34e15,10-12-2023 12:52:38,Howitt-Ben,feature: rerun pre-commit on frontend with prettier,frontend/next.config.mjs +5596627458a186594ebec5f74620ced90df34e15,10-12-2023 12:52:38,Howitt-Ben,feature: rerun pre-commit on frontend with prettier,frontend/pnpm-lock.yaml +5596627458a186594ebec5f74620ced90df34e15,10-12-2023 12:52:38,Howitt-Ben,feature: rerun pre-commit on frontend with prettier,frontend/prettier.config.cjs +5596627458a186594ebec5f74620ced90df34e15,10-12-2023 12:52:38,Howitt-Ben,feature: rerun pre-commit on frontend with prettier,frontend/prismalib/prismadb.ts +5596627458a186594ebec5f74620ced90df34e15,10-12-2023 12:52:38,Howitt-Ben,feature: rerun pre-commit on frontend with prettier,frontend/src/components/CodeView/CodeBlock.tsx +5596627458a186594ebec5f74620ced90df34e15,10-12-2023 12:52:38,Howitt-Ben,feature: rerun pre-commit on frontend with prettier,frontend/src/components/CodeView/Markdown.tsx +5596627458a186594ebec5f74620ced90df34e15,10-12-2023 12:52:38,Howitt-Ben,feature: rerun pre-commit on frontend with prettier,frontend/src/components/CodeView/SideDrawer/DataTableView.tsx +5596627458a186594ebec5f74620ced90df34e15,10-12-2023 12:52:38,Howitt-Ben,feature: rerun pre-commit on frontend with prettier,frontend/src/components/CodeView/SideDrawer/NotificationView.tsx +5596627458a186594ebec5f74620ced90df34e15,10-12-2023 12:52:38,Howitt-Ben,feature: rerun pre-commit on frontend with prettier,frontend/src/components/CodeView/SideDrawer/index.tsx +5596627458a186594ebec5f74620ced90df34e15,10-12-2023 12:52:38,Howitt-Ben,feature: rerun pre-commit on frontend with prettier,frontend/src/components/Common/Dropdown.tsx +5596627458a186594ebec5f74620ced90df34e15,10-12-2023 12:52:38,Howitt-Ben,feature: rerun pre-commit on frontend with prettier,frontend/src/components/Common/ErrorBoundary.tsx +5596627458a186594ebec5f74620ced90df34e15,10-12-2023 12:52:38,Howitt-Ben,feature: rerun pre-commit on frontend with prettier,frontend/src/components/Common/Modal.tsx +5596627458a186594ebec5f74620ced90df34e15,10-12-2023 12:52:38,Howitt-Ben,feature: rerun pre-commit on frontend with prettier,frontend/src/components/Common/Select.tsx +5596627458a186594ebec5f74620ced90df34e15,10-12-2023 12:52:38,Howitt-Ben,feature: rerun pre-commit on frontend with prettier,frontend/src/components/Common/TextField.tsx +5596627458a186594ebec5f74620ced90df34e15,10-12-2023 12:52:38,Howitt-Ben,feature: rerun pre-commit on frontend with prettier,frontend/src/components/Common/Tooltip.tsx +5596627458a186594ebec5f74620ced90df34e15,10-12-2023 12:52:38,Howitt-Ben,feature: rerun pre-commit on frontend with prettier,frontend/src/components/ConversationView/ClearConversationButton/ClearConversationConfirmModal.tsx +5596627458a186594ebec5f74620ced90df34e15,10-12-2023 12:52:38,Howitt-Ben,feature: rerun pre-commit on frontend with prettier,frontend/src/components/ConversationView/ClearConversationButton/index.tsx +5596627458a186594ebec5f74620ced90df34e15,10-12-2023 12:52:38,Howitt-Ben,feature: rerun pre-commit on frontend with prettier,frontend/src/components/ConversationView/EmptyView.tsx +5596627458a186594ebec5f74620ced90df34e15,10-12-2023 12:52:38,Howitt-Ben,feature: rerun pre-commit on frontend with prettier,frontend/src/components/ConversationView/Header.tsx +5596627458a186594ebec5f74620ced90df34e15,10-12-2023 12:52:38,Howitt-Ben,feature: rerun pre-commit on frontend with prettier,frontend/src/components/ConversationView/MessageTextarea.tsx +5596627458a186594ebec5f74620ced90df34e15,10-12-2023 12:52:38,Howitt-Ben,feature: rerun pre-commit on frontend with prettier,frontend/src/components/ConversationView/MessageView/FeedbackView/index.tsx +5596627458a186594ebec5f74620ced90df34e15,10-12-2023 12:52:38,Howitt-Ben,feature: rerun pre-commit on frontend with prettier,frontend/src/components/ConversationView/MessageView/MessageEvents/MessageEvent/LLMResponse.tsx +5596627458a186594ebec5f74620ced90df34e15,10-12-2023 12:52:38,Howitt-Ben,feature: rerun pre-commit on frontend with prettier,frontend/src/components/ConversationView/MessageView/MessageEvents/MessageEvent/index.tsx +5596627458a186594ebec5f74620ced90df34e15,10-12-2023 12:52:38,Howitt-Ben,feature: rerun pre-commit on frontend with prettier,frontend/src/components/ConversationView/MessageView/MessageEvents/MessageEvents.tsx +5596627458a186594ebec5f74620ced90df34e15,10-12-2023 12:52:38,Howitt-Ben,feature: rerun pre-commit on frontend with prettier,frontend/src/components/ConversationView/MessageView/index.tsx +5596627458a186594ebec5f74620ced90df34e15,10-12-2023 12:52:38,Howitt-Ben,feature: rerun pre-commit on frontend with prettier,frontend/src/components/ConversationView/ThreeDotsLoader.tsx +5596627458a186594ebec5f74620ced90df34e15,10-12-2023 12:52:38,Howitt-Ben,feature: rerun pre-commit on frontend with prettier,frontend/src/components/ConversationView/index.tsx +5596627458a186594ebec5f74620ced90df34e15,10-12-2023 12:52:38,Howitt-Ben,feature: rerun pre-commit on frontend with prettier,frontend/src/components/CustomIcons/AgentIcon.tsx +5596627458a186594ebec5f74620ced90df34e15,10-12-2023 12:52:38,Howitt-Ben,feature: rerun pre-commit on frontend with prettier,frontend/src/components/CustomIcons/BcgX.tsx +5596627458a186594ebec5f74620ced90df34e15,10-12-2023 12:52:38,Howitt-Ben,feature: rerun pre-commit on frontend with prettier,frontend/src/components/CustomIcons/GammaSpinner.tsx +5596627458a186594ebec5f74620ced90df34e15,10-12-2023 12:52:38,Howitt-Ben,feature: rerun pre-commit on frontend with prettier,frontend/src/components/CustomIcons/Icon.tsx +5596627458a186594ebec5f74620ced90df34e15,10-12-2023 12:52:38,Howitt-Ben,feature: rerun pre-commit on frontend with prettier,frontend/src/components/CustomIcons/MainLogo.tsx +5596627458a186594ebec5f74620ced90df34e15,10-12-2023 12:52:38,Howitt-Ben,feature: rerun pre-commit on frontend with prettier,frontend/src/components/Sidebar/DarkmodeSwitch.tsx +5596627458a186594ebec5f74620ced90df34e15,10-12-2023 12:52:38,Howitt-Ben,feature: rerun pre-commit on frontend with prettier,frontend/src/components/Sidebar/OpenCloseButton.tsx +5596627458a186594ebec5f74620ced90df34e15,10-12-2023 12:52:38,Howitt-Ben,feature: rerun pre-commit on frontend with prettier,frontend/src/components/Sidebar/SettingsModal.tsx +5596627458a186594ebec5f74620ced90df34e15,10-12-2023 12:52:38,Howitt-Ben,feature: rerun pre-commit on frontend with prettier,frontend/src/components/Sidebar/TopWarningBanner.tsx +5596627458a186594ebec5f74620ced90df34e15,10-12-2023 12:52:38,Howitt-Ben,feature: rerun pre-commit on frontend with prettier,frontend/src/components/Sidebar/UpdateConversationModal.tsx +5596627458a186594ebec5f74620ced90df34e15,10-12-2023 12:52:38,Howitt-Ben,feature: rerun pre-commit on frontend with prettier,frontend/src/components/Sidebar/index.tsx +5596627458a186594ebec5f74620ced90df34e15,10-12-2023 12:52:38,Howitt-Ben,feature: rerun pre-commit on frontend with prettier,frontend/src/components/ToolActionRenderer/index.tsx +5596627458a186594ebec5f74620ced90df34e15,10-12-2023 12:52:38,Howitt-Ben,feature: rerun pre-commit on frontend with prettier,frontend/src/components/ToolActionRenderer/library/actions.tsx +5596627458a186594ebec5f74620ced90df34e15,10-12-2023 12:52:38,Howitt-Ben,feature: rerun pre-commit on frontend with prettier,frontend/src/components/ToolAppendixRenderer/index.tsx +5596627458a186594ebec5f74620ced90df34e15,10-12-2023 12:52:38,Howitt-Ben,feature: rerun pre-commit on frontend with prettier,frontend/src/components/ToolAppendixRenderer/library/CodeFlipCard/JsxDisplay.tsx +5596627458a186594ebec5f74620ced90df34e15,10-12-2023 12:52:38,Howitt-Ben,feature: rerun pre-commit on frontend with prettier,frontend/src/components/ToolAppendixRenderer/library/CodeFlipCard/PlotlyDisplay.tsx +5596627458a186594ebec5f74620ced90df34e15,10-12-2023 12:52:38,Howitt-Ben,feature: rerun pre-commit on frontend with prettier,frontend/src/components/ToolAppendixRenderer/library/CodeFlipCard/ResultsView.tsx +5596627458a186594ebec5f74620ced90df34e15,10-12-2023 12:52:38,Howitt-Ben,feature: rerun pre-commit on frontend with prettier,frontend/src/components/ToolAppendixRenderer/library/CodeFlipCard/TextAreaEditor.tsx +5596627458a186594ebec5f74620ced90df34e15,10-12-2023 12:52:38,Howitt-Ben,feature: rerun pre-commit on frontend with prettier,frontend/src/components/ToolAppendixRenderer/library/CodeFlipCard/index.tsx +5596627458a186594ebec5f74620ced90df34e15,10-12-2023 12:52:38,Howitt-Ben,feature: rerun pre-commit on frontend with prettier,frontend/src/env.mjs +5596627458a186594ebec5f74620ced90df34e15,10-12-2023 12:52:38,Howitt-Ben,feature: rerun pre-commit on frontend with prettier,frontend/src/hooks/useCustomState.ts +5596627458a186594ebec5f74620ced90df34e15,10-12-2023 12:52:38,Howitt-Ben,feature: rerun pre-commit on frontend with prettier,frontend/src/hooks/useDarkmode.ts +5596627458a186594ebec5f74620ced90df34e15,10-12-2023 12:52:38,Howitt-Ben,feature: rerun pre-commit on frontend with prettier,frontend/src/pages/_app.tsx +5596627458a186594ebec5f74620ced90df34e15,10-12-2023 12:52:38,Howitt-Ben,feature: rerun pre-commit on frontend with prettier,frontend/src/pages/api/auth/[...nextauth].ts +5596627458a186594ebec5f74620ced90df34e15,10-12-2023 12:52:38,Howitt-Ben,feature: rerun pre-commit on frontend with prettier,frontend/src/pages/auth/signin.tsx +5596627458a186594ebec5f74620ced90df34e15,10-12-2023 12:52:38,Howitt-Ben,feature: rerun pre-commit on frontend with prettier,frontend/src/pages/index.tsx +5596627458a186594ebec5f74620ced90df34e15,10-12-2023 12:52:38,Howitt-Ben,feature: rerun pre-commit on frontend with prettier,frontend/src/server/auth.ts +5596627458a186594ebec5f74620ced90df34e15,10-12-2023 12:52:38,Howitt-Ben,feature: rerun pre-commit on frontend with prettier,frontend/src/server/githubEnterprise.ts +5596627458a186594ebec5f74620ced90df34e15,10-12-2023 12:52:38,Howitt-Ben,feature: rerun pre-commit on frontend with prettier,frontend/src/store/conversation.ts +5596627458a186594ebec5f74620ced90df34e15,10-12-2023 12:52:38,Howitt-Ben,feature: rerun pre-commit on frontend with prettier,frontend/src/store/index.ts +5596627458a186594ebec5f74620ced90df34e15,10-12-2023 12:52:38,Howitt-Ben,feature: rerun pre-commit on frontend with prettier,frontend/src/store/layout.ts +5596627458a186594ebec5f74620ced90df34e15,10-12-2023 12:52:38,Howitt-Ben,feature: rerun pre-commit on frontend with prettier,frontend/src/store/message.ts +5596627458a186594ebec5f74620ced90df34e15,10-12-2023 12:52:38,Howitt-Ben,feature: rerun pre-commit on frontend with prettier,frontend/src/store/query.ts +5596627458a186594ebec5f74620ced90df34e15,10-12-2023 12:52:38,Howitt-Ben,feature: rerun pre-commit on frontend with prettier,frontend/src/store/settings.ts +5596627458a186594ebec5f74620ced90df34e15,10-12-2023 12:52:38,Howitt-Ben,feature: rerun pre-commit on frontend with prettier,frontend/src/store/user.ts +5596627458a186594ebec5f74620ced90df34e15,10-12-2023 12:52:38,Howitt-Ben,feature: rerun pre-commit on frontend with prettier,frontend/src/styles/globals.css +5596627458a186594ebec5f74620ced90df34e15,10-12-2023 12:52:38,Howitt-Ben,feature: rerun pre-commit on frontend with prettier,frontend/src/styles/tailwind.css +5596627458a186594ebec5f74620ced90df34e15,10-12-2023 12:52:38,Howitt-Ben,feature: rerun pre-commit on frontend with prettier,frontend/src/types/assistant.ts +5596627458a186594ebec5f74620ced90df34e15,10-12-2023 12:52:38,Howitt-Ben,feature: rerun pre-commit on frontend with prettier,frontend/src/types/common.ts +5596627458a186594ebec5f74620ced90df34e15,10-12-2023 12:52:38,Howitt-Ben,feature: rerun pre-commit on frontend with prettier,frontend/src/types/conversation.ts +5596627458a186594ebec5f74620ced90df34e15,10-12-2023 12:52:38,Howitt-Ben,feature: rerun pre-commit on frontend with prettier,frontend/src/types/index.ts +5596627458a186594ebec5f74620ced90df34e15,10-12-2023 12:52:38,Howitt-Ben,feature: rerun pre-commit on frontend with prettier,frontend/src/types/message.ts +5596627458a186594ebec5f74620ced90df34e15,10-12-2023 12:52:38,Howitt-Ben,feature: rerun pre-commit on frontend with prettier,frontend/src/types/settings.ts +5596627458a186594ebec5f74620ced90df34e15,10-12-2023 12:52:38,Howitt-Ben,feature: rerun pre-commit on frontend with prettier,frontend/src/types/user.ts +5596627458a186594ebec5f74620ced90df34e15,10-12-2023 12:52:38,Howitt-Ben,feature: rerun pre-commit on frontend with prettier,frontend/src/utils/constants.ts +5596627458a186594ebec5f74620ced90df34e15,10-12-2023 12:52:38,Howitt-Ben,feature: rerun pre-commit on frontend with prettier,frontend/src/utils/group.ts +5596627458a186594ebec5f74620ced90df34e15,10-12-2023 12:52:38,Howitt-Ben,feature: rerun pre-commit on frontend with prettier,frontend/src/utils/id.ts +5596627458a186594ebec5f74620ced90df34e15,10-12-2023 12:52:38,Howitt-Ben,feature: rerun pre-commit on frontend with prettier,frontend/src/utils/index.ts +5596627458a186594ebec5f74620ced90df34e15,10-12-2023 12:52:38,Howitt-Ben,feature: rerun pre-commit on frontend with prettier,frontend/src/utils/sql.ts +5596627458a186594ebec5f74620ced90df34e15,10-12-2023 12:52:38,Howitt-Ben,feature: rerun pre-commit on frontend with prettier,frontend/tailwind.config.ts +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",.pre-commit-config.yaml +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",Makefile +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",backend/app/alembic/env.py +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",backend/app/app/api/deps.py +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",backend/app/app/api/v1/api.py +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",backend/app/app/api/v1/endpoints/chat.py +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",backend/app/app/api/v1/endpoints/sql.py +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",backend/app/app/api/v1/endpoints/statistics.py +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",backend/app/app/core/celery.py +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",backend/app/app/core/config.py +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",backend/app/app/crud/base_crud.py +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",backend/app/app/db/SQLDatabaseExtended.py +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",backend/app/app/db/session.py +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",backend/app/app/db/vector_db_pdf_ingestion.py +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",backend/app/app/deps/agent_deps.py +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",backend/app/app/deps/celery_deps.py +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",backend/app/app/deps/websocket_deps.py +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",backend/app/app/main.py +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",backend/app/app/models/base_uuid_model.py +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",backend/app/app/schemas/agent_schema.py +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",backend/app/app/schemas/common_schema.py +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",backend/app/app/schemas/message_schema.py +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",backend/app/app/schemas/response_schema.py +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",backend/app/app/schemas/streaming_schema.py +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",backend/app/app/schemas/tool_schema.py +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",backend/app/app/schemas/tool_schemas/pdf_tool_schema.py +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",backend/app/app/schemas/tool_schemas/sql_tool_schema.py +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",backend/app/app/services/chat_agent/helpers/llm.py +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",backend/app/app/services/chat_agent/helpers/utils.py +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",backend/app/app/services/chat_agent/meta_agent.py +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",backend/app/app/services/chat_agent/router_agent/SimpleRouterAgent.py +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",backend/app/app/services/chat_agent/tools/ExtendedBaseTool.py +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",backend/app/app/services/chat_agent/tools/library/entertainer_tool/entertainer_tool.py +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",backend/app/app/services/chat_agent/tools/library/expert_tool/expert_tool.py +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",backend/app/app/services/chat_agent/tools/library/image_gen_with_input_tool/image_gen_with_input_tool.py +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",backend/app/app/services/chat_agent/tools/library/image_generation_tool/image_generation_tool.py +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",backend/app/app/services/chat_agent/tools/library/pdf_tool/pdf_tool.py +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",backend/app/app/services/chat_agent/tools/library/sql_tool/sql_tool.py +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",backend/app/app/services/chat_agent/tools/library/summarizer_tool/summarizer_tool.py +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",backend/app/app/services/chat_agent/tools/library/visualizer_tool/visualizer_tool.py +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",backend/app/app/services/chat_agent/tools/tools.py +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",backend/app/app/utils/config.py +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",backend/app/app/utils/config_loader.py +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",backend/app/app/utils/exceptions/__init__.py +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",backend/app/app/utils/exceptions/common_exception.py +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",backend/app/app/utils/fastapi_globals.py +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",backend/app/app/utils/llm.py +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",backend/app/app/utils/minio_client.py +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",backend/app/app/utils/requestvars.py +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",backend/app/app/utils/sql.py +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",backend/app/app/utils/streaming/StreamingJsonListResponse.py +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",backend/app/app/utils/streaming/callbacks/stream.py +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",backend/app/app/utils/streaming/helpers.py +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",backend/app/app/utils/uuid6.py +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",backend/app/pyproject.toml +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",docker-compose-dev.yml +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",frontend/Dockerfile +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",frontend/custom_typings/can-ndjson-stream/index.d.ts +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",frontend/next.config.mjs +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",frontend/pnpm-lock.yaml +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",frontend/prettier.config.cjs +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",frontend/prismalib/prismadb.ts +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",frontend/src/components/CodeView/CodeBlock.tsx +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",frontend/src/components/CodeView/Markdown.tsx +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",frontend/src/components/CodeView/SideDrawer/DataTableView.tsx +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",frontend/src/components/CodeView/SideDrawer/NotificationView.tsx +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",frontend/src/components/CodeView/SideDrawer/index.tsx +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",frontend/src/components/Common/Dropdown.tsx +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",frontend/src/components/Common/ErrorBoundary.tsx +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",frontend/src/components/Common/Modal.tsx +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",frontend/src/components/Common/Select.tsx +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",frontend/src/components/Common/TextField.tsx +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",frontend/src/components/Common/Tooltip.tsx +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",frontend/src/components/ConversationView/ClearConversationButton/ClearConversationConfirmModal.tsx +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",frontend/src/components/ConversationView/ClearConversationButton/index.tsx +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",frontend/src/components/ConversationView/EmptyView.tsx +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",frontend/src/components/ConversationView/Header.tsx +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",frontend/src/components/ConversationView/MessageTextarea.tsx +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",frontend/src/components/ConversationView/MessageView/FeedbackView/index.tsx +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",frontend/src/components/ConversationView/MessageView/MessageEvents/MessageEvent/LLMResponse.tsx +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",frontend/src/components/ConversationView/MessageView/MessageEvents/MessageEvent/index.tsx +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",frontend/src/components/ConversationView/MessageView/MessageEvents/MessageEvents.tsx +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",frontend/src/components/ConversationView/MessageView/index.tsx +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",frontend/src/components/ConversationView/ThreeDotsLoader.tsx +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",frontend/src/components/ConversationView/index.tsx +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",frontend/src/components/CustomIcons/AgentIcon.tsx +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",frontend/src/components/CustomIcons/BcgX.tsx +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",frontend/src/components/CustomIcons/GammaSpinner.tsx +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",frontend/src/components/CustomIcons/Icon.tsx +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",frontend/src/components/CustomIcons/MainLogo.tsx +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",frontend/src/components/Sidebar/DarkmodeSwitch.tsx +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",frontend/src/components/Sidebar/OpenCloseButton.tsx +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",frontend/src/components/Sidebar/SettingsModal.tsx +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",frontend/src/components/Sidebar/TopWarningBanner.tsx +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",frontend/src/components/Sidebar/UpdateConversationModal.tsx +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",frontend/src/components/Sidebar/index.tsx +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",frontend/src/components/ToolActionRenderer/index.tsx +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",frontend/src/components/ToolActionRenderer/library/actions.tsx +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",frontend/src/components/ToolAppendixRenderer/index.tsx +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",frontend/src/components/ToolAppendixRenderer/library/CodeFlipCard/JsxDisplay.tsx +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",frontend/src/components/ToolAppendixRenderer/library/CodeFlipCard/PlotlyDisplay.tsx +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",frontend/src/components/ToolAppendixRenderer/library/CodeFlipCard/ResultsView.tsx +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",frontend/src/components/ToolAppendixRenderer/library/CodeFlipCard/TextAreaEditor.tsx +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",frontend/src/components/ToolAppendixRenderer/library/CodeFlipCard/index.tsx +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",frontend/src/env.mjs +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",frontend/src/hooks/useCustomState.ts +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",frontend/src/hooks/useDarkmode.ts +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",frontend/src/pages/_app.tsx +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",frontend/src/pages/api/auth/[...nextauth].ts +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",frontend/src/pages/auth/signin.tsx +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",frontend/src/pages/index.tsx +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",frontend/src/server/auth.ts +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",frontend/src/server/githubEnterprise.ts +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",frontend/src/store/conversation.ts +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",frontend/src/store/index.ts +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",frontend/src/store/layout.ts +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",frontend/src/store/message.ts +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",frontend/src/store/query.ts +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",frontend/src/store/settings.ts +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",frontend/src/store/user.ts +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",frontend/src/styles/globals.css +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",frontend/src/styles/tailwind.css +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",frontend/src/types/assistant.ts +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",frontend/src/types/common.ts +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",frontend/src/types/connector.ts +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",frontend/src/types/conversation.ts +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",frontend/src/types/index.ts +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",frontend/src/types/message.ts +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",frontend/src/types/settings.ts +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",frontend/src/types/user.ts +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",frontend/src/utils/constants.ts +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",frontend/src/utils/group.ts +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",frontend/src/utils/id.ts +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",frontend/src/utils/index.ts +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",frontend/src/utils/sql.ts +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",frontend/tailwind.config.ts +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",pre-commit/Dockerfile +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",pre-commit/pre-commit.git +82a7809441b7cf04930c07a5f4ed4097d5ce6c6f,10-12-2023 13:20:21,GitHub Enterprise,"Merge pull request #58 from Howitt-Ben/ft/pre-commit + +feature: add and run pre-commit",setup.md +aecaf2517e620eb765e7c7a6a198a6e351bfbe54,10-15-2023 14:00:25,Casper Lindberg,"[Cleanup] Remove dead code, TODOs and outcommented code",.env.example +aecaf2517e620eb765e7c7a6a198a6e351bfbe54,10-15-2023 14:00:25,Casper Lindberg,"[Cleanup] Remove dead code, TODOs and outcommented code",.env.example.dev +aecaf2517e620eb765e7c7a6a198a6e351bfbe54,10-15-2023 14:00:25,Casper Lindberg,"[Cleanup] Remove dead code, TODOs and outcommented code",.env.example.local +aecaf2517e620eb765e7c7a6a198a6e351bfbe54,10-15-2023 14:00:25,Casper Lindberg,"[Cleanup] Remove dead code, TODOs and outcommented code",backend/app/app/api/deps.py +aecaf2517e620eb765e7c7a6a198a6e351bfbe54,10-15-2023 14:00:25,Casper Lindberg,"[Cleanup] Remove dead code, TODOs and outcommented code",backend/app/app/api/v1/endpoints/chat.py +aecaf2517e620eb765e7c7a6a198a6e351bfbe54,10-15-2023 14:00:25,Casper Lindberg,"[Cleanup] Remove dead code, TODOs and outcommented code",backend/app/app/api/v1/endpoints/sql.py +aecaf2517e620eb765e7c7a6a198a6e351bfbe54,10-15-2023 14:00:25,Casper Lindberg,"[Cleanup] Remove dead code, TODOs and outcommented code",backend/app/app/api/v1/endpoints/statistics.py +aecaf2517e620eb765e7c7a6a198a6e351bfbe54,10-15-2023 14:00:25,Casper Lindberg,"[Cleanup] Remove dead code, TODOs and outcommented code",backend/app/app/core/config.py +aecaf2517e620eb765e7c7a6a198a6e351bfbe54,10-15-2023 14:00:25,Casper Lindberg,"[Cleanup] Remove dead code, TODOs and outcommented code",backend/app/app/crud/base_crud.py +aecaf2517e620eb765e7c7a6a198a6e351bfbe54,10-15-2023 14:00:25,Casper Lindberg,"[Cleanup] Remove dead code, TODOs and outcommented code",backend/app/app/db/session.py +aecaf2517e620eb765e7c7a6a198a6e351bfbe54,10-15-2023 14:00:25,Casper Lindberg,"[Cleanup] Remove dead code, TODOs and outcommented code",backend/app/app/db/vector_db_pdf_ingestion.py +aecaf2517e620eb765e7c7a6a198a6e351bfbe54,10-15-2023 14:00:25,Casper Lindberg,"[Cleanup] Remove dead code, TODOs and outcommented code",backend/app/app/deps/__init__.py +aecaf2517e620eb765e7c7a6a198a6e351bfbe54,10-15-2023 14:00:25,Casper Lindberg,"[Cleanup] Remove dead code, TODOs and outcommented code",backend/app/app/deps/agent_deps.py +aecaf2517e620eb765e7c7a6a198a6e351bfbe54,10-15-2023 14:00:25,Casper Lindberg,"[Cleanup] Remove dead code, TODOs and outcommented code",backend/app/app/deps/celery_deps.py +aecaf2517e620eb765e7c7a6a198a6e351bfbe54,10-15-2023 14:00:25,Casper Lindberg,"[Cleanup] Remove dead code, TODOs and outcommented code",backend/app/app/deps/websocket_deps.py +aecaf2517e620eb765e7c7a6a198a6e351bfbe54,10-15-2023 14:00:25,Casper Lindberg,"[Cleanup] Remove dead code, TODOs and outcommented code",backend/app/app/main.py +aecaf2517e620eb765e7c7a6a198a6e351bfbe54,10-15-2023 14:00:25,Casper Lindberg,"[Cleanup] Remove dead code, TODOs and outcommented code",backend/app/app/schemas/auth_schema.py +aecaf2517e620eb765e7c7a6a198a6e351bfbe54,10-15-2023 14:00:25,Casper Lindberg,"[Cleanup] Remove dead code, TODOs and outcommented code",backend/app/app/schemas/message_schema.py +aecaf2517e620eb765e7c7a6a198a6e351bfbe54,10-15-2023 14:00:25,Casper Lindberg,"[Cleanup] Remove dead code, TODOs and outcommented code",backend/app/app/schemas/response_schema.py +aecaf2517e620eb765e7c7a6a198a6e351bfbe54,10-15-2023 14:00:25,Casper Lindberg,"[Cleanup] Remove dead code, TODOs and outcommented code",backend/app/app/schemas/user_schema.py +aecaf2517e620eb765e7c7a6a198a6e351bfbe54,10-15-2023 14:00:25,Casper Lindberg,"[Cleanup] Remove dead code, TODOs and outcommented code",backend/app/app/services/__init__.py +aecaf2517e620eb765e7c7a6a198a6e351bfbe54,10-15-2023 14:00:25,Casper Lindberg,"[Cleanup] Remove dead code, TODOs and outcommented code",backend/app/app/services/chat_agent/__init__.py +aecaf2517e620eb765e7c7a6a198a6e351bfbe54,10-15-2023 14:00:25,Casper Lindberg,"[Cleanup] Remove dead code, TODOs and outcommented code",backend/app/app/services/chat_agent/helpers/__init__.py +aecaf2517e620eb765e7c7a6a198a6e351bfbe54,10-15-2023 14:00:25,Casper Lindberg,"[Cleanup] Remove dead code, TODOs and outcommented code",backend/app/app/services/chat_agent/helpers/llm.py +aecaf2517e620eb765e7c7a6a198a6e351bfbe54,10-15-2023 14:00:25,Casper Lindberg,"[Cleanup] Remove dead code, TODOs and outcommented code",backend/app/app/services/chat_agent/helpers/utils.py +aecaf2517e620eb765e7c7a6a198a6e351bfbe54,10-15-2023 14:00:25,Casper Lindberg,"[Cleanup] Remove dead code, TODOs and outcommented code",backend/app/app/services/chat_agent/meta_agent.py +aecaf2517e620eb765e7c7a6a198a6e351bfbe54,10-15-2023 14:00:25,Casper Lindberg,"[Cleanup] Remove dead code, TODOs and outcommented code",backend/app/app/services/chat_agent/router_agent/SimpleRouterAgent.py +aecaf2517e620eb765e7c7a6a198a6e351bfbe54,10-15-2023 14:00:25,Casper Lindberg,"[Cleanup] Remove dead code, TODOs and outcommented code",backend/app/app/services/chat_agent/router_agent/__init__.py +aecaf2517e620eb765e7c7a6a198a6e351bfbe54,10-15-2023 14:00:25,Casper Lindberg,"[Cleanup] Remove dead code, TODOs and outcommented code",backend/app/app/services/chat_agent/tools/ExtendedBaseTool.py +aecaf2517e620eb765e7c7a6a198a6e351bfbe54,10-15-2023 14:00:25,Casper Lindberg,"[Cleanup] Remove dead code, TODOs and outcommented code",backend/app/app/services/chat_agent/tools/__init__.py +aecaf2517e620eb765e7c7a6a198a6e351bfbe54,10-15-2023 14:00:25,Casper Lindberg,"[Cleanup] Remove dead code, TODOs and outcommented code",backend/app/app/services/chat_agent/tools/library/__init__.py +aecaf2517e620eb765e7c7a6a198a6e351bfbe54,10-15-2023 14:00:25,Casper Lindberg,"[Cleanup] Remove dead code, TODOs and outcommented code",backend/app/app/services/chat_agent/tools/library/entertainer_tool/__init__.py +aecaf2517e620eb765e7c7a6a198a6e351bfbe54,10-15-2023 14:00:25,Casper Lindberg,"[Cleanup] Remove dead code, TODOs and outcommented code",backend/app/app/services/chat_agent/tools/library/entertainer_tool/entertainer_tool.py +aecaf2517e620eb765e7c7a6a198a6e351bfbe54,10-15-2023 14:00:25,Casper Lindberg,"[Cleanup] Remove dead code, TODOs and outcommented code",backend/app/app/services/chat_agent/tools/library/expert_tool/__init__.py +aecaf2517e620eb765e7c7a6a198a6e351bfbe54,10-15-2023 14:00:25,Casper Lindberg,"[Cleanup] Remove dead code, TODOs and outcommented code",backend/app/app/services/chat_agent/tools/library/expert_tool/expert_tool.py +aecaf2517e620eb765e7c7a6a198a6e351bfbe54,10-15-2023 14:00:25,Casper Lindberg,"[Cleanup] Remove dead code, TODOs and outcommented code",backend/app/app/services/chat_agent/tools/library/image_gen_with_input_tool/__init__.py +aecaf2517e620eb765e7c7a6a198a6e351bfbe54,10-15-2023 14:00:25,Casper Lindberg,"[Cleanup] Remove dead code, TODOs and outcommented code",backend/app/app/services/chat_agent/tools/library/image_gen_with_input_tool/image_gen_with_input_tool.py +aecaf2517e620eb765e7c7a6a198a6e351bfbe54,10-15-2023 14:00:25,Casper Lindberg,"[Cleanup] Remove dead code, TODOs and outcommented code",backend/app/app/services/chat_agent/tools/library/image_generation_tool/__init__.py +aecaf2517e620eb765e7c7a6a198a6e351bfbe54,10-15-2023 14:00:25,Casper Lindberg,"[Cleanup] Remove dead code, TODOs and outcommented code",backend/app/app/services/chat_agent/tools/library/image_generation_tool/image_generation_tool.py +aecaf2517e620eb765e7c7a6a198a6e351bfbe54,10-15-2023 14:00:25,Casper Lindberg,"[Cleanup] Remove dead code, TODOs and outcommented code",backend/app/app/services/chat_agent/tools/library/pdf_tool/pdf_tool.py +aecaf2517e620eb765e7c7a6a198a6e351bfbe54,10-15-2023 14:00:25,Casper Lindberg,"[Cleanup] Remove dead code, TODOs and outcommented code",backend/app/app/services/chat_agent/tools/library/sql_tool/__init__.py +aecaf2517e620eb765e7c7a6a198a6e351bfbe54,10-15-2023 14:00:25,Casper Lindberg,"[Cleanup] Remove dead code, TODOs and outcommented code",backend/app/app/services/chat_agent/tools/library/sql_tool/sql_tool.py +aecaf2517e620eb765e7c7a6a198a6e351bfbe54,10-15-2023 14:00:25,Casper Lindberg,"[Cleanup] Remove dead code, TODOs and outcommented code",backend/app/app/services/chat_agent/tools/library/summarizer_tool/__init__.py +aecaf2517e620eb765e7c7a6a198a6e351bfbe54,10-15-2023 14:00:25,Casper Lindberg,"[Cleanup] Remove dead code, TODOs and outcommented code",backend/app/app/services/chat_agent/tools/library/summarizer_tool/summarizer_tool.py +aecaf2517e620eb765e7c7a6a198a6e351bfbe54,10-15-2023 14:00:25,Casper Lindberg,"[Cleanup] Remove dead code, TODOs and outcommented code",backend/app/app/services/chat_agent/tools/library/visualizer_tool/__init__.py +aecaf2517e620eb765e7c7a6a198a6e351bfbe54,10-15-2023 14:00:25,Casper Lindberg,"[Cleanup] Remove dead code, TODOs and outcommented code",backend/app/app/services/chat_agent/tools/library/visualizer_tool/visualizer_tool.py +aecaf2517e620eb765e7c7a6a198a6e351bfbe54,10-15-2023 14:00:25,Casper Lindberg,"[Cleanup] Remove dead code, TODOs and outcommented code",backend/app/app/services/chat_agent/tools/tools.py +aecaf2517e620eb765e7c7a6a198a6e351bfbe54,10-15-2023 14:00:25,Casper Lindberg,"[Cleanup] Remove dead code, TODOs and outcommented code",backend/app/app/utils/config.py +aecaf2517e620eb765e7c7a6a198a6e351bfbe54,10-15-2023 14:00:25,Casper Lindberg,"[Cleanup] Remove dead code, TODOs and outcommented code",backend/app/app/utils/config_loader.py +aecaf2517e620eb765e7c7a6a198a6e351bfbe54,10-15-2023 14:00:25,Casper Lindberg,"[Cleanup] Remove dead code, TODOs and outcommented code",backend/app/app/utils/exceptions/__init__.py +aecaf2517e620eb765e7c7a6a198a6e351bfbe54,10-15-2023 14:00:25,Casper Lindberg,"[Cleanup] Remove dead code, TODOs and outcommented code",backend/app/app/utils/exceptions/common_exception.py +aecaf2517e620eb765e7c7a6a198a6e351bfbe54,10-15-2023 14:00:25,Casper Lindberg,"[Cleanup] Remove dead code, TODOs and outcommented code",backend/app/app/utils/fastapi_globals.py +aecaf2517e620eb765e7c7a6a198a6e351bfbe54,10-15-2023 14:00:25,Casper Lindberg,"[Cleanup] Remove dead code, TODOs and outcommented code",backend/app/app/utils/llm.py +aecaf2517e620eb765e7c7a6a198a6e351bfbe54,10-15-2023 14:00:25,Casper Lindberg,"[Cleanup] Remove dead code, TODOs and outcommented code",backend/app/app/utils/minio_client.py +aecaf2517e620eb765e7c7a6a198a6e351bfbe54,10-15-2023 14:00:25,Casper Lindberg,"[Cleanup] Remove dead code, TODOs and outcommented code",backend/app/app/utils/streaming/__init__.py +aecaf2517e620eb765e7c7a6a198a6e351bfbe54,10-15-2023 14:00:25,Casper Lindberg,"[Cleanup] Remove dead code, TODOs and outcommented code",backend/app/app/utils/streaming/callbacks/__init__.py +aecaf2517e620eb765e7c7a6a198a6e351bfbe54,10-15-2023 14:00:25,Casper Lindberg,"[Cleanup] Remove dead code, TODOs and outcommented code",backend/app/app/utils/streaming/callbacks/stream.py +aecaf2517e620eb765e7c7a6a198a6e351bfbe54,10-15-2023 14:00:25,Casper Lindberg,"[Cleanup] Remove dead code, TODOs and outcommented code",backend/app/app/utils/streaming/helpers.py +aecaf2517e620eb765e7c7a6a198a6e351bfbe54,10-15-2023 14:00:25,Casper Lindberg,"[Cleanup] Remove dead code, TODOs and outcommented code",backend/app/app/utils/uuid6.py +2134991028a802a74d74bbdd9190a9be0e7b66f0,10-20-2023 14:32:09,Gustaf Halvardsson,Add Next bundle analyzer package,frontend/next.config.mjs +2134991028a802a74d74bbdd9190a9be0e7b66f0,10-20-2023 14:32:09,Gustaf Halvardsson,Add Next bundle analyzer package,frontend/package.json +2134991028a802a74d74bbdd9190a9be0e7b66f0,10-20-2023 14:32:09,Gustaf Halvardsson,Add Next bundle analyzer package,frontend/pnpm-lock.yaml +bbff5ce5a4bed2f94f35af1868aef6d970c37640,10-20-2023 14:32:53,Gustaf Halvardsson,Specify specific icons to import in Icon object,frontend/src/components/CustomIcons/Icon.tsx +6eb874b30000ef5324a84004f31109097b72a4f0,10-20-2023 14:40:33,GitHub Enterprise,"Merge pull request #60 from Lindberg-Casper/cleanup/remove-dead-code + +[Cleanup] Add Docstrings, Remove dead code, TODOs and out-commented code",.env.example +6eb874b30000ef5324a84004f31109097b72a4f0,10-20-2023 14:40:33,GitHub Enterprise,"Merge pull request #60 from Lindberg-Casper/cleanup/remove-dead-code + +[Cleanup] Add Docstrings, Remove dead code, TODOs and out-commented code",.env.example.dev +6eb874b30000ef5324a84004f31109097b72a4f0,10-20-2023 14:40:33,GitHub Enterprise,"Merge pull request #60 from Lindberg-Casper/cleanup/remove-dead-code + +[Cleanup] Add Docstrings, Remove dead code, TODOs and out-commented code",.env.example.local +6eb874b30000ef5324a84004f31109097b72a4f0,10-20-2023 14:40:33,GitHub Enterprise,"Merge pull request #60 from Lindberg-Casper/cleanup/remove-dead-code + +[Cleanup] Add Docstrings, Remove dead code, TODOs and out-commented code",backend/app/app/api/deps.py +6eb874b30000ef5324a84004f31109097b72a4f0,10-20-2023 14:40:33,GitHub Enterprise,"Merge pull request #60 from Lindberg-Casper/cleanup/remove-dead-code + +[Cleanup] Add Docstrings, Remove dead code, TODOs and out-commented code",backend/app/app/api/v1/endpoints/chat.py +6eb874b30000ef5324a84004f31109097b72a4f0,10-20-2023 14:40:33,GitHub Enterprise,"Merge pull request #60 from Lindberg-Casper/cleanup/remove-dead-code + +[Cleanup] Add Docstrings, Remove dead code, TODOs and out-commented code",backend/app/app/api/v1/endpoints/sql.py +6eb874b30000ef5324a84004f31109097b72a4f0,10-20-2023 14:40:33,GitHub Enterprise,"Merge pull request #60 from Lindberg-Casper/cleanup/remove-dead-code + +[Cleanup] Add Docstrings, Remove dead code, TODOs and out-commented code",backend/app/app/api/v1/endpoints/statistics.py +6eb874b30000ef5324a84004f31109097b72a4f0,10-20-2023 14:40:33,GitHub Enterprise,"Merge pull request #60 from Lindberg-Casper/cleanup/remove-dead-code + +[Cleanup] Add Docstrings, Remove dead code, TODOs and out-commented code",backend/app/app/core/config.py +6eb874b30000ef5324a84004f31109097b72a4f0,10-20-2023 14:40:33,GitHub Enterprise,"Merge pull request #60 from Lindberg-Casper/cleanup/remove-dead-code + +[Cleanup] Add Docstrings, Remove dead code, TODOs and out-commented code",backend/app/app/crud/base_crud.py +6eb874b30000ef5324a84004f31109097b72a4f0,10-20-2023 14:40:33,GitHub Enterprise,"Merge pull request #60 from Lindberg-Casper/cleanup/remove-dead-code + +[Cleanup] Add Docstrings, Remove dead code, TODOs and out-commented code",backend/app/app/db/session.py +6eb874b30000ef5324a84004f31109097b72a4f0,10-20-2023 14:40:33,GitHub Enterprise,"Merge pull request #60 from Lindberg-Casper/cleanup/remove-dead-code + +[Cleanup] Add Docstrings, Remove dead code, TODOs and out-commented code",backend/app/app/db/vector_db_pdf_ingestion.py +6eb874b30000ef5324a84004f31109097b72a4f0,10-20-2023 14:40:33,GitHub Enterprise,"Merge pull request #60 from Lindberg-Casper/cleanup/remove-dead-code + +[Cleanup] Add Docstrings, Remove dead code, TODOs and out-commented code",backend/app/app/deps/__init__.py +6eb874b30000ef5324a84004f31109097b72a4f0,10-20-2023 14:40:33,GitHub Enterprise,"Merge pull request #60 from Lindberg-Casper/cleanup/remove-dead-code + +[Cleanup] Add Docstrings, Remove dead code, TODOs and out-commented code",backend/app/app/deps/agent_deps.py +6eb874b30000ef5324a84004f31109097b72a4f0,10-20-2023 14:40:33,GitHub Enterprise,"Merge pull request #60 from Lindberg-Casper/cleanup/remove-dead-code + +[Cleanup] Add Docstrings, Remove dead code, TODOs and out-commented code",backend/app/app/deps/celery_deps.py +6eb874b30000ef5324a84004f31109097b72a4f0,10-20-2023 14:40:33,GitHub Enterprise,"Merge pull request #60 from Lindberg-Casper/cleanup/remove-dead-code + +[Cleanup] Add Docstrings, Remove dead code, TODOs and out-commented code",backend/app/app/deps/websocket_deps.py +6eb874b30000ef5324a84004f31109097b72a4f0,10-20-2023 14:40:33,GitHub Enterprise,"Merge pull request #60 from Lindberg-Casper/cleanup/remove-dead-code + +[Cleanup] Add Docstrings, Remove dead code, TODOs and out-commented code",backend/app/app/main.py +6eb874b30000ef5324a84004f31109097b72a4f0,10-20-2023 14:40:33,GitHub Enterprise,"Merge pull request #60 from Lindberg-Casper/cleanup/remove-dead-code + +[Cleanup] Add Docstrings, Remove dead code, TODOs and out-commented code",backend/app/app/schemas/auth_schema.py +6eb874b30000ef5324a84004f31109097b72a4f0,10-20-2023 14:40:33,GitHub Enterprise,"Merge pull request #60 from Lindberg-Casper/cleanup/remove-dead-code + +[Cleanup] Add Docstrings, Remove dead code, TODOs and out-commented code",backend/app/app/schemas/message_schema.py +6eb874b30000ef5324a84004f31109097b72a4f0,10-20-2023 14:40:33,GitHub Enterprise,"Merge pull request #60 from Lindberg-Casper/cleanup/remove-dead-code + +[Cleanup] Add Docstrings, Remove dead code, TODOs and out-commented code",backend/app/app/schemas/response_schema.py +6eb874b30000ef5324a84004f31109097b72a4f0,10-20-2023 14:40:33,GitHub Enterprise,"Merge pull request #60 from Lindberg-Casper/cleanup/remove-dead-code + +[Cleanup] Add Docstrings, Remove dead code, TODOs and out-commented code",backend/app/app/schemas/user_schema.py +6eb874b30000ef5324a84004f31109097b72a4f0,10-20-2023 14:40:33,GitHub Enterprise,"Merge pull request #60 from Lindberg-Casper/cleanup/remove-dead-code + +[Cleanup] Add Docstrings, Remove dead code, TODOs and out-commented code",backend/app/app/services/__init__.py +6eb874b30000ef5324a84004f31109097b72a4f0,10-20-2023 14:40:33,GitHub Enterprise,"Merge pull request #60 from Lindberg-Casper/cleanup/remove-dead-code + +[Cleanup] Add Docstrings, Remove dead code, TODOs and out-commented code",backend/app/app/services/chat_agent/__init__.py +6eb874b30000ef5324a84004f31109097b72a4f0,10-20-2023 14:40:33,GitHub Enterprise,"Merge pull request #60 from Lindberg-Casper/cleanup/remove-dead-code + +[Cleanup] Add Docstrings, Remove dead code, TODOs and out-commented code",backend/app/app/services/chat_agent/helpers/__init__.py +6eb874b30000ef5324a84004f31109097b72a4f0,10-20-2023 14:40:33,GitHub Enterprise,"Merge pull request #60 from Lindberg-Casper/cleanup/remove-dead-code + +[Cleanup] Add Docstrings, Remove dead code, TODOs and out-commented code",backend/app/app/services/chat_agent/helpers/llm.py +6eb874b30000ef5324a84004f31109097b72a4f0,10-20-2023 14:40:33,GitHub Enterprise,"Merge pull request #60 from Lindberg-Casper/cleanup/remove-dead-code + +[Cleanup] Add Docstrings, Remove dead code, TODOs and out-commented code",backend/app/app/services/chat_agent/helpers/utils.py +6eb874b30000ef5324a84004f31109097b72a4f0,10-20-2023 14:40:33,GitHub Enterprise,"Merge pull request #60 from Lindberg-Casper/cleanup/remove-dead-code + +[Cleanup] Add Docstrings, Remove dead code, TODOs and out-commented code",backend/app/app/services/chat_agent/meta_agent.py +6eb874b30000ef5324a84004f31109097b72a4f0,10-20-2023 14:40:33,GitHub Enterprise,"Merge pull request #60 from Lindberg-Casper/cleanup/remove-dead-code + +[Cleanup] Add Docstrings, Remove dead code, TODOs and out-commented code",backend/app/app/services/chat_agent/router_agent/SimpleRouterAgent.py +6eb874b30000ef5324a84004f31109097b72a4f0,10-20-2023 14:40:33,GitHub Enterprise,"Merge pull request #60 from Lindberg-Casper/cleanup/remove-dead-code + +[Cleanup] Add Docstrings, Remove dead code, TODOs and out-commented code",backend/app/app/services/chat_agent/router_agent/__init__.py +6eb874b30000ef5324a84004f31109097b72a4f0,10-20-2023 14:40:33,GitHub Enterprise,"Merge pull request #60 from Lindberg-Casper/cleanup/remove-dead-code + +[Cleanup] Add Docstrings, Remove dead code, TODOs and out-commented code",backend/app/app/services/chat_agent/tools/ExtendedBaseTool.py +6eb874b30000ef5324a84004f31109097b72a4f0,10-20-2023 14:40:33,GitHub Enterprise,"Merge pull request #60 from Lindberg-Casper/cleanup/remove-dead-code + +[Cleanup] Add Docstrings, Remove dead code, TODOs and out-commented code",backend/app/app/services/chat_agent/tools/__init__.py +6eb874b30000ef5324a84004f31109097b72a4f0,10-20-2023 14:40:33,GitHub Enterprise,"Merge pull request #60 from Lindberg-Casper/cleanup/remove-dead-code + +[Cleanup] Add Docstrings, Remove dead code, TODOs and out-commented code",backend/app/app/services/chat_agent/tools/library/__init__.py +6eb874b30000ef5324a84004f31109097b72a4f0,10-20-2023 14:40:33,GitHub Enterprise,"Merge pull request #60 from Lindberg-Casper/cleanup/remove-dead-code + +[Cleanup] Add Docstrings, Remove dead code, TODOs and out-commented code",backend/app/app/services/chat_agent/tools/library/entertainer_tool/__init__.py +6eb874b30000ef5324a84004f31109097b72a4f0,10-20-2023 14:40:33,GitHub Enterprise,"Merge pull request #60 from Lindberg-Casper/cleanup/remove-dead-code + +[Cleanup] Add Docstrings, Remove dead code, TODOs and out-commented code",backend/app/app/services/chat_agent/tools/library/entertainer_tool/entertainer_tool.py +6eb874b30000ef5324a84004f31109097b72a4f0,10-20-2023 14:40:33,GitHub Enterprise,"Merge pull request #60 from Lindberg-Casper/cleanup/remove-dead-code + +[Cleanup] Add Docstrings, Remove dead code, TODOs and out-commented code",backend/app/app/services/chat_agent/tools/library/expert_tool/__init__.py +6eb874b30000ef5324a84004f31109097b72a4f0,10-20-2023 14:40:33,GitHub Enterprise,"Merge pull request #60 from Lindberg-Casper/cleanup/remove-dead-code + +[Cleanup] Add Docstrings, Remove dead code, TODOs and out-commented code",backend/app/app/services/chat_agent/tools/library/expert_tool/expert_tool.py +6eb874b30000ef5324a84004f31109097b72a4f0,10-20-2023 14:40:33,GitHub Enterprise,"Merge pull request #60 from Lindberg-Casper/cleanup/remove-dead-code + +[Cleanup] Add Docstrings, Remove dead code, TODOs and out-commented code",backend/app/app/services/chat_agent/tools/library/image_gen_with_input_tool/__init__.py +6eb874b30000ef5324a84004f31109097b72a4f0,10-20-2023 14:40:33,GitHub Enterprise,"Merge pull request #60 from Lindberg-Casper/cleanup/remove-dead-code + +[Cleanup] Add Docstrings, Remove dead code, TODOs and out-commented code",backend/app/app/services/chat_agent/tools/library/image_gen_with_input_tool/image_gen_with_input_tool.py +6eb874b30000ef5324a84004f31109097b72a4f0,10-20-2023 14:40:33,GitHub Enterprise,"Merge pull request #60 from Lindberg-Casper/cleanup/remove-dead-code + +[Cleanup] Add Docstrings, Remove dead code, TODOs and out-commented code",backend/app/app/services/chat_agent/tools/library/image_generation_tool/__init__.py +6eb874b30000ef5324a84004f31109097b72a4f0,10-20-2023 14:40:33,GitHub Enterprise,"Merge pull request #60 from Lindberg-Casper/cleanup/remove-dead-code + +[Cleanup] Add Docstrings, Remove dead code, TODOs and out-commented code",backend/app/app/services/chat_agent/tools/library/image_generation_tool/image_generation_tool.py +6eb874b30000ef5324a84004f31109097b72a4f0,10-20-2023 14:40:33,GitHub Enterprise,"Merge pull request #60 from Lindberg-Casper/cleanup/remove-dead-code + +[Cleanup] Add Docstrings, Remove dead code, TODOs and out-commented code",backend/app/app/services/chat_agent/tools/library/pdf_tool/pdf_tool.py +6eb874b30000ef5324a84004f31109097b72a4f0,10-20-2023 14:40:33,GitHub Enterprise,"Merge pull request #60 from Lindberg-Casper/cleanup/remove-dead-code + +[Cleanup] Add Docstrings, Remove dead code, TODOs and out-commented code",backend/app/app/services/chat_agent/tools/library/sql_tool/__init__.py +6eb874b30000ef5324a84004f31109097b72a4f0,10-20-2023 14:40:33,GitHub Enterprise,"Merge pull request #60 from Lindberg-Casper/cleanup/remove-dead-code + +[Cleanup] Add Docstrings, Remove dead code, TODOs and out-commented code",backend/app/app/services/chat_agent/tools/library/sql_tool/sql_tool.py +6eb874b30000ef5324a84004f31109097b72a4f0,10-20-2023 14:40:33,GitHub Enterprise,"Merge pull request #60 from Lindberg-Casper/cleanup/remove-dead-code + +[Cleanup] Add Docstrings, Remove dead code, TODOs and out-commented code",backend/app/app/services/chat_agent/tools/library/summarizer_tool/__init__.py +6eb874b30000ef5324a84004f31109097b72a4f0,10-20-2023 14:40:33,GitHub Enterprise,"Merge pull request #60 from Lindberg-Casper/cleanup/remove-dead-code + +[Cleanup] Add Docstrings, Remove dead code, TODOs and out-commented code",backend/app/app/services/chat_agent/tools/library/summarizer_tool/summarizer_tool.py +6eb874b30000ef5324a84004f31109097b72a4f0,10-20-2023 14:40:33,GitHub Enterprise,"Merge pull request #60 from Lindberg-Casper/cleanup/remove-dead-code + +[Cleanup] Add Docstrings, Remove dead code, TODOs and out-commented code",backend/app/app/services/chat_agent/tools/library/visualizer_tool/__init__.py +6eb874b30000ef5324a84004f31109097b72a4f0,10-20-2023 14:40:33,GitHub Enterprise,"Merge pull request #60 from Lindberg-Casper/cleanup/remove-dead-code + +[Cleanup] Add Docstrings, Remove dead code, TODOs and out-commented code",backend/app/app/services/chat_agent/tools/library/visualizer_tool/visualizer_tool.py +6eb874b30000ef5324a84004f31109097b72a4f0,10-20-2023 14:40:33,GitHub Enterprise,"Merge pull request #60 from Lindberg-Casper/cleanup/remove-dead-code + +[Cleanup] Add Docstrings, Remove dead code, TODOs and out-commented code",backend/app/app/services/chat_agent/tools/tools.py +6eb874b30000ef5324a84004f31109097b72a4f0,10-20-2023 14:40:33,GitHub Enterprise,"Merge pull request #60 from Lindberg-Casper/cleanup/remove-dead-code + +[Cleanup] Add Docstrings, Remove dead code, TODOs and out-commented code",backend/app/app/utils/config.py +6eb874b30000ef5324a84004f31109097b72a4f0,10-20-2023 14:40:33,GitHub Enterprise,"Merge pull request #60 from Lindberg-Casper/cleanup/remove-dead-code + +[Cleanup] Add Docstrings, Remove dead code, TODOs and out-commented code",backend/app/app/utils/config_loader.py +6eb874b30000ef5324a84004f31109097b72a4f0,10-20-2023 14:40:33,GitHub Enterprise,"Merge pull request #60 from Lindberg-Casper/cleanup/remove-dead-code + +[Cleanup] Add Docstrings, Remove dead code, TODOs and out-commented code",backend/app/app/utils/exceptions/__init__.py +6eb874b30000ef5324a84004f31109097b72a4f0,10-20-2023 14:40:33,GitHub Enterprise,"Merge pull request #60 from Lindberg-Casper/cleanup/remove-dead-code + +[Cleanup] Add Docstrings, Remove dead code, TODOs and out-commented code",backend/app/app/utils/exceptions/common_exception.py +6eb874b30000ef5324a84004f31109097b72a4f0,10-20-2023 14:40:33,GitHub Enterprise,"Merge pull request #60 from Lindberg-Casper/cleanup/remove-dead-code + +[Cleanup] Add Docstrings, Remove dead code, TODOs and out-commented code",backend/app/app/utils/fastapi_globals.py +6eb874b30000ef5324a84004f31109097b72a4f0,10-20-2023 14:40:33,GitHub Enterprise,"Merge pull request #60 from Lindberg-Casper/cleanup/remove-dead-code + +[Cleanup] Add Docstrings, Remove dead code, TODOs and out-commented code",backend/app/app/utils/llm.py +6eb874b30000ef5324a84004f31109097b72a4f0,10-20-2023 14:40:33,GitHub Enterprise,"Merge pull request #60 from Lindberg-Casper/cleanup/remove-dead-code + +[Cleanup] Add Docstrings, Remove dead code, TODOs and out-commented code",backend/app/app/utils/minio_client.py +6eb874b30000ef5324a84004f31109097b72a4f0,10-20-2023 14:40:33,GitHub Enterprise,"Merge pull request #60 from Lindberg-Casper/cleanup/remove-dead-code + +[Cleanup] Add Docstrings, Remove dead code, TODOs and out-commented code",backend/app/app/utils/streaming/__init__.py +6eb874b30000ef5324a84004f31109097b72a4f0,10-20-2023 14:40:33,GitHub Enterprise,"Merge pull request #60 from Lindberg-Casper/cleanup/remove-dead-code + +[Cleanup] Add Docstrings, Remove dead code, TODOs and out-commented code",backend/app/app/utils/streaming/callbacks/__init__.py +6eb874b30000ef5324a84004f31109097b72a4f0,10-20-2023 14:40:33,GitHub Enterprise,"Merge pull request #60 from Lindberg-Casper/cleanup/remove-dead-code + +[Cleanup] Add Docstrings, Remove dead code, TODOs and out-commented code",backend/app/app/utils/streaming/callbacks/stream.py +6eb874b30000ef5324a84004f31109097b72a4f0,10-20-2023 14:40:33,GitHub Enterprise,"Merge pull request #60 from Lindberg-Casper/cleanup/remove-dead-code + +[Cleanup] Add Docstrings, Remove dead code, TODOs and out-commented code",backend/app/app/utils/streaming/helpers.py +6eb874b30000ef5324a84004f31109097b72a4f0,10-20-2023 14:40:33,GitHub Enterprise,"Merge pull request #60 from Lindberg-Casper/cleanup/remove-dead-code + +[Cleanup] Add Docstrings, Remove dead code, TODOs and out-commented code",backend/app/app/utils/uuid6.py +ae74fee35b960cfc6f522814d10907bde3eb9ced,10-20-2023 16:10:06,GitHub Enterprise,"Merge pull request #61 from genAI/fx/optimize-bundle-size-react-icons + +Optimize bundle size of frontend",frontend/next.config.mjs +ae74fee35b960cfc6f522814d10907bde3eb9ced,10-20-2023 16:10:06,GitHub Enterprise,"Merge pull request #61 from genAI/fx/optimize-bundle-size-react-icons + +Optimize bundle size of frontend",frontend/package.json +ae74fee35b960cfc6f522814d10907bde3eb9ced,10-20-2023 16:10:06,GitHub Enterprise,"Merge pull request #61 from genAI/fx/optimize-bundle-size-react-icons + +Optimize bundle size of frontend",frontend/pnpm-lock.yaml +ae74fee35b960cfc6f522814d10907bde3eb9ced,10-20-2023 16:10:06,GitHub Enterprise,"Merge pull request #61 from genAI/fx/optimize-bundle-size-react-icons + +Optimize bundle size of frontend",frontend/src/components/CustomIcons/Icon.tsx diff --git a/backend/app/app/tool_constants/public_demo_data/configure_agent_and_tools.md b/backend/app/app/tool_constants/public_demo_data/configure_agent_and_tools.md new file mode 100644 index 00000000..93ee98ca --- /dev/null +++ b/backend/app/app/tool_constants/public_demo_data/configure_agent_and_tools.md @@ -0,0 +1,43 @@ +# Configure your agent and tools + +## Steps to complete +- Configure your agent in `agent.yml`, [see agent section for more detailed instructions](#agent-configuration) +- Add your own tools in `services/chat_agent/tools/YOURAPP` and configure them in `tools.yml`, [see tools section for more detailed instructions](#tools-configuration) + + +## Agent configuration + +The agent and action plans can be configured in `agent.yml`. + +### LLMs + +`default_llm` & `default_fast_llm`: Set the name of the LLMs you want to use. In `llm.py` you can add your own model (any model compatible with LangChain e.g. Google, Anthropic, or open source like Llama2). + +We currently have 2 ways to choose if `default_llm` or `default_fast_llm` is used. +- If you set `discard_fast_llm=True` to True in the LLM call in a tool, `default_llm` will always be used +- [TO BE CHANGED] Otherwise, `default_fast_llm` will be used for prompts < 2500 tokens (configurable in ExtendedBaseTool.py currently, needs to be cleaned up to add as a key setting) and `default_llm` for >=2500 tokens + +### Tools and Action Plans +Add all the tools in use in `tools`. Ensure the names match the tool names in `tools.py` and your custom tools. + +Configure the Action Plans available for the Meta Agent to choose from in `action_plans`. Give each Action Plan a clear `description` of what the use case is, this will improve the reliability and accuracy of the Meta Agent. Add all the tools in `actions`. Each sublist is 1 action step, so add tools as subitems if you want to execute them in parallel. + +### Meta agent prompts + +It is very important to have a clear system prompt in `system_context` for the Meta Agent so that it chooses the right Action Plans (`prompt_message` typically can typically be kept the same). Always include a role for the agent ("You are an expert in ...") and a clear goal ("Your goal is to select the right action plan.."). Include some principles to ensure the agent has the right behaviour for the use case, e.g. only run an optimization when the agent is very sure the user wants this, as it takes a lot of time. If there are common failure modes in the agent's routing choices, add a principle or add an example of good behaviour to solve it. + +## Tools configuration + +### Using a library tool +Check out the library of commonly used tools in `services/chat_agent/tools/library`. Using these tools is simple; ensure the tool is in the `tools` list in `agent.yml` and configure the prompts in `tools.yml`. Detailed documentation on the library tools can be found in `docs/library_tool_docs`. + +### Add a tool + +1) Add your own tool folder to `services/chat_agent/tools` with a new file `yourtool.py` +2) Implement your tool. See `template_tool.py` for a template tool, or look at the other library tools for inspiration +3) In `tools.py`, add the tool in `all_tool_classes` and import it +4) Add the tool in `tools` in `agent.yml` and add the tool to the applicable action plans +5) Add your tool and configure the tool and prompts in `tools.yml` + +Optional: +Customize the Actions for the tool in the UI, see [the UI documentation](configure_ui.md). diff --git a/backend/app/app/tool_constants/public_demo_data/configure_ui.md b/backend/app/app/tool_constants/public_demo_data/configure_ui.md new file mode 100644 index 00000000..3017c667 --- /dev/null +++ b/backend/app/app/tool_constants/public_demo_data/configure_ui.md @@ -0,0 +1,68 @@ +# Frontend customization guide +This guide provides instructions on how to customize the user interface elements of your project, such as colors, fonts, and general styling, using Tailwind CSS within your codebase + +AgentKit frontend is leveraging [tailwindcss](https://tailwindcss.com/) to efficiently configure and customize theme colors and fonts. + +The main UI config files are available in `frontend/tailwind.config.ts` and inside `frontend/src/style/` directory. + +## Theme colors +The colour pallete used is defined in the `frontend/tailwind.config.ts` file: + +``` typescript + colors: { + 'bcg-green': '#156648', // replace indigo-600 + 'bcg-green-light': '#39b27c', + 'bcg-green-x-light': '#5dfdb0', + 'bcg-x-green': '#00E0B5', + 'custom-light-green': 'rgba(100, 255, 100, 0.1)', + 'bcg-dark': 'rgb(28, 31, 61)', + 'bcg-dark-hover': 'rgb(0, 168, 135)', + 'bcg-dark-select': 'rgb(0, 224, 181)', + 'bcg-light': 'rgb(228,228,233)', + 'bcg-light-select': 'rgb(0, 168, 135)', + 'bcg-light-hover': '#00E0B5', + }, +``` + +To customize the color of table elements in the chat, you need to modify the `frontend/src/style/global.css` file: + +``` css +.rdt_Pagination { + @apply !border-t-0 dark:bg-bcg-dark-select dark:text-gray-300; +} + +.rdt_Pagination button { /* pagination and buttons */ + @apply dark:bg-bcg-dark-select dark:fill-gray-300 dark:text-gray-300; +} + +.rdt_Table, /* Color classes */ +.rdt_TableHead, +.rdt_TableHeadRow, +.rdt_TableRow { /* Hover and Selected States */ + @apply dark:bg-bcg-dark-select dark:text-gray-300; +} +``` + +## Fonts + +Update the fontFamily section in your `tailwind.config.ts` file: + +``` typescript + fontFamily: { + sans: ['Henderson BCG Sans', ...defaultTheme.fontFamily.sans], + }, +``` + +## Logos and images + +For logos and images, you will directly replace the files in your `frontend/public/logo_***.png`.Make sure the new images follow the same naming conventions and file formats as the old ones to avoid broken references. + + +## Renderers + +If your application defines tools, it has to define application-specific artifact-renderers and action-renderers as well. The rest of the GUI & application flow is fixed (LLM-streaming, Meta-agent routing, memory, etc.). + +- Add your own renderer for steps in `ToolActionRenderer/applications/YOUR_APP` and add your application to `ToolActionRenderer/index.tsx` +- (Optional) Add your own renderer for appendices in `ToolAppendixRenderer/applications/YOUR_APP` + +Customize the Actions for your custom tools in the UI: create `ToolActionRenderer/applications/YOUR_APP` and add your application to `ToolActionRenderer/index.tsx` diff --git a/backend/app/app/tool_constants/public_demo_data/entertainer_expert_tools.md b/backend/app/app/tool_constants/public_demo_data/entertainer_expert_tools.md new file mode 100644 index 00000000..00d7bdd4 --- /dev/null +++ b/backend/app/app/tool_constants/public_demo_data/entertainer_expert_tools.md @@ -0,0 +1 @@ +WIP diff --git a/backend/app/app/tool_constants/public_demo_data/evaluation.md b/backend/app/app/tool_constants/public_demo_data/evaluation.md new file mode 100644 index 00000000..e64ab0d1 --- /dev/null +++ b/backend/app/app/tool_constants/public_demo_data/evaluation.md @@ -0,0 +1,12 @@ +# Evaluation + +Evaluating an AgentKit app can be done on multiple levels: +- Routing layer: Evaluate the meta agent's accuracy of choosing the right action plan based on the user query +- Tool layer: Evaluate individual tools +- Output layer: Evaluate the final output quality + +AgentKit evaluation layers + +See `experimental/evaluation_example.ipynb` for an example of evaluating an AgentKit app in a notebook. + +AgentKit natively integrates with LangSmith, which is a useful tool for tracing and tracking the performance of your app. https://docs.smith.langchain.com/ diff --git a/backend/app/app/tool_constants/public_demo_data/image_generation_tool.md b/backend/app/app/tool_constants/public_demo_data/image_generation_tool.md new file mode 100644 index 00000000..00d7bdd4 --- /dev/null +++ b/backend/app/app/tool_constants/public_demo_data/image_generation_tool.md @@ -0,0 +1 @@ +WIP diff --git a/backend/app/app/tool_constants/public_demo_data/issues.csv b/backend/app/app/tool_constants/public_demo_data/issues.csv new file mode 100644 index 00000000..f05b27b9 --- /dev/null +++ b/backend/app/app/tool_constants/public_demo_data/issues.csv @@ -0,0 +1,13 @@ +issue_number,issue_title,issue_state,issue_author,issue_created_at,issue_last_updated,issue_num_comments +1,Generalisation & Sanitisation Todos,open,heyder-jakob,05-30-2023 11:34:10,06-28-2023 15:42:20,4 +20,Feature: Websocket communication,open,heyder-jakob,06-22-2023 10:29:47,06-23-2023 14:40:56,1 +24,Feature: optional caching,closed,vanLangen-Casper,06-26-2023 11:34:18,07-12-2023 11:50:39,5 +26,Feature: voice-to-text input,open,vanLangen-Casper,06-26-2023 16:07:00,06-26-2023 16:07:00,0 +33,Alpha Demo : Diverged too much,closed,Fournier-Thomas,06-28-2023 16:12:27,09-22-2023 16:31:28,0 +34,sql_tool_db_info.json is not automatically re-built when the database is changed,closed,vanLangen-Casper,06-29-2023 13:23:49,07-12-2023 11:51:07,2 +35,Pull latest UI changes (if any left) & API key changes in frontend from vessel scheduling branch into develop branch,closed,vanLangen-Casper,06-29-2023 14:13:00,07-12-2023 11:50:21,0 +36,Application specific tools stored publicly,closed,vanLangen-Casper,06-29-2023 17:00:00,09-22-2023 16:31:55,0 +37,Common errors page,closed,vanLangen-Casper,06-30-2023 14:58:46,09-22-2023 16:31:14,0 +50,Issue building the frontend docker image,closed,Gatto-Francois,09-05-2023 14:24:49,09-05-2023 15:08:41,1 +57,Open sourcing backlog,open,vanLangen-Casper,10-10-2023 08:50:17,11-17-2023 13:09:53,8 +77,"UI Bug: the response overwrites the reasoning, leading to inconsistent output",closed,Bensaid-Eden,11-06-2023 23:36:35,11-07-2023 00:32:17,2 diff --git a/backend/app/app/tool_constants/public_demo_data/key_concepts.md b/backend/app/app/tool_constants/public_demo_data/key_concepts.md new file mode 100644 index 00000000..1837e062 --- /dev/null +++ b/backend/app/app/tool_constants/public_demo_data/key_concepts.md @@ -0,0 +1,12 @@ +WIP: tbd if needed + +## Key concepts + +- **Actions**: One of the steps to obtain an answer to the user's query, corresponding to executing a Tool(chain). An action has its own action-renderer for visualization in the frontend. +- **Action Step**: A pre-configured set of actions, e.g. sql_tool and pdf_tool. An action step can consist of multiple actions which are executed in parallel to achieve a certain outcome (e.g. retrieve information). +- **Action Plan**: A set of action steps which are executed linearily to achieve a certain outcome. For example, consider an action plan consisting of 2 toolsets: [[tool_1, tool_2], [tool_3, tool_4]]. In the first action step, tool_1 and tool_2 are executed in parallel and generate output. In the second action step, this output is passed to tool_3 and tool_4, which are executed in parallel, and the final output is passed to the frontend. +- **LLM Outputs**: Text output of an LLM from a Tool that is streamed to the frontend (e.g. output from explainer tool). In the output section, there is a preliminary LLM output (currently only from entertainer tool) and a final LLM output (final answer of agent). +- **Appendices**: Additional objects that are added below the final LLM output, such as visualizations, tables etc. +- **Signals**: Signals sent from backend of output status. E.g. 'Action ended', 'LLM Output final'. + +AgentKit framework diff --git a/backend/app/app/tool_constants/public_demo_data/memory.md b/backend/app/app/tool_constants/public_demo_data/memory.md new file mode 100644 index 00000000..00d7bdd4 --- /dev/null +++ b/backend/app/app/tool_constants/public_demo_data/memory.md @@ -0,0 +1 @@ +WIP diff --git a/backend/app/app/tool_constants/public_demo_data/optional_features.md b/backend/app/app/tool_constants/public_demo_data/optional_features.md new file mode 100644 index 00000000..6cbd06ba --- /dev/null +++ b/backend/app/app/tool_constants/public_demo_data/optional_features.md @@ -0,0 +1,65 @@ +# Optional Features + +In addition to the core functionality, AgentKit supports optional security and tracking features out of the box. + +## LLM Run Tracing + +To use a self-hosted langchain in docker, set `LANGCHAIN_TRACING_V2` to `true` and `LANGCHAIN_ENDPOINT` to `"http://langchain-backend:1984"`, e.g. +Note that `LANGCHAIN_API_KEY` must be set, but will not be used in self-hosted context. + +You will access stored runs / feedback at [http://localhost:9091](http://localhost:9091) + +``` +############################################# +# Langsmith variables +############################################# +LANGCHAIN_TRACING_V2="true" +LANGCHAIN_ENDPOINT="http://langchain-backend:1984" +LANGCHAIN_API_KEY="not-used" # must be set to real key if using hosted - key must be set for self-hosted +LANGCHAIN_PROJECT="default" +``` + +### Hosted Langsmith + +To use hosted Langsmith, set `LANGCHAIN_ENDPOINT` to `"https://api.langchain.plus"` and fill `LANGCHAIN_API_KEY`: + +1. Create an API Key by navigating to the [settings page](https://smith.langchain.com/settings). +3. Configure runtime environment - replace "" with the API key generated in step 1 + +``` +############################################# +# Langsmith variables +############################################# +LANGCHAIN_TRACING_V2="true" +LANGCHAIN_ENDPOINT="https://api.langchain.plus" +LANGCHAIN_API_KEY="" +LANGCHAIN_PROJECT="default" +``` + +## Feedback integration + +> Note: LLM Run tracing must be enabled for this feature. + +To enable feedback from the tool frontend, set `NEXT_PUBLIC_ENABLE_MESSAGE_FEEDBACK` in the /frontend/.env file is set to `true`, + +A pop-up will appear after each message giving the user the ability to rate the message quantitatively (thumbs up/down) and qualitatively (comment). This functionality can be useful e.g. for a PoC user testing session for your application. It could be further customised by adjusting the `FeedbackView` typescript file. + + +Frontend implementation: [frontend/src/components/ConversationView/MessageView/FeedbackView/index.tsx](frontend/src/components/ConversationView/MessageView/FeedbackView/index.tsx) +Backend route: [backend/app/app/api/v1/endpoints/statistics.py](backend/app/app/api/v1/endpoints/statistics.py) + +### Retrieving Feedback results: +1. Via the UI: + Feedback is collected in Langsmith as for LLM runs - Navigate to http://localhost:9091 (https://smith.langchain.com/ if using hosted) and select the project. +2. Via python API: by following example scripts at https://docs.smith.langchain.com/cookbook/exploratory-data-analysis/exporting-llm-runs-and-feedback +3. Via DB: by connecting to the DB directly in `public.runs` / `public.feedback` at `jdbc:postgresql://localhost:5433/postgres` + + +## User authentication + +User authentication can be done through NextAuth. Set `NEXT_PUBLIC_USE_AUTH` to `true` and fill the 'NEXTAUTH_SECRET' variable in `frontend/.env` with the generated secret key. A secret key can be generated using: +``` +openssl rand -base64 32 +``` +For more information, check the [NextAuth documentation](https://next-auth.js.org/configuration/options#secret). +Additionally, if you want to enable GitHub authentication, the `GITHUB_ID` and `GITHUB_SECRET` in `frontend/.env` should be filled with the corresponding values from your GitHub app credentials. diff --git a/backend/app/app/tool_constants/public_demo_data/pdf_tool.md b/backend/app/app/tool_constants/public_demo_data/pdf_tool.md new file mode 100644 index 00000000..12ee873d --- /dev/null +++ b/backend/app/app/tool_constants/public_demo_data/pdf_tool.md @@ -0,0 +1,17 @@ +# PDF tool guide +## How it works + +The standard PDF tool uses PGVector for indexing (https://github.com/pgvector/pgvector) and saves the embeddings in PostgresQL. However, any preferred index can be used easily if it is supported by Langchain. We use 'PyMuPDF' as the standard PDF parser, but any of the options in `LOADER_DICT` can be used. + +Note: This tool can easily be extended other documents as well, e.g. PPT, Word, by adding specific parsers for those document types. + +The general process is + +1) Create an index and fill with embedded documents (on app startup, or can be persisted), see `vector_db_pdf_ingestion.py`. Some choices can be made: + - The index as mentioned (PGVector in this template) + - Embedding model (OpenAI in this template) + - How the documents are split into chunks (TokenTextSplitter with chunk size 2000 and overlap 200 tokens in this template) + +2) When the PDF tool is run, the k most relevant document chunks are returned (4 in this template) + +3) These document chunks are entered in a LLM prompt along with the user question and the result is returned to the user diff --git a/backend/app/app/tool_constants/public_demo_data/pull_requests.csv b/backend/app/app/tool_constants/public_demo_data/pull_requests.csv new file mode 100644 index 00000000..6877427f --- /dev/null +++ b/backend/app/app/tool_constants/public_demo_data/pull_requests.csv @@ -0,0 +1,78 @@ +pr_number,pr_title,pr_state,pr_user,pr_created_at,pr_updated_at,pr_closed_at,pr_merged_at,pr_merged,pr_num_additions,pr_num_deletions,pr_num_changed_files,pr_num_comments,pr_num_review_comments,pr_num_commits,pr_mergeable,pr_mergeable_state +2,pre commit config,closed,AitBaali-Hamza,05-30-2023 20:15:43,05-31-2023 10:04:14,05-31-2023 10:04:11,05-31-2023 10:04:11,True,127,59,2,2,0,3,False,unknown +3,Feat/sem ver versioning,closed,AitBaali-Hamza,05-31-2023 10:01:35,06-01-2023 12:41:54,06-01-2023 12:41:21,06-01-2023 12:41:21,True,233,85,2,0,3,33,False,unknown +4,generate client openai,closed,AitBaali-Hamza,05-31-2023 15:48:18,06-07-2023 12:28:12,06-02-2023 09:33:32,,False,2250,3,70,1,0,1,False,unknown +5,Arch flow added + initial setup for usage guide (still WIP),closed,vanLangen-Casper,06-01-2023 20:01:22,06-05-2023 09:13:00,06-02-2023 15:21:21,06-02-2023 15:21:21,True,38,3,1,0,0,1,False,unknown +6,Feat/authentification saving,closed,AitBaali-Hamza,06-02-2023 09:33:08,06-04-2023 19:38:35,06-04-2023 19:38:32,06-04-2023 19:38:32,True,718,315,23,0,12,21,False,unknown +7,[DRAFT] Chinook simple demo,closed,vanLangen-Casper,06-06-2023 13:47:28,06-08-2023 14:10:49,06-08-2023 14:10:49,06-08-2023 14:10:49,True,35403,615,37,0,5,14,False,unknown +8,Demo/explain bot,closed,Scheel-Bech-Jacob,06-06-2023 14:25:27,06-06-2023 14:29:35,06-06-2023 14:29:35,06-06-2023 14:29:35,True,244,25,15,0,0,5,False,dirty +9,[INTEGRATION] Plan AI Supply integration,closed,Fournier-Thomas,06-06-2023 19:43:14,06-08-2023 15:57:49,06-08-2023 15:57:49,,False,547,564,4,0,0,1,False,unknown +10,Feat/save config,closed,Fournier-Thomas,06-06-2023 21:18:02,06-08-2023 09:46:11,06-08-2023 09:46:11,,False,63,8,5,0,1,2,False,dirty +11,Custom Login page and API Key (+ validation of the key) + user profile pic,closed,AitBaali-Hamza,06-07-2023 12:16:24,06-08-2023 10:05:10,06-08-2023 10:05:07,06-08-2023 10:05:07,True,1704,44,19,0,4,4,False,unknown +12,[DEMO] Alpha,closed,Fournier-Thomas,06-07-2023 14:56:36,06-15-2023 11:35:47,06-15-2023 11:35:47,,False,1271,649,20,0,0,7,False,unknown +13,[DEMO] Alpha with visuals,closed,Fournier-Thomas,06-08-2023 22:20:31,06-21-2023 15:21:22,06-21-2023 15:21:22,,False,3757,1000,66,0,0,36,False,dirty +14,Chinook fine tuning,closed,vanLangen-Casper,06-09-2023 10:40:51,06-19-2023 16:22:54,06-19-2023 16:22:54,06-19-2023 16:22:54,True,16,11,4,0,0,1,False,unknown +15,[DEMO] Alpha Sanitized,closed,Fournier-Thomas,06-15-2023 11:35:34,06-20-2023 15:50:17,06-20-2023 15:50:17,,False,341,118,15,0,0,5,False,unknown +16,[FEATURE] IO Parsing,closed,Fournier-Thomas,06-16-2023 14:07:24,08-11-2023 13:55:42,08-11-2023 13:55:42,,False,236,36,5,6,3,5,False,dirty +17,Feat/azure model,closed,heyder-jakob,06-19-2023 16:39:29,06-21-2023 07:05:06,06-21-2023 07:05:06,06-21-2023 07:05:06,True,28,29,5,0,3,2,False,unknown +18,Ft/backend config runopt,closed,AitBaali-Hamza,06-20-2023 09:26:16,06-20-2023 09:27:50,06-20-2023 09:27:50,06-20-2023 09:27:50,True,8801,486,71,0,0,31,False,unknown +19,Draft contribution guidelines,closed,vanLangen-Casper,06-21-2023 15:24:51,06-27-2023 15:58:19,06-27-2023 15:58:19,06-27-2023 15:58:19,True,46,2,2,1,2,2,False,unknown +21,Ft/backend config runopt,closed,AitBaali-Hamza,06-22-2023 10:39:47,06-22-2023 10:41:01,06-22-2023 10:41:01,,False,10387,1033,76,0,0,32,False,dirty +22,Update/develop with last changes,closed,AitBaali-Hamza,06-23-2023 12:35:16,06-23-2023 14:52:46,06-23-2023 14:52:43,06-23-2023 14:52:43,True,836,300,41,0,4,3,False,unknown +23,Tools documentation,closed,vanLangen-Casper,06-23-2023 14:32:29,06-29-2023 11:03:03,06-29-2023 10:33:24,06-29-2023 10:33:24,True,217,218,9,0,6,11,False,unknown +25,Ft/clarify tool,closed,Scheel-Bech-Jacob,06-26-2023 14:33:53,08-14-2023 12:56:20,08-14-2023 12:56:20,,False,89,3,4,4,0,9,False,dirty +27,add evaluation framework,closed,Scheel-Bech-Jacob,06-27-2023 12:16:45,06-30-2023 14:51:02,06-30-2023 14:51:02,06-30-2023 14:51:02,True,1003,1,10,2,0,3,False,unknown +28,Feat: Update langchain version to support ChatModel caching,closed,heyder-jakob,06-27-2023 16:23:08,07-05-2023 09:25:26,07-05-2023 09:25:26,07-05-2023 09:25:26,True,28,9,2,0,0,1,False,unknown +29,Readme & .env.example fixes for Chinook set up,closed,vanLangen-Casper,06-27-2023 17:41:11,06-28-2023 12:27:01,06-28-2023 12:27:01,,False,33,23,8,0,0,1,False,unknown +30,[Do not merge] Comparing files for debugging,closed,vanLangen-Casper,06-28-2023 10:41:03,06-28-2023 12:27:01,06-28-2023 12:27:01,,False,13908,1151,139,0,0,77,False,dirty +31,Feat/alpha visuals,closed,Fournier-Thomas,06-28-2023 12:16:51,06-28-2023 16:01:44,06-28-2023 16:01:44,,False,9074,6400,206,0,0,60,True,blocked +32,"Caddy fix, API key default fix, .env.example updates for Chinook",closed,vanLangen-Casper,06-28-2023 12:22:32,07-07-2023 16:35:24,07-07-2023 16:35:22,07-07-2023 16:35:22,True,190,101,16,0,31,12,False,unknown +38,Rebuild sql info file if set in config,closed,vanLangen-Casper,06-30-2023 17:06:22,07-02-2023 18:19:46,07-02-2023 18:19:46,07-02-2023 18:19:46,True,16,13,5,0,0,1,False,unknown +39,Fixes for contributor dev environment setup,closed,Connell-Liam,07-05-2023 15:28:34,07-05-2023 21:31:11,07-05-2023 21:30:48,,False,81,39,12,0,0,7,False,dirty +40,Fix minor issues with local environment setup,closed,Connell-Liam,07-05-2023 21:29:57,08-11-2023 13:36:39,08-11-2023 13:36:39,,False,72,35,11,4,0,2,False,dirty +41,Feat/image generation,closed,Jia-Valerie,07-11-2023 11:34:37,07-11-2023 12:51:12,07-11-2023 12:45:49,,False,243,44806,139,0,0,7,False,unknown +42,Feat/image generation,closed,Jia-Valerie,07-11-2023 14:07:31,08-10-2023 10:39:05,08-10-2023 10:39:05,08-10-2023 10:39:05,True,301,1,12,0,0,5,False,unknown +43,[WIP] cropGPT,closed,Connell-Liam,07-11-2023 18:33:07,07-12-2023 14:50:58,07-12-2023 14:50:58,,False,2649,438,38,0,0,29,False,dirty +44,Fix/pdf tool flag,closed,Bensaid-Eden,07-21-2023 17:35:37,08-10-2023 10:00:54,08-10-2023 10:00:54,08-10-2023 10:00:54,True,9,6,2,0,0,3,False,unknown +45,[TO DELETE],closed,Bensaid-Eden,07-25-2023 04:34:08,07-25-2023 04:43:13,07-25-2023 04:36:41,,False,1865,24,20,0,0,13,False,unknown +46,Feat: Feedback and customisation example integration,closed,heyder-jakob,08-11-2023 13:48:44,08-11-2023 13:51:52,08-11-2023 13:51:52,08-11-2023 13:51:52,True,659,131,39,0,0,2,False,unknown +47,"Implement BaseLLM Class and Refactor Clarity, Entertainer, and Expert Tools",open,Scheel-Bech-Jacob,08-14-2023 12:55:07,08-14-2023 12:56:44,,,False,44,73,5,0,0,1,False,dirty +48,Updated env vars for LangSmith,closed,vanLangen-Casper,08-25-2023 11:04:31,09-25-2023 14:40:48,09-25-2023 14:40:48,09-25-2023 14:40:48,True,14,8,3,0,0,1,False,unknown +49,Documentation simplification,closed,vanLangen-Casper,08-25-2023 11:48:45,09-25-2023 14:41:22,09-25-2023 14:41:22,09-25-2023 14:41:22,True,51,88,1,0,0,1,False,unknown +51,Docs/access,closed,Howitt-Ben,09-12-2023 13:58:21,09-13-2023 07:53:06,09-12-2023 14:12:41,,False,2461,313,53,0,0,15,False,unknown +52,Fix self-hosted langsmith (#22),closed,Howitt-Ben,09-22-2023 16:29:54,11-02-2023 17:35:48,10-09-2023 19:00:38,10-09-2023 19:00:38,True,133,31,8,3,0,3,False,unknown +53,DevEx suggestion to change Readme,closed,Fernandez-Alex,09-24-2023 16:29:53,09-25-2023 14:43:37,09-25-2023 14:43:37,09-25-2023 14:43:37,True,1,1,1,0,0,1,False,unknown +54,docs: reference nano-agent-x in README,open,Cambiaghi-Luca,09-26-2023 12:37:32,09-28-2023 12:48:14,,,False,19,2,1,0,2,1,False,dirty +55,Feature/insights tools,closed,Stoehr-Maximilian,10-05-2023 12:49:13,10-05-2023 12:50:54,10-05-2023 12:49:36,,False,2607,19224,21,0,0,3,False,unknown +56,fix: typos in self-hosted langchain solutions,closed,Howitt-Ben,10-09-2023 19:40:15,10-11-2023 09:37:48,10-11-2023 09:37:48,10-11-2023 09:37:48,True,19,4,3,0,0,2,False,unknown +58,feature: add and run pre-commit,closed,Howitt-Ben,10-11-2023 21:23:09,10-12-2023 13:20:30,10-12-2023 13:20:21,10-12-2023 13:20:21,True,7875,3774,139,0,1,8,False,unknown +59,New Readme and structure documentation,closed,vanLangen-Casper,10-14-2023 18:07:11,11-08-2023 09:48:58,11-08-2023 09:48:58,11-08-2023 09:48:58,True,715,1346,49,0,0,19,False,unknown +60,"[Cleanup] Add Docstrings, Remove dead code, TODOs and out-commented code",closed,Lindberg-Casper,10-15-2023 14:04:43,10-20-2023 14:40:34,10-20-2023 14:40:33,10-20-2023 14:40:33,True,183,398,59,0,0,1,False,unknown +61,Optimize bundle size of frontend,closed,Halvardsson-Gustaf,10-20-2023 14:42:48,10-23-2023 06:53:05,10-20-2023 16:10:06,10-20-2023 16:10:06,True,1518,4287,4,0,0,2,False,unknown +62,fix aiter in class AsyncIteratorCallbackHandler,closed,AitBaali-Hamza,10-20-2023 14:54:59,11-06-2023 09:14:38,11-06-2023 09:14:38,,False,3,28,1,0,0,1,False,unknown +63,Update setup readme,closed,Schwartzenberg-Carel,10-24-2023 09:55:36,10-25-2023 16:28:33,10-25-2023 16:28:15,,False,2,2,1,0,0,2,False,unknown +64,Refactor/route,closed,Howitt-Ben,10-25-2023 07:45:29,11-02-2023 17:34:18,10-25-2023 08:04:10,,False,30457,548,111,0,0,61,False,dirty +65,Move to one .env.example backend/frontend + simplify,closed,Schwartzenberg-Carel,10-25-2023 16:14:40,10-31-2023 17:49:28,10-31-2023 17:49:20,10-31-2023 17:49:20,True,406,1052,15,1,4,52,False,unknown +66,Refactor/cleanup agent yml,closed,Soussi-Sofiane,10-29-2023 18:51:23,11-06-2023 09:25:20,11-06-2023 09:25:20,,False,63,19,15,0,0,3,False,unknown +67,Simplify and clean up agent & tools config,closed,kennedy-ricardo,10-29-2023 21:14:17,11-13-2023 12:17:58,11-13-2023 10:11:32,11-13-2023 10:11:32,True,92,77,16,1,0,13,False,unknown +68,"docs, wip: add placeholder docs for optional_features.md",closed,Howitt-Ben,10-30-2023 14:51:44,11-13-2023 10:59:14,11-13-2023 10:59:09,,False,32,5,1,0,0,2,False,dirty +69,[WIP] Add Behave end-to-end tests for backend,open,Halvardsson-Gustaf,10-31-2023 11:58:15,11-20-2023 23:59:51,,,False,690,374,9,0,0,2,False,dirty +70,"minimum agent, tools setup",closed,Bensaid-Eden,11-03-2023 01:31:56,11-03-2023 05:54:18,11-03-2023 01:32:18,,False,173,0,4,0,0,1,False,unknown +71,Fixed AgentFinish bug,closed,vanLangen-Casper,11-03-2023 09:20:18,11-08-2023 09:57:52,11-08-2023 09:57:52,11-08-2023 09:57:52,True,7,4,1,1,0,5,False,unknown +72,fix streaming issues,closed,Bensaid-Eden,11-03-2023 19:10:59,11-06-2023 16:15:33,11-06-2023 09:29:14,11-06-2023 09:29:14,True,6,4,1,1,0,2,False,unknown +73,[docs] configure colors and fonts and callback handling,closed,ElMansouri-Ilyass,11-05-2023 22:45:00,11-06-2023 09:14:14,11-06-2023 09:10:19,11-06-2023 09:10:19,True,82,2,2,0,0,2,False,unknown +74,Fix: Dark mode table text,closed,vanLangen-Casper,11-06-2023 09:44:44,11-08-2023 09:39:22,11-08-2023 09:39:20,11-08-2023 09:39:20,True,3,3,1,0,0,1,False,unknown +75,Container Demo to main AgentKit repo,open,Schwartzenberg-Carel,11-06-2023 13:33:52,11-07-2023 13:23:24,,,False,14395,19513,50,0,0,83,True,clean +76,Refactor/add linting tools,closed,Soussi-Sofiane,11-06-2023 20:31:35,11-13-2023 18:21:42,11-13-2023 18:21:42,11-13-2023 18:21:42,True,2519,2067,49,0,3,11,False,unknown +78,Added documentation of the main backend flow,closed,Schwartzenberg-Carel,11-07-2023 16:45:32,11-13-2023 10:33:52,11-13-2023 10:33:18,11-13-2023 10:33:18,True,148,14,5,0,0,3,False,unknown +79,Docs/optional,closed,Howitt-Ben,11-13-2023 10:56:42,11-13-2023 12:18:46,11-13-2023 12:18:46,11-13-2023 12:18:46,True,33,9,1,0,0,3,False,unknown +80,Docs/optional,closed,Howitt-Ben,11-13-2023 12:21:31,11-13-2023 12:25:12,11-13-2023 12:23:12,,False,59,11,1,0,0,4,False,dirty +81,"docs: add details for tracing, feedback",closed,Howitt-Ben,11-13-2023 12:23:24,11-13-2023 12:25:26,11-13-2023 12:25:26,11-13-2023 12:25:26,True,30,6,1,0,0,1,False,unknown +82,Refactor: FE & BE cleanup,closed,heyder-jakob,11-13-2023 14:36:50,11-13-2023 14:42:39,11-13-2023 14:42:39,11-13-2023 14:42:39,True,87,321,53,0,0,1,False,unknown +83, Feature/chains in tools,open,Howitt-Ben,11-15-2023 14:42:09,11-20-2023 09:12:47,,,False,2005,1466,9,0,0,9,False,dirty +84,Linting,closed,Soussi-Sofiane,11-17-2023 11:04:09,11-26-2023 15:00:53,11-26-2023 15:00:53,11-26-2023 15:00:53,True,1265,861,43,0,0,19,False,unknown +85,Fix/small UI bugs,closed,Howitt-Ben,11-17-2023 13:06:28,11-26-2023 20:16:41,11-26-2023 20:16:41,11-26-2023 20:16:41,True,7,4,3,0,0,3,False,unknown +86,Minor fix: incorrect import,closed,vanLangen-Casper,11-19-2023 21:14:14,11-26-2023 15:01:10,11-26-2023 15:01:10,,False,1,1,1,0,0,1,False,dirty +87,Feature/simple readme rag,closed,Gupta2-Tanmay,11-21-2023 01:35:39,11-21-2023 01:36:31,11-21-2023 01:36:31,,False,39001,888,421,0,0,95,False,unknown +88,Added back development set-up with hot reload for ease of use,closed,vanLangen-Casper,11-26-2023 15:22:47,11-26-2023 15:23:52,11-26-2023 15:23:50,11-26-2023 15:23:50,True,171,193,3,0,0,1,False,unknown +89,WIP refactor,open,Soussi-Sofiane,11-26-2023 21:22:16,11-27-2023 17:53:34,,,False,1765,639,53,0,0,1,True,blocked diff --git a/backend/app/app/tool_constants/public_demo_data/setup.md b/backend/app/app/tool_constants/public_demo_data/setup.md new file mode 100644 index 00000000..5fc78f15 --- /dev/null +++ b/backend/app/app/tool_constants/public_demo_data/setup.md @@ -0,0 +1,45 @@ +# Setup +If this is your first time setting up AgentKit, please use the recommended installation method ([development setup modes](docs/setup_development.md) if hot-reload is required). We will run the backend app as well as the frontend app inside a Docker container. + +### Prerequisites +- Docker: https://www.docker.com/get-started + +### Installation steps + +1. Clone the repository containing the source code for the backend and frontend apps. + +2. Copy the `.env.example` file in the root directory of the repository and change the name to `.env`. + - Change the OPENAI_API_KEY and OPENAI_ORGANIZATION to your own (n.b. OPENAI_ORGANIZATION should be your OpenAI 'Organization ID', not 'Organization name'): + ```sh + OPENAI_API_KEY= + OPENAI_ORGANIZATION= + ``` +3. Copy the `frontend/.env.example` file in the frontend directory and change the name to `.env`. + +4. In the terminal, navigate to the root directory of the cloned repository. Build and start the Docker containers using the `docker-compose.yml` configuration file: + ``` + docker-compose -f docker-compose.yml up -d + ``` + +5. Wait for the containers to build and start. This may take a few minutes depending on your system. Once the containers are up and running, you can access the apps in your browser: + - Frontend app (Next.js): [http://localhost](http://localhost/) + - Backend app (FastAPI): http://localhost/api/v1 + +6. You have successfully installed and run the apps using Docker and the Caddy reverse proxy! + +## (Optional) Langchain tracing (Langsmith) + +See https://docs.smith.langchain.com/ on how to set up LangSmith. Once you have set up LangSmith and the .env variables, you will be able to see the AgentKit traces in LangSmith. + +## (Optional) Pre-commit + +We are using pre-commit to automatically run some hygiene checks. Install this by running `make install-pre-commit` + +There is also a dockerized service that can be run using `docker-compose run pre-commit` + +To link this from a local python installation, run: +```sh +pip install pre-commit +cp pre-commit/.pre-commit-config.yaml . +pre-commit install +``` diff --git a/backend/app/app/tool_constants/public_demo_data/setup_development.md b/backend/app/app/tool_constants/public_demo_data/setup_development.md new file mode 100644 index 00000000..056a34c3 --- /dev/null +++ b/backend/app/app/tool_constants/public_demo_data/setup_development.md @@ -0,0 +1,298 @@ +# Development Setup (hot reload) + +There are two additional setups available in this development setup guide: +1. Local frontend mode: This allows for an easy set-up, while having the flexibility of local development tools for the frontend. + +2. Full Local Mode: Use when you want to run both backend and frontend apps entirely locally without Docker. Suitable for local development without Docker, development on machines without Docker support, or quick prototyping. + +## Local frontend + +### Prerequisites +Before you begin, make sure you have the following installed on your machine: +- Docker: Docker: https://www.docker.com/get-started +- Node.js and pnpm: https://pnpm.io/installation + +### Installation Steps + +1. Clone the repository containing the source code for the backend and frontend apps. + +2. Copy the `.env.example` file in the root directory of the repository and change the name to .env. + - Change the OPENAI_API_KEY and OPENAI_ORGANIZATION to your own (n.b. OPENAI_ORGANIZATION should be your OpenAI 'Organization ID', not 'Organization name'): + ```sh + OPENAI_API_KEY= + OPENAI_ORGANIZATION= + ``` +3. Copy the `frontend/.env.example` file in the frontend directory and change the name to `.env`. Change the `DB_PORT` and `DB_HOST` variables as follows: + - `DB_PORT`: Change to 5732. + - `DB_HOST`: Change to localhost + + If needed, change the following variable (not required for a succesfull demo installation): + - `NEXT_PUBLIC_USE_AUTH`: Set to `true` if you would like to add an identity layer using Next Auth. + - `NEXTAUTH_SECRET`: Generate a secret key and replace `# TODO: Generate a secret and add it here` with the secret key. + - `GITHUB_ID` and `GITHUB_SECRET`: If you want to enable GitHub authentication, replace the corresponding values with your GitHub app credentials. + - `DB_USER`, `DB_PASSWORD`, `DB_HOST`,`DB_USER`,`DB_PORT` and `DB_NAME`: If you want to customize the database connection settings, update these values accordingly. + +4. In the root directory, create a file `docker-compose-local.yml` and paste the docker setup template from below: +
docker-compose-local.yml + + ```sh + version: '3.8' + + services: + fastapi_server: + container_name: fastapi_server + build: ./backend + restart: always + command: "sh -c 'alembic upgrade head && uvicorn app.main:app --reload --workers 1 --host 0.0.0.0 --port 9090'" + volumes: + - ./backend/app:/code + expose: + - 9090 + env_file: ".env" + depends_on: + - database + + database: + image: ankane/pgvector:v0.4.1 + restart: always + container_name: database + env_file: ".env" + user: root + volumes: + - ./db_docker:/var/lib/postgresql + - ./scripts/create-dbs.sql:/docker-entrypoint-initdb.d/create-dbs.sql + ports: + - 5732:5432 # Remove this on production, use same port as in .env for fastapi_db + expose: + - 5732 + environment: + - POSTGRES_USERNAME=${DATABASE_USER} + - POSTGRES_PASSWORD=${DATABASE_PASSWORD} + - POSTGRES_DATABASE=${DATABASE_NAME} + - POSTGRES_HOST_AUTH_METHOD= "trust" + + db_sql_tool: # Remove if not using sql tool + image: postgres:11 + restart: always + container_name: db_sql_tool + volumes: + - ./db_docker:/var/lib/postgresql + - ./scripts/db_sql_tool/chinook_psql_load.sql:/docker-entrypoint-initdb.d/chinook_psql_load.sql + environment: + - POSTGRES_USER=postgres + - POSTGRES_PASSWORD=postgres + - POSTGRES_DB=sqltool + ports: + - "5632:5432" + healthcheck: + test: ["CMD-SHELL", "pg_isready -U postgres"] + interval: 10s + timeout: 15s + retries: 5 + + redis_server: + image: redis:alpine + container_name: redis_server + restart: always + ports: + - 6379:6379 # Remove this on production + expose: + - 6379 + env_file: .env + langchain-playground: + image: langchain/${_LANGSMITH_IMAGE_PREFIX-}langchainplus-playground@sha256:f61ce9762babcb4a51af3e5b0cc628453ac7087237c5fc8694834de49b56d16e + langchain-frontend: + image: langchain/${_LANGSMITH_IMAGE_PREFIX-}langchainplus-frontend@sha256:e0ab157b2b9cb7f75743d45237f0d8ede75a3811d913f234585484255afe5b5a + ports: + - 9091:80 + expose: + - 9091 + environment: + - NEXT_PUBLIC_BACKEND_URL=http://langchain-backend:1984 + depends_on: + - langchain-backend + - langchain-playground + volumes: + - ./conf/nginx.conf:/etc/nginx/default.conf:ro + langchain-backend: + image: langchain/${_LANGSMITH_IMAGE_PREFIX-}langchainplus-backend@sha256:1196c12308b450548195c10927d469963c7d8e62db0e67f8204c83adb91f9031 + environment: + - PORT=1984 + - LANGCHAIN_ENV=local_docker + - LOG_LEVEL=warning + - OPENAI_API_KEY=${OPENAI_API_KEY} + ports: + - 1984:1984 + depends_on: + - langchain-db + - langchain-redis + langchain-db: + image: postgres:14.1 + command: + [ + "postgres", + "-c", + "log_min_messages=WARNING", + "-c", + "client_min_messages=WARNING" + ] + environment: + - POSTGRES_PASSWORD=postgres + - POSTGRES_USER=postgres + - POSTGRES_DB=postgres + volumes: + - langchain-db-data:/var/lib/postgresql/data + ports: + - 5433:5432 + langchain-redis: + image: redis:7 + ports: + - 63791:6379 + volumes: + - langchain-redis-data:/data + langchain-queue: + image: langchain/${_LANGSMITH_IMAGE_PREFIX-}langchainplus-backend@sha256:1196c12308b450548195c10927d469963c7d8e62db0e67f8204c83adb91f9031 + environment: + - LANGCHAIN_ENV=local_docker + - LOG_LEVEL=warning + entrypoint: "rq worker --with-scheduler -u redis://langchain-redis:6379 --serializer lc_database.queue.serializer.ORJSONSerializer --worker-class lc_database.queue.worker.Worker --connection-class lc_database.queue.connection.RedisRetry --job-class lc_database.queue.job.AsyncJob" + depends_on: + - langchain-redis + langchain-hub: + image: langchain/${_LANGSMITH_IMAGE_PREFIX-}langchainhub-backend@sha256:73b4c2c3e7cd81729e766bb4eece2b28883bebf7c710567a21d1a6c114abff5a + environment: + - PORT=1985 + - LANGCHAIN_ENV=local_docker + - LOG_LEVEL=warning + ports: + - 1985:1985 + depends_on: + - langchain-db + - langchain-redis + caddy_reverse_proxy: + container_name: caddy_reverse_proxy + image: caddy:alpine + restart: always + ports: + - 80:80 + - 9090:9090 + - 443:443 + environment: + - EXT_ENDPOINT1=${EXT_ENDPOINT1} + - LOCAL_1=${LOCAL_1} + - LOCAL_2=${LOCAL_2} + volumes: + - ./caddy/Caddyfile:/etc/caddy/Caddyfile + #- ./static:/code/static + - caddy_data:/data + - caddy_config:/config + + volumes: + caddy_data: + caddy_config: + langchain-db-data: + langchain-redis-data: + ``` +
+ +5. In the terminal, navigate to the root directory of the cloned repository. Build and start the Docker containers using the created `docker-compose-local.yml` configuration file: + ``` + docker-compose -f docker-compose-local.yml up -d + ``` + +6. Wait for the containers to build and start. This may take a few minutes depending on your system. While the Docker containers are running, open a new terminal window and navigate to the `frontend` directory. + +7. Install the frontend app's dependencies and set up prisma using pnpm: + ``` + pnpm install + pnpm prisma:generate + ``` + +8. Once the dependencies are installed, start the frontend app: + ``` + pnpm dev + ``` + +9. The frontend app (Next.js) will now be running locally at http://localhost:3000. The backend app (FastAPI) is still running inside the Docker container and can be accessed at http://localhost/api/v1. + +10. You have successfully installed and run the apps using Docker for the backend and running the frontend locally with Next.js and pnpm! You can go to http://localhost:3000 to try AgentKit. + +Additional notes: +- The backend app will automatically reload whenever you make changes to the source code inside the `backend/app` directory. You can see the changes reflected by refreshing the backend app in your browser. +- The frontend app (Next.js) will also automatically reload whenever you make changes to the source code inside the `frontend` directory. You can see the changes reflected by refreshing the frontend app in your browser. + +Remember to stop the Docker containers when you're done: +``` +docker-compose -f docker-compose-local-frontend.yml down +``` + +### Langchain tracing (Langsmith) + +See https://docs.smith.langchain.com/ on how to set up LangSmith. Once you have set up LangSmith and the .env variables, you will be able to see the AgentKit traces in LangSmith. + + +## Full local mode setup (for non-docker users) + +### Prerequisites +Version requirements: +* Python: **Python>=3.10** +* Poetry: **>=1.4.2** +* Nodejs: **>=18.16.0** + +1. Make sure to create a postgresql database with the name *fastapi_db** (e.g. by running the script `/scripts/create_dbs.sql`). +Set up the .env files from the examples and change the database url in the .env file to: + + - for /frontend/.env file: Use /frontend/.env.example as an example and change the DB_PORT and possibly any other variables to your own: + - `DB_PORT`: Change to 5732. + - If needed, also change the following variables to your own: + ```sh + DB_USER=postgres + DB_PASSWORD=postgres + DB_HOST=database + DB_PORT=5432 + DB_NAME=fastapi_db + ``` + + - for .env file: (use .env.example as an example) but change the DATABASE_HOST and DATABASE_PORT to your own + ```sh + DATABASE_HOST= + DATABASE_USER=postgres + DATABASE_PASSWORD=postgres + DATABASE_NAME=fastapi_db + DATABASE_PORT= + ``` + - Also, change the OPENAI_API_KEY and OPENAI_ORGANIZATION to your own: + ```sh + OPENAI_API_KEY= + OPENAI_ORGANIZATION= + ``` + + Finally, apply the .env variables: + ```sh + export $(grep -v '^#' .env | sed 's/#.*$//' | xargs) + ``` + +2. In the frontend folder: + install dependencies and run the application: + ```sh + pnpm install + ``` + then run the application: + ```sh + pnpm prisma:generate + pnpm dev + ``` + +3. In the backend/app folder: + ```sh + poetry config --local virtualenvs.in-project true + poetry env use 3.10 + poetry install + ``` + +4. In the root folder (make sure .env variables are applied): + ```sh + uvicorn "app.main:app" "--app-dir" "backend/app" "--reload" "--workers" "1" "--host" "0.0.0.0" "--port" "9090" + ``` + +5. If you visit http://localhost:3000, you should be able to see the application! diff --git a/backend/app/app/tool_constants/public_demo_data/sql_tool.md b/backend/app/app/tool_constants/public_demo_data/sql_tool.md new file mode 100644 index 00000000..05099476 --- /dev/null +++ b/backend/app/app/tool_constants/public_demo_data/sql_tool.md @@ -0,0 +1,30 @@ +# SQL tool guide +## How it works +The SQL tool currently consists of the following steps: +1) `_alist_sql_tables`: Find the tables relevant to the user's query and filter the database for only those tables +2) `_aquery_with_schemas`: Writes an SQL query with a prompt summarizing the schema of the selected tables and the user question +3) `_avalidate_response`: Validate the response from the executing the SQL query + a) `_parse_query`: Parse the SQL query from the response and remove extra characters + b) `run_no_str`: Execute SQL query against configured database, checks if results are returned + c) LLM validates that the SQL query answers the question the user asked +4) `_aimprove_query`: If the SQL query does not answer the question sufficiently, prompt the LLM to improve it +5) Return the SQL query and the results + +To add your own database, you can add your sql script in `scripts`, and modify the sql scripts in the docker-compose for `db_sql_tool` to create your database upon starting the docker. + +## Prompt engineering tips + +- Always include examples for important steps that are tailored to your database +- Where you observe frequent errors (in any of the steps), add specific examples of how it should be done correctly, e.g. "In WHERE clauses use substring comparison to account for unknown string formulations (e.g. inhibitor -> LIKE '%inhibitor%')" + +`system_context`: +- Mention the role of the LLM: "You are an expert in ... database, your goal is to ..." +- Specify the required output format, e.g. markdown code block +- Specify the SQL dialect (e.g. PostgreSQL, Snowflake) +- For safety, instruct it to not use any DML statements +- Instruct it to only use field and table names from the provided database schemas (to reduce hallucinations) + + +`prompt_inputs`: +- Always use 'few-shot learning': give an example of a typical user query and a correct SQL query +- In `table_definitions`, give a description of each table and describe what information is exactly in this table. This will give better results in the table selection step diff --git a/backend/app/app/tool_constants/public_demo_data/summarizer_tool.md b/backend/app/app/tool_constants/public_demo_data/summarizer_tool.md new file mode 100644 index 00000000..00d7bdd4 --- /dev/null +++ b/backend/app/app/tool_constants/public_demo_data/summarizer_tool.md @@ -0,0 +1 @@ +WIP diff --git a/backend/app/app/tool_constants/public_demo_data/visualizer_tool.md b/backend/app/app/tool_constants/public_demo_data/visualizer_tool.md new file mode 100644 index 00000000..00d7bdd4 --- /dev/null +++ b/backend/app/app/tool_constants/public_demo_data/visualizer_tool.md @@ -0,0 +1 @@ +WIP diff --git a/backend/app/app/utils/__init__.py b/backend/app/app/utils/__init__.py new file mode 100644 index 00000000..c5e98092 --- /dev/null +++ b/backend/app/app/utils/__init__.py @@ -0,0 +1,4 @@ +# -*- coding: utf-8 -*- +from .uuid6 import UUID6 +from .uuid7 import UUID7, uuid7 +from .uuid_ import UUID_ diff --git a/backend/app/app/utils/config.py b/backend/app/app/utils/config.py new file mode 100644 index 00000000..e6af2db8 --- /dev/null +++ b/backend/app/app/utils/config.py @@ -0,0 +1,108 @@ +# -*- coding: utf-8 -*- +"""Config manager.""" + +import logging +import os +import re +from pathlib import Path + +from box import Box + +from app.utils.config_utils import read_config +from app.utils.custom_yaml_loader import CustomYamlLoader + +logger = logging.getLogger(__name__) +logging.basicConfig(level=logging.INFO) + + +class Config: + """App config.""" + + def __init__( + self, + config_path: Path, + ): + self._config_path = config_path + + def read( + self, + resolve: bool = True, + ) -> Box: + """Reads main config file.""" + if not ( + os.path.isfile(self._config_path) + and os.access( + self._config_path, + os.R_OK, + ) + ): + raise FileNotFoundError(self._config_path) + config = read_config( + self._config_path, + CustomYamlLoader, + ) + if resolve: + config = self.resolve(config) + return config + + @classmethod + def resolve( + cls, + config: Box, + master: Box | None = None, + ) -> Box: + """Resolve the config file.""" + master = master or config + for ( + k, + v, + ) in config.items(): + if isinstance( + v, + dict, + ): + config[k] = cls.resolve( + Box(v), + master=master, + ) + if ( + isinstance( + v, + str, + ) + and "(!" in v + ): + regexp = r"\(!(.*?)\)" + config[k] = re.sub( + regexp, + lambda m: master.get(m.group(1)), + v, + ) + if isinstance( + v, + list, + ): + for ( + i, + el, + ) in enumerate(v): + if isinstance( + el, + str, + ): + if "(!" in el: + regexp = r"\(!(.*?)\)" + config[k][i] = re.sub( + regexp, + lambda m: master.get(m.group(1)), + el, + ) + elif isinstance( + el, + dict, + ): + config[k][i] = cls.resolve( + Box(el), + master=master, + ) + return config diff --git a/backend/app/app/utils/config_loader.py b/backend/app/app/utils/config_loader.py new file mode 100644 index 00000000..b4b9d9bb --- /dev/null +++ b/backend/app/app/utils/config_loader.py @@ -0,0 +1,79 @@ +# -*- coding: utf-8 -*- +import logging +from pathlib import Path +from typing import Any + +from app.core.config import settings, yaml_configs +from app.schemas.agent_schema import ActionPlan, ActionPlans, AgentAndToolsConfig, AgentConfig +from app.schemas.ingestion_schema import IngestionPipelineConfigs +from app.schemas.tool_schema import PromptInput, RetrievalToolConfig, SqlToolConfig, ToolConfig, ToolsLibrary +from app.utils.config import Config + +logger = logging.getLogger(__name__) + + +def get_tool_config( + tool_name: str, + config_values: dict[ + str, + Any, + ], +) -> ToolConfig: + """Get a tool config from a tool name and config values.""" + config_values["prompt_inputs"] = [PromptInput(**item) for item in config_values.get("prompt_inputs", [])] + match tool_name: + case "sql_tool": + return SqlToolConfig(**config_values) + case "pdf_tool" | "code_search_tool": + return RetrievalToolConfig(**config_values) + case _: + return ToolConfig(**config_values) + + +def load_ingestion_configs() -> IngestionPipelineConfigs: + logger.info("Loading ingestion config from yaml file...") + ingestion_config = Config(Path(settings.PDF_TOOL_EXTRACTION_CONFIG_PATH)).read() + return IngestionPipelineConfigs(**ingestion_config) + + +def get_ingestion_configs() -> IngestionPipelineConfigs: + ingestion_config = yaml_configs.get("ingestion_config", None) + if ingestion_config is None: + ingestion_config = load_ingestion_configs() + yaml_configs["ingestion_config"] = ingestion_config + return ingestion_config + + +def load_agent_config() -> AgentConfig: + """Get the agent config.""" + logger.info("Loading agent config from yaml file...") + agent_config = Config(Path(settings.AGENT_CONFIG_PATH)).read() + agent_config.action_plans = ActionPlans( + action_plans={k: ActionPlan(**v) for k, v in agent_config.action_plans.items()} + ) + agent_config.tools_library = ToolsLibrary( + library={ + k: get_tool_config( + k, + v, + ) + for k, v in agent_config.tools_library.library.items() + } + ) + agent_config.common = AgentAndToolsConfig(**agent_config.common) + return AgentConfig(**agent_config) + + +def load_agent_config_override(partial_config: dict[str, Any]) -> AgentConfig: + """Get the agent config and overwrite some values.""" + agent_config = get_agent_config() + agent_config = agent_config.copy(update=partial_config) + return agent_config + + +def get_agent_config() -> AgentConfig: + agent_config = yaml_configs.get("agent_config", None) + if agent_config is None: + agent_config = load_agent_config() + yaml_configs["agent_config"] = agent_config + return agent_config diff --git a/backend/app/app/utils/config_utils.py b/backend/app/app/utils/config_utils.py new file mode 100644 index 00000000..34237d18 --- /dev/null +++ b/backend/app/app/utils/config_utils.py @@ -0,0 +1,98 @@ +# -*- coding: utf-8 -*- +import getpass +import logging +import os +from pathlib import Path +from typing import Optional, Type + +import yaml +from box import Box + +logger = logging.getLogger(__name__) + + +def read_config( + filename: Path, + loader: Type[yaml.FullLoader], +) -> Box: + config = _read_config( + filename, + loader=loader, + ) + _overwrite_config_with_user_specific_file( + config, + filename=filename, + loader=loader, + ) + return config + + +def _overwrite_config_with_user_specific_file( + config: Box, + filename: Path, + loader: Type[yaml.FullLoader], +) -> None: + """Overwrite the config files with user specific files.""" + user_filename = _user_specific_file(filename) + if user_filename is not None: + logger.info(f"{filename} overwritten by {user_filename}") + user_config: Box = _read_config( + user_filename, + loader=loader, + ) + config.merge_update(user_config) + + +def _user_specific_file( + file_path: Path, +) -> Optional[Path]: + """ + Find user specific files for a filename. + + E.g. user_specific_file(config.yml) = config.$USER.yml if the file + exists, else returns None + """ + username = ( + getpass.getuser() + .lower() + .replace( + " ", + "_", + ) + ) + user_filename = Path(file_path).with_suffix(f".{username}{file_path.suffix}") + if user_filename.is_file() and os.access( + user_filename, + os.R_OK, + ): + return user_filename + return None + + +def _read_config( + file_path: Path, + loader: Type[yaml.FullLoader], +) -> Box: + """Read any yaml file as a Box object.""" + + if file_path.is_file() and os.access( + file_path, + os.R_OK, + ): + with open( + file_path, + "r", + encoding="utf-8", + ) as f: + try: + config_dict = yaml.load( + f, + Loader=loader, + ) + except yaml.YAMLError as exc: + print(exc) + return Box( + config_dict, + box_dots=True, + ) + raise FileNotFoundError(file_path) diff --git a/backend/app/app/utils/custom_yaml_loader.py b/backend/app/app/utils/custom_yaml_loader.py new file mode 100644 index 00000000..8dd15c40 --- /dev/null +++ b/backend/app/app/utils/custom_yaml_loader.py @@ -0,0 +1,78 @@ +# -*- coding: utf-8 -*- +import logging +import os +import re +from pathlib import Path +from typing import TextIO + +import yaml +from box import Box + +from app.utils.config_utils import read_config + +logger = logging.getLogger(__name__) + + +# pylint: disable=too-many-ancestors +class CustomYamlLoader(yaml.FullLoader): + """ + Add a custom constructor "!include" to the YAML loader. + + "!include" allows to read parameters in another YAML file as if it was + the main one. + Examples: + To read the parameters listed in credentials.yml and assign them to + credentials in logging.yml: + ``credentials: !include credentials.yml`` + To call: config.credentials + """ + + def __init__( + self, + stream: TextIO, + ) -> None: + self._root = Path(stream.name).parents[0] + super().__init__(stream) + self.add_constructors_and_resolvers() + + def include( + self, + node: yaml.nodes.ScalarNode, + ) -> Box: + """Read yaml files as Box objects and overwrite user specific files + Example: !include model.yml, will be overwritten by model.$USER.yml + """ + filename = self._root / str(self.construct_scalar(node)) + return read_config( + filename, + loader=CustomYamlLoader, + ) + + @classmethod + def add_constructors_and_resolvers(cls) -> None: + """Add custom constructors and resolvers to the loader.""" + cls.add_constructor( + "!include", + cls.include, + ) + # allow to use ${ENV_VARIABLE} to use environment variable in YAML read + path_matcher = re.compile(r".*\$\{([^}^{]+)}.*") + cls.add_implicit_resolver( + "!path", + path_matcher, + None, + ) + cls.add_constructor( + "!path", + _path_constructor, + ) + + +def _path_constructor( + _loader: yaml.FullLoader, + node: yaml.nodes.ScalarNode, +) -> str: + rtn = os.path.expandvars(node.value) + if rtn == node.value: + raise ValueError(f"OS key {node.value} was expected, but not set.") + return rtn diff --git a/backend/app/app/utils/exceptions/common_exceptions.py b/backend/app/app/utils/exceptions/common_exceptions.py new file mode 100644 index 00000000..bc557962 --- /dev/null +++ b/backend/app/app/utils/exceptions/common_exceptions.py @@ -0,0 +1,13 @@ +# -*- coding: utf-8 -*- +from typing import Any, Dict, Optional + + +class AgentCancelledException(Exception): + def __init__( + self, + detail: Optional[str] = None, + headers: Optional[Dict[str, Any]] = None, + ) -> None: + super().__init__(detail) + self.detail = detail + self.headers = headers diff --git a/backend/app/app/utils/fastapi_globals.py b/backend/app/app/utils/fastapi_globals.py new file mode 100644 index 00000000..06ed100f --- /dev/null +++ b/backend/app/app/utils/fastapi_globals.py @@ -0,0 +1,192 @@ +# -*- coding: utf-8 -*- +""" +This allows to use global variables inside the FastAPI application using async mode. + +# Usage +Just import `g` and then access (set/get) attributes of it: +```python +from your_project.globals import g +g.foo = "foo" +# In some other code +assert g.foo == "foo" +``` +Best way to utilize the global `g` in your code is to set the desired +value in a FastAPI dependency, like so: +```python +async def set_global_foo() -> None: + g.foo = "foo" +@app.get("/test/", dependencies=[Depends(set_global_foo)]) +async def test(): + assert g.foo == "foo" +``` +# Setup +Add the `GlobalsMiddleware` to your app: +```python +app = fastapi.FastAPI( + title="Your app API", +) +app.add_middleware(GlobalsMiddleware) # <-- This line is necessary +``` +Then just use it. ;-) +# Default values +You may use `g.set_default("name", some_value)` to set a default value +for a global variable. This default value will then be used instead of `None` +when the variable is accessed before it was set. +Note that default values should only be set at startup time, never +inside dependencies or similar. Otherwise you may run into the issue that +the value was already used any thus have a value of `None` set already, which +would result in the default value not being used. + +Reference: https://gist.github.com/ddanier/ead419826ac6c3d75c96f9d89bea9bd0 +""" +from collections.abc import Awaitable, Callable +from contextvars import ContextVar, copy_context +from typing import Any + +from fastapi import Request, Response +from starlette.middleware.base import BaseHTTPMiddleware, RequestResponseEndpoint +from starlette.types import ASGIApp + + +class Globals: + """Globals context.""" + + __slots__ = ( + "_vars", + "_defaults", + ) + + _vars: dict[ + str, + ContextVar, + ] + _defaults: dict[ + str, + Any, + ] + + def __init__( + self, + ) -> None: + object.__setattr__( + self, + "_vars", + {}, + ) + object.__setattr__( + self, + "_defaults", + {}, + ) + + def cleanup( + self, + ) -> None: + """Clear all variables and free memory.""" + + self._vars.clear() + self._defaults.clear() + del self._vars + del self._defaults + + def set_default( + self, + name: str, + default: Any, + ) -> None: + """Set a default value for a variable.""" + + # Ignore if default is already set and is the same value + if name in self._defaults and default is self._defaults[name]: + return + + # Ensure we don't have a value set already - the default will have + # no effect then + if name in self._vars: + raise RuntimeError( + f"Cannot set default as variable {name} was already set", + ) + + # Set the default already! + self._defaults[name] = default + + def _get_default_value( + self, + name: str, + ) -> Any: + """Get the default value for a variable.""" + + default = self._defaults.get( + name, + None, + ) + + return default + + def _ensure_var( + self, + name: str, + ) -> None: + """Ensure a ContextVar exists for a variable.""" + if name not in self._vars: + default = self._get_default_value(name) + self._vars[name] = ContextVar( + f"globals:{name}", + default=default, + ) + + def __getattr__( + self, + name: str, + ) -> Any: + """Get the value of a variable.""" + + self._ensure_var(name) + return self._vars[name].get() + + def __setattr__( + self, + name: str, + value: Any, + ) -> None: + """Set the value of a variable.""" + + self._ensure_var(name) + self._vars[name].set(value) + + +async def globals_middleware_dispatch( + request: Request, + call_next: Callable, +) -> Response: + """Dispatch the request in a new context to allow globals to be used.""" + + ctx = copy_context() + + def _call_next() -> Awaitable[Response]: + return call_next(request) + + return await ctx.run(_call_next) + + +class GlobalsMiddleware(BaseHTTPMiddleware): # noqa + """Middleware to setup the globals context using globals_middleware_dispatch().""" + + def __init__( + self, + app: ASGIApp, + ) -> None: + super().__init__( + app, + globals_middleware_dispatch, + ) + + async def dispatch( + self, + request: Request, + call_next: RequestResponseEndpoint, + ) -> Response: + return await call_next(request) + + +g = Globals() diff --git a/backend/app/app/utils/llm.py b/backend/app/app/utils/llm.py new file mode 100644 index 00000000..c36426f0 --- /dev/null +++ b/backend/app/app/utils/llm.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- +import tiktoken + + +def get_token_length(string: str, model: str = "gpt-4") -> int: + """Get the token length of a string.""" + enc = tiktoken.encoding_for_model(model) + encoded = enc.encode(string) + return len(encoded) + + +def truncate_to_token_length(string: str, max_length: int, model: str = "gpt-4") -> str: + print("****") + print("FUNCTION RUN STARTED") + print(f"TYPE: {type(string)}") + enc = tiktoken.encoding_for_model(model) + print("ENCODING OBJECT SUCCESSFUL") + truncated = enc.encode(string)[:max_length] + print("FULL ENCODING + TRUNCATION SUCCESSFUL") + print(type(truncated)) + return enc.decode(truncated) diff --git a/backend/app/app/utils/minio_client.py b/backend/app/app/utils/minio_client.py new file mode 100644 index 00000000..957e5ae1 --- /dev/null +++ b/backend/app/app/utils/minio_client.py @@ -0,0 +1,89 @@ +# -*- coding: utf-8 -*- +# https://github.com/Longdh57/fastapi-minio + +from datetime import timedelta +from typing import BinaryIO + +from minio import Minio +from pydantic import BaseModel + +from app.utils import uuid7 + + +class IMinioResponse(BaseModel): + bucket_name: str + file_name: str + url: str + + +class MinioClient: + """Minio client.""" + + def __init__( + self, + minio_url: str, + access_key: str, + secret_key: str, + bucket_name: str, + ): + self.minio_url = minio_url + self.access_key = access_key + self.secret_key = secret_key + self.bucket_name = bucket_name + self.client = Minio( + self.minio_url, + access_key=self.access_key, + secret_key=self.secret_key, + secure=False, + ) + self.make_bucket() + + def make_bucket( + self, + ) -> str: + if not self.client.bucket_exists(self.bucket_name): + self.client.make_bucket(self.bucket_name) + return self.bucket_name + + def presigned_get_object( + self, + bucket_name: str, + object_name: str, + ) -> str: + # Request URL expired after 7 days + url = self.client.presigned_get_object( + bucket_name=bucket_name, + object_name=object_name, + expires=timedelta(days=7), + ) + return url + + def put_object( + self, + file_data: BinaryIO, + file_name: str, + content_type: str, + ) -> IMinioResponse: + """Put an object in the bucket.""" + try: + object_name = f"{uuid7()}{file_name}" + self.client.put_object( + bucket_name=self.bucket_name, + object_name=object_name, + data=file_data, + content_type=content_type, + length=-1, + part_size=10 * 1024 * 1024, + ) + url = self.presigned_get_object( + bucket_name=self.bucket_name, + object_name=object_name, + ) + data_file = IMinioResponse( + bucket_name=self.bucket_name, + file_name=object_name, + url=url, + ) + return data_file + except Exception as e: + raise e diff --git a/backend/app/app/utils/sql.py b/backend/app/app/utils/sql.py new file mode 100644 index 00000000..92cd1a08 --- /dev/null +++ b/backend/app/app/utils/sql.py @@ -0,0 +1,44 @@ +# -*- coding: utf-8 -*- +import re + + +def is_sql_query_safe(sql_string: str) -> bool: + """ + Check if the given SQL string contains any DML or DDL statements. + + Only allow SELECT and WITH statements. + """ + # List of forbidden SQL keywords (DML and DDL statements) + forbidden_keywords = [ + "INSERT", + "UPDATE", + "DELETE", + "REPLACE", + "CREATE", + "ALTER", + "DROP", + "TRUNCATE", + "GRANT", + "REVOKE", + ] + + # Remove comments from the SQL string + sql_string = re.sub( + r"(--[^\n]*|/\*.*?\*/)", + "", + sql_string, + flags=re.MULTILINE | re.DOTALL, + ) + + # Extract all SQL keywords from the string + keywords = re.findall( + r"\b[A-Z]+\b", + sql_string, + ) + + # Check if any forbidden keyword is present in the list of extracted keywords + for keyword in forbidden_keywords: + if keyword in keywords: + return False + + return True diff --git a/backend/app/app/utils/streaming/StreamingJsonListResponse.py b/backend/app/app/utils/streaming/StreamingJsonListResponse.py new file mode 100644 index 00000000..870884cd --- /dev/null +++ b/backend/app/app/utils/streaming/StreamingJsonListResponse.py @@ -0,0 +1,84 @@ +# -*- coding: utf-8 -*- +import json +from typing import Any, AsyncIterable, Iterable, Mapping, Optional + +from fastapi.encoders import jsonable_encoder +from starlette.background import BackgroundTask +from starlette.responses import StreamingResponse + + +async def async_enumerate( + async_sequence: AsyncIterable, + start: int = 0, +) -> AsyncIterable[tuple[int, Any]]: + """ + Asynchronously enumerate an async iterator from a given start value. + + See https://stackoverflow.com/a/55930068/9639441 + """ + idx = start + async for element in async_sequence: + yield idx, element + idx += 1 + + +class StreamingJsonListResponse(StreamingResponse): + """ + Converts a pydantic model generator into a streaming HTTP Response that streams a + JSON list, one element at a time. + + See https://github.com/tiangolo/fastapi/issues/1978 + """ + + def __init__( + self, + content_generator: AsyncIterable | Iterable, + status_code: int = 200, + headers: Optional[ + Mapping[ + str, + str, + ] + ] = None, + media_type: Optional[str] = None, + background: Optional[BackgroundTask] = None, + ) -> None: + if isinstance( + content_generator, + AsyncIterable, + ): + body_iterator = self._encoded_async_generator(content_generator) + else: + body_iterator = self._encoded_generator(content_generator) + super().__init__( + content=body_iterator, + status_code=status_code, + headers=headers, + media_type=media_type, + background=background, + ) + + @staticmethod + async def _encoded_async_generator( + async_generator: AsyncIterable, + ) -> AsyncIterable[str]: + """Converts an asynchronous pydantic model generator into a streaming JSON + list.""" + async for idx, item in async_enumerate(async_generator): + if idx > 0: + yield "\n" + yield json.dumps(jsonable_encoder(item.dict())) + + @staticmethod + async def _encoded_generator( + generator: Iterable, + ) -> AsyncIterable[str]: + """Converts a synchronous pydantic model generator into a streaming JSON + list.""" + for ( + idx, + item, + ) in enumerate(generator): + if idx > 0: + yield "\n" + yield json.dumps(jsonable_encoder(item.dict())) diff --git a/backend/app/app/utils/streaming/__init__.py b/backend/app/app/utils/streaming/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/backend/app/app/utils/streaming/callbacks/__init__.py b/backend/app/app/utils/streaming/callbacks/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/backend/app/app/utils/streaming/callbacks/stream.py b/backend/app/app/utils/streaming/callbacks/stream.py new file mode 100644 index 00000000..c62c6b05 --- /dev/null +++ b/backend/app/app/utils/streaming/callbacks/stream.py @@ -0,0 +1,302 @@ +# -*- coding: utf-8 -*- +from __future__ import annotations + +import asyncio +from datetime import datetime +from typing import Any, AsyncIterator, Dict, List, Literal, Optional, Union, cast +from uuid import UUID + +from langchain.callbacks.base import AsyncCallbackHandler +from langchain.globals import get_llm_cache +from langchain.schema import AgentFinish, LLMResult +from langchain.schema.messages import BaseMessage + +from app.schemas.streaming_schema import StreamingData, StreamingDataTypeEnum, StreamingSignalsEnum +from app.utils.fastapi_globals import g + + +# pylint: disable=too-many-ancestors +class AsyncIteratorCallbackHandler(AsyncCallbackHandler): + """ + Callback handler that returns an async iterator. + + This handler queues streaming data from various callbacks and allows for + asynchronous iteration over received data. + """ + + queue: asyncio.Queue[StreamingData] + done: asyncio.Event + run_id_cached: dict[str, bool] = {} + + @property + def always_verbose( + self, + ) -> bool: + return True + + @property + def llm_cache_enabled(self) -> bool: + """Determine if LLM caching is enabled.""" + llm_cache = get_llm_cache() + return llm_cache is not None + + def __init__( + self, + ) -> None: + """ + queue (asyncio.Queue): A queue to hold streaming data until the agent is done. + + done (asyncio.Event): An event that signals the completion of data streaming. + """ + self.queue = asyncio.Queue() + self.done = asyncio.Event() + query_context = g.query_context or {} + self.queue.put_nowait( + StreamingData( + data=StreamingSignalsEnum.START.value, + data_type=StreamingDataTypeEnum.SIGNAL, + metadata={**query_context}, + ) + ) + + async def on_llm_start(self, serialized: Dict[str, Any], prompts: List[str], **kwargs: Any) -> None: + if self.llm_cache_enabled: + self.run_id_cached[str(kwargs.get("run_id"))] = True + + async def on_llm_new_token( + self, + token: str, + **kwargs: Any, + ) -> None: + """ + Callback for when a new token is generated. + + The token along with metadata is immediately queued for streaming + """ + if self.llm_cache_enabled and self.run_id_cached[str(kwargs.get("run_id"))]: + self.run_id_cached[str(kwargs.get("run_id"))] = False + + query_context = g.query_context or {} + self.queue.put_nowait( + StreamingData( + data=token, + data_type=StreamingDataTypeEnum.LLM, + metadata={**kwargs, **query_context}, + ) + ) + + async def on_llm_end( + self, + response: LLMResult, + **kwargs: Any, + ) -> None: + """ + Callback to signal the end of language model streaming. + + An 'llm_end' signal is queued along with metadata. + """ + query_context = g.query_context or {} + if self.llm_cache_enabled and self.run_id_cached[str(kwargs.get("run_id"))]: + for generation in response.generations: + for token in generation: + self.queue.put_nowait( + StreamingData( + data=token.text, + data_type=StreamingDataTypeEnum.LLM, + metadata={**kwargs, **query_context}, + ) + ) + del self.run_id_cached[str(kwargs.get("run_id"))] + + self.queue.put_nowait( + StreamingData( + data=StreamingSignalsEnum.LLM_END.value, + data_type=StreamingDataTypeEnum.SIGNAL, + metadata={**kwargs, **query_context}, + ) + ) + + async def on_llm_error( + self, + error: BaseException, + *, + run_id: Optional[UUID] = None, + parent_run_id: Optional[UUID] = None, + tags: Optional[List[str]] = None, + **kwargs: Any, + ) -> None: + """ + Callback for when an error occurs during streaming. + + The error is queued for streaming and done flag is set to signal completion. + """ + self.queue.put_nowait( + StreamingData( + data=repr(error), + data_type=StreamingDataTypeEnum.LLM, + metadata={**kwargs, **(g.query_context or {})}, + ) + ) + await asyncio.sleep(1) + self.done.set() + + async def on_tool_start( + self, + serialized: Dict[ + str, + Any, + ], + input_str: str, + **kwargs: Any, + ) -> None: + """Run when tool starts running.""" + kwargs["tool"] = serialized["name"] + kwargs["step"] = 0 + kwargs["time"] = datetime.now() + self.queue.put_nowait( + StreamingData( + data=serialized["name"], + data_type=StreamingDataTypeEnum.ACTION, + metadata={**kwargs, **(g.query_context or {})}, + ) + ) + + async def on_tool_end( + self, + output: str, + **kwargs: Any, + ) -> None: + """Run when tool ends running.""" + kwargs["tool"] = kwargs["name"] + self.queue.put_nowait( + StreamingData( + data=StreamingSignalsEnum.TOOL_END.value, + data_type=StreamingDataTypeEnum.SIGNAL, + metadata={**kwargs, **(g.query_context or {})}, + ) + ) + + async def on_tool_error( + self, + error: BaseException, + *, + run_id: UUID, + parent_run_id: Optional[UUID] = None, + tags: Optional[List[str]] = None, + **kwargs: Any, + ) -> Any: + """Run when tool errors.""" + kwargs["step"] = 1 + kwargs |= { + "run_id": run_id, + "parent_run_id": parent_run_id, + "tags": tags, + "error": repr(error), + } + self.queue.put_nowait( + StreamingData( + data="error", + data_type=StreamingDataTypeEnum.ACTION, + metadata={**kwargs, **(g.query_context or {})}, + ) + ) + + async def on_text( + self, + text: str, + **kwargs: Any, + ) -> None: + """Run on arbitrary text.""" + data_type = kwargs.get( + "data_type", + None, + ) + if data_type is not None: + if data_type == StreamingDataTypeEnum.ACTION: + text = text.upper() + self.queue.put_nowait( + StreamingData( + data=text, + data_type=data_type, + metadata={**kwargs, **(g.query_context or {})}, + ) + ) + + async def on_agent_finish( + self, + finish: AgentFinish, + **kwargs: Any, + ) -> None: + """Run on agent end.""" + self.queue.put_nowait( + StreamingData( + data=StreamingSignalsEnum.END.value, + data_type=StreamingDataTypeEnum.SIGNAL, + metadata={**kwargs, **(g.query_context or {})}, + ) + ) + await asyncio.sleep(0.1) + self.done.set() + + async def aiter( + self, + ) -> AsyncIterator[StreamingData]: + """Allow streams to be stopped (e.g. on errors or cancelation) via done flag.""" + while not self.queue.empty() or not self.done.is_set(): + # Wait for the next token in the queue, + # but stop waiting if the done event is set + ( + done, + other, + ) = await asyncio.wait( + [ + # NOTE: If you add other tasks here, update the code below, + # which assumes each set has exactly one task each + asyncio.ensure_future(self.queue.get()), + asyncio.ensure_future(self.done.wait()), + ], + return_when=asyncio.FIRST_COMPLETED, + ) + + # Cancel the other task + while len(other) > 0: + other.pop().cancel() + + while len(done) > 0: + # Extract the value of the first completed task + token_or_done = cast( + Union[ + StreamingData, + Literal[True], + ], + done.pop().result(), + ) + + # If the extracted value is the boolean True, the done event was set + if token_or_done is True: + break + + # Otherwise, the extracted value is a token, which we yield + yield token_or_done + + async def on_chat_model_start( + self, + serialized: Dict[ + str, + Any, + ], + messages: List[List[BaseMessage]], + *, + run_id: UUID, + parent_run_id: Optional[UUID] = None, + tags: Optional[List[str]] = None, + metadata: Optional[ + Dict[ + str, + Any, + ] + ] = None, + **kwargs: Any, + ) -> Any: + """Run when a chat model starts running.""" + raise NotImplementedError("AsyncIteratorCallbackHandler does not implement on_chat_model_start") diff --git a/backend/app/app/utils/streaming/helpers.py b/backend/app/app/utils/streaming/helpers.py new file mode 100644 index 00000000..a48a7438 --- /dev/null +++ b/backend/app/app/utils/streaming/helpers.py @@ -0,0 +1,70 @@ +# -*- coding: utf-8 -*- +import logging +from typing import Any, AsyncGenerator, Awaitable + +from app.schemas.streaming_schema import StreamingData +from app.utils.exceptions.common_exceptions import AgentCancelledException +from app.utils.streaming.callbacks.stream import AsyncIteratorCallbackHandler + +logger = logging.getLogger(__name__) + + +class StreamHandlerNoNewline(logging.StreamHandler): + """Stream handler that does not add a newline.""" + + def emit( + self, + record: logging.LogRecord, + ) -> None: + msg = self.format(record) + self.stream.write(msg) + self.flush() + + +def setup_stream_logger() -> logging.Logger: + """Setup a logger for the stream.""" + logger_ = logging.getLogger("stream_logger") + logger_.setLevel(logging.INFO) + + # Add custom stream handler to the logger + handler = StreamHandlerNoNewline() + handler.setFormatter(logging.Formatter("%(message)s")) # Remove the default formatting + + logger_.addHandler(handler) + logger_.propagate = False # Prevent duplicate log messages + + return logger_ + + +stream_logger = setup_stream_logger() + + +async def event_generator( + acallback: AsyncIteratorCallbackHandler, +) -> AsyncGenerator[StreamingData, Any]: + """Generate events from the callback handler.""" + ait = acallback.aiter() + + logger.info("Streaming response...") + async for response in ait: + stream_logger.debug(response) + yield response + stream_logger.info("\n") + + +async def handle_exceptions( + awaitable: Awaitable[Any], + stream_handler: AsyncIteratorCallbackHandler, +) -> None: + """Handle exceptions from awaitables.""" + try: + return await awaitable + except TimeoutError as e: + logger.exception(repr(e)) + await stream_handler.on_llm_error(error=Exception("OpenAI API timed out. Please try again.")) + except AgentCancelledException as e: + logger.exception(repr(e)) + await stream_handler.on_llm_error(error=e) + except Exception as e: + logger.exception(e) + await stream_handler.on_llm_error(error=e) diff --git a/backend/app/app/utils/uuid6.py b/backend/app/app/utils/uuid6.py new file mode 100644 index 00000000..23321a78 --- /dev/null +++ b/backend/app/app/utils/uuid6.py @@ -0,0 +1,52 @@ +# -*- coding: utf-8 -*- +""" +UUID draft version objects (universally unique identifiers). This module provides the +class UUID6 for generating version 6 UUIDs as specified in +https://github.com/uuid6/uuid6-ietf-draft. + +Repo: https://github.com/oittaa/uuid6-python +""" + +import secrets +import time +from typing import Optional + +from app.utils.uuid_ import UUID_ + + +class UUID6(UUID_): + """ + UUID version 6 is a field-compatible version of UUIDv1, reordered for improved DB + locality. + + It is expected that UUIDv6 will primarily be used in contexts where there are + existing v1 UUIDs. Systems that do not involve legacy UUIDv1 SHOULD consider using + UUIDv7 instead. If 'clock_seq' is given, it is used as the sequence number; + otherwise a random 14-bit sequence number is chosen. + """ + + _last_v6_timestamp = None + + def __init__( + self, + clock_seq: Optional[int] = None, + ) -> None: + # 0x01b21dd213814000 is the number of 100-ns intervals between the + # UUID epoch 1582-10-15 00:00:00 and the Unix epoch 1970-01-01 00:00:00. + timestamp = time.time_ns() // 100 + 0x01B21DD213814000 + if self._last_v6_timestamp is not None and timestamp <= self._last_v6_timestamp: + timestamp = self._last_v6_timestamp + 1 + self._last_v6_timestamp = timestamp + if clock_seq is None: + clock_seq = secrets.randbits(14) # instead of stable storage + node = secrets.randbits(48) + time_high_and_time_mid = (timestamp >> 12) & 0xFFFFFFFFFFFF + time_low_and_version = timestamp & 0x0FFF + uuid_int = time_high_and_time_mid << 80 + uuid_int |= time_low_and_version << 64 + uuid_int |= (clock_seq & 0x3FFF) << 48 + uuid_int |= node + super().__init__( + int_=uuid_int, + version=6, + ) diff --git a/backend/app/app/utils/uuid7.py b/backend/app/app/utils/uuid7.py new file mode 100644 index 00000000..d6c92f8c --- /dev/null +++ b/backend/app/app/utils/uuid7.py @@ -0,0 +1,55 @@ +# -*- coding: utf-8 -*- +"""UUID version 7 features a time-ordered value field derived from the.""" + +import secrets +import time + +from app.utils.uuid_ import UUID_ + +_last_v7_timestamp = None + + +class UUID7(UUID_): + """ + UUID version 7 features a time-ordered value field derived from the widely + implemented and well known Unix Epoch timestamp source, the number of milliseconds + seconds since midnight 1 Jan 1970 UTC, leap seconds excluded. + + As well as improved entropy characteristics over versions 1 or 6. Implementations + SHOULD utilize UUID version 7 over UUID version 1 and 6 if possible. + """ + + +def uuid7() -> UUID7: + """Requires separate function as UUID is immutable.""" + global _last_v7_timestamp # pylint: disable=global-statement + + nanoseconds = time.time_ns() + if _last_v7_timestamp is not None and nanoseconds <= _last_v7_timestamp: + nanoseconds = _last_v7_timestamp + 1 + _last_v7_timestamp = nanoseconds + ( + timestamp_ms, + timestamp_ns, + ) = divmod( + nanoseconds, + 10**6, + ) + subsec = subsec_encode(timestamp_ns) + subsec_a = subsec >> 8 + subsec_b = subsec & 0xFF + rand = secrets.randbits(54) + uuid_int = (timestamp_ms & 0xFFFFFFFFFFFF) << 80 + uuid_int |= subsec_a << 64 + uuid_int |= subsec_b << 54 + uuid_int |= rand + return UUID7( + int_=uuid_int, + version=7, + ) + + +def subsec_encode( + value: int, +) -> int: + return value * 2**20 // 10**6 diff --git a/backend/app/app/utils/uuid_.py b/backend/app/app/utils/uuid_.py new file mode 100644 index 00000000..e263e141 --- /dev/null +++ b/backend/app/app/utils/uuid_.py @@ -0,0 +1,91 @@ +# -*- coding: utf-8 -*- +r"""UUID draft version objects (universally unique identifiers). +This module provides the functions uuid6() and uuid7() for +generating version 6 and 7 UUIDs as specified in +https://github.com/uuid6/uuid6-ietf-draft. + +Repo: https://github.com/oittaa/uuid6-python +""" + +import uuid +from typing import Optional + + +class UUID_(uuid.UUID): + """UUID draft version objects.""" + + def __init__( + self, + hex_: Optional[str] = None, + bytes_: Optional[bytes] = None, + bytes_le: Optional[bytes] = None, + fields: Optional[ + tuple[ + int, + int, + int, + int, + int, + int, + ] + ] = None, + int_: Optional[int] = None, + version: Optional[int] = None, + *, + is_safe: uuid.SafeUUID = uuid.SafeUUID.unknown, + ) -> None: + if ( + int_ is None + or [ + hex_, + bytes_, + bytes_le, + fields, + ].count(None) + != 4 + ): + super().__init__( + hex=hex_, + bytes=bytes_, + bytes_le=bytes_le, + fields=fields, + int=int_, + version=version, + is_safe=is_safe, + ) + return + if version is not None: + if not 6 <= version <= 7: + raise ValueError("illegal version number") + # Set the variant to RFC 4122. + int_ &= ~(0xC000 << 48) + int_ |= 0x8000 << 48 + # Set the version number. + int_ &= ~(0xF000 << 64) + int_ |= version << 76 + super().__init__( + int=int_, + is_safe=is_safe, + ) + + @property + def subsec( + self, + ) -> int: + return ((self.int >> 64) & 0x0FFF) << 8 | ((self.int >> 54) & 0xFF) + + @property + def time( + self, + ) -> int: + if self.version == 6: + return (self.time_low << 28) | (self.time_mid << 12) | (self.time_hi_version & 0x0FFF) + if self.version == 7: + return (self.int >> 80) * 10**6 + self._subsec_decode(self.subsec) + return super().time + + @staticmethod + def _subsec_decode( + value: int, + ) -> int: + return -(-value * 10**6 // 2**20) diff --git a/backend/app/poetry.lock b/backend/app/poetry.lock new file mode 100644 index 00000000..d7a25b5e --- /dev/null +++ b/backend/app/poetry.lock @@ -0,0 +1,3697 @@ +# This file is automatically @generated by Poetry 1.7.1 and should not be changed by hand. + +[[package]] +name = "aiohttp" +version = "3.9.1" +description = "Async http client/server framework (asyncio)" +optional = false +python-versions = ">=3.8" +files = [ + {file = "aiohttp-3.9.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e1f80197f8b0b846a8d5cf7b7ec6084493950d0882cc5537fb7b96a69e3c8590"}, + {file = "aiohttp-3.9.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c72444d17777865734aa1a4d167794c34b63e5883abb90356a0364a28904e6c0"}, + {file = "aiohttp-3.9.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9b05d5cbe9dafcdc733262c3a99ccf63d2f7ce02543620d2bd8db4d4f7a22f83"}, + {file = "aiohttp-3.9.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c4fa235d534b3547184831c624c0b7c1e262cd1de847d95085ec94c16fddcd5"}, + {file = "aiohttp-3.9.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:289ba9ae8e88d0ba16062ecf02dd730b34186ea3b1e7489046fc338bdc3361c4"}, + {file = "aiohttp-3.9.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bff7e2811814fa2271be95ab6e84c9436d027a0e59665de60edf44e529a42c1f"}, + {file = "aiohttp-3.9.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:81b77f868814346662c96ab36b875d7814ebf82340d3284a31681085c051320f"}, + {file = "aiohttp-3.9.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3b9c7426923bb7bd66d409da46c41e3fb40f5caf679da624439b9eba92043fa6"}, + {file = "aiohttp-3.9.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:8d44e7bf06b0c0a70a20f9100af9fcfd7f6d9d3913e37754c12d424179b4e48f"}, + {file = "aiohttp-3.9.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:22698f01ff5653fe66d16ffb7658f582a0ac084d7da1323e39fd9eab326a1f26"}, + {file = "aiohttp-3.9.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:ca7ca5abfbfe8d39e653870fbe8d7710be7a857f8a8386fc9de1aae2e02ce7e4"}, + {file = "aiohttp-3.9.1-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:8d7f98fde213f74561be1d6d3fa353656197f75d4edfbb3d94c9eb9b0fc47f5d"}, + {file = "aiohttp-3.9.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:5216b6082c624b55cfe79af5d538e499cd5f5b976820eac31951fb4325974501"}, + {file = "aiohttp-3.9.1-cp310-cp310-win32.whl", hash = "sha256:0e7ba7ff228c0d9a2cd66194e90f2bca6e0abca810b786901a569c0de082f489"}, + {file = "aiohttp-3.9.1-cp310-cp310-win_amd64.whl", hash = "sha256:c7e939f1ae428a86e4abbb9a7c4732bf4706048818dfd979e5e2839ce0159f23"}, + {file = "aiohttp-3.9.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:df9cf74b9bc03d586fc53ba470828d7b77ce51b0582d1d0b5b2fb673c0baa32d"}, + {file = "aiohttp-3.9.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ecca113f19d5e74048c001934045a2b9368d77b0b17691d905af18bd1c21275e"}, + {file = "aiohttp-3.9.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8cef8710fb849d97c533f259103f09bac167a008d7131d7b2b0e3a33269185c0"}, + {file = "aiohttp-3.9.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bea94403a21eb94c93386d559bce297381609153e418a3ffc7d6bf772f59cc35"}, + {file = "aiohttp-3.9.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:91c742ca59045dce7ba76cab6e223e41d2c70d79e82c284a96411f8645e2afff"}, + {file = "aiohttp-3.9.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6c93b7c2e52061f0925c3382d5cb8980e40f91c989563d3d32ca280069fd6a87"}, + {file = "aiohttp-3.9.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ee2527134f95e106cc1653e9ac78846f3a2ec1004cf20ef4e02038035a74544d"}, + {file = "aiohttp-3.9.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:11ff168d752cb41e8492817e10fb4f85828f6a0142b9726a30c27c35a1835f01"}, + {file = "aiohttp-3.9.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b8c3a67eb87394386847d188996920f33b01b32155f0a94f36ca0e0c635bf3e3"}, + {file = "aiohttp-3.9.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c7b5d5d64e2a14e35a9240b33b89389e0035e6de8dbb7ffa50d10d8b65c57449"}, + {file = "aiohttp-3.9.1-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:69985d50a2b6f709412d944ffb2e97d0be154ea90600b7a921f95a87d6f108a2"}, + {file = "aiohttp-3.9.1-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:c9110c06eaaac7e1f5562caf481f18ccf8f6fdf4c3323feab28a93d34cc646bd"}, + {file = "aiohttp-3.9.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d737e69d193dac7296365a6dcb73bbbf53bb760ab25a3727716bbd42022e8d7a"}, + {file = "aiohttp-3.9.1-cp311-cp311-win32.whl", hash = "sha256:4ee8caa925aebc1e64e98432d78ea8de67b2272252b0a931d2ac3bd876ad5544"}, + {file = "aiohttp-3.9.1-cp311-cp311-win_amd64.whl", hash = "sha256:a34086c5cc285be878622e0a6ab897a986a6e8bf5b67ecb377015f06ed316587"}, + {file = "aiohttp-3.9.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:f800164276eec54e0af5c99feb9494c295118fc10a11b997bbb1348ba1a52065"}, + {file = "aiohttp-3.9.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:500f1c59906cd142d452074f3811614be04819a38ae2b3239a48b82649c08821"}, + {file = "aiohttp-3.9.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0b0a6a36ed7e164c6df1e18ee47afbd1990ce47cb428739d6c99aaabfaf1b3af"}, + {file = "aiohttp-3.9.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69da0f3ed3496808e8cbc5123a866c41c12c15baaaead96d256477edf168eb57"}, + {file = "aiohttp-3.9.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:176df045597e674fa950bf5ae536be85699e04cea68fa3a616cf75e413737eb5"}, + {file = "aiohttp-3.9.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b796b44111f0cab6bbf66214186e44734b5baab949cb5fb56154142a92989aeb"}, + {file = "aiohttp-3.9.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f27fdaadce22f2ef950fc10dcdf8048407c3b42b73779e48a4e76b3c35bca26c"}, + {file = "aiohttp-3.9.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bcb6532b9814ea7c5a6a3299747c49de30e84472fa72821b07f5a9818bce0f66"}, + {file = "aiohttp-3.9.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:54631fb69a6e44b2ba522f7c22a6fb2667a02fd97d636048478db2fd8c4e98fe"}, + {file = "aiohttp-3.9.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:4b4c452d0190c5a820d3f5c0f3cd8a28ace48c54053e24da9d6041bf81113183"}, + {file = "aiohttp-3.9.1-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:cae4c0c2ca800c793cae07ef3d40794625471040a87e1ba392039639ad61ab5b"}, + {file = "aiohttp-3.9.1-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:565760d6812b8d78d416c3c7cfdf5362fbe0d0d25b82fed75d0d29e18d7fc30f"}, + {file = "aiohttp-3.9.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:54311eb54f3a0c45efb9ed0d0a8f43d1bc6060d773f6973efd90037a51cd0a3f"}, + {file = "aiohttp-3.9.1-cp312-cp312-win32.whl", hash = "sha256:85c3e3c9cb1d480e0b9a64c658cd66b3cfb8e721636ab8b0e746e2d79a7a9eed"}, + {file = "aiohttp-3.9.1-cp312-cp312-win_amd64.whl", hash = "sha256:11cb254e397a82efb1805d12561e80124928e04e9c4483587ce7390b3866d213"}, + {file = "aiohttp-3.9.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:8a22a34bc594d9d24621091d1b91511001a7eea91d6652ea495ce06e27381f70"}, + {file = "aiohttp-3.9.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:598db66eaf2e04aa0c8900a63b0101fdc5e6b8a7ddd805c56d86efb54eb66672"}, + {file = "aiohttp-3.9.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2c9376e2b09895c8ca8b95362283365eb5c03bdc8428ade80a864160605715f1"}, + {file = "aiohttp-3.9.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41473de252e1797c2d2293804e389a6d6986ef37cbb4a25208de537ae32141dd"}, + {file = "aiohttp-3.9.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9c5857612c9813796960c00767645cb5da815af16dafb32d70c72a8390bbf690"}, + {file = "aiohttp-3.9.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ffcd828e37dc219a72c9012ec44ad2e7e3066bec6ff3aaa19e7d435dbf4032ca"}, + {file = "aiohttp-3.9.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:219a16763dc0294842188ac8a12262b5671817042b35d45e44fd0a697d8c8361"}, + {file = "aiohttp-3.9.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f694dc8a6a3112059258a725a4ebe9acac5fe62f11c77ac4dcf896edfa78ca28"}, + {file = "aiohttp-3.9.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:bcc0ea8d5b74a41b621ad4a13d96c36079c81628ccc0b30cfb1603e3dfa3a014"}, + {file = "aiohttp-3.9.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:90ec72d231169b4b8d6085be13023ece8fa9b1bb495e4398d847e25218e0f431"}, + {file = "aiohttp-3.9.1-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:cf2a0ac0615842b849f40c4d7f304986a242f1e68286dbf3bd7a835e4f83acfd"}, + {file = "aiohttp-3.9.1-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:0e49b08eafa4f5707ecfb321ab9592717a319e37938e301d462f79b4e860c32a"}, + {file = "aiohttp-3.9.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2c59e0076ea31c08553e868cec02d22191c086f00b44610f8ab7363a11a5d9d8"}, + {file = "aiohttp-3.9.1-cp38-cp38-win32.whl", hash = "sha256:4831df72b053b1eed31eb00a2e1aff6896fb4485301d4ccb208cac264b648db4"}, + {file = "aiohttp-3.9.1-cp38-cp38-win_amd64.whl", hash = "sha256:3135713c5562731ee18f58d3ad1bf41e1d8883eb68b363f2ffde5b2ea4b84cc7"}, + {file = "aiohttp-3.9.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:cfeadf42840c1e870dc2042a232a8748e75a36b52d78968cda6736de55582766"}, + {file = "aiohttp-3.9.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:70907533db712f7aa791effb38efa96f044ce3d4e850e2d7691abd759f4f0ae0"}, + {file = "aiohttp-3.9.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:cdefe289681507187e375a5064c7599f52c40343a8701761c802c1853a504558"}, + {file = "aiohttp-3.9.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7481f581251bb5558ba9f635db70908819caa221fc79ee52a7f58392778c636"}, + {file = "aiohttp-3.9.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:49f0c1b3c2842556e5de35f122fc0f0b721334ceb6e78c3719693364d4af8499"}, + {file = "aiohttp-3.9.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0d406b01a9f5a7e232d1b0d161b40c05275ffbcbd772dc18c1d5a570961a1ca4"}, + {file = "aiohttp-3.9.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d8e4450e7fe24d86e86b23cc209e0023177b6d59502e33807b732d2deb6975f"}, + {file = "aiohttp-3.9.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3c0266cd6f005e99f3f51e583012de2778e65af6b73860038b968a0a8888487a"}, + {file = "aiohttp-3.9.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ab221850108a4a063c5b8a70f00dd7a1975e5a1713f87f4ab26a46e5feac5a0e"}, + {file = "aiohttp-3.9.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:c88a15f272a0ad3d7773cf3a37cc7b7d077cbfc8e331675cf1346e849d97a4e5"}, + {file = "aiohttp-3.9.1-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:237533179d9747080bcaad4d02083ce295c0d2eab3e9e8ce103411a4312991a0"}, + {file = "aiohttp-3.9.1-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:02ab6006ec3c3463b528374c4cdce86434e7b89ad355e7bf29e2f16b46c7dd6f"}, + {file = "aiohttp-3.9.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:04fa38875e53eb7e354ece1607b1d2fdee2d175ea4e4d745f6ec9f751fe20c7c"}, + {file = "aiohttp-3.9.1-cp39-cp39-win32.whl", hash = "sha256:82eefaf1a996060602f3cc1112d93ba8b201dbf5d8fd9611227de2003dddb3b7"}, + {file = "aiohttp-3.9.1-cp39-cp39-win_amd64.whl", hash = "sha256:9b05d33ff8e6b269e30a7957bd3244ffbce2a7a35a81b81c382629b80af1a8bf"}, + {file = "aiohttp-3.9.1.tar.gz", hash = "sha256:8fc49a87ac269d4529da45871e2ffb6874e87779c3d0e2ccd813c0899221239d"}, +] + +[package.dependencies] +aiosignal = ">=1.1.2" +async-timeout = {version = ">=4.0,<5.0", markers = "python_version < \"3.11\""} +attrs = ">=17.3.0" +frozenlist = ">=1.1.1" +multidict = ">=4.5,<7.0" +yarl = ">=1.0,<2.0" + +[package.extras] +speedups = ["Brotli", "aiodns", "brotlicffi"] + +[[package]] +name = "aiosignal" +version = "1.3.1" +description = "aiosignal: a list of registered asynchronous callbacks" +optional = false +python-versions = ">=3.7" +files = [ + {file = "aiosignal-1.3.1-py3-none-any.whl", hash = "sha256:f8376fb07dd1e86a584e4fcdec80b36b7f81aac666ebc724e2c090300dd83b17"}, + {file = "aiosignal-1.3.1.tar.gz", hash = "sha256:54cd96e15e1649b75d6c87526a6ff0b6c1b0dd3459f43d9ca11d48c339b68cfc"}, +] + +[package.dependencies] +frozenlist = ">=1.1.0" + +[[package]] +name = "alembic" +version = "1.13.1" +description = "A database migration tool for SQLAlchemy." +optional = false +python-versions = ">=3.8" +files = [ + {file = "alembic-1.13.1-py3-none-any.whl", hash = "sha256:2edcc97bed0bd3272611ce3a98d98279e9c209e7186e43e75bbb1b2bdfdbcc43"}, + {file = "alembic-1.13.1.tar.gz", hash = "sha256:4932c8558bf68f2ee92b9bbcb8218671c627064d5b08939437af6d77dc05e595"}, +] + +[package.dependencies] +Mako = "*" +SQLAlchemy = ">=1.3.0" +typing-extensions = ">=4" + +[package.extras] +tz = ["backports.zoneinfo"] + +[[package]] +name = "amqp" +version = "5.2.0" +description = "Low-level AMQP client for Python (fork of amqplib)." +optional = false +python-versions = ">=3.6" +files = [ + {file = "amqp-5.2.0-py3-none-any.whl", hash = "sha256:827cb12fb0baa892aad844fd95258143bce4027fdac4fccddbc43330fd281637"}, + {file = "amqp-5.2.0.tar.gz", hash = "sha256:a1ecff425ad063ad42a486c902807d1482311481c8ad95a72694b2975e75f7fd"}, +] + +[package.dependencies] +vine = ">=5.0.0,<6.0.0" + +[[package]] +name = "annotated-types" +version = "0.6.0" +description = "Reusable constraint types to use with typing.Annotated" +optional = false +python-versions = ">=3.8" +files = [ + {file = "annotated_types-0.6.0-py3-none-any.whl", hash = "sha256:0641064de18ba7a25dee8f96403ebc39113d0cb953a01429249d5c7564666a43"}, + {file = "annotated_types-0.6.0.tar.gz", hash = "sha256:563339e807e53ffd9c267e99fc6d9ea23eb8443c08f112651963e24e22f84a5d"}, +] + +[[package]] +name = "anyio" +version = "3.7.1" +description = "High level compatibility layer for multiple asynchronous event loop implementations" +optional = false +python-versions = ">=3.7" +files = [ + {file = "anyio-3.7.1-py3-none-any.whl", hash = "sha256:91dee416e570e92c64041bd18b900d1d6fa78dff7048769ce5ac5ddad004fbb5"}, + {file = "anyio-3.7.1.tar.gz", hash = "sha256:44a3c9aba0f5defa43261a8b3efb97891f2bd7d804e0e1f56419befa1adfc780"}, +] + +[package.dependencies] +exceptiongroup = {version = "*", markers = "python_version < \"3.11\""} +idna = ">=2.8" +sniffio = ">=1.1" + +[package.extras] +doc = ["Sphinx", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme (>=1.2.2)", "sphinxcontrib-jquery"] +test = ["anyio[trio]", "coverage[toml] (>=4.5)", "hypothesis (>=4.0)", "mock (>=4)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"] +trio = ["trio (<0.22)"] + +[[package]] +name = "argon2-cffi" +version = "23.1.0" +description = "Argon2 for Python" +optional = false +python-versions = ">=3.7" +files = [ + {file = "argon2_cffi-23.1.0-py3-none-any.whl", hash = "sha256:c670642b78ba29641818ab2e68bd4e6a78ba53b7eff7b4c3815ae16abf91c7ea"}, + {file = "argon2_cffi-23.1.0.tar.gz", hash = "sha256:879c3e79a2729ce768ebb7d36d4609e3a78a4ca2ec3a9f12286ca057e3d0db08"}, +] + +[package.dependencies] +argon2-cffi-bindings = "*" + +[package.extras] +dev = ["argon2-cffi[tests,typing]", "tox (>4)"] +docs = ["furo", "myst-parser", "sphinx", "sphinx-copybutton", "sphinx-notfound-page"] +tests = ["hypothesis", "pytest"] +typing = ["mypy"] + +[[package]] +name = "argon2-cffi-bindings" +version = "21.2.0" +description = "Low-level CFFI bindings for Argon2" +optional = false +python-versions = ">=3.6" +files = [ + {file = "argon2-cffi-bindings-21.2.0.tar.gz", hash = "sha256:bb89ceffa6c791807d1305ceb77dbfacc5aa499891d2c55661c6459651fc39e3"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:ccb949252cb2ab3a08c02024acb77cfb179492d5701c7cbdbfd776124d4d2367"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9524464572e12979364b7d600abf96181d3541da11e23ddf565a32e70bd4dc0d"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b746dba803a79238e925d9046a63aa26bf86ab2a2fe74ce6b009a1c3f5c8f2ae"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:58ed19212051f49a523abb1dbe954337dc82d947fb6e5a0da60f7c8471a8476c"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:bd46088725ef7f58b5a1ef7ca06647ebaf0eb4baff7d1d0d177c6cc8744abd86"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_i686.whl", hash = "sha256:8cd69c07dd875537a824deec19f978e0f2078fdda07fd5c42ac29668dda5f40f"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:f1152ac548bd5b8bcecfb0b0371f082037e47128653df2e8ba6e914d384f3c3e"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-win32.whl", hash = "sha256:603ca0aba86b1349b147cab91ae970c63118a0f30444d4bc80355937c950c082"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-win_amd64.whl", hash = "sha256:b2ef1c30440dbbcba7a5dc3e319408b59676e2e039e2ae11a8775ecf482b192f"}, + {file = "argon2_cffi_bindings-21.2.0-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:e415e3f62c8d124ee16018e491a009937f8cf7ebf5eb430ffc5de21b900dad93"}, + {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3e385d1c39c520c08b53d63300c3ecc28622f076f4c2b0e6d7e796e9f6502194"}, + {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2c3e3cc67fdb7d82c4718f19b4e7a87123caf8a93fde7e23cf66ac0337d3cb3f"}, + {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6a22ad9800121b71099d0fb0a65323810a15f2e292f2ba450810a7316e128ee5"}, + {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f9f8b450ed0547e3d473fdc8612083fd08dd2120d6ac8f73828df9b7d45bb351"}, + {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:93f9bf70084f97245ba10ee36575f0c3f1e7d7724d67d8e5b08e61787c320ed7"}, + {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3b9ef65804859d335dc6b31582cad2c5166f0c3e7975f324d9ffaa34ee7e6583"}, + {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d4966ef5848d820776f5f562a7d45fdd70c2f330c961d0d745b784034bd9f48d"}, + {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:20ef543a89dee4db46a1a6e206cd015360e5a75822f76df533845c3cbaf72670"}, + {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ed2937d286e2ad0cc79a7087d3c272832865f779430e0cc2b4f3718d3159b0cb"}, + {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:5e00316dabdaea0b2dd82d141cc66889ced0cdcbfa599e8b471cf22c620c329a"}, +] + +[package.dependencies] +cffi = ">=1.0.1" + +[package.extras] +dev = ["cogapp", "pre-commit", "pytest", "wheel"] +tests = ["pytest"] + +[[package]] +name = "astroid" +version = "3.0.2" +description = "An abstract syntax tree for Python with inference support." +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "astroid-3.0.2-py3-none-any.whl", hash = "sha256:d6e62862355f60e716164082d6b4b041d38e2a8cf1c7cd953ded5108bac8ff5c"}, + {file = "astroid-3.0.2.tar.gz", hash = "sha256:4a61cf0a59097c7bb52689b0fd63717cd2a8a14dc9f1eee97b82d814881c8c91"}, +] + +[package.dependencies] +typing-extensions = {version = ">=4.0.0", markers = "python_version < \"3.11\""} + +[[package]] +name = "async-timeout" +version = "4.0.3" +description = "Timeout context manager for asyncio programs" +optional = false +python-versions = ">=3.7" +files = [ + {file = "async-timeout-4.0.3.tar.gz", hash = "sha256:4640d96be84d82d02ed59ea2b7105a0f7b33abe8703703cd0ab0bf87c427522f"}, + {file = "async_timeout-4.0.3-py3-none-any.whl", hash = "sha256:7405140ff1230c310e51dc27b3145b9092d659ce68ff733fb0cefe3ee42be028"}, +] + +[[package]] +name = "asyncpg" +version = "0.27.0" +description = "An asyncio PostgreSQL driver" +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "asyncpg-0.27.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:fca608d199ffed4903dce1bcd97ad0fe8260f405c1c225bdf0002709132171c2"}, + {file = "asyncpg-0.27.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:20b596d8d074f6f695c13ffb8646d0b6bb1ab570ba7b0cfd349b921ff03cfc1e"}, + {file = "asyncpg-0.27.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7a6206210c869ebd3f4eb9e89bea132aefb56ff3d1b7dd7e26b102b17e27bbb1"}, + {file = "asyncpg-0.27.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a7a94c03386bb95456b12c66026b3a87d1b965f0f1e5733c36e7229f8f137747"}, + {file = "asyncpg-0.27.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:bfc3980b4ba6f97138b04f0d32e8af21d6c9fa1f8e6e140c07d15690a0a99279"}, + {file = "asyncpg-0.27.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:9654085f2b22f66952124de13a8071b54453ff972c25c59b5ce1173a4283ffd9"}, + {file = "asyncpg-0.27.0-cp310-cp310-win32.whl", hash = "sha256:879c29a75969eb2722f94443752f4720d560d1e748474de54ae8dd230bc4956b"}, + {file = "asyncpg-0.27.0-cp310-cp310-win_amd64.whl", hash = "sha256:ab0f21c4818d46a60ca789ebc92327d6d874d3b7ccff3963f7af0a21dc6cff52"}, + {file = "asyncpg-0.27.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:18f77e8e71e826ba2d0c3ba6764930776719ae2b225ca07e014590545928b576"}, + {file = "asyncpg-0.27.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c2232d4625c558f2aa001942cac1d7952aa9f0dbfc212f63bc754277769e1ef2"}, + {file = "asyncpg-0.27.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9a3a4ff43702d39e3c97a8786314123d314e0f0e4dabc8367db5b665c93914de"}, + {file = "asyncpg-0.27.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ccddb9419ab4e1c48742457d0c0362dbdaeb9b28e6875115abfe319b29ee225d"}, + {file = "asyncpg-0.27.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:768e0e7c2898d40b16d4ef7a0b44e8150db3dd8995b4652aa1fe2902e92c7df8"}, + {file = "asyncpg-0.27.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:609054a1f47292a905582a1cfcca51a6f3f30ab9d822448693e66fdddde27920"}, + {file = "asyncpg-0.27.0-cp311-cp311-win32.whl", hash = "sha256:8113e17cfe236dc2277ec844ba9b3d5312f61bd2fdae6d3ed1c1cdd75f6cf2d8"}, + {file = "asyncpg-0.27.0-cp311-cp311-win_amd64.whl", hash = "sha256:bb71211414dd1eeb8d31ec529fe77cff04bf53efc783a5f6f0a32d84923f45cf"}, + {file = "asyncpg-0.27.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4750f5cf49ed48a6e49c6e5aed390eee367694636c2dcfaf4a273ca832c5c43c"}, + {file = "asyncpg-0.27.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:eca01eb112a39d31cc4abb93a5aef2a81514c23f70956729f42fb83b11b3483f"}, + {file = "asyncpg-0.27.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:5710cb0937f696ce303f5eed6d272e3f057339bb4139378ccecafa9ee923a71c"}, + {file = "asyncpg-0.27.0-cp37-cp37m-win_amd64.whl", hash = "sha256:71cca80a056ebe19ec74b7117b09e650990c3ca535ac1c35234a96f65604192f"}, + {file = "asyncpg-0.27.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4bb366ae34af5b5cabc3ac6a5347dfb6013af38c68af8452f27968d49085ecc0"}, + {file = "asyncpg-0.27.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:16ba8ec2e85d586b4a12bcd03e8d29e3d99e832764d6a1d0b8c27dbbe4a2569d"}, + {file = "asyncpg-0.27.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d20dea7b83651d93b1eb2f353511fe7fd554752844523f17ad30115d8b9c8cd6"}, + {file = "asyncpg-0.27.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:e56ac8a8237ad4adec97c0cd4728596885f908053ab725e22900b5902e7f8e69"}, + {file = "asyncpg-0.27.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:bf21ebf023ec67335258e0f3d3ad7b91bb9507985ba2b2206346de488267cad0"}, + {file = "asyncpg-0.27.0-cp38-cp38-win32.whl", hash = "sha256:69aa1b443a182b13a17ff926ed6627af2d98f62f2fe5890583270cc4073f63bf"}, + {file = "asyncpg-0.27.0-cp38-cp38-win_amd64.whl", hash = "sha256:62932f29cf2433988fcd799770ec64b374a3691e7902ecf85da14d5e0854d1ea"}, + {file = "asyncpg-0.27.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:fddcacf695581a8d856654bc4c8cfb73d5c9df26d5f55201722d3e6a699e9629"}, + {file = "asyncpg-0.27.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:7d8585707ecc6661d07367d444bbaa846b4e095d84451340da8df55a3757e152"}, + {file = "asyncpg-0.27.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:975a320baf7020339a67315284a4d3bf7460e664e484672bd3e71dbd881bc692"}, + {file = "asyncpg-0.27.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2232ebae9796d4600a7819fc383da78ab51b32a092795f4555575fc934c1c89d"}, + {file = "asyncpg-0.27.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:88b62164738239f62f4af92567b846a8ef7cf8abf53eddd83650603de4d52163"}, + {file = "asyncpg-0.27.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:eb4b2fdf88af4fb1cc569781a8f933d2a73ee82cd720e0cb4edabbaecf2a905b"}, + {file = "asyncpg-0.27.0-cp39-cp39-win32.whl", hash = "sha256:8934577e1ed13f7d2d9cea3cc016cc6f95c19faedea2c2b56a6f94f257cea672"}, + {file = "asyncpg-0.27.0-cp39-cp39-win_amd64.whl", hash = "sha256:1b6499de06fe035cf2fa932ec5617ed3f37d4ebbf663b655922e105a484a6af9"}, + {file = "asyncpg-0.27.0.tar.gz", hash = "sha256:720986d9a4705dd8a40fdf172036f5ae787225036a7eb46e704c45aa8f62c054"}, +] + +[package.extras] +dev = ["Cython (>=0.29.24,<0.30.0)", "Sphinx (>=4.1.2,<4.2.0)", "flake8 (>=5.0.4,<5.1.0)", "pytest (>=6.0)", "sphinx-rtd-theme (>=0.5.2,<0.6.0)", "sphinxcontrib-asyncio (>=0.3.0,<0.4.0)", "uvloop (>=0.15.3)"] +docs = ["Sphinx (>=4.1.2,<4.2.0)", "sphinx-rtd-theme (>=0.5.2,<0.6.0)", "sphinxcontrib-asyncio (>=0.3.0,<0.4.0)"] +test = ["flake8 (>=5.0.4,<5.1.0)", "uvloop (>=0.15.3)"] + +[[package]] +name = "attrs" +version = "23.2.0" +description = "Classes Without Boilerplate" +optional = false +python-versions = ">=3.7" +files = [ + {file = "attrs-23.2.0-py3-none-any.whl", hash = "sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1"}, + {file = "attrs-23.2.0.tar.gz", hash = "sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30"}, +] + +[package.extras] +cov = ["attrs[tests]", "coverage[toml] (>=5.3)"] +dev = ["attrs[tests]", "pre-commit"] +docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope-interface"] +tests = ["attrs[tests-no-zope]", "zope-interface"] +tests-mypy = ["mypy (>=1.6)", "pytest-mypy-plugins"] +tests-no-zope = ["attrs[tests-mypy]", "cloudpickle", "hypothesis", "pympler", "pytest (>=4.3.0)", "pytest-xdist[psutil]"] + +[[package]] +name = "billiard" +version = "4.2.0" +description = "Python multiprocessing fork with improvements and bugfixes" +optional = false +python-versions = ">=3.7" +files = [ + {file = "billiard-4.2.0-py3-none-any.whl", hash = "sha256:07aa978b308f334ff8282bd4a746e681b3513db5c9a514cbdd810cbbdc19714d"}, + {file = "billiard-4.2.0.tar.gz", hash = "sha256:9a3c3184cb275aa17a732f93f65b20c525d3d9f253722d26a82194803ade5a2c"}, +] + +[[package]] +name = "black" +version = "23.12.1" +description = "The uncompromising code formatter." +optional = false +python-versions = ">=3.8" +files = [ + {file = "black-23.12.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e0aaf6041986767a5e0ce663c7a2f0e9eaf21e6ff87a5f95cbf3675bfd4c41d2"}, + {file = "black-23.12.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c88b3711d12905b74206227109272673edce0cb29f27e1385f33b0163c414bba"}, + {file = "black-23.12.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a920b569dc6b3472513ba6ddea21f440d4b4c699494d2e972a1753cdc25df7b0"}, + {file = "black-23.12.1-cp310-cp310-win_amd64.whl", hash = "sha256:3fa4be75ef2a6b96ea8d92b1587dd8cb3a35c7e3d51f0738ced0781c3aa3a5a3"}, + {file = "black-23.12.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8d4df77958a622f9b5a4c96edb4b8c0034f8434032ab11077ec6c56ae9f384ba"}, + {file = "black-23.12.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:602cfb1196dc692424c70b6507593a2b29aac0547c1be9a1d1365f0d964c353b"}, + {file = "black-23.12.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c4352800f14be5b4864016882cdba10755bd50805c95f728011bcb47a4afd59"}, + {file = "black-23.12.1-cp311-cp311-win_amd64.whl", hash = "sha256:0808494f2b2df923ffc5723ed3c7b096bd76341f6213989759287611e9837d50"}, + {file = "black-23.12.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:25e57fd232a6d6ff3f4478a6fd0580838e47c93c83eaf1ccc92d4faf27112c4e"}, + {file = "black-23.12.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2d9e13db441c509a3763a7a3d9a49ccc1b4e974a47be4e08ade2a228876500ec"}, + {file = "black-23.12.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d1bd9c210f8b109b1762ec9fd36592fdd528485aadb3f5849b2740ef17e674e"}, + {file = "black-23.12.1-cp312-cp312-win_amd64.whl", hash = "sha256:ae76c22bde5cbb6bfd211ec343ded2163bba7883c7bc77f6b756a1049436fbb9"}, + {file = "black-23.12.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1fa88a0f74e50e4487477bc0bb900c6781dbddfdfa32691e780bf854c3b4a47f"}, + {file = "black-23.12.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a4d6a9668e45ad99d2f8ec70d5c8c04ef4f32f648ef39048d010b0689832ec6d"}, + {file = "black-23.12.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b18fb2ae6c4bb63eebe5be6bd869ba2f14fd0259bda7d18a46b764d8fb86298a"}, + {file = "black-23.12.1-cp38-cp38-win_amd64.whl", hash = "sha256:c04b6d9d20e9c13f43eee8ea87d44156b8505ca8a3c878773f68b4e4812a421e"}, + {file = "black-23.12.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3e1b38b3135fd4c025c28c55ddfc236b05af657828a8a6abe5deec419a0b7055"}, + {file = "black-23.12.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4f0031eaa7b921db76decd73636ef3a12c942ed367d8c3841a0739412b260a54"}, + {file = "black-23.12.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:97e56155c6b737854e60a9ab1c598ff2533d57e7506d97af5481141671abf3ea"}, + {file = "black-23.12.1-cp39-cp39-win_amd64.whl", hash = "sha256:dd15245c8b68fe2b6bd0f32c1556509d11bb33aec9b5d0866dd8e2ed3dba09c2"}, + {file = "black-23.12.1-py3-none-any.whl", hash = "sha256:78baad24af0f033958cad29731e27363183e140962595def56423e626f4bee3e"}, + {file = "black-23.12.1.tar.gz", hash = "sha256:4ce3ef14ebe8d9509188014d96af1c456a910d5b5cbf434a09fef7e024b3d0d5"}, +] + +[package.dependencies] +click = ">=8.0.0" +mypy-extensions = ">=0.4.3" +packaging = ">=22.0" +pathspec = ">=0.9.0" +platformdirs = ">=2" +tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} +typing-extensions = {version = ">=4.0.1", markers = "python_version < \"3.11\""} + +[package.extras] +colorama = ["colorama (>=0.4.3)"] +d = ["aiohttp (>=3.7.4)", "aiohttp (>=3.7.4,!=3.9.0)"] +jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] +uvloop = ["uvloop (>=0.15.2)"] + +[[package]] +name = "case-converter" +version = "1.1.0" +description = "A string case conversion package." +optional = false +python-versions = "*" +files = [ + {file = "case-converter-1.1.0.tar.gz", hash = "sha256:2ed3fc6e3ffa8d601f9a31ffcbc8fbd19eaeb48671a79a8ef16394672824510e"}, + {file = "case_converter-1.1.0-py3-none-any.whl", hash = "sha256:d0fbc665a4fd410e454630bcf5168dce62e147a98512647ed48b0a6b556986e3"}, +] + +[[package]] +name = "celery" +version = "5.3.6" +description = "Distributed Task Queue." +optional = false +python-versions = ">=3.8" +files = [ + {file = "celery-5.3.6-py3-none-any.whl", hash = "sha256:9da4ea0118d232ce97dff5ed4974587fb1c0ff5c10042eb15278487cdd27d1af"}, + {file = "celery-5.3.6.tar.gz", hash = "sha256:870cc71d737c0200c397290d730344cc991d13a057534353d124c9380267aab9"}, +] + +[package.dependencies] +billiard = ">=4.2.0,<5.0" +click = ">=8.1.2,<9.0" +click-didyoumean = ">=0.3.0" +click-plugins = ">=1.1.1" +click-repl = ">=0.2.0" +kombu = ">=5.3.4,<6.0" +python-dateutil = ">=2.8.2" +tzdata = ">=2022.7" +vine = ">=5.1.0,<6.0" + +[package.extras] +arangodb = ["pyArango (>=2.0.2)"] +auth = ["cryptography (==41.0.5)"] +azureblockblob = ["azure-storage-blob (>=12.15.0)"] +brotli = ["brotli (>=1.0.0)", "brotlipy (>=0.7.0)"] +cassandra = ["cassandra-driver (>=3.25.0,<4)"] +consul = ["python-consul2 (==0.1.5)"] +cosmosdbsql = ["pydocumentdb (==2.3.5)"] +couchbase = ["couchbase (>=3.0.0)"] +couchdb = ["pycouchdb (==1.14.2)"] +django = ["Django (>=2.2.28)"] +dynamodb = ["boto3 (>=1.26.143)"] +elasticsearch = ["elastic-transport (<=8.10.0)", "elasticsearch (<=8.11.0)"] +eventlet = ["eventlet (>=0.32.0)"] +gevent = ["gevent (>=1.5.0)"] +librabbitmq = ["librabbitmq (>=2.0.0)"] +memcache = ["pylibmc (==1.6.3)"] +mongodb = ["pymongo[srv] (>=4.0.2)"] +msgpack = ["msgpack (==1.0.7)"] +pymemcache = ["python-memcached (==1.59)"] +pyro = ["pyro4 (==4.82)"] +pytest = ["pytest-celery (==0.0.0)"] +redis = ["redis (>=4.5.2,!=4.5.5,<6.0.0)"] +s3 = ["boto3 (>=1.26.143)"] +slmq = ["softlayer-messaging (>=1.0.3)"] +solar = ["ephem (==4.1.5)"] +sqlalchemy = ["sqlalchemy (>=1.4.48,<2.1)"] +sqs = ["boto3 (>=1.26.143)", "kombu[sqs] (>=5.3.0)", "pycurl (>=7.43.0.5)", "urllib3 (>=1.26.16)"] +tblib = ["tblib (>=1.3.0)", "tblib (>=1.5.0)"] +yaml = ["PyYAML (>=3.10)"] +zookeeper = ["kazoo (>=1.3.1)"] +zstd = ["zstandard (==0.22.0)"] + +[[package]] +name = "celery-sqlalchemy-scheduler" +version = "0.3.0" +description = "A Scheduler Based SQLalchemy For Celery" +optional = false +python-versions = "*" +files = [ + {file = "celery_sqlalchemy_scheduler-0.3.0-py3-none-any.whl", hash = "sha256:116eecd30cdfec4c0bbb5c0285b49e7bdfbbf49e43d7402868177419484f48af"}, +] + +[package.dependencies] +celery = ">=4.2" +sqlalchemy = "*" + +[[package]] +name = "certifi" +version = "2023.11.17" +description = "Python package for providing Mozilla's CA Bundle." +optional = false +python-versions = ">=3.6" +files = [ + {file = "certifi-2023.11.17-py3-none-any.whl", hash = "sha256:e036ab49d5b79556f99cfc2d9320b34cfbe5be05c5871b51de9329f0603b0474"}, + {file = "certifi-2023.11.17.tar.gz", hash = "sha256:9b469f3a900bf28dc19b8cfbf8019bf47f7fdd1a65a1d4ffb98fc14166beb4d1"}, +] + +[[package]] +name = "cffi" +version = "1.16.0" +description = "Foreign Function Interface for Python calling C code." +optional = false +python-versions = ">=3.8" +files = [ + {file = "cffi-1.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6b3d6606d369fc1da4fd8c357d026317fbb9c9b75d36dc16e90e84c26854b088"}, + {file = "cffi-1.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ac0f5edd2360eea2f1daa9e26a41db02dd4b0451b48f7c318e217ee092a213e9"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7e61e3e4fa664a8588aa25c883eab612a188c725755afff6289454d6362b9673"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a72e8961a86d19bdb45851d8f1f08b041ea37d2bd8d4fd19903bc3083d80c896"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5b50bf3f55561dac5438f8e70bfcdfd74543fd60df5fa5f62d94e5867deca684"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7651c50c8c5ef7bdb41108b7b8c5a83013bfaa8a935590c5d74627c047a583c7"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4108df7fe9b707191e55f33efbcb2d81928e10cea45527879a4749cbe472614"}, + {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:32c68ef735dbe5857c810328cb2481e24722a59a2003018885514d4c09af9743"}, + {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:673739cb539f8cdaa07d92d02efa93c9ccf87e345b9a0b556e3ecc666718468d"}, + {file = "cffi-1.16.0-cp310-cp310-win32.whl", hash = "sha256:9f90389693731ff1f659e55c7d1640e2ec43ff725cc61b04b2f9c6d8d017df6a"}, + {file = "cffi-1.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:e6024675e67af929088fda399b2094574609396b1decb609c55fa58b028a32a1"}, + {file = "cffi-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b84834d0cf97e7d27dd5b7f3aca7b6e9263c56308ab9dc8aae9784abb774d404"}, + {file = "cffi-1.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1b8ebc27c014c59692bb2664c7d13ce7a6e9a629be20e54e7271fa696ff2b417"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ee07e47c12890ef248766a6e55bd38ebfb2bb8edd4142d56db91b21ea68b7627"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8a9d3ebe49f084ad71f9269834ceccbf398253c9fac910c4fd7053ff1386936"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e70f54f1796669ef691ca07d046cd81a29cb4deb1e5f942003f401c0c4a2695d"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5bf44d66cdf9e893637896c7faa22298baebcd18d1ddb6d2626a6e39793a1d56"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b78010e7b97fef4bee1e896df8a4bbb6712b7f05b7ef630f9d1da00f6444d2e"}, + {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c6a164aa47843fb1b01e941d385aab7215563bb8816d80ff3a363a9f8448a8dc"}, + {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e09f3ff613345df5e8c3667da1d918f9149bd623cd9070c983c013792a9a62eb"}, + {file = "cffi-1.16.0-cp311-cp311-win32.whl", hash = "sha256:2c56b361916f390cd758a57f2e16233eb4f64bcbeee88a4881ea90fca14dc6ab"}, + {file = "cffi-1.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:db8e577c19c0fda0beb7e0d4e09e0ba74b1e4c092e0e40bfa12fe05b6f6d75ba"}, + {file = "cffi-1.16.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:fa3a0128b152627161ce47201262d3140edb5a5c3da88d73a1b790a959126956"}, + {file = "cffi-1.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:68e7c44931cc171c54ccb702482e9fc723192e88d25a0e133edd7aff8fcd1f6e"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abd808f9c129ba2beda4cfc53bde801e5bcf9d6e0f22f095e45327c038bfe68e"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88e2b3c14bdb32e440be531ade29d3c50a1a59cd4e51b1dd8b0865c54ea5d2e2"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fcc8eb6d5902bb1cf6dc4f187ee3ea80a1eba0a89aba40a5cb20a5087d961357"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b7be2d771cdba2942e13215c4e340bfd76398e9227ad10402a8767ab1865d2e6"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e715596e683d2ce000574bae5d07bd522c781a822866c20495e52520564f0969"}, + {file = "cffi-1.16.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2d92b25dbf6cae33f65005baf472d2c245c050b1ce709cc4588cdcdd5495b520"}, + {file = "cffi-1.16.0-cp312-cp312-win32.whl", hash = "sha256:b2ca4e77f9f47c55c194982e10f058db063937845bb2b7a86c84a6cfe0aefa8b"}, + {file = "cffi-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:68678abf380b42ce21a5f2abde8efee05c114c2fdb2e9eef2efdb0257fba1235"}, + {file = "cffi-1.16.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0c9ef6ff37e974b73c25eecc13952c55bceed9112be2d9d938ded8e856138bcc"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a09582f178759ee8128d9270cd1344154fd473bb77d94ce0aeb2a93ebf0feaf0"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e760191dd42581e023a68b758769e2da259b5d52e3103c6060ddc02c9edb8d7b"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:80876338e19c951fdfed6198e70bc88f1c9758b94578d5a7c4c91a87af3cf31c"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a6a14b17d7e17fa0d207ac08642c8820f84f25ce17a442fd15e27ea18d67c59b"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6602bc8dc6f3a9e02b6c22c4fc1e47aa50f8f8e6d3f78a5e16ac33ef5fefa324"}, + {file = "cffi-1.16.0-cp38-cp38-win32.whl", hash = "sha256:131fd094d1065b19540c3d72594260f118b231090295d8c34e19a7bbcf2e860a"}, + {file = "cffi-1.16.0-cp38-cp38-win_amd64.whl", hash = "sha256:31d13b0f99e0836b7ff893d37af07366ebc90b678b6664c955b54561fc36ef36"}, + {file = "cffi-1.16.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:582215a0e9adbe0e379761260553ba11c58943e4bbe9c36430c4ca6ac74b15ed"}, + {file = "cffi-1.16.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b29ebffcf550f9da55bec9e02ad430c992a87e5f512cd63388abb76f1036d8d2"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dc9b18bf40cc75f66f40a7379f6a9513244fe33c0e8aa72e2d56b0196a7ef872"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cb4a35b3642fc5c005a6755a5d17c6c8b6bcb6981baf81cea8bfbc8903e8ba8"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b86851a328eedc692acf81fb05444bdf1891747c25af7529e39ddafaf68a4f3f"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c0f31130ebc2d37cdd8e44605fb5fa7ad59049298b3f745c74fa74c62fbfcfc4"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f8e709127c6c77446a8c0a8c8bf3c8ee706a06cd44b1e827c3e6a2ee6b8c098"}, + {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:748dcd1e3d3d7cd5443ef03ce8685043294ad6bd7c02a38d1bd367cfd968e000"}, + {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8895613bcc094d4a1b2dbe179d88d7fb4a15cee43c052e8885783fac397d91fe"}, + {file = "cffi-1.16.0-cp39-cp39-win32.whl", hash = "sha256:ed86a35631f7bfbb28e108dd96773b9d5a6ce4811cf6ea468bb6a359b256b1e4"}, + {file = "cffi-1.16.0-cp39-cp39-win_amd64.whl", hash = "sha256:3686dffb02459559c74dd3d81748269ffb0eb027c39a6fc99502de37d501faa8"}, + {file = "cffi-1.16.0.tar.gz", hash = "sha256:bcb3ef43e58665bbda2fb198698fcae6776483e0c4a631aa5647806c25e02cc0"}, +] + +[package.dependencies] +pycparser = "*" + +[[package]] +name = "charset-normalizer" +version = "3.3.2" +description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-win32.whl", hash = "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-win32.whl", hash = "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-win32.whl", hash = "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-win32.whl", hash = "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-win32.whl", hash = "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-win32.whl", hash = "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d"}, + {file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"}, +] + +[[package]] +name = "click" +version = "8.1.7" +description = "Composable command line interface toolkit" +optional = false +python-versions = ">=3.7" +files = [ + {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"}, + {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[[package]] +name = "click-didyoumean" +version = "0.3.0" +description = "Enables git-like *did-you-mean* feature in click" +optional = false +python-versions = ">=3.6.2,<4.0.0" +files = [ + {file = "click-didyoumean-0.3.0.tar.gz", hash = "sha256:f184f0d851d96b6d29297354ed981b7dd71df7ff500d82fa6d11f0856bee8035"}, + {file = "click_didyoumean-0.3.0-py3-none-any.whl", hash = "sha256:a0713dc7a1de3f06bc0df5a9567ad19ead2d3d5689b434768a6145bff77c0667"}, +] + +[package.dependencies] +click = ">=7" + +[[package]] +name = "click-plugins" +version = "1.1.1" +description = "An extension module for click to enable registering CLI commands via setuptools entry-points." +optional = false +python-versions = "*" +files = [ + {file = "click-plugins-1.1.1.tar.gz", hash = "sha256:46ab999744a9d831159c3411bb0c79346d94a444df9a3a3742e9ed63645f264b"}, + {file = "click_plugins-1.1.1-py2.py3-none-any.whl", hash = "sha256:5d262006d3222f5057fd81e1623d4443e41dcda5dc815c06b442aa3c02889fc8"}, +] + +[package.dependencies] +click = ">=4.0" + +[package.extras] +dev = ["coveralls", "pytest (>=3.6)", "pytest-cov", "wheel"] + +[[package]] +name = "click-repl" +version = "0.3.0" +description = "REPL plugin for Click" +optional = false +python-versions = ">=3.6" +files = [ + {file = "click-repl-0.3.0.tar.gz", hash = "sha256:17849c23dba3d667247dc4defe1757fff98694e90fe37474f3feebb69ced26a9"}, + {file = "click_repl-0.3.0-py3-none-any.whl", hash = "sha256:fb7e06deb8da8de86180a33a9da97ac316751c094c6899382da7feeeeb51b812"}, +] + +[package.dependencies] +click = ">=7.0" +prompt-toolkit = ">=3.0.36" + +[package.extras] +testing = ["pytest (>=7.2.1)", "pytest-cov (>=4.0.0)", "tox (>=4.4.3)"] + +[[package]] +name = "colorama" +version = "0.4.6" +description = "Cross-platform colored terminal text." +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] + +[[package]] +name = "cryptography" +version = "38.0.4" +description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." +optional = false +python-versions = ">=3.6" +files = [ + {file = "cryptography-38.0.4-cp36-abi3-macosx_10_10_universal2.whl", hash = "sha256:2fa36a7b2cc0998a3a4d5af26ccb6273f3df133d61da2ba13b3286261e7efb70"}, + {file = "cryptography-38.0.4-cp36-abi3-macosx_10_10_x86_64.whl", hash = "sha256:1f13ddda26a04c06eb57119caf27a524ccae20533729f4b1e4a69b54e07035eb"}, + {file = "cryptography-38.0.4-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:2ec2a8714dd005949d4019195d72abed84198d877112abb5a27740e217e0ea8d"}, + {file = "cryptography-38.0.4-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50a1494ed0c3f5b4d07650a68cd6ca62efe8b596ce743a5c94403e6f11bf06c1"}, + {file = "cryptography-38.0.4-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a10498349d4c8eab7357a8f9aa3463791292845b79597ad1b98a543686fb1ec8"}, + {file = "cryptography-38.0.4-cp36-abi3-manylinux_2_24_x86_64.whl", hash = "sha256:10652dd7282de17990b88679cb82f832752c4e8237f0c714be518044269415db"}, + {file = "cryptography-38.0.4-cp36-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:bfe6472507986613dc6cc00b3d492b2f7564b02b3b3682d25ca7f40fa3fd321b"}, + {file = "cryptography-38.0.4-cp36-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:ce127dd0a6a0811c251a6cddd014d292728484e530d80e872ad9806cfb1c5b3c"}, + {file = "cryptography-38.0.4-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:53049f3379ef05182864d13bb9686657659407148f901f3f1eee57a733fb4b00"}, + {file = "cryptography-38.0.4-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:8a4b2bdb68a447fadebfd7d24855758fe2d6fecc7fed0b78d190b1af39a8e3b0"}, + {file = "cryptography-38.0.4-cp36-abi3-win32.whl", hash = "sha256:1d7e632804a248103b60b16fb145e8df0bc60eed790ece0d12efe8cd3f3e7744"}, + {file = "cryptography-38.0.4-cp36-abi3-win_amd64.whl", hash = "sha256:8e45653fb97eb2f20b8c96f9cd2b3a0654d742b47d638cf2897afbd97f80fa6d"}, + {file = "cryptography-38.0.4-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ca57eb3ddaccd1112c18fc80abe41db443cc2e9dcb1917078e02dfa010a4f353"}, + {file = "cryptography-38.0.4-pp37-pypy37_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:c9e0d79ee4c56d841bd4ac6e7697c8ff3c8d6da67379057f29e66acffcd1e9a7"}, + {file = "cryptography-38.0.4-pp37-pypy37_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:0e70da4bdff7601b0ef48e6348339e490ebfb0cbe638e083c9c41fb49f00c8bd"}, + {file = "cryptography-38.0.4-pp38-pypy38_pp73-macosx_10_10_x86_64.whl", hash = "sha256:998cd19189d8a747b226d24c0207fdaa1e6658a1d3f2494541cb9dfbf7dcb6d2"}, + {file = "cryptography-38.0.4-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:67461b5ebca2e4c2ab991733f8ab637a7265bb582f07c7c88914b5afb88cb95b"}, + {file = "cryptography-38.0.4-pp38-pypy38_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:4eb85075437f0b1fd8cd66c688469a0c4119e0ba855e3fef86691971b887caf6"}, + {file = "cryptography-38.0.4-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:3178d46f363d4549b9a76264f41c6948752183b3f587666aff0555ac50fd7876"}, + {file = "cryptography-38.0.4-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:6391e59ebe7c62d9902c24a4d8bcbc79a68e7c4ab65863536127c8a9cd94043b"}, + {file = "cryptography-38.0.4-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:78e47e28ddc4ace41dd38c42e6feecfdadf9c3be2af389abbfeef1ff06822285"}, + {file = "cryptography-38.0.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2fb481682873035600b5502f0015b664abc26466153fab5c6bc92c1ea69d478b"}, + {file = "cryptography-38.0.4-pp39-pypy39_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:4367da5705922cf7070462e964f66e4ac24162e22ab0a2e9d31f1b270dd78083"}, + {file = "cryptography-38.0.4-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:b4cad0cea995af760f82820ab4ca54e5471fc782f70a007f31531957f43e9dee"}, + {file = "cryptography-38.0.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:80ca53981ceeb3241998443c4964a387771588c4e4a5d92735a493af868294f9"}, + {file = "cryptography-38.0.4.tar.gz", hash = "sha256:175c1a818b87c9ac80bb7377f5520b7f31b3ef2a0004e2420319beadedb67290"}, +] + +[package.dependencies] +cffi = ">=1.12" + +[package.extras] +docs = ["sphinx (>=1.6.5,!=1.8.0,!=3.1.0,!=3.1.1)", "sphinx-rtd-theme"] +docstest = ["pyenchant (>=1.6.11)", "sphinxcontrib-spelling (>=4.0.1)", "twine (>=1.12.0)"] +pep8test = ["black", "flake8", "flake8-import-order", "pep8-naming"] +sdist = ["setuptools-rust (>=0.11.4)"] +ssh = ["bcrypt (>=3.1.5)"] +test = ["hypothesis (>=1.11.4,!=3.79.2)", "iso8601", "pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-subtests", "pytest-xdist", "pytz"] + +[[package]] +name = "dataclasses-json" +version = "0.6.3" +description = "Easily serialize dataclasses to and from JSON." +optional = false +python-versions = ">=3.7,<4.0" +files = [ + {file = "dataclasses_json-0.6.3-py3-none-any.whl", hash = "sha256:4aeb343357997396f6bca1acae64e486c3a723d8f5c76301888abeccf0c45176"}, + {file = "dataclasses_json-0.6.3.tar.gz", hash = "sha256:35cb40aae824736fdf959801356641836365219cfe14caeb115c39136f775d2a"}, +] + +[package.dependencies] +marshmallow = ">=3.18.0,<4.0.0" +typing-inspect = ">=0.4.0,<1" + +[[package]] +name = "dill" +version = "0.3.7" +description = "serialize all of Python" +optional = false +python-versions = ">=3.7" +files = [ + {file = "dill-0.3.7-py3-none-any.whl", hash = "sha256:76b122c08ef4ce2eedcd4d1abd8e641114bfc6c2867f49f3c41facf65bf19f5e"}, + {file = "dill-0.3.7.tar.gz", hash = "sha256:cc1c8b182eb3013e24bd475ff2e9295af86c1a38eb1aff128dac8962a9ce3c03"}, +] + +[package.extras] +graph = ["objgraph (>=1.7.2)"] + +[[package]] +name = "distro" +version = "1.9.0" +description = "Distro - an OS platform information API" +optional = false +python-versions = ">=3.6" +files = [ + {file = "distro-1.9.0-py3-none-any.whl", hash = "sha256:7bffd925d65168f85027d8da9af6bddab658135b840670a223589bc0c8ef02b2"}, + {file = "distro-1.9.0.tar.gz", hash = "sha256:2fa77c6fd8940f116ee1d6b94a2f90b13b5ea8d019b98bc8bafdcabcdd9bdbed"}, +] + +[[package]] +name = "ecdsa" +version = "0.18.0" +description = "ECDSA cryptographic signature library (pure python)" +optional = false +python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "ecdsa-0.18.0-py2.py3-none-any.whl", hash = "sha256:80600258e7ed2f16b9aa1d7c295bd70194109ad5a30fdee0eaeefef1d4c559dd"}, + {file = "ecdsa-0.18.0.tar.gz", hash = "sha256:190348041559e21b22a1d65cee485282ca11a6f81d503fddb84d5017e9ed1e49"}, +] + +[package.dependencies] +six = ">=1.9.0" + +[package.extras] +gmpy = ["gmpy"] +gmpy2 = ["gmpy2"] + +[[package]] +name = "et-xmlfile" +version = "1.1.0" +description = "An implementation of lxml.xmlfile for the standard library" +optional = false +python-versions = ">=3.6" +files = [ + {file = "et_xmlfile-1.1.0-py3-none-any.whl", hash = "sha256:a2ba85d1d6a74ef63837eed693bcb89c3f752169b0e3e7ae5b16ca5e1b3deada"}, + {file = "et_xmlfile-1.1.0.tar.gz", hash = "sha256:8eb9e2bc2f8c97e37a2dc85a09ecdcdec9d8a396530a6d5a33b30b9a92da0c5c"}, +] + +[[package]] +name = "exceptiongroup" +version = "1.2.0" +description = "Backport of PEP 654 (exception groups)" +optional = false +python-versions = ">=3.7" +files = [ + {file = "exceptiongroup-1.2.0-py3-none-any.whl", hash = "sha256:4bfd3996ac73b41e9b9628b04e079f193850720ea5945fc96a08633c66912f14"}, + {file = "exceptiongroup-1.2.0.tar.gz", hash = "sha256:91f5c769735f051a4290d52edd0858999b57e5876e9f85937691bd4c9fa3ed68"}, +] + +[package.extras] +test = ["pytest (>=6)"] + +[[package]] +name = "fastapi" +version = "0.105.0" +description = "FastAPI framework, high performance, easy to learn, fast to code, ready for production" +optional = false +python-versions = ">=3.8" +files = [ + {file = "fastapi-0.105.0-py3-none-any.whl", hash = "sha256:f19ebf6fdc82a3281d10f2cb4774bdfa90238e3b40af3525a0c09fd08ad1c480"}, + {file = "fastapi-0.105.0.tar.gz", hash = "sha256:4d12838819aa52af244580675825e750ad67c9df4614f557a769606af902cf22"}, +] + +[package.dependencies] +anyio = ">=3.7.1,<4.0.0" +pydantic = ">=1.7.4,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0 || >2.0.0,<2.0.1 || >2.0.1,<2.1.0 || >2.1.0,<3.0.0" +starlette = ">=0.27.0,<0.28.0" +typing-extensions = ">=4.8.0" + +[package.extras] +all = ["email-validator (>=2.0.0)", "httpx (>=0.23.0)", "itsdangerous (>=1.1.0)", "jinja2 (>=2.11.2)", "orjson (>=3.2.1)", "pydantic-extra-types (>=2.0.0)", "pydantic-settings (>=2.0.0)", "python-multipart (>=0.0.5)", "pyyaml (>=5.3.1)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0)", "uvicorn[standard] (>=0.12.0)"] + +[[package]] +name = "fastapi-async-sqlalchemy" +version = "0.6.1" +description = "SQLAlchemy middleware for FastAPI" +optional = false +python-versions = ">=3.7" +files = [ + {file = "fastapi-async-sqlalchemy-0.6.1.tar.gz", hash = "sha256:c4e0c9832e5e7ef9d647e7eb134e6d326945dca28323e503a21f3d4ab2dee160"}, + {file = "fastapi_async_sqlalchemy-0.6.1-py3-none-any.whl", hash = "sha256:0f4edfbc7b0f5fc2e0017cd903a953f4e0b01870f09e86cd0bc79087f3606bc4"}, +] + +[package.dependencies] +SQLAlchemy = ">=1.4.19" +starlette = ">=0.13.6" + +[[package]] +name = "fastapi-cache2" +version = "0.2.1" +description = "Cache for FastAPI" +optional = false +python-versions = ">=3.7,<4.0" +files = [ + {file = "fastapi_cache2-0.2.1-py3-none-any.whl", hash = "sha256:532c24253ab8f162ba2f0a7dcccb98591424f0424c28da70346eb3c99daf2b06"}, + {file = "fastapi_cache2-0.2.1.tar.gz", hash = "sha256:0c68803c5a7fdebfec3e4430fd08482c091344dc4dd55a00209a882220712f89"}, +] + +[package.dependencies] +aiohttp = {version = ">=3.8.3", markers = "python_version >= \"3.11\""} +fastapi = "*" +pendulum = "*" +redis = {version = ">=4.2.0rc1,<5.0.0", optional = true, markers = "extra == \"redis\" or extra == \"all\""} +uvicorn = "*" + +[package.extras] +all = ["aiobotocore (>=1.4.1,<2.0.0)", "aiomcache", "redis (>=4.2.0rc1,<5.0.0)"] +dynamodb = ["aiobotocore (>=1.4.1,<2.0.0)"] +memcache = ["aiomcache"] +redis = ["redis (>=4.2.0rc1,<5.0.0)"] + +[[package]] +name = "fastapi-limiter" +version = "0.1.6" +description = "A request rate limiter for fastapi" +optional = false +python-versions = ">=3.9,<4.0" +files = [ + {file = "fastapi_limiter-0.1.6-py3-none-any.whl", hash = "sha256:2e53179a4208b8f2c8795e38bb001324d3dc37d2800ff49fd28ec5caabf7a240"}, + {file = "fastapi_limiter-0.1.6.tar.gz", hash = "sha256:6f5fde8efebe12eb33861bdffb91009f699369a3c2862cdc7c1d9acf912ff443"}, +] + +[package.dependencies] +fastapi = "*" +redis = ">=4.2.0rc1" + +[[package]] +name = "fastapi-nextauth-jwt" +version = "1.1.2" +description = "A fastapi dependency used to decode jwt tokens generated by nextauth," +optional = false +python-versions = "*" +files = [ + {file = "fastapi_nextauth_jwt-1.1.2-py2.py3-none-any.whl", hash = "sha256:ada718e8f6dc863e1b24936a9e2eb9dd7c03a81df8e6eb9105de1e843c6662a9"}, + {file = "fastapi_nextauth_jwt-1.1.2.tar.gz", hash = "sha256:ef89277cdd83bc881697564aaa7a9ad626d280759f2bd4b13b2257a3de1a9916"}, +] + +[package.dependencies] +cryptography = "*" +fastapi = "*" +python-jose = {version = "*", extras = ["cryptography"]} + +[package.extras] +test = ["httpx", "pytest (>=2.7.3)", "pytest-cov"] + +[[package]] +name = "fastapi-pagination" +version = "0.12.14" +description = "FastAPI pagination" +optional = false +python-versions = ">=3.8,<4.0" +files = [ + {file = "fastapi_pagination-0.12.14-py3-none-any.whl", hash = "sha256:59b6c5626b1d21c610da333c7a586d625f6c81d8fa26267a4b598aae736f6753"}, + {file = "fastapi_pagination-0.12.14.tar.gz", hash = "sha256:4148694b1e170055eea0a5e691dbc640c4bf55eb0086cf11d14b164c35660559"}, +] + +[package.dependencies] +fastapi = ">=0.93.0" +pydantic = ">=1.9.1" +sqlakeyset = {version = ">=2.0.1680321678,<3.0.0", optional = true, markers = "extra == \"sqlmodel\" or extra == \"sqlalchemy\" or extra == \"all\""} +SQLAlchemy = {version = ">=1.3.20", optional = true, markers = "extra == \"sqlalchemy\" or extra == \"asyncpg\" or extra == \"all\""} +typing-extensions = ">=4.8.0,<5.0.0" + +[package.extras] +all = ["SQLAlchemy (>=1.3.20)", "asyncpg (>=0.24.0)", "beanie (>=1.11.9,<2.0.0)", "bunnet (>=1.1.0,<2.0.0)", "databases (>=0.6.0)", "django (<5.0.0)", "mongoengine (>=0.23.1,<0.28.0)", "motor (>=2.5.1,<4.0.0)", "orm (>=0.3.1)", "ormar (>=0.11.2)", "piccolo (>=0.89,<0.122)", "pony (>=0.7.16,<0.8.0)", "scylla-driver (>=3.25.6,<4.0.0)", "sqlakeyset (>=2.0.1680321678,<3.0.0)", "sqlmodel (>=0.0.8,<0.0.15)", "tortoise-orm (>=0.16.18,<0.21.0)"] +asyncpg = ["SQLAlchemy (>=1.3.20)", "asyncpg (>=0.24.0)"] +beanie = ["beanie (>=1.11.9,<2.0.0)"] +bunnet = ["bunnet (>=1.1.0,<2.0.0)"] +databases = ["databases (>=0.6.0)"] +django = ["databases (>=0.6.0)", "django (<5.0.0)"] +mongoengine = ["mongoengine (>=0.23.1,<0.28.0)"] +motor = ["motor (>=2.5.1,<4.0.0)"] +orm = ["databases (>=0.6.0)", "orm (>=0.3.1)"] +ormar = ["ormar (>=0.11.2)"] +piccolo = ["piccolo (>=0.89,<0.122)"] +scylla-driver = ["scylla-driver (>=3.25.6,<4.0.0)"] +sqlalchemy = ["SQLAlchemy (>=1.3.20)", "sqlakeyset (>=2.0.1680321678,<3.0.0)"] +sqlmodel = ["sqlakeyset (>=2.0.1680321678,<3.0.0)", "sqlmodel (>=0.0.8,<0.0.15)"] +tortoise = ["tortoise-orm (>=0.16.18,<0.21.0)"] + +[[package]] +name = "frozenlist" +version = "1.4.1" +description = "A list-like structure which implements collections.abc.MutableSequence" +optional = false +python-versions = ">=3.8" +files = [ + {file = "frozenlist-1.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f9aa1878d1083b276b0196f2dfbe00c9b7e752475ed3b682025ff20c1c1f51ac"}, + {file = "frozenlist-1.4.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:29acab3f66f0f24674b7dc4736477bcd4bc3ad4b896f5f45379a67bce8b96868"}, + {file = "frozenlist-1.4.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:74fb4bee6880b529a0c6560885fce4dc95936920f9f20f53d99a213f7bf66776"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:590344787a90ae57d62511dd7c736ed56b428f04cd8c161fcc5e7232c130c69a"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:068b63f23b17df8569b7fdca5517edef76171cf3897eb68beb01341131fbd2ad"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c849d495bf5154cd8da18a9eb15db127d4dba2968d88831aff6f0331ea9bd4c"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9750cc7fe1ae3b1611bb8cfc3f9ec11d532244235d75901fb6b8e42ce9229dfe"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9b2de4cf0cdd5bd2dee4c4f63a653c61d2408055ab77b151c1957f221cabf2a"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0633c8d5337cb5c77acbccc6357ac49a1770b8c487e5b3505c57b949b4b82e98"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:27657df69e8801be6c3638054e202a135c7f299267f1a55ed3a598934f6c0d75"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:f9a3ea26252bd92f570600098783d1371354d89d5f6b7dfd87359d669f2109b5"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:4f57dab5fe3407b6c0c1cc907ac98e8a189f9e418f3b6e54d65a718aaafe3950"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e02a0e11cf6597299b9f3bbd3f93d79217cb90cfd1411aec33848b13f5c656cc"}, + {file = "frozenlist-1.4.1-cp310-cp310-win32.whl", hash = "sha256:a828c57f00f729620a442881cc60e57cfcec6842ba38e1b19fd3e47ac0ff8dc1"}, + {file = "frozenlist-1.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:f56e2333dda1fe0f909e7cc59f021eba0d2307bc6f012a1ccf2beca6ba362439"}, + {file = "frozenlist-1.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a0cb6f11204443f27a1628b0e460f37fb30f624be6051d490fa7d7e26d4af3d0"}, + {file = "frozenlist-1.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b46c8ae3a8f1f41a0d2ef350c0b6e65822d80772fe46b653ab6b6274f61d4a49"}, + {file = "frozenlist-1.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fde5bd59ab5357e3853313127f4d3565fc7dad314a74d7b5d43c22c6a5ed2ced"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:722e1124aec435320ae01ee3ac7bec11a5d47f25d0ed6328f2273d287bc3abb0"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2471c201b70d58a0f0c1f91261542a03d9a5e088ed3dc6c160d614c01649c106"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c757a9dd70d72b076d6f68efdbb9bc943665ae954dad2801b874c8c69e185068"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f146e0911cb2f1da549fc58fc7bcd2b836a44b79ef871980d605ec392ff6b0d2"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f9c515e7914626b2a2e1e311794b4c35720a0be87af52b79ff8e1429fc25f19"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c302220494f5c1ebeb0912ea782bcd5e2f8308037b3c7553fad0e48ebad6ad82"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:442acde1e068288a4ba7acfe05f5f343e19fac87bfc96d89eb886b0363e977ec"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:1b280e6507ea8a4fa0c0a7150b4e526a8d113989e28eaaef946cc77ffd7efc0a"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:fe1a06da377e3a1062ae5fe0926e12b84eceb8a50b350ddca72dc85015873f74"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:db9e724bebd621d9beca794f2a4ff1d26eed5965b004a97f1f1685a173b869c2"}, + {file = "frozenlist-1.4.1-cp311-cp311-win32.whl", hash = "sha256:e774d53b1a477a67838a904131c4b0eef6b3d8a651f8b138b04f748fccfefe17"}, + {file = "frozenlist-1.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:fb3c2db03683b5767dedb5769b8a40ebb47d6f7f45b1b3e3b4b51ec8ad9d9825"}, + {file = "frozenlist-1.4.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:1979bc0aeb89b33b588c51c54ab0161791149f2461ea7c7c946d95d5f93b56ae"}, + {file = "frozenlist-1.4.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:cc7b01b3754ea68a62bd77ce6020afaffb44a590c2289089289363472d13aedb"}, + {file = "frozenlist-1.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c9c92be9fd329ac801cc420e08452b70e7aeab94ea4233a4804f0915c14eba9b"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c3894db91f5a489fc8fa6a9991820f368f0b3cbdb9cd8849547ccfab3392d86"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ba60bb19387e13597fb059f32cd4d59445d7b18b69a745b8f8e5db0346f33480"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8aefbba5f69d42246543407ed2461db31006b0f76c4e32dfd6f42215a2c41d09"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:780d3a35680ced9ce682fbcf4cb9c2bad3136eeff760ab33707b71db84664e3a"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9acbb16f06fe7f52f441bb6f413ebae6c37baa6ef9edd49cdd567216da8600cd"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:23b701e65c7b36e4bf15546a89279bd4d8675faabc287d06bbcfac7d3c33e1e6"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:3e0153a805a98f5ada7e09826255ba99fb4f7524bb81bf6b47fb702666484ae1"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:dd9b1baec094d91bf36ec729445f7769d0d0cf6b64d04d86e45baf89e2b9059b"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:1a4471094e146b6790f61b98616ab8e44f72661879cc63fa1049d13ef711e71e"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:5667ed53d68d91920defdf4035d1cdaa3c3121dc0b113255124bcfada1cfa1b8"}, + {file = "frozenlist-1.4.1-cp312-cp312-win32.whl", hash = "sha256:beee944ae828747fd7cb216a70f120767fc9f4f00bacae8543c14a6831673f89"}, + {file = "frozenlist-1.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:64536573d0a2cb6e625cf309984e2d873979709f2cf22839bf2d61790b448ad5"}, + {file = "frozenlist-1.4.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:20b51fa3f588ff2fe658663db52a41a4f7aa6c04f6201449c6c7c476bd255c0d"}, + {file = "frozenlist-1.4.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:410478a0c562d1a5bcc2f7ea448359fcb050ed48b3c6f6f4f18c313a9bdb1826"}, + {file = "frozenlist-1.4.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c6321c9efe29975232da3bd0af0ad216800a47e93d763ce64f291917a381b8eb"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:48f6a4533887e189dae092f1cf981f2e3885175f7a0f33c91fb5b7b682b6bab6"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6eb73fa5426ea69ee0e012fb59cdc76a15b1283d6e32e4f8dc4482ec67d1194d"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fbeb989b5cc29e8daf7f976b421c220f1b8c731cbf22b9130d8815418ea45887"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:32453c1de775c889eb4e22f1197fe3bdfe457d16476ea407472b9442e6295f7a"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:693945278a31f2086d9bf3df0fe8254bbeaef1fe71e1351c3bd730aa7d31c41b"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:1d0ce09d36d53bbbe566fe296965b23b961764c0bcf3ce2fa45f463745c04701"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:3a670dc61eb0d0eb7080890c13de3066790f9049b47b0de04007090807c776b0"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:dca69045298ce5c11fd539682cff879cc1e664c245d1c64da929813e54241d11"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:a06339f38e9ed3a64e4c4e43aec7f59084033647f908e4259d279a52d3757d09"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b7f2f9f912dca3934c1baec2e4585a674ef16fe00218d833856408c48d5beee7"}, + {file = "frozenlist-1.4.1-cp38-cp38-win32.whl", hash = "sha256:e7004be74cbb7d9f34553a5ce5fb08be14fb33bc86f332fb71cbe5216362a497"}, + {file = "frozenlist-1.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:5a7d70357e7cee13f470c7883a063aae5fe209a493c57d86eb7f5a6f910fae09"}, + {file = "frozenlist-1.4.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:bfa4a17e17ce9abf47a74ae02f32d014c5e9404b6d9ac7f729e01562bbee601e"}, + {file = "frozenlist-1.4.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b7e3ed87d4138356775346e6845cccbe66cd9e207f3cd11d2f0b9fd13681359d"}, + {file = "frozenlist-1.4.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c99169d4ff810155ca50b4da3b075cbde79752443117d89429595c2e8e37fed8"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:edb678da49d9f72c9f6c609fbe41a5dfb9a9282f9e6a2253d5a91e0fc382d7c0"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6db4667b187a6742b33afbbaf05a7bc551ffcf1ced0000a571aedbb4aa42fc7b"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55fdc093b5a3cb41d420884cdaf37a1e74c3c37a31f46e66286d9145d2063bd0"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82e8211d69a4f4bc360ea22cd6555f8e61a1bd211d1d5d39d3d228b48c83a897"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89aa2c2eeb20957be2d950b85974b30a01a762f3308cd02bb15e1ad632e22dc7"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9d3e0c25a2350080e9319724dede4f31f43a6c9779be48021a7f4ebde8b2d742"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7268252af60904bf52c26173cbadc3a071cece75f873705419c8681f24d3edea"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:0c250a29735d4f15321007fb02865f0e6b6a41a6b88f1f523ca1596ab5f50bd5"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:96ec70beabbd3b10e8bfe52616a13561e58fe84c0101dd031dc78f250d5128b9"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:23b2d7679b73fe0e5a4560b672a39f98dfc6f60df63823b0a9970525325b95f6"}, + {file = "frozenlist-1.4.1-cp39-cp39-win32.whl", hash = "sha256:a7496bfe1da7fb1a4e1cc23bb67c58fab69311cc7d32b5a99c2007b4b2a0e932"}, + {file = "frozenlist-1.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:e6a20a581f9ce92d389a8c7d7c3dd47c81fd5d6e655c8dddf341e14aa48659d0"}, + {file = "frozenlist-1.4.1-py3-none-any.whl", hash = "sha256:04ced3e6a46b4cfffe20f9ae482818e34eba9b5fb0ce4056e4cc9b6e212d09b7"}, + {file = "frozenlist-1.4.1.tar.gz", hash = "sha256:c037a86e8513059a2613aaba4d817bb90b9d9b6b69aace3ce9c877e8c8ed402b"}, +] + +[[package]] +name = "greenlet" +version = "3.0.3" +description = "Lightweight in-process concurrent programming" +optional = false +python-versions = ">=3.7" +files = [ + {file = "greenlet-3.0.3-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:9da2bd29ed9e4f15955dd1595ad7bc9320308a3b766ef7f837e23ad4b4aac31a"}, + {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d353cadd6083fdb056bb46ed07e4340b0869c305c8ca54ef9da3421acbdf6881"}, + {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dca1e2f3ca00b84a396bc1bce13dd21f680f035314d2379c4160c98153b2059b"}, + {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3ed7fb269f15dc662787f4119ec300ad0702fa1b19d2135a37c2c4de6fadfd4a"}, + {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd4f49ae60e10adbc94b45c0b5e6a179acc1736cf7a90160b404076ee283cf83"}, + {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:73a411ef564e0e097dbe7e866bb2dda0f027e072b04da387282b02c308807405"}, + {file = "greenlet-3.0.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:7f362975f2d179f9e26928c5b517524e89dd48530a0202570d55ad6ca5d8a56f"}, + {file = "greenlet-3.0.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:649dde7de1a5eceb258f9cb00bdf50e978c9db1b996964cd80703614c86495eb"}, + {file = "greenlet-3.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:68834da854554926fbedd38c76e60c4a2e3198c6fbed520b106a8986445caaf9"}, + {file = "greenlet-3.0.3-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:b1b5667cced97081bf57b8fa1d6bfca67814b0afd38208d52538316e9422fc61"}, + {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:52f59dd9c96ad2fc0d5724107444f76eb20aaccb675bf825df6435acb7703559"}, + {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:afaff6cf5200befd5cec055b07d1c0a5a06c040fe5ad148abcd11ba6ab9b114e"}, + {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fe754d231288e1e64323cfad462fcee8f0288654c10bdf4f603a39ed923bef33"}, + {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2797aa5aedac23af156bbb5a6aa2cd3427ada2972c828244eb7d1b9255846379"}, + {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b7f009caad047246ed379e1c4dbcb8b020f0a390667ea74d2387be2998f58a22"}, + {file = "greenlet-3.0.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c5e1536de2aad7bf62e27baf79225d0d64360d4168cf2e6becb91baf1ed074f3"}, + {file = "greenlet-3.0.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:894393ce10ceac937e56ec00bb71c4c2f8209ad516e96033e4b3b1de270e200d"}, + {file = "greenlet-3.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:1ea188d4f49089fc6fb283845ab18a2518d279c7cd9da1065d7a84e991748728"}, + {file = "greenlet-3.0.3-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:70fb482fdf2c707765ab5f0b6655e9cfcf3780d8d87355a063547b41177599be"}, + {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d4d1ac74f5c0c0524e4a24335350edad7e5f03b9532da7ea4d3c54d527784f2e"}, + {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:149e94a2dd82d19838fe4b2259f1b6b9957d5ba1b25640d2380bea9c5df37676"}, + {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:15d79dd26056573940fcb8c7413d84118086f2ec1a8acdfa854631084393efcc"}, + {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:881b7db1ebff4ba09aaaeae6aa491daeb226c8150fc20e836ad00041bcb11230"}, + {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fcd2469d6a2cf298f198f0487e0a5b1a47a42ca0fa4dfd1b6862c999f018ebbf"}, + {file = "greenlet-3.0.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:1f672519db1796ca0d8753f9e78ec02355e862d0998193038c7073045899f305"}, + {file = "greenlet-3.0.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2516a9957eed41dd8f1ec0c604f1cdc86758b587d964668b5b196a9db5bfcde6"}, + {file = "greenlet-3.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:bba5387a6975598857d86de9eac14210a49d554a77eb8261cc68b7d082f78ce2"}, + {file = "greenlet-3.0.3-cp37-cp37m-macosx_11_0_universal2.whl", hash = "sha256:5b51e85cb5ceda94e79d019ed36b35386e8c37d22f07d6a751cb659b180d5274"}, + {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:daf3cb43b7cf2ba96d614252ce1684c1bccee6b2183a01328c98d36fcd7d5cb0"}, + {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:99bf650dc5d69546e076f413a87481ee1d2d09aaaaaca058c9251b6d8c14783f"}, + {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2dd6e660effd852586b6a8478a1d244b8dc90ab5b1321751d2ea15deb49ed414"}, + {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e3391d1e16e2a5a1507d83e4a8b100f4ee626e8eca43cf2cadb543de69827c4c"}, + {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e1f145462f1fa6e4a4ae3c0f782e580ce44d57c8f2c7aae1b6fa88c0b2efdb41"}, + {file = "greenlet-3.0.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:1a7191e42732df52cb5f39d3527217e7ab73cae2cb3694d241e18f53d84ea9a7"}, + {file = "greenlet-3.0.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:0448abc479fab28b00cb472d278828b3ccca164531daab4e970a0458786055d6"}, + {file = "greenlet-3.0.3-cp37-cp37m-win32.whl", hash = "sha256:b542be2440edc2d48547b5923c408cbe0fc94afb9f18741faa6ae970dbcb9b6d"}, + {file = "greenlet-3.0.3-cp37-cp37m-win_amd64.whl", hash = "sha256:01bc7ea167cf943b4c802068e178bbf70ae2e8c080467070d01bfa02f337ee67"}, + {file = "greenlet-3.0.3-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:1996cb9306c8595335bb157d133daf5cf9f693ef413e7673cb07e3e5871379ca"}, + {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ddc0f794e6ad661e321caa8d2f0a55ce01213c74722587256fb6566049a8b04"}, + {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c9db1c18f0eaad2f804728c67d6c610778456e3e1cc4ab4bbd5eeb8e6053c6fc"}, + {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7170375bcc99f1a2fbd9c306f5be8764eaf3ac6b5cb968862cad4c7057756506"}, + {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b66c9c1e7ccabad3a7d037b2bcb740122a7b17a53734b7d72a344ce39882a1b"}, + {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:098d86f528c855ead3479afe84b49242e174ed262456c342d70fc7f972bc13c4"}, + {file = "greenlet-3.0.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:81bb9c6d52e8321f09c3d165b2a78c680506d9af285bfccbad9fb7ad5a5da3e5"}, + {file = "greenlet-3.0.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:fd096eb7ffef17c456cfa587523c5f92321ae02427ff955bebe9e3c63bc9f0da"}, + {file = "greenlet-3.0.3-cp38-cp38-win32.whl", hash = "sha256:d46677c85c5ba00a9cb6f7a00b2bfa6f812192d2c9f7d9c4f6a55b60216712f3"}, + {file = "greenlet-3.0.3-cp38-cp38-win_amd64.whl", hash = "sha256:419b386f84949bf0e7c73e6032e3457b82a787c1ab4a0e43732898a761cc9dbf"}, + {file = "greenlet-3.0.3-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:da70d4d51c8b306bb7a031d5cff6cc25ad253affe89b70352af5f1cb68e74b53"}, + {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:086152f8fbc5955df88382e8a75984e2bb1c892ad2e3c80a2508954e52295257"}, + {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d73a9fe764d77f87f8ec26a0c85144d6a951a6c438dfe50487df5595c6373eac"}, + {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b7dcbe92cc99f08c8dd11f930de4d99ef756c3591a5377d1d9cd7dd5e896da71"}, + {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1551a8195c0d4a68fac7a4325efac0d541b48def35feb49d803674ac32582f61"}, + {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:64d7675ad83578e3fc149b617a444fab8efdafc9385471f868eb5ff83e446b8b"}, + {file = "greenlet-3.0.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b37eef18ea55f2ffd8f00ff8fe7c8d3818abd3e25fb73fae2ca3b672e333a7a6"}, + {file = "greenlet-3.0.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:77457465d89b8263bca14759d7c1684df840b6811b2499838cc5b040a8b5b113"}, + {file = "greenlet-3.0.3-cp39-cp39-win32.whl", hash = "sha256:57e8974f23e47dac22b83436bdcf23080ade568ce77df33159e019d161ce1d1e"}, + {file = "greenlet-3.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:c5ee858cfe08f34712f548c3c363e807e7186f03ad7a5039ebadb29e8c6be067"}, + {file = "greenlet-3.0.3.tar.gz", hash = "sha256:43374442353259554ce33599da8b692d5aa96f8976d567d4badf263371fbe491"}, +] + +[package.extras] +docs = ["Sphinx", "furo"] +test = ["objgraph", "psutil"] + +[[package]] +name = "gurobipy" +version = "10.0.3" +description = "Python interface to Gurobi" +optional = false +python-versions = "*" +files = [ + {file = "gurobipy-10.0.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a6fdeadceae4cec7a4764ef4c0e6dc5ad7ad0c03abb6e3b356a743039304f60b"}, + {file = "gurobipy-10.0.3-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:b418cd7e33905a59f6dfe4f3e91e523e5d02a15cb7374442694f6bf2895a5656"}, + {file = "gurobipy-10.0.3-cp310-cp310-manylinux2014_x86_64.whl", hash = "sha256:919817afb13681da86b0ee645b3044a57056f64dd90e66400a076415460a298f"}, + {file = "gurobipy-10.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:c5d908a9682d28d4eafc6f97d1408ab204e72aa97c2c726f339097b58de48d7a"}, + {file = "gurobipy-10.0.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:b01009368f04f1f73c94a02737857fc51fbf4aa6697edadb5776b72c0f901a7c"}, + {file = "gurobipy-10.0.3-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:e41628b167dd33e853347ea5adce93e8924777797965bbd895e333a3795557f1"}, + {file = "gurobipy-10.0.3-cp311-cp311-manylinux2014_x86_64.whl", hash = "sha256:a58fb26639d0eccc79bc25a86fde65d9f10c289f54dc7c1177d44c737e25f82f"}, + {file = "gurobipy-10.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:90c21026cee7d3bd9e73b454996e9b03b97e1481f6d75aefac81204783a629b9"}, + {file = "gurobipy-10.0.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:4ac79995e6af3611521186d29f929725e15015267d1b505fea6b2a90367a0ddd"}, + {file = "gurobipy-10.0.3-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:2f7f8e73624ec32e19f4bfdd1a102abf2d5ecd667b81d76aae4a31f460a303d3"}, + {file = "gurobipy-10.0.3-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:117a744cf25b6cd6e338cf7210f93c8703821b1173d9cabe7ad3e094c7ddab56"}, + {file = "gurobipy-10.0.3-cp37-cp37m-win_amd64.whl", hash = "sha256:140df7c858b55111041c90953db5df3ee8201b0e37ebf41e6d3353c601f6ffe8"}, + {file = "gurobipy-10.0.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:5f7ff9e6224d6c59d49c12d6310b9eeb6cf2654434bcb1edf2255cfad7e32a78"}, + {file = "gurobipy-10.0.3-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:81971b05e5146787da50eb403e43640d557e4c5669215601be539d1d15256dba"}, + {file = "gurobipy-10.0.3-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:3544303e8f8e657827714ee825b00afa07cb7471443ba9c141da2fbe408c7046"}, + {file = "gurobipy-10.0.3-cp38-cp38-win_amd64.whl", hash = "sha256:babb3ff5ac286fa405702e1313e40ebd992672b3dd7ce6dd441bbbede1ed56ca"}, + {file = "gurobipy-10.0.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:4fe0419554897022478cceb414bf8b3fba91806bdd8ba227d3edecdf8d90720a"}, + {file = "gurobipy-10.0.3-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:01bf7e756bf44373900b7f1fe410cd12df346708abd58a0f3af51a605a714a35"}, + {file = "gurobipy-10.0.3-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:bea65f0b0edcd40a0e6bdf6a468a3a92195dd6ca7fa588200ec169610275f273"}, + {file = "gurobipy-10.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:8a6eb953435c03b998cf3d56e57ea8b50cc5eea2a2aac2b2326416b921ca044a"}, +] + +[package.extras] +matrixapi = ["numpy", "scipy"] + +[[package]] +name = "h11" +version = "0.14.0" +description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" +optional = false +python-versions = ">=3.7" +files = [ + {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, + {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, +] + +[[package]] +name = "highspy" +version = "1.5.3" +description = "Python interface to HiGHS" +optional = false +python-versions = ">=3.7" +files = [ + {file = "highspy-1.5.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:278d96770c66f8b0e527fbe24109a612db1c96eee1d868e8080e7f5268160d28"}, + {file = "highspy-1.5.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:bfe04d4fa59118d07693ffdf72576b18ec95958370b366695262b4e455aa8241"}, + {file = "highspy-1.5.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e94a09150c8a57fcb0192124547d085177a74218d316717ab636afc55b3d381d"}, + {file = "highspy-1.5.3-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6995cc6b46c13855237fc0f3d6c32e993dba9ef9f26f13adb1da2c6d982a7c35"}, + {file = "highspy-1.5.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3f7da5ea075ff798c1ba5958730bfc224231d2609f5a19f5a0d5fb402387173f"}, + {file = "highspy-1.5.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8c1c1b42a6ae70a066ff712eabc1bd271fc567bfb18f0c1c8abe8641889abfea"}, + {file = "highspy-1.5.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1d557087be8815466ccad6d562f344199f8c1007f6ff04c3562b3143ae34b268"}, + {file = "highspy-1.5.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:119f224fabdba5b86085fd53f1e498743f127ec46a99880b6ae9adc5da57dd35"}, + {file = "highspy-1.5.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:24a875d5428919d4459fb43c461b36d48b8161b25a658905c60a15a808c15208"}, + {file = "highspy-1.5.3-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:384135fa90661376f387f26555cf6d63b922d87189d1427ee14d405d022ecf9f"}, + {file = "highspy-1.5.3-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:cb5a6a5f89d86af63ad7a9af7956a3df8b060835b48481d8040e63a40bf3bf21"}, + {file = "highspy-1.5.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ba14016987dd6391d52fa660c1e13d48a3aec25444a5811b044a257c34e44144"}, + {file = "highspy-1.5.3-cp310-cp310-win_amd64.whl", hash = "sha256:25774188310e56ef353f7da7c4381daf1edfc4628c64f5d34fd78ecc7dbb6dbc"}, + {file = "highspy-1.5.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0764944ec48a62ad286ad0d1d2240679bec12e551f89fed9ca3c66f845f3621f"}, + {file = "highspy-1.5.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3c8f07394118c9c433a5baa18c82c74da3b00ffac9c7cb2d7dc6ab8799861a43"}, + {file = "highspy-1.5.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:86820f34394fc602fe388d4625a2d6b1a16de2e9391217a73423a0c9b9fe88bf"}, + {file = "highspy-1.5.3-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:93fe5720296f0e6a6f850f87407b0018d55cdee5be98bc1f01d34414022cffd8"}, + {file = "highspy-1.5.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f878edcd2e8bb5e01f01fcd43d9da2a1965f155a11059f3d8069ee5223120dd0"}, + {file = "highspy-1.5.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:da9c7106e0b0de8c76741083d19b9f1cded4007ba2113b0f3b7370262e7afd0b"}, + {file = "highspy-1.5.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c1cc0e198361bb591b772c46dc0e943c8cb08c391f9a80914ac1aa3e7bf34579"}, + {file = "highspy-1.5.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:4e3bcf107825448a73409bcc8e487531e222c8fd535da754783f3752953fbaee"}, + {file = "highspy-1.5.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:405fda488d1b4b8622c021561761532a9479f8e5cda8788b8a26c3fa960eea7e"}, + {file = "highspy-1.5.3-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:fdc99a0c35d0129e7b240e1ece0be83de8ed7fd7a667882082bab6b3e0bf3870"}, + {file = "highspy-1.5.3-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:553cd0a8dcb0bcf2d212535a5cbebb31e6323042705bd16da3599a5fb83abfee"}, + {file = "highspy-1.5.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0682f3a468f790053142da3ac9ae9f9e218455816bae56a2ceb0aa13166a8159"}, + {file = "highspy-1.5.3-cp311-cp311-win_amd64.whl", hash = "sha256:bd84925c18e5d087dca20599c275c707dbe4b0efe24dbc6f05959c72b492cec8"}, + {file = "highspy-1.5.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:27ed722ac9c611ac842121b6f25fa368e59a77cdb61ac4d809d4814e476a99db"}, + {file = "highspy-1.5.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fa2908e81b2917011da91df8d561b509bc0fb78dd99373b22307d2ea4af5bc44"}, + {file = "highspy-1.5.3-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:77b1a44cda1bc24e7d6abde51f86a70ecbc7f0ddd7c1805470b544e0d74855f2"}, + {file = "highspy-1.5.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:44ad5540e5020675002a28ec54c74199675f0ce24b151930118cd55f6620dde1"}, + {file = "highspy-1.5.3-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:80318bd948b42a7bd059576b92aa4bc0071b08f545fc4cfd77cdaa2c817ce0b2"}, + {file = "highspy-1.5.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5210b1ad8778214fb701065354df154b6d490fc885261c24fe7dcdc09f2c5c61"}, + {file = "highspy-1.5.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d0d0a9eee479c6af579bbf1d155138a46090372a7be458a193efd76b5e355fd9"}, + {file = "highspy-1.5.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:b9e20c45c5471d2b3622689f0ba7c8ee545a8233622368577a4d96deee1ca458"}, + {file = "highspy-1.5.3-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:ea54afcef3978d8412463d90319439da48f97aae27ec6934e3f5925224f8a862"}, + {file = "highspy-1.5.3-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:91dd2844475bd387bd8988085f1a8ae1bc7b0c4464b9371176b666e1a235da5f"}, + {file = "highspy-1.5.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:11297cc896961ddb83b7bbaa40a706cf531b7d29c4d28c45d85032b92ce39f27"}, + {file = "highspy-1.5.3-cp37-cp37m-win_amd64.whl", hash = "sha256:6945caab340e37e08d9c151576135b69a2bbf3bf6bfabf0f758f711a93e20905"}, + {file = "highspy-1.5.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6da1ecc88cbee5a1473f25644600471cfc9c978404ef462fb8b4c6d2d98df305"}, + {file = "highspy-1.5.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:3c4b56dee60cc96e76da255b97bb5287a3454aee12deb9323aea7a4751708ad6"}, + {file = "highspy-1.5.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:336b77165868a11954829ce9d5c3c13c5a585c24a730a67aee5745f8872b5a84"}, + {file = "highspy-1.5.3-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9dba2472914662516773171ea015af3f5d995a07f976375d47db7ea4819c4ef6"}, + {file = "highspy-1.5.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:002bf3a6e11e1d038c87522d311dce714882a080a230ff192ed579f8acfe9da2"}, + {file = "highspy-1.5.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b391a8bb36e07c7ec55a746f56676f381597a5ef31fd0be06589b7f4008dea89"}, + {file = "highspy-1.5.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e0c204cd191d8052ba377e4cf8674525cbf6dfa5903969907eb1f7e7347f8af"}, + {file = "highspy-1.5.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8f481fb2b31b99cb6fb81e88e449fc0ebb22751614a96ce9d169de7e669a8e90"}, + {file = "highspy-1.5.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:78a8f179d12e59839688a758e70b245067c848f1580fa464f5a95f3d7bee56ff"}, + {file = "highspy-1.5.3-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:1ed80950f983dcb64fbf21d67db4a4abcf5eedf11f390a65d1e537814d0c196a"}, + {file = "highspy-1.5.3-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:0097d733f8ba622bc2c07a59bea051fdd398943473647a4b5b61af17c9846d49"}, + {file = "highspy-1.5.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:258ad298b655244558285d2f14aaf652cc25d04a6a4794221fee183653239621"}, + {file = "highspy-1.5.3-cp38-cp38-win_amd64.whl", hash = "sha256:c7fc1311070481aade0de38d51bfad4b7eec8897ee597691717f97b84fc3a2cd"}, + {file = "highspy-1.5.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:63e45eff30abfcccbae96ba1f464e30d67837fb44b4e61950ce2ea5c34f95061"}, + {file = "highspy-1.5.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2ad13f130926c547efdaf1a49cdc4cf81d8774073a131ca8ece34c5315b1c4c0"}, + {file = "highspy-1.5.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cd380584d0ed9a110914753697cb5c850c883d021bdb156f4afb949b7571933"}, + {file = "highspy-1.5.3-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5a0b2277341b3869514ed4231fd5fccc4f0153029e75345122c2b93d064f547c"}, + {file = "highspy-1.5.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:02b32b8217ed20f3a85caa66129085dd6c0172241a5d954d8ee34f42c0f03c68"}, + {file = "highspy-1.5.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6fd447ffaf0140f27c15897988b109d8a5e0867d325f4023dd131e8b2a8a8300"}, + {file = "highspy-1.5.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e644409abb65995a38f736223c44c00d50e11ddd92a6fcfdbf8da16f9d10972d"}, + {file = "highspy-1.5.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:398cfdb5cb2598c0d8a3d3ceb45a150e02a88770cd1c91dc7349ce585810f8df"}, + {file = "highspy-1.5.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:fa8d6527cb6edc98f5bcf978621b8ee72e620cab85ddca9f271bdfca4af05af9"}, + {file = "highspy-1.5.3-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:11e05ee06f9a8f7a48db619dd2849edfd8bf0c6939dfb8ec696d7335ada5403c"}, + {file = "highspy-1.5.3-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:381fec14b83111c00eb82673e202d28d6cde25ba4988dd0ac347b2f7ff0114a3"}, + {file = "highspy-1.5.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:84c546a4c20f2483e3126c18085bbadb7b825386325ab330cde1e04c75a14d58"}, + {file = "highspy-1.5.3-cp39-cp39-win_amd64.whl", hash = "sha256:a9d0486e3f84a54a0638220e0612358686685a3785ee452d1fb244e358dbc428"}, + {file = "highspy-1.5.3-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:bdacc1944ee8fa432eabd1f00cbc72d8102fe509543fbea93d2a07e32f2354d1"}, + {file = "highspy-1.5.3-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f872b2703405cdfae0ea95325a5d9776b268910cd60ff3dcff5b4d6bda53e291"}, + {file = "highspy-1.5.3-pp37-pypy37_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:63f2eb7c7f71bffe0154d064adb3525de121a90e94181325cf6fdf03c7c749bf"}, + {file = "highspy-1.5.3-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:03594aa039358a7ace6044b4f9a80535c78a2ece16f3bc67abaa650e0a3da205"}, + {file = "highspy-1.5.3-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:ec0816df13e07d11ef0e018d0faf765da1b4659dce125bd3b23ca5dd0ce5cc65"}, + {file = "highspy-1.5.3-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:393278eb92b3fd98b591b02944b29003f2cfda0d68cbe2824bfa1b48854a897c"}, + {file = "highspy-1.5.3-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:691754dffc0aa229228356b4b6999cd8d135ad609cd0ea664f2d4e56b626118a"}, + {file = "highspy-1.5.3-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:120d445a83693f29dce0ecebff0869c5c62527bffe0c48ababa0cc557eab0db8"}, + {file = "highspy-1.5.3-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:269951eceee9d74d53e7420730158de94ae6eb936d474b66cda5ff4c4eee65fd"}, + {file = "highspy-1.5.3-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:af0865150282cf43aed70d8903ce2540e720d81cecfe9b1bcf8af592a700af19"}, + {file = "highspy-1.5.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:9a300e55498e8999326d32e560ef17246e9e72c75bf5107a01cc004a7d4d905b"}, + {file = "highspy-1.5.3-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:87cdade0dfee2ddf09cb593c679a4a7cd8bb8652874269e9671cc306b3bbf983"}, + {file = "highspy-1.5.3-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:d8606fa0f8f349acdd299e1da3c1d9c6a6c76f9d2a53800a9e5d6976f64f65e1"}, + {file = "highspy-1.5.3-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:118dc9186dc073cb745de13af1548e1631569cda1258015293c180c6d293c3a8"}, + {file = "highspy-1.5.3-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:65bef176259d07ebe27ef500f1898d698e760fbf4390c9e855921bd658dcfb2d"}, + {file = "highspy-1.5.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:51d9714332f31ce073a7de23fab88d6aee9ff97e0f9cf2e86a496c76f3a87ec6"}, + {file = "highspy-1.5.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:672ede763e9c3b04f167d4743b79dec13fb285ba373f24f1bbd4c59eea467016"}, +] + +[[package]] +name = "httpcore" +version = "0.16.3" +description = "A minimal low-level HTTP client." +optional = false +python-versions = ">=3.7" +files = [ + {file = "httpcore-0.16.3-py3-none-any.whl", hash = "sha256:da1fb708784a938aa084bde4feb8317056c55037247c787bd7e19eb2c2949dc0"}, + {file = "httpcore-0.16.3.tar.gz", hash = "sha256:c5d6f04e2fc530f39e0c077e6a30caa53f1451096120f1f38b954afd0b17c0cb"}, +] + +[package.dependencies] +anyio = ">=3.0,<5.0" +certifi = "*" +h11 = ">=0.13,<0.15" +sniffio = "==1.*" + +[package.extras] +http2 = ["h2 (>=3,<5)"] +socks = ["socksio (==1.*)"] + +[[package]] +name = "httpx" +version = "0.23.3" +description = "The next generation HTTP client." +optional = false +python-versions = ">=3.7" +files = [ + {file = "httpx-0.23.3-py3-none-any.whl", hash = "sha256:a211fcce9b1254ea24f0cd6af9869b3d29aba40154e947d2a07bb499b3e310d6"}, + {file = "httpx-0.23.3.tar.gz", hash = "sha256:9818458eb565bb54898ccb9b8b251a28785dd4a55afbc23d0eb410754fe7d0f9"}, +] + +[package.dependencies] +certifi = "*" +httpcore = ">=0.15.0,<0.17.0" +rfc3986 = {version = ">=1.3,<2", extras = ["idna2008"]} +sniffio = "*" + +[package.extras] +brotli = ["brotli", "brotlicffi"] +cli = ["click (==8.*)", "pygments (==2.*)", "rich (>=10,<13)"] +http2 = ["h2 (>=3,<5)"] +socks = ["socksio (==1.*)"] + +[[package]] +name = "idna" +version = "3.6" +description = "Internationalized Domain Names in Applications (IDNA)" +optional = false +python-versions = ">=3.5" +files = [ + {file = "idna-3.6-py3-none-any.whl", hash = "sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f"}, + {file = "idna-3.6.tar.gz", hash = "sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca"}, +] + +[[package]] +name = "iniconfig" +version = "2.0.0" +description = "brain-dead simple config-ini parsing" +optional = false +python-versions = ">=3.7" +files = [ + {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, + {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, +] + +[[package]] +name = "isort" +version = "5.13.2" +description = "A Python utility / library to sort Python imports." +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "isort-5.13.2-py3-none-any.whl", hash = "sha256:8ca5e72a8d85860d5a3fa69b8745237f2939afe12dbf656afbcb47fe72d947a6"}, + {file = "isort-5.13.2.tar.gz", hash = "sha256:48fdfcb9face5d58a4f6dde2e72a1fb8dcaf8ab26f95ab49fab84c2ddefb0109"}, +] + +[package.extras] +colors = ["colorama (>=0.4.6)"] + +[[package]] +name = "jsonpatch" +version = "1.33" +description = "Apply JSON-Patches (RFC 6902)" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, !=3.6.*" +files = [ + {file = "jsonpatch-1.33-py2.py3-none-any.whl", hash = "sha256:0ae28c0cd062bbd8b8ecc26d7d164fbbea9652a1a3693f3b956c1eae5145dade"}, + {file = "jsonpatch-1.33.tar.gz", hash = "sha256:9fcd4009c41e6d12348b4a0ff2563ba56a2923a7dfee731d004e212e1ee5030c"}, +] + +[package.dependencies] +jsonpointer = ">=1.9" + +[[package]] +name = "jsonpointer" +version = "2.4" +description = "Identify specific nodes in a JSON document (RFC 6901)" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, !=3.6.*" +files = [ + {file = "jsonpointer-2.4-py2.py3-none-any.whl", hash = "sha256:15d51bba20eea3165644553647711d150376234112651b4f1811022aecad7d7a"}, + {file = "jsonpointer-2.4.tar.gz", hash = "sha256:585cee82b70211fa9e6043b7bb89db6e1aa49524340dde8ad6b63206ea689d88"}, +] + +[[package]] +name = "kombu" +version = "5.3.5" +description = "Messaging library for Python." +optional = false +python-versions = ">=3.8" +files = [ + {file = "kombu-5.3.5-py3-none-any.whl", hash = "sha256:0eac1bbb464afe6fb0924b21bf79460416d25d8abc52546d4f16cad94f789488"}, + {file = "kombu-5.3.5.tar.gz", hash = "sha256:30e470f1a6b49c70dc6f6d13c3e4cc4e178aa6c469ceb6bcd55645385fc84b93"}, +] + +[package.dependencies] +amqp = ">=5.1.1,<6.0.0" +vine = "*" + +[package.extras] +azureservicebus = ["azure-servicebus (>=7.10.0)"] +azurestoragequeues = ["azure-identity (>=1.12.0)", "azure-storage-queue (>=12.6.0)"] +confluentkafka = ["confluent-kafka (>=2.2.0)"] +consul = ["python-consul2"] +librabbitmq = ["librabbitmq (>=2.0.0)"] +mongodb = ["pymongo (>=4.1.1)"] +msgpack = ["msgpack"] +pyro = ["pyro4"] +qpid = ["qpid-python (>=0.26)", "qpid-tools (>=0.26)"] +redis = ["redis (>=4.5.2,!=4.5.5,<6.0.0)"] +slmq = ["softlayer-messaging (>=1.0.3)"] +sqlalchemy = ["sqlalchemy (>=1.4.48,<2.1)"] +sqs = ["boto3 (>=1.26.143)", "pycurl (>=7.43.0.5)", "urllib3 (>=1.26.16)"] +yaml = ["PyYAML (>=3.10)"] +zookeeper = ["kazoo (>=2.8.0)"] + +[[package]] +name = "langchain" +version = "0.1.0" +description = "Building applications with LLMs through composability" +optional = false +python-versions = ">=3.8.1,<4.0" +files = [ + {file = "langchain-0.1.0-py3-none-any.whl", hash = "sha256:8652e74b039333a55c79faff4400b077ba1bd0ddce5255574e42d301c05c1733"}, + {file = "langchain-0.1.0.tar.gz", hash = "sha256:d43119f8d3fda2c8ddf8c3a19bd5b94b347e27d1867ff14a921b90bdbed0668a"}, +] + +[package.dependencies] +aiohttp = ">=3.8.3,<4.0.0" +async-timeout = {version = ">=4.0.0,<5.0.0", markers = "python_version < \"3.11\""} +dataclasses-json = ">=0.5.7,<0.7" +jsonpatch = ">=1.33,<2.0" +langchain-community = ">=0.0.9,<0.1" +langchain-core = ">=0.1.7,<0.2" +langsmith = ">=0.0.77,<0.1.0" +numpy = ">=1,<2" +pydantic = ">=1,<3" +PyYAML = ">=5.3" +requests = ">=2,<3" +SQLAlchemy = ">=1.4,<3" +tenacity = ">=8.1.0,<9.0.0" + +[package.extras] +azure = ["azure-ai-formrecognizer (>=3.2.1,<4.0.0)", "azure-ai-textanalytics (>=5.3.0,<6.0.0)", "azure-ai-vision (>=0.11.1b1,<0.12.0)", "azure-cognitiveservices-speech (>=1.28.0,<2.0.0)", "azure-core (>=1.26.4,<2.0.0)", "azure-cosmos (>=4.4.0b1,<5.0.0)", "azure-identity (>=1.12.0,<2.0.0)", "azure-search-documents (==11.4.0b8)", "openai (<2)"] +clarifai = ["clarifai (>=9.1.0)"] +cli = ["typer (>=0.9.0,<0.10.0)"] +cohere = ["cohere (>=4,<5)"] +docarray = ["docarray[hnswlib] (>=0.32.0,<0.33.0)"] +embeddings = ["sentence-transformers (>=2,<3)"] +extended-testing = ["aiosqlite (>=0.19.0,<0.20.0)", "aleph-alpha-client (>=2.15.0,<3.0.0)", "anthropic (>=0.3.11,<0.4.0)", "arxiv (>=1.4,<2.0)", "assemblyai (>=0.17.0,<0.18.0)", "atlassian-python-api (>=3.36.0,<4.0.0)", "beautifulsoup4 (>=4,<5)", "bibtexparser (>=1.4.0,<2.0.0)", "cassio (>=0.1.0,<0.2.0)", "chardet (>=5.1.0,<6.0.0)", "cohere (>=4,<5)", "couchbase (>=4.1.9,<5.0.0)", "dashvector (>=1.0.1,<2.0.0)", "databricks-vectorsearch (>=0.21,<0.22)", "datasets (>=2.15.0,<3.0.0)", "dgml-utils (>=0.3.0,<0.4.0)", "esprima (>=4.0.1,<5.0.0)", "faiss-cpu (>=1,<2)", "feedparser (>=6.0.10,<7.0.0)", "fireworks-ai (>=0.9.0,<0.10.0)", "geopandas (>=0.13.1,<0.14.0)", "gitpython (>=3.1.32,<4.0.0)", "google-cloud-documentai (>=2.20.1,<3.0.0)", "gql (>=3.4.1,<4.0.0)", "hologres-vector (>=0.0.6,<0.0.7)", "html2text (>=2020.1.16,<2021.0.0)", "javelin-sdk (>=0.1.8,<0.2.0)", "jinja2 (>=3,<4)", "jq (>=1.4.1,<2.0.0)", "jsonschema (>1)", "langchain-openai (>=0.0.2,<0.1)", "lxml (>=4.9.2,<5.0.0)", "markdownify (>=0.11.6,<0.12.0)", "motor (>=3.3.1,<4.0.0)", "msal (>=1.25.0,<2.0.0)", "mwparserfromhell (>=0.6.4,<0.7.0)", "mwxml (>=0.3.3,<0.4.0)", "newspaper3k (>=0.2.8,<0.3.0)", "numexpr (>=2.8.6,<3.0.0)", "openai (<2)", "openapi-pydantic (>=0.3.2,<0.4.0)", "pandas (>=2.0.1,<3.0.0)", "pdfminer-six (>=20221105,<20221106)", "pgvector (>=0.1.6,<0.2.0)", "praw (>=7.7.1,<8.0.0)", "psychicapi (>=0.8.0,<0.9.0)", "py-trello (>=0.19.0,<0.20.0)", "pymupdf (>=1.22.3,<2.0.0)", "pypdf (>=3.4.0,<4.0.0)", "pypdfium2 (>=4.10.0,<5.0.0)", "pyspark (>=3.4.0,<4.0.0)", "rank-bm25 (>=0.2.2,<0.3.0)", "rapidfuzz (>=3.1.1,<4.0.0)", "rapidocr-onnxruntime (>=1.3.2,<2.0.0)", "requests-toolbelt (>=1.0.0,<2.0.0)", "rspace_client (>=2.5.0,<3.0.0)", "scikit-learn (>=1.2.2,<2.0.0)", "sqlite-vss (>=0.1.2,<0.2.0)", "streamlit (>=1.18.0,<2.0.0)", "sympy (>=1.12,<2.0)", "telethon (>=1.28.5,<2.0.0)", "timescale-vector (>=0.0.1,<0.0.2)", "tqdm (>=4.48.0)", "upstash-redis (>=0.15.0,<0.16.0)", "xata (>=1.0.0a7,<2.0.0)", "xmltodict (>=0.13.0,<0.14.0)"] +javascript = ["esprima (>=4.0.1,<5.0.0)"] +llms = ["clarifai (>=9.1.0)", "cohere (>=4,<5)", "huggingface_hub (>=0,<1)", "manifest-ml (>=0.0.1,<0.0.2)", "nlpcloud (>=1,<2)", "openai (<2)", "openlm (>=0.0.5,<0.0.6)", "torch (>=1,<3)", "transformers (>=4,<5)"] +openai = ["openai (<2)", "tiktoken (>=0.3.2,<0.6.0)"] +qdrant = ["qdrant-client (>=1.3.1,<2.0.0)"] +text-helpers = ["chardet (>=5.1.0,<6.0.0)"] + +[[package]] +name = "langchain-community" +version = "0.0.11" +description = "Community contributed LangChain integrations." +optional = false +python-versions = ">=3.8.1,<4.0" +files = [ + {file = "langchain_community-0.0.11-py3-none-any.whl", hash = "sha256:30ab1d7dbf35d0ebe684d8a1e8964e8dedd3d31a3703790436b39674cfa06f41"}, + {file = "langchain_community-0.0.11.tar.gz", hash = "sha256:eaeaa8d63427ecf0cb32fe2f1ba4d05ad6d5ef9f7019baf21dc2dde5b1403002"}, +] + +[package.dependencies] +aiohttp = ">=3.8.3,<4.0.0" +dataclasses-json = ">=0.5.7,<0.7" +langchain-core = ">=0.1.8,<0.2" +langsmith = ">=0.0.63,<0.1.0" +numpy = ">=1,<2" +PyYAML = ">=5.3" +requests = ">=2,<3" +SQLAlchemy = ">=1.4,<3" +tenacity = ">=8.1.0,<9.0.0" + +[package.extras] +cli = ["typer (>=0.9.0,<0.10.0)"] +extended-testing = ["aiosqlite (>=0.19.0,<0.20.0)", "aleph-alpha-client (>=2.15.0,<3.0.0)", "anthropic (>=0.3.11,<0.4.0)", "arxiv (>=1.4,<2.0)", "assemblyai (>=0.17.0,<0.18.0)", "atlassian-python-api (>=3.36.0,<4.0.0)", "azure-ai-documentintelligence (>=1.0.0b1,<2.0.0)", "beautifulsoup4 (>=4,<5)", "bibtexparser (>=1.4.0,<2.0.0)", "cassio (>=0.1.0,<0.2.0)", "chardet (>=5.1.0,<6.0.0)", "cohere (>=4,<5)", "dashvector (>=1.0.1,<2.0.0)", "databricks-vectorsearch (>=0.21,<0.22)", "datasets (>=2.15.0,<3.0.0)", "dgml-utils (>=0.3.0,<0.4.0)", "esprima (>=4.0.1,<5.0.0)", "faiss-cpu (>=1,<2)", "feedparser (>=6.0.10,<7.0.0)", "fireworks-ai (>=0.9.0,<0.10.0)", "geopandas (>=0.13.1,<0.14.0)", "gitpython (>=3.1.32,<4.0.0)", "google-cloud-documentai (>=2.20.1,<3.0.0)", "gql (>=3.4.1,<4.0.0)", "gradientai (>=1.4.0,<2.0.0)", "hologres-vector (>=0.0.6,<0.0.7)", "html2text (>=2020.1.16,<2021.0.0)", "javelin-sdk (>=0.1.8,<0.2.0)", "jinja2 (>=3,<4)", "jq (>=1.4.1,<2.0.0)", "jsonschema (>1)", "lxml (>=4.9.2,<5.0.0)", "markdownify (>=0.11.6,<0.12.0)", "motor (>=3.3.1,<4.0.0)", "msal (>=1.25.0,<2.0.0)", "mwparserfromhell (>=0.6.4,<0.7.0)", "mwxml (>=0.3.3,<0.4.0)", "newspaper3k (>=0.2.8,<0.3.0)", "numexpr (>=2.8.6,<3.0.0)", "openai (<2)", "openapi-pydantic (>=0.3.2,<0.4.0)", "oracle-ads (>=2.9.1,<3.0.0)", "pandas (>=2.0.1,<3.0.0)", "pdfminer-six (>=20221105,<20221106)", "pgvector (>=0.1.6,<0.2.0)", "praw (>=7.7.1,<8.0.0)", "psychicapi (>=0.8.0,<0.9.0)", "py-trello (>=0.19.0,<0.20.0)", "pymupdf (>=1.22.3,<2.0.0)", "pypdf (>=3.4.0,<4.0.0)", "pypdfium2 (>=4.10.0,<5.0.0)", "pyspark (>=3.4.0,<4.0.0)", "rank-bm25 (>=0.2.2,<0.3.0)", "rapidfuzz (>=3.1.1,<4.0.0)", "rapidocr-onnxruntime (>=1.3.2,<2.0.0)", "requests-toolbelt (>=1.0.0,<2.0.0)", "rspace_client (>=2.5.0,<3.0.0)", "scikit-learn (>=1.2.2,<2.0.0)", "sqlite-vss (>=0.1.2,<0.2.0)", "streamlit (>=1.18.0,<2.0.0)", "sympy (>=1.12,<2.0)", "telethon (>=1.28.5,<2.0.0)", "timescale-vector (>=0.0.1,<0.0.2)", "tqdm (>=4.48.0)", "upstash-redis (>=0.15.0,<0.16.0)", "xata (>=1.0.0a7,<2.0.0)", "xmltodict (>=0.13.0,<0.14.0)", "zhipuai (>=1.0.7,<2.0.0)"] + +[[package]] +name = "langchain-core" +version = "0.1.12" +description = "Building applications with LLMs through composability" +optional = false +python-versions = ">=3.8.1,<4.0" +files = [ + {file = "langchain_core-0.1.12-py3-none-any.whl", hash = "sha256:d11c6262f7a9deff7de8fdf14498b8a951020dfed3a80f2358ab731ad04abef0"}, + {file = "langchain_core-0.1.12.tar.gz", hash = "sha256:f18e9300e9a07589b3e280e51befbc5a4513f535949406e55eb7a2dc40c3ce66"}, +] + +[package.dependencies] +anyio = ">=3,<5" +jsonpatch = ">=1.33,<2.0" +langsmith = ">=0.0.63,<0.1.0" +packaging = ">=23.2,<24.0" +pydantic = ">=1,<3" +PyYAML = ">=5.3" +requests = ">=2,<3" +tenacity = ">=8.1.0,<9.0.0" + +[package.extras] +extended-testing = ["jinja2 (>=3,<4)"] + +[[package]] +name = "langchain-openai" +version = "0.0.2.post1" +description = "An integration package connecting OpenAI and LangChain" +optional = false +python-versions = ">=3.8.1,<4.0" +files = [ + {file = "langchain_openai-0.0.2.post1-py3-none-any.whl", hash = "sha256:ba468b94c23da9d8ccefe5d5a3c1c65b4b9702292523e53acc689a9110022e26"}, + {file = "langchain_openai-0.0.2.post1.tar.gz", hash = "sha256:f8e78db4a663feeac71d9f036b9422406c199ea3ef4c97d99ff392c93530e073"}, +] + +[package.dependencies] +langchain-core = ">=0.1.7,<0.2" +numpy = ">=1,<2" +openai = ">=1.6.1,<2.0.0" +tiktoken = ">=0.5.2,<0.6.0" + +[[package]] +name = "langsmith" +version = "0.0.78" +description = "Client library to connect to the LangSmith LLM Tracing and Evaluation Platform." +optional = false +python-versions = ">=3.8.1,<4.0" +files = [ + {file = "langsmith-0.0.78-py3-none-any.whl", hash = "sha256:d7c8300700dde0cea87388177c2552187e87fb4ae789510712e7654db72b5c04"}, + {file = "langsmith-0.0.78.tar.gz", hash = "sha256:a7d7f1639072aeb12115a931eb6d4c53810a480a1fec90bc8744f232765f3c81"}, +] + +[package.dependencies] +pydantic = ">=1,<3" +requests = ">=2,<3" + +[[package]] +name = "mako" +version = "1.3.0" +description = "A super-fast templating language that borrows the best ideas from the existing templating languages." +optional = false +python-versions = ">=3.8" +files = [ + {file = "Mako-1.3.0-py3-none-any.whl", hash = "sha256:57d4e997349f1a92035aa25c17ace371a4213f2ca42f99bee9a602500cfd54d9"}, + {file = "Mako-1.3.0.tar.gz", hash = "sha256:e3a9d388fd00e87043edbe8792f45880ac0114e9c4adc69f6e9bfb2c55e3b11b"}, +] + +[package.dependencies] +MarkupSafe = ">=0.9.2" + +[package.extras] +babel = ["Babel"] +lingua = ["lingua"] +testing = ["pytest"] + +[[package]] +name = "markupsafe" +version = "2.1.4" +description = "Safely add untrusted strings to HTML/XML markup." +optional = false +python-versions = ">=3.7" +files = [ + {file = "MarkupSafe-2.1.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:de8153a7aae3835484ac168a9a9bdaa0c5eee4e0bc595503c95d53b942879c84"}, + {file = "MarkupSafe-2.1.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e888ff76ceb39601c59e219f281466c6d7e66bd375b4ec1ce83bcdc68306796b"}, + {file = "MarkupSafe-2.1.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0b838c37ba596fcbfca71651a104a611543077156cb0a26fe0c475e1f152ee8"}, + {file = "MarkupSafe-2.1.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dac1ebf6983148b45b5fa48593950f90ed6d1d26300604f321c74a9ca1609f8e"}, + {file = "MarkupSafe-2.1.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0fbad3d346df8f9d72622ac71b69565e621ada2ce6572f37c2eae8dacd60385d"}, + {file = "MarkupSafe-2.1.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d5291d98cd3ad9a562883468c690a2a238c4a6388ab3bd155b0c75dd55ece858"}, + {file = "MarkupSafe-2.1.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:a7cc49ef48a3c7a0005a949f3c04f8baa5409d3f663a1b36f0eba9bfe2a0396e"}, + {file = "MarkupSafe-2.1.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b83041cda633871572f0d3c41dddd5582ad7d22f65a72eacd8d3d6d00291df26"}, + {file = "MarkupSafe-2.1.4-cp310-cp310-win32.whl", hash = "sha256:0c26f67b3fe27302d3a412b85ef696792c4a2386293c53ba683a89562f9399b0"}, + {file = "MarkupSafe-2.1.4-cp310-cp310-win_amd64.whl", hash = "sha256:a76055d5cb1c23485d7ddae533229039b850db711c554a12ea64a0fd8a0129e2"}, + {file = "MarkupSafe-2.1.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9e9e3c4020aa2dc62d5dd6743a69e399ce3de58320522948af6140ac959ab863"}, + {file = "MarkupSafe-2.1.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0042d6a9880b38e1dd9ff83146cc3c9c18a059b9360ceae207805567aacccc69"}, + {file = "MarkupSafe-2.1.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:55d03fea4c4e9fd0ad75dc2e7e2b6757b80c152c032ea1d1de487461d8140efc"}, + {file = "MarkupSafe-2.1.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ab3a886a237f6e9c9f4f7d272067e712cdb4efa774bef494dccad08f39d8ae6"}, + {file = "MarkupSafe-2.1.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abf5ebbec056817057bfafc0445916bb688a255a5146f900445d081db08cbabb"}, + {file = "MarkupSafe-2.1.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e1a0d1924a5013d4f294087e00024ad25668234569289650929ab871231668e7"}, + {file = "MarkupSafe-2.1.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:e7902211afd0af05fbadcc9a312e4cf10f27b779cf1323e78d52377ae4b72bea"}, + {file = "MarkupSafe-2.1.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c669391319973e49a7c6230c218a1e3044710bc1ce4c8e6eb71f7e6d43a2c131"}, + {file = "MarkupSafe-2.1.4-cp311-cp311-win32.whl", hash = "sha256:31f57d64c336b8ccb1966d156932f3daa4fee74176b0fdc48ef580be774aae74"}, + {file = "MarkupSafe-2.1.4-cp311-cp311-win_amd64.whl", hash = "sha256:54a7e1380dfece8847c71bf7e33da5d084e9b889c75eca19100ef98027bd9f56"}, + {file = "MarkupSafe-2.1.4-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:a76cd37d229fc385738bd1ce4cba2a121cf26b53864c1772694ad0ad348e509e"}, + {file = "MarkupSafe-2.1.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:987d13fe1d23e12a66ca2073b8d2e2a75cec2ecb8eab43ff5624ba0ad42764bc"}, + {file = "MarkupSafe-2.1.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5244324676254697fe5c181fc762284e2c5fceeb1c4e3e7f6aca2b6f107e60dc"}, + {file = "MarkupSafe-2.1.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78bc995e004681246e85e28e068111a4c3f35f34e6c62da1471e844ee1446250"}, + {file = "MarkupSafe-2.1.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a4d176cfdfde84f732c4a53109b293d05883e952bbba68b857ae446fa3119b4f"}, + {file = "MarkupSafe-2.1.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:f9917691f410a2e0897d1ef99619fd3f7dd503647c8ff2475bf90c3cf222ad74"}, + {file = "MarkupSafe-2.1.4-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:f06e5a9e99b7df44640767842f414ed5d7bedaaa78cd817ce04bbd6fd86e2dd6"}, + {file = "MarkupSafe-2.1.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:396549cea79e8ca4ba65525470d534e8a41070e6b3500ce2414921099cb73e8d"}, + {file = "MarkupSafe-2.1.4-cp312-cp312-win32.whl", hash = "sha256:f6be2d708a9d0e9b0054856f07ac7070fbe1754be40ca8525d5adccdbda8f475"}, + {file = "MarkupSafe-2.1.4-cp312-cp312-win_amd64.whl", hash = "sha256:5045e892cfdaecc5b4c01822f353cf2c8feb88a6ec1c0adef2a2e705eef0f656"}, + {file = "MarkupSafe-2.1.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:7a07f40ef8f0fbc5ef1000d0c78771f4d5ca03b4953fc162749772916b298fc4"}, + {file = "MarkupSafe-2.1.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d18b66fe626ac412d96c2ab536306c736c66cf2a31c243a45025156cc190dc8a"}, + {file = "MarkupSafe-2.1.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:698e84142f3f884114ea8cf83e7a67ca8f4ace8454e78fe960646c6c91c63bfa"}, + {file = "MarkupSafe-2.1.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:49a3b78a5af63ec10d8604180380c13dcd870aba7928c1fe04e881d5c792dc4e"}, + {file = "MarkupSafe-2.1.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:15866d7f2dc60cfdde12ebb4e75e41be862348b4728300c36cdf405e258415ec"}, + {file = "MarkupSafe-2.1.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:6aa5e2e7fc9bc042ae82d8b79d795b9a62bd8f15ba1e7594e3db243f158b5565"}, + {file = "MarkupSafe-2.1.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:54635102ba3cf5da26eb6f96c4b8c53af8a9c0d97b64bdcb592596a6255d8518"}, + {file = "MarkupSafe-2.1.4-cp37-cp37m-win32.whl", hash = "sha256:3583a3a3ab7958e354dc1d25be74aee6228938312ee875a22330c4dc2e41beb0"}, + {file = "MarkupSafe-2.1.4-cp37-cp37m-win_amd64.whl", hash = "sha256:d6e427c7378c7f1b2bef6a344c925b8b63623d3321c09a237b7cc0e77dd98ceb"}, + {file = "MarkupSafe-2.1.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:bf1196dcc239e608605b716e7b166eb5faf4bc192f8a44b81e85251e62584bd2"}, + {file = "MarkupSafe-2.1.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4df98d4a9cd6a88d6a585852f56f2155c9cdb6aec78361a19f938810aa020954"}, + {file = "MarkupSafe-2.1.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b835aba863195269ea358cecc21b400276747cc977492319fd7682b8cd2c253d"}, + {file = "MarkupSafe-2.1.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:23984d1bdae01bee794267424af55eef4dfc038dc5d1272860669b2aa025c9e3"}, + {file = "MarkupSafe-2.1.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1c98c33ffe20e9a489145d97070a435ea0679fddaabcafe19982fe9c971987d5"}, + {file = "MarkupSafe-2.1.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9896fca4a8eb246defc8b2a7ac77ef7553b638e04fbf170bff78a40fa8a91474"}, + {file = "MarkupSafe-2.1.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:b0fe73bac2fed83839dbdbe6da84ae2a31c11cfc1c777a40dbd8ac8a6ed1560f"}, + {file = "MarkupSafe-2.1.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:c7556bafeaa0a50e2fe7dc86e0382dea349ebcad8f010d5a7dc6ba568eaaa789"}, + {file = "MarkupSafe-2.1.4-cp38-cp38-win32.whl", hash = "sha256:fc1a75aa8f11b87910ffd98de62b29d6520b6d6e8a3de69a70ca34dea85d2a8a"}, + {file = "MarkupSafe-2.1.4-cp38-cp38-win_amd64.whl", hash = "sha256:3a66c36a3864df95e4f62f9167c734b3b1192cb0851b43d7cc08040c074c6279"}, + {file = "MarkupSafe-2.1.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:765f036a3d00395a326df2835d8f86b637dbaf9832f90f5d196c3b8a7a5080cb"}, + {file = "MarkupSafe-2.1.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:21e7af8091007bf4bebf4521184f4880a6acab8df0df52ef9e513d8e5db23411"}, + {file = "MarkupSafe-2.1.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d5c31fe855c77cad679b302aabc42d724ed87c043b1432d457f4976add1c2c3e"}, + {file = "MarkupSafe-2.1.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7653fa39578957bc42e5ebc15cf4361d9e0ee4b702d7d5ec96cdac860953c5b4"}, + {file = "MarkupSafe-2.1.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:47bb5f0142b8b64ed1399b6b60f700a580335c8e1c57f2f15587bd072012decc"}, + {file = "MarkupSafe-2.1.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:fe8512ed897d5daf089e5bd010c3dc03bb1bdae00b35588c49b98268d4a01e00"}, + {file = "MarkupSafe-2.1.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:36d7626a8cca4d34216875aee5a1d3d654bb3dac201c1c003d182283e3205949"}, + {file = "MarkupSafe-2.1.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:b6f14a9cd50c3cb100eb94b3273131c80d102e19bb20253ac7bd7336118a673a"}, + {file = "MarkupSafe-2.1.4-cp39-cp39-win32.whl", hash = "sha256:c8f253a84dbd2c63c19590fa86a032ef3d8cc18923b8049d91bcdeeb2581fbf6"}, + {file = "MarkupSafe-2.1.4-cp39-cp39-win_amd64.whl", hash = "sha256:8b570a1537367b52396e53325769608f2a687ec9a4363647af1cded8928af959"}, + {file = "MarkupSafe-2.1.4.tar.gz", hash = "sha256:3aae9af4cac263007fd6309c64c6ab4506dd2b79382d9d19a1994f9240b8db4f"}, +] + +[[package]] +name = "marshmallow" +version = "3.20.2" +description = "A lightweight library for converting complex datatypes to and from native Python datatypes." +optional = false +python-versions = ">=3.8" +files = [ + {file = "marshmallow-3.20.2-py3-none-any.whl", hash = "sha256:c21d4b98fee747c130e6bc8f45c4b3199ea66bc00c12ee1f639f0aeca034d5e9"}, + {file = "marshmallow-3.20.2.tar.gz", hash = "sha256:4c1daff273513dc5eb24b219a8035559dc573c8f322558ef85f5438ddd1236dd"}, +] + +[package.dependencies] +packaging = ">=17.0" + +[package.extras] +dev = ["pre-commit (>=2.4,<4.0)", "pytest", "pytz", "simplejson", "tox"] +docs = ["alabaster (==0.7.15)", "autodocsumm (==0.2.12)", "sphinx (==7.2.6)", "sphinx-issues (==3.0.1)", "sphinx-version-warning (==1.1.2)"] +lint = ["pre-commit (>=2.4,<4.0)"] +tests = ["pytest", "pytz", "simplejson"] + +[[package]] +name = "mccabe" +version = "0.7.0" +description = "McCabe checker, plugin for flake8" +optional = false +python-versions = ">=3.6" +files = [ + {file = "mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"}, + {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, +] + +[[package]] +name = "minio" +version = "7.2.3" +description = "MinIO Python SDK for Amazon S3 Compatible Cloud Storage" +optional = false +python-versions = "*" +files = [ + {file = "minio-7.2.3-py3-none-any.whl", hash = "sha256:e6b5ce0a9b4368da50118c3f0c4df5dbf33885d44d77fce6c0aa1c485e6af7a1"}, + {file = "minio-7.2.3.tar.gz", hash = "sha256:4971dfb1a71eeefd38e1ce2dc7edc4e6eb0f07f1c1d6d70c15457e3280cfc4b9"}, +] + +[package.dependencies] +argon2-cffi = "*" +certifi = "*" +pycryptodome = "*" +typing-extensions = "*" +urllib3 = "*" + +[[package]] +name = "multidict" +version = "6.0.4" +description = "multidict implementation" +optional = false +python-versions = ">=3.7" +files = [ + {file = "multidict-6.0.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b1a97283e0c85772d613878028fec909f003993e1007eafa715b24b377cb9b8"}, + {file = "multidict-6.0.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:eeb6dcc05e911516ae3d1f207d4b0520d07f54484c49dfc294d6e7d63b734171"}, + {file = "multidict-6.0.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d6d635d5209b82a3492508cf5b365f3446afb65ae7ebd755e70e18f287b0adf7"}, + {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c048099e4c9e9d615545e2001d3d8a4380bd403e1a0578734e0d31703d1b0c0b"}, + {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ea20853c6dbbb53ed34cb4d080382169b6f4554d394015f1bef35e881bf83547"}, + {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:16d232d4e5396c2efbbf4f6d4df89bfa905eb0d4dc5b3549d872ab898451f569"}, + {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:36c63aaa167f6c6b04ef2c85704e93af16c11d20de1d133e39de6a0e84582a93"}, + {file = "multidict-6.0.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:64bdf1086b6043bf519869678f5f2757f473dee970d7abf6da91ec00acb9cb98"}, + {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:43644e38f42e3af682690876cff722d301ac585c5b9e1eacc013b7a3f7b696a0"}, + {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:7582a1d1030e15422262de9f58711774e02fa80df0d1578995c76214f6954988"}, + {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:ddff9c4e225a63a5afab9dd15590432c22e8057e1a9a13d28ed128ecf047bbdc"}, + {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:ee2a1ece51b9b9e7752e742cfb661d2a29e7bcdba2d27e66e28a99f1890e4fa0"}, + {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a2e4369eb3d47d2034032a26c7a80fcb21a2cb22e1173d761a162f11e562caa5"}, + {file = "multidict-6.0.4-cp310-cp310-win32.whl", hash = "sha256:574b7eae1ab267e5f8285f0fe881f17efe4b98c39a40858247720935b893bba8"}, + {file = "multidict-6.0.4-cp310-cp310-win_amd64.whl", hash = "sha256:4dcbb0906e38440fa3e325df2359ac6cb043df8e58c965bb45f4e406ecb162cc"}, + {file = "multidict-6.0.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0dfad7a5a1e39c53ed00d2dd0c2e36aed4650936dc18fd9a1826a5ae1cad6f03"}, + {file = "multidict-6.0.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:64da238a09d6039e3bd39bb3aee9c21a5e34f28bfa5aa22518581f910ff94af3"}, + {file = "multidict-6.0.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ff959bee35038c4624250473988b24f846cbeb2c6639de3602c073f10410ceba"}, + {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:01a3a55bd90018c9c080fbb0b9f4891db37d148a0a18722b42f94694f8b6d4c9"}, + {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c5cb09abb18c1ea940fb99360ea0396f34d46566f157122c92dfa069d3e0e982"}, + {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:666daae833559deb2d609afa4490b85830ab0dfca811a98b70a205621a6109fe"}, + {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11bdf3f5e1518b24530b8241529d2050014c884cf18b6fc69c0c2b30ca248710"}, + {file = "multidict-6.0.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7d18748f2d30f94f498e852c67d61261c643b349b9d2a581131725595c45ec6c"}, + {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:458f37be2d9e4c95e2d8866a851663cbc76e865b78395090786f6cd9b3bbf4f4"}, + {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:b1a2eeedcead3a41694130495593a559a668f382eee0727352b9a41e1c45759a"}, + {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7d6ae9d593ef8641544d6263c7fa6408cc90370c8cb2bbb65f8d43e5b0351d9c"}, + {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:5979b5632c3e3534e42ca6ff856bb24b2e3071b37861c2c727ce220d80eee9ed"}, + {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:dcfe792765fab89c365123c81046ad4103fcabbc4f56d1c1997e6715e8015461"}, + {file = "multidict-6.0.4-cp311-cp311-win32.whl", hash = "sha256:3601a3cece3819534b11d4efc1eb76047488fddd0c85a3948099d5da4d504636"}, + {file = "multidict-6.0.4-cp311-cp311-win_amd64.whl", hash = "sha256:81a4f0b34bd92df3da93315c6a59034df95866014ac08535fc819f043bfd51f0"}, + {file = "multidict-6.0.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:67040058f37a2a51ed8ea8f6b0e6ee5bd78ca67f169ce6122f3e2ec80dfe9b78"}, + {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:853888594621e6604c978ce2a0444a1e6e70c8d253ab65ba11657659dcc9100f"}, + {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:39ff62e7d0f26c248b15e364517a72932a611a9b75f35b45be078d81bdb86603"}, + {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:af048912e045a2dc732847d33821a9d84ba553f5c5f028adbd364dd4765092ac"}, + {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1e8b901e607795ec06c9e42530788c45ac21ef3aaa11dbd0c69de543bfb79a9"}, + {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:62501642008a8b9871ddfccbf83e4222cf8ac0d5aeedf73da36153ef2ec222d2"}, + {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:99b76c052e9f1bc0721f7541e5e8c05db3941eb9ebe7b8553c625ef88d6eefde"}, + {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:509eac6cf09c794aa27bcacfd4d62c885cce62bef7b2c3e8b2e49d365b5003fe"}, + {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:21a12c4eb6ddc9952c415f24eef97e3e55ba3af61f67c7bc388dcdec1404a067"}, + {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:5cad9430ab3e2e4fa4a2ef4450f548768400a2ac635841bc2a56a2052cdbeb87"}, + {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ab55edc2e84460694295f401215f4a58597f8f7c9466faec545093045476327d"}, + {file = "multidict-6.0.4-cp37-cp37m-win32.whl", hash = "sha256:5a4dcf02b908c3b8b17a45fb0f15b695bf117a67b76b7ad18b73cf8e92608775"}, + {file = "multidict-6.0.4-cp37-cp37m-win_amd64.whl", hash = "sha256:6ed5f161328b7df384d71b07317f4d8656434e34591f20552c7bcef27b0ab88e"}, + {file = "multidict-6.0.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5fc1b16f586f049820c5c5b17bb4ee7583092fa0d1c4e28b5239181ff9532e0c"}, + {file = "multidict-6.0.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1502e24330eb681bdaa3eb70d6358e818e8e8f908a22a1851dfd4e15bc2f8161"}, + {file = "multidict-6.0.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b692f419760c0e65d060959df05f2a531945af31fda0c8a3b3195d4efd06de11"}, + {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45e1ecb0379bfaab5eef059f50115b54571acfbe422a14f668fc8c27ba410e7e"}, + {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ddd3915998d93fbcd2566ddf9cf62cdb35c9e093075f862935573d265cf8f65d"}, + {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:59d43b61c59d82f2effb39a93c48b845efe23a3852d201ed2d24ba830d0b4cf2"}, + {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc8e1d0c705233c5dd0c5e6460fbad7827d5d36f310a0fadfd45cc3029762258"}, + {file = "multidict-6.0.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d6aa0418fcc838522256761b3415822626f866758ee0bc6632c9486b179d0b52"}, + {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6748717bb10339c4760c1e63da040f5f29f5ed6e59d76daee30305894069a660"}, + {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:4d1a3d7ef5e96b1c9e92f973e43aa5e5b96c659c9bc3124acbbd81b0b9c8a951"}, + {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4372381634485bec7e46718edc71528024fcdc6f835baefe517b34a33c731d60"}, + {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:fc35cb4676846ef752816d5be2193a1e8367b4c1397b74a565a9d0389c433a1d"}, + {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:4b9d9e4e2b37daddb5c23ea33a3417901fa7c7b3dee2d855f63ee67a0b21e5b1"}, + {file = "multidict-6.0.4-cp38-cp38-win32.whl", hash = "sha256:e41b7e2b59679edfa309e8db64fdf22399eec4b0b24694e1b2104fb789207779"}, + {file = "multidict-6.0.4-cp38-cp38-win_amd64.whl", hash = "sha256:d6c254ba6e45d8e72739281ebc46ea5eb5f101234f3ce171f0e9f5cc86991480"}, + {file = "multidict-6.0.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:16ab77bbeb596e14212e7bab8429f24c1579234a3a462105cda4a66904998664"}, + {file = "multidict-6.0.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bc779e9e6f7fda81b3f9aa58e3a6091d49ad528b11ed19f6621408806204ad35"}, + {file = "multidict-6.0.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4ceef517eca3e03c1cceb22030a3e39cb399ac86bff4e426d4fc6ae49052cc60"}, + {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:281af09f488903fde97923c7744bb001a9b23b039a909460d0f14edc7bf59706"}, + {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:52f2dffc8acaba9a2f27174c41c9e57f60b907bb9f096b36b1a1f3be71c6284d"}, + {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b41156839806aecb3641f3208c0dafd3ac7775b9c4c422d82ee2a45c34ba81ca"}, + {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d5e3fc56f88cc98ef8139255cf8cd63eb2c586531e43310ff859d6bb3a6b51f1"}, + {file = "multidict-6.0.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8316a77808c501004802f9beebde51c9f857054a0c871bd6da8280e718444449"}, + {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f70b98cd94886b49d91170ef23ec5c0e8ebb6f242d734ed7ed677b24d50c82cf"}, + {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bf6774e60d67a9efe02b3616fee22441d86fab4c6d335f9d2051d19d90a40063"}, + {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:e69924bfcdda39b722ef4d9aa762b2dd38e4632b3641b1d9a57ca9cd18f2f83a"}, + {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:6b181d8c23da913d4ff585afd1155a0e1194c0b50c54fcfe286f70cdaf2b7176"}, + {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:52509b5be062d9eafc8170e53026fbc54cf3b32759a23d07fd935fb04fc22d95"}, + {file = "multidict-6.0.4-cp39-cp39-win32.whl", hash = "sha256:27c523fbfbdfd19c6867af7346332b62b586eed663887392cff78d614f9ec313"}, + {file = "multidict-6.0.4-cp39-cp39-win_amd64.whl", hash = "sha256:33029f5734336aa0d4c0384525da0387ef89148dc7191aae00ca5fb23d7aafc2"}, + {file = "multidict-6.0.4.tar.gz", hash = "sha256:3666906492efb76453c0e7b97f2cf459b0682e7402c0489a95484965dbc1da49"}, +] + +[[package]] +name = "mypy" +version = "1.8.0" +description = "Optional static typing for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "mypy-1.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:485a8942f671120f76afffff70f259e1cd0f0cfe08f81c05d8816d958d4577d3"}, + {file = "mypy-1.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:df9824ac11deaf007443e7ed2a4a26bebff98d2bc43c6da21b2b64185da011c4"}, + {file = "mypy-1.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2afecd6354bbfb6e0160f4e4ad9ba6e4e003b767dd80d85516e71f2e955ab50d"}, + {file = "mypy-1.8.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8963b83d53ee733a6e4196954502b33567ad07dfd74851f32be18eb932fb1cb9"}, + {file = "mypy-1.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:e46f44b54ebddbeedbd3d5b289a893219065ef805d95094d16a0af6630f5d410"}, + {file = "mypy-1.8.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:855fe27b80375e5c5878492f0729540db47b186509c98dae341254c8f45f42ae"}, + {file = "mypy-1.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4c886c6cce2d070bd7df4ec4a05a13ee20c0aa60cb587e8d1265b6c03cf91da3"}, + {file = "mypy-1.8.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d19c413b3c07cbecf1f991e2221746b0d2a9410b59cb3f4fb9557f0365a1a817"}, + {file = "mypy-1.8.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9261ed810972061388918c83c3f5cd46079d875026ba97380f3e3978a72f503d"}, + {file = "mypy-1.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:51720c776d148bad2372ca21ca29256ed483aa9a4cdefefcef49006dff2a6835"}, + {file = "mypy-1.8.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:52825b01f5c4c1c4eb0db253ec09c7aa17e1a7304d247c48b6f3599ef40db8bd"}, + {file = "mypy-1.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f5ac9a4eeb1ec0f1ccdc6f326bcdb464de5f80eb07fb38b5ddd7b0de6bc61e55"}, + {file = "mypy-1.8.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afe3fe972c645b4632c563d3f3eff1cdca2fa058f730df2b93a35e3b0c538218"}, + {file = "mypy-1.8.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:42c6680d256ab35637ef88891c6bd02514ccb7e1122133ac96055ff458f93fc3"}, + {file = "mypy-1.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:720a5ca70e136b675af3af63db533c1c8c9181314d207568bbe79051f122669e"}, + {file = "mypy-1.8.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:028cf9f2cae89e202d7b6593cd98db6759379f17a319b5faf4f9978d7084cdc6"}, + {file = "mypy-1.8.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4e6d97288757e1ddba10dd9549ac27982e3e74a49d8d0179fc14d4365c7add66"}, + {file = "mypy-1.8.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f1478736fcebb90f97e40aff11a5f253af890c845ee0c850fe80aa060a267c6"}, + {file = "mypy-1.8.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:42419861b43e6962a649068a61f4a4839205a3ef525b858377a960b9e2de6e0d"}, + {file = "mypy-1.8.0-cp38-cp38-win_amd64.whl", hash = "sha256:2b5b6c721bd4aabaadead3a5e6fa85c11c6c795e0c81a7215776ef8afc66de02"}, + {file = "mypy-1.8.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5c1538c38584029352878a0466f03a8ee7547d7bd9f641f57a0f3017a7c905b8"}, + {file = "mypy-1.8.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4ef4be7baf08a203170f29e89d79064463b7fc7a0908b9d0d5114e8009c3a259"}, + {file = "mypy-1.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7178def594014aa6c35a8ff411cf37d682f428b3b5617ca79029d8ae72f5402b"}, + {file = "mypy-1.8.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ab3c84fa13c04aeeeabb2a7f67a25ef5d77ac9d6486ff33ded762ef353aa5592"}, + {file = "mypy-1.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:99b00bc72855812a60d253420d8a2eae839b0afa4938f09f4d2aa9bb4654263a"}, + {file = "mypy-1.8.0-py3-none-any.whl", hash = "sha256:538fd81bb5e430cc1381a443971c0475582ff9f434c16cd46d2c66763ce85d9d"}, + {file = "mypy-1.8.0.tar.gz", hash = "sha256:6ff8b244d7085a0b425b56d327b480c3b29cafbd2eff27316a004f9a7391ae07"}, +] + +[package.dependencies] +mypy-extensions = ">=1.0.0" +tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} +typing-extensions = ">=4.1.0" + +[package.extras] +dmypy = ["psutil (>=4.0)"] +install-types = ["pip"] +mypyc = ["setuptools (>=50)"] +reports = ["lxml"] + +[[package]] +name = "mypy-extensions" +version = "1.0.0" +description = "Type system extensions for programs checked with the mypy type checker." +optional = false +python-versions = ">=3.5" +files = [ + {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, + {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, +] + +[[package]] +name = "numpy" +version = "1.26.3" +description = "Fundamental package for array computing in Python" +optional = false +python-versions = ">=3.9" +files = [ + {file = "numpy-1.26.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:806dd64230dbbfaca8a27faa64e2f414bf1c6622ab78cc4264f7f5f028fee3bf"}, + {file = "numpy-1.26.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:02f98011ba4ab17f46f80f7f8f1c291ee7d855fcef0a5a98db80767a468c85cd"}, + {file = "numpy-1.26.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6d45b3ec2faed4baca41c76617fcdcfa4f684ff7a151ce6fc78ad3b6e85af0a6"}, + {file = "numpy-1.26.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bdd2b45bf079d9ad90377048e2747a0c82351989a2165821f0c96831b4a2a54b"}, + {file = "numpy-1.26.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:211ddd1e94817ed2d175b60b6374120244a4dd2287f4ece45d49228b4d529178"}, + {file = "numpy-1.26.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b1240f767f69d7c4c8a29adde2310b871153df9b26b5cb2b54a561ac85146485"}, + {file = "numpy-1.26.3-cp310-cp310-win32.whl", hash = "sha256:21a9484e75ad018974a2fdaa216524d64ed4212e418e0a551a2d83403b0531d3"}, + {file = "numpy-1.26.3-cp310-cp310-win_amd64.whl", hash = "sha256:9e1591f6ae98bcfac2a4bbf9221c0b92ab49762228f38287f6eeb5f3f55905ce"}, + {file = "numpy-1.26.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b831295e5472954104ecb46cd98c08b98b49c69fdb7040483aff799a755a7374"}, + {file = "numpy-1.26.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9e87562b91f68dd8b1c39149d0323b42e0082db7ddb8e934ab4c292094d575d6"}, + {file = "numpy-1.26.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c66d6fec467e8c0f975818c1796d25c53521124b7cfb760114be0abad53a0a2"}, + {file = "numpy-1.26.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f25e2811a9c932e43943a2615e65fc487a0b6b49218899e62e426e7f0a57eeda"}, + {file = "numpy-1.26.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:af36e0aa45e25c9f57bf684b1175e59ea05d9a7d3e8e87b7ae1a1da246f2767e"}, + {file = "numpy-1.26.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:51c7f1b344f302067b02e0f5b5d2daa9ed4a721cf49f070280ac202738ea7f00"}, + {file = "numpy-1.26.3-cp311-cp311-win32.whl", hash = "sha256:7ca4f24341df071877849eb2034948459ce3a07915c2734f1abb4018d9c49d7b"}, + {file = "numpy-1.26.3-cp311-cp311-win_amd64.whl", hash = "sha256:39763aee6dfdd4878032361b30b2b12593fb445ddb66bbac802e2113eb8a6ac4"}, + {file = "numpy-1.26.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:a7081fd19a6d573e1a05e600c82a1c421011db7935ed0d5c483e9dd96b99cf13"}, + {file = "numpy-1.26.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:12c70ac274b32bc00c7f61b515126c9205323703abb99cd41836e8125ea0043e"}, + {file = "numpy-1.26.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7f784e13e598e9594750b2ef6729bcd5a47f6cfe4a12cca13def35e06d8163e3"}, + {file = "numpy-1.26.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5f24750ef94d56ce6e33e4019a8a4d68cfdb1ef661a52cdaee628a56d2437419"}, + {file = "numpy-1.26.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:77810ef29e0fb1d289d225cabb9ee6cf4d11978a00bb99f7f8ec2132a84e0166"}, + {file = "numpy-1.26.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8ed07a90f5450d99dad60d3799f9c03c6566709bd53b497eb9ccad9a55867f36"}, + {file = "numpy-1.26.3-cp312-cp312-win32.whl", hash = "sha256:f73497e8c38295aaa4741bdfa4fda1a5aedda5473074369eca10626835445511"}, + {file = "numpy-1.26.3-cp312-cp312-win_amd64.whl", hash = "sha256:da4b0c6c699a0ad73c810736303f7fbae483bcb012e38d7eb06a5e3b432c981b"}, + {file = "numpy-1.26.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1666f634cb3c80ccbd77ec97bc17337718f56d6658acf5d3b906ca03e90ce87f"}, + {file = "numpy-1.26.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:18c3319a7d39b2c6a9e3bb75aab2304ab79a811ac0168a671a62e6346c29b03f"}, + {file = "numpy-1.26.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b7e807d6888da0db6e7e75838444d62495e2b588b99e90dd80c3459594e857b"}, + {file = "numpy-1.26.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b4d362e17bcb0011738c2d83e0a65ea8ce627057b2fdda37678f4374a382a137"}, + {file = "numpy-1.26.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b8c275f0ae90069496068c714387b4a0eba5d531aace269559ff2b43655edd58"}, + {file = "numpy-1.26.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:cc0743f0302b94f397a4a65a660d4cd24267439eb16493fb3caad2e4389bccbb"}, + {file = "numpy-1.26.3-cp39-cp39-win32.whl", hash = "sha256:9bc6d1a7f8cedd519c4b7b1156d98e051b726bf160715b769106661d567b3f03"}, + {file = "numpy-1.26.3-cp39-cp39-win_amd64.whl", hash = "sha256:867e3644e208c8922a3be26fc6bbf112a035f50f0a86497f98f228c50c607bb2"}, + {file = "numpy-1.26.3-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3c67423b3703f8fbd90f5adaa37f85b5794d3366948efe9a5190a5f3a83fc34e"}, + {file = "numpy-1.26.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:46f47ee566d98849323f01b349d58f2557f02167ee301e5e28809a8c0e27a2d0"}, + {file = "numpy-1.26.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a8474703bffc65ca15853d5fd4d06b18138ae90c17c8d12169968e998e448bb5"}, + {file = "numpy-1.26.3.tar.gz", hash = "sha256:697df43e2b6310ecc9d95f05d5ef20eacc09c7c4ecc9da3f235d39e71b7da1e4"}, +] + +[[package]] +name = "openai" +version = "1.10.0" +description = "The official Python library for the openai API" +optional = false +python-versions = ">=3.7.1" +files = [ + {file = "openai-1.10.0-py3-none-any.whl", hash = "sha256:aa69e97d0223ace9835fbf9c997abe9ee95318f684fd2de6d02c870700c71ebc"}, + {file = "openai-1.10.0.tar.gz", hash = "sha256:208886cb501b930dc63f48d51db9c15e5380380f80516d07332adad67c9f1053"}, +] + +[package.dependencies] +anyio = ">=3.5.0,<5" +distro = ">=1.7.0,<2" +httpx = ">=0.23.0,<1" +pydantic = ">=1.9.0,<3" +sniffio = "*" +tqdm = ">4" +typing-extensions = ">=4.7,<5" + +[package.extras] +datalib = ["numpy (>=1)", "pandas (>=1.2.3)", "pandas-stubs (>=1.1.0.11)"] + +[[package]] +name = "openpyxl" +version = "3.1.2" +description = "A Python library to read/write Excel 2010 xlsx/xlsm files" +optional = false +python-versions = ">=3.6" +files = [ + {file = "openpyxl-3.1.2-py2.py3-none-any.whl", hash = "sha256:f91456ead12ab3c6c2e9491cf33ba6d08357d802192379bb482f1033ade496f5"}, + {file = "openpyxl-3.1.2.tar.gz", hash = "sha256:a6f5977418eff3b2d5500d54d9db50c8277a368436f4e4f8ddb1be3422870184"}, +] + +[package.dependencies] +et-xmlfile = "*" + +[[package]] +name = "packaging" +version = "23.2" +description = "Core utilities for Python packages" +optional = false +python-versions = ">=3.7" +files = [ + {file = "packaging-23.2-py3-none-any.whl", hash = "sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7"}, + {file = "packaging-23.2.tar.gz", hash = "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5"}, +] + +[[package]] +name = "pandas" +version = "2.2.0" +description = "Powerful data structures for data analysis, time series, and statistics" +optional = false +python-versions = ">=3.9" +files = [ + {file = "pandas-2.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8108ee1712bb4fa2c16981fba7e68b3f6ea330277f5ca34fa8d557e986a11670"}, + {file = "pandas-2.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:736da9ad4033aeab51d067fc3bd69a0ba36f5a60f66a527b3d72e2030e63280a"}, + {file = "pandas-2.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:38e0b4fc3ddceb56ec8a287313bc22abe17ab0eb184069f08fc6a9352a769b18"}, + {file = "pandas-2.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:20404d2adefe92aed3b38da41d0847a143a09be982a31b85bc7dd565bdba0f4e"}, + {file = "pandas-2.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:7ea3ee3f125032bfcade3a4cf85131ed064b4f8dd23e5ce6fa16473e48ebcaf5"}, + {file = "pandas-2.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f9670b3ac00a387620489dfc1bca66db47a787f4e55911f1293063a78b108df1"}, + {file = "pandas-2.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:5a946f210383c7e6d16312d30b238fd508d80d927014f3b33fb5b15c2f895430"}, + {file = "pandas-2.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a1b438fa26b208005c997e78672f1aa8138f67002e833312e6230f3e57fa87d5"}, + {file = "pandas-2.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8ce2fbc8d9bf303ce54a476116165220a1fedf15985b09656b4b4275300e920b"}, + {file = "pandas-2.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2707514a7bec41a4ab81f2ccce8b382961a29fbe9492eab1305bb075b2b1ff4f"}, + {file = "pandas-2.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85793cbdc2d5bc32620dc8ffa715423f0c680dacacf55056ba13454a5be5de88"}, + {file = "pandas-2.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:cfd6c2491dc821b10c716ad6776e7ab311f7df5d16038d0b7458bc0b67dc10f3"}, + {file = "pandas-2.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:a146b9dcacc3123aa2b399df1a284de5f46287a4ab4fbfc237eac98a92ebcb71"}, + {file = "pandas-2.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:fbc1b53c0e1fdf16388c33c3cca160f798d38aea2978004dd3f4d3dec56454c9"}, + {file = "pandas-2.2.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:a41d06f308a024981dcaa6c41f2f2be46a6b186b902c94c2674e8cb5c42985bc"}, + {file = "pandas-2.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:159205c99d7a5ce89ecfc37cb08ed179de7783737cea403b295b5eda8e9c56d1"}, + {file = "pandas-2.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eb1e1f3861ea9132b32f2133788f3b14911b68102d562715d71bd0013bc45440"}, + {file = "pandas-2.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:761cb99b42a69005dec2b08854fb1d4888fdf7b05db23a8c5a099e4b886a2106"}, + {file = "pandas-2.2.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:a20628faaf444da122b2a64b1e5360cde100ee6283ae8effa0d8745153809a2e"}, + {file = "pandas-2.2.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:f5be5d03ea2073627e7111f61b9f1f0d9625dc3c4d8dda72cc827b0c58a1d042"}, + {file = "pandas-2.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:a626795722d893ed6aacb64d2401d017ddc8a2341b49e0384ab9bf7112bdec30"}, + {file = "pandas-2.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9f66419d4a41132eb7e9a73dcec9486cf5019f52d90dd35547af11bc58f8637d"}, + {file = "pandas-2.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:57abcaeda83fb80d447f28ab0cc7b32b13978f6f733875ebd1ed14f8fbc0f4ab"}, + {file = "pandas-2.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e60f1f7dba3c2d5ca159e18c46a34e7ca7247a73b5dd1a22b6d59707ed6b899a"}, + {file = "pandas-2.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eb61dc8567b798b969bcc1fc964788f5a68214d333cade8319c7ab33e2b5d88a"}, + {file = "pandas-2.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:52826b5f4ed658fa2b729264d63f6732b8b29949c7fd234510d57c61dbeadfcd"}, + {file = "pandas-2.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:bde2bc699dbd80d7bc7f9cab1e23a95c4375de615860ca089f34e7c64f4a8de7"}, + {file = "pandas-2.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:3de918a754bbf2da2381e8a3dcc45eede8cd7775b047b923f9006d5f876802ae"}, + {file = "pandas-2.2.0.tar.gz", hash = "sha256:30b83f7c3eb217fb4d1b494a57a2fda5444f17834f5df2de6b2ffff68dc3c8e2"}, +] + +[package.dependencies] +numpy = [ + {version = ">=1.22.4,<2", markers = "python_version < \"3.11\""}, + {version = ">=1.23.2,<2", markers = "python_version == \"3.11\""}, +] +python-dateutil = ">=2.8.2" +pytz = ">=2020.1" +tzdata = ">=2022.7" + +[package.extras] +all = ["PyQt5 (>=5.15.9)", "SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "adbc-driver-sqlite (>=0.8.0)", "beautifulsoup4 (>=4.11.2)", "bottleneck (>=1.3.6)", "dataframe-api-compat (>=0.1.7)", "fastparquet (>=2022.12.0)", "fsspec (>=2022.11.0)", "gcsfs (>=2022.11.0)", "html5lib (>=1.1)", "hypothesis (>=6.46.1)", "jinja2 (>=3.1.2)", "lxml (>=4.9.2)", "matplotlib (>=3.6.3)", "numba (>=0.56.4)", "numexpr (>=2.8.4)", "odfpy (>=1.4.1)", "openpyxl (>=3.1.0)", "pandas-gbq (>=0.19.0)", "psycopg2 (>=2.9.6)", "pyarrow (>=10.0.1)", "pymysql (>=1.0.2)", "pyreadstat (>=1.2.0)", "pytest (>=7.3.2)", "pytest-xdist (>=2.2.0)", "python-calamine (>=0.1.7)", "pyxlsb (>=1.0.10)", "qtpy (>=2.3.0)", "s3fs (>=2022.11.0)", "scipy (>=1.10.0)", "tables (>=3.8.0)", "tabulate (>=0.9.0)", "xarray (>=2022.12.0)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.0.5)", "zstandard (>=0.19.0)"] +aws = ["s3fs (>=2022.11.0)"] +clipboard = ["PyQt5 (>=5.15.9)", "qtpy (>=2.3.0)"] +compression = ["zstandard (>=0.19.0)"] +computation = ["scipy (>=1.10.0)", "xarray (>=2022.12.0)"] +consortium-standard = ["dataframe-api-compat (>=0.1.7)"] +excel = ["odfpy (>=1.4.1)", "openpyxl (>=3.1.0)", "python-calamine (>=0.1.7)", "pyxlsb (>=1.0.10)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.0.5)"] +feather = ["pyarrow (>=10.0.1)"] +fss = ["fsspec (>=2022.11.0)"] +gcp = ["gcsfs (>=2022.11.0)", "pandas-gbq (>=0.19.0)"] +hdf5 = ["tables (>=3.8.0)"] +html = ["beautifulsoup4 (>=4.11.2)", "html5lib (>=1.1)", "lxml (>=4.9.2)"] +mysql = ["SQLAlchemy (>=2.0.0)", "pymysql (>=1.0.2)"] +output-formatting = ["jinja2 (>=3.1.2)", "tabulate (>=0.9.0)"] +parquet = ["pyarrow (>=10.0.1)"] +performance = ["bottleneck (>=1.3.6)", "numba (>=0.56.4)", "numexpr (>=2.8.4)"] +plot = ["matplotlib (>=3.6.3)"] +postgresql = ["SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "psycopg2 (>=2.9.6)"] +spss = ["pyreadstat (>=1.2.0)"] +sql-other = ["SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "adbc-driver-sqlite (>=0.8.0)"] +test = ["hypothesis (>=6.46.1)", "pytest (>=7.3.2)", "pytest-xdist (>=2.2.0)"] +xml = ["lxml (>=4.9.2)"] + +[[package]] +name = "pandas-stubs" +version = "2.1.4.231227" +description = "Type annotations for pandas" +optional = false +python-versions = ">=3.9" +files = [ + {file = "pandas_stubs-2.1.4.231227-py3-none-any.whl", hash = "sha256:211fc23e6ae87073bdf41dbf362c4a4d85e1e3477cb078dbac3da6c7fdaefba8"}, + {file = "pandas_stubs-2.1.4.231227.tar.gz", hash = "sha256:3ea29ef001e9e44985f5ebde02d4413f94891ef6ec7e5056fb07d125be796c23"}, +] + +[package.dependencies] +numpy = {version = ">=1.26.0", markers = "python_version < \"3.13\""} +types-pytz = ">=2022.1.1" + +[[package]] +name = "passlib" +version = "1.7.4" +description = "comprehensive password hashing framework supporting over 30 schemes" +optional = false +python-versions = "*" +files = [ + {file = "passlib-1.7.4-py2.py3-none-any.whl", hash = "sha256:aa6bca462b8d8bda89c70b382f0c298a20b5560af6cbfa2dce410c0a2fb669f1"}, + {file = "passlib-1.7.4.tar.gz", hash = "sha256:defd50f72b65c5402ab2c573830a6978e5f202ad0d984793c8dde2c4152ebe04"}, +] + +[package.extras] +argon2 = ["argon2-cffi (>=18.2.0)"] +bcrypt = ["bcrypt (>=3.1.0)"] +build-docs = ["cloud-sptheme (>=1.10.1)", "sphinx (>=1.6)", "sphinxcontrib-fulltoc (>=1.2.0)"] +totp = ["cryptography"] + +[[package]] +name = "pathspec" +version = "0.12.1" +description = "Utility library for gitignore style pattern matching of file paths." +optional = false +python-versions = ">=3.8" +files = [ + {file = "pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08"}, + {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"}, +] + +[[package]] +name = "pendulum" +version = "3.0.0" +description = "Python datetimes made easy" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pendulum-3.0.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:2cf9e53ef11668e07f73190c805dbdf07a1939c3298b78d5a9203a86775d1bfd"}, + {file = "pendulum-3.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fb551b9b5e6059377889d2d878d940fd0bbb80ae4810543db18e6f77b02c5ef6"}, + {file = "pendulum-3.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c58227ac260d5b01fc1025176d7b31858c9f62595737f350d22124a9a3ad82d"}, + {file = "pendulum-3.0.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:60fb6f415fea93a11c52578eaa10594568a6716602be8430b167eb0d730f3332"}, + {file = "pendulum-3.0.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b69f6b4dbcb86f2c2fe696ba991e67347bcf87fe601362a1aba6431454b46bde"}, + {file = "pendulum-3.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:138afa9c373ee450ede206db5a5e9004fd3011b3c6bbe1e57015395cd076a09f"}, + {file = "pendulum-3.0.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:83d9031f39c6da9677164241fd0d37fbfc9dc8ade7043b5d6d62f56e81af8ad2"}, + {file = "pendulum-3.0.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0c2308af4033fa534f089595bcd40a95a39988ce4059ccd3dc6acb9ef14ca44a"}, + {file = "pendulum-3.0.0-cp310-none-win_amd64.whl", hash = "sha256:9a59637cdb8462bdf2dbcb9d389518c0263799189d773ad5c11db6b13064fa79"}, + {file = "pendulum-3.0.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:3725245c0352c95d6ca297193192020d1b0c0f83d5ee6bb09964edc2b5a2d508"}, + {file = "pendulum-3.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6c035f03a3e565ed132927e2c1b691de0dbf4eb53b02a5a3c5a97e1a64e17bec"}, + {file = "pendulum-3.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:597e66e63cbd68dd6d58ac46cb7a92363d2088d37ccde2dae4332ef23e95cd00"}, + {file = "pendulum-3.0.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:99a0f8172e19f3f0c0e4ace0ad1595134d5243cf75985dc2233e8f9e8de263ca"}, + {file = "pendulum-3.0.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:77d8839e20f54706aed425bec82a83b4aec74db07f26acd039905d1237a5e1d4"}, + {file = "pendulum-3.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afde30e8146292b059020fbc8b6f8fd4a60ae7c5e6f0afef937bbb24880bdf01"}, + {file = "pendulum-3.0.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:660434a6fcf6303c4efd36713ca9212c753140107ee169a3fc6c49c4711c2a05"}, + {file = "pendulum-3.0.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:dee9e5a48c6999dc1106eb7eea3e3a50e98a50651b72c08a87ee2154e544b33e"}, + {file = "pendulum-3.0.0-cp311-none-win_amd64.whl", hash = "sha256:d4cdecde90aec2d67cebe4042fd2a87a4441cc02152ed7ed8fb3ebb110b94ec4"}, + {file = "pendulum-3.0.0-cp311-none-win_arm64.whl", hash = "sha256:773c3bc4ddda2dda9f1b9d51fe06762f9200f3293d75c4660c19b2614b991d83"}, + {file = "pendulum-3.0.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:409e64e41418c49f973d43a28afe5df1df4f1dd87c41c7c90f1a63f61ae0f1f7"}, + {file = "pendulum-3.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a38ad2121c5ec7c4c190c7334e789c3b4624798859156b138fcc4d92295835dc"}, + {file = "pendulum-3.0.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fde4d0b2024b9785f66b7f30ed59281bd60d63d9213cda0eb0910ead777f6d37"}, + {file = "pendulum-3.0.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4b2c5675769fb6d4c11238132962939b960fcb365436b6d623c5864287faa319"}, + {file = "pendulum-3.0.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8af95e03e066826f0f4c65811cbee1b3123d4a45a1c3a2b4fc23c4b0dff893b5"}, + {file = "pendulum-3.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2165a8f33cb15e06c67070b8afc87a62b85c5a273e3aaa6bc9d15c93a4920d6f"}, + {file = "pendulum-3.0.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ad5e65b874b5e56bd942546ea7ba9dd1d6a25121db1c517700f1c9de91b28518"}, + {file = "pendulum-3.0.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:17fe4b2c844bbf5f0ece69cfd959fa02957c61317b2161763950d88fed8e13b9"}, + {file = "pendulum-3.0.0-cp312-none-win_amd64.whl", hash = "sha256:78f8f4e7efe5066aca24a7a57511b9c2119f5c2b5eb81c46ff9222ce11e0a7a5"}, + {file = "pendulum-3.0.0-cp312-none-win_arm64.whl", hash = "sha256:28f49d8d1e32aae9c284a90b6bb3873eee15ec6e1d9042edd611b22a94ac462f"}, + {file = "pendulum-3.0.0-cp37-cp37m-macosx_10_12_x86_64.whl", hash = "sha256:d4e2512f4e1a4670284a153b214db9719eb5d14ac55ada5b76cbdb8c5c00399d"}, + {file = "pendulum-3.0.0-cp37-cp37m-macosx_11_0_arm64.whl", hash = "sha256:3d897eb50883cc58d9b92f6405245f84b9286cd2de6e8694cb9ea5cb15195a32"}, + {file = "pendulum-3.0.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2e169cc2ca419517f397811bbe4589cf3cd13fca6dc38bb352ba15ea90739ebb"}, + {file = "pendulum-3.0.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f17c3084a4524ebefd9255513692f7e7360e23c8853dc6f10c64cc184e1217ab"}, + {file = "pendulum-3.0.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:826d6e258052715f64d05ae0fc9040c0151e6a87aae7c109ba9a0ed930ce4000"}, + {file = "pendulum-3.0.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2aae97087872ef152a0c40e06100b3665d8cb86b59bc8471ca7c26132fccd0f"}, + {file = "pendulum-3.0.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:ac65eeec2250d03106b5e81284ad47f0d417ca299a45e89ccc69e36130ca8bc7"}, + {file = "pendulum-3.0.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:a5346d08f3f4a6e9e672187faa179c7bf9227897081d7121866358af369f44f9"}, + {file = "pendulum-3.0.0-cp37-none-win_amd64.whl", hash = "sha256:235d64e87946d8f95c796af34818c76e0f88c94d624c268693c85b723b698aa9"}, + {file = "pendulum-3.0.0-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:6a881d9c2a7f85bc9adafcfe671df5207f51f5715ae61f5d838b77a1356e8b7b"}, + {file = "pendulum-3.0.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:d7762d2076b9b1cb718a6631ad6c16c23fc3fac76cbb8c454e81e80be98daa34"}, + {file = "pendulum-3.0.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e8e36a8130819d97a479a0e7bf379b66b3b1b520e5dc46bd7eb14634338df8c"}, + {file = "pendulum-3.0.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7dc843253ac373358ffc0711960e2dd5b94ab67530a3e204d85c6e8cb2c5fa10"}, + {file = "pendulum-3.0.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0a78ad3635d609ceb1e97d6aedef6a6a6f93433ddb2312888e668365908c7120"}, + {file = "pendulum-3.0.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b30a137e9e0d1f751e60e67d11fc67781a572db76b2296f7b4d44554761049d6"}, + {file = "pendulum-3.0.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:c95984037987f4a457bb760455d9ca80467be792236b69d0084f228a8ada0162"}, + {file = "pendulum-3.0.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d29c6e578fe0f893766c0d286adbf0b3c726a4e2341eba0917ec79c50274ec16"}, + {file = "pendulum-3.0.0-cp38-none-win_amd64.whl", hash = "sha256:deaba8e16dbfcb3d7a6b5fabdd5a38b7c982809567479987b9c89572df62e027"}, + {file = "pendulum-3.0.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:b11aceea5b20b4b5382962b321dbc354af0defe35daa84e9ff3aae3c230df694"}, + {file = "pendulum-3.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a90d4d504e82ad236afac9adca4d6a19e4865f717034fc69bafb112c320dcc8f"}, + {file = "pendulum-3.0.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:825799c6b66e3734227756fa746cc34b3549c48693325b8b9f823cb7d21b19ac"}, + {file = "pendulum-3.0.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ad769e98dc07972e24afe0cff8d365cb6f0ebc7e65620aa1976fcfbcadc4c6f3"}, + {file = "pendulum-3.0.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a6fc26907eb5fb8cc6188cc620bc2075a6c534d981a2f045daa5f79dfe50d512"}, + {file = "pendulum-3.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c717eab1b6d898c00a3e0fa7781d615b5c5136bbd40abe82be100bb06df7a56"}, + {file = "pendulum-3.0.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:3ddd1d66d1a714ce43acfe337190be055cdc221d911fc886d5a3aae28e14b76d"}, + {file = "pendulum-3.0.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:822172853d7a9cf6da95d7b66a16c7160cb99ae6df55d44373888181d7a06edc"}, + {file = "pendulum-3.0.0-cp39-none-win_amd64.whl", hash = "sha256:840de1b49cf1ec54c225a2a6f4f0784d50bd47f68e41dc005b7f67c7d5b5f3ae"}, + {file = "pendulum-3.0.0-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:3b1f74d1e6ffe5d01d6023870e2ce5c2191486928823196f8575dcc786e107b1"}, + {file = "pendulum-3.0.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:729e9f93756a2cdfa77d0fc82068346e9731c7e884097160603872686e570f07"}, + {file = "pendulum-3.0.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e586acc0b450cd21cbf0db6bae386237011b75260a3adceddc4be15334689a9a"}, + {file = "pendulum-3.0.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:22e7944ffc1f0099a79ff468ee9630c73f8c7835cd76fdb57ef7320e6a409df4"}, + {file = "pendulum-3.0.0-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:fa30af36bd8e50686846bdace37cf6707bdd044e5cb6e1109acbad3277232e04"}, + {file = "pendulum-3.0.0-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:440215347b11914ae707981b9a57ab9c7b6983ab0babde07063c6ee75c0dc6e7"}, + {file = "pendulum-3.0.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:314c4038dc5e6a52991570f50edb2f08c339debdf8cea68ac355b32c4174e820"}, + {file = "pendulum-3.0.0-pp37-pypy37_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5acb1d386337415f74f4d1955c4ce8d0201978c162927d07df8eb0692b2d8533"}, + {file = "pendulum-3.0.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a789e12fbdefaffb7b8ac67f9d8f22ba17a3050ceaaa635cd1cc4645773a4b1e"}, + {file = "pendulum-3.0.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:860aa9b8a888e5913bd70d819306749e5eb488e6b99cd6c47beb701b22bdecf5"}, + {file = "pendulum-3.0.0-pp37-pypy37_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:5ebc65ea033ef0281368217fbf59f5cb05b338ac4dd23d60959c7afcd79a60a0"}, + {file = "pendulum-3.0.0-pp37-pypy37_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:d9fef18ab0386ef6a9ac7bad7e43ded42c83ff7ad412f950633854f90d59afa8"}, + {file = "pendulum-3.0.0-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:1c134ba2f0571d0b68b83f6972e2307a55a5a849e7dac8505c715c531d2a8795"}, + {file = "pendulum-3.0.0-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:385680812e7e18af200bb9b4a49777418c32422d05ad5a8eb85144c4a285907b"}, + {file = "pendulum-3.0.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9eec91cd87c59fb32ec49eb722f375bd58f4be790cae11c1b70fac3ee4f00da0"}, + {file = "pendulum-3.0.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4386bffeca23c4b69ad50a36211f75b35a4deb6210bdca112ac3043deb7e494a"}, + {file = "pendulum-3.0.0-pp38-pypy38_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:dfbcf1661d7146d7698da4b86e7f04814221081e9fe154183e34f4c5f5fa3bf8"}, + {file = "pendulum-3.0.0-pp38-pypy38_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:04a1094a5aa1daa34a6b57c865b25f691848c61583fb22722a4df5699f6bf74c"}, + {file = "pendulum-3.0.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:5b0ec85b9045bd49dd3a3493a5e7ddfd31c36a2a60da387c419fa04abcaecb23"}, + {file = "pendulum-3.0.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:0a15b90129765b705eb2039062a6daf4d22c4e28d1a54fa260892e8c3ae6e157"}, + {file = "pendulum-3.0.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:bb8f6d7acd67a67d6fedd361ad2958ff0539445ef51cbe8cd288db4306503cd0"}, + {file = "pendulum-3.0.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fd69b15374bef7e4b4440612915315cc42e8575fcda2a3d7586a0d88192d0c88"}, + {file = "pendulum-3.0.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dc00f8110db6898360c53c812872662e077eaf9c75515d53ecc65d886eec209a"}, + {file = "pendulum-3.0.0-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:83a44e8b40655d0ba565a5c3d1365d27e3e6778ae2a05b69124db9e471255c4a"}, + {file = "pendulum-3.0.0-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:1a3604e9fbc06b788041b2a8b78f75c243021e0f512447806a6d37ee5214905d"}, + {file = "pendulum-3.0.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:92c307ae7accebd06cbae4729f0ba9fa724df5f7d91a0964b1b972a22baa482b"}, + {file = "pendulum-3.0.0.tar.gz", hash = "sha256:5d034998dea404ec31fae27af6b22cff1708f830a1ed7353be4d1019bb9f584e"}, +] + +[package.dependencies] +python-dateutil = ">=2.6" +tzdata = ">=2020.1" + +[package.extras] +test = ["time-machine (>=2.6.0)"] + +[[package]] +name = "pgvector" +version = "0.1.8" +description = "pgvector support for Python" +optional = false +python-versions = ">=3.6" +files = [ + {file = "pgvector-0.1.8-py2.py3-none-any.whl", hash = "sha256:99dce3a6580ef73863edb9b8441937671f4e1a09383826e6b0838176cd441a96"}, +] + +[package.dependencies] +numpy = "*" + +[[package]] +name = "pillow" +version = "9.5.0" +description = "Python Imaging Library (Fork)" +optional = false +python-versions = ">=3.7" +files = [ + {file = "Pillow-9.5.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:ace6ca218308447b9077c14ea4ef381ba0b67ee78d64046b3f19cf4e1139ad16"}, + {file = "Pillow-9.5.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d3d403753c9d5adc04d4694d35cf0391f0f3d57c8e0030aac09d7678fa8030aa"}, + {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5ba1b81ee69573fe7124881762bb4cd2e4b6ed9dd28c9c60a632902fe8db8b38"}, + {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fe7e1c262d3392afcf5071df9afa574544f28eac825284596ac6db56e6d11062"}, + {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f36397bf3f7d7c6a3abdea815ecf6fd14e7fcd4418ab24bae01008d8d8ca15e"}, + {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:252a03f1bdddce077eff2354c3861bf437c892fb1832f75ce813ee94347aa9b5"}, + {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:85ec677246533e27770b0de5cf0f9d6e4ec0c212a1f89dfc941b64b21226009d"}, + {file = "Pillow-9.5.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b416f03d37d27290cb93597335a2f85ed446731200705b22bb927405320de903"}, + {file = "Pillow-9.5.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:1781a624c229cb35a2ac31cc4a77e28cafc8900733a864870c49bfeedacd106a"}, + {file = "Pillow-9.5.0-cp310-cp310-win32.whl", hash = "sha256:8507eda3cd0608a1f94f58c64817e83ec12fa93a9436938b191b80d9e4c0fc44"}, + {file = "Pillow-9.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:d3c6b54e304c60c4181da1c9dadf83e4a54fd266a99c70ba646a9baa626819eb"}, + {file = "Pillow-9.5.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:7ec6f6ce99dab90b52da21cf0dc519e21095e332ff3b399a357c187b1a5eee32"}, + {file = "Pillow-9.5.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:560737e70cb9c6255d6dcba3de6578a9e2ec4b573659943a5e7e4af13f298f5c"}, + {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:96e88745a55b88a7c64fa49bceff363a1a27d9a64e04019c2281049444a571e3"}, + {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d9c206c29b46cfd343ea7cdfe1232443072bbb270d6a46f59c259460db76779a"}, + {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cfcc2c53c06f2ccb8976fb5c71d448bdd0a07d26d8e07e321c103416444c7ad1"}, + {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:a0f9bb6c80e6efcde93ffc51256d5cfb2155ff8f78292f074f60f9e70b942d99"}, + {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:8d935f924bbab8f0a9a28404422da8af4904e36d5c33fc6f677e4c4485515625"}, + {file = "Pillow-9.5.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:fed1e1cf6a42577953abbe8e6cf2fe2f566daebde7c34724ec8803c4c0cda579"}, + {file = "Pillow-9.5.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c1170d6b195555644f0616fd6ed929dfcf6333b8675fcca044ae5ab110ded296"}, + {file = "Pillow-9.5.0-cp311-cp311-win32.whl", hash = "sha256:54f7102ad31a3de5666827526e248c3530b3a33539dbda27c6843d19d72644ec"}, + {file = "Pillow-9.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:cfa4561277f677ecf651e2b22dc43e8f5368b74a25a8f7d1d4a3a243e573f2d4"}, + {file = "Pillow-9.5.0-cp311-cp311-win_arm64.whl", hash = "sha256:965e4a05ef364e7b973dd17fc765f42233415974d773e82144c9bbaaaea5d089"}, + {file = "Pillow-9.5.0-cp312-cp312-win32.whl", hash = "sha256:22baf0c3cf0c7f26e82d6e1adf118027afb325e703922c8dfc1d5d0156bb2eeb"}, + {file = "Pillow-9.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:432b975c009cf649420615388561c0ce7cc31ce9b2e374db659ee4f7d57a1f8b"}, + {file = "Pillow-9.5.0-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:5d4ebf8e1db4441a55c509c4baa7a0587a0210f7cd25fcfe74dbbce7a4bd1906"}, + {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:375f6e5ee9620a271acb6820b3d1e94ffa8e741c0601db4c0c4d3cb0a9c224bf"}, + {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:99eb6cafb6ba90e436684e08dad8be1637efb71c4f2180ee6b8f940739406e78"}, + {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2dfaaf10b6172697b9bceb9a3bd7b951819d1ca339a5ef294d1f1ac6d7f63270"}, + {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_28_aarch64.whl", hash = "sha256:763782b2e03e45e2c77d7779875f4432e25121ef002a41829d8868700d119392"}, + {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:35f6e77122a0c0762268216315bf239cf52b88865bba522999dc38f1c52b9b47"}, + {file = "Pillow-9.5.0-cp37-cp37m-win32.whl", hash = "sha256:aca1c196f407ec7cf04dcbb15d19a43c507a81f7ffc45b690899d6a76ac9fda7"}, + {file = "Pillow-9.5.0-cp37-cp37m-win_amd64.whl", hash = "sha256:322724c0032af6692456cd6ed554bb85f8149214d97398bb80613b04e33769f6"}, + {file = "Pillow-9.5.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:a0aa9417994d91301056f3d0038af1199eb7adc86e646a36b9e050b06f526597"}, + {file = "Pillow-9.5.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f8286396b351785801a976b1e85ea88e937712ee2c3ac653710a4a57a8da5d9c"}, + {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c830a02caeb789633863b466b9de10c015bded434deb3ec87c768e53752ad22a"}, + {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fbd359831c1657d69bb81f0db962905ee05e5e9451913b18b831febfe0519082"}, + {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8fc330c3370a81bbf3f88557097d1ea26cd8b019d6433aa59f71195f5ddebbf"}, + {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:7002d0797a3e4193c7cdee3198d7c14f92c0836d6b4a3f3046a64bd1ce8df2bf"}, + {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:229e2c79c00e85989a34b5981a2b67aa079fd08c903f0aaead522a1d68d79e51"}, + {file = "Pillow-9.5.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9adf58f5d64e474bed00d69bcd86ec4bcaa4123bfa70a65ce72e424bfb88ed96"}, + {file = "Pillow-9.5.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:662da1f3f89a302cc22faa9f14a262c2e3951f9dbc9617609a47521c69dd9f8f"}, + {file = "Pillow-9.5.0-cp38-cp38-win32.whl", hash = "sha256:6608ff3bf781eee0cd14d0901a2b9cc3d3834516532e3bd673a0a204dc8615fc"}, + {file = "Pillow-9.5.0-cp38-cp38-win_amd64.whl", hash = "sha256:e49eb4e95ff6fd7c0c402508894b1ef0e01b99a44320ba7d8ecbabefddcc5569"}, + {file = "Pillow-9.5.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:482877592e927fd263028c105b36272398e3e1be3269efda09f6ba21fd83ec66"}, + {file = "Pillow-9.5.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3ded42b9ad70e5f1754fb7c2e2d6465a9c842e41d178f262e08b8c85ed8a1d8e"}, + {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c446d2245ba29820d405315083d55299a796695d747efceb5717a8b450324115"}, + {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8aca1152d93dcc27dc55395604dcfc55bed5f25ef4c98716a928bacba90d33a3"}, + {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:608488bdcbdb4ba7837461442b90ea6f3079397ddc968c31265c1e056964f1ef"}, + {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:60037a8db8750e474af7ffc9faa9b5859e6c6d0a50e55c45576bf28be7419705"}, + {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:07999f5834bdc404c442146942a2ecadd1cb6292f5229f4ed3b31e0a108746b1"}, + {file = "Pillow-9.5.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:a127ae76092974abfbfa38ca2d12cbeddcdeac0fb71f9627cc1135bedaf9d51a"}, + {file = "Pillow-9.5.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:489f8389261e5ed43ac8ff7b453162af39c3e8abd730af8363587ba64bb2e865"}, + {file = "Pillow-9.5.0-cp39-cp39-win32.whl", hash = "sha256:9b1af95c3a967bf1da94f253e56b6286b50af23392a886720f563c547e48e964"}, + {file = "Pillow-9.5.0-cp39-cp39-win_amd64.whl", hash = "sha256:77165c4a5e7d5a284f10a6efaa39a0ae8ba839da344f20b111d62cc932fa4e5d"}, + {file = "Pillow-9.5.0-pp38-pypy38_pp73-macosx_10_10_x86_64.whl", hash = "sha256:833b86a98e0ede388fa29363159c9b1a294b0905b5128baf01db683672f230f5"}, + {file = "Pillow-9.5.0-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aaf305d6d40bd9632198c766fb64f0c1a83ca5b667f16c1e79e1661ab5060140"}, + {file = "Pillow-9.5.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0852ddb76d85f127c135b6dd1f0bb88dbb9ee990d2cd9aa9e28526c93e794fba"}, + {file = "Pillow-9.5.0-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:91ec6fe47b5eb5a9968c79ad9ed78c342b1f97a091677ba0e012701add857829"}, + {file = "Pillow-9.5.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:cb841572862f629b99725ebaec3287fc6d275be9b14443ea746c1dd325053cbd"}, + {file = "Pillow-9.5.0-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:c380b27d041209b849ed246b111b7c166ba36d7933ec6e41175fd15ab9eb1572"}, + {file = "Pillow-9.5.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7c9af5a3b406a50e313467e3565fc99929717f780164fe6fbb7704edba0cebbe"}, + {file = "Pillow-9.5.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5671583eab84af046a397d6d0ba25343c00cd50bce03787948e0fff01d4fd9b1"}, + {file = "Pillow-9.5.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:84a6f19ce086c1bf894644b43cd129702f781ba5751ca8572f08aa40ef0ab7b7"}, + {file = "Pillow-9.5.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:1e7723bd90ef94eda669a3c2c19d549874dd5badaeefabefd26053304abe5799"}, + {file = "Pillow-9.5.0.tar.gz", hash = "sha256:bf548479d336726d7a0eceb6e767e179fbde37833ae42794602631a070d630f1"}, +] + +[package.extras] +docs = ["furo", "olefile", "sphinx (>=2.4)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinx-removed-in", "sphinxext-opengraph"] +tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"] + +[[package]] +name = "platformdirs" +version = "4.1.0" +description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +optional = false +python-versions = ">=3.8" +files = [ + {file = "platformdirs-4.1.0-py3-none-any.whl", hash = "sha256:11c8f37bcca40db96d8144522d925583bdb7a31f7b0e37e3ed4318400a8e2380"}, + {file = "platformdirs-4.1.0.tar.gz", hash = "sha256:906d548203468492d432bcb294d4bc2fff751bf84971fbb2c10918cc206ee420"}, +] + +[package.extras] +docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.1)", "sphinx-autodoc-typehints (>=1.24)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4)", "pytest-cov (>=4.1)", "pytest-mock (>=3.11.1)"] + +[[package]] +name = "plotly" +version = "5.18.0" +description = "An open-source, interactive data visualization library for Python" +optional = false +python-versions = ">=3.6" +files = [ + {file = "plotly-5.18.0-py3-none-any.whl", hash = "sha256:23aa8ea2f4fb364a20d34ad38235524bd9d691bf5299e800bca608c31e8db8de"}, + {file = "plotly-5.18.0.tar.gz", hash = "sha256:360a31e6fbb49d12b007036eb6929521343d6bee2236f8459915821baefa2cbb"}, +] + +[package.dependencies] +packaging = "*" +tenacity = ">=6.2.0" + +[[package]] +name = "pluggy" +version = "1.4.0" +description = "plugin and hook calling mechanisms for python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pluggy-1.4.0-py3-none-any.whl", hash = "sha256:7db9f7b503d67d1c5b95f59773ebb58a8c1c288129a88665838012cfb07b8981"}, + {file = "pluggy-1.4.0.tar.gz", hash = "sha256:8c85c2876142a764e5b7548e7d9a0e0ddb46f5185161049a79b7e974454223be"}, +] + +[package.extras] +dev = ["pre-commit", "tox"] +testing = ["pytest", "pytest-benchmark"] + +[[package]] +name = "ply" +version = "3.11" +description = "Python Lex & Yacc" +optional = false +python-versions = "*" +files = [ + {file = "ply-3.11-py2.py3-none-any.whl", hash = "sha256:096f9b8350b65ebd2fd1346b12452efe5b9607f7482813ffca50c22722a807ce"}, + {file = "ply-3.11.tar.gz", hash = "sha256:00c7c1aaa88358b9c765b6d3000c6eec0ba42abca5351b095321aef446081da3"}, +] + +[[package]] +name = "prompt-toolkit" +version = "3.0.43" +description = "Library for building powerful interactive command lines in Python" +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "prompt_toolkit-3.0.43-py3-none-any.whl", hash = "sha256:a11a29cb3bf0a28a387fe5122cdb649816a957cd9261dcedf8c9f1fef33eacf6"}, + {file = "prompt_toolkit-3.0.43.tar.gz", hash = "sha256:3527b7af26106cbc65a040bcc84839a3566ec1b051bb0bfe953631e704b0ff7d"}, +] + +[package.dependencies] +wcwidth = "*" + +[[package]] +name = "psycopg2-binary" +version = "2.9.9" +description = "psycopg2 - Python-PostgreSQL Database Adapter" +optional = false +python-versions = ">=3.7" +files = [ + {file = "psycopg2-binary-2.9.9.tar.gz", hash = "sha256:7f01846810177d829c7692f1f5ada8096762d9172af1b1a28d4ab5b77c923c1c"}, + {file = "psycopg2_binary-2.9.9-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c2470da5418b76232f02a2fcd2229537bb2d5a7096674ce61859c3229f2eb202"}, + {file = "psycopg2_binary-2.9.9-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c6af2a6d4b7ee9615cbb162b0738f6e1fd1f5c3eda7e5da17861eacf4c717ea7"}, + {file = "psycopg2_binary-2.9.9-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:75723c3c0fbbf34350b46a3199eb50638ab22a0228f93fb472ef4d9becc2382b"}, + {file = "psycopg2_binary-2.9.9-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:83791a65b51ad6ee6cf0845634859d69a038ea9b03d7b26e703f94c7e93dbcf9"}, + {file = "psycopg2_binary-2.9.9-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0ef4854e82c09e84cc63084a9e4ccd6d9b154f1dbdd283efb92ecd0b5e2b8c84"}, + {file = "psycopg2_binary-2.9.9-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ed1184ab8f113e8d660ce49a56390ca181f2981066acc27cf637d5c1e10ce46e"}, + {file = "psycopg2_binary-2.9.9-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d2997c458c690ec2bc6b0b7ecbafd02b029b7b4283078d3b32a852a7ce3ddd98"}, + {file = "psycopg2_binary-2.9.9-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:b58b4710c7f4161b5e9dcbe73bb7c62d65670a87df7bcce9e1faaad43e715245"}, + {file = "psycopg2_binary-2.9.9-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:0c009475ee389757e6e34611d75f6e4f05f0cf5ebb76c6037508318e1a1e0d7e"}, + {file = "psycopg2_binary-2.9.9-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8dbf6d1bc73f1d04ec1734bae3b4fb0ee3cb2a493d35ede9badbeb901fb40f6f"}, + {file = "psycopg2_binary-2.9.9-cp310-cp310-win32.whl", hash = "sha256:3f78fd71c4f43a13d342be74ebbc0666fe1f555b8837eb113cb7416856c79682"}, + {file = "psycopg2_binary-2.9.9-cp310-cp310-win_amd64.whl", hash = "sha256:876801744b0dee379e4e3c38b76fc89f88834bb15bf92ee07d94acd06ec890a0"}, + {file = "psycopg2_binary-2.9.9-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ee825e70b1a209475622f7f7b776785bd68f34af6e7a46e2e42f27b659b5bc26"}, + {file = "psycopg2_binary-2.9.9-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1ea665f8ce695bcc37a90ee52de7a7980be5161375d42a0b6c6abedbf0d81f0f"}, + {file = "psycopg2_binary-2.9.9-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:143072318f793f53819048fdfe30c321890af0c3ec7cb1dfc9cc87aa88241de2"}, + {file = "psycopg2_binary-2.9.9-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c332c8d69fb64979ebf76613c66b985414927a40f8defa16cf1bc028b7b0a7b0"}, + {file = "psycopg2_binary-2.9.9-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f7fc5a5acafb7d6ccca13bfa8c90f8c51f13d8fb87d95656d3950f0158d3ce53"}, + {file = "psycopg2_binary-2.9.9-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:977646e05232579d2e7b9c59e21dbe5261f403a88417f6a6512e70d3f8a046be"}, + {file = "psycopg2_binary-2.9.9-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b6356793b84728d9d50ead16ab43c187673831e9d4019013f1402c41b1db9b27"}, + {file = "psycopg2_binary-2.9.9-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:bc7bb56d04601d443f24094e9e31ae6deec9ccb23581f75343feebaf30423359"}, + {file = "psycopg2_binary-2.9.9-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:77853062a2c45be16fd6b8d6de2a99278ee1d985a7bd8b103e97e41c034006d2"}, + {file = "psycopg2_binary-2.9.9-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:78151aa3ec21dccd5cdef6c74c3e73386dcdfaf19bced944169697d7ac7482fc"}, + {file = "psycopg2_binary-2.9.9-cp311-cp311-win32.whl", hash = "sha256:dc4926288b2a3e9fd7b50dc6a1909a13bbdadfc67d93f3374d984e56f885579d"}, + {file = "psycopg2_binary-2.9.9-cp311-cp311-win_amd64.whl", hash = "sha256:b76bedd166805480ab069612119ea636f5ab8f8771e640ae103e05a4aae3e417"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:8532fd6e6e2dc57bcb3bc90b079c60de896d2128c5d9d6f24a63875a95a088cf"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b0605eaed3eb239e87df0d5e3c6489daae3f7388d455d0c0b4df899519c6a38d"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f8544b092a29a6ddd72f3556a9fcf249ec412e10ad28be6a0c0d948924f2212"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2d423c8d8a3c82d08fe8af900ad5b613ce3632a1249fd6a223941d0735fce493"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2e5afae772c00980525f6d6ecf7cbca55676296b580c0e6abb407f15f3706996"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e6f98446430fdf41bd36d4faa6cb409f5140c1c2cf58ce0bbdaf16af7d3f119"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:c77e3d1862452565875eb31bdb45ac62502feabbd53429fdc39a1cc341d681ba"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:cb16c65dcb648d0a43a2521f2f0a2300f40639f6f8c1ecbc662141e4e3e1ee07"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:911dda9c487075abd54e644ccdf5e5c16773470a6a5d3826fda76699410066fb"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:57fede879f08d23c85140a360c6a77709113efd1c993923c59fde17aa27599fe"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-win32.whl", hash = "sha256:64cf30263844fa208851ebb13b0732ce674d8ec6a0c86a4e160495d299ba3c93"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-win_amd64.whl", hash = "sha256:81ff62668af011f9a48787564ab7eded4e9fb17a4a6a74af5ffa6a457400d2ab"}, + {file = "psycopg2_binary-2.9.9-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:2293b001e319ab0d869d660a704942c9e2cce19745262a8aba2115ef41a0a42a"}, + {file = "psycopg2_binary-2.9.9-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:03ef7df18daf2c4c07e2695e8cfd5ee7f748a1d54d802330985a78d2a5a6dca9"}, + {file = "psycopg2_binary-2.9.9-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a602ea5aff39bb9fac6308e9c9d82b9a35c2bf288e184a816002c9fae930b77"}, + {file = "psycopg2_binary-2.9.9-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8359bf4791968c5a78c56103702000105501adb557f3cf772b2c207284273984"}, + {file = "psycopg2_binary-2.9.9-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:275ff571376626195ab95a746e6a04c7df8ea34638b99fc11160de91f2fef503"}, + {file = "psycopg2_binary-2.9.9-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:f9b5571d33660d5009a8b3c25dc1db560206e2d2f89d3df1cb32d72c0d117d52"}, + {file = "psycopg2_binary-2.9.9-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:420f9bbf47a02616e8554e825208cb947969451978dceb77f95ad09c37791dae"}, + {file = "psycopg2_binary-2.9.9-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:4154ad09dac630a0f13f37b583eae260c6aa885d67dfbccb5b02c33f31a6d420"}, + {file = "psycopg2_binary-2.9.9-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:a148c5d507bb9b4f2030a2025c545fccb0e1ef317393eaba42e7eabd28eb6041"}, + {file = "psycopg2_binary-2.9.9-cp37-cp37m-win32.whl", hash = "sha256:68fc1f1ba168724771e38bee37d940d2865cb0f562380a1fb1ffb428b75cb692"}, + {file = "psycopg2_binary-2.9.9-cp37-cp37m-win_amd64.whl", hash = "sha256:281309265596e388ef483250db3640e5f414168c5a67e9c665cafce9492eda2f"}, + {file = "psycopg2_binary-2.9.9-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:60989127da422b74a04345096c10d416c2b41bd7bf2a380eb541059e4e999980"}, + {file = "psycopg2_binary-2.9.9-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:246b123cc54bb5361588acc54218c8c9fb73068bf227a4a531d8ed56fa3ca7d6"}, + {file = "psycopg2_binary-2.9.9-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:34eccd14566f8fe14b2b95bb13b11572f7c7d5c36da61caf414d23b91fcc5d94"}, + {file = "psycopg2_binary-2.9.9-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:18d0ef97766055fec15b5de2c06dd8e7654705ce3e5e5eed3b6651a1d2a9a152"}, + {file = "psycopg2_binary-2.9.9-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d3f82c171b4ccd83bbaf35aa05e44e690113bd4f3b7b6cc54d2219b132f3ae55"}, + {file = "psycopg2_binary-2.9.9-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ead20f7913a9c1e894aebe47cccf9dc834e1618b7aa96155d2091a626e59c972"}, + {file = "psycopg2_binary-2.9.9-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:ca49a8119c6cbd77375ae303b0cfd8c11f011abbbd64601167ecca18a87e7cdd"}, + {file = "psycopg2_binary-2.9.9-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:323ba25b92454adb36fa425dc5cf6f8f19f78948cbad2e7bc6cdf7b0d7982e59"}, + {file = "psycopg2_binary-2.9.9-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:1236ed0952fbd919c100bc839eaa4a39ebc397ed1c08a97fc45fee2a595aa1b3"}, + {file = "psycopg2_binary-2.9.9-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:729177eaf0aefca0994ce4cffe96ad3c75e377c7b6f4efa59ebf003b6d398716"}, + {file = "psycopg2_binary-2.9.9-cp38-cp38-win32.whl", hash = "sha256:804d99b24ad523a1fe18cc707bf741670332f7c7412e9d49cb5eab67e886b9b5"}, + {file = "psycopg2_binary-2.9.9-cp38-cp38-win_amd64.whl", hash = "sha256:a6cdcc3ede532f4a4b96000b6362099591ab4a3e913d70bcbac2b56c872446f7"}, + {file = "psycopg2_binary-2.9.9-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:72dffbd8b4194858d0941062a9766f8297e8868e1dd07a7b36212aaa90f49472"}, + {file = "psycopg2_binary-2.9.9-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:30dcc86377618a4c8f3b72418df92e77be4254d8f89f14b8e8f57d6d43603c0f"}, + {file = "psycopg2_binary-2.9.9-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:31a34c508c003a4347d389a9e6fcc2307cc2150eb516462a7a17512130de109e"}, + {file = "psycopg2_binary-2.9.9-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:15208be1c50b99203fe88d15695f22a5bed95ab3f84354c494bcb1d08557df67"}, + {file = "psycopg2_binary-2.9.9-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1873aade94b74715be2246321c8650cabf5a0d098a95bab81145ffffa4c13876"}, + {file = "psycopg2_binary-2.9.9-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a58c98a7e9c021f357348867f537017057c2ed7f77337fd914d0bedb35dace7"}, + {file = "psycopg2_binary-2.9.9-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4686818798f9194d03c9129a4d9a702d9e113a89cb03bffe08c6cf799e053291"}, + {file = "psycopg2_binary-2.9.9-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:ebdc36bea43063116f0486869652cb2ed7032dbc59fbcb4445c4862b5c1ecf7f"}, + {file = "psycopg2_binary-2.9.9-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:ca08decd2697fdea0aea364b370b1249d47336aec935f87b8bbfd7da5b2ee9c1"}, + {file = "psycopg2_binary-2.9.9-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ac05fb791acf5e1a3e39402641827780fe44d27e72567a000412c648a85ba860"}, + {file = "psycopg2_binary-2.9.9-cp39-cp39-win32.whl", hash = "sha256:9dba73be7305b399924709b91682299794887cbbd88e38226ed9f6712eabee90"}, + {file = "psycopg2_binary-2.9.9-cp39-cp39-win_amd64.whl", hash = "sha256:f7ae5d65ccfbebdfa761585228eb4d0df3a8b15cfb53bd953e713e09fbb12957"}, +] + +[[package]] +name = "pyasn1" +version = "0.5.1" +description = "Pure-Python implementation of ASN.1 types and DER/BER/CER codecs (X.208)" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" +files = [ + {file = "pyasn1-0.5.1-py2.py3-none-any.whl", hash = "sha256:4439847c58d40b1d0a573d07e3856e95333f1976294494c325775aeca506eb58"}, + {file = "pyasn1-0.5.1.tar.gz", hash = "sha256:6d391a96e59b23130a5cfa74d6fd7f388dbbe26cc8f1edf39fdddf08d9d6676c"}, +] + +[[package]] +name = "pycodestyle" +version = "2.11.1" +description = "Python style guide checker" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pycodestyle-2.11.1-py2.py3-none-any.whl", hash = "sha256:44fe31000b2d866f2e41841b18528a505fbd7fef9017b04eff4e2648a0fadc67"}, + {file = "pycodestyle-2.11.1.tar.gz", hash = "sha256:41ba0e7afc9752dfb53ced5489e89f8186be00e599e712660695b7a75ff2663f"}, +] + +[[package]] +name = "pycparser" +version = "2.21" +description = "C parser in Python" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"}, + {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, +] + +[[package]] +name = "pycryptodome" +version = "3.20.0" +description = "Cryptographic library for Python" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "pycryptodome-3.20.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:f0e6d631bae3f231d3634f91ae4da7a960f7ff87f2865b2d2b831af1dfb04e9a"}, + {file = "pycryptodome-3.20.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:baee115a9ba6c5d2709a1e88ffe62b73ecc044852a925dcb67713a288c4ec70f"}, + {file = "pycryptodome-3.20.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:417a276aaa9cb3be91f9014e9d18d10e840a7a9b9a9be64a42f553c5b50b4d1d"}, + {file = "pycryptodome-3.20.0-cp27-cp27m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2a1250b7ea809f752b68e3e6f3fd946b5939a52eaeea18c73bdab53e9ba3c2dd"}, + {file = "pycryptodome-3.20.0-cp27-cp27m-musllinux_1_1_aarch64.whl", hash = "sha256:d5954acfe9e00bc83ed9f5cb082ed22c592fbbef86dc48b907238be64ead5c33"}, + {file = "pycryptodome-3.20.0-cp27-cp27m-win32.whl", hash = "sha256:06d6de87c19f967f03b4cf9b34e538ef46e99a337e9a61a77dbe44b2cbcf0690"}, + {file = "pycryptodome-3.20.0-cp27-cp27m-win_amd64.whl", hash = "sha256:ec0bb1188c1d13426039af8ffcb4dbe3aad1d7680c35a62d8eaf2a529b5d3d4f"}, + {file = "pycryptodome-3.20.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:5601c934c498cd267640b57569e73793cb9a83506f7c73a8ec57a516f5b0b091"}, + {file = "pycryptodome-3.20.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:d29daa681517f4bc318cd8a23af87e1f2a7bad2fe361e8aa29c77d652a065de4"}, + {file = "pycryptodome-3.20.0-cp27-cp27mu-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3427d9e5310af6680678f4cce149f54e0bb4af60101c7f2c16fdf878b39ccccc"}, + {file = "pycryptodome-3.20.0-cp27-cp27mu-musllinux_1_1_aarch64.whl", hash = "sha256:3cd3ef3aee1079ae44afaeee13393cf68b1058f70576b11439483e34f93cf818"}, + {file = "pycryptodome-3.20.0-cp35-abi3-macosx_10_9_universal2.whl", hash = "sha256:ac1c7c0624a862f2e53438a15c9259d1655325fc2ec4392e66dc46cdae24d044"}, + {file = "pycryptodome-3.20.0-cp35-abi3-macosx_10_9_x86_64.whl", hash = "sha256:76658f0d942051d12a9bd08ca1b6b34fd762a8ee4240984f7c06ddfb55eaf15a"}, + {file = "pycryptodome-3.20.0-cp35-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f35d6cee81fa145333137009d9c8ba90951d7d77b67c79cbe5f03c7eb74d8fe2"}, + {file = "pycryptodome-3.20.0-cp35-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:76cb39afede7055127e35a444c1c041d2e8d2f1f9c121ecef573757ba4cd2c3c"}, + {file = "pycryptodome-3.20.0-cp35-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:49a4c4dc60b78ec41d2afa392491d788c2e06edf48580fbfb0dd0f828af49d25"}, + {file = "pycryptodome-3.20.0-cp35-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:fb3b87461fa35afa19c971b0a2b7456a7b1db7b4eba9a8424666104925b78128"}, + {file = "pycryptodome-3.20.0-cp35-abi3-musllinux_1_1_i686.whl", hash = "sha256:acc2614e2e5346a4a4eab6e199203034924313626f9620b7b4b38e9ad74b7e0c"}, + {file = "pycryptodome-3.20.0-cp35-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:210ba1b647837bfc42dd5a813cdecb5b86193ae11a3f5d972b9a0ae2c7e9e4b4"}, + {file = "pycryptodome-3.20.0-cp35-abi3-win32.whl", hash = "sha256:8d6b98d0d83d21fb757a182d52940d028564efe8147baa9ce0f38d057104ae72"}, + {file = "pycryptodome-3.20.0-cp35-abi3-win_amd64.whl", hash = "sha256:9b3ae153c89a480a0ec402e23db8d8d84a3833b65fa4b15b81b83be9d637aab9"}, + {file = "pycryptodome-3.20.0-pp27-pypy_73-manylinux2010_x86_64.whl", hash = "sha256:4401564ebf37dfde45d096974c7a159b52eeabd9969135f0426907db367a652a"}, + {file = "pycryptodome-3.20.0-pp27-pypy_73-win32.whl", hash = "sha256:ec1f93feb3bb93380ab0ebf8b859e8e5678c0f010d2d78367cf6bc30bfeb148e"}, + {file = "pycryptodome-3.20.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:acae12b9ede49f38eb0ef76fdec2df2e94aad85ae46ec85be3648a57f0a7db04"}, + {file = "pycryptodome-3.20.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f47888542a0633baff535a04726948e876bf1ed880fddb7c10a736fa99146ab3"}, + {file = "pycryptodome-3.20.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6e0e4a987d38cfc2e71b4a1b591bae4891eeabe5fa0f56154f576e26287bfdea"}, + {file = "pycryptodome-3.20.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:c18b381553638414b38705f07d1ef0a7cf301bc78a5f9bc17a957eb19446834b"}, + {file = "pycryptodome-3.20.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a60fedd2b37b4cb11ccb5d0399efe26db9e0dd149016c1cc6c8161974ceac2d6"}, + {file = "pycryptodome-3.20.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:405002eafad114a2f9a930f5db65feef7b53c4784495dd8758069b89baf68eab"}, + {file = "pycryptodome-3.20.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2ab6ab0cb755154ad14e507d1df72de9897e99fd2d4922851a276ccc14f4f1a5"}, + {file = "pycryptodome-3.20.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:acf6e43fa75aca2d33e93409f2dafe386fe051818ee79ee8a3e21de9caa2ac9e"}, + {file = "pycryptodome-3.20.0.tar.gz", hash = "sha256:09609209ed7de61c2b560cc5c8c4fbf892f8b15b1faf7e4cbffac97db1fffda7"}, +] + +[[package]] +name = "pydantic" +version = "2.5.3" +description = "Data validation using Python type hints" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pydantic-2.5.3-py3-none-any.whl", hash = "sha256:d0caf5954bee831b6bfe7e338c32b9e30c85dfe080c843680783ac2b631673b4"}, + {file = "pydantic-2.5.3.tar.gz", hash = "sha256:b3ef57c62535b0941697cce638c08900d87fcb67e29cfa99e8a68f747f393f7a"}, +] + +[package.dependencies] +annotated-types = ">=0.4.0" +pydantic-core = "2.14.6" +typing-extensions = ">=4.6.1" + +[package.extras] +email = ["email-validator (>=2.0.0)"] + +[[package]] +name = "pydantic-core" +version = "2.14.6" +description = "" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pydantic_core-2.14.6-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:72f9a942d739f09cd42fffe5dc759928217649f070056f03c70df14f5770acf9"}, + {file = "pydantic_core-2.14.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6a31d98c0d69776c2576dda4b77b8e0c69ad08e8b539c25c7d0ca0dc19a50d6c"}, + {file = "pydantic_core-2.14.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5aa90562bc079c6c290f0512b21768967f9968e4cfea84ea4ff5af5d917016e4"}, + {file = "pydantic_core-2.14.6-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:370ffecb5316ed23b667d99ce4debe53ea664b99cc37bfa2af47bc769056d534"}, + {file = "pydantic_core-2.14.6-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f85f3843bdb1fe80e8c206fe6eed7a1caeae897e496542cee499c374a85c6e08"}, + {file = "pydantic_core-2.14.6-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9862bf828112e19685b76ca499b379338fd4c5c269d897e218b2ae8fcb80139d"}, + {file = "pydantic_core-2.14.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:036137b5ad0cb0004c75b579445a1efccd072387a36c7f217bb8efd1afbe5245"}, + {file = "pydantic_core-2.14.6-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:92879bce89f91f4b2416eba4429c7b5ca22c45ef4a499c39f0c5c69257522c7c"}, + {file = "pydantic_core-2.14.6-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0c08de15d50fa190d577e8591f0329a643eeaed696d7771760295998aca6bc66"}, + {file = "pydantic_core-2.14.6-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:36099c69f6b14fc2c49d7996cbf4f87ec4f0e66d1c74aa05228583225a07b590"}, + {file = "pydantic_core-2.14.6-cp310-none-win32.whl", hash = "sha256:7be719e4d2ae6c314f72844ba9d69e38dff342bc360379f7c8537c48e23034b7"}, + {file = "pydantic_core-2.14.6-cp310-none-win_amd64.whl", hash = "sha256:36fa402dcdc8ea7f1b0ddcf0df4254cc6b2e08f8cd80e7010d4c4ae6e86b2a87"}, + {file = "pydantic_core-2.14.6-cp311-cp311-macosx_10_7_x86_64.whl", hash = "sha256:dea7fcd62915fb150cdc373212141a30037e11b761fbced340e9db3379b892d4"}, + {file = "pydantic_core-2.14.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ffff855100bc066ff2cd3aa4a60bc9534661816b110f0243e59503ec2df38421"}, + {file = "pydantic_core-2.14.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1b027c86c66b8627eb90e57aee1f526df77dc6d8b354ec498be9a757d513b92b"}, + {file = "pydantic_core-2.14.6-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:00b1087dabcee0b0ffd104f9f53d7d3eaddfaa314cdd6726143af6bc713aa27e"}, + {file = "pydantic_core-2.14.6-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:75ec284328b60a4e91010c1acade0c30584f28a1f345bc8f72fe8b9e46ec6a96"}, + {file = "pydantic_core-2.14.6-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7e1f4744eea1501404b20b0ac059ff7e3f96a97d3e3f48ce27a139e053bb370b"}, + {file = "pydantic_core-2.14.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b2602177668f89b38b9f84b7b3435d0a72511ddef45dc14446811759b82235a1"}, + {file = "pydantic_core-2.14.6-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6c8edaea3089bf908dd27da8f5d9e395c5b4dc092dbcce9b65e7156099b4b937"}, + {file = "pydantic_core-2.14.6-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:478e9e7b360dfec451daafe286998d4a1eeaecf6d69c427b834ae771cad4b622"}, + {file = "pydantic_core-2.14.6-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:b6ca36c12a5120bad343eef193cc0122928c5c7466121da7c20f41160ba00ba2"}, + {file = "pydantic_core-2.14.6-cp311-none-win32.whl", hash = "sha256:2b8719037e570639e6b665a4050add43134d80b687288ba3ade18b22bbb29dd2"}, + {file = "pydantic_core-2.14.6-cp311-none-win_amd64.whl", hash = "sha256:78ee52ecc088c61cce32b2d30a826f929e1708f7b9247dc3b921aec367dc1b23"}, + {file = "pydantic_core-2.14.6-cp311-none-win_arm64.whl", hash = "sha256:a19b794f8fe6569472ff77602437ec4430f9b2b9ec7a1105cfd2232f9ba355e6"}, + {file = "pydantic_core-2.14.6-cp312-cp312-macosx_10_7_x86_64.whl", hash = "sha256:667aa2eac9cd0700af1ddb38b7b1ef246d8cf94c85637cbb03d7757ca4c3fdec"}, + {file = "pydantic_core-2.14.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:cdee837710ef6b56ebd20245b83799fce40b265b3b406e51e8ccc5b85b9099b7"}, + {file = "pydantic_core-2.14.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2c5bcf3414367e29f83fd66f7de64509a8fd2368b1edf4351e862910727d3e51"}, + {file = "pydantic_core-2.14.6-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:26a92ae76f75d1915806b77cf459811e772d8f71fd1e4339c99750f0e7f6324f"}, + {file = "pydantic_core-2.14.6-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a983cca5ed1dd9a35e9e42ebf9f278d344603bfcb174ff99a5815f953925140a"}, + {file = "pydantic_core-2.14.6-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cb92f9061657287eded380d7dc455bbf115430b3aa4741bdc662d02977e7d0af"}, + {file = "pydantic_core-2.14.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4ace1e220b078c8e48e82c081e35002038657e4b37d403ce940fa679e57113b"}, + {file = "pydantic_core-2.14.6-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ef633add81832f4b56d3b4c9408b43d530dfca29e68fb1b797dcb861a2c734cd"}, + {file = "pydantic_core-2.14.6-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7e90d6cc4aad2cc1f5e16ed56e46cebf4877c62403a311af20459c15da76fd91"}, + {file = "pydantic_core-2.14.6-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:e8a5ac97ea521d7bde7621d86c30e86b798cdecd985723c4ed737a2aa9e77d0c"}, + {file = "pydantic_core-2.14.6-cp312-none-win32.whl", hash = "sha256:f27207e8ca3e5e021e2402ba942e5b4c629718e665c81b8b306f3c8b1ddbb786"}, + {file = "pydantic_core-2.14.6-cp312-none-win_amd64.whl", hash = "sha256:b3e5fe4538001bb82e2295b8d2a39356a84694c97cb73a566dc36328b9f83b40"}, + {file = "pydantic_core-2.14.6-cp312-none-win_arm64.whl", hash = "sha256:64634ccf9d671c6be242a664a33c4acf12882670b09b3f163cd00a24cffbd74e"}, + {file = "pydantic_core-2.14.6-cp37-cp37m-macosx_10_7_x86_64.whl", hash = "sha256:24368e31be2c88bd69340fbfe741b405302993242ccb476c5c3ff48aeee1afe0"}, + {file = "pydantic_core-2.14.6-cp37-cp37m-macosx_11_0_arm64.whl", hash = "sha256:e33b0834f1cf779aa839975f9d8755a7c2420510c0fa1e9fa0497de77cd35d2c"}, + {file = "pydantic_core-2.14.6-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6af4b3f52cc65f8a0bc8b1cd9676f8c21ef3e9132f21fed250f6958bd7223bed"}, + {file = "pydantic_core-2.14.6-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d15687d7d7f40333bd8266f3814c591c2e2cd263fa2116e314f60d82086e353a"}, + {file = "pydantic_core-2.14.6-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:095b707bb287bfd534044166ab767bec70a9bba3175dcdc3371782175c14e43c"}, + {file = "pydantic_core-2.14.6-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:94fc0e6621e07d1e91c44e016cc0b189b48db053061cc22d6298a611de8071bb"}, + {file = "pydantic_core-2.14.6-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ce830e480f6774608dedfd4a90c42aac4a7af0a711f1b52f807130c2e434c06"}, + {file = "pydantic_core-2.14.6-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a306cdd2ad3a7d795d8e617a58c3a2ed0f76c8496fb7621b6cd514eb1532cae8"}, + {file = "pydantic_core-2.14.6-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:2f5fa187bde8524b1e37ba894db13aadd64faa884657473b03a019f625cee9a8"}, + {file = "pydantic_core-2.14.6-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:438027a975cc213a47c5d70672e0d29776082155cfae540c4e225716586be75e"}, + {file = "pydantic_core-2.14.6-cp37-none-win32.whl", hash = "sha256:f96ae96a060a8072ceff4cfde89d261837b4294a4f28b84a28765470d502ccc6"}, + {file = "pydantic_core-2.14.6-cp37-none-win_amd64.whl", hash = "sha256:e646c0e282e960345314f42f2cea5e0b5f56938c093541ea6dbf11aec2862391"}, + {file = "pydantic_core-2.14.6-cp38-cp38-macosx_10_7_x86_64.whl", hash = "sha256:db453f2da3f59a348f514cfbfeb042393b68720787bbef2b4c6068ea362c8149"}, + {file = "pydantic_core-2.14.6-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:3860c62057acd95cc84044e758e47b18dcd8871a328ebc8ccdefd18b0d26a21b"}, + {file = "pydantic_core-2.14.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:36026d8f99c58d7044413e1b819a67ca0e0b8ebe0f25e775e6c3d1fabb3c38fb"}, + {file = "pydantic_core-2.14.6-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8ed1af8692bd8d2a29d702f1a2e6065416d76897d726e45a1775b1444f5928a7"}, + {file = "pydantic_core-2.14.6-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:314ccc4264ce7d854941231cf71b592e30d8d368a71e50197c905874feacc8a8"}, + {file = "pydantic_core-2.14.6-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:982487f8931067a32e72d40ab6b47b1628a9c5d344be7f1a4e668fb462d2da42"}, + {file = "pydantic_core-2.14.6-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2dbe357bc4ddda078f79d2a36fc1dd0494a7f2fad83a0a684465b6f24b46fe80"}, + {file = "pydantic_core-2.14.6-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2f6ffc6701a0eb28648c845f4945a194dc7ab3c651f535b81793251e1185ac3d"}, + {file = "pydantic_core-2.14.6-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:7f5025db12fc6de7bc1104d826d5aee1d172f9ba6ca936bf6474c2148ac336c1"}, + {file = "pydantic_core-2.14.6-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:dab03ed811ed1c71d700ed08bde8431cf429bbe59e423394f0f4055f1ca0ea60"}, + {file = "pydantic_core-2.14.6-cp38-none-win32.whl", hash = "sha256:dfcbebdb3c4b6f739a91769aea5ed615023f3c88cb70df812849aef634c25fbe"}, + {file = "pydantic_core-2.14.6-cp38-none-win_amd64.whl", hash = "sha256:99b14dbea2fdb563d8b5a57c9badfcd72083f6006caf8e126b491519c7d64ca8"}, + {file = "pydantic_core-2.14.6-cp39-cp39-macosx_10_7_x86_64.whl", hash = "sha256:4ce8299b481bcb68e5c82002b96e411796b844d72b3e92a3fbedfe8e19813eab"}, + {file = "pydantic_core-2.14.6-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b9a9d92f10772d2a181b5ca339dee066ab7d1c9a34ae2421b2a52556e719756f"}, + {file = "pydantic_core-2.14.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fd9e98b408384989ea4ab60206b8e100d8687da18b5c813c11e92fd8212a98e0"}, + {file = "pydantic_core-2.14.6-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4f86f1f318e56f5cbb282fe61eb84767aee743ebe32c7c0834690ebea50c0a6b"}, + {file = "pydantic_core-2.14.6-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:86ce5fcfc3accf3a07a729779d0b86c5d0309a4764c897d86c11089be61da160"}, + {file = "pydantic_core-2.14.6-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3dcf1978be02153c6a31692d4fbcc2a3f1db9da36039ead23173bc256ee3b91b"}, + {file = "pydantic_core-2.14.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eedf97be7bc3dbc8addcef4142f4b4164066df0c6f36397ae4aaed3eb187d8ab"}, + {file = "pydantic_core-2.14.6-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d5f916acf8afbcab6bacbb376ba7dc61f845367901ecd5e328fc4d4aef2fcab0"}, + {file = "pydantic_core-2.14.6-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:8a14c192c1d724c3acbfb3f10a958c55a2638391319ce8078cb36c02283959b9"}, + {file = "pydantic_core-2.14.6-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:0348b1dc6b76041516e8a854ff95b21c55f5a411c3297d2ca52f5528e49d8411"}, + {file = "pydantic_core-2.14.6-cp39-none-win32.whl", hash = "sha256:de2a0645a923ba57c5527497daf8ec5df69c6eadf869e9cd46e86349146e5975"}, + {file = "pydantic_core-2.14.6-cp39-none-win_amd64.whl", hash = "sha256:aca48506a9c20f68ee61c87f2008f81f8ee99f8d7f0104bff3c47e2d148f89d9"}, + {file = "pydantic_core-2.14.6-pp310-pypy310_pp73-macosx_10_7_x86_64.whl", hash = "sha256:d5c28525c19f5bb1e09511669bb57353d22b94cf8b65f3a8d141c389a55dec95"}, + {file = "pydantic_core-2.14.6-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:78d0768ee59baa3de0f4adac9e3748b4b1fffc52143caebddfd5ea2961595277"}, + {file = "pydantic_core-2.14.6-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b93785eadaef932e4fe9c6e12ba67beb1b3f1e5495631419c784ab87e975670"}, + {file = "pydantic_core-2.14.6-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a874f21f87c485310944b2b2734cd6d318765bcbb7515eead33af9641816506e"}, + {file = "pydantic_core-2.14.6-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b89f4477d915ea43b4ceea6756f63f0288941b6443a2b28c69004fe07fde0d0d"}, + {file = "pydantic_core-2.14.6-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:172de779e2a153d36ee690dbc49c6db568d7b33b18dc56b69a7514aecbcf380d"}, + {file = "pydantic_core-2.14.6-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:dfcebb950aa7e667ec226a442722134539e77c575f6cfaa423f24371bb8d2e94"}, + {file = "pydantic_core-2.14.6-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:55a23dcd98c858c0db44fc5c04fc7ed81c4b4d33c653a7c45ddaebf6563a2f66"}, + {file = "pydantic_core-2.14.6-pp37-pypy37_pp73-macosx_10_7_x86_64.whl", hash = "sha256:4241204e4b36ab5ae466ecec5c4c16527a054c69f99bba20f6f75232a6a534e2"}, + {file = "pydantic_core-2.14.6-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e574de99d735b3fc8364cba9912c2bec2da78775eba95cbb225ef7dda6acea24"}, + {file = "pydantic_core-2.14.6-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1302a54f87b5cd8528e4d6d1bf2133b6aa7c6122ff8e9dc5220fbc1e07bffebd"}, + {file = "pydantic_core-2.14.6-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f8e81e4b55930e5ffab4a68db1af431629cf2e4066dbdbfef65348b8ab804ea8"}, + {file = "pydantic_core-2.14.6-pp37-pypy37_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:c99462ffc538717b3e60151dfaf91125f637e801f5ab008f81c402f1dff0cd0f"}, + {file = "pydantic_core-2.14.6-pp37-pypy37_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:e4cf2d5829f6963a5483ec01578ee76d329eb5caf330ecd05b3edd697e7d768a"}, + {file = "pydantic_core-2.14.6-pp38-pypy38_pp73-macosx_10_7_x86_64.whl", hash = "sha256:cf10b7d58ae4a1f07fccbf4a0a956d705356fea05fb4c70608bb6fa81d103cda"}, + {file = "pydantic_core-2.14.6-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:399ac0891c284fa8eb998bcfa323f2234858f5d2efca3950ae58c8f88830f145"}, + {file = "pydantic_core-2.14.6-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c6a5c79b28003543db3ba67d1df336f253a87d3112dac3a51b94f7d48e4c0e1"}, + {file = "pydantic_core-2.14.6-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:599c87d79cab2a6a2a9df4aefe0455e61e7d2aeede2f8577c1b7c0aec643ee8e"}, + {file = "pydantic_core-2.14.6-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:43e166ad47ba900f2542a80d83f9fc65fe99eb63ceec4debec160ae729824052"}, + {file = "pydantic_core-2.14.6-pp38-pypy38_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:3a0b5db001b98e1c649dd55afa928e75aa4087e587b9524a4992316fa23c9fba"}, + {file = "pydantic_core-2.14.6-pp38-pypy38_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:747265448cb57a9f37572a488a57d873fd96bf51e5bb7edb52cfb37124516da4"}, + {file = "pydantic_core-2.14.6-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:7ebe3416785f65c28f4f9441e916bfc8a54179c8dea73c23023f7086fa601c5d"}, + {file = "pydantic_core-2.14.6-pp39-pypy39_pp73-macosx_10_7_x86_64.whl", hash = "sha256:86c963186ca5e50d5c8287b1d1c9d3f8f024cbe343d048c5bd282aec2d8641f2"}, + {file = "pydantic_core-2.14.6-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:e0641b506486f0b4cd1500a2a65740243e8670a2549bb02bc4556a83af84ae03"}, + {file = "pydantic_core-2.14.6-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71d72ca5eaaa8d38c8df16b7deb1a2da4f650c41b58bb142f3fb75d5ad4a611f"}, + {file = "pydantic_core-2.14.6-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:27e524624eace5c59af499cd97dc18bb201dc6a7a2da24bfc66ef151c69a5f2a"}, + {file = "pydantic_core-2.14.6-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a3dde6cac75e0b0902778978d3b1646ca9f438654395a362cb21d9ad34b24acf"}, + {file = "pydantic_core-2.14.6-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:00646784f6cd993b1e1c0e7b0fdcbccc375d539db95555477771c27555e3c556"}, + {file = "pydantic_core-2.14.6-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:23598acb8ccaa3d1d875ef3b35cb6376535095e9405d91a3d57a8c7db5d29341"}, + {file = "pydantic_core-2.14.6-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7f41533d7e3cf9520065f610b41ac1c76bc2161415955fbcead4981b22c7611e"}, + {file = "pydantic_core-2.14.6.tar.gz", hash = "sha256:1fd0c1d395372843fba13a51c28e3bb9d59bd7aebfeb17358ffaaa1e4dbbe948"}, +] + +[package.dependencies] +typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0" + +[[package]] +name = "pydantic-settings" +version = "2.1.0" +description = "Settings management using Pydantic" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pydantic_settings-2.1.0-py3-none-any.whl", hash = "sha256:7621c0cb5d90d1140d2f0ef557bdf03573aac7035948109adf2574770b77605a"}, + {file = "pydantic_settings-2.1.0.tar.gz", hash = "sha256:26b1492e0a24755626ac5e6d715e9077ab7ad4fb5f19a8b7ed7011d52f36141c"}, +] + +[package.dependencies] +pydantic = ">=2.3.0" +python-dotenv = ">=0.21.0" + +[[package]] +name = "pylint" +version = "3.0.3" +description = "python code static checker" +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "pylint-3.0.3-py3-none-any.whl", hash = "sha256:7a1585285aefc5165db81083c3e06363a27448f6b467b3b0f30dbd0ac1f73810"}, + {file = "pylint-3.0.3.tar.gz", hash = "sha256:58c2398b0301e049609a8429789ec6edf3aabe9b6c5fec916acd18639c16de8b"}, +] + +[package.dependencies] +astroid = ">=3.0.1,<=3.1.0-dev0" +colorama = {version = ">=0.4.5", markers = "sys_platform == \"win32\""} +dill = [ + {version = ">=0.2", markers = "python_version < \"3.11\""}, + {version = ">=0.3.6", markers = "python_version >= \"3.11\""}, +] +isort = ">=4.2.5,<5.13.0 || >5.13.0,<6" +mccabe = ">=0.6,<0.8" +platformdirs = ">=2.2.0" +tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} +tomlkit = ">=0.10.1" + +[package.extras] +spelling = ["pyenchant (>=3.2,<4.0)"] +testutils = ["gitpython (>3)"] + +[[package]] +name = "pylint-plugin-utils" +version = "0.8.2" +description = "Utilities and helpers for writing Pylint plugins" +optional = false +python-versions = ">=3.7,<4.0" +files = [ + {file = "pylint_plugin_utils-0.8.2-py3-none-any.whl", hash = "sha256:ae11664737aa2effbf26f973a9e0b6779ab7106ec0adc5fe104b0907ca04e507"}, + {file = "pylint_plugin_utils-0.8.2.tar.gz", hash = "sha256:d3cebf68a38ba3fba23a873809155562571386d4c1b03e5b4c4cc26c3eee93e4"}, +] + +[package.dependencies] +pylint = ">=1.7" + +[[package]] +name = "pylint-pydantic" +version = "0.3.2" +description = "A Pylint plugin to help Pylint understand the Pydantic" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pylint_pydantic-0.3.2-py3-none-any.whl", hash = "sha256:e5cec02370aa68ac8eff138e5d573b0ac049bab864e9a6c3a9057cf043440aa1"}, +] + +[package.dependencies] +pydantic = "<3.0" +pylint = ">2.0,<4.0" +pylint-plugin-utils = "*" + +[[package]] +name = "pymupdf" +version = "1.23.19" +description = "A high performance Python library for data extraction, analysis, conversion & manipulation of PDF (and other) documents." +optional = false +python-versions = ">=3.8" +files = [ + {file = "PyMuPDF-1.23.19-cp310-none-macosx_10_9_x86_64.whl", hash = "sha256:28634fb89ab2cfb4cd3d4d63856a088a41be77a94421e8c889d6dd2fd3762673"}, + {file = "PyMuPDF-1.23.19-cp310-none-macosx_11_0_arm64.whl", hash = "sha256:811019c3b0caa106bf35abb299ed3bd7d021357ea57b9dd4df5964906789577a"}, + {file = "PyMuPDF-1.23.19-cp310-none-manylinux2014_aarch64.whl", hash = "sha256:2e3d834feea5088af45aa0537f794f33ca54a21ee916dc8f97e997cb0ff6e0f3"}, + {file = "PyMuPDF-1.23.19-cp310-none-manylinux2014_x86_64.whl", hash = "sha256:2f8d4529c5751956d5cc76bcab664fb9450ad8315860f1e47dc06e3f9ed150e5"}, + {file = "PyMuPDF-1.23.19-cp310-none-win32.whl", hash = "sha256:241087bb0c537bf0adeadae5e328fcef38f5e259b52c8a91615b1ea225464e19"}, + {file = "PyMuPDF-1.23.19-cp310-none-win_amd64.whl", hash = "sha256:432042f2c25dc5e02a4ae328fe169ee21e83adf68eb52e668096ba02b683fd20"}, + {file = "PyMuPDF-1.23.19-cp311-none-macosx_10_9_x86_64.whl", hash = "sha256:c1258dff9ba7e8e2428f2928181b5cc07a3a32029c10518fa02cd9859ba096b5"}, + {file = "PyMuPDF-1.23.19-cp311-none-macosx_11_0_arm64.whl", hash = "sha256:0cb8dd8a23a28f4b2b3f8216a39cc24c69eb7a34cc2ea5d33c53407f6467f103"}, + {file = "PyMuPDF-1.23.19-cp311-none-manylinux2014_aarch64.whl", hash = "sha256:4d9931fd439133b50fa9637bc1055660d9874299df3033133ddf645caebb7d29"}, + {file = "PyMuPDF-1.23.19-cp311-none-manylinux2014_x86_64.whl", hash = "sha256:78aeeb1ccf39a2d83c8c263a8613a131d04d2edf6b06607c3f5e1c17f713216e"}, + {file = "PyMuPDF-1.23.19-cp311-none-win32.whl", hash = "sha256:994c2b501e9789d8b17ecd390157b44eb3335d4d72a829a2c9882341c7498209"}, + {file = "PyMuPDF-1.23.19-cp311-none-win_amd64.whl", hash = "sha256:ffaec2627d46f2fbbf1a6abd18e2fe29cfb1a9bd1ca7c5fcc319da2f600b4e07"}, + {file = "PyMuPDF-1.23.19-cp312-none-macosx_10_9_x86_64.whl", hash = "sha256:7e143222d4a557f13a8d9761c552aebbc666e05a2b1e49b2578039b1a1818198"}, + {file = "PyMuPDF-1.23.19-cp312-none-macosx_11_0_arm64.whl", hash = "sha256:3322385f85e8840fc67cacf8fde2df886e04127fb288c1d59c7281f061eded46"}, + {file = "PyMuPDF-1.23.19-cp312-none-manylinux2014_aarch64.whl", hash = "sha256:db83aefc7a61ef324f7354c41dcba016fa4feb5caaed0420555dc54833e3259d"}, + {file = "PyMuPDF-1.23.19-cp312-none-manylinux2014_x86_64.whl", hash = "sha256:4fefb1c38a53976dbb6dd9566845668f23932f567ddffd1855487c67bc5123df"}, + {file = "PyMuPDF-1.23.19-cp312-none-win32.whl", hash = "sha256:0b1218f652ba7949f4db37222352546b40c7bf2ec4b2152fdcedd50f31a49922"}, + {file = "PyMuPDF-1.23.19-cp312-none-win_amd64.whl", hash = "sha256:51e7781104854d6b1eadecef28282f80457296e8d86c07f94d09e1a1de870d6d"}, + {file = "PyMuPDF-1.23.19-cp38-none-macosx_10_9_x86_64.whl", hash = "sha256:4ea20fecbc3e32ea60138bf846a859acb1db3e53883197bdb7d9115bbca37581"}, + {file = "PyMuPDF-1.23.19-cp38-none-macosx_11_0_arm64.whl", hash = "sha256:683f9d829922433f7249f2feffb350ac5d4971dd8d685dd941042ad1308feec2"}, + {file = "PyMuPDF-1.23.19-cp38-none-manylinux2014_aarch64.whl", hash = "sha256:6ff1ac703db64f890796e6f06536206f613704aba6e4fcec764ae63f6d67c5ff"}, + {file = "PyMuPDF-1.23.19-cp38-none-manylinux2014_x86_64.whl", hash = "sha256:d1a33697c832aefc1d8697d739f5ca09964459c68a75ca59e42592bc6c721a1d"}, + {file = "PyMuPDF-1.23.19-cp38-none-win32.whl", hash = "sha256:d4fbb8fa647d741583abde7ddfc543859ad97eb237f4afa7f451239044f2df2b"}, + {file = "PyMuPDF-1.23.19-cp38-none-win_amd64.whl", hash = "sha256:c269d89843baa4c7f49bb85a1b8d78079a7858e7181545eaccacd88a01cb9869"}, + {file = "PyMuPDF-1.23.19-cp39-none-macosx_10_9_x86_64.whl", hash = "sha256:c7fc378a2634ffc4d20344b0ee8a370f250ccfd8a1a4a87cac51e7472ae56ddd"}, + {file = "PyMuPDF-1.23.19-cp39-none-macosx_11_0_arm64.whl", hash = "sha256:cb16b16db848f0dec59f5fe603fadfcb5c0c4823538590e7c34e0ace1072887c"}, + {file = "PyMuPDF-1.23.19-cp39-none-manylinux2014_aarch64.whl", hash = "sha256:83253dcafa8179ae505b92fdd04146109ffc3808860984d7830e1ec6bc072144"}, + {file = "PyMuPDF-1.23.19-cp39-none-manylinux2014_x86_64.whl", hash = "sha256:a5ecb8f96851a610cfd0413e2ed2cdcc13d98b526b4aa84e493eef49399d20be"}, + {file = "PyMuPDF-1.23.19-cp39-none-win32.whl", hash = "sha256:96d64b10c267e6c90f5e98a75e2cd41fbb3a2d4c09ae0fe75875eee5072cc103"}, + {file = "PyMuPDF-1.23.19-cp39-none-win_amd64.whl", hash = "sha256:2b415c6909b00e1bdd4ee77b878b2807f04382c68339535c8beb1d05a292c8ec"}, + {file = "PyMuPDF-1.23.19.tar.gz", hash = "sha256:314b3da25c00a8e9a8db673665b2bf4fe40d02d460449bed7a3b94d5cf2aef92"}, +] + +[package.dependencies] +PyMuPDFb = "1.23.9" + +[[package]] +name = "pymupdfb" +version = "1.23.9" +description = "MuPDF shared libraries for PyMuPDF." +optional = false +python-versions = ">=3.8" +files = [ + {file = "PyMuPDFb-1.23.9-py3-none-macosx_10_9_x86_64.whl", hash = "sha256:457cede084f0a6a80a5b3b678b48f72f5f7185f4be93440bd3b062472588cd05"}, + {file = "PyMuPDFb-1.23.9-py3-none-macosx_11_0_arm64.whl", hash = "sha256:ecf27e040d5faeadb1ade715a4b65cd8a23c6bc40c111df5a685b68ce4d779d2"}, + {file = "PyMuPDFb-1.23.9-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:29ab88d23eedd1e2f29e21692945dabfcff3d3b1f6bd97ac35d4984e9bd32ed0"}, + {file = "PyMuPDFb-1.23.9-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:bc7703ce110784d7b7f1fc7a59cb36072a07c6b2d19f5a5bf0a960227a8adb5c"}, + {file = "PyMuPDFb-1.23.9-py3-none-win32.whl", hash = "sha256:3f549891e558a6fc335eafe23d50bd4fda3c5f2dbfd7e9edf362d21ef5945fe9"}, + {file = "PyMuPDFb-1.23.9-py3-none-win_amd64.whl", hash = "sha256:6a2a631fbd03330347b1ecf53f5534c4f7375b44e60b5ad8f36c5c96d4e6ec35"}, +] + +[[package]] +name = "pyomo" +version = "6.7.0" +description = "Pyomo: Python Optimization Modeling Objects" +optional = false +python-versions = ">=3.8" +files = [ + {file = "Pyomo-6.7.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f5220325bb650e9517977068e48d73ad2533bc4eb96994622dcf89b608448c46"}, + {file = "Pyomo-6.7.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9001a237284e077d8515461fd78ccacf32e5d145afc6e02f95aee64376783545"}, + {file = "Pyomo-6.7.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c58d597b3fe4f4796155d1a99705415c821331afb21a8e164593954a0382151a"}, + {file = "Pyomo-6.7.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f670cd5ce5b19ba13f8c051ca84a05ef7931c65db92ee573181d9e53258e4e8"}, + {file = "Pyomo-6.7.0-cp310-cp310-win_amd64.whl", hash = "sha256:f11a1cc382f320f122f9bc3af47c1e1a650090775f679cfb1649af6670f3a730"}, + {file = "Pyomo-6.7.0-cp310-cp310-win_arm64.whl", hash = "sha256:f3b1d921fc8883e2b82b892c43509c8e9b871559f05ce8ab12101c2ea84efb03"}, + {file = "Pyomo-6.7.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6220a923934c7b549af04fefe4adf68b38bd8364e4943311b4dab33136a8998b"}, + {file = "Pyomo-6.7.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:273648340589c5e06063166690ba2124ab6fa3f4b6522a97a5666b9112c6284b"}, + {file = "Pyomo-6.7.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:de9ebe6fa3ce46b3f17e188e88c19ec9d6313a0f30e3ae8e87027cbee2d9bc27"}, + {file = "Pyomo-6.7.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fafb25a8509db466905e5f2d39897739cf54eef23c124171a5b4f2c9d197e8bc"}, + {file = "Pyomo-6.7.0-cp311-cp311-win_amd64.whl", hash = "sha256:19dea19aee85ba713b0b9176ef7b35c9ac791661d736b721391a5da4443b6e55"}, + {file = "Pyomo-6.7.0-cp311-cp311-win_arm64.whl", hash = "sha256:3cfa11778788617cecc119fedbb4a1e823b5ec8ff0851d04c3ee422b52bc1dec"}, + {file = "Pyomo-6.7.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:0ecde12e9a5f3834f9d14171a22e2f7e1b716fbd0a20addcb12f96321835e0e3"}, + {file = "Pyomo-6.7.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f3b9e9e787609f3f9f825177223829c2372c210e4148a15a3dfa47f1f383c61e"}, + {file = "Pyomo-6.7.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:92c9a26a4de790d9b63484eac99325881fe4c272f74dcc7ade03fc43060764f8"}, + {file = "Pyomo-6.7.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:12d8d78df6fe44d02b5f715908537887ba1eee5a674b03ab97311637b3387622"}, + {file = "Pyomo-6.7.0-cp312-cp312-win_amd64.whl", hash = "sha256:16a59e7a34cfaf04f1265b3b7ce4c9d6ebde637906aa7c60a14f99f6c59f3188"}, + {file = "Pyomo-6.7.0-cp312-cp312-win_arm64.whl", hash = "sha256:028e703eeeaa245e1dab870a64a1b505f25e657dcac3c8d654c2f39c260c65e5"}, + {file = "Pyomo-6.7.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:677d7ba1189b735aecd27a7f475941194b5ac45d7230aa1e9f76d9091537e647"}, + {file = "Pyomo-6.7.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9e419df08979910ebdeb184e4cd86568d9b4737518ebf593d5d1e282f45bf575"}, + {file = "Pyomo-6.7.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2c6f37bbeceaa128c3aa288b169f37f27f1050b47a6fc27dfd70c3846ee315c8"}, + {file = "Pyomo-6.7.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85841099a068329cddd401f5e6cd5a5cd951a6b2f450ae990d8bea5bf0d8626e"}, + {file = "Pyomo-6.7.0-cp38-cp38-win_amd64.whl", hash = "sha256:95b66bfd8212b4b03a6f6573b54f17bfd4b36bacb4548e8b7204eda2032b1c34"}, + {file = "Pyomo-6.7.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d69d1bea311c23d745d82e0926ff6508d53880de89028f1c1648a929fbb9ea81"}, + {file = "Pyomo-6.7.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8f1256766d9a2937b1ed46dfddf29f43f40a2b55980d1e1dcb31cb616a7d9da3"}, + {file = "Pyomo-6.7.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b44140344b0df548810b176acd509d940ec78c5b99e189f36d5d737ce829165a"}, + {file = "Pyomo-6.7.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90a17fa2758f6ae9bea8c1cdc9d8ea78bf69f75658dcddd20d6a71ee70a13c1a"}, + {file = "Pyomo-6.7.0-cp39-cp39-win_amd64.whl", hash = "sha256:d247ea9978ef72c6acf778f78a84e836fb9fec8e394f75fbe9c00bba62faf2be"}, + {file = "Pyomo-6.7.0-cp39-cp39-win_arm64.whl", hash = "sha256:b8885756c31b87886d3b5a14369b034169da7bf310d3ac7c96e7bdd78e59aa65"}, + {file = "Pyomo-6.7.0.tar.gz", hash = "sha256:a245ec609ef2fd907269f0b8e0923f74d5bf868b2ec0e62bf2a30b3f253bd17b"}, +] + +[package.dependencies] +ply = "*" + +[package.extras] +docs = ["Sphinx (>4)", "numpy", "scipy", "sphinx-copybutton", "sphinx-rtd-theme (>0.5)", "sphinxcontrib-jsmath", "sphinxcontrib-napoleon"] +optional = ["casadi", "dill", "ipython", "matplotlib (!=3.6.1)", "networkx", "networkx (<3.2)", "numdifftools", "numpy", "openpyxl", "pandas", "pint", "plotly", "python-louvain", "pywin32", "pyyaml", "scipy", "seaborn", "sympy", "xlrd", "z3-solver"] +tests = ["coverage", "parameterized", "pybind11", "pytest", "pytest-parallel"] + +[[package]] +name = "pytest" +version = "7.4.0" +description = "pytest: simple powerful testing with Python" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pytest-7.4.0-py3-none-any.whl", hash = "sha256:78bf16451a2eb8c7a2ea98e32dc119fd2aa758f1d5d66dbf0a59d69a3969df32"}, + {file = "pytest-7.4.0.tar.gz", hash = "sha256:b4bf8c45bd59934ed84001ad51e11b4ee40d40a1229d2c79f9c592b0a3f6bd8a"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "sys_platform == \"win32\""} +exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} +iniconfig = "*" +packaging = "*" +pluggy = ">=0.12,<2.0" +tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} + +[package.extras] +testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] + +[[package]] +name = "pytest-asyncio" +version = "0.21.1" +description = "Pytest support for asyncio" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pytest-asyncio-0.21.1.tar.gz", hash = "sha256:40a7eae6dded22c7b604986855ea48400ab15b069ae38116e8c01238e9eeb64d"}, + {file = "pytest_asyncio-0.21.1-py3-none-any.whl", hash = "sha256:8666c1c8ac02631d7c51ba282e0c69a8a452b211ffedf2599099845da5c5c37b"}, +] + +[package.dependencies] +pytest = ">=7.0.0" + +[package.extras] +docs = ["sphinx (>=5.3)", "sphinx-rtd-theme (>=1.0)"] +testing = ["coverage (>=6.2)", "flaky (>=3.5.0)", "hypothesis (>=5.7.1)", "mypy (>=0.931)", "pytest-trio (>=0.7.0)"] + +[[package]] +name = "pytest-env" +version = "1.0.0" +description = "py.test plugin that allows you to add environment variables." +optional = false +python-versions = ">=3.7" +files = [ + {file = "pytest_env-1.0.0-py3-none-any.whl", hash = "sha256:c5ec593abf2430e21aec5b62ef50a0d894de634e84c935a44f3fe9663c5868c6"}, + {file = "pytest_env-1.0.0.tar.gz", hash = "sha256:3265fe88f570337635689bacd9dafbe6e227c524abdb2b0f46454d6b6011a51c"}, +] + +[package.dependencies] +pytest = ">=7.3.1" + +[package.extras] +test = ["coverage (>=7.2.7)", "pytest-mock (>=3.10)"] + +[[package]] +name = "python-box" +version = "5.4.1" +description = "Advanced Python dictionaries with dot notation access" +optional = false +python-versions = ">=3.6" +files = [ + {file = "python-box-5.4.1.tar.gz", hash = "sha256:b68e0f8abc86f3deda751b3390f64df64a0989459de51ba4db949662a7b4d8ac"}, + {file = "python_box-5.4.1-py3-none-any.whl", hash = "sha256:60ae9156de34cf92b899bd099580950df70a5b0813e67a3310a1cdd1976457fa"}, +] + +[package.extras] +all = ["msgpack", "ruamel.yaml", "toml"] +msgpack = ["msgpack"] +pyyaml = ["PyYAML"] +ruamel-yaml = ["ruamel.yaml"] +toml = ["toml"] +yaml = ["ruamel.yaml"] + +[[package]] +name = "python-dateutil" +version = "2.8.2" +description = "Extensions to the standard Python datetime module" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +files = [ + {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, + {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, +] + +[package.dependencies] +six = ">=1.5" + +[[package]] +name = "python-dotenv" +version = "1.0.1" +description = "Read key-value pairs from a .env file and set them as environment variables" +optional = false +python-versions = ">=3.8" +files = [ + {file = "python-dotenv-1.0.1.tar.gz", hash = "sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca"}, + {file = "python_dotenv-1.0.1-py3-none-any.whl", hash = "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a"}, +] + +[package.extras] +cli = ["click (>=5.0)"] + +[[package]] +name = "python-jose" +version = "3.3.0" +description = "JOSE implementation in Python" +optional = false +python-versions = "*" +files = [ + {file = "python-jose-3.3.0.tar.gz", hash = "sha256:55779b5e6ad599c6336191246e95eb2293a9ddebd555f796a65f838f07e5d78a"}, + {file = "python_jose-3.3.0-py2.py3-none-any.whl", hash = "sha256:9b1376b023f8b298536eedd47ae1089bcdb848f1535ab30555cd92002d78923a"}, +] + +[package.dependencies] +cryptography = {version = ">=3.4.0", optional = true, markers = "extra == \"cryptography\""} +ecdsa = "!=0.15" +pyasn1 = "*" +rsa = "*" + +[package.extras] +cryptography = ["cryptography (>=3.4.0)"] +pycrypto = ["pyasn1", "pycrypto (>=2.6.0,<2.7.0)"] +pycryptodome = ["pyasn1", "pycryptodome (>=3.3.1,<4.0.0)"] + +[[package]] +name = "pytz" +version = "2023.3.post1" +description = "World timezone definitions, modern and historical" +optional = false +python-versions = "*" +files = [ + {file = "pytz-2023.3.post1-py2.py3-none-any.whl", hash = "sha256:ce42d816b81b68506614c11e8937d3aa9e41007ceb50bfdcb0749b921bf646c7"}, + {file = "pytz-2023.3.post1.tar.gz", hash = "sha256:7b4fddbeb94a1eba4b557da24f19fdf9db575192544270a9101d8509f9f43d7b"}, +] + +[[package]] +name = "pyyaml" +version = "6.0.1" +description = "YAML parser and emitter for Python" +optional = false +python-versions = ">=3.6" +files = [ + {file = "PyYAML-6.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a"}, + {file = "PyYAML-6.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"}, + {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"}, + {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"}, + {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"}, + {file = "PyYAML-6.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"}, + {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, + {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, + {file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd"}, + {file = "PyYAML-6.0.1-cp36-cp36m-win32.whl", hash = "sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585"}, + {file = "PyYAML-6.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa"}, + {file = "PyYAML-6.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c"}, + {file = "PyYAML-6.0.1-cp37-cp37m-win32.whl", hash = "sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba"}, + {file = "PyYAML-6.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867"}, + {file = "PyYAML-6.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"}, + {file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"}, + {file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"}, + {file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"}, + {file = "PyYAML-6.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"}, + {file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"}, + {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"}, + {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, +] + +[[package]] +name = "redis" +version = "4.6.0" +description = "Python client for Redis database and key-value store" +optional = false +python-versions = ">=3.7" +files = [ + {file = "redis-4.6.0-py3-none-any.whl", hash = "sha256:e2b03db868160ee4591de3cb90d40ebb50a90dd302138775937f6a42b7ed183c"}, + {file = "redis-4.6.0.tar.gz", hash = "sha256:585dc516b9eb042a619ef0a39c3d7d55fe81bdb4df09a52c9cdde0d07bf1aa7d"}, +] + +[package.dependencies] +async-timeout = {version = ">=4.0.2", markers = "python_full_version <= \"3.11.2\""} + +[package.extras] +hiredis = ["hiredis (>=1.0.0)"] +ocsp = ["cryptography (>=36.0.1)", "pyopenssl (==20.0.1)", "requests (>=2.26.0)"] + +[[package]] +name = "regex" +version = "2023.12.25" +description = "Alternative regular expression module, to replace re." +optional = false +python-versions = ">=3.7" +files = [ + {file = "regex-2023.12.25-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0694219a1d54336fd0445ea382d49d36882415c0134ee1e8332afd1529f0baa5"}, + {file = "regex-2023.12.25-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b014333bd0217ad3d54c143de9d4b9a3ca1c5a29a6d0d554952ea071cff0f1f8"}, + {file = "regex-2023.12.25-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d865984b3f71f6d0af64d0d88f5733521698f6c16f445bb09ce746c92c97c586"}, + {file = "regex-2023.12.25-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1e0eabac536b4cc7f57a5f3d095bfa557860ab912f25965e08fe1545e2ed8b4c"}, + {file = "regex-2023.12.25-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c25a8ad70e716f96e13a637802813f65d8a6760ef48672aa3502f4c24ea8b400"}, + {file = "regex-2023.12.25-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a9b6d73353f777630626f403b0652055ebfe8ff142a44ec2cf18ae470395766e"}, + {file = "regex-2023.12.25-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9cc99d6946d750eb75827cb53c4371b8b0fe89c733a94b1573c9dd16ea6c9e4"}, + {file = "regex-2023.12.25-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88d1f7bef20c721359d8675f7d9f8e414ec5003d8f642fdfd8087777ff7f94b5"}, + {file = "regex-2023.12.25-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:cb3fe77aec8f1995611f966d0c656fdce398317f850d0e6e7aebdfe61f40e1cd"}, + {file = "regex-2023.12.25-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:7aa47c2e9ea33a4a2a05f40fcd3ea36d73853a2aae7b4feab6fc85f8bf2c9704"}, + {file = "regex-2023.12.25-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:df26481f0c7a3f8739fecb3e81bc9da3fcfae34d6c094563b9d4670b047312e1"}, + {file = "regex-2023.12.25-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:c40281f7d70baf6e0db0c2f7472b31609f5bc2748fe7275ea65a0b4601d9b392"}, + {file = "regex-2023.12.25-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:d94a1db462d5690ebf6ae86d11c5e420042b9898af5dcf278bd97d6bda065423"}, + {file = "regex-2023.12.25-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ba1b30765a55acf15dce3f364e4928b80858fa8f979ad41f862358939bdd1f2f"}, + {file = "regex-2023.12.25-cp310-cp310-win32.whl", hash = "sha256:150c39f5b964e4d7dba46a7962a088fbc91f06e606f023ce57bb347a3b2d4630"}, + {file = "regex-2023.12.25-cp310-cp310-win_amd64.whl", hash = "sha256:09da66917262d9481c719599116c7dc0c321ffcec4b1f510c4f8a066f8768105"}, + {file = "regex-2023.12.25-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:1b9d811f72210fa9306aeb88385b8f8bcef0dfbf3873410413c00aa94c56c2b6"}, + {file = "regex-2023.12.25-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d902a43085a308cef32c0d3aea962524b725403fd9373dea18110904003bac97"}, + {file = "regex-2023.12.25-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d166eafc19f4718df38887b2bbe1467a4f74a9830e8605089ea7a30dd4da8887"}, + {file = "regex-2023.12.25-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7ad32824b7f02bb3c9f80306d405a1d9b7bb89362d68b3c5a9be53836caebdb"}, + {file = "regex-2023.12.25-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:636ba0a77de609d6510235b7f0e77ec494d2657108f777e8765efc060094c98c"}, + {file = "regex-2023.12.25-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0fda75704357805eb953a3ee15a2b240694a9a514548cd49b3c5124b4e2ad01b"}, + {file = "regex-2023.12.25-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f72cbae7f6b01591f90814250e636065850c5926751af02bb48da94dfced7baa"}, + {file = "regex-2023.12.25-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:db2a0b1857f18b11e3b0e54ddfefc96af46b0896fb678c85f63fb8c37518b3e7"}, + {file = "regex-2023.12.25-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:7502534e55c7c36c0978c91ba6f61703faf7ce733715ca48f499d3dbbd7657e0"}, + {file = "regex-2023.12.25-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:e8c7e08bb566de4faaf11984af13f6bcf6a08f327b13631d41d62592681d24fe"}, + {file = "regex-2023.12.25-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:283fc8eed679758de38fe493b7d7d84a198b558942b03f017b1f94dda8efae80"}, + {file = "regex-2023.12.25-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:f44dd4d68697559d007462b0a3a1d9acd61d97072b71f6d1968daef26bc744bd"}, + {file = "regex-2023.12.25-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:67d3ccfc590e5e7197750fcb3a2915b416a53e2de847a728cfa60141054123d4"}, + {file = "regex-2023.12.25-cp311-cp311-win32.whl", hash = "sha256:68191f80a9bad283432385961d9efe09d783bcd36ed35a60fb1ff3f1ec2efe87"}, + {file = "regex-2023.12.25-cp311-cp311-win_amd64.whl", hash = "sha256:7d2af3f6b8419661a0c421584cfe8aaec1c0e435ce7e47ee2a97e344b98f794f"}, + {file = "regex-2023.12.25-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:8a0ccf52bb37d1a700375a6b395bff5dd15c50acb745f7db30415bae3c2b0715"}, + {file = "regex-2023.12.25-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c3c4a78615b7762740531c27cf46e2f388d8d727d0c0c739e72048beb26c8a9d"}, + {file = "regex-2023.12.25-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ad83e7545b4ab69216cef4cc47e344d19622e28aabec61574b20257c65466d6a"}, + {file = "regex-2023.12.25-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b7a635871143661feccce3979e1727c4e094f2bdfd3ec4b90dfd4f16f571a87a"}, + {file = "regex-2023.12.25-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d498eea3f581fbe1b34b59c697512a8baef88212f92e4c7830fcc1499f5b45a5"}, + {file = "regex-2023.12.25-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:43f7cd5754d02a56ae4ebb91b33461dc67be8e3e0153f593c509e21d219c5060"}, + {file = "regex-2023.12.25-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:51f4b32f793812714fd5307222a7f77e739b9bc566dc94a18126aba3b92b98a3"}, + {file = "regex-2023.12.25-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ba99d8077424501b9616b43a2d208095746fb1284fc5ba490139651f971d39d9"}, + {file = "regex-2023.12.25-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:4bfc2b16e3ba8850e0e262467275dd4d62f0d045e0e9eda2bc65078c0110a11f"}, + {file = "regex-2023.12.25-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8c2c19dae8a3eb0ea45a8448356ed561be843b13cbc34b840922ddf565498c1c"}, + {file = "regex-2023.12.25-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:60080bb3d8617d96f0fb7e19796384cc2467447ef1c491694850ebd3670bc457"}, + {file = "regex-2023.12.25-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b77e27b79448e34c2c51c09836033056a0547aa360c45eeeb67803da7b0eedaf"}, + {file = "regex-2023.12.25-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:518440c991f514331f4850a63560321f833979d145d7d81186dbe2f19e27ae3d"}, + {file = "regex-2023.12.25-cp312-cp312-win32.whl", hash = "sha256:e2610e9406d3b0073636a3a2e80db05a02f0c3169b5632022b4e81c0364bcda5"}, + {file = "regex-2023.12.25-cp312-cp312-win_amd64.whl", hash = "sha256:cc37b9aeebab425f11f27e5e9e6cf580be7206c6582a64467a14dda211abc232"}, + {file = "regex-2023.12.25-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:da695d75ac97cb1cd725adac136d25ca687da4536154cdc2815f576e4da11c69"}, + {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d126361607b33c4eb7b36debc173bf25d7805847346dd4d99b5499e1fef52bc7"}, + {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4719bb05094d7d8563a450cf8738d2e1061420f79cfcc1fa7f0a44744c4d8f73"}, + {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5dd58946bce44b53b06d94aa95560d0b243eb2fe64227cba50017a8d8b3cd3e2"}, + {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:22a86d9fff2009302c440b9d799ef2fe322416d2d58fc124b926aa89365ec482"}, + {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2aae8101919e8aa05ecfe6322b278f41ce2994c4a430303c4cd163fef746e04f"}, + {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e692296c4cc2873967771345a876bcfc1c547e8dd695c6b89342488b0ea55cd8"}, + {file = "regex-2023.12.25-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:263ef5cc10979837f243950637fffb06e8daed7f1ac1e39d5910fd29929e489a"}, + {file = "regex-2023.12.25-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:d6f7e255e5fa94642a0724e35406e6cb7001c09d476ab5fce002f652b36d0c39"}, + {file = "regex-2023.12.25-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:88ad44e220e22b63b0f8f81f007e8abbb92874d8ced66f32571ef8beb0643b2b"}, + {file = "regex-2023.12.25-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:3a17d3ede18f9cedcbe23d2daa8a2cd6f59fe2bf082c567e43083bba3fb00347"}, + {file = "regex-2023.12.25-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d15b274f9e15b1a0b7a45d2ac86d1f634d983ca40d6b886721626c47a400bf39"}, + {file = "regex-2023.12.25-cp37-cp37m-win32.whl", hash = "sha256:ed19b3a05ae0c97dd8f75a5d8f21f7723a8c33bbc555da6bbe1f96c470139d3c"}, + {file = "regex-2023.12.25-cp37-cp37m-win_amd64.whl", hash = "sha256:a6d1047952c0b8104a1d371f88f4ab62e6275567d4458c1e26e9627ad489b445"}, + {file = "regex-2023.12.25-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:b43523d7bc2abd757119dbfb38af91b5735eea45537ec6ec3a5ec3f9562a1c53"}, + {file = "regex-2023.12.25-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:efb2d82f33b2212898f1659fb1c2e9ac30493ac41e4d53123da374c3b5541e64"}, + {file = "regex-2023.12.25-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b7fca9205b59c1a3d5031f7e64ed627a1074730a51c2a80e97653e3e9fa0d415"}, + {file = "regex-2023.12.25-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:086dd15e9435b393ae06f96ab69ab2d333f5d65cbe65ca5a3ef0ec9564dfe770"}, + {file = "regex-2023.12.25-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e81469f7d01efed9b53740aedd26085f20d49da65f9c1f41e822a33992cb1590"}, + {file = "regex-2023.12.25-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:34e4af5b27232f68042aa40a91c3b9bb4da0eeb31b7632e0091afc4310afe6cb"}, + {file = "regex-2023.12.25-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9852b76ab558e45b20bf1893b59af64a28bd3820b0c2efc80e0a70a4a3ea51c1"}, + {file = "regex-2023.12.25-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ff100b203092af77d1a5a7abe085b3506b7eaaf9abf65b73b7d6905b6cb76988"}, + {file = "regex-2023.12.25-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:cc038b2d8b1470364b1888a98fd22d616fba2b6309c5b5f181ad4483e0017861"}, + {file = "regex-2023.12.25-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:094ba386bb5c01e54e14434d4caabf6583334090865b23ef58e0424a6286d3dc"}, + {file = "regex-2023.12.25-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:5cd05d0f57846d8ba4b71d9c00f6f37d6b97d5e5ef8b3c3840426a475c8f70f4"}, + {file = "regex-2023.12.25-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:9aa1a67bbf0f957bbe096375887b2505f5d8ae16bf04488e8b0f334c36e31360"}, + {file = "regex-2023.12.25-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:98a2636994f943b871786c9e82bfe7883ecdaba2ef5df54e1450fa9869d1f756"}, + {file = "regex-2023.12.25-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:37f8e93a81fc5e5bd8db7e10e62dc64261bcd88f8d7e6640aaebe9bc180d9ce2"}, + {file = "regex-2023.12.25-cp38-cp38-win32.whl", hash = "sha256:d78bd484930c1da2b9679290a41cdb25cc127d783768a0369d6b449e72f88beb"}, + {file = "regex-2023.12.25-cp38-cp38-win_amd64.whl", hash = "sha256:b521dcecebc5b978b447f0f69b5b7f3840eac454862270406a39837ffae4e697"}, + {file = "regex-2023.12.25-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:f7bc09bc9c29ebead055bcba136a67378f03d66bf359e87d0f7c759d6d4ffa31"}, + {file = "regex-2023.12.25-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e14b73607d6231f3cc4622809c196b540a6a44e903bcfad940779c80dffa7be7"}, + {file = "regex-2023.12.25-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9eda5f7a50141291beda3edd00abc2d4a5b16c29c92daf8d5bd76934150f3edc"}, + {file = "regex-2023.12.25-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc6bb9aa69aacf0f6032c307da718f61a40cf970849e471254e0e91c56ffca95"}, + {file = "regex-2023.12.25-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:298dc6354d414bc921581be85695d18912bea163a8b23cac9a2562bbcd5088b1"}, + {file = "regex-2023.12.25-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2f4e475a80ecbd15896a976aa0b386c5525d0ed34d5c600b6d3ebac0a67c7ddf"}, + {file = "regex-2023.12.25-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:531ac6cf22b53e0696f8e1d56ce2396311254eb806111ddd3922c9d937151dae"}, + {file = "regex-2023.12.25-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:22f3470f7524b6da61e2020672df2f3063676aff444db1daa283c2ea4ed259d6"}, + {file = "regex-2023.12.25-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:89723d2112697feaa320c9d351e5f5e7b841e83f8b143dba8e2d2b5f04e10923"}, + {file = "regex-2023.12.25-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0ecf44ddf9171cd7566ef1768047f6e66975788258b1c6c6ca78098b95cf9a3d"}, + {file = "regex-2023.12.25-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:905466ad1702ed4acfd67a902af50b8db1feeb9781436372261808df7a2a7bca"}, + {file = "regex-2023.12.25-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:4558410b7a5607a645e9804a3e9dd509af12fb72b9825b13791a37cd417d73a5"}, + {file = "regex-2023.12.25-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:7e316026cc1095f2a3e8cc012822c99f413b702eaa2ca5408a513609488cb62f"}, + {file = "regex-2023.12.25-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:3b1de218d5375cd6ac4b5493e0b9f3df2be331e86520f23382f216c137913d20"}, + {file = "regex-2023.12.25-cp39-cp39-win32.whl", hash = "sha256:11a963f8e25ab5c61348d090bf1b07f1953929c13bd2309a0662e9ff680763c9"}, + {file = "regex-2023.12.25-cp39-cp39-win_amd64.whl", hash = "sha256:e693e233ac92ba83a87024e1d32b5f9ab15ca55ddd916d878146f4e3406b5c91"}, + {file = "regex-2023.12.25.tar.gz", hash = "sha256:29171aa128da69afdf4bde412d5bedc335f2ca8fcfe4489038577d05f16181e5"}, +] + +[[package]] +name = "requests" +version = "2.31.0" +description = "Python HTTP for Humans." +optional = false +python-versions = ">=3.7" +files = [ + {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, + {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, +] + +[package.dependencies] +certifi = ">=2017.4.17" +charset-normalizer = ">=2,<4" +idna = ">=2.5,<4" +urllib3 = ">=1.21.1,<3" + +[package.extras] +socks = ["PySocks (>=1.5.6,!=1.5.7)"] +use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] + +[[package]] +name = "rfc3986" +version = "1.5.0" +description = "Validating URI References per RFC 3986" +optional = false +python-versions = "*" +files = [ + {file = "rfc3986-1.5.0-py2.py3-none-any.whl", hash = "sha256:a86d6e1f5b1dc238b218b012df0aa79409667bb209e58da56d0b94704e712a97"}, + {file = "rfc3986-1.5.0.tar.gz", hash = "sha256:270aaf10d87d0d4e095063c65bf3ddbc6ee3d0b226328ce21e036f946e421835"}, +] + +[package.dependencies] +idna = {version = "*", optional = true, markers = "extra == \"idna2008\""} + +[package.extras] +idna2008 = ["idna"] + +[[package]] +name = "rsa" +version = "4.9" +description = "Pure-Python RSA implementation" +optional = false +python-versions = ">=3.6,<4" +files = [ + {file = "rsa-4.9-py3-none-any.whl", hash = "sha256:90260d9058e514786967344d0ef75fa8727eed8a7d2e43ce9f4bcf1b536174f7"}, + {file = "rsa-4.9.tar.gz", hash = "sha256:e38464a49c6c85d7f1351b0126661487a7e0a14a50f1675ec50eb34d4f20ef21"}, +] + +[package.dependencies] +pyasn1 = ">=0.1.3" + +[[package]] +name = "setuptools" +version = "67.8.0" +description = "Easily download, build, install, upgrade, and uninstall Python packages" +optional = false +python-versions = ">=3.7" +files = [ + {file = "setuptools-67.8.0-py3-none-any.whl", hash = "sha256:5df61bf30bb10c6f756eb19e7c9f3b473051f48db77fddbe06ff2ca307df9a6f"}, + {file = "setuptools-67.8.0.tar.gz", hash = "sha256:62642358adc77ffa87233bc4d2354c4b2682d214048f500964dbe760ccedf102"}, +] + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-hoverxref (<2)", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (==0.8.3)", "sphinx-reredirects", "sphinxcontrib-towncrier"] +testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pip-run (>=8.8)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] +testing-integration = ["build[virtualenv]", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] + +[[package]] +name = "six" +version = "1.16.0" +description = "Python 2 and 3 compatibility utilities" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, + {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, +] + +[[package]] +name = "sniffio" +version = "1.3.0" +description = "Sniff out which async library your code is running under" +optional = false +python-versions = ">=3.7" +files = [ + {file = "sniffio-1.3.0-py3-none-any.whl", hash = "sha256:eecefdce1e5bbfb7ad2eeaabf7c1eeb404d7757c379bd1f7e5cce9d8bf425384"}, + {file = "sniffio-1.3.0.tar.gz", hash = "sha256:e60305c5e5d314f5389259b7f22aaa33d8f7dee49763119234af3755c55b9101"}, +] + +[[package]] +name = "sqlakeyset" +version = "2.0.1706067133" +description = "offset-free paging for sqlalchemy" +optional = false +python-versions = ">=3.7,<4.0" +files = [ + {file = "sqlakeyset-2.0.1706067133-py3-none-any.whl", hash = "sha256:a2432d1e72daea1a8cf91ccccb25068cf4ec12ba12eced6f4e5954391823c9ef"}, + {file = "sqlakeyset-2.0.1706067133.tar.gz", hash = "sha256:a74680a2d3dce89d3e9a3d50126a7bb66eb56ce0bfaf8a5ae025361a7d1741e0"}, +] + +[package.dependencies] +packaging = ">=20.0" +python-dateutil = "*" +sqlalchemy = ">=1.3.11" +typing_extensions = ">=4,<5" + +[[package]] +name = "sqlalchemy" +version = "2.0.25" +description = "Database Abstraction Library" +optional = false +python-versions = ">=3.7" +files = [ + {file = "SQLAlchemy-2.0.25-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4344d059265cc8b1b1be351bfb88749294b87a8b2bbe21dfbe066c4199541ebd"}, + {file = "SQLAlchemy-2.0.25-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6f9e2e59cbcc6ba1488404aad43de005d05ca56e069477b33ff74e91b6319735"}, + {file = "SQLAlchemy-2.0.25-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:84daa0a2055df9ca0f148a64fdde12ac635e30edbca80e87df9b3aaf419e144a"}, + {file = "SQLAlchemy-2.0.25-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc8b7dabe8e67c4832891a5d322cec6d44ef02f432b4588390017f5cec186a84"}, + {file = "SQLAlchemy-2.0.25-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:f5693145220517b5f42393e07a6898acdfe820e136c98663b971906120549da5"}, + {file = "SQLAlchemy-2.0.25-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:db854730a25db7c956423bb9fb4bdd1216c839a689bf9cc15fada0a7fb2f4570"}, + {file = "SQLAlchemy-2.0.25-cp310-cp310-win32.whl", hash = "sha256:14a6f68e8fc96e5e8f5647ef6cda6250c780612a573d99e4d881581432ef1669"}, + {file = "SQLAlchemy-2.0.25-cp310-cp310-win_amd64.whl", hash = "sha256:87f6e732bccd7dcf1741c00f1ecf33797383128bd1c90144ac8adc02cbb98643"}, + {file = "SQLAlchemy-2.0.25-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:342d365988ba88ada8af320d43df4e0b13a694dbd75951f537b2d5e4cb5cd002"}, + {file = "SQLAlchemy-2.0.25-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f37c0caf14b9e9b9e8f6dbc81bc56db06acb4363eba5a633167781a48ef036ed"}, + {file = "SQLAlchemy-2.0.25-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa9373708763ef46782d10e950b49d0235bfe58facebd76917d3f5cbf5971aed"}, + {file = "SQLAlchemy-2.0.25-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d24f571990c05f6b36a396218f251f3e0dda916e0c687ef6fdca5072743208f5"}, + {file = "SQLAlchemy-2.0.25-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:75432b5b14dc2fff43c50435e248b45c7cdadef73388e5610852b95280ffd0e9"}, + {file = "SQLAlchemy-2.0.25-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:884272dcd3ad97f47702965a0e902b540541890f468d24bd1d98bcfe41c3f018"}, + {file = "SQLAlchemy-2.0.25-cp311-cp311-win32.whl", hash = "sha256:e607cdd99cbf9bb80391f54446b86e16eea6ad309361942bf88318bcd452363c"}, + {file = "SQLAlchemy-2.0.25-cp311-cp311-win_amd64.whl", hash = "sha256:7d505815ac340568fd03f719446a589162d55c52f08abd77ba8964fbb7eb5b5f"}, + {file = "SQLAlchemy-2.0.25-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:0dacf67aee53b16f365c589ce72e766efaabd2b145f9de7c917777b575e3659d"}, + {file = "SQLAlchemy-2.0.25-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b801154027107461ee992ff4b5c09aa7cc6ec91ddfe50d02bca344918c3265c6"}, + {file = "SQLAlchemy-2.0.25-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:59a21853f5daeb50412d459cfb13cb82c089ad4c04ec208cd14dddd99fc23b39"}, + {file = "SQLAlchemy-2.0.25-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:29049e2c299b5ace92cbed0c1610a7a236f3baf4c6b66eb9547c01179f638ec5"}, + {file = "SQLAlchemy-2.0.25-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b64b183d610b424a160b0d4d880995e935208fc043d0302dd29fee32d1ee3f95"}, + {file = "SQLAlchemy-2.0.25-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4f7a7d7fcc675d3d85fbf3b3828ecd5990b8d61bd6de3f1b260080b3beccf215"}, + {file = "SQLAlchemy-2.0.25-cp312-cp312-win32.whl", hash = "sha256:cf18ff7fc9941b8fc23437cc3e68ed4ebeff3599eec6ef5eebf305f3d2e9a7c2"}, + {file = "SQLAlchemy-2.0.25-cp312-cp312-win_amd64.whl", hash = "sha256:91f7d9d1c4dd1f4f6e092874c128c11165eafcf7c963128f79e28f8445de82d5"}, + {file = "SQLAlchemy-2.0.25-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:bb209a73b8307f8fe4fe46f6ad5979649be01607f11af1eb94aa9e8a3aaf77f0"}, + {file = "SQLAlchemy-2.0.25-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:798f717ae7c806d67145f6ae94dc7c342d3222d3b9a311a784f371a4333212c7"}, + {file = "SQLAlchemy-2.0.25-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5fdd402169aa00df3142149940b3bf9ce7dde075928c1886d9a1df63d4b8de62"}, + {file = "SQLAlchemy-2.0.25-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:0d3cab3076af2e4aa5693f89622bef7fa770c6fec967143e4da7508b3dceb9b9"}, + {file = "SQLAlchemy-2.0.25-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:74b080c897563f81062b74e44f5a72fa44c2b373741a9ade701d5f789a10ba23"}, + {file = "SQLAlchemy-2.0.25-cp37-cp37m-win32.whl", hash = "sha256:87d91043ea0dc65ee583026cb18e1b458d8ec5fc0a93637126b5fc0bc3ea68c4"}, + {file = "SQLAlchemy-2.0.25-cp37-cp37m-win_amd64.whl", hash = "sha256:75f99202324383d613ddd1f7455ac908dca9c2dd729ec8584c9541dd41822a2c"}, + {file = "SQLAlchemy-2.0.25-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:420362338681eec03f53467804541a854617faed7272fe71a1bfdb07336a381e"}, + {file = "SQLAlchemy-2.0.25-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7c88f0c7dcc5f99bdb34b4fd9b69b93c89f893f454f40219fe923a3a2fd11625"}, + {file = "SQLAlchemy-2.0.25-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a3be4987e3ee9d9a380b66393b77a4cd6d742480c951a1c56a23c335caca4ce3"}, + {file = "SQLAlchemy-2.0.25-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2a159111a0f58fb034c93eeba211b4141137ec4b0a6e75789ab7a3ef3c7e7e3"}, + {file = "SQLAlchemy-2.0.25-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8b8cb63d3ea63b29074dcd29da4dc6a97ad1349151f2d2949495418fd6e48db9"}, + {file = "SQLAlchemy-2.0.25-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:736ea78cd06de6c21ecba7416499e7236a22374561493b456a1f7ffbe3f6cdb4"}, + {file = "SQLAlchemy-2.0.25-cp38-cp38-win32.whl", hash = "sha256:10331f129982a19df4284ceac6fe87353ca3ca6b4ca77ff7d697209ae0a5915e"}, + {file = "SQLAlchemy-2.0.25-cp38-cp38-win_amd64.whl", hash = "sha256:c55731c116806836a5d678a70c84cb13f2cedba920212ba7dcad53260997666d"}, + {file = "SQLAlchemy-2.0.25-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:605b6b059f4b57b277f75ace81cc5bc6335efcbcc4ccb9066695e515dbdb3900"}, + {file = "SQLAlchemy-2.0.25-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:665f0a3954635b5b777a55111ababf44b4fc12b1f3ba0a435b602b6387ffd7cf"}, + {file = "SQLAlchemy-2.0.25-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ecf6d4cda1f9f6cb0b45803a01ea7f034e2f1aed9475e883410812d9f9e3cfcf"}, + {file = "SQLAlchemy-2.0.25-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c51db269513917394faec5e5c00d6f83829742ba62e2ac4fa5c98d58be91662f"}, + {file = "SQLAlchemy-2.0.25-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:790f533fa5c8901a62b6fef5811d48980adeb2f51f1290ade8b5e7ba990ba3de"}, + {file = "SQLAlchemy-2.0.25-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:1b1180cda6df7af84fe72e4530f192231b1f29a7496951db4ff38dac1687202d"}, + {file = "SQLAlchemy-2.0.25-cp39-cp39-win32.whl", hash = "sha256:555651adbb503ac7f4cb35834c5e4ae0819aab2cd24857a123370764dc7d7e24"}, + {file = "SQLAlchemy-2.0.25-cp39-cp39-win_amd64.whl", hash = "sha256:dc55990143cbd853a5d038c05e79284baedf3e299661389654551bd02a6a68d7"}, + {file = "SQLAlchemy-2.0.25-py3-none-any.whl", hash = "sha256:a86b4240e67d4753dc3092d9511886795b3c2852abe599cffe108952f7af7ac3"}, + {file = "SQLAlchemy-2.0.25.tar.gz", hash = "sha256:a2c69a7664fb2d54b8682dd774c3b54f67f84fa123cf84dda2a5f40dcaa04e08"}, +] + +[package.dependencies] +greenlet = {version = "!=0.4.17", markers = "platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"AMD64\" or platform_machine == \"win32\" or platform_machine == \"WIN32\""} +typing-extensions = ">=4.6.0" + +[package.extras] +aiomysql = ["aiomysql (>=0.2.0)", "greenlet (!=0.4.17)"] +aioodbc = ["aioodbc", "greenlet (!=0.4.17)"] +aiosqlite = ["aiosqlite", "greenlet (!=0.4.17)", "typing_extensions (!=3.10.0.1)"] +asyncio = ["greenlet (!=0.4.17)"] +asyncmy = ["asyncmy (>=0.2.3,!=0.2.4,!=0.2.6)", "greenlet (!=0.4.17)"] +mariadb-connector = ["mariadb (>=1.0.1,!=1.1.2,!=1.1.5)"] +mssql = ["pyodbc"] +mssql-pymssql = ["pymssql"] +mssql-pyodbc = ["pyodbc"] +mypy = ["mypy (>=0.910)"] +mysql = ["mysqlclient (>=1.4.0)"] +mysql-connector = ["mysql-connector-python"] +oracle = ["cx_oracle (>=8)"] +oracle-oracledb = ["oracledb (>=1.0.1)"] +postgresql = ["psycopg2 (>=2.7)"] +postgresql-asyncpg = ["asyncpg", "greenlet (!=0.4.17)"] +postgresql-pg8000 = ["pg8000 (>=1.29.1)"] +postgresql-psycopg = ["psycopg (>=3.0.7)"] +postgresql-psycopg2binary = ["psycopg2-binary"] +postgresql-psycopg2cffi = ["psycopg2cffi"] +postgresql-psycopgbinary = ["psycopg[binary] (>=3.0.7)"] +pymysql = ["pymysql"] +sqlcipher = ["sqlcipher3_binary"] + +[[package]] +name = "sqlalchemy-utils" +version = "0.41.1" +description = "Various utility functions for SQLAlchemy." +optional = false +python-versions = ">=3.6" +files = [ + {file = "SQLAlchemy-Utils-0.41.1.tar.gz", hash = "sha256:a2181bff01eeb84479e38571d2c0718eb52042f9afd8c194d0d02877e84b7d74"}, + {file = "SQLAlchemy_Utils-0.41.1-py3-none-any.whl", hash = "sha256:6c96b0768ea3f15c0dc56b363d386138c562752b84f647fb8d31a2223aaab801"}, +] + +[package.dependencies] +SQLAlchemy = ">=1.3" + +[package.extras] +arrow = ["arrow (>=0.3.4)"] +babel = ["Babel (>=1.3)"] +color = ["colour (>=0.0.4)"] +encrypted = ["cryptography (>=0.6)"] +intervals = ["intervals (>=0.7.1)"] +password = ["passlib (>=1.6,<2.0)"] +pendulum = ["pendulum (>=2.0.5)"] +phone = ["phonenumbers (>=5.9.2)"] +test = ["Jinja2 (>=2.3)", "Pygments (>=1.2)", "backports.zoneinfo", "docutils (>=0.10)", "flake8 (>=2.4.0)", "flexmock (>=0.9.7)", "isort (>=4.2.2)", "pg8000 (>=1.12.4)", "psycopg (>=3.1.8)", "psycopg2 (>=2.5.1)", "psycopg2cffi (>=2.8.1)", "pymysql", "pyodbc", "pytest (>=2.7.1)", "python-dateutil (>=2.6)", "pytz (>=2014.2)"] +test-all = ["Babel (>=1.3)", "Jinja2 (>=2.3)", "Pygments (>=1.2)", "arrow (>=0.3.4)", "backports.zoneinfo", "colour (>=0.0.4)", "cryptography (>=0.6)", "docutils (>=0.10)", "flake8 (>=2.4.0)", "flexmock (>=0.9.7)", "furl (>=0.4.1)", "intervals (>=0.7.1)", "isort (>=4.2.2)", "passlib (>=1.6,<2.0)", "pendulum (>=2.0.5)", "pg8000 (>=1.12.4)", "phonenumbers (>=5.9.2)", "psycopg (>=3.1.8)", "psycopg2 (>=2.5.1)", "psycopg2cffi (>=2.8.1)", "pymysql", "pyodbc", "pytest (>=2.7.1)", "python-dateutil", "python-dateutil (>=2.6)", "pytz (>=2014.2)"] +timezone = ["python-dateutil"] +url = ["furl (>=0.4.1)"] + +[[package]] +name = "sqlmodel" +version = "0.0.14" +description = "SQLModel, SQL databases in Python, designed for simplicity, compatibility, and robustness." +optional = false +python-versions = ">=3.7,<4.0" +files = [ + {file = "sqlmodel-0.0.14-py3-none-any.whl", hash = "sha256:accea3ff5d878e41ac439b11e78613ed61ce300cfcb860e87a2d73d4884cbee4"}, + {file = "sqlmodel-0.0.14.tar.gz", hash = "sha256:0bff8fc94af86b44925aa813f56cf6aabdd7f156b73259f2f60692c6a64ac90e"}, +] + +[package.dependencies] +pydantic = ">=1.10.13,<3.0.0" +SQLAlchemy = ">=2.0.0,<2.1.0" + +[[package]] +name = "starlette" +version = "0.27.0" +description = "The little ASGI library that shines." +optional = false +python-versions = ">=3.7" +files = [ + {file = "starlette-0.27.0-py3-none-any.whl", hash = "sha256:918416370e846586541235ccd38a474c08b80443ed31c578a418e2209b3eef91"}, + {file = "starlette-0.27.0.tar.gz", hash = "sha256:6a6b0d042acb8d469a01eba54e9cda6cbd24ac602c4cd016723117d6a7e73b75"}, +] + +[package.dependencies] +anyio = ">=3.4.0,<5" + +[package.extras] +full = ["httpx (>=0.22.0)", "itsdangerous", "jinja2", "python-multipart", "pyyaml"] + +[[package]] +name = "tenacity" +version = "8.2.3" +description = "Retry code until it succeeds" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tenacity-8.2.3-py3-none-any.whl", hash = "sha256:ce510e327a630c9e1beaf17d42e6ffacc88185044ad85cf74c0a8887c6a0f88c"}, + {file = "tenacity-8.2.3.tar.gz", hash = "sha256:5398ef0d78e63f40007c1fb4c0bff96e1911394d2fa8d194f77619c05ff6cc8a"}, +] + +[package.extras] +doc = ["reno", "sphinx", "tornado (>=4.5)"] + +[[package]] +name = "tiktoken" +version = "0.5.2" +description = "tiktoken is a fast BPE tokeniser for use with OpenAI's models" +optional = false +python-versions = ">=3.8" +files = [ + {file = "tiktoken-0.5.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8c4e654282ef05ec1bd06ead22141a9a1687991cef2c6a81bdd1284301abc71d"}, + {file = "tiktoken-0.5.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:7b3134aa24319f42c27718c6967f3c1916a38a715a0fa73d33717ba121231307"}, + {file = "tiktoken-0.5.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6092e6e77730929c8c6a51bb0d7cfdf1b72b63c4d033d6258d1f2ee81052e9e5"}, + {file = "tiktoken-0.5.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72ad8ae2a747622efae75837abba59be6c15a8f31b4ac3c6156bc56ec7a8e631"}, + {file = "tiktoken-0.5.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:51cba7c8711afa0b885445f0637f0fcc366740798c40b981f08c5f984e02c9d1"}, + {file = "tiktoken-0.5.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:3d8c7d2c9313f8e92e987d585ee2ba0f7c40a0de84f4805b093b634f792124f5"}, + {file = "tiktoken-0.5.2-cp310-cp310-win_amd64.whl", hash = "sha256:692eca18c5fd8d1e0dde767f895c17686faaa102f37640e884eecb6854e7cca7"}, + {file = "tiktoken-0.5.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:138d173abbf1ec75863ad68ca289d4da30caa3245f3c8d4bfb274c4d629a2f77"}, + {file = "tiktoken-0.5.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7388fdd684690973fdc450b47dfd24d7f0cbe658f58a576169baef5ae4658607"}, + {file = "tiktoken-0.5.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a114391790113bcff670c70c24e166a841f7ea8f47ee2fe0e71e08b49d0bf2d4"}, + {file = "tiktoken-0.5.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ca96f001e69f6859dd52926d950cfcc610480e920e576183497ab954e645e6ac"}, + {file = "tiktoken-0.5.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:15fed1dd88e30dfadcdd8e53a8927f04e1f6f81ad08a5ca824858a593ab476c7"}, + {file = "tiktoken-0.5.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:93f8e692db5756f7ea8cb0cfca34638316dcf0841fb8469de8ed7f6a015ba0b0"}, + {file = "tiktoken-0.5.2-cp311-cp311-win_amd64.whl", hash = "sha256:bcae1c4c92df2ffc4fe9f475bf8148dbb0ee2404743168bbeb9dcc4b79dc1fdd"}, + {file = "tiktoken-0.5.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b76a1e17d4eb4357d00f0622d9a48ffbb23401dcf36f9716d9bd9c8e79d421aa"}, + {file = "tiktoken-0.5.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:01d8b171bb5df4035580bc26d4f5339a6fd58d06f069091899d4a798ea279d3e"}, + {file = "tiktoken-0.5.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42adf7d4fb1ed8de6e0ff2e794a6a15005f056a0d83d22d1d6755a39bffd9e7f"}, + {file = "tiktoken-0.5.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c3f894dbe0adb44609f3d532b8ea10820d61fdcb288b325a458dfc60fefb7db"}, + {file = "tiktoken-0.5.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:58ccfddb4e62f0df974e8f7e34a667981d9bb553a811256e617731bf1d007d19"}, + {file = "tiktoken-0.5.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:58902a8bad2de4268c2a701f1c844d22bfa3cbcc485b10e8e3e28a050179330b"}, + {file = "tiktoken-0.5.2-cp312-cp312-win_amd64.whl", hash = "sha256:5e39257826d0647fcac403d8fa0a474b30d02ec8ffc012cfaf13083e9b5e82c5"}, + {file = "tiktoken-0.5.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8bde3b0fbf09a23072d39c1ede0e0821f759b4fa254a5f00078909158e90ae1f"}, + {file = "tiktoken-0.5.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2ddee082dcf1231ccf3a591d234935e6acf3e82ee28521fe99af9630bc8d2a60"}, + {file = "tiktoken-0.5.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35c057a6a4e777b5966a7540481a75a31429fc1cb4c9da87b71c8b75b5143037"}, + {file = "tiktoken-0.5.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c4a049b87e28f1dc60509f8eb7790bc8d11f9a70d99b9dd18dfdd81a084ffe6"}, + {file = "tiktoken-0.5.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5bf5ce759089f4f6521ea6ed89d8f988f7b396e9f4afb503b945f5c949c6bec2"}, + {file = "tiktoken-0.5.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:0c964f554af1a96884e01188f480dad3fc224c4bbcf7af75d4b74c4b74ae0125"}, + {file = "tiktoken-0.5.2-cp38-cp38-win_amd64.whl", hash = "sha256:368dd5726d2e8788e47ea04f32e20f72a2012a8a67af5b0b003d1e059f1d30a3"}, + {file = "tiktoken-0.5.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a2deef9115b8cd55536c0a02c0203512f8deb2447f41585e6d929a0b878a0dd2"}, + {file = "tiktoken-0.5.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2ed7d380195affbf886e2f8b92b14edfe13f4768ff5fc8de315adba5b773815e"}, + {file = "tiktoken-0.5.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c76fce01309c8140ffe15eb34ded2bb94789614b7d1d09e206838fc173776a18"}, + {file = "tiktoken-0.5.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:60a5654d6a2e2d152637dd9a880b4482267dfc8a86ccf3ab1cec31a8c76bfae8"}, + {file = "tiktoken-0.5.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:41d4d3228e051b779245a8ddd21d4336f8975563e92375662f42d05a19bdff41"}, + {file = "tiktoken-0.5.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a5c1cdec2c92fcde8c17a50814b525ae6a88e8e5b02030dc120b76e11db93f13"}, + {file = "tiktoken-0.5.2-cp39-cp39-win_amd64.whl", hash = "sha256:84ddb36faedb448a50b246e13d1b6ee3437f60b7169b723a4b2abad75e914f3e"}, + {file = "tiktoken-0.5.2.tar.gz", hash = "sha256:f54c581f134a8ea96ce2023ab221d4d4d81ab614efa0b2fbce926387deb56c80"}, +] + +[package.dependencies] +regex = ">=2022.1.18" +requests = ">=2.26.0" + +[package.extras] +blobfile = ["blobfile (>=2)"] + +[[package]] +name = "tomli" +version = "2.0.1" +description = "A lil' TOML parser" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, + {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, +] + +[[package]] +name = "tomlkit" +version = "0.12.3" +description = "Style preserving TOML library" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tomlkit-0.12.3-py3-none-any.whl", hash = "sha256:b0a645a9156dc7cb5d3a1f0d4bab66db287fcb8e0430bdd4664a095ea16414ba"}, + {file = "tomlkit-0.12.3.tar.gz", hash = "sha256:75baf5012d06501f07bee5bf8e801b9f343e7aac5a92581f20f80ce632e6b5a4"}, +] + +[[package]] +name = "tqdm" +version = "4.66.1" +description = "Fast, Extensible Progress Meter" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tqdm-4.66.1-py3-none-any.whl", hash = "sha256:d302b3c5b53d47bce91fea46679d9c3c6508cf6332229aa1e7d8653723793386"}, + {file = "tqdm-4.66.1.tar.gz", hash = "sha256:d88e651f9db8d8551a62556d3cff9e3034274ca5d66e93197cf2490e2dcb69c7"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[package.extras] +dev = ["pytest (>=6)", "pytest-cov", "pytest-timeout", "pytest-xdist"] +notebook = ["ipywidgets (>=6)"] +slack = ["slack-sdk"] +telegram = ["requests"] + +[[package]] +name = "types-pyopenssl" +version = "23.3.0.20240106" +description = "Typing stubs for pyOpenSSL" +optional = false +python-versions = ">=3.8" +files = [ + {file = "types-pyOpenSSL-23.3.0.20240106.tar.gz", hash = "sha256:3d6f3462bec0c260caadf93fbb377225c126661b779c7d9ab99b6dad5ca10db9"}, + {file = "types_pyOpenSSL-23.3.0.20240106-py3-none-any.whl", hash = "sha256:47a7eedbd18b7bcad17efebf1c53416148f5a173918a6d75027e75e32fe039ae"}, +] + +[package.dependencies] +cryptography = ">=35.0.0" + +[[package]] +name = "types-pytz" +version = "2023.4.0.20240130" +description = "Typing stubs for pytz" +optional = false +python-versions = ">=3.8" +files = [ + {file = "types-pytz-2023.4.0.20240130.tar.gz", hash = "sha256:33676a90bf04b19f92c33eec8581136bea2f35ddd12759e579a624a006fd387a"}, + {file = "types_pytz-2023.4.0.20240130-py3-none-any.whl", hash = "sha256:6ce76a9f8fd22bd39b01a59c35bfa2db39b60d11a2f77145e97b730de7e64fe0"}, +] + +[[package]] +name = "types-pyyaml" +version = "6.0.12.12" +description = "Typing stubs for PyYAML" +optional = false +python-versions = "*" +files = [ + {file = "types-PyYAML-6.0.12.12.tar.gz", hash = "sha256:334373d392fde0fdf95af5c3f1661885fa10c52167b14593eb856289e1855062"}, + {file = "types_PyYAML-6.0.12.12-py3-none-any.whl", hash = "sha256:c05bc6c158facb0676674b7f11fe3960db4f389718e19e62bd2b84d6205cfd24"}, +] + +[[package]] +name = "types-redis" +version = "4.6.0.20240106" +description = "Typing stubs for redis" +optional = false +python-versions = ">=3.8" +files = [ + {file = "types-redis-4.6.0.20240106.tar.gz", hash = "sha256:2b2fa3a78f84559616242d23f86de5f4130dfd6c3b83fb2d8ce3329e503f756e"}, + {file = "types_redis-4.6.0.20240106-py3-none-any.whl", hash = "sha256:912de6507b631934bd225cdac310b04a58def94391003ba83939e5a10e99568d"}, +] + +[package.dependencies] +cryptography = ">=35.0.0" +types-pyOpenSSL = "*" + +[[package]] +name = "typing-extensions" +version = "4.9.0" +description = "Backported and Experimental Type Hints for Python 3.8+" +optional = false +python-versions = ">=3.8" +files = [ + {file = "typing_extensions-4.9.0-py3-none-any.whl", hash = "sha256:af72aea155e91adfc61c3ae9e0e342dbc0cba726d6cba4b6c72c1f34e47291cd"}, + {file = "typing_extensions-4.9.0.tar.gz", hash = "sha256:23478f88c37f27d76ac8aee6c905017a143b0b1b886c3c9f66bc2fd94f9f5783"}, +] + +[[package]] +name = "typing-inspect" +version = "0.9.0" +description = "Runtime inspection utilities for typing module." +optional = false +python-versions = "*" +files = [ + {file = "typing_inspect-0.9.0-py3-none-any.whl", hash = "sha256:9ee6fc59062311ef8547596ab6b955e1b8aa46242d854bfc78f4f6b0eff35f9f"}, + {file = "typing_inspect-0.9.0.tar.gz", hash = "sha256:b23fc42ff6f6ef6954e4852c1fb512cdd18dbea03134f91f856a95ccc9461f78"}, +] + +[package.dependencies] +mypy-extensions = ">=0.3.0" +typing-extensions = ">=3.7.4" + +[[package]] +name = "tzdata" +version = "2023.4" +description = "Provider of IANA time zone data" +optional = false +python-versions = ">=2" +files = [ + {file = "tzdata-2023.4-py2.py3-none-any.whl", hash = "sha256:aa3ace4329eeacda5b7beb7ea08ece826c28d761cda36e747cfbf97996d39bf3"}, + {file = "tzdata-2023.4.tar.gz", hash = "sha256:dd54c94f294765522c77399649b4fefd95522479a664a0cec87f41bebc6148c9"}, +] + +[[package]] +name = "urllib3" +version = "2.1.0" +description = "HTTP library with thread-safe connection pooling, file post, and more." +optional = false +python-versions = ">=3.8" +files = [ + {file = "urllib3-2.1.0-py3-none-any.whl", hash = "sha256:55901e917a5896a349ff771be919f8bd99aff50b79fe58fec595eb37bbc56bb3"}, + {file = "urllib3-2.1.0.tar.gz", hash = "sha256:df7aa8afb0148fa78488e7899b2c59b5f4ffcfa82e6c54ccb9dd37c1d7b52d54"}, +] + +[package.extras] +brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] +socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] +zstd = ["zstandard (>=0.18.0)"] + +[[package]] +name = "uvicorn" +version = "0.27.0" +description = "The lightning-fast ASGI server." +optional = false +python-versions = ">=3.8" +files = [ + {file = "uvicorn-0.27.0-py3-none-any.whl", hash = "sha256:890b00f6c537d58695d3bb1f28e23db9d9e7a17cbcc76d7457c499935f933e24"}, + {file = "uvicorn-0.27.0.tar.gz", hash = "sha256:c855578045d45625fd027367f7653d249f7c49f9361ba15cf9624186b26b8eb6"}, +] + +[package.dependencies] +click = ">=7.0" +h11 = ">=0.8" +typing-extensions = {version = ">=4.0", markers = "python_version < \"3.11\""} + +[package.extras] +standard = ["colorama (>=0.4)", "httptools (>=0.5.0)", "python-dotenv (>=0.13)", "pyyaml (>=5.1)", "uvloop (>=0.14.0,!=0.15.0,!=0.15.1)", "watchfiles (>=0.13)", "websockets (>=10.4)"] + +[[package]] +name = "vine" +version = "5.1.0" +description = "Python promises." +optional = false +python-versions = ">=3.6" +files = [ + {file = "vine-5.1.0-py3-none-any.whl", hash = "sha256:40fdf3c48b2cfe1c38a49e9ae2da6fda88e4794c810050a728bd7413811fb1dc"}, + {file = "vine-5.1.0.tar.gz", hash = "sha256:8b62e981d35c41049211cf62a0a1242d8c1ee9bd15bb196ce38aefd6799e61e0"}, +] + +[[package]] +name = "watchfiles" +version = "0.18.1" +description = "Simple, modern and high performance file watching and code reload in python." +optional = false +python-versions = ">=3.7" +files = [ + {file = "watchfiles-0.18.1-cp37-abi3-macosx_10_7_x86_64.whl", hash = "sha256:9891d3c94272108bcecf5597a592e61105279def1313521e637f2d5acbe08bc9"}, + {file = "watchfiles-0.18.1-cp37-abi3-macosx_11_0_arm64.whl", hash = "sha256:7102342d60207fa635e24c02a51c6628bf0472e5fef067f78a612386840407fc"}, + {file = "watchfiles-0.18.1-cp37-abi3-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:00ea0081eca5e8e695cffbc3a726bb90da77f4e3f78ce29b86f0d95db4e70ef7"}, + {file = "watchfiles-0.18.1-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1b8e6db99e49cd7125d8a4c9d33c0735eea7b75a942c6ad68b75be3e91c242fb"}, + {file = "watchfiles-0.18.1-cp37-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bc7c726855f04f22ac79131b51bf0c9f728cb2117419ed830a43828b2c4a5fcb"}, + {file = "watchfiles-0.18.1-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cbaff354d12235002e62d9d3fa8bcf326a8490c1179aa5c17195a300a9e5952f"}, + {file = "watchfiles-0.18.1-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:888db233e06907c555eccd10da99b9cd5ed45deca47e41766954292dc9f7b198"}, + {file = "watchfiles-0.18.1-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:dde79930d1b28f15994ad6613aa2865fc7a403d2bb14585a8714a53233b15717"}, + {file = "watchfiles-0.18.1-cp37-abi3-win32.whl", hash = "sha256:e2b2bdd26bf8d6ed90763e6020b475f7634f919dbd1730ea1b6f8cb88e21de5d"}, + {file = "watchfiles-0.18.1-cp37-abi3-win_amd64.whl", hash = "sha256:c541e0f2c3e95e83e4f84561c893284ba984e9d0025352057396d96dceb09f44"}, + {file = "watchfiles-0.18.1-cp37-abi3-win_arm64.whl", hash = "sha256:9a26272ef3e930330fc0c2c148cc29706cc2c40d25760c7ccea8d768a8feef8b"}, + {file = "watchfiles-0.18.1-pp38-pypy38_pp73-macosx_10_7_x86_64.whl", hash = "sha256:9fb12a5e2b42e0b53769455ff93546e6bc9ab14007fbd436978d827a95ca5bd1"}, + {file = "watchfiles-0.18.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:548d6b42303d40264118178053c78820533b683b20dfbb254a8706ca48467357"}, + {file = "watchfiles-0.18.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e0d8fdfebc50ac7569358f5c75f2b98bb473befccf9498cf23b3e39993bb45a"}, + {file = "watchfiles-0.18.1-pp39-pypy39_pp73-macosx_10_7_x86_64.whl", hash = "sha256:0f9a22fff1745e2bb930b1e971c4c5b67ea3b38ae17a6adb9019371f80961219"}, + {file = "watchfiles-0.18.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b02e7fa03cd4059dd61ff0600080a5a9e7a893a85cb8e5178943533656eec65e"}, + {file = "watchfiles-0.18.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a868ce2c7565137f852bd4c863a164dc81306cae7378dbdbe4e2aca51ddb8857"}, + {file = "watchfiles-0.18.1.tar.gz", hash = "sha256:4ec0134a5e31797eb3c6c624dbe9354f2a8ee9c720e0b46fc5b7bab472b7c6d4"}, +] + +[package.dependencies] +anyio = ">=3.0.0" + +[[package]] +name = "wcwidth" +version = "0.2.13" +description = "Measures the displayed width of unicode strings in a terminal" +optional = false +python-versions = "*" +files = [ + {file = "wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859"}, + {file = "wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5"}, +] + +[[package]] +name = "wheel" +version = "0.40.0" +description = "A built-package format for Python" +optional = false +python-versions = ">=3.7" +files = [ + {file = "wheel-0.40.0-py3-none-any.whl", hash = "sha256:d236b20e7cb522daf2390fa84c55eea81c5c30190f90f29ae2ca1ad8355bf247"}, + {file = "wheel-0.40.0.tar.gz", hash = "sha256:cd1196f3faee2b31968d626e1731c94f99cbdb67cf5a46e4f5656cbee7738873"}, +] + +[package.extras] +test = ["pytest (>=6.0.0)"] + +[[package]] +name = "yarl" +version = "1.9.4" +description = "Yet another URL library" +optional = false +python-versions = ">=3.7" +files = [ + {file = "yarl-1.9.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a8c1df72eb746f4136fe9a2e72b0c9dc1da1cbd23b5372f94b5820ff8ae30e0e"}, + {file = "yarl-1.9.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a3a6ed1d525bfb91b3fc9b690c5a21bb52de28c018530ad85093cc488bee2dd2"}, + {file = "yarl-1.9.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c38c9ddb6103ceae4e4498f9c08fac9b590c5c71b0370f98714768e22ac6fa66"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d9e09c9d74f4566e905a0b8fa668c58109f7624db96a2171f21747abc7524234"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b8477c1ee4bd47c57d49621a062121c3023609f7a13b8a46953eb6c9716ca392"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5ff2c858f5f6a42c2a8e751100f237c5e869cbde669a724f2062d4c4ef93551"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:357495293086c5b6d34ca9616a43d329317feab7917518bc97a08f9e55648455"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:54525ae423d7b7a8ee81ba189f131054defdb122cde31ff17477951464c1691c"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:801e9264d19643548651b9db361ce3287176671fb0117f96b5ac0ee1c3530d53"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e516dc8baf7b380e6c1c26792610230f37147bb754d6426462ab115a02944385"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:7d5aaac37d19b2904bb9dfe12cdb08c8443e7ba7d2852894ad448d4b8f442863"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:54beabb809ffcacbd9d28ac57b0db46e42a6e341a030293fb3185c409e626b8b"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bac8d525a8dbc2a1507ec731d2867025d11ceadcb4dd421423a5d42c56818541"}, + {file = "yarl-1.9.4-cp310-cp310-win32.whl", hash = "sha256:7855426dfbddac81896b6e533ebefc0af2f132d4a47340cee6d22cac7190022d"}, + {file = "yarl-1.9.4-cp310-cp310-win_amd64.whl", hash = "sha256:848cd2a1df56ddbffeb375535fb62c9d1645dde33ca4d51341378b3f5954429b"}, + {file = "yarl-1.9.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:35a2b9396879ce32754bd457d31a51ff0a9d426fd9e0e3c33394bf4b9036b099"}, + {file = "yarl-1.9.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c7d56b293cc071e82532f70adcbd8b61909eec973ae9d2d1f9b233f3d943f2c"}, + {file = "yarl-1.9.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d8a1c6c0be645c745a081c192e747c5de06e944a0d21245f4cf7c05e457c36e0"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4b3c1ffe10069f655ea2d731808e76e0f452fc6c749bea04781daf18e6039525"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:549d19c84c55d11687ddbd47eeb348a89df9cb30e1993f1b128f4685cd0ebbf8"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a7409f968456111140c1c95301cadf071bd30a81cbd7ab829169fb9e3d72eae9"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e23a6d84d9d1738dbc6e38167776107e63307dfc8ad108e580548d1f2c587f42"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d8b889777de69897406c9fb0b76cdf2fd0f31267861ae7501d93003d55f54fbe"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:03caa9507d3d3c83bca08650678e25364e1843b484f19986a527630ca376ecce"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:4e9035df8d0880b2f1c7f5031f33f69e071dfe72ee9310cfc76f7b605958ceb9"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:c0ec0ed476f77db9fb29bca17f0a8fcc7bc97ad4c6c1d8959c507decb22e8572"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:ee04010f26d5102399bd17f8df8bc38dc7ccd7701dc77f4a68c5b8d733406958"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:49a180c2e0743d5d6e0b4d1a9e5f633c62eca3f8a86ba5dd3c471060e352ca98"}, + {file = "yarl-1.9.4-cp311-cp311-win32.whl", hash = "sha256:81eb57278deb6098a5b62e88ad8281b2ba09f2f1147c4767522353eaa6260b31"}, + {file = "yarl-1.9.4-cp311-cp311-win_amd64.whl", hash = "sha256:d1d2532b340b692880261c15aee4dc94dd22ca5d61b9db9a8a361953d36410b1"}, + {file = "yarl-1.9.4-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0d2454f0aef65ea81037759be5ca9947539667eecebca092733b2eb43c965a81"}, + {file = "yarl-1.9.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:44d8ffbb9c06e5a7f529f38f53eda23e50d1ed33c6c869e01481d3fafa6b8142"}, + {file = "yarl-1.9.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:aaaea1e536f98754a6e5c56091baa1b6ce2f2700cc4a00b0d49eca8dea471074"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3777ce5536d17989c91696db1d459574e9a9bd37660ea7ee4d3344579bb6f129"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9fc5fc1eeb029757349ad26bbc5880557389a03fa6ada41703db5e068881e5f2"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ea65804b5dc88dacd4a40279af0cdadcfe74b3e5b4c897aa0d81cf86927fee78"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa102d6d280a5455ad6a0f9e6d769989638718e938a6a0a2ff3f4a7ff8c62cc4"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09efe4615ada057ba2d30df871d2f668af661e971dfeedf0c159927d48bbeff0"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:008d3e808d03ef28542372d01057fd09168419cdc8f848efe2804f894ae03e51"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:6f5cb257bc2ec58f437da2b37a8cd48f666db96d47b8a3115c29f316313654ff"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:992f18e0ea248ee03b5a6e8b3b4738850ae7dbb172cc41c966462801cbf62cf7"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:0e9d124c191d5b881060a9e5060627694c3bdd1fe24c5eecc8d5d7d0eb6faabc"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:3986b6f41ad22988e53d5778f91855dc0399b043fc8946d4f2e68af22ee9ff10"}, + {file = "yarl-1.9.4-cp312-cp312-win32.whl", hash = "sha256:4b21516d181cd77ebd06ce160ef8cc2a5e9ad35fb1c5930882baff5ac865eee7"}, + {file = "yarl-1.9.4-cp312-cp312-win_amd64.whl", hash = "sha256:a9bd00dc3bc395a662900f33f74feb3e757429e545d831eef5bb280252631984"}, + {file = "yarl-1.9.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:63b20738b5aac74e239622d2fe30df4fca4942a86e31bf47a81a0e94c14df94f"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7d7f7de27b8944f1fee2c26a88b4dabc2409d2fea7a9ed3df79b67277644e17"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c74018551e31269d56fab81a728f683667e7c28c04e807ba08f8c9e3bba32f14"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ca06675212f94e7a610e85ca36948bb8fc023e458dd6c63ef71abfd482481aa5"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5aef935237d60a51a62b86249839b51345f47564208c6ee615ed2a40878dccdd"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2b134fd795e2322b7684155b7855cc99409d10b2e408056db2b93b51a52accc7"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d25039a474c4c72a5ad4b52495056f843a7ff07b632c1b92ea9043a3d9950f6e"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f7d6b36dd2e029b6bcb8a13cf19664c7b8e19ab3a58e0fefbb5b8461447ed5ec"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:957b4774373cf6f709359e5c8c4a0af9f6d7875db657adb0feaf8d6cb3c3964c"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:d7eeb6d22331e2fd42fce928a81c697c9ee2d51400bd1a28803965883e13cead"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:6a962e04b8f91f8c4e5917e518d17958e3bdee71fd1d8b88cdce74dd0ebbf434"}, + {file = "yarl-1.9.4-cp37-cp37m-win32.whl", hash = "sha256:f3bc6af6e2b8f92eced34ef6a96ffb248e863af20ef4fde9448cc8c9b858b749"}, + {file = "yarl-1.9.4-cp37-cp37m-win_amd64.whl", hash = "sha256:ad4d7a90a92e528aadf4965d685c17dacff3df282db1121136c382dc0b6014d2"}, + {file = "yarl-1.9.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ec61d826d80fc293ed46c9dd26995921e3a82146feacd952ef0757236fc137be"}, + {file = "yarl-1.9.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8be9e837ea9113676e5754b43b940b50cce76d9ed7d2461df1af39a8ee674d9f"}, + {file = "yarl-1.9.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:bef596fdaa8f26e3d66af846bbe77057237cb6e8efff8cd7cc8dff9a62278bbf"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d47552b6e52c3319fede1b60b3de120fe83bde9b7bddad11a69fb0af7db32f1"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:84fc30f71689d7fc9168b92788abc977dc8cefa806909565fc2951d02f6b7d57"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4aa9741085f635934f3a2583e16fcf62ba835719a8b2b28fb2917bb0537c1dfa"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:206a55215e6d05dbc6c98ce598a59e6fbd0c493e2de4ea6cc2f4934d5a18d130"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07574b007ee20e5c375a8fe4a0789fad26db905f9813be0f9fef5a68080de559"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5a2e2433eb9344a163aced6a5f6c9222c0786e5a9e9cac2c89f0b28433f56e23"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:6ad6d10ed9b67a382b45f29ea028f92d25bc0bc1daf6c5b801b90b5aa70fb9ec"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:6fe79f998a4052d79e1c30eeb7d6c1c1056ad33300f682465e1b4e9b5a188b78"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:a825ec844298c791fd28ed14ed1bffc56a98d15b8c58a20e0e08c1f5f2bea1be"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8619d6915b3b0b34420cf9b2bb6d81ef59d984cb0fde7544e9ece32b4b3043c3"}, + {file = "yarl-1.9.4-cp38-cp38-win32.whl", hash = "sha256:686a0c2f85f83463272ddffd4deb5e591c98aac1897d65e92319f729c320eece"}, + {file = "yarl-1.9.4-cp38-cp38-win_amd64.whl", hash = "sha256:a00862fb23195b6b8322f7d781b0dc1d82cb3bcac346d1e38689370cc1cc398b"}, + {file = "yarl-1.9.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:604f31d97fa493083ea21bd9b92c419012531c4e17ea6da0f65cacdcf5d0bd27"}, + {file = "yarl-1.9.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8a854227cf581330ffa2c4824d96e52ee621dd571078a252c25e3a3b3d94a1b1"}, + {file = "yarl-1.9.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ba6f52cbc7809cd8d74604cce9c14868306ae4aa0282016b641c661f981a6e91"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a6327976c7c2f4ee6816eff196e25385ccc02cb81427952414a64811037bbc8b"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8397a3817d7dcdd14bb266283cd1d6fc7264a48c186b986f32e86d86d35fbac5"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e0381b4ce23ff92f8170080c97678040fc5b08da85e9e292292aba67fdac6c34"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:23d32a2594cb5d565d358a92e151315d1b2268bc10f4610d098f96b147370136"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ddb2a5c08a4eaaba605340fdee8fc08e406c56617566d9643ad8bf6852778fc7"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:26a1dc6285e03f3cc9e839a2da83bcbf31dcb0d004c72d0730e755b33466c30e"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:18580f672e44ce1238b82f7fb87d727c4a131f3a9d33a5e0e82b793362bf18b4"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:29e0f83f37610f173eb7e7b5562dd71467993495e568e708d99e9d1944f561ec"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:1f23e4fe1e8794f74b6027d7cf19dc25f8b63af1483d91d595d4a07eca1fb26c"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:db8e58b9d79200c76956cefd14d5c90af54416ff5353c5bfd7cbe58818e26ef0"}, + {file = "yarl-1.9.4-cp39-cp39-win32.whl", hash = "sha256:c7224cab95645c7ab53791022ae77a4509472613e839dab722a72abe5a684575"}, + {file = "yarl-1.9.4-cp39-cp39-win_amd64.whl", hash = "sha256:824d6c50492add5da9374875ce72db7a0733b29c2394890aef23d533106e2b15"}, + {file = "yarl-1.9.4-py3-none-any.whl", hash = "sha256:928cecb0ef9d5a7946eb6ff58417ad2fe9375762382f1bf5c55e61645f2c43ad"}, + {file = "yarl-1.9.4.tar.gz", hash = "sha256:566db86717cf8080b99b58b083b773a908ae40f06681e87e589a976faf8246bf"}, +] + +[package.dependencies] +idna = ">=2.0" +multidict = ">=4.0" + +[metadata] +lock-version = "2.0" +python-versions = ">=3.10,<3.12" +content-hash = "71e3fc96f59f67cbed2836190d648dc54021d048f9abcc80a31c20aa3b161e1d" diff --git a/backend/app/poetry.toml b/backend/app/poetry.toml new file mode 100644 index 00000000..ab1033bd --- /dev/null +++ b/backend/app/poetry.toml @@ -0,0 +1,2 @@ +[virtualenvs] +in-project = true diff --git a/backend/app/pyproject.toml b/backend/app/pyproject.toml new file mode 100644 index 00000000..b01151af --- /dev/null +++ b/backend/app/pyproject.toml @@ -0,0 +1,97 @@ +[build-system] +build-backend = "poetry.core.masonry.api" +requires = ["poetry-core>=1.0.0"] + +[tool.black] +exclude = ''' +( + /( + \.*.pyc + | __pycache__ + )/ +) +''' +line-length = 120 +target-version = [ "py310", "py311" ] + +[tool.isort] +force_grid_wrap = 0 +include_trailing_comma = true +line_length = 120 +multi_line_output = 3 +profile = "black" +use_parentheses = true + +[tool.poetry] +authors = ["jheyder "] +description = "Starter-kit to build constrained agents with Nextjs and FastAPI" +name = "agent-x" +packages = [ + { include = "app" }, + { include = "tests" }, +] +version = "1.0.0" + +[tool.poetry.dependencies] +Pillow = "^9.4.0" +SQLAlchemy = "^2.0.23" +SQLAlchemy-Utils = "^0.41.1" +alembic = "^1.13.0" +asyncpg = "^0.27.0" +case-converter = "^1.1.0" +celery = "^5.2.7" +celery-sqlalchemy-scheduler = "^0.3.0" +cryptography = "^38.0.3" +fastapi = "^0.105.0" +fastapi-async-sqlalchemy = "^0.6.0" +fastapi-cache2 = {extras = ["redis"], version = "^0.2.1"} +fastapi-limiter = "^0.1.5" +fastapi-nextauth-jwt = "^1.1.2" +fastapi-pagination = {extras = ["sqlalchemy"], version = "^0.12.14"} +gurobipy = "^10.0.3" +highspy = "^1.5.3" +httpx = "^0.23.1" +langchain = "^0.1.0" +langchain-community = "^0.0.11" +langchain-openai = "^0.0.2" +langsmith = "^0.0.78" +minio = "^7.1.13" +openai = "^1.6.1" +openpyxl = "^3.0.10" +pandas = "^2.1.4" +passlib = "^1.7.4" +pgvector = "^0.1.6" +plotly = "^5.18.0" +psycopg2-binary = "^2.9.5" +pydantic = "^2.5.2" +pydantic-settings = "^2.1.0" +pymupdf = "^1.22.3" +pyomo = "^6.7.0" +python = ">=3.10,<3.12" +python-box = "^5.1.1" +python-jose = "^3.3.0" +redis = "^4.5.1" +requests = "^2.29.0" +setuptools = "^67.7.2" +sqlmodel = "^0.0.14" +tiktoken = "^0.5.2" +watchfiles = "^0.18.1" +wheel = "^0.40.0" +mypy = "^1.8.0" + +[tool.poetry.group.dev] +optional = true + +[tool.poetry.group.dev.dependencies] +black = "^23.3.0" +isort = "^5.12.0" +mypy = "^1.8.0" +pycodestyle = "^2.11.1" +pylint = "^3.0.3" +pylint-pydantic = "^0.3.2" +pytest = "7.4.0" +pytest-asyncio = "0.21.1" +pytest-env = "1.0.0" +types-pyyaml = "^6.0.12.12" +types-redis = "^4.6.0.11" +pandas-stubs = "^2.1.4.231227" diff --git a/backend/app/setup.cfg b/backend/app/setup.cfg new file mode 100644 index 00000000..c3887ded --- /dev/null +++ b/backend/app/setup.cfg @@ -0,0 +1,31 @@ +[pycodestyle] +max-line-length = 120 +exclude = __init__.py +ignore = E203,W503 + +[coverage:run] +branch = True +omit = */__init__.py + +[mypy] +python_version = 3.10 +ignore_missing_imports = True +follow_imports_for_stubs = True +show_column_numbers = True +scripts_are_modules = True +implicit_optional = False +strict_optional = True +warn_unused_configs = True +warn_unused_ignores = True +disallow_untyped_defs = True +plugins = pydantic.mypy +exclude = (?x)( + ^backend/app/alembic/. + | ^backend/app/app/tool_constants/. + | ^backend/app/tests/. + ) + +[pydantic-mypy] +init_forbid_extra = True +init_typed = True +warn_required_dynamic_aliases = True diff --git a/backend/app/tests/__init__.py b/backend/app/tests/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/backend/app/tests/api/__init__.py b/backend/app/tests/api/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/backend/app/tests/api/test_chat.py b/backend/app/tests/api/test_chat.py new file mode 100644 index 00000000..2ce3e3cf --- /dev/null +++ b/backend/app/tests/api/test_chat.py @@ -0,0 +1,94 @@ +# -*- coding: utf-8 -*- +import json +import time +from typing import Any +from unittest.mock import patch + +import pytest +from fastapi.testclient import TestClient +from langchain.base_language import BaseLanguageModel + +from app.schemas.streaming_schema import StreamingDataTypeEnum, StreamingSignalsEnum +from app.utils import uuid7 + + +@pytest.fixture(autouse=True) +def mock_llm_call(llm: BaseLanguageModel): # pylint: disable=redefined-outer-name + with patch( + "app.services.chat_agent.tools.applications.project_scheduling.clarify_tool.clarify_tool.get_llm", + return_value=llm, + ): + yield + + +@pytest.fixture +def chat_query() -> dict[str, Any]: + return { + "messages": [ + { + "role": "user", + "content": "Hello, I am a test user.", + } + ], + "api_key": None, + "conversation_id": str(uuid7()), + "new_message_id": str(uuid7()), + "user_email": "", + "settings": None, + } + + +@pytest.mark.asyncio +async def test_chat(test_client: TestClient, chat_query: dict[str, Any]): # pylint: disable=redefined-outer-name + response = test_client.post("api/v1/chat/agent", json=chat_query) + assert response is not None + assert response.status_code == 200 + + start_time = time.time() + timeout = 10 # Timeout in seconds + + received_end = False + response_data = [] + while not received_end: + # Read the streaming response + for line in response.iter_lines(): + if line: + response_data.append(line) + + # Perform assertions on the response data + assert len(response_data) > 0 + assert json.loads(response_data[0])["data_type"] == StreamingDataTypeEnum.SIGNAL.value + assert json.loads(response_data[0])["data"] == StreamingSignalsEnum.START.value + assert "run_id" in json.loads(response_data[0])["metadata"] + + if len(response_data) > 1: + assert json.loads(response_data[1])["data_type"] == StreamingDataTypeEnum.ACTION.value + assert json.loads(response_data[1])["data"] == "clarify_tool" + assert "run_id" in json.loads(response_data[1])["metadata"] + + if len(response_data) > 2: + assert json.loads(response_data[2])["data_type"] == StreamingDataTypeEnum.SIGNAL.value + assert json.loads(response_data[2])["data"] == StreamingSignalsEnum.LLM_END.value + assert "run_id" in json.loads(response_data[2])["metadata"] + + if len(response_data) > 3: + assert json.loads(response_data[3])["data_type"] == StreamingDataTypeEnum.SIGNAL.value + assert json.loads(response_data[3])["data"] == StreamingSignalsEnum.TOOL_END.value + assert "run_id" in json.loads(response_data[3])["metadata"] + + if len(response_data) > 4: + assert json.loads(response_data[4])["data_type"] == StreamingDataTypeEnum.SIGNAL.value + assert json.loads(response_data[4])["data"] == StreamingSignalsEnum.END.value + assert "run_id" in json.loads(response_data[4])["metadata"] + + if time.time() - start_time > timeout: + assert False, f"Timeout reached after {len(response_data)} messages." + + # Check if the end of the stream has been reached + last_line = json.loads(response_data[len(response_data) - 1])["data"] + if last_line == StreamingSignalsEnum.END.value: + received_end = True + + time.sleep(0.1) # Wait a bit before reading the next line + + assert len(response_data) == 5 diff --git a/backend/app/tests/api/test_main.py b/backend/app/tests/api/test_main.py new file mode 100644 index 00000000..e03e4c47 --- /dev/null +++ b/backend/app/tests/api/test_main.py @@ -0,0 +1,11 @@ +# -*- coding: utf-8 -*- +import pytest +from fastapi.testclient import TestClient + + +@pytest.mark.asyncio +async def test_root(test_client: TestClient): + response = test_client.get("/") + assert response is not None + assert response.status_code == 200 + assert response.json() == {"message": "FastAPI backend"} diff --git a/backend/app/tests/config/agent-test.yml b/backend/app/tests/config/agent-test.yml new file mode 100644 index 00000000..c82b85e0 --- /dev/null +++ b/backend/app/tests/config/agent-test.yml @@ -0,0 +1,75 @@ +--- +tools_library: !include tools.yml +common: # settings shared by agent and all tools (can be overwritten by passing explicitly to constructors) + llm: 'gpt-4' + fast_llm: 'gpt-3.5-turbo' + fast_llm_token_limit: 2500 + max_token_length: 4000 +tools: # list of all tools available for the agent + # - sql_tool + - visualizer_tool + # - summarizer_tool + # - expert_tool + # - entertainer_tool + # - pdf_tool + - clarify_tool + # - chain_tool +action_plans: # list of all action plans available for the meta agent + '0': + name: '' + description: Clarification for ambiguous questions + actions: + - - clarify_tool + '1': + name: '' + description: Sufficient information in chat history, visualize + actions: + - - memory + - - visualizer_tool + # '2': + # name: '' + # description: Gather new information, summarize and visualize + # actions: # each sublist is 1 action step, i.e. add tools as subitems if you want to execute in parallel + # - - sql_tool + # - entertainer_tool + # - - expert_tool + # - visualizer_tool + # '3': + # name: '' + # description: Sufficient information in chat history, answer question + # actions: + # - - memory + # - expert_tool + # '4': + # name: '' + # description: Use information from chat history to gather new information, then summarize + # actions: + # - - memory + # - sql_tool + # - pdf_tool + # - - expert_tool + # '5': + # name: 'Nested Chain' + # description: User requests expert advice and asks to consider multiple options + # actions: + # - - chain_tool +prompt_message: |- + Given the chat history and the user question, what action plan would be best to follow? + Remember to only put out the number of the action plan you want to follow. + + User question: {input} +system_context: |- + You are an expert in digital media and music. + Your goal is to select the right action plan for the question of the user in the fastest way possible, given the chat history. + + The information that can be gathered are from a digital media store database and PDFs with general information about specific artists. + The digital media database includes details on tracks, artists and albums, as well as information about the business such as employees, customers and purchases. + + Follow the below guidelines: + - Gathering new information takes time, only do it if necessary + - Only visualize if the user asks for it + + Action plans: + {action_plans} + + Only reply with the number of the action plan you want to follow and nothing else. For example: "0" diff --git a/backend/app/tests/config/tools.yml b/backend/app/tests/config/tools.yml new file mode 100644 index 00000000..915fd4d5 --- /dev/null +++ b/backend/app/tests/config/tools.yml @@ -0,0 +1,432 @@ +library: + expert_tool: + description: >- + Expert tool to answer general questions given information as context. + Input is a user question and context information as a long string, output is an answer to the user question. + {examples} + prompt_message: |- + {{question}} + system_context: |- + You are an expert in digital media and music. + You are asked to answer questions about a specific database of digital media, including purchases, and music, of which data is given to you. + + When answering the questions, make sure to follow the principles: + - Use as much context as possible + - Do not repeat the information from the preliminary answer (if correct) but instead reference & complement it. + - If applicable, reference the appendix that the full information is shown in e.g. "Table Appendix" + - If the question is regarding visualisation, reference that the result is shown in the "Visualisation Appendix" + - Do not mention an appendix if it does not include relevant information + - Write your answer in markdown format, make sure it is beautiful and easy to read (e.g. use headings, lists, bold, italic, etc.) + + Always try to answer the question. + prompt_inputs: + - name: examples + content: |- + Example Input: \"User question: Could you find a list of tracks that Daan Peeters has purchased?\" + Example Output: \"Daan Peters has purchased a total of X tracks, please see a list below...\" + entertainer_tool: + description: >- + Entertainer tool to write a small concise output from memory while the information is loading. + Input is a user question, output are related facts to the user question. Always start your answer with: "This is just a preliminary answer, but"... + {examples} + prompt_message: |- + {{question}} + system_context: |- + You are an expert in digital media and music. + Your goal is to give a very first opinion to a user question regarding digital media and music, while the user is waiting for a more detailed answer from information retrieval. + + Given a user question, please reply following the principles: + - Answer as short and concise as possible + - Add interesting facts about the query if applicable + - Always start your response with "Thought: " + - Mention that this is only preliminary answer until further information are retrieved, formulate the start of your answer like "This is just a preliminary answer, but"... + - Always end your thought, mentioning that you are still searching for information (if the question is about information) OR building visualizations (if the question is about visualizations) + - If you don't know what to answer, reply "Thought: Still searching for information...expand the steps to get more information!" + - Write your answer in markdown format, make sure it is beautiful and easy to read (e.g. use headings, lists, bold, italic, etc.) + prompt_inputs: + - name: examples + content: |- + Example Input: \"User question: What are all the albums by ACDC?\" + Example Output: \"Did you know that the band AC/DC was founded in 1973\" + summarizer_tool: + description: >- + Summarizer tool to reduce the length of a text to a few sentences. + Input is a long string, output is a short summary of the input. + {examples} + prompt_message: |- + You are an expert on digital media and music. Given the following user question and provided information: + "{{text}}" + + Write a concise summary in markdown format answering the user question. + Follow the following principles: + - Be concise + - If applicable, reference the appendix that the full information is shown in e.g. "Table Appendix" + - If the question is regarding visualisation, reference that the result is shown in the "Visualisation Appendix" + - Do not mention an appendix if it does not include relevant information + - Write your answer in markdown format, make sure it is beautiful and easy to read (e.g. use headings, lists, bold, italic, etc.) + + CONCISE SUMMARY: + prompt_inputs: + - name: examples + content: |- + Example Input: \"This is a long string that I want to summarize. I want to summarize this long string.\" + Example Output: \"This is a summary of the long string.\" + system_context: '' + max_token_length: 4000 + visualizer_tool: + description: >- + Visualisation tool to display data as a graph or chart using JSX code. + The tool can visualize the result of SQL queries or API calls by providing recharts-JSX code. + Make sure that the data is grouped to maximum of 10 categories, to make the visualization possible. + Input is a user query and information needed to visualize (SQL or API results), output is a string that contains JSX code in markdown format. + Example Input: "{recharts_example_input}" + Example Output: "{recharts_example_output}" + prompt_message: |- + Given the results: + {{results}} + + Please write the JSX code for the visualization to answer the user question: + {{question}} + + Remember to only reference dataKeys from the SQL or API results. + system_context: |- + You are an expert software engineer. + + Given the information retrieved from the tools (e.g. SQL rows, API results), you need to visualize the data in a way that is easy to understand. + If there is no data with clear dataKeys or the user does not ask for a visualisation return "no data". + + For the given user question, please write JSX code. + You must follow the principles: + - Only output the JSX code + - Assume the following variables are defined: ref, width, height, data, getColors, groupAndMerge, getObjectKeys, func + - The data variable is an array of JSON objects with the SQL fields OR API result fields as field names + - The getColors variable is a function that returns a different color each time it is called, use it if you need different colors (e.g. for a stacked barchart) + - The groupAndMerge variable is a function with the signature: (data: any[], groupField: string, keyField: string, valueField: string), which returns a JSON object with keyField: valueField pairs, grouped by groupField + - The getObjectKeys variable is a function that takes as input an object and returns the keys of that object, if the object is undefined, it returns an empty array + - The func variable is a function that takes as input (funcBody, ...args) and then returns Function(...args, funcBody), ONLY use this function if you need to create a function dynamically otherwise the functions won't work! + - The dataKey should only reference fields from the user question + - The dataKey should always be exactly as in the SQL / API result, never use a dataKey that is not in the results + - If the total rows (SQL or API results) are larger than 10, group / aggregate the data into 10 categories + - Labels and Legends should have human readable names (not the field names) + - Use only components from Recharts (prefixed with "Recharts.X") defined in the following List: {recharts_components} + - If you have to choose a color for the charts: choose: #095a5a + + Examples: + Input: + {recharts_example_input} + Output: + {recharts_example_output} + + Treemap output example: + {treemap_example_output} + prompt_inputs: + - name: recharts_example_input + content: |- + "User question: Can you display the information in the previous table as a stacked barchart, x-axis is the sponsor name, y-axis is the count and colors are country_name + ######### + Information gathered: + sql_tool: ```sql + SELECT s.FirstName AS customer, c.Country AS country, COUNT(*) AS count + FROM customer + GROUP BY s.FirstName, c.Country + ORDER BY count DESC, FirstName, country; + ``` + + This query will return the number of customers for each country, sorted by the count in descending order. You can use this data to create a bar chart in your preferred visualization tool., total rows from SQL query: 176, first 3 rows: United States,20;Germany,15;United Kingdom,10" + - name: recharts_example_output + content: |- + "```jsx + + + + + + + {{getObjectKeys(groupAndMerge(data, "sponsor_name", "country", "number_of_trials")).map((key, idx) => ( + + ))}} + + ```" + - name: treemap_example_output + content: |- + "```jsx + ({{ + ...item, + total_trials: item.total_trials, + name: item.sponsor_name, + fill: getColors(), + }}))`, 'data', 'getColors')(data, getColors)}} + dataKey="total_trials" + ratio={{1}} + stroke="#fff" + ref={{ref}} + > + + + ```" + - name: recharts_components + content: |- + XAxis, YAxis, ZAxis, CartesianGrid, Tooltip, Legend, + Cell, Brush, ReferenceArea, ReferenceDot, ReferenceLine, ErrorBar, Label, LabelList, Customized" + defs, linearGradient, stop, + BarChart, Bar, AreaChart, Area, PieChart, Pie, LineChart, Line, ComposedChart + RadarChart, PolarGrid, PolarAngleAxis, PolarRadiusAxis, Radar, + RadialBarChart, RadialBar + ScatterChart, Scatter, + FunnelChart, Funnel, + Treemap, + Sankey + pdf_tool: + description: >- + Summarization and Q&A tool to answer questions about music artists. + The tool identifies which artists the user wants to focus on and answers the users question. + Questions about the artist can be related to get high level information about their history, music style etc. + Input is a query string, output is a string the answer to the user question. + {examples} + prompt_message: |- + Artist extracts: + {{retrieved_docs}} + + User Question: + {{question}} + system_context: |- + You are an expert in extracting information about artists. + You need to extract the information that the user requested about the artist. + prompt_inputs: + - name: examples + content: |- + Example Input: \"User question: Could you tell me some information about artist X?\" + Example Output: \"Artist X is from..\" + n_docs: 2 + sql_tool: + description: >- + "SQL tool to query the Chinook digital media database. The Chinook data model represents a digital media store, including tables for artists, albums, media tracks, invoices and customers." + "Input is a question about the data in natural lanaguage, output is a string that contains an SQL query in markdown format, the number of rows the query returns and the first 3 rows." + {examples} + prompt_message: |- + Given the database schema: + --- + {{table_schemas}} + --- + Please answer the following user questions with an SQL query: + {{question}} + system_context: |- + You are an expert for this digital media database. + + During answering, the following principles MUST be followed: + 1. Set the language to the markdown code block for each code block. For example, \```sql SELECT * FROM public.Artist``` is SQL. + 2. Use the postgreSQL dialect, i.e. only functions that are supported + 3. DO NOT make any DML statements (INSERT, UPDATE, DELETE, DROP etc.) to the database. + 4. In WHERE clauses use substring comparison to account for unknown string formulations (e.g. album -> LIKE '%album%') + 6. Make sure the final SQL query starts with '```sql' and ends with '```' + 7. Only use field and table names from the provided database schemas + 8. Ensure to include the schema name before the table, for example, \```sql SELECT * FROM public.Artist``` is correct but \```sql SELECT * FROM Artist``` is INCORRECT + prompt_inputs: + - name: examples + content: |- + Example Input: \"List all album names in the database" + Example Output: \"`sql SELECT Title FROM public.Album;`, total rows from SQL query: 347, first 3 rows: For Those About To Rock We Salute You, Balls to the Wall, Restless and Wild\" + - name: table_definitions + content: |- + public.db_table | description + public.Album | Albums per artist ID + public.Employee | Summary of personal and employment details of store employees + public.InvoiceLine | List of all purchased tracks (on individual track level) + public.PlaylistTrack | Overview of tracks per playlist + public.Artist | Names of all available artists + public.Genre | List of all available genres + public.MediaType | List of all available media types in the store (MP3, MPEG, AAC etc) + public.Track | List of all information about the available tracks, such as it's artist, album, price + public.Customer | Personal information about the customers + public.Invoice | Invoices of purchases per customer (can include multiple tracks) + public.Playlist | List of all available playlist names, can contain information about the playlist content and style + prompt_selection: |- + Given the following tables: + --- + {table_definitions} + --- + Please reply only with a comma separated list of the db and the table names. + Select the tables that can be most useful for answering to the question: + {{question}} + system_context_selection: |- + You are an expert for this digital media database. + You define which tables are useful to answer the question of the user. + Please follow the instructions to answer the questions: + 1. Only reply with a comma separated list of db and table names. For example, "public.Artist, public.Album" + 2. Only answer with valid table names from the list + 3. Always format the table names to include the database schema, for example "public.Customer", NOT "Customer" + 3. Reply with the least amount of tables necessary for the question + prompt_validation: |- + Given the following SQL query: + {{query}} + and the following results executing the query with a LIMIT 5: + {{result}} + Does the query answer the following question: + {{question}} + + You must reply in the following format: + Valid: [yes/no] + Reason: [your reason for the validation] + system_context_validation: |- + You are an expert for this digital media database. + You should validate that the constructed SQL query is answering the question of the user. + You must reply in the following format: + Valid: [yes/no] + Reason: [your reason for the validation] + prompt_refinement: |- + Given the database schema: + --- + {{table_schemas}} + --- + Given your previous answer and the complaint from the user, please improve the SQL query to answer the question of the user. + If the SQL query does not contain the database schema before a table, correct it. For example "SELECT * FROM Artist" should be corrected to "SELECT * FROM public.Artist". + User question: {{question}} + Previous answer: {{previous_answer}} + Complaints: {{complaints}} + nb_example_rows: 3 + validate_empty_results: False + validate_with_llm: False + always_limit_query: False + image_generation_tool: + description: >- + Tool to generate sample images for new products based on the product descriptions. Input is a string of description. Output is an url to the image. + prompt_message: |- + Here is decription of the item: {{description}} + image_description_prompt: |- + You are an expert on sandwich new product innovation. Given the full description of the item: + "{{text}}" + Generate a descriptive prompt message for generating an image of that item + + Follow the following principles: + - Keep the ingredients + - Do not change the ingredients + - Keep the prompt message to one paragraph + - Be concise + - Be as close to the full description as possible + system_context: |- + You are a specialized in answering questions about generating a sample image based on an input description to an item. + + You must follow the principles: + - Reference the appendix that the full information is shown in e.g. "Image Appendix" + - The output should start with "The prompt for generating the image is", then followed by pasting the image description with the quotation marks + - Mention that if the prompt for generating the image is not what you want, you can write your own prompt for generating a sample image in the end + + Example: + input: {input} + output: {output} + prompt_inputs: + - name: input + content: |- + Can you generate an image according to the description: a sandwich with cheese and ham + - name: output + content: |- + The prompt for generating an image of the item is... + image_gen_with_input_tool: + description: >- + Tool to generate sample images for new products based on the product descriptions input from the user prompt. + Input is a string of description. Output is an url to the image. + prompt_message: |- + Here is decription of the item: {{description}} + system_context: |- + You are a specialized in answering questions about generating a sample image based on an input description to an item. + + You must follow the principles: + - Generate only one description for generating the image + - Do not rephrase the original description given in the prompt + - Do not repeat the original description given in the prompt multiple times + - Keep the description for generating the image to one to two sentences. + - Reference the appendix that the full information is shown in e.g. "Image Appendix" + - The output should start with "The prompt for generating the image is", then followed by pasting the image description with the quotation marks + - The description for generating the image must be as close to the original description given in the prompt as possible + - Do not change the ingredients + + Example: + input: {input} + output: {output} + prompt_inputs: + - name: input + content: |- + Can you generate an image according to the description: a sandwich with cheese and ham + - name: output + content: |- + The prompt for generating an image of the item is ... + clarify_tool: + default_llm: "gpt-4" + default_fast_llm: "gpt-3.5-turbo" + description: >- + Tool to request clarification from the user when the input question is ambiguous or it's unclear which action plan to select. + If the user poses a question where it is unclear which action plan to select, use this tool to ask the user to clarify the question, thus enabling you to select the correct action plan + prompt_message: |- + {{question}} + system_context: |- + Your task is to prompt the user to clarify their question, making it easier to understand which action to take. + When answering the questions, make sure to follow these principles: + - Be concise + - Always encourage the user to clarify the question" + Example: + input: {input} + output: {output} + prompt_inputs: + - name: input + content: |- + We seem prepared for the optimization now, don't we? + - name: output + content: |- + I'm not sure which action to take. Can you clarify your question such that it is easier to understand what action I should + chain_tool: + description: Nested meta-agent tool + prompt_inputs: [] + additional: + tools: + - visualizer_tool + - expert_tool + - entertainer_tool + action_plans: + '3': + name: '' + description: Sufficient information in chat history, visualize + actions: + - - memory + - entertainer_tool + - visualizer_tool + '4': + name: '' + description: Sufficient information in chat history, answer question + actions: + - - memory + - expert_tool + + prompt_message: >- + Given the chat history and the user question, what action plan would be best to follow? + Remember to only put out the number of the action plan you want to follow. + + User question: {input} + system_context: |- + You are an expert in digital media and music. + Your goal is to select the right action plan for the question of the user in the fastest way possible, given the chat history. + + Action plans: + {action_plans} + + Only reply with the number of the action plan you want to follow and nothing else. For example: "0" or "1" or "2" or "3" or "4" diff --git a/backend/app/tests/conftest.py b/backend/app/tests/conftest.py new file mode 100644 index 00000000..5512fae3 --- /dev/null +++ b/backend/app/tests/conftest.py @@ -0,0 +1,102 @@ +# -*- coding: utf-8 -*- +from unittest.mock import AsyncMock, MagicMock, patch + +import pytest +from fastapi.testclient import TestClient +from fastapi_cache import FastAPICache +from langchain.agents import AgentExecutor +from langchain.base_language import BaseLanguageModel +from langchain.callbacks.manager import AsyncCallbackManagerForToolRun +from langchain_core.messages import AIMessage, HumanMessage, SystemMessage + +from app.api.deps import get_jwt +from app.api.v1.endpoints.chat import get_meta_agent_with_api_key +from app.deps.agent_deps import set_global_tool_context +from app.main import app +from app.schemas.agent_schema import AgentConfig +from app.schemas.tool_schema import ToolInputSchema +from app.services.chat_agent.meta_agent import create_meta_agent +from app.utils import uuid7 +from app.utils.config_loader import get_agent_config +from app.utils.fastapi_globals import g +from tests.fake.chat_model import FakeMessagesListChatModel + + +def pytest_configure(): + run_id = str(uuid7()) + g.tool_context = {} + g.query_context = { + "run_id": run_id, + } + + +@pytest.fixture(autouse=True) +def mock_redis_client_sync(): + with patch( + "app.services.chat_agent.helpers.run_helper.get_redis_client", new_callable=AsyncMock + ) as mock_helpers_redis_client: + mock_helpers_redis_client.get.return_value = "mocked_redis_get_value" + mock_helpers_redis_client.set.return_value = True + + yield + + +@pytest.fixture +def messages() -> list: + return [ + SystemMessage(content="You are a test user."), + HumanMessage(content="Hello, I am a test user."), + ] + + +@pytest.fixture +def llm() -> BaseLanguageModel: + fake_llm = FakeMessagesListChatModel(responses=[HumanMessage(content=f"{i}") for i in range(100)]) + return fake_llm + + +@pytest.fixture(autouse=True) +def mock_llm_call(llm: BaseLanguageModel): # pylint: disable=redefined-outer-name + with patch("app.services.chat_agent.tools.library.basellm_tool.basellm_tool.get_llm", return_value=llm): + yield + + +@pytest.fixture +def tool_input() -> str: + return ToolInputSchema( + chat_history=[ + HumanMessage(content="This is a test memory"), + AIMessage(content="This is the AI message response"), + ], + latest_human_message="This is a test message. ", + intermediate_steps={}, + ).json() + + +@pytest.fixture +def agent_config() -> AgentConfig: + return get_agent_config() + + +@pytest.fixture +def meta_agent(llm: BaseLanguageModel) -> AgentExecutor: # pylint: disable=redefined-outer-name + agent_config = get_agent_config() + return create_meta_agent( + agent_config=agent_config, get_llm_hook=lambda type, key: llm # pylint: disable=unused-argument + ) + + +@pytest.fixture +def test_client(meta_agent: AgentExecutor) -> TestClient: # pylint: disable=redefined-outer-name + FastAPICache.init(None, enable=False) + + app.dependency_overrides[set_global_tool_context] = lambda: None + app.dependency_overrides[get_jwt] = lambda: {} + app.dependency_overrides[get_meta_agent_with_api_key] = lambda: meta_agent + + return TestClient(app) + + +@pytest.fixture +def run_manager() -> AsyncCallbackManagerForToolRun: + return MagicMock(spec=AsyncCallbackManagerForToolRun) diff --git a/backend/app/tests/fake/__init__.py b/backend/app/tests/fake/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/backend/app/tests/fake/chat_model.py b/backend/app/tests/fake/chat_model.py new file mode 100644 index 00000000..78faba99 --- /dev/null +++ b/backend/app/tests/fake/chat_model.py @@ -0,0 +1,44 @@ +# -*- coding: utf-8 -*- +"""Fake ChatModel for testing purposes.""" +from typing import Any, List, Optional + +from langchain_core.callbacks.manager import AsyncCallbackManagerForLLMRun +from langchain_core.language_models.chat_models import BaseChatModel +from langchain_core.messages import BaseMessage +from langchain_core.outputs import ChatGeneration, ChatResult + + +class FakeMessagesListChatModel(BaseChatModel): + """Fake ChatModel for testing purposes.""" + + responses: List[BaseMessage] + sleep: Optional[float] = None + i: int = 0 + + def _generate( + self, + messages: List[BaseMessage], + stop: Optional[List[str]] = None, + run_manager: Optional[AsyncCallbackManagerForLLMRun] = None, + **kwargs: Any, + ) -> ChatResult: + raise NotImplementedError("FakeMessagesListChatModel does not support sync") + + async def _agenerate( + self, + messages: List[BaseMessage], + stop: Optional[List[str]] = None, + run_manager: Optional[AsyncCallbackManagerForLLMRun] = None, + **kwargs: Any, + ) -> ChatResult: + response = self.responses[self.i] + if self.i < len(self.responses) - 1: + self.i += 1 + else: + self.i = 0 + generation = ChatGeneration(message=response) + return ChatResult(generations=[generation]) + + @property + def _llm_type(self) -> str: + return "fake-messages-list-chat-model" diff --git a/backend/app/tests/fake/pdf_pipeline.py b/backend/app/tests/fake/pdf_pipeline.py new file mode 100644 index 00000000..c46788c5 --- /dev/null +++ b/backend/app/tests/fake/pdf_pipeline.py @@ -0,0 +1,12 @@ +# -*- coding: utf-8 -*- +from langchain.vectorstores import VectorStore + +from app.db.vector_db_pdf_ingestion import PDFExtractionPipeline + + +class FakePDFExtractionPipeline(PDFExtractionPipeline): + def __init__(self, vector_db: VectorStore): + self.vector_db = vector_db + + def run(self, **kwargs): + return self.vector_db diff --git a/backend/app/tests/fake/sql_db.py b/backend/app/tests/fake/sql_db.py new file mode 100644 index 00000000..57bfd17a --- /dev/null +++ b/backend/app/tests/fake/sql_db.py @@ -0,0 +1,24 @@ +# -*- coding: utf-8 -*- +from typing import List, Sequence + +from pydantic import BaseModel +from sqlalchemy.engine.result import Row + +from app.db.SQLDatabaseExtended import SQLDatabaseExtended + + +class FakeTable(BaseModel): + name: str + structure: str + + +class FakeDBInfo(BaseModel): + tables: List[FakeTable] + + +class FakeSQLDatabase(SQLDatabaseExtended): + def __init__(self, db_info: FakeDBInfo): + self.db_info = db_info + + def run_no_str(self, command: str, fetch: str = "all") -> Sequence | Row | List[Row] | None: + return ["col1, col2; value1, value2"] diff --git a/backend/app/tests/fake/vector_db.py b/backend/app/tests/fake/vector_db.py new file mode 100644 index 00000000..5bd81f07 --- /dev/null +++ b/backend/app/tests/fake/vector_db.py @@ -0,0 +1,26 @@ +# -*- coding: utf-8 -*- +from typing import List + +from langchain.schema import Document +from langchain.vectorstores import VectorStore + + +class FakeVectorDB(VectorStore): + docs: List[Document] + + def __init__(self, *args, **kwargs): + self.docs = kwargs.get("docs", []) + + def add_texts(self): + pass + + @classmethod + def from_texts(cls): + pass + + @classmethod + def from_documents(cls, docs: List[Document]): + return cls(docs=docs) + + def similarity_search(self, query: str, k: int = 1, **kwargs) -> List[Document]: + return self.docs[:k] diff --git a/backend/app/tests/pytest.ini b/backend/app/tests/pytest.ini new file mode 100644 index 00000000..d8769d1e --- /dev/null +++ b/backend/app/tests/pytest.ini @@ -0,0 +1,29 @@ +[pytest] + +env = + PROJECT_NAME="" + OPENAI_API_KEY="" + DATABASE_USER=postgres + DATABASE_PASSWORD=postgres + DATABASE_HOST=database + DATABASE_PORT=5432 + DATABASE_NAME=fastapi_db + REDIS_HOST=redis_server + REDIS_PORT=6379 + MINIO_ROOT_USER="" + MINIO_ROOT_PASSWORD="" + MINIO_URL="" + MINIO_BUCKET="" + BACKEND_CORS_ORIGINS='["*"]' + PDF_TOOL_EXTRACTION_CONFIG_PATH="" + AGENT_CONFIG_PATH=tests/config/agent-test.yml + SQL_TOOL_DB_ENABLED=false + SQL_TOOL_DB_INFO_PATH="" + SQL_TOOL_DB_URI="" + PDF_TOOL_ENABLED=true + PDF_TOOL_DATA_PATH="" + PDF_TOOL_DATABASE="" + CODE_TOOL_ENABLED=true + CODE_TOOL_DATABASE=code_indexing_1 + CODE_TOOL_DATA_PATH=app/tool_constants/public_demo_data/agent_x_to_ingest + TOOL_PROMPTS_PATH=app/tool_constants/public_demo_data/agent_x_to_ingest/config/tools.yml diff --git a/backend/app/tests/tools/__init__.py b/backend/app/tests/tools/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/backend/app/tests/tools/test_basellm_tool.py b/backend/app/tests/tools/test_basellm_tool.py new file mode 100644 index 00000000..faa49ee3 --- /dev/null +++ b/backend/app/tests/tools/test_basellm_tool.py @@ -0,0 +1,30 @@ +# -*- coding: utf-8 -*- +from unittest.mock import patch + +import pytest +from langchain.base_language import BaseLanguageModel + +from app.schemas.agent_schema import AgentConfig +from app.services.chat_agent.tools.library.basellm_tool.basellm_tool import BaseLLM + + +@pytest.fixture(autouse=True) +def mock_llm_call(llm: BaseLanguageModel): # pylint: disable=redefined-outer-name + with patch("app.services.chat_agent.tools.library.basellm_tool.basellm_tool.get_llm", return_value=llm): + yield + + +@pytest.fixture +def basellm_tool(agent_config: AgentConfig) -> BaseLLM: + basellm_tool = BaseLLM.from_config( + config=agent_config.tools_library.library["expert_tool"], common_config=agent_config.common + ) + return basellm_tool + + +@pytest.mark.asyncio +async def test_basellm_tool_run(basellm_tool: BaseLLM, tool_input: str): + query = tool_input + output = await basellm_tool._arun(query) + + assert output == "0" diff --git a/backend/app/tests/tools/test_pdf_tool.py b/backend/app/tests/tools/test_pdf_tool.py new file mode 100644 index 00000000..c841b99d --- /dev/null +++ b/backend/app/tests/tools/test_pdf_tool.py @@ -0,0 +1,66 @@ +# -*- coding: utf-8 -*- +from unittest.mock import patch + +import pytest +from langchain.base_language import BaseLanguageModel +from langchain.schema import Document + +from app.schemas.agent_schema import AgentConfig +from app.services.chat_agent.tools.library.pdf_tool.pdf_tool import PDFTool +from tests.fake.pdf_pipeline import FakePDFExtractionPipeline +from tests.fake.vector_db import FakeVectorDB + + +@pytest.fixture(autouse=True) +def mock_llm_call(llm: BaseLanguageModel): # pylint: disable=redefined-outer-name + with patch("app.services.chat_agent.tools.library.pdf_tool.pdf_tool.get_llm", return_value=llm): + yield + + +@pytest.fixture +def pdf_pipeline(): + db = FakeVectorDB.from_documents(docs=[Document(page_content="This is a test document.")]) + pdf_pipeline = FakePDFExtractionPipeline(vector_db=db) + return pdf_pipeline + + +@pytest.fixture(autouse=True) +def fake_get_pdf_pipeline(pdf_pipeline: FakePDFExtractionPipeline): # pylint: disable=redefined-outer-name + with patch("app.services.chat_agent.tools.library.pdf_tool.pdf_tool.get_pdf_pipeline", return_value=pdf_pipeline): + yield + + +@pytest.fixture() +def pdf_tool(agent_config: AgentConfig) -> PDFTool: + pdf_tool = PDFTool.from_config( + config=agent_config.tools_library.library["pdf_tool"], + common_config=agent_config.common, + ) + + return pdf_tool + + +@pytest.mark.skip(reason="This test will require changing the source code.") +@pytest.mark.asyncio +async def test_doc_retrieval(pdf_tool: PDFTool): + # Assuming hypothetical `_aretrieve_docs()` method which only fetches docs. + docs = await pdf_tool._aretrieve_docs(query="This is a test query.") + assert docs == "This is a test document." + + +@pytest.mark.asyncio +async def test_qa_with_docs(pdf_tool: PDFTool): + response = await pdf_tool._aqa_pdf_chunks(query="This is a test query.", docs="This is a test document.") + assert response == "0" + + +@pytest.mark.asyncio +async def test_qa_without_docs(pdf_tool: PDFTool): + response = await pdf_tool._aqa_pdf_chunks(query="This is a test query.", docs=None) + assert response == "0" + + +@pytest.mark.asyncio +async def test_pdf_tool_run(pdf_tool: PDFTool, tool_input: str): + response = await pdf_tool._arun(tool_input) + assert "result" in response diff --git a/backend/app/tests/tools/test_sql_tool.py b/backend/app/tests/tools/test_sql_tool.py new file mode 100644 index 00000000..5ae213c2 --- /dev/null +++ b/backend/app/tests/tools/test_sql_tool.py @@ -0,0 +1,71 @@ +# -*- coding: utf-8 -*- +from unittest.mock import patch + +import pytest +from langchain.base_language import BaseLanguageModel + +from app.schemas.agent_schema import AgentConfig +from app.services.chat_agent.tools.library.sql_tool.sql_tool import SQLTool +from tests.fake.sql_db import FakeDBInfo, FakeSQLDatabase, FakeTable + + +@pytest.fixture(autouse=True) +def mock_llm_call(llm: BaseLanguageModel): # pylint: disable=redefined-outer-name + with patch("app.services.chat_agent.tools.library.sql_tool.sql_tool.get_llm", return_value=llm): + yield + + +@pytest.fixture(autouse=True) +def patch_check_init(): # pylint: disable=redefined-outer-name + def dummy(*args, **kwargs): + pass + + with patch("app.services.chat_agent.tools.library.sql_tool.sql_tool.SQLTool.check_init", new=dummy): + yield + + +@pytest.fixture(autouse=True) +def sql_tool_db(): + db_info = FakeDBInfo(tables=[FakeTable(name="fake_table", structure="test_structure")]) + fake_db = FakeSQLDatabase(db_info=db_info) + with patch("app.services.chat_agent.tools.library.sql_tool.sql_tool.sql_tool_db", new=fake_db): + yield + + +@pytest.fixture +def sql_tool(agent_config: AgentConfig) -> SQLTool: + return SQLTool.from_config( + config=agent_config.tools_library.library["sql_tool"], + common_config=agent_config.common, + ) + + +@pytest.mark.asyncio +async def test_list_tables(sql_tool: SQLTool): + response = await sql_tool._alist_sql_tables(query="This is a test query.") + assert response == ["0"] + + +@pytest.mark.asyncio +async def test_sql_query_generation(sql_tool: SQLTool): + table_schemas, response = await sql_tool._aquery_with_schemas( + query="This is a test query.", filtered_tables=["fake_table"] + ) + assert table_schemas == "DB.TABLE name: fake_table, Table structure: test_structure" + assert response == "0" + + +@pytest.mark.asyncio +async def test_sql_query_generation_no_tables(sql_tool: SQLTool): + table_schemas, response = await sql_tool._aquery_with_schemas(query="This is a test query.", filtered_tables=[]) + assert table_schemas == "" + assert response == "0" + + +@pytest.mark.asyncio +async def test_sql_tool_run(sql_tool: SQLTool, tool_input: str): + with patch( + "app.services.chat_agent.tools.library.sql_tool.sql_tool.SQLTool._alist_sql_tables", return_value=["fake_table"] + ), patch("app.services.chat_agent.tools.library.sql_tool.sql_tool.SQLTool._parse_query", return_value="query"): + response = await sql_tool._arun(tool_input) + assert response == "0" diff --git a/backend/app/tests/tools/test_summarizer_tool.py b/backend/app/tests/tools/test_summarizer_tool.py new file mode 100644 index 00000000..d34e27ca --- /dev/null +++ b/backend/app/tests/tools/test_summarizer_tool.py @@ -0,0 +1,55 @@ +# -*- coding: utf-8 -*- +from unittest.mock import AsyncMock, MagicMock, patch + +import pytest +from langchain.base_language import BaseLanguageModel + +from app.schemas.agent_schema import AgentConfig +from app.schemas.tool_schema import ToolInputSchema +from app.services.chat_agent.tools.library.summarizer_tool.summarizer_tool import SummarizerTool + + +@pytest.fixture(autouse=True) +def mock_llm_call(llm: BaseLanguageModel): # pylint: disable=redefined-outer-name + with patch("app.services.chat_agent.tools.library.summarizer_tool.summarizer_tool.get_llm", return_value=llm): + yield + + +@pytest.fixture +def summarizer_tool_input(request) -> str: + long = request.param + latest_human_message = "This is a test message. " + if long: + latest_human_message *= 10000 + return ToolInputSchema( + chat_history=[], + latest_human_message=latest_human_message, + intermediate_steps={}, + ).json() + + +@pytest.fixture +def summarizer_tool(agent_config: AgentConfig) -> SummarizerTool: + summarizer_tool = SummarizerTool.from_config( + config=agent_config.tools_library.library["summarizer_tool"], common_config=agent_config.common + ) + return summarizer_tool + + +@pytest.mark.asyncio +@pytest.mark.parametrize("summarizer_tool_input", [False], indirect=True) +async def test_summarizer_tool_run_short_input(agent_config, summarizer_tool, summarizer_tool_input): + query = summarizer_tool_input + output = await summarizer_tool._arun(query) + + assert output == "0" + + +@pytest.mark.skip(reason="Need to install transformers package to Github workflows env.") +@pytest.mark.asyncio +@pytest.mark.parametrize("summarizer_tool_input", [True], indirect=True) +async def test_summarizer_tool_run_long_input(agent_config, summarizer_tool, summarizer_tool_input): + query = summarizer_tool_input + output = await summarizer_tool._arun(query) + + assert output == "0" diff --git a/backend/app/tests/tools/test_visualizer_tool.py b/backend/app/tests/tools/test_visualizer_tool.py new file mode 100644 index 00000000..3b5ec0a0 --- /dev/null +++ b/backend/app/tests/tools/test_visualizer_tool.py @@ -0,0 +1,47 @@ +# -*- coding: utf-8 -*- +from math import log +from unittest.mock import ANY, patch + +import pytest +from langchain.base_language import BaseLanguageModel +from langchain.callbacks.manager import AsyncCallbackManagerForToolRun + +from app.schemas.streaming_schema import StreamingDataTypeEnum +from app.services.chat_agent.tools.library.visualizer_tool.visualizer_tool import JsxVisualizerTool +from app.utils.config_loader import get_agent_config + + +@pytest.fixture(autouse=True) +def mock_llm_call(llm: BaseLanguageModel): # pylint: disable=redefined-outer-name + # Call the mocked LLM defined in conftest.py that returns a list of 0, 1 ... + with patch("app.services.chat_agent.tools.library.visualizer_tool.visualizer_tool.get_llm", return_value=llm): + yield + + +@pytest.mark.asyncio +async def test_visualizer_tool_arun(tool_input: str, run_manager: AsyncCallbackManagerForToolRun): + """ + This tests the JsxVisualizerTool._arun() method. The goal of is to check if the tool + can process input, call a (mocked) LLM and return its (mocked) output. + + Args: + tool_input (str): Mock input for tools. + """ + agent_config = get_agent_config() + + # Setup JsxVisualizerTool instance with mocked dependencies + tool = JsxVisualizerTool.from_config( + config=agent_config.tools_library.library["visualizer_tool"], common_config=agent_config.common + ) + + result = await tool._arun(tool_input, run_manager=run_manager) + # Check getting mock LLM output + assert result == "0" + + # Make sure the tool streams taking an action at least once, does not enforce correct vizualization output + run_manager.on_text.assert_any_call( + ANY, # allow for any string + data_type=StreamingDataTypeEnum.ACTION, + tool=tool.name, + step=ANY, + ) diff --git a/backend/poetry.toml b/backend/poetry.toml new file mode 100644 index 00000000..ab1033bd --- /dev/null +++ b/backend/poetry.toml @@ -0,0 +1,2 @@ +[virtualenvs] +in-project = true diff --git a/caddy/Caddyfile b/caddy/Caddyfile new file mode 100644 index 00000000..1288c6aa --- /dev/null +++ b/caddy/Caddyfile @@ -0,0 +1,55 @@ +{ + email heyder.jakob@bcg.com +} + +# Enable in prod +# {$EXT_ENDPOINT1} { +# tls /config/certificate.pem /config/privateKey.pem +# } + + +# {$EXT_ENDPOINT1}:443 { +# reverse_proxy nextjs_server:3000 +# reverse_proxy /api/v1/* fastapi_server:9090 +# } + +{$EXT_ENDPOINT1}:80, {$LOCAL_1}:80, {$LOCAL_2}:80, :80 { + reverse_proxy nextjs_server:3000 + reverse_proxy /api/v1/* fastapi_server:9090 + reverse_proxy /docs/* docusaurus:3001 +} + +fastapi.{$EXT_ENDPOINT1}:80, fastapi.{$LOCAL_1}:80, fastapi.{$LOCAL_2}:80 { + reverse_proxy fastapi_server:9090 +} + +storage.{$EXT_ENDPOINT1}:80, storage.{$LOCAL_1}:80, storage.{$LOCAL_2}:80 { + reverse_proxy minio_server:9000 +} + +stash.{$EXT_ENDPOINT1}:80, stash.{$LOCAL_1}:80, stash.{$LOCAL_2}:80 { + reverse_proxy minio_server:9090 +} + +static.{$EXT_ENDPOINT1}:80, static.{$LOCAL_1}:80, static.{$LOCAL_2}:80 { + root * /code/static + file_server browse +} + +## Uncomment this to automatic ssl +# fastapi.{$EXT_ENDPOINT1}, fastapi.{$LOCAL_1}, fastapi.{$LOCAL_2} { +# reverse_proxy fastapi_server:9090 +# } + +# storage.{$EXT_ENDPOINT1}, storage.{$LOCAL_1}, storage.{$LOCAL_2} { +# reverse_proxy minio_server:9000 +# } + +# stash.{$EXT_ENDPOINT1}, stash.{$LOCAL_1}, stash.{$LOCAL_2} { +# reverse_proxy minio_server:9090 +# } + +# static.{$EXT_ENDPOINT1}, static.{$LOCAL_1}, static.{$LOCAL_2} { +# root * /code/static +# file_server browse +# } diff --git a/docker-compose-demo.yml b/docker-compose-demo.yml new file mode 100644 index 00000000..e27bd949 --- /dev/null +++ b/docker-compose-demo.yml @@ -0,0 +1,90 @@ +version: '3.8' + +services: + fastapi_server: + container_name: fastapi_server + build: ./backend + restart: always + command: "sh -c 'alembic upgrade head && python app/document_ingestion.py && uvicorn app.main:app --reload --workers 1 --host 0.0.0.0 --port 9090'" + volumes: + - ./backend/app:/code + expose: + - 9090 + env_file: ".env" + depends_on: + - database + + nextjs_server: + container_name: nextjs_server + build: ./frontend + restart: always + command: "sh -c 'node server.js'" + volumes: + - ./frontend:/code + ports: + - 3000:3000 + expose: + - 3000 + env_file: "frontend/.env" + depends_on: + - fastapi_server + + database: + image: ankane/pgvector:v0.4.1 + restart: always + container_name: database + env_file: ".env" + user: root + volumes: + - ./db_docker:/var/lib/postgresql + - ./scripts/create-dbs.sql:/docker-entrypoint-initdb.d/1-create-dbs.sql + - ./scripts/sql_db_tool/2-chinook_psql_load.sql:/docker-entrypoint-initdb.d/2-chinook_psql_load.sql + ports: + - 5432:5432 + expose: + - 5432 + environment: + - POSTGRES_USERNAME=${DATABASE_USER} + - POSTGRES_PASSWORD=${DATABASE_PASSWORD} + - POSTGRES_DATABASE=${DATABASE_NAME} + - POSTGRES_HOST_AUTH_METHOD= "trust" + healthcheck: + test: ["CMD-SHELL", "pg_isready -U postgres"] + interval: 10s + timeout: 15s + retries: 5 + + redis_server: + image: redis:alpine + container_name: redis_server + restart: always + ports: + - 6379:6379 # Remove this on production + expose: + - 6379 + env_file: ".env" + + caddy_reverse_proxy: + container_name: caddy_reverse_proxy + image: caddy:alpine + restart: always + ports: + - 80:80 + - 9090:9090 + - 3001:3001 + - 443:443 + environment: + - EXT_ENDPOINT1=${EXT_ENDPOINT1} + - LOCAL_1=${LOCAL_1} + - LOCAL_2=${LOCAL_2} + volumes: + - ./caddy/Caddyfile:/etc/caddy/Caddyfile + - caddy_data:/data + - caddy_config:/config + + +volumes: + caddy_data: + caddy_config: + langchain-db-data: + langchain-redis-data: diff --git a/docker-compose-development.yml b/docker-compose-development.yml new file mode 100644 index 00000000..eb1c9b43 --- /dev/null +++ b/docker-compose-development.yml @@ -0,0 +1,82 @@ +version: '3.8' + +services: + fastapi_server: + container_name: fastapi_server + build: ./backend + restart: always + # Enable debug mode run .vscode/launch.json -> "Debug: Attach to FastAPI Docker" + # command: "sh -c 'pip install debugpy -t /tmp && alembic upgrade head && python /tmp/debugpy --wait-for-client --listen 0.0.0.0:5678 -m uvicorn app.main:app --reload --workers 1 --host 0.0.0.0 --port 9090 --loop asyncio'" + # ports: + # - 5678:5678 + # Disable debug mode if only frontend development + command: "sh -c 'alembic upgrade head && python app/document_ingestion.py && uvicorn app.main:app --reload --workers 1 --host 0.0.0.0 --port 9090'" + volumes: + - ./backend/app:/code + expose: + - 9090 + env_file: ".env" + depends_on: + - database + + database: + image: ankane/pgvector:v0.4.1 + restart: always + container_name: database + env_file: ".env" + user: root + volumes: + - ./db_docker:/var/lib/postgresql + - ./scripts/create-dbs.sql:/docker-entrypoint-initdb.d/create-dbs.sql + ports: + - 5432:5432 + expose: + - 5432 + environment: + - POSTGRES_USERNAME=${DATABASE_USER} + - POSTGRES_PASSWORD=${DATABASE_PASSWORD} + - POSTGRES_DATABASE=${DATABASE_NAME} + - POSTGRES_HOST_AUTH_METHOD= "trust" + + redis_server: + image: redis:alpine + container_name: redis_server + restart: always + ports: + - 6379:6379 # Remove this on production + expose: + - 6379 + env_file: .env + + caddy_reverse_proxy: + container_name: caddy_reverse_proxy + image: caddy:alpine + restart: always + ports: + - 80:80 + - 9090:9090 + - 443:443 + environment: + - EXT_ENDPOINT1=${EXT_ENDPOINT1} + - LOCAL_1=${LOCAL_1} + - LOCAL_2=${LOCAL_2} + volumes: + - ./caddy/Caddyfile:/etc/caddy/Caddyfile + - caddy_data:/data + - caddy_config:/config + + pre-commit: + build: ./pre-commit + profiles: ["pre-commit"] + entrypoint: "pre-commit run" + volumes: + - ./backend:/code/backend + - ./frontend:/code/frontend + - ./.git:/code/.git + working_dir: /code + +volumes: + caddy_data: + caddy_config: + langchain-db-data: + langchain-redis-data: diff --git a/docker-compose-prod.yml b/docker-compose-prod.yml new file mode 100644 index 00000000..64fcbaff --- /dev/null +++ b/docker-compose-prod.yml @@ -0,0 +1,197 @@ +version: '3.8' + +services: + fastapi_server: + container_name: fastapi_server + build: ./backend + restart: always + command: "sh -c 'alembic upgrade head && python app/document_ingestion.py && gunicorn -w 3 -k uvicorn.workers.UvicornWorker app.main:app --bind 0.0.0.0:9090 --preload --log-level=debug --timeout 120'" + volumes: + - ./backend/app:/code + expose: + - 9090 + env_file: ".env" + depends_on: + - database + + nextjs_server: + container_name: nextjs_server + build: ./frontend + restart: always + command: "sh -c 'node server.js'" + # alternative to enable hot reload + # working_dir: /code # + # command: "SKIP_ENV_VALIDATION=true yarn run dev" + volumes: + - ./frontend:/code + ports: + - 3000:3000 + expose: + - 3000 + env_file: "frontend/.env" + depends_on: + - fastapi_server + + database: + image: ankane/pgvector:v0.4.1 + restart: always + container_name: database + env_file: ".env" + user: root + volumes: + - ./db_docker:/var/lib/postgresql + - ./scripts/create-dbs.sql:/docker-entrypoint-initdb.d/create-dbs.sql + ports: + - 5732:5432 # Remove this on production, use same port as in .env for fastapi_db + expose: + - 5732 + environment: + - POSTGRES_USERNAME=${DATABASE_USER} + - POSTGRES_PASSWORD=${DATABASE_PASSWORD} + - POSTGRES_DATABASE=${DATABASE_NAME} + - POSTGRES_HOST_AUTH_METHOD= "trust" + + db_sql_tool: # Remove if not using sql tool + image: postgres:11 + restart: always + container_name: db_sql_tool + volumes: + - ./db_docker:/var/lib/postgresql + - ./scripts/db_sql_tool/github_data_psql_load.sql:/docker-entrypoint-initdb.d/github_data_psql_load.sql + - ./backend/app/app/tool_constants/public_demo_data/pull_requests.csv:/docker-entrypoint-initdb.d/pull_requests.csv + - ./backend/app/app/tool_constants/public_demo_data/commit_history.csv:/docker-entrypoint-initdb.d/commit_history.csv + - ./backend/app/app/tool_constants/public_demo_data/issues.csv:/docker-entrypoint-initdb.d/issues.csv + environment: + - POSTGRES_USER=postgres + - POSTGRES_PASSWORD=postgres + - POSTGRES_DB=sqltool + ports: + - "5632:5432" + healthcheck: + test: ["CMD-SHELL", "pg_isready -U postgres"] + interval: 10s + timeout: 15s + retries: 5 + + redis_server: + image: redis:alpine + container_name: redis_server + restart: always + ports: + - 6379:6379 # Remove this on production + expose: + - 6379 + env_file: ".env" + + langchain-playground: + image: langchain/${_LANGSMITH_IMAGE_PREFIX-}langchainplus-playground@sha256:f61ce9762babcb4a51af3e5b0cc628453ac7087237c5fc8694834de49b56d16e + + langchain-frontend: + image: langchain/${_LANGSMITH_IMAGE_PREFIX-}langchainplus-frontend@sha256:e0ab157b2b9cb7f75743d45237f0d8ede75a3811d913f234585484255afe5b5a + ports: + - 9091:80 + expose: + - 9091 + environment: + - NEXT_PUBLIC_BACKEND_URL=http://langchain-backend:1984 + depends_on: + - langchain-backend + - langchain-playground + volumes: + - ./conf/nginx.conf:/etc/nginx/default.conf:ro + + langchain-backend: + image: langchain/${_LANGSMITH_IMAGE_PREFIX-}langchainplus-backend@sha256:1196c12308b450548195c10927d469963c7d8e62db0e67f8204c83adb91f9031 + environment: + - PORT=1984 + - LANGCHAIN_ENV=local_docker + - LOG_LEVEL=warning + - OPENAI_API_KEY=${OPENAI_API_KEY} + ports: + - 1984:1984 + depends_on: + - langchain-db + + langchain-db: + image: postgres:14.1 + command: + [ + "postgres", + "-c", + "log_min_messages=WARNING", + "-c", + "client_min_messages=WARNING" + ] + environment: + - POSTGRES_PASSWORD=postgres + - POSTGRES_USER=postgres + - POSTGRES_DB=postgres + volumes: + - langchain-db-data:/var/lib/postgresql/data + ports: + - 5433:5432 + + langchain-redis: + image: redis:7 + ports: + - 63791:6379 + volumes: + - langchain-redis-data:/data + + langchain-queue: + image: langchain/${_LANGSMITH_IMAGE_PREFIX-}langchainplus-backend@sha256:1196c12308b450548195c10927d469963c7d8e62db0e67f8204c83adb91f9031 + environment: + - LANGCHAIN_ENV=local_docker + - LOG_LEVEL=warning + entrypoint: "rq worker --with-scheduler -u redis://langchain-redis:6379 --serializer lc_database.queue.serializer.ORJSONSerializer --worker-class lc_database.queue.worker.Worker --connection-class lc_database.queue.connection.RedisRetry --job-class lc_database.queue.job.AsyncJob" + depends_on: + - langchain-redis + + langchain-hub: + image: langchain/${_LANGSMITH_IMAGE_PREFIX-}langchainhub-backend@sha256:73b4c2c3e7cd81729e766bb4eece2b28883bebf7c710567a21d1a6c114abff5a + environment: + - PORT=1985 + - LANGCHAIN_ENV=local_docker + - LOG_LEVEL=warning + ports: + - 1985:1985 + depends_on: + - langchain-db + - langchain-redis + + docusaurus: + container_name: docusaurus + image: node:18-alpine + working_dir: /app + volumes: + - ./docs/docusaurus:/app + command: sh -c 'npm install && npm start -- --host 0.0.0.0 --port 3001' + ports: + - 3001:3000 + expose: + - 3001 + + caddy_reverse_proxy: + container_name: caddy_reverse_proxy + image: caddy:alpine + restart: always + ports: + - 80:80 + - 9090:9090 + - 443:443 + environment: + - EXT_ENDPOINT1=${EXT_ENDPOINT1} + - LOCAL_1=${LOCAL_1} + - LOCAL_2=${LOCAL_2} + volumes: + - ./caddy/Caddyfile:/etc/caddy/Caddyfile + #- ./static:/code/static + - caddy_data:/data + - caddy_config:/config + + +volumes: + caddy_data: + caddy_config: + langchain-db-data: + langchain-redis-data: diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 00000000..71e1cb91 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,114 @@ +version: '3.8' + +services: + fastapi_server: + container_name: fastapi_server + build: ./backend + restart: always + command: "sh -c 'alembic upgrade head && python app/document_ingestion.py && uvicorn app.main:app --reload --workers 1 --host 0.0.0.0 --port 9090'" + volumes: + - ./backend/app:/code + expose: + - 9090 + env_file: ".env" + depends_on: + - database + + nextjs_server: + container_name: nextjs_server + build: ./frontend + restart: always + command: "sh -c 'node server.js'" + volumes: + - ./frontend:/code + ports: + - 3000:3000 + expose: + - 3000 + env_file: "frontend/.env" + depends_on: + - fastapi_server + + database: + image: ankane/pgvector:v0.4.1 + restart: always + container_name: database + env_file: ".env" + user: root + volumes: + - ./db_docker:/var/lib/postgresql + - ./scripts/create-dbs.sql:/docker-entrypoint-initdb.d/create-dbs.sql + ports: + - 5432:5432 # Remove this on production, use same port as in .env for fastapi_db + expose: + - 5432 + environment: + - POSTGRES_USERNAME=${DATABASE_USER} + - POSTGRES_PASSWORD=${DATABASE_PASSWORD} + - POSTGRES_DATABASE=${DATABASE_NAME} + - POSTGRES_HOST_AUTH_METHOD= "trust" + + db_sql_tool: # Remove if not using sql tool + image: postgres:11 + restart: always + container_name: db_sql_tool + volumes: + - ./db_docker:/var/lib/postgresql + - ./scripts/db_sql_tool/github_data_psql_load.sql:/docker-entrypoint-initdb.d/github_data_psql_load.sql + - ./backend/app/app/tool_constants/public_demo_data/pull_requests.csv:/docker-entrypoint-initdb.d/pull_requests.csv + - ./backend/app/app/tool_constants/public_demo_data/commit_history.csv:/docker-entrypoint-initdb.d/commit_history.csv + - ./backend/app/app/tool_constants/public_demo_data/issues.csv:/docker-entrypoint-initdb.d/issues.csv + environment: + - POSTGRES_USER=postgres + - POSTGRES_PASSWORD=postgres + - POSTGRES_DB=sqltool + ports: + - "5632:5432" + healthcheck: + test: ["CMD-SHELL", "pg_isready -U postgres"] + interval: 10s + timeout: 15s + retries: 5 + + redis_server: + image: redis:alpine + container_name: redis_server + restart: always + ports: + - 6379:6379 # Remove this on production + expose: + - 6379 + env_file: ".env" + + docusaurus: + container_name: docusaurus + image: node:18-alpine + working_dir: /app + volumes: + - ./docs/docusaurus:/app + command: sh -c 'npm install && npm start -- --host 0.0.0.0 --port 3001' + expose: + - 3001 + + caddy_reverse_proxy: + container_name: caddy_reverse_proxy + image: caddy:alpine + restart: always + ports: + - 80:80 + - 9090:9090 + - 3001:3001 + - 443:443 + environment: + - EXT_ENDPOINT1=${EXT_ENDPOINT1} + - LOCAL_1=${LOCAL_1} + - LOCAL_2=${LOCAL_2} + volumes: + - ./caddy/Caddyfile:/etc/caddy/Caddyfile + - caddy_data:/data + - caddy_config:/config + + +volumes: + caddy_data: + caddy_config: diff --git a/docs/docusaurus/.gitignore b/docs/docusaurus/.gitignore new file mode 100644 index 00000000..b2d6de30 --- /dev/null +++ b/docs/docusaurus/.gitignore @@ -0,0 +1,20 @@ +# Dependencies +/node_modules + +# Production +/build + +# Generated files +.docusaurus +.cache-loader + +# Misc +.DS_Store +.env.local +.env.development.local +.env.test.local +.env.production.local + +npm-debug.log* +yarn-debug.log* +yarn-error.log* diff --git a/docs/docusaurus/README.md b/docs/docusaurus/README.md new file mode 100644 index 00000000..87e3bb61 --- /dev/null +++ b/docs/docusaurus/README.md @@ -0,0 +1,73 @@ +AgentKit logo + + +# AgentKit: rapidly build production-ready Agent apps +AgentKit is a LangChain-based toolkit developed by BCG X to build Agent apps. Key advantages of the AgentKit framework include: +- 🚀 **Quickly build high quality Agent apps**: Build a strong demo in a few hours using a modular, easy to configure tech stack based on FastAPI/Nextjs and a library of useful GenAI tools +- 💻 **Flexible, reactive UI/UX designed for Agents**: React/Nextjs chat-based UI that is easy to configure, with features such as streaming, rendering of tables/visualizations/code, status of Agent actions and more +- 🛡️ **Focus on reliability**: Easy to configure routing architecture gives control of possible paths Agent can take, increasing reliability and making it suited for real-life use cases + +[Placeholder for demo video] + +## Quickstart +For a quick setup of AgentKit, use the steps below, where both the backend app and frontend app are run inside a Docker container. More elaborate setup instructions can be found at [setup.md](docs/setup.md). + +### Prerequisites +- Docker: https://www.docker.com/get-started + +### Installation steps +1. Clone the repository containing the source code for the backend and frontend apps. + +2. Copy the `frontend/.env.example` file in the frontend directory and change the name to `.env`. Also, copy the `.env.example` file in the root directory of the repository and change the name to `.env`. + - Change the OPENAI_API_KEY and OPENAI_ORGANIZATION to your own (n.b. OPENAI_ORGANIZATION should be your OpenAI 'Organization ID') + +3. In the terminal, navigate to the root directory of the cloned repository. Build and start the Docker containers with the following command: + ``` + docker-compose -f docker-compose.yml up -d + ``` + Wait for the containers to build and start, which may take a few minutes depending on your system. Once the containers are up and running, you can access the apps in your browser at [http://localhost](http://localhost/). + +## Chinook music database demo +- Ensure you are on the `develop` branch +- Follow the installation instructions above and swap `docker-compose.yml` with `docker-compose-demo.yml` to run the app +- Try the prompt "When was AC/DC founded?" to see AgentKit in action! + +## Set up your own app +- Configure your Agent and Tools [link](docs/configure_agent_and_tools.md) +- (Optional) Adjust the UI to your use case [link](docs/configure_ui.md) +- (Optional) Set up evaluation with LangSmith [link](docs/evaluation.md) + +## Documentation +- [Installation instructions for running frontend or entire app outside Docker](docs/setup_development.md) +- [Key concepts](docs/key_concepts.md) +- [Agent configuration](docs/configure_agent.md) +- [UI configuration](docs/configure_ui.md) +- [Optional features](docs/optional_features.md) +- [Tool library](docs/tool_library.md) + +## How it works + +### Reliability +AgentKit attempts to solve the reliability issue of agents such as ReAct agents by constraining the potential routes the agent can take to a pre-configured sets of routes, or **Action Plans**. Since for many use cases the potential routes the agent can take are known, we can use our human domain expertise to steer the agent in the right direction, and reduce it going into unexpected directions or rabbit holes. This is achieved by combining a **Meta Agent** with **Action Plans**: A set of tools which are executed linearily and in parallel, similar to a Chain. The Meta Agent takes in the user prompt and outputs the most suited Action Plan to generate an answer. Note: implementing multiple Meta Agents is possible, generating a tree of possible routes. + +### User experience +To optimize user experience, the intermediary output of every step in the Action Plan can be shown to the user. For example, consider an Action Plan consisting of 2 toolsets: `[[sql_tool, pdf_tool], [generate_summary_tool, visualize_tool]]`. In the first action step, information from a SQL database and a vector database with embedded PDFs are retrieved in parallel. The retrieved data and most relevant PDF are streamed to the UI as soon as the first action step finishes. In the second action step, the output from step 1 is passed to a tool that generates a text summary and a tool that creates a JSX visualization from the data, which is streamed to the UI to create the final answer. + +For a high level overview of the routing flow and connection the UI, please see below diagram: +AgentKit framework + +## Additional optional features + +- **Feedback integration**: allow users to give feedback on generated answers by showing a pop up after each message with quantitative (thumbs up/down) and qualitative (comment) feedback + +[placeholder for picture of feedback feature] + +- **User settings**: Allow users to specify default settings in the app that can be used to customize prompts for the user + +[Placeholder for picture of settings feature] + +- **User authentication**: Enable NextAuth on your app to authenticate users with Github or with email/password + +[placeholder for picture of authentication feature] + +See [optional feature documentation](docs/optional_features.md) for more detailed info. diff --git a/docs/docusaurus/babel.config.js b/docs/docusaurus/babel.config.js new file mode 100644 index 00000000..e00595da --- /dev/null +++ b/docs/docusaurus/babel.config.js @@ -0,0 +1,3 @@ +module.exports = { + presets: [require.resolve('@docusaurus/core/lib/babel/preset')], +}; diff --git a/docs/docusaurus/docs/advanced/aat_guidelines.md b/docs/docusaurus/docs/advanced/aat_guidelines.md new file mode 100644 index 00000000..32ce7dbf --- /dev/null +++ b/docs/docusaurus/docs/advanced/aat_guidelines.md @@ -0,0 +1,81 @@ +# Guidelines for Automated Acceptance Tests + +## Local setup + +1. Validate in the following config file: `frontend/cypress.config.ts` that the env variables `EMAIL` and `PASSWORD` are allowed accounts. (ie in auth.ts). Alternatively add them to an environment file `frontend/cypress.env.json` and remove them in the configuration. + +This auth data should be different from the username/password used to run the app for non-testing purposes (for example in development), to avoid poluting the tests with actual BE data created by the non-testing user. + +2. Run cypress (see next section for more info) + +## How to run cypress + +The two main ways to run cypress are: + +1. `pnpm cypress:open` - opens an interactive CY session and runs the individual tests manually. Choose a browser (Chrome recommended) and select the desired test +2. `pnpm cypress:run` - runs all the tests in `headless mode`. This also runs in a `pre-push` hook. + +Important: the FE server already needs to be running when running any of these two commands. + +There are several more ways to run cypress tests. For example it is possible to target specific tests by using cucmber filters like "@smoke", "@integration" or "@focus" (it is a good practice to add these filters to all test scenarios). + +1. `npx cypress run --env tags="@Smoke"` +2. `npx cypress run --env tags="@Smoke or @Integration"` +3. `npx cypress run --env tags="not @Smoke"` + +### Terminology and Structure + +The basic unit of an automated acceptance test is the *Step*. Each step represents either a user action or a user expectation. + +* Action: pressing a button, selecting an option from a dropdown, typing text into an input, ... . +* Expectation: seeing various elements on the page, seeing a success message, seeing an error popup, ... . + +Steps can be orchestrated to form more complex *Scenarios*. A scenario is a meaningful set of steps that represents a user flow in our app. +Each scenario combines user actions with user expectations. + +Functionally related scenarios are grouped in *Features*. Each feature lives in its own feature file, e.g. `login.feature`. All features +live in the `features` directory. Subdirectories can be created to group features by their common domain. + +### Syntax and Semantics + +Each step is encoded using the [Gherkin step syntax](https://cucumber.io/docs/gherkin/reference/). User actions start with `When`, user +expectations start with `Then`. All step definitions live in the `step_definitions` directory and its subdirectories. + +Scenarios should follow some rules about the Gherkin keywords: + +* `Given` is used to establish the test's preconditions. +* `When` is used to indicate user actions. +* `Then` is used to indicate user expectations. +* `And` is used to form more complex preconditions/actions/expectations by concatenation. + +Common test preconditions within a feature can be put in a `Background`. An example feature file can look like this: + +```gherkin +Feature: Login + As a customer I want to log in to the application using my user name and password. + + Background: + Given I have navigated to the home page + And I open the login modal + + Scenario: Login with invalid username + And I select "unknown-user-or-password" for mock "post-auth-login" + When I enter "not_existing@kupferwerk.com" in the mail field + And I enter "Test1234" in the password field + And I press the login button + Then I see the error message for an incorrect mail or password + And I see the login modal +``` + +The example shows that Gherkin keywords preceding a step must be in a certain order: + +* `Background` definitions always start with `Given` and can be continued with additional `And` steps. +* `Scenario` definitions always start with an `And` or `When`, either to continue the preconditions from the `Background` or to begin a user +action +* `Scenario` definition always end with `Then` or `And`. +* User actions initiated with `When` can be chained using `And` concatenation +* User expectations initiated with `Then` can become more complex using `And` concatenation +* Each `Then` must correspond to a previous `When` + +Past tense may be used for `Given` steps. Note that this will bloat the step definitions, because the same action or expectation must +support multiple, slightly different step names, e.g. "Given I have navigated to the account page" vs "When I navigate to the account page". diff --git a/docs/docusaurus/docs/advanced/evaluation.md b/docs/docusaurus/docs/advanced/evaluation.md new file mode 100644 index 00000000..2d6f4923 --- /dev/null +++ b/docs/docusaurus/docs/advanced/evaluation.md @@ -0,0 +1,12 @@ +# Evaluation + +Evaluating an AgentKit app can be done on multiple levels: +- Routing layer: Evaluate the meta agent's accuracy of choosing the right action plan based on the user query +- Tool layer: Evaluate individual tools +- Output layer: Evaluate the final output quality + +AgentKit evaluation layers + +AgentKit natively integrates with LangSmith, which is a useful tool for tracing and tracking the performance of your app. https://docs.smith.langchain.com/ + +See [Optional Features](docs/advanced/optional_features.md) for instructions to set up LangSmith. diff --git a/docs/docusaurus/docs/advanced/memory.md b/docs/docusaurus/docs/advanced/memory.md new file mode 100644 index 00000000..41de79ae --- /dev/null +++ b/docs/docusaurus/docs/advanced/memory.md @@ -0,0 +1,84 @@ +# Memory Management for Tools + +## Introduction + +Memory management is a crucial aspect of building agents that can provide relevant and context-aware responses to user queries. The memory in this context refers to all context from previous user interactions (chat history) or actions (output from previously executed tools) a tool needs to perform its task optimally. Effective memory management and filtering are vital to ensure that only relevant context is passed into the tool. This reduces the 'noise' of unimportant tokens in the tool's LLM calls, increasing output quality and reducing cost and latency. + +**Chat history:** provides the context of the user's previous conversation. This context is essential for the agent to understand the user's current query in the right perspective. For instance, a user's current query might be a follow-up question or a query related to a previous discussion. Without the context provided by the chat history, the agent might not be able to provide a satisfactory response. + +**Previous tool output:** provides context of the tools run in intermediate steps of the action plan executed before the current tool. For example, a tool might have retrieved some data that is relevant to the user's current query. By including this data in the memory of the next tool, the agent can provide a correct response. + +## Memory manipulation + +The memory object is defined by `ToolInputSchema`: +- `chat_history`: This is a list of messages exchanged between the user and the AI, including intermediate tool outputs of previous steps in the conversation. Each message is either a HumanMessage or an AIMessage. The chat history can be passed into a tool prompt, and can be manipulated to only include relevant context, or reduced to limit the number of tokens in the prompt. + +- `latest_human_message`: This is the most recent message from the user. It's often the question or command that the tool needs to respond to. + +- `user_settings`: This is a `UserSettings` object that contains any user-specific settings or data that might influence the tool's behavior. + +- `intermediate_steps`: This is a dictionary that contains the outputs of any previous tools that have been run in the current action plan. + +The memory object is created in `SimpleRouterAgent.py`. First, the object is created during each action step and filled with the intermediate steps so far in the action plan: +``` +tool_input = ToolInputSchema( + latest_human_message=kwargs["input"], + chat_history=[], + user_settings=UserSettings(**kwargs["user_settings"].dict()) if kwargs["user_settings"] else None, + intermediate_steps={}, + ) + if len(intermediate_steps) > 0: + tool_appendix_titles = { + tool.name: getattr( + tool, + "appendix_title", + "", + ) + for tool in self.tools + } + tool_input.intermediate_steps = { + tool_appendix_titles[step[0].tool]: step[1] for step in intermediate_steps + } +``` +Then, the chat history is filled if it exists and if `memory` is one of the action steps: +``` + elif "memory" in next_actions and "chat_history" in kwargs: + tool_input.chat_history = kwargs["chat_history"] +``` +To include chat history in your action step, add `memory` to the step in `agent.yml`, e.g. +``` +actions: + - - memory + - expert_tool +``` + +The object will look like +``` +{ + "chat_history": [{"content": "user message 1"}, "additional_kwargs": {}, "type": "human", "example": "false"], [{"content": "AI response 1"}, "additional_kwargs": {}, "type": "ai", "example": "false"], ...}, + "latest_human_message": "latest user prompt", + "user_settings": {"data": {configured user settings}}, + "intermediate_steps": {"tool_name_1": "output", "tool_name_2": "output", ...} +} +``` + +The memory object is passed to the tools as the `query` argument in the `_arun` function, where it can be used to customize the context for a given tool. For example, we may only want to provide the output of the `sql_tool` and the original user question in a prompt for a different tool. This can be easily done by accessing parts of the memory object: +``` +tool_input = ToolInputSchema.parse_raw(query) +question = tool_input.latest_human_message +results = tool_input.intermediate_steps["sql_tool"] +messages = [ + SystemMessage(content=self.system_context.format()), + HumanMessage( + content=self.prompt_message.format( + question=question, + results=results, + ))] +``` + +For most library tools, the below standard query formatting is used (defined in `query_formatting.py`): +``` +Chat history: ... +Intermediate tool outputs: ... +Latest user question: ... +``` diff --git a/docs/docusaurus/docs/advanced/optional_features.md b/docs/docusaurus/docs/advanced/optional_features.md new file mode 100644 index 00000000..e27dc353 --- /dev/null +++ b/docs/docusaurus/docs/advanced/optional_features.md @@ -0,0 +1,159 @@ +# Optional Features + +In addition to the core functionality, AgentKit supports optional security and tracking features out of the box. + +## Tracing & evaluation with local LangSmith + +To use a self-hosted langchain in docker, ensure the docker containers are running and `LANGCHAIN_TRACING_V2` is set to `true` and `LANGCHAIN_ENDPOINT` to `"http://langchain-backend:1984"` (see below). +Note that `LANGCHAIN_API_KEY` must be set, but will not be used in self-hosted context. + +Stored runs and feedback can be accessed at [http://localhost:9091](http://localhost:9091) + +``` +############################################# +# Langsmith variables +############################################# +LANGCHAIN_TRACING_V2="true" +LANGCHAIN_ENDPOINT="http://langchain-backend:1984" +LANGCHAIN_API_KEY="not-used" # must be set to real key if using hosted - key must be set for self-hosted +LANGCHAIN_PROJECT="default" +``` + +Ensure the docker containers for langsmith are running: +``` +langchain-playground: + image: langchain/${_LANGSMITH_IMAGE_PREFIX-}langchainplus-playground@sha256:f61ce9762babcb4a51af3e5b0cc628453ac7087237c5fc8694834de49b56d16e + + langchain-frontend: + image: langchain/${_LANGSMITH_IMAGE_PREFIX-}langchainplus-frontend@sha256:e0ab157b2b9cb7f75743d45237f0d8ede75a3811d913f234585484255afe5b5a + ports: + - 9091:80 + expose: + - 9091 + environment: + - NEXT_PUBLIC_BACKEND_URL=http://langchain-backend:1984 + depends_on: + - langchain-backend + - langchain-playground + volumes: + - ./conf/nginx.conf:/etc/nginx/default.conf:ro + + langchain-backend: + image: langchain/${_LANGSMITH_IMAGE_PREFIX-}langchainplus-backend@sha256:1196c12308b450548195c10927d469963c7d8e62db0e67f8204c83adb91f9031 + environment: + - PORT=1984 + - LANGCHAIN_ENV=local_docker + - LOG_LEVEL=warning + - OPENAI_API_KEY=${OPENAI_API_KEY} + ports: + - 1984:1984 + depends_on: + - langchain-db + + langchain-db: + image: postgres:14.1 + command: + [ + "postgres", + "-c", + "log_min_messages=WARNING", + "-c", + "client_min_messages=WARNING" + ] + environment: + - POSTGRES_PASSWORD=postgres + - POSTGRES_USER=postgres + - POSTGRES_DB=postgres + volumes: + - langchain-db-data:/var/lib/postgresql/data + ports: + - 5433:5432 + + langchain-redis: + image: redis:7 + ports: + - 63791:6379 + volumes: + - langchain-redis-data:/data + + langchain-queue: + image: langchain/${_LANGSMITH_IMAGE_PREFIX-}langchainplus-backend@sha256:1196c12308b450548195c10927d469963c7d8e62db0e67f8204c83adb91f9031 + environment: + - LANGCHAIN_ENV=local_docker + - LOG_LEVEL=warning + entrypoint: "rq worker --with-scheduler -u redis://langchain-redis:6379 --serializer lc_database.queue.serializer.ORJSONSerializer --worker-class lc_database.queue.worker.Worker --connection-class lc_database.queue.connection.RedisRetry --job-class lc_database.queue.job.AsyncJob" + depends_on: + - langchain-redis + + langchain-hub: + image: langchain/${_LANGSMITH_IMAGE_PREFIX-}langchainhub-backend@sha256:73b4c2c3e7cd81729e766bb4eece2b28883bebf7c710567a21d1a6c114abff5a + environment: + - PORT=1985 + - LANGCHAIN_ENV=local_docker + - LOG_LEVEL=warning + ports: + - 1985:1985 + depends_on: + - langchain-db + - langchain-redis +``` + + +## Tracing & evaluation with hosted Langsmith + +To use hosted Langsmith, set `LANGCHAIN_ENDPOINT` to `"https://api.langchain.plus"` and fill `LANGCHAIN_API_KEY`: + +1. Create an API Key by navigating to the [settings page](https://smith.langchain.com/settings). +2. Configure runtime environment - replace `` with the API key generated in step 1 + +``` +############################################# +# Langsmith variables +############################################# +LANGCHAIN_TRACING_V2="true" +LANGCHAIN_ENDPOINT="https://api.langchain.plus" +LANGCHAIN_API_KEY="" +LANGCHAIN_PROJECT="default" +``` + +## User chat feedback integration + +> Note: LLM Run tracing must be enabled for this feature. + +To enable feedback from the tool frontend, set `NEXT_PUBLIC_ENABLE_MESSAGE_FEEDBACK` in the /frontend/.env file is set to `true`, + +A pop-up will appear after each message giving the user the ability to rate the message quantitatively (thumbs up/down) and qualitatively (comment). This functionality can be useful e.g. for a PoC user testing session for your application. It can be further customised by adjusting the `FeedbackView` typescript file. + +Feedback popup + +Frontend implementation: [frontend/src/components/ConversationView/MessageView/FeedbackView/index.tsx](frontend/src/components/ConversationView/MessageView/FeedbackView/index.tsx) +Backend route: [backend/app/app/api/v1/endpoints/statistics.py](backend/app/app/api/v1/endpoints/statistics.py) + + +### Retrieving Feedback results: +1. Via the UI: + Feedback is collected in Langsmith as for LLM runs - Navigate to http://localhost:9091 (https://smith.langchain.com/ if using hosted) and select the project. +2. Via python API: by following example scripts at https://docs.smith.langchain.com/cookbook/exploratory-data-analysis/exporting-llm-runs-and-feedback +3. Via DB: by connecting to the DB directly in `public.runs` / `public.feedback` at `jdbc:postgresql://localhost:5433/postgres` + + +## User authentication + +User authentication can be done through NextAuth. Set `NEXT_PUBLIC_USE_AUTH` to `true` and fill the 'NEXTAUTH_SECRET' variable in `frontend/.env` with the generated secret key. A secret key can be generated using: +``` +openssl rand -base64 32 +``` +For more information, check the [NextAuth documentation](https://next-auth.js.org/configuration/options#secret). +Additionally, if you want to enable GitHub authentication, the `GITHUB_ID` and `GITHUB_SECRET` in `frontend/.env` should be filled with the corresponding values from your GitHub app credentials. + +Feedback + +## User settings +The user can configure custom settings in the UI in the 'Settings' modal, providing an option for the user to configure settings which can affect the prompts. The configured setting can be accessed in the `query` object: +``` +tool_input = ToolInputSchema.parse_raw(query) +settings = tool_input.user_settings +``` +These settings can then be used in any of the tools, e.g. as input to prompts. + +Settings diff --git a/docs/docusaurus/docs/advanced/overview_codebase.md b/docs/docusaurus/docs/advanced/overview_codebase.md new file mode 100644 index 00000000..d7d5d2a9 --- /dev/null +++ b/docs/docusaurus/docs/advanced/overview_codebase.md @@ -0,0 +1,92 @@ +# Tech stack and code structure + +## Tech stack +- App logic: [Next.js](https://nextjs.org/) and [FastAPI](https://fastapi.tiangolo.com/) +- LLM Orchestration: [Langchain](https://www.langchain.com/) +- Task queueing, caching: [Celery](https://github.com/celery/celery) and [Redis](https://redis.io/) +- Auth: [NextAuth](https://next-auth.js.org/) +- Local database: [PostgresQL](https://www.postgresql.org/) +- Vector database [PGVector](https://github.com/pgvector/pgvector). Note: any vector database compatible with LangChain can be defined in `vector_db_ingestion` +- Deployment: [Docker](https://www.docker.com/) TODO: add other options + +Link to API documentation: https://agentkit.infra.x.bcg.com/api/v1/docs#/ + +## Docker containers + +### Required services + +`fastapi_server`: Contains the backend FastAPI service +`nextjs_server`: Contains the nextjs frontend. Note: can be run outside the docker in development mode, to enable hot reload. +`redis_server`: Contains the redis service required for managing task queues and caching +`database`: Contains the databases required for the application. `fastapi_db` Contains the user data (se) +`caddy_reverse_proxy`: Configuration for Caddy server acting as reverse proxy + +### Optional services + +`pre-commit`: Run pre-commit hooks +`langsmith`: Evaluation (see [Optional Features](docs/advanced/optional_features.md) for how to set up the containers) + +## Code Structure +``` +[backend] // FastAPI/Nextjs backend + ├── Dockerfile // backend fastapi docker image and install dependencies + ├── [app] + ├── [app] + ├── document_ingestion.py // ingest documents into the vector database + ├── main.py + ├── [api] // contains the endpoints for the application + ├── [config] // contains the agent and tool prompts and configurations + ├── [core] // core functionalities of the backend application + ├── [db] // manage postgresql and vector databases + ├── [deps] // helper functions + ├── [models] // data models for data saved in the database + ├── [schemas] // schemas for data validation + └── [services] + └── [chat_agent] + ├── [helpers] + ├── [router_agent] // core agent routing logic + └── [tools] // tool definitions + ├── [tool_constants] // static data to use in tools (e.g. PDF data for `pdf_tool` RAG) + └── [utils] + ├── [exceptions] + └── [streaming] // streaming logic +[caddy] + └── Caddyfile +[docs] + └── [docusaurus] + └── [docs] +[frontend] + ├── Dockerfile // frontend nextjs docker image + ├── tailwind.config.ts // theme colors, fonts etc. + ├── [custom_typings] + ├── [cypress] // e2e tests + ├── [prisma] + ├── [public] // public statics, e.g. images, fonts + └── [src] + ├── api-client // nextjs api + └── [components] + ├── [CodeView] + ├── [Common] + ├── [ConversationSideBar] + ├── [ConversationView] + ├── [CustomIcons] + ├── [ToolActionRenderer] // actions in agent steps UI + └── [ToolAppendixRenderer] // appendices in agent outputs + ├── hooks + ├── pages + ├── [api] + ├── [auth] + └── [chat] + ├── server + ├── stores // state + ├── styles // styling config + ├── types + └── utils +[pre-commit] + ├── .pre-commit-config.yaml + ├── Dockerfile + └── pre-commit.git +[scripts] // sql scripts to create and load databases, add script for a custom database + ├── create-dbs.sql + └── [db_sql_tool] +``` diff --git a/docs/docusaurus/docs/configuration/configure_agent_and_tools.md b/docs/docusaurus/docs/configuration/configure_agent_and_tools.md new file mode 100644 index 00000000..04fca3c9 --- /dev/null +++ b/docs/docusaurus/docs/configuration/configure_agent_and_tools.md @@ -0,0 +1,43 @@ +# Configure your agent and tools + +## Steps to complete +- Configure your agent in `agent.yml`, [see agent section for more detailed instructions](#agent-configuration) +- Add your own tools in `services/chat_agent/tools/YOURAPP` and configure them in `tools.yml`, [see tools section for more detailed instructions](#tools-configuration) + + +## Agent configuration + +The agent and action plans can be configured in `agent.yml`. + +### LLMs + +`default_llm` & `default_fast_llm`: Set the name of the LLMs you want to use. In `llm.py` you can add your own model (any model compatible with LangChain e.g. Google, Anthropic, or open source like Llama2). + +We currently have 2 ways to choose if `default_llm` or `default_fast_llm` is used. +- If you set `force_gpt4` to True in the LLM call in a tool, `default_llm` will always be used +- [TO BE CHANGED] Otherwise, `default_fast_llm` will be used for prompts < 2500 tokens (configurable in ExtendedBaseTool.py currently, needs to be cleaned up to add as a key setting) and `default_llm` for >=2500 tokens + +### Tools and Action Plans +Add all the tools in use in `tools`. Ensure the names match the tool names in `tools.py` and your custom tools. + +Configure the Action Plans available for the Meta Agent to choose from in `action_plans`. Give each Action Plan a clear `description` of what the use case is, this will improve the reliability and accuracy of the Meta Agent. Add all the tools in `actions`. Each sublist is 1 action step, so add tools as subitems if you want to execute them in parallel. + +### Meta agent prompts + +It is very important to have a clear system prompt in `system_context` for the Meta Agent so that it chooses the right Action Plans (`prompt_message` typically can typically be kept the same). Always include a role for the agent ("You are an expert in ...") and a clear goal ("Your goal is to select the right action plan.."). Include some principles to ensure the agent has the right behaviour for the use case, e.g. only run an optimization when the agent is very sure the user wants this, as it takes a lot of time. If there are common failure modes in the agent's routing choices, add a principle or add an example of good behaviour to solve it. + +## Tools configuration + +### Using a library tool +Check out the library of commonly used tools in `services/chat_agent/tools/library`. Using these tools is simple; ensure the tool is in the `tools` list in `agent.yml` and configure the prompts in `tools.yml`. Detailed documentation on the library tools can be found in `docs/library_tool_docs`. + +### Add a tool + +1) Add your own tool folder to `services/chat_agent/tools` with a new file `yourtool.py` +2) Implement your tool. See `template_tool.py` for a template tool, or look at the other library tools for inspiration +3) In `tools.py`, add the tool in `all_tool_classes` and import it +4) Add the tool in `tools` in `agent.yml` and add the tool to the applicable action plans +5) Add your tool and configure the tool and prompts in `tools.yml` + +Optional: +Customize the Actions for the tool in the UI, see [the UI documentation](configure_ui.md). diff --git a/docs/docusaurus/docs/configuration/configure_ui.md b/docs/docusaurus/docs/configuration/configure_ui.md new file mode 100644 index 00000000..12e7cdc7 --- /dev/null +++ b/docs/docusaurus/docs/configuration/configure_ui.md @@ -0,0 +1,74 @@ +# Frontend customization guide +This guide provides instructions on how to customize the user interface elements of your project, such as colors, fonts, and general styling, using Tailwind CSS within your codebase + +AgentKit frontend is leveraging [tailwindcss](https://tailwindcss.com/) to efficiently configure and customize theme colors and fonts. + +The main UI config files are available in `frontend/tailwind.config.ts` and inside `frontend/src/style/` directory. + +## Theme colors +The colour pallete used is defined in the `frontend/tailwind.config.ts` file: + +``` typescript + colors: { + 'bcg-green': '#156648', // replace indigo-600 + 'bcg-green-light': '#39b27c', + 'bcg-green-x-light': '#5dfdb0', + 'bcg-x-green': '#00E0B5', + 'custom-light-green': 'rgba(100, 255, 100, 0.1)', + 'bcg-dark': 'rgb(28, 31, 61)', + 'bcg-dark-hover': 'rgb(0, 168, 135)', + 'bcg-dark-select': 'rgb(0, 224, 181)', + 'bcg-light': 'rgb(228,228,233)', + 'bcg-light-select': 'rgb(0, 168, 135)', + 'bcg-light-hover': '#00E0B5', + }, +``` + +To customize the color of table elements in the chat, you need to modify the `frontend/src/style/global.css` file: + +``` css +.rdt_Pagination { + @apply !border-t-0 dark:bg-bcg-dark-select dark:text-gray-300; +} + +.rdt_Pagination button { /* pagination and buttons */ + @apply dark:bg-bcg-dark-select dark:fill-gray-300 dark:text-gray-300; +} + +.rdt_Table, /* Color classes */ +.rdt_TableHead, +.rdt_TableHeadRow, +.rdt_TableRow { /* Hover and Selected States */ + @apply dark:bg-bcg-dark-select dark:text-gray-300; +} +``` + +## Fonts + +Update the fontFamily section in your `tailwind.config.ts` file: + +``` typescript + fontFamily: { + sans: ['Henderson BCG Sans', ...defaultTheme.fontFamily.sans], + }, +``` + +## Logos and images + +For logos and images, you will directly replace the files in your `frontend/public/logo_***.png`.Make sure the new images follow the same naming conventions and file formats as the old ones to avoid broken references. + + +## Action and Appendix Renderers + +If your application defines tools, it has to define application-specific artifact-renderers and action-renderers as well. The rest of the GUI & application flow is fixed (LLM-streaming, Meta-agent routing, memory, etc.). + +- Add your own action icons for steps in `ToolActionRenderer/actions.tsx` by specifying the action name used in your tool and the icon you want to use (icons can be found at https://react-icons.github.io/react-icons/). Ensure you have a `run_manager.on_text` in your tool that creates the action, such as below: +``` +await run_manager.on_text( + "action_name", + data_type=StreamingDataTypeEnum.ACTION, + tool=self.name, + step=1, + ) +``` +- (Optional) Add your own renderer for custom appendices in `ToolAppendixRenderer/index.tsx` and `ToolAppendixRenderer/CodeFlipCard/YOUR_APPENDIX_RENDERER.tsx` diff --git a/docs/docusaurus/docs/configuration/img/docsVersionDropdown.png b/docs/docusaurus/docs/configuration/img/docsVersionDropdown.png new file mode 100644 index 00000000..97e41646 Binary files /dev/null and b/docs/docusaurus/docs/configuration/img/docsVersionDropdown.png differ diff --git a/docs/docusaurus/docs/configuration/img/localeDropdown.png b/docs/docusaurus/docs/configuration/img/localeDropdown.png new file mode 100644 index 00000000..e257edc1 Binary files /dev/null and b/docs/docusaurus/docs/configuration/img/localeDropdown.png differ diff --git a/docs/docusaurus/docs/how_it_works/backend_flow.md b/docs/docusaurus/docs/how_it_works/backend_flow.md new file mode 100644 index 00000000..ace2a499 --- /dev/null +++ b/docs/docusaurus/docs/how_it_works/backend_flow.md @@ -0,0 +1,45 @@ +# AgentKit Backend Flow + +The general backend flow is mainly constructed through the following four Python files, each serving a specific purpose. + +## chat.py + +This is the main backend entry point of AgentKit. It exposes a FastAPI endpoint at `/agent` which accepts POST requests. +The request body should contain a chat query, which is processed by the `agent_chat` function. This function creates a +conversation with an agent and returns an `StreamingJsonListResponse` object. + +## meta_agent.py + +This file contains functions for creating and managing a meta agent. A meta agent is an instance of the `AgentExecutor` +class, which is responsible for executing AgentKit's logic. +- The `create_meta_agent` function creates a meta agent from a given configuration. +- The `get_conv_token_buffer_memory` function retrieves the chat history and stores it in a +`ConversationTokenBufferMemory` object. + +## SimpleRouterAgent.py + +This file contains the `SimpleRouterAgent` class. This class is +responsible for managing AgentKit's actions based on the input it receives. +- The `aplan` function decides what actions the agent should take based on the input and the intermediate steps taken so far. +- The `create_prompt` function creates a prompt for the agent. +- The `from_llm_and_tools` function constructs an agent from a language model and a set of tools. + +## get_tools.py + +This file contains the `get_tools` function, which retrieves a list of tools from a list of tool names. Each tool class +is responsible for a specific functionality of AgentKit. + +## Flow + +1. A POST request is sent to the `/agent` endpoint with a chat query in the request body. +2. The `agent_chat` function in `chat.py` is called. This function retrieves the meta agent associated with the API key +specified in the chat query. +3. The `agent_chat` function creates a conversation with the agent, handles exceptions, and returns a streaming response. +4. The meta agent, which is an instance of the `AgentExecutor` class, executes AgentKit's logic. This logic is +determined by the `SimpleRouterAgent` class in `SimpleRouterAgent.py`. +5. The `SimpleRouterAgent` class decides what actions the agent should take based on the input it receives and the +intermediate steps taken so far. +6. The `get_tools` function in `get_tools.py` is called to retrieve the tools needed by the agent. These tools are used +to perform various tasks, such as generating images, summarizing text, executing SQL queries, etc. +7. The conversation continues until the agent decides to stop, at which point the `agent_chat` function returns a +`StreamingJsonListResponse` object containing the conversation history. diff --git a/docs/docusaurus/docs/how_it_works/key_concepts.md b/docs/docusaurus/docs/how_it_works/key_concepts.md new file mode 100644 index 00000000..ca4e866e --- /dev/null +++ b/docs/docusaurus/docs/how_it_works/key_concepts.md @@ -0,0 +1,25 @@ +# Key concepts + +## Reliability +AgentKit attempts to solve the reliability issue of agents such as ReAct agents by constraining the potential routes the agent can take to a pre-configured sets of routes, or **Action Plans**. Since for many use cases the potential routes the agent can take are known, we can use our human domain expertise to steer the agent in the right direction, and reduce it going into unexpected directions or rabbit holes. This is achieved by combining a **Meta Agent** with **Action Plans**: A set of tools which are executed linearily and in parallel, similar to a Chain. The Meta Agent takes in the user prompt and outputs the most suited Action Plan to generate an answer. Note: implementing multiple Meta Agents is possible, generating a tree of possible routes. + +## Transparency +To optimize user experience and transparency, the intermediary output of every step in the Action Plan can be shown to the user. For example, consider an Action Plan consisting of 2 toolsets: `[[sql_tool, pdf_tool], [generate_summary_tool, visualize_tool]]`. In the first action step, information from a SQL database and a vector database with embedded PDFs are retrieved in parallel. The retrieved data and most relevant PDF are streamed to the UI as soon as the first action step finishes. In the second action step, the output from step 1 is passed to a tool that generates a text summary and a tool that creates a JSX visualization from the data, which is streamed to the UI to create the final answer. + +## Flow Diagram +For a high level overview of the routing flow and connection the UI, please see below diagram: +AgentKit framework + +## Terminology + +- **Actions**: One of the steps to obtain an answer to the user's query, corresponding to executing a Tool(chain). An action has its own action-renderer for visualization in the frontend. + +- **Action Step**: A pre-configured set of actions, e.g. sql_tool and pdf_tool. An action step can consist of multiple actions which are executed in parallel to achieve a certain outcome (e.g. retrieve information). + +- **Action Plan**: A set of action steps which are executed linearily to achieve a certain outcome. For example, consider an action plan consisting of 2 toolsets: [[tool_1, tool_2], [tool_3, tool_4]]. In the first action step, tool_1 and tool_2 are executed in parallel and generate output. In the second action step, this output is passed to tool_3 and tool_4, which are executed in parallel, and the final output is passed to the frontend. + +- **LLM Outputs**: Text output of an LLM from a Tool that is streamed to the frontend (e.g. output from explainer tool). In the output section, there is a preliminary LLM output (currently only from entertainer tool) and a final LLM output (final answer of agent). + +- **Appendices**: Additional objects that are added below the final LLM output, such as visualizations, tables etc. + +- **Signals**: Signals sent from backend of output status. E.g. 'Action ended', 'LLM Output final'. diff --git a/docs/docusaurus/docs/introduction.md b/docs/docusaurus/docs/introduction.md new file mode 100644 index 00000000..528b686f --- /dev/null +++ b/docs/docusaurus/docs/introduction.md @@ -0,0 +1,33 @@ +--- +sidebar_position: 1 +--- + +# Introduction +AgentKit is a LangChain / FastAPI / Next.js14 toolkit developed by BCG X to build Agents. Developers can use AgentKit to rapidly build high quality Agent applications that can scale into production-grade apps. + +Key advantages of AgentKit include: +- 🚀 **Quickly build high quality Agent apps**: Modular, easy to configure tech stack and a library of useful GenAI tools allows developers to build a strong Agent app in hours +- 💻 **Flexible, reactive UI/UX designed for Agents**: React/Nextjs chat-based UI that is easy to configure, with features such as streaming, rendering of tables/visualizations/code, status of Agent actions and more +- 🛡️ **Focus on reliability**: Easy to configure routing architecture gives control of possible paths Agent can take, increasing reliability and making it suited for real-life use cases + +As an example, try the AgentKit codebase helper [demo](https://agentkit.infra.x.bcg.com/) + + + +## Chinook music database demo +For a quick start to test some of the functionality, you can use the dummy Chinook example: +- Ensure you are on the `develop` branch +- Follow the [installation instructions](docs/setup/setup.md) and swap `docker-compose.yml` with `docker-compose-demo.yml` to run the app +- Try the prompt "How many artists and songs are there in the database?" to see AgentKit in action! + +## New users: Customize your agent app in 15 minutes +- [Configure your Agent and Tools](docs/configuration/configure_agent_and_tools.md) +- [Adjust the UI to your use case](docs/configuration/configure_ui.md) +- Ask the [AgentKit codebase helper](https://agentkit.infra.x.bcg.com/) if you need help! + +## Advanced users: Prepare your app for production +- [Tech stack and code structure](docs/advanced/overview_codebase.md) +- [Set up evaluation with LangSmith](docs/advanced/evaluation.md) +- [Set up and run acceptance tests with cypress](docs/advanced/aat_guidelines.md) +- [Add additional features, such as auth, feedback and user settings](docs/advanced/optional_features.md) +- [Deploy your app] TODO: deployment documentation link diff --git a/docs/docusaurus/docs/setup/setup.md b/docs/docusaurus/docs/setup/setup.md new file mode 100644 index 00000000..4ee0be70 --- /dev/null +++ b/docs/docusaurus/docs/setup/setup.md @@ -0,0 +1,32 @@ +# Quick setup +If this is your first time setting up AgentKit, please follow these steps. If you are planning to develop, we recommend to setup hot-reload as described in the [development setup modes](docs/setup/setup_development.md). We will run the backend app as well as the frontend app inside a Docker container. + +### Prerequisites +- Docker: https://www.docker.com/get-started + +### Installation steps + +1. Clone the repository containing the source code for the backend and frontend apps. + +2. Copy the `.env.example` file in the root directory of the repository and change the name to `.env`. + - Change the OPENAI_API_KEY and OPENAI_ORGANIZATION to your own (n.b. OPENAI_ORGANIZATION should be your OpenAI 'Organization ID', not 'Organization name'): + ```sh + OPENAI_API_KEY= + OPENAI_ORGANIZATION= + ``` +3. Copy the `frontend/.env.example` file in the frontend directory and change the name to `.env`. + +4. In the terminal, navigate to the root directory of the cloned repository. Build and start the Docker containers using the `docker-compose.yml` configuration file: + ``` + docker-compose -f docker-compose.yml up -d + ``` + +5. Wait for the containers to build and start. This may take a few minutes depending on your system. Once the containers are up and running, you can access the apps in your browser: + - Frontend app (Next.js): [http://localhost](http://localhost/) + - Backend app (FastAPI): http://localhost/api/v1 + +6. You have successfully installed and run the apps using Docker and the Caddy reverse proxy! + +## (Optional) Langchain tracing (Langsmith) + +See https://docs.smith.langchain.com/ on how to set up LangSmith. Once you have set up LangSmith and the .env variables, you will be able to see the AgentKit traces in LangSmith. diff --git a/docs/docusaurus/docs/setup/setup_development.md b/docs/docusaurus/docs/setup/setup_development.md new file mode 100644 index 00000000..6844b419 --- /dev/null +++ b/docs/docusaurus/docs/setup/setup_development.md @@ -0,0 +1,143 @@ +# Advanced set-ups (development) + +There are two additional setups available: +1. Development set-up: Use during development so you can quickly see the changes you make reflected using hot reload. + +2. Full local set-up: Use when you want to run both backend and frontend apps entirely locally without Docker. Suitable for local development without Docker, development on machines without Docker support, or quick prototyping. + +## Development set-up + +### Prerequisites +Before you begin, make sure you have the following installed on your machine: +- Docker: Docker: https://www.docker.com/get-started +- Node.js and pnpm: https://pnpm.io/installation + +### Installation Steps + +1. Copy the `.env.example` file in the root directory of the repository and change the name to .env. + - Change the OPENAI_API_KEY and OPENAI_ORGANIZATION to your own (n.b. OPENAI_ORGANIZATION should be your OpenAI 'Organization ID', not 'Organization name'): + ```sh + OPENAI_API_KEY= + OPENAI_ORGANIZATION= + ``` +2. Copy the `frontend/.env.example` file in the frontend directory and change the name to `.env`. Change the `DB_PORT` and `DB_HOST` variables as follows: + - `DB_PORT`: Change to 5732. + - `DB_HOST`: Change to localhost + + If needed, change the following variable (not required for a succesfull demo installation): + - `NEXT_PUBLIC_USE_AUTH`: Set to `true` if you would like to add an identity layer using Next Auth. + - `NEXTAUTH_SECRET`: Generate a secret key and replace `# TODO: Generate a secret and add it here` with the secret key. + - `GITHUB_ID` and `GITHUB_SECRET`: If you want to enable GitHub authentication, replace the corresponding values with your GitHub app credentials. + - `DB_USER`, `DB_PASSWORD`, `DB_HOST`,`DB_USER`,`DB_PORT` and `DB_NAME`: If you want to customize the database connection settings, update these values accordingly. + +3. Build and start the Docker containers with + ``` + docker-compose -f docker-compose-development.yml up -d + ``` + +4. Navigate to the `frontend` directory and install the frontend app's dependencies and set up prisma using pnpm: + ``` + pnpm install + pnpm prisma:generate + ``` + +5. Once the dependencies are installed, start the frontend app: + ``` + pnpm dev + ``` + +The frontend app (Next.js) will now be running locally at http://localhost:3000. The backend app (FastAPI) is still running inside the Docker container and can be accessed at http://localhost/api/v1. + +Additional notes: +- The backend app will automatically reload whenever you make changes to the source code inside the `backend/app` directory. You can see the changes reflected by refreshing the backend app in your browser. +- The frontend app (Next.js) will also automatically reload whenever you make changes to the source code inside the `frontend` directory. You can see the changes reflected by refreshing the frontend app in your browser. +- (Optional) If you want to enable debug mode for the backend to set breakpoints, you can change the `command` in `docker-compose-development.yml` for the `fastapi_server`. Once changed, the backend will not start up fully after running `docker-compose -f docker-compose-development.yml up -d`. You will have to "attach to the process", in order to set breakpoints. For example you can use the predefined command "Debug: Attach to FastAPI Docker" in `.vscode/launch.json` to attach with VSCode. + +## Full local set-up + +### Prerequisites +Version requirements: +* Python: **Python>=3.10** +* Poetry: **>=1.4.2** +* Nodejs: **>=18.16.0** + +1. Make sure to create a postgresql database with the name *fastapi_db** (e.g. by running the script `/scripts/create_dbs.sql`). +Set up the .env files from the examples and change the database url in the .env file to: + + - for /frontend/.env file: Use /frontend/.env.example as an example and change the DB_PORT and possibly any other variables to your own: + - `DB_PORT`: Change to 5732. + - If needed, also change the following variables to your own: + ```sh + DB_USER=postgres + DB_PASSWORD=postgres + DB_HOST=database + DB_PORT=5432 + DB_NAME=fastapi_db + ``` + + - for .env file: (use .env.example as an example) but change the DATABASE_HOST and DATABASE_PORT to your own + ```sh + DATABASE_HOST= + DATABASE_USER=postgres + DATABASE_PASSWORD=postgres + DATABASE_NAME=fastapi_db + DATABASE_PORT= + ``` + - Also, change the OPENAI_API_KEY and OPENAI_ORGANIZATION to your own: + ```sh + OPENAI_API_KEY= + OPENAI_ORGANIZATION= + ``` + + Finally, apply the .env variables: + ```sh + export $(grep -v '^#' .env | sed 's/#.*$//' | xargs) + ``` + +2. In the frontend folder: + install dependencies and run the application: + ```sh + pnpm install + ``` + then run the application: + ```sh + pnpm prisma:generate + pnpm dev + ``` + +3. In the backend/app folder: + ```sh + poetry config --local virtualenvs.in-project true + poetry env use 3.10 + poetry install --with dev + ``` + +4. In the root folder (make sure .env variables are applied): + ```sh + uvicorn "app.main:app" "--app-dir" "backend/app" "--reload" "--workers" "1" "--host" "0.0.0.0" "--port" "9090" + ``` + +5. If you visit http://localhost:3000, you should be able to see the application! + + +## (Optional) Pre-commit + +We are using pre-commit to automatically run some hygiene checks. Install this by running `make install-pre-commit` + +There is also a dockerized service that can be run using `docker-compose run pre-commit` + +To link this from a local python installation, run: +```sh +pip install pre-commit +cp pre-commit/.pre-commit-config.yaml . +pre-commit install +``` + +## (Optional) Pytest + +Make sure to have the poetry dependencies installed with the `--with dev` flag. +Run the following commands to execute the tests: +```python3.10 +cd backend/app +poetry run python3.10 -m pytest -c tests/pytest.ini +``` diff --git a/docs/docusaurus/docs/tool_library/chain_tool.md b/docs/docusaurus/docs/tool_library/chain_tool.md new file mode 100644 index 00000000..262e9038 --- /dev/null +++ b/docs/docusaurus/docs/tool_library/chain_tool.md @@ -0,0 +1,21 @@ +# Chain Tool + +## How it works + +This tool provides a demonstration of injecting external chains into a single tool that's called by the meta agent. + +It uses an example of a nested meta agent chain and gives an example of how to execute, passing callbacks correctly, +using a second meta-agent using the constructor in `app.services.chat_agent.meta_agent.create_meta_agent`. + +```python +response = await chain.acall( + dict(**chain_inputs), + callbacks=run_manager.get_child() if run_manager else None +) +``` + +It notes how to force output from something other than a tool run to the frontend. + +```python +await run_manager.on_text(main_response, data_type=StreamingDataTypeEnum.llm) +``` diff --git a/docs/docusaurus/docs/tool_library/entertainer_expert_tools.md b/docs/docusaurus/docs/tool_library/entertainer_expert_tools.md new file mode 100644 index 00000000..76054db2 --- /dev/null +++ b/docs/docusaurus/docs/tool_library/entertainer_expert_tools.md @@ -0,0 +1,31 @@ +# Entertainer and Expert tools + +The entertainer and expert tools are simple tools: they only execute a single LLM call. However, we have a couple of different uses for these tools. + +## Entertainer tool + +The entertainer tool is typically used to ...entertain the user with some initial streamed output while long chains are running and executing complex queries that take time to generate output. The tool typically uses a cheap, fast LLM call, and is added as a subitem in the first action step, such that output is generated immediately after the user submits their prompt. + +To clarify to the user that this output is a preliminary output, and should not be considered in the final output, a UI distinction is built in that is triggered if the text starts with "Thought: " (see `LLMResponse.tsx`). Therefore, ensure that the prompt for the entertainer tool instructs the LLM to start its answer with "Thought: ". Note: this UI trigger can also be used when using a ReAct agent instead of a constrained agent, to distinguish the 'thoughts' of the agent with the final answer. + +## Expert tool + +The expert tool is typically used to provide expert output, such as drawing conclusions from data, generating complex documents, or answering user questions. + +Typically, best practice is to structure the prompt clearly and provide a clear goal: +``` +system_context: |- + You are an expert in [topic]. Your goal is to []. + + You must format your answer as follows: + - Answer in beautiful Markdown + - ... + + You MUST adhere to the following guidelines: + - Answer using only the provided information + - ... +``` + +## Clarify tool + +The clarify tool can be used to attempt to catch unclear or unhelpful / offensive prompts, and return an ask to the user to clarify / change their prompt. Ensure the action plan description has a clear description of when to use this tool, e.g. "Ask the user to clarify the input question". diff --git a/docs/docusaurus/docs/tool_library/image_generation_tool.md b/docs/docusaurus/docs/tool_library/image_generation_tool.md new file mode 100644 index 00000000..f93a0847 --- /dev/null +++ b/docs/docusaurus/docs/tool_library/image_generation_tool.md @@ -0,0 +1,45 @@ +# Image Generation tool + +## How it works +The image generation tool generates an image based on the user prompt and shows it in an appendix in the chat. The image generation service can be defined in `generate_image`, currently the OpenAI Dall-E API is used but this can be replaced by any other service. + +To manipulate the exact prompt for the image generation, you can manipulate the query object, for example if you only want the last message to be used (see [memory documentation](docs/advanced/memory.md) for more details): +``` +tool_input = ToolInputSchema.parse_raw(query) +image_prompt = tool_input.latest_human_message +``` +Alternatively, another option is to manipulate the user prompt to be more descriptive using a LLM call. + +Elephant + + +## Layout + +You can change the layout of the generated image in `ResultsView.tsx`: +``` +case SUPPORTED_SYNTAX_LANGUAGES.IMAGEURL: + return img +``` + +## Security + +For security reasons, nextjs requires allowed remote domains to be specified. To add a new remote service to generate images, add the domain in `next.config.mjs`: +``` +images: { + domains: ['github.com', '127.0.0.1', 'localhost', 'oaidalleapiprodscus.blob.core.windows.net', 'YOUR_DOMAIN'], + remotePatterns: [ + { + protocol: 'https', + hostname: 'oaidalleapiprodscus.blob.core.windows.net', + port: '', + pathname: '/**', + }, + { + protocol: 'https', + hostname: 'YOURDOMAIN', + port: '', + pathname: '/**', + }, + ], + }, +``` diff --git a/docs/docusaurus/docs/tool_library/pdf_tool.md b/docs/docusaurus/docs/tool_library/pdf_tool.md new file mode 100644 index 00000000..aaa124be --- /dev/null +++ b/docs/docusaurus/docs/tool_library/pdf_tool.md @@ -0,0 +1,17 @@ +# PDF tool +## How it works + +The standard PDF tool uses PGVector for indexing (https://github.com/pgvector/pgvector) and saves the embeddings in PostgresQL. However, any preferred index can be used easily if it is supported by Langchain. We use 'PyMuPDF' as the standard PDF parser, but any of the options in `LOADER_DICT` can be used. + +Note: This tool can easily be extended other documents as well, e.g. PPT, Word, by adding specific parsers for those document types. + +The general process is + +1) Create an index and fill with embedded documents (on app startup, or can be persisted), see `vector_db_pdf_ingestion.py`. Some choices can be made: + - The index as mentioned (PGVector in this template) + - Embedding model (OpenAI in this template) + - How the documents are split into chunks (TokenTextSplitter with chunk size 2000 and overlap 200 tokens in this template) + +2) When the PDF tool is run, the k most relevant document chunks are returned (4 in this template) + +3) These document chunks are entered in a LLM prompt along with the user question and the result is returned to the user diff --git a/docs/docusaurus/docs/tool_library/sql_tool.md b/docs/docusaurus/docs/tool_library/sql_tool.md new file mode 100644 index 00000000..5700f7c3 --- /dev/null +++ b/docs/docusaurus/docs/tool_library/sql_tool.md @@ -0,0 +1,34 @@ +# SQL tool +## How it works +The SQL tool currently consists of the following steps: +1) `_alist_sql_tables`: Find the tables relevant to the user's query and filter the database for only those tables +2) `_aquery_with_schemas`: Writes an SQL query with a prompt summarizing the schema of the selected tables and the user question +3) `_avalidate_response`: Validate the response from the executing the SQL query + a) `_parse_query`: Parse the SQL query from the response and remove extra characters + b) `run_no_str`: Execute SQL query against configured database, checks if results are returned + c) LLM validates that the SQL query answers the question the user asked +4) `_aimprove_query`: If the SQL query does not answer the question sufficiently, prompt the LLM to improve it +5) Return the SQL query and the results + +To add your own database, you can add your sql script in `scripts`, and modify the sql scripts in the docker-compose for `database` service to bootstrap with your data upon starting the docker. + +The SQL tool only returns a limited number of rows of the output of the generated SQL query to the next tool (defined by `nb_example_rows`), to limit the number of tokens used. Take note of this in case there are prompts in downstream tools that interpret the data. To have good results make sure enough of the data is added to the prompt, or change the `sql_tool` to return a more concise result. + +While the tool output only contains `nb_example_rows` rows, the SQL tool table appendix in the UI displays the full outputs of the SQL query by executing it dynamically. + +## Prompt engineering tips + +- Always include examples for important steps that are tailored to your database +- Where you observe frequent errors (in any of the steps), add specific examples of how it should be done correctly, e.g. "In WHERE clauses use substring comparison to account for unknown string formulations (e.g. inhibitor -> LIKE '%inhibitor%')" + +`system_context`: +- Mention the role of the LLM: "You are an expert in ... database, your goal is to ..." +- Specify the required output format, e.g. markdown code block +- Specify the SQL dialect (e.g. PostgreSQL, Snowflake) +- For safety, instruct it to not use any DML statements +- Instruct it to only use field and table names from the provided database schemas (to reduce hallucinations) + + +`prompt_inputs`: +- Always use 'few-shot learning': give an example of a typical user query and a correct SQL query +- In `table_definitions`, give a description of each table and describe what information is exactly in this table. This will give better results in the table selection step diff --git a/docs/docusaurus/docs/tool_library/summarizer_tool.md b/docs/docusaurus/docs/tool_library/summarizer_tool.md new file mode 100644 index 00000000..6ac0c75a --- /dev/null +++ b/docs/docusaurus/docs/tool_library/summarizer_tool.md @@ -0,0 +1,6 @@ +# Summarizer tool + +## How it works +The summarizer tool can be used to summarize large inputs of text, for example retrieved PDF chunks from the pdf_tool. Different summarization approaches can be used, see the [LangChain documentation](https://python.langchain.com/docs/use_cases/summarization) for various examples of summarization chains. + +Different approaches can be used based on the `max_token_length` of the input, which can be configured in `agent.yml`. diff --git a/docs/docusaurus/docs/tool_library/template_tool.md b/docs/docusaurus/docs/tool_library/template_tool.md new file mode 100644 index 00000000..0506d749 --- /dev/null +++ b/docs/docusaurus/docs/tool_library/template_tool.md @@ -0,0 +1,95 @@ +# Template tool +Below is an example of a template tool to configure for your use case. + +``` +from typing import Optional, List, Tuple +from app.db.session import sql_tool_db +from langchain.schema import HumanMessage, SystemMessage +from langchain.callbacks.manager import AsyncCallbackManagerForToolRun, CallbackManagerForToolRun +from langchain.schema import HumanMessage, SystemMessage + +from app.db.session import sql_tool_db +from app.schemas.agent_schema import AgentAndToolsConfig +from app.schemas.streaming_schema import StreamingDataTypeEnum +from app.schemas.tool_schema import ToolConfig +from app.services.chat_agent.helpers.llm import get_llm +from app.services.chat_agent.tools.ExtendedBaseTool import ExtendedBaseTool + + +class ReadMeTool(ExtendedBaseTool): + # define the name of your tool, matching the name in the config + name = "readme_tool" + appendix_title = "readme Appendix" + + @classmethod + def from_config(cls, config: ToolConfig, common_config: AgentAndToolsConfig, **kwargs): + llm = kwargs.get("llm", get_llm(common_config.llm)) + fast_llm = kwargs.get("fast_llm", get_llm(common_config.fast_llm)) + fast_llm_token_limit = kwargs.get("fast_llm_token_limit", common_config.fast_llm_token_limit) + + # add all custom prompts from your config, below are the standard ones + return cls( + llm=llm, + fast_llm=fast_llm, + fast_llm_token_limit=fast_llm_token_limit, + description=config.description.format(**{e.name: e.content for e in config.prompt_inputs}), + prompt_message=config.prompt_message.format(**{e.name: e.content for e in config.prompt_inputs}), + system_context=config.system_context.format(**{e.name: e.content for e in config.prompt_inputs}), + ) + + def _run(self, query: str, run_manager: Optional[CallbackManagerForToolRun] = None) -> str: + """Use the tool.""" + + raise NotImplementedError("ReadMeTool does not support sync") + + async def _arun(self, query: str, run_manager: Optional[AsyncCallbackManagerForToolRun] = None) -> str: + """Use the tool asynchronously.""" + try: + # if you want to stream the action signal to the frontend (appears in 'Steps') + if run_manager is not None: + await run_manager.on_text( + "readme_action", + data_type=StreamingDataTypeEnum.ACTION, + tool=self.name, + step=1, + ) + + # implement your custom tool here + def func_that_does_something(query): + return query + + response = func_that_does_something(query) + + # if the tool is only a LLM call, you can use the following code + messages = [ + SystemMessage(content=self.system_context), + HumanMessage(content=self.prompt_message.format(question=query)), + ] + response = await self._agenerate_response(messages, discard_fast_llm=True, run_manager=run_manager) + + # if you want to stream the response to an Appendix + if run_manager is not None: + # appendix 1 + await run_manager.on_text( + response, + data_type=StreamingDataTypeEnum.APPENDIX, + tool=self.name, + step=1, + title=self.appendix_title, + ) + # appendix 2 (appears below appendix 1) + await run_manager.on_text( + response, + data_type=StreamingDataTypeEnum.APPENDIX, + tool=self.name, + step=2, + title=self.appendix_title, + ) + return response + except Exception as e: + if run_manager is not None: + await run_manager.on_tool_error(e, tool=self.name) + return repr(e) + else: + raise e +``` diff --git a/docs/docusaurus/docs/tool_library/tool_library.md b/docs/docusaurus/docs/tool_library/tool_library.md new file mode 100644 index 00000000..de6f4458 --- /dev/null +++ b/docs/docusaurus/docs/tool_library/tool_library.md @@ -0,0 +1,5 @@ +# Tool library + +A library of commonly used tool archetypes is provided in `backend/app/app/services/chat_agent/tools/library`. These tools can be used out of the box by simply adding the tool to `agent.yml` and `tools.yml` and updating the prompts. You may want to update the tool code to customize for your use case. + +For example implementations of the library tools, have a look at the Chinook demo or the public demo on the `demo/public` branch. diff --git a/docs/docusaurus/docs/tool_library/visualizer_tool.md b/docs/docusaurus/docs/tool_library/visualizer_tool.md new file mode 100644 index 00000000..8e06359e --- /dev/null +++ b/docs/docusaurus/docs/tool_library/visualizer_tool.md @@ -0,0 +1,9 @@ +# Visualizer tool + +## How it works + +The visualizer tool can generate visualizations dynamically using [Recharts](https://recharts.org/en-US/). As input, the tool takes a number of rows of data (from the output of the `sql_tool`) and the user prompt to generate Recharts code that can then be rendered in an appendix. The appendix builds the visualization in Recharts using the full data from the executed SQL query as input. + +As a best practice, it helps to include clear examples of visualizations in the prompt custom to your use case. These can be added in `prompt_inputs` for `visualizer_tool` in `tools.yml`. + +Viz diff --git a/docs/docusaurus/docs/tutorial/img/tutorial1.png b/docs/docusaurus/docs/tutorial/img/tutorial1.png new file mode 100644 index 00000000..bf45ad10 Binary files /dev/null and b/docs/docusaurus/docs/tutorial/img/tutorial1.png differ diff --git a/docs/docusaurus/docs/tutorial/img/tutorial2.png b/docs/docusaurus/docs/tutorial/img/tutorial2.png new file mode 100644 index 00000000..0d089cfc Binary files /dev/null and b/docs/docusaurus/docs/tutorial/img/tutorial2.png differ diff --git a/docs/docusaurus/docs/tutorial/tutorial.md b/docs/docusaurus/docs/tutorial/tutorial.md new file mode 100644 index 00000000..8dd3fb0a --- /dev/null +++ b/docs/docusaurus/docs/tutorial/tutorial.md @@ -0,0 +1,288 @@ +# Tutorial: AgentX Codebase Helper + + + +Let's run through a full example of how you can rapidly build a high quality Agent application using AgentX. + +We're going to build an Agent which can guide us through a GitHub repository, with access to two sorts of information: + +1. **Codebase documentation**: All documentation in the codebase, including setup instructions, overall architecture, and feature-specific docs. +2. **GitHub reposistory commit history**: Commit log from the GitHub repository. We want this data to be in tabular form. + +Developers can use this Agent to familiarize themselves with the contents of the repository, ask questions, and track contributions (e.g. "What were the latest commits from Joe to the frontend?"). The agent will use semantic similarity to retrieve information from +the documentation and generate a SQL query to retrieve information from the GitHub repository information. + + +In this example, we'll use data from the AgentX repository itself (meta!), but you can do this for any repository. + +All it takes is 3 steps: + +## Step 1: Ingest data +The first thing we'll do is download all AgentX docs as PDF. We can also do this in native Markdown format, but it's quicker to use PDFs because AgentX has off-the-shelf PDF ingestion and retrieval. +Next, we need a directory to store the PDFs in, for which we can use `backend/app/app/tool_constants/pdf_data` (and we can delete the music-related default PDFs already there). We can also specify any other location +for the PDFs, as long as we correctly point the `PDF_TOOL_DATA_PATH` parameter in `.env` to it. + +We now want to a CSV file of GitHub commit history into the PostgreSQL DB to use with the SQL tool. The tables include columns such as commit hash, commit date, commit user, and file changed. First, add this data to `tool_constants/`. + +We'll go to `scripts/db_sql_tool/` and create a SQL script to load the data, calling it `load_commits.sql`. +```sql +-- Create table +CREATE TABLE COMMITS ( + commit_hash TEXT, + commit_timestamp TIMESTAMP, + commit_user TEXT, + commit_message TEXT, + file_changed TEXT +); + +-- Copy CSV +COPY COMMITS (commit_hash, commit_timestamp, commit_user, commit_message, file_changed) +FROM '/docker-entrypoint-initdb.d/commit_history.csv' +WITH CSV HEADER; +``` + +Notice that the CSV path is referenced as `/docker-entrypoint-initdb.d/commit_history.csv`. This is because we need to map +local paths to paths within the Docker container running the `db_sql_tool` service. This includes the paths of the data and the SQL script to load it. + +So, one additional step is to go to +`docker-compose.yml` (or whichever `docker-compose` file you're using) and add these mappings to the `db_sql_tool` service. +This is what it looks like: +```yaml + db_sql_tool: + image: postgres:11 + restart: always + container_name: db_sql_tool + volumes: + - ./db_docker:/var/lib/postgresql + - ./scripts/db_sql_tool/load_commits.sql:/docker-entrypoint-initdb.d/load_commits.sql + - ./backend/app/app/tool_constants/public_demo_data/commit_history.csv:/docker-entrypoint-initdb.d/commit_history.csv + environment: + - POSTGRES_USER=postgres + - POSTGRES_PASSWORD=postgres + - POSTGRES_DB=sqltool + ports: + - "5632:5432" + healthcheck: + test: [ "CMD-SHELL", "pg_isready -U postgres" ] + interval: 10s + timeout: 15s + retries: 5 +``` + + +## Step 2: Configure tools + +Recall that we want two functionalities: RAG over codebase documentation, and SQL query generation to search commit history. AgentX provides off-the-shelf tools for both of these things. + +For RAG, we want to use a combination of `pdf_tool` and `expert_tool`, where `pdf_tool` retrieves documents and `expert_tool` makes an LLM call to generate an answer. The goal, then, is to run them sequentially: `pdf_tool` first and then `expert_tool` after with access to the retrieved docs. +No change needs to be made to `pdf_tool`, we need to add a few lines of code to the `_arun` method of `expert_tool` and write some prompts. +```python +from app.schemas.tool_schema import ToolConfig + +class ExpertTool(ExtendedBaseTool): + + # Other code omitted ... + + async def _arun(self, query: str, run_manager: Optional[AsyncCallbackManagerForToolRun] = None) -> str: + """Use the tool asynchronously.""" + try: + tool_input = ToolInputSchema.parse_raw(query) + user_question = tool_input.latest_human_message + + docs = tool_input.intermediate_steps["PDF Tool"] + + messages = [ + SystemMessage(content=self.system_context), + HumanMessage(content=self.prompt_message.format(question=user_question, retrieved_docs=docs)) + ] + response = await self._agenerate_response(messages, discard_fast_llm=True, run_manager=run_manager) + + logger.info(f"Expert Tool response - {response}") + + return response + + except Exception as e: + if run_manager is not None: + await run_manager.on_tool_error(e, tool=self.name) + return repr(e) + else: + raise e +``` +The code above parses the input provided to the `expert_tool` and fetches the docs retrieved by `pdf_tool`. It then formats these +docs into the prompt for the `expert_tool`, which needs to be set in `tools.yml`: + +```yaml +expert_tool: + default_llm: "gpt-4" + default_fast_llm: "gpt-3.5-turbo-1106" + description: >- + Tool to answer the user question based on the documents retrieved by the pdf_tool. It analyzes the documents to provide reliable, helpful answers to specific technical queries related to the codebase, such as setup procedures or tool additions. + {examples} + prompt_message: |- + Answer the user's question based on the documents retrieved. + User question: + <<< + {{question}} + >>> + Retrieved documents: + <<< + {{retrieved_docs}} + >>> + Concise Answer: + system_context: |- + You are an expert in software engineering and communicating technical ideas. Your goal is to answer the user question solely based on the given documents. + prompt_inputs: + - name: examples + content: |- + Example Input: "What are the steps to set up the development environment?" + Example Output: "You can set up your development environment locally or on Docker. To set up on Docker follow these steps: ..." + max_token_length: 8000 +``` + +To recap, here's what's happening: `pdf_tool` retrieves docs from codebase documentation, the `expert_tool` is tasked +with synthesizing an answer using these docs and an LLM call, and we write prompts for the `expert_tool` to which we add these docs. + +Luckily, we don't need to change any code in `sql_tool` for data retrieval from the commit history. We do, however, need to add prompts to tell the tool the structure of our data: + +```yaml +sql_tool: + description: >- + SQL tool to query structured table containing commit history of the Github repository of AgentX, an LLM powered agent. + Input is a question about the data in natural language, output is a string that contains an SQL query in markdown format, the number of rows the query returns and the first 3 rows. + {examples} + prompt_message: |- + Given the database schema: + --- + {{table_schemas}} + --- + And the following notes about the tables: + --- + {table_notes} + --- + Please answer the following user questions with an SQL query: + {{question}} + --- + Current conversation history: + {{chat_history}} + system_context: |- + You are an expert on the GitHub repository of AgentX, an LLM-powered agent. Your main task is to use + SQL queries to retrieve information from structured tables containing commit history of the repository. + During answering, the following principles MUST be followed: + 1. Set the language to the markdown code block for each code block. For example, \```sql SELECT * FROM public.Artist``` is SQL. + 2. Use the postgreSQL dialect, i.e. only functions that are supported + 3. DO NOT make any DML statements (INSERT, UPDATE, DELETE, DROP etc.) to the database. + 4. In WHERE clauses use substring comparison to account for unknown string formulations (e.g. commit -> LIKE '%commit%') + 6. Make sure the final SQL query starts with '```sql' and ends with '```' + 7. Only use field and table names from the provided database schemas + 8. Ensure to include the schema name before the table, for example, \```sql SELECT * FROM public.COMMITS``` is correct but \```sql SELECT * FROM COMMITS``` is INCORRECT + 9. When asked to give time aggregated data (e.g. monthly), provide the time unit as an integer. For example, months should be 1-12, where you can the EXTRACT statement + 10. Always keep in mind that each `commit_hash` can correspond to multiple rows public.COMMITS; when counting commits, only count DISTINCT values of `commit_hash` + 11. When asked to summarize a user's contributions to the codebase, look at their 20 most recent commits. + prompt_inputs: + - name: examples + content: |- + Example Input: \"List all users who have made commits to the AgentX repository" + Example Output: \"`sql SELECT DISTINCT commit_user FROM public.COMMITS;`, total rows from SQL query: 8, first 3 rows: Ilyass El Mansouri, Gustaf Halvardsson, Casper Lindberg\" + - name: table_definitions + content: |- + public.db_table | description + public.COMMITS | Table with all commits made to the AgentX repository; columns include commit user, commit message, commit timestamp, and file change. Each (commit, file changed) is a single row + - name: table_notes + content: |- + Table name: + public.COMMITS + Table description: + Table with all commits made to the AgentX repository. + Columns include commit user, commit message, commit timestamp, and file change. + + prompt_selection: |- + Given the following tables: + --- + {table_definitions} + --- + Please reply only with a comma separated list of the db and the table names. + Select the tables that can be most useful for answering to the question: + {{question}} + system_context_selection: |- + You are a software engineering expert on the AgentX codebase, an LLM-powered assistant. You have access to a + PostgreSQL database which has tables consisting of the commit history of the AgentX GitHub repository. + + Your task is to define which tables are useful to answer the question of the user. + Please follow the instructions to answer the questions: + 1. Only reply with a comma separated list of db and table names. For example, "public.COMMITS" + 2. Only answer with valid table names from the list + 3. Always format the table names to include the database schema, for example "public.COMMITS", NOT "COMMITS" + 3. Reply with the least amount of tables necessary for the question + prompt_validation: |- + Given the following SQL query: + {{query}} + and the following results executing the query with a LIMIT 5: + {{result}} + Does the query answer the following question: + {{question}} + You must reply in the following format: + Valid: [yes/no] + Reason: [your reason for the validation] + system_context_validation: |- + You are a software engineering expert on the AgentX codebase, an LLM-powered assistant. You have access to a + PostgreSQL database which has tables consisting of data from the AgentX GitHub repository, including commits, + issues, and pull requests. + You should validate that the constructed SQL query is answering the question of the user. + You must reply in the following format: + Valid: [yes/no] + Reason: [your reason for the validation] + prompt_refinement: |- + Given the database schema: + --- + {{table_schemas}} + --- + Given your previous answer and the complaint from the user, please improve the SQL query to answer the question of the user. + If the SQL query does not contain the database schema before a table, correct it. For example "SELECT * FROM COMMITS" should be corrected to "SELECT * FROM public.COMMITS". + User question: {{question}} + Previous answer: {{previous_answer}} + Complaints: {{complaints}} + nb_example_rows: 3 + validate_empty_results: False + validate_with_llm: False + always_limit_query: False + max_rows_in_output: 30 +``` +The configs give the tool information about the commits table, allowing it to write an informed query. + + + + +## Step 3: Write action plans + +The last step is to write action plans to use our tools. Recall that we want the Agent to be able to do two tasks: + +1. Retrieve relevant docs from codebase documentation and use them to answer the user's question +2. Generate and execute a SQL query to retrieve data from the commit history + +This suggests using two action plans in `agent.yml`: +```yaml +action_plans: + '0': + name: '' + description: Use this plan to answer technical questions about AgentX - related to setup, code, codebase navigation, or other technical questions. + actions: + - - pdf_tool + - - expert_tool + + '1': + name: '' + description: |- + Use this plan to fetch Github-related information from the repository of AgentX, such as commits, issues, pull requests. + actions: + - - sql_tool +``` + +## Conclusion + +In three simple steps, we have set up a high quality Agent which can provide informed guidance on a codebase. See the results below! + +Fetching docs: +![Docs retrieval image](img/tutorial1.png) + +Querying commits: +![Commits querying image](img/tutorial2.png) diff --git a/docs/docusaurus/docusaurus.config.js b/docs/docusaurus/docusaurus.config.js new file mode 100644 index 00000000..6545d552 --- /dev/null +++ b/docs/docusaurus/docusaurus.config.js @@ -0,0 +1,143 @@ +// @ts-check +// `@type` JSDoc annotations allow editor autocompletion and type checking +// (when paired with `@ts-check`). +// There are various equivalent ways to declare your Docusaurus config. +// See: https://docusaurus.io/docs/api/docusaurus-config + +import {themes as prismThemes} from 'prism-react-renderer'; + +/** @type {import('@docusaurus/types').Config} */ +const config = { + title: 'AgentKit', + staticDirectories: ['static'], + tagline: 'Constrained Agent Starter Kit', + favicon: 'img/favicon.ico', + + // TODO: Set the production url of your site here + url: 'http://localhost', + // Set the // pathname under which your site is served + // For GitHub pages deployment, it is often '//' + baseUrl: '/docs/', + + // GitHub pages deployment config. + // If you aren't using GitHub pages, you don't need these. + // organizationName: 'facebook', // Usually your GitHub org/user name. + // projectName: 'docusaurus', // Usually your repo name. + + onBrokenLinks: 'throw', + onBrokenMarkdownLinks: 'warn', + + // Even if you don't use internationalization, you can use this field to set + // useful metadata like html lang. For example, if your site is Chinese, you + // may want to replace "en" with "zh-Hans". + i18n: { + defaultLocale: 'en', + locales: ['en'], + }, + + presets: [ + [ + 'classic', + /** @type {import('@docusaurus/preset-classic').Options} */ + ({ + docs: { + sidebarPath: './sidebars.js', + routeBasePath: '/', + // Please change this to your repo. + // Remove this to remove the "edit this page" links. + // editUrl: + // 'https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/', + }, + // blog: { + // showReadingTime: true, + // // Please change this to your repo. + // // Remove this to remove the "edit this page" links. + // editUrl: + // 'https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/', + // }, + theme: { + customCss: './src/css/custom.css', + }, + }), + ], + ], + + themeConfig: + /** @type {import('@docusaurus/preset-classic').ThemeConfig} */ + ({ + // Replace with your project's social card + image: '/img/AgentKit_logo_color.png', + navbar: { + title: 'AgentKit', + // logo: { + // alt: 'AgentKit logo', + // src: 'img/AgentKit_logo_color.png', + // }, + items: [ + { + type: 'docSidebar', + sidebarId: 'documentationSidebar', + position: 'left', + label: 'Documentation', + }, + // {to: '/blog', label: 'Blog', position: 'left'}, + { + href: 'https://github.com/bcgx-pi-genai/AgentKit', //TODO: change to public repo + label: 'GitHub', + position: 'right', + }, + ], + }, + footer: { + style: 'dark', + links: [ + { + title: 'Docs', + items: [ + { + label: 'Introduction', + to: '/introduction', + }, + { + label: 'Setup', + to: '/setup/', + }, + { + label: 'Configuration', + to: '/configuration/', + }, + { + label: 'How it works', + to: '/how_it_works/', + }, + { + label: 'Advanced', + to: '/advanced/', + }, + ], + }, + { + title: 'Useful links', + items: [ + { + label: 'Github', + href: 'https://github.com/bcgx-pi-genAI/agent-x', //TODO: change to public repo + }, + ], + }, + ], + logo: { + alt: 'BCG X Open Source', + src: '/img/bcgx_logo.png', + href: 'https://opensource.fb.com', + }, + copyright: `Copyright © ${new Date().getFullYear()} BCG X, Built with Docusaurus.`, + }, + prism: { + theme: prismThemes.github, + darkTheme: prismThemes.dracula, + }, + }), +}; + +export default config; diff --git a/docs/docusaurus/package-lock.json b/docs/docusaurus/package-lock.json new file mode 100644 index 00000000..1254952d --- /dev/null +++ b/docs/docusaurus/package-lock.json @@ -0,0 +1,14628 @@ +{ + "name": "my-website", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "my-website", + "version": "0.0.0", + "dependencies": { + "@docusaurus/core": "3.0.1", + "@docusaurus/preset-classic": "3.0.1", + "@mdx-js/react": "^3.0.0", + "clsx": "^2.0.0", + "prism-react-renderer": "^2.3.0", + "react": "^18.0.0", + "react-dom": "^18.0.0" + }, + "devDependencies": { + "@docusaurus/module-type-aliases": "3.0.1", + "@docusaurus/types": "3.0.1" + }, + "engines": { + "node": ">=18.0" + } + }, + "node_modules/@algolia/autocomplete-core": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.9.3.tgz", + "integrity": "sha512-009HdfugtGCdC4JdXUbVJClA0q0zh24yyePn+KUGk3rP7j8FEe/m5Yo/z65gn6nP/cM39PxpzqKrL7A6fP6PPw==", + "dependencies": { + "@algolia/autocomplete-plugin-algolia-insights": "1.9.3", + "@algolia/autocomplete-shared": "1.9.3" + } + }, + "node_modules/@algolia/autocomplete-plugin-algolia-insights": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.9.3.tgz", + "integrity": "sha512-a/yTUkcO/Vyy+JffmAnTWbr4/90cLzw+CC3bRbhnULr/EM0fGNvM13oQQ14f2moLMcVDyAx/leczLlAOovhSZg==", + "dependencies": { + "@algolia/autocomplete-shared": "1.9.3" + }, + "peerDependencies": { + "search-insights": ">= 1 < 3" + } + }, + "node_modules/@algolia/autocomplete-preset-algolia": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.9.3.tgz", + "integrity": "sha512-d4qlt6YmrLMYy95n5TB52wtNDr6EgAIPH81dvvvW8UmuWRgxEtY0NJiPwl/h95JtG2vmRM804M0DSwMCNZlzRA==", + "dependencies": { + "@algolia/autocomplete-shared": "1.9.3" + }, + "peerDependencies": { + "@algolia/client-search": ">= 4.9.1 < 6", + "algoliasearch": ">= 4.9.1 < 6" + } + }, + "node_modules/@algolia/autocomplete-shared": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.9.3.tgz", + "integrity": "sha512-Wnm9E4Ye6Rl6sTTqjoymD+l8DjSTHsHboVRYrKgEt8Q7UHm9nYbqhN/i0fhUYA3OAEH7WA8x3jfpnmJm3rKvaQ==", + "peerDependencies": { + "@algolia/client-search": ">= 4.9.1 < 6", + "algoliasearch": ">= 4.9.1 < 6" + } + }, + "node_modules/@algolia/cache-browser-local-storage": { + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.22.0.tgz", + "integrity": "sha512-uZ1uZMLDZb4qODLfTSNHxSi4fH9RdrQf7DXEzW01dS8XK7QFtFh29N5NGKa9S+Yudf1vUMIF+/RiL4i/J0pWlQ==", + "dependencies": { + "@algolia/cache-common": "4.22.0" + } + }, + "node_modules/@algolia/cache-common": { + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.22.0.tgz", + "integrity": "sha512-TPwUMlIGPN16eW67qamNQUmxNiGHg/WBqWcrOoCddhqNTqGDPVqmgfaM85LPbt24t3r1z0zEz/tdsmuq3Q6oaA==" + }, + "node_modules/@algolia/cache-in-memory": { + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.22.0.tgz", + "integrity": "sha512-kf4Cio9NpPjzp1+uXQgL4jsMDeck7MP89BYThSvXSjf2A6qV/0KeqQf90TL2ECS02ovLOBXkk98P7qVarM+zGA==", + "dependencies": { + "@algolia/cache-common": "4.22.0" + } + }, + "node_modules/@algolia/client-account": { + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.22.0.tgz", + "integrity": "sha512-Bjb5UXpWmJT+yGWiqAJL0prkENyEZTBzdC+N1vBuHjwIJcjLMjPB6j1hNBRbT12Lmwi55uzqeMIKS69w+0aPzA==", + "dependencies": { + "@algolia/client-common": "4.22.0", + "@algolia/client-search": "4.22.0", + "@algolia/transporter": "4.22.0" + } + }, + "node_modules/@algolia/client-analytics": { + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.22.0.tgz", + "integrity": "sha512-os2K+kHUcwwRa4ArFl5p/3YbF9lN3TLOPkbXXXxOvDpqFh62n9IRZuzfxpHxMPKAQS3Et1s0BkKavnNP02E9Hg==", + "dependencies": { + "@algolia/client-common": "4.22.0", + "@algolia/client-search": "4.22.0", + "@algolia/requester-common": "4.22.0", + "@algolia/transporter": "4.22.0" + } + }, + "node_modules/@algolia/client-common": { + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.22.0.tgz", + "integrity": "sha512-BlbkF4qXVWuwTmYxVWvqtatCR3lzXwxx628p1wj1Q7QP2+LsTmGt1DiUYRuy9jG7iMsnlExby6kRMOOlbhv2Ag==", + "dependencies": { + "@algolia/requester-common": "4.22.0", + "@algolia/transporter": "4.22.0" + } + }, + "node_modules/@algolia/client-personalization": { + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.22.0.tgz", + "integrity": "sha512-pEOftCxeBdG5pL97WngOBi9w5Vxr5KCV2j2D+xMVZH8MuU/JX7CglDSDDb0ffQWYqcUN+40Ry+xtXEYaGXTGow==", + "dependencies": { + "@algolia/client-common": "4.22.0", + "@algolia/requester-common": "4.22.0", + "@algolia/transporter": "4.22.0" + } + }, + "node_modules/@algolia/client-search": { + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.22.0.tgz", + "integrity": "sha512-bn4qQiIdRPBGCwsNuuqB8rdHhGKKWIij9OqidM1UkQxnSG8yzxHdb7CujM30pvp5EnV7jTqDZRbxacbjYVW20Q==", + "dependencies": { + "@algolia/client-common": "4.22.0", + "@algolia/requester-common": "4.22.0", + "@algolia/transporter": "4.22.0" + } + }, + "node_modules/@algolia/events": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@algolia/events/-/events-4.0.1.tgz", + "integrity": "sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ==" + }, + "node_modules/@algolia/logger-common": { + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.22.0.tgz", + "integrity": "sha512-HMUQTID0ucxNCXs5d1eBJ5q/HuKg8rFVE/vOiLaM4Abfeq1YnTtGV3+rFEhOPWhRQxNDd+YHa4q864IMc0zHpQ==" + }, + "node_modules/@algolia/logger-console": { + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.22.0.tgz", + "integrity": "sha512-7JKb6hgcY64H7CRm3u6DRAiiEVXMvCJV5gRE672QFOUgDxo4aiDpfU61g6Uzy8NKjlEzHMmgG4e2fklELmPXhQ==", + "dependencies": { + "@algolia/logger-common": "4.22.0" + } + }, + "node_modules/@algolia/requester-browser-xhr": { + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.22.0.tgz", + "integrity": "sha512-BHfv1h7P9/SyvcDJDaRuIwDu2yrDLlXlYmjvaLZTtPw6Ok/ZVhBR55JqW832XN/Fsl6k3LjdkYHHR7xnsa5Wvg==", + "dependencies": { + "@algolia/requester-common": "4.22.0" + } + }, + "node_modules/@algolia/requester-common": { + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.22.0.tgz", + "integrity": "sha512-Y9cEH/cKjIIZgzvI1aI0ARdtR/xRrOR13g5psCxkdhpgRN0Vcorx+zePhmAa4jdQNqexpxtkUdcKYugBzMZJgQ==" + }, + "node_modules/@algolia/requester-node-http": { + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.22.0.tgz", + "integrity": "sha512-8xHoGpxVhz3u2MYIieHIB6MsnX+vfd5PS4REgglejJ6lPigftRhTdBCToe6zbwq4p0anZXjjPDvNWMlgK2+xYA==", + "dependencies": { + "@algolia/requester-common": "4.22.0" + } + }, + "node_modules/@algolia/transporter": { + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.22.0.tgz", + "integrity": "sha512-ieO1k8x2o77GNvOoC+vAkFKppydQSVfbjM3YrSjLmgywiBejPTvU1R1nEvG59JIIUvtSLrZsLGPkd6vL14zopA==", + "dependencies": { + "@algolia/cache-common": "4.22.0", + "@algolia/logger-common": "4.22.0", + "@algolia/requester-common": "4.22.0" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", + "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", + "dependencies": { + "@babel/highlight": "^7.23.4", + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/code-frame/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/code-frame/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/code-frame/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz", + "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.7.tgz", + "integrity": "sha512-+UpDgowcmqe36d4NwqvKsyPMlOLNGMsfMmQ5WGCu+siCe3t3dfe9njrzGfdN4qq+bcNUt0+Vw6haRxBOycs4dw==", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helpers": "^7.23.7", + "@babel/parser": "^7.23.6", + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.7", + "@babel/types": "^7.23.6", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", + "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", + "dependencies": { + "@babel/types": "^7.23.6", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", + "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz", + "integrity": "sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==", + "dependencies": { + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", + "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", + "dependencies": { + "@babel/compat-data": "^7.23.5", + "@babel/helper-validator-option": "^7.23.5", + "browserslist": "^4.22.2", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.23.7.tgz", + "integrity": "sha512-xCoqR/8+BoNnXOY7RVSgv6X+o7pmT5q1d+gGcRlXYkI+9B31glE4jeejhKVpA04O1AtzOt7OSQ6VYKP5FcRl9g==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-member-expression-to-functions": "^7.23.0", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.20", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz", + "integrity": "sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "regexpu-core": "^5.3.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.4.tgz", + "integrity": "sha512-QcJMILQCu2jm5TFPGA3lCpJJTeEP+mqeXooG/NZbg/h5FTFi6V0+99ahlRsW8/kRLyb24LZVCCiclDedhLKcBA==", + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "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==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "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==", + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz", + "integrity": "sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==", + "dependencies": { + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "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==", + "dependencies": { + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", + "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", + "dependencies": { + "@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.6", + "@babel/helper-validator-identifier": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", + "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz", + "integrity": "sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-wrap-function": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz", + "integrity": "sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==", + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-member-expression-to-functions": "^7.22.15", + "@babel/helper-optimise-call-expression": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", + "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", + "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "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==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", + "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz", + "integrity": "sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==", + "dependencies": { + "@babel/helper-function-name": "^7.22.5", + "@babel/template": "^7.22.15", + "@babel/types": "^7.22.19" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.7.tgz", + "integrity": "sha512-6AMnjCoC8wjqBzDHkuqpa7jAKwvMo4dC+lr/TFBz+ucfulO1XMpDnwWPGBNwClOKZ8h6xn5N81W/R5OrcKtCbQ==", + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.7", + "@babel/types": "^7.23.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", + "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/parser": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.6.tgz", + "integrity": "sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==", + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.23.3.tgz", + "integrity": "sha512-iRkKcCqb7iGnq9+3G6rZ+Ciz5VywC4XNRHe57lKM+jOeYAoR0lVqdeeDRfh0tQcTfw/+vBhHn926FmQhLtlFLQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.23.3.tgz", + "integrity": "sha512-WwlxbfMNdVEpQjZmK5mhm7oSwD3dS6eU+Iwsi4Knl9wAletWem7kaRsGOG+8UEbRyqxY4SS5zvtfXwX+jMxUwQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-transform-optional-chaining": "^7.23.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.23.7.tgz", + "integrity": "sha512-LlRT7HgaifEpQA1ZgLVOIJZZFVPWN5iReq/7/JixwBtwcoeVGDBD53ZV28rrsLYOZs1Y/EHhA8N/Z6aazHR8cw==", + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.23.3.tgz", + "integrity": "sha512-lPgDSU+SJLK3xmFDTV2ZRQAiM7UuUjGidwBywFavObCiZc1BeAAcMtHJKUya92hPHO+at63JJPLygilZard8jw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.23.3.tgz", + "integrity": "sha512-pawnE0P9g10xgoP7yKr6CK63K2FMsTE+FZidZO/1PwRdzmAPVs+HS1mAURUsgaoxammTJvULUdIkEK0gOcU2tA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz", + "integrity": "sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.23.3.tgz", + "integrity": "sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.23.3.tgz", + "integrity": "sha512-NzQcQrzaQPkaEwoTm4Mhyl8jI1huEL/WWIEvudjTCMJ9aBZNpsJbMASx7EQECtQQPS/DcnFpo0FIh3LvEO9cxQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.7.tgz", + "integrity": "sha512-PdxEpL71bJp1byMG0va5gwQcXHxuEYC/BgI/e88mGTtohbZN28O5Yit0Plkkm/dBzCF/BxmbNcses1RH1T+urA==", + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.20", + "@babel/plugin-syntax-async-generators": "^7.8.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.23.3.tgz", + "integrity": "sha512-A7LFsKi4U4fomjqXJlZg/u0ft/n8/7n7lpffUP/ZULx/DtV9SGlNKZolHH6PE8Xl1ngCc0M11OaeZptXVkfKSw==", + "dependencies": { + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.23.3.tgz", + "integrity": "sha512-vI+0sIaPIO6CNuM9Kk5VmXcMVRiOpDh7w2zZt9GXzmE/9KD70CUEVhvPR/etAeNK/FAEkhxQtXOzVF3EuRL41A==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.4.tgz", + "integrity": "sha512-0QqbP6B6HOh7/8iNR4CQU2Th/bbRtBp4KS9vcaZd1fZ0wSh5Fyssg0UCIHwxh+ka+pNDREbVLQnHCMHKZfPwfw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.23.3.tgz", + "integrity": "sha512-uM+AN8yCIjDPccsKGlw271xjJtGii+xQIF/uMPS8H15L12jZTsLfF4o5vNO7d/oUguOyfdikHGc/yi9ge4SGIg==", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.23.4.tgz", + "integrity": "sha512-nsWu/1M+ggti1SOALj3hfx5FXzAY06fwPJsUZD4/A5e1bWi46VUIWtD+kOX6/IdhXGsXBWllLFDSnqSCdUNydQ==", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.23.5.tgz", + "integrity": "sha512-jvOTR4nicqYC9yzOHIhXG5emiFEOpappSJAl73SDSEDcybD+Puuze8Tnpb9p9qEyYup24tq891gkaygIFvWDqg==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.20", + "@babel/helper-split-export-declaration": "^7.22.6", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.23.3.tgz", + "integrity": "sha512-dTj83UVTLw/+nbiHqQSFdwO9CbTtwq1DsDqm3CUEtDrZNET5rT5E6bIdTlOftDTDLMYxvxHNEYO4B9SLl8SLZw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/template": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.3.tgz", + "integrity": "sha512-n225npDqjDIr967cMScVKHXJs7rout1q+tt50inyBCPkyZ8KxeI6d+GIbSBTT/w/9WdlWDOej3V9HE5Lgk57gw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.23.3.tgz", + "integrity": "sha512-vgnFYDHAKzFaTVp+mneDsIEbnJ2Np/9ng9iviHw3P/KVcgONxpNULEW/51Z/BaFojG2GI2GwwXck5uV1+1NOYQ==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.23.3.tgz", + "integrity": "sha512-RrqQ+BQmU3Oyav3J+7/myfvRCq7Tbz+kKLLshUmMwNlDHExbGL7ARhajvoBJEvc+fCguPPu887N+3RRXBVKZUA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.23.4.tgz", + "integrity": "sha512-V6jIbLhdJK86MaLh4Jpghi8ho5fGzt3imHOBu/x0jlBaPYqDoWz4RDXjmMOfnh+JWNaQleEAByZLV0QzBT4YQQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.23.3.tgz", + "integrity": "sha512-5fhCsl1odX96u7ILKHBj4/Y8vipoqwsJMh4csSA8qFfxrZDEA4Ssku2DyNvMJSmZNOEBT750LfFPbtrnTP90BQ==", + "dependencies": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.23.4.tgz", + "integrity": "sha512-GzuSBcKkx62dGzZI1WVgTWvkkz84FZO5TC5T8dl/Tht/rAla6Dg/Mz9Yhypg+ezVACf/rgDuQt3kbWEv7LdUDQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.23.6.tgz", + "integrity": "sha512-aYH4ytZ0qSuBbpfhuofbg/e96oQ7U2w1Aw/UQmKT+1l39uEhUPoFS3fHevDc1G0OvewyDudfMKY1OulczHzWIw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.23.3.tgz", + "integrity": "sha512-I1QXp1LxIvt8yLaib49dRW5Okt7Q4oaxao6tFVKS/anCdEOMtYwWVKoiOA1p34GOWIZjUK0E+zCp7+l1pfQyiw==", + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.23.4.tgz", + "integrity": "sha512-81nTOqM1dMwZ/aRXQ59zVubN9wHGqk6UtqRK+/q+ciXmRy8fSolhGVvG09HHRGo4l6fr/c4ZhXUQH0uFW7PZbg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-json-strings": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.23.3.tgz", + "integrity": "sha512-wZ0PIXRxnwZvl9AYpqNUxpZ5BiTGrYt7kueGQ+N5FiQ7RCOD4cm8iShd6S6ggfVIWaJf2EMk8eRzAh52RfP4rQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.23.4.tgz", + "integrity": "sha512-Mc/ALf1rmZTP4JKKEhUwiORU+vcfarFVLfcFiolKUo6sewoxSEgl36ak5t+4WamRsNr6nzjZXQjM35WsU+9vbg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.23.3.tgz", + "integrity": "sha512-sC3LdDBDi5x96LA+Ytekz2ZPk8i/Ck+DEuDbRAll5rknJ5XRTSaPKEYwomLcs1AA8wg9b3KjIQRsnApj+q51Ag==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.3.tgz", + "integrity": "sha512-vJYQGxeKM4t8hYCKVBlZX/gtIY2I7mRGFNcm85sgXGMTBcoV3QdVtdpbcWEbzbfUIUZKwvgFT82mRvaQIebZzw==", + "dependencies": { + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.3.tgz", + "integrity": "sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA==", + "dependencies": { + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.3.tgz", + "integrity": "sha512-ZxyKGTkF9xT9YJuKQRo19ewf3pXpopuYQd8cDXqNzc3mUNbOME0RKMoZxviQk74hwzfQsEe66dE92MaZbdHKNQ==", + "dependencies": { + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.23.3.tgz", + "integrity": "sha512-zHsy9iXX2nIsCBFPud3jKn1IRPWg3Ing1qOZgeKV39m1ZgIdpJqvlWVeiHBZC6ITRG0MfskhYe9cLgntfSFPIg==", + "dependencies": { + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz", + "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.23.3.tgz", + "integrity": "sha512-YJ3xKqtJMAT5/TIZnpAR3I+K+WaDowYbN3xyxI8zxx/Gsypwf9B9h0VB+1Nh6ACAAPRS5NSRje0uVv5i79HYGQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.23.4.tgz", + "integrity": "sha512-jHE9EVVqHKAQx+VePv5LLGHjmHSJR76vawFPTdlxR/LVJPfOEGxREQwQfjuZEOPTwG92X3LINSh3M40Rv4zpVA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.23.4.tgz", + "integrity": "sha512-mps6auzgwjRrwKEZA05cOwuDc9FAzoyFS4ZsG/8F43bTLf/TgkJg7QXOrPO1JO599iA3qgK9MXdMGOEC8O1h6Q==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.23.4.tgz", + "integrity": "sha512-9x9K1YyeQVw0iOXJlIzwm8ltobIIv7j2iLyP2jIhEbqPRQ7ScNgwQufU2I0Gq11VjyG4gI4yMXt2VFags+1N3g==", + "dependencies": { + "@babel/compat-data": "^7.23.3", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.23.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.23.3.tgz", + "integrity": "sha512-BwQ8q0x2JG+3lxCVFohg+KbQM7plfpBwThdW9A6TMtWwLsbDA01Ek2Zb/AgDN39BiZsExm4qrXxjk+P1/fzGrA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.23.4.tgz", + "integrity": "sha512-XIq8t0rJPHf6Wvmbn9nFxU6ao4c7WhghTR5WyV8SrJfUFzyxhCm4nhC+iAp3HFhbAKLfYpgzhJ6t4XCtVwqO5A==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.4.tgz", + "integrity": "sha512-ZU8y5zWOfjM5vZ+asjgAPwDaBjJzgufjES89Rs4Lpq63O300R/kOz30WCLo6BxxX6QVEilwSlpClnG5cZaikTA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.23.3.tgz", + "integrity": "sha512-09lMt6UsUb3/34BbECKVbVwrT9bO6lILWln237z7sLaWnMsTi7Yc9fhX5DLpkJzAGfaReXI22wP41SZmnAA3Vw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.23.3.tgz", + "integrity": "sha512-UzqRcRtWsDMTLrRWFvUBDwmw06tCQH9Rl1uAjfh6ijMSmGYQ+fpdB+cnqRC8EMh5tuuxSv0/TejGL+7vyj+50g==", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.23.4.tgz", + "integrity": "sha512-9G3K1YqTq3F4Vt88Djx1UZ79PDyj+yKRnUy7cZGSMe+a7jkwD259uKKuUzQlPkGam7R+8RJwh5z4xO27fA1o2A==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.23.3.tgz", + "integrity": "sha512-jR3Jn3y7cZp4oEWPFAlRsSWjxKe4PZILGBSd4nis1TsC5qeSpb+nrtihJuDhNI7QHiVbUaiXa0X2RZY3/TI6Nw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-constant-elements": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.23.3.tgz", + "integrity": "sha512-zP0QKq/p6O42OL94udMgSfKXyse4RyJ0JqbQ34zDAONWjyrEsghYEyTSK5FIpmXmCpB55SHokL1cRRKHv8L2Qw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-display-name": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.23.3.tgz", + "integrity": "sha512-GnvhtVfA2OAtzdX58FJxU19rhoGeQzyVndw3GgtdECQvQFXPEZIOVULHVZGAYmOgmqjXpVpfocAbSjh99V/Fqw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.23.4.tgz", + "integrity": "sha512-5xOpoPguCZCRbo/JeHlloSkTA8Bld1J/E1/kLfD1nsuiW1m8tduTA1ERCgIZokDflX/IBzKcqR3l7VlRgiIfHA==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-jsx": "^7.23.3", + "@babel/types": "^7.23.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-development": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.22.5.tgz", + "integrity": "sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A==", + "dependencies": { + "@babel/plugin-transform-react-jsx": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-pure-annotations": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.23.3.tgz", + "integrity": "sha512-qMFdSS+TUhB7Q/3HVPnEdYJDQIk57jkntAwSuz9xfSE4n+3I+vHYCli3HoHawN1Z3RfCz/y1zXA/JXjG6cVImQ==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.23.3.tgz", + "integrity": "sha512-KP+75h0KghBMcVpuKisx3XTu9Ncut8Q8TuvGO4IhY+9D5DFEckQefOuIsB/gQ2tG71lCke4NMrtIPS8pOj18BQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "regenerator-transform": "^0.15.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.23.3.tgz", + "integrity": "sha512-QnNTazY54YqgGxwIexMZva9gqbPa15t/x9VS+0fsEFWplwVpXYZivtgl43Z1vMpc1bdPP2PP8siFeVcnFvA3Cg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime": { + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.23.7.tgz", + "integrity": "sha512-fa0hnfmiXc9fq/weK34MUV0drz2pOL/vfKWvN7Qw127hiUPabFCUMgAbYWcchRzMJit4o5ARsK/s+5h0249pLw==", + "dependencies": { + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "babel-plugin-polyfill-corejs2": "^0.4.7", + "babel-plugin-polyfill-corejs3": "^0.8.7", + "babel-plugin-polyfill-regenerator": "^0.5.4", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.23.3.tgz", + "integrity": "sha512-ED2fgqZLmexWiN+YNFX26fx4gh5qHDhn1O2gvEhreLW2iI63Sqm4llRLCXALKrCnbN4Jy0VcMQZl/SAzqug/jg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.23.3.tgz", + "integrity": "sha512-VvfVYlrlBVu+77xVTOAoxQ6mZbnIq5FM0aGBSFEcIh03qHf+zNqA4DC/3XMUozTg7bZV3e3mZQ0i13VB6v5yUg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.23.3.tgz", + "integrity": "sha512-HZOyN9g+rtvnOU3Yh7kSxXrKbzgrm5X4GncPY1QOquu7epga5MxKHVpYu2hvQnry/H+JjckSYRb93iNfsioAGg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.23.3.tgz", + "integrity": "sha512-Flok06AYNp7GV2oJPZZcP9vZdszev6vPBkHLwxwSpaIqx75wn6mUd3UFWsSsA0l8nXAKkyCmL/sR02m8RYGeHg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.23.3.tgz", + "integrity": "sha512-4t15ViVnaFdrPC74be1gXBSMzXk3B4Us9lP7uLRQHTFpV5Dvt33pn+2MyyNxmN3VTTm3oTrZVMUmuw3oBnQ2oQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.23.6.tgz", + "integrity": "sha512-6cBG5mBvUu4VUD04OHKnYzbuHNP8huDsD3EDqqpIpsswTDoqHCjLoHb6+QgsV1WsT2nipRqCPgxD3LXnEO7XfA==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.23.6", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-typescript": "^7.23.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.23.3.tgz", + "integrity": "sha512-OMCUx/bU6ChE3r4+ZdylEqAjaQgHAgipgW8nsCfu5pGqDcFytVd91AwRvUJSBZDz0exPGgnjoqhgRYLRjFZc9Q==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.23.3.tgz", + "integrity": "sha512-KcLIm+pDZkWZQAFJ9pdfmh89EwVfmNovFBcXko8szpBeF8z68kWIPeKlmSOkT9BXJxs2C0uk+5LxoxIv62MROA==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.23.3.tgz", + "integrity": "sha512-wMHpNA4x2cIA32b/ci3AfwNgheiva2W0WUKWTK7vBHBhDKfPsc5cFGNWm69WBqpwd86u1qwZ9PWevKqm1A3yAw==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.23.3.tgz", + "integrity": "sha512-W7lliA/v9bNR83Qc3q1ip9CQMZ09CcHDbHfbLRDNuAhn1Mvkr1ZNF7hPmztMQvtTGVLJ9m8IZqWsTkXOml8dbw==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.23.7.tgz", + "integrity": "sha512-SY27X/GtTz/L4UryMNJ6p4fH4nsgWbz84y9FE0bQeWJP6O5BhgVCt53CotQKHCOeXJel8VyhlhujhlltKms/CA==", + "dependencies": { + "@babel/compat-data": "^7.23.5", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-option": "^7.23.5", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.23.3", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.23.3", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.23.7", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-import-assertions": "^7.23.3", + "@babel/plugin-syntax-import-attributes": "^7.23.3", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.23.3", + "@babel/plugin-transform-async-generator-functions": "^7.23.7", + "@babel/plugin-transform-async-to-generator": "^7.23.3", + "@babel/plugin-transform-block-scoped-functions": "^7.23.3", + "@babel/plugin-transform-block-scoping": "^7.23.4", + "@babel/plugin-transform-class-properties": "^7.23.3", + "@babel/plugin-transform-class-static-block": "^7.23.4", + "@babel/plugin-transform-classes": "^7.23.5", + "@babel/plugin-transform-computed-properties": "^7.23.3", + "@babel/plugin-transform-destructuring": "^7.23.3", + "@babel/plugin-transform-dotall-regex": "^7.23.3", + "@babel/plugin-transform-duplicate-keys": "^7.23.3", + "@babel/plugin-transform-dynamic-import": "^7.23.4", + "@babel/plugin-transform-exponentiation-operator": "^7.23.3", + "@babel/plugin-transform-export-namespace-from": "^7.23.4", + "@babel/plugin-transform-for-of": "^7.23.6", + "@babel/plugin-transform-function-name": "^7.23.3", + "@babel/plugin-transform-json-strings": "^7.23.4", + "@babel/plugin-transform-literals": "^7.23.3", + "@babel/plugin-transform-logical-assignment-operators": "^7.23.4", + "@babel/plugin-transform-member-expression-literals": "^7.23.3", + "@babel/plugin-transform-modules-amd": "^7.23.3", + "@babel/plugin-transform-modules-commonjs": "^7.23.3", + "@babel/plugin-transform-modules-systemjs": "^7.23.3", + "@babel/plugin-transform-modules-umd": "^7.23.3", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", + "@babel/plugin-transform-new-target": "^7.23.3", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.23.4", + "@babel/plugin-transform-numeric-separator": "^7.23.4", + "@babel/plugin-transform-object-rest-spread": "^7.23.4", + "@babel/plugin-transform-object-super": "^7.23.3", + "@babel/plugin-transform-optional-catch-binding": "^7.23.4", + "@babel/plugin-transform-optional-chaining": "^7.23.4", + "@babel/plugin-transform-parameters": "^7.23.3", + "@babel/plugin-transform-private-methods": "^7.23.3", + "@babel/plugin-transform-private-property-in-object": "^7.23.4", + "@babel/plugin-transform-property-literals": "^7.23.3", + "@babel/plugin-transform-regenerator": "^7.23.3", + "@babel/plugin-transform-reserved-words": "^7.23.3", + "@babel/plugin-transform-shorthand-properties": "^7.23.3", + "@babel/plugin-transform-spread": "^7.23.3", + "@babel/plugin-transform-sticky-regex": "^7.23.3", + "@babel/plugin-transform-template-literals": "^7.23.3", + "@babel/plugin-transform-typeof-symbol": "^7.23.3", + "@babel/plugin-transform-unicode-escapes": "^7.23.3", + "@babel/plugin-transform-unicode-property-regex": "^7.23.3", + "@babel/plugin-transform-unicode-regex": "^7.23.3", + "@babel/plugin-transform-unicode-sets-regex": "^7.23.3", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.7", + "babel-plugin-polyfill-corejs3": "^0.8.7", + "babel-plugin-polyfill-regenerator": "^0.5.4", + "core-js-compat": "^3.31.0", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/preset-react": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.23.3.tgz", + "integrity": "sha512-tbkHOS9axH6Ysf2OUEqoSZ6T3Fa2SrNH6WTWSPBboxKzdxNc9qOICeLXkNG0ZEwbQ1HY8liwOce4aN/Ceyuq6w==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-option": "^7.22.15", + "@babel/plugin-transform-react-display-name": "^7.23.3", + "@babel/plugin-transform-react-jsx": "^7.22.15", + "@babel/plugin-transform-react-jsx-development": "^7.22.5", + "@babel/plugin-transform-react-pure-annotations": "^7.23.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-typescript": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.23.3.tgz", + "integrity": "sha512-17oIGVlqz6CchO9RFYn5U6ZpWRZIngayYCtrPRSgANSwC2V1Jb+iP74nVxzzXJte8b8BYxrL1yY96xfhTBrNNQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-option": "^7.22.15", + "@babel/plugin-syntax-jsx": "^7.23.3", + "@babel/plugin-transform-modules-commonjs": "^7.23.3", + "@babel/plugin-transform-typescript": "^7.23.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==" + }, + "node_modules/@babel/runtime": { + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.7.tgz", + "integrity": "sha512-w06OXVOFso7LcbzMiDGt+3X7Rh7Ho8MmgPoWU3rarH+8upf+wSU/grlGbWzQyr3DkdN6ZeuMFjpdwW0Q+HxobA==", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/runtime-corejs3": { + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.23.7.tgz", + "integrity": "sha512-ER55qzLREVA5YxeyQ3Qu48tgsF2ZrFjFjUS6V6wF0cikSw+goBJgB9PBRM1T6+Ah4iiM+sxmfS/Sy/jdzFfhiQ==", + "dependencies": { + "core-js-pure": "^3.30.2", + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "dependencies": { + "@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.23.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.7.tgz", + "integrity": "sha512-tY3mM8rH9jM0YHFGyfC0/xf+SB5eKUu7HPj7/k3fpi9dAlsMc5YbQvDi0Sh2QTPXqMhyaAtzAr807TIyfQrmyg==", + "dependencies": { + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", + "@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.23.6", + "@babel/types": "^7.23.6", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.6.tgz", + "integrity": "sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==", + "dependencies": { + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "optional": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/@discoveryjs/json-ext": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@docsearch/css": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.5.2.tgz", + "integrity": "sha512-SPiDHaWKQZpwR2siD0KQUwlStvIAnEyK6tAE2h2Wuoq8ue9skzhlyVQ1ddzOxX6khULnAALDiR/isSF3bnuciA==" + }, + "node_modules/@docsearch/react": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.5.2.tgz", + "integrity": "sha512-9Ahcrs5z2jq/DcAvYtvlqEBHImbm4YJI8M9y0x6Tqg598P40HTEkX7hsMcIuThI+hTFxRGZ9hll0Wygm2yEjng==", + "dependencies": { + "@algolia/autocomplete-core": "1.9.3", + "@algolia/autocomplete-preset-algolia": "1.9.3", + "@docsearch/css": "3.5.2", + "algoliasearch": "^4.19.1" + }, + "peerDependencies": { + "@types/react": ">= 16.8.0 < 19.0.0", + "react": ">= 16.8.0 < 19.0.0", + "react-dom": ">= 16.8.0 < 19.0.0", + "search-insights": ">= 1 < 3" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + }, + "search-insights": { + "optional": true + } + } + }, + "node_modules/@docusaurus/core": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-3.0.1.tgz", + "integrity": "sha512-CXrLpOnW+dJdSv8M5FAJ3JBwXtL6mhUWxFA8aS0ozK6jBG/wgxERk5uvH28fCeFxOGbAT9v1e9dOMo1X2IEVhQ==", + "dependencies": { + "@babel/core": "^7.23.3", + "@babel/generator": "^7.23.3", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-transform-runtime": "^7.22.9", + "@babel/preset-env": "^7.22.9", + "@babel/preset-react": "^7.22.5", + "@babel/preset-typescript": "^7.22.5", + "@babel/runtime": "^7.22.6", + "@babel/runtime-corejs3": "^7.22.6", + "@babel/traverse": "^7.22.8", + "@docusaurus/cssnano-preset": "3.0.1", + "@docusaurus/logger": "3.0.1", + "@docusaurus/mdx-loader": "3.0.1", + "@docusaurus/react-loadable": "5.5.2", + "@docusaurus/utils": "3.0.1", + "@docusaurus/utils-common": "3.0.1", + "@docusaurus/utils-validation": "3.0.1", + "@slorber/static-site-generator-webpack-plugin": "^4.0.7", + "@svgr/webpack": "^6.5.1", + "autoprefixer": "^10.4.14", + "babel-loader": "^9.1.3", + "babel-plugin-dynamic-import-node": "^2.3.3", + "boxen": "^6.2.1", + "chalk": "^4.1.2", + "chokidar": "^3.5.3", + "clean-css": "^5.3.2", + "cli-table3": "^0.6.3", + "combine-promises": "^1.1.0", + "commander": "^5.1.0", + "copy-webpack-plugin": "^11.0.0", + "core-js": "^3.31.1", + "css-loader": "^6.8.1", + "css-minimizer-webpack-plugin": "^4.2.2", + "cssnano": "^5.1.15", + "del": "^6.1.1", + "detect-port": "^1.5.1", + "escape-html": "^1.0.3", + "eta": "^2.2.0", + "file-loader": "^6.2.0", + "fs-extra": "^11.1.1", + "html-minifier-terser": "^7.2.0", + "html-tags": "^3.3.1", + "html-webpack-plugin": "^5.5.3", + "leven": "^3.1.0", + "lodash": "^4.17.21", + "mini-css-extract-plugin": "^2.7.6", + "postcss": "^8.4.26", + "postcss-loader": "^7.3.3", + "prompts": "^2.4.2", + "react-dev-utils": "^12.0.1", + "react-helmet-async": "^1.3.0", + "react-loadable": "npm:@docusaurus/react-loadable@5.5.2", + "react-loadable-ssr-addon-v5-slorber": "^1.0.1", + "react-router": "^5.3.4", + "react-router-config": "^5.1.1", + "react-router-dom": "^5.3.4", + "rtl-detect": "^1.0.4", + "semver": "^7.5.4", + "serve-handler": "^6.1.5", + "shelljs": "^0.8.5", + "terser-webpack-plugin": "^5.3.9", + "tslib": "^2.6.0", + "update-notifier": "^6.0.2", + "url-loader": "^4.1.1", + "webpack": "^5.88.1", + "webpack-bundle-analyzer": "^4.9.0", + "webpack-dev-server": "^4.15.1", + "webpack-merge": "^5.9.0", + "webpackbar": "^5.0.2" + }, + "bin": { + "docusaurus": "bin/docusaurus.mjs" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@docusaurus/cssnano-preset": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-3.0.1.tgz", + "integrity": "sha512-wjuXzkHMW+ig4BD6Ya1Yevx9UJadO4smNZCEljqBoQfIQrQskTswBs7lZ8InHP7mCt273a/y/rm36EZhqJhknQ==", + "dependencies": { + "cssnano-preset-advanced": "^5.3.10", + "postcss": "^8.4.26", + "postcss-sort-media-queries": "^4.4.1", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=18.0" + } + }, + "node_modules/@docusaurus/logger": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-3.0.1.tgz", + "integrity": "sha512-I5L6Nk8OJzkVA91O2uftmo71LBSxe1vmOn9AMR6JRCzYeEBrqneWMH02AqMvjJ2NpMiviO+t0CyPjyYV7nxCWQ==", + "dependencies": { + "chalk": "^4.1.2", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=18.0" + } + }, + "node_modules/@docusaurus/mdx-loader": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-3.0.1.tgz", + "integrity": "sha512-ldnTmvnvlrONUq45oKESrpy+lXtbnTcTsFkOTIDswe5xx5iWJjt6eSa0f99ZaWlnm24mlojcIGoUWNCS53qVlQ==", + "dependencies": { + "@babel/parser": "^7.22.7", + "@babel/traverse": "^7.22.8", + "@docusaurus/logger": "3.0.1", + "@docusaurus/utils": "3.0.1", + "@docusaurus/utils-validation": "3.0.1", + "@mdx-js/mdx": "^3.0.0", + "@slorber/remark-comment": "^1.0.0", + "escape-html": "^1.0.3", + "estree-util-value-to-estree": "^3.0.1", + "file-loader": "^6.2.0", + "fs-extra": "^11.1.1", + "image-size": "^1.0.2", + "mdast-util-mdx": "^3.0.0", + "mdast-util-to-string": "^4.0.0", + "rehype-raw": "^7.0.0", + "remark-directive": "^3.0.0", + "remark-emoji": "^4.0.0", + "remark-frontmatter": "^5.0.0", + "remark-gfm": "^4.0.0", + "stringify-object": "^3.3.0", + "tslib": "^2.6.0", + "unified": "^11.0.3", + "unist-util-visit": "^5.0.0", + "url-loader": "^4.1.1", + "vfile": "^6.0.1", + "webpack": "^5.88.1" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@docusaurus/module-type-aliases": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-3.0.1.tgz", + "integrity": "sha512-DEHpeqUDsLynl3AhQQiO7AbC7/z/lBra34jTcdYuvp9eGm01pfH1wTVq8YqWZq6Jyx0BgcVl/VJqtE9StRd9Ag==", + "dependencies": { + "@docusaurus/react-loadable": "5.5.2", + "@docusaurus/types": "3.0.1", + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router-config": "*", + "@types/react-router-dom": "*", + "react-helmet-async": "*", + "react-loadable": "npm:@docusaurus/react-loadable@5.5.2" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/@docusaurus/plugin-content-blog": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-3.0.1.tgz", + "integrity": "sha512-cLOvtvAyaMQFLI8vm4j26svg3ktxMPSXpuUJ7EERKoGbfpJSsgtowNHcRsaBVmfuCsRSk1HZ/yHBsUkTmHFEsg==", + "dependencies": { + "@docusaurus/core": "3.0.1", + "@docusaurus/logger": "3.0.1", + "@docusaurus/mdx-loader": "3.0.1", + "@docusaurus/types": "3.0.1", + "@docusaurus/utils": "3.0.1", + "@docusaurus/utils-common": "3.0.1", + "@docusaurus/utils-validation": "3.0.1", + "cheerio": "^1.0.0-rc.12", + "feed": "^4.2.2", + "fs-extra": "^11.1.1", + "lodash": "^4.17.21", + "reading-time": "^1.5.0", + "srcset": "^4.0.0", + "tslib": "^2.6.0", + "unist-util-visit": "^5.0.0", + "utility-types": "^3.10.0", + "webpack": "^5.88.1" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@docusaurus/plugin-content-docs": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.0.1.tgz", + "integrity": "sha512-dRfAOA5Ivo+sdzzJGXEu33yAtvGg8dlZkvt/NEJ7nwi1F2j4LEdsxtfX2GKeETB2fP6XoGNSQnFXqa2NYGrHFg==", + "dependencies": { + "@docusaurus/core": "3.0.1", + "@docusaurus/logger": "3.0.1", + "@docusaurus/mdx-loader": "3.0.1", + "@docusaurus/module-type-aliases": "3.0.1", + "@docusaurus/types": "3.0.1", + "@docusaurus/utils": "3.0.1", + "@docusaurus/utils-validation": "3.0.1", + "@types/react-router-config": "^5.0.7", + "combine-promises": "^1.1.0", + "fs-extra": "^11.1.1", + "js-yaml": "^4.1.0", + "lodash": "^4.17.21", + "tslib": "^2.6.0", + "utility-types": "^3.10.0", + "webpack": "^5.88.1" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@docusaurus/plugin-content-pages": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-3.0.1.tgz", + "integrity": "sha512-oP7PoYizKAXyEttcvVzfX3OoBIXEmXTMzCdfmC4oSwjG4SPcJsRge3mmI6O8jcZBgUPjIzXD21bVGWEE1iu8gg==", + "dependencies": { + "@docusaurus/core": "3.0.1", + "@docusaurus/mdx-loader": "3.0.1", + "@docusaurus/types": "3.0.1", + "@docusaurus/utils": "3.0.1", + "@docusaurus/utils-validation": "3.0.1", + "fs-extra": "^11.1.1", + "tslib": "^2.6.0", + "webpack": "^5.88.1" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@docusaurus/plugin-debug": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-3.0.1.tgz", + "integrity": "sha512-09dxZMdATky4qdsZGzhzlUvvC+ilQ2hKbYF+wez+cM2mGo4qHbv8+qKXqxq0CQZyimwlAOWQLoSozIXU0g0i7g==", + "dependencies": { + "@docusaurus/core": "3.0.1", + "@docusaurus/types": "3.0.1", + "@docusaurus/utils": "3.0.1", + "fs-extra": "^11.1.1", + "react-json-view-lite": "^1.2.0", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@docusaurus/plugin-google-analytics": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-3.0.1.tgz", + "integrity": "sha512-jwseSz1E+g9rXQwDdr0ZdYNjn8leZBnKPjjQhMBEiwDoenL3JYFcNW0+p0sWoVF/f2z5t7HkKA+cYObrUh18gg==", + "dependencies": { + "@docusaurus/core": "3.0.1", + "@docusaurus/types": "3.0.1", + "@docusaurus/utils-validation": "3.0.1", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@docusaurus/plugin-google-gtag": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-3.0.1.tgz", + "integrity": "sha512-UFTDvXniAWrajsulKUJ1DB6qplui1BlKLQZjX4F7qS/qfJ+qkKqSkhJ/F4VuGQ2JYeZstYb+KaUzUzvaPK1aRQ==", + "dependencies": { + "@docusaurus/core": "3.0.1", + "@docusaurus/types": "3.0.1", + "@docusaurus/utils-validation": "3.0.1", + "@types/gtag.js": "^0.0.12", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@docusaurus/plugin-google-tag-manager": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-3.0.1.tgz", + "integrity": "sha512-IPFvuz83aFuheZcWpTlAdiiX1RqWIHM+OH8wS66JgwAKOiQMR3+nLywGjkLV4bp52x7nCnwhNk1rE85Cpy/CIw==", + "dependencies": { + "@docusaurus/core": "3.0.1", + "@docusaurus/types": "3.0.1", + "@docusaurus/utils-validation": "3.0.1", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@docusaurus/plugin-sitemap": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-3.0.1.tgz", + "integrity": "sha512-xARiWnjtVvoEniZudlCq5T9ifnhCu/GAZ5nA7XgyLfPcNpHQa241HZdsTlLtVcecEVVdllevBKOp7qknBBaMGw==", + "dependencies": { + "@docusaurus/core": "3.0.1", + "@docusaurus/logger": "3.0.1", + "@docusaurus/types": "3.0.1", + "@docusaurus/utils": "3.0.1", + "@docusaurus/utils-common": "3.0.1", + "@docusaurus/utils-validation": "3.0.1", + "fs-extra": "^11.1.1", + "sitemap": "^7.1.1", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@docusaurus/preset-classic": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-3.0.1.tgz", + "integrity": "sha512-il9m9xZKKjoXn6h0cRcdnt6wce0Pv1y5t4xk2Wx7zBGhKG1idu4IFHtikHlD0QPuZ9fizpXspXcTzjL5FXc1Gw==", + "dependencies": { + "@docusaurus/core": "3.0.1", + "@docusaurus/plugin-content-blog": "3.0.1", + "@docusaurus/plugin-content-docs": "3.0.1", + "@docusaurus/plugin-content-pages": "3.0.1", + "@docusaurus/plugin-debug": "3.0.1", + "@docusaurus/plugin-google-analytics": "3.0.1", + "@docusaurus/plugin-google-gtag": "3.0.1", + "@docusaurus/plugin-google-tag-manager": "3.0.1", + "@docusaurus/plugin-sitemap": "3.0.1", + "@docusaurus/theme-classic": "3.0.1", + "@docusaurus/theme-common": "3.0.1", + "@docusaurus/theme-search-algolia": "3.0.1", + "@docusaurus/types": "3.0.1" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@docusaurus/react-loadable": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-5.5.2.tgz", + "integrity": "sha512-A3dYjdBGuy0IGT+wyLIGIKLRE+sAk1iNk0f1HjNDysO7u8lhL4N3VEm+FAubmJbAztn94F7MxBTPmnixbiyFdQ==", + "dependencies": { + "@types/react": "*", + "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": "*" + } + }, + "node_modules/@docusaurus/theme-classic": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-3.0.1.tgz", + "integrity": "sha512-XD1FRXaJiDlmYaiHHdm27PNhhPboUah9rqIH0lMpBt5kYtsGjJzhqa27KuZvHLzOP2OEpqd2+GZ5b6YPq7Q05Q==", + "dependencies": { + "@docusaurus/core": "3.0.1", + "@docusaurus/mdx-loader": "3.0.1", + "@docusaurus/module-type-aliases": "3.0.1", + "@docusaurus/plugin-content-blog": "3.0.1", + "@docusaurus/plugin-content-docs": "3.0.1", + "@docusaurus/plugin-content-pages": "3.0.1", + "@docusaurus/theme-common": "3.0.1", + "@docusaurus/theme-translations": "3.0.1", + "@docusaurus/types": "3.0.1", + "@docusaurus/utils": "3.0.1", + "@docusaurus/utils-common": "3.0.1", + "@docusaurus/utils-validation": "3.0.1", + "@mdx-js/react": "^3.0.0", + "clsx": "^2.0.0", + "copy-text-to-clipboard": "^3.2.0", + "infima": "0.2.0-alpha.43", + "lodash": "^4.17.21", + "nprogress": "^0.2.0", + "postcss": "^8.4.26", + "prism-react-renderer": "^2.3.0", + "prismjs": "^1.29.0", + "react-router-dom": "^5.3.4", + "rtlcss": "^4.1.0", + "tslib": "^2.6.0", + "utility-types": "^3.10.0" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@docusaurus/theme-common": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-3.0.1.tgz", + "integrity": "sha512-cr9TOWXuIOL0PUfuXv6L5lPlTgaphKP+22NdVBOYah5jSq5XAAulJTjfe+IfLsEG4L7lJttLbhW7LXDFSAI7Ag==", + "dependencies": { + "@docusaurus/mdx-loader": "3.0.1", + "@docusaurus/module-type-aliases": "3.0.1", + "@docusaurus/plugin-content-blog": "3.0.1", + "@docusaurus/plugin-content-docs": "3.0.1", + "@docusaurus/plugin-content-pages": "3.0.1", + "@docusaurus/utils": "3.0.1", + "@docusaurus/utils-common": "3.0.1", + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router-config": "*", + "clsx": "^2.0.0", + "parse-numeric-range": "^1.3.0", + "prism-react-renderer": "^2.3.0", + "tslib": "^2.6.0", + "utility-types": "^3.10.0" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@docusaurus/theme-search-algolia": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-3.0.1.tgz", + "integrity": "sha512-DDiPc0/xmKSEdwFkXNf1/vH1SzJPzuJBar8kMcBbDAZk/SAmo/4lf6GU2drou4Ae60lN2waix+jYWTWcJRahSA==", + "dependencies": { + "@docsearch/react": "^3.5.2", + "@docusaurus/core": "3.0.1", + "@docusaurus/logger": "3.0.1", + "@docusaurus/plugin-content-docs": "3.0.1", + "@docusaurus/theme-common": "3.0.1", + "@docusaurus/theme-translations": "3.0.1", + "@docusaurus/utils": "3.0.1", + "@docusaurus/utils-validation": "3.0.1", + "algoliasearch": "^4.18.0", + "algoliasearch-helper": "^3.13.3", + "clsx": "^2.0.0", + "eta": "^2.2.0", + "fs-extra": "^11.1.1", + "lodash": "^4.17.21", + "tslib": "^2.6.0", + "utility-types": "^3.10.0" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@docusaurus/theme-translations": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-3.0.1.tgz", + "integrity": "sha512-6UrbpzCTN6NIJnAtZ6Ne9492vmPVX+7Fsz4kmp+yor3KQwA1+MCzQP7ItDNkP38UmVLnvB/cYk/IvehCUqS3dg==", + "dependencies": { + "fs-extra": "^11.1.1", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=18.0" + } + }, + "node_modules/@docusaurus/types": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.0.1.tgz", + "integrity": "sha512-plyX2iU1tcUsF46uQ01pAd4JhexR7n0iiQ5MSnBFX6M6NSJgDYdru/i1/YNPKOnQHBoXGLHv0dNT6OAlDWNjrg==", + "dependencies": { + "@types/history": "^4.7.11", + "@types/react": "*", + "commander": "^5.1.0", + "joi": "^17.9.2", + "react-helmet-async": "^1.3.0", + "utility-types": "^3.10.0", + "webpack": "^5.88.1", + "webpack-merge": "^5.9.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@docusaurus/utils": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-3.0.1.tgz", + "integrity": "sha512-TwZ33Am0q4IIbvjhUOs+zpjtD/mXNmLmEgeTGuRq01QzulLHuPhaBTTAC/DHu6kFx3wDgmgpAlaRuCHfTcXv8g==", + "dependencies": { + "@docusaurus/logger": "3.0.1", + "@svgr/webpack": "^6.5.1", + "escape-string-regexp": "^4.0.0", + "file-loader": "^6.2.0", + "fs-extra": "^11.1.1", + "github-slugger": "^1.5.0", + "globby": "^11.1.0", + "gray-matter": "^4.0.3", + "jiti": "^1.20.0", + "js-yaml": "^4.1.0", + "lodash": "^4.17.21", + "micromatch": "^4.0.5", + "resolve-pathname": "^3.0.0", + "shelljs": "^0.8.5", + "tslib": "^2.6.0", + "url-loader": "^4.1.1", + "webpack": "^5.88.1" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "@docusaurus/types": "*" + }, + "peerDependenciesMeta": { + "@docusaurus/types": { + "optional": true + } + } + }, + "node_modules/@docusaurus/utils-common": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-3.0.1.tgz", + "integrity": "sha512-W0AxD6w6T8g6bNro8nBRWf7PeZ/nn7geEWM335qHU2DDDjHuV4UZjgUGP1AQsdcSikPrlIqTJJbKzer1lRSlIg==", + "dependencies": { + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "@docusaurus/types": "*" + }, + "peerDependenciesMeta": { + "@docusaurus/types": { + "optional": true + } + } + }, + "node_modules/@docusaurus/utils-validation": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-3.0.1.tgz", + "integrity": "sha512-ujTnqSfyGQ7/4iZdB4RRuHKY/Nwm58IIb+41s5tCXOv/MBU2wGAjOHq3U+AEyJ8aKQcHbxvTKJaRchNHYUVUQg==", + "dependencies": { + "@docusaurus/logger": "3.0.1", + "@docusaurus/utils": "3.0.1", + "joi": "^17.9.2", + "js-yaml": "^4.1.0", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=18.0" + } + }, + "node_modules/@hapi/hoek": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", + "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==" + }, + "node_modules/@hapi/topo": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", + "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", + "dependencies": { + "@hapi/hoek": "^9.0.0" + } + }, + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", + "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.20", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", + "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@leichtgewicht/ip-codec": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", + "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==" + }, + "node_modules/@mdx-js/mdx": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-3.0.0.tgz", + "integrity": "sha512-Icm0TBKBLYqroYbNW3BPnzMGn+7mwpQOK310aZ7+fkCtiU3aqv2cdcX+nd0Ydo3wI5Rx8bX2Z2QmGb/XcAClCw==", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdx": "^2.0.0", + "collapse-white-space": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-build-jsx": "^3.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "estree-util-to-js": "^2.0.0", + "estree-walker": "^3.0.0", + "hast-util-to-estree": "^3.0.0", + "hast-util-to-jsx-runtime": "^2.0.0", + "markdown-extensions": "^2.0.0", + "periscopic": "^3.0.0", + "remark-mdx": "^3.0.0", + "remark-parse": "^11.0.0", + "remark-rehype": "^11.0.0", + "source-map": "^0.7.0", + "unified": "^11.0.0", + "unist-util-position-from-estree": "^2.0.0", + "unist-util-stringify-position": "^4.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@mdx-js/react": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-3.0.0.tgz", + "integrity": "sha512-nDctevR9KyYFyV+m+/+S4cpzCWHqj+iHDHq3QrsWezcC+B17uZdIWgCguESUkwFhM3n/56KxWVE3V6EokrmONQ==", + "dependencies": { + "@types/mdx": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "@types/react": ">=16", + "react": ">=16" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@pnpm/config.env-replace": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz", + "integrity": "sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==", + "engines": { + "node": ">=12.22.0" + } + }, + "node_modules/@pnpm/network.ca-file": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz", + "integrity": "sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==", + "dependencies": { + "graceful-fs": "4.2.10" + }, + "engines": { + "node": ">=12.22.0" + } + }, + "node_modules/@pnpm/network.ca-file/node_modules/graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" + }, + "node_modules/@pnpm/npm-conf": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-2.2.2.tgz", + "integrity": "sha512-UA91GwWPhFExt3IizW6bOeY/pQ0BkuNwKjk9iQW9KqxluGCrg4VenZ0/L+2Y0+ZOtme72EVvg6v0zo3AMQRCeA==", + "dependencies": { + "@pnpm/config.env-replace": "^1.1.0", + "@pnpm/network.ca-file": "^1.0.1", + "config-chain": "^1.1.11" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@polka/url": { + "version": "1.0.0-next.24", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.24.tgz", + "integrity": "sha512-2LuNTFBIO0m7kKIQvvPHN6UE63VjpmL9rnEEaOOaiSPbZK+zUOYIzBAWcED+3XYzhYsd/0mD57VdxAEqqV52CQ==" + }, + "node_modules/@sideway/address": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz", + "integrity": "sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw==", + "dependencies": { + "@hapi/hoek": "^9.0.0" + } + }, + "node_modules/@sideway/formula": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz", + "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==" + }, + "node_modules/@sideway/pinpoint": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", + "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==" + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==" + }, + "node_modules/@sindresorhus/is": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/@slorber/remark-comment": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@slorber/remark-comment/-/remark-comment-1.0.0.tgz", + "integrity": "sha512-RCE24n7jsOj1M0UPvIQCHTe7fI0sFL4S2nwKVWwHyVr/wI/H8GosgsJGyhnsZoGFnD/P2hLf1mSbrrgSLN93NA==", + "dependencies": { + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.1.0", + "micromark-util-symbol": "^1.0.1" + } + }, + "node_modules/@slorber/static-site-generator-webpack-plugin": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/@slorber/static-site-generator-webpack-plugin/-/static-site-generator-webpack-plugin-4.0.7.tgz", + "integrity": "sha512-Ug7x6z5lwrz0WqdnNFOMYrDQNTPAprvHLSh6+/fmml3qUiz6l5eq+2MzLKWtn/q5K5NpSiFsZTP/fck/3vjSxA==", + "dependencies": { + "eval": "^0.1.8", + "p-map": "^4.0.0", + "webpack-sources": "^3.2.2" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@svgr/babel-plugin-add-jsx-attribute": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-6.5.1.tgz", + "integrity": "sha512-9PYGcXrAxitycIjRmZB+Q0JaN07GZIWaTBIGQzfaZv+qr1n8X1XUEJ5rZ/vx6OVD9RRYlrNnXWExQXcmZeD/BQ==", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-attribute": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-8.0.0.tgz", + "integrity": "sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-8.0.0.tgz", + "integrity": "sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-6.5.1.tgz", + "integrity": "sha512-8DPaVVE3fd5JKuIC29dqyMB54sA6mfgki2H2+swh+zNJoynC8pMPzOkidqHOSc6Wj032fhl8Z0TVn1GiPpAiJg==", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-svg-dynamic-title": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-6.5.1.tgz", + "integrity": "sha512-FwOEi0Il72iAzlkaHrlemVurgSQRDFbk0OC8dSvD5fSBPHltNh7JtLsxmZUhjYBZo2PpcU/RJvvi6Q0l7O7ogw==", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-svg-em-dimensions": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-6.5.1.tgz", + "integrity": "sha512-gWGsiwjb4tw+ITOJ86ndY/DZZ6cuXMNE/SjcDRg+HLuCmwpcjOktwRF9WgAiycTqJD/QXqL2f8IzE2Rzh7aVXA==", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-transform-react-native-svg": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-6.5.1.tgz", + "integrity": "sha512-2jT3nTayyYP7kI6aGutkyfJ7UMGtuguD72OjeGLwVNyfPRBD8zQthlvL+fAbAKk5n9ZNcvFkp/b1lZ7VsYqVJg==", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-transform-svg-component": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-6.5.1.tgz", + "integrity": "sha512-a1p6LF5Jt33O3rZoVRBqdxL350oge54iZWHNI6LJB5tQ7EelvD/Mb1mfBiZNAan0dt4i3VArkFRjA4iObuNykQ==", + "engines": { + "node": ">=12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-preset": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-6.5.1.tgz", + "integrity": "sha512-6127fvO/FF2oi5EzSQOAjo1LE3OtNVh11R+/8FXa+mHx1ptAaS4cknIjnUA7e6j6fwGGJ17NzaTJFUwOV2zwCw==", + "dependencies": { + "@svgr/babel-plugin-add-jsx-attribute": "^6.5.1", + "@svgr/babel-plugin-remove-jsx-attribute": "*", + "@svgr/babel-plugin-remove-jsx-empty-expression": "*", + "@svgr/babel-plugin-replace-jsx-attribute-value": "^6.5.1", + "@svgr/babel-plugin-svg-dynamic-title": "^6.5.1", + "@svgr/babel-plugin-svg-em-dimensions": "^6.5.1", + "@svgr/babel-plugin-transform-react-native-svg": "^6.5.1", + "@svgr/babel-plugin-transform-svg-component": "^6.5.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/core": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/core/-/core-6.5.1.tgz", + "integrity": "sha512-/xdLSWxK5QkqG524ONSjvg3V/FkNyCv538OIBdQqPNaAta3AsXj/Bd2FbvR87yMbXO2hFSWiAe/Q6IkVPDw+mw==", + "dependencies": { + "@babel/core": "^7.19.6", + "@svgr/babel-preset": "^6.5.1", + "@svgr/plugin-jsx": "^6.5.1", + "camelcase": "^6.2.0", + "cosmiconfig": "^7.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/hast-util-to-babel-ast": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-6.5.1.tgz", + "integrity": "sha512-1hnUxxjd83EAxbL4a0JDJoD3Dao3hmjvyvyEV8PzWmLK3B9m9NPlW7GKjFyoWE8nM7HnXzPcmmSyOW8yOddSXw==", + "dependencies": { + "@babel/types": "^7.20.0", + "entities": "^4.4.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/plugin-jsx": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-6.5.1.tgz", + "integrity": "sha512-+UdQxI3jgtSjCykNSlEMuy1jSRQlGC7pqBCPvkG/2dATdWo082zHTTK3uhnAju2/6XpE6B5mZ3z4Z8Ns01S8Gw==", + "dependencies": { + "@babel/core": "^7.19.6", + "@svgr/babel-preset": "^6.5.1", + "@svgr/hast-util-to-babel-ast": "^6.5.1", + "svg-parser": "^2.0.4" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@svgr/core": "^6.0.0" + } + }, + "node_modules/@svgr/plugin-svgo": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-6.5.1.tgz", + "integrity": "sha512-omvZKf8ixP9z6GWgwbtmP9qQMPX4ODXi+wzbVZgomNFsUIlHA1sf4fThdwTWSsZGgvGAG6yE+b/F5gWUkcZ/iQ==", + "dependencies": { + "cosmiconfig": "^7.0.1", + "deepmerge": "^4.2.2", + "svgo": "^2.8.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@svgr/core": "*" + } + }, + "node_modules/@svgr/webpack": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-6.5.1.tgz", + "integrity": "sha512-cQ/AsnBkXPkEK8cLbv4Dm7JGXq2XrumKnL1dRpJD9rIO2fTIlJI9a1uCciYG1F2aUsox/hJQyNGbt3soDxSRkA==", + "dependencies": { + "@babel/core": "^7.19.6", + "@babel/plugin-transform-react-constant-elements": "^7.18.12", + "@babel/preset-env": "^7.19.4", + "@babel/preset-react": "^7.18.6", + "@babel/preset-typescript": "^7.18.6", + "@svgr/core": "^6.5.1", + "@svgr/plugin-jsx": "^6.5.1", + "@svgr/plugin-svgo": "^6.5.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@szmarczak/http-timer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", + "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", + "dependencies": { + "defer-to-connect": "^2.0.1" + }, + "engines": { + "node": ">=14.16" + } + }, + "node_modules/@trysound/sax": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", + "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/@types/acorn": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@types/acorn/-/acorn-4.0.6.tgz", + "integrity": "sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==", + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.5", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", + "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/bonjour": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz", + "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect-history-api-fallback": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz", + "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==", + "dependencies": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, + "node_modules/@types/debug": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "dependencies": { + "@types/ms": "*" + } + }, + "node_modules/@types/eslint": { + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.1.tgz", + "integrity": "sha512-18PLWRzhy9glDQp3+wOgfLYRWlhgX0azxgJ63rdpoUHyrC9z0f5CkFburjQx4uD7ZCruw85ZtMt6K+L+R8fLJQ==", + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==" + }, + "node_modules/@types/estree-jsx": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.3.tgz", + "integrity": "sha512-pvQ+TKeRHeiUGRhvYwRrQ/ISnohKkSJR14fT2yqyZ4e9K5vqc7hrtY2Y1Dw0ZwAzQ6DQsxsaCUuSIIi8v0Cq6w==", + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/@types/express": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", + "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.17.41", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.41.tgz", + "integrity": "sha512-OaJ7XLaelTgrvlZD8/aa0vvvxZdUmlCn6MtWeB7TkiKW70BQLc9XEPpDLPdbo52ZhXUCrznlWdCHWxJWtdyajA==", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/gtag.js": { + "version": "0.0.12", + "resolved": "https://registry.npmjs.org/@types/gtag.js/-/gtag.js-0.0.12.tgz", + "integrity": "sha512-YQV9bUsemkzG81Ea295/nF/5GijnD2Af7QhEofh7xu+kvCN6RdodgNwwGWXB5GMI3NoyvQo0odNctoH/qLMIpg==" + }, + "node_modules/@types/hast": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.3.tgz", + "integrity": "sha512-2fYGlaDy/qyLlhidX42wAH0KBi2TCjKMH8CHmBXgRlJ3Y+OXTiqsPQ6IWarZKwF1JoUcAJdPogv1d4b0COTpmQ==", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/history": { + "version": "4.7.11", + "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.11.tgz", + "integrity": "sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==" + }, + "node_modules/@types/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==" + }, + "node_modules/@types/http-cache-semantics": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", + "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==" + }, + "node_modules/@types/http-errors": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", + "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==" + }, + "node_modules/@types/http-proxy": { + "version": "1.17.14", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.14.tgz", + "integrity": "sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==" + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==" + }, + "node_modules/@types/mdast": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.3.tgz", + "integrity": "sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/mdx": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.10.tgz", + "integrity": "sha512-Rllzc5KHk0Al5/WANwgSPl1/CwjqCy+AZrGd78zuK+jO9aDM6ffblZ+zIjgPNAaEBmlO0RYDvLNh7wD0zKVgEg==" + }, + "node_modules/@types/mime": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==" + }, + "node_modules/@types/ms": { + "version": "0.7.34", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", + "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==" + }, + "node_modules/@types/node": { + "version": "20.10.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.6.tgz", + "integrity": "sha512-Vac8H+NlRNNlAmDfGUP7b5h/KA+AtWIzuXy0E6OyP8f1tCLYAtPvKRRDJjAPqhpCb0t6U2j7/xqAuLEebW2kiw==", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/node-forge": { + "version": "1.3.11", + "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz", + "integrity": "sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/parse-json": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", + "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==" + }, + "node_modules/@types/prismjs": { + "version": "1.26.3", + "resolved": "https://registry.npmjs.org/@types/prismjs/-/prismjs-1.26.3.tgz", + "integrity": "sha512-A0D0aTXvjlqJ5ZILMz3rNfDBOx9hHxLZYv2by47Sm/pqW35zzjusrZTryatjN/Rf8Us2gZrJD+KeHbUSTux1Cw==" + }, + "node_modules/@types/prop-types": { + "version": "15.7.11", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.11.tgz", + "integrity": "sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==" + }, + "node_modules/@types/qs": { + "version": "6.9.11", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.11.tgz", + "integrity": "sha512-oGk0gmhnEJK4Yyk+oI7EfXsLayXatCWPHary1MtcmbAifkobT9cM9yutG/hZKIseOU0MqbIwQ/u2nn/Gb+ltuQ==" + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==" + }, + "node_modules/@types/react": { + "version": "18.2.46", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.46.tgz", + "integrity": "sha512-nNCvVBcZlvX4NU1nRRNV/mFl1nNRuTuslAJglQsq+8ldXe5Xv0Wd2f7WTE3jOxhLH2BFfiZGC6GCp+kHQbgG+w==", + "dependencies": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-router": { + "version": "5.1.20", + "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.20.tgz", + "integrity": "sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q==", + "dependencies": { + "@types/history": "^4.7.11", + "@types/react": "*" + } + }, + "node_modules/@types/react-router-config": { + "version": "5.0.11", + "resolved": "https://registry.npmjs.org/@types/react-router-config/-/react-router-config-5.0.11.tgz", + "integrity": "sha512-WmSAg7WgqW7m4x8Mt4N6ZyKz0BubSj/2tVUMsAHp+Yd2AMwcSbeFq9WympT19p5heCFmF97R9eD5uUR/t4HEqw==", + "dependencies": { + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router": "^5.1.0" + } + }, + "node_modules/@types/react-router-dom": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-5.3.3.tgz", + "integrity": "sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw==", + "dependencies": { + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router": "*" + } + }, + "node_modules/@types/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==" + }, + "node_modules/@types/sax": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/sax/-/sax-1.2.7.tgz", + "integrity": "sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/scheduler": { + "version": "0.16.8", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.8.tgz", + "integrity": "sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==" + }, + "node_modules/@types/send": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", + "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/serve-index": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz", + "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==", + "dependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.5", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.5.tgz", + "integrity": "sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==", + "dependencies": { + "@types/http-errors": "*", + "@types/mime": "*", + "@types/node": "*" + } + }, + "node_modules/@types/sockjs": { + "version": "0.3.36", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz", + "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/unist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" + }, + "node_modules/@types/ws": { + "version": "8.5.10", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.10.tgz", + "integrity": "sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/yargs": { + "version": "17.0.32", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", + "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==" + }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==" + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", + "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", + "dependencies": { + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==" + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==" + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", + "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==" + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==" + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", + "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==" + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", + "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-opt": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6", + "@webassemblyjs/wast-printer": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", + "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", + "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", + "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", + "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/accepts/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/accepts/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-assertions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", + "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", + "peerDependencies": { + "acorn": "^8" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.1", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.1.tgz", + "integrity": "sha512-TgUZgYvqZprrl7YldZNoa9OciCAyZR+Ejm9eXzKCmjsF5IKp/wgQ7Z/ZpjpGTIUPwrHQIcYeI8qDh4PsEwxMbw==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/address": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/address/-/address-1.2.2.tgz", + "integrity": "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/algoliasearch": { + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.22.0.tgz", + "integrity": "sha512-gfceltjkwh7PxXwtkS8KVvdfK+TSNQAWUeNSxf4dA29qW5tf2EGwa8jkJujlT9jLm17cixMVoGNc+GJFO1Mxhg==", + "dependencies": { + "@algolia/cache-browser-local-storage": "4.22.0", + "@algolia/cache-common": "4.22.0", + "@algolia/cache-in-memory": "4.22.0", + "@algolia/client-account": "4.22.0", + "@algolia/client-analytics": "4.22.0", + "@algolia/client-common": "4.22.0", + "@algolia/client-personalization": "4.22.0", + "@algolia/client-search": "4.22.0", + "@algolia/logger-common": "4.22.0", + "@algolia/logger-console": "4.22.0", + "@algolia/requester-browser-xhr": "4.22.0", + "@algolia/requester-common": "4.22.0", + "@algolia/requester-node-http": "4.22.0", + "@algolia/transporter": "4.22.0" + } + }, + "node_modules/algoliasearch-helper": { + "version": "3.16.1", + "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.16.1.tgz", + "integrity": "sha512-qxAHVjjmT7USVvrM8q6gZGaJlCK1fl4APfdAA7o8O6iXEc68G0xMNrzRkxoB/HmhhvyHnoteS/iMTiHiTcQQcg==", + "dependencies": { + "@algolia/events": "^4.0.1" + }, + "peerDependencies": { + "algoliasearch": ">= 3.1 < 6" + } + }, + "node_modules/ansi-align": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", + "dependencies": { + "string-width": "^4.1.0" + } + }, + "node_modules/ansi-align/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/ansi-align/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", + "engines": [ + "node >= 0.8.0" + ], + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/astring": { + "version": "1.8.6", + "resolved": "https://registry.npmjs.org/astring/-/astring-1.8.6.tgz", + "integrity": "sha512-ISvCdHdlTDlH5IpxQJIex7BWBywFWgjJSVdwst+/iQCoEYnyOaQ95+X1JGshuBjGp6nxKUy1jMgE3zPqN7fQdg==", + "bin": { + "astring": "bin/astring" + } + }, + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/autoprefixer": { + "version": "10.4.16", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.16.tgz", + "integrity": "sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "browserslist": "^4.21.10", + "caniuse-lite": "^1.0.30001538", + "fraction.js": "^4.3.6", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/babel-loader": { + "version": "9.1.3", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.3.tgz", + "integrity": "sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw==", + "dependencies": { + "find-cache-dir": "^4.0.0", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 14.15.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0", + "webpack": ">=5" + } + }, + "node_modules/babel-plugin-dynamic-import-node": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", + "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", + "dependencies": { + "object.assign": "^4.1.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.7.tgz", + "integrity": "sha512-LidDk/tEGDfuHW2DWh/Hgo4rmnw3cduK6ZkOI1NPFceSK3n/yAGeOsNT7FLnSGHkXj3RHGSEVkN3FsCTY6w2CQ==", + "dependencies": { + "@babel/compat-data": "^7.22.6", + "@babel/helper-define-polyfill-provider": "^0.4.4", + "semver": "^6.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.7.tgz", + "integrity": "sha512-KyDvZYxAzkC0Aj2dAPyDzi2Ym15e5JKZSK+maI7NAwSqofvuFglbSsxE7wUOvTg9oFVnHMzVzBKcqEb4PJgtOA==", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.4.4", + "core-js-compat": "^3.33.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.4.tgz", + "integrity": "sha512-S/x2iOCvDaCASLYsOOgWOq4bCfKYVqvO/uxjkaYyZ3rVsVE3CeAI/c84NpyuBBymEgNvHgjEot3a9/Z/kXvqsg==", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.4.4" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/bail": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==" + }, + "node_modules/big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/bonjour-service": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.2.0.tgz", + "integrity": "sha512-xdzMA6JGckxyJzZByjEWRcfKmDxXaGXZWVftah3FkCqdlePNS9DjHSUN5zkP4oEfz/t0EXXlro88EIhzwMB4zA==", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.5" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" + }, + "node_modules/boxen": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-6.2.1.tgz", + "integrity": "sha512-H4PEsJXfFI/Pt8sjDWbHlQPx4zL/bvSQjcilJmaulGt5mLDorHOHpmdXAJcBcmru7PhYSp/cDMWRko4ZUMFkSw==", + "dependencies": { + "ansi-align": "^3.0.1", + "camelcase": "^6.2.0", + "chalk": "^4.1.2", + "cli-boxes": "^3.0.0", + "string-width": "^5.0.1", + "type-fest": "^2.5.0", + "widest-line": "^4.0.1", + "wrap-ansi": "^8.0.1" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.22.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.2.tgz", + "integrity": "sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001565", + "electron-to-chromium": "^1.4.601", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.13" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "node_modules/bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cacheable-lookup": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz", + "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==", + "engines": { + "node": ">=14.16" + } + }, + "node_modules/cacheable-request": { + "version": "10.2.14", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.14.tgz", + "integrity": "sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==", + "dependencies": { + "@types/http-cache-semantics": "^4.0.2", + "get-stream": "^6.0.1", + "http-cache-semantics": "^4.1.1", + "keyv": "^4.5.3", + "mimic-response": "^4.0.0", + "normalize-url": "^8.0.0", + "responselike": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + } + }, + "node_modules/cacheable-request/node_modules/normalize-url": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.0.tgz", + "integrity": "sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw==", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/call-bind": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", + "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", + "dependencies": { + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.1", + "set-function-length": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "dependencies": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/caniuse-api": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", + "dependencies": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001572", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001572.tgz", + "integrity": "sha512-1Pbh5FLmn5y4+QhNyJE9j3/7dK44dGB83/ZMjv/qJk86TvDbjk0LosiZo0i0WB0Vx607qMX9jYrn1VLHCkN4rw==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "engines": { + "node": ">=10" + } + }, + "node_modules/character-entities": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-html4": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-reference-invalid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", + "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/cheerio": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz", + "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==", + "dependencies": { + "cheerio-select": "^2.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "htmlparser2": "^8.0.1", + "parse5": "^7.0.0", + "parse5-htmlparser2-tree-adapter": "^7.0.0" + }, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/cheeriojs/cheerio?sponsor=1" + } + }, + "node_modules/cheerio-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", + "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", + "dependencies": { + "boolbase": "^1.0.0", + "css-select": "^5.1.0", + "css-what": "^6.1.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "engines": { + "node": ">=6.0" + } + }, + "node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" + } + }, + "node_modules/clean-css": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz", + "integrity": "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==", + "dependencies": { + "source-map": "~0.6.0" + }, + "engines": { + "node": ">= 10.0" + } + }, + "node_modules/clean-css/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/cli-boxes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", + "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-table3": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz", + "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==", + "dependencies": { + "string-width": "^4.2.0" + }, + "engines": { + "node": "10.* || >= 12.*" + }, + "optionalDependencies": { + "@colors/colors": "1.5.0" + } + }, + "node_modules/cli-table3/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/cli-table3/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/clone-deep/node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/clsx": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.0.tgz", + "integrity": "sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/collapse-white-space": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-2.1.0.tgz", + "integrity": "sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/colord": { + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", + "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==" + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==" + }, + "node_modules/combine-promises": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/combine-promises/-/combine-promises-1.2.0.tgz", + "integrity": "sha512-VcQB1ziGD0NXrhKxiwyNbCDmRzs/OShMs2GqW2DlU2A/Sd0nQxE1oWDAE5O0ygSx5mgQOn9eIFh7yKPgFRVkPQ==", + "engines": { + "node": ">=10" + } + }, + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/common-path-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", + "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==" + }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compressible/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dependencies": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/compression/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/compression/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/compression/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/config-chain": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", + "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", + "dependencies": { + "ini": "^1.3.4", + "proto-list": "~1.2.1" + } + }, + "node_modules/configstore": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-6.0.0.tgz", + "integrity": "sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA==", + "dependencies": { + "dot-prop": "^6.0.1", + "graceful-fs": "^4.2.6", + "unique-string": "^3.0.0", + "write-file-atomic": "^3.0.3", + "xdg-basedir": "^5.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/yeoman/configstore?sponsor=1" + } + }, + "node_modules/connect-history-api-fallback": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", + "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/consola": { + "version": "2.15.3", + "resolved": "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz", + "integrity": "sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==" + }, + "node_modules/content-disposition": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", + "integrity": "sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "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==" + }, + "node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, + "node_modules/copy-text-to-clipboard": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/copy-text-to-clipboard/-/copy-text-to-clipboard-3.2.0.tgz", + "integrity": "sha512-RnJFp1XR/LOBDckxTib5Qjr/PMfkatD0MUCQgdpqS8MdKiNUzBjAQBEN6oUy+jW7LI93BBG3DtMB2KOOKpGs2Q==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/copy-webpack-plugin": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz", + "integrity": "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==", + "dependencies": { + "fast-glob": "^3.2.11", + "glob-parent": "^6.0.1", + "globby": "^13.1.1", + "normalize-path": "^3.0.0", + "schema-utils": "^4.0.0", + "serialize-javascript": "^6.0.0" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + } + }, + "node_modules/copy-webpack-plugin/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/copy-webpack-plugin/node_modules/globby": { + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", + "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", + "dependencies": { + "dir-glob": "^3.0.1", + "fast-glob": "^3.3.0", + "ignore": "^5.2.4", + "merge2": "^1.4.1", + "slash": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/copy-webpack-plugin/node_modules/slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/core-js": { + "version": "3.35.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.35.0.tgz", + "integrity": "sha512-ntakECeqg81KqMueeGJ79Q5ZgQNR+6eaE8sxGCx62zMbAIj65q+uYvatToew3m6eAGdU4gNZwpZ34NMe4GYswg==", + "hasInstallScript": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-compat": { + "version": "3.35.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.35.0.tgz", + "integrity": "sha512-5blwFAddknKeNgsjBzilkdQ0+YK8L1PfqPYq40NOYMYFSS38qj+hpTcLLWwpIwA2A5bje/x5jmVn2tzUMg9IVw==", + "dependencies": { + "browserslist": "^4.22.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-pure": { + "version": "3.35.0", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.35.0.tgz", + "integrity": "sha512-f+eRYmkou59uh7BPcyJ8MC76DiGhspj1KMxVIcF24tzP8NA9HVa1uC7BTW2tgx7E1QVCzDzsgp7kArrzhlz8Ew==", + "hasInstallScript": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "node_modules/cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/crypto-random-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-4.0.0.tgz", + "integrity": "sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==", + "dependencies": { + "type-fest": "^1.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/crypto-random-string/node_modules/type-fest": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/css-declaration-sorter": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.4.1.tgz", + "integrity": "sha512-rtdthzxKuyq6IzqX6jEcIzQF/YqccluefyCYheovBOLhFT/drQA9zj/UbRAa9J7C0o6EG6u3E6g+vKkay7/k3g==", + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.0.9" + } + }, + "node_modules/css-loader": { + "version": "6.8.1", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.8.1.tgz", + "integrity": "sha512-xDAXtEVGlD0gJ07iclwWVkLoZOpEvAWaSyf6W18S2pOC//K8+qUDIx8IIT3D+HjnmkJPQeesOPv5aiUaJsCM2g==", + "dependencies": { + "icss-utils": "^5.1.0", + "postcss": "^8.4.21", + "postcss-modules-extract-imports": "^3.0.0", + "postcss-modules-local-by-default": "^4.0.3", + "postcss-modules-scope": "^3.0.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.2.0", + "semver": "^7.3.8" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/css-minimizer-webpack-plugin": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-4.2.2.tgz", + "integrity": "sha512-s3Of/4jKfw1Hj9CxEO1E5oXhQAxlayuHO2y/ML+C6I9sQ7FdzfEV6QgMLN3vI+qFsjJGIAFLKtQK7t8BOXAIyA==", + "dependencies": { + "cssnano": "^5.1.8", + "jest-worker": "^29.1.2", + "postcss": "^8.4.17", + "schema-utils": "^4.0.0", + "serialize-javascript": "^6.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@parcel/css": { + "optional": true + }, + "@swc/css": { + "optional": true + }, + "clean-css": { + "optional": true + }, + "csso": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "lightningcss": { + "optional": true + } + } + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/css-select": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "dependencies": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/css-tree/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cssnano": { + "version": "5.1.15", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.15.tgz", + "integrity": "sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw==", + "dependencies": { + "cssnano-preset-default": "^5.2.14", + "lilconfig": "^2.0.3", + "yaml": "^1.10.2" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/cssnano" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/cssnano-preset-advanced": { + "version": "5.3.10", + "resolved": "https://registry.npmjs.org/cssnano-preset-advanced/-/cssnano-preset-advanced-5.3.10.tgz", + "integrity": "sha512-fnYJyCS9jgMU+cmHO1rPSPf9axbQyD7iUhLO5Df6O4G+fKIOMps+ZbU0PdGFejFBBZ3Pftf18fn1eG7MAPUSWQ==", + "dependencies": { + "autoprefixer": "^10.4.12", + "cssnano-preset-default": "^5.2.14", + "postcss-discard-unused": "^5.1.0", + "postcss-merge-idents": "^5.1.1", + "postcss-reduce-idents": "^5.2.0", + "postcss-zindex": "^5.1.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/cssnano-preset-default": { + "version": "5.2.14", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.14.tgz", + "integrity": "sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A==", + "dependencies": { + "css-declaration-sorter": "^6.3.1", + "cssnano-utils": "^3.1.0", + "postcss-calc": "^8.2.3", + "postcss-colormin": "^5.3.1", + "postcss-convert-values": "^5.1.3", + "postcss-discard-comments": "^5.1.2", + "postcss-discard-duplicates": "^5.1.0", + "postcss-discard-empty": "^5.1.1", + "postcss-discard-overridden": "^5.1.0", + "postcss-merge-longhand": "^5.1.7", + "postcss-merge-rules": "^5.1.4", + "postcss-minify-font-values": "^5.1.0", + "postcss-minify-gradients": "^5.1.1", + "postcss-minify-params": "^5.1.4", + "postcss-minify-selectors": "^5.2.1", + "postcss-normalize-charset": "^5.1.0", + "postcss-normalize-display-values": "^5.1.0", + "postcss-normalize-positions": "^5.1.1", + "postcss-normalize-repeat-style": "^5.1.1", + "postcss-normalize-string": "^5.1.0", + "postcss-normalize-timing-functions": "^5.1.0", + "postcss-normalize-unicode": "^5.1.1", + "postcss-normalize-url": "^5.1.0", + "postcss-normalize-whitespace": "^5.1.1", + "postcss-ordered-values": "^5.1.3", + "postcss-reduce-initial": "^5.1.2", + "postcss-reduce-transforms": "^5.1.0", + "postcss-svgo": "^5.1.0", + "postcss-unique-selectors": "^5.1.1" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/cssnano-utils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz", + "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/csso": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", + "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", + "dependencies": { + "css-tree": "^1.1.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" + }, + "node_modules/debounce": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", + "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==" + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decode-named-character-reference": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz", + "integrity": "sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==", + "dependencies": { + "character-entities": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decompress-response/node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-gateway": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", + "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", + "dependencies": { + "execa": "^5.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/defer-to-connect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", + "engines": { + "node": ">=10" + } + }, + "node_modules/define-data-property": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", + "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", + "dependencies": { + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "engines": { + "node": ">=8" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/del": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-6.1.1.tgz", + "integrity": "sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==", + "dependencies": { + "globby": "^11.0.1", + "graceful-fs": "^4.2.4", + "is-glob": "^4.0.1", + "is-path-cwd": "^2.2.0", + "is-path-inside": "^3.0.2", + "p-map": "^4.0.0", + "rimraf": "^3.0.2", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==" + }, + "node_modules/detect-port": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.5.1.tgz", + "integrity": "sha512-aBzdj76lueB6uUst5iAs7+0H/oOjqI5D16XUWxlWMIMROhcM0rfsNVk93zTngq1dDNpoXRr++Sus7ETAExppAQ==", + "dependencies": { + "address": "^1.0.1", + "debug": "4" + }, + "bin": { + "detect": "bin/detect-port.js", + "detect-port": "bin/detect-port.js" + } + }, + "node_modules/detect-port-alt": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.6.tgz", + "integrity": "sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==", + "dependencies": { + "address": "^1.0.1", + "debug": "^2.6.0" + }, + "bin": { + "detect": "bin/detect-port", + "detect-port": "bin/detect-port" + }, + "engines": { + "node": ">= 4.2.1" + } + }, + "node_modules/detect-port-alt/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/detect-port-alt/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/devlop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dns-packet": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", + "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", + "dependencies": { + "@leichtgewicht/ip-codec": "^2.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/dom-converter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", + "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "dependencies": { + "utila": "~0.4" + } + }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/dot-prop": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", + "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==", + "dependencies": { + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/dot-prop/node_modules/is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==" + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "node_modules/electron-to-chromium": { + "version": "1.4.617", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.617.tgz", + "integrity": "sha512-sYNE3QxcDS4ANW1k4S/wWYMXjCVcFSOX3Bg8jpuMFaXt/x8JCmp0R1Xe1ZXDX4WXnSRBf+GJ/3eGWicUuQq5cg==" + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + }, + "node_modules/emojilib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/emojilib/-/emojilib-2.4.0.tgz", + "integrity": "sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw==" + }, + "node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/emoticon": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/emoticon/-/emoticon-4.0.1.tgz", + "integrity": "sha512-dqx7eA9YaqyvYtUhJwT4rC1HIp82j5ybS1/vQ42ur+jBe17dJMwZE4+gvL1XadSFfxaPFFGt3Xsw+Y8akThDlw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", + "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-module-lexer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.4.1.tgz", + "integrity": "sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==" + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-goat": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-4.0.0.tgz", + "integrity": "sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-util-attach-comments": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/estree-util-attach-comments/-/estree-util-attach-comments-3.0.0.tgz", + "integrity": "sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==", + "dependencies": { + "@types/estree": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-build-jsx": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/estree-util-build-jsx/-/estree-util-build-jsx-3.0.1.tgz", + "integrity": "sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ==", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "estree-walker": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-is-identifier-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz", + "integrity": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-to-js": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/estree-util-to-js/-/estree-util-to-js-2.0.0.tgz", + "integrity": "sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "astring": "^1.8.0", + "source-map": "^0.7.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-value-to-estree": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/estree-util-value-to-estree/-/estree-util-value-to-estree-3.0.1.tgz", + "integrity": "sha512-b2tdzTurEIbwRh+mKrEcaWfu1wgb8J1hVsgREg7FFiecWwK/PhO8X0kyc+0bIcKNtD4sqxIdNoRy6/p/TvECEA==", + "dependencies": { + "@types/estree": "^1.0.0", + "is-plain-obj": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/remcohaszing" + } + }, + "node_modules/estree-util-visit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/estree-util-visit/-/estree-util-visit-2.0.0.tgz", + "integrity": "sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eta": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/eta/-/eta-2.2.0.tgz", + "integrity": "sha512-UVQ72Rqjy/ZKQalzV5dCCJP80GrmPrMxh6NlNf+erV6ObL0ZFkhCstWRawS85z3smdr3d2wXPsZEY7rDPfGd2g==", + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "url": "https://github.com/eta-dev/eta?sponsor=1" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eval": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/eval/-/eval-0.1.8.tgz", + "integrity": "sha512-EzV94NYKoO09GLXGjXj9JIlXijVck4ONSr5wiCWDvhsvj5jxSrzTmRU/9C1DyB6uToszLs8aifA6NQ7lEQdvFw==", + "dependencies": { + "@types/node": "*", + "require-like": ">= 0.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/express/node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + }, + "node_modules/express/node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "node_modules/fast-url-parser": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/fast-url-parser/-/fast-url-parser-1.1.3.tgz", + "integrity": "sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ==", + "dependencies": { + "punycode": "^1.3.2" + } + }, + "node_modules/fastq": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.16.0.tgz", + "integrity": "sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fault": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fault/-/fault-2.0.1.tgz", + "integrity": "sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==", + "dependencies": { + "format": "^0.2.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/feed": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/feed/-/feed-4.2.2.tgz", + "integrity": "sha512-u5/sxGfiMfZNtJ3OvQpXcvotFpYkL0n9u9mM2vkui2nGo8b4wvDkJ8gAkYqbA8QpGyFCv3RK0Z+Iv+9veCS9bQ==", + "dependencies": { + "xml-js": "^1.6.11" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/file-loader": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", + "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", + "dependencies": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/file-loader/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/file-loader/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/file-loader/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "node_modules/file-loader/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/filesize": { + "version": "8.0.7", + "resolved": "https://registry.npmjs.org/filesize/-/filesize-8.0.7.tgz", + "integrity": "sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/find-cache-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz", + "integrity": "sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==", + "dependencies": { + "common-path-prefix": "^3.0.0", + "pkg-dir": "^7.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-up": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", + "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", + "dependencies": { + "locate-path": "^7.1.0", + "path-exists": "^5.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "bin": { + "flat": "cli.js" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.4", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.4.tgz", + "integrity": "sha512-Cr4D/5wlrb0z9dgERpUL3LrmPKVDsETIJhaCMeDfuFYcqa5bldGV6wBsAN6X/vxlXQtFBMrXdXxdL8CbDTGniw==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/fork-ts-checker-webpack-plugin": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.3.tgz", + "integrity": "sha512-SbH/l9ikmMWycd5puHJKTkZJKddF4iRLyW3DeZ08HTI7NGyLS38MXd/KGgeWumQO7YNQbW2u/NtPT2YowbPaGQ==", + "dependencies": { + "@babel/code-frame": "^7.8.3", + "@types/json-schema": "^7.0.5", + "chalk": "^4.1.0", + "chokidar": "^3.4.2", + "cosmiconfig": "^6.0.0", + "deepmerge": "^4.2.2", + "fs-extra": "^9.0.0", + "glob": "^7.1.6", + "memfs": "^3.1.2", + "minimatch": "^3.0.4", + "schema-utils": "2.7.0", + "semver": "^7.3.2", + "tapable": "^1.0.0" + }, + "engines": { + "node": ">=10", + "yarn": ">=1.0.0" + }, + "peerDependencies": { + "eslint": ">= 6", + "typescript": ">= 2.7", + "vue-template-compiler": "*", + "webpack": ">= 4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + }, + "vue-template-compiler": { + "optional": true + } + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", + "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.7.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz", + "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==", + "dependencies": { + "@types/json-schema": "^7.0.4", + "ajv": "^6.12.2", + "ajv-keywords": "^3.4.1" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/form-data-encoder": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.4.tgz", + "integrity": "sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==", + "engines": { + "node": ">= 14.17" + } + }, + "node_modules/format": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz", + "integrity": "sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==", + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fraction.js": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-extra": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/fs-monkey": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.5.tgz", + "integrity": "sha512-8uMbBjrhzW76TYgEV27Y5E//W2f/lTFmx78P2w19FZSxarhI/798APGQyuGCwmkNxgwGRhrLfvWyLBvNtuOmew==" + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", + "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", + "dependencies": { + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-own-enumerable-property-symbols": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", + "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==" + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/github-slugger": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-1.5.0.tgz", + "integrity": "sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw==" + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" + }, + "node_modules/global-dirs": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", + "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==", + "dependencies": { + "ini": "2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/global-dirs/node_modules/ini": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/global-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "dependencies": { + "global-prefix": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "dependencies": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/global-prefix/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/got": { + "version": "12.6.1", + "resolved": "https://registry.npmjs.org/got/-/got-12.6.1.tgz", + "integrity": "sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==", + "dependencies": { + "@sindresorhus/is": "^5.2.0", + "@szmarczak/http-timer": "^5.0.1", + "cacheable-lookup": "^7.0.0", + "cacheable-request": "^10.2.8", + "decompress-response": "^6.0.0", + "form-data-encoder": "^2.1.2", + "get-stream": "^6.0.1", + "http2-wrapper": "^2.1.10", + "lowercase-keys": "^3.0.0", + "p-cancelable": "^3.0.0", + "responselike": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" + } + }, + "node_modules/got/node_modules/@sindresorhus/is": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.6.0.tgz", + "integrity": "sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, + "node_modules/gray-matter": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz", + "integrity": "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==", + "dependencies": { + "js-yaml": "^3.13.1", + "kind-of": "^6.0.2", + "section-matter": "^1.0.0", + "strip-bom-string": "^1.0.0" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/gray-matter/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/gray-matter/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/gzip-size": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", + "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", + "dependencies": { + "duplexer": "^0.1.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", + "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", + "dependencies": { + "get-intrinsic": "^1.2.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-yarn": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-3.0.0.tgz", + "integrity": "sha512-IrsVwUHhEULx3R8f/aA8AHuEzAorplsab/v8HBzEiIukwq5i/EC+xmOW+HfP1OaDP+2JkgT1yILHN2O3UFIbcA==", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hast-util-from-parse5": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-8.0.1.tgz", + "integrity": "sha512-Er/Iixbc7IEa7r/XLtuG52zoqn/b3Xng/w6aZQ0xGVxzhw5xUFxcRqdPzP6yFi/4HBYRaifaI5fQ1RH8n0ZeOQ==", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "devlop": "^1.0.0", + "hastscript": "^8.0.0", + "property-information": "^6.0.0", + "vfile": "^6.0.0", + "vfile-location": "^5.0.0", + "web-namespaces": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-parse-selector": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz", + "integrity": "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-raw": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-9.0.1.tgz", + "integrity": "sha512-5m1gmba658Q+lO5uqL5YNGQWeh1MYWZbZmWrM5lncdcuiXuo5E2HT/CIOp0rLF8ksfSwiCVJ3twlgVRyTGThGA==", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "@ungap/structured-clone": "^1.0.0", + "hast-util-from-parse5": "^8.0.0", + "hast-util-to-parse5": "^8.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "parse5": "^7.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-estree": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hast-util-to-estree/-/hast-util-to-estree-3.1.0.tgz", + "integrity": "sha512-lfX5g6hqVh9kjS/B9E2gSkvHH4SZNiQFiqWS0x9fENzEl+8W12RqdRxX6d/Cwxi30tPQs3bIO+aolQJNp1bIyw==", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-attach-comments": "^3.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-object": "^0.4.0", + "unist-util-position": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-jsx-runtime": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.0.tgz", + "integrity": "sha512-H/y0+IWPdsLLS738P8tDnrQ8Z+dj12zQQ6WC11TIM21C8WFVoIxcqWXf2H3hiTVZjF1AWqoimGwrTWecWrnmRQ==", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-object": "^1.0.0", + "unist-util-position": "^5.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-jsx-runtime/node_modules/inline-style-parser": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.2.tgz", + "integrity": "sha512-EcKzdTHVe8wFVOGEYXiW9WmJXPjqi1T+234YpJr98RiFYKHV3cdy1+3mkTE+KHTHxFFLH51SfaGOoUdW+v7ViQ==" + }, + "node_modules/hast-util-to-jsx-runtime/node_modules/style-to-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.5.tgz", + "integrity": "sha512-rDRwHtoDD3UMMrmZ6BzOW0naTjMsVZLIjsGleSKS/0Oz+cgCfAPRspaqJuE8rDzpKha/nEvnM0IF4seEAZUTKQ==", + "dependencies": { + "inline-style-parser": "0.2.2" + } + }, + "node_modules/hast-util-to-parse5": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-8.0.0.tgz", + "integrity": "sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==", + "dependencies": { + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-whitespace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", + "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hastscript": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-8.0.0.tgz", + "integrity": "sha512-dMOtzCEd3ABUeSIISmrETiKuyydk1w0pa+gE/uormcTpSYuaNJPbX1NU3JLyscSLjwAQM8bWMhhIlnCqnRvDTw==", + "dependencies": { + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-parse-selector": "^4.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "bin": { + "he": "bin/he" + } + }, + "node_modules/history": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz", + "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==", + "dependencies": { + "@babel/runtime": "^7.1.2", + "loose-envify": "^1.2.0", + "resolve-pathname": "^3.0.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0", + "value-equal": "^1.0.1" + } + }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", + "dependencies": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "node_modules/hpack.js/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "node_modules/hpack.js/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/hpack.js/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/hpack.js/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/html-entities": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.4.0.tgz", + "integrity": "sha512-igBTJcNNNhvZFRtm8uA6xMY6xYleeDwn3PeBCkDz7tHttv4F2hsDI2aPgNERWzvRcNYHNT3ymRaQzllmXj4YsQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/mdevils" + }, + { + "type": "patreon", + "url": "https://patreon.com/mdevils" + } + ] + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==" + }, + "node_modules/html-minifier-terser": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-7.2.0.tgz", + "integrity": "sha512-tXgn3QfqPIpGl9o+K5tpcj3/MN4SfLtsx2GWwBC3SSd0tXQGyF3gsSqad8loJgKZGM3ZxbYDd5yhiBIdWpmvLA==", + "dependencies": { + "camel-case": "^4.1.2", + "clean-css": "~5.3.2", + "commander": "^10.0.0", + "entities": "^4.4.0", + "param-case": "^3.0.4", + "relateurl": "^0.2.7", + "terser": "^5.15.1" + }, + "bin": { + "html-minifier-terser": "cli.js" + }, + "engines": { + "node": "^14.13.1 || >=16.0.0" + } + }, + "node_modules/html-minifier-terser/node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "engines": { + "node": ">=14" + } + }, + "node_modules/html-tags": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz", + "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/html-void-elements": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", + "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/html-webpack-plugin": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.0.tgz", + "integrity": "sha512-iwaY4wzbe48AfKLZ/Cc8k0L+FKG6oSNRaZ8x5A/T/IVDGyXcbHncM9TdDa93wn0FsSm82FhTKW7f3vS61thXAw==", + "dependencies": { + "@types/html-minifier-terser": "^6.0.0", + "html-minifier-terser": "^6.0.2", + "lodash": "^4.17.21", + "pretty-error": "^4.0.0", + "tapable": "^2.0.0" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/html-webpack-plugin" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "webpack": "^5.20.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/html-webpack-plugin/node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "engines": { + "node": ">= 12" + } + }, + "node_modules/html-webpack-plugin/node_modules/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", + "dependencies": { + "camel-case": "^4.1.2", + "clean-css": "^5.2.2", + "commander": "^8.3.0", + "he": "^1.2.0", + "param-case": "^3.0.4", + "relateurl": "^0.2.7", + "terser": "^5.10.0" + }, + "bin": { + "html-minifier-terser": "cli.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/htmlparser2": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", + "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "entities": "^4.4.0" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==" + }, + "node_modules/http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==" + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-parser-js": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", + "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==" + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-proxy-middleware": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", + "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", + "dependencies": { + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "@types/express": "^4.17.13" + }, + "peerDependenciesMeta": { + "@types/express": { + "optional": true + } + } + }, + "node_modules/http-proxy-middleware/node_modules/is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/http2-wrapper": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.1.tgz", + "integrity": "sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==", + "dependencies": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.2.0" + }, + "engines": { + "node": ">=10.19.0" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/ignore": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", + "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/image-size": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.1.1.tgz", + "integrity": "sha512-541xKlUw6jr/6gGuk92F+mYM5zaFAc5ahphvkqvNe2bQ6gVBkd6bfrmVJ2t4KDAfikAYZyIqTnktX3i6/aQDrQ==", + "dependencies": { + "queue": "6.0.2" + }, + "bin": { + "image-size": "bin/image-size.js" + }, + "engines": { + "node": ">=16.x" + } + }, + "node_modules/immer": { + "version": "9.0.21", + "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz", + "integrity": "sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/immer" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-lazy": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", + "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/infima": { + "version": "0.2.0-alpha.43", + "resolved": "https://registry.npmjs.org/infima/-/infima-0.2.0-alpha.43.tgz", + "integrity": "sha512-2uw57LvUqW0rK/SWYnd/2rRfxNA5DDNOh33jxF7fy46VWoNhGxiUQyVZHbBMjQ33mQem0cjdDVwgWVAmlRfgyQ==", + "engines": { + "node": ">=12" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + }, + "node_modules/inline-style-parser": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz", + "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==" + }, + "node_modules/interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, + "node_modules/ipaddr.js": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.1.0.tgz", + "integrity": "sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ==", + "engines": { + "node": ">= 10" + } + }, + "node_modules/is-alphabetical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", + "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-alphanumerical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", + "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", + "dependencies": { + "is-alphabetical": "^2.0.0", + "is-decimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-ci": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", + "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", + "dependencies": { + "ci-info": "^3.2.0" + }, + "bin": { + "is-ci": "bin.js" + } + }, + "node_modules/is-core-module": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "dependencies": { + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-decimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", + "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-hexadecimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", + "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-installed-globally": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", + "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", + "dependencies": { + "global-dirs": "^3.0.0", + "is-path-inside": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-npm": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-6.0.0.tgz", + "integrity": "sha512-JEjxbSmtPSt1c8XTkVrlujcXdKV1/tvuQ7GwKcAlyiVLeYFQ2VHat8xfrDJsIkhCdF/tZ7CiIR3sy141c6+gPQ==", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-path-cwd": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-reference": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.2.tgz", + "integrity": "sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==", + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/is-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", + "integrity": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-root": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz", + "integrity": "sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-yarn-global": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.4.1.tgz", + "integrity": "sha512-/kppl+R+LO5VmhYSEWARUFjodS25D68gvj8W7z0I7OWhUla5xWu8KL6CtB2V0R6yqhnRgbcaREMr4EEM6htLPQ==", + "engines": { + "node": ">=12" + } + }, + "node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "dependencies": { + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/jiti": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz", + "integrity": "sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==", + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/joi": { + "version": "17.11.0", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.11.0.tgz", + "integrity": "sha512-NgB+lZLNoqISVy1rZocE9PZI36bL/77ie924Ri43yEvi9GUUMPeyVIr8KdFTMUlby1p0PBYMk9spIxEUQYqrJQ==", + "dependencies": { + "@hapi/hoek": "^9.0.0", + "@hapi/topo": "^5.0.0", + "@sideway/address": "^4.1.3", + "@sideway/formula": "^3.0.1", + "@sideway/pinpoint": "^2.0.0" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "engines": { + "node": ">=6" + } + }, + "node_modules/latest-version": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-7.0.0.tgz", + "integrity": "sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg==", + "dependencies": { + "package-json": "^8.1.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/launch-editor": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.6.1.tgz", + "integrity": "sha512-eB/uXmFVpY4zezmGp5XtU21kwo7GBbKB+EQ+UZeWtGb9yAM5xt/Evk+lYH3eRNAtId+ej4u7TYPFZ07w4s7rRw==", + "dependencies": { + "picocolors": "^1.0.0", + "shell-quote": "^1.8.1" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "engines": { + "node": ">=10" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" + }, + "node_modules/loader-runner": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "engines": { + "node": ">=6.11.5" + } + }, + "node_modules/loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/locate-path": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", + "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", + "dependencies": { + "p-locate": "^6.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==" + }, + "node_modules/lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==" + }, + "node_modules/longest-streak": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", + "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/lowercase-keys": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", + "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/markdown-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/markdown-extensions/-/markdown-extensions-2.0.0.tgz", + "integrity": "sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/markdown-table": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.3.tgz", + "integrity": "sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/mdast-util-directive": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-directive/-/mdast-util-directive-3.0.0.tgz", + "integrity": "sha512-JUpYOqKI4mM3sZcNxmF/ox04XYFFkNwr0CFlrQIkCwbvH0xzMCqkMqAde9wRd80VAhaUrwFwKm2nxretdT1h7Q==", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "parse-entities": "^4.0.0", + "stringify-entities": "^4.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-find-and-replace": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.1.tgz", + "integrity": "sha512-SG21kZHGC3XRTSUhtofZkBzZTJNM5ecCi0SK2IMKmSXR8vO3peL+kb1O0z7Zl83jKtutG4k5Wv/W7V3/YHvzPA==", + "dependencies": { + "@types/mdast": "^4.0.0", + "escape-string-regexp": "^5.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-find-and-replace/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mdast-util-from-markdown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.0.tgz", + "integrity": "sha512-n7MTOr/z+8NAX/wmhhDji8O3bRvPTV/U0oTCaZJkjhPSKTPhS3xufVhKGF8s1pJ7Ox4QgoIU7KHseh09S+9rTA==", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark": "^4.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-from-markdown/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/mdast-util-frontmatter": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-frontmatter/-/mdast-util-frontmatter-2.0.1.tgz", + "integrity": "sha512-LRqI9+wdgC25P0URIJY9vwocIzCcksduHQ9OF2joxQoyTNVduwLAFUzjoopuRJbJAReaKrNQKAZKL3uCMugWJA==", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "escape-string-regexp": "^5.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "micromark-extension-frontmatter": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-frontmatter/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mdast-util-gfm": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.0.0.tgz", + "integrity": "sha512-dgQEX5Amaq+DuUqf26jJqSK9qgixgd6rYDHAv4aTBuA92cTknZlKpPfa86Z/s8Dj8xsAQpFfBmPUHWJBWqS4Bw==", + "dependencies": { + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-gfm-autolink-literal": "^2.0.0", + "mdast-util-gfm-footnote": "^2.0.0", + "mdast-util-gfm-strikethrough": "^2.0.0", + "mdast-util-gfm-table": "^2.0.0", + "mdast-util-gfm-task-list-item": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-autolink-literal": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.0.tgz", + "integrity": "sha512-FyzMsduZZHSc3i0Px3PQcBT4WJY/X/RCtEJKuybiC6sjPqLv7h1yqAkmILZtuxMSsUyaLUWNp71+vQH2zqp5cg==", + "dependencies": { + "@types/mdast": "^4.0.0", + "ccount": "^2.0.0", + "devlop": "^1.0.0", + "mdast-util-find-and-replace": "^3.0.0", + "micromark-util-character": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-autolink-literal/node_modules/micromark-util-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz", + "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-autolink-literal/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/mdast-util-gfm-footnote": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.0.0.tgz", + "integrity": "sha512-5jOT2boTSVkMnQ7LTrd6n/18kqwjmuYqo7JUPe+tRCY6O7dAuTFMtTPauYYrMPpox9hlN0uOx/FL8XvEfG9/mQ==", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-strikethrough": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz", + "integrity": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-table": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz", + "integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "markdown-table": "^3.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-task-list-item": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz", + "integrity": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-mdx/-/mdast-util-mdx-3.0.0.tgz", + "integrity": "sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==", + "dependencies": { + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-expression": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.0.tgz", + "integrity": "sha512-fGCu8eWdKUKNu5mohVGkhBXCXGnOTLuFqOvGMvdikr+J1w7lDJgxThOKpwRWzzbyXAU2hhSwsmssOY4yTokluw==", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-jsx": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.0.0.tgz", + "integrity": "sha512-XZuPPzQNBPAlaqsTTgRrcJnyFbSOBovSadFgbFu8SnuNgm+6Bdx1K+IWoitsmj6Lq6MNtI+ytOqwN70n//NaBA==", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "parse-entities": "^4.0.0", + "stringify-entities": "^4.0.0", + "unist-util-remove-position": "^5.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdxjs-esm": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz", + "integrity": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-phrasing": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.0.0.tgz", + "integrity": "sha512-xadSsJayQIucJ9n053dfQwVu1kuXg7jCTdYsMK8rqzKZh52nLfSH/k0sAxE0u+pj/zKZX+o5wB+ML5mRayOxFA==", + "dependencies": { + "@types/mdast": "^4.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-hast": { + "version": "13.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.0.2.tgz", + "integrity": "sha512-U5I+500EOOw9e3ZrclN3Is3fRpw8c19SMyNZlZ2IS+7vLsNzb2Om11VpIVOR+/0137GhZsFEF6YiKD5+0Hr2Og==", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.0.tgz", + "integrity": "sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "longest-streak": "^3.0.0", + "mdast-util-phrasing": "^4.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark-util-decode-string": "^2.0.0", + "unist-util-visit": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", + "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", + "dependencies": { + "@types/mdast": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==" + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memfs": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", + "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", + "dependencies": { + "fs-monkey": "^1.0.4" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromark": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.0.tgz", + "integrity": "sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.0.tgz", + "integrity": "sha512-jThOz/pVmAYUtkroV3D5c1osFXAMv9e0ypGDOIZuCeAe91/sD6BoE2Sjzt30yuXtwOYUmySOhMas/PVyh02itA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-destination": "^2.0.0", + "micromark-factory-label": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-title": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-html-tag-name": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark/node_modules/micromark-factory-space": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", + "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark/node_modules/micromark-util-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz", + "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-extension-directive": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-directive/-/micromark-extension-directive-3.0.0.tgz", + "integrity": "sha512-61OI07qpQrERc+0wEysLHMvoiO3s2R56x5u7glHq2Yqq6EHbH4dW25G9GfDdGCDYqA21KE6DWgNSzxSwHc2hSg==", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "parse-entities": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-directive/node_modules/micromark-factory-space": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", + "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-directive/node_modules/micromark-util-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz", + "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-directive/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-extension-frontmatter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-frontmatter/-/micromark-extension-frontmatter-2.0.0.tgz", + "integrity": "sha512-C4AkuM3dA58cgZha7zVnuVxBhDsbttIMiytjgsM2XbHAB2faRVaHRle40558FBN+DJcrLNCoqG5mlrpdU4cRtg==", + "dependencies": { + "fault": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-frontmatter/node_modules/micromark-util-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz", + "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-frontmatter/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-extension-gfm": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz", + "integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==", + "dependencies": { + "micromark-extension-gfm-autolink-literal": "^2.0.0", + "micromark-extension-gfm-footnote": "^2.0.0", + "micromark-extension-gfm-strikethrough": "^2.0.0", + "micromark-extension-gfm-table": "^2.0.0", + "micromark-extension-gfm-tagfilter": "^2.0.0", + "micromark-extension-gfm-task-list-item": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-autolink-literal": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.0.0.tgz", + "integrity": "sha512-rTHfnpt/Q7dEAK1Y5ii0W8bhfJlVJFnJMHIPisfPK3gpVNuOP0VnRl96+YJ3RYWV/P4gFeQoGKNlT3RhuvpqAg==", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-autolink-literal/node_modules/micromark-util-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz", + "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-autolink-literal/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-extension-gfm-footnote": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.0.0.tgz", + "integrity": "sha512-6Rzu0CYRKDv3BfLAUnZsSlzx3ak6HAoI85KTiijuKIz5UxZxbUI+pD6oHgw+6UtQuiRwnGRhzMmPRv4smcz0fg==", + "dependencies": { + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-factory-space": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", + "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-util-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz", + "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-extension-gfm-strikethrough": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.0.0.tgz", + "integrity": "sha512-c3BR1ClMp5fxxmwP6AoOY2fXO9U8uFMKs4ADD66ahLTNcwzSCyRVU4k7LPV5Nxo/VJiR4TdzxRQY2v3qIUceCw==", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-strikethrough/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-extension-gfm-table": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.0.0.tgz", + "integrity": "sha512-PoHlhypg1ItIucOaHmKE8fbin3vTLpDOUg8KAr8gRCF1MOZI9Nquq2i/44wFvviM4WuxJzc3demT8Y3dkfvYrw==", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-table/node_modules/micromark-factory-space": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", + "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-table/node_modules/micromark-util-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz", + "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-table/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-extension-gfm-tagfilter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz", + "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==", + "dependencies": { + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-task-list-item": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.0.1.tgz", + "integrity": "sha512-cY5PzGcnULaN5O7T+cOzfMoHjBW7j+T9D2sucA5d/KbsBTPcYdebm9zUd9zzdgJGCwahV+/W78Z3nbulBYVbTw==", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-task-list-item/node_modules/micromark-factory-space": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", + "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-task-list-item/node_modules/micromark-util-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz", + "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-task-list-item/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-extension-mdx-expression": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-expression/-/micromark-extension-mdx-expression-3.0.0.tgz", + "integrity": "sha512-sI0nwhUDz97xyzqJAbHQhp5TfaxEvZZZ2JDqUo+7NvyIYG6BZ5CPPqj2ogUoPJlmXHBnyZUzISg9+oUmU6tUjQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-mdx-expression": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-mdx-expression/node_modules/micromark-factory-space": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", + "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-mdx-expression/node_modules/micromark-util-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz", + "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-mdx-expression/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-extension-mdx-jsx": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-3.0.0.tgz", + "integrity": "sha512-uvhhss8OGuzR4/N17L1JwvmJIpPhAd8oByMawEKx6NVdBCbesjH4t+vjEp3ZXft9DwvlKSD07fCeI44/N0Vf2w==", + "dependencies": { + "@types/acorn": "^4.0.0", + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "micromark-factory-mdx-expression": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdx-jsx/node_modules/micromark-factory-space": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", + "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-mdx-jsx/node_modules/micromark-util-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz", + "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-mdx-jsx/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-extension-mdx-md": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-md/-/micromark-extension-mdx-md-2.0.0.tgz", + "integrity": "sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==", + "dependencies": { + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdxjs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs/-/micromark-extension-mdxjs-3.0.0.tgz", + "integrity": "sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==", + "dependencies": { + "acorn": "^8.0.0", + "acorn-jsx": "^5.0.0", + "micromark-extension-mdx-expression": "^3.0.0", + "micromark-extension-mdx-jsx": "^3.0.0", + "micromark-extension-mdx-md": "^2.0.0", + "micromark-extension-mdxjs-esm": "^3.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdxjs-esm": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs-esm/-/micromark-extension-mdxjs-esm-3.0.0.tgz", + "integrity": "sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-position-from-estree": "^2.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdxjs-esm/node_modules/micromark-util-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz", + "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-mdxjs-esm/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-factory-destination": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.0.tgz", + "integrity": "sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-destination/node_modules/micromark-util-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz", + "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-destination/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-factory-label": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.0.tgz", + "integrity": "sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-label/node_modules/micromark-util-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz", + "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-label/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-factory-mdx-expression": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-mdx-expression/-/micromark-factory-mdx-expression-2.0.1.tgz", + "integrity": "sha512-F0ccWIUHRLRrYp5TC9ZYXmZo+p2AM13ggbsW4T0b5CRKP8KHVRB8t4pwtBgTxtjRmwrK0Irwm7vs2JOZabHZfg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-position-from-estree": "^2.0.0", + "vfile-message": "^4.0.0" + } + }, + "node_modules/micromark-factory-mdx-expression/node_modules/micromark-util-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz", + "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-mdx-expression/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-factory-space": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-1.1.0.tgz", + "integrity": "sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-factory-space/node_modules/micromark-util-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz", + "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-factory-title": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.0.tgz", + "integrity": "sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-title/node_modules/micromark-factory-space": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", + "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-title/node_modules/micromark-util-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz", + "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-title/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-factory-whitespace": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.0.tgz", + "integrity": "sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-whitespace/node_modules/micromark-factory-space": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", + "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-whitespace/node_modules/micromark-util-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz", + "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-whitespace/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-character": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.2.0.tgz", + "integrity": "sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-util-character/node_modules/micromark-util-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz", + "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-chunked": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.0.tgz", + "integrity": "sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-chunked/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-classify-character": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.0.tgz", + "integrity": "sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-classify-character/node_modules/micromark-util-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz", + "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-classify-character/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-combine-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.0.tgz", + "integrity": "sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.1.tgz", + "integrity": "sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-numeric-character-reference/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-decode-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.0.tgz", + "integrity": "sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-string/node_modules/micromark-util-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz", + "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-string/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-encode": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.0.tgz", + "integrity": "sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-events-to-acorn": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-events-to-acorn/-/micromark-util-events-to-acorn-2.0.2.tgz", + "integrity": "sha512-Fk+xmBrOv9QZnEDguL9OI9/NQQp6Hz4FuQ4YmCb/5V7+9eAh1s6AYSvL20kHkD67YIg7EpE54TiSlcsf3vyZgA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "@types/acorn": "^4.0.0", + "@types/estree": "^1.0.0", + "@types/unist": "^3.0.0", + "devlop": "^1.0.0", + "estree-util-visit": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "vfile-message": "^4.0.0" + } + }, + "node_modules/micromark-util-events-to-acorn/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-html-tag-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.0.tgz", + "integrity": "sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-normalize-identifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.0.tgz", + "integrity": "sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-normalize-identifier/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-resolve-all": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.0.tgz", + "integrity": "sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.0.tgz", + "integrity": "sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri/node_modules/micromark-util-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz", + "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-subtokenize": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.0.0.tgz", + "integrity": "sha512-vc93L1t+gpR3p8jxeVdaYlbV2jTYteDje19rNSS/H5dlhxUYll5Fy6vJ2cDwP8RnsXi818yGty1ayP55y3W6fg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-subtokenize/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-symbol": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz", + "integrity": "sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.0.tgz", + "integrity": "sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark/node_modules/micromark-factory-space": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", + "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark/node_modules/micromark-util-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz", + "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", + "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.18", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", + "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", + "dependencies": { + "mime-db": "~1.33.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/mimic-response": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz", + "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mini-css-extract-plugin": { + "version": "2.7.6", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.6.tgz", + "integrity": "sha512-Qk7HcgaPkGG6eD77mLvZS1nmxlao3j+9PkrT9Uc7HAE1id3F41+DdBRYRYkbyfNRGzm8/YWtzhw7nVPmwhqTQw==", + "dependencies": { + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mrmime": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.0.tgz", + "integrity": "sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==", + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/multicast-dns": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", + "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", + "dependencies": { + "dns-packet": "^5.2.2", + "thunky": "^1.0.2" + }, + "bin": { + "multicast-dns": "cli.js" + } + }, + "node_modules/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" + }, + "node_modules/no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "node_modules/node-emoji": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-2.1.3.tgz", + "integrity": "sha512-E2WEOVsgs7O16zsURJ/eH8BqhF029wGpEOnv7Urwdo2wmQanOACwJQh0devF9D9RhoZru0+9JXIS0dBXIAz+lA==", + "dependencies": { + "@sindresorhus/is": "^4.6.0", + "char-regex": "^1.0.2", + "emojilib": "^2.4.0", + "skin-tone": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/node-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "engines": { + "node": ">= 6.13.0" + } + }, + "node_modules/node-releases": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-url": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nprogress": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/nprogress/-/nprogress-0.2.0.tgz", + "integrity": "sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==" + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==" + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/opener": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", + "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", + "bin": { + "opener": "bin/opener-bin.js" + } + }, + "node_modules/p-cancelable": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", + "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", + "engines": { + "node": ">=12.20" + } + }, + "node_modules/p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", + "dependencies": { + "p-limit": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-retry": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", + "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", + "dependencies": { + "@types/retry": "0.12.0", + "retry": "^0.13.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/package-json": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-8.1.1.tgz", + "integrity": "sha512-cbH9IAIJHNj9uXi196JVsRlt7cHKak6u/e6AkL/bkRelZ7rlL3X1YKxsZwa36xipOEKAsdtmaG6aAJoM1fx2zA==", + "dependencies": { + "got": "^12.1.0", + "registry-auth-token": "^5.0.1", + "registry-url": "^6.0.0", + "semver": "^7.3.7" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/param-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-entities": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.1.tgz", + "integrity": "sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==", + "dependencies": { + "@types/unist": "^2.0.0", + "character-entities": "^2.0.0", + "character-entities-legacy": "^3.0.0", + "character-reference-invalid": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "is-alphanumerical": "^2.0.0", + "is-decimal": "^2.0.0", + "is-hexadecimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/parse-entities/node_modules/@types/unist": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz", + "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==" + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse-numeric-range": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/parse-numeric-range/-/parse-numeric-range-1.3.0.tgz", + "integrity": "sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==" + }, + "node_modules/parse5": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "dependencies": { + "entities": "^4.4.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-htmlparser2-tree-adapter": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz", + "integrity": "sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==", + "dependencies": { + "domhandler": "^5.0.2", + "parse5": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/path-exists": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==" + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "node_modules/path-to-regexp": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", + "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", + "dependencies": { + "isarray": "0.0.1" + } + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/periscopic": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/periscopic/-/periscopic-3.1.0.tgz", + "integrity": "sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^3.0.0", + "is-reference": "^3.0.0" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pkg-dir": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz", + "integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==", + "dependencies": { + "find-up": "^6.3.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-up": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", + "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-up/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-up/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss": { + "version": "8.4.32", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.32.tgz", + "integrity": "sha512-D/kj5JNu6oo2EIy+XL/26JEDTlIbB8hw85G8StOE6L74RQAVVP5rej6wxCNqyMbR4RkPfqvezVbPw81Ngd6Kcw==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-calc": { + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.4.tgz", + "integrity": "sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==", + "dependencies": { + "postcss-selector-parser": "^6.0.9", + "postcss-value-parser": "^4.2.0" + }, + "peerDependencies": { + "postcss": "^8.2.2" + } + }, + "node_modules/postcss-colormin": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.1.tgz", + "integrity": "sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ==", + "dependencies": { + "browserslist": "^4.21.4", + "caniuse-api": "^3.0.0", + "colord": "^2.9.1", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-convert-values": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.3.tgz", + "integrity": "sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==", + "dependencies": { + "browserslist": "^4.21.4", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-discard-comments": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz", + "integrity": "sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-discard-duplicates": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz", + "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-discard-empty": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz", + "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-discard-overridden": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz", + "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-discard-unused": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-5.1.0.tgz", + "integrity": "sha512-KwLWymI9hbwXmJa0dkrzpRbSJEh0vVUd7r8t0yOGPcfKzyJJxFM8kLyC5Ev9avji6nY95pOp1W6HqIrfT+0VGw==", + "dependencies": { + "postcss-selector-parser": "^6.0.5" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-loader": { + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.3.4.tgz", + "integrity": "sha512-iW5WTTBSC5BfsBJ9daFMPVrLT36MrNiC6fqOZTTaHjBNX6Pfd5p+hSBqe/fEeNd7pc13QiAyGt7VdGMw4eRC4A==", + "dependencies": { + "cosmiconfig": "^8.3.5", + "jiti": "^1.20.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "postcss": "^7.0.0 || ^8.0.1", + "webpack": "^5.0.0" + } + }, + "node_modules/postcss-loader/node_modules/cosmiconfig": { + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", + "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", + "dependencies": { + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0", + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/postcss-merge-idents": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-5.1.1.tgz", + "integrity": "sha512-pCijL1TREiCoog5nQp7wUe+TUonA2tC2sQ54UGeMmryK3UFGIYKqDyjnqd6RcuI4znFn9hWSLNN8xKE/vWcUQw==", + "dependencies": { + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-merge-longhand": { + "version": "5.1.7", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.7.tgz", + "integrity": "sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==", + "dependencies": { + "postcss-value-parser": "^4.2.0", + "stylehacks": "^5.1.1" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-merge-rules": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.4.tgz", + "integrity": "sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g==", + "dependencies": { + "browserslist": "^4.21.4", + "caniuse-api": "^3.0.0", + "cssnano-utils": "^3.1.0", + "postcss-selector-parser": "^6.0.5" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-font-values": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz", + "integrity": "sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-gradients": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz", + "integrity": "sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==", + "dependencies": { + "colord": "^2.9.1", + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-params": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.4.tgz", + "integrity": "sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==", + "dependencies": { + "browserslist": "^4.21.4", + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-selectors": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz", + "integrity": "sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==", + "dependencies": { + "postcss-selector-parser": "^6.0.5" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-modules-extract-imports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", + "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-local-by-default": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.3.tgz", + "integrity": "sha512-2/u2zraspoACtrbFRnTijMiQtb4GW4BvatjaG/bCjYQo8kLTdevCUlwuBHx2sCnSyrI3x3qj4ZK1j5LQBgzmwA==", + "dependencies": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-scope": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.1.0.tgz", + "integrity": "sha512-SaIbK8XW+MZbd0xHPf7kdfA/3eOt7vxJ72IRecn3EzuZVLr1r0orzf0MX/pN8m+NMDoo6X/SQd8oeKqGZd8PXg==", + "dependencies": { + "postcss-selector-parser": "^6.0.4" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "dependencies": { + "icss-utils": "^5.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-normalize-charset": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz", + "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-display-values": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz", + "integrity": "sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-positions": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz", + "integrity": "sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-repeat-style": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz", + "integrity": "sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-string": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz", + "integrity": "sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-timing-functions": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz", + "integrity": "sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-unicode": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.1.tgz", + "integrity": "sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==", + "dependencies": { + "browserslist": "^4.21.4", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-url": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz", + "integrity": "sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==", + "dependencies": { + "normalize-url": "^6.0.1", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-whitespace": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz", + "integrity": "sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-ordered-values": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz", + "integrity": "sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==", + "dependencies": { + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-reduce-idents": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-5.2.0.tgz", + "integrity": "sha512-BTrLjICoSB6gxbc58D5mdBK8OhXRDqud/zodYfdSi52qvDHdMwk+9kB9xsM8yJThH/sZU5A6QVSmMmaN001gIg==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-reduce-initial": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.2.tgz", + "integrity": "sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg==", + "dependencies": { + "browserslist": "^4.21.4", + "caniuse-api": "^3.0.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-reduce-transforms": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz", + "integrity": "sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.15", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.15.tgz", + "integrity": "sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-sort-media-queries": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/postcss-sort-media-queries/-/postcss-sort-media-queries-4.4.1.tgz", + "integrity": "sha512-QDESFzDDGKgpiIh4GYXsSy6sek2yAwQx1JASl5AxBtU1Lq2JfKBljIPNdil989NcSKRQX1ToiaKphImtBuhXWw==", + "dependencies": { + "sort-css-media-queries": "2.1.0" + }, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "postcss": "^8.4.16" + } + }, + "node_modules/postcss-svgo": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.1.0.tgz", + "integrity": "sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==", + "dependencies": { + "postcss-value-parser": "^4.2.0", + "svgo": "^2.7.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-unique-selectors": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz", + "integrity": "sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==", + "dependencies": { + "postcss-selector-parser": "^6.0.5" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" + }, + "node_modules/postcss-zindex": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-5.1.0.tgz", + "integrity": "sha512-fgFMf0OtVSBR1va1JNHYgMxYk73yhn/qb4uQDq1DLGYolz8gHCyr/sesEuGUaYs58E3ZJRcpoGuPVoB7Meiq9A==", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/pretty-error": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", + "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", + "dependencies": { + "lodash": "^4.17.20", + "renderkid": "^3.0.0" + } + }, + "node_modules/pretty-time": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pretty-time/-/pretty-time-1.1.0.tgz", + "integrity": "sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/prism-react-renderer": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/prism-react-renderer/-/prism-react-renderer-2.3.1.tgz", + "integrity": "sha512-Rdf+HzBLR7KYjzpJ1rSoxT9ioO85nZngQEoFIhL07XhtJHlCU3SOz0GJ6+qvMyQe0Se+BV3qpe6Yd/NmQF5Juw==", + "dependencies": { + "@types/prismjs": "^1.26.0", + "clsx": "^2.0.0" + }, + "peerDependencies": { + "react": ">=16.0.0" + } + }, + "node_modules/prismjs": { + "version": "1.29.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz", + "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==", + "engines": { + "node": ">=6" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/property-information": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.4.0.tgz", + "integrity": "sha512-9t5qARVofg2xQqKtytzt+lZ4d1Qvj8t5B8fEwXK6qOfgRLgH/b13QlgEyDh033NOS31nXeFbYv7CLUDG1CeifQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/proto-list": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", + "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==" + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-addr/node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==" + }, + "node_modules/pupa": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pupa/-/pupa-3.1.0.tgz", + "integrity": "sha512-FLpr4flz5xZTSJxSeaheeMKN/EDzMdK7b8PTOC6a5PYFKTucWbdqjgqaEyH0shFiSJrVB1+Qqi4Tk19ccU6Aug==", + "dependencies": { + "escape-goat": "^4.0.0" + }, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/queue": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz", + "integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==", + "dependencies": { + "inherits": "~2.0.3" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", + "integrity": "sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/rc/node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dev-utils": { + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-12.0.1.tgz", + "integrity": "sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ==", + "dependencies": { + "@babel/code-frame": "^7.16.0", + "address": "^1.1.2", + "browserslist": "^4.18.1", + "chalk": "^4.1.2", + "cross-spawn": "^7.0.3", + "detect-port-alt": "^1.1.6", + "escape-string-regexp": "^4.0.0", + "filesize": "^8.0.6", + "find-up": "^5.0.0", + "fork-ts-checker-webpack-plugin": "^6.5.0", + "global-modules": "^2.0.0", + "globby": "^11.0.4", + "gzip-size": "^6.0.0", + "immer": "^9.0.7", + "is-root": "^2.1.0", + "loader-utils": "^3.2.0", + "open": "^8.4.0", + "pkg-up": "^3.1.0", + "prompts": "^2.4.2", + "react-error-overlay": "^6.0.11", + "recursive-readdir": "^2.2.2", + "shell-quote": "^1.7.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/react-dev-utils/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/react-dev-utils/node_modules/loader-utils": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.1.tgz", + "integrity": "sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==", + "engines": { + "node": ">= 12.13.0" + } + }, + "node_modules/react-dev-utils/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/react-dev-utils/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/react-dev-utils/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/react-dev-utils/node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/react-dev-utils/node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/react-dom": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", + "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.0" + }, + "peerDependencies": { + "react": "^18.2.0" + } + }, + "node_modules/react-error-overlay": { + "version": "6.0.11", + "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.11.tgz", + "integrity": "sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg==" + }, + "node_modules/react-fast-compare": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.2.tgz", + "integrity": "sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==" + }, + "node_modules/react-helmet-async": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/react-helmet-async/-/react-helmet-async-1.3.0.tgz", + "integrity": "sha512-9jZ57/dAn9t3q6hneQS0wukqC2ENOBgMNVEhb/ZG9ZSxUetzVIw4iAmEU38IaVg3QGYauQPhSeUTuIUtFglWpg==", + "dependencies": { + "@babel/runtime": "^7.12.5", + "invariant": "^2.2.4", + "prop-types": "^15.7.2", + "react-fast-compare": "^3.2.0", + "shallowequal": "^1.1.0" + }, + "peerDependencies": { + "react": "^16.6.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.6.0 || ^17.0.0 || ^18.0.0" + } + }, + "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-json-view-lite": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/react-json-view-lite/-/react-json-view-lite-1.2.1.tgz", + "integrity": "sha512-Itc0g86fytOmKZoIoJyGgvNqohWSbh3NXIKNgH6W6FT9PC1ck4xas1tT3Rr/b3UlFXyA9Jjaw9QSXdZy2JwGMQ==", + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "react": "^16.13.1 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/react-loadable": { + "name": "@docusaurus/react-loadable", + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-5.5.2.tgz", + "integrity": "sha512-A3dYjdBGuy0IGT+wyLIGIKLRE+sAk1iNk0f1HjNDysO7u8lhL4N3VEm+FAubmJbAztn94F7MxBTPmnixbiyFdQ==", + "dependencies": { + "@types/react": "*", + "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": "*" + } + }, + "node_modules/react-loadable-ssr-addon-v5-slorber": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/react-loadable-ssr-addon-v5-slorber/-/react-loadable-ssr-addon-v5-slorber-1.0.1.tgz", + "integrity": "sha512-lq3Lyw1lGku8zUEJPDxsNm1AfYHBrO9Y1+olAYwpUJ2IGFBskM0DMKok97A6LWUpHm+o7IvQBOWu9MLenp9Z+A==", + "dependencies": { + "@babel/runtime": "^7.10.3" + }, + "engines": { + "node": ">=10.13.0" + }, + "peerDependencies": { + "react-loadable": "*", + "webpack": ">=4.41.1 || 5.x" + } + }, + "node_modules/react-router": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.3.4.tgz", + "integrity": "sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA==", + "dependencies": { + "@babel/runtime": "^7.12.13", + "history": "^4.9.0", + "hoist-non-react-statics": "^3.1.0", + "loose-envify": "^1.3.1", + "path-to-regexp": "^1.7.0", + "prop-types": "^15.6.2", + "react-is": "^16.6.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0" + }, + "peerDependencies": { + "react": ">=15" + } + }, + "node_modules/react-router-config": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/react-router-config/-/react-router-config-5.1.1.tgz", + "integrity": "sha512-DuanZjaD8mQp1ppHjgnnUnyOlqYXZVjnov/JzFhjLEwd3Z4dYjMSnqrEzzGThH47vpCOqPPwJM2FtthLeJ8Pbg==", + "dependencies": { + "@babel/runtime": "^7.1.2" + }, + "peerDependencies": { + "react": ">=15", + "react-router": ">=5" + } + }, + "node_modules/react-router-dom": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.3.4.tgz", + "integrity": "sha512-m4EqFMHv/Ih4kpcBCONHbkT68KoAeHN4p3lAGoNryfHi0dMy0kCzEZakiKRsvg5wHZ/JLrLW8o8KomWiz/qbYQ==", + "dependencies": { + "@babel/runtime": "^7.12.13", + "history": "^4.9.0", + "loose-envify": "^1.3.1", + "prop-types": "^15.6.2", + "react-router": "5.3.4", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0" + }, + "peerDependencies": { + "react": ">=15" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/reading-time": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/reading-time/-/reading-time-1.5.0.tgz", + "integrity": "sha512-onYyVhBNr4CmAxFsKS7bz+uTLRakypIe4R+5A824vBSkQy/hB3fZepoVEf8OVAxzLvK+H/jm9TzpI3ETSm64Kg==" + }, + "node_modules/rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "dependencies": { + "resolve": "^1.1.6" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/recursive-readdir": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz", + "integrity": "sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==", + "dependencies": { + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==" + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz", + "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==", + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" + }, + "node_modules/regenerator-transform": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", + "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", + "dependencies": { + "@babel/runtime": "^7.8.4" + } + }, + "node_modules/regexpu-core": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", + "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", + "dependencies": { + "@babel/regjsgen": "^0.8.0", + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.1.0", + "regjsparser": "^0.9.1", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/registry-auth-token": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.0.2.tgz", + "integrity": "sha512-o/3ikDxtXaA59BmZuZrJZDJv8NMDGSj+6j6XaeBmHw8eY1i1qd9+6H+LjVvQXx3HN6aRCGa1cUdJ9RaJZUugnQ==", + "dependencies": { + "@pnpm/npm-conf": "^2.1.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/registry-url": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-6.0.1.tgz", + "integrity": "sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q==", + "dependencies": { + "rc": "1.2.8" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/regjsparser": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", + "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", + "dependencies": { + "jsesc": "~0.5.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/regjsparser/node_modules/jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", + "bin": { + "jsesc": "bin/jsesc" + } + }, + "node_modules/rehype-raw": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/rehype-raw/-/rehype-raw-7.0.0.tgz", + "integrity": "sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-raw": "^9.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/remark-directive": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/remark-directive/-/remark-directive-3.0.0.tgz", + "integrity": "sha512-l1UyWJ6Eg1VPU7Hm/9tt0zKtReJQNOA4+iDMAxTyZNWnJnFlbS/7zhiel/rogTLQ2vMYwDzSJa4BiVNqGlqIMA==", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-directive": "^3.0.0", + "micromark-extension-directive": "^3.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-emoji": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/remark-emoji/-/remark-emoji-4.0.1.tgz", + "integrity": "sha512-fHdvsTR1dHkWKev9eNyhTo4EFwbUvJ8ka9SgeWkMPYFX4WoI7ViVBms3PjlQYgw5TLvNQso3GUB/b/8t3yo+dg==", + "dependencies": { + "@types/mdast": "^4.0.2", + "emoticon": "^4.0.1", + "mdast-util-find-and-replace": "^3.0.1", + "node-emoji": "^2.1.0", + "unified": "^11.0.4" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/remark-frontmatter": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/remark-frontmatter/-/remark-frontmatter-5.0.0.tgz", + "integrity": "sha512-XTFYvNASMe5iPN0719nPrdItC9aU0ssC4v14mH1BCi1u0n1gAocqcujWUrByftZTbLhRtiKRyjYTSIOcr69UVQ==", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-frontmatter": "^2.0.0", + "micromark-extension-frontmatter": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-gfm": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.0.tgz", + "integrity": "sha512-U92vJgBPkbw4Zfu/IiW2oTZLSL3Zpv+uI7My2eq8JxKgqraFdU8YUGicEJCEgSbeaG+QDFqIcwwfMTOEelPxuA==", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-gfm": "^3.0.0", + "micromark-extension-gfm": "^3.0.0", + "remark-parse": "^11.0.0", + "remark-stringify": "^11.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-mdx": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-3.0.0.tgz", + "integrity": "sha512-O7yfjuC6ra3NHPbRVxfflafAj3LTwx3b73aBvkEFU5z4PsD6FD4vrqJAkE5iNGLz71GdjXfgRqm3SQ0h0VuE7g==", + "dependencies": { + "mdast-util-mdx": "^3.0.0", + "micromark-extension-mdxjs": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-parse": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", + "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-rehype": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.0.0.tgz", + "integrity": "sha512-vx8x2MDMcxuE4lBmQ46zYUDfcFMmvg80WYX+UNLeG6ixjdCCLcw1lrgAukwBTuOFsS78eoAedHGn9sNM0w7TPw==", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "mdast-util-to-hast": "^13.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-stringify": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-11.0.0.tgz", + "integrity": "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-to-markdown": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/renderkid": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", + "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", + "dependencies": { + "css-select": "^4.1.3", + "dom-converter": "^0.2.0", + "htmlparser2": "^6.1.0", + "lodash": "^4.17.21", + "strip-ansi": "^6.0.1" + } + }, + "node_modules/renderkid/node_modules/css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/renderkid/node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-like": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/require-like/-/require-like-0.1.2.tgz", + "integrity": "sha512-oyrU88skkMtDdauHDuKVrgR+zuItqr6/c//FXzvmxRGMexSDc6hNvJInGW3LL46n+8b50RykrvwSUIIQH2LQ5A==", + "engines": { + "node": "*" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-alpn": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", + "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==" + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-pathname": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz", + "integrity": "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==" + }, + "node_modules/responselike": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz", + "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==", + "dependencies": { + "lowercase-keys": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rtl-detect": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/rtl-detect/-/rtl-detect-1.1.2.tgz", + "integrity": "sha512-PGMBq03+TTG/p/cRB7HCLKJ1MgDIi07+QU1faSjiYRfmY5UsAttV9Hs08jDAHVwcOwmVLcSJkpwyfXszVjWfIQ==" + }, + "node_modules/rtlcss": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-4.1.1.tgz", + "integrity": "sha512-/oVHgBtnPNcggP2aVXQjSy6N1mMAfHg4GSag0QtZBlD5bdDgAHwr4pydqJGd+SUCu9260+Pjqbjwtvu7EMH1KQ==", + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0", + "postcss": "^8.4.21", + "strip-json-comments": "^3.1.1" + }, + "bin": { + "rtlcss": "bin/rtlcss.js" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/sax": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.3.0.tgz", + "integrity": "sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==" + }, + "node_modules/scheduler": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", + "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/schema-utils": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/search-insights": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/search-insights/-/search-insights-2.13.0.tgz", + "integrity": "sha512-Orrsjf9trHHxFRuo9/rzm0KIWmgzE8RMlZMzuhZOJ01Rnz3D0YBAe+V6473t6/H6c7irs6Lt48brULAiRWb3Vw==", + "peer": true + }, + "node_modules/section-matter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", + "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==", + "dependencies": { + "extend-shallow": "^2.0.1", + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==" + }, + "node_modules/selfsigned": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", + "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", + "dependencies": { + "@types/node-forge": "^1.3.0", + "node-forge": "^1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-4.0.0.tgz", + "integrity": "sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA==", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/send/node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serialize-javascript": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", + "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/serve-handler": { + "version": "6.1.5", + "resolved": "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.5.tgz", + "integrity": "sha512-ijPFle6Hwe8zfmBxJdE+5fta53fdIY0lHISJvuikXB3VYFafRjMRpOffSPvCYsbKyBA7pvy9oYr/BT1O3EArlg==", + "dependencies": { + "bytes": "3.0.0", + "content-disposition": "0.5.2", + "fast-url-parser": "1.1.3", + "mime-types": "2.1.18", + "minimatch": "3.1.2", + "path-is-inside": "1.0.2", + "path-to-regexp": "2.2.1", + "range-parser": "1.2.0" + } + }, + "node_modules/serve-handler/node_modules/path-to-regexp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-2.2.1.tgz", + "integrity": "sha512-gu9bD6Ta5bwGrrU8muHzVOBFFREpp2iRkVfhBJahwJ6p6Xw20SjT0MxLnwkjOibQmGSYhiUnf2FLe7k+jcFmGQ==" + }, + "node_modules/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", + "dependencies": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-index/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/serve-index/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==" + }, + "node_modules/serve-index/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/serve-index/node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" + }, + "node_modules/serve-index/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-function-length": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", + "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", + "dependencies": { + "define-data-property": "^1.1.1", + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "node_modules/shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shallowequal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", + "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", + "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "dependencies": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + }, + "bin": { + "shjs": "bin/shjs" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "node_modules/sirv": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.4.tgz", + "integrity": "sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==", + "dependencies": { + "@polka/url": "^1.0.0-next.24", + "mrmime": "^2.0.0", + "totalist": "^3.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" + }, + "node_modules/sitemap": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/sitemap/-/sitemap-7.1.1.tgz", + "integrity": "sha512-mK3aFtjz4VdJN0igpIJrinf3EO8U8mxOPsTBzSsy06UtjZQJ3YY3o3Xa7zSc5nMqcMrRwlChHZ18Kxg0caiPBg==", + "dependencies": { + "@types/node": "^17.0.5", + "@types/sax": "^1.2.1", + "arg": "^5.0.0", + "sax": "^1.2.4" + }, + "bin": { + "sitemap": "dist/cli.js" + }, + "engines": { + "node": ">=12.0.0", + "npm": ">=5.6.0" + } + }, + "node_modules/sitemap/node_modules/@types/node": { + "version": "17.0.45", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.45.tgz", + "integrity": "sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==" + }, + "node_modules/skin-tone": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/skin-tone/-/skin-tone-2.0.0.tgz", + "integrity": "sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA==", + "dependencies": { + "unicode-emoji-modifier-base": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/sockjs": { + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", + "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", + "dependencies": { + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" + } + }, + "node_modules/sort-css-media-queries": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/sort-css-media-queries/-/sort-css-media-queries-2.1.0.tgz", + "integrity": "sha512-IeWvo8NkNiY2vVYdPa27MCQiR0MN0M80johAYFVxWWXQ44KU84WNxjslwBHmc/7ZL2ccwkM7/e6S5aiKZXm7jA==", + "engines": { + "node": ">= 6.3.0" + } + }, + "node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "dependencies": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "dependencies": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" + }, + "node_modules/srcset": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/srcset/-/srcset-4.0.0.tgz", + "integrity": "sha512-wvLeHgcVHKO8Sc/H/5lkGreJQVeYMm9rlmt8PuR1xE31rIuXhuzznUUqAt8MqLhB3MqJdFzlNAfpcWnxiFUcPw==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", + "deprecated": "Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility" + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/std-env": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.7.0.tgz", + "integrity": "sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==" + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/stringify-entities": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.3.tgz", + "integrity": "sha512-BP9nNHMhhfcMbiuQKCqMjhDP5yBCAxsPu4pHFFzJ6Alo9dZgY4VLDPutXqIjpRiMoKdp7Av85Gr73Q5uH9k7+g==", + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/stringify-object": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", + "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", + "dependencies": { + "get-own-enumerable-property-symbols": "^3.0.0", + "is-obj": "^1.0.1", + "is-regexp": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", + "integrity": "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/style-to-object": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.4.4.tgz", + "integrity": "sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg==", + "dependencies": { + "inline-style-parser": "0.1.1" + } + }, + "node_modules/stylehacks": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.1.tgz", + "integrity": "sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==", + "dependencies": { + "browserslist": "^4.21.4", + "postcss-selector-parser": "^6.0.4" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/svg-parser": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", + "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==" + }, + "node_modules/svgo": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", + "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", + "dependencies": { + "@trysound/sax": "0.2.0", + "commander": "^7.2.0", + "css-select": "^4.1.3", + "css-tree": "^1.1.3", + "csso": "^4.2.0", + "picocolors": "^1.0.0", + "stable": "^0.1.8" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/svgo/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "engines": { + "node": ">= 10" + } + }, + "node_modules/svgo/node_modules/css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/svgo/node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/svgo/node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/svgo/node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/svgo/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/terser": { + "version": "5.26.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.26.0.tgz", + "integrity": "sha512-dytTGoE2oHgbNV9nTzgBEPaqAWvcJNl66VZ0BkJqlvp71IjO8CxdBx/ykCNb47cLnCmCvRZ6ZR0tLkqvZCdVBQ==", + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.3.10", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", + "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.20", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.1", + "terser": "^5.26.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/terser-webpack-plugin/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/terser-webpack-plugin/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/terser-webpack-plugin/node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/terser-webpack-plugin/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "node_modules/terser-webpack-plugin/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/terser-webpack-plugin/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" + }, + "node_modules/thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==" + }, + "node_modules/tiny-invariant": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.1.tgz", + "integrity": "sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==" + }, + "node_modules/tiny-warning": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", + "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==" + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/totalist": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", + "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/trim-lines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/trough": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.1.0.tgz", + "integrity": "sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, + "node_modules/type-fest": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/type-is/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/type-is/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, + "node_modules/typescript": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", + "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", + "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-emoji-modifier-base": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unicode-emoji-modifier-base/-/unicode-emoji-modifier-base-1.0.0.tgz", + "integrity": "sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g==", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", + "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", + "engines": { + "node": ">=4" + } + }, + "node_modules/unified": { + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.4.tgz", + "integrity": "sha512-apMPnyLjAX+ty4OrNap7yumyVAMlKx5IWU2wlzzUdYJO9A8f1p9m/gywF/GM2ZDFcjQPrx59Mc90KwmxsoklxQ==", + "dependencies": { + "@types/unist": "^3.0.0", + "bail": "^2.0.0", + "devlop": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unique-string": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-3.0.0.tgz", + "integrity": "sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==", + "dependencies": { + "crypto-random-string": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/unist-util-is": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", + "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", + "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position-from-estree": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position-from-estree/-/unist-util-position-from-estree-2.0.0.tgz", + "integrity": "sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-remove-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-5.0.0.tgz", + "integrity": "sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-visit": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", + "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", + "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/update-browserslist-db": { + "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==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/update-notifier": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-6.0.2.tgz", + "integrity": "sha512-EDxhTEVPZZRLWYcJ4ZXjGFN0oP7qYvbXWzEgRm/Yql4dHX5wDbvh89YHP6PK1lzZJYrMtXUuZZz8XGK+U6U1og==", + "dependencies": { + "boxen": "^7.0.0", + "chalk": "^5.0.1", + "configstore": "^6.0.0", + "has-yarn": "^3.0.0", + "import-lazy": "^4.0.0", + "is-ci": "^3.0.1", + "is-installed-globally": "^0.4.0", + "is-npm": "^6.0.0", + "is-yarn-global": "^0.4.0", + "latest-version": "^7.0.0", + "pupa": "^3.1.0", + "semver": "^7.3.7", + "semver-diff": "^4.0.0", + "xdg-basedir": "^5.1.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/yeoman/update-notifier?sponsor=1" + } + }, + "node_modules/update-notifier/node_modules/boxen": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-7.1.1.tgz", + "integrity": "sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog==", + "dependencies": { + "ansi-align": "^3.0.1", + "camelcase": "^7.0.1", + "chalk": "^5.2.0", + "cli-boxes": "^3.0.0", + "string-width": "^5.1.2", + "type-fest": "^2.13.0", + "widest-line": "^4.0.1", + "wrap-ansi": "^8.1.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/update-notifier/node_modules/camelcase": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.1.tgz", + "integrity": "sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/update-notifier/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/uri-js/node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/url-loader": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz", + "integrity": "sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==", + "dependencies": { + "loader-utils": "^2.0.0", + "mime-types": "^2.1.27", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "file-loader": "*", + "webpack": "^4.0.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "file-loader": { + "optional": true + } + } + }, + "node_modules/url-loader/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/url-loader/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/url-loader/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "node_modules/url-loader/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/url-loader/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/url-loader/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==" + }, + "node_modules/utility-types": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.10.0.tgz", + "integrity": "sha512-O11mqxmi7wMKCo6HKFt5AhO4BwY3VV68YU07tgxfz8zJTIxr4BpsezN49Ffwy9j3ZpwwJp4fkRwjRzq3uWE6Rg==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/value-equal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-1.0.1.tgz", + "integrity": "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==" + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vfile": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.1.tgz", + "integrity": "sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-location": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-5.0.2.tgz", + "integrity": "sha512-NXPYyxyBSH7zB5U6+3uDdd6Nybz6o6/od9rk8bp9H8GR3L+cm/fC0uUTbqBmUTnMCUDslAGBOIKNfvvb+gGlDg==", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", + "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/watchpack": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dependencies": { + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/web-namespaces": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz", + "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/webpack": { + "version": "5.89.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.89.0.tgz", + "integrity": "sha512-qyfIC10pOr70V+jkmud8tMfajraGCZMBWJtrmuBymQKCrLTRejBI8STDp1MCyZu/QTdZSeacCQYpYNQVOzX5kw==", + "dependencies": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^1.0.0", + "@webassemblyjs/ast": "^1.11.5", + "@webassemblyjs/wasm-edit": "^1.11.5", + "@webassemblyjs/wasm-parser": "^1.11.5", + "acorn": "^8.7.1", + "acorn-import-assertions": "^1.9.0", + "browserslist": "^4.14.5", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.15.0", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.9", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.2.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.7", + "watchpack": "^2.4.0", + "webpack-sources": "^3.2.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-bundle-analyzer": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.10.1.tgz", + "integrity": "sha512-s3P7pgexgT/HTUSYgxJyn28A+99mmLq4HsJepMPzu0R8ImJc52QNqaFYW1Z2z2uIb1/J3eYgaAWVpaC+v/1aAQ==", + "dependencies": { + "@discoveryjs/json-ext": "0.5.7", + "acorn": "^8.0.4", + "acorn-walk": "^8.0.0", + "commander": "^7.2.0", + "debounce": "^1.2.1", + "escape-string-regexp": "^4.0.0", + "gzip-size": "^6.0.0", + "html-escaper": "^2.0.2", + "is-plain-object": "^5.0.0", + "opener": "^1.5.2", + "picocolors": "^1.0.0", + "sirv": "^2.0.3", + "ws": "^7.3.1" + }, + "bin": { + "webpack-bundle-analyzer": "lib/bin/analyzer.js" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/webpack-bundle-analyzer/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "engines": { + "node": ">= 10" + } + }, + "node_modules/webpack-dev-middleware": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz", + "integrity": "sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==", + "dependencies": { + "colorette": "^2.0.10", + "memfs": "^3.4.3", + "mime-types": "^2.1.31", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/webpack-dev-middleware/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/webpack-dev-middleware/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/webpack-dev-middleware/node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/webpack-dev-server": { + "version": "4.15.1", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.1.tgz", + "integrity": "sha512-5hbAst3h3C3L8w6W4P96L5vaV0PxSmJhxZvWKYIdgxOQm8pNZ5dEOmmSLBVpP85ReeyRt6AS1QJNyo/oFFPeVA==", + "dependencies": { + "@types/bonjour": "^3.5.9", + "@types/connect-history-api-fallback": "^1.3.5", + "@types/express": "^4.17.13", + "@types/serve-index": "^1.9.1", + "@types/serve-static": "^1.13.10", + "@types/sockjs": "^0.3.33", + "@types/ws": "^8.5.5", + "ansi-html-community": "^0.0.8", + "bonjour-service": "^1.0.11", + "chokidar": "^3.5.3", + "colorette": "^2.0.10", + "compression": "^1.7.4", + "connect-history-api-fallback": "^2.0.0", + "default-gateway": "^6.0.3", + "express": "^4.17.3", + "graceful-fs": "^4.2.6", + "html-entities": "^2.3.2", + "http-proxy-middleware": "^2.0.3", + "ipaddr.js": "^2.0.1", + "launch-editor": "^2.6.0", + "open": "^8.0.9", + "p-retry": "^4.5.0", + "rimraf": "^3.0.2", + "schema-utils": "^4.0.0", + "selfsigned": "^2.1.1", + "serve-index": "^1.9.1", + "sockjs": "^0.3.24", + "spdy": "^4.0.2", + "webpack-dev-middleware": "^5.3.1", + "ws": "^8.13.0" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.37.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + }, + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server/node_modules/ws": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz", + "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/webpack-merge": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", + "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", + "dependencies": { + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/webpack/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/webpack/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "node_modules/webpack/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/webpack/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/webpack/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/webpackbar": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/webpackbar/-/webpackbar-5.0.2.tgz", + "integrity": "sha512-BmFJo7veBDgQzfWXl/wwYXr/VFus0614qZ8i9znqcl9fnEdiVkdbi0TedLQ6xAK92HZHDJ0QmyQ0fmuZPAgCYQ==", + "dependencies": { + "chalk": "^4.1.0", + "consola": "^2.15.3", + "pretty-time": "^1.1.0", + "std-env": "^3.0.1" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "webpack": "3 || 4 || 5" + } + }, + "node_modules/websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/widest-line": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz", + "integrity": "sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==", + "dependencies": { + "string-width": "^5.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/wildcard": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", + "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==" + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "node_modules/write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "node_modules/ws": { + "version": "7.5.9", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", + "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xdg-basedir": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-5.1.0.tgz", + "integrity": "sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/xml-js": { + "version": "1.6.11", + "resolved": "https://registry.npmjs.org/xml-js/-/xml-js-1.6.11.tgz", + "integrity": "sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==", + "dependencies": { + "sax": "^1.2.4" + }, + "bin": { + "xml-js": "bin/cli.js" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + }, + "node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/yocto-queue": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", + "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zwitch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + } + } +} diff --git a/docs/docusaurus/package.json b/docs/docusaurus/package.json new file mode 100644 index 00000000..e3812307 --- /dev/null +++ b/docs/docusaurus/package.json @@ -0,0 +1,44 @@ +{ + "name": "my-website", + "version": "0.0.0", + "private": true, + "scripts": { + "docusaurus": "docusaurus", + "start": "docusaurus start", + "build": "docusaurus build", + "swizzle": "docusaurus swizzle", + "deploy": "docusaurus deploy", + "clear": "docusaurus clear", + "serve": "docusaurus serve", + "write-translations": "docusaurus write-translations", + "write-heading-ids": "docusaurus write-heading-ids" + }, + "dependencies": { + "@docusaurus/core": "3.0.1", + "@docusaurus/preset-classic": "3.0.1", + "@mdx-js/react": "^3.0.0", + "clsx": "^2.0.0", + "prism-react-renderer": "^2.3.0", + "react": "^18.0.0", + "react-dom": "^18.0.0" + }, + "devDependencies": { + "@docusaurus/module-type-aliases": "3.0.1", + "@docusaurus/types": "3.0.1" + }, + "browserslist": { + "production": [ + ">0.5%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 3 chrome version", + "last 3 firefox version", + "last 5 safari version" + ] + }, + "engines": { + "node": ">=18.0" + } +} diff --git a/docs/docusaurus/sidebars.js b/docs/docusaurus/sidebars.js new file mode 100644 index 00000000..12cb55a4 --- /dev/null +++ b/docs/docusaurus/sidebars.js @@ -0,0 +1,54 @@ +/** + * Creating a sidebar enables you to: + - create an ordered group of docs + - render a sidebar for each doc of that group + - provide next/previous navigation + + The sidebars can be generated from the filesystem, or explicitly defined here. + + Create as many sidebars as you want. + */ + +// @ts-check + +/** @type {import('@docusaurus/plugin-content-docs').SidebarsConfig} */ +const sidebars = { + // By default, Docusaurus generates a sidebar from the docs folder structure + // tutorialSidebar: [{type: 'autogenerated', dirName: '.'}], + + // But you can create a sidebar manually + documentationSidebar: [ + { + type: 'doc', + id: 'introduction', + label: 'Introduction', + }, + { + type: 'category', + label: 'Setup', + items: ['setup/setup', 'setup/setup_development'], + }, + { + type: 'category', + label: 'Configuration', + items: ['configuration/configure_agent_and_tools', 'configuration/configure_ui'], + }, + { + type: 'category', + label: 'How it works', + items: ['how_it_works/key_concepts', 'how_it_works/backend_flow'], + }, + { + type: 'category', + label: 'Tool library', + items: ['tool_library/tool_library', 'tool_library/sql_tool', 'tool_library/pdf_tool', 'tool_library/entertainer_expert_tools', 'tool_library/visualizer_tool', 'tool_library/summarizer_tool', 'tool_library/image_generation_tool', 'tool_library/template_tool'], + }, + { + type: 'category', + label: 'Advanced', + items: ['advanced/memory', 'advanced/optional_features', 'advanced/evaluation', 'advanced/aat_guidelines'], + }, + ], +}; + +export default sidebars; diff --git a/docs/docusaurus/src/components/HomepageFeatures/index.js b/docs/docusaurus/src/components/HomepageFeatures/index.js new file mode 100644 index 00000000..7468de17 --- /dev/null +++ b/docs/docusaurus/src/components/HomepageFeatures/index.js @@ -0,0 +1,64 @@ +import clsx from 'clsx'; +import Heading from '@theme/Heading'; +import styles from './styles.module.css'; + +const FeatureList = [ + { + title: 'Quickly build high quality Agent apps', + Svg: () => 🚀, + description: ( + <> + Build a strong app in a few hours using a modular, easy to configure tech stack + based on FastAPI/Nextjs and a library of useful GenAI tools + + ), + }, + { + title: 'Flexible, reactive UI/UX designed for Agents', + Svg: () => 💻, + description: ( + <> + React/Nextjs chat-based UI that is easy to configure, with features such as streaming, + rendering of tables/visualizations/code, status of Agent actions and more + + ), + }, + { + title: 'Focus on reliability', + Svg: () => 🛡️, + description: ( + <> + Easy to configure routing architecture gives control of possible paths Agent can take, + increasing reliability and making it suited for real-life use cases + + ), + }, +]; + +function Feature({Svg, title, description}) { + return ( +
+
+ {typeof Svg === 'string' ? Svg : } +
+
+ {title} +

{description}

+
+
+ ); +} + +export default function HomepageFeatures() { + return ( +
+
+
+ {FeatureList.map((props, idx) => ( + + ))} +
+
+
+ ); +} diff --git a/docs/docusaurus/src/components/HomepageFeatures/styles.module.css b/docs/docusaurus/src/components/HomepageFeatures/styles.module.css new file mode 100644 index 00000000..b248eb2e --- /dev/null +++ b/docs/docusaurus/src/components/HomepageFeatures/styles.module.css @@ -0,0 +1,11 @@ +.features { + display: flex; + align-items: center; + padding: 2rem 0; + width: 100%; +} + +.featureSvg { + height: 200px; + width: 200px; +} diff --git a/docs/docusaurus/src/css/custom.css b/docs/docusaurus/src/css/custom.css new file mode 100644 index 00000000..66355882 --- /dev/null +++ b/docs/docusaurus/src/css/custom.css @@ -0,0 +1,30 @@ +/** + * Any CSS included here will be global. The classic template + * bundles Infima by default. Infima is a CSS framework designed to + * work well for content-centric websites. + */ + +/* You can override the default Infima variables here. */ +:root { + --ifm-color-primary: #328371; + --ifm-color-primary-dark: #29784c; + --ifm-color-primary-darker: #277148; + --ifm-color-primary-darkest: #205d3b; + --ifm-color-primary-light: #33925d; + --ifm-color-primary-lighter: #359962; + --ifm-color-primary-lightest: #3cad6e; + --ifm-code-font-size: 95%; + --docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.1); +} + +/* For readability concerns, you should choose a lighter palette in dark mode. */ +[data-theme='dark'] { + --ifm-color-primary: #25c2a0; + --ifm-color-primary-dark: #21af90; + --ifm-color-primary-darker: #1fa588; + --ifm-color-primary-darkest: #1a8870; + --ifm-color-primary-light: #29d5b0; + --ifm-color-primary-lighter: #32d8b4; + --ifm-color-primary-lightest: #4fddbf; + --docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.3); +} diff --git a/docs/docusaurus/src/pages/index.js b/docs/docusaurus/src/pages/index.js new file mode 100644 index 00000000..d7abfaec --- /dev/null +++ b/docs/docusaurus/src/pages/index.js @@ -0,0 +1,49 @@ +import clsx from 'clsx'; +import Link from '@docusaurus/Link'; +import useDocusaurusContext from '@docusaurus/useDocusaurusContext'; +import Layout from '@theme/Layout'; +import HomepageFeatures from '@site/src/components/HomepageFeatures'; + +import Heading from '@theme/Heading'; +import styles from './index.module.css'; + +function HomepageHeader() { + const {siteConfig} = useDocusaurusContext(); + return ( +
+
+ AgentKit Logo + + {siteConfig.tagline} + +
+ + Get Started + + + Try the Demo + +
+
+
+ ); +} + +export default function Home() { + const {siteConfig} = useDocusaurusContext(); + return ( + + +
+ +
+
+ ); +} diff --git a/docs/docusaurus/src/pages/index.module.css b/docs/docusaurus/src/pages/index.module.css new file mode 100644 index 00000000..9f71a5da --- /dev/null +++ b/docs/docusaurus/src/pages/index.module.css @@ -0,0 +1,23 @@ +/** + * CSS files with the .module.css suffix will be treated as CSS modules + * and scoped locally. + */ + +.heroBanner { + padding: 4rem 0; + text-align: center; + position: relative; + overflow: hidden; +} + +@media screen and (max-width: 996px) { + .heroBanner { + padding: 2rem; + } +} + +.buttons { + display: flex; + align-items: center; + justify-content: center; +} diff --git a/docs/docusaurus/src/pages/markdown-page.md b/docs/docusaurus/src/pages/markdown-page.md new file mode 100644 index 00000000..9756c5b6 --- /dev/null +++ b/docs/docusaurus/src/pages/markdown-page.md @@ -0,0 +1,7 @@ +--- +title: Markdown page example +--- + +# Markdown page example + +You don't need React to write simple standalone pages. diff --git a/docs/docusaurus/static/.nojekyll b/docs/docusaurus/static/.nojekyll new file mode 100644 index 00000000..e69de29b diff --git a/docs/docusaurus/static/img/agentkit_flow_diagram.png b/docs/docusaurus/static/img/agentkit_flow_diagram.png new file mode 100644 index 00000000..05de3df5 Binary files /dev/null and b/docs/docusaurus/static/img/agentkit_flow_diagram.png differ diff --git a/docs/docusaurus/static/img/agentkit_logo_color.png b/docs/docusaurus/static/img/agentkit_logo_color.png new file mode 100644 index 00000000..c95cef76 Binary files /dev/null and b/docs/docusaurus/static/img/agentkit_logo_color.png differ diff --git a/docs/docusaurus/static/img/auth_feature.png b/docs/docusaurus/static/img/auth_feature.png new file mode 100644 index 00000000..e9871250 Binary files /dev/null and b/docs/docusaurus/static/img/auth_feature.png differ diff --git a/docs/docusaurus/static/img/bcgx_logo.png b/docs/docusaurus/static/img/bcgx_logo.png new file mode 100644 index 00000000..af83aba5 Binary files /dev/null and b/docs/docusaurus/static/img/bcgx_logo.png differ diff --git a/docs/docusaurus/static/img/evaluation_layers.png b/docs/docusaurus/static/img/evaluation_layers.png new file mode 100644 index 00000000..211d1d27 Binary files /dev/null and b/docs/docusaurus/static/img/evaluation_layers.png differ diff --git a/docs/docusaurus/static/img/favicon.ico b/docs/docusaurus/static/img/favicon.ico new file mode 100644 index 00000000..4b996a30 Binary files /dev/null and b/docs/docusaurus/static/img/favicon.ico differ diff --git a/docs/docusaurus/static/img/feedback_feature.png b/docs/docusaurus/static/img/feedback_feature.png new file mode 100644 index 00000000..72c248ee Binary files /dev/null and b/docs/docusaurus/static/img/feedback_feature.png differ diff --git a/docs/docusaurus/static/img/img_gen_tool_elephant.png b/docs/docusaurus/static/img/img_gen_tool_elephant.png new file mode 100644 index 00000000..9eb295a0 Binary files /dev/null and b/docs/docusaurus/static/img/img_gen_tool_elephant.png differ diff --git a/docs/docusaurus/static/img/img_visualizer_tool.png b/docs/docusaurus/static/img/img_visualizer_tool.png new file mode 100644 index 00000000..cbd7535d Binary files /dev/null and b/docs/docusaurus/static/img/img_visualizer_tool.png differ diff --git a/docs/docusaurus/static/img/logo.svg b/docs/docusaurus/static/img/logo.svg new file mode 100644 index 00000000..ad9d11a4 --- /dev/null +++ b/docs/docusaurus/static/img/logo.svg @@ -0,0 +1 @@ + diff --git a/docs/docusaurus/static/img/public_demo_screenshot.png b/docs/docusaurus/static/img/public_demo_screenshot.png new file mode 100644 index 00000000..6fab6406 Binary files /dev/null and b/docs/docusaurus/static/img/public_demo_screenshot.png differ diff --git a/docs/docusaurus/static/img/settings_feature.png b/docs/docusaurus/static/img/settings_feature.png new file mode 100644 index 00000000..f47ae122 Binary files /dev/null and b/docs/docusaurus/static/img/settings_feature.png differ diff --git a/docs/docusaurus/static/img/undraw_docusaurus_mountain.svg b/docs/docusaurus/static/img/undraw_docusaurus_mountain.svg new file mode 100644 index 00000000..af961c49 --- /dev/null +++ b/docs/docusaurus/static/img/undraw_docusaurus_mountain.svg @@ -0,0 +1,171 @@ + + Easy to Use + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/docusaurus/static/img/undraw_docusaurus_react.svg b/docs/docusaurus/static/img/undraw_docusaurus_react.svg new file mode 100644 index 00000000..94b5cf08 --- /dev/null +++ b/docs/docusaurus/static/img/undraw_docusaurus_react.svg @@ -0,0 +1,170 @@ + + Powered by React + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/docusaurus/static/img/undraw_docusaurus_tree.svg b/docs/docusaurus/static/img/undraw_docusaurus_tree.svg new file mode 100644 index 00000000..d9161d33 --- /dev/null +++ b/docs/docusaurus/static/img/undraw_docusaurus_tree.svg @@ -0,0 +1,40 @@ + + Focus on What Matters + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/frontend/.dockerignore b/frontend/.dockerignore new file mode 100644 index 00000000..c5500558 --- /dev/null +++ b/frontend/.dockerignore @@ -0,0 +1,7 @@ +Dockerfile +.dockerignore +node_modules +npm-debug.log +README.md +.next +.git diff --git a/frontend/.env.example b/frontend/.env.example new file mode 100644 index 00000000..0a74ca02 --- /dev/null +++ b/frontend/.env.example @@ -0,0 +1,49 @@ +# Since the ".env" file is gitignored, you can use the ".env.example" file to +# build a new ".env" file when you clone the repo. Keep this file up-to-date +# when you add new variables to `.env`. + +# This file will be committed to version control, so make sure not to have any +# secrets in it. If you are cloning this repo, create a copy of this file named +# ".env" and populate it with your secrets. + +# When adding additional environment variables, the schema in "/src/env.mjs" +# should be updated accordingly. + +############################################# +# Common +############################################# +NEXT_PUBLIC_API_URL="http://localhost/api/v1" +NEXT_PUBLIC_ENABLE_MESSAGE_FEEDBACK=false # Enables Langsmith feedback prompting + +############################################# +# Authentication +############################################# +# You can generate a new secret on the command line with: +# openssl rand -base64 32 +# https://next-auth.js.org/configuration/options#secret +NEXT_PUBLIC_USE_AUTH=false # flag to enable or disable authentication +NEXTAUTH_SECRET= # TODO: Generate a secret and add it here (see above) +NEXTAUTH_URL="http://localhost:3000" +GITHUB_ENTERPRISE_URL="https://github.your.enterprise.com/" + +# Next Auth Provider +GITHUB_ID="cadd5256336ae4912af2" +GITHUB_SECRET="b3d0b714c857bd06e9ddcda293dfb5a70b3fb721" +GOOGLE_AUTH_ID="" +GOOGLE_AUTH_SECRET="" + +# Monitoring +NEXT_PUBLIC_DATADOG_CLIENT_TOKEN="" +NEXT_PUBLIC_DATADOG_APPLICATION_ID="" + +############################################# +# Database +############################################# +# Update the database URL to point to your database instance and your credentials +DB_USER=postgres +DB_PASSWORD=postgres +DB_HOST=database +DB_PORT=5432 +DB_NAME=fastapi_db +DATABASE_URL=postgresql://${DB_USER}:${DB_PASSWORD}@${DB_HOST}:${DB_PORT}/${DB_NAME}?pgbouncer=true&connect_timeout=10 +DIRECT_DATABASE_URL=postgresql://${DB_USER}:${DB_PASSWORD}@${DB_HOST}:${DB_PORT}/${DB_NAME}?connect_timeout=10 diff --git a/frontend/.eslintignore b/frontend/.eslintignore new file mode 100644 index 00000000..a8335fe6 --- /dev/null +++ b/frontend/.eslintignore @@ -0,0 +1,8 @@ +**/api-client/** +.next +next-env.d.ts +node_modules +yarn.lock +package-lock.json +pnpm-lock.yaml +public diff --git a/frontend/.eslintrc.js b/frontend/.eslintrc.js new file mode 100644 index 00000000..2131084c --- /dev/null +++ b/frontend/.eslintrc.js @@ -0,0 +1,83 @@ +const fs = require("fs") + +module.exports = { + plugins: ["tailwindcss", "jest", "@typescript-eslint", "unused-imports"], + extends: ["next/core-web-vitals", "prettier", "plugin:tailwindcss/recommended", "plugin:jest/recommended"], + settings: { + react: { + version: "detect", + }, + }, + rules: { + "react/prop-types": ["error", { ignore: ["children", "className"] }], + "unused-imports/no-unused-imports": "error", + "tailwindcss/no-custom-classname": "off", + "testing-library/prefer-screen-queries": "off", + "@next/next/no-html-link-for-pages": "off", + "react-hooks/exhaustive-deps": "off", + "@typescript-eslint/consistent-type-imports": [ + "error", + { + prefer: "type-imports", + disallowTypeAnnotations: true, + fixStyle: "inline-type-imports", + }, + ], + "@typescript-eslint/no-unused-vars": [ + "warn", + { + argsIgnorePattern: "^_", + varsIgnorePattern: "^_", + }, + ], + "sort-imports": [ + "error", + { + ignoreCase: true, + ignoreDeclarationSort: true, + }, + ], + "tailwindcss/classnames-order": "off", + "import/order": [ + 1, + { + groups: ["external", "builtin", "internal", "sibling", "parent", "index", "type"], + pathGroups: [ + ...getDirectoriesToSort().map((singleDir) => ({ + pattern: `${singleDir}/**`, + group: "internal", + })), + { + pattern: "env", + group: "internal", + }, + { + pattern: "theme", + group: "internal", + }, + { + pattern: "public/**", + group: "internal", + position: "after", + }, + ], + pathGroupsExcludedImportTypes: ["internal"], + alphabetize: { + order: "asc", + caseInsensitive: true, + }, + }, + ], + }, +} + +function getDirectoriesToSort() { + const ignoredSortingDirectories = [".git", ".next", ".vscode", "node_modules"] + return getDirectories(process.cwd()).filter((f) => !ignoredSortingDirectories.includes(f)) +} + +function getDirectories(path) { + return fs.readdirSync(path).filter(function (file) { + return fs.statSync(path + "/" + file).isDirectory() + }) +} diff --git a/frontend/.gitignore b/frontend/.gitignore new file mode 100644 index 00000000..392f2f9e --- /dev/null +++ b/frontend/.gitignore @@ -0,0 +1,45 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +.npmrc_todo + +# dependencies +/node_modules +/.pnp +.pnp.js + +# testing +/coverage + +# database +/prisma/db.sqlite +/prisma/db.sqlite-journal + +# next.js +/.next/ +/out/ +next-env.d.ts + +# production +/build + +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* +.pnpm-debug.log* + +# local env files +# do not commit any .env files to git, except for the .env.example file. https://create.t3.gg/en/usage/env-variables#using-environment-variables +.env + +# vercel +.vercel + +# typescript +*.tsbuildinfo + +/.npm-only-allow diff --git a/frontend/.husky/commit-msg b/frontend/.husky/commit-msg new file mode 100755 index 00000000..212b92bc --- /dev/null +++ b/frontend/.husky/commit-msg @@ -0,0 +1,5 @@ +#!/usr/bin/env sh +. "$(dirname -- "$0")/_/husky.sh" +cd ./frontend + +npx --no -- commitlint --edit ${1} diff --git a/frontend/.husky/pre-commit b/frontend/.husky/pre-commit new file mode 100755 index 00000000..48b2c53f --- /dev/null +++ b/frontend/.husky/pre-commit @@ -0,0 +1,19 @@ +#!/usr/bin/env sh +. "$(dirname -- "$0")/_/husky.sh" +cd ./frontend + +echo 'Running linting and prettier before committing...' + +pnpm lint || ( + pnpm run lint:fix + echo 'Linting and prettier fixed some errors. Please commit again.' + exit 1 +) + +pnpm prettier || ( + pnpm run prettier:fix + echo 'Prettier fixed some errors. Please commit again.' + exit 1 +) + +echo 'Linting and prettier passed. Committing...' diff --git a/frontend/.husky/pre-push b/frontend/.husky/pre-push new file mode 100755 index 00000000..a2af1a22 --- /dev/null +++ b/frontend/.husky/pre-push @@ -0,0 +1,12 @@ +#!/usr/bin/env sh +. "$(dirname -- "$0")/_/husky.sh" +cd ./frontend + +echo 'Building the frontend before pushing...' + +pnpm build || ( + echo 'Build failed. Please fix the errors and push again.' + exit 1 +) + +echo 'Build passed. Pushing...' diff --git a/frontend/Dockerfile b/frontend/Dockerfile new file mode 100644 index 00000000..198d7d1b --- /dev/null +++ b/frontend/Dockerfile @@ -0,0 +1,55 @@ +FROM node:18-alpine AS base + +# Install dependencies only when needed +FROM base AS deps +# Check https://github.com/nodejs/docker-node/tree/b4117f9333da4138b03a546ec926ef50a31506c3#nodealpine to understand why libc6-compat might be needed. +RUN apk add --no-cache libc6-compat +WORKDIR /app + +COPY package.json pnpm-lock.yaml* ./ +RUN yarn global add pnpm && pnpm i --frozen-lockfile + +# Rebuild the source code only when needed +FROM base AS builder +WORKDIR /app +COPY --from=deps /app/node_modules ./node_modules +COPY . . + +# Declare all build args are env vars for build +#ARG GITHUB_ID +#ENV GITHUB_ID ${GITHUB_ID} +#ARG GITHUB_SECRET +#ENV GITHUB_SECRET ${GITHUB_SECRET} +#ARG NEXTAUTH_SECRET +#ENV NEXTAUTH_SECRET ${NEXTAUTH_SECRET} +#ARG NEXTAUTH_URL +#ENV NEXTAUTH_URL ${NEXTAUTH_URL} +#ARG NEXT_PUBLIC_API_URL +#ENV NEXT_PUBLIC_API_URL ${NEXT_PUBLIC_API_URL} + +RUN yarn run prisma:generate +RUN yarn run build + +# Production image, copy all the files and run next +FROM base AS runner +WORKDIR /app + +ENV NODE_ENV production + +RUN addgroup --system --gid 1001 nodejs +RUN adduser --system --uid 1001 nextjs + +COPY --from=builder /app/public ./public + +# Automatically leverage output traces to reduce image size +# https://nextjs.org/docs/advanced-features/output-file-tracing +COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./ +COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static + +USER nextjs + +EXPOSE 3000 + +ENV PORT 3000 + +CMD ["node", "server.js"] diff --git a/frontend/commitlint.config.js b/frontend/commitlint.config.js new file mode 100644 index 00000000..858aaa8c --- /dev/null +++ b/frontend/commitlint.config.js @@ -0,0 +1 @@ +module.exports = { extends: ["@commitlint/config-conventional"] } diff --git a/frontend/custom_typings/can-ndjson-stream/index.d.ts b/frontend/custom_typings/can-ndjson-stream/index.d.ts new file mode 100644 index 00000000..f110d248 --- /dev/null +++ b/frontend/custom_typings/can-ndjson-stream/index.d.ts @@ -0,0 +1,11 @@ +declare module "can-ndjson-stream" { + export default function ndjsonStream(data: unknown): { + getReader: () => { + read: () => Promise<{ + done: boolean + value: any + }> + } + cancel: () => void + } +} diff --git a/frontend/cypress.config.ts b/frontend/cypress.config.ts new file mode 100644 index 00000000..f0adf33f --- /dev/null +++ b/frontend/cypress.config.ts @@ -0,0 +1,34 @@ +// @ts-nocheck + +import { addCucumberPreprocessorPlugin } from "@badeball/cypress-cucumber-preprocessor" +import createEsbuildPlugin from "@badeball/cypress-cucumber-preprocessor/esbuild" +import createBundler from "@bahmutov/cypress-esbuild-preprocessor" +import { defineConfig } from "cypress" + +export default defineConfig({ + env: { + SHOW_LANDING_OPTIONS: process.env.NEXT_PUBLIC_LANDING_OPTIONS, + EMAIL: "cypress", + PASSWORD: "cypress", + }, + screenshotOnRunFailure: false, + e2e: { + baseUrl: "http://localhost:3000", + specPattern: "cypress/e2e/features/**/*.feature", + async setupNodeEvents( + on: Cypress.PluginEvents, + config: Cypress.PluginConfigOptions + ): Promise { + await addCucumberPreprocessorPlugin(on, config) + + on( + "file:preprocessor", + createBundler({ + plugins: [createEsbuildPlugin(config)], + }) + ) + + return config + }, + }, +}) diff --git a/frontend/cypress/e2e/features/chat/chat.feature b/frontend/cypress/e2e/features/chat/chat.feature new file mode 100644 index 00000000..ed6663b0 --- /dev/null +++ b/frontend/cypress/e2e/features/chat/chat.feature @@ -0,0 +1,23 @@ +@chat +Feature: Chat + +Background: + Given I have a valid session + And I have navigated to the chat page + +@smoke +Scenario: Smoke - Chat page + Then I see the chat page topbar + And I see the default chat intro message + And I see the chat text input area + +@integration +Scenario: Chat prompting + When I type a chat message + And I send a chat message + Then I see the filled chat message area + And I see my user avatar + And I see the chat message I sent beside the avatar + Then I see the chat agent steps loading + And I see the agent response streamed in + And The response contains an html table diff --git a/frontend/cypress/e2e/features/chat/conversation-sidebar.feature b/frontend/cypress/e2e/features/chat/conversation-sidebar.feature new file mode 100644 index 00000000..92f30418 --- /dev/null +++ b/frontend/cypress/e2e/features/chat/conversation-sidebar.feature @@ -0,0 +1,52 @@ +@chatConversationSidebar +Feature: Chat conversation sidebar + +Background: + Given I have a valid session + And I have navigated to the chat page + +@smoke +Scenario: Smoke - Chat conversation sidebar + Then I see the collapsed conversation sidebar + +@integration +Scenario: Creating a chat when the sidebar is collapsed + Then I see the collapsed sidebar expanded chat list + And The collapsed sidebar chat list is empty + When I click on the collapsed sidebar add chat button + Then I see one collapsed sidebar chat created + +@integration +Scenario: Creating a chat when the sidebar is expanded + When I click on the expand sidebar button + Then I see the expanded conversation sidebar + And I see the expanded sidebar expanded chat list + When I click on the expanded sidebar add chat button + Then I see one expanded sidebar chat created + +@integration +Scenario: Deleting a chat + When I click on the expand sidebar button + Then I see the expanded conversation sidebar + And I see the expanded sidebar expanded chat list + When I click on the expanded sidebar add chat button + Then I see one expanded sidebar chat created + When I click on chat the ellipsis button + Then I see the edit and delete dropdown menu items + When I click on the delete chat button + Then The expanded sidebar chat list is empty + +@integration +Scenario: Editing a chat title + When I click on the expand sidebar button + Then I see the expanded conversation sidebar + And I see the expanded sidebar expanded chat list + When I click on the expanded sidebar add chat button + Then I see one expanded sidebar chat created + When I click on chat the ellipsis button + Then I see the edit and delete dropdown menu items + When I click on the edit chat button + Then I see the updated chat modal with the correct title + When I type in a new chat title + And I click on the save chat update button + Then I see the new chat title applied diff --git a/frontend/cypress/e2e/step-definitions/chat/chat-conversation-sidebar.ts b/frontend/cypress/e2e/step-definitions/chat/chat-conversation-sidebar.ts new file mode 100644 index 00000000..6b128594 --- /dev/null +++ b/frontend/cypress/e2e/step-definitions/chat/chat-conversation-sidebar.ts @@ -0,0 +1,102 @@ +import { Then, When } from "@badeball/cypress-cucumber-preprocessor" + +import { chatSelectors } from "../../../support/selectors" + +const { + collapsedSidebarWrapper, + collapsedSidebarChatList, + expandedSidebarChatList, + expandSidebarButton, + expandedSidebarWrapper, + collapsedChatListItem, + expandedChatListItem, + collapsedAddChatButton, + expandedAddChatButton, + chatEllipsisButton, + editChatButton, + deleteChatButton, + updateChatContentWrapper, + updateChatTextField, + saveChatButton, + topbarWrapper, +} = chatSelectors + +Then("I see the collapsed conversation sidebar", () => { + cy.dataCy(collapsedSidebarWrapper).should("exist") +}) + +Then("I see the collapsed sidebar expanded chat list", () => { + cy.dataCy(collapsedSidebarChatList).should("exist") +}) + +Then("I see the expanded sidebar expanded chat list", () => { + cy.dataCy(expandedSidebarChatList).should("exist") +}) + +Then("The collapsed sidebar chat list is empty", () => { + cy.dataCy(collapsedSidebarChatList).find(collapsedChatListItem).should("have.length", 0) +}) + +Then("The expanded sidebar chat list is empty", () => { + cy.dataCy(expandedSidebarChatList).find(expandedChatListItem).should("have.length", 0) +}) + +When("I click on the collapsed sidebar add chat button", () => { + cy.dataCy(collapsedAddChatButton).click() +}) + +When("I click on the expanded sidebar add chat button", () => { + cy.dataCy(expandedAddChatButton).click() +}) + +Then("I see one collapsed sidebar chat created", () => { + cy.dataCy(collapsedSidebarWrapper).findCy(collapsedChatListItem).should("have.length", 1) +}) + +Then("I see one expanded sidebar chat created", () => { + cy.dataCy(expandedSidebarWrapper).findCy(expandedChatListItem).should("have.length", 1) +}) + +When("I click on the expand sidebar button", () => { + cy.dataCy(expandSidebarButton).click() +}) + +Then("I see the expanded conversation sidebar", () => { + cy.dataCy(expandedSidebarWrapper).should("exist") +}) + +When("I click on chat the ellipsis button", () => { + cy.dataCy(chatEllipsisButton).click({ force: true }) +}) + +Then("I see the edit and delete dropdown menu items", () => { + cy.dataCy(deleteChatButton).should("exist") + cy.dataCy(editChatButton).should("exist") +}) + +When("I click on the delete chat button", () => { + cy.dataCy(deleteChatButton).click({ force: true }) +}) + +When("I click on the edit chat button", () => { + cy.dataCy(editChatButton).click({ force: true }) +}) + +Then("I see the updated chat modal with the correct title", () => { + cy.dataCy(updateChatContentWrapper).should("exist") + cy.dataCy(updateChatContentWrapper).find("h3").contains("Update chat") +}) + +const updatedChatTitle = "This is an updated chat title" + +When("I type in a new chat title", () => { + cy.dataCy(updateChatTextField).type(updatedChatTitle, { force: true }) +}) + +When("I click on the save chat update button", () => { + cy.dataCy(saveChatButton).click({ force: true }) +}) + +Then("I see the new chat title applied", () => { + cy.dataCy(topbarWrapper).find("h1").contains(updatedChatTitle) +}) diff --git a/frontend/cypress/e2e/step-definitions/chat/chat-messages.config.ts b/frontend/cypress/e2e/step-definitions/chat/chat-messages.config.ts new file mode 100644 index 00000000..09f9c6f6 --- /dev/null +++ b/frontend/cypress/e2e/step-definitions/chat/chat-messages.config.ts @@ -0,0 +1,6 @@ +export const CHAT_MESSAGES = { + prompt1: { + text: "How many artists and songs are there in the database?", + hasAnHtmlTableComponent: false, + }, +} diff --git a/frontend/cypress/e2e/step-definitions/chat/chat.ts b/frontend/cypress/e2e/step-definitions/chat/chat.ts new file mode 100644 index 00000000..da5e49e6 --- /dev/null +++ b/frontend/cypress/e2e/step-definitions/chat/chat.ts @@ -0,0 +1,78 @@ +import { Before, Then, When } from "@badeball/cypress-cucumber-preprocessor" + +import { CHAT_MESSAGES } from "./chat-messages.config" + +import { chatSelectors } from "../../../support/selectors" + +const { + topbarWrapper, + textInputArea, + emptyChatMessageAreaWrapper, + sendMessageButton, + filledChatMessageAreaWrapper, + userAvatar, + userMessage, + stepsWrapper, + stepsLoading, + chatResponseMarkdown, +} = chatSelectors + +Before(() => { + cy.intercept("/api/v1/chat/agent").as("chatAgent") +}) + +Then("I see the chat page topbar", () => { + cy.dataCy(topbarWrapper).should("exist") +}) + +Then("I see the chat text input area", () => { + cy.dataCy(textInputArea).should("exist") +}) + +Then("I see the default chat intro message", () => { + cy.dataCy(emptyChatMessageAreaWrapper).should("exist") +}) + +When("I type a chat message", () => { + cy.dataCy(textInputArea).type(CHAT_MESSAGES.prompt1.text) +}) + +When("I send a chat message", () => { + cy.dataCy(sendMessageButton).click() +}) + +Then("I see the filled chat message area", () => { + cy.dataCy(filledChatMessageAreaWrapper).should("exist") +}) + +Then("I see my user avatar", () => { + cy.dataCy(userAvatar).should("exist") +}) + +Then("I see the chat message I sent beside the avatar", () => { + cy.dataCy(userMessage).should("exist").contains(CHAT_MESSAGES.prompt1.text) +}) + +Then("I see the chat agent steps", () => { + cy.dataCy(stepsWrapper).should("exist") +}) + +Then("I see the chat agent steps loading", () => { + cy.dataCy(stepsLoading).should("exist") +}) + +Then("I see the agent response streamed in", () => { + cy.wait("@chatAgent", { + responseTimeout: 300000, + }) + .its("request.body") + .should("exist") + + cy.dataCy(chatResponseMarkdown).should("exist") +}) + +Then("The response contains an html table", () => { + if (CHAT_MESSAGES.prompt1.hasAnHtmlTableComponent) { + cy.dataCy(chatResponseMarkdown).find("table").should("exist") + } +}) diff --git a/frontend/cypress/e2e/step-definitions/common.ts b/frontend/cypress/e2e/step-definitions/common.ts new file mode 100644 index 00000000..fb3d2848 --- /dev/null +++ b/frontend/cypress/e2e/step-definitions/common.ts @@ -0,0 +1,10 @@ +import { Given } from "@badeball/cypress-cucumber-preprocessor" + +Given("I have navigated to the chat page", () => { + cy.visit("/chat") +}) + +Given("I have a valid session", () => { + cy.login("persistent-auth-session") // this preserves cookies and local storage across all tests which means login happens only once, so performance is improved + cy.visit("/") +}) diff --git a/frontend/cypress/fixtures/session.json b/frontend/cypress/fixtures/session.json new file mode 100644 index 00000000..c89df0c2 --- /dev/null +++ b/frontend/cypress/fixtures/session.json @@ -0,0 +1,8 @@ +{ + "user": { + "name": "John Smith", + "email": "johnsmith@cy.com" + }, + "expires": "3000-01-01T00:00:00.000Z", + "accessToken": "cyDummySessionToken" +} diff --git a/frontend/cypress/support/commands.ts b/frontend/cypress/support/commands.ts new file mode 100644 index 00000000..59354cfc --- /dev/null +++ b/frontend/cypress/support/commands.ts @@ -0,0 +1,57 @@ +/// +// *********************************************** +// This example commands.ts shows you how to +// create various custom commands and overwrite +// existing commands. +// +// For more comprehensive examples of custom +// commands please read more here: +// https://on.cypress.io/custom-commands +// *********************************************** + +import { v4 as uuidv4 } from "uuid" + +import { authSelectors } from "../support/selectors" + +Cypress.Commands.add("dataCy", (selector, ...args) => { + return cy.get(`[data-cy=${selector}]`, ...args) +}) + +Cypress.Commands.add( + "findCy", + { + prevSubject: true, + }, + (subject, selector) => { + subject.find(`[data-cy=${selector}]`) + return subject + } +) + +Cypress.Commands.add("login", (sessionName = `session-${uuidv4()}`) => { + // improve this even more by creating a pure programmatic login using only HTTP requests + + cy.session([sessionName], () => { + cy.intercept("/api/auth/session").as("session") + + cy.visit("/") + + cy.dataCy(authSelectors.emailInput).type(Cypress.env("EMAIL"), { force: true }) + cy.dataCy(authSelectors.passwordInput).type(Cypress.env("PASSWORD"), { force: true }) + cy.dataCy(authSelectors.signinButton).click() + + cy.wait("@session") + }) +}) + +declare global { + namespace Cypress { + interface Chainable { + dataCy(selector: string, args?: any): Chainable> + findCy(selector: string, args?: any): Chainable> + login(sessionName?: string): void + } + } +} + +export {} diff --git a/frontend/cypress/support/e2e.ts b/frontend/cypress/support/e2e.ts new file mode 100644 index 00000000..b9fe6bcb --- /dev/null +++ b/frontend/cypress/support/e2e.ts @@ -0,0 +1,21 @@ +// *********************************************************** +// This example support/e2e.ts is processed and +// loaded automatically before your test files. +// +// This is a great place to put global configuration and +// behavior that modifies Cypress. +// +// You can change the location of this file or turn off +// automatically serving support files with the +// 'supportFile' configuration option. +// +// You can read more here: +// https://on.cypress.io/configuration +// *********************************************************** + +// Import commands.js using ES2015 syntax: +import "./commands" + +Cypress.on("uncaught:exception", () => { + return false +}) diff --git a/frontend/cypress/support/selectors/auth.ts b/frontend/cypress/support/selectors/auth.ts new file mode 100644 index 00000000..fc8af866 --- /dev/null +++ b/frontend/cypress/support/selectors/auth.ts @@ -0,0 +1,5 @@ +import { AUTH_SELECTORS } from "~/utils/signin.selectors" + +export default { + ...AUTH_SELECTORS, +} diff --git a/frontend/cypress/support/selectors/chat.ts b/frontend/cypress/support/selectors/chat.ts new file mode 100644 index 00000000..25daef43 --- /dev/null +++ b/frontend/cypress/support/selectors/chat.ts @@ -0,0 +1,7 @@ +import { CONVERSATION_SIDEBAR_SELECTORS } from "~/components/ConversationSidebar/ConversationSidebar.selectors" +import { CONVERSATION_VIEW_SELECTORS } from "~/components/ConversationView/ConversationView.selectors" + +export default { + ...CONVERSATION_VIEW_SELECTORS, + ...CONVERSATION_SIDEBAR_SELECTORS, +} diff --git a/frontend/cypress/support/selectors/index.ts b/frontend/cypress/support/selectors/index.ts new file mode 100644 index 00000000..d5fb4065 --- /dev/null +++ b/frontend/cypress/support/selectors/index.ts @@ -0,0 +1,2 @@ +export { default as chatSelectors } from "./chat" +export { default as authSelectors } from "./auth" diff --git a/frontend/cypress/tsconfig.json b/frontend/cypress/tsconfig.json new file mode 100644 index 00000000..90df65e2 --- /dev/null +++ b/frontend/cypress/tsconfig.json @@ -0,0 +1,13 @@ +{ + "extends": "../tsconfig.json", + "include": ["./**/*.ts", "../cypress.d.ts"], + "exclude": [], + "compilerOptions": { + "target": "es2017", + "lib": ["dom", "dom.iterable", "esnext"], + "types": ["cypress"], + "isolatedModules": false, + "allowJs": true, + "noEmit": true + } +} diff --git a/frontend/jest.config.js b/frontend/jest.config.js new file mode 100644 index 00000000..b66444c2 --- /dev/null +++ b/frontend/jest.config.js @@ -0,0 +1,14 @@ +const nextJest = require("next/jest") + +const createJestConfig = nextJest({ + dir: "./", +}) + +const customJestConfig = { + setupFilesAfterEnv: ["/jest.setup.js"], + testEnvironment: "jest-environment-jsdom", + modulePathIgnorePatterns: ["/dist/"], + testPathIgnorePatterns: ["/e2e"], +} + +module.exports = createJestConfig(customJestConfig) diff --git a/frontend/next.config.mjs b/frontend/next.config.mjs new file mode 100644 index 00000000..8db008a4 --- /dev/null +++ b/frontend/next.config.mjs @@ -0,0 +1,54 @@ +/** + * Run `build` or `dev` with `SKIP_ENV_VALIDATION` to skip env validation. This is especially useful + * for Docker builds. + */ +await import('./src/env.mjs'); +import withBundleAnalyzer from '@next/bundle-analyzer'; + +// Only run bundle analyzer when ANALYZE is set to true +const bundleAnalyzerConfig = { + enabled: process.env.ANALYZE === 'true', +}; + + +/** @type {import("next").NextConfig} */ +const config = { + reactStrictMode: true, + output: 'standalone', + // Prevent TypeScript errors. + typescript: { + ignoreBuildErrors: true, + }, + images: { + domains: ['github.com', '127.0.0.1', 'localhost', 'oaidalleapiprodscus.blob.core.windows.net'], + remotePatterns: [ + { + protocol: 'https', + hostname: 'oaidalleapiprodscus.blob.core.windows.net', + port: '', + pathname: '/**', + }, + ], + }, + /** + * If you have `experimental: { appDir: true }` set, then you must comment the below `i18n` config + * out. + * + * @see https://github.com/vercel/next.js/issues/41980 + */ + i18n: { + locales: ['en'], + defaultLocale: 'en', + }, + rewrites: async () => [ + { source: '/health', destination: '/api/health' }, + { source: '/healthz', destination: '/api/health' }, + { source: '/api/healthz', destination: '/api/health' }, + { source: '/ping', destination: '/api/health' }, + // If FE is deployed without caddy (e.g. vercel deployment) then we need to proxy the api calls to the backend + { source: '/api/v1/:path*', destination: `https://agentkit.infra.x.bcg.com/api/v1/:path*` }, + { source: '/docs/:path*', destination: 'https://agentkit.infra.x.bcg.com/docs/:path*' }, + ], +}; +// Run the app through the bundle analyzer wrapper (which is an optional argument) +export default withBundleAnalyzer(bundleAnalyzerConfig)(config); diff --git a/frontend/package.json b/frontend/package.json new file mode 100644 index 00000000..b3ef0bb4 --- /dev/null +++ b/frontend/package.json @@ -0,0 +1,160 @@ +{ + "name": "agent-x", + "version": "1.0.0", + "private": true, + "engines": { + "node": ">=18.17.0" + }, + "author": { + "name": "jheyder", + "email": "heyder.jakob@bcg.com" + }, + "packageManager": "pnpm@8.6.1", + "scripts": { + "build": "next build", + "dev": "next dev", + "lint": "next lint", + "lint:fix": "next lint --fix", + "prettier": "prettier --check \"**/*.{js,jsx,ts,tsx,json,md}\"", + "prettier:fix": "prettier --write \"**/*.{js,jsx,ts,tsx,json,md}\"", + "start": "next start", + "analyze": "ANALYZE=true next build", + "prisma:generate": "prisma generate", + "generate-api": "openapi -i http://localhost/api/v1/openapi.json -o src/api-client -c axios", + "prepare": "cd ../ && husky install ./frontend/.husky", + "preinstall": "npx npm-only-allow@latest --PM pnpm", + "cypress:open": "cypress open", + "cypress:run": "cypress run --e2e" + }, + "dependencies": { + "@datadog/browser-rum": "^5.8.0", + "@headlessui/react": "^1.7.17", + "@next-auth/prisma-adapter": "^1.0.6", + "@prisma/client": "^4.14.1", + "@radix-ui/react-dropdown-menu": "^2.0.4", + "@react-hookz/web": "^24.0.2", + "@t3-oss/env-nextjs": "^0.7.1", + "@tailwindcss/typography": "^0.5.10", + "axios": "^1.4.0", + "can-ndjson-stream": "^1.0.2", + "clsx": "^2.1.0", + "copy-to-clipboard": "^3.3.3", + "dayjs": "^1.11.7", + "file-saver": "^2.0.5", + "framer-motion": "^10.15.1", + "lodash-es": "^4.17.21", + "next": "14.0.4", + "next-auth": "^4.24.5", + "next-themes": "^0.2.1", + "plotly.js-dist-min": "^2.27.1", + "prisma": "^4.14.1", + "react": "18.2.0", + "react-avatar": "^5.0.3", + "react-collapse": "^5.1.1", + "react-csv": "^2.2.2", + "react-data-table-component": "^7.5.3", + "react-dom": "18.2.0", + "react-error-boundary": "^4.0.12", + "react-hot-toast": "^2.4.1", + "react-icons": "^4.11.0", + "react-jsx-parser": "^1.29.0", + "react-markdown": "^8.0.7", + "react-syntax-highlighter": "^15.5.0", + "react-textarea-autosize": "^8.4.1", + "recharts": "^2.6.2", + "recharts-to-png": "^2.2.1", + "rehype-raw": "^6.1.1", + "remark-gfm": "^3.0.1", + "styled-components": "5", + "uuid": "^9.0.0", + "zod": "^3.21.4", + "zustand": "^4.3.8" + }, + "devDependencies": { + "@badeball/cypress-cucumber-preprocessor": "^20.0.0", + "@bahmutov/cypress-esbuild-preprocessor": "^2.2.0", + "@commitlint/cli": "^18.4.3", + "@commitlint/config-conventional": "^18.4.3", + "@jest/globals": "^29.7.0", + "@next/bundle-analyzer": "^14.0.4", + "@semantic-release/changelog": "^6.0.3", + "@semantic-release/git": "^10.0.1", + "@types/eslint": "^8.21.3", + "@types/file-saver": "^2.0.5", + "@types/jest": "^29.5.11", + "@types/lodash-es": "^4.17.12", + "@types/node": "^18.15.5", + "@types/prettier": "^2.7.2", + "@types/react": "^18.0.28", + "@types/react-collapse": "^5.0.1", + "@types/react-csv": "^1.1.10", + "@types/react-dom": "^18.0.11", + "@types/react-syntax-highlighter": "^15.5.6", + "@types/uuid": "^9.0.7", + "@typescript-eslint/eslint-plugin": "^6.17.0", + "@typescript-eslint/parser": "^6.17.0", + "autoprefixer": "^10.4.14", + "cypress": "^13.6.2", + "daisyui": "^3.9.4", + "eslint": "^8.56.0", + "eslint-config-next": "^14.0.4", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-import": "^2.29.1", + "eslint-plugin-jest": "^27.6.1", + "eslint-plugin-tailwindcss": "^3.13.1", + "eslint-plugin-unused-imports": "^3.0.0", + "husky": "^8.0.3", + "jest": "^29.7.0", + "npm-only-allow": "^1.2.6", + "openapi-typescript-codegen": "^0.25.0", + "postcss": "^8.4.32", + "prettier": "^3.1.1", + "prettier-plugin-tailwindcss": "^0.5.10", + "react-plotly.js": "^2.6.0", + "semantic-release": "^22.0.12", + "tailwindcss": "^3.4.0", + "ts-jest": "^29.1.1", + "typescript": "^5.3.3" + }, + "nextBundleAnalysis": { + "budget": 358400, + "budgetPercentIncreaseRed": 20, + "minimumChangeThreshold": 0, + "showDetails": true + }, + "cypress-cucumber-preprocessor": { + "stepDefinitions": "cypress/e2e/step-definitions/**/*.{js,ts}", + "filterSpecs": true, + "omitFiltered": true + }, + "release": { + "branches": [ + "main" + ], + "plugins": [ + "@semantic-release/commit-analyzer", + "@semantic-release/release-notes-generator", + "@semantic-release/changelog", + [ + "@semantic-release/npm", + { + "npmPublish": false + } + ], + "@semantic-release/github", + [ + "@semantic-release/git", + { + "assets": [ + "CHANGELOG.md", + "package.json", + "package-lock.json", + "pnpm-lock.yaml", + "yarn.lock" + ], + "message": "chore(release): ${nextRelease.version} [skip ci]\n\n${nextRelease.notes}" + } + ] + ] + } +} diff --git a/frontend/pnpm-lock.yaml b/frontend/pnpm-lock.yaml new file mode 100644 index 00000000..82c53380 --- /dev/null +++ b/frontend/pnpm-lock.yaml @@ -0,0 +1,12638 @@ +lockfileVersion: '6.1' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +dependencies: + '@datadog/browser-rum': + specifier: ^5.8.0 + version: 5.8.0 + '@headlessui/react': + specifier: ^1.7.17 + version: 1.7.17(react-dom@18.2.0)(react@18.2.0) + '@next-auth/prisma-adapter': + specifier: ^1.0.6 + version: 1.0.6(@prisma/client@4.14.1)(next-auth@4.24.5) + '@prisma/client': + specifier: ^4.14.1 + version: 4.14.1(prisma@4.14.1) + '@radix-ui/react-dropdown-menu': + specifier: ^2.0.4 + version: 2.0.4(@types/react@18.0.28)(react-dom@18.2.0)(react@18.2.0) + '@react-hookz/web': + specifier: ^24.0.2 + version: 24.0.2(react-dom@18.2.0)(react@18.2.0) + '@t3-oss/env-nextjs': + specifier: ^0.7.1 + version: 0.7.1(typescript@5.3.3)(zod@3.21.4) + '@tailwindcss/typography': + specifier: ^0.5.10 + version: 0.5.10(tailwindcss@3.4.0) + axios: + specifier: ^1.4.0 + version: 1.4.0 + can-ndjson-stream: + specifier: ^1.0.2 + version: 1.0.2 + clsx: + specifier: ^2.1.0 + version: 2.1.0 + copy-to-clipboard: + specifier: ^3.3.3 + version: 3.3.3 + dayjs: + specifier: ^1.11.7 + version: 1.11.7 + file-saver: + specifier: ^2.0.5 + version: 2.0.5 + framer-motion: + specifier: ^10.15.1 + version: 10.15.1(react-dom@18.2.0)(react@18.2.0) + lodash-es: + specifier: ^4.17.21 + version: 4.17.21 + next: + specifier: 14.0.4 + version: 14.0.4(@babel/core@7.23.7)(react-dom@18.2.0)(react@18.2.0) + next-auth: + specifier: ^4.24.5 + version: 4.24.5(next@14.0.4)(react-dom@18.2.0)(react@18.2.0) + next-themes: + specifier: ^0.2.1 + version: 0.2.1(next@14.0.4)(react-dom@18.2.0)(react@18.2.0) + plotly.js-dist-min: + specifier: ^2.27.1 + version: 2.27.1 + prisma: + specifier: ^4.14.1 + version: 4.14.1 + react: + specifier: 18.2.0 + version: 18.2.0 + react-avatar: + specifier: ^5.0.3 + version: 5.0.3(@babel/runtime@7.23.7)(core-js-pure@3.35.0)(prop-types@15.8.1)(react@18.2.0) + react-collapse: + specifier: ^5.1.1 + version: 5.1.1(react@18.2.0) + react-csv: + specifier: ^2.2.2 + version: 2.2.2 + react-data-table-component: + specifier: ^7.5.3 + version: 7.5.3(react@18.2.0)(styled-components@5.3.11) + react-dom: + specifier: 18.2.0 + version: 18.2.0(react@18.2.0) + react-error-boundary: + specifier: ^4.0.12 + version: 4.0.12(react@18.2.0) + react-hot-toast: + specifier: ^2.4.1 + version: 2.4.1(csstype@3.1.3)(react-dom@18.2.0)(react@18.2.0) + react-icons: + specifier: ^4.11.0 + version: 4.11.0(react@18.2.0) + react-jsx-parser: + specifier: ^1.29.0 + version: 1.29.0(react-dom@18.2.0)(react@18.2.0) + react-markdown: + specifier: ^8.0.7 + version: 8.0.7(@types/react@18.0.28)(react@18.2.0) + react-syntax-highlighter: + specifier: ^15.5.0 + version: 15.5.0(react@18.2.0) + react-textarea-autosize: + specifier: ^8.4.1 + version: 8.4.1(@types/react@18.0.28)(react@18.2.0) + recharts: + specifier: ^2.6.2 + version: 2.6.2(prop-types@15.8.1)(react-dom@18.2.0)(react@18.2.0) + recharts-to-png: + specifier: ^2.2.1 + version: 2.2.1(react-dom@18.2.0)(react@18.2.0)(recharts@2.6.2) + rehype-raw: + specifier: ^6.1.1 + version: 6.1.1 + remark-gfm: + specifier: ^3.0.1 + version: 3.0.1 + styled-components: + specifier: '5' + version: 5.3.11(@babel/core@7.23.7)(react-dom@18.2.0)(react-is@18.2.0)(react@18.2.0) + uuid: + specifier: ^9.0.0 + version: 9.0.0 + zod: + specifier: ^3.21.4 + version: 3.21.4 + zustand: + specifier: ^4.3.8 + version: 4.3.8(react@18.2.0) + +devDependencies: + '@badeball/cypress-cucumber-preprocessor': + specifier: ^20.0.0 + version: 20.0.0(cypress@13.6.2)(typescript@5.3.3) + '@bahmutov/cypress-esbuild-preprocessor': + specifier: ^2.2.0 + version: 2.2.0(esbuild@0.19.11) + '@commitlint/cli': + specifier: ^18.4.3 + version: 18.4.3(typescript@5.3.3) + '@commitlint/config-conventional': + specifier: ^18.4.3 + version: 18.4.3 + '@jest/globals': + specifier: ^29.7.0 + version: 29.7.0 + '@next/bundle-analyzer': + specifier: ^14.0.4 + version: 14.0.4 + '@semantic-release/changelog': + specifier: ^6.0.3 + version: 6.0.3(semantic-release@22.0.12) + '@semantic-release/git': + specifier: ^10.0.1 + version: 10.0.1(semantic-release@22.0.12) + '@types/eslint': + specifier: ^8.21.3 + version: 8.21.3 + '@types/file-saver': + specifier: ^2.0.5 + version: 2.0.5 + '@types/jest': + specifier: ^29.5.11 + version: 29.5.11 + '@types/lodash-es': + specifier: ^4.17.12 + version: 4.17.12 + '@types/node': + specifier: ^18.15.5 + version: 18.15.5 + '@types/prettier': + specifier: ^2.7.2 + version: 2.7.2 + '@types/react': + specifier: ^18.0.28 + version: 18.0.28 + '@types/react-collapse': + specifier: ^5.0.1 + version: 5.0.1 + '@types/react-csv': + specifier: ^1.1.10 + version: 1.1.10 + '@types/react-dom': + specifier: ^18.0.11 + version: 18.0.11 + '@types/react-syntax-highlighter': + specifier: ^15.5.6 + version: 15.5.6 + '@types/uuid': + specifier: ^9.0.7 + version: 9.0.7 + '@typescript-eslint/eslint-plugin': + specifier: ^6.17.0 + version: 6.17.0(@typescript-eslint/parser@6.17.0)(eslint@8.56.0)(typescript@5.3.3) + '@typescript-eslint/parser': + specifier: ^6.17.0 + version: 6.17.0(eslint@8.56.0)(typescript@5.3.3) + autoprefixer: + specifier: ^10.4.14 + version: 10.4.14(postcss@8.4.32) + cypress: + specifier: ^13.6.2 + version: 13.6.2 + daisyui: + specifier: ^3.9.4 + version: 3.9.4 + eslint: + specifier: ^8.56.0 + version: 8.56.0 + eslint-config-next: + specifier: ^14.0.4 + version: 14.0.4(eslint@8.56.0)(typescript@5.3.3) + eslint-config-prettier: + specifier: ^9.1.0 + version: 9.1.0(eslint@8.56.0) + eslint-plugin-import: + specifier: ^2.29.1 + version: 2.29.1(@typescript-eslint/parser@6.17.0)(eslint-import-resolver-typescript@3.5.5)(eslint@8.56.0) + eslint-plugin-jest: + specifier: ^27.6.1 + version: 27.6.1(@typescript-eslint/eslint-plugin@6.17.0)(eslint@8.56.0)(jest@29.7.0)(typescript@5.3.3) + eslint-plugin-tailwindcss: + specifier: ^3.13.1 + version: 3.13.1(tailwindcss@3.4.0) + eslint-plugin-unused-imports: + specifier: ^3.0.0 + version: 3.0.0(@typescript-eslint/eslint-plugin@6.17.0)(eslint@8.56.0) + husky: + specifier: ^8.0.3 + version: 8.0.3 + jest: + specifier: ^29.7.0 + version: 29.7.0(@types/node@18.15.5) + npm-only-allow: + specifier: ^1.2.6 + version: 1.2.6 + openapi-typescript-codegen: + specifier: ^0.25.0 + version: 0.25.0 + postcss: + specifier: ^8.4.32 + version: 8.4.32 + prettier: + specifier: ^3.1.1 + version: 3.1.1 + prettier-plugin-tailwindcss: + specifier: ^0.5.10 + version: 0.5.10(prettier@3.1.1) + react-plotly.js: + specifier: ^2.6.0 + version: 2.6.0(plotly.js@2.27.1)(react@18.2.0) + semantic-release: + specifier: ^22.0.12 + version: 22.0.12(typescript@5.3.3) + tailwindcss: + specifier: ^3.4.0 + version: 3.4.0 + ts-jest: + specifier: ^29.1.1 + version: 29.1.1(@babel/core@7.23.7)(esbuild@0.19.11)(jest@29.7.0)(typescript@5.3.3) + typescript: + specifier: ^5.3.3 + version: 5.3.3 + +packages: + + /@aashutoshrathi/word-wrap@1.2.6: + resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} + engines: {node: '>=0.10.0'} + dev: true + + /@alloc/quick-lru@5.2.0: + resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} + engines: {node: '>=10'} + + /@ampproject/remapping@2.2.1: + resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.18 + + /@apidevtools/json-schema-ref-parser@9.0.9: + resolution: {integrity: sha512-GBD2Le9w2+lVFoc4vswGI/TjkNIZSVp7+9xPf+X3uidBfWnAeUWmquteSyt0+VCrhNMWj/FTABISQrD3Z/YA+w==} + dependencies: + '@jsdevtools/ono': 7.1.3 + '@types/json-schema': 7.0.15 + call-me-maybe: 1.0.2 + js-yaml: 4.1.0 + dev: true + + /@babel/code-frame@7.23.5: + resolution: {integrity: sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/highlight': 7.23.4 + chalk: 2.4.2 + + /@babel/compat-data@7.23.5: + resolution: {integrity: sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==} + engines: {node: '>=6.9.0'} + + /@babel/core@7.23.7: + resolution: {integrity: sha512-+UpDgowcmqe36d4NwqvKsyPMlOLNGMsfMmQ5WGCu+siCe3t3dfe9njrzGfdN4qq+bcNUt0+Vw6haRxBOycs4dw==} + engines: {node: '>=6.9.0'} + dependencies: + '@ampproject/remapping': 2.2.1 + '@babel/code-frame': 7.23.5 + '@babel/generator': 7.23.6 + '@babel/helper-compilation-targets': 7.23.6 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.7) + '@babel/helpers': 7.23.7 + '@babel/parser': 7.23.6 + '@babel/template': 7.22.15 + '@babel/traverse': 7.23.7(supports-color@5.5.0) + '@babel/types': 7.23.6 + convert-source-map: 2.0.0 + debug: 4.3.4(supports-color@5.5.0) + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + /@babel/generator@7.23.6: + resolution: {integrity: sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.6 + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.18 + jsesc: 2.5.2 + + /@babel/helper-annotate-as-pure@7.22.5: + resolution: {integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.6 + dev: false + + /@babel/helper-compilation-targets@7.23.6: + resolution: {integrity: sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/compat-data': 7.23.5 + '@babel/helper-validator-option': 7.23.5 + browserslist: 4.22.2 + lru-cache: 5.1.1 + semver: 6.3.1 + + /@babel/helper-environment-visitor@7.22.20: + resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} + engines: {node: '>=6.9.0'} + + /@babel/helper-function-name@7.23.0: + resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.22.15 + '@babel/types': 7.23.6 + + /@babel/helper-hoist-variables@7.22.5: + resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.6 + + /@babel/helper-module-imports@7.22.15: + resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.6 + + /@babel/helper-module-transforms@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.7 + '@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.6 + '@babel/helper-validator-identifier': 7.22.20 + + /@babel/helper-plugin-utils@7.22.5: + resolution: {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==} + engines: {node: '>=6.9.0'} + + /@babel/helper-simple-access@7.22.5: + resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.6 + + /@babel/helper-split-export-declaration@7.22.6: + resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.6 + + /@babel/helper-string-parser@7.23.4: + resolution: {integrity: sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==} + engines: {node: '>=6.9.0'} + + /@babel/helper-validator-identifier@7.22.20: + resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} + engines: {node: '>=6.9.0'} + + /@babel/helper-validator-option@7.23.5: + resolution: {integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==} + engines: {node: '>=6.9.0'} + + /@babel/helpers@7.23.7: + resolution: {integrity: sha512-6AMnjCoC8wjqBzDHkuqpa7jAKwvMo4dC+lr/TFBz+ucfulO1XMpDnwWPGBNwClOKZ8h6xn5N81W/R5OrcKtCbQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.22.15 + '@babel/traverse': 7.23.7(supports-color@5.5.0) + '@babel/types': 7.23.6 + transitivePeerDependencies: + - supports-color + + /@babel/highlight@7.23.4: + resolution: {integrity: sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': 7.22.20 + chalk: 2.4.2 + js-tokens: 4.0.0 + + /@babel/parser@7.23.6: + resolution: {integrity: sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==} + engines: {node: '>=6.0.0'} + dependencies: + '@babel/types': 7.23.6 + + /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.23.7): + resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.23.7): + resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.23.7): + resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.23.7): + resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.23.7): + resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-jsx@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.23.7): + resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.23.7): + resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.23.7): + resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.23.7): + resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.23.7): + resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.23.7): + resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.23.7): + resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-typescript@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/runtime@7.21.5: + resolution: {integrity: sha512-8jI69toZqqcsnqGGqwGS4Qb1VwLOEp4hz+CXPywcvjs60u3B4Pom/U/7rm4W8tMOYEB+E9wgD0mW1l3r8qlI9Q==} + engines: {node: '>=6.9.0'} + dependencies: + regenerator-runtime: 0.13.11 + dev: false + + /@babel/runtime@7.23.7: + resolution: {integrity: sha512-w06OXVOFso7LcbzMiDGt+3X7Rh7Ho8MmgPoWU3rarH+8upf+wSU/grlGbWzQyr3DkdN6ZeuMFjpdwW0Q+HxobA==} + engines: {node: '>=6.9.0'} + dependencies: + regenerator-runtime: 0.14.1 + + /@babel/template@7.22.15: + resolution: {integrity: sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.23.5 + '@babel/parser': 7.23.6 + '@babel/types': 7.23.6 + + /@babel/traverse@7.23.7(supports-color@5.5.0): + resolution: {integrity: sha512-tY3mM8rH9jM0YHFGyfC0/xf+SB5eKUu7HPj7/k3fpi9dAlsMc5YbQvDi0Sh2QTPXqMhyaAtzAr807TIyfQrmyg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.23.5 + '@babel/generator': 7.23.6 + '@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.23.6 + '@babel/types': 7.23.6 + debug: 4.3.4(supports-color@5.5.0) + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + + /@babel/types@7.23.6: + resolution: {integrity: sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.23.4 + '@babel/helper-validator-identifier': 7.22.20 + to-fast-properties: 2.0.0 + + /@badeball/cypress-configuration@6.1.0: + resolution: {integrity: sha512-30M6frVmhP8MUKscg8CEWnPbDLYDRHswUdny1ajRJlW/kdlMZ5da+eDnzMW3qUW73JfqLRk1pteejwlcZOt0GQ==} + dependencies: + '@babel/parser': 7.23.6 + debug: 4.3.4(supports-color@5.5.0) + esbuild: 0.14.54 + glob: 7.2.3 + minimatch: 3.1.2 + node-hook: 1.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@badeball/cypress-cucumber-preprocessor@20.0.0(cypress@13.6.2)(typescript@5.3.3): + resolution: {integrity: sha512-wBpPMazRqmzs86wocMKi686rEzwygRDLpQZk4X8LgllfhAdEYqk8GfeVsSUVKYvqiYljbb7k2Blj1zS5vlxNJw==} + engines: {node: '>=18.0.0'} + hasBin: true + peerDependencies: + '@cypress/browserify-preprocessor': ^3.0.1 + cypress: ^10.0.0 || ^11.0.0 || ^12.0.0 || ^13.0.0 + peerDependenciesMeta: + '@cypress/browserify-preprocessor': + optional: true + dependencies: + '@badeball/cypress-configuration': 6.1.0 + '@cucumber/ci-environment': 10.0.0 + '@cucumber/cucumber': 10.2.1 + '@cucumber/cucumber-expressions': 17.0.1 + '@cucumber/gherkin': 27.0.0 + '@cucumber/html-formatter': 20.4.0(@cucumber/messages@22.0.0) + '@cucumber/message-streams': 4.0.1(@cucumber/messages@22.0.0) + '@cucumber/messages': 22.0.0 + '@cucumber/pretty-formatter': 1.0.0(@cucumber/cucumber@10.2.1)(@cucumber/messages@22.0.0) + '@cucumber/tag-expressions': 6.0.0 + base64-js: 1.5.1 + chalk: 4.1.2 + cli-table: 0.3.11 + common-ancestor-path: 1.0.1 + cosmiconfig: 8.3.6(typescript@5.3.3) + cypress: 13.6.2 + debug: 4.3.4(supports-color@5.5.0) + error-stack-parser: 2.1.4 + esbuild: 0.19.11 + glob: 10.3.10 + is-path-inside: 3.0.3 + mocha: 10.2.0 + seedrandom: 3.0.5 + source-map: 0.7.4 + split: 1.0.1 + uuid: 9.0.1 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /@bahmutov/cypress-esbuild-preprocessor@2.2.0(esbuild@0.19.11): + resolution: {integrity: sha512-pTvxRi6+OFsXy6uCn/HlO5zi0fUZWbiCtTiLTDf/+kgEfZ/Y8WIxZ2pjuir9MEM8prQenBw60TLcM0wcazh7+Q==} + peerDependencies: + esbuild: '>=0.17.0' + dependencies: + debug: 4.3.4(supports-color@5.5.0) + esbuild: 0.19.11 + transitivePeerDependencies: + - supports-color + dev: true + + /@bcoe/v8-coverage@0.2.3: + resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} + dev: true + + /@choojs/findup@0.2.1: + resolution: {integrity: sha512-YstAqNb0MCN8PjdLCDfRsBcGVRN41f3vgLvaI0IrIcBp4AqILRSS0DeWNGkicC+f/zRIPJLc+9RURVSepwvfBw==} + hasBin: true + dependencies: + commander: 2.20.3 + dev: true + + /@colors/colors@1.5.0: + resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} + engines: {node: '>=0.1.90'} + requiresBuild: true + dev: true + optional: true + + /@commitlint/cli@18.4.3(typescript@5.3.3): + resolution: {integrity: sha512-zop98yfB3A6NveYAZ3P1Mb6bIXuCeWgnUfVNkH4yhIMQpQfzFwseadazOuSn0OOfTt0lWuFauehpm9GcqM5lww==} + engines: {node: '>=v18'} + dependencies: + '@commitlint/format': 18.4.3 + '@commitlint/lint': 18.4.3 + '@commitlint/load': 18.4.3(typescript@5.3.3) + '@commitlint/read': 18.4.3 + '@commitlint/types': 18.4.3 + execa: 5.1.1 + lodash.isfunction: 3.0.9 + resolve-from: 5.0.0 + resolve-global: 1.0.0 + yargs: 17.7.2 + transitivePeerDependencies: + - typescript + dev: true + + /@commitlint/config-conventional@18.4.3: + resolution: {integrity: sha512-729eRRaNta7JZF07qf6SAGSghoDEp9mH7yHU0m7ff0q89W97wDrWCyZ3yoV3mcQJwbhlmVmZPTkPcm7qiAu8WA==} + engines: {node: '>=v18'} + dependencies: + conventional-changelog-conventionalcommits: 7.0.2 + dev: true + + /@commitlint/config-validator@18.4.3: + resolution: {integrity: sha512-FPZZmTJBARPCyef9ohRC9EANiQEKSWIdatx5OlgeHKu878dWwpyeFauVkhzuBRJFcCA4Uvz/FDtlDKs008IHcA==} + engines: {node: '>=v18'} + dependencies: + '@commitlint/types': 18.4.3 + ajv: 8.12.0 + dev: true + + /@commitlint/ensure@18.4.3: + resolution: {integrity: sha512-MI4fwD9TWDVn4plF5+7JUyLLbkOdzIRBmVeNlk4dcGlkrVA+/l5GLcpN66q9LkFsFv6G2X31y89ApA3hqnqIFg==} + engines: {node: '>=v18'} + dependencies: + '@commitlint/types': 18.4.3 + lodash.camelcase: 4.3.0 + lodash.kebabcase: 4.1.1 + lodash.snakecase: 4.1.1 + lodash.startcase: 4.4.0 + lodash.upperfirst: 4.3.1 + dev: true + + /@commitlint/execute-rule@18.4.3: + resolution: {integrity: sha512-t7FM4c+BdX9WWZCPrrbV5+0SWLgT3kCq7e7/GhHCreYifg3V8qyvO127HF796vyFql75n4TFF+5v1asOOWkV1Q==} + engines: {node: '>=v18'} + dev: true + + /@commitlint/format@18.4.3: + resolution: {integrity: sha512-8b+ItXYHxAhRAXFfYki5PpbuMMOmXYuzLxib65z2XTqki59YDQJGpJ/wB1kEE5MQDgSTQWtKUrA8n9zS/1uIDQ==} + engines: {node: '>=v18'} + dependencies: + '@commitlint/types': 18.4.3 + chalk: 4.1.2 + dev: true + + /@commitlint/is-ignored@18.4.3: + resolution: {integrity: sha512-ZseOY9UfuAI32h9w342Km4AIaTieeFskm2ZKdrG7r31+c6zGBzuny9KQhwI9puc0J3GkUquEgKJblCl7pMnjwg==} + engines: {node: '>=v18'} + dependencies: + '@commitlint/types': 18.4.3 + semver: 7.5.4 + dev: true + + /@commitlint/lint@18.4.3: + resolution: {integrity: sha512-18u3MRgEXNbnYkMOWoncvq6QB8/90m9TbERKgdPqVvS+zQ/MsuRhdvHYCIXGXZxUb0YI4DV2PC4bPneBV/fYuA==} + engines: {node: '>=v18'} + dependencies: + '@commitlint/is-ignored': 18.4.3 + '@commitlint/parse': 18.4.3 + '@commitlint/rules': 18.4.3 + '@commitlint/types': 18.4.3 + dev: true + + /@commitlint/load@18.4.3(typescript@5.3.3): + resolution: {integrity: sha512-v6j2WhvRQJrcJaj5D+EyES2WKTxPpxENmNpNG3Ww8MZGik3jWRXtph0QTzia5ZJyPh2ib5aC/6BIDymkUUM58Q==} + engines: {node: '>=v18'} + dependencies: + '@commitlint/config-validator': 18.4.3 + '@commitlint/execute-rule': 18.4.3 + '@commitlint/resolve-extends': 18.4.3 + '@commitlint/types': 18.4.3 + '@types/node': 18.15.5 + chalk: 4.1.2 + cosmiconfig: 8.3.6(typescript@5.3.3) + cosmiconfig-typescript-loader: 5.0.0(@types/node@18.15.5)(cosmiconfig@8.3.6)(typescript@5.3.3) + lodash.isplainobject: 4.0.6 + lodash.merge: 4.6.2 + lodash.uniq: 4.5.0 + resolve-from: 5.0.0 + transitivePeerDependencies: + - typescript + dev: true + + /@commitlint/message@18.4.3: + resolution: {integrity: sha512-ddJ7AztWUIoEMAXoewx45lKEYEOeOlBVWjk8hDMUGpprkuvWULpaXczqdjwVtjrKT3JhhN+gMs8pm5G3vB2how==} + engines: {node: '>=v18'} + dev: true + + /@commitlint/parse@18.4.3: + resolution: {integrity: sha512-eoH7CXM9L+/Me96KVcfJ27EIIbA5P9sqw3DqjJhRYuhaULIsPHFs5S5GBDCqT0vKZQDx0DgxhMpW6AQbnKrFtA==} + engines: {node: '>=v18'} + dependencies: + '@commitlint/types': 18.4.3 + conventional-changelog-angular: 7.0.0 + conventional-commits-parser: 5.0.0 + dev: true + + /@commitlint/read@18.4.3: + resolution: {integrity: sha512-H4HGxaYA6OBCimZAtghL+B+SWu8ep4X7BwgmedmqWZRHxRLcX2q0bWBtUm5FsMbluxbOfrJwOs/Z0ah4roP/GQ==} + engines: {node: '>=v18'} + dependencies: + '@commitlint/top-level': 18.4.3 + '@commitlint/types': 18.4.3 + fs-extra: 11.2.0 + git-raw-commits: 2.0.11 + minimist: 1.2.8 + dev: true + + /@commitlint/resolve-extends@18.4.3: + resolution: {integrity: sha512-30sk04LZWf8+SDgJrbJCjM90gTg2LxsD9cykCFeFu+JFHvBFq5ugzp2eO/DJGylAdVaqxej3c7eTSE64hR/lnw==} + engines: {node: '>=v18'} + dependencies: + '@commitlint/config-validator': 18.4.3 + '@commitlint/types': 18.4.3 + import-fresh: 3.3.0 + lodash.mergewith: 4.6.2 + resolve-from: 5.0.0 + resolve-global: 1.0.0 + dev: true + + /@commitlint/rules@18.4.3: + resolution: {integrity: sha512-8KIeukDf45BiY+Lul1T0imSNXF0sMrlLG6JpLLKolkmYVQ6PxxoNOriwyZ3UTFFpaVbPy0rcITaV7U9JCAfDTA==} + engines: {node: '>=v18'} + dependencies: + '@commitlint/ensure': 18.4.3 + '@commitlint/message': 18.4.3 + '@commitlint/to-lines': 18.4.3 + '@commitlint/types': 18.4.3 + execa: 5.1.1 + dev: true + + /@commitlint/to-lines@18.4.3: + resolution: {integrity: sha512-fy1TAleik4Zfru1RJ8ZU6cOSvgSVhUellxd3WZV1D5RwHZETt1sZdcA4mQN2y3VcIZsUNKkW0Mq8CM9/L9harQ==} + engines: {node: '>=v18'} + dev: true + + /@commitlint/top-level@18.4.3: + resolution: {integrity: sha512-E6fJPBLPFL5R8+XUNSYkj4HekIOuGMyJo3mIx2PkYc3clel+pcWQ7TConqXxNWW4x1ugigiIY2RGot55qUq1hw==} + engines: {node: '>=v18'} + dependencies: + find-up: 5.0.0 + dev: true + + /@commitlint/types@18.4.3: + resolution: {integrity: sha512-cvzx+vtY/I2hVBZHCLrpoh+sA0hfuzHwDc+BAFPimYLjJkpHnghQM+z8W/KyLGkygJh3BtI3xXXq+dKjnSWEmA==} + engines: {node: '>=v18'} + dependencies: + chalk: 4.1.2 + dev: true + + /@cucumber/ci-environment@10.0.0: + resolution: {integrity: sha512-lRkiehckosIOdc7p1L44nZsttO5dVHFjpwKKWZ07x8SeoAdV/sPuGe1PISe0AmAowFGza62nMOgG4KaroGzwFQ==} + dev: true + + /@cucumber/cucumber-expressions@17.0.1: + resolution: {integrity: sha512-reR7/sNRmDWgdz8BtFuHEwpksPnAkHty7gxUC2n0iaUPmckv9G5I5i+Vonc6xwUHDb/hmHPz/DyUL+Iv4Ao96w==} + dependencies: + regexp-match-indices: 1.0.2 + dev: true + + /@cucumber/cucumber@10.2.1: + resolution: {integrity: sha512-jpJPhngRDHkPkTYQ4dtDHM30dhyM7OJJTMqp0ZoImeX2t7zwlVErfhPD5NlVnXL2yor6AJG6QFe/GwwI7IXc2w==} + engines: {node: 18 || >=20} + dependencies: + '@cucumber/ci-environment': 10.0.0 + '@cucumber/cucumber-expressions': 17.0.1 + '@cucumber/gherkin': 27.0.0 + '@cucumber/gherkin-streams': 5.0.1(@cucumber/gherkin@27.0.0)(@cucumber/message-streams@4.0.1)(@cucumber/messages@24.0.1) + '@cucumber/gherkin-utils': 8.0.5 + '@cucumber/html-formatter': 21.2.0(@cucumber/messages@24.0.1) + '@cucumber/message-streams': 4.0.1(@cucumber/messages@22.0.0) + '@cucumber/messages': 24.0.1 + '@cucumber/tag-expressions': 6.0.0 + assertion-error-formatter: 3.0.0 + capital-case: 1.0.4 + chalk: 4.1.2 + cli-table3: 0.6.3 + commander: 10.0.1 + debug: 4.3.4(supports-color@8.1.1) + error-stack-parser: 2.1.4 + figures: 3.2.0 + glob: 10.3.10 + has-ansi: 4.0.1 + indent-string: 4.0.0 + is-installed-globally: 0.4.0 + is-stream: 2.0.1 + knuth-shuffle-seeded: 1.0.6 + lodash.merge: 4.6.2 + lodash.mergewith: 4.6.2 + luxon: 3.2.1 + mkdirp: 2.1.6 + mz: 2.7.0 + progress: 2.0.3 + read-pkg-up: 7.0.1 + resolve-pkg: 2.0.0 + semver: 7.5.3 + string-argv: 0.3.1 + strip-ansi: 6.0.1 + supports-color: 8.1.1 + tmp: 0.2.1 + type-fest: 4.9.0 + util-arity: 1.1.0 + xmlbuilder: 15.1.1 + yaml: 2.3.4 + yup: 1.2.0 + dev: true + + /@cucumber/gherkin-streams@5.0.1(@cucumber/gherkin@27.0.0)(@cucumber/message-streams@4.0.1)(@cucumber/messages@24.0.1): + resolution: {integrity: sha512-/7VkIE/ASxIP/jd4Crlp4JHXqdNFxPGQokqWqsaCCiqBiu5qHoKMxcWNlp9njVL/n9yN4S08OmY3ZR8uC5x74Q==} + hasBin: true + peerDependencies: + '@cucumber/gherkin': '>=22.0.0' + '@cucumber/message-streams': '>=4.0.0' + '@cucumber/messages': '>=17.1.1' + dependencies: + '@cucumber/gherkin': 27.0.0 + '@cucumber/message-streams': 4.0.1(@cucumber/messages@22.0.0) + '@cucumber/messages': 24.0.1 + commander: 9.1.0 + source-map-support: 0.5.21 + dev: true + + /@cucumber/gherkin-utils@8.0.5: + resolution: {integrity: sha512-kxM1OCDjYddF26VKc892PF0GokW4wUIl1PUz3TIXsPZgS39ExM1pF8oww8mlGFD2B0+4op/cSE3SSIME5H3aNw==} + dependencies: + '@cucumber/gherkin': 26.2.0 + '@cucumber/messages': 22.0.0 + '@teppeis/multimaps': 3.0.0 + commander: 10.0.1 + source-map-support: 0.5.21 + dev: true + + /@cucumber/gherkin@26.2.0: + resolution: {integrity: sha512-iRSiK8YAIHAmLrn/mUfpAx7OXZ7LyNlh1zT89RoziSVCbqSVDxJS6ckEzW8loxs+EEXl0dKPQOXiDmbHV+C/fA==} + dependencies: + '@cucumber/messages': 22.0.0 + dev: true + + /@cucumber/gherkin@27.0.0: + resolution: {integrity: sha512-j5rCsjqzRiC3iVTier3sa0kzyNbkcAmF7xr7jKnyO7qDeK3Z8Ye1P3KSVpeQRMY+KCDJ3WbTDdyxH0FwfA/fIw==} + dependencies: + '@cucumber/messages': 22.0.0 + dev: true + + /@cucumber/html-formatter@20.4.0(@cucumber/messages@22.0.0): + resolution: {integrity: sha512-TnLSXC5eJd8AXHENo69f5z+SixEVtQIf7Q2dZuTpT/Y8AOkilGpGl1MQR1Vp59JIw+fF3EQSUKdf+DAThCxUNg==} + peerDependencies: + '@cucumber/messages': '>=18' + dependencies: + '@cucumber/messages': 22.0.0 + dev: true + + /@cucumber/html-formatter@21.2.0(@cucumber/messages@24.0.1): + resolution: {integrity: sha512-4OcSa12Y0v5e4ySDl67+QFTxCG/Y9fxGSkFqvm98ggpTvS7b75whwzupu+lM2lMBw+h3H6P8ZURQr0xQIAwE2A==} + peerDependencies: + '@cucumber/messages': '>=18' + dependencies: + '@cucumber/messages': 24.0.1 + dev: true + + /@cucumber/message-streams@4.0.1(@cucumber/messages@22.0.0): + resolution: {integrity: sha512-Kxap9uP5jD8tHUZVjTWgzxemi/0uOsbGjd4LBOSxcJoOCRbESFwemUzilJuzNTB8pcTQUh8D5oudUyxfkJOKmA==} + peerDependencies: + '@cucumber/messages': '>=17.1.1' + dependencies: + '@cucumber/messages': 22.0.0 + dev: true + + /@cucumber/messages@22.0.0: + resolution: {integrity: sha512-EuaUtYte9ilkxcKmfqGF9pJsHRUU0jwie5ukuZ/1NPTuHS1LxHPsGEODK17RPRbZHOFhqybNzG2rHAwThxEymg==} + dependencies: + '@types/uuid': 9.0.1 + class-transformer: 0.5.1 + reflect-metadata: 0.1.13 + uuid: 9.0.0 + dev: true + + /@cucumber/messages@24.0.1: + resolution: {integrity: sha512-dKfNkvgc6stSQIyeHk7p/221iqEZe1BP+e/Js8XKtSmc0sS8khKMvbSBwYVeonn/67/vYKiAyo6Eo0SzXd5Plw==} + dependencies: + '@types/uuid': 9.0.7 + class-transformer: 0.5.1 + reflect-metadata: 0.2.1 + uuid: 9.0.1 + dev: true + + /@cucumber/pretty-formatter@1.0.0(@cucumber/cucumber@10.2.1)(@cucumber/messages@22.0.0): + resolution: {integrity: sha512-wcnIMN94HyaHGsfq72dgCvr1d8q6VGH4Y6Gl5weJ2TNZw1qn2UY85Iki4c9VdaLUONYnyYH3+178YB+9RFe/Hw==} + peerDependencies: + '@cucumber/cucumber': '>=7.0.0' + '@cucumber/messages': '*' + dependencies: + '@cucumber/cucumber': 10.2.1 + '@cucumber/messages': 22.0.0 + ansi-styles: 5.2.0 + cli-table3: 0.6.3 + figures: 3.2.0 + ts-dedent: 2.2.0 + dev: true + + /@cucumber/tag-expressions@6.0.0: + resolution: {integrity: sha512-JbNb/254Wn6b8cfrIJoqR0NekHXvoB/eMvSY4RK11H8k+YZfm7mZesu/3yVX67nkW+Y+PGjZFcgTMcfjwFRsRw==} + dev: true + + /@cypress/request@3.0.1: + resolution: {integrity: sha512-TWivJlJi8ZDx2wGOw1dbLuHJKUYX7bWySw377nlnGOW3hP9/MUKIsEdXT/YngWxVdgNCHRBmFlBipE+5/2ZZlQ==} + engines: {node: '>= 6'} + dependencies: + aws-sign2: 0.7.0 + aws4: 1.12.0 + caseless: 0.12.0 + combined-stream: 1.0.8 + extend: 3.0.2 + forever-agent: 0.6.1 + form-data: 2.3.3 + http-signature: 1.3.6 + is-typedarray: 1.0.0 + isstream: 0.1.2 + json-stringify-safe: 5.0.1 + mime-types: 2.1.35 + performance-now: 2.1.0 + qs: 6.10.4 + safe-buffer: 5.2.1 + tough-cookie: 4.1.3 + tunnel-agent: 0.6.0 + uuid: 8.3.2 + dev: true + + /@cypress/xvfb@1.2.4(supports-color@8.1.1): + resolution: {integrity: sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q==} + dependencies: + debug: 3.2.7(supports-color@8.1.1) + lodash.once: 4.1.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@datadog/browser-core@5.8.0: + resolution: {integrity: sha512-aNMSB+tLu5aKm/uzswy5d6KDgGtMs2uMxsGWdZ3lmqorEHLXk5kPNTEVRJfeE49EJaWaxiTYQuuuLo0c5S0rUA==} + dev: false + + /@datadog/browser-rum-core@5.8.0: + resolution: {integrity: sha512-UtWVR7z8qXvt0Ik10KjjG6Ueck1JLOXcfY00Vv2TttQ73hepL1NUlSDjdMyobySc/990ROvWkCYTIvhtqWFDFw==} + dependencies: + '@datadog/browser-core': 5.8.0 + dev: false + + /@datadog/browser-rum@5.8.0: + resolution: {integrity: sha512-WtWRQa41d/G4TRs4PwbMM82i56Fsjov9b/B1go0ocqIqUkaJYdTBqQCIcJo3xmCZrgmxSlPiPgEgB5shhVDXxA==} + peerDependencies: + '@datadog/browser-logs': 5.8.0 + peerDependenciesMeta: + '@datadog/browser-logs': + optional: true + dependencies: + '@datadog/browser-core': 5.8.0 + '@datadog/browser-rum-core': 5.8.0 + dev: false + + /@emotion/is-prop-valid@0.8.8: + resolution: {integrity: sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==} + requiresBuild: true + dependencies: + '@emotion/memoize': 0.7.4 + dev: false + optional: true + + /@emotion/is-prop-valid@1.2.1: + resolution: {integrity: sha512-61Mf7Ufx4aDxx1xlDeOm8aFFigGHE4z+0sKCa+IHCeZKiyP9RLD0Mmx7m8b9/Cf37f7NAvQOOJAbQQGVr5uERw==} + dependencies: + '@emotion/memoize': 0.8.1 + dev: false + + /@emotion/memoize@0.7.4: + resolution: {integrity: sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==} + requiresBuild: true + dev: false + optional: true + + /@emotion/memoize@0.8.1: + resolution: {integrity: sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==} + dev: false + + /@emotion/stylis@0.8.5: + resolution: {integrity: sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ==} + dev: false + + /@emotion/unitless@0.7.5: + resolution: {integrity: sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==} + dev: false + + /@esbuild/aix-ppc64@0.19.11: + resolution: {integrity: sha512-FnzU0LyE3ySQk7UntJO4+qIiQgI7KoODnZg5xzXIrFJlKd2P2gwHsHY4927xj9y5PJmJSzULiUCWmv7iWnNa7g==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm64@0.19.11: + resolution: {integrity: sha512-aiu7K/5JnLj//KOnOfEZ0D90obUkRzDMyqd/wNAUQ34m4YUPVhRZpnqKV9uqDGxT7cToSDnIHsGooyIczu9T+Q==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm@0.19.11: + resolution: {integrity: sha512-5OVapq0ClabvKvQ58Bws8+wkLCV+Rxg7tUVbo9xu034Nm536QTII4YzhaFriQ7rMrorfnFKUsArD2lqKbFY4vw==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-x64@0.19.11: + resolution: {integrity: sha512-eccxjlfGw43WYoY9QgB82SgGgDbibcqyDTlk3l3C0jOVHKxrjdc9CTwDUQd0vkvYg5um0OH+GpxYvp39r+IPOg==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-arm64@0.19.11: + resolution: {integrity: sha512-ETp87DRWuSt9KdDVkqSoKoLFHYTrkyz2+65fj9nfXsaV3bMhTCjtQfw3y+um88vGRKRiF7erPrh/ZuIdLUIVxQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-x64@0.19.11: + resolution: {integrity: sha512-fkFUiS6IUK9WYUO/+22omwetaSNl5/A8giXvQlcinLIjVkxwTLSktbF5f/kJMftM2MJp9+fXqZ5ezS7+SALp4g==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-arm64@0.19.11: + resolution: {integrity: sha512-lhoSp5K6bxKRNdXUtHoNc5HhbXVCS8V0iZmDvyWvYq9S5WSfTIHU2UGjcGt7UeS6iEYp9eeymIl5mJBn0yiuxA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-x64@0.19.11: + resolution: {integrity: sha512-JkUqn44AffGXitVI6/AbQdoYAq0TEullFdqcMY/PCUZ36xJ9ZJRtQabzMA+Vi7r78+25ZIBosLTOKnUXBSi1Kw==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm64@0.19.11: + resolution: {integrity: sha512-LneLg3ypEeveBSMuoa0kwMpCGmpu8XQUh+mL8XXwoYZ6Be2qBnVtcDI5azSvh7vioMDhoJFZzp9GWp9IWpYoUg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm@0.19.11: + resolution: {integrity: sha512-3CRkr9+vCV2XJbjwgzjPtO8T0SZUmRZla+UL1jw+XqHZPkPgZiyWvbDvl9rqAN8Zl7qJF0O/9ycMtjU67HN9/Q==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ia32@0.19.11: + resolution: {integrity: sha512-caHy++CsD8Bgq2V5CodbJjFPEiDPq8JJmBdeyZ8GWVQMjRD0sU548nNdwPNvKjVpamYYVL40AORekgfIubwHoA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-loong64@0.14.54: + resolution: {integrity: sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-loong64@0.19.11: + resolution: {integrity: sha512-ppZSSLVpPrwHccvC6nQVZaSHlFsvCQyjnvirnVjbKSHuE5N24Yl8F3UwYUUR1UEPaFObGD2tSvVKbvR+uT1Nrg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-mips64el@0.19.11: + resolution: {integrity: sha512-B5x9j0OgjG+v1dF2DkH34lr+7Gmv0kzX6/V0afF41FkPMMqaQ77pH7CrhWeR22aEeHKaeZVtZ6yFwlxOKPVFyg==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ppc64@0.19.11: + resolution: {integrity: sha512-MHrZYLeCG8vXblMetWyttkdVRjQlQUb/oMgBNurVEnhj4YWOr4G5lmBfZjHYQHHN0g6yDmCAQRR8MUHldvvRDA==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-riscv64@0.19.11: + resolution: {integrity: sha512-f3DY++t94uVg141dozDu4CCUkYW+09rWtaWfnb3bqe4w5NqmZd6nPVBm+qbz7WaHZCoqXqHz5p6CM6qv3qnSSQ==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-s390x@0.19.11: + resolution: {integrity: sha512-A5xdUoyWJHMMlcSMcPGVLzYzpcY8QP1RtYzX5/bS4dvjBGVxdhuiYyFwp7z74ocV7WDc0n1harxmpq2ePOjI0Q==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-x64@0.19.11: + resolution: {integrity: sha512-grbyMlVCvJSfxFQUndw5mCtWs5LO1gUlwP4CDi4iJBbVpZcqLVT29FxgGuBJGSzyOxotFG4LoO5X+M1350zmPA==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/netbsd-x64@0.19.11: + resolution: {integrity: sha512-13jvrQZJc3P230OhU8xgwUnDeuC/9egsjTkXN49b3GcS5BKvJqZn86aGM8W9pd14Kd+u7HuFBMVtrNGhh6fHEQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/openbsd-x64@0.19.11: + resolution: {integrity: sha512-ysyOGZuTp6SNKPE11INDUeFVVQFrhcNDVUgSQVDzqsqX38DjhPEPATpid04LCoUr2WXhQTEZ8ct/EgJCUDpyNw==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/sunos-x64@0.19.11: + resolution: {integrity: sha512-Hf+Sad9nVwvtxy4DXCZQqLpgmRTQqyFyhT3bZ4F2XlJCjxGmRFF0Shwn9rzhOYRB61w9VMXUkxlBy56dk9JJiQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-arm64@0.19.11: + resolution: {integrity: sha512-0P58Sbi0LctOMOQbpEOvOL44Ne0sqbS0XWHMvvrg6NE5jQ1xguCSSw9jQeUk2lfrXYsKDdOe6K+oZiwKPilYPQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-ia32@0.19.11: + resolution: {integrity: sha512-6YOrWS+sDJDmshdBIQU+Uoyh7pQKrdykdefC1avn76ss5c+RN6gut3LZA4E2cH5xUEp5/cA0+YxRaVtRAb0xBg==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-x64@0.19.11: + resolution: {integrity: sha512-vfkhltrjCAb603XaFhqhAF4LGDi2M4OrCRrFusyQ+iTLQ/o60QQXxc9cZC/FFpihBI9N1Grn6SMKVJ4KP7Fuiw==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@eslint-community/eslint-utils@4.4.0(eslint@8.56.0): + resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + dependencies: + eslint: 8.56.0 + eslint-visitor-keys: 3.4.3 + dev: true + + /@eslint-community/regexpp@4.10.0: + resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + dev: true + + /@eslint-community/regexpp@4.5.1: + resolution: {integrity: sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + dev: true + + /@eslint/eslintrc@2.1.4: + resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + ajv: 6.12.6 + debug: 4.3.4(supports-color@5.5.0) + espree: 9.6.1 + globals: 13.20.0 + ignore: 5.2.4 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@eslint/js@8.56.0: + resolution: {integrity: sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /@floating-ui/core@0.7.3: + resolution: {integrity: sha512-buc8BXHmG9l82+OQXOFU3Kr2XQx9ys01U/Q9HMIrZ300iLc8HLMgh7dcCqgYzAzf4BkoQvDcXf5Y+CuEZ5JBYg==} + dev: false + + /@floating-ui/dom@0.5.4: + resolution: {integrity: sha512-419BMceRLq0RrmTSDxn8hf9R3VCJv2K9PUfugh5JyEFmdjzDo+e8U5EdR8nzKq8Yj1htzLm3b6eQEEam3/rrtg==} + dependencies: + '@floating-ui/core': 0.7.3 + dev: false + + /@floating-ui/react-dom@0.7.2(@types/react@18.0.28)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-1T0sJcpHgX/u4I1OzIEhlcrvkUN8ln39nz7fMoE/2HDHrPiMFoOGR7++GYyfUmIQHkkrTinaeQsO3XWubjSvGg==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + dependencies: + '@floating-ui/dom': 0.5.4 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + use-isomorphic-layout-effect: 1.1.2(@types/react@18.0.28)(react@18.2.0) + transitivePeerDependencies: + - '@types/react' + dev: false + + /@headlessui/react@1.7.17(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-4am+tzvkqDSSgiwrsEpGWqgGo9dz8qU5M3znCkC4PgkpY4HcCZzEDEvozltGGGHIKl9jbXbZPSH5TWn4sWJdow==} + engines: {node: '>=10'} + peerDependencies: + react: ^16 || ^17 || ^18 + react-dom: ^16 || ^17 || ^18 + dependencies: + client-only: 0.0.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@humanwhocodes/config-array@0.11.13: + resolution: {integrity: sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==} + engines: {node: '>=10.10.0'} + dependencies: + '@humanwhocodes/object-schema': 2.0.1 + debug: 4.3.4(supports-color@5.5.0) + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@humanwhocodes/module-importer@1.0.1: + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + dev: true + + /@humanwhocodes/object-schema@2.0.1: + resolution: {integrity: sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==} + dev: true + + /@isaacs/cliui@8.0.2: + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + dependencies: + string-width: 5.1.2 + string-width-cjs: /string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: /strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: /wrap-ansi@7.0.0 + dev: true + + /@istanbuljs/load-nyc-config@1.1.0: + resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} + engines: {node: '>=8'} + dependencies: + camelcase: 5.3.1 + find-up: 4.1.0 + get-package-type: 0.1.0 + js-yaml: 3.14.1 + resolve-from: 5.0.0 + dev: true + + /@istanbuljs/schema@0.1.3: + resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} + engines: {node: '>=8'} + dev: true + + /@jest/console@29.7.0: + resolution: {integrity: sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.6.3 + '@types/node': 18.19.5 + chalk: 4.1.2 + jest-message-util: 29.7.0 + jest-util: 29.7.0 + slash: 3.0.0 + dev: true + + /@jest/core@29.7.0: + resolution: {integrity: sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/console': 29.7.0 + '@jest/reporters': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 18.19.5 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + ci-info: 3.9.0 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-changed-files: 29.7.0 + jest-config: 29.7.0(@types/node@18.19.5) + jest-haste-map: 29.7.0 + jest-message-util: 29.7.0 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-resolve-dependencies: 29.7.0 + jest-runner: 29.7.0 + jest-runtime: 29.7.0 + jest-snapshot: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 + jest-watcher: 29.7.0 + micromatch: 4.0.5 + pretty-format: 29.7.0 + slash: 3.0.0 + strip-ansi: 6.0.1 + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + - ts-node + dev: true + + /@jest/environment@29.7.0: + resolution: {integrity: sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/fake-timers': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 18.15.5 + jest-mock: 29.7.0 + dev: true + + /@jest/expect-utils@29.7.0: + resolution: {integrity: sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + jest-get-type: 29.6.3 + dev: true + + /@jest/expect@29.7.0: + resolution: {integrity: sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + expect: 29.7.0 + jest-snapshot: 29.7.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@jest/fake-timers@29.7.0: + resolution: {integrity: sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.6.3 + '@sinonjs/fake-timers': 10.3.0 + '@types/node': 18.19.5 + jest-message-util: 29.7.0 + jest-mock: 29.7.0 + jest-util: 29.7.0 + dev: true + + /@jest/globals@29.7.0: + resolution: {integrity: sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/environment': 29.7.0 + '@jest/expect': 29.7.0 + '@jest/types': 29.6.3 + jest-mock: 29.7.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@jest/reporters@29.7.0: + resolution: {integrity: sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@bcoe/v8-coverage': 0.2.3 + '@jest/console': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + '@jridgewell/trace-mapping': 0.3.18 + '@types/node': 18.19.5 + chalk: 4.1.2 + collect-v8-coverage: 1.0.2 + exit: 0.1.2 + glob: 7.2.3 + graceful-fs: 4.2.11 + istanbul-lib-coverage: 3.2.2 + istanbul-lib-instrument: 6.0.1 + istanbul-lib-report: 3.0.1 + istanbul-lib-source-maps: 4.0.1 + istanbul-reports: 3.1.6 + jest-message-util: 29.7.0 + jest-util: 29.7.0 + jest-worker: 29.7.0 + slash: 3.0.0 + string-length: 4.0.2 + strip-ansi: 6.0.1 + v8-to-istanbul: 9.2.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@jest/schemas@29.6.3: + resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@sinclair/typebox': 0.27.8 + dev: true + + /@jest/source-map@29.6.3: + resolution: {integrity: sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jridgewell/trace-mapping': 0.3.18 + callsites: 3.1.0 + graceful-fs: 4.2.11 + dev: true + + /@jest/test-result@29.7.0: + resolution: {integrity: sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/console': 29.7.0 + '@jest/types': 29.6.3 + '@types/istanbul-lib-coverage': 2.0.6 + collect-v8-coverage: 1.0.2 + dev: true + + /@jest/test-sequencer@29.7.0: + resolution: {integrity: sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/test-result': 29.7.0 + graceful-fs: 4.2.11 + jest-haste-map: 29.7.0 + slash: 3.0.0 + dev: true + + /@jest/transform@29.7.0: + resolution: {integrity: sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@babel/core': 7.23.7 + '@jest/types': 29.6.3 + '@jridgewell/trace-mapping': 0.3.18 + babel-plugin-istanbul: 6.1.1 + chalk: 4.1.2 + convert-source-map: 2.0.0 + fast-json-stable-stringify: 2.1.0 + graceful-fs: 4.2.11 + jest-haste-map: 29.7.0 + jest-regex-util: 29.6.3 + jest-util: 29.7.0 + micromatch: 4.0.5 + pirates: 4.0.5 + slash: 3.0.0 + write-file-atomic: 4.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@jest/types@29.6.3: + resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/schemas': 29.6.3 + '@types/istanbul-lib-coverage': 2.0.6 + '@types/istanbul-reports': 3.0.4 + '@types/node': 18.15.5 + '@types/yargs': 17.0.32 + chalk: 4.1.2 + dev: true + + /@jridgewell/gen-mapping@0.3.3: + resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/set-array': 1.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.18 + + /@jridgewell/resolve-uri@3.1.0: + resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==} + engines: {node: '>=6.0.0'} + + /@jridgewell/set-array@1.1.2: + resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} + engines: {node: '>=6.0.0'} + + /@jridgewell/sourcemap-codec@1.4.14: + resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} + + /@jridgewell/sourcemap-codec@1.4.15: + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + + /@jridgewell/trace-mapping@0.3.18: + resolution: {integrity: sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==} + dependencies: + '@jridgewell/resolve-uri': 3.1.0 + '@jridgewell/sourcemap-codec': 1.4.14 + + /@jsdevtools/ono@7.1.3: + resolution: {integrity: sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==} + dev: true + + /@mapbox/geojson-rewind@0.5.2: + resolution: {integrity: sha512-tJaT+RbYGJYStt7wI3cq4Nl4SXxG8W7JDG5DMJu97V25RnbNg3QtQtf+KD+VLjNpWKYsRvXDNmNrBgEETr1ifA==} + hasBin: true + dependencies: + get-stream: 6.0.1 + minimist: 1.2.8 + dev: true + + /@mapbox/geojson-types@1.0.2: + resolution: {integrity: sha512-e9EBqHHv3EORHrSfbR9DqecPNn+AmuAoQxV6aL8Xu30bJMJR1o8PZLZzpk1Wq7/NfCbuhmakHTPYRhoqLsXRnw==} + dev: true + + /@mapbox/jsonlint-lines-primitives@2.0.2: + resolution: {integrity: sha512-rY0o9A5ECsTQRVhv7tL/OyDpGAoUB4tTvLiW1DSzQGq4bvTPhNw1VpSNjDJc5GFZ2XuyOtSWSVN05qOtcD71qQ==} + engines: {node: '>= 0.6'} + dev: true + + /@mapbox/mapbox-gl-supported@1.5.0(mapbox-gl@1.10.1): + resolution: {integrity: sha512-/PT1P6DNf7vjEEiPkVIRJkvibbqWtqnyGaBz3nfRdcxclNSnSdaLU5tfAgcD7I8Yt5i+L19s406YLl1koLnLbg==} + peerDependencies: + mapbox-gl: '>=0.32.1 <2.0.0' + dependencies: + mapbox-gl: 1.10.1 + dev: true + + /@mapbox/point-geometry@0.1.0: + resolution: {integrity: sha512-6j56HdLTwWGO0fJPlrZtdU/B13q8Uwmo18Ck2GnGgN9PCFyKTZ3UbXeEdRFh18i9XQ92eH2VdtpJHpBD3aripQ==} + dev: true + + /@mapbox/tiny-sdf@1.2.5: + resolution: {integrity: sha512-cD8A/zJlm6fdJOk6DqPUV8mcpyJkRz2x2R+/fYcWDYG3oWbG7/L7Yl/WqQ1VZCjnL9OTIMAn6c+BC5Eru4sQEw==} + dev: true + + /@mapbox/unitbezier@0.0.0: + resolution: {integrity: sha512-HPnRdYO0WjFjRTSwO3frz1wKaU649OBFPX3Zo/2WZvuRi6zMiRGui8SnPQiQABgqCf8YikDe5t3HViTVw1WUzA==} + dev: true + + /@mapbox/vector-tile@1.3.1: + resolution: {integrity: sha512-MCEddb8u44/xfQ3oD+Srl/tNcQoqTw3goGk2oLsrFxOTc3dUp+kAnby3PvAeeBYSMSjSPD1nd1AJA6W49WnoUw==} + dependencies: + '@mapbox/point-geometry': 0.1.0 + dev: true + + /@mapbox/whoots-js@3.1.0: + resolution: {integrity: sha512-Es6WcD0nO5l+2BOQS4uLfNPYQaNDfbot3X1XUoloz+x0mPDS3eeORZJl06HXjwBG1fOGwCRnzK88LMdxKRrd6Q==} + engines: {node: '>=6.0.0'} + dev: true + + /@next-auth/prisma-adapter@1.0.6(@prisma/client@4.14.1)(next-auth@4.24.5): + resolution: {integrity: sha512-Z7agwfSZEeEcqKqrnisBun7VndRPshd6vyDsoRU68MXbkui8storkHgvN2hnNDrqr/hSCF9aRn56a1qpihaB4A==} + peerDependencies: + '@prisma/client': '>=2.26.0 || >=3' + next-auth: ^4 + dependencies: + '@prisma/client': 4.14.1(prisma@4.14.1) + next-auth: 4.24.5(next@14.0.4)(react-dom@18.2.0)(react@18.2.0) + dev: false + + /@next/bundle-analyzer@14.0.4: + resolution: {integrity: sha512-Nn2PiCkFBJBlVmpSGVNItpISws0fuc9E8AkCafBz/moRv1cfASOpFBBVzSRfWLP9BPdAhfDkb6TafN0rvs2IJQ==} + dependencies: + webpack-bundle-analyzer: 4.7.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + dev: true + + /@next/env@14.0.4: + resolution: {integrity: sha512-irQnbMLbUNQpP1wcE5NstJtbuA/69kRfzBrpAD7Gsn8zm/CY6YQYc3HQBz8QPxwISG26tIm5afvvVbu508oBeQ==} + dev: false + + /@next/eslint-plugin-next@14.0.4: + resolution: {integrity: sha512-U3qMNHmEZoVmHA0j/57nRfi3AscXNvkOnxDmle/69Jz/G0o/gWjXTDdlgILZdrxQ0Lw/jv2mPW8PGy0EGIHXhQ==} + dependencies: + glob: 7.1.7 + dev: true + + /@next/swc-darwin-arm64@14.0.4: + resolution: {integrity: sha512-mF05E/5uPthWzyYDyptcwHptucf/jj09i2SXBPwNzbgBNc+XnwzrL0U6BmPjQeOL+FiB+iG1gwBeq7mlDjSRPg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@next/swc-darwin-x64@14.0.4: + resolution: {integrity: sha512-IZQ3C7Bx0k2rYtrZZxKKiusMTM9WWcK5ajyhOZkYYTCc8xytmwSzR1skU7qLgVT/EY9xtXDG0WhY6fyujnI3rw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@next/swc-linux-arm64-gnu@14.0.4: + resolution: {integrity: sha512-VwwZKrBQo/MGb1VOrxJ6LrKvbpo7UbROuyMRvQKTFKhNaXjUmKTu7wxVkIuCARAfiI8JpaWAnKR+D6tzpCcM4w==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@next/swc-linux-arm64-musl@14.0.4: + resolution: {integrity: sha512-8QftwPEW37XxXoAwsn+nXlodKWHfpMaSvt81W43Wh8dv0gkheD+30ezWMcFGHLI71KiWmHK5PSQbTQGUiidvLQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@next/swc-linux-x64-gnu@14.0.4: + resolution: {integrity: sha512-/s/Pme3VKfZAfISlYVq2hzFS8AcAIOTnoKupc/j4WlvF6GQ0VouS2Q2KEgPuO1eMBwakWPB1aYFIA4VNVh667A==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@next/swc-linux-x64-musl@14.0.4: + resolution: {integrity: sha512-m8z/6Fyal4L9Bnlxde5g2Mfa1Z7dasMQyhEhskDATpqr+Y0mjOBZcXQ7G5U+vgL22cI4T7MfvgtrM2jdopqWaw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@next/swc-win32-arm64-msvc@14.0.4: + resolution: {integrity: sha512-7Wv4PRiWIAWbm5XrGz3D8HUkCVDMMz9igffZG4NB1p4u1KoItwx9qjATHz88kwCEal/HXmbShucaslXCQXUM5w==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@next/swc-win32-ia32-msvc@14.0.4: + resolution: {integrity: sha512-zLeNEAPULsl0phfGb4kdzF/cAVIfaC7hY+kt0/d+y9mzcZHsMS3hAS829WbJ31DkSlVKQeHEjZHIdhN+Pg7Gyg==} + engines: {node: '>= 10'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@next/swc-win32-x64-msvc@14.0.4: + resolution: {integrity: sha512-yEh2+R8qDlDCjxVpzOTEpBLQTEFAcP2A8fUFLaWNap9GitYKkKv1//y2S6XY6zsR4rCOPRpU7plYDR+az2n30A==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@nodelib/fs.scandir@2.1.5: + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + /@nodelib/fs.stat@2.0.5: + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + /@nodelib/fs.walk@1.2.8: + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.15.0 + + /@octokit/auth-token@4.0.0: + resolution: {integrity: sha512-tY/msAuJo6ARbK6SPIxZrPBms3xPbfwBrulZe0Wtr/DIY9lje2HeV1uoebShn6mx7SjCHif6EjMvoREj+gZ+SA==} + engines: {node: '>= 18'} + dev: true + + /@octokit/core@5.0.2: + resolution: {integrity: sha512-cZUy1gUvd4vttMic7C0lwPed8IYXWYp8kHIMatyhY8t8n3Cpw2ILczkV5pGMPqef7v0bLo0pOHrEHarsau2Ydg==} + engines: {node: '>= 18'} + dependencies: + '@octokit/auth-token': 4.0.0 + '@octokit/graphql': 7.0.2 + '@octokit/request': 8.1.6 + '@octokit/request-error': 5.0.1 + '@octokit/types': 12.4.0 + before-after-hook: 2.2.3 + universal-user-agent: 6.0.1 + dev: true + + /@octokit/endpoint@9.0.4: + resolution: {integrity: sha512-DWPLtr1Kz3tv8L0UvXTDP1fNwM0S+z6EJpRcvH66orY6Eld4XBMCSYsaWp4xIm61jTWxK68BrR7ibO+vSDnZqw==} + engines: {node: '>= 18'} + dependencies: + '@octokit/types': 12.4.0 + universal-user-agent: 6.0.1 + dev: true + + /@octokit/graphql@7.0.2: + resolution: {integrity: sha512-OJ2iGMtj5Tg3s6RaXH22cJcxXRi7Y3EBqbHTBRq+PQAqfaS8f/236fUrWhfSn8P4jovyzqucxme7/vWSSZBX2Q==} + engines: {node: '>= 18'} + dependencies: + '@octokit/request': 8.1.6 + '@octokit/types': 12.4.0 + universal-user-agent: 6.0.1 + dev: true + + /@octokit/openapi-types@19.1.0: + resolution: {integrity: sha512-6G+ywGClliGQwRsjvqVYpklIfa7oRPA0vyhPQG/1Feh+B+wU0vGH1JiJ5T25d3g1JZYBHzR2qefLi9x8Gt+cpw==} + dev: true + + /@octokit/plugin-paginate-rest@9.1.5(@octokit/core@5.0.2): + resolution: {integrity: sha512-WKTQXxK+bu49qzwv4qKbMMRXej1DU2gq017euWyKVudA6MldaSSQuxtz+vGbhxV4CjxpUxjZu6rM2wfc1FiWVg==} + engines: {node: '>= 18'} + peerDependencies: + '@octokit/core': '>=5' + dependencies: + '@octokit/core': 5.0.2 + '@octokit/types': 12.4.0 + dev: true + + /@octokit/plugin-retry@6.0.1(@octokit/core@5.0.2): + resolution: {integrity: sha512-SKs+Tz9oj0g4p28qkZwl/topGcb0k0qPNX/i7vBKmDsjoeqnVfFUquqrE/O9oJY7+oLzdCtkiWSXLpLjvl6uog==} + engines: {node: '>= 18'} + peerDependencies: + '@octokit/core': '>=5' + dependencies: + '@octokit/core': 5.0.2 + '@octokit/request-error': 5.0.1 + '@octokit/types': 12.4.0 + bottleneck: 2.19.5 + dev: true + + /@octokit/plugin-throttling@8.1.3(@octokit/core@5.0.2): + resolution: {integrity: sha512-pfyqaqpc0EXh5Cn4HX9lWYsZ4gGbjnSmUILeu4u2gnuM50K/wIk9s1Pxt3lVeVwekmITgN/nJdoh43Ka+vye8A==} + engines: {node: '>= 18'} + peerDependencies: + '@octokit/core': ^5.0.0 + dependencies: + '@octokit/core': 5.0.2 + '@octokit/types': 12.4.0 + bottleneck: 2.19.5 + dev: true + + /@octokit/request-error@5.0.1: + resolution: {integrity: sha512-X7pnyTMV7MgtGmiXBwmO6M5kIPrntOXdyKZLigNfQWSEQzVxR4a4vo49vJjTWX70mPndj8KhfT4Dx+2Ng3vnBQ==} + engines: {node: '>= 18'} + dependencies: + '@octokit/types': 12.4.0 + deprecation: 2.3.1 + once: 1.4.0 + dev: true + + /@octokit/request@8.1.6: + resolution: {integrity: sha512-YhPaGml3ncZC1NfXpP3WZ7iliL1ap6tLkAp6MvbK2fTTPytzVUyUesBBogcdMm86uRYO5rHaM1xIWxigWZ17MQ==} + engines: {node: '>= 18'} + dependencies: + '@octokit/endpoint': 9.0.4 + '@octokit/request-error': 5.0.1 + '@octokit/types': 12.4.0 + universal-user-agent: 6.0.1 + dev: true + + /@octokit/types@12.4.0: + resolution: {integrity: sha512-FLWs/AvZllw/AGVs+nJ+ELCDZZJk+kY0zMen118xhL2zD0s1etIUHm1odgjP7epxYU1ln7SZxEUWYop5bhsdgQ==} + dependencies: + '@octokit/openapi-types': 19.1.0 + dev: true + + /@panva/hkdf@1.1.1: + resolution: {integrity: sha512-dhPeilub1NuIG0X5Kvhh9lH4iW3ZsHlnzwgwbOlgwQ2wG1IqFzsgHqmKPk3WzsdWAeaxKJxgM0+W433RmN45GA==} + dev: false + + /@pkgjs/parseargs@0.11.0: + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + requiresBuild: true + dev: true + optional: true + + /@pkgr/utils@2.4.0: + resolution: {integrity: sha512-2OCURAmRtdlL8iUDTypMrrxfwe8frXTeXaxGsVOaYtc/wrUyk8Z/0OBetM7cdlsy7ZFWlMX72VogKeh+A4Xcjw==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + dependencies: + cross-spawn: 7.0.3 + fast-glob: 3.3.2 + is-glob: 4.0.3 + open: 9.1.0 + picocolors: 1.0.0 + tslib: 2.5.0 + dev: true + + /@plotly/d3-sankey-circular@0.33.1: + resolution: {integrity: sha512-FgBV1HEvCr3DV7RHhDsPXyryknucxtfnLwPtCKKxdolKyTFYoLX/ibEfX39iFYIL7DYbVeRtP43dbFcrHNE+KQ==} + dependencies: + d3-array: 1.2.4 + d3-collection: 1.0.7 + d3-shape: 1.3.7 + elementary-circuits-directed-graph: 1.3.1 + dev: true + + /@plotly/d3-sankey@0.7.2: + resolution: {integrity: sha512-2jdVos1N3mMp3QW0k2q1ph7Gd6j5PY1YihBrwpkFnKqO+cqtZq3AdEYUeSGXMeLsBDQYiqTVcihYfk8vr5tqhw==} + dependencies: + d3-array: 1.2.4 + d3-collection: 1.0.7 + d3-shape: 1.3.7 + dev: true + + /@plotly/d3@3.8.1: + resolution: {integrity: sha512-x49ThEu1FRA00kTso4Jdfyf2byaCPLBGmLjAYQz5OzaPyLUhHesX3/Nfv2OHEhynhdy2UB39DLXq6thYe2L2kg==} + dev: true + + /@plotly/point-cluster@3.1.9: + resolution: {integrity: sha512-MwaI6g9scKf68Orpr1pHZ597pYx9uP8UEFXLPbsCmuw3a84obwz6pnMXGc90VhgDNeNiLEdlmuK7CPo+5PIxXw==} + dependencies: + array-bounds: 1.0.1 + binary-search-bounds: 2.0.5 + clamp: 1.0.1 + defined: 1.0.1 + dtype: 2.0.0 + flatten-vertex-data: 1.0.2 + is-obj: 1.0.1 + math-log2: 1.0.1 + parse-rect: 1.2.0 + pick-by-alias: 1.2.0 + dev: true + + /@plotly/regl@2.1.2: + resolution: {integrity: sha512-Mdk+vUACbQvjd0m/1JJjOOafmkp/EpmHjISsopEz5Av44CBq7rPC05HHNbYGKVyNUF2zmEoBS/TT0pd0SPFFyw==} + dev: true + + /@pnpm/config.env-replace@1.1.0: + resolution: {integrity: sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==} + engines: {node: '>=12.22.0'} + dev: true + + /@pnpm/network.ca-file@1.0.2: + resolution: {integrity: sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==} + engines: {node: '>=12.22.0'} + dependencies: + graceful-fs: 4.2.10 + dev: true + + /@pnpm/npm-conf@2.2.2: + resolution: {integrity: sha512-UA91GwWPhFExt3IizW6bOeY/pQ0BkuNwKjk9iQW9KqxluGCrg4VenZ0/L+2Y0+ZOtme72EVvg6v0zo3AMQRCeA==} + engines: {node: '>=12'} + dependencies: + '@pnpm/config.env-replace': 1.1.0 + '@pnpm/network.ca-file': 1.0.2 + config-chain: 1.1.13 + dev: true + + /@polka/url@1.0.0-next.23: + resolution: {integrity: sha512-C16M+IYz0rgRhWZdCmK+h58JMv8vijAA61gmz2rspCSwKwzBebpdcsiUmwrtJRdphuY30i6BSLEOP8ppbNLyLg==} + dev: true + + /@prisma/client@4.14.1(prisma@4.14.1): + resolution: {integrity: sha512-TZIswkeX1ccsHG/eN2kICzg/csXll0osK3EHu1QKd8VJ3XLcXozbNELKkCNfsCUvKJAwPdDtFCzF+O+raIVldw==} + engines: {node: '>=14.17'} + requiresBuild: true + peerDependencies: + prisma: '*' + peerDependenciesMeta: + prisma: + optional: true + dependencies: + '@prisma/engines-version': 4.14.0-67.d9a4c5988f480fa576d43970d5a23641aa77bc9c + prisma: 4.14.1 + dev: false + + /@prisma/engines-version@4.14.0-67.d9a4c5988f480fa576d43970d5a23641aa77bc9c: + resolution: {integrity: sha512-3jum8/YSudeSN0zGW5qkpz+wAN2V/NYCQ+BPjvHYDfWatLWlQkqy99toX0GysDeaUoBIJg1vaz2yKqiA3CFcQw==} + dev: false + + /@prisma/engines@4.14.1: + resolution: {integrity: sha512-APqFddPVHYmWNKqc+5J5SqrLFfOghKOLZxobmguDUacxOwdEutLsbXPVhNnpFDmuQWQFbXmrTTPoRrrF6B1MWA==} + requiresBuild: true + dev: false + + /@radix-ui/primitive@1.0.0: + resolution: {integrity: sha512-3e7rn8FDMin4CgeL7Z/49smCA3rFYY3Ha2rUQ7HRWFadS5iCRw08ZgVT1LaNTCNqgvrUiyczLflrVrF0SRQtNA==} + dependencies: + '@babel/runtime': 7.23.7 + dev: false + + /@radix-ui/react-arrow@1.0.2(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-fqYwhhI9IarZ0ll2cUSfKuXHlJK0qE4AfnRrPBbRwEH/4mGQn04/QFGomLi8TXWIdv9WJk//KgGm+aDxVIr1wA==} + peerDependencies: + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + dependencies: + '@babel/runtime': 7.23.7 + '@radix-ui/react-primitive': 1.0.2(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/react-collection@1.0.2(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-s8WdQQ6wNXpaxdZ308KSr8fEWGrg4un8i4r/w7fhiS4ElRNjk5rRcl0/C6TANG2LvLOGIxtzo/jAg6Qf73TEBw==} + peerDependencies: + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + dependencies: + '@babel/runtime': 7.23.7 + '@radix-ui/react-compose-refs': 1.0.0(react@18.2.0) + '@radix-ui/react-context': 1.0.0(react@18.2.0) + '@radix-ui/react-primitive': 1.0.2(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-slot': 1.0.1(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/react-compose-refs@1.0.0(react@18.2.0): + resolution: {integrity: sha512-0KaSv6sx787/hK3eF53iOkiSLwAGlFMx5lotrqD2pTjB18KbybKoEIgkNZTKC60YECDQTKGTRcDBILwZVqVKvA==} + peerDependencies: + react: ^16.8 || ^17.0 || ^18.0 + dependencies: + '@babel/runtime': 7.23.7 + react: 18.2.0 + dev: false + + /@radix-ui/react-context@1.0.0(react@18.2.0): + resolution: {integrity: sha512-1pVM9RfOQ+n/N5PJK33kRSKsr1glNxomxONs5c49MliinBY6Yw2Q995qfBUUo0/Mbg05B/sGA0gkgPI7kmSHBg==} + peerDependencies: + react: ^16.8 || ^17.0 || ^18.0 + dependencies: + '@babel/runtime': 7.23.7 + react: 18.2.0 + dev: false + + /@radix-ui/react-direction@1.0.0(react@18.2.0): + resolution: {integrity: sha512-2HV05lGUgYcA6xgLQ4BKPDmtL+QbIZYH5fCOTAOOcJ5O0QbWS3i9lKaurLzliYUDhORI2Qr3pyjhJh44lKA3rQ==} + peerDependencies: + react: ^16.8 || ^17.0 || ^18.0 + dependencies: + '@babel/runtime': 7.23.7 + react: 18.2.0 + dev: false + + /@radix-ui/react-dismissable-layer@1.0.3(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-nXZOvFjOuHS1ovumntGV7NNoLaEp9JEvTht3MBjP44NSW5hUKj/8OnfN3+8WmB+CEhN44XaGhpHoSsUIEl5P7Q==} + peerDependencies: + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + dependencies: + '@babel/runtime': 7.23.7 + '@radix-ui/primitive': 1.0.0 + '@radix-ui/react-compose-refs': 1.0.0(react@18.2.0) + '@radix-ui/react-primitive': 1.0.2(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.0(react@18.2.0) + '@radix-ui/react-use-escape-keydown': 1.0.2(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/react-dropdown-menu@2.0.4(@types/react@18.0.28)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-y6AT9+MydyXcByivdK1+QpjWoKaC7MLjkS/cH1Q3keEyMvDkiY85m8o2Bi6+Z1PPUlCsMULopxagQOSfN0wahg==} + peerDependencies: + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + dependencies: + '@babel/runtime': 7.21.5 + '@radix-ui/primitive': 1.0.0 + '@radix-ui/react-compose-refs': 1.0.0(react@18.2.0) + '@radix-ui/react-context': 1.0.0(react@18.2.0) + '@radix-ui/react-id': 1.0.0(react@18.2.0) + '@radix-ui/react-menu': 2.0.4(@types/react@18.0.28)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.2(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.0(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + transitivePeerDependencies: + - '@types/react' + dev: false + + /@radix-ui/react-focus-guards@1.0.0(react@18.2.0): + resolution: {integrity: sha512-UagjDk4ijOAnGu4WMUPj9ahi7/zJJqNZ9ZAiGPp7waUWJO0O1aWXi/udPphI0IUjvrhBsZJGSN66dR2dsueLWQ==} + peerDependencies: + react: ^16.8 || ^17.0 || ^18.0 + dependencies: + '@babel/runtime': 7.23.7 + react: 18.2.0 + dev: false + + /@radix-ui/react-focus-scope@1.0.2(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-spwXlNTfeIprt+kaEWE/qYuYT3ZAqJiAGjN/JgdvgVDTu8yc+HuX+WOWXrKliKnLnwck0F6JDkqIERncnih+4A==} + peerDependencies: + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + dependencies: + '@babel/runtime': 7.23.7 + '@radix-ui/react-compose-refs': 1.0.0(react@18.2.0) + '@radix-ui/react-primitive': 1.0.2(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.0(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/react-id@1.0.0(react@18.2.0): + resolution: {integrity: sha512-Q6iAB/U7Tq3NTolBBQbHTgclPmGWE3OlktGGqrClPozSw4vkQ1DfQAOtzgRPecKsMdJINE05iaoDUG8tRzCBjw==} + peerDependencies: + react: ^16.8 || ^17.0 || ^18.0 + dependencies: + '@babel/runtime': 7.23.7 + '@radix-ui/react-use-layout-effect': 1.0.0(react@18.2.0) + react: 18.2.0 + dev: false + + /@radix-ui/react-menu@2.0.4(@types/react@18.0.28)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-mzKR47tZ1t193trEqlQoJvzY4u9vYfVH16ryBrVrCAGZzkgyWnMQYEZdUkM7y8ak9mrkKtJiqB47TlEnubeOFQ==} + peerDependencies: + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + dependencies: + '@babel/runtime': 7.23.7 + '@radix-ui/primitive': 1.0.0 + '@radix-ui/react-collection': 1.0.2(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-compose-refs': 1.0.0(react@18.2.0) + '@radix-ui/react-context': 1.0.0(react@18.2.0) + '@radix-ui/react-direction': 1.0.0(react@18.2.0) + '@radix-ui/react-dismissable-layer': 1.0.3(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-focus-guards': 1.0.0(react@18.2.0) + '@radix-ui/react-focus-scope': 1.0.2(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-id': 1.0.0(react@18.2.0) + '@radix-ui/react-popper': 1.1.1(@types/react@18.0.28)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-portal': 1.0.2(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-presence': 1.0.0(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.2(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-roving-focus': 1.0.3(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-slot': 1.0.1(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.0(react@18.2.0) + aria-hidden: 1.2.3 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-remove-scroll: 2.5.5(@types/react@18.0.28)(react@18.2.0) + transitivePeerDependencies: + - '@types/react' + dev: false + + /@radix-ui/react-popper@1.1.1(@types/react@18.0.28)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-keYDcdMPNMjSC8zTsZ8wezUMiWM9Yj14wtF3s0PTIs9srnEPC9Kt2Gny1T3T81mmSeyDjZxsD9N5WCwNNb712w==} + peerDependencies: + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + dependencies: + '@babel/runtime': 7.23.7 + '@floating-ui/react-dom': 0.7.2(@types/react@18.0.28)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-arrow': 1.0.2(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-compose-refs': 1.0.0(react@18.2.0) + '@radix-ui/react-context': 1.0.0(react@18.2.0) + '@radix-ui/react-primitive': 1.0.2(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.0(react@18.2.0) + '@radix-ui/react-use-layout-effect': 1.0.0(react@18.2.0) + '@radix-ui/react-use-rect': 1.0.0(react@18.2.0) + '@radix-ui/react-use-size': 1.0.0(react@18.2.0) + '@radix-ui/rect': 1.0.0 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + transitivePeerDependencies: + - '@types/react' + dev: false + + /@radix-ui/react-portal@1.0.2(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-swu32idoCW7KA2VEiUZGBSu9nB6qwGdV6k6HYhUoOo3M1FFpD+VgLzUqtt3mwL1ssz7r2x8MggpLSQach2Xy/Q==} + peerDependencies: + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + dependencies: + '@babel/runtime': 7.23.7 + '@radix-ui/react-primitive': 1.0.2(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/react-presence@1.0.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-A+6XEvN01NfVWiKu38ybawfHsBjWum42MRPnEuqPsBZ4eV7e/7K321B5VgYMPv3Xx5An6o1/l9ZuDBgmcmWK3w==} + peerDependencies: + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + dependencies: + '@babel/runtime': 7.23.7 + '@radix-ui/react-compose-refs': 1.0.0(react@18.2.0) + '@radix-ui/react-use-layout-effect': 1.0.0(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/react-primitive@1.0.2(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-zY6G5Qq4R8diFPNwtyoLRZBxzu1Z+SXMlfYpChN7Dv8gvmx9X3qhDqiLWvKseKVJMuedFeU/Sa0Sy/Ia+t06Dw==} + peerDependencies: + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + dependencies: + '@babel/runtime': 7.23.7 + '@radix-ui/react-slot': 1.0.1(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/react-roving-focus@1.0.3(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-stjCkIoMe6h+1fWtXlA6cRfikdBzCLp3SnVk7c48cv/uy3DTGoXhN76YaOYUJuy3aEDvDIKwKR5KSmvrtPvQPQ==} + peerDependencies: + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + dependencies: + '@babel/runtime': 7.23.7 + '@radix-ui/primitive': 1.0.0 + '@radix-ui/react-collection': 1.0.2(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-compose-refs': 1.0.0(react@18.2.0) + '@radix-ui/react-context': 1.0.0(react@18.2.0) + '@radix-ui/react-direction': 1.0.0(react@18.2.0) + '@radix-ui/react-id': 1.0.0(react@18.2.0) + '@radix-ui/react-primitive': 1.0.2(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.0(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.0(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/react-slot@1.0.1(react@18.2.0): + resolution: {integrity: sha512-avutXAFL1ehGvAXtPquu0YK5oz6ctS474iM3vNGQIkswrVhdrS52e3uoMQBzZhNRAIE0jBnUyXWNmSjGHhCFcw==} + peerDependencies: + react: ^16.8 || ^17.0 || ^18.0 + dependencies: + '@babel/runtime': 7.23.7 + '@radix-ui/react-compose-refs': 1.0.0(react@18.2.0) + react: 18.2.0 + dev: false + + /@radix-ui/react-use-callback-ref@1.0.0(react@18.2.0): + resolution: {integrity: sha512-GZtyzoHz95Rhs6S63D2t/eqvdFCm7I+yHMLVQheKM7nBD8mbZIt+ct1jz4536MDnaOGKIxynJ8eHTkVGVVkoTg==} + peerDependencies: + react: ^16.8 || ^17.0 || ^18.0 + dependencies: + '@babel/runtime': 7.23.7 + react: 18.2.0 + dev: false + + /@radix-ui/react-use-controllable-state@1.0.0(react@18.2.0): + resolution: {integrity: sha512-FohDoZvk3mEXh9AWAVyRTYR4Sq7/gavuofglmiXB2g1aKyboUD4YtgWxKj8O5n+Uak52gXQ4wKz5IFST4vtJHg==} + peerDependencies: + react: ^16.8 || ^17.0 || ^18.0 + dependencies: + '@babel/runtime': 7.23.7 + '@radix-ui/react-use-callback-ref': 1.0.0(react@18.2.0) + react: 18.2.0 + dev: false + + /@radix-ui/react-use-escape-keydown@1.0.2(react@18.2.0): + resolution: {integrity: sha512-DXGim3x74WgUv+iMNCF+cAo8xUHHeqvjx8zs7trKf+FkQKPQXLk2sX7Gx1ysH7Q76xCpZuxIJE7HLPxRE+Q+GA==} + peerDependencies: + react: ^16.8 || ^17.0 || ^18.0 + dependencies: + '@babel/runtime': 7.23.7 + '@radix-ui/react-use-callback-ref': 1.0.0(react@18.2.0) + react: 18.2.0 + dev: false + + /@radix-ui/react-use-layout-effect@1.0.0(react@18.2.0): + resolution: {integrity: sha512-6Tpkq+R6LOlmQb1R5NNETLG0B4YP0wc+klfXafpUCj6JGyaUc8il7/kUZ7m59rGbXGczE9Bs+iz2qloqsZBduQ==} + peerDependencies: + react: ^16.8 || ^17.0 || ^18.0 + dependencies: + '@babel/runtime': 7.23.7 + react: 18.2.0 + dev: false + + /@radix-ui/react-use-rect@1.0.0(react@18.2.0): + resolution: {integrity: sha512-TB7pID8NRMEHxb/qQJpvSt3hQU4sqNPM1VCTjTRjEOa7cEop/QMuq8S6fb/5Tsz64kqSvB9WnwsDHtjnrM9qew==} + peerDependencies: + react: ^16.8 || ^17.0 || ^18.0 + dependencies: + '@babel/runtime': 7.23.7 + '@radix-ui/rect': 1.0.0 + react: 18.2.0 + dev: false + + /@radix-ui/react-use-size@1.0.0(react@18.2.0): + resolution: {integrity: sha512-imZ3aYcoYCKhhgNpkNDh/aTiU05qw9hX+HHI1QDBTyIlcFjgeFlKKySNGMwTp7nYFLQg/j0VA2FmCY4WPDDHMg==} + peerDependencies: + react: ^16.8 || ^17.0 || ^18.0 + dependencies: + '@babel/runtime': 7.23.7 + '@radix-ui/react-use-layout-effect': 1.0.0(react@18.2.0) + react: 18.2.0 + dev: false + + /@radix-ui/rect@1.0.0: + resolution: {integrity: sha512-d0O68AYy/9oeEy1DdC07bz1/ZXX+DqCskRd3i4JzLSTXwefzaepQrKjXC7aNM8lTHjFLDO0pDgaEiQ7jEk+HVg==} + dependencies: + '@babel/runtime': 7.23.7 + dev: false + + /@react-hookz/deep-equal@1.0.4: + resolution: {integrity: sha512-N56fTrAPUDz/R423pag+n6TXWbvlBZDtTehaGFjK0InmN+V2OFWLE/WmORhmn6Ce7dlwH5+tQN1LJFw3ngTJVg==} + dev: false + + /@react-hookz/web@24.0.2(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-LhWw/LzhxKYRZDRIKd42mCMqRa9pTMSpwpwnfpa0hYoUNcrHw//3NlpoPlynkmKT3G88mumTTuV0HeWnNkarog==} + engines: {node: '>=18.0.0'} + peerDependencies: + js-cookie: ^3.0.5 + react: ^16.8 || ^17 || ^18 + react-dom: ^16.8 || ^17 || ^18 + peerDependenciesMeta: + js-cookie: + optional: true + dependencies: + '@react-hookz/deep-equal': 1.0.4 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@rushstack/eslint-patch@1.6.1: + resolution: {integrity: sha512-UY+FGM/2jjMkzQLn8pxcHGMaVLh9aEitG3zY2CiY7XHdLiz3bZOwa6oDxNqEMv7zZkV+cj5DOdz0cQ1BP5Hjgw==} + dev: true + + /@semantic-release/changelog@6.0.3(semantic-release@22.0.12): + resolution: {integrity: sha512-dZuR5qByyfe3Y03TpmCvAxCyTnp7r5XwtHRf/8vD9EAn4ZWbavUX8adMtXYzE86EVh0gyLA7lm5yW4IV30XUag==} + engines: {node: '>=14.17'} + peerDependencies: + semantic-release: '>=18.0.0' + dependencies: + '@semantic-release/error': 3.0.0 + aggregate-error: 3.1.0 + fs-extra: 11.2.0 + lodash: 4.17.21 + semantic-release: 22.0.12(typescript@5.3.3) + dev: true + + /@semantic-release/commit-analyzer@11.1.0(semantic-release@22.0.12): + resolution: {integrity: sha512-cXNTbv3nXR2hlzHjAMgbuiQVtvWHTlwwISt60B+4NZv01y/QRY7p2HcJm8Eh2StzcTJoNnflvKjHH/cjFS7d5g==} + engines: {node: ^18.17 || >=20.6.1} + peerDependencies: + semantic-release: '>=20.1.0' + dependencies: + conventional-changelog-angular: 7.0.0 + conventional-commits-filter: 4.0.0 + conventional-commits-parser: 5.0.0 + debug: 4.3.4(supports-color@5.5.0) + import-from-esm: 1.3.3 + lodash-es: 4.17.21 + micromatch: 4.0.5 + semantic-release: 22.0.12(typescript@5.3.3) + transitivePeerDependencies: + - supports-color + dev: true + + /@semantic-release/error@3.0.0: + resolution: {integrity: sha512-5hiM4Un+tpl4cKw3lV4UgzJj+SmfNIDCLLw0TepzQxz9ZGV5ixnqkzIVF+3tp0ZHgcMKE+VNGHJjEeyFG2dcSw==} + engines: {node: '>=14.17'} + dev: true + + /@semantic-release/error@4.0.0: + resolution: {integrity: sha512-mgdxrHTLOjOddRVYIYDo0fR3/v61GNN1YGkfbrjuIKg/uMgCd+Qzo3UAXJ+woLQQpos4pl5Esuw5A7AoNlzjUQ==} + engines: {node: '>=18'} + dev: true + + /@semantic-release/git@10.0.1(semantic-release@22.0.12): + resolution: {integrity: sha512-eWrx5KguUcU2wUPaO6sfvZI0wPafUKAMNC18aXY4EnNcrZL86dEmpNVnC9uMpGZkmZJ9EfCVJBQx4pV4EMGT1w==} + engines: {node: '>=14.17'} + peerDependencies: + semantic-release: '>=18.0.0' + dependencies: + '@semantic-release/error': 3.0.0 + aggregate-error: 3.1.0 + debug: 4.3.4(supports-color@5.5.0) + dir-glob: 3.0.1 + execa: 5.1.1 + lodash: 4.17.21 + micromatch: 4.0.5 + p-reduce: 2.1.0 + semantic-release: 22.0.12(typescript@5.3.3) + transitivePeerDependencies: + - supports-color + dev: true + + /@semantic-release/github@9.2.6(semantic-release@22.0.12): + resolution: {integrity: sha512-shi+Lrf6exeNZF+sBhK+P011LSbhmIAoUEgEY6SsxF8irJ+J2stwI5jkyDQ+4gzYyDImzV6LCKdYB9FXnQRWKA==} + engines: {node: '>=18'} + peerDependencies: + semantic-release: '>=20.1.0' + dependencies: + '@octokit/core': 5.0.2 + '@octokit/plugin-paginate-rest': 9.1.5(@octokit/core@5.0.2) + '@octokit/plugin-retry': 6.0.1(@octokit/core@5.0.2) + '@octokit/plugin-throttling': 8.1.3(@octokit/core@5.0.2) + '@semantic-release/error': 4.0.0 + aggregate-error: 5.0.0 + debug: 4.3.4(supports-color@5.5.0) + dir-glob: 3.0.1 + globby: 14.0.0 + http-proxy-agent: 7.0.0 + https-proxy-agent: 7.0.2 + issue-parser: 6.0.0 + lodash-es: 4.17.21 + mime: 4.0.1 + p-filter: 4.1.0 + semantic-release: 22.0.12(typescript@5.3.3) + url-join: 5.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@semantic-release/npm@11.0.2(semantic-release@22.0.12): + resolution: {integrity: sha512-owtf3RjyPvRE63iUKZ5/xO4uqjRpVQDUB9+nnXj0xwfIeM9pRl+cG+zGDzdftR4m3f2s4Wyf3SexW+kF5DFtWA==} + engines: {node: ^18.17 || >=20} + peerDependencies: + semantic-release: '>=20.1.0' + dependencies: + '@semantic-release/error': 4.0.0 + aggregate-error: 5.0.0 + execa: 8.0.1 + fs-extra: 11.2.0 + lodash-es: 4.17.21 + nerf-dart: 1.0.0 + normalize-url: 8.0.0 + npm: 10.2.5 + rc: 1.2.8 + read-pkg: 9.0.1 + registry-auth-token: 5.0.2 + semantic-release: 22.0.12(typescript@5.3.3) + semver: 7.5.4 + tempy: 3.1.0 + dev: true + + /@semantic-release/release-notes-generator@12.1.0(semantic-release@22.0.12): + resolution: {integrity: sha512-g6M9AjUKAZUZnxaJZnouNBeDNTCUrJ5Ltj+VJ60gJeDaRRahcHsry9HW8yKrnKkKNkx5lbWiEP1FPMqVNQz8Kg==} + engines: {node: ^18.17 || >=20.6.1} + peerDependencies: + semantic-release: '>=20.1.0' + dependencies: + conventional-changelog-angular: 7.0.0 + conventional-changelog-writer: 7.0.1 + conventional-commits-filter: 4.0.0 + conventional-commits-parser: 5.0.0 + debug: 4.3.4(supports-color@5.5.0) + get-stream: 7.0.1 + import-from-esm: 1.3.3 + into-stream: 7.0.0 + lodash-es: 4.17.21 + read-pkg-up: 11.0.0 + semantic-release: 22.0.12(typescript@5.3.3) + transitivePeerDependencies: + - supports-color + dev: true + + /@sinclair/typebox@0.27.8: + resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + dev: true + + /@sindresorhus/is@4.6.0: + resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} + engines: {node: '>=10'} + dev: true + + /@sindresorhus/merge-streams@1.0.0: + resolution: {integrity: sha512-rUV5WyJrJLoloD4NDN1V1+LDMDWOa4OTsT4yYJwQNpTU6FWxkxHpL7eu4w+DmiH8x/EAM1otkPE1+LaspIbplw==} + engines: {node: '>=18'} + dev: true + + /@sinonjs/commons@3.0.0: + resolution: {integrity: sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==} + dependencies: + type-detect: 4.0.8 + dev: true + + /@sinonjs/fake-timers@10.3.0: + resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} + dependencies: + '@sinonjs/commons': 3.0.0 + dev: true + + /@swc/helpers@0.5.2: + resolution: {integrity: sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==} + dependencies: + tslib: 2.5.0 + dev: false + + /@t3-oss/env-core@0.7.1(typescript@5.3.3)(zod@3.21.4): + resolution: {integrity: sha512-3+SQt39OlmSaRLqYVFv8uRm1BpFepM5TIiMytRqO9cjH+wB77o6BIJdeyM5h5U4qLBMEzOJWCY4MBaU/rLwbYw==} + peerDependencies: + typescript: '>=4.7.2' + zod: ^3.0.0 + peerDependenciesMeta: + typescript: + optional: true + dependencies: + typescript: 5.3.3 + zod: 3.21.4 + dev: false + + /@t3-oss/env-nextjs@0.7.1(typescript@5.3.3)(zod@3.21.4): + resolution: {integrity: sha512-tQDbNLGCOvKGi+JoGuJ/CJInJI7/kLWJqtgGppAKS7ZFLdVOqZYR/uRjxlXOWPnxmUKF8VswOAsq7fXUpNZDhA==} + peerDependencies: + typescript: '>=4.7.2' + zod: ^3.0.0 + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@t3-oss/env-core': 0.7.1(typescript@5.3.3)(zod@3.21.4) + typescript: 5.3.3 + zod: 3.21.4 + dev: false + + /@tailwindcss/typography@0.5.10(tailwindcss@3.4.0): + resolution: {integrity: sha512-Pe8BuPJQJd3FfRnm6H0ulKIGoMEQS+Vq01R6M5aCrFB/ccR/shT+0kXLjouGC1gFLm9hopTFN+DMP0pfwRWzPw==} + peerDependencies: + tailwindcss: '>=3.0.0 || insiders' + dependencies: + lodash.castarray: 4.4.0 + lodash.isplainobject: 4.0.6 + lodash.merge: 4.6.2 + postcss-selector-parser: 6.0.10 + tailwindcss: 3.4.0 + dev: false + + /@teppeis/multimaps@3.0.0: + resolution: {integrity: sha512-ID7fosbc50TbT0MK0EG12O+gAP3W3Aa/Pz4DaTtQtEvlc9Odaqi0de+xuZ7Li2GtK4HzEX7IuRWS/JmZLksR3Q==} + engines: {node: '>=14'} + dev: true + + /@turf/area@6.5.0: + resolution: {integrity: sha512-xCZdiuojokLbQ+29qR6qoMD89hv+JAgWjLrwSEWL+3JV8IXKeNFl6XkEJz9HGkVpnXvQKJoRz4/liT+8ZZ5Jyg==} + dependencies: + '@turf/helpers': 6.5.0 + '@turf/meta': 6.5.0 + dev: true + + /@turf/bbox@6.5.0: + resolution: {integrity: sha512-RBbLaao5hXTYyyg577iuMtDB8ehxMlUqHEJiMs8jT1GHkFhr6sYre3lmLsPeYEi/ZKj5TP5tt7fkzNdJ4GIVyw==} + dependencies: + '@turf/helpers': 6.5.0 + '@turf/meta': 6.5.0 + dev: true + + /@turf/centroid@6.5.0: + resolution: {integrity: sha512-MwE1oq5E3isewPprEClbfU5pXljIK/GUOMbn22UM3IFPDJX0KeoyLNwghszkdmFp/qMGL/M13MMWvU+GNLXP/A==} + dependencies: + '@turf/helpers': 6.5.0 + '@turf/meta': 6.5.0 + dev: true + + /@turf/helpers@6.5.0: + resolution: {integrity: sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==} + dev: true + + /@turf/meta@6.5.0: + resolution: {integrity: sha512-RrArvtsV0vdsCBegoBtOalgdSOfkBrTJ07VkpiCnq/491W67hnMWmDu7e6Ztw0C3WldRYTXkg3SumfdzZxLBHA==} + dependencies: + '@turf/helpers': 6.5.0 + dev: true + + /@types/babel__core@7.20.5: + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + dependencies: + '@babel/parser': 7.23.6 + '@babel/types': 7.23.6 + '@types/babel__generator': 7.6.8 + '@types/babel__template': 7.4.4 + '@types/babel__traverse': 7.20.5 + dev: true + + /@types/babel__generator@7.6.8: + resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} + dependencies: + '@babel/types': 7.23.6 + dev: true + + /@types/babel__template@7.4.4: + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + dependencies: + '@babel/parser': 7.23.6 + '@babel/types': 7.23.6 + dev: true + + /@types/babel__traverse@7.20.5: + resolution: {integrity: sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==} + dependencies: + '@babel/types': 7.23.6 + dev: true + + /@types/d3-array@3.0.4: + resolution: {integrity: sha512-nwvEkG9vYOc0Ic7G7kwgviY4AQlTfYGIZ0fqB7CQHXGyYM6nO7kJh5EguSNA3jfh4rq7Sb7eMVq8isuvg2/miQ==} + dev: false + + /@types/d3-color@3.1.0: + resolution: {integrity: sha512-HKuicPHJuvPgCD+np6Se9MQvS6OCbJmOjGvylzMJRlDwUXjKTTXs6Pwgk79O09Vj/ho3u1ofXnhFOaEWWPrlwA==} + dev: false + + /@types/d3-ease@3.0.0: + resolution: {integrity: sha512-aMo4eaAOijJjA6uU+GIeW018dvy9+oH5Y2VPPzjjfxevvGQ/oRDs+tfYC9b50Q4BygRR8yE2QCLsrT0WtAVseA==} + dev: false + + /@types/d3-interpolate@3.0.1: + resolution: {integrity: sha512-jx5leotSeac3jr0RePOH1KdR9rISG91QIE4Q2PYTu4OymLTZfA3SrnURSLzKH48HmXVUru50b8nje4E79oQSQw==} + dependencies: + '@types/d3-color': 3.1.0 + dev: false + + /@types/d3-path@3.0.0: + resolution: {integrity: sha512-0g/A+mZXgFkQxN3HniRDbXMN79K3CdTpLsevj+PXiTcb2hVyvkZUBg37StmgCQkaD84cUJ4uaDAWq7UJOQy2Tg==} + dev: false + + /@types/d3-scale@4.0.3: + resolution: {integrity: sha512-PATBiMCpvHJSMtZAMEhc2WyL+hnzarKzI6wAHYjhsonjWJYGq5BXTzQjv4l8m2jO183/4wZ90rKvSeT7o72xNQ==} + dependencies: + '@types/d3-time': 3.0.0 + dev: false + + /@types/d3-shape@3.1.1: + resolution: {integrity: sha512-6Uh86YFF7LGg4PQkuO2oG6EMBRLuW9cbavUW46zkIO5kuS2PfTqo2o9SkgtQzguBHbLgNnU90UNsITpsX1My+A==} + dependencies: + '@types/d3-path': 3.0.0 + dev: false + + /@types/d3-time@3.0.0: + resolution: {integrity: sha512-sZLCdHvBUcNby1cB6Fd3ZBrABbjz3v1Vm90nysCQ6Vt7vd6e/h9Lt7SiJUoEX0l4Dzc7P5llKyhqSi1ycSf1Hg==} + dev: false + + /@types/d3-timer@3.0.0: + resolution: {integrity: sha512-HNB/9GHqu7Fo8AQiugyJbv6ZxYz58wef0esl4Mv828w1ZKpAshw/uFWVDUcIB9KKFeFKoxS3cHY07FFgtTRZ1g==} + dev: false + + /@types/debug@4.1.7: + resolution: {integrity: sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg==} + dependencies: + '@types/ms': 0.7.31 + dev: false + + /@types/eslint@8.21.3: + resolution: {integrity: sha512-fa7GkppZVEByMWGbTtE5MbmXWJTVbrjjaS8K6uQj+XtuuUv1fsuPAxhygfqLmsb/Ufb3CV8deFCpiMfAgi00Sw==} + dependencies: + '@types/estree': 1.0.1 + '@types/json-schema': 7.0.11 + dev: true + + /@types/estree@1.0.1: + resolution: {integrity: sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==} + dev: true + + /@types/file-saver@2.0.5: + resolution: {integrity: sha512-zv9kNf3keYegP5oThGLaPk8E081DFDuwfqjtiTzm6PoxChdJ1raSuADf2YGCVIyrSynLrgc8JWv296s7Q7pQSQ==} + dev: true + + /@types/graceful-fs@4.1.9: + resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} + dependencies: + '@types/node': 18.19.5 + dev: true + + /@types/hast@2.3.4: + resolution: {integrity: sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g==} + dependencies: + '@types/unist': 2.0.6 + dev: false + + /@types/istanbul-lib-coverage@2.0.6: + resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} + dev: true + + /@types/istanbul-lib-report@3.0.3: + resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==} + dependencies: + '@types/istanbul-lib-coverage': 2.0.6 + dev: true + + /@types/istanbul-reports@3.0.4: + resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} + dependencies: + '@types/istanbul-lib-report': 3.0.3 + dev: true + + /@types/jest@29.5.11: + resolution: {integrity: sha512-S2mHmYIVe13vrm6q4kN6fLYYAka15ALQki/vgDC3mIukEOx8WJlv0kQPM+d4w8Gp6u0uSdKND04IlTXBv0rwnQ==} + dependencies: + expect: 29.7.0 + pretty-format: 29.7.0 + dev: true + + /@types/jsdom@16.2.15: + resolution: {integrity: sha512-nwF87yjBKuX/roqGYerZZM0Nv1pZDMAT5YhOHYeM/72Fic+VEqJh4nyoqoapzJnW3pUlfxPY5FhgsJtM+dRnQQ==} + dependencies: + '@types/node': 18.19.5 + '@types/parse5': 6.0.3 + '@types/tough-cookie': 4.0.2 + dev: false + + /@types/json-schema@7.0.11: + resolution: {integrity: sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==} + dev: true + + /@types/json-schema@7.0.15: + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + dev: true + + /@types/json5@0.0.29: + resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} + dev: true + + /@types/lodash-es@4.17.12: + resolution: {integrity: sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==} + dependencies: + '@types/lodash': 4.14.194 + dev: true + + /@types/lodash@4.14.194: + resolution: {integrity: sha512-r22s9tAS7imvBt2lyHC9B8AGwWnXaYb1tY09oyLkXDs4vArpYJzw09nj8MLx5VfciBPGIb+ZwG0ssYnEPJxn/g==} + dev: true + + /@types/mdast@3.0.11: + resolution: {integrity: sha512-Y/uImid8aAwrEA24/1tcRZwpxX3pIFTSilcNDKSPn+Y2iDywSEachzRuvgAYYLR3wpGXAsMbv5lvKLDZLeYPAw==} + dependencies: + '@types/unist': 2.0.6 + dev: false + + /@types/minimist@1.2.5: + resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==} + dev: true + + /@types/ms@0.7.31: + resolution: {integrity: sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==} + dev: false + + /@types/node@18.15.5: + resolution: {integrity: sha512-Ark2WDjjZO7GmvsyFFf81MXuGTA/d6oP38anyxWOL6EREyBKAxKoFHwBhaZxCfLRLpO8JgVXwqOwSwa7jRcjew==} + dev: true + + /@types/node@18.19.5: + resolution: {integrity: sha512-22MG6T02Hos2JWfa1o5jsIByn+bc5iOt1IS4xyg6OG68Bu+wMonVZzdrgCw693++rpLE9RUT/Bx15BeDzO0j+g==} + dependencies: + undici-types: 5.26.5 + + /@types/normalize-package-data@2.4.4: + resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} + dev: true + + /@types/parse5@6.0.3: + resolution: {integrity: sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g==} + dev: false + + /@types/prettier@2.7.2: + resolution: {integrity: sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg==} + dev: true + + /@types/prop-types@15.7.5: + resolution: {integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==} + + /@types/react-collapse@5.0.1: + resolution: {integrity: sha512-Iq3OrqvzCIP0DmAawU4T2VKH6XAplbjo/D7Qk14mcfQ92plU+OrA2SF10r2XrcFg1Wvya/5f8w1vS29RVpdoLQ==} + dependencies: + '@types/react': 18.0.28 + dev: true + + /@types/react-csv@1.1.10: + resolution: {integrity: sha512-PESAyASL7Nfi/IyBR3ufd8qZkyoS+7jOylKmJxRZUZLFASLo4NZaRsJ8rNP8pCcbIziADyWBbLPD1nPddhsL4g==} + dependencies: + '@types/react': 18.0.28 + dev: true + + /@types/react-dom@17.0.25: + resolution: {integrity: sha512-urx7A7UxkZQmThYA4So0NelOVjx3V4rNFVJwp0WZlbIK5eM4rNJDiN3R/E9ix0MBh6kAEojk/9YL+Te6D9zHNA==} + requiresBuild: true + dependencies: + '@types/react': 17.0.74 + dev: false + optional: true + + /@types/react-dom@18.0.11: + resolution: {integrity: sha512-O38bPbI2CWtgw/OoQoY+BRelw7uysmXbWvw3nLWO21H1HSh+GOlqPuXshJfjmpNlKiiSDG9cc1JZAaMmVdcTlw==} + dependencies: + '@types/react': 18.0.28 + dev: true + + /@types/react-syntax-highlighter@15.5.6: + resolution: {integrity: sha512-i7wFuLbIAFlabTeD2I1cLjEOrG/xdMa/rpx2zwzAoGHuXJDhSqp9BSfDlMHSh9JSuNfxHk9eEmMX6D55GiyjGg==} + dependencies: + '@types/react': 18.0.28 + dev: true + + /@types/react@17.0.74: + resolution: {integrity: sha512-nBtFGaeTMzpiL/p73xbmCi00SiCQZDTJUk9ZuHOLtil3nI+y7l269LHkHIAYpav99ZwGnPJzuJsJpfLXjiQ52g==} + requiresBuild: true + dependencies: + '@types/prop-types': 15.7.5 + '@types/scheduler': 0.16.3 + csstype: 3.1.3 + dev: false + optional: true + + /@types/react@18.0.28: + resolution: {integrity: sha512-RD0ivG1kEztNBdoAK7lekI9M+azSnitIn85h4iOiaLjaTrMjzslhaqCGaI4IyCJ1RljWiLCEu4jyrLLgqxBTew==} + dependencies: + '@types/prop-types': 15.7.5 + '@types/scheduler': 0.16.3 + csstype: 3.1.2 + + /@types/scheduler@0.16.3: + resolution: {integrity: sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==} + + /@types/semver@7.5.6: + resolution: {integrity: sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==} + dev: true + + /@types/sinonjs__fake-timers@8.1.1: + resolution: {integrity: sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g==} + dev: true + + /@types/sizzle@2.3.8: + resolution: {integrity: sha512-0vWLNK2D5MT9dg0iOo8GlKguPAU02QjmZitPEsXRuJXU/OGIOt9vT9Fc26wtYuavLxtO45v9PGleoL9Z0k1LHg==} + dev: true + + /@types/stack-utils@2.0.3: + resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} + dev: true + + /@types/tough-cookie@4.0.2: + resolution: {integrity: sha512-Q5vtl1W5ue16D+nIaW8JWebSSraJVlK+EthKn7e7UcD4KWsaSJ8BqGPXNaPghgtcn/fhvrN17Tv8ksUsQpiplw==} + dev: false + + /@types/unist@2.0.6: + resolution: {integrity: sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==} + dev: false + + /@types/uuid@9.0.1: + resolution: {integrity: sha512-rFT3ak0/2trgvp4yYZo5iKFEPsET7vKydKF+VRCxlQ9bpheehyAJH89dAkaLEq/j/RZXJIqcgsmPJKUP1Z28HA==} + dev: true + + /@types/uuid@9.0.7: + resolution: {integrity: sha512-WUtIVRUZ9i5dYXefDEAI7sh9/O7jGvHg7Df/5O/gtH3Yabe5odI3UWopVR1qbPXQtvOxWu3mM4XxlYeZtMWF4g==} + dev: true + + /@types/yargs-parser@21.0.3: + resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} + dev: true + + /@types/yargs@17.0.32: + resolution: {integrity: sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==} + dependencies: + '@types/yargs-parser': 21.0.3 + dev: true + + /@types/yauzl@2.10.3: + resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} + requiresBuild: true + dependencies: + '@types/node': 18.19.5 + dev: true + optional: true + + /@typescript-eslint/eslint-plugin@6.17.0(@typescript-eslint/parser@6.17.0)(eslint@8.56.0)(typescript@5.3.3): + resolution: {integrity: sha512-Vih/4xLXmY7V490dGwBQJTpIZxH4ZFH6eCVmQ4RFkB+wmaCTDAx4dtgoWwMNGKLkqRY1L6rPqzEbjorRnDo4rQ==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@eslint-community/regexpp': 4.5.1 + '@typescript-eslint/parser': 6.17.0(eslint@8.56.0)(typescript@5.3.3) + '@typescript-eslint/scope-manager': 6.17.0 + '@typescript-eslint/type-utils': 6.17.0(eslint@8.56.0)(typescript@5.3.3) + '@typescript-eslint/utils': 6.17.0(eslint@8.56.0)(typescript@5.3.3) + '@typescript-eslint/visitor-keys': 6.17.0 + debug: 4.3.4(supports-color@5.5.0) + eslint: 8.56.0 + graphemer: 1.4.0 + ignore: 5.2.4 + natural-compare: 1.4.0 + semver: 7.5.4 + ts-api-utils: 1.0.3(typescript@5.3.3) + typescript: 5.3.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/parser@6.17.0(eslint@8.56.0)(typescript@5.3.3): + resolution: {integrity: sha512-C4bBaX2orvhK+LlwrY8oWGmSl4WolCfYm513gEccdWZj0CwGadbIADb0FtVEcI+WzUyjyoBj2JRP8g25E6IB8A==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/scope-manager': 6.17.0 + '@typescript-eslint/types': 6.17.0 + '@typescript-eslint/typescript-estree': 6.17.0(typescript@5.3.3) + '@typescript-eslint/visitor-keys': 6.17.0 + debug: 4.3.4(supports-color@5.5.0) + eslint: 8.56.0 + typescript: 5.3.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/scope-manager@5.62.0: + resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/visitor-keys': 5.62.0 + dev: true + + /@typescript-eslint/scope-manager@6.17.0: + resolution: {integrity: sha512-RX7a8lwgOi7am0k17NUO0+ZmMOX4PpjLtLRgLmT1d3lBYdWH4ssBUbwdmc5pdRX8rXon8v9x8vaoOSpkHfcXGA==} + engines: {node: ^16.0.0 || >=18.0.0} + dependencies: + '@typescript-eslint/types': 6.17.0 + '@typescript-eslint/visitor-keys': 6.17.0 + dev: true + + /@typescript-eslint/type-utils@6.17.0(eslint@8.56.0)(typescript@5.3.3): + resolution: {integrity: sha512-hDXcWmnbtn4P2B37ka3nil3yi3VCQO2QEB9gBiHJmQp5wmyQWqnjA85+ZcE8c4FqnaB6lBwMrPkgd4aBYz3iNg==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/typescript-estree': 6.17.0(typescript@5.3.3) + '@typescript-eslint/utils': 6.17.0(eslint@8.56.0)(typescript@5.3.3) + debug: 4.3.4(supports-color@5.5.0) + eslint: 8.56.0 + ts-api-utils: 1.0.3(typescript@5.3.3) + typescript: 5.3.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/types@5.62.0: + resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /@typescript-eslint/types@6.17.0: + resolution: {integrity: sha512-qRKs9tvc3a4RBcL/9PXtKSehI/q8wuU9xYJxe97WFxnzH8NWWtcW3ffNS+EWg8uPvIerhjsEZ+rHtDqOCiH57A==} + engines: {node: ^16.0.0 || >=18.0.0} + dev: true + + /@typescript-eslint/typescript-estree@5.62.0(typescript@5.3.3): + resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/visitor-keys': 5.62.0 + debug: 4.3.4(supports-color@5.5.0) + globby: 11.1.0 + is-glob: 4.0.3 + semver: 7.5.4 + tsutils: 3.21.0(typescript@5.3.3) + typescript: 5.3.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/typescript-estree@6.17.0(typescript@5.3.3): + resolution: {integrity: sha512-gVQe+SLdNPfjlJn5VNGhlOhrXz4cajwFd5kAgWtZ9dCZf4XJf8xmgCTLIqec7aha3JwgLI2CK6GY1043FRxZwg==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/types': 6.17.0 + '@typescript-eslint/visitor-keys': 6.17.0 + debug: 4.3.4(supports-color@5.5.0) + globby: 11.1.0 + is-glob: 4.0.3 + minimatch: 9.0.3 + semver: 7.5.4 + ts-api-utils: 1.0.3(typescript@5.3.3) + typescript: 5.3.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/utils@5.62.0(eslint@8.56.0)(typescript@5.3.3): + resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0) + '@types/json-schema': 7.0.15 + '@types/semver': 7.5.6 + '@typescript-eslint/scope-manager': 5.62.0 + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.3.3) + eslint: 8.56.0 + eslint-scope: 5.1.1 + semver: 7.5.4 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /@typescript-eslint/utils@6.17.0(eslint@8.56.0)(typescript@5.3.3): + resolution: {integrity: sha512-LofsSPjN/ITNkzV47hxas2JCsNCEnGhVvocfyOcLzT9c/tSZE7SfhS/iWtzP1lKNOEfLhRTZz6xqI8N2RzweSQ==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0) + '@types/json-schema': 7.0.15 + '@types/semver': 7.5.6 + '@typescript-eslint/scope-manager': 6.17.0 + '@typescript-eslint/types': 6.17.0 + '@typescript-eslint/typescript-estree': 6.17.0(typescript@5.3.3) + eslint: 8.56.0 + semver: 7.5.4 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /@typescript-eslint/visitor-keys@5.62.0: + resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + '@typescript-eslint/types': 5.62.0 + eslint-visitor-keys: 3.4.3 + dev: true + + /@typescript-eslint/visitor-keys@6.17.0: + resolution: {integrity: sha512-H6VwB/k3IuIeQOyYczyyKN8wH6ed8EwliaYHLxOIhyF0dYEIsN8+Bk3GE19qafeMKyZJJHP8+O1HiFhFLUNKSg==} + engines: {node: ^16.0.0 || >=18.0.0} + dependencies: + '@typescript-eslint/types': 6.17.0 + eslint-visitor-keys: 3.4.3 + dev: true + + /@ungap/structured-clone@1.2.0: + resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + dev: true + + /JSONStream@1.3.5: + resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} + dependencies: + jsonparse: 1.3.1 + through: 2.3.8 + dev: true + + /abs-svg-path@0.1.1: + resolution: {integrity: sha512-d8XPSGjfyzlXC3Xx891DJRyZfqk5JU0BJrDQcsWomFIV1/BIzPW5HDH5iDdWpqWaav0YVIEzT1RHTwWr0FFshA==} + dev: true + + /acorn-jsx@5.3.2(acorn@8.11.3): + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + acorn: 8.11.3 + dev: true + + /acorn-jsx@5.3.2(acorn@8.8.2): + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + acorn: 8.8.2 + dev: false + + /acorn-walk@8.2.0: + resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} + engines: {node: '>=0.4.0'} + dev: true + + /acorn@7.4.1: + resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: true + + /acorn@8.11.3: + resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} + engines: {node: '>=0.4.0'} + dev: true + + /acorn@8.8.2: + resolution: {integrity: sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==} + engines: {node: '>=0.4.0'} + + /agent-base@7.1.0: + resolution: {integrity: sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==} + engines: {node: '>= 14'} + dependencies: + debug: 4.3.4(supports-color@5.5.0) + transitivePeerDependencies: + - supports-color + dev: true + + /aggregate-error@3.1.0: + resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} + engines: {node: '>=8'} + dependencies: + clean-stack: 2.2.0 + indent-string: 4.0.0 + dev: true + + /aggregate-error@5.0.0: + resolution: {integrity: sha512-gOsf2YwSlleG6IjRYG2A7k0HmBMEo6qVNk9Bp/EaLgAJT5ngH6PXbqa4ItvnEwCm/velL5jAnQgsHsWnjhGmvw==} + engines: {node: '>=18'} + dependencies: + clean-stack: 5.2.0 + indent-string: 5.0.0 + dev: true + + /ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + dev: true + + /ajv@8.12.0: + resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} + dependencies: + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js: 4.4.1 + dev: true + + /almost-equal@1.1.0: + resolution: {integrity: sha512-0V/PkoculFl5+0Lp47JoxUcO0xSxhIBvm+BxHdD/OgXNmdRpRHCFnKVuUoWyS9EzQP+otSGv0m9Lb4yVkQBn2A==} + dev: true + + /ansi-colors@4.1.1: + resolution: {integrity: sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==} + engines: {node: '>=6'} + dev: true + + /ansi-colors@4.1.3: + resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} + engines: {node: '>=6'} + dev: true + + /ansi-escapes@4.3.2: + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} + engines: {node: '>=8'} + dependencies: + type-fest: 0.21.3 + dev: true + + /ansi-escapes@6.2.0: + resolution: {integrity: sha512-kzRaCqXnpzWs+3z5ABPQiVke+iq0KXkHo8xiWV4RPTi5Yli0l97BEQuhXV1s7+aSU/fu1kUuxgS4MsQ0fRuygw==} + engines: {node: '>=14.16'} + dependencies: + type-fest: 3.13.1 + dev: true + + /ansi-regex@4.1.1: + resolution: {integrity: sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==} + engines: {node: '>=6'} + dev: true + + /ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + dev: true + + /ansi-regex@6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: '>=12'} + dev: true + + /ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + dependencies: + color-convert: 1.9.3 + + /ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + dependencies: + color-convert: 2.0.1 + dev: true + + /ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + dev: true + + /ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + dev: true + + /ansicolors@0.3.2: + resolution: {integrity: sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg==} + dev: true + + /any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + + /anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + + /arch@2.2.0: + resolution: {integrity: sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==} + dev: true + + /arg@5.0.2: + resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} + + /argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + dependencies: + sprintf-js: 1.0.3 + dev: true + + /argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + dev: true + + /argv-formatter@1.0.0: + resolution: {integrity: sha512-F2+Hkm9xFaRg+GkaNnbwXNDV5O6pnCFEmqyhvfC/Ic5LbgOWjJh3L+mN/s91rxVL3znE7DYVpW0GJFT+4YBgWw==} + dev: true + + /aria-hidden@1.2.3: + resolution: {integrity: sha512-xcLxITLe2HYa1cnYnwCjkOO1PqUHQpozB8x9AR0OgWN2woOBi5kSDVxKfd0b7sb1hw5qFeJhXm9H1nu3xSfLeQ==} + engines: {node: '>=10'} + dependencies: + tslib: 2.5.0 + dev: false + + /aria-query@5.1.3: + resolution: {integrity: sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==} + dependencies: + deep-equal: 2.2.1 + dev: true + + /array-bounds@1.0.1: + resolution: {integrity: sha512-8wdW3ZGk6UjMPJx/glyEt0sLzzwAE1bhToPsO1W2pbpR2gULyxe3BjSiuJFheP50T/GgODVPz2fuMUmIywt8cQ==} + dev: true + + /array-buffer-byte-length@1.0.0: + resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==} + dependencies: + call-bind: 1.0.5 + is-array-buffer: 3.0.2 + dev: true + + /array-find-index@1.0.2: + resolution: {integrity: sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw==} + engines: {node: '>=0.10.0'} + dev: true + + /array-ify@1.0.0: + resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==} + dev: true + + /array-includes@3.1.7: + resolution: {integrity: sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + get-intrinsic: 1.2.2 + is-string: 1.0.7 + dev: true + + /array-normalize@1.1.4: + resolution: {integrity: sha512-fCp0wKFLjvSPmCn4F5Tiw4M3lpMZoHlCjfcs7nNzuj3vqQQ1/a8cgB9DXcpDSn18c+coLnaW7rqfcYCvKbyJXg==} + dependencies: + array-bounds: 1.0.1 + dev: true + + /array-range@1.0.1: + resolution: {integrity: sha512-shdaI1zT3CVNL2hnx9c0JMc0ZogGaxDs5e85akgHWKYa0yVbIyp06Ind3dVkTj/uuFrzaHBOyqFzo+VV6aXgtA==} + dev: true + + /array-rearrange@2.2.2: + resolution: {integrity: sha512-UfobP5N12Qm4Qu4fwLDIi2v6+wZsSf6snYSxAMeKhrh37YGnNWZPRmVEKc/2wfms53TLQnzfpG8wCx2Y/6NG1w==} + dev: true + + /array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + dev: true + + /array.prototype.findlastindex@1.2.3: + resolution: {integrity: sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + es-shim-unscopables: 1.0.0 + get-intrinsic: 1.2.2 + dev: true + + /array.prototype.flat@1.3.2: + resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + es-shim-unscopables: 1.0.0 + dev: true + + /array.prototype.flatmap@1.3.2: + resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + es-shim-unscopables: 1.0.0 + dev: true + + /array.prototype.tosorted@1.1.1: + resolution: {integrity: sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + es-shim-unscopables: 1.0.0 + get-intrinsic: 1.2.2 + dev: true + + /arraybuffer.prototype.slice@1.0.2: + resolution: {integrity: sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==} + engines: {node: '>= 0.4'} + dependencies: + array-buffer-byte-length: 1.0.0 + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + get-intrinsic: 1.2.2 + is-array-buffer: 3.0.2 + is-shared-array-buffer: 1.0.2 + dev: true + + /arrify@1.0.1: + resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} + engines: {node: '>=0.10.0'} + dev: true + + /asn1@0.2.6: + resolution: {integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==} + dependencies: + safer-buffer: 2.1.2 + dev: true + + /assert-plus@1.0.0: + resolution: {integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==} + engines: {node: '>=0.8'} + dev: true + + /assertion-error-formatter@3.0.0: + resolution: {integrity: sha512-6YyAVLrEze0kQ7CmJfUgrLHb+Y7XghmL2Ie7ijVa2Y9ynP3LV+VDiwFk62Dn0qtqbmY0BT0ss6p1xxpiF2PYbQ==} + dependencies: + diff: 4.0.2 + pad-right: 0.2.2 + repeat-string: 1.6.1 + dev: true + + /ast-types-flow@0.0.7: + resolution: {integrity: sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==} + dev: true + + /astral-regex@2.0.0: + resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} + engines: {node: '>=8'} + dev: true + + /async@3.2.5: + resolution: {integrity: sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==} + dev: true + + /asynciterator.prototype@1.0.0: + resolution: {integrity: sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg==} + dependencies: + has-symbols: 1.0.3 + dev: true + + /asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + /at-least-node@1.0.0: + resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} + engines: {node: '>= 4.0.0'} + dev: true + + /autoprefixer@10.4.14(postcss@8.4.32): + resolution: {integrity: sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==} + engines: {node: ^10 || ^12 || >=14} + hasBin: true + peerDependencies: + postcss: ^8.1.0 + dependencies: + browserslist: 4.21.5 + caniuse-lite: 1.0.30001572 + fraction.js: 4.2.0 + normalize-range: 0.1.2 + picocolors: 1.0.0 + postcss: 8.4.32 + postcss-value-parser: 4.2.0 + dev: true + + /available-typed-arrays@1.0.5: + resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} + engines: {node: '>= 0.4'} + dev: true + + /aws-sign2@0.7.0: + resolution: {integrity: sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==} + dev: true + + /aws4@1.12.0: + resolution: {integrity: sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==} + dev: true + + /axe-core@4.7.0: + resolution: {integrity: sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ==} + engines: {node: '>=4'} + dev: true + + /axios@1.4.0: + resolution: {integrity: sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==} + dependencies: + follow-redirects: 1.15.2 + form-data: 4.0.0 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + dev: false + + /axobject-query@3.1.1: + resolution: {integrity: sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg==} + dependencies: + deep-equal: 2.2.1 + dev: true + + /babel-jest@29.7.0(@babel/core@7.23.7): + resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@babel/core': ^7.8.0 + dependencies: + '@babel/core': 7.23.7 + '@jest/transform': 29.7.0 + '@types/babel__core': 7.20.5 + babel-plugin-istanbul: 6.1.1 + babel-preset-jest: 29.6.3(@babel/core@7.23.7) + chalk: 4.1.2 + graceful-fs: 4.2.11 + slash: 3.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /babel-plugin-istanbul@6.1.1: + resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} + engines: {node: '>=8'} + dependencies: + '@babel/helper-plugin-utils': 7.22.5 + '@istanbuljs/load-nyc-config': 1.1.0 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-instrument: 5.2.1 + test-exclude: 6.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /babel-plugin-jest-hoist@29.6.3: + resolution: {integrity: sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@babel/template': 7.22.15 + '@babel/types': 7.23.6 + '@types/babel__core': 7.20.5 + '@types/babel__traverse': 7.20.5 + dev: true + + /babel-plugin-styled-components@2.1.4(@babel/core@7.23.7)(styled-components@5.3.11): + resolution: {integrity: sha512-Xgp9g+A/cG47sUyRwwYxGM4bR/jDRg5N6it/8+HxCnbT5XNKSKDT9xm4oag/osgqjC2It/vH0yXsomOG6k558g==} + peerDependencies: + styled-components: '>= 2' + dependencies: + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-module-imports': 7.22.15 + '@babel/plugin-syntax-jsx': 7.23.3(@babel/core@7.23.7) + lodash: 4.17.21 + picomatch: 2.3.1 + styled-components: 5.3.11(@babel/core@7.23.7)(react-dom@18.2.0)(react-is@18.2.0)(react@18.2.0) + transitivePeerDependencies: + - '@babel/core' + dev: false + + /babel-preset-current-node-syntax@1.0.1(@babel/core@7.23.7): + resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.7 + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.23.7) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.23.7) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.23.7) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.23.7) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.23.7) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.23.7) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.7) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.7) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.7) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.23.7) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.7) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.23.7) + dev: true + + /babel-preset-jest@29.6.3(@babel/core@7.23.7): + resolution: {integrity: sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.7 + babel-plugin-jest-hoist: 29.6.3 + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.23.7) + dev: true + + /bail@2.0.2: + resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} + dev: false + + /balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + /base64-arraybuffer@1.0.2: + resolution: {integrity: sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ==} + engines: {node: '>= 0.6.0'} + dev: false + + /base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + dev: true + + /bcrypt-pbkdf@1.0.2: + resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==} + dependencies: + tweetnacl: 0.14.5 + dev: true + + /before-after-hook@2.2.3: + resolution: {integrity: sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==} + dev: true + + /big-integer@1.6.51: + resolution: {integrity: sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==} + engines: {node: '>=0.6'} + dev: true + + /binary-extensions@2.2.0: + resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} + engines: {node: '>=8'} + + /binary-search-bounds@2.0.5: + resolution: {integrity: sha512-H0ea4Fd3lS1+sTEB2TgcLoK21lLhwEJzlQv3IN47pJS976Gx4zoWe0ak3q+uYh60ppQxg9F16Ri4tS1sfD4+jA==} + dev: true + + /bit-twiddle@1.0.2: + resolution: {integrity: sha512-B9UhK0DKFZhoTFcfvAzhqsjStvGJp9vYWf3+6SNTtdSQnvIgfkHbgHrg/e4+TH71N2GDu8tpmCVoyfrL1d7ntA==} + dev: true + + /bitmap-sdf@1.0.4: + resolution: {integrity: sha512-1G3U4n5JE6RAiALMxu0p1XmeZkTeCwGKykzsLTCqVzfSDaN6S7fKnkIkfejogz+iwqBWc0UYAIKnKHNN7pSfDg==} + dev: true + + /bl@2.2.1: + resolution: {integrity: sha512-6Pesp1w0DEX1N550i/uGV/TqucVL4AM/pgThFSN/Qq9si1/DF9aIHs1BxD8V/QU0HoeHO6cQRTAuYnLPKq1e4g==} + dependencies: + readable-stream: 2.3.8 + safe-buffer: 5.2.1 + dev: true + + /blob-util@2.0.2: + resolution: {integrity: sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ==} + dev: true + + /bluebird@3.7.2: + resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} + dev: true + + /bottleneck@2.19.5: + resolution: {integrity: sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw==} + dev: true + + /bplist-parser@0.2.0: + resolution: {integrity: sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==} + engines: {node: '>= 5.10.0'} + dependencies: + big-integer: 1.6.51 + dev: true + + /brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + /brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + dependencies: + balanced-match: 1.0.2 + dev: true + + /braces@3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.0.1 + + /browser-stdout@1.3.1: + resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} + dev: true + + /browserslist@4.21.5: + resolution: {integrity: sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + dependencies: + caniuse-lite: 1.0.30001572 + electron-to-chromium: 1.4.382 + node-releases: 2.0.10 + update-browserslist-db: 1.0.11(browserslist@4.21.5) + + /browserslist@4.22.2: + resolution: {integrity: sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + dependencies: + caniuse-lite: 1.0.30001572 + electron-to-chromium: 1.4.617 + node-releases: 2.0.14 + update-browserslist-db: 1.0.13(browserslist@4.22.2) + + /bs-logger@0.2.6: + resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==} + engines: {node: '>= 6'} + dependencies: + fast-json-stable-stringify: 2.1.0 + dev: true + + /bser@2.1.1: + resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} + dependencies: + node-int64: 0.4.0 + dev: true + + /buffer-crc32@0.2.13: + resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} + dev: true + + /buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + dev: true + + /buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + dev: true + + /bundle-name@3.0.0: + resolution: {integrity: sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==} + engines: {node: '>=12'} + dependencies: + run-applescript: 5.0.0 + dev: true + + /busboy@1.6.0: + resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} + engines: {node: '>=10.16.0'} + dependencies: + streamsearch: 1.1.0 + dev: false + + /cachedir@2.4.0: + resolution: {integrity: sha512-9EtFOZR8g22CL7BWjJ9BUx1+A/djkofnyW3aOXZORNW2kxoUpx2h+uN2cOqwPmFhnpVmxg+KW2OjOSgChTEvsQ==} + engines: {node: '>=6'} + dev: true + + /call-bind@1.0.5: + resolution: {integrity: sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==} + dependencies: + function-bind: 1.1.2 + get-intrinsic: 1.2.2 + set-function-length: 1.1.1 + dev: true + + /call-me-maybe@1.0.2: + resolution: {integrity: sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==} + dev: true + + /callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + dev: true + + /camelcase-css@2.0.1: + resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} + engines: {node: '>= 6'} + + /camelcase-keys@6.2.2: + resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==} + engines: {node: '>=8'} + dependencies: + camelcase: 5.3.1 + map-obj: 4.3.0 + quick-lru: 4.0.1 + dev: true + + /camelcase@5.3.1: + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} + dev: true + + /camelcase@6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} + dev: true + + /camelize@1.0.1: + resolution: {integrity: sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==} + dev: false + + /can-namespace@1.0.0: + resolution: {integrity: sha512-1sBY/SLwwcmxz3NhyVhLjt2uD/dZ7V1mII82/MIXSDn5QXnslnosJnjlP8+yTx2uTCRvw1jlFDElRs4pX7AG5w==} + dev: false + + /can-ndjson-stream@1.0.2: + resolution: {integrity: sha512-//tM8wcTV42SyD1JGua7WMVftZEeTwapcHJTTe3vJwuVywXD01CJbdEkgwRYjy2evIByVJV21ZKBdSv5ygIw1w==} + dependencies: + can-namespace: 1.0.0 + dev: false + + /caniuse-lite@1.0.30001572: + resolution: {integrity: sha512-1Pbh5FLmn5y4+QhNyJE9j3/7dK44dGB83/ZMjv/qJk86TvDbjk0LosiZo0i0WB0Vx607qMX9jYrn1VLHCkN4rw==} + + /canvas-fit@1.5.0: + resolution: {integrity: sha512-onIcjRpz69/Hx5bB5HGbYKUF2uC6QT6Gp+pfpGm3A7mPfcluSLV5v4Zu+oflDUwLdUw0rLIBhUbi0v8hM4FJQQ==} + dependencies: + element-size: 1.1.1 + dev: true + + /capital-case@1.0.4: + resolution: {integrity: sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==} + dependencies: + no-case: 3.0.4 + tslib: 2.5.0 + upper-case-first: 2.0.2 + dev: true + + /cardinal@2.1.1: + resolution: {integrity: sha512-JSr5eOgoEymtYHBjNWyjrMqet9Am2miJhlfKNdqLp6zoeAh0KN5dRAcxlecj5mAJrmQomgiOBj35xHLrFjqBpw==} + dependencies: + ansicolors: 0.3.2 + redeyed: 2.1.1 + dev: true + + /caseless@0.12.0: + resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} + dev: true + + /ccount@2.0.1: + resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + dev: false + + /chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + + /chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + dev: true + + /chalk@5.3.0: + resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + dev: true + + /char-regex@1.0.2: + resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} + engines: {node: '>=10'} + dev: true + + /character-entities-legacy@1.1.4: + resolution: {integrity: sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==} + dev: false + + /character-entities@1.2.4: + resolution: {integrity: sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==} + dev: false + + /character-entities@2.0.2: + resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} + dev: false + + /character-reference-invalid@1.1.4: + resolution: {integrity: sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==} + dev: false + + /charenc@0.0.2: + resolution: {integrity: sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==} + dev: false + + /check-more-types@2.24.0: + resolution: {integrity: sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA==} + engines: {node: '>= 0.8.0'} + dev: true + + /chokidar@3.5.3: + resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} + engines: {node: '>= 8.10.0'} + dependencies: + anymatch: 3.1.3 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + + /ci-info@3.9.0: + resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} + engines: {node: '>=8'} + dev: true + + /cjs-module-lexer@1.2.3: + resolution: {integrity: sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==} + dev: true + + /clamp@1.0.1: + resolution: {integrity: sha512-kgMuFyE78OC6Dyu3Dy7vcx4uy97EIbVxJB/B0eJ3bUNAkwdNcxYzgKltnyADiYwsR7SEqkkUPsEUT//OVS6XMA==} + dev: true + + /class-transformer@0.5.1: + resolution: {integrity: sha512-SQa1Ws6hUbfC98vKGxZH3KFY0Y1lm5Zm0SY8XX9zbK7FJCyVEac3ATW0RIpwzW+oOfmHE5PMPufDG9hCfoEOMw==} + dev: true + + /classnames@2.3.2: + resolution: {integrity: sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==} + dev: false + + /clean-stack@2.2.0: + resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} + engines: {node: '>=6'} + dev: true + + /clean-stack@5.2.0: + resolution: {integrity: sha512-TyUIUJgdFnCISzG5zu3291TAsE77ddchd0bepon1VVQrKLGKFED4iXFEDQ24mIPdPBbyE16PK3F8MYE1CmcBEQ==} + engines: {node: '>=14.16'} + dependencies: + escape-string-regexp: 5.0.0 + dev: true + + /cli-cursor@3.1.0: + resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} + engines: {node: '>=8'} + dependencies: + restore-cursor: 3.1.0 + dev: true + + /cli-table3@0.6.3: + resolution: {integrity: sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==} + engines: {node: 10.* || >= 12.*} + dependencies: + string-width: 4.2.3 + optionalDependencies: + '@colors/colors': 1.5.0 + dev: true + + /cli-table@0.3.11: + resolution: {integrity: sha512-IqLQi4lO0nIB4tcdTpN4LCB9FI3uqrJZK7RC515EnhZ6qBaglkIgICb1wjeAqpdoOabm1+SuQtkXIPdYC93jhQ==} + engines: {node: '>= 0.2.0'} + dependencies: + colors: 1.0.3 + dev: true + + /cli-truncate@2.1.0: + resolution: {integrity: sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==} + engines: {node: '>=8'} + dependencies: + slice-ansi: 3.0.0 + string-width: 4.2.3 + dev: true + + /client-only@0.0.1: + resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} + dev: false + + /cliui@7.0.4: + resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + dev: true + + /cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + dev: true + + /clsx@2.1.0: + resolution: {integrity: sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg==} + engines: {node: '>=6'} + dev: false + + /co@4.6.0: + resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} + engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} + dev: true + + /collect-v8-coverage@1.0.2: + resolution: {integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==} + dev: true + + /color-alpha@1.0.4: + resolution: {integrity: sha512-lr8/t5NPozTSqli+duAN+x+no/2WaKTeWvxhHGN+aXT6AJ8vPlzLa7UriyjWak0pSC2jHol9JgjBYnnHsGha9A==} + dependencies: + color-parse: 1.3.8 + dev: true + + /color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + dependencies: + color-name: 1.1.3 + + /color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + dependencies: + color-name: 1.1.4 + dev: true + + /color-id@1.1.0: + resolution: {integrity: sha512-2iRtAn6dC/6/G7bBIo0uupVrIne1NsQJvJxZOBCzQOfk7jRq97feaDZ3RdzuHakRXXnHGNwglto3pqtRx1sX0g==} + dependencies: + clamp: 1.0.1 + dev: true + + /color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + + /color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + dev: true + + /color-normalize@1.5.0: + resolution: {integrity: sha512-rUT/HDXMr6RFffrR53oX3HGWkDOP9goSAQGBkUaAYKjOE2JxozccdGyufageWDlInRAjm/jYPrf/Y38oa+7obw==} + dependencies: + clamp: 1.0.1 + color-rgba: 2.1.1 + dtype: 2.0.0 + dev: true + + /color-parse@1.3.8: + resolution: {integrity: sha512-1Y79qFv0n1xair3lNMTNeoFvmc3nirMVBij24zbs1f13+7fPpQClMg5b4AuKXLt3szj7BRlHMCXHplkce6XlmA==} + dependencies: + color-name: 1.1.4 + defined: 1.0.1 + is-plain-obj: 1.1.0 + dev: true + + /color-rgba@2.1.1: + resolution: {integrity: sha512-VaX97wsqrMwLSOR6H7rU1Doa2zyVdmShabKrPEIFywLlHoibgD3QW9Dw6fSqM4+H/LfjprDNAUUW31qEQcGzNw==} + dependencies: + clamp: 1.0.1 + color-parse: 1.3.8 + color-space: 1.16.0 + dev: true + + /color-space@1.16.0: + resolution: {integrity: sha512-A6WMiFzunQ8KEPFmj02OnnoUnqhmSaHaZ/0LVFcPTdlvm8+3aMJ5x1HRHy3bDHPkovkf4sS0f4wsVvwk71fKkg==} + dependencies: + hsluv: 0.0.3 + mumath: 3.3.4 + dev: true + + /colord@2.9.3: + resolution: {integrity: sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==} + dev: true + + /colorette@2.0.20: + resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + dev: true + + /colors@1.0.3: + resolution: {integrity: sha512-pFGrxThWcWQ2MsAz6RtgeWe4NK2kUE1WfsrvvlctdII745EW9I0yflqhe7++M5LEc7bV2c/9/5zc8sFcpL0Drw==} + engines: {node: '>=0.1.90'} + dev: true + + /combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + dependencies: + delayed-stream: 1.0.0 + + /comma-separated-tokens@1.0.8: + resolution: {integrity: sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==} + dev: false + + /comma-separated-tokens@2.0.3: + resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + dev: false + + /commander@10.0.1: + resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} + engines: {node: '>=14'} + dev: true + + /commander@11.1.0: + resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} + engines: {node: '>=16'} + dev: true + + /commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + dev: true + + /commander@4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} + + /commander@6.2.1: + resolution: {integrity: sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==} + engines: {node: '>= 6'} + dev: true + + /commander@7.2.0: + resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} + engines: {node: '>= 10'} + dev: true + + /commander@9.1.0: + resolution: {integrity: sha512-i0/MaqBtdbnJ4XQs4Pmyb+oFQl+q0lsAmokVUH92SlSw4fkeAcG3bVon+Qt7hmtF+u3Het6o4VgrcY3qAoEB6w==} + engines: {node: ^12.20.0 || >=14} + dev: true + + /common-ancestor-path@1.0.1: + resolution: {integrity: sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==} + dev: true + + /common-tags@1.8.2: + resolution: {integrity: sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==} + engines: {node: '>=4.0.0'} + dev: true + + /compare-func@2.0.0: + resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==} + dependencies: + array-ify: 1.0.0 + dot-prop: 5.3.0 + dev: true + + /concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + /concat-stream@1.6.2: + resolution: {integrity: sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==} + engines: {'0': node >= 0.8} + dependencies: + buffer-from: 1.1.2 + inherits: 2.0.4 + readable-stream: 2.3.8 + typedarray: 0.0.6 + dev: true + + /concurrently@7.6.0: + resolution: {integrity: sha512-BKtRgvcJGeZ4XttiDiNcFiRlxoAeZOseqUvyYRUp/Vtd+9p1ULmeoSqGsDA+2ivdeDFpqrJvGvmI+StKfKl5hw==} + engines: {node: ^12.20.0 || ^14.13.0 || >=16.0.0} + dependencies: + chalk: 4.1.2 + date-fns: 2.30.0 + lodash: 4.17.21 + rxjs: 7.8.1 + shell-quote: 1.8.1 + spawn-command: 0.0.2-1 + supports-color: 8.1.1 + tree-kill: 1.2.2 + yargs: 17.7.2 + dev: true + + /config-chain@1.1.13: + resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} + dependencies: + ini: 1.3.8 + proto-list: 1.2.4 + dev: true + + /conventional-changelog-angular@7.0.0: + resolution: {integrity: sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ==} + engines: {node: '>=16'} + dependencies: + compare-func: 2.0.0 + dev: true + + /conventional-changelog-conventionalcommits@7.0.2: + resolution: {integrity: sha512-NKXYmMR/Hr1DevQegFB4MwfM5Vv0m4UIxKZTTYuD98lpTknaZlSRrDOG4X7wIXpGkfsYxZTghUN+Qq+T0YQI7w==} + engines: {node: '>=16'} + dependencies: + compare-func: 2.0.0 + dev: true + + /conventional-changelog-writer@7.0.1: + resolution: {integrity: sha512-Uo+R9neH3r/foIvQ0MKcsXkX642hdm9odUp7TqgFS7BsalTcjzRlIfWZrZR1gbxOozKucaKt5KAbjW8J8xRSmA==} + engines: {node: '>=16'} + dependencies: + conventional-commits-filter: 4.0.0 + handlebars: 4.7.8 + json-stringify-safe: 5.0.1 + meow: 12.1.1 + semver: 7.5.4 + split2: 4.2.0 + dev: true + + /conventional-commits-filter@4.0.0: + resolution: {integrity: sha512-rnpnibcSOdFcdclpFwWa+pPlZJhXE7l+XK04zxhbWrhgpR96h33QLz8hITTXbcYICxVr3HZFtbtUAQ+4LdBo9A==} + engines: {node: '>=16'} + dev: true + + /conventional-commits-parser@5.0.0: + resolution: {integrity: sha512-ZPMl0ZJbw74iS9LuX9YIAiW8pfM5p3yh2o/NbXHbkFuZzY5jvdi5jFycEOkmBW5H5I7nA+D6f3UcsCLP2vvSEA==} + engines: {node: '>=16'} + dependencies: + JSONStream: 1.3.5 + is-text-path: 2.0.0 + meow: 12.1.1 + split2: 4.2.0 + dev: true + + /convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + /cookie@0.5.0: + resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} + engines: {node: '>= 0.6'} + dev: false + + /copy-to-clipboard@3.3.3: + resolution: {integrity: sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==} + dependencies: + toggle-selection: 1.0.6 + dev: false + + /core-js-pure@3.35.0: + resolution: {integrity: sha512-f+eRYmkou59uh7BPcyJ8MC76DiGhspj1KMxVIcF24tzP8NA9HVa1uC7BTW2tgx7E1QVCzDzsgp7kArrzhlz8Ew==} + requiresBuild: true + dev: false + + /core-js@3.30.2: + resolution: {integrity: sha512-uBJiDmwqsbJCWHAwjrx3cvjbMXP7xD72Dmsn5LOJpiRmE3WbBbN5rCqQ2Qh6Ek6/eOrjlWngEynBWo4VxerQhg==} + requiresBuild: true + dev: false + + /core-util-is@1.0.2: + resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==} + dev: true + + /core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + dev: true + + /cosmiconfig-typescript-loader@5.0.0(@types/node@18.15.5)(cosmiconfig@8.3.6)(typescript@5.3.3): + resolution: {integrity: sha512-+8cK7jRAReYkMwMiG+bxhcNKiHJDM6bR9FD/nGBXOWdMLuYawjF5cGrtLilJ+LGd3ZjCXnJjR5DkfWPoIVlqJA==} + engines: {node: '>=v16'} + peerDependencies: + '@types/node': '*' + cosmiconfig: '>=8.2' + typescript: '>=4' + dependencies: + '@types/node': 18.15.5 + cosmiconfig: 8.3.6(typescript@5.3.3) + jiti: 1.21.0 + typescript: 5.3.3 + dev: true + + /cosmiconfig@8.3.6(typescript@5.3.3): + resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + import-fresh: 3.3.0 + js-yaml: 4.1.0 + parse-json: 5.2.0 + path-type: 4.0.0 + typescript: 5.3.3 + dev: true + + /country-regex@1.1.0: + resolution: {integrity: sha512-iSPlClZP8vX7MC3/u6s3lrDuoQyhQukh5LyABJ3hvfzbQ3Yyayd4fp04zjLnfi267B/B2FkumcWWgrbban7sSA==} + dev: true + + /create-jest@29.7.0(@types/node@18.15.5): + resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.6.3 + chalk: 4.1.2 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-config: 29.7.0(@types/node@18.15.5) + jest-util: 29.7.0 + prompts: 2.4.2 + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + dev: true + + /cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + dev: true + + /crypt@0.0.2: + resolution: {integrity: sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==} + dev: false + + /crypto-random-string@4.0.0: + resolution: {integrity: sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==} + engines: {node: '>=12'} + dependencies: + type-fest: 1.4.0 + dev: true + + /css-color-keywords@1.0.0: + resolution: {integrity: sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==} + engines: {node: '>=4'} + dev: false + + /css-font-size-keywords@1.0.0: + resolution: {integrity: sha512-Q+svMDbMlelgCfH/RVDKtTDaf5021O486ZThQPIpahnIjUkMUslC+WuOQSWTgGSrNCH08Y7tYNEmmy0hkfMI8Q==} + dev: true + + /css-font-stretch-keywords@1.0.1: + resolution: {integrity: sha512-KmugPO2BNqoyp9zmBIUGwt58UQSfyk1X5DbOlkb2pckDXFSAfjsD5wenb88fNrD6fvS+vu90a/tsPpb9vb0SLg==} + dev: true + + /css-font-style-keywords@1.0.1: + resolution: {integrity: sha512-0Fn0aTpcDktnR1RzaBYorIxQily85M2KXRpzmxQPgh8pxUN9Fcn00I8u9I3grNr1QXVgCl9T5Imx0ZwKU973Vg==} + dev: true + + /css-font-weight-keywords@1.0.0: + resolution: {integrity: sha512-5So8/NH+oDD+EzsnF4iaG4ZFHQ3vaViePkL1ZbZ5iC/KrsCY+WHq/lvOgrtmuOQ9pBBZ1ADGpaf+A4lj1Z9eYA==} + dev: true + + /css-font@1.2.0: + resolution: {integrity: sha512-V4U4Wps4dPDACJ4WpgofJ2RT5Yqwe1lEH6wlOOaIxMi0gTjdIijsc5FmxQlZ7ZZyKQkkutqqvULOp07l9c7ssA==} + dependencies: + css-font-size-keywords: 1.0.0 + css-font-stretch-keywords: 1.0.1 + css-font-style-keywords: 1.0.1 + css-font-weight-keywords: 1.0.0 + css-global-keywords: 1.0.1 + css-system-font-keywords: 1.0.0 + pick-by-alias: 1.2.0 + string-split-by: 1.0.0 + unquote: 1.1.1 + dev: true + + /css-global-keywords@1.0.1: + resolution: {integrity: sha512-X1xgQhkZ9n94WDwntqst5D/FKkmiU0GlJSFZSV3kLvyJ1WC5VeyoXDOuleUD+SIuH9C7W05is++0Woh0CGfKjQ==} + dev: true + + /css-line-break@2.1.0: + resolution: {integrity: sha512-FHcKFCZcAha3LwfVBhCQbW2nCNbkZXn7KVUJcsT5/P8YmfsVja0FMPJr0B903j/E69HUphKiV9iQArX8SDYA4w==} + dependencies: + utrie: 1.0.2 + dev: false + + /css-selector-tokenizer@0.8.0: + resolution: {integrity: sha512-Jd6Ig3/pe62/qe5SBPTN8h8LeUg/pT4lLgtavPf7updwwHpvFzxvOQBHYj2LZDMjUnBzgvIUSjRcf6oT5HzHFg==} + dependencies: + cssesc: 3.0.0 + fastparse: 1.1.2 + dev: true + + /css-system-font-keywords@1.0.0: + resolution: {integrity: sha512-1umTtVd/fXS25ftfjB71eASCrYhilmEsvDEI6wG/QplnmlfmVM5HkZ/ZX46DT5K3eblFPgLUHt5BRCb0YXkSFA==} + dev: true + + /css-to-react-native@3.2.0: + resolution: {integrity: sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==} + dependencies: + camelize: 1.0.1 + css-color-keywords: 1.0.0 + postcss-value-parser: 4.2.0 + dev: false + + /css-unit-converter@1.1.2: + resolution: {integrity: sha512-IiJwMC8rdZE0+xiEZHeru6YoONC4rfPMqGm2W85jMIbkFvv5nFTwJVFHam2eFrN6txmoUYFAFXiv8ICVeTO0MA==} + dev: false + + /csscolorparser@1.0.3: + resolution: {integrity: sha512-umPSgYwZkdFoUrH5hIq5kf0wPSXiro51nPw0j2K/c83KflkPSTBGMz6NJvMB+07VlL0y7VPo6QJcDjcgKTTm3w==} + dev: true + + /cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + + /csstype@3.1.2: + resolution: {integrity: sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==} + + /csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + dev: false + + /cypress@13.6.2: + resolution: {integrity: sha512-TW3bGdPU4BrfvMQYv1z3oMqj71YI4AlgJgnrycicmPZAXtvywVFZW9DAToshO65D97rCWfG/kqMFsYB6Kp91gQ==} + engines: {node: ^16.0.0 || ^18.0.0 || >=20.0.0} + requiresBuild: true + dependencies: + '@cypress/request': 3.0.1 + '@cypress/xvfb': 1.2.4(supports-color@8.1.1) + '@types/node': 18.19.5 + '@types/sinonjs__fake-timers': 8.1.1 + '@types/sizzle': 2.3.8 + arch: 2.2.0 + blob-util: 2.0.2 + bluebird: 3.7.2 + buffer: 5.7.1 + cachedir: 2.4.0 + chalk: 4.1.2 + check-more-types: 2.24.0 + cli-cursor: 3.1.0 + cli-table3: 0.6.3 + commander: 6.2.1 + common-tags: 1.8.2 + dayjs: 1.11.7 + debug: 4.3.4(supports-color@8.1.1) + enquirer: 2.4.1 + eventemitter2: 6.4.7 + execa: 4.1.0 + executable: 4.1.1 + extract-zip: 2.0.1(supports-color@8.1.1) + figures: 3.2.0 + fs-extra: 9.1.0 + getos: 3.2.1 + is-ci: 3.0.1 + is-installed-globally: 0.4.0 + lazy-ass: 1.6.0 + listr2: 3.14.0(enquirer@2.4.1) + lodash: 4.17.21 + log-symbols: 4.1.0 + minimist: 1.2.8 + ospath: 1.2.2 + pretty-bytes: 5.6.0 + process: 0.11.10 + proxy-from-env: 1.0.0 + request-progress: 3.0.0 + semver: 7.5.4 + supports-color: 8.1.1 + tmp: 0.2.1 + untildify: 4.0.0 + yauzl: 2.10.0 + dev: true + + /d3-array@1.2.4: + resolution: {integrity: sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==} + dev: true + + /d3-array@3.2.3: + resolution: {integrity: sha512-JRHwbQQ84XuAESWhvIPaUV4/1UYTBOLiOPGWqgFDHZS1D5QN9c57FbH3QpEnQMYiOXNzKUQyGTZf+EVO7RT5TQ==} + engines: {node: '>=12'} + dependencies: + internmap: 2.0.3 + dev: false + + /d3-collection@1.0.7: + resolution: {integrity: sha512-ii0/r5f4sjKNTfh84Di+DpztYwqKhEyUlKoPrzUFfeSkWxjW49xU2QzO9qrPrNkpdI0XJkfzvmTu8V2Zylln6A==} + dev: true + + /d3-color@3.1.0: + resolution: {integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==} + engines: {node: '>=12'} + + /d3-dispatch@1.0.6: + resolution: {integrity: sha512-fVjoElzjhCEy+Hbn8KygnmMS7Or0a9sI2UzGwoB7cCtvI1XpVN9GpoYlnb3xt2YV66oXYb1fLJ8GMvP4hdU1RA==} + dev: true + + /d3-ease@3.0.1: + resolution: {integrity: sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==} + engines: {node: '>=12'} + dev: false + + /d3-force@1.2.1: + resolution: {integrity: sha512-HHvehyaiUlVo5CxBJ0yF/xny4xoaxFxDnBXNvNcfW9adORGZfyNF1dj6DGLKyk4Yh3brP/1h3rnDzdIAwL08zg==} + dependencies: + d3-collection: 1.0.7 + d3-dispatch: 1.0.6 + d3-quadtree: 1.0.7 + d3-timer: 1.0.10 + dev: true + + /d3-format@1.4.5: + resolution: {integrity: sha512-J0piedu6Z8iB6TbIGfZgDzfXxUFN3qQRMofy2oPdXzQibYGqPB/9iMcxr/TGalU+2RsyDO+U4f33id8tbnSRMQ==} + dev: true + + /d3-format@3.1.0: + resolution: {integrity: sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==} + engines: {node: '>=12'} + dev: false + + /d3-geo-projection@2.9.0: + resolution: {integrity: sha512-ZULvK/zBn87of5rWAfFMc9mJOipeSo57O+BBitsKIXmU4rTVAnX1kSsJkE0R+TxY8pGNoM1nbyRRE7GYHhdOEQ==} + hasBin: true + dependencies: + commander: 2.20.3 + d3-array: 1.2.4 + d3-geo: 1.12.1 + resolve: 1.22.8 + dev: true + + /d3-geo@1.12.1: + resolution: {integrity: sha512-XG4d1c/UJSEX9NfU02KwBL6BYPj8YKHxgBEw5om2ZnTRSbIcego6dhHwcxuSR3clxh0EpE38os1DVPOmnYtTPg==} + dependencies: + d3-array: 1.2.4 + dev: true + + /d3-hierarchy@1.1.9: + resolution: {integrity: sha512-j8tPxlqh1srJHAtxfvOUwKNYJkQuBFdM1+JAUfq6xqH5eAqf93L7oG1NVqDa4CpFZNvnNKtCYEUC8KY9yEn9lQ==} + dev: true + + /d3-interpolate@3.0.1: + resolution: {integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==} + engines: {node: '>=12'} + dependencies: + d3-color: 3.1.0 + + /d3-path@1.0.9: + resolution: {integrity: sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==} + dev: true + + /d3-path@3.1.0: + resolution: {integrity: sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==} + engines: {node: '>=12'} + dev: false + + /d3-quadtree@1.0.7: + resolution: {integrity: sha512-RKPAeXnkC59IDGD0Wu5mANy0Q2V28L+fNe65pOCXVdVuTJS3WPKaJlFHer32Rbh9gIo9qMuJXio8ra4+YmIymA==} + dev: true + + /d3-scale@4.0.2: + resolution: {integrity: sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==} + engines: {node: '>=12'} + dependencies: + d3-array: 3.2.3 + d3-format: 3.1.0 + d3-interpolate: 3.0.1 + d3-time: 3.1.0 + d3-time-format: 4.1.0 + dev: false + + /d3-shape@1.3.7: + resolution: {integrity: sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==} + dependencies: + d3-path: 1.0.9 + dev: true + + /d3-shape@3.2.0: + resolution: {integrity: sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==} + engines: {node: '>=12'} + dependencies: + d3-path: 3.1.0 + dev: false + + /d3-time-format@2.3.0: + resolution: {integrity: sha512-guv6b2H37s2Uq/GefleCDtbe0XZAuy7Wa49VGkPVPMfLL9qObgBST3lEHJBMUp8S7NdLQAGIvr2KXk8Hc98iKQ==} + dependencies: + d3-time: 1.1.0 + dev: true + + /d3-time-format@4.1.0: + resolution: {integrity: sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==} + engines: {node: '>=12'} + dependencies: + d3-time: 3.1.0 + dev: false + + /d3-time@1.1.0: + resolution: {integrity: sha512-Xh0isrZ5rPYYdqhAVk8VLnMEidhz5aP7htAADH6MfzgmmicPkTo8LhkLxci61/lCB7n7UmE3bN0leRt+qvkLxA==} + dev: true + + /d3-time@3.1.0: + resolution: {integrity: sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==} + engines: {node: '>=12'} + dependencies: + d3-array: 3.2.3 + dev: false + + /d3-timer@1.0.10: + resolution: {integrity: sha512-B1JDm0XDaQC+uvo4DT79H0XmBskgS3l6Ve+1SBCfxgmtIb1AVrPIoqd+nPSv+loMX8szQ0sVUhGngL7D5QPiXw==} + dev: true + + /d3-timer@3.0.1: + resolution: {integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==} + engines: {node: '>=12'} + dev: false + + /d@1.0.1: + resolution: {integrity: sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==} + dependencies: + es5-ext: 0.10.62 + type: 1.2.0 + dev: true + + /daisyui@3.9.4: + resolution: {integrity: sha512-fvi2RGH4YV617/6DntOVGcOugOPym9jTGWW2XySb5ZpvdWO4L7bEG77VHirrnbRUEWvIEVXkBpxUz2KFj0rVnA==} + engines: {node: '>=16.9.0'} + dependencies: + colord: 2.9.3 + css-selector-tokenizer: 0.8.0 + postcss: 8.4.32 + postcss-js: 4.0.1(postcss@8.4.32) + tailwindcss: 3.4.0 + transitivePeerDependencies: + - ts-node + dev: true + + /damerau-levenshtein@1.0.8: + resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} + dev: true + + /dargs@7.0.0: + resolution: {integrity: sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==} + engines: {node: '>=8'} + dev: true + + /dashdash@1.14.1: + resolution: {integrity: sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==} + engines: {node: '>=0.10'} + dependencies: + assert-plus: 1.0.0 + dev: true + + /date-fns@2.30.0: + resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==} + engines: {node: '>=0.11'} + dependencies: + '@babel/runtime': 7.23.7 + dev: true + + /dayjs@1.11.7: + resolution: {integrity: sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ==} + + /debug@2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.0.0 + dev: true + + /debug@3.2.7(supports-color@8.1.1): + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.3 + supports-color: 8.1.1 + dev: true + + /debug@4.3.4(supports-color@5.5.0): + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + supports-color: 5.5.0 + + /debug@4.3.4(supports-color@8.1.1): + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + supports-color: 8.1.1 + dev: true + + /decamelize-keys@1.1.1: + resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} + engines: {node: '>=0.10.0'} + dependencies: + decamelize: 1.2.0 + map-obj: 1.0.1 + dev: true + + /decamelize@1.2.0: + resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} + engines: {node: '>=0.10.0'} + dev: true + + /decamelize@4.0.0: + resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==} + engines: {node: '>=10'} + dev: true + + /decimal.js-light@2.5.1: + resolution: {integrity: sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==} + dev: false + + /decode-named-character-reference@1.0.2: + resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==} + dependencies: + character-entities: 2.0.2 + dev: false + + /dedent@1.5.1: + resolution: {integrity: sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==} + peerDependencies: + babel-plugin-macros: ^3.1.0 + peerDependenciesMeta: + babel-plugin-macros: + optional: true + dev: true + + /deep-equal@2.2.1: + resolution: {integrity: sha512-lKdkdV6EOGoVn65XaOsPdH4rMxTZOnmFyuIkMjM1i5HHCbfjC97dawgTAy0deYNfuqUqW+Q5VrVaQYtUpSd6yQ==} + dependencies: + array-buffer-byte-length: 1.0.0 + call-bind: 1.0.5 + es-get-iterator: 1.1.3 + get-intrinsic: 1.2.2 + is-arguments: 1.1.1 + is-array-buffer: 3.0.2 + is-date-object: 1.0.5 + is-regex: 1.1.4 + is-shared-array-buffer: 1.0.2 + isarray: 2.0.5 + object-is: 1.1.5 + object-keys: 1.1.1 + object.assign: 4.1.4 + regexp.prototype.flags: 1.5.1 + side-channel: 1.0.4 + which-boxed-primitive: 1.0.2 + which-collection: 1.0.1 + which-typed-array: 1.1.13 + dev: true + + /deep-extend@0.6.0: + resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} + engines: {node: '>=4.0.0'} + dev: true + + /deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + dev: true + + /deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + + /default-browser-id@3.0.0: + resolution: {integrity: sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==} + engines: {node: '>=12'} + dependencies: + bplist-parser: 0.2.0 + untildify: 4.0.0 + dev: true + + /default-browser@4.0.0: + resolution: {integrity: sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==} + engines: {node: '>=14.16'} + dependencies: + bundle-name: 3.0.0 + default-browser-id: 3.0.0 + execa: 7.1.1 + titleize: 3.0.0 + dev: true + + /define-data-property@1.1.1: + resolution: {integrity: sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.2.2 + gopd: 1.0.1 + has-property-descriptors: 1.0.0 + dev: true + + /define-lazy-prop@3.0.0: + resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} + engines: {node: '>=12'} + dev: true + + /define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.1 + has-property-descriptors: 1.0.0 + object-keys: 1.1.1 + dev: true + + /defined@1.0.1: + resolution: {integrity: sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==} + dev: true + + /delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + /deprecation@2.3.1: + resolution: {integrity: sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==} + dev: true + + /dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + dev: false + + /detect-kerning@2.1.2: + resolution: {integrity: sha512-I3JIbrnKPAntNLl1I6TpSQQdQ4AutYzv/sKMFKbepawV/hlH0GmYKhUoOEMd4xqaUHT+Bm0f4127lh5qs1m1tw==} + dev: true + + /detect-newline@3.1.0: + resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} + engines: {node: '>=8'} + dev: true + + /detect-node-es@1.1.0: + resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} + dev: false + + /didyoumean@1.2.2: + resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} + + /diff-sequences@29.6.3: + resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dev: true + + /diff@4.0.2: + resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} + engines: {node: '>=0.3.1'} + dev: true + + /diff@5.0.0: + resolution: {integrity: sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==} + engines: {node: '>=0.3.1'} + dev: true + + /diff@5.1.0: + resolution: {integrity: sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==} + engines: {node: '>=0.3.1'} + dev: false + + /dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + dependencies: + path-type: 4.0.0 + dev: true + + /dlv@1.1.3: + resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} + + /doctrine@2.1.0: + resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} + engines: {node: '>=0.10.0'} + dependencies: + esutils: 2.0.3 + dev: true + + /doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + dependencies: + esutils: 2.0.3 + dev: true + + /dom-helpers@3.4.0: + resolution: {integrity: sha512-LnuPJ+dwqKDIyotW1VzmOZ5TONUN7CwkCR5hrgawTUbkBGYdeoNLZo6nNfGkCrjtE1nXXaj7iMMpDa8/d9WoIA==} + dependencies: + '@babel/runtime': 7.23.7 + dev: false + + /dot-prop@5.3.0: + resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} + engines: {node: '>=8'} + dependencies: + is-obj: 2.0.0 + dev: true + + /draw-svg-path@1.0.0: + resolution: {integrity: sha512-P8j3IHxcgRMcY6sDzr0QvJDLzBnJJqpTG33UZ2Pvp8rw0apCHhJCWqYprqrXjrgHnJ6tuhP1iTJSAodPDHxwkg==} + dependencies: + abs-svg-path: 0.1.1 + normalize-svg-path: 0.1.0 + dev: true + + /dtype@2.0.0: + resolution: {integrity: sha512-s2YVcLKdFGS0hpFqJaTwscsyt0E8nNFdmo73Ocd81xNPj4URI4rj6D60A+vFMIw7BXWlb4yRkEwfBqcZzPGiZg==} + engines: {node: '>= 0.8.0'} + dev: true + + /dup@1.0.0: + resolution: {integrity: sha512-Bz5jxMMC0wgp23Zm15ip1x8IhYRqJvF3nFC0UInJUDkN1z4uNPk9jTnfCUJXbOGiQ1JbXLQsiV41Fb+HXcj5BA==} + dev: true + + /duplexer2@0.1.4: + resolution: {integrity: sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==} + dependencies: + readable-stream: 2.3.8 + dev: true + + /duplexer@0.1.2: + resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} + dev: true + + /duplexify@3.7.1: + resolution: {integrity: sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==} + dependencies: + end-of-stream: 1.4.4 + inherits: 2.0.4 + readable-stream: 2.3.8 + stream-shift: 1.0.1 + dev: true + + /earcut@2.2.4: + resolution: {integrity: sha512-/pjZsA1b4RPHbeWZQn66SWS8nZZWLQQ23oE3Eam7aroEFGEvwKAsJfZ9ytiEMycfzXWpca4FA9QIOehf7PocBQ==} + dev: true + + /eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + dev: true + + /ecc-jsbn@0.1.2: + resolution: {integrity: sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==} + dependencies: + jsbn: 0.1.1 + safer-buffer: 2.1.2 + dev: true + + /electron-to-chromium@1.4.382: + resolution: {integrity: sha512-czMavlW52VIPgutbVL9JnZIZuFijzsG1ww/1z2Otu1r1q+9Qe2bTsH3My3sZarlvwyqHM6+mnZfEnt2Vr4dsIg==} + + /electron-to-chromium@1.4.617: + resolution: {integrity: sha512-sYNE3QxcDS4ANW1k4S/wWYMXjCVcFSOX3Bg8jpuMFaXt/x8JCmp0R1Xe1ZXDX4WXnSRBf+GJ/3eGWicUuQq5cg==} + + /element-size@1.1.1: + resolution: {integrity: sha512-eaN+GMOq/Q+BIWy0ybsgpcYImjGIdNLyjLFJU4XsLHXYQao5jCNb36GyN6C2qwmDDYSfIBmKpPpr4VnBdLCsPQ==} + dev: true + + /elementary-circuits-directed-graph@1.3.1: + resolution: {integrity: sha512-ZEiB5qkn2adYmpXGnJKkxT8uJHlW/mxmBpmeqawEHzPxh9HkLD4/1mFYX5l0On+f6rcPIt8/EWlRU2Vo3fX6dQ==} + dependencies: + strongly-connected-components: 1.0.1 + dev: true + + /emittery@0.13.1: + resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} + engines: {node: '>=12'} + dev: true + + /emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + dev: true + + /emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + dev: true + + /emojilib@2.4.0: + resolution: {integrity: sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw==} + dev: true + + /end-of-stream@1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + dependencies: + once: 1.4.0 + dev: true + + /enhanced-resolve@5.13.0: + resolution: {integrity: sha512-eyV8f0y1+bzyfh8xAwW/WTSZpLbjhqc4ne9eGSH4Zo2ejdyiNG9pU6mf9DG8a7+Auk6MFTlNOT4Y2y/9k8GKVg==} + engines: {node: '>=10.13.0'} + dependencies: + graceful-fs: 4.2.11 + tapable: 2.2.1 + dev: true + + /enquirer@2.4.1: + resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} + engines: {node: '>=8.6'} + dependencies: + ansi-colors: 4.1.3 + strip-ansi: 6.0.1 + dev: true + + /env-ci@10.0.0: + resolution: {integrity: sha512-U4xcd/utDYFgMh0yWj07R1H6L5fwhVbmxBCpnL0DbVSDZVnsC82HONw0wxtxNkIAcua3KtbomQvIk5xFZGAQJw==} + engines: {node: ^18.17 || >=20.6.1} + dependencies: + execa: 8.0.1 + java-properties: 1.0.2 + dev: true + + /error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + dependencies: + is-arrayish: 0.2.1 + dev: true + + /error-stack-parser@2.1.4: + resolution: {integrity: sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==} + dependencies: + stackframe: 1.3.4 + dev: true + + /es-abstract@1.22.3: + resolution: {integrity: sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==} + engines: {node: '>= 0.4'} + dependencies: + array-buffer-byte-length: 1.0.0 + arraybuffer.prototype.slice: 1.0.2 + available-typed-arrays: 1.0.5 + call-bind: 1.0.5 + es-set-tostringtag: 2.0.1 + es-to-primitive: 1.2.1 + function.prototype.name: 1.1.6 + get-intrinsic: 1.2.2 + get-symbol-description: 1.0.0 + globalthis: 1.0.3 + gopd: 1.0.1 + has-property-descriptors: 1.0.0 + has-proto: 1.0.1 + has-symbols: 1.0.3 + hasown: 2.0.0 + internal-slot: 1.0.5 + is-array-buffer: 3.0.2 + is-callable: 1.2.7 + is-negative-zero: 2.0.2 + is-regex: 1.1.4 + is-shared-array-buffer: 1.0.2 + is-string: 1.0.7 + is-typed-array: 1.1.12 + is-weakref: 1.0.2 + object-inspect: 1.13.1 + object-keys: 1.1.1 + object.assign: 4.1.4 + regexp.prototype.flags: 1.5.1 + safe-array-concat: 1.0.1 + safe-regex-test: 1.0.0 + string.prototype.trim: 1.2.8 + string.prototype.trimend: 1.0.7 + string.prototype.trimstart: 1.0.7 + typed-array-buffer: 1.0.0 + typed-array-byte-length: 1.0.0 + typed-array-byte-offset: 1.0.0 + typed-array-length: 1.0.4 + unbox-primitive: 1.0.2 + which-typed-array: 1.1.13 + dev: true + + /es-get-iterator@1.1.3: + resolution: {integrity: sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==} + dependencies: + call-bind: 1.0.5 + get-intrinsic: 1.2.2 + has-symbols: 1.0.3 + is-arguments: 1.1.1 + is-map: 2.0.2 + is-set: 2.0.2 + is-string: 1.0.7 + isarray: 2.0.5 + stop-iteration-iterator: 1.0.0 + dev: true + + /es-iterator-helpers@1.0.15: + resolution: {integrity: sha512-GhoY8uYqd6iwUl2kgjTm4CZAf6oo5mHK7BPqx3rKgx893YSsy0LGHV6gfqqQvZt/8xM8xeOnfXBCfqclMKkJ5g==} + dependencies: + asynciterator.prototype: 1.0.0 + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + es-set-tostringtag: 2.0.1 + function-bind: 1.1.2 + get-intrinsic: 1.2.2 + globalthis: 1.0.3 + has-property-descriptors: 1.0.0 + has-proto: 1.0.1 + has-symbols: 1.0.3 + internal-slot: 1.0.5 + iterator.prototype: 1.1.2 + safe-array-concat: 1.0.1 + dev: true + + /es-set-tostringtag@2.0.1: + resolution: {integrity: sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.2.2 + has: 1.0.3 + has-tostringtag: 1.0.0 + dev: true + + /es-shim-unscopables@1.0.0: + resolution: {integrity: sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==} + dependencies: + has: 1.0.3 + dev: true + + /es-to-primitive@1.2.1: + resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} + engines: {node: '>= 0.4'} + dependencies: + is-callable: 1.2.7 + is-date-object: 1.0.5 + is-symbol: 1.0.4 + dev: true + + /es5-ext@0.10.62: + resolution: {integrity: sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==} + engines: {node: '>=0.10'} + requiresBuild: true + dependencies: + es6-iterator: 2.0.3 + es6-symbol: 3.1.3 + next-tick: 1.1.0 + dev: true + + /es6-iterator@2.0.3: + resolution: {integrity: sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==} + dependencies: + d: 1.0.1 + es5-ext: 0.10.62 + es6-symbol: 3.1.3 + dev: true + + /es6-symbol@3.1.3: + resolution: {integrity: sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==} + dependencies: + d: 1.0.1 + ext: 1.7.0 + dev: true + + /es6-weak-map@2.0.3: + resolution: {integrity: sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==} + dependencies: + d: 1.0.1 + es5-ext: 0.10.62 + es6-iterator: 2.0.3 + es6-symbol: 3.1.3 + dev: true + + /esbuild-android-64@0.14.54: + resolution: {integrity: sha512-Tz2++Aqqz0rJ7kYBfz+iqyE3QMycD4vk7LBRyWaAVFgFtQ/O8EJOnVmTOiDWYZ/uYzB4kvP+bqejYdVKzE5lAQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /esbuild-android-arm64@0.14.54: + resolution: {integrity: sha512-F9E+/QDi9sSkLaClO8SOV6etqPd+5DgJje1F9lOWoNncDdOBL2YF59IhsWATSt0TLZbYCf3pNlTHvVV5VfHdvg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /esbuild-darwin-64@0.14.54: + resolution: {integrity: sha512-jtdKWV3nBviOd5v4hOpkVmpxsBy90CGzebpbO9beiqUYVMBtSc0AL9zGftFuBon7PNDcdvNCEuQqw2x0wP9yug==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /esbuild-darwin-arm64@0.14.54: + resolution: {integrity: sha512-OPafJHD2oUPyvJMrsCvDGkRrVCar5aVyHfWGQzY1dWnzErjrDuSETxwA2HSsyg2jORLY8yBfzc1MIpUkXlctmw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /esbuild-freebsd-64@0.14.54: + resolution: {integrity: sha512-OKwd4gmwHqOTp4mOGZKe/XUlbDJ4Q9TjX0hMPIDBUWWu/kwhBAudJdBoxnjNf9ocIB6GN6CPowYpR/hRCbSYAg==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /esbuild-freebsd-arm64@0.14.54: + resolution: {integrity: sha512-sFwueGr7OvIFiQT6WeG0jRLjkjdqWWSrfbVwZp8iMP+8UHEHRBvlaxL6IuKNDwAozNUmbb8nIMXa7oAOARGs1Q==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /esbuild-linux-32@0.14.54: + resolution: {integrity: sha512-1ZuY+JDI//WmklKlBgJnglpUL1owm2OX+8E1syCD6UAxcMM/XoWd76OHSjl/0MR0LisSAXDqgjT3uJqT67O3qw==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /esbuild-linux-64@0.14.54: + resolution: {integrity: sha512-EgjAgH5HwTbtNsTqQOXWApBaPVdDn7XcK+/PtJwZLT1UmpLoznPd8c5CxqsH2dQK3j05YsB3L17T8vE7cp4cCg==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /esbuild-linux-arm64@0.14.54: + resolution: {integrity: sha512-WL71L+0Rwv+Gv/HTmxTEmpv0UgmxYa5ftZILVi2QmZBgX3q7+tDeOQNqGtdXSdsL8TQi1vIaVFHUPDe0O0kdig==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /esbuild-linux-arm@0.14.54: + resolution: {integrity: sha512-qqz/SjemQhVMTnvcLGoLOdFpCYbz4v4fUo+TfsWG+1aOu70/80RV6bgNpR2JCrppV2moUQkww+6bWxXRL9YMGw==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /esbuild-linux-mips64le@0.14.54: + resolution: {integrity: sha512-qTHGQB8D1etd0u1+sB6p0ikLKRVuCWhYQhAHRPkO+OF3I/iSlTKNNS0Lh2Oc0g0UFGguaFZZiPJdJey3AGpAlw==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /esbuild-linux-ppc64le@0.14.54: + resolution: {integrity: sha512-j3OMlzHiqwZBDPRCDFKcx595XVfOfOnv68Ax3U4UKZ3MTYQB5Yz3X1mn5GnodEVYzhtZgxEBidLWeIs8FDSfrQ==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /esbuild-linux-riscv64@0.14.54: + resolution: {integrity: sha512-y7Vt7Wl9dkOGZjxQZnDAqqn+XOqFD7IMWiewY5SPlNlzMX39ocPQlOaoxvT4FllA5viyV26/QzHtvTjVNOxHZg==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /esbuild-linux-s390x@0.14.54: + resolution: {integrity: sha512-zaHpW9dziAsi7lRcyV4r8dhfG1qBidQWUXweUjnw+lliChJqQr+6XD71K41oEIC3Mx1KStovEmlzm+MkGZHnHA==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /esbuild-netbsd-64@0.14.54: + resolution: {integrity: sha512-PR01lmIMnfJTgeU9VJTDY9ZerDWVFIUzAtJuDHwwceppW7cQWjBBqP48NdeRtoP04/AtO9a7w3viI+PIDr6d+w==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + + /esbuild-openbsd-64@0.14.54: + resolution: {integrity: sha512-Qyk7ikT2o7Wu76UsvvDS5q0amJvmRzDyVlL0qf5VLsLchjCa1+IAvd8kTBgUxD7VBUUVgItLkk609ZHUc1oCaw==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + /esbuild-sunos-64@0.14.54: + resolution: {integrity: sha512-28GZ24KmMSeKi5ueWzMcco6EBHStL3B6ubM7M51RmPwXQGLe0teBGJocmWhgwccA1GeFXqxzILIxXpHbl9Q/Kw==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + + /esbuild-windows-32@0.14.54: + resolution: {integrity: sha512-T+rdZW19ql9MjS7pixmZYVObd9G7kcaZo+sETqNH4RCkuuYSuv9AGHUVnPoP9hhuE1WM1ZimHz1CIBHBboLU7w==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /esbuild-windows-64@0.14.54: + resolution: {integrity: sha512-AoHTRBUuYwXtZhjXZbA1pGfTo8cJo3vZIcWGLiUcTNgHpJJMC1rVA44ZereBHMJtotyN71S8Qw0npiCIkW96cQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /esbuild-windows-arm64@0.14.54: + resolution: {integrity: sha512-M0kuUvXhot1zOISQGXwWn6YtS+Y/1RT9WrVIOywZnJHo3jCDyewAc79aKNQWFCQm+xNHVTq9h8dZKvygoXQQRg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /esbuild@0.14.54: + resolution: {integrity: sha512-Cy9llcy8DvET5uznocPyqL3BFRrFXSVqbgpMJ9Wz8oVjZlh/zUSNbPRbov0VX7VxN2JH1Oa0uNxZ7eLRb62pJA==} + engines: {node: '>=12'} + requiresBuild: true + optionalDependencies: + '@esbuild/linux-loong64': 0.14.54 + esbuild-android-64: 0.14.54 + esbuild-android-arm64: 0.14.54 + esbuild-darwin-64: 0.14.54 + esbuild-darwin-arm64: 0.14.54 + esbuild-freebsd-64: 0.14.54 + esbuild-freebsd-arm64: 0.14.54 + esbuild-linux-32: 0.14.54 + esbuild-linux-64: 0.14.54 + esbuild-linux-arm: 0.14.54 + esbuild-linux-arm64: 0.14.54 + esbuild-linux-mips64le: 0.14.54 + esbuild-linux-ppc64le: 0.14.54 + esbuild-linux-riscv64: 0.14.54 + esbuild-linux-s390x: 0.14.54 + esbuild-netbsd-64: 0.14.54 + esbuild-openbsd-64: 0.14.54 + esbuild-sunos-64: 0.14.54 + esbuild-windows-32: 0.14.54 + esbuild-windows-64: 0.14.54 + esbuild-windows-arm64: 0.14.54 + dev: true + + /esbuild@0.19.11: + resolution: {integrity: sha512-HJ96Hev2hX/6i5cDVwcqiJBBtuo9+FeIJOtZ9W1kA5M6AMJRHUZlpYZ1/SbEwtO0ioNAW8rUooVpC/WehY2SfA==} + engines: {node: '>=12'} + requiresBuild: true + optionalDependencies: + '@esbuild/aix-ppc64': 0.19.11 + '@esbuild/android-arm': 0.19.11 + '@esbuild/android-arm64': 0.19.11 + '@esbuild/android-x64': 0.19.11 + '@esbuild/darwin-arm64': 0.19.11 + '@esbuild/darwin-x64': 0.19.11 + '@esbuild/freebsd-arm64': 0.19.11 + '@esbuild/freebsd-x64': 0.19.11 + '@esbuild/linux-arm': 0.19.11 + '@esbuild/linux-arm64': 0.19.11 + '@esbuild/linux-ia32': 0.19.11 + '@esbuild/linux-loong64': 0.19.11 + '@esbuild/linux-mips64el': 0.19.11 + '@esbuild/linux-ppc64': 0.19.11 + '@esbuild/linux-riscv64': 0.19.11 + '@esbuild/linux-s390x': 0.19.11 + '@esbuild/linux-x64': 0.19.11 + '@esbuild/netbsd-x64': 0.19.11 + '@esbuild/openbsd-x64': 0.19.11 + '@esbuild/sunos-x64': 0.19.11 + '@esbuild/win32-arm64': 0.19.11 + '@esbuild/win32-ia32': 0.19.11 + '@esbuild/win32-x64': 0.19.11 + dev: true + + /escalade@3.1.1: + resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} + engines: {node: '>=6'} + + /escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + + /escape-string-regexp@2.0.0: + resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} + engines: {node: '>=8'} + dev: true + + /escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + dev: true + + /escape-string-regexp@5.0.0: + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} + engines: {node: '>=12'} + + /escodegen@2.1.0: + resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} + engines: {node: '>=6.0'} + hasBin: true + dependencies: + esprima: 4.0.1 + estraverse: 5.3.0 + esutils: 2.0.3 + optionalDependencies: + source-map: 0.6.1 + dev: true + + /eslint-config-next@14.0.4(eslint@8.56.0)(typescript@5.3.3): + resolution: {integrity: sha512-9/xbOHEQOmQtqvQ1UsTQZpnA7SlDMBtuKJ//S4JnoyK3oGLhILKXdBgu/UO7lQo/2xOykQULS1qQ6p2+EpHgAQ==} + peerDependencies: + eslint: ^7.23.0 || ^8.0.0 + typescript: '>=3.3.1' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@next/eslint-plugin-next': 14.0.4 + '@rushstack/eslint-patch': 1.6.1 + '@typescript-eslint/parser': 6.17.0(eslint@8.56.0)(typescript@5.3.3) + eslint: 8.56.0 + eslint-import-resolver-node: 0.3.7 + eslint-import-resolver-typescript: 3.5.5(@typescript-eslint/parser@6.17.0)(eslint-import-resolver-node@0.3.7)(eslint-plugin-import@2.29.1)(eslint@8.56.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.17.0)(eslint-import-resolver-typescript@3.5.5)(eslint@8.56.0) + eslint-plugin-jsx-a11y: 6.7.1(eslint@8.56.0) + eslint-plugin-react: 7.33.2(eslint@8.56.0) + eslint-plugin-react-hooks: 4.6.0(eslint@8.56.0) + typescript: 5.3.3 + transitivePeerDependencies: + - eslint-import-resolver-webpack + - supports-color + dev: true + + /eslint-config-prettier@9.1.0(eslint@8.56.0): + resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + dependencies: + eslint: 8.56.0 + dev: true + + /eslint-import-resolver-node@0.3.7: + resolution: {integrity: sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==} + dependencies: + debug: 3.2.7(supports-color@8.1.1) + is-core-module: 2.13.1 + resolve: 1.22.8 + transitivePeerDependencies: + - supports-color + dev: true + + /eslint-import-resolver-node@0.3.9: + resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} + dependencies: + debug: 3.2.7(supports-color@8.1.1) + is-core-module: 2.13.1 + resolve: 1.22.8 + transitivePeerDependencies: + - supports-color + dev: true + + /eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@6.17.0)(eslint-import-resolver-node@0.3.7)(eslint-plugin-import@2.29.1)(eslint@8.56.0): + resolution: {integrity: sha512-TdJqPHs2lW5J9Zpe17DZNQuDnox4xo2o+0tE7Pggain9Rbc19ik8kFtXdxZ250FVx2kF4vlt2RSf4qlUpG7bhw==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + eslint: '*' + eslint-plugin-import: '*' + dependencies: + debug: 4.3.4(supports-color@5.5.0) + enhanced-resolve: 5.13.0 + eslint: 8.56.0 + eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.17.0)(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@3.5.5)(eslint@8.56.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.17.0)(eslint-import-resolver-typescript@3.5.5)(eslint@8.56.0) + get-tsconfig: 4.5.0 + globby: 13.1.4 + is-core-module: 2.13.1 + is-glob: 4.0.3 + synckit: 0.8.5 + transitivePeerDependencies: + - '@typescript-eslint/parser' + - eslint-import-resolver-node + - eslint-import-resolver-webpack + - supports-color + dev: true + + /eslint-module-utils@2.8.0(@typescript-eslint/parser@6.17.0)(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@3.5.5)(eslint@8.56.0): + resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: '*' + eslint-import-resolver-node: '*' + eslint-import-resolver-typescript: '*' + eslint-import-resolver-webpack: '*' + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + eslint: + optional: true + eslint-import-resolver-node: + optional: true + eslint-import-resolver-typescript: + optional: true + eslint-import-resolver-webpack: + optional: true + dependencies: + '@typescript-eslint/parser': 6.17.0(eslint@8.56.0)(typescript@5.3.3) + debug: 3.2.7(supports-color@8.1.1) + eslint: 8.56.0 + eslint-import-resolver-node: 0.3.7 + eslint-import-resolver-typescript: 3.5.5(@typescript-eslint/parser@6.17.0)(eslint-import-resolver-node@0.3.7)(eslint-plugin-import@2.29.1)(eslint@8.56.0) + transitivePeerDependencies: + - supports-color + dev: true + + /eslint-module-utils@2.8.0(@typescript-eslint/parser@6.17.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.5.5)(eslint@8.56.0): + resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: '*' + eslint-import-resolver-node: '*' + eslint-import-resolver-typescript: '*' + eslint-import-resolver-webpack: '*' + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + eslint: + optional: true + eslint-import-resolver-node: + optional: true + eslint-import-resolver-typescript: + optional: true + eslint-import-resolver-webpack: + optional: true + dependencies: + '@typescript-eslint/parser': 6.17.0(eslint@8.56.0)(typescript@5.3.3) + debug: 3.2.7(supports-color@8.1.1) + eslint: 8.56.0 + eslint-import-resolver-node: 0.3.9 + eslint-import-resolver-typescript: 3.5.5(@typescript-eslint/parser@6.17.0)(eslint-import-resolver-node@0.3.7)(eslint-plugin-import@2.29.1)(eslint@8.56.0) + transitivePeerDependencies: + - supports-color + dev: true + + /eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.17.0)(eslint-import-resolver-typescript@3.5.5)(eslint@8.56.0): + resolution: {integrity: sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + dependencies: + '@typescript-eslint/parser': 6.17.0(eslint@8.56.0)(typescript@5.3.3) + array-includes: 3.1.7 + array.prototype.findlastindex: 1.2.3 + array.prototype.flat: 1.3.2 + array.prototype.flatmap: 1.3.2 + debug: 3.2.7(supports-color@8.1.1) + doctrine: 2.1.0 + eslint: 8.56.0 + eslint-import-resolver-node: 0.3.9 + eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.17.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.5.5)(eslint@8.56.0) + hasown: 2.0.0 + is-core-module: 2.13.1 + is-glob: 4.0.3 + minimatch: 3.1.2 + object.fromentries: 2.0.7 + object.groupby: 1.0.1 + object.values: 1.1.7 + semver: 6.3.1 + tsconfig-paths: 3.15.0 + transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + dev: true + + /eslint-plugin-jest@27.6.1(@typescript-eslint/eslint-plugin@6.17.0)(eslint@8.56.0)(jest@29.7.0)(typescript@5.3.3): + resolution: {integrity: sha512-WEYkyVXD9NlmFBKvrkmzrC+C9yZoz5pAml2hO19PlS3spJtoiwj4p2u8spd/7zx5IvRsZsCmsoImaAvBB9X93Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@typescript-eslint/eslint-plugin': ^5.0.0 || ^6.0.0 + eslint: ^7.0.0 || ^8.0.0 + jest: '*' + peerDependenciesMeta: + '@typescript-eslint/eslint-plugin': + optional: true + jest: + optional: true + dependencies: + '@typescript-eslint/eslint-plugin': 6.17.0(@typescript-eslint/parser@6.17.0)(eslint@8.56.0)(typescript@5.3.3) + '@typescript-eslint/utils': 5.62.0(eslint@8.56.0)(typescript@5.3.3) + eslint: 8.56.0 + jest: 29.7.0(@types/node@18.15.5) + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /eslint-plugin-jsx-a11y@6.7.1(eslint@8.56.0): + resolution: {integrity: sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA==} + engines: {node: '>=4.0'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 + dependencies: + '@babel/runtime': 7.23.7 + aria-query: 5.1.3 + array-includes: 3.1.7 + array.prototype.flatmap: 1.3.2 + ast-types-flow: 0.0.7 + axe-core: 4.7.0 + axobject-query: 3.1.1 + damerau-levenshtein: 1.0.8 + emoji-regex: 9.2.2 + eslint: 8.56.0 + has: 1.0.3 + jsx-ast-utils: 3.3.3 + language-tags: 1.0.5 + minimatch: 3.1.2 + object.entries: 1.1.6 + object.fromentries: 2.0.7 + semver: 6.3.1 + dev: true + + /eslint-plugin-react-hooks@4.6.0(eslint@8.56.0): + resolution: {integrity: sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==} + engines: {node: '>=10'} + peerDependencies: + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 + dependencies: + eslint: 8.56.0 + dev: true + + /eslint-plugin-react@7.33.2(eslint@8.56.0): + resolution: {integrity: sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==} + engines: {node: '>=4'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 + dependencies: + array-includes: 3.1.7 + array.prototype.flatmap: 1.3.2 + array.prototype.tosorted: 1.1.1 + doctrine: 2.1.0 + es-iterator-helpers: 1.0.15 + eslint: 8.56.0 + estraverse: 5.3.0 + jsx-ast-utils: 3.3.3 + minimatch: 3.1.2 + object.entries: 1.1.6 + object.fromentries: 2.0.7 + object.hasown: 1.1.2 + object.values: 1.1.7 + prop-types: 15.8.1 + resolve: 2.0.0-next.4 + semver: 6.3.1 + string.prototype.matchall: 4.0.8 + dev: true + + /eslint-plugin-tailwindcss@3.13.1(tailwindcss@3.4.0): + resolution: {integrity: sha512-2Nlgr9doO6vFAG9w4iGU0sspWXuzypfng10HTF+dFS2NterhweWtgdRvf/f7aaoOUUxVZM8wMIXzazrZ7CxyeA==} + engines: {node: '>=12.13.0'} + peerDependencies: + tailwindcss: ^3.3.2 + dependencies: + fast-glob: 3.3.2 + postcss: 8.4.32 + tailwindcss: 3.4.0 + dev: true + + /eslint-plugin-unused-imports@3.0.0(@typescript-eslint/eslint-plugin@6.17.0)(eslint@8.56.0): + resolution: {integrity: sha512-sduiswLJfZHeeBJ+MQaG+xYzSWdRXoSw61DpU13mzWumCkR0ufD0HmO4kdNokjrkluMHpj/7PJeN35pgbhW3kw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + '@typescript-eslint/eslint-plugin': ^6.0.0 + eslint: ^8.0.0 + peerDependenciesMeta: + '@typescript-eslint/eslint-plugin': + optional: true + dependencies: + '@typescript-eslint/eslint-plugin': 6.17.0(@typescript-eslint/parser@6.17.0)(eslint@8.56.0)(typescript@5.3.3) + eslint: 8.56.0 + eslint-rule-composer: 0.3.0 + dev: true + + /eslint-rule-composer@0.3.0: + resolution: {integrity: sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg==} + engines: {node: '>=4.0.0'} + dev: true + + /eslint-scope@5.1.1: + resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} + engines: {node: '>=8.0.0'} + dependencies: + esrecurse: 4.3.0 + estraverse: 4.3.0 + dev: true + + /eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + dev: true + + /eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /eslint@8.56.0: + resolution: {integrity: sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0) + '@eslint-community/regexpp': 4.10.0 + '@eslint/eslintrc': 2.1.4 + '@eslint/js': 8.56.0 + '@humanwhocodes/config-array': 0.11.13 + '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 + '@ungap/structured-clone': 1.2.0 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.3 + debug: 4.3.4(supports-color@5.5.0) + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + esquery: 1.5.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + glob-parent: 6.0.2 + globals: 13.20.0 + graphemer: 1.4.0 + ignore: 5.2.4 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + js-yaml: 4.1.0 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.3 + strip-ansi: 6.0.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + dev: true + + /espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + acorn: 8.11.3 + acorn-jsx: 5.3.2(acorn@8.11.3) + eslint-visitor-keys: 3.4.3 + dev: true + + /esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + dev: true + + /esquery@1.5.0: + resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} + engines: {node: '>=0.10'} + dependencies: + estraverse: 5.3.0 + dev: true + + /esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + dependencies: + estraverse: 5.3.0 + dev: true + + /estraverse@4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} + dev: true + + /estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + dev: true + + /esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + dev: true + + /eventemitter2@6.4.7: + resolution: {integrity: sha512-tYUSVOGeQPKt/eC1ABfhHy5Xd96N3oIijJvN3O9+TsC28T5V9yX9oEfEK5faP0EFSNVOG97qtAS68GBrQB2hDg==} + dev: true + + /eventemitter3@4.0.7: + resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} + dev: false + + /events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + dev: true + + /execa@4.1.0: + resolution: {integrity: sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==} + engines: {node: '>=10'} + dependencies: + cross-spawn: 7.0.3 + get-stream: 5.2.0 + human-signals: 1.1.1 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + dev: true + + /execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + dependencies: + cross-spawn: 7.0.3 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + dev: true + + /execa@7.1.1: + resolution: {integrity: sha512-wH0eMf/UXckdUYnO21+HDztteVv05rq2GXksxT4fCGeHkBhw1DROXh40wcjMcRqDOWE7iPJ4n3M7e2+YFP+76Q==} + engines: {node: ^14.18.0 || ^16.14.0 || >=18.0.0} + dependencies: + cross-spawn: 7.0.3 + get-stream: 6.0.1 + human-signals: 4.3.1 + is-stream: 3.0.0 + merge-stream: 2.0.0 + npm-run-path: 5.1.0 + onetime: 6.0.0 + signal-exit: 3.0.7 + strip-final-newline: 3.0.0 + dev: true + + /execa@8.0.1: + resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} + engines: {node: '>=16.17'} + dependencies: + cross-spawn: 7.0.3 + get-stream: 8.0.1 + human-signals: 5.0.0 + is-stream: 3.0.0 + merge-stream: 2.0.0 + npm-run-path: 5.1.0 + onetime: 6.0.0 + signal-exit: 4.1.0 + strip-final-newline: 3.0.0 + dev: true + + /executable@4.1.1: + resolution: {integrity: sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==} + engines: {node: '>=4'} + dependencies: + pify: 2.3.0 + dev: true + + /exit@0.1.2: + resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} + engines: {node: '>= 0.8.0'} + dev: true + + /expect@29.7.0: + resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/expect-utils': 29.7.0 + jest-get-type: 29.6.3 + jest-matcher-utils: 29.7.0 + jest-message-util: 29.7.0 + jest-util: 29.7.0 + dev: true + + /ext@1.7.0: + resolution: {integrity: sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==} + dependencies: + type: 2.7.2 + dev: true + + /extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + + /extract-zip@2.0.1(supports-color@8.1.1): + resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==} + engines: {node: '>= 10.17.0'} + dependencies: + debug: 4.3.4(supports-color@8.1.1) + get-stream: 5.2.0 + yauzl: 2.10.0 + optionalDependencies: + '@types/yauzl': 2.10.3 + transitivePeerDependencies: + - supports-color + dev: true + + /extsprintf@1.3.0: + resolution: {integrity: sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==} + engines: {'0': node >=0.6.0} + dev: true + + /falafel@2.2.5: + resolution: {integrity: sha512-HuC1qF9iTnHDnML9YZAdCDQwT0yKl/U55K4XSUXqGAA2GLoafFgWRqdAbhWJxXaYD4pyoVxAJ8wH670jMpI9DQ==} + engines: {node: '>=0.4.0'} + dependencies: + acorn: 7.4.1 + isarray: 2.0.5 + dev: true + + /fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + dev: true + + /fast-equals@4.0.3: + resolution: {integrity: sha512-G3BSX9cfKttjr+2o1O22tYMLq0DPluZnYtq1rXumE1SpL/F/SLIfHx08WYQoWSIpeMYf8sRbJ8++71+v6Pnxfg==} + dev: false + + /fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + engines: {node: '>=8.6.0'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.5 + + /fast-isnumeric@1.1.4: + resolution: {integrity: sha512-1mM8qOr2LYz8zGaUdmiqRDiuue00Dxjgcb1NQR7TnhLVh6sQyngP9xvLo7Sl7LZpP/sk5eb+bcyWXw530NTBZw==} + dependencies: + is-string-blank: 1.0.1 + dev: true + + /fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + dev: true + + /fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + dev: true + + /fastparse@1.1.2: + resolution: {integrity: sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==} + dev: true + + /fastq@1.15.0: + resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} + dependencies: + reusify: 1.0.4 + + /fault@1.0.4: + resolution: {integrity: sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA==} + dependencies: + format: 0.2.2 + dev: false + + /fb-watchman@2.0.2: + resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} + dependencies: + bser: 2.1.1 + dev: true + + /fd-slicer@1.1.0: + resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} + dependencies: + pend: 1.2.0 + dev: true + + /figures@2.0.0: + resolution: {integrity: sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==} + engines: {node: '>=4'} + dependencies: + escape-string-regexp: 1.0.5 + dev: true + + /figures@3.2.0: + resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} + engines: {node: '>=8'} + dependencies: + escape-string-regexp: 1.0.5 + dev: true + + /figures@6.0.1: + resolution: {integrity: sha512-0oY/olScYD4IhQ8u//gCPA4F3mlTn2dacYmiDm/mbDQvpmLjV4uH+zhsQ5IyXRyvqkvtUkXkNdGvg5OFJTCsuQ==} + engines: {node: '>=18'} + dependencies: + is-unicode-supported: 2.0.0 + dev: true + + /file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + dependencies: + flat-cache: 3.0.4 + dev: true + + /file-saver@2.0.5: + resolution: {integrity: sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA==} + dev: false + + /fill-range@7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} + dependencies: + to-regex-range: 5.0.1 + + /find-up-simple@1.0.0: + resolution: {integrity: sha512-q7Us7kcjj2VMePAa02hDAF6d+MzsdsAWEwYyOpwUtlerRBkOEPBCRZrAV4XfcSN8fHAgaD0hP7miwoay6DCprw==} + engines: {node: '>=18'} + dev: true + + /find-up@2.1.0: + resolution: {integrity: sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==} + engines: {node: '>=4'} + dependencies: + locate-path: 2.0.0 + dev: true + + /find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + dev: true + + /find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + dev: true + + /find-versions@5.1.0: + resolution: {integrity: sha512-+iwzCJ7C5v5KgcBuueqVoNiHVoQpwiUK5XFLjf0affFTep+Wcw93tPvmb8tqujDNmzhBDPddnWV/qgWSXgq+Hg==} + engines: {node: '>=12'} + dependencies: + semver-regex: 4.0.5 + dev: true + + /flat-cache@3.0.4: + resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==} + engines: {node: ^10.12.0 || >=12.0.0} + dependencies: + flatted: 3.2.7 + rimraf: 3.0.2 + dev: true + + /flat@5.0.2: + resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} + dev: true + + /flatted@3.2.7: + resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==} + dev: true + + /flatten-vertex-data@1.0.2: + resolution: {integrity: sha512-BvCBFK2NZqerFTdMDgqfHBwxYWnxeCkwONsw6PvBMcUXqo8U/KDWwmXhqx1x2kLIg7DqIsJfOaJFOmlua3Lxuw==} + dependencies: + dtype: 2.0.0 + dev: true + + /follow-redirects@1.15.2: + resolution: {integrity: sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + dev: false + + /font-atlas@2.1.0: + resolution: {integrity: sha512-kP3AmvX+HJpW4w3d+PiPR2X6E1yvsBXt2yhuCw+yReO9F1WYhvZwx3c95DGZGwg9xYzDGrgJYa885xmVA+28Cg==} + dependencies: + css-font: 1.2.0 + dev: true + + /font-measure@1.2.2: + resolution: {integrity: sha512-mRLEpdrWzKe9hbfaF3Qpr06TAjquuBVP5cHy4b3hyeNdjc9i0PO6HniGsX5vjL5OWv7+Bd++NiooNpT/s8BvIA==} + dependencies: + css-font: 1.2.0 + dev: true + + /for-each@0.3.3: + resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + dependencies: + is-callable: 1.2.7 + dev: true + + /foreground-child@3.1.1: + resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} + engines: {node: '>=14'} + dependencies: + cross-spawn: 7.0.3 + signal-exit: 4.1.0 + dev: true + + /forever-agent@0.6.1: + resolution: {integrity: sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==} + dev: true + + /form-data@2.3.3: + resolution: {integrity: sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==} + engines: {node: '>= 0.12'} + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + dev: true + + /form-data@4.0.0: + resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} + engines: {node: '>= 6'} + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + dev: false + + /format@0.2.2: + resolution: {integrity: sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==} + engines: {node: '>=0.4.x'} + dev: false + + /fraction.js@4.2.0: + resolution: {integrity: sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==} + dev: true + + /framer-motion@10.15.1(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-6avJj/Uftblw0fMmo6jDHkKRH4TBdkMX/FiyR3G/hFe3hQHE4BUNJCqlMPKg9EzfI5jyqDOwO5oDnU+bW5y0eg==} + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 + peerDependenciesMeta: + react: + optional: true + react-dom: + optional: true + dependencies: + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + tslib: 2.5.0 + optionalDependencies: + '@emotion/is-prop-valid': 0.8.8 + dev: false + + /from2@2.3.0: + resolution: {integrity: sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==} + dependencies: + inherits: 2.0.4 + readable-stream: 2.3.8 + dev: true + + /fs-extra@11.2.0: + resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==} + engines: {node: '>=14.14'} + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.1 + dev: true + + /fs-extra@9.1.0: + resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} + engines: {node: '>=10'} + dependencies: + at-least-node: 1.0.0 + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.1 + dev: true + + /fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + /fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + optional: true + + /function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + /function.prototype.name@1.1.6: + resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + functions-have-names: 1.2.3 + dev: true + + /functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + dev: true + + /gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + /geojson-vt@3.2.1: + resolution: {integrity: sha512-EvGQQi/zPrDA6zr6BnJD/YhwAkBP8nnJ9emh3EnHQKVMfg/MRVtPbMYdgVy/IaEmn4UfagD2a6fafPDL5hbtwg==} + dev: true + + /get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + dev: true + + /get-canvas-context@1.0.2: + resolution: {integrity: sha512-LnpfLf/TNzr9zVOGiIY6aKCz8EKuXmlYNV7CM2pUjBa/B+c2I15tS7KLySep75+FuerJdmArvJLcsAXWEy2H0A==} + dev: true + + /get-intrinsic@1.2.2: + resolution: {integrity: sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==} + dependencies: + function-bind: 1.1.2 + has-proto: 1.0.1 + has-symbols: 1.0.3 + hasown: 2.0.0 + dev: true + + /get-nonce@1.0.1: + resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} + engines: {node: '>=6'} + dev: false + + /get-package-type@0.1.0: + resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} + engines: {node: '>=8.0.0'} + dev: true + + /get-stream@5.2.0: + resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} + engines: {node: '>=8'} + dependencies: + pump: 3.0.0 + dev: true + + /get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + dev: true + + /get-stream@7.0.1: + resolution: {integrity: sha512-3M8C1EOFN6r8AMUhwUAACIoXZJEOufDU5+0gFFN5uNs6XYOralD2Pqkl7m046va6x77FwposWXbAhPPIOus7mQ==} + engines: {node: '>=16'} + dev: true + + /get-stream@8.0.1: + resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} + engines: {node: '>=16'} + dev: true + + /get-symbol-description@1.0.0: + resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + get-intrinsic: 1.2.2 + dev: true + + /get-tsconfig@4.5.0: + resolution: {integrity: sha512-MjhiaIWCJ1sAU4pIQ5i5OfOuHHxVo1oYeNsWTON7jxYkod8pHocXeh+SSbmu5OZZZK73B6cbJ2XADzXehLyovQ==} + dev: true + + /getos@3.2.1: + resolution: {integrity: sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q==} + dependencies: + async: 3.2.5 + dev: true + + /getpass@0.1.7: + resolution: {integrity: sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==} + dependencies: + assert-plus: 1.0.0 + dev: true + + /git-log-parser@1.2.0: + resolution: {integrity: sha512-rnCVNfkTL8tdNryFuaY0fYiBWEBcgF748O6ZI61rslBvr2o7U65c2/6npCRqH40vuAhtgtDiqLTJjBVdrejCzA==} + dependencies: + argv-formatter: 1.0.0 + spawn-error-forwarder: 1.0.0 + split2: 1.0.0 + stream-combiner2: 1.1.1 + through2: 2.0.5 + traverse: 0.6.8 + dev: true + + /git-raw-commits@2.0.11: + resolution: {integrity: sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==} + engines: {node: '>=10'} + dependencies: + dargs: 7.0.0 + lodash: 4.17.21 + meow: 8.1.2 + split2: 3.2.2 + through2: 4.0.2 + dev: true + + /gl-mat4@1.2.0: + resolution: {integrity: sha512-sT5C0pwB1/e9G9AvAoLsoaJtbMGjfd/jfxo8jMCKqYYEnjZuFvqV5rehqar0538EmssjdDeiEWnKyBSTw7quoA==} + dev: true + + /gl-matrix@3.4.3: + resolution: {integrity: sha512-wcCp8vu8FT22BnvKVPjXa/ICBWRq/zjFfdofZy1WSpQZpphblv12/bOQLBC1rMM7SGOFS9ltVmKOHil5+Ml7gA==} + dev: true + + /gl-text@1.3.1: + resolution: {integrity: sha512-/f5gcEMiZd+UTBJLTl3D+CkCB/0UFGTx3nflH8ZmyWcLkZhsZ1+Xx5YYkw2rgWAzgPeE35xCqBuHSoMKQVsR+w==} + dependencies: + bit-twiddle: 1.0.2 + color-normalize: 1.5.0 + css-font: 1.2.0 + detect-kerning: 2.1.2 + es6-weak-map: 2.0.3 + flatten-vertex-data: 1.0.2 + font-atlas: 2.1.0 + font-measure: 1.2.2 + gl-util: 3.1.3 + is-plain-obj: 1.1.0 + object-assign: 4.1.1 + parse-rect: 1.2.0 + parse-unit: 1.0.1 + pick-by-alias: 1.2.0 + regl: 2.1.0 + to-px: 1.0.1 + typedarray-pool: 1.2.0 + dev: true + + /gl-util@3.1.3: + resolution: {integrity: sha512-dvRTggw5MSkJnCbh74jZzSoTOGnVYK+Bt+Ckqm39CVcl6+zSsxqWk4lr5NKhkqXHL6qvZAU9h17ZF8mIskY9mA==} + dependencies: + is-browser: 2.1.0 + is-firefox: 1.0.3 + is-plain-obj: 1.1.0 + number-is-integer: 1.0.1 + object-assign: 4.1.1 + pick-by-alias: 1.2.0 + weak-map: 1.0.8 + dev: true + + /glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + dependencies: + is-glob: 4.0.3 + + /glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + dependencies: + is-glob: 4.0.3 + + /glob-to-regexp@0.4.1: + resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} + dev: false + + /glob@10.3.10: + resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + foreground-child: 3.1.1 + jackspeak: 2.3.6 + minimatch: 9.0.3 + minipass: 7.0.4 + path-scurry: 1.10.1 + dev: true + + /glob@7.1.6: + resolution: {integrity: sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + /glob@7.1.7: + resolution: {integrity: sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: true + + /glob@7.2.0: + resolution: {integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: true + + /glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: true + + /global-dirs@0.1.1: + resolution: {integrity: sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==} + engines: {node: '>=4'} + dependencies: + ini: 1.3.8 + dev: true + + /global-dirs@3.0.1: + resolution: {integrity: sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==} + engines: {node: '>=10'} + dependencies: + ini: 2.0.0 + dev: true + + /globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + + /globals@13.20.0: + resolution: {integrity: sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==} + engines: {node: '>=8'} + dependencies: + type-fest: 0.20.2 + dev: true + + /globalthis@1.0.3: + resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} + engines: {node: '>= 0.4'} + dependencies: + define-properties: 1.2.1 + dev: true + + /globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.2 + ignore: 5.2.4 + merge2: 1.4.1 + slash: 3.0.0 + dev: true + + /globby@13.1.4: + resolution: {integrity: sha512-iui/IiiW+QrJ1X1hKH5qwlMQyv34wJAYwH1vrf8b9kBA4sNiif3gKsMHa+BrdnOpEudWjpotfa7LrTzB1ERS/g==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + dir-glob: 3.0.1 + fast-glob: 3.3.2 + ignore: 5.2.4 + merge2: 1.4.1 + slash: 4.0.0 + dev: true + + /globby@14.0.0: + resolution: {integrity: sha512-/1WM/LNHRAOH9lZta77uGbq0dAEQM+XjNesWwhlERDVenqothRbnzTrL3/LrIoEPPjeUHC3vrS6TwoyxeHs7MQ==} + engines: {node: '>=18'} + dependencies: + '@sindresorhus/merge-streams': 1.0.0 + fast-glob: 3.3.2 + ignore: 5.2.4 + path-type: 5.0.0 + slash: 5.1.0 + unicorn-magic: 0.1.0 + dev: true + + /glsl-inject-defines@1.0.3: + resolution: {integrity: sha512-W49jIhuDtF6w+7wCMcClk27a2hq8znvHtlGnrYkSWEr8tHe9eA2dcnohlcAmxLYBSpSSdzOkRdyPTrx9fw49+A==} + dependencies: + glsl-token-inject-block: 1.1.0 + glsl-token-string: 1.0.1 + glsl-tokenizer: 2.1.5 + dev: true + + /glsl-resolve@0.0.1: + resolution: {integrity: sha512-xxFNsfnhZTK9NBhzJjSBGX6IOqYpvBHxxmo+4vapiljyGNCY0Bekzn0firQkQrazK59c1hYxMDxYS8MDlhw4gA==} + dependencies: + resolve: 0.6.3 + xtend: 2.2.0 + dev: true + + /glsl-token-assignments@2.0.2: + resolution: {integrity: sha512-OwXrxixCyHzzA0U2g4btSNAyB2Dx8XrztY5aVUCjRSh4/D0WoJn8Qdps7Xub3sz6zE73W3szLrmWtQ7QMpeHEQ==} + dev: true + + /glsl-token-defines@1.0.0: + resolution: {integrity: sha512-Vb5QMVeLjmOwvvOJuPNg3vnRlffscq2/qvIuTpMzuO/7s5kT+63iL6Dfo2FYLWbzuiycWpbC0/KV0biqFwHxaQ==} + dependencies: + glsl-tokenizer: 2.1.5 + dev: true + + /glsl-token-depth@1.1.2: + resolution: {integrity: sha512-eQnIBLc7vFf8axF9aoi/xW37LSWd2hCQr/3sZui8aBJnksq9C7zMeUYHVJWMhFzXrBU7fgIqni4EhXVW4/krpg==} + dev: true + + /glsl-token-descope@1.0.2: + resolution: {integrity: sha512-kS2PTWkvi/YOeicVjXGgX5j7+8N7e56srNDEHDTVZ1dcESmbmpmgrnpjPcjxJjMxh56mSXYoFdZqb90gXkGjQw==} + dependencies: + glsl-token-assignments: 2.0.2 + glsl-token-depth: 1.1.2 + glsl-token-properties: 1.0.1 + glsl-token-scope: 1.1.2 + dev: true + + /glsl-token-inject-block@1.1.0: + resolution: {integrity: sha512-q/m+ukdUBuHCOtLhSr0uFb/qYQr4/oKrPSdIK2C4TD+qLaJvqM9wfXIF/OOBjuSA3pUoYHurVRNao6LTVVUPWA==} + dev: true + + /glsl-token-properties@1.0.1: + resolution: {integrity: sha512-dSeW1cOIzbuUoYH0y+nxzwK9S9O3wsjttkq5ij9ZGw0OS41BirKJzzH48VLm8qLg+au6b0sINxGC0IrGwtQUcA==} + dev: true + + /glsl-token-scope@1.1.2: + resolution: {integrity: sha512-YKyOMk1B/tz9BwYUdfDoHvMIYTGtVv2vbDSLh94PT4+f87z21FVdou1KNKgF+nECBTo0fJ20dpm0B1vZB1Q03A==} + dev: true + + /glsl-token-string@1.0.1: + resolution: {integrity: sha512-1mtQ47Uxd47wrovl+T6RshKGkRRCYWhnELmkEcUAPALWGTFe2XZpH3r45XAwL2B6v+l0KNsCnoaZCSnhzKEksg==} + dev: true + + /glsl-token-whitespace-trim@1.0.0: + resolution: {integrity: sha512-ZJtsPut/aDaUdLUNtmBYhaCmhIjpKNg7IgZSfX5wFReMc2vnj8zok+gB/3Quqs0TsBSX/fGnqUUYZDqyuc2xLQ==} + dev: true + + /glsl-tokenizer@2.1.5: + resolution: {integrity: sha512-XSZEJ/i4dmz3Pmbnpsy3cKh7cotvFlBiZnDOwnj/05EwNp2XrhQ4XKJxT7/pDt4kp4YcpRSKz8eTV7S+mwV6MA==} + dependencies: + through2: 0.6.5 + dev: true + + /glslify-bundle@5.1.1: + resolution: {integrity: sha512-plaAOQPv62M1r3OsWf2UbjN0hUYAB7Aph5bfH58VxJZJhloRNbxOL9tl/7H71K7OLJoSJ2ZqWOKk3ttQ6wy24A==} + dependencies: + glsl-inject-defines: 1.0.3 + glsl-token-defines: 1.0.0 + glsl-token-depth: 1.1.2 + glsl-token-descope: 1.0.2 + glsl-token-scope: 1.1.2 + glsl-token-string: 1.0.1 + glsl-token-whitespace-trim: 1.0.0 + glsl-tokenizer: 2.1.5 + murmurhash-js: 1.0.0 + shallow-copy: 0.0.1 + dev: true + + /glslify-deps@1.3.2: + resolution: {integrity: sha512-7S7IkHWygJRjcawveXQjRXLO2FTjijPDYC7QfZyAQanY+yGLCFHYnPtsGT9bdyHiwPTw/5a1m1M9hamT2aBpag==} + dependencies: + '@choojs/findup': 0.2.1 + events: 3.3.0 + glsl-resolve: 0.0.1 + glsl-tokenizer: 2.1.5 + graceful-fs: 4.2.11 + inherits: 2.0.4 + map-limit: 0.0.1 + resolve: 1.22.8 + dev: true + + /glslify@7.1.1: + resolution: {integrity: sha512-bud98CJ6kGZcP9Yxcsi7Iz647wuDz3oN+IZsjCRi5X1PI7t/xPKeL0mOwXJjo+CRZMqvq0CkSJiywCcY7kVYog==} + hasBin: true + dependencies: + bl: 2.2.1 + concat-stream: 1.6.2 + duplexify: 3.7.1 + falafel: 2.2.5 + from2: 2.3.0 + glsl-resolve: 0.0.1 + glsl-token-whitespace-trim: 1.0.0 + glslify-bundle: 5.1.1 + glslify-deps: 1.3.2 + minimist: 1.2.8 + resolve: 1.22.8 + stack-trace: 0.0.9 + static-eval: 2.1.1 + through2: 2.0.5 + xtend: 4.0.2 + dev: true + + /goober@2.1.13(csstype@3.1.3): + resolution: {integrity: sha512-jFj3BQeleOoy7t93E9rZ2de+ScC4lQICLwiAQmKMg9F6roKGaLSHoCDYKkWlSafg138jejvq/mTdvmnwDQgqoQ==} + peerDependencies: + csstype: ^3.0.10 + dependencies: + csstype: 3.1.3 + dev: false + + /gopd@1.0.1: + resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + dependencies: + get-intrinsic: 1.2.2 + dev: true + + /graceful-fs@4.2.10: + resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==} + dev: true + + /graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + /graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + dev: true + + /grid-index@1.1.0: + resolution: {integrity: sha512-HZRwumpOGUrHyxO5bqKZL0B0GlUpwtCAzZ42sgxUPniu33R1LSFH5yrIcBCHjkctCAh3mtWKcKd9J4vDDdeVHA==} + dev: true + + /gzip-size@6.0.0: + resolution: {integrity: sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==} + engines: {node: '>=10'} + dependencies: + duplexer: 0.1.2 + dev: true + + /handlebars@4.7.8: + resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==} + engines: {node: '>=0.4.7'} + dependencies: + minimist: 1.2.8 + neo-async: 2.6.2 + source-map: 0.6.1 + wordwrap: 1.0.0 + optionalDependencies: + uglify-js: 3.17.4 + dev: true + + /hard-rejection@2.1.0: + resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} + engines: {node: '>=6'} + dev: true + + /has-ansi@4.0.1: + resolution: {integrity: sha512-Qr4RtTm30xvEdqUXbSBVWDu+PrTokJOwe/FU+VdfJPk+MXAPoeOzKpRyrDTnZIJwAkQ4oBLTU53nu0HrkF/Z2A==} + engines: {node: '>=8'} + dependencies: + ansi-regex: 4.1.1 + dev: true + + /has-bigints@1.0.2: + resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} + dev: true + + /has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + + /has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + dev: true + + /has-hover@1.0.1: + resolution: {integrity: sha512-0G6w7LnlcpyDzpeGUTuT0CEw05+QlMuGVk1IHNAlHrGJITGodjZu3x8BNDUMfKJSZXNB2ZAclqc1bvrd+uUpfg==} + dependencies: + is-browser: 2.1.0 + dev: true + + /has-passive-events@1.0.0: + resolution: {integrity: sha512-2vSj6IeIsgvsRMyeQ0JaCX5Q3lX4zMn5HpoVc7MEhQ6pv8Iq9rsXjsp+E5ZwaT7T0xhMT0KmU8gtt1EFVdbJiw==} + dependencies: + is-browser: 2.1.0 + dev: true + + /has-property-descriptors@1.0.0: + resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==} + dependencies: + get-intrinsic: 1.2.2 + dev: true + + /has-proto@1.0.1: + resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} + engines: {node: '>= 0.4'} + dev: true + + /has-symbols@1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} + dev: true + + /has-tostringtag@1.0.0: + resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} + engines: {node: '>= 0.4'} + dependencies: + has-symbols: 1.0.3 + dev: true + + /has@1.0.3: + resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} + engines: {node: '>= 0.4.0'} + dependencies: + function-bind: 1.1.2 + dev: true + + /hasown@2.0.0: + resolution: {integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==} + engines: {node: '>= 0.4'} + dependencies: + function-bind: 1.1.2 + + /hast-util-from-parse5@7.1.2: + resolution: {integrity: sha512-Nz7FfPBuljzsN3tCQ4kCBKqdNhQE2l0Tn+X1ubgKBPRoiDIu1mL08Cfw4k7q71+Duyaw7DXDN+VTAp4Vh3oCOw==} + dependencies: + '@types/hast': 2.3.4 + '@types/unist': 2.0.6 + hastscript: 7.2.0 + property-information: 6.2.0 + vfile: 5.3.7 + vfile-location: 4.1.0 + web-namespaces: 2.0.1 + dev: false + + /hast-util-parse-selector@2.2.5: + resolution: {integrity: sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==} + dev: false + + /hast-util-parse-selector@3.1.1: + resolution: {integrity: sha512-jdlwBjEexy1oGz0aJ2f4GKMaVKkA9jwjr4MjAAI22E5fM/TXVZHuS5OpONtdeIkRKqAaryQ2E9xNQxijoThSZA==} + dependencies: + '@types/hast': 2.3.4 + dev: false + + /hast-util-raw@7.2.3: + resolution: {integrity: sha512-RujVQfVsOrxzPOPSzZFiwofMArbQke6DJjnFfceiEbFh7S05CbPt0cYN+A5YeD3pso0JQk6O1aHBnx9+Pm2uqg==} + dependencies: + '@types/hast': 2.3.4 + '@types/parse5': 6.0.3 + hast-util-from-parse5: 7.1.2 + hast-util-to-parse5: 7.1.0 + html-void-elements: 2.0.1 + parse5: 6.0.1 + unist-util-position: 4.0.4 + unist-util-visit: 4.1.2 + vfile: 5.3.7 + web-namespaces: 2.0.1 + zwitch: 2.0.4 + dev: false + + /hast-util-to-parse5@7.1.0: + resolution: {integrity: sha512-YNRgAJkH2Jky5ySkIqFXTQiaqcAtJyVE+D5lkN6CdtOqrnkLfGYYrEcKuHOJZlp+MwjSwuD3fZuawI+sic/RBw==} + dependencies: + '@types/hast': 2.3.4 + comma-separated-tokens: 2.0.3 + property-information: 6.2.0 + space-separated-tokens: 2.0.2 + web-namespaces: 2.0.1 + zwitch: 2.0.4 + dev: false + + /hast-util-whitespace@2.0.1: + resolution: {integrity: sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng==} + dev: false + + /hastscript@6.0.0: + resolution: {integrity: sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w==} + dependencies: + '@types/hast': 2.3.4 + comma-separated-tokens: 1.0.8 + hast-util-parse-selector: 2.2.5 + property-information: 5.6.0 + space-separated-tokens: 1.1.5 + dev: false + + /hastscript@7.2.0: + resolution: {integrity: sha512-TtYPq24IldU8iKoJQqvZOuhi5CyCQRAbvDOX0x1eW6rsHSxa/1i2CCiptNTotGHJ3VoHRGmqiv6/D3q113ikkw==} + dependencies: + '@types/hast': 2.3.4 + comma-separated-tokens: 2.0.3 + hast-util-parse-selector: 3.1.1 + property-information: 6.2.0 + space-separated-tokens: 2.0.2 + dev: false + + /he@1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + dev: true + + /highlight.js@10.7.3: + resolution: {integrity: sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==} + dev: false + + /hoist-non-react-statics@3.3.2: + resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} + dependencies: + react-is: 16.13.1 + dev: false + + /hook-std@3.0.0: + resolution: {integrity: sha512-jHRQzjSDzMtFy34AGj1DN+vq54WVuhSvKgrHf0OMiFQTwDD4L/qqofVEWjLOBMTn5+lCD3fPg32W9yOfnEJTTw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: true + + /hosted-git-info@2.8.9: + resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} + dev: true + + /hosted-git-info@4.1.0: + resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} + engines: {node: '>=10'} + dependencies: + lru-cache: 6.0.0 + dev: true + + /hosted-git-info@7.0.1: + resolution: {integrity: sha512-+K84LB1DYwMHoHSgaOY/Jfhw3ucPmSET5v98Ke/HdNSw4a0UktWzyW1mjhjpuxxTqOOsfWT/7iVshHmVZ4IpOA==} + engines: {node: ^16.14.0 || >=18.0.0} + dependencies: + lru-cache: 10.1.0 + dev: true + + /hsluv@0.0.3: + resolution: {integrity: sha512-08iL2VyCRbkQKBySkSh6m8zMUa3sADAxGVWs3Z1aPcUkTJeK0ETG4Fc27tEmQBGUAXZjIsXOZqBvacuVNSC/fQ==} + dev: true + + /html-escaper@2.0.2: + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + dev: true + + /html-void-elements@2.0.1: + resolution: {integrity: sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A==} + dev: false + + /html2canvas@1.4.1: + resolution: {integrity: sha512-fPU6BHNpsyIhr8yyMpTLLxAbkaK8ArIBcmZIRiBLiDhjeqvXolaEmDGmELFuX9I4xDcaKKcJl+TKZLqruBbmWA==} + engines: {node: '>=8.0.0'} + dependencies: + css-line-break: 2.1.0 + text-segmentation: 1.0.3 + dev: false + + /http-proxy-agent@7.0.0: + resolution: {integrity: sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==} + engines: {node: '>= 14'} + dependencies: + agent-base: 7.1.0 + debug: 4.3.4(supports-color@5.5.0) + transitivePeerDependencies: + - supports-color + dev: true + + /http-signature@1.3.6: + resolution: {integrity: sha512-3adrsD6zqo4GsTqtO7FyrejHNv+NgiIfAfv68+jVlFmSr9OGy7zrxONceFRLKvnnZA5jbxQBX1u9PpB6Wi32Gw==} + engines: {node: '>=0.10'} + dependencies: + assert-plus: 1.0.0 + jsprim: 2.0.2 + sshpk: 1.18.0 + dev: true + + /https-proxy-agent@7.0.2: + resolution: {integrity: sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==} + engines: {node: '>= 14'} + dependencies: + agent-base: 7.1.0 + debug: 4.3.4(supports-color@5.5.0) + transitivePeerDependencies: + - supports-color + dev: true + + /human-signals@1.1.1: + resolution: {integrity: sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==} + engines: {node: '>=8.12.0'} + dev: true + + /human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + dev: true + + /human-signals@4.3.1: + resolution: {integrity: sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==} + engines: {node: '>=14.18.0'} + dev: true + + /human-signals@5.0.0: + resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} + engines: {node: '>=16.17.0'} + dev: true + + /husky@8.0.3: + resolution: {integrity: sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==} + engines: {node: '>=14'} + dev: true + + /iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + dependencies: + safer-buffer: 2.1.2 + dev: true + + /ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + dev: true + + /ignore@5.2.4: + resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} + engines: {node: '>= 4'} + dev: true + + /import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + dev: true + + /import-from-esm@1.3.3: + resolution: {integrity: sha512-U3Qt/CyfFpTUv6LOP2jRTLYjphH6zg3okMfHbyqRa/W2w6hr8OsJWVggNlR4jxuojQy81TgTJTxgSkyoteRGMQ==} + engines: {node: '>=16.20'} + dependencies: + debug: 4.3.4(supports-color@5.5.0) + import-meta-resolve: 4.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /import-local@3.1.0: + resolution: {integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==} + engines: {node: '>=8'} + dependencies: + pkg-dir: 4.2.0 + resolve-cwd: 3.0.0 + dev: true + + /import-meta-resolve@4.0.0: + resolution: {integrity: sha512-okYUR7ZQPH+efeuMJGlq4f8ubUgO50kByRPyt/Cy1Io4PSRsPjxME+YlVaCOx+NIToW7hCsZNFJyTPFFKepRSA==} + dev: true + + /imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + dev: true + + /indent-string@4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + dev: true + + /indent-string@5.0.0: + resolution: {integrity: sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==} + engines: {node: '>=12'} + dev: true + + /index-to-position@0.1.2: + resolution: {integrity: sha512-MWDKS3AS1bGCHLBA2VLImJz42f7bJh8wQsTGCzI3j519/CASStoDONUBVz2I/VID0MpiX3SGSnbOD2xUalbE5g==} + engines: {node: '>=18'} + dev: true + + /inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + /inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + /ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + dev: true + + /ini@2.0.0: + resolution: {integrity: sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==} + engines: {node: '>=10'} + dev: true + + /inline-style-parser@0.1.1: + resolution: {integrity: sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==} + dev: false + + /internal-slot@1.0.5: + resolution: {integrity: sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.2.2 + has: 1.0.3 + side-channel: 1.0.4 + dev: true + + /internmap@2.0.3: + resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==} + engines: {node: '>=12'} + dev: false + + /into-stream@7.0.0: + resolution: {integrity: sha512-2dYz766i9HprMBasCMvHMuazJ7u4WzhJwo5kb3iPSiW/iRYV6uPari3zHoqZlnuaR7V1bEiNMxikhp37rdBXbw==} + engines: {node: '>=12'} + dependencies: + from2: 2.3.0 + p-is-promise: 3.0.0 + dev: true + + /invariant@2.2.4: + resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} + dependencies: + loose-envify: 1.4.0 + dev: false + + /is-alphabetical@1.0.4: + resolution: {integrity: sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==} + dev: false + + /is-alphanumerical@1.0.4: + resolution: {integrity: sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==} + dependencies: + is-alphabetical: 1.0.4 + is-decimal: 1.0.4 + dev: false + + /is-arguments@1.1.1: + resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + has-tostringtag: 1.0.0 + dev: true + + /is-array-buffer@3.0.2: + resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} + dependencies: + call-bind: 1.0.5 + get-intrinsic: 1.2.2 + is-typed-array: 1.1.12 + dev: true + + /is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + dev: true + + /is-async-function@2.0.0: + resolution: {integrity: sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + dev: true + + /is-bigint@1.0.4: + resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} + dependencies: + has-bigints: 1.0.2 + dev: true + + /is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + dependencies: + binary-extensions: 2.2.0 + + /is-boolean-object@1.1.2: + resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + has-tostringtag: 1.0.0 + dev: true + + /is-browser@2.1.0: + resolution: {integrity: sha512-F5rTJxDQ2sW81fcfOR1GnCXT6sVJC104fCyfj+mjpwNEwaPYSn5fte5jiHmBg3DHsIoL/l8Kvw5VN5SsTRcRFQ==} + dev: true + + /is-buffer@1.1.6: + resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} + dev: false + + /is-buffer@2.0.5: + resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==} + engines: {node: '>=4'} + dev: false + + /is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + dev: true + + /is-ci@3.0.1: + resolution: {integrity: sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==} + dependencies: + ci-info: 3.9.0 + dev: true + + /is-core-module@2.13.1: + resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} + dependencies: + hasown: 2.0.0 + + /is-date-object@1.0.5: + resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + dev: true + + /is-decimal@1.0.4: + resolution: {integrity: sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==} + dev: false + + /is-docker@2.2.1: + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} + engines: {node: '>=8'} + dev: true + + /is-docker@3.0.0: + resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: true + + /is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + /is-finalizationregistry@1.0.2: + resolution: {integrity: sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==} + dependencies: + call-bind: 1.0.5 + dev: true + + /is-finite@1.1.0: + resolution: {integrity: sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==} + engines: {node: '>=0.10.0'} + dev: true + + /is-firefox@1.0.3: + resolution: {integrity: sha512-6Q9ITjvWIm0Xdqv+5U12wgOKEM2KoBw4Y926m0OFkvlCxnbG94HKAsVz8w3fWcfAS5YA2fJORXX1dLrkprCCxA==} + engines: {node: '>=0.10.0'} + dev: true + + /is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + dev: true + + /is-generator-fn@2.1.0: + resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} + engines: {node: '>=6'} + dev: true + + /is-generator-function@1.0.10: + resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + dev: true + + /is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + + /is-hexadecimal@1.0.4: + resolution: {integrity: sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==} + dev: false + + /is-iexplorer@1.0.0: + resolution: {integrity: sha512-YeLzceuwg3K6O0MLM3UyUUjKAlyULetwryFp1mHy1I5PfArK0AEqlfa+MR4gkJjcbuJXoDJCvXbyqZVf5CR2Sg==} + engines: {node: '>=0.10.0'} + dev: true + + /is-inside-container@1.0.0: + resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} + engines: {node: '>=14.16'} + dependencies: + is-docker: 3.0.0 + dev: true + + /is-installed-globally@0.4.0: + resolution: {integrity: sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==} + engines: {node: '>=10'} + dependencies: + global-dirs: 3.0.1 + is-path-inside: 3.0.3 + dev: true + + /is-map@2.0.2: + resolution: {integrity: sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==} + dev: true + + /is-mobile@4.0.0: + resolution: {integrity: sha512-mlcHZA84t1qLSuWkt2v0I2l61PYdyQDt4aG1mLIXF5FDMm4+haBCxCPYSr/uwqQNRk1MiTizn0ypEuRAOLRAew==} + dev: true + + /is-negative-zero@2.0.2: + resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} + engines: {node: '>= 0.4'} + dev: true + + /is-number-object@1.0.7: + resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + dev: true + + /is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + /is-obj@1.0.1: + resolution: {integrity: sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==} + engines: {node: '>=0.10.0'} + dev: true + + /is-obj@2.0.0: + resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} + engines: {node: '>=8'} + dev: true + + /is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + dev: true + + /is-plain-obj@1.1.0: + resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} + engines: {node: '>=0.10.0'} + dev: true + + /is-plain-obj@2.1.0: + resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} + engines: {node: '>=8'} + dev: true + + /is-plain-obj@4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} + dev: false + + /is-regex@1.1.4: + resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + has-tostringtag: 1.0.0 + dev: true + + /is-retina@1.0.3: + resolution: {integrity: sha512-/tCmbIETZwCd8uHWO+GvbRa7jxwHFHdfetHfiwoP0aN9UDf3prUJMtKn7iBFYipYhqY1bSTjur8hC/Dakt8eyw==} + dev: false + + /is-set@2.0.2: + resolution: {integrity: sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==} + dev: true + + /is-shared-array-buffer@1.0.2: + resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} + dependencies: + call-bind: 1.0.5 + dev: true + + /is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + dev: true + + /is-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: true + + /is-string-blank@1.0.1: + resolution: {integrity: sha512-9H+ZBCVs3L9OYqv8nuUAzpcT9OTgMD1yAWrG7ihlnibdkbtB850heAmYWxHuXc4CHy4lKeK69tN+ny1K7gBIrw==} + dev: true + + /is-string@1.0.7: + resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + dev: true + + /is-svg-path@1.0.2: + resolution: {integrity: sha512-Lj4vePmqpPR1ZnRctHv8ltSh1OrSxHkhUkd7wi+VQdcdP15/KvQFyk7LhNuM7ZW0EVbJz8kZLVmL9quLrfq4Kg==} + dev: true + + /is-symbol@1.0.4: + resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} + engines: {node: '>= 0.4'} + dependencies: + has-symbols: 1.0.3 + dev: true + + /is-text-path@2.0.0: + resolution: {integrity: sha512-+oDTluR6WEjdXEJMnC2z6A4FRwFoYuvShVVEGsS7ewc0UTi2QtAKMDJuL4BDEVt+5T7MjFo12RP8ghOM75oKJw==} + engines: {node: '>=8'} + dependencies: + text-extensions: 2.4.0 + dev: true + + /is-typed-array@1.1.12: + resolution: {integrity: sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==} + engines: {node: '>= 0.4'} + dependencies: + which-typed-array: 1.1.13 + dev: true + + /is-typedarray@1.0.0: + resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} + dev: true + + /is-unicode-supported@0.1.0: + resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} + engines: {node: '>=10'} + dev: true + + /is-unicode-supported@2.0.0: + resolution: {integrity: sha512-FRdAyx5lusK1iHG0TWpVtk9+1i+GjrzRffhDg4ovQ7mcidMQ6mj+MhKPmvh7Xwyv5gIS06ns49CA7Sqg7lC22Q==} + engines: {node: '>=18'} + dev: true + + /is-weakmap@2.0.1: + resolution: {integrity: sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==} + dev: true + + /is-weakref@1.0.2: + resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} + dependencies: + call-bind: 1.0.5 + dev: true + + /is-weakset@2.0.2: + resolution: {integrity: sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==} + dependencies: + call-bind: 1.0.5 + get-intrinsic: 1.2.2 + dev: true + + /is-wsl@2.2.0: + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} + dependencies: + is-docker: 2.2.1 + dev: true + + /isarray@0.0.1: + resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} + dev: true + + /isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + dev: true + + /isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + dev: true + + /isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + dev: true + + /isstream@0.1.2: + resolution: {integrity: sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==} + dev: true + + /issue-parser@6.0.0: + resolution: {integrity: sha512-zKa/Dxq2lGsBIXQ7CUZWTHfvxPC2ej0KfO7fIPqLlHB9J2hJ7rGhZ5rilhuufylr4RXYPzJUeFjKxz305OsNlA==} + engines: {node: '>=10.13'} + dependencies: + lodash.capitalize: 4.2.1 + lodash.escaperegexp: 4.1.2 + lodash.isplainobject: 4.0.6 + lodash.isstring: 4.0.1 + lodash.uniqby: 4.7.0 + dev: true + + /istanbul-lib-coverage@3.2.2: + resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} + engines: {node: '>=8'} + dev: true + + /istanbul-lib-instrument@5.2.1: + resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} + engines: {node: '>=8'} + dependencies: + '@babel/core': 7.23.7 + '@babel/parser': 7.23.6 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-coverage: 3.2.2 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: true + + /istanbul-lib-instrument@6.0.1: + resolution: {integrity: sha512-EAMEJBsYuyyztxMxW3g7ugGPkrZsV57v0Hmv3mm1uQsmB+QnZuepg731CRaIgeUVSdmsTngOkSnauNF8p7FIhA==} + engines: {node: '>=10'} + dependencies: + '@babel/core': 7.23.7 + '@babel/parser': 7.23.6 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-coverage: 3.2.2 + semver: 7.5.4 + transitivePeerDependencies: + - supports-color + dev: true + + /istanbul-lib-report@3.0.1: + resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} + engines: {node: '>=10'} + dependencies: + istanbul-lib-coverage: 3.2.2 + make-dir: 4.0.0 + supports-color: 7.2.0 + dev: true + + /istanbul-lib-source-maps@4.0.1: + resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} + engines: {node: '>=10'} + dependencies: + debug: 4.3.4(supports-color@5.5.0) + istanbul-lib-coverage: 3.2.2 + source-map: 0.6.1 + transitivePeerDependencies: + - supports-color + dev: true + + /istanbul-reports@3.1.6: + resolution: {integrity: sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==} + engines: {node: '>=8'} + dependencies: + html-escaper: 2.0.2 + istanbul-lib-report: 3.0.1 + dev: true + + /iterator.prototype@1.1.2: + resolution: {integrity: sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==} + dependencies: + define-properties: 1.2.1 + get-intrinsic: 1.2.2 + has-symbols: 1.0.3 + reflect.getprototypeof: 1.0.4 + set-function-name: 2.0.1 + dev: true + + /jackspeak@2.3.6: + resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} + engines: {node: '>=14'} + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + dev: true + + /java-properties@1.0.2: + resolution: {integrity: sha512-qjdpeo2yKlYTH7nFdK0vbZWuTCesk4o63v5iVOlhMQPfuIZQfW/HI35SjfhA+4qpg36rnFSvUK5b1m+ckIblQQ==} + engines: {node: '>= 0.6.0'} + dev: true + + /jest-changed-files@29.7.0: + resolution: {integrity: sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + execa: 5.1.1 + jest-util: 29.7.0 + p-limit: 3.1.0 + dev: true + + /jest-circus@29.7.0: + resolution: {integrity: sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/environment': 29.7.0 + '@jest/expect': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 18.19.5 + chalk: 4.1.2 + co: 4.6.0 + dedent: 1.5.1 + is-generator-fn: 2.1.0 + jest-each: 29.7.0 + jest-matcher-utils: 29.7.0 + jest-message-util: 29.7.0 + jest-runtime: 29.7.0 + jest-snapshot: 29.7.0 + jest-util: 29.7.0 + p-limit: 3.1.0 + pretty-format: 29.7.0 + pure-rand: 6.0.4 + slash: 3.0.0 + stack-utils: 2.0.6 + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + dev: true + + /jest-cli@29.7.0(@types/node@18.15.5): + resolution: {integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/core': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/types': 29.6.3 + chalk: 4.1.2 + create-jest: 29.7.0(@types/node@18.15.5) + exit: 0.1.2 + import-local: 3.1.0 + jest-config: 29.7.0(@types/node@18.15.5) + jest-util: 29.7.0 + jest-validate: 29.7.0 + yargs: 17.7.2 + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + dev: true + + /jest-config@29.7.0(@types/node@18.15.5): + resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@types/node': '*' + ts-node: '>=9.0.0' + peerDependenciesMeta: + '@types/node': + optional: true + ts-node: + optional: true + dependencies: + '@babel/core': 7.23.7 + '@jest/test-sequencer': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 18.15.5 + babel-jest: 29.7.0(@babel/core@7.23.7) + chalk: 4.1.2 + ci-info: 3.9.0 + deepmerge: 4.3.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-circus: 29.7.0 + jest-environment-node: 29.7.0 + jest-get-type: 29.6.3 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-runner: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 + micromatch: 4.0.5 + parse-json: 5.2.0 + pretty-format: 29.7.0 + slash: 3.0.0 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + dev: true + + /jest-config@29.7.0(@types/node@18.19.5): + resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@types/node': '*' + ts-node: '>=9.0.0' + peerDependenciesMeta: + '@types/node': + optional: true + ts-node: + optional: true + dependencies: + '@babel/core': 7.23.7 + '@jest/test-sequencer': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 18.19.5 + babel-jest: 29.7.0(@babel/core@7.23.7) + chalk: 4.1.2 + ci-info: 3.9.0 + deepmerge: 4.3.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-circus: 29.7.0 + jest-environment-node: 29.7.0 + jest-get-type: 29.6.3 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-runner: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 + micromatch: 4.0.5 + parse-json: 5.2.0 + pretty-format: 29.7.0 + slash: 3.0.0 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + dev: true + + /jest-diff@29.7.0: + resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + chalk: 4.1.2 + diff-sequences: 29.6.3 + jest-get-type: 29.6.3 + pretty-format: 29.7.0 + dev: true + + /jest-docblock@29.7.0: + resolution: {integrity: sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + detect-newline: 3.1.0 + dev: true + + /jest-each@29.7.0: + resolution: {integrity: sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.6.3 + chalk: 4.1.2 + jest-get-type: 29.6.3 + jest-util: 29.7.0 + pretty-format: 29.7.0 + dev: true + + /jest-environment-node@29.7.0: + resolution: {integrity: sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/environment': 29.7.0 + '@jest/fake-timers': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 18.19.5 + jest-mock: 29.7.0 + jest-util: 29.7.0 + dev: true + + /jest-get-type@29.6.3: + resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dev: true + + /jest-haste-map@29.7.0: + resolution: {integrity: sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.6.3 + '@types/graceful-fs': 4.1.9 + '@types/node': 18.19.5 + anymatch: 3.1.3 + fb-watchman: 2.0.2 + graceful-fs: 4.2.11 + jest-regex-util: 29.6.3 + jest-util: 29.7.0 + jest-worker: 29.7.0 + micromatch: 4.0.5 + walker: 1.0.8 + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /jest-leak-detector@29.7.0: + resolution: {integrity: sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + jest-get-type: 29.6.3 + pretty-format: 29.7.0 + dev: true + + /jest-matcher-utils@29.7.0: + resolution: {integrity: sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + chalk: 4.1.2 + jest-diff: 29.7.0 + jest-get-type: 29.6.3 + pretty-format: 29.7.0 + dev: true + + /jest-message-util@29.7.0: + resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@babel/code-frame': 7.23.5 + '@jest/types': 29.6.3 + '@types/stack-utils': 2.0.3 + chalk: 4.1.2 + graceful-fs: 4.2.11 + micromatch: 4.0.5 + pretty-format: 29.7.0 + slash: 3.0.0 + stack-utils: 2.0.6 + dev: true + + /jest-mock@29.7.0: + resolution: {integrity: sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.6.3 + '@types/node': 18.15.5 + jest-util: 29.7.0 + dev: true + + /jest-pnp-resolver@1.2.3(jest-resolve@29.7.0): + resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} + engines: {node: '>=6'} + peerDependencies: + jest-resolve: '*' + peerDependenciesMeta: + jest-resolve: + optional: true + dependencies: + jest-resolve: 29.7.0 + dev: true + + /jest-regex-util@29.6.3: + resolution: {integrity: sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dev: true + + /jest-resolve-dependencies@29.7.0: + resolution: {integrity: sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + jest-regex-util: 29.6.3 + jest-snapshot: 29.7.0 + transitivePeerDependencies: + - supports-color + dev: true + + /jest-resolve@29.7.0: + resolution: {integrity: sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + chalk: 4.1.2 + graceful-fs: 4.2.11 + jest-haste-map: 29.7.0 + jest-pnp-resolver: 1.2.3(jest-resolve@29.7.0) + jest-util: 29.7.0 + jest-validate: 29.7.0 + resolve: 1.22.8 + resolve.exports: 2.0.2 + slash: 3.0.0 + dev: true + + /jest-runner@29.7.0: + resolution: {integrity: sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/console': 29.7.0 + '@jest/environment': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 18.19.5 + chalk: 4.1.2 + emittery: 0.13.1 + graceful-fs: 4.2.11 + jest-docblock: 29.7.0 + jest-environment-node: 29.7.0 + jest-haste-map: 29.7.0 + jest-leak-detector: 29.7.0 + jest-message-util: 29.7.0 + jest-resolve: 29.7.0 + jest-runtime: 29.7.0 + jest-util: 29.7.0 + jest-watcher: 29.7.0 + jest-worker: 29.7.0 + p-limit: 3.1.0 + source-map-support: 0.5.13 + transitivePeerDependencies: + - supports-color + dev: true + + /jest-runtime@29.7.0: + resolution: {integrity: sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/environment': 29.7.0 + '@jest/fake-timers': 29.7.0 + '@jest/globals': 29.7.0 + '@jest/source-map': 29.6.3 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 18.19.5 + chalk: 4.1.2 + cjs-module-lexer: 1.2.3 + collect-v8-coverage: 1.0.2 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-haste-map: 29.7.0 + jest-message-util: 29.7.0 + jest-mock: 29.7.0 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-snapshot: 29.7.0 + jest-util: 29.7.0 + slash: 3.0.0 + strip-bom: 4.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /jest-snapshot@29.7.0: + resolution: {integrity: sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@babel/core': 7.23.7 + '@babel/generator': 7.23.6 + '@babel/plugin-syntax-jsx': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-syntax-typescript': 7.23.3(@babel/core@7.23.7) + '@babel/types': 7.23.6 + '@jest/expect-utils': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.23.7) + chalk: 4.1.2 + expect: 29.7.0 + graceful-fs: 4.2.11 + jest-diff: 29.7.0 + jest-get-type: 29.6.3 + jest-matcher-utils: 29.7.0 + jest-message-util: 29.7.0 + jest-util: 29.7.0 + natural-compare: 1.4.0 + pretty-format: 29.7.0 + semver: 7.5.4 + transitivePeerDependencies: + - supports-color + dev: true + + /jest-util@29.7.0: + resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.6.3 + '@types/node': 18.19.5 + chalk: 4.1.2 + ci-info: 3.9.0 + graceful-fs: 4.2.11 + picomatch: 2.3.1 + dev: true + + /jest-validate@29.7.0: + resolution: {integrity: sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.6.3 + camelcase: 6.3.0 + chalk: 4.1.2 + jest-get-type: 29.6.3 + leven: 3.1.0 + pretty-format: 29.7.0 + dev: true + + /jest-watcher@29.7.0: + resolution: {integrity: sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/test-result': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 18.19.5 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + emittery: 0.13.1 + jest-util: 29.7.0 + string-length: 4.0.2 + dev: true + + /jest-worker@29.7.0: + resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@types/node': 18.19.5 + jest-util: 29.7.0 + merge-stream: 2.0.0 + supports-color: 8.1.1 + dev: true + + /jest@29.7.0(@types/node@18.15.5): + resolution: {integrity: sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/core': 29.7.0 + '@jest/types': 29.6.3 + import-local: 3.1.0 + jest-cli: 29.7.0(@types/node@18.15.5) + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + dev: true + + /jiti@1.21.0: + resolution: {integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==} + + /jose@4.14.4: + resolution: {integrity: sha512-j8GhLiKmUAh+dsFXlX1aJCbt5KMibuKb+d7j1JaOJG6s2UjX1PQlW+OKB/sD4a/5ZYF4RcmYmLSndOoU3Lt/3g==} + dev: false + + /js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + /js-yaml@3.14.1: + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + dev: true + + /js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + dependencies: + argparse: 2.0.1 + dev: true + + /jsbn@0.1.1: + resolution: {integrity: sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==} + dev: true + + /jsesc@2.5.2: + resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} + engines: {node: '>=4'} + + /json-parse-better-errors@1.0.2: + resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} + dev: true + + /json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + dev: true + + /json-schema-ref-parser@9.0.9: + resolution: {integrity: sha512-qcP2lmGy+JUoQJ4DOQeLaZDqH9qSkeGCK3suKWxJXS82dg728Mn3j97azDMaOUmJAN4uCq91LdPx4K7E8F1a7Q==} + engines: {node: '>=10'} + dependencies: + '@apidevtools/json-schema-ref-parser': 9.0.9 + dev: true + + /json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + dev: true + + /json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + dev: true + + /json-schema@0.4.0: + resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} + dev: true + + /json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + dev: true + + /json-stringify-safe@5.0.1: + resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} + dev: true + + /json5@1.0.2: + resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} + dependencies: + minimist: 1.2.8 + dev: true + + /json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + + /jsonfile@6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + dev: true + + /jsonparse@1.3.1: + resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} + engines: {'0': node >= 0.2.0} + dev: true + + /jsprim@2.0.2: + resolution: {integrity: sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ==} + engines: {'0': node >=0.6.0} + dependencies: + assert-plus: 1.0.0 + extsprintf: 1.3.0 + json-schema: 0.4.0 + verror: 1.10.0 + dev: true + + /jsx-ast-utils@3.3.3: + resolution: {integrity: sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw==} + engines: {node: '>=4.0'} + dependencies: + array-includes: 3.1.7 + object.assign: 4.1.4 + dev: true + + /kdbush@3.0.0: + resolution: {integrity: sha512-hRkd6/XW4HTsA9vjVpY9tuXJYLSlelnkTmVFu4M9/7MIYQtFcHpbugAU7UbOfjOiVSVYl2fqgBuJ32JUmRo5Ew==} + dev: true + + /kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + dev: true + + /kleur@3.0.3: + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} + engines: {node: '>=6'} + dev: true + + /kleur@4.1.5: + resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} + engines: {node: '>=6'} + dev: false + + /knuth-shuffle-seeded@1.0.6: + resolution: {integrity: sha512-9pFH0SplrfyKyojCLxZfMcvkhf5hH0d+UwR9nTVJ/DDQJGuzcXjTwB7TP7sDfehSudlGGaOLblmEWqv04ERVWg==} + dependencies: + seed-random: 2.2.0 + dev: true + + /language-subtag-registry@0.3.22: + resolution: {integrity: sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==} + dev: true + + /language-tags@1.0.5: + resolution: {integrity: sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ==} + dependencies: + language-subtag-registry: 0.3.22 + dev: true + + /lazy-ass@1.6.0: + resolution: {integrity: sha512-cc8oEVoctTvsFZ/Oje/kGnHbpWHYBe8IAJe4C0QNc3t8uM/0Y8+erSz/7Y1ALuXTEZTMvxXwO6YbX1ey3ujiZw==} + engines: {node: '> 0.8'} + dev: true + + /leven@3.1.0: + resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} + engines: {node: '>=6'} + dev: true + + /levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + dev: true + + /lilconfig@2.1.0: + resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} + engines: {node: '>=10'} + + /lilconfig@3.0.0: + resolution: {integrity: sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g==} + engines: {node: '>=14'} + + /lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + /listr2@3.14.0(enquirer@2.4.1): + resolution: {integrity: sha512-TyWI8G99GX9GjE54cJ+RrNMcIFBfwMPxc3XTFiAYGN4s10hWROGtOg7+O6u6LE3mNkyld7RSLE6nrKBvTfcs3g==} + engines: {node: '>=10.0.0'} + peerDependencies: + enquirer: '>= 2.3.0 < 3' + peerDependenciesMeta: + enquirer: + optional: true + dependencies: + cli-truncate: 2.1.0 + colorette: 2.0.20 + enquirer: 2.4.1 + log-update: 4.0.0 + p-map: 4.0.0 + rfdc: 1.3.0 + rxjs: 7.8.1 + through: 2.3.8 + wrap-ansi: 7.0.0 + dev: true + + /load-json-file@4.0.0: + resolution: {integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==} + engines: {node: '>=4'} + dependencies: + graceful-fs: 4.2.11 + parse-json: 4.0.0 + pify: 3.0.0 + strip-bom: 3.0.0 + dev: true + + /locate-path@2.0.0: + resolution: {integrity: sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==} + engines: {node: '>=4'} + dependencies: + p-locate: 2.0.0 + path-exists: 3.0.0 + dev: true + + /locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + dependencies: + p-locate: 4.1.0 + dev: true + + /locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + dependencies: + p-locate: 5.0.0 + dev: true + + /lodash-es@4.17.21: + resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} + + /lodash.camelcase@4.3.0: + resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + dev: true + + /lodash.capitalize@4.2.1: + resolution: {integrity: sha512-kZzYOKspf8XVX5AvmQF94gQW0lejFVgb80G85bU4ZWzoJ6C03PQg3coYAUpSTpQWelrZELd3XWgHzw4Ck5kaIw==} + dev: true + + /lodash.castarray@4.4.0: + resolution: {integrity: sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==} + dev: false + + /lodash.escaperegexp@4.1.2: + resolution: {integrity: sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==} + dev: true + + /lodash.isfunction@3.0.9: + resolution: {integrity: sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==} + dev: true + + /lodash.isplainobject@4.0.6: + resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} + + /lodash.isstring@4.0.1: + resolution: {integrity: sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==} + dev: true + + /lodash.kebabcase@4.1.1: + resolution: {integrity: sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==} + dev: true + + /lodash.memoize@4.1.2: + resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} + dev: true + + /lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + /lodash.mergewith@4.6.2: + resolution: {integrity: sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==} + dev: true + + /lodash.once@4.1.1: + resolution: {integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==} + dev: true + + /lodash.snakecase@4.1.1: + resolution: {integrity: sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==} + dev: true + + /lodash.startcase@4.4.0: + resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} + dev: true + + /lodash.uniq@4.5.0: + resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} + dev: true + + /lodash.uniqby@4.7.0: + resolution: {integrity: sha512-e/zcLx6CSbmaEgFHCA7BnoQKyCtKMxnuWrJygbwPs/AIn+IMKl66L8/s+wBUn5LRw2pZx3bUHibiV1b6aTWIww==} + dev: true + + /lodash.upperfirst@4.3.1: + resolution: {integrity: sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==} + dev: true + + /lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + /log-symbols@4.1.0: + resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} + engines: {node: '>=10'} + dependencies: + chalk: 4.1.2 + is-unicode-supported: 0.1.0 + dev: true + + /log-update@4.0.0: + resolution: {integrity: sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==} + engines: {node: '>=10'} + dependencies: + ansi-escapes: 4.3.2 + cli-cursor: 3.1.0 + slice-ansi: 4.0.0 + wrap-ansi: 6.2.0 + dev: true + + /longest-streak@3.1.0: + resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} + dev: false + + /loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + dependencies: + js-tokens: 4.0.0 + + /lower-case@2.0.2: + resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} + dependencies: + tslib: 2.5.0 + dev: true + + /lowlight@1.20.0: + resolution: {integrity: sha512-8Ktj+prEb1RoCPkEOrPMYUN/nCggB7qAWe3a7OpMjWQkh3l2RD5wKRQ+o8Q8YuI9RG/xs95waaI/E6ym/7NsTw==} + dependencies: + fault: 1.0.4 + highlight.js: 10.7.3 + dev: false + + /lru-cache@10.1.0: + resolution: {integrity: sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==} + engines: {node: 14 || >=16.14} + dev: true + + /lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + dependencies: + yallist: 3.1.1 + + /lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + dependencies: + yallist: 4.0.0 + + /luxon@3.2.1: + resolution: {integrity: sha512-QrwPArQCNLAKGO/C+ZIilgIuDnEnKx5QYODdDtbFaxzsbZcc/a7WFq7MhsVYgRlwawLtvOUESTlfJ+hc/USqPg==} + engines: {node: '>=12'} + dev: true + + /make-dir@4.0.0: + resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} + engines: {node: '>=10'} + dependencies: + semver: 7.5.4 + dev: true + + /make-error@1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + dev: true + + /makeerror@1.0.12: + resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} + dependencies: + tmpl: 1.0.5 + dev: true + + /map-limit@0.0.1: + resolution: {integrity: sha512-pJpcfLPnIF/Sk3taPW21G/RQsEEirGaFpCW3oXRwH9dnFHPHNGjNyvh++rdmC2fNqEaTw2MhYJraoJWAHx8kEg==} + dependencies: + once: 1.3.3 + dev: true + + /map-obj@1.0.1: + resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} + engines: {node: '>=0.10.0'} + dev: true + + /map-obj@4.3.0: + resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} + engines: {node: '>=8'} + dev: true + + /mapbox-gl@1.10.1: + resolution: {integrity: sha512-0aHt+lFUpYfvh0kMIqXqNXqoYMuhuAsMlw87TbhWrw78Tx2zfuPI0Lx31/YPUgJ+Ire0tzQ4JnuBL7acDNXmMg==} + engines: {node: '>=6.4.0'} + dependencies: + '@mapbox/geojson-rewind': 0.5.2 + '@mapbox/geojson-types': 1.0.2 + '@mapbox/jsonlint-lines-primitives': 2.0.2 + '@mapbox/mapbox-gl-supported': 1.5.0(mapbox-gl@1.10.1) + '@mapbox/point-geometry': 0.1.0 + '@mapbox/tiny-sdf': 1.2.5 + '@mapbox/unitbezier': 0.0.0 + '@mapbox/vector-tile': 1.3.1 + '@mapbox/whoots-js': 3.1.0 + csscolorparser: 1.0.3 + earcut: 2.2.4 + geojson-vt: 3.2.1 + gl-matrix: 3.4.3 + grid-index: 1.1.0 + minimist: 1.2.8 + murmurhash-js: 1.0.0 + pbf: 3.2.1 + potpack: 1.0.2 + quickselect: 2.0.0 + rw: 1.3.3 + supercluster: 7.1.5 + tinyqueue: 2.0.3 + vt-pbf: 3.1.3 + dev: true + + /markdown-table@3.0.3: + resolution: {integrity: sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==} + dev: false + + /marked-terminal@6.2.0(marked@9.1.6): + resolution: {integrity: sha512-ubWhwcBFHnXsjYNsu+Wndpg0zhY4CahSpPlA70PlO0rR9r2sZpkyU+rkCsOWH+KMEkx847UpALON+HWgxowFtw==} + engines: {node: '>=16.0.0'} + peerDependencies: + marked: '>=1 <12' + dependencies: + ansi-escapes: 6.2.0 + cardinal: 2.1.1 + chalk: 5.3.0 + cli-table3: 0.6.3 + marked: 9.1.6 + node-emoji: 2.1.3 + supports-hyperlinks: 3.0.0 + dev: true + + /marked@9.1.6: + resolution: {integrity: sha512-jcByLnIFkd5gSXZmjNvS1TlmRhCXZjIzHYlaGkPlLIekG55JDR2Z4va9tZwCiP+/RDERiNhMOFu01xd6O5ct1Q==} + engines: {node: '>= 16'} + dev: true + + /math-log2@1.0.1: + resolution: {integrity: sha512-9W0yGtkaMAkf74XGYVy4Dqw3YUMnTNB2eeiw9aQbUl4A3KmuCEHTt2DgAB07ENzOYAjsYSAYufkAq0Zd+jU7zA==} + engines: {node: '>=0.10.0'} + dev: true + + /md5@2.3.0: + resolution: {integrity: sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==} + dependencies: + charenc: 0.0.2 + crypt: 0.0.2 + is-buffer: 1.1.6 + dev: false + + /mdast-util-definitions@5.1.2: + resolution: {integrity: sha512-8SVPMuHqlPME/z3gqVwWY4zVXn8lqKv/pAhC57FuJ40ImXyBpmO5ukh98zB2v7Blql2FiHjHv9LVztSIqjY+MA==} + dependencies: + '@types/mdast': 3.0.11 + '@types/unist': 2.0.6 + unist-util-visit: 4.1.2 + dev: false + + /mdast-util-find-and-replace@2.2.2: + resolution: {integrity: sha512-MTtdFRz/eMDHXzeK6W3dO7mXUlF82Gom4y0oOgvHhh/HXZAGvIQDUvQ0SuUx+j2tv44b8xTHOm8K/9OoRFnXKw==} + dependencies: + '@types/mdast': 3.0.11 + escape-string-regexp: 5.0.0 + unist-util-is: 5.2.1 + unist-util-visit-parents: 5.1.3 + dev: false + + /mdast-util-from-markdown@1.3.0: + resolution: {integrity: sha512-HN3W1gRIuN/ZW295c7zi7g9lVBllMgZE40RxCX37wrTPWXCWtpvOZdfnuK+1WNpvZje6XuJeI3Wnb4TJEUem+g==} + dependencies: + '@types/mdast': 3.0.11 + '@types/unist': 2.0.6 + decode-named-character-reference: 1.0.2 + mdast-util-to-string: 3.2.0 + micromark: 3.1.0 + micromark-util-decode-numeric-character-reference: 1.0.0 + micromark-util-decode-string: 1.0.2 + micromark-util-normalize-identifier: 1.0.0 + micromark-util-symbol: 1.0.1 + micromark-util-types: 1.0.2 + unist-util-stringify-position: 3.0.3 + uvu: 0.5.6 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-gfm-autolink-literal@1.0.3: + resolution: {integrity: sha512-My8KJ57FYEy2W2LyNom4n3E7hKTuQk/0SES0u16tjA9Z3oFkF4RrC/hPAPgjlSpezsOvI8ObcXcElo92wn5IGA==} + dependencies: + '@types/mdast': 3.0.11 + ccount: 2.0.1 + mdast-util-find-and-replace: 2.2.2 + micromark-util-character: 1.1.0 + dev: false + + /mdast-util-gfm-footnote@1.0.2: + resolution: {integrity: sha512-56D19KOGbE00uKVj3sgIykpwKL179QsVFwx/DCW0u/0+URsryacI4MAdNJl0dh+u2PSsD9FtxPFbHCzJ78qJFQ==} + dependencies: + '@types/mdast': 3.0.11 + mdast-util-to-markdown: 1.5.0 + micromark-util-normalize-identifier: 1.0.0 + dev: false + + /mdast-util-gfm-strikethrough@1.0.3: + resolution: {integrity: sha512-DAPhYzTYrRcXdMjUtUjKvW9z/FNAMTdU0ORyMcbmkwYNbKocDpdk+PX1L1dQgOID/+vVs1uBQ7ElrBQfZ0cuiQ==} + dependencies: + '@types/mdast': 3.0.11 + mdast-util-to-markdown: 1.5.0 + dev: false + + /mdast-util-gfm-table@1.0.7: + resolution: {integrity: sha512-jjcpmNnQvrmN5Vx7y7lEc2iIOEytYv7rTvu+MeyAsSHTASGCCRA79Igg2uKssgOs1i1po8s3plW0sTu1wkkLGg==} + dependencies: + '@types/mdast': 3.0.11 + markdown-table: 3.0.3 + mdast-util-from-markdown: 1.3.0 + mdast-util-to-markdown: 1.5.0 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-gfm-task-list-item@1.0.2: + resolution: {integrity: sha512-PFTA1gzfp1B1UaiJVyhJZA1rm0+Tzn690frc/L8vNX1Jop4STZgOE6bxUhnzdVSB+vm2GU1tIsuQcA9bxTQpMQ==} + dependencies: + '@types/mdast': 3.0.11 + mdast-util-to-markdown: 1.5.0 + dev: false + + /mdast-util-gfm@2.0.2: + resolution: {integrity: sha512-qvZ608nBppZ4icQlhQQIAdc6S3Ffj9RGmzwUKUWuEICFnd1LVkN3EktF7ZHAgfcEdvZB5owU9tQgt99e2TlLjg==} + dependencies: + mdast-util-from-markdown: 1.3.0 + mdast-util-gfm-autolink-literal: 1.0.3 + mdast-util-gfm-footnote: 1.0.2 + mdast-util-gfm-strikethrough: 1.0.3 + mdast-util-gfm-table: 1.0.7 + mdast-util-gfm-task-list-item: 1.0.2 + mdast-util-to-markdown: 1.5.0 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-phrasing@3.0.1: + resolution: {integrity: sha512-WmI1gTXUBJo4/ZmSk79Wcb2HcjPJBzM1nlI/OUWA8yk2X9ik3ffNbBGsU+09BFmXaL1IBb9fiuvq6/KMiNycSg==} + dependencies: + '@types/mdast': 3.0.11 + unist-util-is: 5.2.1 + dev: false + + /mdast-util-to-hast@12.3.0: + resolution: {integrity: sha512-pits93r8PhnIoU4Vy9bjW39M2jJ6/tdHyja9rrot9uujkN7UTU9SDnE6WNJz/IGyQk3XHX6yNNtrBH6cQzm8Hw==} + dependencies: + '@types/hast': 2.3.4 + '@types/mdast': 3.0.11 + mdast-util-definitions: 5.1.2 + micromark-util-sanitize-uri: 1.1.0 + trim-lines: 3.0.1 + unist-util-generated: 2.0.1 + unist-util-position: 4.0.4 + unist-util-visit: 4.1.2 + dev: false + + /mdast-util-to-markdown@1.5.0: + resolution: {integrity: sha512-bbv7TPv/WC49thZPg3jXuqzuvI45IL2EVAr/KxF0BSdHsU0ceFHOmwQn6evxAh1GaoK/6GQ1wp4R4oW2+LFL/A==} + dependencies: + '@types/mdast': 3.0.11 + '@types/unist': 2.0.6 + longest-streak: 3.1.0 + mdast-util-phrasing: 3.0.1 + mdast-util-to-string: 3.2.0 + micromark-util-decode-string: 1.0.2 + unist-util-visit: 4.1.2 + zwitch: 2.0.4 + dev: false + + /mdast-util-to-string@3.2.0: + resolution: {integrity: sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==} + dependencies: + '@types/mdast': 3.0.11 + dev: false + + /meow@12.1.1: + resolution: {integrity: sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==} + engines: {node: '>=16.10'} + dev: true + + /meow@8.1.2: + resolution: {integrity: sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==} + engines: {node: '>=10'} + dependencies: + '@types/minimist': 1.2.5 + camelcase-keys: 6.2.2 + decamelize-keys: 1.1.1 + hard-rejection: 2.1.0 + minimist-options: 4.1.0 + normalize-package-data: 3.0.3 + read-pkg-up: 7.0.1 + redent: 3.0.0 + trim-newlines: 3.0.1 + type-fest: 0.18.1 + yargs-parser: 20.2.9 + dev: true + + /merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + dev: true + + /merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + /micromark-core-commonmark@1.0.6: + resolution: {integrity: sha512-K+PkJTxqjFfSNkfAhp4GB+cZPfQd6dxtTXnf+RjZOV7T4EEXnvgzOcnp+eSTmpGk9d1S9sL6/lqrgSNn/s0HZA==} + dependencies: + decode-named-character-reference: 1.0.2 + micromark-factory-destination: 1.0.0 + micromark-factory-label: 1.0.2 + micromark-factory-space: 1.0.0 + micromark-factory-title: 1.0.2 + micromark-factory-whitespace: 1.0.0 + micromark-util-character: 1.1.0 + micromark-util-chunked: 1.0.0 + micromark-util-classify-character: 1.0.0 + micromark-util-html-tag-name: 1.1.0 + micromark-util-normalize-identifier: 1.0.0 + micromark-util-resolve-all: 1.0.0 + micromark-util-subtokenize: 1.0.2 + micromark-util-symbol: 1.0.1 + micromark-util-types: 1.0.2 + uvu: 0.5.6 + dev: false + + /micromark-extension-gfm-autolink-literal@1.0.4: + resolution: {integrity: sha512-WCssN+M9rUyfHN5zPBn3/f0mIA7tqArHL/EKbv3CZK+LT2rG77FEikIQEqBkv46fOqXQK4NEW/Pc7Z27gshpeg==} + dependencies: + micromark-util-character: 1.1.0 + micromark-util-sanitize-uri: 1.1.0 + micromark-util-symbol: 1.0.1 + micromark-util-types: 1.0.2 + dev: false + + /micromark-extension-gfm-footnote@1.1.0: + resolution: {integrity: sha512-RWYce7j8+c0n7Djzv5NzGEGitNNYO3uj+h/XYMdS/JinH1Go+/Qkomg/rfxExFzYTiydaV6GLeffGO5qcJbMPA==} + dependencies: + micromark-core-commonmark: 1.0.6 + micromark-factory-space: 1.0.0 + micromark-util-character: 1.1.0 + micromark-util-normalize-identifier: 1.0.0 + micromark-util-sanitize-uri: 1.1.0 + micromark-util-symbol: 1.0.1 + micromark-util-types: 1.0.2 + uvu: 0.5.6 + dev: false + + /micromark-extension-gfm-strikethrough@1.0.5: + resolution: {integrity: sha512-X0oI5eYYQVARhiNfbETy7BfLSmSilzN1eOuoRnrf9oUNsPRrWOAe9UqSizgw1vNxQBfOwL+n2610S3bYjVNi7w==} + dependencies: + micromark-util-chunked: 1.0.0 + micromark-util-classify-character: 1.0.0 + micromark-util-resolve-all: 1.0.0 + micromark-util-symbol: 1.0.1 + micromark-util-types: 1.0.2 + uvu: 0.5.6 + dev: false + + /micromark-extension-gfm-table@1.0.5: + resolution: {integrity: sha512-xAZ8J1X9W9K3JTJTUL7G6wSKhp2ZYHrFk5qJgY/4B33scJzE2kpfRL6oiw/veJTbt7jiM/1rngLlOKPWr1G+vg==} + dependencies: + micromark-factory-space: 1.0.0 + micromark-util-character: 1.1.0 + micromark-util-symbol: 1.0.1 + micromark-util-types: 1.0.2 + uvu: 0.5.6 + dev: false + + /micromark-extension-gfm-tagfilter@1.0.2: + resolution: {integrity: sha512-5XWB9GbAUSHTn8VPU8/1DBXMuKYT5uOgEjJb8gN3mW0PNW5OPHpSdojoqf+iq1xo7vWzw/P8bAHY0n6ijpXF7g==} + dependencies: + micromark-util-types: 1.0.2 + dev: false + + /micromark-extension-gfm-task-list-item@1.0.4: + resolution: {integrity: sha512-9XlIUUVnYXHsFF2HZ9jby4h3npfX10S1coXTnV035QGPgrtNYQq3J6IfIvcCIUAJrrqBVi5BqA/LmaOMJqPwMQ==} + dependencies: + micromark-factory-space: 1.0.0 + micromark-util-character: 1.1.0 + micromark-util-symbol: 1.0.1 + micromark-util-types: 1.0.2 + uvu: 0.5.6 + dev: false + + /micromark-extension-gfm@2.0.1: + resolution: {integrity: sha512-p2sGjajLa0iYiGQdT0oelahRYtMWvLjy8J9LOCxzIQsllMCGLbsLW+Nc+N4vi02jcRJvedVJ68cjelKIO6bpDA==} + dependencies: + micromark-extension-gfm-autolink-literal: 1.0.4 + micromark-extension-gfm-footnote: 1.1.0 + micromark-extension-gfm-strikethrough: 1.0.5 + micromark-extension-gfm-table: 1.0.5 + micromark-extension-gfm-tagfilter: 1.0.2 + micromark-extension-gfm-task-list-item: 1.0.4 + micromark-util-combine-extensions: 1.0.0 + micromark-util-types: 1.0.2 + dev: false + + /micromark-factory-destination@1.0.0: + resolution: {integrity: sha512-eUBA7Rs1/xtTVun9TmV3gjfPz2wEwgK5R5xcbIM5ZYAtvGF6JkyaDsj0agx8urXnO31tEO6Ug83iVH3tdedLnw==} + dependencies: + micromark-util-character: 1.1.0 + micromark-util-symbol: 1.0.1 + micromark-util-types: 1.0.2 + dev: false + + /micromark-factory-label@1.0.2: + resolution: {integrity: sha512-CTIwxlOnU7dEshXDQ+dsr2n+yxpP0+fn271pu0bwDIS8uqfFcumXpj5mLn3hSC8iw2MUr6Gx8EcKng1dD7i6hg==} + dependencies: + micromark-util-character: 1.1.0 + micromark-util-symbol: 1.0.1 + micromark-util-types: 1.0.2 + uvu: 0.5.6 + dev: false + + /micromark-factory-space@1.0.0: + resolution: {integrity: sha512-qUmqs4kj9a5yBnk3JMLyjtWYN6Mzfcx8uJfi5XAveBniDevmZasdGBba5b4QsvRcAkmvGo5ACmSUmyGiKTLZew==} + dependencies: + micromark-util-character: 1.1.0 + micromark-util-types: 1.0.2 + dev: false + + /micromark-factory-title@1.0.2: + resolution: {integrity: sha512-zily+Nr4yFqgMGRKLpTVsNl5L4PMu485fGFDOQJQBl2NFpjGte1e86zC0da93wf97jrc4+2G2GQudFMHn3IX+A==} + dependencies: + micromark-factory-space: 1.0.0 + micromark-util-character: 1.1.0 + micromark-util-symbol: 1.0.1 + micromark-util-types: 1.0.2 + uvu: 0.5.6 + dev: false + + /micromark-factory-whitespace@1.0.0: + resolution: {integrity: sha512-Qx7uEyahU1lt1RnsECBiuEbfr9INjQTGa6Err+gF3g0Tx4YEviPbqqGKNv/NrBaE7dVHdn1bVZKM/n5I/Bak7A==} + dependencies: + micromark-factory-space: 1.0.0 + micromark-util-character: 1.1.0 + micromark-util-symbol: 1.0.1 + micromark-util-types: 1.0.2 + dev: false + + /micromark-util-character@1.1.0: + resolution: {integrity: sha512-agJ5B3unGNJ9rJvADMJ5ZiYjBRyDpzKAOk01Kpi1TKhlT1APx3XZk6eN7RtSz1erbWHC2L8T3xLZ81wdtGRZzg==} + dependencies: + micromark-util-symbol: 1.0.1 + micromark-util-types: 1.0.2 + dev: false + + /micromark-util-chunked@1.0.0: + resolution: {integrity: sha512-5e8xTis5tEZKgesfbQMKRCyzvffRRUX+lK/y+DvsMFdabAicPkkZV6gO+FEWi9RfuKKoxxPwNL+dFF0SMImc1g==} + dependencies: + micromark-util-symbol: 1.0.1 + dev: false + + /micromark-util-classify-character@1.0.0: + resolution: {integrity: sha512-F8oW2KKrQRb3vS5ud5HIqBVkCqQi224Nm55o5wYLzY/9PwHGXC01tr3d7+TqHHz6zrKQ72Okwtvm/xQm6OVNZA==} + dependencies: + micromark-util-character: 1.1.0 + micromark-util-symbol: 1.0.1 + micromark-util-types: 1.0.2 + dev: false + + /micromark-util-combine-extensions@1.0.0: + resolution: {integrity: sha512-J8H058vFBdo/6+AsjHp2NF7AJ02SZtWaVUjsayNFeAiydTxUwViQPxN0Hf8dp4FmCQi0UUFovFsEyRSUmFH3MA==} + dependencies: + micromark-util-chunked: 1.0.0 + micromark-util-types: 1.0.2 + dev: false + + /micromark-util-decode-numeric-character-reference@1.0.0: + resolution: {integrity: sha512-OzO9AI5VUtrTD7KSdagf4MWgHMtET17Ua1fIpXTpuhclCqD8egFWo85GxSGvxgkGS74bEahvtM0WP0HjvV0e4w==} + dependencies: + micromark-util-symbol: 1.0.1 + dev: false + + /micromark-util-decode-string@1.0.2: + resolution: {integrity: sha512-DLT5Ho02qr6QWVNYbRZ3RYOSSWWFuH3tJexd3dgN1odEuPNxCngTCXJum7+ViRAd9BbdxCvMToPOD/IvVhzG6Q==} + dependencies: + decode-named-character-reference: 1.0.2 + micromark-util-character: 1.1.0 + micromark-util-decode-numeric-character-reference: 1.0.0 + micromark-util-symbol: 1.0.1 + dev: false + + /micromark-util-encode@1.0.1: + resolution: {integrity: sha512-U2s5YdnAYexjKDel31SVMPbfi+eF8y1U4pfiRW/Y8EFVCy/vgxk/2wWTxzcqE71LHtCuCzlBDRU2a5CQ5j+mQA==} + dev: false + + /micromark-util-html-tag-name@1.1.0: + resolution: {integrity: sha512-BKlClMmYROy9UiV03SwNmckkjn8QHVaWkqoAqzivabvdGcwNGMMMH/5szAnywmsTBUzDsU57/mFi0sp4BQO6dA==} + dev: false + + /micromark-util-normalize-identifier@1.0.0: + resolution: {integrity: sha512-yg+zrL14bBTFrQ7n35CmByWUTFsgst5JhA4gJYoty4Dqzj4Z4Fr/DHekSS5aLfH9bdlfnSvKAWsAgJhIbogyBg==} + dependencies: + micromark-util-symbol: 1.0.1 + dev: false + + /micromark-util-resolve-all@1.0.0: + resolution: {integrity: sha512-CB/AGk98u50k42kvgaMM94wzBqozSzDDaonKU7P7jwQIuH2RU0TeBqGYJz2WY1UdihhjweivStrJ2JdkdEmcfw==} + dependencies: + micromark-util-types: 1.0.2 + dev: false + + /micromark-util-sanitize-uri@1.1.0: + resolution: {integrity: sha512-RoxtuSCX6sUNtxhbmsEFQfWzs8VN7cTctmBPvYivo98xb/kDEoTCtJQX5wyzIYEmk/lvNFTat4hL8oW0KndFpg==} + dependencies: + micromark-util-character: 1.1.0 + micromark-util-encode: 1.0.1 + micromark-util-symbol: 1.0.1 + dev: false + + /micromark-util-subtokenize@1.0.2: + resolution: {integrity: sha512-d90uqCnXp/cy4G881Ub4psE57Sf8YD0pim9QdjCRNjfas2M1u6Lbt+XZK9gnHL2XFhnozZiEdCa9CNfXSfQ6xA==} + dependencies: + micromark-util-chunked: 1.0.0 + micromark-util-symbol: 1.0.1 + micromark-util-types: 1.0.2 + uvu: 0.5.6 + dev: false + + /micromark-util-symbol@1.0.1: + resolution: {integrity: sha512-oKDEMK2u5qqAptasDAwWDXq0tG9AssVwAx3E9bBF3t/shRIGsWIRG+cGafs2p/SnDSOecnt6hZPCE2o6lHfFmQ==} + dev: false + + /micromark-util-types@1.0.2: + resolution: {integrity: sha512-DCfg/T8fcrhrRKTPjRrw/5LLvdGV7BHySf/1LOZx7TzWZdYRjogNtyNq885z3nNallwr3QUKARjqvHqX1/7t+w==} + dev: false + + /micromark@3.1.0: + resolution: {integrity: sha512-6Mj0yHLdUZjHnOPgr5xfWIMqMWS12zDN6iws9SLuSz76W8jTtAv24MN4/CL7gJrl5vtxGInkkqDv/JIoRsQOvA==} + dependencies: + '@types/debug': 4.1.7 + debug: 4.3.4(supports-color@5.5.0) + decode-named-character-reference: 1.0.2 + micromark-core-commonmark: 1.0.6 + micromark-factory-space: 1.0.0 + micromark-util-character: 1.1.0 + micromark-util-chunked: 1.0.0 + micromark-util-combine-extensions: 1.0.0 + micromark-util-decode-numeric-character-reference: 1.0.0 + micromark-util-encode: 1.0.1 + micromark-util-normalize-identifier: 1.0.0 + micromark-util-resolve-all: 1.0.0 + micromark-util-sanitize-uri: 1.1.0 + micromark-util-subtokenize: 1.0.2 + micromark-util-symbol: 1.0.1 + micromark-util-types: 1.0.2 + uvu: 0.5.6 + transitivePeerDependencies: + - supports-color + dev: false + + /micromatch@4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} + dependencies: + braces: 3.0.2 + picomatch: 2.3.1 + + /mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + /mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + dependencies: + mime-db: 1.52.0 + + /mime@4.0.1: + resolution: {integrity: sha512-5lZ5tyrIfliMXzFtkYyekWbtRXObT9OWa8IwQ5uxTBDHucNNwniRqo0yInflj+iYi5CBa6qxadGzGarDfuEOxA==} + engines: {node: '>=16'} + dev: true + + /mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + dev: true + + /mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} + dev: true + + /min-indent@1.0.1: + resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} + engines: {node: '>=4'} + dev: true + + /minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + dependencies: + brace-expansion: 1.1.11 + + /minimatch@5.0.1: + resolution: {integrity: sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==} + engines: {node: '>=10'} + dependencies: + brace-expansion: 2.0.1 + dev: true + + /minimatch@9.0.3: + resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + brace-expansion: 2.0.1 + dev: true + + /minimist-options@4.1.0: + resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} + engines: {node: '>= 6'} + dependencies: + arrify: 1.0.1 + is-plain-obj: 1.1.0 + kind-of: 6.0.3 + dev: true + + /minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + dev: true + + /minipass@7.0.4: + resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} + engines: {node: '>=16 || 14 >=14.17'} + dev: true + + /mkdirp@2.1.6: + resolution: {integrity: sha512-+hEnITedc8LAtIP9u3HJDFIdcLV2vXP33sqLLIzkv1Db1zO/1OxbvYf0Y1OC/S/Qo5dxHXepofhmxL02PsKe+A==} + engines: {node: '>=10'} + dev: true + + /mocha@10.2.0: + resolution: {integrity: sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==} + engines: {node: '>= 14.0.0'} + dependencies: + ansi-colors: 4.1.1 + browser-stdout: 1.3.1 + chokidar: 3.5.3 + debug: 4.3.4(supports-color@8.1.1) + diff: 5.0.0 + escape-string-regexp: 4.0.0 + find-up: 5.0.0 + glob: 7.2.0 + he: 1.2.0 + js-yaml: 4.1.0 + log-symbols: 4.1.0 + minimatch: 5.0.1 + ms: 2.1.3 + nanoid: 3.3.3 + serialize-javascript: 6.0.0 + strip-json-comments: 3.1.1 + supports-color: 8.1.1 + workerpool: 6.2.1 + yargs: 16.2.0 + yargs-parser: 20.2.4 + yargs-unparser: 2.0.0 + dev: true + + /mouse-change@1.4.0: + resolution: {integrity: sha512-vpN0s+zLL2ykyyUDh+fayu9Xkor5v/zRD9jhSqjRS1cJTGS0+oakVZzNm5n19JvvEj0you+MXlYTpNxUDQUjkQ==} + dependencies: + mouse-event: 1.0.5 + dev: true + + /mouse-event-offset@3.0.2: + resolution: {integrity: sha512-s9sqOs5B1Ykox3Xo8b3Ss2IQju4UwlW6LSR+Q5FXWpprJ5fzMLefIIItr3PH8RwzfGy6gxs/4GAmiNuZScE25w==} + dev: true + + /mouse-event@1.0.5: + resolution: {integrity: sha512-ItUxtL2IkeSKSp9cyaX2JLUuKk2uMoxBg4bbOWVd29+CskYJR9BGsUqtXenNzKbnDshvupjUewDIYVrOB6NmGw==} + dev: true + + /mouse-wheel@1.2.0: + resolution: {integrity: sha512-+OfYBiUOCTWcTECES49neZwL5AoGkXE+lFjIvzwNCnYRlso+EnfvovcBxGoyQ0yQt806eSPjS675K0EwWknXmw==} + dependencies: + right-now: 1.0.0 + signum: 1.0.0 + to-px: 1.0.1 + dev: true + + /mri@1.2.0: + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} + engines: {node: '>=4'} + dev: false + + /mrmime@1.0.1: + resolution: {integrity: sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==} + engines: {node: '>=10'} + dev: true + + /ms@2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + dev: true + + /ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + + /ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + dev: true + + /mumath@3.3.4: + resolution: {integrity: sha512-VAFIOG6rsxoc7q/IaY3jdjmrsuX9f15KlRLYTHmixASBZkZEKC1IFqE2BC5CdhXmK6WLM1Re33z//AGmeRI6FA==} + deprecated: Redundant dependency in your project. + dependencies: + almost-equal: 1.1.0 + dev: true + + /murmurhash-js@1.0.0: + resolution: {integrity: sha512-TvmkNhkv8yct0SVBSy+o8wYzXjE4Zz3PCesbfs8HiCXXdcTuocApFv11UWlNFWKYsP2okqrhb7JNlSm9InBhIw==} + dev: true + + /mz@2.7.0: + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + dependencies: + any-promise: 1.3.0 + object-assign: 4.1.1 + thenify-all: 1.6.0 + + /nanoid@3.3.3: + resolution: {integrity: sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + dev: true + + /nanoid@3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + + /native-promise-only@0.8.1: + resolution: {integrity: sha512-zkVhZUA3y8mbz652WrL5x0fB0ehrBkulWT3TomAQ9iDtyXZvzKeEA6GPxAItBYeNYl5yngKRX612qHOhvMkDeg==} + dev: true + + /natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + dev: true + + /needle@2.9.1: + resolution: {integrity: sha512-6R9fqJ5Zcmf+uYaFgdIHmLwNldn5HbK8L5ybn7Uz+ylX/rnOsSp1AHcvQSrCaFN+qNM1wpymHqD7mVasEOlHGQ==} + engines: {node: '>= 4.4.x'} + hasBin: true + dependencies: + debug: 3.2.7(supports-color@8.1.1) + iconv-lite: 0.4.24 + sax: 1.3.0 + transitivePeerDependencies: + - supports-color + dev: true + + /neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + dev: true + + /nerf-dart@1.0.0: + resolution: {integrity: sha512-EZSPZB70jiVsivaBLYDCyntd5eH8NTSMOn3rB+HxwdmKThGELLdYv8qVIMWvZEFy9w8ZZpW9h9OB32l1rGtj7g==} + dev: true + + /next-auth@4.24.5(next@14.0.4)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-3RafV3XbfIKk6rF6GlLE4/KxjTcuMCifqrmD+98ejFq73SRoj2rmzoca8u764977lH/Q7jo6Xu6yM+Re1Mz/Og==} + peerDependencies: + next: ^12.2.5 || ^13 || ^14 + nodemailer: ^6.6.5 + react: ^17.0.2 || ^18 + react-dom: ^17.0.2 || ^18 + peerDependenciesMeta: + nodemailer: + optional: true + dependencies: + '@babel/runtime': 7.21.5 + '@panva/hkdf': 1.1.1 + cookie: 0.5.0 + jose: 4.14.4 + next: 14.0.4(@babel/core@7.23.7)(react-dom@18.2.0)(react@18.2.0) + oauth: 0.9.15 + openid-client: 5.4.2 + preact: 10.13.2 + preact-render-to-string: 5.2.6(preact@10.13.2) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + uuid: 8.3.2 + dev: false + + /next-themes@0.2.1(next@14.0.4)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-B+AKNfYNIzh0vqQQKqQItTS8evEouKD7H5Hj3kmuPERwddR2TxvDSFZuTj6T7Jfn1oyeUyJMydPl1Bkxkh0W7A==} + peerDependencies: + next: '*' + react: '*' + react-dom: '*' + dependencies: + next: 14.0.4(@babel/core@7.23.7)(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /next-tick@1.1.0: + resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==} + dev: true + + /next@14.0.4(@babel/core@7.23.7)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-qbwypnM7327SadwFtxXnQdGiKpkuhaRLE2uq62/nRul9cj9KhQ5LhHmlziTNqUidZotw/Q1I9OjirBROdUJNgA==} + engines: {node: '>=18.17.0'} + hasBin: true + peerDependencies: + '@opentelemetry/api': ^1.1.0 + react: ^18.2.0 + react-dom: ^18.2.0 + sass: ^1.3.0 + peerDependenciesMeta: + '@opentelemetry/api': + optional: true + sass: + optional: true + dependencies: + '@next/env': 14.0.4 + '@swc/helpers': 0.5.2 + busboy: 1.6.0 + caniuse-lite: 1.0.30001572 + graceful-fs: 4.2.11 + postcss: 8.4.31 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + styled-jsx: 5.1.1(@babel/core@7.23.7)(react@18.2.0) + watchpack: 2.4.0 + optionalDependencies: + '@next/swc-darwin-arm64': 14.0.4 + '@next/swc-darwin-x64': 14.0.4 + '@next/swc-linux-arm64-gnu': 14.0.4 + '@next/swc-linux-arm64-musl': 14.0.4 + '@next/swc-linux-x64-gnu': 14.0.4 + '@next/swc-linux-x64-musl': 14.0.4 + '@next/swc-win32-arm64-msvc': 14.0.4 + '@next/swc-win32-ia32-msvc': 14.0.4 + '@next/swc-win32-x64-msvc': 14.0.4 + transitivePeerDependencies: + - '@babel/core' + - babel-plugin-macros + dev: false + + /no-case@3.0.4: + resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} + dependencies: + lower-case: 2.0.2 + tslib: 2.5.0 + dev: true + + /node-emoji@2.1.3: + resolution: {integrity: sha512-E2WEOVsgs7O16zsURJ/eH8BqhF029wGpEOnv7Urwdo2wmQanOACwJQh0devF9D9RhoZru0+9JXIS0dBXIAz+lA==} + engines: {node: '>=18'} + dependencies: + '@sindresorhus/is': 4.6.0 + char-regex: 1.0.2 + emojilib: 2.4.0 + skin-tone: 2.0.0 + dev: true + + /node-hook@1.0.0: + resolution: {integrity: sha512-tBTIHwkzXvbesP0fY495VsqSWCOS5Ttt5+mAmeqUC1yglCiSYarNewfi2Q+HOL+M6pZYYqwGU6jIi5+gIHQbpg==} + dev: true + + /node-int64@0.4.0: + resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} + dev: true + + /node-releases@2.0.10: + resolution: {integrity: sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==} + + /node-releases@2.0.14: + resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} + + /normalize-package-data@2.5.0: + resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} + dependencies: + hosted-git-info: 2.8.9 + resolve: 1.22.8 + semver: 5.7.2 + validate-npm-package-license: 3.0.4 + dev: true + + /normalize-package-data@3.0.3: + resolution: {integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==} + engines: {node: '>=10'} + dependencies: + hosted-git-info: 4.1.0 + is-core-module: 2.13.1 + semver: 7.5.4 + validate-npm-package-license: 3.0.4 + dev: true + + /normalize-package-data@6.0.0: + resolution: {integrity: sha512-UL7ELRVxYBHBgYEtZCXjxuD5vPxnmvMGq0jp/dGPKKrN7tfsBh2IY7TlJ15WWwdjRWD3RJbnsygUurTK3xkPkg==} + engines: {node: ^16.14.0 || >=18.0.0} + dependencies: + hosted-git-info: 7.0.1 + is-core-module: 2.13.1 + semver: 7.5.4 + validate-npm-package-license: 3.0.4 + dev: true + + /normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + /normalize-range@0.1.2: + resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} + engines: {node: '>=0.10.0'} + dev: true + + /normalize-svg-path@0.1.0: + resolution: {integrity: sha512-1/kmYej2iedi5+ROxkRESL/pI02pkg0OBnaR4hJkSIX6+ORzepwbuUXfrdZaPjysTsJInj0Rj5NuX027+dMBvA==} + dev: true + + /normalize-svg-path@1.1.0: + resolution: {integrity: sha512-r9KHKG2UUeB5LoTouwDzBy2VxXlHsiM6fyLQvnJa0S5hrhzqElH/CH7TUGhT1fVvIYBIKf3OpY4YJ4CK+iaqHg==} + dependencies: + svg-arc-to-cubic-bezier: 3.2.0 + dev: true + + /normalize-url@8.0.0: + resolution: {integrity: sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw==} + engines: {node: '>=14.16'} + dev: true + + /npm-only-allow@1.2.6: + resolution: {integrity: sha512-/bl6SOC28cb62u5S6WFpXLOmLVIO6Qse0I8KWiDlJKDgM52dSwhp6qSlwqMO01cspv2p56i8i5KoEvoMJdnW2Q==} + dependencies: + chokidar: 3.5.3 + concurrently: 7.6.0 + fs-extra: 11.2.0 + minimist: 1.2.8 + picocolors: 1.0.0 + which-pm-runs: 1.1.0 + dev: true + + /npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + dependencies: + path-key: 3.1.1 + dev: true + + /npm-run-path@5.1.0: + resolution: {integrity: sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + path-key: 4.0.0 + dev: true + + /npm@10.2.5: + resolution: {integrity: sha512-lXdZ7titEN8CH5YJk9C/aYRU9JeDxQ4d8rwIIDsvH3SMjLjHTukB2CFstMiB30zXs4vCrPN2WH6cDq1yHBeJAw==} + engines: {node: ^18.17.0 || >=20.5.0} + dev: true + bundledDependencies: + - '@isaacs/string-locale-compare' + - '@npmcli/arborist' + - '@npmcli/config' + - '@npmcli/fs' + - '@npmcli/map-workspaces' + - '@npmcli/package-json' + - '@npmcli/promise-spawn' + - '@npmcli/run-script' + - '@sigstore/tuf' + - abbrev + - archy + - cacache + - chalk + - ci-info + - cli-columns + - cli-table3 + - columnify + - fastest-levenshtein + - fs-minipass + - glob + - graceful-fs + - hosted-git-info + - ini + - init-package-json + - is-cidr + - json-parse-even-better-errors + - libnpmaccess + - libnpmdiff + - libnpmexec + - libnpmfund + - libnpmhook + - libnpmorg + - libnpmpack + - libnpmpublish + - libnpmsearch + - libnpmteam + - libnpmversion + - make-fetch-happen + - minimatch + - minipass + - minipass-pipeline + - ms + - node-gyp + - nopt + - normalize-package-data + - npm-audit-report + - npm-install-checks + - npm-package-arg + - npm-pick-manifest + - npm-profile + - npm-registry-fetch + - npm-user-validate + - npmlog + - p-map + - pacote + - parse-conflict-json + - proc-log + - qrcode-terminal + - read + - semver + - spdx-expression-parse + - ssri + - strip-ansi + - supports-color + - tar + - text-table + - tiny-relative-date + - treeverse + - validate-npm-package-name + - which + - write-file-atomic + + /number-is-integer@1.0.1: + resolution: {integrity: sha512-Dq3iuiFBkrbmuQjGFFF3zckXNCQoSD37/SdSbgcBailUx6knDvDwb5CympBgcoWHy36sfS12u74MHYkXyHq6bg==} + engines: {node: '>=0.10.0'} + dependencies: + is-finite: 1.1.0 + dev: true + + /oauth@0.9.15: + resolution: {integrity: sha512-a5ERWK1kh38ExDEfoO6qUHJb32rd7aYmPHuyCu3Fta/cnICvYmgd2uhuKXvPD+PXB+gCEYYEaQdIRAjCOwAKNA==} + dev: false + + /object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + /object-hash@2.2.0: + resolution: {integrity: sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==} + engines: {node: '>= 6'} + dev: false + + /object-hash@3.0.0: + resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} + engines: {node: '>= 6'} + + /object-inspect@1.13.1: + resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} + dev: true + + /object-is@1.1.5: + resolution: {integrity: sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + dev: true + + /object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + dev: true + + /object.assign@4.1.4: + resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + has-symbols: 1.0.3 + object-keys: 1.1.1 + dev: true + + /object.entries@1.1.6: + resolution: {integrity: sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + dev: true + + /object.fromentries@2.0.7: + resolution: {integrity: sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + dev: true + + /object.groupby@1.0.1: + resolution: {integrity: sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + get-intrinsic: 1.2.2 + dev: true + + /object.hasown@1.1.2: + resolution: {integrity: sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==} + dependencies: + define-properties: 1.2.1 + es-abstract: 1.22.3 + dev: true + + /object.values@1.1.7: + resolution: {integrity: sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + dev: true + + /oidc-token-hash@5.0.3: + resolution: {integrity: sha512-IF4PcGgzAr6XXSff26Sk/+P4KZFJVuHAJZj3wgO3vX2bMdNVp/QXTP3P7CEm9V1IdG8lDLY3HhiqpsE/nOwpPw==} + engines: {node: ^10.13.0 || >=12.0.0} + dev: false + + /once@1.3.3: + resolution: {integrity: sha512-6vaNInhu+CHxtONf3zw3vq4SP2DOQhjBvIa3rNcG0+P7eKWlYH6Peu7rHizSloRU2EwMz6GraLieis9Ac9+p1w==} + dependencies: + wrappy: 1.0.2 + dev: true + + /once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + dependencies: + wrappy: 1.0.2 + + /onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + dependencies: + mimic-fn: 2.1.0 + dev: true + + /onetime@6.0.0: + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} + dependencies: + mimic-fn: 4.0.0 + dev: true + + /open@9.1.0: + resolution: {integrity: sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==} + engines: {node: '>=14.16'} + dependencies: + default-browser: 4.0.0 + define-lazy-prop: 3.0.0 + is-inside-container: 1.0.0 + is-wsl: 2.2.0 + dev: true + + /openapi-typescript-codegen@0.25.0: + resolution: {integrity: sha512-nN/TnIcGbP58qYgwEEy5FrAAjePcYgfMaCe3tsmYyTgI3v4RR9v8os14L+LEWDvV50+CmqiyTzRkKKtJeb6Ybg==} + dependencies: + camelcase: 6.3.0 + commander: 11.1.0 + fs-extra: 11.2.0 + handlebars: 4.7.8 + json-schema-ref-parser: 9.0.9 + dev: true + + /opener@1.5.2: + resolution: {integrity: sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==} + dev: true + + /openid-client@5.4.2: + resolution: {integrity: sha512-lIhsdPvJ2RneBm3nGBBhQchpe3Uka//xf7WPHTIglery8gnckvW7Bd9IaQzekzXJvWthCMyi/xVEyGW0RFPytw==} + dependencies: + jose: 4.14.4 + lru-cache: 6.0.0 + object-hash: 2.2.0 + oidc-token-hash: 5.0.3 + dev: false + + /optionator@0.9.3: + resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} + engines: {node: '>= 0.8.0'} + dependencies: + '@aashutoshrathi/word-wrap': 1.2.6 + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + dev: true + + /ospath@1.2.2: + resolution: {integrity: sha512-o6E5qJV5zkAbIDNhGSIlyOhScKXgQrSRMilfph0clDfM0nEnBOlKlH4sWDmG95BW/CvwNz0vmm7dJVtU2KlMiA==} + dev: true + + /p-each-series@3.0.0: + resolution: {integrity: sha512-lastgtAdoH9YaLyDa5i5z64q+kzOcQHsQ5SsZJD3q0VEyI8mq872S3geuNbRUQLVAE9siMfgKrpj7MloKFHruw==} + engines: {node: '>=12'} + dev: true + + /p-filter@4.1.0: + resolution: {integrity: sha512-37/tPdZ3oJwHaS3gNJdenCDB3Tz26i9sjhnguBtvN0vYlRIiDNnvTWkuh+0hETV9rLPdJ3rlL3yVOYPIAnM8rw==} + engines: {node: '>=18'} + dependencies: + p-map: 7.0.1 + dev: true + + /p-is-promise@3.0.0: + resolution: {integrity: sha512-Wo8VsW4IRQSKVXsJCn7TomUaVtyfjVDn3nUP7kE967BQk0CwFpdbZs0X0uk5sW9mkBa9eNM7hCMaG93WUAwxYQ==} + engines: {node: '>=8'} + dev: true + + /p-limit@1.3.0: + resolution: {integrity: sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==} + engines: {node: '>=4'} + dependencies: + p-try: 1.0.0 + dev: true + + /p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + dependencies: + p-try: 2.2.0 + dev: true + + /p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + dependencies: + yocto-queue: 0.1.0 + dev: true + + /p-locate@2.0.0: + resolution: {integrity: sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==} + engines: {node: '>=4'} + dependencies: + p-limit: 1.3.0 + dev: true + + /p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + dependencies: + p-limit: 2.3.0 + dev: true + + /p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + dependencies: + p-limit: 3.1.0 + dev: true + + /p-map@4.0.0: + resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} + engines: {node: '>=10'} + dependencies: + aggregate-error: 3.1.0 + dev: true + + /p-map@7.0.1: + resolution: {integrity: sha512-2wnaR0XL/FDOj+TgpDuRb2KTjLnu3Fma6b1ZUwGY7LcqenMcvP/YFpjpbPKY6WVGsbuJZRuoUz8iPrt8ORnAFw==} + engines: {node: '>=18'} + dev: true + + /p-reduce@2.1.0: + resolution: {integrity: sha512-2USApvnsutq8uoxZBGbbWM0JIYLiEMJ9RlaN7fAzVNb9OZN0SHjjTTfIcb667XynS5Y1VhwDJVDa72TnPzAYWw==} + engines: {node: '>=8'} + dev: true + + /p-reduce@3.0.0: + resolution: {integrity: sha512-xsrIUgI0Kn6iyDYm9StOpOeK29XM1aboGji26+QEortiFST1hGZaUQOLhtEbqHErPpGW/aSz6allwK2qcptp0Q==} + engines: {node: '>=12'} + dev: true + + /p-try@1.0.0: + resolution: {integrity: sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==} + engines: {node: '>=4'} + dev: true + + /p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + dev: true + + /pad-right@0.2.2: + resolution: {integrity: sha512-4cy8M95ioIGolCoMmm2cMntGR1lPLEbOMzOKu8bzjuJP6JpzEMQcDHmh7hHLYGgob+nKe1YHFMaG4V59HQa89g==} + engines: {node: '>=0.10.0'} + dependencies: + repeat-string: 1.6.1 + dev: true + + /parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + dependencies: + callsites: 3.1.0 + dev: true + + /parenthesis@3.1.8: + resolution: {integrity: sha512-KF/U8tk54BgQewkJPvB4s/US3VQY68BRDpH638+7O/n58TpnwiwnOtGIOsT2/i+M78s61BBpeC83STB88d8sqw==} + dev: true + + /parse-entities@2.0.0: + resolution: {integrity: sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==} + dependencies: + character-entities: 1.2.4 + character-entities-legacy: 1.1.4 + character-reference-invalid: 1.1.4 + is-alphanumerical: 1.0.4 + is-decimal: 1.0.4 + is-hexadecimal: 1.0.4 + dev: false + + /parse-json@4.0.0: + resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==} + engines: {node: '>=4'} + dependencies: + error-ex: 1.3.2 + json-parse-better-errors: 1.0.2 + dev: true + + /parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + dependencies: + '@babel/code-frame': 7.23.5 + error-ex: 1.3.2 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + dev: true + + /parse-json@8.1.0: + resolution: {integrity: sha512-rum1bPifK5SSar35Z6EKZuYPJx85pkNaFrxBK3mwdfSJ1/WKbYrjoW/zTPSjRRamfmVX1ACBIdFAO0VRErW/EA==} + engines: {node: '>=18'} + dependencies: + '@babel/code-frame': 7.23.5 + index-to-position: 0.1.2 + type-fest: 4.9.0 + dev: true + + /parse-rect@1.2.0: + resolution: {integrity: sha512-4QZ6KYbnE6RTwg9E0HpLchUM9EZt6DnDxajFZZDSV4p/12ZJEvPO702DZpGvRYEPo00yKDys7jASi+/w7aO8LA==} + dependencies: + pick-by-alias: 1.2.0 + dev: true + + /parse-svg-path@0.1.2: + resolution: {integrity: sha512-JyPSBnkTJ0AI8GGJLfMXvKq42cj5c006fnLz6fXy6zfoVjJizi8BNTpu8on8ziI1cKy9d9DGNuY17Ce7wuejpQ==} + dev: true + + /parse-unit@1.0.1: + resolution: {integrity: sha512-hrqldJHokR3Qj88EIlV/kAyAi/G5R2+R56TBANxNMy0uPlYcttx0jnMW6Yx5KsKPSbC3KddM/7qQm3+0wEXKxg==} + dev: true + + /parse5@6.0.1: + resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} + dev: false + + /path-exists@3.0.0: + resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} + engines: {node: '>=4'} + dev: true + + /path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + dev: true + + /path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + /path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + dev: true + + /path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + dev: true + + /path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + /path-scurry@1.10.1: + resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + lru-cache: 10.1.0 + minipass: 7.0.4 + dev: true + + /path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + dev: true + + /path-type@5.0.0: + resolution: {integrity: sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==} + engines: {node: '>=12'} + dev: true + + /pbf@3.2.1: + resolution: {integrity: sha512-ClrV7pNOn7rtmoQVF4TS1vyU0WhYRnP92fzbfF75jAIwpnzdJXf8iTd4CMEqO4yUenH6NDqLiwjqlh6QgZzgLQ==} + hasBin: true + dependencies: + ieee754: 1.2.1 + resolve-protobuf-schema: 2.1.0 + dev: true + + /pend@1.2.0: + resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} + dev: true + + /performance-now@2.1.0: + resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==} + dev: true + + /pick-by-alias@1.2.0: + resolution: {integrity: sha512-ESj2+eBxhGrcA1azgHs7lARG5+5iLakc/6nlfbpjcLl00HuuUOIuORhYXN4D1HfvMSKuVtFQjAlnwi1JHEeDIw==} + dev: true + + /picocolors@1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + + /picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + /pify@2.3.0: + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} + engines: {node: '>=0.10.0'} + + /pify@3.0.0: + resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} + engines: {node: '>=4'} + dev: true + + /pirates@4.0.5: + resolution: {integrity: sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==} + engines: {node: '>= 6'} + + /pkg-conf@2.1.0: + resolution: {integrity: sha512-C+VUP+8jis7EsQZIhDYmS5qlNtjv2yP4SNtjXK9AP1ZcTRlnSfuumaTnRfYZnYgUUYVIKqL0fRvmUGDV2fmp6g==} + engines: {node: '>=4'} + dependencies: + find-up: 2.1.0 + load-json-file: 4.0.0 + dev: true + + /pkg-dir@4.2.0: + resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} + engines: {node: '>=8'} + dependencies: + find-up: 4.1.0 + dev: true + + /plotly.js-dist-min@2.27.1: + resolution: {integrity: sha512-fFPFityhOkDtjoIVd/9IJQbEEuKEjfmNALBVLZyHwLIkry5ygE4ZC/XENRqLnWR3rNJdTtEaxhM5zflcWTRlDA==} + dev: false + + /plotly.js@2.27.1: + resolution: {integrity: sha512-XeE0zTJWTxURYrUJqzf73l8lTb+HnyRvvhHkoSIEvWf58ins4saopo9l25kCm+xHAGz8E/2EOncE4DyXsJ34kA==} + dependencies: + '@plotly/d3': 3.8.1 + '@plotly/d3-sankey': 0.7.2 + '@plotly/d3-sankey-circular': 0.33.1 + '@turf/area': 6.5.0 + '@turf/bbox': 6.5.0 + '@turf/centroid': 6.5.0 + canvas-fit: 1.5.0 + color-alpha: 1.0.4 + color-normalize: 1.5.0 + color-parse: 1.3.8 + color-rgba: 2.1.1 + country-regex: 1.1.0 + d3-force: 1.2.1 + d3-format: 1.4.5 + d3-geo: 1.12.1 + d3-geo-projection: 2.9.0 + d3-hierarchy: 1.1.9 + d3-interpolate: 3.0.1 + d3-time: 1.1.0 + d3-time-format: 2.3.0 + fast-isnumeric: 1.1.4 + gl-mat4: 1.2.0 + gl-text: 1.3.1 + glslify: 7.1.1 + has-hover: 1.0.1 + has-passive-events: 1.0.0 + is-mobile: 4.0.0 + mapbox-gl: 1.10.1 + mouse-change: 1.4.0 + mouse-event-offset: 3.0.2 + mouse-wheel: 1.2.0 + native-promise-only: 0.8.1 + parse-svg-path: 0.1.2 + point-in-polygon: 1.1.0 + polybooljs: 1.2.0 + probe-image-size: 7.2.3 + regl: /@plotly/regl@2.1.2 + regl-error2d: 2.0.12 + regl-line2d: 3.1.2 + regl-scatter2d: 3.3.1 + regl-splom: 1.0.14 + strongly-connected-components: 1.0.1 + superscript-text: 1.0.0 + svg-path-sdf: 1.1.3 + tinycolor2: 1.6.0 + to-px: 1.0.1 + topojson-client: 3.1.0 + webgl-context: 2.2.0 + world-calendars: 1.0.3 + transitivePeerDependencies: + - supports-color + dev: true + + /point-in-polygon@1.1.0: + resolution: {integrity: sha512-3ojrFwjnnw8Q9242TzgXuTD+eKiutbzyslcq1ydfu82Db2y+Ogbmyrkpv0Hgj31qwT3lbS9+QAAO/pIQM35XRw==} + dev: true + + /polybooljs@1.2.0: + resolution: {integrity: sha512-mKjR5nolISvF+q2BtC1fi/llpxBPTQ3wLWN8+ldzdw2Hocpc8C72ZqnamCM4Z6z+68GVVjkeM01WJegQmZ8MEQ==} + dev: true + + /postcss-import@15.1.0(postcss@8.4.32): + resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} + engines: {node: '>=14.0.0'} + peerDependencies: + postcss: ^8.0.0 + dependencies: + postcss: 8.4.32 + postcss-value-parser: 4.2.0 + read-cache: 1.0.0 + resolve: 1.22.8 + + /postcss-js@4.0.1(postcss@8.4.32): + resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} + engines: {node: ^12 || ^14 || >= 16} + peerDependencies: + postcss: ^8.4.21 + dependencies: + camelcase-css: 2.0.1 + postcss: 8.4.32 + + /postcss-load-config@4.0.2(postcss@8.4.32): + resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} + engines: {node: '>= 14'} + peerDependencies: + postcss: '>=8.0.9' + ts-node: '>=9.0.0' + peerDependenciesMeta: + postcss: + optional: true + ts-node: + optional: true + dependencies: + lilconfig: 3.0.0 + postcss: 8.4.32 + yaml: 2.3.4 + + /postcss-nested@6.0.1(postcss@8.4.32): + resolution: {integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==} + engines: {node: '>=12.0'} + peerDependencies: + postcss: ^8.2.14 + dependencies: + postcss: 8.4.32 + postcss-selector-parser: 6.0.12 + + /postcss-selector-parser@6.0.10: + resolution: {integrity: sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==} + engines: {node: '>=4'} + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + dev: false + + /postcss-selector-parser@6.0.12: + resolution: {integrity: sha512-NdxGCAZdRrwVI1sy59+Wzrh+pMMHxapGnpfenDVlMEXoOcvt4pGE0JLK9YY2F5dLxcFYA/YbVQKhcGU+FtSYQg==} + engines: {node: '>=4'} + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + /postcss-value-parser@3.3.1: + resolution: {integrity: sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==} + dev: false + + /postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + + /postcss@8.4.31: + resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.7 + picocolors: 1.0.0 + source-map-js: 1.0.2 + dev: false + + /postcss@8.4.32: + resolution: {integrity: sha512-D/kj5JNu6oo2EIy+XL/26JEDTlIbB8hw85G8StOE6L74RQAVVP5rej6wxCNqyMbR4RkPfqvezVbPw81Ngd6Kcw==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.7 + picocolors: 1.0.0 + source-map-js: 1.0.2 + + /potpack@1.0.2: + resolution: {integrity: sha512-choctRBIV9EMT9WGAZHn3V7t0Z2pMQyl0EZE6pFc/6ml3ssw7Dlf/oAOvFwjm1HVsqfQN8GfeFyJ+d8tRzqueQ==} + dev: true + + /preact-render-to-string@5.2.6(preact@10.13.2): + resolution: {integrity: sha512-JyhErpYOvBV1hEPwIxc/fHWXPfnEGdRKxc8gFdAZ7XV4tlzyzG847XAyEZqoDnynP88akM4eaHcSOzNcLWFguw==} + peerDependencies: + preact: '>=10' + dependencies: + preact: 10.13.2 + pretty-format: 3.8.0 + dev: false + + /preact@10.13.2: + resolution: {integrity: sha512-q44QFLhOhty2Bd0Y46fnYW0gD/cbVM9dUVtNTDKPcdXSMA7jfY+Jpd6rk3GB0lcQss0z5s/6CmVP0Z/hV+g6pw==} + dev: false + + /prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + dev: true + + /prettier-plugin-tailwindcss@0.5.10(prettier@3.1.1): + resolution: {integrity: sha512-9UGSejqFxGG6brYjFfTYlJ8zs4L/lvZg1AngFfaC5Fs1otSskASv5IWKmjPu5MlABQUtTKtMArKyYr/hWpXSUg==} + engines: {node: '>=14.21.3'} + peerDependencies: + '@ianvs/prettier-plugin-sort-imports': '*' + '@prettier/plugin-pug': '*' + '@shopify/prettier-plugin-liquid': '*' + '@trivago/prettier-plugin-sort-imports': '*' + prettier: ^3.0 + prettier-plugin-astro: '*' + prettier-plugin-css-order: '*' + prettier-plugin-import-sort: '*' + prettier-plugin-jsdoc: '*' + prettier-plugin-marko: '*' + prettier-plugin-organize-attributes: '*' + prettier-plugin-organize-imports: '*' + prettier-plugin-style-order: '*' + prettier-plugin-svelte: '*' + prettier-plugin-twig-melody: '*' + peerDependenciesMeta: + '@ianvs/prettier-plugin-sort-imports': + optional: true + '@prettier/plugin-pug': + optional: true + '@shopify/prettier-plugin-liquid': + optional: true + '@trivago/prettier-plugin-sort-imports': + optional: true + prettier-plugin-astro: + optional: true + prettier-plugin-css-order: + optional: true + prettier-plugin-import-sort: + optional: true + prettier-plugin-jsdoc: + optional: true + prettier-plugin-marko: + optional: true + prettier-plugin-organize-attributes: + optional: true + prettier-plugin-organize-imports: + optional: true + prettier-plugin-style-order: + optional: true + prettier-plugin-svelte: + optional: true + prettier-plugin-twig-melody: + optional: true + dependencies: + prettier: 3.1.1 + dev: true + + /prettier@3.1.1: + resolution: {integrity: sha512-22UbSzg8luF4UuZtzgiUOfcGM8s4tjBv6dJRT7j275NXsy2jb4aJa4NNveul5x4eqlF1wuhuR2RElK71RvmVaw==} + engines: {node: '>=14'} + dev: true + + /pretty-bytes@5.6.0: + resolution: {integrity: sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==} + engines: {node: '>=6'} + dev: true + + /pretty-format@29.7.0: + resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/schemas': 29.6.3 + ansi-styles: 5.2.0 + react-is: 18.2.0 + dev: true + + /pretty-format@3.8.0: + resolution: {integrity: sha512-WuxUnVtlWL1OfZFQFuqvnvs6MiAGk9UNsBostyBOB0Is9wb5uRESevA6rnl/rkksXaGX3GzZhPup5d6Vp1nFew==} + dev: false + + /prisma@4.14.1: + resolution: {integrity: sha512-z6hxzTMYqT9SIKlzD08dhzsLUpxjFKKsLpp5/kBDnSqiOjtUyyl/dC5tzxLcOa3jkEHQ8+RpB/fE3w8bgNP51g==} + engines: {node: '>=14.17'} + requiresBuild: true + dependencies: + '@prisma/engines': 4.14.1 + dev: false + + /prismjs@1.27.0: + resolution: {integrity: sha512-t13BGPUlFDR7wRB5kQDG4jjl7XeuH6jbJGt11JHPL96qwsEHNX2+68tFXqc1/k+/jALsbSWJKUOT/hcYAZ5LkA==} + engines: {node: '>=6'} + dev: false + + /prismjs@1.29.0: + resolution: {integrity: sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==} + engines: {node: '>=6'} + dev: false + + /probe-image-size@7.2.3: + resolution: {integrity: sha512-HubhG4Rb2UH8YtV4ba0Vp5bQ7L78RTONYu/ujmCu5nBI8wGv24s4E9xSKBi0N1MowRpxk76pFCpJtW0KPzOK0w==} + dependencies: + lodash.merge: 4.6.2 + needle: 2.9.1 + stream-parser: 0.3.1 + transitivePeerDependencies: + - supports-color + dev: true + + /process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + dev: true + + /process@0.11.10: + resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} + engines: {node: '>= 0.6.0'} + dev: true + + /progress@2.0.3: + resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} + engines: {node: '>=0.4.0'} + dev: true + + /prompts@2.4.2: + resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} + engines: {node: '>= 6'} + dependencies: + kleur: 3.0.3 + sisteransi: 1.0.5 + dev: true + + /prop-types@15.8.1: + resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + react-is: 16.13.1 + + /property-expr@2.0.6: + resolution: {integrity: sha512-SVtmxhRE/CGkn3eZY1T6pC8Nln6Fr/lu1mKSgRud0eC73whjGfoAogbn78LkD8aFL0zz3bAFerKSnOl7NlErBA==} + dev: true + + /property-information@5.6.0: + resolution: {integrity: sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==} + dependencies: + xtend: 4.0.2 + dev: false + + /property-information@6.2.0: + resolution: {integrity: sha512-kma4U7AFCTwpqq5twzC1YVIDXSqg6qQK6JN0smOw8fgRy1OkMi0CYSzFmsy6dnqSenamAtj0CyXMUJ1Mf6oROg==} + dev: false + + /proto-list@1.2.4: + resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} + dev: true + + /protocol-buffers-schema@3.6.0: + resolution: {integrity: sha512-TdDRD+/QNdrCGCE7v8340QyuXd4kIWIgapsE2+n/SaGiSSbomYl4TjHlvIoCWRpE7wFt02EpB35VVA2ImcBVqw==} + dev: true + + /proxy-from-env@1.0.0: + resolution: {integrity: sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A==} + dev: true + + /proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + dev: false + + /psl@1.9.0: + resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} + dev: true + + /pump@3.0.0: + resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + dev: true + + /punycode@2.3.0: + resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} + engines: {node: '>=6'} + dev: true + + /pure-rand@6.0.4: + resolution: {integrity: sha512-LA0Y9kxMYv47GIPJy6MI84fqTd2HmYZI83W/kM/SkKfDlajnZYfmXFTxkbY+xSBPkLJxltMa9hIkmdc29eguMA==} + dev: true + + /qs@6.10.4: + resolution: {integrity: sha512-OQiU+C+Ds5qiH91qh/mg0w+8nwQuLjM4F4M/PbmhDOoYehPh+Fb0bDjtR1sOvy7YKxvj28Y/M0PhP5uVX0kB+g==} + engines: {node: '>=0.6'} + dependencies: + side-channel: 1.0.4 + dev: true + + /querystringify@2.2.0: + resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} + dev: true + + /queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + /quick-lru@4.0.1: + resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} + engines: {node: '>=8'} + dev: true + + /quickselect@2.0.0: + resolution: {integrity: sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw==} + dev: true + + /raf@3.4.1: + resolution: {integrity: sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==} + dependencies: + performance-now: 2.1.0 + dev: true + + /randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + dependencies: + safe-buffer: 5.2.1 + dev: true + + /rc@1.2.8: + resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} + dependencies: + deep-extend: 0.6.0 + ini: 1.3.8 + minimist: 1.2.8 + strip-json-comments: 2.0.1 + dev: true + + /react-avatar@5.0.3(@babel/runtime@7.23.7)(core-js-pure@3.35.0)(prop-types@15.8.1)(react@18.2.0): + resolution: {integrity: sha512-DNc+qkWH9QehSEZqHBhqpXWsPY+rU9W7kD68QFHfu8Atfsvx/3ML0DzAePgTUd96nCXQQ3KZMcC3LKYT8FiBIg==} + peerDependencies: + '@babel/runtime': '>=7' + core-js-pure: '>=3' + prop-types: ^15.0.0 || ^16.0.0 + react: ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 + dependencies: + '@babel/runtime': 7.23.7 + core-js-pure: 3.35.0 + is-retina: 1.0.3 + md5: 2.3.0 + prop-types: 15.8.1 + react: 18.2.0 + dev: false + + /react-collapse@5.1.1(react@18.2.0): + resolution: {integrity: sha512-k6cd7csF1o9LBhQ4AGBIdxB60SUEUMQDAnL2z1YvYNr9KoKr+nDkhN6FK7uGaBd/rYrYfrMpzpmJEIeHRYogBw==} + peerDependencies: + react: '>=16.3.0' + dependencies: + react: 18.2.0 + dev: false + + /react-csv@2.2.2: + resolution: {integrity: sha512-RG5hOcZKZFigIGE8LxIEV/OgS1vigFQT4EkaHeKgyuCbUAu9Nbd/1RYq++bJcJJ9VOqO/n9TZRADsXNDR4VEpw==} + dev: false + + /react-data-table-component@7.5.3(react@18.2.0)(styled-components@5.3.11): + resolution: {integrity: sha512-JhatRTgThAAa1HobPaPmkNPsjLT6+fnMIdtcXRCy+0bSYN7XJnTgob9Qyi4bjHh/8tMPTHtxZCV/TKiPwRvFMA==} + peerDependencies: + react: '>= 16.8.3' + styled-components: '>= 4' + dependencies: + deepmerge: 4.3.1 + react: 18.2.0 + styled-components: 5.3.11(@babel/core@7.23.7)(react-dom@18.2.0)(react-is@18.2.0)(react@18.2.0) + dev: false + + /react-dom@18.2.0(react@18.2.0): + resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} + peerDependencies: + react: ^18.2.0 + dependencies: + loose-envify: 1.4.0 + react: 18.2.0 + scheduler: 0.23.0 + dev: false + + /react-error-boundary@4.0.12(react@18.2.0): + resolution: {integrity: sha512-kJdxdEYlb7CPC1A0SeUY38cHpjuu6UkvzKiAmqmOFL21VRfMhOcWxTCBgLVCO0VEMh9JhFNcVaXlV4/BTpiwOA==} + peerDependencies: + react: '>=16.13.1' + dependencies: + '@babel/runtime': 7.21.5 + react: 18.2.0 + dev: false + + /react-hot-toast@2.4.1(csstype@3.1.3)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-j8z+cQbWIM5LY37pR6uZR6D4LfseplqnuAO4co4u8917hBUvXlEqyP1ZzqVLcqoyUesZZv/ImreoCeHVDpE5pQ==} + engines: {node: '>=10'} + peerDependencies: + react: '>=16' + react-dom: '>=16' + dependencies: + goober: 2.1.13(csstype@3.1.3) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + transitivePeerDependencies: + - csstype + dev: false + + /react-icons@4.11.0(react@18.2.0): + resolution: {integrity: sha512-V+4khzYcE5EBk/BvcuYRq6V/osf11ODUM2J8hg2FDSswRrGvqiYUYPRy4OdrWaQOBj4NcpJfmHZLNaD+VH0TyA==} + peerDependencies: + react: '*' + dependencies: + react: 18.2.0 + dev: false + + /react-is@16.13.1: + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + + /react-is@18.2.0: + resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} + + /react-jsx-parser@1.29.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-u0svZd0UsPffRrIK0sTbox54jhEbTmg6ED9ob5FQahp1DeOpd2Rq+KiSTIFNYkZUL+WZi4Ntia/Oj5T4lDJafQ==} + requiresBuild: true + peerDependencies: + react: '>=17' + react-dom: '>=17' + dependencies: + '@types/jsdom': 16.2.15 + acorn: 8.8.2 + acorn-jsx: 5.3.2(acorn@8.8.2) + browserslist: 4.21.5 + core-js: 3.30.2 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + optionalDependencies: + '@types/react': 17.0.74 + '@types/react-dom': 17.0.25 + dev: false + + /react-lifecycles-compat@3.0.4: + resolution: {integrity: sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==} + dev: false + + /react-markdown@8.0.7(@types/react@18.0.28)(react@18.2.0): + resolution: {integrity: sha512-bvWbzG4MtOU62XqBx3Xx+zB2raaFFsq4mYiAzfjXJMEz2sixgeAfraA3tvzULF02ZdOMUOKTBFFaZJDDrq+BJQ==} + peerDependencies: + '@types/react': '>=16' + react: '>=16' + dependencies: + '@types/hast': 2.3.4 + '@types/prop-types': 15.7.5 + '@types/react': 18.0.28 + '@types/unist': 2.0.6 + comma-separated-tokens: 2.0.3 + hast-util-whitespace: 2.0.1 + prop-types: 15.8.1 + property-information: 6.2.0 + react: 18.2.0 + react-is: 18.2.0 + remark-parse: 10.0.1 + remark-rehype: 10.1.0 + space-separated-tokens: 2.0.2 + style-to-object: 0.4.1 + unified: 10.1.2 + unist-util-visit: 4.1.2 + vfile: 5.3.7 + transitivePeerDependencies: + - supports-color + dev: false + + /react-plotly.js@2.6.0(plotly.js@2.27.1)(react@18.2.0): + resolution: {integrity: sha512-g93xcyhAVCSt9kV1svqG1clAEdL6k3U+jjuSzfTV7owaSU9Go6Ph8bl25J+jKfKvIGAEYpe4qj++WHJuc9IaeA==} + peerDependencies: + plotly.js: '>1.34.0' + react: '>0.13.0' + dependencies: + plotly.js: 2.27.1 + prop-types: 15.8.1 + react: 18.2.0 + dev: true + + /react-remove-scroll-bar@2.3.4(@types/react@18.0.28)(react@18.2.0): + resolution: {integrity: sha512-63C4YQBUt0m6ALadE9XV56hV8BgJWDmmTPY758iIJjfQKt2nYwoUrPk0LXRXcB/yIj82T1/Ixfdpdk68LwIB0A==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.0.28 + react: 18.2.0 + react-style-singleton: 2.2.1(@types/react@18.0.28)(react@18.2.0) + tslib: 2.5.0 + dev: false + + /react-remove-scroll@2.5.5(@types/react@18.0.28)(react@18.2.0): + resolution: {integrity: sha512-ImKhrzJJsyXJfBZ4bzu8Bwpka14c/fQt0k+cyFp/PBhTfyDnU5hjOtM4AG/0AMyy8oKzOTR0lDgJIM7pYXI0kw==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.0.28 + react: 18.2.0 + react-remove-scroll-bar: 2.3.4(@types/react@18.0.28)(react@18.2.0) + react-style-singleton: 2.2.1(@types/react@18.0.28)(react@18.2.0) + tslib: 2.5.0 + use-callback-ref: 1.3.0(@types/react@18.0.28)(react@18.2.0) + use-sidecar: 1.1.2(@types/react@18.0.28)(react@18.2.0) + dev: false + + /react-resize-detector@8.1.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-S7szxlaIuiy5UqLhLL1KY3aoyGHbZzsTpYal9eYMwCyKqoqoVLCmIgAgNyIM1FhnP2KyBygASJxdhejrzjMb+w==} + peerDependencies: + react: ^16.0.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.0.0 || ^17.0.0 || ^18.0.0 + dependencies: + lodash: 4.17.21 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /react-smooth@2.0.2(prop-types@15.8.1)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-pgqSp1q8rAGtF1bXQE0m3CHGLNfZZh5oA5o1tsPLXRHnKtkujMIJ8Ws5nO1mTySZf1c4vgwlEk+pHi3Ln6eYLw==} + peerDependencies: + prop-types: ^15.6.0 + react: ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 + react-dom: ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 + dependencies: + fast-equals: 4.0.3 + prop-types: 15.8.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-transition-group: 2.9.0(react-dom@18.2.0)(react@18.2.0) + dev: false + + /react-style-singleton@2.2.1(@types/react@18.0.28)(react@18.2.0): + resolution: {integrity: sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.0.28 + get-nonce: 1.0.1 + invariant: 2.2.4 + react: 18.2.0 + tslib: 2.5.0 + dev: false + + /react-syntax-highlighter@15.5.0(react@18.2.0): + resolution: {integrity: sha512-+zq2myprEnQmH5yw6Gqc8lD55QHnpKaU8TOcFeC/Lg/MQSs8UknEA0JC4nTZGFAXC2J2Hyj/ijJ7NlabyPi2gg==} + peerDependencies: + react: '>= 0.14.0' + dependencies: + '@babel/runtime': 7.21.5 + highlight.js: 10.7.3 + lowlight: 1.20.0 + prismjs: 1.29.0 + react: 18.2.0 + refractor: 3.6.0 + dev: false + + /react-textarea-autosize@8.4.1(@types/react@18.0.28)(react@18.2.0): + resolution: {integrity: sha512-aD2C+qK6QypknC+lCMzteOdIjoMbNlgSFmJjCV+DrfTPwp59i/it9mMNf2HDzvRjQgKAyBDPyLJhcrzElf2U4Q==} + engines: {node: '>=10'} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + dependencies: + '@babel/runtime': 7.21.5 + react: 18.2.0 + use-composed-ref: 1.3.0(react@18.2.0) + use-latest: 1.2.1(@types/react@18.0.28)(react@18.2.0) + transitivePeerDependencies: + - '@types/react' + dev: false + + /react-transition-group@2.9.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-+HzNTCHpeQyl4MJ/bdE0u6XRMe9+XG/+aL4mCxVN4DnPBQ0/5bfHWPDuOZUzYdMj94daZaZdCCc1Dzt9R/xSSg==} + peerDependencies: + react: '>=15.0.0' + react-dom: '>=15.0.0' + dependencies: + dom-helpers: 3.4.0 + loose-envify: 1.4.0 + prop-types: 15.8.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-lifecycles-compat: 3.0.4 + dev: false + + /react@18.2.0: + resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} + engines: {node: '>=0.10.0'} + dependencies: + loose-envify: 1.4.0 + + /read-cache@1.0.0: + resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} + dependencies: + pify: 2.3.0 + + /read-pkg-up@11.0.0: + resolution: {integrity: sha512-LOVbvF1Q0SZdjClSefZ0Nz5z8u+tIE7mV5NibzmE9VYmDe9CaBbAVtz1veOSZbofrdsilxuDAYnFenukZVp8/Q==} + engines: {node: '>=18'} + dependencies: + find-up-simple: 1.0.0 + read-pkg: 9.0.1 + type-fest: 4.9.0 + dev: true + + /read-pkg-up@7.0.1: + resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} + engines: {node: '>=8'} + dependencies: + find-up: 4.1.0 + read-pkg: 5.2.0 + type-fest: 0.8.1 + dev: true + + /read-pkg@5.2.0: + resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} + engines: {node: '>=8'} + dependencies: + '@types/normalize-package-data': 2.4.4 + normalize-package-data: 2.5.0 + parse-json: 5.2.0 + type-fest: 0.6.0 + dev: true + + /read-pkg@9.0.1: + resolution: {integrity: sha512-9viLL4/n1BJUCT1NXVTdS1jtm80yDEgR5T4yCelII49Mbj0v1rZdKqj7zCiYdbB0CuCgdrvHcNogAKTFPBocFA==} + engines: {node: '>=18'} + dependencies: + '@types/normalize-package-data': 2.4.4 + normalize-package-data: 6.0.0 + parse-json: 8.1.0 + type-fest: 4.9.0 + unicorn-magic: 0.1.0 + dev: true + + /readable-stream@1.0.34: + resolution: {integrity: sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==} + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 0.0.1 + string_decoder: 0.10.31 + dev: true + + /readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + dev: true + + /readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + dependencies: + inherits: 2.0.4 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + dev: true + + /readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + dependencies: + picomatch: 2.3.1 + + /recharts-scale@0.4.5: + resolution: {integrity: sha512-kivNFO+0OcUNu7jQquLXAxz1FIwZj8nrj+YkOKc5694NbjCvcT6aSZiIzNzd2Kul4o4rTto8QVR9lMNtxD4G1w==} + dependencies: + decimal.js-light: 2.5.1 + dev: false + + /recharts-to-png@2.2.1(react-dom@18.2.0)(react@18.2.0)(recharts@2.6.2): + resolution: {integrity: sha512-3MxWVHswzqu29QHEgUFjEICR25hoTEjhD28rSKYWdfAA0xP7SjhHJjUCVPSy0lbXVmdiJOxv5h/7LsstVFW8uQ==} + peerDependencies: + react: '>=16.8.3' + react-dom: '>=16.8.3' + recharts: '>=1.8.0' + dependencies: + html2canvas: 1.4.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + recharts: 2.6.2(prop-types@15.8.1)(react-dom@18.2.0)(react@18.2.0) + dev: false + + /recharts@2.6.2(prop-types@15.8.1)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-dVhNfgI21LlF+4AesO3mj+i+9YdAAjoGaDWIctUgH/G2iy14YVtb/DSUeic77xr19rbKCiq+pQGfeg2kJQDHig==} + engines: {node: '>=12'} + peerDependencies: + prop-types: ^15.6.0 + react: ^16.0.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.0.0 || ^17.0.0 || ^18.0.0 + dependencies: + classnames: 2.3.2 + eventemitter3: 4.0.7 + lodash: 4.17.21 + prop-types: 15.8.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-is: 16.13.1 + react-resize-detector: 8.1.0(react-dom@18.2.0)(react@18.2.0) + react-smooth: 2.0.2(prop-types@15.8.1)(react-dom@18.2.0)(react@18.2.0) + recharts-scale: 0.4.5 + reduce-css-calc: 2.1.8 + victory-vendor: 36.6.10 + dev: false + + /redent@3.0.0: + resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} + engines: {node: '>=8'} + dependencies: + indent-string: 4.0.0 + strip-indent: 3.0.0 + dev: true + + /redeyed@2.1.1: + resolution: {integrity: sha512-FNpGGo1DycYAdnrKFxCMmKYgo/mILAqtRYbkdQD8Ep/Hk2PQ5+aEAEx+IU713RTDmuBaH0c8P5ZozurNu5ObRQ==} + dependencies: + esprima: 4.0.1 + dev: true + + /reduce-css-calc@2.1.8: + resolution: {integrity: sha512-8liAVezDmUcH+tdzoEGrhfbGcP7nOV4NkGE3a74+qqvE7nt9i4sKLGBuZNOnpI4WiGksiNPklZxva80061QiPg==} + dependencies: + css-unit-converter: 1.1.2 + postcss-value-parser: 3.3.1 + dev: false + + /reflect-metadata@0.1.13: + resolution: {integrity: sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==} + dev: true + + /reflect-metadata@0.2.1: + resolution: {integrity: sha512-i5lLI6iw9AU3Uu4szRNPPEkomnkjRTaVt9hy/bn5g/oSzekBSMeLZblcjP74AW0vBabqERLLIrz+gR8QYR54Tw==} + dev: true + + /reflect.getprototypeof@1.0.4: + resolution: {integrity: sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + get-intrinsic: 1.2.2 + globalthis: 1.0.3 + which-builtin-type: 1.1.3 + dev: true + + /refractor@3.6.0: + resolution: {integrity: sha512-MY9W41IOWxxk31o+YvFCNyNzdkc9M20NoZK5vq6jkv4I/uh2zkWcfudj0Q1fovjUQJrNewS9NMzeTtqPf+n5EA==} + dependencies: + hastscript: 6.0.0 + parse-entities: 2.0.0 + prismjs: 1.27.0 + dev: false + + /regenerator-runtime@0.13.11: + resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} + dev: false + + /regenerator-runtime@0.14.1: + resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + + /regexp-match-indices@1.0.2: + resolution: {integrity: sha512-DwZuAkt8NF5mKwGGER1EGh2PRqyvhRhhLviH+R8y8dIuaQROlUfXjt4s9ZTXstIsSkptf06BSvwcEmmfheJJWQ==} + dependencies: + regexp-tree: 0.1.27 + dev: true + + /regexp-tree@0.1.27: + resolution: {integrity: sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==} + dev: true + + /regexp.prototype.flags@1.5.1: + resolution: {integrity: sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + set-function-name: 2.0.1 + dev: true + + /registry-auth-token@5.0.2: + resolution: {integrity: sha512-o/3ikDxtXaA59BmZuZrJZDJv8NMDGSj+6j6XaeBmHw8eY1i1qd9+6H+LjVvQXx3HN6aRCGa1cUdJ9RaJZUugnQ==} + engines: {node: '>=14'} + dependencies: + '@pnpm/npm-conf': 2.2.2 + dev: true + + /regl-error2d@2.0.12: + resolution: {integrity: sha512-r7BUprZoPO9AbyqM5qlJesrSRkl+hZnVKWKsVp7YhOl/3RIpi4UDGASGJY0puQ96u5fBYw/OlqV24IGcgJ0McA==} + dependencies: + array-bounds: 1.0.1 + color-normalize: 1.5.0 + flatten-vertex-data: 1.0.2 + object-assign: 4.1.1 + pick-by-alias: 1.2.0 + to-float32: 1.1.0 + update-diff: 1.1.0 + dev: true + + /regl-line2d@3.1.2: + resolution: {integrity: sha512-nmT7WWS/WxmXAQMkgaMKWXaVmwJ65KCrjbqHGOUjjqQi6shfT96YbBOvelXwO9hG7/hjvbzjtQ2UO0L3e7YaXQ==} + dependencies: + array-bounds: 1.0.1 + array-find-index: 1.0.2 + array-normalize: 1.1.4 + color-normalize: 1.5.0 + earcut: 2.2.4 + es6-weak-map: 2.0.3 + flatten-vertex-data: 1.0.2 + glslify: 7.1.1 + object-assign: 4.1.1 + parse-rect: 1.2.0 + pick-by-alias: 1.2.0 + to-float32: 1.1.0 + dev: true + + /regl-scatter2d@3.3.1: + resolution: {integrity: sha512-seOmMIVwaCwemSYz/y4WE0dbSO9svNFSqtTh5RE57I7PjGo3tcUYKtH0MTSoshcAsreoqN8HoCtnn8wfHXXfKQ==} + dependencies: + '@plotly/point-cluster': 3.1.9 + array-range: 1.0.1 + array-rearrange: 2.2.2 + clamp: 1.0.1 + color-id: 1.1.0 + color-normalize: 1.5.0 + color-rgba: 2.1.1 + flatten-vertex-data: 1.0.2 + glslify: 7.1.1 + is-iexplorer: 1.0.0 + object-assign: 4.1.1 + parse-rect: 1.2.0 + pick-by-alias: 1.2.0 + to-float32: 1.1.0 + update-diff: 1.1.0 + dev: true + + /regl-splom@1.0.14: + resolution: {integrity: sha512-OiLqjmPRYbd7kDlHC6/zDf6L8lxgDC65BhC8JirhP4ykrK4x22ZyS+BnY8EUinXKDeMgmpRwCvUmk7BK4Nweuw==} + dependencies: + array-bounds: 1.0.1 + array-range: 1.0.1 + color-alpha: 1.0.4 + flatten-vertex-data: 1.0.2 + parse-rect: 1.2.0 + pick-by-alias: 1.2.0 + raf: 3.4.1 + regl-scatter2d: 3.3.1 + dev: true + + /regl@2.1.0: + resolution: {integrity: sha512-oWUce/aVoEvW5l2V0LK7O5KJMzUSKeiOwFuJehzpSFd43dO5spP9r+sSUfhKtsky4u6MCqWJaRL+abzExynfTg==} + dev: true + + /rehype-raw@6.1.1: + resolution: {integrity: sha512-d6AKtisSRtDRX4aSPsJGTfnzrX2ZkHQLE5kiUuGOeEoLpbEulFF4hj0mLPbsa+7vmguDKOVVEQdHKDSwoaIDsQ==} + dependencies: + '@types/hast': 2.3.4 + hast-util-raw: 7.2.3 + unified: 10.1.2 + dev: false + + /remark-gfm@3.0.1: + resolution: {integrity: sha512-lEFDoi2PICJyNrACFOfDD3JlLkuSbOa5Wd8EPt06HUdptv8Gn0bxYTdbU/XXQ3swAPkEaGxxPN9cbnMHvVu1Ig==} + dependencies: + '@types/mdast': 3.0.11 + mdast-util-gfm: 2.0.2 + micromark-extension-gfm: 2.0.1 + unified: 10.1.2 + transitivePeerDependencies: + - supports-color + dev: false + + /remark-parse@10.0.1: + resolution: {integrity: sha512-1fUyHr2jLsVOkhbvPRBJ5zTKZZyD6yZzYaWCS6BPBdQ8vEMBCH+9zNCDA6tET/zHCi/jLqjCWtlJZUPk+DbnFw==} + dependencies: + '@types/mdast': 3.0.11 + mdast-util-from-markdown: 1.3.0 + unified: 10.1.2 + transitivePeerDependencies: + - supports-color + dev: false + + /remark-rehype@10.1.0: + resolution: {integrity: sha512-EFmR5zppdBp0WQeDVZ/b66CWJipB2q2VLNFMabzDSGR66Z2fQii83G5gTBbgGEnEEA0QRussvrFHxk1HWGJskw==} + dependencies: + '@types/hast': 2.3.4 + '@types/mdast': 3.0.11 + mdast-util-to-hast: 12.3.0 + unified: 10.1.2 + dev: false + + /repeat-string@1.6.1: + resolution: {integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==} + engines: {node: '>=0.10'} + dev: true + + /request-progress@3.0.0: + resolution: {integrity: sha512-MnWzEHHaxHO2iWiQuHrUPBi/1WeBf5PkxQqNyNvLl9VAYSdXkP8tQ3pBSeCPD+yw0v0Aq1zosWLz0BdeXpWwZg==} + dependencies: + throttleit: 1.0.1 + dev: true + + /require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + dev: true + + /require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + dev: true + + /requires-port@1.0.0: + resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} + dev: true + + /resolve-cwd@3.0.0: + resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} + engines: {node: '>=8'} + dependencies: + resolve-from: 5.0.0 + dev: true + + /resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + dev: true + + /resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + dev: true + + /resolve-global@1.0.0: + resolution: {integrity: sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==} + engines: {node: '>=8'} + dependencies: + global-dirs: 0.1.1 + dev: true + + /resolve-pkg@2.0.0: + resolution: {integrity: sha512-+1lzwXehGCXSeryaISr6WujZzowloigEofRB+dj75y9RRa/obVcYgbHJd53tdYw8pvZj8GojXaaENws8Ktw/hQ==} + engines: {node: '>=8'} + dependencies: + resolve-from: 5.0.0 + dev: true + + /resolve-protobuf-schema@2.1.0: + resolution: {integrity: sha512-kI5ffTiZWmJaS/huM8wZfEMer1eRd7oJQhDuxeCLe3t7N7mX3z94CN0xPxBQxFYQTSNz9T0i+v6inKqSdK8xrQ==} + dependencies: + protocol-buffers-schema: 3.6.0 + dev: true + + /resolve.exports@2.0.2: + resolution: {integrity: sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==} + engines: {node: '>=10'} + dev: true + + /resolve@0.6.3: + resolution: {integrity: sha512-UHBY3viPlJKf85YijDUcikKX6tmF4SokIDp518ZDVT92JNDcG5uKIthaT/owt3Sar0lwtOafsQuwrg22/v2Dwg==} + dev: true + + /resolve@1.22.8: + resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + dependencies: + is-core-module: 2.13.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + /resolve@2.0.0-next.4: + resolution: {integrity: sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==} + dependencies: + is-core-module: 2.13.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + dev: true + + /restore-cursor@3.1.0: + resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} + engines: {node: '>=8'} + dependencies: + onetime: 5.1.2 + signal-exit: 3.0.7 + dev: true + + /reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + /rfdc@1.3.0: + resolution: {integrity: sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==} + dev: true + + /right-now@1.0.0: + resolution: {integrity: sha512-DA8+YS+sMIVpbsuKgy+Z67L9Lxb1p05mNxRpDPNksPDEFir4vmBlUtuN9jkTGn9YMMdlBuK7XQgFiz6ws+yhSg==} + dev: true + + /rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + dependencies: + glob: 7.2.3 + dev: true + + /run-applescript@5.0.0: + resolution: {integrity: sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==} + engines: {node: '>=12'} + dependencies: + execa: 5.1.1 + dev: true + + /run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + dependencies: + queue-microtask: 1.2.3 + + /rw@1.3.3: + resolution: {integrity: sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==} + dev: true + + /rxjs@7.8.1: + resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} + dependencies: + tslib: 2.5.0 + dev: true + + /sade@1.8.1: + resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} + engines: {node: '>=6'} + dependencies: + mri: 1.2.0 + dev: false + + /safe-array-concat@1.0.1: + resolution: {integrity: sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==} + engines: {node: '>=0.4'} + dependencies: + call-bind: 1.0.5 + get-intrinsic: 1.2.2 + has-symbols: 1.0.3 + isarray: 2.0.5 + dev: true + + /safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + dev: true + + /safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + dev: true + + /safe-regex-test@1.0.0: + resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==} + dependencies: + call-bind: 1.0.5 + get-intrinsic: 1.2.2 + is-regex: 1.1.4 + dev: true + + /safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + dev: true + + /sax@1.3.0: + resolution: {integrity: sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==} + dev: true + + /scheduler@0.23.0: + resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} + dependencies: + loose-envify: 1.4.0 + dev: false + + /seed-random@2.2.0: + resolution: {integrity: sha512-34EQV6AAHQGhoc0tn/96a9Fsi6v2xdqe/dMUwljGRaFOzR3EgRmECvD0O8vi8X+/uQ50LGHfkNu/Eue5TPKZkQ==} + dev: true + + /seedrandom@3.0.5: + resolution: {integrity: sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg==} + dev: true + + /semantic-release@22.0.12(typescript@5.3.3): + resolution: {integrity: sha512-0mhiCR/4sZb00RVFJIUlMuiBkW3NMpVIW2Gse7noqEMoFGkvfPPAImEQbkBV8xga4KOPP4FdTRYuLLy32R1fPw==} + engines: {node: ^18.17 || >=20.6.1} + dependencies: + '@semantic-release/commit-analyzer': 11.1.0(semantic-release@22.0.12) + '@semantic-release/error': 4.0.0 + '@semantic-release/github': 9.2.6(semantic-release@22.0.12) + '@semantic-release/npm': 11.0.2(semantic-release@22.0.12) + '@semantic-release/release-notes-generator': 12.1.0(semantic-release@22.0.12) + aggregate-error: 5.0.0 + cosmiconfig: 8.3.6(typescript@5.3.3) + debug: 4.3.4(supports-color@5.5.0) + env-ci: 10.0.0 + execa: 8.0.1 + figures: 6.0.1 + find-versions: 5.1.0 + get-stream: 6.0.1 + git-log-parser: 1.2.0 + hook-std: 3.0.0 + hosted-git-info: 7.0.1 + import-from-esm: 1.3.3 + lodash-es: 4.17.21 + marked: 9.1.6 + marked-terminal: 6.2.0(marked@9.1.6) + micromatch: 4.0.5 + p-each-series: 3.0.0 + p-reduce: 3.0.0 + read-pkg-up: 11.0.0 + resolve-from: 5.0.0 + semver: 7.5.4 + semver-diff: 4.0.0 + signale: 1.4.0 + yargs: 17.7.2 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /semver-diff@4.0.0: + resolution: {integrity: sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA==} + engines: {node: '>=12'} + dependencies: + semver: 7.5.4 + dev: true + + /semver-regex@4.0.5: + resolution: {integrity: sha512-hunMQrEy1T6Jr2uEVjrAIqjwWcQTgOAcIM52C8MY1EZSD3DDNft04XzvYKPqjED65bNVVko0YI38nYeEHCX3yw==} + engines: {node: '>=12'} + dev: true + + /semver@5.7.2: + resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} + dev: true + + /semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + + /semver@7.5.3: + resolution: {integrity: sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==} + engines: {node: '>=10'} + dependencies: + lru-cache: 6.0.0 + dev: true + + /semver@7.5.4: + resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} + engines: {node: '>=10'} + dependencies: + lru-cache: 6.0.0 + dev: true + + /serialize-javascript@6.0.0: + resolution: {integrity: sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==} + dependencies: + randombytes: 2.1.0 + dev: true + + /set-function-length@1.1.1: + resolution: {integrity: sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.1 + get-intrinsic: 1.2.2 + gopd: 1.0.1 + has-property-descriptors: 1.0.0 + dev: true + + /set-function-name@2.0.1: + resolution: {integrity: sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.1 + functions-have-names: 1.2.3 + has-property-descriptors: 1.0.0 + dev: true + + /shallow-copy@0.0.1: + resolution: {integrity: sha512-b6i4ZpVuUxB9h5gfCxPiusKYkqTMOjEbBs4wMaFbkfia4yFv92UKZ6Df8WXcKbn08JNL/abvg3FnMAOfakDvUw==} + dev: true + + /shallowequal@1.1.0: + resolution: {integrity: sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==} + dev: false + + /shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + dependencies: + shebang-regex: 3.0.0 + dev: true + + /shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + dev: true + + /shell-quote@1.8.1: + resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==} + dev: true + + /side-channel@1.0.4: + resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} + dependencies: + call-bind: 1.0.5 + get-intrinsic: 1.2.2 + object-inspect: 1.13.1 + dev: true + + /signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + dev: true + + /signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + dev: true + + /signale@1.4.0: + resolution: {integrity: sha512-iuh+gPf28RkltuJC7W5MRi6XAjTDCAPC/prJUpQoG4vIP3MJZ+GTydVnodXA7pwvTKb2cA0m9OFZW/cdWy/I/w==} + engines: {node: '>=6'} + dependencies: + chalk: 2.4.2 + figures: 2.0.0 + pkg-conf: 2.1.0 + dev: true + + /signum@1.0.0: + resolution: {integrity: sha512-yodFGwcyt59XRh7w5W3jPcIQb3Bwi21suEfT7MAWnBX3iCdklJpgDgvGT9o04UonglZN5SNMfJFkHIR/jO8GHw==} + dev: true + + /sirv@1.0.19: + resolution: {integrity: sha512-JuLThK3TnZG1TAKDwNIqNq6QA2afLOCcm+iE8D1Kj3GA40pSPsxQjjJl0J8X3tsR7T+CP1GavpzLwYkgVLWrZQ==} + engines: {node: '>= 10'} + dependencies: + '@polka/url': 1.0.0-next.23 + mrmime: 1.0.1 + totalist: 1.1.0 + dev: true + + /sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + dev: true + + /skin-tone@2.0.0: + resolution: {integrity: sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA==} + engines: {node: '>=8'} + dependencies: + unicode-emoji-modifier-base: 1.0.0 + dev: true + + /slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + dev: true + + /slash@4.0.0: + resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==} + engines: {node: '>=12'} + dev: true + + /slash@5.1.0: + resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==} + engines: {node: '>=14.16'} + dev: true + + /slice-ansi@3.0.0: + resolution: {integrity: sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==} + engines: {node: '>=8'} + dependencies: + ansi-styles: 4.3.0 + astral-regex: 2.0.0 + is-fullwidth-code-point: 3.0.0 + dev: true + + /slice-ansi@4.0.0: + resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + astral-regex: 2.0.0 + is-fullwidth-code-point: 3.0.0 + dev: true + + /source-map-js@1.0.2: + resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} + engines: {node: '>=0.10.0'} + + /source-map-support@0.5.13: + resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==} + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + dev: true + + /source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + dev: true + + /source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + dev: true + + /source-map@0.7.4: + resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} + engines: {node: '>= 8'} + dev: true + + /space-separated-tokens@1.1.5: + resolution: {integrity: sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==} + dev: false + + /space-separated-tokens@2.0.2: + resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + dev: false + + /spawn-command@0.0.2-1: + resolution: {integrity: sha512-n98l9E2RMSJ9ON1AKisHzz7V42VDiBQGY6PB1BwRglz99wpVsSuGzQ+jOi6lFXBGVTCrRpltvjm+/XA+tpeJrg==} + dev: true + + /spawn-error-forwarder@1.0.0: + resolution: {integrity: sha512-gRjMgK5uFjbCvdibeGJuy3I5OYz6VLoVdsOJdA6wV0WlfQVLFueoqMxwwYD9RODdgb6oUIvlRlsyFSiQkMKu0g==} + dev: true + + /spdx-correct@3.2.0: + resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + dependencies: + spdx-expression-parse: 3.0.1 + spdx-license-ids: 3.0.16 + dev: true + + /spdx-exceptions@2.3.0: + resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==} + dev: true + + /spdx-expression-parse@3.0.1: + resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + dependencies: + spdx-exceptions: 2.3.0 + spdx-license-ids: 3.0.16 + dev: true + + /spdx-license-ids@3.0.16: + resolution: {integrity: sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==} + dev: true + + /split2@1.0.0: + resolution: {integrity: sha512-NKywug4u4pX/AZBB1FCPzZ6/7O+Xhz1qMVbzTvvKvikjO99oPN87SkK08mEY9P63/5lWjK+wgOOgApnTg5r6qg==} + dependencies: + through2: 2.0.5 + dev: true + + /split2@3.2.2: + resolution: {integrity: sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==} + dependencies: + readable-stream: 3.6.2 + dev: true + + /split2@4.2.0: + resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} + engines: {node: '>= 10.x'} + dev: true + + /split@1.0.1: + resolution: {integrity: sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==} + dependencies: + through: 2.3.8 + dev: true + + /sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + dev: true + + /sshpk@1.18.0: + resolution: {integrity: sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==} + engines: {node: '>=0.10.0'} + dependencies: + asn1: 0.2.6 + assert-plus: 1.0.0 + bcrypt-pbkdf: 1.0.2 + dashdash: 1.14.1 + ecc-jsbn: 0.1.2 + getpass: 0.1.7 + jsbn: 0.1.1 + safer-buffer: 2.1.2 + tweetnacl: 0.14.5 + dev: true + + /stack-trace@0.0.9: + resolution: {integrity: sha512-vjUc6sfgtgY0dxCdnc40mK6Oftjo9+2K8H/NG81TMhgL392FtiPA9tn9RLyTxXmTLPJPjF3VyzFp6bsWFLisMQ==} + dev: true + + /stack-utils@2.0.6: + resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} + engines: {node: '>=10'} + dependencies: + escape-string-regexp: 2.0.0 + dev: true + + /stackframe@1.3.4: + resolution: {integrity: sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==} + dev: true + + /static-eval@2.1.1: + resolution: {integrity: sha512-MgWpQ/ZjGieSVB3eOJVs4OA2LT/q1vx98KPCTTQPzq/aLr0YUXTsgryTXr4SLfR0ZfUUCiedM9n/ABeDIyy4mA==} + dependencies: + escodegen: 2.1.0 + dev: true + + /stop-iteration-iterator@1.0.0: + resolution: {integrity: sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==} + engines: {node: '>= 0.4'} + dependencies: + internal-slot: 1.0.5 + dev: true + + /stream-combiner2@1.1.1: + resolution: {integrity: sha512-3PnJbYgS56AeWgtKF5jtJRT6uFJe56Z0Hc5Ngg/6sI6rIt8iiMBTa9cvdyFfpMQjaVHr8dusbNeFGIIonxOvKw==} + dependencies: + duplexer2: 0.1.4 + readable-stream: 2.3.8 + dev: true + + /stream-parser@0.3.1: + resolution: {integrity: sha512-bJ/HgKq41nlKvlhccD5kaCr/P+Hu0wPNKPJOH7en+YrJu/9EgqUF+88w5Jb6KNcjOFMhfX4B2asfeAtIGuHObQ==} + dependencies: + debug: 2.6.9 + transitivePeerDependencies: + - supports-color + dev: true + + /stream-shift@1.0.1: + resolution: {integrity: sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==} + dev: true + + /streamsearch@1.1.0: + resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} + engines: {node: '>=10.0.0'} + dev: false + + /string-argv@0.3.1: + resolution: {integrity: sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==} + engines: {node: '>=0.6.19'} + dev: true + + /string-length@4.0.2: + resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} + engines: {node: '>=10'} + dependencies: + char-regex: 1.0.2 + strip-ansi: 6.0.1 + dev: true + + /string-split-by@1.0.0: + resolution: {integrity: sha512-KaJKY+hfpzNyet/emP81PJA9hTVSfxNLS9SFTWxdCnnW1/zOOwiV248+EfoX7IQFcBaOp4G5YE6xTJMF+pLg6A==} + dependencies: + parenthesis: 3.1.8 + dev: true + + /string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + dev: true + + /string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + dev: true + + /string.prototype.matchall@4.0.8: + resolution: {integrity: sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + get-intrinsic: 1.2.2 + has-symbols: 1.0.3 + internal-slot: 1.0.5 + regexp.prototype.flags: 1.5.1 + side-channel: 1.0.4 + dev: true + + /string.prototype.trim@1.2.8: + resolution: {integrity: sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + dev: true + + /string.prototype.trimend@1.0.7: + resolution: {integrity: sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + dev: true + + /string.prototype.trimstart@1.0.7: + resolution: {integrity: sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + dev: true + + /string_decoder@0.10.31: + resolution: {integrity: sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==} + dev: true + + /string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + dependencies: + safe-buffer: 5.1.2 + dev: true + + /strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + dependencies: + ansi-regex: 5.0.1 + dev: true + + /strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + dependencies: + ansi-regex: 6.0.1 + dev: true + + /strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + dev: true + + /strip-bom@4.0.0: + resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} + engines: {node: '>=8'} + dev: true + + /strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + dev: true + + /strip-final-newline@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} + dev: true + + /strip-indent@3.0.0: + resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} + engines: {node: '>=8'} + dependencies: + min-indent: 1.0.1 + dev: true + + /strip-json-comments@2.0.1: + resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} + engines: {node: '>=0.10.0'} + dev: true + + /strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + dev: true + + /strongly-connected-components@1.0.1: + resolution: {integrity: sha512-i0TFx4wPcO0FwX+4RkLJi1MxmcTv90jNZgxMu9XRnMXMeFUY1VJlIoXpZunPUvUUqbCT1pg5PEkFqqpcaElNaA==} + dev: true + + /style-to-object@0.4.1: + resolution: {integrity: sha512-HFpbb5gr2ypci7Qw+IOhnP2zOU7e77b+rzM+wTzXzfi1PrtBCX0E7Pk4wL4iTLnhzZ+JgEGAhX81ebTg/aYjQw==} + dependencies: + inline-style-parser: 0.1.1 + dev: false + + /styled-components@5.3.11(@babel/core@7.23.7)(react-dom@18.2.0)(react-is@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-uuzIIfnVkagcVHv9nE0VPlHPSCmXIUGKfJ42LNjxCCTDTL5sgnJ8Z7GZBq0EnLYGln77tPpEpExt2+qa+cZqSw==} + engines: {node: '>=10'} + peerDependencies: + react: '>= 16.8.0' + react-dom: '>= 16.8.0' + react-is: '>= 16.8.0' + dependencies: + '@babel/helper-module-imports': 7.22.15 + '@babel/traverse': 7.23.7(supports-color@5.5.0) + '@emotion/is-prop-valid': 1.2.1 + '@emotion/stylis': 0.8.5 + '@emotion/unitless': 0.7.5 + babel-plugin-styled-components: 2.1.4(@babel/core@7.23.7)(styled-components@5.3.11) + css-to-react-native: 3.2.0 + hoist-non-react-statics: 3.3.2 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-is: 18.2.0 + shallowequal: 1.1.0 + supports-color: 5.5.0 + transitivePeerDependencies: + - '@babel/core' + dev: false + + /styled-jsx@5.1.1(@babel/core@7.23.7)(react@18.2.0): + resolution: {integrity: sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==} + engines: {node: '>= 12.0.0'} + peerDependencies: + '@babel/core': '*' + babel-plugin-macros: '*' + react: '>= 16.8.0 || 17.x.x || ^18.0.0-0' + peerDependenciesMeta: + '@babel/core': + optional: true + babel-plugin-macros: + optional: true + dependencies: + '@babel/core': 7.23.7 + client-only: 0.0.1 + react: 18.2.0 + dev: false + + /sucrase@3.32.0: + resolution: {integrity: sha512-ydQOU34rpSyj2TGyz4D2p8rbktIOZ8QY9s+DGLvFU1i5pWJE8vkpruCjGCMHsdXwnD7JDcS+noSwM/a7zyNFDQ==} + engines: {node: '>=8'} + dependencies: + '@jridgewell/gen-mapping': 0.3.3 + commander: 4.1.1 + glob: 7.1.6 + lines-and-columns: 1.2.4 + mz: 2.7.0 + pirates: 4.0.5 + ts-interface-checker: 0.1.13 + + /supercluster@7.1.5: + resolution: {integrity: sha512-EulshI3pGUM66o6ZdH3ReiFcvHpM3vAigyK+vcxdjpJyEbIIrtbmBdY23mGgnI24uXiGFvrGq9Gkum/8U7vJWg==} + dependencies: + kdbush: 3.0.0 + dev: true + + /superscript-text@1.0.0: + resolution: {integrity: sha512-gwu8l5MtRZ6koO0icVTlmN5pm7Dhh1+Xpe9O4x6ObMAsW+3jPbW14d1DsBq1F4wiI+WOFjXF35pslgec/G8yCQ==} + dev: true + + /supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + dependencies: + has-flag: 3.0.0 + + /supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + dependencies: + has-flag: 4.0.0 + dev: true + + /supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + dependencies: + has-flag: 4.0.0 + dev: true + + /supports-hyperlinks@3.0.0: + resolution: {integrity: sha512-QBDPHyPQDRTy9ku4URNGY5Lah8PAaXs6tAAwp55sL5WCsSW7GIfdf6W5ixfziW+t7wh3GVvHyHHyQ1ESsoRvaA==} + engines: {node: '>=14.18'} + dependencies: + has-flag: 4.0.0 + supports-color: 7.2.0 + dev: true + + /supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + /svg-arc-to-cubic-bezier@3.2.0: + resolution: {integrity: sha512-djbJ/vZKZO+gPoSDThGNpKDO+o+bAeA4XQKovvkNCqnIS2t+S4qnLAGQhyyrulhCFRl1WWzAp0wUDV8PpTVU3g==} + dev: true + + /svg-path-bounds@1.0.2: + resolution: {integrity: sha512-H4/uAgLWrppIC0kHsb2/dWUYSmb4GE5UqH06uqWBcg6LBjX2fu0A8+JrO2/FJPZiSsNOKZAhyFFgsLTdYUvSqQ==} + dependencies: + abs-svg-path: 0.1.1 + is-svg-path: 1.0.2 + normalize-svg-path: 1.1.0 + parse-svg-path: 0.1.2 + dev: true + + /svg-path-sdf@1.1.3: + resolution: {integrity: sha512-vJJjVq/R5lSr2KLfVXVAStktfcfa1pNFjFOgyJnzZFXlO/fDZ5DmM8FpnSKKzLPfEYTVeXuVBTHF296TpxuJVg==} + dependencies: + bitmap-sdf: 1.0.4 + draw-svg-path: 1.0.0 + is-svg-path: 1.0.2 + parse-svg-path: 0.1.2 + svg-path-bounds: 1.0.2 + dev: true + + /synckit@0.8.5: + resolution: {integrity: sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q==} + engines: {node: ^14.18.0 || >=16.0.0} + dependencies: + '@pkgr/utils': 2.4.0 + tslib: 2.5.0 + dev: true + + /tailwindcss@3.4.0: + resolution: {integrity: sha512-VigzymniH77knD1dryXbyxR+ePHihHociZbXnLZHUyzf2MMs2ZVqlUrZ3FvpXP8pno9JzmILt1sZPD19M3IxtA==} + engines: {node: '>=14.0.0'} + dependencies: + '@alloc/quick-lru': 5.2.0 + arg: 5.0.2 + chokidar: 3.5.3 + didyoumean: 1.2.2 + dlv: 1.1.3 + fast-glob: 3.3.2 + glob-parent: 6.0.2 + is-glob: 4.0.3 + jiti: 1.21.0 + lilconfig: 2.1.0 + micromatch: 4.0.5 + normalize-path: 3.0.0 + object-hash: 3.0.0 + picocolors: 1.0.0 + postcss: 8.4.32 + postcss-import: 15.1.0(postcss@8.4.32) + postcss-js: 4.0.1(postcss@8.4.32) + postcss-load-config: 4.0.2(postcss@8.4.32) + postcss-nested: 6.0.1(postcss@8.4.32) + postcss-selector-parser: 6.0.12 + resolve: 1.22.8 + sucrase: 3.32.0 + transitivePeerDependencies: + - ts-node + + /tapable@2.2.1: + resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} + engines: {node: '>=6'} + dev: true + + /temp-dir@3.0.0: + resolution: {integrity: sha512-nHc6S/bwIilKHNRgK/3jlhDoIHcp45YgyiwcAk46Tr0LfEqGBVpmiAyuiuxeVE44m3mXnEeVhaipLOEWmH+Njw==} + engines: {node: '>=14.16'} + dev: true + + /tempy@3.1.0: + resolution: {integrity: sha512-7jDLIdD2Zp0bDe5r3D2qtkd1QOCacylBuL7oa4udvN6v2pqr4+LcCr67C8DR1zkpaZ8XosF5m1yQSabKAW6f2g==} + engines: {node: '>=14.16'} + dependencies: + is-stream: 3.0.0 + temp-dir: 3.0.0 + type-fest: 2.19.0 + unique-string: 3.0.0 + dev: true + + /test-exclude@6.0.0: + resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} + engines: {node: '>=8'} + dependencies: + '@istanbuljs/schema': 0.1.3 + glob: 7.2.3 + minimatch: 3.1.2 + dev: true + + /text-extensions@2.4.0: + resolution: {integrity: sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g==} + engines: {node: '>=8'} + dev: true + + /text-segmentation@1.0.3: + resolution: {integrity: sha512-iOiPUo/BGnZ6+54OsWxZidGCsdU8YbE4PSpdPinp7DeMtUJNJBoJ/ouUSTJjHkh1KntHaltHl/gDs2FC4i5+Nw==} + dependencies: + utrie: 1.0.2 + dev: false + + /text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + dev: true + + /thenify-all@1.6.0: + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} + dependencies: + thenify: 3.3.1 + + /thenify@3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + dependencies: + any-promise: 1.3.0 + + /throttleit@1.0.1: + resolution: {integrity: sha512-vDZpf9Chs9mAdfY046mcPt8fg5QSZr37hEH4TXYBnDF+izxgrbRGUAAaBvIk/fJm9aOFCGFd1EsNg5AZCbnQCQ==} + dev: true + + /through2@0.6.5: + resolution: {integrity: sha512-RkK/CCESdTKQZHdmKICijdKKsCRVHs5KsLZ6pACAmF/1GPUQhonHSXWNERctxEp7RmvjdNbZTL5z9V7nSCXKcg==} + dependencies: + readable-stream: 1.0.34 + xtend: 4.0.2 + dev: true + + /through2@2.0.5: + resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} + dependencies: + readable-stream: 2.3.8 + xtend: 4.0.2 + dev: true + + /through2@4.0.2: + resolution: {integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==} + dependencies: + readable-stream: 3.6.2 + dev: true + + /through@2.3.8: + resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + dev: true + + /tiny-case@1.0.3: + resolution: {integrity: sha512-Eet/eeMhkO6TX8mnUteS9zgPbUMQa4I6Kkp5ORiBD5476/m+PIRiumP5tmh5ioJpH7k51Kehawy2UDfsnxxY8Q==} + dev: true + + /tinycolor2@1.6.0: + resolution: {integrity: sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==} + dev: true + + /tinyqueue@2.0.3: + resolution: {integrity: sha512-ppJZNDuKGgxzkHihX8v9v9G5f+18gzaTfrukGrq6ueg0lmH4nqVnA2IPG0AEH3jKEk2GRJCUhDoqpoiw3PHLBA==} + dev: true + + /titleize@3.0.0: + resolution: {integrity: sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==} + engines: {node: '>=12'} + dev: true + + /tmp@0.2.1: + resolution: {integrity: sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==} + engines: {node: '>=8.17.0'} + dependencies: + rimraf: 3.0.2 + dev: true + + /tmpl@1.0.5: + resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} + dev: true + + /to-fast-properties@2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} + + /to-float32@1.1.0: + resolution: {integrity: sha512-keDnAusn/vc+R3iEiSDw8TOF7gPiTLdK1ArvWtYbJQiVfmRg6i/CAvbKq3uIS0vWroAC7ZecN3DjQKw3aSklUg==} + dev: true + + /to-px@1.0.1: + resolution: {integrity: sha512-2y3LjBeIZYL19e5gczp14/uRWFDtDUErJPVN3VU9a7SJO+RjGRtYR47aMN2bZgGlxvW4ZcEz2ddUPVHXcMfuXw==} + dependencies: + parse-unit: 1.0.1 + dev: true + + /to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + dependencies: + is-number: 7.0.0 + + /toggle-selection@1.0.6: + resolution: {integrity: sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==} + dev: false + + /topojson-client@3.1.0: + resolution: {integrity: sha512-605uxS6bcYxGXw9qi62XyrV6Q3xwbndjachmNxu8HWTtVPxZfEJN9fd/SZS1Q54Sn2y0TMyMxFj/cJINqGHrKw==} + hasBin: true + dependencies: + commander: 2.20.3 + dev: true + + /toposort@2.0.2: + resolution: {integrity: sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg==} + dev: true + + /totalist@1.1.0: + resolution: {integrity: sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g==} + engines: {node: '>=6'} + dev: true + + /tough-cookie@4.1.3: + resolution: {integrity: sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==} + engines: {node: '>=6'} + dependencies: + psl: 1.9.0 + punycode: 2.3.0 + universalify: 0.2.0 + url-parse: 1.5.10 + dev: true + + /traverse@0.6.8: + resolution: {integrity: sha512-aXJDbk6SnumuaZSANd21XAo15ucCDE38H4fkqiGsc3MhCK+wOlZvLP9cB/TvpHT0mOyWgC4Z8EwRlzqYSUzdsA==} + engines: {node: '>= 0.4'} + dev: true + + /tree-kill@1.2.2: + resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} + dev: true + + /trim-lines@3.0.1: + resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} + dev: false + + /trim-newlines@3.0.1: + resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} + engines: {node: '>=8'} + dev: true + + /trough@2.1.0: + resolution: {integrity: sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==} + dev: false + + /ts-api-utils@1.0.3(typescript@5.3.3): + resolution: {integrity: sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==} + engines: {node: '>=16.13.0'} + peerDependencies: + typescript: '>=4.2.0' + dependencies: + typescript: 5.3.3 + dev: true + + /ts-dedent@2.2.0: + resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==} + engines: {node: '>=6.10'} + dev: true + + /ts-interface-checker@0.1.13: + resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + + /ts-jest@29.1.1(@babel/core@7.23.7)(esbuild@0.19.11)(jest@29.7.0)(typescript@5.3.3): + resolution: {integrity: sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + peerDependencies: + '@babel/core': '>=7.0.0-beta.0 <8' + '@jest/types': ^29.0.0 + babel-jest: ^29.0.0 + esbuild: '*' + jest: ^29.0.0 + typescript: '>=4.3 <6' + peerDependenciesMeta: + '@babel/core': + optional: true + '@jest/types': + optional: true + babel-jest: + optional: true + esbuild: + optional: true + dependencies: + '@babel/core': 7.23.7 + bs-logger: 0.2.6 + esbuild: 0.19.11 + fast-json-stable-stringify: 2.1.0 + jest: 29.7.0(@types/node@18.15.5) + jest-util: 29.7.0 + json5: 2.2.3 + lodash.memoize: 4.1.2 + make-error: 1.3.6 + semver: 7.5.4 + typescript: 5.3.3 + yargs-parser: 21.1.1 + dev: true + + /tsconfig-paths@3.15.0: + resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} + dependencies: + '@types/json5': 0.0.29 + json5: 1.0.2 + minimist: 1.2.8 + strip-bom: 3.0.0 + dev: true + + /tslib@1.14.1: + resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + dev: true + + /tslib@2.5.0: + resolution: {integrity: sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==} + + /tsutils@3.21.0(typescript@5.3.3): + resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} + engines: {node: '>= 6'} + peerDependencies: + typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' + dependencies: + tslib: 1.14.1 + typescript: 5.3.3 + dev: true + + /tunnel-agent@0.6.0: + resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + dependencies: + safe-buffer: 5.2.1 + dev: true + + /tweetnacl@0.14.5: + resolution: {integrity: sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==} + dev: true + + /type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + dev: true + + /type-detect@4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} + dev: true + + /type-fest@0.18.1: + resolution: {integrity: sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==} + engines: {node: '>=10'} + dev: true + + /type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + dev: true + + /type-fest@0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} + dev: true + + /type-fest@0.6.0: + resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} + engines: {node: '>=8'} + dev: true + + /type-fest@0.8.1: + resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} + engines: {node: '>=8'} + dev: true + + /type-fest@1.4.0: + resolution: {integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==} + engines: {node: '>=10'} + dev: true + + /type-fest@2.19.0: + resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} + engines: {node: '>=12.20'} + dev: true + + /type-fest@3.13.1: + resolution: {integrity: sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==} + engines: {node: '>=14.16'} + dev: true + + /type-fest@4.9.0: + resolution: {integrity: sha512-KS/6lh/ynPGiHD/LnAobrEFq3Ad4pBzOlJ1wAnJx9N4EYoqFhMfLIBjUT2UEx4wg5ZE+cC1ob6DCSpppVo+rtg==} + engines: {node: '>=16'} + dev: true + + /type@1.2.0: + resolution: {integrity: sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==} + dev: true + + /type@2.7.2: + resolution: {integrity: sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==} + dev: true + + /typed-array-buffer@1.0.0: + resolution: {integrity: sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + get-intrinsic: 1.2.2 + is-typed-array: 1.1.12 + dev: true + + /typed-array-byte-length@1.0.0: + resolution: {integrity: sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + for-each: 0.3.3 + has-proto: 1.0.1 + is-typed-array: 1.1.12 + dev: true + + /typed-array-byte-offset@1.0.0: + resolution: {integrity: sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==} + engines: {node: '>= 0.4'} + dependencies: + available-typed-arrays: 1.0.5 + call-bind: 1.0.5 + for-each: 0.3.3 + has-proto: 1.0.1 + is-typed-array: 1.1.12 + dev: true + + /typed-array-length@1.0.4: + resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==} + dependencies: + call-bind: 1.0.5 + for-each: 0.3.3 + is-typed-array: 1.1.12 + dev: true + + /typedarray-pool@1.2.0: + resolution: {integrity: sha512-YTSQbzX43yvtpfRtIDAYygoYtgT+Rpjuxy9iOpczrjpXLgGoyG7aS5USJXV2d3nn8uHTeb9rXDvzS27zUg5KYQ==} + dependencies: + bit-twiddle: 1.0.2 + dup: 1.0.0 + dev: true + + /typedarray@0.0.6: + resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} + dev: true + + /typescript@5.3.3: + resolution: {integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==} + engines: {node: '>=14.17'} + + /uglify-js@3.17.4: + resolution: {integrity: sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==} + engines: {node: '>=0.8.0'} + requiresBuild: true + dev: true + optional: true + + /unbox-primitive@1.0.2: + resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} + dependencies: + call-bind: 1.0.5 + has-bigints: 1.0.2 + has-symbols: 1.0.3 + which-boxed-primitive: 1.0.2 + dev: true + + /undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + + /unicode-emoji-modifier-base@1.0.0: + resolution: {integrity: sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g==} + engines: {node: '>=4'} + dev: true + + /unicorn-magic@0.1.0: + resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==} + engines: {node: '>=18'} + dev: true + + /unified@10.1.2: + resolution: {integrity: sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==} + dependencies: + '@types/unist': 2.0.6 + bail: 2.0.2 + extend: 3.0.2 + is-buffer: 2.0.5 + is-plain-obj: 4.1.0 + trough: 2.1.0 + vfile: 5.3.7 + dev: false + + /unique-string@3.0.0: + resolution: {integrity: sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==} + engines: {node: '>=12'} + dependencies: + crypto-random-string: 4.0.0 + dev: true + + /unist-util-generated@2.0.1: + resolution: {integrity: sha512-qF72kLmPxAw0oN2fwpWIqbXAVyEqUzDHMsbtPvOudIlUzXYFIeQIuxXQCRCFh22B7cixvU0MG7m3MW8FTq/S+A==} + dev: false + + /unist-util-is@5.2.1: + resolution: {integrity: sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==} + dependencies: + '@types/unist': 2.0.6 + dev: false + + /unist-util-position@4.0.4: + resolution: {integrity: sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg==} + dependencies: + '@types/unist': 2.0.6 + dev: false + + /unist-util-stringify-position@3.0.3: + resolution: {integrity: sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==} + dependencies: + '@types/unist': 2.0.6 + dev: false + + /unist-util-visit-parents@5.1.3: + resolution: {integrity: sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==} + dependencies: + '@types/unist': 2.0.6 + unist-util-is: 5.2.1 + dev: false + + /unist-util-visit@4.1.2: + resolution: {integrity: sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==} + dependencies: + '@types/unist': 2.0.6 + unist-util-is: 5.2.1 + unist-util-visit-parents: 5.1.3 + dev: false + + /universal-user-agent@6.0.1: + resolution: {integrity: sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==} + dev: true + + /universalify@0.2.0: + resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} + engines: {node: '>= 4.0.0'} + dev: true + + /universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + dev: true + + /unquote@1.1.1: + resolution: {integrity: sha512-vRCqFv6UhXpWxZPyGDh/F3ZpNv8/qo7w6iufLpQg9aKnQ71qM4B5KiI7Mia9COcjEhrO9LueHpMYjYzsWH3OIg==} + dev: true + + /untildify@4.0.0: + resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==} + engines: {node: '>=8'} + dev: true + + /update-browserslist-db@1.0.11(browserslist@4.21.5): + resolution: {integrity: sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + dependencies: + browserslist: 4.21.5 + escalade: 3.1.1 + picocolors: 1.0.0 + + /update-browserslist-db@1.0.13(browserslist@4.22.2): + resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + dependencies: + browserslist: 4.22.2 + escalade: 3.1.1 + picocolors: 1.0.0 + + /update-diff@1.1.0: + resolution: {integrity: sha512-rCiBPiHxZwT4+sBhEbChzpO5hYHjm91kScWgdHf4Qeafs6Ba7MBl+d9GlGv72bcTZQO0sLmtQS1pHSWoCLtN/A==} + dev: true + + /upper-case-first@2.0.2: + resolution: {integrity: sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==} + dependencies: + tslib: 2.5.0 + dev: true + + /uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + dependencies: + punycode: 2.3.0 + dev: true + + /url-join@5.0.0: + resolution: {integrity: sha512-n2huDr9h9yzd6exQVnH/jU5mr+Pfx08LRXXZhkLLetAMESRj+anQsTAh940iMrIetKAmry9coFuZQ2jY8/p3WA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: true + + /url-parse@1.5.10: + resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} + dependencies: + querystringify: 2.2.0 + requires-port: 1.0.0 + dev: true + + /use-callback-ref@1.3.0(@types/react@18.0.28)(react@18.2.0): + resolution: {integrity: sha512-3FT9PRuRdbB9HfXhEq35u4oZkvpJ5kuYbpqhCfmiZyReuRgpnhDlbr2ZEnnuS0RrJAPn6l23xjFg9kpDM+Ms7w==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.0.28 + react: 18.2.0 + tslib: 2.5.0 + dev: false + + /use-composed-ref@1.3.0(react@18.2.0): + resolution: {integrity: sha512-GLMG0Jc/jiKov/3Ulid1wbv3r54K9HlMW29IWcDFPEqFkSO2nS0MuefWgMJpeHQ9YJeXDL3ZUF+P3jdXlZX/cQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + dependencies: + react: 18.2.0 + dev: false + + /use-isomorphic-layout-effect@1.1.2(@types/react@18.0.28)(react@18.2.0): + resolution: {integrity: sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.0.28 + react: 18.2.0 + dev: false + + /use-latest@1.2.1(@types/react@18.0.28)(react@18.2.0): + resolution: {integrity: sha512-xA+AVm/Wlg3e2P/JiItTziwS7FK92LWrDB0p+hgXloIMuVCeJJ8v6f0eeHyPZaJrM+usM1FkFfbNCrJGs8A/zw==} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.0.28 + react: 18.2.0 + use-isomorphic-layout-effect: 1.1.2(@types/react@18.0.28)(react@18.2.0) + dev: false + + /use-sidecar@1.1.2(@types/react@18.0.28)(react@18.2.0): + resolution: {integrity: sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^16.9.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.0.28 + detect-node-es: 1.1.0 + react: 18.2.0 + tslib: 2.5.0 + dev: false + + /use-sync-external-store@1.2.0(react@18.2.0): + resolution: {integrity: sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + dependencies: + react: 18.2.0 + dev: false + + /util-arity@1.1.0: + resolution: {integrity: sha512-kkyIsXKwemfSy8ZEoaIz06ApApnWsk5hQO0vLjZS6UkBiGiW++Jsyb8vSBoc0WKlffGoGs5yYy/j5pp8zckrFA==} + dev: true + + /util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + /utrie@1.0.2: + resolution: {integrity: sha512-1MLa5ouZiOmQzUbjbu9VmjLzn1QLXBhwpUa7kdLUQK+KQ5KA9I1vk5U4YHe/X2Ch7PYnJfWuWT+VbuxbGwljhw==} + dependencies: + base64-arraybuffer: 1.0.2 + dev: false + + /uuid@8.3.2: + resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + + /uuid@9.0.0: + resolution: {integrity: sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==} + + /uuid@9.0.1: + resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} + dev: true + + /uvu@0.5.6: + resolution: {integrity: sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==} + engines: {node: '>=8'} + dependencies: + dequal: 2.0.3 + diff: 5.1.0 + kleur: 4.1.5 + sade: 1.8.1 + dev: false + + /v8-to-istanbul@9.2.0: + resolution: {integrity: sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==} + engines: {node: '>=10.12.0'} + dependencies: + '@jridgewell/trace-mapping': 0.3.18 + '@types/istanbul-lib-coverage': 2.0.6 + convert-source-map: 2.0.0 + dev: true + + /validate-npm-package-license@3.0.4: + resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + dependencies: + spdx-correct: 3.2.0 + spdx-expression-parse: 3.0.1 + dev: true + + /verror@1.10.0: + resolution: {integrity: sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==} + engines: {'0': node >=0.6.0} + dependencies: + assert-plus: 1.0.0 + core-util-is: 1.0.2 + extsprintf: 1.3.0 + dev: true + + /vfile-location@4.1.0: + resolution: {integrity: sha512-YF23YMyASIIJXpktBa4vIGLJ5Gs88UB/XePgqPmTa7cDA+JeO3yclbpheQYCHjVHBn/yePzrXuygIL+xbvRYHw==} + dependencies: + '@types/unist': 2.0.6 + vfile: 5.3.7 + dev: false + + /vfile-message@3.1.4: + resolution: {integrity: sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==} + dependencies: + '@types/unist': 2.0.6 + unist-util-stringify-position: 3.0.3 + dev: false + + /vfile@5.3.7: + resolution: {integrity: sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==} + dependencies: + '@types/unist': 2.0.6 + is-buffer: 2.0.5 + unist-util-stringify-position: 3.0.3 + vfile-message: 3.1.4 + dev: false + + /victory-vendor@36.6.10: + resolution: {integrity: sha512-7YqYGtsA4mByokBhCjk+ewwPhUfzhR1I3Da6/ZsZUv/31ceT77RKoaqrxRq5Ki+9we4uzf7+A+7aG2sfYhm7nA==} + dependencies: + '@types/d3-array': 3.0.4 + '@types/d3-ease': 3.0.0 + '@types/d3-interpolate': 3.0.1 + '@types/d3-scale': 4.0.3 + '@types/d3-shape': 3.1.1 + '@types/d3-time': 3.0.0 + '@types/d3-timer': 3.0.0 + d3-array: 3.2.3 + d3-ease: 3.0.1 + d3-interpolate: 3.0.1 + d3-scale: 4.0.2 + d3-shape: 3.2.0 + d3-time: 3.1.0 + d3-timer: 3.0.1 + dev: false + + /vt-pbf@3.1.3: + resolution: {integrity: sha512-2LzDFzt0mZKZ9IpVF2r69G9bXaP2Q2sArJCmcCgvfTdCCZzSyz4aCLoQyUilu37Ll56tCblIZrXFIjNUpGIlmA==} + dependencies: + '@mapbox/point-geometry': 0.1.0 + '@mapbox/vector-tile': 1.3.1 + pbf: 3.2.1 + dev: true + + /walker@1.0.8: + resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} + dependencies: + makeerror: 1.0.12 + dev: true + + /watchpack@2.4.0: + resolution: {integrity: sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==} + engines: {node: '>=10.13.0'} + dependencies: + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + dev: false + + /weak-map@1.0.8: + resolution: {integrity: sha512-lNR9aAefbGPpHO7AEnY0hCFjz1eTkWCXYvkTRrTHs9qv8zJp+SkVYpzfLIFXQQiG3tVvbNFQgVg2bQS8YGgxyw==} + dev: true + + /web-namespaces@2.0.1: + resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} + dev: false + + /webgl-context@2.2.0: + resolution: {integrity: sha512-q/fGIivtqTT7PEoF07axFIlHNk/XCPaYpq64btnepopSWvKNFkoORlQYgqDigBIuGA1ExnFd/GnSUnBNEPQY7Q==} + dependencies: + get-canvas-context: 1.0.2 + dev: true + + /webpack-bundle-analyzer@4.7.0: + resolution: {integrity: sha512-j9b8ynpJS4K+zfO5GGwsAcQX4ZHpWV+yRiHDiL+bE0XHJ8NiPYLTNVQdlFYWxtpg9lfAQNlwJg16J9AJtFSXRg==} + engines: {node: '>= 10.13.0'} + dependencies: + acorn: 8.8.2 + acorn-walk: 8.2.0 + chalk: 4.1.2 + commander: 7.2.0 + gzip-size: 6.0.0 + lodash: 4.17.21 + opener: 1.5.2 + sirv: 1.0.19 + ws: 7.5.9 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + dev: true + + /which-boxed-primitive@1.0.2: + resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} + dependencies: + is-bigint: 1.0.4 + is-boolean-object: 1.1.2 + is-number-object: 1.0.7 + is-string: 1.0.7 + is-symbol: 1.0.4 + dev: true + + /which-builtin-type@1.1.3: + resolution: {integrity: sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==} + engines: {node: '>= 0.4'} + dependencies: + function.prototype.name: 1.1.6 + has-tostringtag: 1.0.0 + is-async-function: 2.0.0 + is-date-object: 1.0.5 + is-finalizationregistry: 1.0.2 + is-generator-function: 1.0.10 + is-regex: 1.1.4 + is-weakref: 1.0.2 + isarray: 2.0.5 + which-boxed-primitive: 1.0.2 + which-collection: 1.0.1 + which-typed-array: 1.1.13 + dev: true + + /which-collection@1.0.1: + resolution: {integrity: sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==} + dependencies: + is-map: 2.0.2 + is-set: 2.0.2 + is-weakmap: 2.0.1 + is-weakset: 2.0.2 + dev: true + + /which-pm-runs@1.1.0: + resolution: {integrity: sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA==} + engines: {node: '>=4'} + dev: true + + /which-typed-array@1.1.13: + resolution: {integrity: sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==} + engines: {node: '>= 0.4'} + dependencies: + available-typed-arrays: 1.0.5 + call-bind: 1.0.5 + for-each: 0.3.3 + gopd: 1.0.1 + has-tostringtag: 1.0.0 + dev: true + + /which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + dependencies: + isexe: 2.0.0 + dev: true + + /wordwrap@1.0.0: + resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} + dev: true + + /workerpool@6.2.1: + resolution: {integrity: sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==} + dev: true + + /world-calendars@1.0.3: + resolution: {integrity: sha512-sAjLZkBnsbHkHWVhrsCU5Sa/EVuf9QqgvrN8zyJ2L/F9FR9Oc6CvVK0674+PGAtmmmYQMH98tCUSO4QLQv3/TQ==} + dependencies: + object-assign: 4.1.1 + dev: true + + /wrap-ansi@6.2.0: + resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} + engines: {node: '>=8'} + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + dev: true + + /wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + dev: true + + /wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 + dev: true + + /wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + /write-file-atomic@4.0.2: + resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + dependencies: + imurmurhash: 0.1.4 + signal-exit: 3.0.7 + dev: true + + /ws@7.5.9: + resolution: {integrity: sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==} + engines: {node: '>=8.3.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + dev: true + + /xmlbuilder@15.1.1: + resolution: {integrity: sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==} + engines: {node: '>=8.0'} + dev: true + + /xtend@2.2.0: + resolution: {integrity: sha512-SLt5uylT+4aoXxXuwtQp5ZnMMzhDb1Xkg4pEqc00WUJCQifPfV9Ub1VrNhp9kXkrjZD2I2Hl8WnjP37jzZLPZw==} + engines: {node: '>=0.4'} + dev: true + + /xtend@4.0.2: + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} + + /y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + dev: true + + /yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + /yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + + /yaml@2.3.4: + resolution: {integrity: sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==} + engines: {node: '>= 14'} + + /yargs-parser@20.2.4: + resolution: {integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==} + engines: {node: '>=10'} + dev: true + + /yargs-parser@20.2.9: + resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} + engines: {node: '>=10'} + dev: true + + /yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + dev: true + + /yargs-unparser@2.0.0: + resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==} + engines: {node: '>=10'} + dependencies: + camelcase: 6.3.0 + decamelize: 4.0.0 + flat: 5.0.2 + is-plain-obj: 2.1.0 + dev: true + + /yargs@16.2.0: + resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} + engines: {node: '>=10'} + dependencies: + cliui: 7.0.4 + escalade: 3.1.1 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 20.2.9 + dev: true + + /yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + dependencies: + cliui: 8.0.1 + escalade: 3.1.1 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + dev: true + + /yauzl@2.10.0: + resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} + dependencies: + buffer-crc32: 0.2.13 + fd-slicer: 1.1.0 + dev: true + + /yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + dev: true + + /yup@1.2.0: + resolution: {integrity: sha512-PPqYKSAXjpRCgLgLKVGPA33v5c/WgEx3wi6NFjIiegz90zSwyMpvTFp/uGcVnnbx6to28pgnzp/q8ih3QRjLMQ==} + dependencies: + property-expr: 2.0.6 + tiny-case: 1.0.3 + toposort: 2.0.2 + type-fest: 2.19.0 + dev: true + + /zod@3.21.4: + resolution: {integrity: sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==} + dev: false + + /zustand@4.3.8(react@18.2.0): + resolution: {integrity: sha512-4h28KCkHg5ii/wcFFJ5Fp+k1J3gJoasaIbppdgZFO4BPJnsNxL0mQXBSFgOgAdCdBj35aDTPvdAJReTMntFPGg==} + engines: {node: '>=12.7.0'} + peerDependencies: + immer: '>=9.0' + react: '>=16.8' + peerDependenciesMeta: + immer: + optional: true + react: + optional: true + dependencies: + react: 18.2.0 + use-sync-external-store: 1.2.0(react@18.2.0) + dev: false + + /zwitch@2.0.4: + resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} + dev: false diff --git a/frontend/postcss.config.cjs b/frontend/postcss.config.cjs new file mode 100644 index 00000000..e305dd92 --- /dev/null +++ b/frontend/postcss.config.cjs @@ -0,0 +1,8 @@ +const config = { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +}; + +module.exports = config; diff --git a/frontend/prettier.config.cjs b/frontend/prettier.config.cjs new file mode 100644 index 00000000..2495a36c --- /dev/null +++ b/frontend/prettier.config.cjs @@ -0,0 +1,10 @@ +/** @type {import("prettier").Config} */ +const config = { + plugins: [require.resolve('prettier-plugin-tailwindcss')], + trailingComma: 'es5', + tabWidth: 2, + printWidth: 120, + semi: false, +}; + +module.exports = config; diff --git a/frontend/prisma/migrations/migration_lock.toml b/frontend/prisma/migrations/migration_lock.toml new file mode 100644 index 00000000..99e4f200 --- /dev/null +++ b/frontend/prisma/migrations/migration_lock.toml @@ -0,0 +1,3 @@ +# Please do not edit this file manually +# It should be added in your version-control system (i.e. Git) +provider = "postgresql" diff --git a/frontend/prisma/schema.prisma b/frontend/prisma/schema.prisma new file mode 100644 index 00000000..c790ece3 --- /dev/null +++ b/frontend/prisma/schema.prisma @@ -0,0 +1,55 @@ +datasource db { + provider = "postgresql" + url = env("DATABASE_URL") + directUrl = env("DIRECT_DATABASE_URL") +} + +generator client { + provider = "prisma-client-js" +} + +model Account { + id String @id @default(cuid()) + userId String + type String + provider String + providerAccountId String + refresh_token String? @db.Text + access_token String? @db.Text + expires_at Int? + token_type String? + scope String? + id_token String? @db.Text + session_state String? + user User @relation(fields: [userId], references: [id], onDelete: Cascade) + + @@unique([provider, providerAccountId]) +} + +model Session { + id String @id @default(cuid()) + sessionToken String @unique + userId String + expires DateTime + user User @relation(fields: [userId], references: [id], onDelete: Cascade) +} + +model User { + id String @id @default(cuid()) + name String? + email String? @unique + emailVerified DateTime? + image String? + credits Int @default(3) + location String? + accounts Account[] + sessions Session[] +} + +model VerificationToken { + identifier String + token String @unique + expires DateTime + + @@unique([identifier, token]) +} diff --git a/frontend/prismalib/prismadb.ts b/frontend/prismalib/prismadb.ts new file mode 100644 index 00000000..95bfd734 --- /dev/null +++ b/frontend/prismalib/prismadb.ts @@ -0,0 +1,11 @@ +// Disabled for VERCEL deployment (Nextjs without DB connection) +// import { PrismaClient } from "@prisma/client" + +// declare global { +// var prisma: PrismaClient | undefined +// } + +// const client = globalThis.prisma || new PrismaClient() +// if (process.env.NODE_ENV !== "production") globalThis.prisma = client + +// export default client diff --git a/frontend/public/favicon.ico b/frontend/public/favicon.ico new file mode 100644 index 00000000..4b996a30 Binary files /dev/null and b/frontend/public/favicon.ico differ diff --git a/frontend/public/fonts/sans/BCGHenSansBold.ttf b/frontend/public/fonts/sans/BCGHenSansBold.ttf new file mode 100755 index 00000000..d5c320d7 Binary files /dev/null and b/frontend/public/fonts/sans/BCGHenSansBold.ttf differ diff --git a/frontend/public/fonts/sans/BCGHenSansBoldIta.ttf b/frontend/public/fonts/sans/BCGHenSansBoldIta.ttf new file mode 100755 index 00000000..bb05c8ab Binary files /dev/null and b/frontend/public/fonts/sans/BCGHenSansBoldIta.ttf differ diff --git a/frontend/public/fonts/sans/BCGHenSansItalic.ttf b/frontend/public/fonts/sans/BCGHenSansItalic.ttf new file mode 100755 index 00000000..1ac4221e Binary files /dev/null and b/frontend/public/fonts/sans/BCGHenSansItalic.ttf differ diff --git a/frontend/public/fonts/sans/BCGHenSansLight.ttf b/frontend/public/fonts/sans/BCGHenSansLight.ttf new file mode 100755 index 00000000..fe116416 Binary files /dev/null and b/frontend/public/fonts/sans/BCGHenSansLight.ttf differ diff --git a/frontend/public/fonts/sans/BCGHenSansLightItalic.ttf b/frontend/public/fonts/sans/BCGHenSansLightItalic.ttf new file mode 100755 index 00000000..f6b7d0c5 Binary files /dev/null and b/frontend/public/fonts/sans/BCGHenSansLightItalic.ttf differ diff --git a/frontend/public/fonts/sans/BCGHenSansRegular.ttf b/frontend/public/fonts/sans/BCGHenSansRegular.ttf new file mode 100755 index 00000000..a0c2d576 Binary files /dev/null and b/frontend/public/fonts/sans/BCGHenSansRegular.ttf differ diff --git a/frontend/public/fonts/sans/BCGHenSansThin.ttf b/frontend/public/fonts/sans/BCGHenSansThin.ttf new file mode 100755 index 00000000..cfb1e86a Binary files /dev/null and b/frontend/public/fonts/sans/BCGHenSansThin.ttf differ diff --git a/frontend/public/fonts/sans/BCGHenSansThinItalic.ttf b/frontend/public/fonts/sans/BCGHenSansThinItalic.ttf new file mode 100755 index 00000000..3726666a Binary files /dev/null and b/frontend/public/fonts/sans/BCGHenSansThinItalic.ttf differ diff --git a/frontend/public/fonts/serif/BCGHenSerifBold.ttf b/frontend/public/fonts/serif/BCGHenSerifBold.ttf new file mode 100755 index 00000000..b3a0f25c Binary files /dev/null and b/frontend/public/fonts/serif/BCGHenSerifBold.ttf differ diff --git a/frontend/public/fonts/serif/BCGHenSerifBoldIta.ttf b/frontend/public/fonts/serif/BCGHenSerifBoldIta.ttf new file mode 100755 index 00000000..b3196306 Binary files /dev/null and b/frontend/public/fonts/serif/BCGHenSerifBoldIta.ttf differ diff --git a/frontend/public/fonts/serif/BCGHenSerifHead.ttf b/frontend/public/fonts/serif/BCGHenSerifHead.ttf new file mode 100755 index 00000000..ab00e9dc Binary files /dev/null and b/frontend/public/fonts/serif/BCGHenSerifHead.ttf differ diff --git a/frontend/public/fonts/serif/BCGHenSerifItalic.ttf b/frontend/public/fonts/serif/BCGHenSerifItalic.ttf new file mode 100755 index 00000000..fc248080 Binary files /dev/null and b/frontend/public/fonts/serif/BCGHenSerifItalic.ttf differ diff --git a/frontend/public/fonts/serif/BCGHenSerifRegular.ttf b/frontend/public/fonts/serif/BCGHenSerifRegular.ttf new file mode 100755 index 00000000..c5d9ffdf Binary files /dev/null and b/frontend/public/fonts/serif/BCGHenSerifRegular.ttf differ diff --git a/frontend/public/icons/Github.png b/frontend/public/icons/Github.png new file mode 100644 index 00000000..50b81752 Binary files /dev/null and b/frontend/public/icons/Github.png differ diff --git a/frontend/public/icons/google.png b/frontend/public/icons/google.png new file mode 100644 index 00000000..7b903159 Binary files /dev/null and b/frontend/public/icons/google.png differ diff --git a/frontend/public/logo.png b/frontend/public/logo.png new file mode 100644 index 00000000..88440b5e Binary files /dev/null and b/frontend/public/logo.png differ diff --git a/frontend/public/logo_full.png b/frontend/public/logo_full.png new file mode 100644 index 00000000..c95cef76 Binary files /dev/null and b/frontend/public/logo_full.png differ diff --git a/frontend/public/logo_full_dark.png b/frontend/public/logo_full_dark.png new file mode 100644 index 00000000..f2108de8 Binary files /dev/null and b/frontend/public/logo_full_dark.png differ diff --git a/frontend/src/api-client/core/ApiError.ts b/frontend/src/api-client/core/ApiError.ts new file mode 100644 index 00000000..37521a6a --- /dev/null +++ b/frontend/src/api-client/core/ApiError.ts @@ -0,0 +1,25 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { ApiRequestOptions } from "./ApiRequestOptions" +import type { ApiResult } from "./ApiResult" + +export class ApiError extends Error { + public readonly url: string + public readonly status: number + public readonly statusText: string + public readonly body: any + public readonly request: ApiRequestOptions + + constructor(request: ApiRequestOptions, response: ApiResult, message: string) { + super(message) + + this.name = "ApiError" + this.url = response.url + this.status = response.status + this.statusText = response.statusText + this.body = response.body + this.request = request + } +} diff --git a/frontend/src/api-client/core/ApiRequestOptions.ts b/frontend/src/api-client/core/ApiRequestOptions.ts new file mode 100644 index 00000000..bb90b0f2 --- /dev/null +++ b/frontend/src/api-client/core/ApiRequestOptions.ts @@ -0,0 +1,17 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export type ApiRequestOptions = { + readonly method: "GET" | "PUT" | "POST" | "DELETE" | "OPTIONS" | "HEAD" | "PATCH" + readonly url: string + readonly path?: Record + readonly cookies?: Record + readonly headers?: Record + readonly query?: Record + readonly formData?: Record + readonly body?: any + readonly mediaType?: string + readonly responseHeader?: string + readonly errors?: Record +} diff --git a/frontend/src/api-client/core/ApiResult.ts b/frontend/src/api-client/core/ApiResult.ts new file mode 100644 index 00000000..2fdff5f1 --- /dev/null +++ b/frontend/src/api-client/core/ApiResult.ts @@ -0,0 +1,11 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export type ApiResult = { + readonly url: string + readonly ok: boolean + readonly status: number + readonly statusText: string + readonly body: any +} diff --git a/frontend/src/api-client/core/CancelablePromise.ts b/frontend/src/api-client/core/CancelablePromise.ts new file mode 100644 index 00000000..8782a5f4 --- /dev/null +++ b/frontend/src/api-client/core/CancelablePromise.ts @@ -0,0 +1,126 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export class CancelError extends Error { + constructor(message: string) { + super(message) + this.name = "CancelError" + } + + public get isCancelled(): boolean { + return true + } +} + +export interface OnCancel { + readonly isResolved: boolean + readonly isRejected: boolean + readonly isCancelled: boolean + + (cancelHandler: () => void): void +} + +export class CancelablePromise implements Promise { + #isResolved: boolean + #isRejected: boolean + #isCancelled: boolean + readonly #cancelHandlers: (() => void)[] + readonly #promise: Promise + #resolve?: (value: T | PromiseLike) => void + #reject?: (reason?: any) => void + + constructor( + executor: (resolve: (value: T | PromiseLike) => void, reject: (reason?: any) => void, onCancel: OnCancel) => void + ) { + this.#isResolved = false + this.#isRejected = false + this.#isCancelled = false + this.#cancelHandlers = [] + this.#promise = new Promise((resolve, reject) => { + this.#resolve = resolve + this.#reject = reject + + const onResolve = (value: T | PromiseLike): void => { + if (this.#isResolved || this.#isRejected || this.#isCancelled) { + return + } + this.#isResolved = true + this.#resolve?.(value) + } + + const onReject = (reason?: any): void => { + if (this.#isResolved || this.#isRejected || this.#isCancelled) { + return + } + this.#isRejected = true + this.#reject?.(reason) + } + + const onCancel = (cancelHandler: () => void): void => { + if (this.#isResolved || this.#isRejected || this.#isCancelled) { + return + } + this.#cancelHandlers.push(cancelHandler) + } + + Object.defineProperty(onCancel, "isResolved", { + get: (): boolean => this.#isResolved, + }) + + Object.defineProperty(onCancel, "isRejected", { + get: (): boolean => this.#isRejected, + }) + + Object.defineProperty(onCancel, "isCancelled", { + get: (): boolean => this.#isCancelled, + }) + + return executor(onResolve, onReject, onCancel as OnCancel) + }) + } + + get [Symbol.toStringTag]() { + return "Cancellable Promise" + } + + public then( + onFulfilled?: ((value: T) => TResult1 | PromiseLike) | null, + onRejected?: ((reason: any) => TResult2 | PromiseLike) | null + ): Promise { + return this.#promise.then(onFulfilled, onRejected) + } + + public catch( + onRejected?: ((reason: any) => TResult | PromiseLike) | null + ): Promise { + return this.#promise.catch(onRejected) + } + + public finally(onFinally?: (() => void) | null): Promise { + return this.#promise.finally(onFinally) + } + + public cancel(): void { + if (this.#isResolved || this.#isRejected || this.#isCancelled) { + return + } + this.#isCancelled = true + if (this.#cancelHandlers.length) { + try { + for (const cancelHandler of this.#cancelHandlers) { + cancelHandler() + } + } catch (error) { + console.warn("Cancellation threw an error", error) + return + } + } + this.#cancelHandlers.length = 0 + this.#reject?.(new CancelError("Request aborted")) + } + + public get isCancelled(): boolean { + return this.#isCancelled + } +} diff --git a/frontend/src/api-client/core/OpenAPI.ts b/frontend/src/api-client/core/OpenAPI.ts new file mode 100644 index 00000000..24144512 --- /dev/null +++ b/frontend/src/api-client/core/OpenAPI.ts @@ -0,0 +1,32 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { ApiRequestOptions } from "./ApiRequestOptions" + +type Resolver = (options: ApiRequestOptions) => Promise +type Headers = Record + +export type OpenAPIConfig = { + BASE: string + VERSION: string + WITH_CREDENTIALS: boolean + CREDENTIALS: "include" | "omit" | "same-origin" + TOKEN?: string | Resolver | undefined + USERNAME?: string | Resolver | undefined + PASSWORD?: string | Resolver | undefined + HEADERS?: Headers | Resolver | undefined + ENCODE_PATH?: ((path: string) => string) | undefined +} + +export const OpenAPI: OpenAPIConfig = { + BASE: "", + VERSION: "1", + WITH_CREDENTIALS: false, + CREDENTIALS: "include", + TOKEN: undefined, + USERNAME: undefined, + PASSWORD: undefined, + HEADERS: undefined, + ENCODE_PATH: undefined, +} diff --git a/frontend/src/api-client/core/request.ts b/frontend/src/api-client/core/request.ts new file mode 100644 index 00000000..a4196200 --- /dev/null +++ b/frontend/src/api-client/core/request.ts @@ -0,0 +1,332 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import axios from "axios" +import type { AxiosError, AxiosRequestConfig, AxiosResponse, AxiosInstance } from "axios" +import FormData from "form-data" + +import { ApiError } from "./ApiError" +import type { ApiRequestOptions } from "./ApiRequestOptions" +import type { ApiResult } from "./ApiResult" +import { CancelablePromise } from "./CancelablePromise" +import type { OnCancel } from "./CancelablePromise" +import type { OpenAPIConfig } from "./OpenAPI" + +export const isDefined = (value: T | null | undefined): value is Exclude => { + return value !== undefined && value !== null +} + +export const isString = (value: any): value is string => { + return typeof value === "string" +} + +export const isStringWithValue = (value: any): value is string => { + return isString(value) && value !== "" +} + +export const isBlob = (value: any): value is Blob => { + return ( + typeof value === "object" && + typeof value.type === "string" && + typeof value.stream === "function" && + typeof value.arrayBuffer === "function" && + typeof value.constructor === "function" && + typeof value.constructor.name === "string" && + /^(Blob|File)$/.test(value.constructor.name) && + /^(Blob|File)$/.test(value[Symbol.toStringTag]) + ) +} + +export const isFormData = (value: any): value is FormData => { + return value instanceof FormData +} + +export const isSuccess = (status: number): boolean => { + return status >= 200 && status < 300 +} + +export const base64 = (str: string): string => { + try { + return btoa(str) + } catch (err) { + // @ts-ignore + return Buffer.from(str).toString("base64") + } +} + +export const getQueryString = (params: Record): string => { + const qs: string[] = [] + + const append = (key: string, value: any) => { + qs.push(`${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`) + } + + const process = (key: string, value: any) => { + if (isDefined(value)) { + if (Array.isArray(value)) { + value.forEach((v) => { + process(key, v) + }) + } else if (typeof value === "object") { + Object.entries(value).forEach(([k, v]) => { + process(`${key}[${k}]`, v) + }) + } else { + append(key, value) + } + } + } + + Object.entries(params).forEach(([key, value]) => { + process(key, value) + }) + + if (qs.length > 0) { + return `?${qs.join("&")}` + } + + return "" +} + +const getUrl = (config: OpenAPIConfig, options: ApiRequestOptions): string => { + const encoder = config.ENCODE_PATH || encodeURI + + const path = options.url + .replace("{api-version}", config.VERSION) + .replace(/{(.*?)}/g, (substring: string, group: string) => { + if (options.path?.hasOwnProperty(group)) { + return encoder(String(options.path[group])) + } + return substring + }) + + const url = `${config.BASE}${path}` + if (options.query) { + return `${url}${getQueryString(options.query)}` + } + return url +} + +export const getFormData = (options: ApiRequestOptions): FormData | undefined => { + if (options.formData) { + const formData = new FormData() + + const process = (key: string, value: any) => { + if (isString(value) || isBlob(value)) { + formData.append(key, value) + } else { + formData.append(key, JSON.stringify(value)) + } + } + + Object.entries(options.formData) + .filter(([_, value]) => isDefined(value)) + .forEach(([key, value]) => { + if (Array.isArray(value)) { + value.forEach((v) => process(key, v)) + } else { + process(key, value) + } + }) + + return formData + } + return undefined +} + +type Resolver = (options: ApiRequestOptions) => Promise + +export const resolve = async (options: ApiRequestOptions, resolver?: T | Resolver): Promise => { + if (typeof resolver === "function") { + return (resolver as Resolver)(options) + } + return resolver +} + +export const getHeaders = async ( + config: OpenAPIConfig, + options: ApiRequestOptions, + formData?: FormData +): Promise> => { + const token = await resolve(options, config.TOKEN) + const username = await resolve(options, config.USERNAME) + const password = await resolve(options, config.PASSWORD) + const additionalHeaders = await resolve(options, config.HEADERS) + const formHeaders = (typeof formData?.getHeaders === "function" && formData?.getHeaders()) || {} + + const headers = Object.entries({ + Accept: "application/json", + ...additionalHeaders, + ...options.headers, + ...formHeaders, + }) + .filter(([_, value]) => isDefined(value)) + .reduce( + (headers, [key, value]) => ({ + ...headers, + [key]: String(value), + }), + {} as Record + ) + + if (isStringWithValue(token)) { + headers["Authorization"] = `Bearer ${token}` + } + + if (isStringWithValue(username) && isStringWithValue(password)) { + const credentials = base64(`${username}:${password}`) + headers["Authorization"] = `Basic ${credentials}` + } + + if (options.body) { + if (options.mediaType) { + headers["Content-Type"] = options.mediaType + } else if (isBlob(options.body)) { + headers["Content-Type"] = options.body.type || "application/octet-stream" + } else if (isString(options.body)) { + headers["Content-Type"] = "text/plain" + } else if (!isFormData(options.body)) { + headers["Content-Type"] = "application/json" + } + } + + return headers +} + +export const getRequestBody = (options: ApiRequestOptions): any => { + if (options.body) { + return options.body + } + return undefined +} + +export const sendRequest = async ( + config: OpenAPIConfig, + options: ApiRequestOptions, + url: string, + body: any, + formData: FormData | undefined, + headers: Record, + onCancel: OnCancel, + axiosClient: AxiosInstance +): Promise> => { + const source = axios.CancelToken.source() + + const requestConfig: AxiosRequestConfig = { + url, + headers, + data: body ?? formData, + method: options.method, + withCredentials: config.WITH_CREDENTIALS, + cancelToken: source.token, + } + + onCancel(() => source.cancel("The user aborted a request.")) + + try { + return await axiosClient.request(requestConfig) + } catch (error) { + const axiosError = error as AxiosError + if (axiosError.response) { + return axiosError.response + } + throw error + } +} + +export const getResponseHeader = (response: AxiosResponse, responseHeader?: string): string | undefined => { + if (responseHeader) { + const content = response.headers[responseHeader] + if (isString(content)) { + return content + } + } + return undefined +} + +export const getResponseBody = (response: AxiosResponse): any => { + if (response.status !== 204) { + return response.data + } + return undefined +} + +export const catchErrorCodes = (options: ApiRequestOptions, result: ApiResult): void => { + const errors: Record = { + 400: "Bad Request", + 401: "Unauthorized", + 403: "Forbidden", + 404: "Not Found", + 500: "Internal Server Error", + 502: "Bad Gateway", + 503: "Service Unavailable", + ...options.errors, + } + + const error = errors[result.status] + if (error) { + throw new ApiError(options, result, error) + } + + if (!result.ok) { + const errorStatus = result.status ?? "unknown" + const errorStatusText = result.statusText ?? "unknown" + const errorBody = (() => { + try { + return JSON.stringify(result.body, null, 2) + } catch (e) { + return undefined + } + })() + + throw new ApiError( + options, + result, + `Generic Error: status: ${errorStatus}; status text: ${errorStatusText}; body: ${errorBody}` + ) + } +} + +/** + * Request method + * @param config The OpenAPI configuration object + * @param options The request options from the service + * @param axiosClient The axios client instance to use + * @returns CancelablePromise + * @throws ApiError + */ +export const request = ( + config: OpenAPIConfig, + options: ApiRequestOptions, + axiosClient: AxiosInstance = axios +): CancelablePromise => { + return new CancelablePromise(async (resolve, reject, onCancel) => { + try { + const url = getUrl(config, options) + const formData = getFormData(options) + const body = getRequestBody(options) + const headers = await getHeaders(config, options, formData) + + if (!onCancel.isCancelled) { + const response = await sendRequest(config, options, url, body, formData, headers, onCancel, axiosClient) + const responseBody = getResponseBody(response) + const responseHeader = getResponseHeader(response, options.responseHeader) + + const result: ApiResult = { + url, + ok: isSuccess(response.status), + status: response.status, + statusText: response.statusText, + body: responseHeader ?? responseBody, + } + + catchErrorCodes(options, result) + + resolve(result.body) + } + } catch (error) { + reject(error) + } + }) +} diff --git a/frontend/src/api-client/index.ts b/frontend/src/api-client/index.ts new file mode 100644 index 00000000..aef4e193 --- /dev/null +++ b/frontend/src/api-client/index.ts @@ -0,0 +1,28 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export { ApiError } from "./core/ApiError" +export { CancelablePromise, CancelError } from "./core/CancelablePromise" +export { OpenAPI } from "./core/OpenAPI" +export type { OpenAPIConfig } from "./core/OpenAPI" + +export type { ExecutionResult } from "./models/ExecutionResult" +export type { FeedbackLangchain } from "./models/FeedbackLangchain" +export type { FeedbackSourceBaseLangchain } from "./models/FeedbackSourceBaseLangchain" +export type { HTTPValidationError } from "./models/HTTPValidationError" +export type { IChatMessage } from "./models/IChatMessage" +export type { IChatQuery } from "./models/IChatQuery" +export { ICreatorRole } from "./models/ICreatorRole" +export type { IFeedback } from "./models/IFeedback" +export type { IGetResponseBase_ExecutionResult_ } from "./models/IGetResponseBase_ExecutionResult_" +export type { StreamingData } from "./models/StreamingData" +export { StreamingDataTypeEnum } from "./models/StreamingDataTypeEnum" +export { StreamingSignalsEnum } from "./models/StreamingSignalsEnum" +export type { UserSettings } from "./models/UserSettings" +export type { ValidationError } from "./models/ValidationError" + +export { ChatService } from "./services/ChatService" +export { DefaultService } from "./services/DefaultService" +export { SqlService } from "./services/SqlService" +export { StatisticsService } from "./services/StatisticsService" diff --git a/frontend/src/api-client/models/ExecutionResult.ts b/frontend/src/api-client/models/ExecutionResult.ts new file mode 100644 index 00000000..90181724 --- /dev/null +++ b/frontend/src/api-client/models/ExecutionResult.ts @@ -0,0 +1,10 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +export type ExecutionResult = { + rawResult: Array> + affectedRows?: number | null + error?: string | null +} diff --git a/frontend/src/api-client/models/FeedbackLangchain.ts b/frontend/src/api-client/models/FeedbackLangchain.ts new file mode 100644 index 00000000..7b1ae6cf --- /dev/null +++ b/frontend/src/api-client/models/FeedbackLangchain.ts @@ -0,0 +1,22 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import type { FeedbackSourceBaseLangchain } from "./FeedbackSourceBaseLangchain" + +/** + * Schema for getting feedback, copy of langchain Feedback type (pydantic v2). + */ +export type FeedbackLangchain = { + id: string + created_at: string + modified_at: string + run_id: string + key: string + score?: boolean | number | null + value?: Record | boolean | number | string | null + comment?: string | null + correction?: string | Record | null + feedback_source?: FeedbackSourceBaseLangchain | null +} diff --git a/frontend/src/api-client/models/FeedbackSourceBaseLangchain.ts b/frontend/src/api-client/models/FeedbackSourceBaseLangchain.ts new file mode 100644 index 00000000..2d45ba7f --- /dev/null +++ b/frontend/src/api-client/models/FeedbackSourceBaseLangchain.ts @@ -0,0 +1,9 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +export type FeedbackSourceBaseLangchain = { + type: string + metadata?: Record | null +} diff --git a/frontend/src/api-client/models/HTTPValidationError.ts b/frontend/src/api-client/models/HTTPValidationError.ts new file mode 100644 index 00000000..5724d81b --- /dev/null +++ b/frontend/src/api-client/models/HTTPValidationError.ts @@ -0,0 +1,10 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import type { ValidationError } from "./ValidationError" + +export type HTTPValidationError = { + detail?: Array +} diff --git a/frontend/src/api-client/models/IChatMessage.ts b/frontend/src/api-client/models/IChatMessage.ts new file mode 100644 index 00000000..aa30c6b7 --- /dev/null +++ b/frontend/src/api-client/models/IChatMessage.ts @@ -0,0 +1,11 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import type { ICreatorRole } from "./ICreatorRole" + +export type IChatMessage = { + role: ICreatorRole + content: string +} diff --git a/frontend/src/api-client/models/IChatQuery.ts b/frontend/src/api-client/models/IChatQuery.ts new file mode 100644 index 00000000..5b9fa682 --- /dev/null +++ b/frontend/src/api-client/models/IChatQuery.ts @@ -0,0 +1,16 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import type { IChatMessage } from "./IChatMessage" +import type { UserSettings } from "./UserSettings" + +export type IChatQuery = { + messages: Array + apiKey?: string | null + conversationId: string + newMessageId: string + userEmail: string + settings?: UserSettings | null +} diff --git a/frontend/src/api-client/models/ICreatorRole.ts b/frontend/src/api-client/models/ICreatorRole.ts new file mode 100644 index 00000000..e59eff0f --- /dev/null +++ b/frontend/src/api-client/models/ICreatorRole.ts @@ -0,0 +1,10 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +export enum ICreatorRole { + SYSTEM = "system", + USER = "user", + AGENT = "agent", +} diff --git a/frontend/src/api-client/models/IFeedback.ts b/frontend/src/api-client/models/IFeedback.ts new file mode 100644 index 00000000..7b58272a --- /dev/null +++ b/frontend/src/api-client/models/IFeedback.ts @@ -0,0 +1,17 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import type { UserSettings } from "./UserSettings" + +export type IFeedback = { + conversationId: string + messageId: string + user: string + score: number + comment: string + key: string + settings?: UserSettings | null + previousId?: string | null +} diff --git a/frontend/src/api-client/models/IGetResponseBase_ExecutionResult_.ts b/frontend/src/api-client/models/IGetResponseBase_ExecutionResult_.ts new file mode 100644 index 00000000..d54ccb47 --- /dev/null +++ b/frontend/src/api-client/models/IGetResponseBase_ExecutionResult_.ts @@ -0,0 +1,12 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import type { ExecutionResult } from "./ExecutionResult" + +export type IGetResponseBase_ExecutionResult_ = { + message?: string + meta?: Record + data: ExecutionResult | null +} diff --git a/frontend/src/api-client/models/StreamingData.ts b/frontend/src/api-client/models/StreamingData.ts new file mode 100644 index 00000000..95bcb617 --- /dev/null +++ b/frontend/src/api-client/models/StreamingData.ts @@ -0,0 +1,12 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import type { StreamingDataTypeEnum } from "./StreamingDataTypeEnum" + +export type StreamingData = { + data: string + data_type?: StreamingDataTypeEnum + metadata?: Record +} diff --git a/frontend/src/api-client/models/StreamingDataTypeEnum.ts b/frontend/src/api-client/models/StreamingDataTypeEnum.ts new file mode 100644 index 00000000..c037787d --- /dev/null +++ b/frontend/src/api-client/models/StreamingDataTypeEnum.ts @@ -0,0 +1,15 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +/** + * Description of your enum + */ +export enum StreamingDataTypeEnum { + TEXT = "text", + LLM = "llm", + APPENDIX = "appendix", + ACTION = "action", + SIGNAL = "signal", +} diff --git a/frontend/src/api-client/models/StreamingSignalsEnum.ts b/frontend/src/api-client/models/StreamingSignalsEnum.ts new file mode 100644 index 00000000..76664b36 --- /dev/null +++ b/frontend/src/api-client/models/StreamingSignalsEnum.ts @@ -0,0 +1,14 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +/** + * Description of your enum + */ +export enum StreamingSignalsEnum { + START = "START", + END = "END", + TOOL_END = "TOOL_END", + LLM_END = "LLM_END", +} diff --git a/frontend/src/api-client/models/UserSettings.ts b/frontend/src/api-client/models/UserSettings.ts new file mode 100644 index 00000000..7c798b93 --- /dev/null +++ b/frontend/src/api-client/models/UserSettings.ts @@ -0,0 +1,9 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +export type UserSettings = { + data: Record + version?: number | null +} diff --git a/frontend/src/api-client/models/ValidationError.ts b/frontend/src/api-client/models/ValidationError.ts new file mode 100644 index 00000000..c227ecd7 --- /dev/null +++ b/frontend/src/api-client/models/ValidationError.ts @@ -0,0 +1,10 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +export type ValidationError = { + loc: Array + msg: string + type: string +} diff --git a/frontend/src/api-client/services/ChatService.ts b/frontend/src/api-client/services/ChatService.ts new file mode 100644 index 00000000..4e81ebb1 --- /dev/null +++ b/frontend/src/api-client/services/ChatService.ts @@ -0,0 +1,80 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { IChatQuery } from "../models/IChatQuery" + +import type { CancelablePromise } from "../core/CancelablePromise" +import { OpenAPI } from "../core/OpenAPI" +import { request as __request } from "../core/request" + +export class ChatService { + /** + * Run Status + * @param runId + * @returns boolean Successful Response + * @throws ApiError + */ + public static runStatusApiV1ChatRunRunIdStatusGet(runId: string): CancelablePromise { + return __request(OpenAPI, { + method: "GET", + url: "/api/v1/chat/run/{run_id}/status", + path: { + run_id: runId, + }, + errors: { + 422: `Validation Error`, + }, + }) + } + + /** + * Run Cancel + * @param runId + * @returns boolean Successful Response + * @throws ApiError + */ + public static runCancelApiV1ChatRunRunIdCancelGet(runId: string): CancelablePromise { + return __request(OpenAPI, { + method: "GET", + url: "/api/v1/chat/run/{run_id}/cancel", + path: { + run_id: runId, + }, + errors: { + 422: `Validation Error`, + }, + }) + } + + /** + * Agent Chat + * This function handles the chat interaction with an agent. It converts the chat + * messages to the Langchain format, creates a memory of the conversation, and sets up + * a stream handler. It then creates an asyncio task to handle the conversation with + * the agent and returns a streaming response of the conversation. + * + * Args: + * chat (IChatQuery): The chat query containing the messages and other details. + * jwt (Annotated[dict, Depends(get_jwt)]): The JWT token from the request. + * meta_agent (AgentExecutor, optional): The MetaAgent instance. Defaults to the one returned by get_ + * meta_agent_with_api_key. + * + * Returns: + * StreamingResponse: The streaming response of the conversation. + * @param requestBody + * @returns any Successful Response + * @throws ApiError + */ + public static agentChatApiV1ChatAgentPost(requestBody: IChatQuery): CancelablePromise { + return __request(OpenAPI, { + method: "POST", + url: "/api/v1/chat/agent", + body: requestBody, + mediaType: "application/json", + errors: { + 422: `Validation Error`, + }, + }) + } +} diff --git a/frontend/src/api-client/services/DefaultService.ts b/frontend/src/api-client/services/DefaultService.ts new file mode 100644 index 00000000..fe5e2a74 --- /dev/null +++ b/frontend/src/api-client/services/DefaultService.ts @@ -0,0 +1,22 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { CancelablePromise } from "../core/CancelablePromise" +import { OpenAPI } from "../core/OpenAPI" +import { request as __request } from "../core/request" + +export class DefaultService { + /** + * Root + * An example "Hello world" FastAPI route. + * @returns string Successful Response + * @throws ApiError + */ + public static rootGet(): CancelablePromise> { + return __request(OpenAPI, { + method: "GET", + url: "/", + }) + } +} diff --git a/frontend/src/api-client/services/SqlService.ts b/frontend/src/api-client/services/SqlService.ts new file mode 100644 index 00000000..831f2f01 --- /dev/null +++ b/frontend/src/api-client/services/SqlService.ts @@ -0,0 +1,31 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { IGetResponseBase_ExecutionResult_ } from "../models/IGetResponseBase_ExecutionResult_" + +import type { CancelablePromise } from "../core/CancelablePromise" +import { OpenAPI } from "../core/OpenAPI" +import { request as __request } from "../core/request" + +export class SqlService { + /** + * Execute Sql + * Executes an SQL query on the database and returns the result. + * @param statement + * @returns IGetResponseBase_ExecutionResult_ Successful Response + * @throws ApiError + */ + public static executeSqlApiV1SqlExecuteGet(statement: string): CancelablePromise { + return __request(OpenAPI, { + method: "GET", + url: "/api/v1/sql/execute", + query: { + statement: statement, + }, + errors: { + 422: `Validation Error`, + }, + }) + } +} diff --git a/frontend/src/api-client/services/StatisticsService.ts b/frontend/src/api-client/services/StatisticsService.ts new file mode 100644 index 00000000..2de38c0e --- /dev/null +++ b/frontend/src/api-client/services/StatisticsService.ts @@ -0,0 +1,31 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { FeedbackLangchain } from "../models/FeedbackLangchain" +import type { IFeedback } from "../models/IFeedback" + +import type { CancelablePromise } from "../core/CancelablePromise" +import { OpenAPI } from "../core/OpenAPI" +import { request as __request } from "../core/request" + +export class StatisticsService { + /** + * Send Feedback + * Send feedback to the Langsmith API. + * @param requestBody + * @returns FeedbackLangchain Successful Response + * @throws ApiError + */ + public static sendFeedbackApiV1StatisticsFeedbackPost(requestBody: IFeedback): CancelablePromise { + return __request(OpenAPI, { + method: "POST", + url: "/api/v1/statistics/feedback", + body: requestBody, + mediaType: "application/json", + errors: { + 422: `Validation Error`, + }, + }) + } +} diff --git a/frontend/src/components/CodeView/CodeBlock.tsx b/frontend/src/components/CodeView/CodeBlock.tsx new file mode 100644 index 00000000..12f9c47b --- /dev/null +++ b/frontend/src/components/CodeView/CodeBlock.tsx @@ -0,0 +1,67 @@ +import copy from "copy-to-clipboard" +import { toast } from "react-hot-toast" +import { Prism as SyntaxHighlighter } from "react-syntax-highlighter" +import { oneDark } from "react-syntax-highlighter/dist/cjs/styles/prism" + +import { Tooltip } from "~/components/Common" +import Icon from "~/components/CustomIcons/Icon" +import { useQueryStore } from "~/stores" + +interface Props { + language: string + value: string + messageId: string + conversationId: string +} + +export const CodeBlock = (props: Props) => { + const { language, value, messageId, conversationId } = props + const queryStore = useQueryStore() + + const showExecuteButton = language.toUpperCase() === "SQL" + + const copyToClipboard = () => { + copy(value) + toast.success("Copied to clipboard") + } + + const handleExecuteQuery = () => { + queryStore.setContext({ + statement: value, + messageId: messageId, + conversationId: conversationId, + }) + queryStore.toggleDrawer(true) + } + + return ( +
+
+ {language} +
+ + + + {showExecuteButton && ( + + + + )} +
+
+ + {value} + +
+ ) +} diff --git a/frontend/src/components/CodeView/Markdown.tsx b/frontend/src/components/CodeView/Markdown.tsx new file mode 100644 index 00000000..9526692d --- /dev/null +++ b/frontend/src/components/CodeView/Markdown.tsx @@ -0,0 +1,53 @@ +import { type ReactElement } from "react" + +import ReactMarkdown from "react-markdown" +import rehypeRaw from "rehype-raw" +import remarkGfm from "remark-gfm" + +import { CodeBlock } from "./CodeBlock" + +interface Props { + text: string + messageId?: string + conversationId?: string +} + +export const Markdown = (props: Props) => { + const { text, messageId, conversationId } = props + return ( + + + + ) + }, + code({ children }) { + return {children} + }, + p({ children }) { + return

{children}

+ }, + }} + > + {text} +
+ ) +} diff --git a/frontend/src/components/CodeView/SideDrawer/DataTableView.tsx b/frontend/src/components/CodeView/SideDrawer/DataTableView.tsx new file mode 100644 index 00000000..cbeb18a3 --- /dev/null +++ b/frontend/src/components/CodeView/SideDrawer/DataTableView.tsx @@ -0,0 +1,50 @@ +"use client" + +import { head } from "lodash-es" +import DataTable from "react-data-table-component" +import Icon from "~/components/CustomIcons/Icon" + +interface Props { + rawResults: Record[] +} + +const getWidth = (rawResult: Record, key: string) => { + const value = rawResult[key] + const hasWidth = typeof value === "string" + return hasWidth && value.length <= 100 ? "25em" : undefined +} + +const DataTableView = (props: Props) => { + const { rawResults } = props + const columns = Object.keys(head(rawResults) || {}).map((key) => { + return { + name: key, + sortable: true, + selector: (row: any) => row[key], + wrap: true, + maxWidth: getWidth(head(rawResults) || {}, key), + padding: "0.5em", + className: "dark:border-zinc-700", + } + }) + + return rawResults.length === 0 ? ( +
+ + No data returned +
+ ) : ( + + ) +} + +export default DataTableView diff --git a/frontend/src/components/CodeView/SideDrawer/ExecutionWarningBanner.tsx b/frontend/src/components/CodeView/SideDrawer/ExecutionWarningBanner.tsx new file mode 100644 index 00000000..cc3ab153 --- /dev/null +++ b/frontend/src/components/CodeView/SideDrawer/ExecutionWarningBanner.tsx @@ -0,0 +1,25 @@ +import Icon from "~/components/CustomIcons/Icon" + +interface Props { + className?: string +} + +const ExecutionWarningBanner = (props: Props) => { + const { className } = props + + return ( +
+ + + The statement may be non-SELECT SQL, which will result in a database schema or data change. Double check the + statement to ensure it is intended. + +
+ ) +} + +export default ExecutionWarningBanner diff --git a/frontend/src/components/CodeView/SideDrawer/NotificationView.tsx b/frontend/src/components/CodeView/SideDrawer/NotificationView.tsx new file mode 100644 index 00000000..d0b997cd --- /dev/null +++ b/frontend/src/components/CodeView/SideDrawer/NotificationView.tsx @@ -0,0 +1,12 @@ +interface Props { + message: string + style: "info" | "error" +} + +const NotificationView = (props: Props) => { + const { message, style } = props + const additionalStyle = style === "error" ? "text-red-500" : "text-gray-500" + return

{message}

+} + +export default NotificationView diff --git a/frontend/src/components/CodeView/SideDrawer/index.tsx b/frontend/src/components/CodeView/SideDrawer/index.tsx new file mode 100644 index 00000000..1f1abecb --- /dev/null +++ b/frontend/src/components/CodeView/SideDrawer/index.tsx @@ -0,0 +1,143 @@ +import { useEffect, useState } from "react" + +import { toast } from "react-hot-toast" +import TextareaAutosize from "react-textarea-autosize" + +import { type ExecutionResult, SqlService } from "~/api-client" +import { Drawer, Tooltip } from "~/components/Common" +import Icon from "~/components/CustomIcons/Icon" +import { useQueryStore } from "~/stores" +import { checkStatementIsSelect, getMessageFromExecutionResult } from "~/utils" + +import DataTableView from "./DataTableView" +import ExecutionWarningBanner from "./ExecutionWarningBanner" +import NotificationView from "./NotificationView" + +const SideDrawer = () => { + const queryStore = useQueryStore() + const [executionResult, setExecutionResult] = useState(undefined) + const [statement, setStatement] = useState("") + const [isLoading, setIsLoading] = useState(false) + const context = queryStore.context + const executionMessage = executionResult ? getMessageFromExecutionResult(executionResult) : "" + const showExecutionWarningBanner = statement.trim() && !checkStatementIsSelect(statement) + const showDrawer = queryStore.getState().showDrawer + + useEffect(() => { + if (!showDrawer) { + return + } + + const statement = context?.statement || "" + setStatement(statement) + if (statement !== "" && checkStatementIsSelect(statement)) { + executeStatement(statement) + } + setExecutionResult(undefined) + }, [context, showDrawer]) + + const executeStatement = async (statement: string) => { + if (!statement) { + toast.error("Please enter a statement.") + return + } + + if (!context) { + toast.error("No execution context found.") + setIsLoading(false) + setExecutionResult(undefined) + return + } + + setIsLoading(true) + setExecutionResult(undefined) + try { + const result = await SqlService.executeSqlApiV1SqlExecuteGet(statement) + if (result.data) { + setExecutionResult(result.data) + queryStore.setQueryCache(statement, result.data.rawResult, context.messageId, context.conversationId) + } else if (!result.data && result.message) { + setExecutionResult({ + rawResult: [], + error: result.message, + }) + } + } catch (error) { + console.error(error) + toast.error("Failed to execute statement") + } finally { + setIsLoading(false) + } + } + + return ( + ( +
+ +
+ )} + onToggle={(isOpen) => queryStore.toggleDrawer(isOpen)} + > +
+

Execute SQL

+ <> +
+ +
Database
+
+ {showExecutionWarningBanner && } +
+ setStatement(e.target.value)} + /> + + + +
+
+ {isLoading ? ( +
+ + {"Executing query..."} +
+ ) : ( + <> + {executionResult ? ( + executionMessage ? ( + + ) : ( + + ) + ) : ( + <> + )} + + )} +
+ +
+
+ ) +} + +export default SideDrawer diff --git a/frontend/src/components/Common/Accordion/Accordion.tsx b/frontend/src/components/Common/Accordion/Accordion.tsx new file mode 100644 index 00000000..d0ee38a7 --- /dev/null +++ b/frontend/src/components/Common/Accordion/Accordion.tsx @@ -0,0 +1,86 @@ +import clsx from "clsx" +import { useState } from "react" + +interface AccordionProps { + accordionID: string + iconPosition?: string + items?: { + key: string + title?: string | JSX.Element + content?: string | JSX.Element + CustomToggleIcon?: JSX.Element + onToggle?: (id: string) => void + isOpen?: boolean + tooltipText?: string + enableHeaderInteraction?: boolean + showBorder?: boolean + }[] + forceAccordionItemsToggle?: boolean +} + +const getItemKey = (key: string, index: number) => `${key}-${index}` + +export const Accordion = ({ accordionID, items, forceAccordionItemsToggle, iconPosition }: AccordionProps) => { + const initialState = + items?.reduce( + (accu, item, index) => ({ + ...accu, + [getItemKey(item?.key, index)]: item?.isOpen ?? forceAccordionItemsToggle ?? false, + }), + {} + ) ?? {} + + const [show, setShow] = useState>(initialState) + + const toggleShow = (value: object) => { + setShow({ ...show, ...value }) + } + + return ( +
+ {items?.map( + ( + { key, enableHeaderInteraction, CustomToggleIcon, showBorder = true, tooltipText, onToggle, title, content }, + index + ) => { + const accordionItemKey = getItemKey(key, index) + + const inputClasses = clsx("!outline-rounded hover:cursor-pointer", { + ["relative"]: enableHeaderInteraction, + }) + + const headerClasses = clsx("daisycollapse", { + ["daisycollapse-arrow"]: !CustomToggleIcon, + ["shadow-[rgba(50,50,93,0.25)_0px_6px_12px_-2px,_rgba(0,0,0,0.3)_0px_3px_7px_-3px]"]: showBorder, + }) + + const titleClasses = clsx("daisycollapse-title flex justify-between items-center", { + ["[&>*]:relative [&>*]:z-10"]: enableHeaderInteraction, + ["after:!right-[50%]"]: iconPosition === "center" && !title, + }) + + return ( +
+ { + onToggle?.(key) + toggleShow({ ...show, [accordionItemKey]: !show[accordionItemKey] }) + }} + onChange={() => undefined} + className={inputClasses} + /> +
+ {title} {CustomToggleIcon ? {CustomToggleIcon} : null} +
+
{content}
+
+ ) + } + )} +
+ ) +} diff --git a/frontend/src/components/Common/DatadogInit/DatadogInit.tsx b/frontend/src/components/Common/DatadogInit/DatadogInit.tsx new file mode 100644 index 00000000..fd61a9e1 --- /dev/null +++ b/frontend/src/components/Common/DatadogInit/DatadogInit.tsx @@ -0,0 +1,28 @@ +// Necessary if using App Router to ensure this file runs on the client +"use client" + +import { datadogRum } from "@datadog/browser-rum" +import { env } from "~/env.mjs" + +if (env.NEXT_PUBLIC_DATADOG_APPLICATION_ID && env.NEXT_PUBLIC_DATADOG_CLIENT_TOKEN) { + datadogRum.init({ + applicationId: env.NEXT_PUBLIC_DATADOG_APPLICATION_ID, + clientToken: env.NEXT_PUBLIC_DATADOG_CLIENT_TOKEN, + site: "datadoghq.com", + service: "agentx-public-demo", + env: "demo", + version: "1.0.0", + sessionSampleRate: 100, + sessionReplaySampleRate: 100, + trackUserInteractions: true, + trackResources: true, + trackLongTasks: true, + defaultPrivacyLevel: "allow", + }) +} + +export const DatadogInit = () => { + // Render nothing - this component is only included so that the init code + // above will run client-side + return null +} diff --git a/frontend/src/components/Common/Drawer/Drawer.tsx b/frontend/src/components/Common/Drawer/Drawer.tsx new file mode 100644 index 00000000..7bb45b62 --- /dev/null +++ b/frontend/src/components/Common/Drawer/Drawer.tsx @@ -0,0 +1,127 @@ +import { useClickOutside } from "@react-hookz/web" +import { AnimatePresence, motion } from "framer-motion" +import { useEffect, useRef, useState } from "react" + +interface DrawerV2Props { + side?: "left" | "right" + pushPageContent?: boolean + footer?: (toogle: () => void) => JSX.Element + expandedHeader?: JSX.Element + colapsedHeader?: (toogle: () => void) => JSX.Element + children: JSX.Element | JSX.Element[] + showOverlay?: boolean + contentWrapperClasses?: string + innerWrapperClasses?: string + isOpen?: boolean + onToggle?: (open?: boolean) => void +} + +export const Drawer = ({ + side = "left", + pushPageContent = false, + footer, + expandedHeader, + colapsedHeader, + showOverlay = false, + contentWrapperClasses = "", + innerWrapperClasses = "", + isOpen = false, + onToggle, + children, +}: DrawerV2Props) => { + const [open, setOpen] = useState(false) + + const ref = useRef(null) + useClickOutside(ref, () => showOverlay && setOpen(false)) + const toggle = () => setOpen((prev) => !prev) + + const e2eDrawerXPosition = side === "left" ? "-100%" : "100%" + + const framerDrawerPanel = { + initial: { x: e2eDrawerXPosition }, + animate: { x: 0 }, + exit: { x: e2eDrawerXPosition }, + transition: { duration: 0.2 }, + } + + const e2eContentXPosition = side === "left" ? "-50" : "50" + + const framerSection = (delay: number) => { + return { + initial: { opacity: 0, x: e2eContentXPosition }, + animate: { opacity: 1, x: 0 }, + transition: { + delay: 0.3 + delay / 10, + }, + } + } + + useEffect(() => { + onToggle?.(open) + }, [open]) + + useEffect(() => { + setOpen(isOpen) + }, [isOpen]) + + return ( + <> + + {!open && colapsedHeader && ( + + {colapsedHeader(toggle)} + + )} + {open && ( + <> + {showOverlay && ( + + )} + + {expandedHeader ? ( + + {expandedHeader} + + ) : null} +
    + {children} +
+ {footer ? ( + + {footer(toggle)} + + ) : null} +
+ + )} +
+ + ) +} + +const framerDrawerBackground = { + initial: { opacity: 0 }, + animate: { opacity: 1 }, + exit: { opacity: 0, transition: { delay: 0.2 } }, + transition: { duration: 0.3 }, +} diff --git a/frontend/src/components/Common/Dropdown/Dropdown.tsx b/frontend/src/components/Common/Dropdown/Dropdown.tsx new file mode 100644 index 00000000..f482fc99 --- /dev/null +++ b/frontend/src/components/Common/Dropdown/Dropdown.tsx @@ -0,0 +1,26 @@ +import * as DropdownUI from "@radix-ui/react-dropdown-menu" +import { type ReactNode } from "react" + +interface Props { + children: ReactNode + tigger: ReactNode +} + +export const Dropdown = (props: Props) => { + const { children, tigger } = props + + return ( + + any }) => e.stopPropagation()}> + {tigger} + + + + {children} + + + + ) +} + +export const DropdownItem = DropdownUI.Item diff --git a/frontend/src/components/Common/Input/Input.tsx b/frontend/src/components/Common/Input/Input.tsx new file mode 100644 index 00000000..65b3d129 --- /dev/null +++ b/frontend/src/components/Common/Input/Input.tsx @@ -0,0 +1,38 @@ +import { forwardRef, type Ref } from "react" + +export interface InputProps { + type?: string + onKeyDown?: (value: any) => void + label?: string | JSX.Element + value?: any + onChange: (value: any) => void + placeholder?: string + disabled?: boolean + classNames?: string + autoFocus?: boolean +} + +export const Input = forwardRef(function Input( + { label, value, onChange, onKeyDown, placeholder, ...rest }: InputProps, + ref: Ref +) { + return ( +
+ {label && ( + + )} + onChange?.(e?.target?.value as unknown as any)} + onKeyDown={(e: any) => onKeyDown?.(e?.target?.value as unknown as any)} + {...rest} + type="text" + placeholder={placeholder} + className="daisyinput daisyinput-bordered daisyinput-sm w-full bg-neutral lg:daisyinput-md disabled:!bg-base-100 dark:bg-base-200" + ref={ref} + /> +
+ ) +}) diff --git a/frontend/src/components/Common/Layout/Layout.tsx b/frontend/src/components/Common/Layout/Layout.tsx new file mode 100644 index 00000000..0f902ad6 --- /dev/null +++ b/frontend/src/components/Common/Layout/Layout.tsx @@ -0,0 +1,5 @@ +import { type FC } from "react" + +export const Layout: FC<{ children: JSX.Element | JSX.Element[] }> = ({ children }) => ( +
{children}
+) diff --git a/frontend/src/components/Common/Modal/Modal.tsx b/frontend/src/components/Common/Modal/Modal.tsx new file mode 100644 index 00000000..2f67d07e --- /dev/null +++ b/frontend/src/components/Common/Modal/Modal.tsx @@ -0,0 +1,49 @@ +import { useEffect } from "react" + +interface ModalProps { + uniqueModalId: string + children: JSX.Element | JSX.Element[] + actionButtons?: JSX.Element | JSX.Element[] + onClose?: () => void +} + +export const openModal = (modalId: string) => { + ;(document?.getElementById(modalId) as HTMLDialogElement)?.showModal?.() +} + +export const closeModal = (modalId: string) => { + ;(document?.getElementById(modalId) as HTMLDialogElement)?.close?.() +} + +export const isOpen = (modalId: string) => (document?.getElementById(modalId) as HTMLDialogElement)?.open + +const InnerModal = ({ uniqueModalId, actionButtons, onClose, children }: ModalProps) => { + useEffect(() => { + const handleOnModalCloseEvent = () => { + onClose?.() + } + ;(document?.getElementById(uniqueModalId) as HTMLDialogElement)?.addEventListener("close", handleOnModalCloseEvent) + + return () => window.removeEventListener("keydown", handleOnModalCloseEvent) + }, []) + + return ( + +
+ {children} +
{actionButtons ?? null}
+
+
+ {" "} +
+ ) +} + +export const Modal = { + Component: InnerModal, + openModal, + closeModal, + isOpen, +} diff --git a/frontend/src/components/Common/MultiButtonDropdown/MultiButtonDropdown.tsx b/frontend/src/components/Common/MultiButtonDropdown/MultiButtonDropdown.tsx new file mode 100644 index 00000000..720c9fdb --- /dev/null +++ b/frontend/src/components/Common/MultiButtonDropdown/MultiButtonDropdown.tsx @@ -0,0 +1,65 @@ +import { Menu, Transition } from "@headlessui/react" +import { Fragment } from "react" + +import Icon from "~/components/CustomIcons/Icon" + +function classNames(...classes: any) { + return classes.filter(Boolean).join(" ") +} + +type MultiButtonDropdownProps = { + title: string + items: { + key: string + title: string + onClick: () => void + }[] + isInline?: boolean +} + +export const MultiButtonDropdown = ({ title, items, isInline }: MultiButtonDropdownProps) => { + return ( + + + {title} + + + + +
+ {items.map((item) => ( + + {({ active }) => ( + + )} + + ))} +
+
+
+
+ ) +} diff --git a/frontend/src/components/Common/Select/Select.tsx b/frontend/src/components/Common/Select/Select.tsx new file mode 100644 index 00000000..71c1fb09 --- /dev/null +++ b/frontend/src/components/Common/Select/Select.tsx @@ -0,0 +1,35 @@ +export interface SelectV2Props { + label: string | JSX.Element + optionsList?: { key: string; value: T; label: string }[] + value?: T + onChange: (value: T, options?: HTMLOptionsCollection, index?: number) => void + disabled?: boolean +} + +export const Select = ({ + label, + optionsList, + value, + onChange, + ...rest +}: SelectV2Props) => ( +
+ + +
+) diff --git a/frontend/src/components/Common/Sidebar/OpenCloseButton.tsx b/frontend/src/components/Common/Sidebar/OpenCloseButton.tsx new file mode 100644 index 00000000..692dc285 --- /dev/null +++ b/frontend/src/components/Common/Sidebar/OpenCloseButton.tsx @@ -0,0 +1,33 @@ +import Icon from "~/components/CustomIcons/Icon" + +interface Props { + onClick: any + reverseArrows?: boolean +} + +export const CloseSidebarButton = ({ onClick, reverseArrows = false }: Props) => { + const IconComponent = reverseArrows ? Icon.BiArrowFromLeft : Icon.BiArrowFromRight + return ( + <> + +
+ + ) +} + +export const OpenSidebarButton = ({ onClick, reverseArrows = false }: Props) => { + const IconComponent = reverseArrows ? Icon.BiArrowFromRight : Icon.BiArrowFromLeft + return ( + + ) +} diff --git a/frontend/src/components/Common/Sidebar/SettingsModal.tsx b/frontend/src/components/Common/Sidebar/SettingsModal.tsx new file mode 100644 index 00000000..0743e1b0 --- /dev/null +++ b/frontend/src/components/Common/Sidebar/SettingsModal.tsx @@ -0,0 +1,104 @@ +import { useEffect, useState } from "react" + +import Icon from "~/components/CustomIcons/Icon" + +import { useSettingStore } from "~/stores" +import { MAX_TOTAL_MESSAGES_WITHOUT_TOKEN } from "~/utils" +import { Input } from "../Input/Input" +import { Modal } from "../Modal/Modal" + +interface Props { + getSettingsModalId: (id?: string) => string +} + +export const SettingsModal = (props: Props) => { + const { getSettingsModalId } = props + const settingsStore = useSettingStore() + + const [openaiApiKey, setOpenaiApiKey] = useState("") + const [openaiOrgId, setOpenaiOrgId] = useState("") + const [favoriteArtist, setFavoriteArtist] = useState(settingsStore.setting.data["favorite_artist"]) + + useEffect(() => { + const apiKey = localStorage.getItem("openaiApiKey") + const orgId = localStorage.getItem("openaiOrgId") // + + if (apiKey) { + setOpenaiApiKey(apiKey) + } + + if (orgId) { + setOpenaiOrgId(orgId) + } + }, []) + + const saveSettings = () => { + localStorage.setItem("openaiApiKey", openaiApiKey) + settingsStore.setSetting({ + data: { + favorite_artist: favoriteArtist, + api_key: openaiApiKey, + }, + }) + Modal.closeModal(modalId) + } + + const modalId = getSettingsModalId() + const messagedBlocked = + settingsStore.setting.totalMessages >= MAX_TOTAL_MESSAGES_WITHOUT_TOKEN && + (!openaiApiKey || openaiApiKey.length === 0) + + useEffect(() => { + if (messagedBlocked) { + Modal.openModal(modalId) + } + }, [settingsStore.setting.totalMessages]) + + return ( + + + + + } + > +
+ {messagedBlocked && ( +
+

Message limit reached

+
+

+ You have reached the message limit without an OpenAI API key. Please enter your API key to continue. +

+
+ )} +

Settings

+
+
+ setOpenaiApiKey(value)} /> + setOpenaiOrgId(value)} /> + setFavoriteArtist(e.target.value)} + /> +
+
+ + ) +} diff --git a/frontend/src/components/Common/Sidebar/TopWarningBanner.tsx b/frontend/src/components/Common/Sidebar/TopWarningBanner.tsx new file mode 100644 index 00000000..3fda74bc --- /dev/null +++ b/frontend/src/components/Common/Sidebar/TopWarningBanner.tsx @@ -0,0 +1,39 @@ +"use client" + +import { useLocalStorageValue } from "@react-hookz/web" +import Icon from "~/components/CustomIcons/Icon" + +interface Props { + className?: string + alwaysShow?: boolean +} + +export const TopWarningBanner = (props: Props) => { + const { className, alwaysShow } = props + const { value: hideBanner, set: setHideBanner } = useLocalStorageValue("hide-local-storage-banner", { + defaultValue: false, + initializeWithValue: false, + }) + const hide = hideBanner === undefined ? false : hideBanner + + return ( +
+ + + Conversations are only stored in your local browser + + {!alwaysShow && ( + + )} +
+ ) +} diff --git a/frontend/src/components/Common/Sidebar/index.ts b/frontend/src/components/Common/Sidebar/index.ts new file mode 100644 index 00000000..037b7e58 --- /dev/null +++ b/frontend/src/components/Common/Sidebar/index.ts @@ -0,0 +1,3 @@ +export * from "./TopWarningBanner" +export * from "./OpenCloseButton" +export * from "./SettingsModal" diff --git a/frontend/src/components/Common/Steps/Steps.tsx b/frontend/src/components/Common/Steps/Steps.tsx new file mode 100644 index 00000000..6f3cc6dd --- /dev/null +++ b/frontend/src/components/Common/Steps/Steps.tsx @@ -0,0 +1,76 @@ +import { Tooltip } from "../Tooltip/Tooltip" + +interface StepsProps { + activeStepIndex: number + steps: { label: string; description?: string }[] + onStepClick: (step: number) => void +} + +export const Steps = ({ steps, activeStepIndex, onStepClick }: StepsProps) => { + const getDataContent = (stepIndex: number) => { + if (stepIndex < activeStepIndex) { + return "✓" + } + + return stepIndex + 1 + } + + const getStepColor = (stepIndex: number) => { + if (stepIndex <= activeStepIndex) { + return "after:!bg-accent after:!text-neutral" + } + + return "after:!bg-base-100" + } + + return ( +
    + {steps?.map((step, index) => { + const positionClasses = + index === 0 + ? "daisytooltip-right" + : index === steps.length - 1 + ? "daisytooltip-left lg:daisytooltip-right" + : "daisytooltip-bottom lg:daisytooltip-right" + + return ( +
  • onStepClick(index)} + > + {step?.description ? ( + + +
    + + + + + +
    {step.label}
    +
    +
    +
    + ) : ( + {step.label} + )} +
  • + ) + })} +
+ ) +} diff --git a/frontend/src/components/Common/Tabs/TabItem.tsx b/frontend/src/components/Common/Tabs/TabItem.tsx new file mode 100644 index 00000000..e32a3a4d --- /dev/null +++ b/frontend/src/components/Common/Tabs/TabItem.tsx @@ -0,0 +1,18 @@ +import { isArray } from "lodash-es" +import { type FC } from "react" + +export interface TabItemProps { + label: string + children?: JSX.Element | JSX.Element[] | null + icon?: JSX.Element + hideLabel?: boolean + showTooltip?: boolean +} + +export const TabItem: FC = ({ children }) => { + if (!children) return null + + const tabItems = isArray(children) ? children : [children] + + return
{tabItems}
+} diff --git a/frontend/src/components/Common/Tabs/Tabs.tsx b/frontend/src/components/Common/Tabs/Tabs.tsx new file mode 100644 index 00000000..ef1d2ae2 --- /dev/null +++ b/frontend/src/components/Common/Tabs/Tabs.tsx @@ -0,0 +1,123 @@ +import clsx from "clsx" +import { isArray } from "lodash-es" +import { type FC, type ReactElement, useEffect } from "react" + +import { useDeepCompareEffect } from "~/hooks" +import { LIGHT_THEME } from "~/styles/themes" + +import { type TabItemProps } from "./TabItem" +import { useTabsStore } from "./tabs-store" +import { Tooltip } from "../Tooltip/Tooltip" + +type TabItemChild = ReactElement + +interface TabsProps { + children: TabItemChild | TabItemChild[] + forcedActiveTab?: string + classNames?: string + fixed?: boolean +} + +export const Tabs: FC = ({ children, forcedActiveTab, classNames, fixed }) => { + const { activeTab, setActiveTab, tabItems, setTabItems } = useTabsStore() + + useDeepCompareEffect(() => { + const initState = forcedActiveTab ?? activeTab ?? tabItems?.[0]?.label + setActiveTab(initState) + }, [tabItems]) + + useEffect(() => { + const newTabItems = isArray(children) ? children : [children] + setTabItems(newTabItems.map((child) => child.props)) + }, [children]) + + const handleClick = (newActiveTab: string) => { + setActiveTab(newActiveTab) + } + + const zIndex: Record = tabItems.reduce( + (accu, _, index) => ({ + ...accu, + [index]: (tabItems.length - index) * 10, + }), + {} + ) + + const left: Record = tabItems.reduce( + (accu, _, index) => ({ + ...accu, + [index]: `-${index * 8}px`, + }), + {} + ) + + const getButtonClasses = (label: string) => + clsx( + "w-full flex flex-1 items-center justify-center p-2 text-gray-700 w-full font-medium rounded-t-[10px] shadow-[rgba(50,50,93,0.25)_0px_6px_12px_-2px,_rgba(0,0,0,0.3)_0px_3px_7px_-3px] min-w-[75px] bg-neutral dark:bg-base-100 relative", + { + "border-b-2 border-b-accent": activeTab === label, + }, + activeTab === label ? `border-[${LIGHT_THEME.colors?.accent}]` : "" + ) + + return ( +
+
+
+ {tabItems.map((tabItem: TabItemProps, index) => { + const { label, showTooltip, hideLabel, icon } = tabItem + + return ( + + + + ) + })} +
+
+
+ {tabItems.map((tabItem: TabItemProps) => { + const { label, children } = tabItem + + if (label === activeTab) { + return ( +
+ {children} +
+ ) + } + + return ( +
+ {children} +
+ ) + })} +
+
+ ) +} diff --git a/frontend/src/components/Common/Tabs/index.ts b/frontend/src/components/Common/Tabs/index.ts new file mode 100644 index 00000000..b53d557c --- /dev/null +++ b/frontend/src/components/Common/Tabs/index.ts @@ -0,0 +1,2 @@ +export * from "./Tabs" +export * from "./TabItem" diff --git a/frontend/src/components/Common/Tabs/tabs-store.ts b/frontend/src/components/Common/Tabs/tabs-store.ts new file mode 100644 index 00000000..2e757743 --- /dev/null +++ b/frontend/src/components/Common/Tabs/tabs-store.ts @@ -0,0 +1,17 @@ +import { create } from "zustand" + +import { type TabItemProps } from "./TabItem" + +export interface TabsState { + activeTab?: string + setActiveTab: (activeTab?: string) => void + tabItems: TabItemProps[] + setTabItems: (tabItems: TabItemProps[]) => void +} + +export const useTabsStore = create()((set) => ({ + activeTab: undefined, + setActiveTab: (activeTab?: string) => set(() => ({ activeTab })), + tabItems: [], + setTabItems: (tabItems: TabItemProps[]) => set(() => ({ tabItems })), +})) diff --git a/frontend/src/components/Common/TagInput/TagInput.tsx b/frontend/src/components/Common/TagInput/TagInput.tsx new file mode 100644 index 00000000..b7faa2a6 --- /dev/null +++ b/frontend/src/components/Common/TagInput/TagInput.tsx @@ -0,0 +1,55 @@ +import { useState } from "react" + +import { createTag, type CreateTagType } from "./TagInput.types" + +interface TagInputProps { + tags: CreateTagType[] + setTags: (tags: CreateTagType[]) => void +} + +export const TagInput = ({ tags, setTags }: TagInputProps) => { + const [inputValue, setInputValue] = useState("") + + const handleInputChange = (e: any) => { + setInputValue(e?.target?.value) + } + + const handleKeyDown = (e: any) => { + if ((e?.key === "Enter" || e?.key === "Tab") && inputValue?.trim() !== "") { + e?.preventDefault() + setTags([...tags, createTag({ value: inputValue?.trim() })]) + setInputValue("") + } else if (e?.key === "Backspace" && inputValue === "") { + setTags(tags?.slice(0, -1)) + } + } + + const handleRemoveTag = (tag: CreateTagType) => { + setTags(tags?.filter((t) => t.id !== tag.id)) + } + + return ( +
+ {tags?.map((tag) => ( +
+ {tag.value} + +
+ )) ?? []} + +
+ ) +} diff --git a/frontend/src/components/Common/TagInput/TagInput.types.ts b/frontend/src/components/Common/TagInput/TagInput.types.ts new file mode 100644 index 00000000..da3f6bda --- /dev/null +++ b/frontend/src/components/Common/TagInput/TagInput.types.ts @@ -0,0 +1,16 @@ +import { LIGHT_THEME } from "~/styles/themes" +import { generateUUID } from "~/utils" + +export interface CreateTagType { + id?: string + value: string + color?: string + tagType?: T +} + +export const createTag = ({ value, tagType, color = LIGHT_THEME.colors?.["base-200"] }: CreateTagType) => ({ + id: generateUUID(), + tagType, + color, + value, +}) diff --git a/frontend/src/components/Common/TagInput/index.ts b/frontend/src/components/Common/TagInput/index.ts new file mode 100644 index 00000000..5fb4f505 --- /dev/null +++ b/frontend/src/components/Common/TagInput/index.ts @@ -0,0 +1,2 @@ +export * from "./TagInput" +export * from "./TagInput.types" diff --git a/frontend/src/components/Common/TextField/TextField.tsx b/frontend/src/components/Common/TextField/TextField.tsx new file mode 100644 index 00000000..ddb594f8 --- /dev/null +++ b/frontend/src/components/Common/TextField/TextField.tsx @@ -0,0 +1,32 @@ +import { forwardRef, type Ref } from "react" + +interface TextFieldProps { + value: any + onChange: (value: any) => void + disabled?: boolean + label?: string + placeholder?: string + height?: string + autoFocus?: boolean +} + +export const TextField = forwardRef(function TextField( + { value, placeholder, label, onChange, height = "h-32", ...rest }: TextFieldProps, + ref?: Ref +) { + return ( +
+ +