From 52aae285421b3c0206e6312f303027dd4bb77579 Mon Sep 17 00:00:00 2001 From: ducanh-ho2296 Date: Tue, 30 Apr 2024 08:55:11 +0000 Subject: [PATCH] Merge latest tag from upstream --- .github/ISSUE_TEMPLATE/bugfix.yml | 4 - .github/ISSUE_TEMPLATE/feature.yml | 4 - .github/ISSUE_TEMPLATE/refactor.yml | 4 - .github/workflows/e2e.yml | 19 +- .github/workflows/lint_on_push_or_pull.yml | 14 +- .github/workflows/publish_github.yml | 35 + .github/workflows/release.yml | 44 + .gitignore | 4 - .prettierignore | 4 - CHANGELOG.md | 38 +- CONTRIBUTING.md | 8 +- LICENSE.md | 9 + README.md | 134 +- create-app.ts | 12 +- e2e/basic.spec.ts | 6 +- e2e/utils.ts | 20 +- helpers/constant.ts | 4 - helpers/copy.ts | 22 +- helpers/datasources.ts | 92 +- helpers/devcontainer.ts | 11 +- helpers/dir.ts | 4 - helpers/env-variables.ts | 235 +- helpers/get-pkg-manager.ts | 4 - helpers/git.ts | 4 - helpers/index.ts | 40 +- helpers/install.ts | 4 - helpers/is-folder-empty.ts | 4 - helpers/is-online.ts | 4 - helpers/is-url.ts | 4 - helpers/is-writeable.ts | 4 - helpers/llama-pack.ts | 4 - helpers/make-dir.ts | 4 - helpers/poetry.ts | 4 - helpers/providers/index.ts | 66 + helpers/providers/ollama.ts | 92 + helpers/providers/openai.ts | 146 + helpers/python.ts | 257 +- helpers/repo.ts | 4 - helpers/run-app.ts | 4 - helpers/tools.ts | 64 +- helpers/types.ts | 30 +- helpers/typescript.ts | 223 +- helpers/validate-pkg.ts | 4 - index.ts | 58 +- package.json | 56 +- playwright.config.ts | 4 - pnpm-lock.yaml | 4345 +++++++++-------- prettier.config.js | 4 - questions.ts | 474 +- scripts/build.sh | 4 - scripts/pack.sh | 4 - templates/.gitignore | 4 - templates/README-fullstack.md | 6 - templates/components/data/101.pdf | Bin 0 -> 47931 bytes .../components/deployments/python/Dockerfile | 4 - .../deployments/typescript/Dockerfile | 4 - .../engines/python/agent/__init__.py | 13 +- .../components/engines/python/agent/tools.py | 14 +- .../engines/python/chat/__init__.py | 16 +- .../engines/typescript/agent/chat.ts | 55 +- .../engines/typescript/chat/chat.ts | 17 +- .../components/loaders/python/__init__.py | 25 +- templates/components/loaders/python/db.py | 23 +- templates/components/loaders/python/file.py | 4 - templates/components/loaders/python/web.py | 4 - .../loaders/typescript/file/loader.ts | 9 + .../loaders/typescript/llama_parse/loader.ts | 19 + .../python/opentelemetry/observability.py | 5 + .../typescript/opentelemetry/index.ts | 4 - .../llamapack/README-template.md | 6 - .../sample-projects/llamapack/pyproject.toml | 4 - .../components/ui/html/chat/chat-avatar.tsx | 4 - .../components/ui/html/chat/chat-input.tsx | 4 - .../components/ui/html/chat/chat-item.tsx | 4 - .../components/ui/html/chat/chat-messages.tsx | 4 - templates/components/ui/html/chat/index.ts | 4 - .../vectordbs/python/astra/__init__.py | 0 .../vectordbs/python/astra/generate.py | 37 + .../vectordbs/python/astra/index.py | 21 + .../vectordbs/python/milvus/generate.py | 6 +- .../vectordbs/python/milvus/index.py | 4 - .../vectordbs/python/mongo/generate.py | 6 +- .../vectordbs/python/mongo/index.py | 4 - .../vectordbs/python/none/constants.py | 4 - .../vectordbs/python/none/generate.py | 6 +- .../components/vectordbs/python/none/index.py | 9 +- .../vectordbs/python/pg/constants.py | 4 - .../vectordbs/python/pg/generate.py | 6 +- .../components/vectordbs/python/pg/index.py | 4 - .../components/vectordbs/python/pg/utils.py | 5 - .../vectordbs/python/pinecone/generate.py | 6 +- .../vectordbs/python/pinecone/index.py | 4 - .../vectordbs/python/qdrant/__init__.py | 0 .../vectordbs/python/qdrant/generate.py | 37 + .../vectordbs/python/qdrant/index.py | 20 + .../vectordbs/typescript/astra/generate.ts | 43 + .../vectordbs/typescript/astra/index.ts | 10 + .../vectordbs/typescript/astra/shared.ts | 23 + .../vectordbs/typescript/milvus/generate.ts | 39 + .../vectordbs/typescript/milvus/index.ts | 37 +- .../vectordbs/typescript/milvus/shared.ts | 37 + .../vectordbs/typescript/mongo/generate.ts | 49 + .../vectordbs/typescript/mongo/index.ts | 36 +- .../vectordbs/typescript/mongo/shared.ts | 23 + .../vectordbs/typescript/none/generate.ts | 38 + .../vectordbs/typescript/none/index.ts | 20 +- .../vectordbs/typescript/none/shared.ts | 1 + .../vectordbs/typescript/pg/generate.ts | 45 + .../vectordbs/typescript/pg/index.ts | 34 +- .../vectordbs/typescript/pg/shared.ts | 22 + .../vectordbs/typescript/pinecone/generate.ts | 35 + .../vectordbs/typescript/pinecone/index.ts | 32 +- .../vectordbs/typescript/pinecone/shared.ts | 18 + .../vectordbs/typescript/qdrant/generate.ts | 37 + .../vectordbs/typescript/qdrant/index.ts | 13 + .../vectordbs/typescript/qdrant/shared.ts | 32 + .../streaming/express/README-template.md | 6 - templates/types/streaming/express/index.ts | 4 - templates/types/streaming/express/npmrc | 1 + .../types/streaming/express/package.json | 11 +- .../streaming/express/prettier.config.js | 4 - .../controllers/chat-request.controller.ts | 14 +- .../src/controllers/chat.controller.ts | 14 +- .../express/src/controllers/engine/chat.ts | 10 +- .../src/controllers/engine/settings.ts | 52 + .../src/controllers/llamaindex-stream.ts | 70 +- .../express/src/observability/index.ts | 4 - .../express/src/routes/chat.route.ts | 6 +- .../streaming/fastapi/README-template.md | 18 +- .../streaming/fastapi/app/api/routers/chat.py | 72 +- .../app/api/routers/vercel_response.py | 29 + .../streaming/fastapi/app/engine/__init__.py | 4 - .../streaming/fastapi/app/observability.py | 2 + .../types/streaming/fastapi/app/settings.py | 73 +- templates/types/streaming/fastapi/main.py | 13 +- .../types/streaming/fastapi/pyproject.toml | 13 +- .../types/streaming/nextjs/README-template.md | 6 - .../nextjs/app/api/chat/engine/chat.ts | 10 +- .../nextjs/app/api/chat/engine/settings.ts | 52 + .../nextjs/app/api/chat/llamaindex-stream.ts | 70 +- .../streaming/nextjs/app/api/chat/route.ts | 26 +- .../nextjs/app/components/chat-section.tsx | 19 +- .../nextjs/app/components/header.tsx | 15 +- .../app/components/ui/README-template.md | 6 - .../nextjs/app/components/ui/button.tsx | 4 - .../app/components/ui/chat/chat-actions.tsx | 4 - .../app/components/ui/chat/chat-avatar.tsx | 16 +- .../app/components/ui/chat/chat-image.tsx | 17 + .../app/components/ui/chat/chat-input.tsx | 16 +- .../app/components/ui/chat/chat-message.tsx | 94 +- .../app/components/ui/chat/chat-messages.tsx | 8 +- .../app/components/ui/chat/chat-sources.tsx | 94 + .../app/components/ui/chat/chat.interface.ts | 4 - .../app/components/ui/chat/codeblock.tsx | 4 - .../nextjs/app/components/ui/chat/index.ts | 31 +- .../app/components/ui/chat/markdown.tsx | 4 - .../ui/chat/use-copy-to-clipboard.tsx | 4 - .../app/components/ui/file-uploader.tsx | 13 +- .../nextjs/app/components/ui/hover-card.tsx | 29 + .../nextjs/app/components/ui/input.tsx | 4 - .../nextjs/app/components/ui/lib/utils.ts | 4 - .../components/ui/upload-image-preview.tsx | 4 - .../types/streaming/nextjs/app/favicon.ico | Bin 152126 -> 15406 bytes .../types/streaming/nextjs/app/globals.css | 6 - .../types/streaming/nextjs/app/layout.tsx | 18 +- .../types/streaming/nextjs/app/markdown.css | 6 - .../nextjs/app/observability/index.ts | 4 - templates/types/streaming/nextjs/app/page.tsx | 4 - .../types/streaming/nextjs/next-env.d.ts | 4 - .../types/streaming/nextjs/next.config.mjs | 4 - templates/types/streaming/nextjs/package.json | 16 +- .../types/streaming/nextjs/postcss.config.js | 4 - .../types/streaming/nextjs/prettier.config.js | 4 - .../types/streaming/nextjs/tailwind.config.ts | 6 - .../types/streaming/nextjs/webpack.config.mjs | 7 +- .../streaming/nextjs/webpack.config.o11y.mjs | 7 +- 176 files changed, 5119 insertions(+), 3658 deletions(-) create mode 100644 .github/workflows/publish_github.yml create mode 100644 .github/workflows/release.yml create mode 100644 LICENSE.md create mode 100644 helpers/providers/index.ts create mode 100644 helpers/providers/ollama.ts create mode 100644 helpers/providers/openai.ts create mode 100644 templates/components/data/101.pdf create mode 100644 templates/components/loaders/typescript/file/loader.ts create mode 100644 templates/components/loaders/typescript/llama_parse/loader.ts create mode 100644 templates/components/observability/python/opentelemetry/observability.py create mode 100644 templates/components/vectordbs/python/astra/__init__.py create mode 100644 templates/components/vectordbs/python/astra/generate.py create mode 100644 templates/components/vectordbs/python/astra/index.py create mode 100644 templates/components/vectordbs/python/qdrant/__init__.py create mode 100644 templates/components/vectordbs/python/qdrant/generate.py create mode 100644 templates/components/vectordbs/python/qdrant/index.py create mode 100644 templates/components/vectordbs/typescript/astra/generate.ts create mode 100644 templates/components/vectordbs/typescript/astra/index.ts create mode 100644 templates/components/vectordbs/typescript/astra/shared.ts create mode 100644 templates/components/vectordbs/typescript/milvus/generate.ts create mode 100644 templates/components/vectordbs/typescript/milvus/shared.ts create mode 100644 templates/components/vectordbs/typescript/mongo/generate.ts create mode 100644 templates/components/vectordbs/typescript/mongo/shared.ts create mode 100644 templates/components/vectordbs/typescript/none/generate.ts create mode 100644 templates/components/vectordbs/typescript/none/shared.ts create mode 100644 templates/components/vectordbs/typescript/pg/generate.ts create mode 100644 templates/components/vectordbs/typescript/pg/shared.ts create mode 100644 templates/components/vectordbs/typescript/pinecone/generate.ts create mode 100644 templates/components/vectordbs/typescript/pinecone/shared.ts create mode 100644 templates/components/vectordbs/typescript/qdrant/generate.ts create mode 100644 templates/components/vectordbs/typescript/qdrant/index.ts create mode 100644 templates/components/vectordbs/typescript/qdrant/shared.ts create mode 100644 templates/types/streaming/express/npmrc create mode 100644 templates/types/streaming/express/src/controllers/engine/settings.ts create mode 100644 templates/types/streaming/fastapi/app/api/routers/vercel_response.py create mode 100644 templates/types/streaming/fastapi/app/observability.py create mode 100644 templates/types/streaming/nextjs/app/api/chat/engine/settings.ts create mode 100644 templates/types/streaming/nextjs/app/components/ui/chat/chat-image.tsx create mode 100644 templates/types/streaming/nextjs/app/components/ui/chat/chat-sources.tsx create mode 100644 templates/types/streaming/nextjs/app/components/ui/hover-card.tsx diff --git a/.github/ISSUE_TEMPLATE/bugfix.yml b/.github/ISSUE_TEMPLATE/bugfix.yml index 15b91fb8..4c9ad4f4 100644 --- a/.github/ISSUE_TEMPLATE/bugfix.yml +++ b/.github/ISSUE_TEMPLATE/bugfix.yml @@ -1,7 +1,3 @@ -# SPDX-FileCopyrightText: 2024 Deutsche Telekom AG, LlamaIndex, Vercel, Inc. -# -# SPDX-License-Identifier: MIT - name: Bugfix title: "" description: Write something like "We notice ... behavior when ... happens instead of ..." diff --git a/.github/ISSUE_TEMPLATE/feature.yml b/.github/ISSUE_TEMPLATE/feature.yml index 4ee76046..e42d17ce 100644 --- a/.github/ISSUE_TEMPLATE/feature.yml +++ b/.github/ISSUE_TEMPLATE/feature.yml @@ -1,7 +1,3 @@ -# SPDX-FileCopyrightText: 2024 Deutsche Telekom AG, LlamaIndex, Vercel, Inc. -# -# SPDX-License-Identifier: MIT - name: Feature Request title: "" description: Write something like "Write an api endpoint that does "..." in the "..." file". diff --git a/.github/ISSUE_TEMPLATE/refactor.yml b/.github/ISSUE_TEMPLATE/refactor.yml index f9df2cf0..bc1d0e9c 100644 --- a/.github/ISSUE_TEMPLATE/refactor.yml +++ b/.github/ISSUE_TEMPLATE/refactor.yml @@ -1,7 +1,3 @@ -# SPDX-FileCopyrightText: 2024 Deutsche Telekom AG, LlamaIndex, Vercel, Inc. -# -# SPDX-License-Identifier: MIT - name: Refactor title: "" description: Write something like "Modify the ... api endpoint to use ... version and ... framework" diff --git a/.github/workflows/e2e.yml b/.github/workflows/e2e.yml index 854280b8..7f6c03ef 100644 --- a/.github/workflows/e2e.yml +++ b/.github/workflows/e2e.yml @@ -1,7 +1,3 @@ -# SPDX-FileCopyrightText: 2024 Deutsche Telekom AG, LlamaIndex, Vercel, Inc. -# -# SPDX-License-Identifier: MIT - name: E2E Tests on: push: @@ -28,36 +24,45 @@ jobs: runs-on: ${{ matrix.os }} steps: - uses: actions/checkout@v4 + - name: Set up python ${{ matrix.python-version }} uses: actions/setup-python@v4 with: python-version: ${{ matrix.python-version }} + - name: Install Poetry uses: snok/install-poetry@v1 with: version: ${{ env.POETRY_VERSION }} - - uses: pnpm/action-setup@v2 + - name: Setup Node.js ${{ matrix.node-version }} uses: actions/setup-node@v4 with: node-version: ${{ matrix.node-version }} - cache: "pnpm" + + - uses: pnpm/action-setup@v3 + - name: Install dependencies run: pnpm install + - name: Install Playwright Browsers run: pnpm exec playwright install --with-deps working-directory: . + - name: Build create-llama run: pnpm run build working-directory: . + - name: Install run: pnpm run pack-install working-directory: . + - name: Run Playwright tests run: pnpm run e2e env: - TSI_API_KEY: ${{ secrets.TSI_API_KEY }} + OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }} working-directory: . + - uses: actions/upload-artifact@v3 if: always() with: diff --git a/.github/workflows/lint_on_push_or_pull.yml b/.github/workflows/lint_on_push_or_pull.yml index 5c147ab3..7159fa68 100644 --- a/.github/workflows/lint_on_push_or_pull.yml +++ b/.github/workflows/lint_on_push_or_pull.yml @@ -1,7 +1,3 @@ -# SPDX-FileCopyrightText: 2024 Deutsche Telekom AG, LlamaIndex, Vercel, Inc. -# -# SPDX-License-Identifier: MIT - name: Lint on push or pull request on: @@ -17,17 +13,19 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - uses: pnpm/action-setup@v2 - with: - version: latest + - name: Setup Node.js uses: actions/setup-node@v4 with: node-version-file: ".nvmrc" - cache: "pnpm" + + - uses: pnpm/action-setup@v3 + - name: Install dependencies run: pnpm install + - name: Run lint run: pnpm run lint + - name: Run Prettier run: pnpm run format diff --git a/.github/workflows/publish_github.yml b/.github/workflows/publish_github.yml new file mode 100644 index 00000000..b1504b77 --- /dev/null +++ b/.github/workflows/publish_github.yml @@ -0,0 +1,35 @@ +name: Publish to GitHub Releases + +on: + push: + tags: + - "v*" + +jobs: + build-and-publish: + runs-on: ubuntu-latest + steps: + - name: Checkout Repo + uses: actions/checkout@v4 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version-file: ".nvmrc" + + - uses: pnpm/action-setup@v3 + + - name: Install dependencies + run: pnpm install + + - name: Build tarball + run: | + pnpm pack + + - name: Create release + uses: ncipollo/release-action@v1 + with: + artifacts: "create-llama-*.tgz" + name: Release ${{ github.ref }} + bodyFile: "CHANGELOG.md" + token: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 00000000..cf22a16d --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,44 @@ +name: Release + +on: + push: + branches: + - main + +concurrency: ${{ github.workflow }}-${{ github.ref }} + +jobs: + release: + name: Release + runs-on: ubuntu-latest + steps: + - name: Checkout Repo + uses: actions/checkout@v4 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version-file: ".nvmrc" + + - uses: pnpm/action-setup@v3 + + - name: Install dependencies + run: pnpm install + + - name: Add auth token to .npmrc file + run: | + cat << EOF >> ".npmrc" + //registry.npmjs.org/:_authToken=$NPM_TOKEN + EOF + env: + NPM_TOKEN: ${{ secrets.NPM_TOKEN }} + + - name: Create Release Pull Request or Publish to npm + id: changesets + uses: changesets/action@v1 + with: + # build package and call changeset publish + publish: pnpm release + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + NPM_TOKEN: ${{ secrets.NPM_TOKEN }} diff --git a/.gitignore b/.gitignore index b785c6f6..6c50932b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,3 @@ -# SPDX-FileCopyrightText: 2024 Deutsche Telekom AG, LlamaIndex, Vercel, Inc. -# -# SPDX-License-Identifier: MIT - # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. # dependencies diff --git a/.prettierignore b/.prettierignore index 11755455..5cbece91 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1,7 +1,3 @@ -# SPDX-FileCopyrightText: 2024 Deutsche Telekom AG, LlamaIndex, Vercel, Inc. -# -# SPDX-License-Identifier: MIT - apps/docs/i18n apps/docs/docs/api pnpm-lock.yaml diff --git a/CHANGELOG.md b/CHANGELOG.md index 64541654..b6e34561 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,32 +1,36 @@ - +### Minor Changes -# create-tsi - -## 0.0.18 - -### Patch Changes - -- ddbc80f: Fix missing brave and duckduckgo search tools - -## 0.0.17 +- f1c3e8d: Add Llama3 and Phi3 support using Ollama ### Patch Changes -- 06fdd7f: Add support for LLM Hub v2 +- a0dec80: Use `gpt-4-turbo` model as default. Upgrade Python llama-index to 0.10.28 +- 753229d: Remove asking for AI models and use defaults instead (OpenAIs GPT-4 Vision Preview and Embeddings v3). Use `--ask-models` CLI parameter to select models. +- 1d78202: Add observability for Python +- 6acccd2: Use poetry run generate to generate embeddings for FastAPI +- 9efcffe: Use Settings object for LlamaIndex configuration +- 418bf9b: refactor: use tsx instead of ts-node +- 1be69a5: Add Qdrant support -## 0.0.16 +## 0.0.32 ### Patch Changes -- ce2f24d: Update loaders and tools config to yaml format +- 625ed4d: Support Astra VectorDB +- 922e0ce: Remove UI question (use shadcn as default). Use `html` UI by calling create-llama with --ui html parameter +- ce2f24d: Update loaders and tools config to yaml format (for Python) - e8db041: Let user select multiple datasources (URLs, files and folders) -- 78ded9e: Add Dockerfile template +- c06d4af: Add nodes to the response (Python) +- 29b17ee: Allow using agents without any data source +- 665c26c: Add redirect to documentation page when accessing the base URL (FastAPI) +- 78ded9e: Add Dockerfile templates for Typescript and Python - 99e758f: Merge non-streaming and streaming template to one +- b3f2685: Add support for agent generation for Typescript +- 2739714: Use a database (MySQL or PostgreSQL) as a data source ## 0.0.31 diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index ea9dcfe1..5a879cbc 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,9 +1,3 @@ - - # Contributing ## Getting Started @@ -13,7 +7,7 @@ Install NodeJS. Preferably v18 using nvm or n. Inside the `create-llama` directory: ``` -npm i -g pnpm ts-node +npm i -g pnpm pnpm install ``` diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 00000000..c16e650c --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,9 @@ +The MIT License (MIT) + +Copyright (c) 2023 LlamaIndex, Vercel, Inc. + +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/README.md b/README.md index 3c10f9fe..f0a06716 100644 --- a/README.md +++ b/README.md @@ -1,89 +1,127 @@ - +The easiest way to get started with [LlamaIndex](https://www.llamaindex.ai/) is by using `create-llama`. This CLI tool enables you to quickly start building a new LlamaIndex application, with everything set up for you. -# Create TSI +Just run -`create-tsi` is a generative AI RAG toolkit that generates AI Applications using [LlamaIndex](https://www.llamaindex.ai/) with low code. +```bash +npx create-llama@latest +``` + +to get started, or see below for more options. Once your app is generated, run + +```bash +npm run dev +``` -AI Applications generated by `create-tsi`, use LLMs hosted by T-Systems on Open Telekom Cloud. +to start the development server. You can then visit [http://localhost:3000](http://localhost:3000) to see your app. -The purpose of `create-tsi` is to make the AI Application creation process easy, flexible and fast. With `create-tsi` you can generate bots, write agents and customize them for specific use cases. +## What you'll get + +- A Next.js-powered front-end using components from [shadcn/ui](https://ui.shadcn.com/). The app is set up as a chat interface that can answer questions about your data (see below) +- Your choice of 3 back-ends: + - **Next.js**: if you select this option, you’ll have a full-stack Next.js application that you can deploy to a host like [Vercel](https://vercel.com/) in just a few clicks. This uses [LlamaIndex.TS](https://www.npmjs.com/package/llamaindex), our TypeScript library. + - **Express**: if you want a more traditional Node.js application you can generate an Express backend. This also uses LlamaIndex.TS. + - **Python FastAPI**: if you select this option, you’ll get a backend powered by the [llama-index python package](https://pypi.org/project/llama-index/), which you can deploy to a service like Render or fly.io. +- The back-end has two endpoints (one streaming, the other one non-streaming) that allow you to send the state of your chat and receive additional responses +- You add arbitrary data sources to your chat, like local files, websites, or data retrieved from a database. +- Turn your chat into an AI agent by adding tools (functions called by the LLM). +- The app uses OpenAI by default, so you'll need an OpenAI API key, or you can customize it to use any of the dozens of LLMs we support. + +## Using your data + +You can supply your own data; the app will index it and answer questions. Your generated app will have a folder called `data` (If you're using Express or Python and generate a frontend, it will be `./backend/data`). -### Please Note -To get started with `create-tsi`, you need a T-Systems API key. You can request trial access via [this form](https://forms.gle/1HzUGWGG12CmCnbk6). +The app will ingest any supported files you put in this directory. Your Next.js and Express apps use LlamaIndex.TS so they will be able to ingest any PDF, text, CSV, Markdown, Word and HTML files. The Python backend can read even more types, including video and audio files. -Once you have the key, just run +Before you can use your data, you need to index it. If you're using the Next.js or Express apps, run: ```bash -npx create-tsi@latest +npm run generate ``` -to get started. Once your app is generated, read the generated `README.md` file to start the app. +Then re-start your app. Remember you'll need to re-run `generate` if you add new files to your `data` folder. -## What you'll get +If you're using the Python backend, you can trigger indexing of your data by calling: -- A Next.js-powered front-end. The app is set up as a chat interface that can answer questions about your data (see below) -- **Python FastAPI** backend: You’ll get a backend powered by the [llama-index python package](https://pypi.org/project/llama-index/) -- The back-end has a single endpoint that allows you to send the state of your chat and receive additional responses +```bash +poetry run generate +``` -## Using your data +## Want a front-end? + +Optionally generate a frontend if you've selected the Python or Express back-ends. If you do so, `create-llama` will generate two folders: `frontend`, for your Next.js-based frontend code, and `backend` containing your API. + +## Customizing the AI models + +The app will default to OpenAI's `gpt-4-turbo` LLM and `text-embedding-3-large` embedding model. -Unless you selected to generate a simple chat, you can supply your own data and the app will index it and be able to answer questions on the data. +If you want to use different OpenAI models, add the `--ask-models` CLI parameter. -Your generated app will have a folder called `data` in the `backend` directory. -The app will ingest any supported files you put in this directory. +You can also replace OpenAI with one of our [dozens of other supported LLMs](https://docs.llamaindex.ai/en/stable/module_guides/models/llms/modules.html). + +To do so, you have to manually change the generated code (edit the `settings.ts` file for Typescript projects or the `settings.py` file for Python projects) ## Example -The simplest thing to do is run `create-tsi` in interactive mode: +The simplest thing to do is run `create-llama` in interactive mode: ```bash -npx create-tsi@latest +npx create-llama@latest # or -npm create tsi@latest +npm create llama@latest # or -yarn create tsi +yarn create llama # or -pnpm create tsi@latest +pnpm create llama@latest ``` You will be asked for the name of your project, along with other configuration options, something like this: ```bash ->> npm create-tsi@latest +>> npm create llama@latest +Need to install the following packages: + create-llama@latest +Ok to proceed? (y) y ✔ What is your project named? … my-app -✔ Would you like to generate a NextJS frontend for your FastAPI (Python) backend? … No / Yes -✔ Please provide your T-Systems API key (or reuse TSI_API_KEY env variable): … -✔ Which model would you like to use? › Mixtral-8x7B-Instruct-v0.1 -✔ Which embedding model would you like to use? › paraphrase-multilingual-mpnet-base-v2 -? Which data source would you like to use? › - Use arrow-keys. Return to submit. - No data, just a simple chat -❯ Use an example PDF - Use local files (.pdf, .doc, .docx, .xls, .xlsx, .csv) - Use local folders - Use website content (requires Chrome) - Use data from a database (Mysql) +✔ Which template would you like to use? › Chat +✔ Which framework would you like to use? › NextJS +✔ Would you like to set up observability? › No +✔ Please provide your OpenAI API key (leave blank to skip): … +✔ Which data source would you like to use? › Use an example PDF +✔ Would you like to add another data source? › No +✔ Would you like to use LlamaParse (improved parser for RAG - requires API key)? … no / yes +✔ Would you like to use a vector database? › No, just store the data in the file system +? How would you like to proceed? › - Use arrow-keys. Return to submit. + Just generate code (~1 sec) +❯ Start in VSCode (~1 sec) + Generate code and install dependencies (~2 min) + Generate code, install dependencies, and run the app (~2 min) ``` -## Code of Conduct +### Running non-interactively + +You can also pass command line arguments to set up a new project +non-interactively. See `create-llama --help`: + +```bash +create-llama [options] + +Options: + -V, --version output the version number + + --use-npm -This project has adopted the [Contributor Covenant](https://www.contributor-covenant.org/) in version 2.1 as our code of conduct. Please see the details in our [CODE_OF_CONDUCT.md](CODE_OF_CONDUCT.md). All contributors must abide by the code of conduct. + Explicitly tell the CLI to bootstrap the app using npm -By participating in this project, you agree to abide by its [Code of Conduct](./CODE_OF_CONDUCT.md) at all times. + --use-pnpm -## Licensing + Explicitly tell the CLI to bootstrap the app using pnpm -This project follows the [REUSE standard for software licensing](https://reuse.software/). -Each file contains copyright and license information, and license texts can be found in the [./LICENSES](./LICENSES) folder. For more information visit https://reuse.software/. -You can find a guide for developers at https://telekom.github.io/reuse-template/. + --use-yarn -To annotate your files with licensing information, run: + Explicitly tell the CLI to bootstrap the app using Yarn -```shell -pipx run reuse annotate --copyright="Deutsche Telekom AG, LlamaIndex, Vercel, Inc." --license="MIT" --recursive --fallback-dot-license --skip-existing . ``` ## LlamaIndex Documentation diff --git a/create-app.ts b/create-app.ts index 27421556..d8c5ae3a 100644 --- a/create-app.ts +++ b/create-app.ts @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2024 Deutsche Telekom AG, LlamaIndex, Vercel, Inc. -// -// SPDX-License-Identifier: MIT - /* eslint-disable import/no-extraneous-dependencies */ import path from "path"; import { green, yellow } from "picocolors"; @@ -34,10 +30,8 @@ export async function createApp({ appPath, packageManager, frontend, - openAiKey, + modelConfig, llamaCloudKey, - model, - embeddingModel, communityProjectConfig, llamapack, vectorDb, @@ -81,10 +75,8 @@ export async function createApp({ ui, packageManager, isOnline, - openAiKey, + modelConfig, llamaCloudKey, - model, - embeddingModel, communityProjectConfig, llamapack, vectorDb, diff --git a/e2e/basic.spec.ts b/e2e/basic.spec.ts index 43a9f98b..454e552a 100644 --- a/e2e/basic.spec.ts +++ b/e2e/basic.spec.ts @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2024 Deutsche Telekom AG, LlamaIndex, Vercel, Inc. -// -// SPDX-License-Identifier: MIT - /* eslint-disable turbo/no-undeclared-env-vars */ import { expect, test } from "@playwright/test"; import { ChildProcess } from "child_process"; @@ -71,7 +67,7 @@ for (const templateType of templateTypes) { test("Frontend should have a title", async ({ page }) => { test.skip(templatePostInstallAction !== "runApp"); await page.goto(`http://localhost:${port}`); - await expect(page.getByText("Built by")).toBeVisible(); + await expect(page.getByText("Built by LlamaIndex")).toBeVisible(); }); test("Frontend should be able to submit a message and receive a response", async ({ diff --git a/e2e/utils.ts b/e2e/utils.ts index 7e90cd27..7001403c 100644 --- a/e2e/utils.ts +++ b/e2e/utils.ts @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2024 Deutsche Telekom AG, LlamaIndex, Vercel, Inc. -// -// SPDX-License-Identifier: MIT - import { ChildProcess, exec } from "child_process"; import crypto from "node:crypto"; import { mkdir } from "node:fs/promises"; @@ -16,8 +12,7 @@ import { } from "../helpers"; export type AppType = "--frontend" | "--no-frontend" | ""; -const MODEL = "Llama2-70b-Instruct"; -const EMBEDDING_MODEL = "paraphrase-multilingual-mpnet-base-v2"; + export type CreateLlamaResult = { projectName: string; appProcess: ChildProcess; @@ -78,8 +73,8 @@ export async function runCreateLlama( externalPort: number, postInstallAction: TemplatePostInstallAction, ): Promise { - if (!process.env.TSI_API_KEY) { - throw new Error("Setting TSI_API_KEY is mandatory to run tests"); + if (!process.env.OPENAI_API_KEY) { + throw new Error("Setting OPENAI_API_KEY is mandatory to run tests"); } const name = [ templateType, @@ -89,7 +84,7 @@ export async function runCreateLlama( appType, ].join("-"); const command = [ - "create-tsi", + "create-llama", name, "--template", templateType, @@ -100,12 +95,8 @@ export async function runCreateLlama( templateUI, "--vector-db", vectorDb, - "--model", - MODEL, - "--embedding-model", - EMBEDDING_MODEL, "--open-ai-key", - process.env.TSI_API_KEY, + process.env.OPENAI_API_KEY, appType, "--use-pnpm", "--port", @@ -117,6 +108,7 @@ export async function runCreateLlama( "--tools", "none", "--no-llama-parse", + "--observability", "none", ].join(" "); console.log(`running command '${command}' in ${cwd}`); diff --git a/helpers/constant.ts b/helpers/constant.ts index aed8c4f7..64f01be6 100644 --- a/helpers/constant.ts +++ b/helpers/constant.ts @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2024 Deutsche Telekom AG, LlamaIndex, Vercel, Inc. -// -// SPDX-License-Identifier: MIT - export const COMMUNITY_OWNER = "run-llama"; export const COMMUNITY_REPO = "create_llama_projects"; export const LLAMA_PACK_OWNER = "run-llama"; diff --git a/helpers/copy.ts b/helpers/copy.ts index c2088c4d..8543c692 100644 --- a/helpers/copy.ts +++ b/helpers/copy.ts @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2024 Deutsche Telekom AG, LlamaIndex, Vercel, Inc. -// -// SPDX-License-Identifier: MIT - /* eslint-disable import/no-extraneous-dependencies */ import { async as glob } from "fast-glob"; import fs from "fs"; @@ -52,3 +48,21 @@ export const copy = async ( }), ); }; + +export const assetRelocator = (name: string) => { + switch (name) { + case "gitignore": + case "npmrc": + case "eslintrc.json": { + return `.${name}`; + } + // README.md is ignored by webpack-asset-relocator-loader used by ncc: + // https://github.com/vercel/webpack-asset-relocator-loader/blob/e9308683d47ff507253e37c9bcbb99474603192b/src/asset-relocator.js#L227 + case "README-template.md": { + return "README.md"; + } + default: { + return name; + } + } +}; diff --git a/helpers/datasources.ts b/helpers/datasources.ts index a3695641..e56e2a72 100644 --- a/helpers/datasources.ts +++ b/helpers/datasources.ts @@ -1,20 +1,13 @@ -// SPDX-FileCopyrightText: 2024 Deutsche Telekom AG, LlamaIndex, Vercel, Inc. -// -// SPDX-License-Identifier: MIT - +import fs from "fs/promises"; import path from "path"; +import yaml, { Document } from "yaml"; import { templatesDir } from "./dir"; -import { TemplateDataSource } from "./types"; +import { DbSourceConfig, TemplateDataSource, WebSourceConfig } from "./types"; export const EXAMPLE_FILE: TemplateDataSource = { type: "file", config: { - path: path.join( - templatesDir, - "components", - "data", - "open-telekom-cloud-technik-flyer-2022.pdf", - ), + path: path.join(templatesDir, "components", "data", "101.pdf"), }, }; @@ -37,3 +30,80 @@ export function getDataSources( } return dataSources; } + +export async function writeLoadersConfig( + root: string, + dataSources: TemplateDataSource[], + useLlamaParse?: boolean, +) { + if (dataSources.length === 0) return; // no datasources, no config needed + const loaderConfig = new Document({}); + // Web loader config + if (dataSources.some((ds) => ds.type === "web")) { + const webLoaderConfig = new Document({}); + + // Create config for browser driver arguments + const driverArgNodeValue = webLoaderConfig.createNode([ + "--no-sandbox", + "--disable-dev-shm-usage", + ]); + driverArgNodeValue.commentBefore = + " The arguments to pass to the webdriver. E.g.: add --headless to run in headless mode"; + webLoaderConfig.set("driver_arguments", driverArgNodeValue); + + // Create config for urls + const urlConfigs = dataSources + .filter((ds) => ds.type === "web") + .map((ds) => { + const dsConfig = ds.config as WebSourceConfig; + return { + base_url: dsConfig.baseUrl, + prefix: dsConfig.prefix, + depth: dsConfig.depth, + }; + }); + const urlConfigNode = webLoaderConfig.createNode(urlConfigs); + urlConfigNode.commentBefore = ` base_url: The URL to start crawling with + prefix: Only crawl URLs matching the specified prefix + depth: The maximum depth for BFS traversal + You can add more websites by adding more entries (don't forget the - prefix from YAML)`; + webLoaderConfig.set("urls", urlConfigNode); + + // Add web config to the loaders config + loaderConfig.set("web", webLoaderConfig); + } + + // File loader config + if (dataSources.some((ds) => ds.type === "file")) { + // Add documentation to web loader config + const node = loaderConfig.createNode({ + use_llama_parse: useLlamaParse, + }); + node.commentBefore = ` use_llama_parse: Use LlamaParse if \`true\`. Needs a \`LLAMA_CLOUD_API_KEY\` from https://cloud.llamaindex.ai set as environment variable`; + loaderConfig.set("file", node); + } + + // DB loader config + const dbLoaders = dataSources.filter((ds) => ds.type === "db"); + if (dbLoaders.length > 0) { + const dbLoaderConfig = new Document({}); + const configEntries = dbLoaders.map((ds) => { + const dsConfig = ds.config as DbSourceConfig; + return { + uri: dsConfig.uri, + queries: [dsConfig.queries], + }; + }); + + const node = dbLoaderConfig.createNode(configEntries); + node.commentBefore = ` The configuration for the database loader, only supports MySQL and PostgreSQL databases for now. + uri: The URI for the database. E.g.: mysql+pymysql://user:password@localhost:3306/db or postgresql+psycopg2://user:password@localhost:5432/db + query: The query to fetch data from the database. E.g.: SELECT * FROM table`; + loaderConfig.set("db", node); + } + + // Write loaders config + const loaderConfigPath = path.join(root, "config", "loaders.yaml"); + await fs.mkdir(path.join(root, "config"), { recursive: true }); + await fs.writeFile(loaderConfigPath, yaml.stringify(loaderConfig)); +} diff --git a/helpers/devcontainer.ts b/helpers/devcontainer.ts index 233ca489..41574119 100644 --- a/helpers/devcontainer.ts +++ b/helpers/devcontainer.ts @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2024 Deutsche Telekom AG, LlamaIndex, Vercel, Inc. -// -// SPDX-License-Identifier: MIT - import fs from "fs"; import path from "path"; import { TemplateFramework } from "./types"; @@ -50,13 +46,16 @@ export const writeDevcontainer = async ( framework: TemplateFramework, frontend: boolean, ) => { - console.log("Adding .devcontainer"); + const devcontainerDir = path.join(root, ".devcontainer"); + if (fs.existsSync(devcontainerDir)) { + console.log("Template already has a .devcontainer. Using it."); + return; + } const devcontainerContent = renderDevcontainerContent( templatesDir, framework, frontend, ); - const devcontainerDir = path.join(root, ".devcontainer"); fs.mkdirSync(devcontainerDir); await fs.promises.writeFile( path.join(devcontainerDir, "devcontainer.json"), diff --git a/helpers/dir.ts b/helpers/dir.ts index d5e267e2..31ded64c 100644 --- a/helpers/dir.ts +++ b/helpers/dir.ts @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2024 Deutsche Telekom AG, LlamaIndex, Vercel, Inc. -// -// SPDX-License-Identifier: MIT - import path from "path"; export const templatesDir = path.join(__dirname, "..", "templates"); diff --git a/helpers/env-variables.ts b/helpers/env-variables.ts index 4419e586..9cd3f5ad 100644 --- a/helpers/env-variables.ts +++ b/helpers/env-variables.ts @@ -1,10 +1,7 @@ -// SPDX-FileCopyrightText: 2024 Deutsche Telekom AG, LlamaIndex, Vercel, Inc. -// -// SPDX-License-Identifier: MIT - import fs from "fs/promises"; import path from "path"; import { + ModelConfig, TemplateDataSource, TemplateFramework, TemplateVectorDB, @@ -32,7 +29,10 @@ const renderEnvVar = (envVars: EnvVar[]): string => { ); }; -const getVectorDBEnvs = (vectorDb: TemplateVectorDB) => { +const getVectorDBEnvs = (vectorDb?: TemplateVectorDB): EnvVar[] => { + if (!vectorDb) { + return []; + } switch (vectorDb) { case "mongo": return [ @@ -97,101 +97,112 @@ const getVectorDBEnvs = (vectorDb: TemplateVectorDB) => { description: "The password to access the Milvus server.", }, ]; + case "astra": + return [ + { + name: "ASTRA_DB_APPLICATION_TOKEN", + description: "The generated app token for your Astra database", + }, + { + name: "ASTRA_DB_ENDPOINT", + description: "The API endpoint for your Astra database", + }, + { + name: "ASTRA_DB_COLLECTION", + description: "The name of the collection in your Astra database", + }, + ]; + case "qdrant": + return [ + { + name: "QDRANT_URL", + description: + "The qualified REST URL of the Qdrant server. Eg: http://localhost:6333", + }, + { + name: "QDRANT_COLLECTION", + description: "The name of Qdrant collection to use.", + }, + { + name: "QDRANT_API_KEY", + description: + "Optional API key for authenticating requests to Qdrant.", + }, + ]; default: return []; } }; -export const createBackendEnvFile = async ( - root: string, - opts: { - openAiKey?: string; - llamaCloudKey?: string; - vectorDb?: TemplateVectorDB; - model?: string; - embeddingModel?: string; - framework?: TemplateFramework; - dataSources?: TemplateDataSource[]; - port?: number; - }, -) => { - // Init env values - const envFileName = ".env"; - const defaultEnvs = [ +const getModelEnvs = (modelConfig: ModelConfig): EnvVar[] => { + return [ + { + name: "MODEL_PROVIDER", + description: "The provider for the AI models to use.", + value: modelConfig.provider, + }, { - render: true, name: "MODEL", description: "The name of LLM model to use.", - value: opts.model || "gpt-3.5-turbo", + value: modelConfig.model, }, { - render: true, - name: "TSI_API_KEY", - description: "The T-Systems API key to use.", - value: opts.openAiKey, + name: "EMBEDDING_MODEL", + description: "Name of the embedding model to use.", + value: modelConfig.embeddingModel, }, { - name: "TSI_API_BASE_URL", - description: "The T-Systems API base URL.", - value: "https://llm-server.llmhub.t-systems.net/v2", + name: "EMBEDDING_DIM", + description: "Dimension of the embedding model to use.", + value: modelConfig.dimensions.toString(), }, + ...(modelConfig.provider === "openai" + ? [ + { + name: "OPENAI_API_KEY", + description: "The OpenAI API key to use.", + value: modelConfig.apiKey, + }, + ] + : []), + ]; +}; + +const getFrameworkEnvs = ( + framework?: TemplateFramework, + port?: number, +): EnvVar[] => { + if (framework !== "fastapi") { + return []; + } + return [ { - name: "TSI_EMBED_API_BASE_URL", - description: "The T-Systems embedding API base URL.", - value: "https://llm-server.llmhub.t-systems.net/v2", + name: "APP_HOST", + description: "The address to start the backend app.", + value: "0.0.0.0", }, { - name: "LLAMA_CLOUD_API_KEY", - description: `The Llama Cloud API key.`, - value: opts.llamaCloudKey, + name: "APP_PORT", + description: "The port to start the backend app.", + value: port?.toString() || "8000", }, - // Add vector database environment variables - ...(opts.vectorDb ? getVectorDBEnvs(opts.vectorDb) : []), - ]; - let envVars: EnvVar[] = []; - if (opts.framework === "fastapi") { - // TODO: select right dimension depending on the model - const defaultDimension = opts.model === "large-model" ? "1536" : "768"; - envVars = [ - ...defaultEnvs, - ...[ - { - name: "APP_HOST", - description: "The address to start the backend app.", - value: "0.0.0.0", - }, - { - name: "APP_PORT", - description: "The port to start the backend app.", - value: opts.port?.toString() || "8000", - }, - { - name: "EMBEDDING_MODEL", - description: "Name of the embedding model to use.", - value: opts.embeddingModel, - }, - { - name: "EMBEDDING_DIM", - description: "Dimension of the embedding model to use.", - value: defaultDimension, - }, - { - name: "LLM_TEMPERATURE", - description: "Temperature for sampling from the model.", - }, - { - name: "LLM_MAX_TOKENS", - description: "Maximum number of tokens to generate.", - }, - { - name: "TOP_K", - description: - "The number of similar embeddings to return when retrieving documents.", - value: "3", - }, - { - name: "SYSTEM_PROMPT", - description: `Custom system prompt. + { + name: "LLM_TEMPERATURE", + description: "Temperature for sampling from the model.", + }, + { + name: "LLM_MAX_TOKENS", + description: "Maximum number of tokens to generate.", + }, + { + name: "TOP_K", + description: + "The number of similar embeddings to return when retrieving documents.", + value: "3", + }, + { + name: "SYSTEM_PROMPT", + description: `Custom system prompt. Example: SYSTEM_PROMPT=" We have provided context information below. @@ -200,24 +211,35 @@ We have provided context information below. --------------------- Given this information, please answer the question: {query_str} "`, - }, - ], - ]; - } else { - envVars = [ - ...defaultEnvs, - ...[ - opts.framework === "nextjs" - ? { - name: "NEXT_PUBLIC_MODEL", - description: - "The LLM model to use (hardcode to front-end artifact).", - value: opts.model || "gpt-3.5-turbo", - } - : {}, - ], - ]; - } + }, + ]; +}; + +export const createBackendEnvFile = async ( + root: string, + opts: { + llamaCloudKey?: string; + vectorDb?: TemplateVectorDB; + modelConfig: ModelConfig; + framework?: TemplateFramework; + dataSources?: TemplateDataSource[]; + port?: number; + }, +) => { + // Init env values + const envFileName = ".env"; + const envVars: EnvVar[] = [ + { + name: "LLAMA_CLOUD_API_KEY", + description: `The Llama Cloud API key.`, + value: opts.llamaCloudKey, + }, + // Add model environment variables + ...getModelEnvs(opts.modelConfig), + // Add vector database environment variables + ...getVectorDBEnvs(opts.vectorDb), + ...getFrameworkEnvs(opts.framework, opts.port), + ]; // Render and write env file const content = renderEnvVar(envVars); await fs.writeFile(path.join(root, envFileName), content); @@ -228,20 +250,9 @@ export const createFrontendEnvFile = async ( root: string, opts: { customApiPath?: string; - model?: string; }, ) => { const defaultFrontendEnvs = [ - { - name: "MODEL", - description: "The OpenAI model to use.", - value: opts.model, - }, - { - name: "NEXT_PUBLIC_MODEL", - description: "The OpenAI model to use (hardcode to front-end artifact).", - value: opts.model, - }, { name: "NEXT_PUBLIC_CHAT_API", description: "The backend API for chat endpoint.", diff --git a/helpers/get-pkg-manager.ts b/helpers/get-pkg-manager.ts index 16320a86..0187c88a 100644 --- a/helpers/get-pkg-manager.ts +++ b/helpers/get-pkg-manager.ts @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2024 Deutsche Telekom AG, LlamaIndex, Vercel, Inc. -// -// SPDX-License-Identifier: MIT - export type PackageManager = "npm" | "pnpm" | "yarn"; export function getPkgManager(): PackageManager { diff --git a/helpers/git.ts b/helpers/git.ts index 0c105a96..2cdfe8dc 100644 --- a/helpers/git.ts +++ b/helpers/git.ts @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2024 Deutsche Telekom AG, LlamaIndex, Vercel, Inc. -// -// SPDX-License-Identifier: MIT - /* eslint-disable import/no-extraneous-dependencies */ import { execSync } from "child_process"; import fs from "fs"; diff --git a/helpers/index.ts b/helpers/index.ts index 694f1771..b7b3991d 100644 --- a/helpers/index.ts +++ b/helpers/index.ts @@ -1,22 +1,22 @@ -// SPDX-FileCopyrightText: 2024 Deutsche Telekom AG, LlamaIndex, Vercel, Inc. -// -// SPDX-License-Identifier: MIT - import { callPackageManager } from "./install"; import path from "path"; import { cyan } from "picocolors"; import fsExtra from "fs-extra"; +import { writeLoadersConfig } from "./datasources"; import { createBackendEnvFile, createFrontendEnvFile } from "./env-variables"; import { PackageManager } from "./get-pkg-manager"; import { installLlamapackProject } from "./llama-pack"; import { isHavingPoetryLockFile, tryPoetryRun } from "./poetry"; +import { isModelConfigured } from "./providers"; import { installPythonTemplate } from "./python"; import { downloadAndExtractRepo } from "./repo"; +import { ConfigFileType, writeToolsConfig } from "./tools"; import { FileSourceConfig, InstallTemplateArgs, + ModelConfig, TemplateDataSource, TemplateFramework, TemplateVectorDB, @@ -26,8 +26,8 @@ import { installTSTemplate } from "./typescript"; // eslint-disable-next-line max-params async function generateContextData( framework: TemplateFramework, + modelConfig: ModelConfig, packageManager?: PackageManager, - openAiKey?: string, vectorDb?: TemplateVectorDB, llamaCloudKey?: string, useLlamaParse?: boolean, @@ -35,20 +35,20 @@ async function generateContextData( if (packageManager) { const runGenerate = `${cyan( framework === "fastapi" - ? "poetry run python app/engine/generate.py" + ? "poetry run generate" : `${packageManager} run generate`, )}`; - const openAiKeyConfigured = openAiKey || process.env["TSI_API_KEY"]; + const modelConfigured = isModelConfigured(modelConfig); const llamaCloudKeyConfigured = useLlamaParse ? llamaCloudKey || process.env["LLAMA_CLOUD_API_KEY"] : true; const hasVectorDb = vectorDb && vectorDb !== "none"; - if (openAiKeyConfigured && llamaCloudKeyConfigured && !hasVectorDb) { + if (modelConfigured && llamaCloudKeyConfigured && !hasVectorDb) { // If all the required environment variables are set, run the generate script if (framework === "fastapi") { if (isHavingPoetryLockFile()) { console.log(`Running ${runGenerate} to generate the context data.`); - const result = tryPoetryRun("python app/engine/generate.py"); + const result = tryPoetryRun("poetry run generate"); if (!result) { console.log(`Failed to run ${runGenerate}.`); process.exit(1); @@ -65,7 +65,7 @@ async function generateContextData( // generate the message of what to do to run the generate script manually const settings = []; - if (!openAiKeyConfigured) settings.push("your T-Systems key"); + if (!modelConfigured) settings.push("your model provider API key"); if (!llamaCloudKeyConfigured) settings.push("your Llama Cloud key"); if (hasVectorDb) settings.push("your Vector DB environment variables"); const settingsMessage = @@ -121,20 +121,31 @@ export const installTemplate = async ( if (props.framework === "fastapi") { await installPythonTemplate(props); + // write loaders configuration (currently Python only) + await writeLoadersConfig( + props.root, + props.dataSources, + props.useLlamaParse, + ); } else { await installTSTemplate(props); } + // write tools configuration + await writeToolsConfig( + props.root, + props.tools, + props.framework === "fastapi" ? ConfigFileType.YAML : ConfigFileType.JSON, + ); + if (props.backend) { // This is a backend, so we need to copy the test data and create the env file. // Copy the environment file to the target directory. await createBackendEnvFile(props.root, { - openAiKey: props.openAiKey, + modelConfig: props.modelConfig, llamaCloudKey: props.llamaCloudKey, vectorDb: props.vectorDb, - model: props.model, - embeddingModel: props.embeddingModel, framework: props.framework, dataSources: props.dataSources, port: props.externalPort, @@ -152,8 +163,8 @@ export const installTemplate = async ( ) { await generateContextData( props.framework, + props.modelConfig, props.packageManager, - props.openAiKey, props.vectorDb, props.llamaCloudKey, props.useLlamaParse, @@ -163,7 +174,6 @@ export const installTemplate = async ( } else { // this is a frontend for a full-stack app, create .env file with model information await createFrontendEnvFile(props.root, { - model: props.model, customApiPath: props.customApiPath, }); } diff --git a/helpers/install.ts b/helpers/install.ts index 063ec2c6..9f0f2035 100644 --- a/helpers/install.ts +++ b/helpers/install.ts @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2024 Deutsche Telekom AG, LlamaIndex, Vercel, Inc. -// -// SPDX-License-Identifier: MIT - /* eslint-disable import/no-extraneous-dependencies */ import spawn from "cross-spawn"; import { yellow } from "picocolors"; diff --git a/helpers/is-folder-empty.ts b/helpers/is-folder-empty.ts index e164f1b0..927a344c 100644 --- a/helpers/is-folder-empty.ts +++ b/helpers/is-folder-empty.ts @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2024 Deutsche Telekom AG, LlamaIndex, Vercel, Inc. -// -// SPDX-License-Identifier: MIT - /* eslint-disable import/no-extraneous-dependencies */ import fs from "fs"; import path from "path"; diff --git a/helpers/is-online.ts b/helpers/is-online.ts index af57cd04..eab69800 100644 --- a/helpers/is-online.ts +++ b/helpers/is-online.ts @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2024 Deutsche Telekom AG, LlamaIndex, Vercel, Inc. -// -// SPDX-License-Identifier: MIT - import { execSync } from "child_process"; import dns from "dns"; import url from "url"; diff --git a/helpers/is-url.ts b/helpers/is-url.ts index 8f3a3bd5..eb87b975 100644 --- a/helpers/is-url.ts +++ b/helpers/is-url.ts @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2024 Deutsche Telekom AG, LlamaIndex, Vercel, Inc. -// -// SPDX-License-Identifier: MIT - export function isUrl(url: string): boolean { try { new URL(url); diff --git a/helpers/is-writeable.ts b/helpers/is-writeable.ts index 85ced26f..fa29d605 100644 --- a/helpers/is-writeable.ts +++ b/helpers/is-writeable.ts @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2024 Deutsche Telekom AG, LlamaIndex, Vercel, Inc. -// -// SPDX-License-Identifier: MIT - import fs from "fs"; export async function isWriteable(directory: string): Promise { diff --git a/helpers/llama-pack.ts b/helpers/llama-pack.ts index a1a1e369..887201d9 100644 --- a/helpers/llama-pack.ts +++ b/helpers/llama-pack.ts @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2024 Deutsche Telekom AG, LlamaIndex, Vercel, Inc. -// -// SPDX-License-Identifier: MIT - import fs from "fs/promises"; import got from "got"; import path from "path"; diff --git a/helpers/make-dir.ts b/helpers/make-dir.ts index 73965dfd..2c258fd6 100644 --- a/helpers/make-dir.ts +++ b/helpers/make-dir.ts @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2024 Deutsche Telekom AG, LlamaIndex, Vercel, Inc. -// -// SPDX-License-Identifier: MIT - import fs from "fs"; export function makeDir( diff --git a/helpers/poetry.ts b/helpers/poetry.ts index 47acf9f8..fe8759d7 100644 --- a/helpers/poetry.ts +++ b/helpers/poetry.ts @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2024 Deutsche Telekom AG, LlamaIndex, Vercel, Inc. -// -// SPDX-License-Identifier: MIT - /* eslint-disable import/no-extraneous-dependencies */ import { execSync } from "child_process"; import fs from "fs"; diff --git a/helpers/providers/index.ts b/helpers/providers/index.ts new file mode 100644 index 00000000..bb793c09 --- /dev/null +++ b/helpers/providers/index.ts @@ -0,0 +1,66 @@ +import ciInfo from "ci-info"; +import prompts from "prompts"; +import { questionHandlers } from "../../questions"; +import { ModelConfig, ModelProvider } from "../types"; +import { askOllamaQuestions } from "./ollama"; +import { askOpenAIQuestions, isOpenAIConfigured } from "./openai"; + +const DEFAULT_MODEL_PROVIDER = "openai"; + +export type ModelConfigQuestionsParams = { + openAiKey?: string; + askModels: boolean; +}; + +export type ModelConfigParams = Omit; + +export async function askModelConfig({ + askModels, + openAiKey, +}: ModelConfigQuestionsParams): Promise { + let modelProvider: ModelProvider = DEFAULT_MODEL_PROVIDER; + if (askModels && !ciInfo.isCI) { + const { provider } = await prompts( + { + type: "select", + name: "provider", + message: "Which model provider would you like to use", + choices: [ + { + title: "OpenAI", + value: "openai", + }, + { title: "Ollama", value: "ollama" }, + ], + initial: 0, + }, + questionHandlers, + ); + modelProvider = provider; + } + + let modelConfig: ModelConfigParams; + switch (modelProvider) { + case "ollama": + modelConfig = await askOllamaQuestions({ askModels }); + break; + default: + modelConfig = await askOpenAIQuestions({ + openAiKey, + askModels, + }); + } + return { + ...modelConfig, + provider: modelProvider, + }; +} + +export function isModelConfigured(modelConfig: ModelConfig): boolean { + switch (modelConfig.provider) { + case "openai": + return isOpenAIConfigured(modelConfig); + default: + return true; + } +} diff --git a/helpers/providers/ollama.ts b/helpers/providers/ollama.ts new file mode 100644 index 00000000..a32d9d30 --- /dev/null +++ b/helpers/providers/ollama.ts @@ -0,0 +1,92 @@ +import ciInfo from "ci-info"; +import ollama, { type ModelResponse } from "ollama"; +import { red } from "picocolors"; +import prompts from "prompts"; +import { ModelConfigParams } from "."; +import { questionHandlers, toChoice } from "../../questions"; + +type ModelData = { + dimensions: number; +}; +const MODELS = ["llama3:8b", "wizardlm2:7b", "gemma:7b", "phi3"]; +const DEFAULT_MODEL = MODELS[0]; +// TODO: get embedding vector dimensions from the ollama sdk (currently not supported) +const EMBEDDING_MODELS: Record = { + "nomic-embed-text": { dimensions: 768 }, + "mxbai-embed-large": { dimensions: 1024 }, + "all-minilm": { dimensions: 384 }, +}; +const DEFAULT_EMBEDDING_MODEL: string = Object.keys(EMBEDDING_MODELS)[0]; + +type OllamaQuestionsParams = { + askModels: boolean; +}; + +export async function askOllamaQuestions({ + askModels, +}: OllamaQuestionsParams): Promise { + const config: ModelConfigParams = { + model: DEFAULT_MODEL, + embeddingModel: DEFAULT_EMBEDDING_MODEL, + dimensions: EMBEDDING_MODELS[DEFAULT_EMBEDDING_MODEL].dimensions, + }; + + // use default model values in CI or if user should not be asked + const useDefaults = ciInfo.isCI || !askModels; + if (!useDefaults) { + const { model } = await prompts( + { + type: "select", + name: "model", + message: "Which LLM model would you like to use?", + choices: MODELS.map(toChoice), + initial: 0, + }, + questionHandlers, + ); + await ensureModel(model); + config.model = model; + + const { embeddingModel } = await prompts( + { + type: "select", + name: "embeddingModel", + message: "Which embedding model would you like to use?", + choices: Object.keys(EMBEDDING_MODELS).map(toChoice), + initial: 0, + }, + questionHandlers, + ); + await ensureModel(embeddingModel); + config.embeddingModel = embeddingModel; + config.dimensions = EMBEDDING_MODELS[embeddingModel].dimensions; + } + + return config; +} + +async function ensureModel(modelName: string) { + try { + if (modelName.split(":").length === 1) { + // model doesn't have a version suffix, use latest + modelName = modelName + ":latest"; + } + const { models } = await ollama.list(); + const found = + models.find((model: ModelResponse) => model.name === modelName) !== + undefined; + if (!found) { + console.log( + red( + `Model ${modelName} was not pulled yet. Call 'ollama pull ${modelName}' and try again.`, + ), + ); + process.exit(1); + } + } catch (error) { + console.log( + red("Listing Ollama models failed. Is 'ollama' running? " + error), + ); + process.exit(1); + } +} diff --git a/helpers/providers/openai.ts b/helpers/providers/openai.ts new file mode 100644 index 00000000..2e13d99f --- /dev/null +++ b/helpers/providers/openai.ts @@ -0,0 +1,146 @@ +import ciInfo from "ci-info"; +import got from "got"; +import ora from "ora"; +import { red } from "picocolors"; +import prompts from "prompts"; +import { ModelConfigParams, ModelConfigQuestionsParams } from "."; +import { questionHandlers } from "../../questions"; + +const OPENAI_API_URL = "https://api.openai.com/v1"; + +const DEFAULT_MODEL = "gpt-4-turbo"; +const DEFAULT_EMBEDDING_MODEL = "text-embedding-3-large"; + +export async function askOpenAIQuestions({ + openAiKey, + askModels, +}: ModelConfigQuestionsParams): Promise { + const config: ModelConfigParams = { + apiKey: openAiKey, + model: DEFAULT_MODEL, + embeddingModel: DEFAULT_EMBEDDING_MODEL, + dimensions: getDimensions(DEFAULT_EMBEDDING_MODEL), + }; + + if (!config.apiKey) { + const { key } = await prompts( + { + type: "text", + name: "key", + message: askModels + ? "Please provide your OpenAI API key (or leave blank to use OPENAI_API_KEY env variable):" + : "Please provide your OpenAI API key (leave blank to skip):", + validate: (value: string) => { + console.log(value); + if (askModels && !value) { + if (process.env.OPENAI_API_KEY) { + return true; + } + return "OPENAI_API_KEY env variable is not set - key is required"; + } + return true; + }, + }, + questionHandlers, + ); + config.apiKey = key || process.env.OPENAI_API_KEY; + } + + // use default model values in CI or if user should not be asked + const useDefaults = ciInfo.isCI || !askModels; + if (!useDefaults) { + const { model } = await prompts( + { + type: "select", + name: "model", + message: "Which LLM model would you like to use?", + choices: await getAvailableModelChoices(false, config.apiKey), + initial: 0, + }, + questionHandlers, + ); + config.model = model; + + const { embeddingModel } = await prompts( + { + type: "select", + name: "embeddingModel", + message: "Which embedding model would you like to use?", + choices: await getAvailableModelChoices(true, config.apiKey), + initial: 0, + }, + questionHandlers, + ); + config.embeddingModel = embeddingModel; + config.dimensions = getDimensions(embeddingModel); + } + + return config; +} + +export function isOpenAIConfigured(params: ModelConfigParams): boolean { + if (params.apiKey) { + return true; + } + if (process.env["OPENAI_API_KEY"]) { + return true; + } + return false; +} + +async function getAvailableModelChoices( + selectEmbedding: boolean, + apiKey?: string, +) { + if (!apiKey) { + throw new Error("need OpenAI key to retrieve model choices"); + } + const isLLMModel = (modelId: string) => { + return modelId.startsWith("gpt"); + }; + + const isEmbeddingModel = (modelId: string) => { + return modelId.includes("embedding"); + }; + + const spinner = ora("Fetching available models").start(); + try { + const response = await got(`${OPENAI_API_URL}/models`, { + headers: { + Authorization: "Bearer " + apiKey, + }, + timeout: 5000, + responseType: "json", + }); + const data: any = await response.body; + spinner.stop(); + return data.data + .filter((model: any) => + selectEmbedding ? isEmbeddingModel(model.id) : isLLMModel(model.id), + ) + .map((el: any) => { + return { + title: el.id, + value: el.id, + }; + }); + } catch (error) { + spinner.stop(); + if ((error as any).response?.statusCode === 401) { + console.log( + red( + "Invalid OpenAI API key provided! Please provide a valid key and try again!", + ), + ); + } else { + console.log(red("Request failed: " + error)); + } + process.exit(1); + } +} + +function getDimensions(modelName: string) { + // at 2024-04-24 all OpenAI embedding models support 1536 dimensions except + // "text-embedding-3-large", see https://openai.com/blog/new-embedding-models-and-api-updates + return modelName === "text-embedding-3-large" ? 1024 : 1536; +} diff --git a/helpers/python.ts b/helpers/python.ts index 2b04aebf..316fe52d 100644 --- a/helpers/python.ts +++ b/helpers/python.ts @@ -1,23 +1,18 @@ -// SPDX-FileCopyrightText: 2024 Deutsche Telekom AG, LlamaIndex, Vercel, Inc. -// -// SPDX-License-Identifier: MIT - import fs from "fs/promises"; import path from "path"; import { cyan, red } from "picocolors"; import { parse, stringify } from "smol-toml"; import terminalLink from "terminal-link"; -import yaml, { Document } from "yaml"; -import { copy } from "./copy"; + +import { assetRelocator, copy } from "./copy"; import { templatesDir } from "./dir"; import { isPoetryAvailable, tryPoetryInstall } from "./poetry"; import { Tool } from "./tools"; import { - DbSourceConfig, InstallTemplateArgs, + ModelConfig, TemplateDataSource, TemplateVectorDB, - WebSourceConfig, } from "./types"; interface Dependency { @@ -27,6 +22,7 @@ interface Dependency { } const getAdditionalDependencies = ( + modelConfig: ModelConfig, vectorDb?: TemplateVectorDB, dataSource?: TemplateDataSource, tools?: Tool[], @@ -66,31 +62,45 @@ const getAdditionalDependencies = ( }); break; } + case "astra": { + dependencies.push({ + name: "llama-index-vector-stores-astra-db", + version: "^0.1.5", + }); + break; + } } // Add data source dependencies const dataSourceType = dataSource?.type; - if (dataSourceType === "file") { - // llama-index-readers-file (pdf, excel, csv) is already included in llama_index package - dependencies.push({ - name: "docx2txt", - version: "^0.8", - }); - } else if (dataSourceType === "web") { - dependencies.push({ - name: "llama-index-readers-web", - version: "^0.1.6", - }); - } else if (dataSourceType === "db") { - dependencies.push({ - name: "llama-index-readers-database", - version: "^0.1.3", - }); - dependencies.push({ - name: "pymysql", - version: "^1.1.0", - extras: ["rsa"], - }); + switch (dataSourceType) { + case "file": + dependencies.push({ + name: "docx2txt", + version: "^0.8", + }); + break; + case "web": + dependencies.push({ + name: "llama-index-readers-web", + version: "^0.1.6", + }); + break; + case "db": + dependencies.push({ + name: "llama-index-readers-database", + version: "^0.1.3", + }); + dependencies.push({ + name: "pymysql", + version: "^1.1.0", + extras: ["rsa"], + }); + dependencies.push({ + name: "psycopg2", + version: "^2.9.9", + }); + break; } // Add tools dependencies @@ -100,6 +110,25 @@ const getAdditionalDependencies = ( }); }); + switch (modelConfig.provider) { + case "ollama": + dependencies.push({ + name: "llama-index-llms-ollama", + version: "0.1.2", + }); + dependencies.push({ + name: "llama-index-embeddings-ollama", + version: "0.1.2", + }); + break; + case "openai": + dependencies.push({ + name: "llama-index-agent-openai", + version: "0.2.2", + }); + break; + } + return dependencies; }; @@ -197,7 +226,8 @@ export const installPythonTemplate = async ({ dataSources, tools, postInstallAction, - useLlamaParse, + observability, + modelConfig, }: Pick< InstallTemplateArgs, | "root" @@ -206,147 +236,70 @@ export const installPythonTemplate = async ({ | "vectorDb" | "dataSources" | "tools" - | "useLlamaParse" | "postInstallAction" + | "observability" + | "modelConfig" >) => { console.log("\nInitializing Python project with template:", template, "\n"); const templatePath = path.join(templatesDir, "types", template, framework); await copy("**", root, { parents: true, cwd: templatePath, - rename(name) { - switch (name) { - case "gitignore": { - return `.${name}`; - } - // README.md is ignored by webpack-asset-relocator-loader used by ncc: - // https://github.com/vercel/webpack-asset-relocator-loader/blob/e9308683d47ff507253e37c9bcbb99474603192b/src/asset-relocator.js#L227 - case "README-template.md": { - return "README.md"; - } - default: { - return name; - } - } - }, + rename: assetRelocator, }); const compPath = path.join(templatesDir, "components"); + const enginePath = path.join(root, "app", "engine"); - if (dataSources.length > 0) { - const enginePath = path.join(root, "app", "engine"); + // Copy selected vector DB + await copy("**", enginePath, { + parents: true, + cwd: path.join(compPath, "vectordbs", "python", vectorDb ?? "none"), + }); - const vectorDbDirName = vectorDb ?? "none"; - const VectorDBPath = path.join( - compPath, - "vectordbs", - "python", - vectorDbDirName, - ); - await copy("**", enginePath, { - parents: true, - cwd: VectorDBPath, - }); + // Copy all loaders to enginePath + const loaderPath = path.join(enginePath, "loaders"); + await copy("**", loaderPath, { + parents: true, + cwd: path.join(compPath, "loaders", "python"), + }); - // Copy engine code - if (tools !== undefined && tools.length > 0) { - await copy("**", enginePath, { - parents: true, - cwd: path.join(compPath, "engines", "python", "agent"), - }); - // Write tool configs - const configContent: Record = {}; - tools.forEach((tool) => { - configContent[tool.name] = tool.config ?? {}; - }); - const configFilePath = path.join(root, "config/tools.yaml"); - await fs.mkdir(path.join(root, "config"), { recursive: true }); - await fs.writeFile(configFilePath, yaml.stringify(configContent)); - } else { - await copy("**", enginePath, { - parents: true, - cwd: path.join(compPath, "engines", "python", "chat"), - }); - } + // Select and copy engine code based on data sources and tools + let engine; + tools = tools ?? []; + if (dataSources.length > 0 && tools.length === 0) { + console.log("\nNo tools selected - use optimized context chat engine\n"); + engine = "chat"; + } else { + engine = "agent"; + } + await copy("**", enginePath, { + parents: true, + cwd: path.join(compPath, "engines", "python", engine), + }); - const loaderConfig = new Document({}); - const loaderPath = path.join(enginePath, "loaders"); + const addOnDependencies = dataSources + .map((ds) => getAdditionalDependencies(modelConfig, vectorDb, ds, tools)) + .flat(); - // Copy loaders to enginePath - await copy("**", loaderPath, { - parents: true, - cwd: path.join(compPath, "loaders", "python"), + if (observability === "opentelemetry") { + addOnDependencies.push({ + name: "traceloop-sdk", + version: "^0.15.11", }); - // Generate loaders config - // Web loader config - if (dataSources.some((ds) => ds.type === "web")) { - const webLoaderConfig = new Document({}); - - // Create config for browser driver arguments - const driverArgNodeValue = webLoaderConfig.createNode([ - "--no-sandbox", - "--disable-dev-shm-usage", - ]); - driverArgNodeValue.commentBefore = - " The arguments to pass to the webdriver. E.g.: add --headless to run in headless mode"; - webLoaderConfig.set("driver_arguments", driverArgNodeValue); - - // Create config for urls - const urlConfigs = dataSources - .filter((ds) => ds.type === "web") - .map((ds) => { - const dsConfig = ds.config as WebSourceConfig; - return { - base_url: dsConfig.baseUrl, - prefix: dsConfig.prefix, - depth: dsConfig.depth, - }; - }); - const urlConfigNode = webLoaderConfig.createNode(urlConfigs); - urlConfigNode.commentBefore = ` base_url: The URL to start crawling with - prefix: Only crawl URLs matching the specified prefix - depth: The maximum depth for BFS traversal - You can add more websites by adding more entries (don't forget the - prefix from YAML)`; - webLoaderConfig.set("urls", urlConfigNode); - - // Add web config to the loaders config - loaderConfig.set("web", webLoaderConfig); - } - // File loader config - if (dataSources.some((ds) => ds.type === "file")) { - // Add documentation to web loader config - const node = loaderConfig.createNode({ - use_llama_parse: useLlamaParse, - }); - node.commentBefore = ` use_llama_parse: Use LlamaParse if \`true\`. Needs a \`LLAMA_CLOUD_API_KEY\` from https://cloud.llamaindex.ai set as environment variable`; - loaderConfig.set("file", node); - } - - // DB loader config - const ds = dataSources.find((ds) => ds.type === "db"); - if (ds !== undefined) { - const node = loaderConfig.createNode({ - uri: (ds.config as DbSourceConfig).dbUri, - query: (ds.config as DbSourceConfig).query, - }); - node.commentBefore = ` The configuration for the database loader. - uri: The URI for the database. E.g.: mysql+pymysql://user:password@localhost:3306/db. - query: The query to fetch data from the database. E.g.: SELECT * FROM table`; - loaderConfig.set("db", node); - } - - // Write loaders config - if (Object.keys(loaderConfig).length > 0) { - const loaderConfigPath = path.join(root, "config/loaders.yaml"); - await fs.mkdir(path.join(root, "config"), { recursive: true }); - await fs.writeFile(loaderConfigPath, yaml.stringify(loaderConfig)); - } + const templateObservabilityPath = path.join( + templatesDir, + "components", + "observability", + "python", + "opentelemetry", + ); + await copy("**", path.join(root, "app"), { + cwd: templateObservabilityPath, + }); } - const addOnDependencies = dataSources - .map((ds) => getAdditionalDependencies(vectorDb, ds, tools)) - .flat(); await addDependencies(root, addOnDependencies); if (postInstallAction === "runApp" || postInstallAction === "dependencies") { diff --git a/helpers/repo.ts b/helpers/repo.ts index cdfd9548..7a33ecb3 100644 --- a/helpers/repo.ts +++ b/helpers/repo.ts @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2024 Deutsche Telekom AG, LlamaIndex, Vercel, Inc. -// -// SPDX-License-Identifier: MIT - import { createWriteStream, promises } from "fs"; import got from "got"; import { tmpdir } from "os"; diff --git a/helpers/run-app.ts b/helpers/run-app.ts index 0c506563..616787a7 100644 --- a/helpers/run-app.ts +++ b/helpers/run-app.ts @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2024 Deutsche Telekom AG, LlamaIndex, Vercel, Inc. -// -// SPDX-License-Identifier: MIT - import { ChildProcess, SpawnOptions, spawn } from "child_process"; import path from "path"; import { TemplateFramework } from "./types"; diff --git a/helpers/tools.ts b/helpers/tools.ts index b3934150..d8b3967d 100644 --- a/helpers/tools.ts +++ b/helpers/tools.ts @@ -1,8 +1,8 @@ -// SPDX-FileCopyrightText: 2024 Deutsche Telekom AG, LlamaIndex, Vercel, Inc. -// -// SPDX-License-Identifier: MIT - +import fs from "fs/promises"; +import path from "path"; import { red } from "picocolors"; +import yaml from "yaml"; +import { makeDir } from "./make-dir"; import { TemplateFramework } from "./types"; export type Tool = { @@ -12,6 +12,7 @@ export type Tool = { dependencies?: ToolDependencies[]; supportedFrameworks?: Array; }; + export type ToolDependencies = { name: string; version?: string; @@ -35,31 +36,6 @@ export const supportedTools: Tool[] = [ ], supportedFrameworks: ["fastapi"], }, - { - display: "Brave Search (configuration required after installation)", - name: "brave_search.BraveSearchToolSpec", - config: { - api_key: "Your Brave search API key, see https://brave.com/search/api", - }, - dependencies: [ - { - name: "llama-index-tools-brave-search", - version: "0.1.0", - }, - ], - supportedFrameworks: ["fastapi"], - }, - { - display: "DuckDuckGo Search", - name: "duckduckgo.DuckDuckGoSearchToolSpec", - dependencies: [ - { - name: "llama-index-tools-duckduckgo", - version: "0.1.0", - }, - ], - supportedFrameworks: ["fastapi"], - }, { display: "Wikipedia", name: "wikipedia.WikipediaToolSpec", @@ -102,3 +78,33 @@ export const toolsRequireConfig = (tools?: Tool[]): boolean => { } return false; }; + +export enum ConfigFileType { + YAML = "yaml", + JSON = "json", +} + +export const writeToolsConfig = async ( + root: string, + tools: Tool[] = [], + type: ConfigFileType = ConfigFileType.YAML, +) => { + if (tools.length === 0) return; // no tools selected, no config need + const configContent: Record = {}; + tools.forEach((tool) => { + configContent[tool.name] = tool.config ?? {}; + }); + const configPath = path.join(root, "config"); + await makeDir(configPath); + if (type === ConfigFileType.YAML) { + await fs.writeFile( + path.join(configPath, "tools.yaml"), + yaml.stringify(configContent), + ); + } else { + await fs.writeFile( + path.join(configPath, "tools.json"), + JSON.stringify(configContent, null, 2), + ); + } +}; diff --git a/helpers/types.ts b/helpers/types.ts index ed146552..42b571e7 100644 --- a/helpers/types.ts +++ b/helpers/types.ts @@ -1,14 +1,25 @@ -// SPDX-FileCopyrightText: 2024 Deutsche Telekom AG, LlamaIndex, Vercel, Inc. -// -// SPDX-License-Identifier: MIT - import { PackageManager } from "../helpers/get-pkg-manager"; import { Tool } from "./tools"; +export type ModelProvider = "openai" | "ollama"; +export type ModelConfig = { + provider: ModelProvider; + apiKey?: string; + model: string; + embeddingModel: string; + dimensions: number; +}; export type TemplateType = "streaming" | "community" | "llamapack"; export type TemplateFramework = "nextjs" | "express" | "fastapi"; export type TemplateUI = "html" | "shadcn"; -export type TemplateVectorDB = "none" | "mongo" | "pg" | "pinecone" | "milvus"; +export type TemplateVectorDB = + | "none" + | "mongo" + | "pg" + | "pinecone" + | "milvus" + | "astra" + | "qdrant"; export type TemplatePostInstallAction = | "none" | "VSCode" @@ -30,9 +41,10 @@ export type WebSourceConfig = { depth?: number; }; export type DbSourceConfig = { - dbUri?: string; - query?: string; + uri?: string; + queries?: string; }; + export type TemplateDataSourceConfig = | FileSourceConfig | WebSourceConfig @@ -55,11 +67,9 @@ export interface InstallTemplateArgs { ui: TemplateUI; dataSources: TemplateDataSource[]; customApiPath?: string; - openAiKey?: string; + modelConfig: ModelConfig; llamaCloudKey?: string; useLlamaParse?: boolean; - model: string; - embeddingModel: string; communityProjectConfig?: CommunityProjectConfig; llamapack?: string; vectorDb?: TemplateVectorDB; diff --git a/helpers/typescript.ts b/helpers/typescript.ts index cba2f08f..24440352 100644 --- a/helpers/typescript.ts +++ b/helpers/typescript.ts @@ -1,56 +1,13 @@ -// SPDX-FileCopyrightText: 2024 Deutsche Telekom AG, LlamaIndex, Vercel, Inc. -// -// SPDX-License-Identifier: MIT - import fs from "fs/promises"; import os from "os"; import path from "path"; import { bold, cyan } from "picocolors"; -import { copy } from "../helpers/copy"; +import { assetRelocator, copy } from "../helpers/copy"; import { callPackageManager } from "../helpers/install"; import { templatesDir } from "./dir"; import { PackageManager } from "./get-pkg-manager"; -import { makeDir } from "./make-dir"; import { InstallTemplateArgs } from "./types"; -const rename = (name: string) => { - switch (name) { - case "gitignore": - case "eslintrc.json": { - return `.${name}`; - } - // README.md is ignored by webpack-asset-relocator-loader used by ncc: - // https://github.com/vercel/webpack-asset-relocator-loader/blob/e9308683d47ff507253e37c9bcbb99474603192b/src/asset-relocator.js#L227 - case "README-template.md": { - return "README.md"; - } - default: { - return name; - } - } -}; - -export const installTSDependencies = async ( - packageJson: any, - packageManager: PackageManager, - isOnline: boolean, -): Promise => { - console.log("\nInstalling dependencies:"); - for (const dependency in packageJson.dependencies) - console.log(`- ${cyan(dependency)}`); - - console.log("\nInstalling devDependencies:"); - for (const dependency in packageJson.devDependencies) - console.log(`- ${cyan(dependency)}`); - - console.log(); - - await callPackageManager(packageManager, isOnline).catch((error) => { - console.error("Failed to install TS dependencies. Exiting..."); - process.exit(1); - }); -}; - /** * Install a LlamaIndex internal template to a given `root` directory. */ @@ -62,7 +19,6 @@ export const installTSTemplate = async ({ template, framework, ui, - customApiPath, vectorDb, postInstallAction, backend, @@ -83,7 +39,7 @@ export const installTSTemplate = async ({ await copy(copySource, root, { parents: true, cwd: templatePath, - rename, + rename: assetRelocator, }); /** @@ -141,9 +97,6 @@ export const installTSTemplate = async ({ ); } - /** - * Copy the selected chat engine files to the target directory and reference it. - */ const compPath = path.join(templatesDir, "components"); const relativeEngineDestPath = framework === "nextjs" @@ -151,59 +104,33 @@ export const installTSTemplate = async ({ : path.join("src", "controllers"); const enginePath = path.join(root, relativeEngineDestPath, "engine"); - if (dataSources.length === 0) { - // use simple hat engine if user neither select tools nor a data source - console.log("\nUsing simple chat engine\n"); - } else { - if (vectorDb) { - // copy vector db component - console.log("\nUsing vector DB:", vectorDb, "\n"); - const vectorDBPath = path.join( - compPath, - "vectordbs", - "typescript", - vectorDb, - ); - await copy("**", enginePath, { - parents: true, - cwd: vectorDBPath, - }); - } - // copy loader component (TS only supports llama_parse and file for now) - let loaderFolder: string; - loaderFolder = useLlamaParse ? "llama_parse" : "file"; - await copy("**", enginePath, { - parents: true, - cwd: path.join(compPath, "loaders", "typescript", loaderFolder), - }); - if (tools?.length) { - // use agent chat engine if user selects tools - console.log("\nUsing agent chat engine\n"); - await copy("**", enginePath, { - parents: true, - cwd: path.join(compPath, "engines", "typescript", "agent"), - }); + // copy vector db component + console.log("\nUsing vector DB:", vectorDb, "\n"); + await copy("**", enginePath, { + parents: true, + cwd: path.join(compPath, "vectordbs", "typescript", vectorDb ?? "none"), + }); - // Write config/tools.json - const configContent: Record = {}; - tools.forEach((tool) => { - configContent[tool.name] = tool.config ?? {}; - }); - const configPath = path.join(root, "config"); - await makeDir(configPath); - await fs.writeFile( - path.join(configPath, "tools.json"), - JSON.stringify(configContent, null, 2), - ); - } else { - // use context chat engine if user does not select tools - console.log("\nUsing context chat engine\n"); - await copy("**", enginePath, { - parents: true, - cwd: path.join(compPath, "engines", "typescript", "chat"), - }); - } + // copy loader component (TS only supports llama_parse and file for now) + const loaderFolder = useLlamaParse ? "llama_parse" : "file"; + await copy("**", enginePath, { + parents: true, + cwd: path.join(compPath, "loaders", "typescript", loaderFolder), + }); + + // Select and copy engine code based on data sources and tools + let engine; + tools = tools ?? []; + if (dataSources.length > 0 && tools.length === 0) { + console.log("\nNo tools selected - use optimized context chat engine\n"); + engine = "chat"; + } else { + engine = "agent"; } + await copy("**", enginePath, { + parents: true, + cwd: path.join(compPath, "engines", "typescript", engine), + }); /** * Copy the selected UI files to the target directory and reference it. @@ -218,13 +145,54 @@ export const installTSTemplate = async ({ await copy("**", destUiPath, { parents: true, cwd: uiPath, - rename, + rename: assetRelocator, }); } - /** - * Update the package.json scripts. - */ + /** Modify frontend code to use custom API path */ + if (framework === "nextjs" && !backend) { + console.log( + "\nUsing external API for frontend, removing API code and configuration\n", + ); + // remove the default api folder and config folder + await fs.rm(path.join(root, "app", "api"), { recursive: true }); + await fs.rm(path.join(root, "config"), { recursive: true, force: true }); + } + + const packageJson = await updatePackageJson({ + root, + appName, + dataSources, + relativeEngineDestPath, + framework, + ui, + observability, + }); + + if (postInstallAction === "runApp" || postInstallAction === "dependencies") { + await installTSDependencies(packageJson, packageManager, isOnline); + } + + // Copy deployment files for typescript + await copy("**", root, { + cwd: path.join(compPath, "deployments", "typescript"), + }); +}; + +async function updatePackageJson({ + root, + appName, + dataSources, + relativeEngineDestPath, + framework, + ui, + observability, +}: Pick< + InstallTemplateArgs, + "root" | "appName" | "dataSources" | "framework" | "ui" | "observability" +> & { + relativeEngineDestPath: string; +}): Promise { const packageJsonFile = path.join(root, "package.json"); const packageJson: any = JSON.parse( await fs.readFile(packageJsonFile, "utf8"), @@ -232,26 +200,15 @@ export const installTSTemplate = async ({ packageJson.name = appName; packageJson.version = "0.1.0"; - if (framework === "nextjs" && customApiPath) { - console.log( - "\nUsing external API with custom API path:", - customApiPath, - "\n", - ); - // remove the default api folder - const apiPath = path.join(root, "app", "api"); - await fs.rm(apiPath, { recursive: true }); - // modify the dev script to use the custom api path - } - - if (dataSources.length > 0 && relativeEngineDestPath) { + if (relativeEngineDestPath) { + // TODO: move script to {root}/scripts for all frameworks // add generate script if using context engine packageJson.scripts = { ...packageJson.scripts, - generate: `node ${path.join( + generate: `tsx ${path.join( relativeEngineDestPath, "engine", - "generate.mjs", + "generate.ts", )}`, }; } @@ -296,12 +253,26 @@ export const installTSTemplate = async ({ JSON.stringify(packageJson, null, 2) + os.EOL, ); - if (postInstallAction === "runApp" || postInstallAction === "dependencies") { - await installTSDependencies(packageJson, packageManager, isOnline); - } + return packageJson; +} - // Copy deployment files for typescript - await copy("**", root, { - cwd: path.join(compPath, "deployments", "typescript"), +async function installTSDependencies( + packageJson: any, + packageManager: PackageManager, + isOnline: boolean, +): Promise { + console.log("\nInstalling dependencies:"); + for (const dependency in packageJson.dependencies) + console.log(`- ${cyan(dependency)}`); + + console.log("\nInstalling devDependencies:"); + for (const dependency in packageJson.devDependencies) + console.log(`- ${cyan(dependency)}`); + + console.log(); + + await callPackageManager(packageManager, isOnline).catch((error) => { + console.error("Failed to install TS dependencies. Exiting..."); + process.exit(1); }); -}; +} diff --git a/helpers/validate-pkg.ts b/helpers/validate-pkg.ts index 4e97ff05..68317653 100644 --- a/helpers/validate-pkg.ts +++ b/helpers/validate-pkg.ts @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2024 Deutsche Telekom AG, LlamaIndex, Vercel, Inc. -// -// SPDX-License-Identifier: MIT - // eslint-disable-next-line import/no-extraneous-dependencies import validateProjectName from "validate-npm-package-name"; diff --git a/index.ts b/index.ts index 3bd961ab..11f3d83d 100644 --- a/index.ts +++ b/index.ts @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2024 Deutsche Telekom AG, LlamaIndex, Vercel, Inc. -// -// SPDX-License-Identifier: MIT - /* eslint-disable import/no-extraneous-dependencies */ import { execSync } from "child_process"; import Commander from "commander"; @@ -82,7 +78,7 @@ const program = new Commander.Command(packageJson.name) "--files ", ` - Specify the path to a local file or folder for chatting. + Specify the path to a local file or folder for chatting. `, ) .option( @@ -111,19 +107,6 @@ const program = new Commander.Command(packageJson.name) ` Whether to generate a frontend for your backend. -`, - ) - .option( - "--model ", - ` - - Select OpenAI model to use. E.g. gpt-3.5-turbo. -`, - ) - .option( - "--embedding-model ", - ` - Select OpenAI embedding model to use. E.g. text-embedding-ada-002. `, ) .option( @@ -164,22 +147,30 @@ const program = new Commander.Command(packageJson.name) .option( "--use-llama-parse", ` - Enable LlamaParse. + + Enable LlamaParse. `, ) .option( "--llama-cloud-key ", ` + Provide a LlamaCloud API key. `, ) .option( - "--list-server-models", - "Fetch available LLM and embedding models from OpenAI API.", + "--observability ", + ` + + Specify observability tools to use. Eg: none, opentelemetry +`, ) .option( - "--observability ", - "Specify observability tools to use. Eg: none, opentelemetry", + "--ask-models", + ` + + Select LLM and embedding models. +`, ) .allowUnknownOption() .parse(process.argv); @@ -196,6 +187,7 @@ if (process.argv.includes("--tools")) { if (process.argv.includes("--no-llama-parse")) { program.useLlamaParse = false; } +program.askModels = process.argv.includes("--ask-models"); if (process.argv.includes("--no-files")) { program.dataSources = []; } else { @@ -211,7 +203,7 @@ const packageManager = !!program.useNpm : getPkgManager(); async function run(): Promise { - const conf = new Conf({ projectName: "create-tsi" }); + const conf = new Conf({ projectName: "create-llama" }); if (program.resetPreferences) { conf.clear(); @@ -282,7 +274,11 @@ async function run(): Promise { } const preferences = (conf.get("preferences") || {}) as QuestionArgs; - await askQuestions(program as unknown as QuestionArgs, preferences); + await askQuestions( + program as unknown as QuestionArgs, + preferences, + program.openAiKey, + ); await createApp({ template: program.template, @@ -291,10 +287,8 @@ async function run(): Promise { appPath: resolvedProjectPath, packageManager, frontend: program.frontend, - openAiKey: program.openAiKey, + modelConfig: program.modelConfig, llamaCloudKey: program.llamaCloudKey, - model: program.model, - embeddingModel: program.embeddingModel, communityProjectConfig: program.communityProjectConfig, llamapack: program.llamapack, vectorDb: program.vectorDb, @@ -351,13 +345,13 @@ async function notifyUpdate(): Promise { if (res?.latest) { const updateMessage = packageManager === "yarn" - ? "yarn global add create-tsi@latest" + ? "yarn global add create-llama@latest" : packageManager === "pnpm" - ? "pnpm add -g create-tsi@latest" - : "npm i -g create-tsi@latest"; + ? "pnpm add -g create-llama@latest" + : "npm i -g create-llama@latest"; console.log( - yellow(bold("A new version of `create-tsi` is available!")) + + yellow(bold("A new version of `create-llama` is available!")) + "\n" + "You can update by running: " + cyan(updateMessage) + diff --git a/package.json b/package.json index 85ddf176..239c96ba 100644 --- a/package.json +++ b/package.json @@ -1,46 +1,49 @@ { - "name": "create-tsi", - "version": "0.0.18", + "name": "create-llama", + "version": "0.1.0", + "description": "Create LlamaIndex-powered apps with one command", "keywords": [ "rag", "llamaindex", "next.js" ], - "description": "Create LlamaIndex-powered T-Systems LLM apps with one command", + "repository": { + "type": "git", + "url": "https://github.com/run-llama/LlamaIndexTS", + "directory": "packages/create-llama" + }, "license": "MIT", "bin": { - "create-tsi": "./dist/index.js" + "create-llama": "./dist/index.js" }, "files": [ "dist" ], "scripts": { + "build": "bash ./scripts/build.sh", + "build:ncc": "pnpm run clean && ncc build ./index.ts -o ./dist/ --minify --no-cache --no-source-map-register", "clean": "rimraf --glob ./dist ./templates/**/__pycache__ ./templates/**/node_modules ./templates/**/poetry.lock", + "dev": "ncc build ./index.ts -w -o dist/", + "e2e": "playwright test", "format": "prettier --ignore-unknown --cache --check .", "format:write": "prettier --ignore-unknown --write .", - "dev": "ncc build ./index.ts -w -o dist/", - "build": "bash ./scripts/build.sh", - "build:ncc": "pnpm run clean && ncc build ./index.ts -o ./dist/ --minify --no-cache --no-source-map-register", "lint": "eslint . --ignore-pattern dist --ignore-pattern e2e/cache", - "e2e": "playwright test", + "new-snapshot": "pnpm run build && changeset version --snapshot", + "new-version": "pnpm run build && changeset version", + "pack-install": "bash ./scripts/pack.sh", "prepare": "husky", "release": "pnpm run build && changeset publish", - "new-version": "pnpm run build && changeset version", - "release-snapshot": "pnpm run build && changeset publish --tag snapshot", - "new-snapshot": "pnpm run build && changeset version --snapshot", - "pack-install": "bash ./scripts/pack.sh" + "release-snapshot": "pnpm run build && changeset publish --tag snapshot" }, - "devDependencies": { - "@playwright/test": "^1.41.1", + "dependencies": { "@types/async-retry": "1.4.2", "@types/ci-info": "2.0.0", "@types/cross-spawn": "6.0.0", + "@types/fs-extra": "11.0.4", "@types/node": "^20.11.7", "@types/prompts": "2.0.1", "@types/tar": "6.1.5", "@types/validate-npm-package-name": "3.0.0", - "@types/fs-extra": "11.0.4", - "@vercel/ncc": "0.38.1", "async-retry": "1.3.1", "async-sema": "3.0.1", "ci-info": "github:watson/ci-info#f43f6a1cefff47fb361c88cf4b943fdbcaafe540", @@ -48,29 +51,34 @@ "conf": "10.2.0", "cross-spawn": "7.0.3", "fast-glob": "3.3.1", + "fs-extra": "11.2.0", "got": "10.7.0", + "ollama": "^0.5.0", + "ora": "^8.0.1", "picocolors": "1.0.0", "prompts": "2.1.0", - "rimraf": "^5.0.5", "smol-toml": "^1.1.4", "tar": "6.1.15", "terminal-link": "^3.0.0", "update-check": "1.5.4", "validate-npm-package-name": "3.0.0", - "wait-port": "^1.1.0", + "yaml": "2.4.1" + }, + "devDependencies": { "@changesets/cli": "^2.27.1", + "@playwright/test": "^1.41.1", + "@vercel/ncc": "0.38.1", "eslint": "^8.56.0", + "eslint-config-prettier": "^8.10.0", "husky": "^9.0.10", "prettier": "^3.2.5", "prettier-plugin-organize-imports": "^3.2.4", + "rimraf": "^5.0.5", "typescript": "^5.3.3", - "eslint-config-prettier": "^8.10.0", - "ora": "^8.0.1", - "fs-extra": "11.2.0", - "yaml": "2.4.1" + "wait-port": "^1.1.0" }, + "packageManager": "pnpm@9.0.5", "engines": { "node": ">=16.14.0" - }, - "packageManager": "pnpm@8.15.1" + } } diff --git a/playwright.config.ts b/playwright.config.ts index c879bdf5..0b4b420b 100644 --- a/playwright.config.ts +++ b/playwright.config.ts @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2024 Deutsche Telekom AG, LlamaIndex, Vercel, Inc. -// -// SPDX-License-Identifier: MIT - /* eslint-disable turbo/no-undeclared-env-vars */ import { defineConfig, devices } from "@playwright/test"; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 69d5d513..3d3e9b2d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,164 +1,1957 @@ -# SPDX-FileCopyrightText: 2024 Deutsche Telekom AG, LlamaIndex, Vercel, Inc. -# -# SPDX-License-Identifier: MIT +lockfileVersion: '9.0' -lockfileVersion: '6.0' +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@types/async-retry': + specifier: 1.4.2 + version: 1.4.2 + '@types/ci-info': + specifier: 2.0.0 + version: 2.0.0 + '@types/cross-spawn': + specifier: 6.0.0 + version: 6.0.0 + '@types/fs-extra': + specifier: 11.0.4 + version: 11.0.4 + '@types/node': + specifier: ^20.11.7 + version: 20.11.26 + '@types/prompts': + specifier: 2.0.1 + version: 2.0.1 + '@types/tar': + specifier: 6.1.5 + version: 6.1.5 + '@types/validate-npm-package-name': + specifier: 3.0.0 + version: 3.0.0 + async-retry: + specifier: 1.3.1 + version: 1.3.1 + async-sema: + specifier: 3.0.1 + version: 3.0.1 + ci-info: + specifier: github:watson/ci-info#f43f6a1cefff47fb361c88cf4b943fdbcaafe540 + version: https://codeload.github.com/watson/ci-info/tar.gz/f43f6a1cefff47fb361c88cf4b943fdbcaafe540 + commander: + specifier: 2.20.0 + version: 2.20.0 + conf: + specifier: 10.2.0 + version: 10.2.0 + cross-spawn: + specifier: 7.0.3 + version: 7.0.3 + fast-glob: + specifier: 3.3.1 + version: 3.3.1 + fs-extra: + specifier: 11.2.0 + version: 11.2.0 + got: + specifier: 10.7.0 + version: 10.7.0 + ollama: + specifier: ^0.5.0 + version: 0.5.0 + ora: + specifier: ^8.0.1 + version: 8.0.1 + picocolors: + specifier: 1.0.0 + version: 1.0.0 + prompts: + specifier: 2.1.0 + version: 2.1.0 + smol-toml: + specifier: ^1.1.4 + version: 1.1.4 + tar: + specifier: 6.1.15 + version: 6.1.15 + terminal-link: + specifier: ^3.0.0 + version: 3.0.0 + update-check: + specifier: 1.5.4 + version: 1.5.4 + validate-npm-package-name: + specifier: 3.0.0 + version: 3.0.0 + yaml: + specifier: 2.4.1 + version: 2.4.1 + devDependencies: + '@changesets/cli': + specifier: ^2.27.1 + version: 2.27.1 + '@playwright/test': + specifier: ^1.41.1 + version: 1.42.1 + '@vercel/ncc': + specifier: 0.38.1 + version: 0.38.1 + eslint: + specifier: ^8.56.0 + version: 8.57.0 + eslint-config-prettier: + specifier: ^8.10.0 + version: 8.10.0(eslint@8.57.0) + husky: + specifier: ^9.0.10 + version: 9.0.11 + prettier: + specifier: ^3.2.5 + version: 3.2.5 + prettier-plugin-organize-imports: + specifier: ^3.2.4 + version: 3.2.4(prettier@3.2.5)(typescript@5.4.2) + rimraf: + specifier: ^5.0.5 + version: 5.0.5 + typescript: + specifier: ^5.3.3 + version: 5.4.2 + wait-port: + specifier: ^1.1.0 + version: 1.1.0 + +packages: + + '@aashutoshrathi/word-wrap@1.2.6': + resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} + engines: {node: '>=0.10.0'} + + '@babel/code-frame@7.23.5': + resolution: {integrity: sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==} + 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/highlight@7.23.4': + resolution: {integrity: sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==} + engines: {node: '>=6.9.0'} + + '@babel/runtime@7.24.0': + resolution: {integrity: sha512-Chk32uHMg6TnQdvw2e9IlqPpFX/6NLuK0Ys2PqLb7/gL5uFn9mXvK715FGLlOLQrcO4qIkNHkvPGktzzXexsFw==} + engines: {node: '>=6.9.0'} + + '@changesets/apply-release-plan@7.0.0': + resolution: {integrity: sha512-vfi69JR416qC9hWmFGSxj7N6wA5J222XNBmezSVATPWDVPIF7gkd4d8CpbEbXmRWbVrkoli3oerGS6dcL/BGsQ==} + + '@changesets/assemble-release-plan@6.0.0': + resolution: {integrity: sha512-4QG7NuisAjisbW4hkLCmGW2lRYdPrKzro+fCtZaILX+3zdUELSvYjpL4GTv0E4aM9Mef3PuIQp89VmHJ4y2bfw==} + + '@changesets/changelog-git@0.2.0': + resolution: {integrity: sha512-bHOx97iFI4OClIT35Lok3sJAwM31VbUM++gnMBV16fdbtBhgYu4dxsphBF/0AZZsyAHMrnM0yFcj5gZM1py6uQ==} + + '@changesets/cli@2.27.1': + resolution: {integrity: sha512-iJ91xlvRnnrJnELTp4eJJEOPjgpF3NOh4qeQehM6Ugiz9gJPRZ2t+TsXun6E3AMN4hScZKjqVXl0TX+C7AB3ZQ==} + hasBin: true + + '@changesets/config@3.0.0': + resolution: {integrity: sha512-o/rwLNnAo/+j9Yvw9mkBQOZySDYyOr/q+wptRLcAVGlU6djOeP9v1nlalbL9MFsobuBVQbZCTp+dIzdq+CLQUA==} + + '@changesets/errors@0.2.0': + resolution: {integrity: sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow==} + + '@changesets/get-dependents-graph@2.0.0': + resolution: {integrity: sha512-cafUXponivK4vBgZ3yLu944mTvam06XEn2IZGjjKc0antpenkYANXiiE6GExV/yKdsCnE8dXVZ25yGqLYZmScA==} + + '@changesets/get-release-plan@4.0.0': + resolution: {integrity: sha512-9L9xCUeD/Tb6L/oKmpm8nyzsOzhdNBBbt/ZNcjynbHC07WW4E1eX8NMGC5g5SbM5z/V+MOrYsJ4lRW41GCbg3w==} + + '@changesets/get-version-range-type@0.4.0': + resolution: {integrity: sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ==} + + '@changesets/git@3.0.0': + resolution: {integrity: sha512-vvhnZDHe2eiBNRFHEgMiGd2CT+164dfYyrJDhwwxTVD/OW0FUD6G7+4DIx1dNwkwjHyzisxGAU96q0sVNBns0w==} + + '@changesets/logger@0.1.0': + resolution: {integrity: sha512-pBrJm4CQm9VqFVwWnSqKEfsS2ESnwqwH+xR7jETxIErZcfd1u2zBSqrHbRHR7xjhSgep9x2PSKFKY//FAshA3g==} + + '@changesets/parse@0.4.0': + resolution: {integrity: sha512-TS/9KG2CdGXS27S+QxbZXgr8uPsP4yNJYb4BC2/NeFUj80Rni3TeD2qwWmabymxmrLo7JEsytXH1FbpKTbvivw==} + + '@changesets/pre@2.0.0': + resolution: {integrity: sha512-HLTNYX/A4jZxc+Sq8D1AMBsv+1qD6rmmJtjsCJa/9MSRybdxh0mjbTvE6JYZQ/ZiQ0mMlDOlGPXTm9KLTU3jyw==} + + '@changesets/read@0.6.0': + resolution: {integrity: sha512-ZypqX8+/im1Fm98K4YcZtmLKgjs1kDQ5zHpc2U1qdtNBmZZfo/IBiG162RoP0CUF05tvp2y4IspH11PLnPxuuw==} + + '@changesets/types@4.1.0': + resolution: {integrity: sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw==} + + '@changesets/types@6.0.0': + resolution: {integrity: sha512-b1UkfNulgKoWfqyHtzKS5fOZYSJO+77adgL7DLRDr+/7jhChN+QcHnbjiQVOz/U+Ts3PGNySq7diAItzDgugfQ==} + + '@changesets/write@0.3.0': + resolution: {integrity: sha512-slGLb21fxZVUYbyea+94uFiD6ntQW0M2hIKNznFizDhZPDgn2c/fv1UzzlW43RVzh1BEDuIqW6hzlJ1OflNmcw==} + + '@eslint-community/eslint-utils@4.4.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 + + '@eslint-community/regexpp@4.10.0': + resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/eslintrc@2.1.4': + resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@eslint/js@8.57.0': + resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@humanwhocodes/config-array@0.11.14': + resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} + engines: {node: '>=10.10.0'} + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/object-schema@2.0.2': + resolution: {integrity: sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==} + + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + + '@manypkg/find-root@1.1.0': + resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==} + + '@manypkg/get-packages@1.1.3': + resolution: {integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==} + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@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'} + + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + + '@playwright/test@1.42.1': + resolution: {integrity: sha512-Gq9rmS54mjBL/7/MvBaNOBwbfnh7beHvS6oS4srqXFcQHpQCV1+c8JXWE8VLPyRDhgS3H8x8A7hztqI9VnwrAQ==} + engines: {node: '>=16'} + hasBin: true + + '@sindresorhus/is@2.1.1': + resolution: {integrity: sha512-/aPsuoj/1Dw/kzhkgz+ES6TxG0zfTMGLwuK2ZG00k/iJzYHTLCE8mVU8EPqEOp/lmxPoq1C1C9RYToRKb2KEfg==} + engines: {node: '>=10'} + + '@szmarczak/http-timer@4.0.6': + resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==} + engines: {node: '>=10'} + + '@types/async-retry@1.4.2': + resolution: {integrity: sha512-GUDuJURF0YiJZ+CBjNQA0+vbP/VHlJbB0sFqkzsV7EcOPRfurVonXpXKAt3w8qIjM1TEzpz6hc6POocPvHOS3w==} + + '@types/cacheable-request@6.0.3': + resolution: {integrity: sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==} + + '@types/ci-info@2.0.0': + resolution: {integrity: sha512-5R2/MHILQLDCzTuhs1j4Qqq8AaKUf7Ma4KSSkCtc12+fMs47zfa34qhto9goxpyX00tQK1zxB885VCiawZ5Qhg==} + + '@types/cross-spawn@6.0.0': + resolution: {integrity: sha512-evp2ZGsFw9YKprDbg8ySgC9NA15g3YgiI8ANkGmKKvvi0P2aDGYLPxQIC5qfeKNUOe3TjABVGuah6omPRpIYhg==} + + '@types/fs-extra@11.0.4': + resolution: {integrity: sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==} + + '@types/http-cache-semantics@4.0.4': + resolution: {integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==} + + '@types/jsonfile@6.1.4': + resolution: {integrity: sha512-D5qGUYwjvnNNextdU59/+fI+spnwtTFmyQP0h+PfIOSkNfpU6AOICUOkm4i0OnSk+NyjdPJrxCDro0sJsWlRpQ==} + + '@types/keyv@3.1.4': + resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} + + '@types/minimist@1.2.5': + resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==} + + '@types/node@12.20.55': + resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} + + '@types/node@20.11.26': + resolution: {integrity: sha512-YwOMmyhNnAWijOBQweOJnQPl068Oqd4K3OFbTc6AHJwzweUwwWG3GIFY74OKks2PJUDkQPeddOQES9mLn1CTEQ==} + + '@types/normalize-package-data@2.4.4': + resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} + + '@types/prompts@2.0.1': + resolution: {integrity: sha512-AhtMcmETelF8wFDV1ucbChKhLgsc+ytXZXkNz/nnTAMSDeqsjALknEFxi7ZtLgS/G8bV2rp90LhDW5SGACimIQ==} + + '@types/responselike@1.0.3': + resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==} + + '@types/retry@0.12.5': + resolution: {integrity: sha512-3xSjTp3v03X/lSQLkczaN9UIEwJMoMCA1+Nb5HfbJEQWogdeQIyVtTvxPXDQjZ5zws8rFQfVfRdz03ARihPJgw==} + + '@types/semver@7.5.8': + resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} + + '@types/tar@6.1.5': + resolution: {integrity: sha512-qm2I/RlZij5RofuY7vohTpYNaYcrSQlN2MyjucQc7ZweDwaEWkdN/EeNh6e9zjK6uEm6PwjdMXkcj05BxZdX1Q==} + + '@types/validate-npm-package-name@3.0.0': + resolution: {integrity: sha512-iFNNIrEaJH1lbPiyX+O/QyxSbKxrTjdNBVZGckt+iEL9So0hdZNBL68sOfHnt2txuUD8UJXvmKv/1DkgkebgUg==} + + '@ungap/structured-clone@1.2.0': + resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + + '@vercel/ncc@0.38.1': + resolution: {integrity: sha512-IBBb+iI2NLu4VQn3Vwldyi2QwaXt5+hTyh58ggAMoCGE6DJmPvwL3KPBWcJl1m9LYPChBLE980Jw+CS4Wokqxw==} + hasBin: true + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn@8.11.3: + resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} + engines: {node: '>=0.4.0'} + hasBin: true + + ajv-formats@2.1.1: + resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + + ajv@8.12.0: + resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} + + ansi-colors@4.1.3: + resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} + engines: {node: '>=6'} + + ansi-escapes@5.0.0: + resolution: {integrity: sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA==} + engines: {node: '>=12'} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: '>=12'} + + ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + + argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + array-buffer-byte-length@1.0.1: + resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} + engines: {node: '>= 0.4'} + + array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + + array.prototype.flat@1.3.2: + resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==} + engines: {node: '>= 0.4'} + + arraybuffer.prototype.slice@1.0.3: + resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==} + engines: {node: '>= 0.4'} + + arrify@1.0.1: + resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} + engines: {node: '>=0.10.0'} + + async-retry@1.3.1: + resolution: {integrity: sha512-aiieFW/7h3hY0Bq5d+ktDBejxuwR78vRu9hDUdR8rNhSaQ29VzPL4AoIRG7D/c7tdenwOcKvgPM6tIxB3cB6HA==} + + async-sema@3.0.1: + resolution: {integrity: sha512-fKT2riE8EHAvJEfLJXZiATQWqZttjx1+tfgnVshCDrH8vlw4YC8aECe0B8MU184g+aVRFVgmfxFlKZKaozSrNw==} + + atomically@1.7.0: + resolution: {integrity: sha512-Xcz9l0z7y9yQ9rdDaxlmaI4uJHf/T8g9hOEzJcsEqX2SjCj4J20uK7+ldkDHMbpJDK76wF7xEIgxc/vSlsfw5w==} + engines: {node: '>=10.12.0'} + + available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + engines: {node: '>= 0.4'} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + better-path-resolve@1.0.0: + resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} + engines: {node: '>=4'} + + brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + + brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + + braces@3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + + breakword@1.0.6: + resolution: {integrity: sha512-yjxDAYyK/pBvws9H4xKYpLDpYKEH6CzrBPAuXq3x18I+c/2MkVtT3qAr7Oloi6Dss9qNhPVueAAVU1CSeNDIXw==} + + builtins@1.0.3: + resolution: {integrity: sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ==} + + cacheable-lookup@2.0.1: + resolution: {integrity: sha512-EMMbsiOTcdngM/K6gV/OxF2x0t07+vMOWxZNSCRQMjO2MY2nhZQ6OYhOOpyQrbhqsgtvKGI7hcq6xjnA92USjg==} + engines: {node: '>=10'} + + cacheable-request@7.0.4: + resolution: {integrity: sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==} + engines: {node: '>=8'} + + call-bind@1.0.7: + resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} + engines: {node: '>= 0.4'} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + camelcase-keys@6.2.2: + resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==} + engines: {node: '>=8'} + + camelcase@5.3.1: + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} + + chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + chalk@5.3.0: + resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + + chardet@0.7.0: + resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} + + chownr@2.0.0: + resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} + engines: {node: '>=10'} + + ci-info@3.9.0: + resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} + engines: {node: '>=8'} + + ci-info@https://codeload.github.com/watson/ci-info/tar.gz/f43f6a1cefff47fb361c88cf4b943fdbcaafe540: + resolution: {tarball: https://codeload.github.com/watson/ci-info/tar.gz/f43f6a1cefff47fb361c88cf4b943fdbcaafe540} + version: 2.0.0 + + cli-cursor@4.0.0: + resolution: {integrity: sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + cli-spinners@2.9.2: + resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} + engines: {node: '>=6'} + + cliui@6.0.0: + resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} + + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + + clone-response@1.0.3: + resolution: {integrity: sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==} + + clone@1.0.4: + resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} + engines: {node: '>=0.8'} + + color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + commander@2.20.0: + resolution: {integrity: sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==} + + commander@9.5.0: + resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} + engines: {node: ^12.20.0 || >=14} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + conf@10.2.0: + resolution: {integrity: sha512-8fLl9F04EJqjSqH+QjITQfJF8BrOVaYr1jewVgSRAEWePfxT0sku4w2hrGQ60BC/TNLGQ2pgxNlTbWQmMPFvXg==} + engines: {node: '>=12'} + + cross-spawn@5.1.0: + resolution: {integrity: sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==} + + cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + + csv-generate@3.4.3: + resolution: {integrity: sha512-w/T+rqR0vwvHqWs/1ZyMDWtHHSJaN06klRqJXBEpDJaM/+dZkso0OKh1VcuuYvK3XM53KysVNq8Ko/epCK8wOw==} + + csv-parse@4.16.3: + resolution: {integrity: sha512-cO1I/zmz4w2dcKHVvpCr7JVRu8/FymG5OEpmvsZYlccYolPBLoVGKUHgNoc4ZGkFeFlWGEDmMyBM+TTqRdW/wg==} + + csv-stringify@5.6.5: + resolution: {integrity: sha512-PjiQ659aQ+fUTQqSrd1XEDnOr52jh30RBurfzkscaE2tPaFsDH5wOAHJiw8XAHphRknCwMUE9KRayc4K/NbO8A==} + + csv@5.5.3: + resolution: {integrity: sha512-QTaY0XjjhTQOdguARF0lGKm5/mEq9PD9/VhZZegHDIBq2tQwgNpHc3dneD4mGo2iJs+fTKv5Bp0fZ+BRuY3Z0g==} + engines: {node: '>= 0.1.90'} + + debounce-fn@4.0.0: + resolution: {integrity: sha512-8pYCQiL9Xdcg0UPSD3d+0KMlOjp+KGU5EPwYddgzQ7DATsg4fuUDjQtsYLmWjnk2obnNHgV3vE2Y4jejSOJVBQ==} + engines: {node: '>=10'} + + debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decamelize-keys@1.1.1: + resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} + engines: {node: '>=0.10.0'} + + decamelize@1.2.0: + resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} + engines: {node: '>=0.10.0'} + + decompress-response@5.0.0: + resolution: {integrity: sha512-TLZWWybuxWgoW7Lykv+gq9xvzOsUjQ9tF09Tj6NSTYGMTCHNXzrPnD6Hi+TgZq19PyTAGH4Ll/NIM/eTGglnMw==} + engines: {node: '>=10'} + + deep-extend@0.6.0: + resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} + engines: {node: '>=4.0.0'} + + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + defaults@1.0.4: + resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} + + defer-to-connect@2.0.1: + resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} + engines: {node: '>=10'} + + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + + define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + + detect-indent@6.1.0: + resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} + engines: {node: '>=8'} + + dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + + doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + + dot-prop@6.0.1: + resolution: {integrity: sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==} + engines: {node: '>=10'} + + duplexer3@0.1.5: + resolution: {integrity: sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==} + + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + emoji-regex@10.3.0: + resolution: {integrity: sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + end-of-stream@1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + + enquirer@2.4.1: + resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} + engines: {node: '>=8.6'} + + env-paths@2.2.1: + resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} + engines: {node: '>=6'} + + error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + + es-abstract@1.22.5: + resolution: {integrity: sha512-oW69R+4q2wG+Hc3KZePPZxOiisRIqfKBVo/HLx94QcJeWGU/8sZhCvc829rd1kS366vlJbzBfXf9yWwf0+Ko7w==} + engines: {node: '>= 0.4'} + + es-define-property@1.0.0: + resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.0.3: + resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} + engines: {node: '>= 0.4'} + + es-shim-unscopables@1.0.2: + resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} + + es-to-primitive@1.2.1: + resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} + engines: {node: '>= 0.4'} + + escalade@3.1.2: + resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} + engines: {node: '>=6'} + + escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + eslint-config-prettier@8.10.0: + resolution: {integrity: sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + + eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + 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} + + eslint@8.57.0: + resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + hasBin: true + + espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + + esquery@1.5.0: + resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} + engines: {node: '>=0.10'} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + extendable-error@0.1.7: + resolution: {integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==} + + external-editor@3.1.0: + resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} + engines: {node: '>=4'} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-glob@3.3.1: + resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} + engines: {node: '>=8.6.0'} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fastq@1.17.1: + resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + + file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + + fill-range@7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} + + find-up@3.0.0: + resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==} + engines: {node: '>=6'} + + find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + find-yarn-workspace-root2@1.2.16: + resolution: {integrity: sha512-hr6hb1w8ePMpPVUK39S4RlwJzi+xPLuVuG8XlwXU3KD5Yn3qgBWVfy3AzNlDhWvE1EORCE65/Qm26rFQt3VLVA==} + + flat-cache@3.2.0: + resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} + engines: {node: ^10.12.0 || >=12.0.0} + + flatted@3.3.1: + resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} + + for-each@0.3.3: + resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + + foreground-child@3.1.1: + resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} + engines: {node: '>=14'} + + fs-extra@11.2.0: + resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==} + engines: {node: '>=14.14'} + + fs-extra@7.0.1: + resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} + engines: {node: '>=6 <7 || >=8'} + + fs-extra@8.1.0: + resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} + engines: {node: '>=6 <7 || >=8'} + + fs-minipass@2.1.0: + resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} + engines: {node: '>= 8'} + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + fsevents@2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + 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'} + + functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-east-asian-width@1.2.0: + resolution: {integrity: sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==} + engines: {node: '>=18'} + + get-intrinsic@1.2.4: + resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} + engines: {node: '>= 0.4'} + + get-stream@5.2.0: + resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} + engines: {node: '>=8'} + + get-symbol-description@1.0.2: + resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} + engines: {node: '>= 0.4'} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + glob@10.3.10: + resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + + globals@13.24.0: + resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} + engines: {node: '>=8'} + + globalthis@1.0.3: + resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} + engines: {node: '>= 0.4'} + + globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + + gopd@1.0.1: + resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + + got@10.7.0: + resolution: {integrity: sha512-aWTDeNw9g+XqEZNcTjMMZSy7B7yE9toWOFYip7ofFTLleJhvZwUxxTxkTpKvF+p1SAA4VHmuEy7PiHTHyq8tJg==} + engines: {node: '>=10'} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + grapheme-splitter@1.0.4: + resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} + + graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + + hard-rejection@2.1.0: + resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} + engines: {node: '>=6'} + + has-bigints@1.0.2: + resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} + + 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'} + + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + + has-proto@1.0.3: + resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} + engines: {node: '>= 0.4'} + + has-symbols@1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + hosted-git-info@2.8.9: + resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} + + http-cache-semantics@4.1.1: + resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} + + human-id@1.0.2: + resolution: {integrity: sha512-UNopramDEhHJD+VR+ehk8rOslwSfByxPIZyJRfV739NDhN5LF1fa1MqnzKm2lGTQRjNrjK19Q5fhkgIfjlVUKw==} + + husky@9.0.11: + resolution: {integrity: sha512-AB6lFlbwwyIqMdHYhwPe+kjOC3Oc5P3nThEoW/AaO2BX3vJDjWPFxYLxokUZOo6RNX20He3AaT8sESs9NJcmEw==} + engines: {node: '>=18'} + hasBin: true + + iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + + ignore@5.3.1: + resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} + engines: {node: '>= 4'} + + import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + indent-string@4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + + internal-slot@1.0.7: + resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} + engines: {node: '>= 0.4'} + + is-array-buffer@3.0.4: + resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} + engines: {node: '>= 0.4'} + + is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + + is-bigint@1.0.4: + resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} + + is-boolean-object@1.1.2: + resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} + engines: {node: '>= 0.4'} + + is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + + is-core-module@2.13.1: + resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} + + is-date-object@1.0.5: + resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} + engines: {node: '>= 0.4'} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-interactive@2.0.0: + resolution: {integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==} + engines: {node: '>=12'} + + is-negative-zero@2.0.3: + resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} + engines: {node: '>= 0.4'} + + is-number-object@1.0.7: + resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} + engines: {node: '>= 0.4'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-obj@2.0.0: + resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} + engines: {node: '>=8'} + + is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + + is-plain-obj@1.1.0: + resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} + engines: {node: '>=0.10.0'} + + is-regex@1.1.4: + resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} + engines: {node: '>= 0.4'} + + is-shared-array-buffer@1.0.3: + resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} + engines: {node: '>= 0.4'} + + is-string@1.0.7: + resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} + engines: {node: '>= 0.4'} + + is-subdir@1.2.0: + resolution: {integrity: sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==} + engines: {node: '>=4'} + + is-symbol@1.0.4: + resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} + engines: {node: '>= 0.4'} + + is-typed-array@1.1.13: + resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} + engines: {node: '>= 0.4'} + + is-unicode-supported@1.3.0: + resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==} + engines: {node: '>=12'} + + is-unicode-supported@2.0.0: + resolution: {integrity: sha512-FRdAyx5lusK1iHG0TWpVtk9+1i+GjrzRffhDg4ovQ7mcidMQ6mj+MhKPmvh7Xwyv5gIS06ns49CA7Sqg7lC22Q==} + engines: {node: '>=18'} + + is-weakref@1.0.2: + resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} + + is-windows@1.0.2: + resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} + engines: {node: '>=0.10.0'} + + isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + jackspeak@2.3.6: + resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} + engines: {node: '>=14'} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-yaml@3.14.1: + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + hasBin: true + + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + + json-schema-typed@7.0.3: + resolution: {integrity: sha512-7DE8mpG+/fVw+dTpjbxnx47TaMnDfOI1jwft9g1VybltZCduyRQPJPvc+zzKY9WPHxhPWczyFuYa6I8Mw4iU5A==} + + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + jsonfile@4.0.0: + resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + + jsonfile@6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + + kleur@3.0.3: + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} + engines: {node: '>=6'} + + kleur@4.1.5: + resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} + engines: {node: '>=6'} + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + load-yaml-file@0.2.0: + resolution: {integrity: sha512-OfCBkGEw4nN6JLtgRidPX6QxjBQGQf72q3si2uvqyFEMbycSFFHwAZeXx6cJgFM9wmLrf9zBwCP3Ivqa+LLZPw==} + engines: {node: '>=6'} + + locate-path@3.0.0: + resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==} + engines: {node: '>=6'} + + locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + lodash.startcase@4.4.0: + resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} + + log-symbols@6.0.0: + resolution: {integrity: sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==} + engines: {node: '>=18'} + + lowercase-keys@2.0.0: + resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==} + engines: {node: '>=8'} + + lru-cache@10.2.0: + resolution: {integrity: sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==} + engines: {node: 14 || >=16.14} + + lru-cache@4.1.5: + resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} + + lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + + map-obj@1.0.1: + resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} + engines: {node: '>=0.10.0'} + + map-obj@4.3.0: + resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} + engines: {node: '>=8'} + + meow@6.1.1: + resolution: {integrity: sha512-3YffViIt2QWgTy6Pale5QpopX/IvU3LPL03jOTqp6pGj3VjesdO/U8CuHMKpnQr4shCNCM5fd5XFFvIIl6JBHg==} + engines: {node: '>=8'} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + micromatch@4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} + + mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + + mimic-fn@3.1.0: + resolution: {integrity: sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ==} + engines: {node: '>=8'} + + mimic-response@1.0.1: + resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==} + engines: {node: '>=4'} + + mimic-response@2.1.0: + resolution: {integrity: sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==} + engines: {node: '>=8'} + + min-indent@1.0.1: + resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} + engines: {node: '>=4'} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@9.0.3: + resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} + engines: {node: '>=16 || 14 >=14.17'} + + minimist-options@4.1.0: + resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} + engines: {node: '>= 6'} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + minipass@3.3.6: + resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} + engines: {node: '>=8'} + + minipass@4.2.8: + resolution: {integrity: sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==} + engines: {node: '>=8'} + + minipass@5.0.0: + resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} + engines: {node: '>=8'} + + minipass@7.0.4: + resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} + engines: {node: '>=16 || 14 >=14.17'} + + minizlib@2.1.2: + resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} + engines: {node: '>= 8'} + + mixme@0.5.10: + resolution: {integrity: sha512-5H76ANWinB1H3twpJ6JY8uvAtpmFvHNArpilJAjXRKXSDDLPIMoZArw5SH0q9z+lLs8IrMw7Q2VWpWimFKFT1Q==} + engines: {node: '>= 8.0.0'} + + mkdirp@1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true + + ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + normalize-package-data@2.5.0: + resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} + + normalize-url@6.1.0: + resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==} + engines: {node: '>=10'} + + object-inspect@1.13.1: + resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} + + object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + object.assign@4.1.5: + resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} + engines: {node: '>= 0.4'} + + ollama@0.5.0: + resolution: {integrity: sha512-CRtRzsho210EGdK52GrUMohA2pU+7NbgEaBG3DcYeRmvQthDO7E2LHOkLlUUeaYUlNmEd8icbjC02ug9meSYnw==} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + + optionator@0.9.3: + resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} + engines: {node: '>= 0.8.0'} + + ora@8.0.1: + resolution: {integrity: sha512-ANIvzobt1rls2BDny5fWZ3ZVKyD6nscLvfFRpQgfWsythlcsVUC9kL0zq6j2Z5z9wwp1kd7wpsD/T9qNPVLCaQ==} + engines: {node: '>=18'} + + os-tmpdir@1.0.2: + resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} + engines: {node: '>=0.10.0'} + + outdent@0.5.0: + resolution: {integrity: sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==} + + p-cancelable@2.1.1: + resolution: {integrity: sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==} + engines: {node: '>=8'} + + p-event@4.2.0: + resolution: {integrity: sha512-KXatOjCRXXkSePPb1Nbi0p0m+gQAwdlbhi4wQKJPI1HsMQS9g+Sqp2o+QHziPr7eYJyOZet836KoHEVM1mwOrQ==} + engines: {node: '>=8'} + + p-filter@2.1.0: + resolution: {integrity: sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==} + engines: {node: '>=8'} + + p-finally@1.0.0: + resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} + engines: {node: '>=4'} + + p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-locate@3.0.0: + resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==} + engines: {node: '>=6'} + + p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + p-map@2.1.0: + resolution: {integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==} + engines: {node: '>=6'} + + p-timeout@3.2.0: + resolution: {integrity: sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==} + engines: {node: '>=8'} + + p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + + path-exists@3.0.0: + resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} + engines: {node: '>=4'} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + 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'} + + 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'} + + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + 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@4.0.1: + resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} + engines: {node: '>=6'} + + pkg-dir@4.2.0: + resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} + engines: {node: '>=8'} + + pkg-up@3.1.0: + resolution: {integrity: sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==} + engines: {node: '>=8'} + + playwright-core@1.42.1: + resolution: {integrity: sha512-mxz6zclokgrke9p1vtdy/COWBH+eOZgYUVVU34C73M+4j4HLlQJHtfcqiqqxpP0o8HhMkflvfbquLX5dg6wlfA==} + engines: {node: '>=16'} + hasBin: true + + playwright@1.42.1: + resolution: {integrity: sha512-PgwB03s2DZBcNRoW+1w9E+VkLBxweib6KTXM0M3tkiT4jVxKSi6PmVJ591J+0u10LUrgxB7dLRbiJqO5s2QPMg==} + engines: {node: '>=16'} + hasBin: true + + possible-typed-array-names@1.0.0: + resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} + engines: {node: '>= 0.4'} + + preferred-pm@3.1.3: + resolution: {integrity: sha512-MkXsENfftWSRpzCzImcp4FRsCc3y1opwB73CfCNWyzMqArju2CrlMHlqB7VexKiPEOjGMbttv1r9fSCn5S610w==} + engines: {node: '>=10'} + + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + prettier-plugin-organize-imports@3.2.4: + resolution: {integrity: sha512-6m8WBhIp0dfwu0SkgfOxJqh+HpdyfqSSLfKKRZSFbDuEQXDDndb8fTpRWkUrX/uBenkex3MgnVk0J3b3Y5byog==} + peerDependencies: + '@volar/vue-language-plugin-pug': ^1.0.4 + '@volar/vue-typescript': ^1.0.4 + prettier: '>=2.0' + typescript: '>=2.9' + peerDependenciesMeta: + '@volar/vue-language-plugin-pug': + optional: true + '@volar/vue-typescript': + optional: true + + prettier@2.8.8: + resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} + engines: {node: '>=10.13.0'} + hasBin: true + + prettier@3.2.5: + resolution: {integrity: sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==} + engines: {node: '>=14'} + hasBin: true + + prompts@2.1.0: + resolution: {integrity: sha512-+x5TozgqYdOwWsQFZizE/Tra3fKvAoy037kOyU6cgz84n8f6zxngLOV4O32kTwt9FcLCxAqw0P/c8rOr9y+Gfg==} + engines: {node: '>= 6'} + + pseudomap@1.0.2: + resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} + + pump@3.0.0: + resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + quick-lru@4.0.1: + resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} + engines: {node: '>=8'} + + rc@1.2.8: + resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} + hasBin: true + + read-pkg-up@7.0.1: + resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} + engines: {node: '>=8'} + + read-pkg@5.2.0: + resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} + engines: {node: '>=8'} + + read-yaml-file@1.1.0: + resolution: {integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==} + engines: {node: '>=6'} + + redent@3.0.0: + resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} + engines: {node: '>=8'} + + regenerator-runtime@0.14.1: + resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + + regexp.prototype.flags@1.5.2: + resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==} + engines: {node: '>= 0.4'} + + registry-auth-token@3.3.2: + resolution: {integrity: sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==} + + registry-url@3.1.0: + resolution: {integrity: sha512-ZbgR5aZEdf4UKZVBPYIgaglBmSF2Hi94s2PcIHhRGFjKYu+chjJdYfHn4rt3hB6eCKLJ8giVIIfgMa1ehDfZKA==} + engines: {node: '>=0.10.0'} + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + + require-main-filename@2.0.0: + resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + + resolve@1.22.8: + resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + hasBin: true + + responselike@2.0.1: + resolution: {integrity: sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==} + + restore-cursor@4.0.0: + resolution: {integrity: sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + retry@0.12.0: + resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} + engines: {node: '>= 4'} + + reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + hasBin: true + + rimraf@5.0.5: + resolution: {integrity: sha512-CqDakW+hMe/Bz202FPEymy68P+G50RfMQK+Qo5YUqc9SPipvbGjCGKd0RSKEelbsfQuw3g5NZDSrlZZAJurH1A==} + engines: {node: '>=14'} + hasBin: true + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + safe-array-concat@1.1.2: + resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} + engines: {node: '>=0.4'} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safe-regex-test@1.0.3: + resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} + engines: {node: '>= 0.4'} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + semver@5.7.2: + resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} + hasBin: true + + semver@7.6.0: + resolution: {integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==} + engines: {node: '>=10'} + hasBin: true + + set-blocking@2.0.0: + resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + + set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + + set-function-name@2.0.2: + resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} + engines: {node: '>= 0.4'} + + shebang-command@1.2.0: + resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} + engines: {node: '>=0.10.0'} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@1.0.0: + resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} + engines: {node: '>=0.10.0'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + side-channel@1.0.6: + resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} + engines: {node: '>= 0.4'} + + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + + slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + + smartwrap@2.0.2: + resolution: {integrity: sha512-vCsKNQxb7PnCNd2wY1WClWifAc2lwqsG8OaswpJkVJsvMGcnEntdTCDajZCkk93Ay1U3t/9puJmb525Rg5MZBA==} + engines: {node: '>=6'} + hasBin: true + + smol-toml@1.1.4: + resolution: {integrity: sha512-Y0OT8HezWsTNeEOSVxDnKOW/AyNXHQ4BwJNbAXlLTF5wWsBvrcHhIkE5Rf8kQMLmgf7nDX3PVOlgC6/Aiggu3Q==} + engines: {node: '>= 18', pnpm: '>= 8'} + + spawndamnit@2.0.0: + resolution: {integrity: sha512-j4JKEcncSjFlqIwU5L/rp2N5SIPsdxaRsIv678+TZxZ0SRDJTm8JrxJMjE/XuiEZNEir3S8l0Fa3Ke339WI4qA==} + + spdx-correct@3.2.0: + resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + + spdx-exceptions@2.5.0: + resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} + + spdx-expression-parse@3.0.1: + resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + + spdx-license-ids@3.0.17: + resolution: {integrity: sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==} + + sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + + stdin-discarder@0.2.2: + resolution: {integrity: sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==} + engines: {node: '>=18'} + + stream-transform@2.1.3: + resolution: {integrity: sha512-9GHUiM5hMiCi6Y03jD2ARC1ettBXkQBoQAe7nJsPknnI0ow10aXjTnew8QtYQmLjzn974BnmWEAJgCY6ZP1DeQ==} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + + string-width@7.1.0: + resolution: {integrity: sha512-SEIJCWiX7Kg4c129n48aDRwLbFb2LJmXXFrWBG4NGaRtMQ3myKPKbwrD1BKqQn74oCoNMBVrfDEr5M9YxCsrkw==} + engines: {node: '>=18'} + + string.prototype.trim@1.2.8: + resolution: {integrity: sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==} + engines: {node: '>= 0.4'} + + string.prototype.trimend@1.0.7: + resolution: {integrity: sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==} + + string.prototype.trimstart@1.0.7: + resolution: {integrity: sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false + strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} -devDependencies: - '@changesets/cli': - specifier: ^2.27.1 - version: 2.27.1 - '@playwright/test': - specifier: ^1.41.1 - version: 1.42.1 - '@types/async-retry': - specifier: 1.4.2 - version: 1.4.2 - '@types/ci-info': - specifier: 2.0.0 - version: 2.0.0 - '@types/cross-spawn': - specifier: 6.0.0 - version: 6.0.0 - '@types/fs-extra': - specifier: 11.0.4 - version: 11.0.4 - '@types/node': - specifier: ^20.11.7 - version: 20.11.26 - '@types/prompts': - specifier: 2.0.1 - version: 2.0.1 - '@types/tar': - specifier: 6.1.5 - version: 6.1.5 - '@types/validate-npm-package-name': - specifier: 3.0.0 - version: 3.0.0 - '@vercel/ncc': - specifier: 0.38.1 - version: 0.38.1 - async-retry: - specifier: 1.3.1 - version: 1.3.1 - async-sema: - specifier: 3.0.1 - version: 3.0.1 - ci-info: - specifier: github:watson/ci-info#f43f6a1cefff47fb361c88cf4b943fdbcaafe540 - version: github.com/watson/ci-info/f43f6a1cefff47fb361c88cf4b943fdbcaafe540 - commander: - specifier: 2.20.0 - version: 2.20.0 - conf: - specifier: 10.2.0 - version: 10.2.0 - cross-spawn: - specifier: 7.0.3 - version: 7.0.3 - eslint: - specifier: ^8.56.0 - version: 8.57.0 - eslint-config-prettier: - specifier: ^8.10.0 - version: 8.10.0(eslint@8.57.0) - fast-glob: - specifier: 3.3.1 - version: 3.3.1 - fs-extra: - specifier: 11.2.0 - version: 11.2.0 - got: - specifier: 10.7.0 - version: 10.7.0 - husky: - specifier: ^9.0.10 - version: 9.0.11 - ora: - specifier: ^8.0.1 - version: 8.0.1 - picocolors: - specifier: 1.0.0 - version: 1.0.0 - prettier: - specifier: ^3.2.5 - version: 3.2.5 - prettier-plugin-organize-imports: - specifier: ^3.2.4 - version: 3.2.4(prettier@3.2.5)(typescript@5.4.2) - prompts: - specifier: 2.1.0 - version: 2.1.0 - rimraf: - specifier: ^5.0.5 - version: 5.0.5 - smol-toml: - specifier: ^1.1.4 - version: 1.1.4 - tar: - specifier: 6.1.15 - version: 6.1.15 - terminal-link: - specifier: ^3.0.0 - version: 3.0.0 - typescript: - specifier: ^5.3.3 - version: 5.4.2 - update-check: - specifier: 1.5.4 - version: 1.5.4 - validate-npm-package-name: - specifier: 3.0.0 - version: 3.0.0 - wait-port: - specifier: ^1.1.0 - version: 1.1.0 - yaml: - specifier: 2.4.1 - version: 2.4.1 + strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} -packages: + strip-indent@3.0.0: + resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} + engines: {node: '>=8'} - /@aashutoshrathi/word-wrap@1.2.6: - resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} + strip-json-comments@2.0.1: + resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} engines: {node: '>=0.10.0'} - dev: true - /@babel/code-frame@7.23.5: - resolution: {integrity: sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==} - engines: {node: '>=6.9.0'} + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-hyperlinks@2.3.0: + resolution: {integrity: sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==} + engines: {node: '>=8'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + tar@6.1.15: + resolution: {integrity: sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A==} + engines: {node: '>=10'} + + term-size@2.2.1: + resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} + engines: {node: '>=8'} + + terminal-link@3.0.0: + resolution: {integrity: sha512-flFL3m4wuixmf6IfhFJd1YPiLiMuxEc8uHRM1buzIeZPm22Au2pDqBJQgdo7n1WfPU1ONFGv7YDwpFBmHGF6lg==} + engines: {node: '>=12'} + + text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + + tmp@0.0.33: + resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} + engines: {node: '>=0.6.0'} + + to-readable-stream@2.1.0: + resolution: {integrity: sha512-o3Qa6DGg1CEXshSdvWNX2sN4QHqg03SPq7U6jPXRahlQdl5dK8oXjkU/2/sGrnOZKeGV1zLSO8qPwyKklPPE7w==} + engines: {node: '>=8'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + trim-newlines@3.0.1: + resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} + engines: {node: '>=8'} + + tty-table@4.2.3: + resolution: {integrity: sha512-Fs15mu0vGzCrj8fmJNP7Ynxt5J7praPXqFN0leZeZBXJwkMxv9cb2D454k1ltrtUSJbZ4yH4e0CynsHLxmUfFA==} + engines: {node: '>=8.0.0'} + hasBin: true + + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + type-fest@0.10.0: + resolution: {integrity: sha512-EUV9jo4sffrwlg8s0zDhP0T2WD3pru5Xi0+HTE3zTUmBaZNhfkite9PdSJwdXLwPVW0jnAHT56pZHIOYckPEiw==} + engines: {node: '>=8'} + + type-fest@0.13.1: + resolution: {integrity: sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==} + engines: {node: '>=10'} + + type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + + type-fest@0.6.0: + resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} + engines: {node: '>=8'} + + type-fest@0.8.1: + resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} + engines: {node: '>=8'} + + type-fest@1.4.0: + resolution: {integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==} + engines: {node: '>=10'} + + typed-array-buffer@1.0.2: + resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} + engines: {node: '>= 0.4'} + + typed-array-byte-length@1.0.1: + resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==} + engines: {node: '>= 0.4'} + + typed-array-byte-offset@1.0.2: + resolution: {integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==} + engines: {node: '>= 0.4'} + + typed-array-length@1.0.5: + resolution: {integrity: sha512-yMi0PlwuznKHxKmcpoOdeLwxBoVPkqZxd7q2FgMkmD3bNwvF5VW0+UlUQ1k1vmktTu4Yu13Q0RIxEP8+B+wloA==} + engines: {node: '>= 0.4'} + + typescript@5.4.2: + resolution: {integrity: sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ==} + engines: {node: '>=14.17'} + hasBin: true + + unbox-primitive@1.0.2: + resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} + + undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + + universalify@0.1.2: + resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} + engines: {node: '>= 4.0.0'} + + universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + + update-check@1.5.4: + resolution: {integrity: sha512-5YHsflzHP4t1G+8WGPlvKbJEbAJGCgw+Em+dGR1KmBUbr1J36SJBqlHLjR7oob7sco5hWHGQVcr9B2poIVDDTQ==} + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + validate-npm-package-license@3.0.4: + resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + + validate-npm-package-name@3.0.0: + resolution: {integrity: sha512-M6w37eVCMMouJ9V/sdPGnC5H4uDr73/+xdq0FBLO3TFFX1+7wiUY6Es328NN+y43tmY+doUdN9g9J21vqB7iLw==} + + wait-port@1.1.0: + resolution: {integrity: sha512-3e04qkoN3LxTMLakdqeWth8nih8usyg+sf1Bgdf9wwUkp05iuK1eSY/QpLvscT/+F/gA89+LpUmmgBtesbqI2Q==} + engines: {node: '>=10'} + hasBin: true + + wcwidth@1.0.1: + resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + + whatwg-fetch@3.6.20: + resolution: {integrity: sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==} + + which-boxed-primitive@1.0.2: + resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} + + which-module@2.0.1: + resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} + + which-pm@2.0.0: + resolution: {integrity: sha512-Lhs9Pmyph0p5n5Z3mVnN0yWcbQYUAD7rbQUiMsQxOJ3T57k7RFe35SUwWMf7dsbDZks1uOmw4AecB/JMDj3v/w==} + engines: {node: '>=8.15'} + + which-typed-array@1.1.15: + resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} + engines: {node: '>= 0.4'} + + which@1.3.1: + resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} + hasBin: true + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + wrap-ansi@6.2.0: + resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} + engines: {node: '>=8'} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + y18n@4.0.3: + resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yallist@2.1.2: + resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==} + + yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + + yaml@2.4.1: + resolution: {integrity: sha512-pIXzoImaqmfOrL7teGUBt/T7ZDnyeGBWyXQBvOVhLkWLN37GXv8NMLK406UY6dS51JfcQHsmcW5cJ441bHg6Lg==} + engines: {node: '>= 14'} + hasBin: true + + yargs-parser@18.1.3: + resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} + engines: {node: '>=6'} + + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs@15.4.1: + resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} + engines: {node: '>=8'} + + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + +snapshots: + + '@aashutoshrathi/word-wrap@1.2.6': {} + + '@babel/code-frame@7.23.5': dependencies: '@babel/highlight': 7.23.4 chalk: 2.4.2 - dev: true - /@babel/helper-validator-identifier@7.22.20: - resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} - engines: {node: '>=6.9.0'} - dev: true + '@babel/helper-validator-identifier@7.22.20': {} - /@babel/highlight@7.23.4: - resolution: {integrity: sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==} - engines: {node: '>=6.9.0'} + '@babel/highlight@7.23.4': dependencies: '@babel/helper-validator-identifier': 7.22.20 chalk: 2.4.2 js-tokens: 4.0.0 - dev: true - /@babel/runtime@7.24.0: - resolution: {integrity: sha512-Chk32uHMg6TnQdvw2e9IlqPpFX/6NLuK0Ys2PqLb7/gL5uFn9mXvK715FGLlOLQrcO4qIkNHkvPGktzzXexsFw==} - engines: {node: '>=6.9.0'} + '@babel/runtime@7.24.0': dependencies: regenerator-runtime: 0.14.1 - dev: true - /@changesets/apply-release-plan@7.0.0: - resolution: {integrity: sha512-vfi69JR416qC9hWmFGSxj7N6wA5J222XNBmezSVATPWDVPIF7gkd4d8CpbEbXmRWbVrkoli3oerGS6dcL/BGsQ==} + '@changesets/apply-release-plan@7.0.0': dependencies: '@babel/runtime': 7.24.0 '@changesets/config': 3.0.0 @@ -173,10 +1966,8 @@ packages: prettier: 2.8.8 resolve-from: 5.0.0 semver: 7.6.0 - dev: true - /@changesets/assemble-release-plan@6.0.0: - resolution: {integrity: sha512-4QG7NuisAjisbW4hkLCmGW2lRYdPrKzro+fCtZaILX+3zdUELSvYjpL4GTv0E4aM9Mef3PuIQp89VmHJ4y2bfw==} + '@changesets/assemble-release-plan@6.0.0': dependencies: '@babel/runtime': 7.24.0 '@changesets/errors': 0.2.0 @@ -184,17 +1975,12 @@ packages: '@changesets/types': 6.0.0 '@manypkg/get-packages': 1.1.3 semver: 7.6.0 - dev: true - /@changesets/changelog-git@0.2.0: - resolution: {integrity: sha512-bHOx97iFI4OClIT35Lok3sJAwM31VbUM++gnMBV16fdbtBhgYu4dxsphBF/0AZZsyAHMrnM0yFcj5gZM1py6uQ==} + '@changesets/changelog-git@0.2.0': dependencies: '@changesets/types': 6.0.0 - dev: true - /@changesets/cli@2.27.1: - resolution: {integrity: sha512-iJ91xlvRnnrJnELTp4eJJEOPjgpF3NOh4qeQehM6Ugiz9gJPRZ2t+TsXun6E3AMN4hScZKjqVXl0TX+C7AB3ZQ==} - hasBin: true + '@changesets/cli@2.27.1': dependencies: '@babel/runtime': 7.24.0 '@changesets/apply-release-plan': 7.0.0 @@ -228,10 +2014,8 @@ packages: spawndamnit: 2.0.0 term-size: 2.2.1 tty-table: 4.2.3 - dev: true - /@changesets/config@3.0.0: - resolution: {integrity: sha512-o/rwLNnAo/+j9Yvw9mkBQOZySDYyOr/q+wptRLcAVGlU6djOeP9v1nlalbL9MFsobuBVQbZCTp+dIzdq+CLQUA==} + '@changesets/config@3.0.0': dependencies: '@changesets/errors': 0.2.0 '@changesets/get-dependents-graph': 2.0.0 @@ -240,26 +2024,20 @@ packages: '@manypkg/get-packages': 1.1.3 fs-extra: 7.0.1 micromatch: 4.0.5 - dev: true - /@changesets/errors@0.2.0: - resolution: {integrity: sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow==} + '@changesets/errors@0.2.0': dependencies: extendable-error: 0.1.7 - dev: true - /@changesets/get-dependents-graph@2.0.0: - resolution: {integrity: sha512-cafUXponivK4vBgZ3yLu944mTvam06XEn2IZGjjKc0antpenkYANXiiE6GExV/yKdsCnE8dXVZ25yGqLYZmScA==} + '@changesets/get-dependents-graph@2.0.0': dependencies: '@changesets/types': 6.0.0 '@manypkg/get-packages': 1.1.3 chalk: 2.4.2 fs-extra: 7.0.1 semver: 7.6.0 - dev: true - /@changesets/get-release-plan@4.0.0: - resolution: {integrity: sha512-9L9xCUeD/Tb6L/oKmpm8nyzsOzhdNBBbt/ZNcjynbHC07WW4E1eX8NMGC5g5SbM5z/V+MOrYsJ4lRW41GCbg3w==} + '@changesets/get-release-plan@4.0.0': dependencies: '@babel/runtime': 7.24.0 '@changesets/assemble-release-plan': 6.0.0 @@ -268,14 +2046,10 @@ packages: '@changesets/read': 0.6.0 '@changesets/types': 6.0.0 '@manypkg/get-packages': 1.1.3 - dev: true - /@changesets/get-version-range-type@0.4.0: - resolution: {integrity: sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ==} - dev: true + '@changesets/get-version-range-type@0.4.0': {} - /@changesets/git@3.0.0: - resolution: {integrity: sha512-vvhnZDHe2eiBNRFHEgMiGd2CT+164dfYyrJDhwwxTVD/OW0FUD6G7+4DIx1dNwkwjHyzisxGAU96q0sVNBns0w==} + '@changesets/git@3.0.0': dependencies: '@babel/runtime': 7.24.0 '@changesets/errors': 0.2.0 @@ -284,33 +2058,25 @@ packages: is-subdir: 1.2.0 micromatch: 4.0.5 spawndamnit: 2.0.0 - dev: true - /@changesets/logger@0.1.0: - resolution: {integrity: sha512-pBrJm4CQm9VqFVwWnSqKEfsS2ESnwqwH+xR7jETxIErZcfd1u2zBSqrHbRHR7xjhSgep9x2PSKFKY//FAshA3g==} + '@changesets/logger@0.1.0': dependencies: chalk: 2.4.2 - dev: true - /@changesets/parse@0.4.0: - resolution: {integrity: sha512-TS/9KG2CdGXS27S+QxbZXgr8uPsP4yNJYb4BC2/NeFUj80Rni3TeD2qwWmabymxmrLo7JEsytXH1FbpKTbvivw==} + '@changesets/parse@0.4.0': dependencies: '@changesets/types': 6.0.0 js-yaml: 3.14.1 - dev: true - /@changesets/pre@2.0.0: - resolution: {integrity: sha512-HLTNYX/A4jZxc+Sq8D1AMBsv+1qD6rmmJtjsCJa/9MSRybdxh0mjbTvE6JYZQ/ZiQ0mMlDOlGPXTm9KLTU3jyw==} + '@changesets/pre@2.0.0': dependencies: '@babel/runtime': 7.24.0 '@changesets/errors': 0.2.0 '@changesets/types': 6.0.0 '@manypkg/get-packages': 1.1.3 fs-extra: 7.0.1 - dev: true - /@changesets/read@0.6.0: - resolution: {integrity: sha512-ZypqX8+/im1Fm98K4YcZtmLKgjs1kDQ5zHpc2U1qdtNBmZZfo/IBiG162RoP0CUF05tvp2y4IspH11PLnPxuuw==} + '@changesets/read@0.6.0': dependencies: '@babel/runtime': 7.24.0 '@changesets/git': 3.0.0 @@ -320,44 +2086,27 @@ packages: chalk: 2.4.2 fs-extra: 7.0.1 p-filter: 2.1.0 - dev: true - /@changesets/types@4.1.0: - resolution: {integrity: sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw==} - dev: true + '@changesets/types@4.1.0': {} - /@changesets/types@6.0.0: - resolution: {integrity: sha512-b1UkfNulgKoWfqyHtzKS5fOZYSJO+77adgL7DLRDr+/7jhChN+QcHnbjiQVOz/U+Ts3PGNySq7diAItzDgugfQ==} - dev: true + '@changesets/types@6.0.0': {} - /@changesets/write@0.3.0: - resolution: {integrity: sha512-slGLb21fxZVUYbyea+94uFiD6ntQW0M2hIKNznFizDhZPDgn2c/fv1UzzlW43RVzh1BEDuIqW6hzlJ1OflNmcw==} + '@changesets/write@0.3.0': dependencies: '@babel/runtime': 7.24.0 '@changesets/types': 6.0.0 fs-extra: 7.0.1 human-id: 1.0.2 prettier: 2.8.8 - dev: true - /@eslint-community/eslint-utils@4.4.0(eslint@8.57.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 + '@eslint-community/eslint-utils@4.4.0(eslint@8.57.0)': dependencies: eslint: 8.57.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.10.0': {} - /@eslint/eslintrc@2.1.4: - resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@eslint/eslintrc@2.1.4': dependencies: ajv: 6.12.6 debug: 4.3.4 @@ -370,56 +2119,38 @@ packages: strip-json-comments: 3.1.1 transitivePeerDependencies: - supports-color - dev: true - /@eslint/js@8.57.0: - resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: true + '@eslint/js@8.57.0': {} - /@humanwhocodes/config-array@0.11.14: - resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} - engines: {node: '>=10.10.0'} + '@humanwhocodes/config-array@0.11.14': dependencies: '@humanwhocodes/object-schema': 2.0.2 debug: 4.3.4 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/module-importer@1.0.1': {} - /@humanwhocodes/object-schema@2.0.2: - resolution: {integrity: sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==} - dev: true + '@humanwhocodes/object-schema@2.0.2': {} - /@isaacs/cliui@8.0.2: - resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} - engines: {node: '>=12'} + '@isaacs/cliui@8.0.2': dependencies: string-width: 5.1.2 - string-width-cjs: /string-width@4.2.3 + string-width-cjs: string-width@4.2.3 strip-ansi: 7.1.0 - strip-ansi-cjs: /strip-ansi@6.0.1 + strip-ansi-cjs: strip-ansi@6.0.1 wrap-ansi: 8.1.0 - wrap-ansi-cjs: /wrap-ansi@7.0.0 - dev: true + wrap-ansi-cjs: wrap-ansi@7.0.0 - /@manypkg/find-root@1.1.0: - resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==} + '@manypkg/find-root@1.1.0': dependencies: '@babel/runtime': 7.24.0 '@types/node': 12.20.55 find-up: 4.1.0 fs-extra: 8.1.0 - dev: true - /@manypkg/get-packages@1.1.3: - resolution: {integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==} + '@manypkg/get-packages@1.1.3': dependencies: '@babel/runtime': 7.24.0 '@changesets/types': 4.1.0 @@ -427,280 +2158,160 @@ packages: fs-extra: 8.1.0 globby: 11.1.0 read-yaml-file: 1.1.0 - dev: true - /@nodelib/fs.scandir@2.1.5: - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} + '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 run-parallel: 1.2.0 - dev: true - /@nodelib/fs.stat@2.0.5: - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} - dev: true + '@nodelib/fs.stat@2.0.5': {} - /@nodelib/fs.walk@1.2.8: - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} - engines: {node: '>= 8'} + '@nodelib/fs.walk@1.2.8': dependencies: '@nodelib/fs.scandir': 2.1.5 fastq: 1.17.1 - dev: true - /@pkgjs/parseargs@0.11.0: - resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} - engines: {node: '>=14'} - requiresBuild: true - dev: true + '@pkgjs/parseargs@0.11.0': optional: true - /@playwright/test@1.42.1: - resolution: {integrity: sha512-Gq9rmS54mjBL/7/MvBaNOBwbfnh7beHvS6oS4srqXFcQHpQCV1+c8JXWE8VLPyRDhgS3H8x8A7hztqI9VnwrAQ==} - engines: {node: '>=16'} - hasBin: true + '@playwright/test@1.42.1': dependencies: playwright: 1.42.1 - dev: true - /@sindresorhus/is@2.1.1: - resolution: {integrity: sha512-/aPsuoj/1Dw/kzhkgz+ES6TxG0zfTMGLwuK2ZG00k/iJzYHTLCE8mVU8EPqEOp/lmxPoq1C1C9RYToRKb2KEfg==} - engines: {node: '>=10'} - dev: true + '@sindresorhus/is@2.1.1': {} - /@szmarczak/http-timer@4.0.6: - resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==} - engines: {node: '>=10'} + '@szmarczak/http-timer@4.0.6': dependencies: defer-to-connect: 2.0.1 - dev: true - /@types/async-retry@1.4.2: - resolution: {integrity: sha512-GUDuJURF0YiJZ+CBjNQA0+vbP/VHlJbB0sFqkzsV7EcOPRfurVonXpXKAt3w8qIjM1TEzpz6hc6POocPvHOS3w==} + '@types/async-retry@1.4.2': dependencies: '@types/retry': 0.12.5 - dev: true - /@types/cacheable-request@6.0.3: - resolution: {integrity: sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==} + '@types/cacheable-request@6.0.3': dependencies: '@types/http-cache-semantics': 4.0.4 '@types/keyv': 3.1.4 '@types/node': 20.11.26 '@types/responselike': 1.0.3 - dev: true - /@types/ci-info@2.0.0: - resolution: {integrity: sha512-5R2/MHILQLDCzTuhs1j4Qqq8AaKUf7Ma4KSSkCtc12+fMs47zfa34qhto9goxpyX00tQK1zxB885VCiawZ5Qhg==} - dev: true + '@types/ci-info@2.0.0': {} - /@types/cross-spawn@6.0.0: - resolution: {integrity: sha512-evp2ZGsFw9YKprDbg8ySgC9NA15g3YgiI8ANkGmKKvvi0P2aDGYLPxQIC5qfeKNUOe3TjABVGuah6omPRpIYhg==} + '@types/cross-spawn@6.0.0': dependencies: '@types/node': 20.11.26 - dev: true - /@types/fs-extra@11.0.4: - resolution: {integrity: sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==} + '@types/fs-extra@11.0.4': dependencies: '@types/jsonfile': 6.1.4 '@types/node': 20.11.26 - dev: true - /@types/http-cache-semantics@4.0.4: - resolution: {integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==} - dev: true + '@types/http-cache-semantics@4.0.4': {} - /@types/jsonfile@6.1.4: - resolution: {integrity: sha512-D5qGUYwjvnNNextdU59/+fI+spnwtTFmyQP0h+PfIOSkNfpU6AOICUOkm4i0OnSk+NyjdPJrxCDro0sJsWlRpQ==} + '@types/jsonfile@6.1.4': dependencies: '@types/node': 20.11.26 - dev: true - /@types/keyv@3.1.4: - resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} + '@types/keyv@3.1.4': dependencies: '@types/node': 20.11.26 - dev: true - /@types/minimist@1.2.5: - resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==} - dev: true + '@types/minimist@1.2.5': {} - /@types/node@12.20.55: - resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - dev: true + '@types/node@12.20.55': {} - /@types/node@20.11.26: - resolution: {integrity: sha512-YwOMmyhNnAWijOBQweOJnQPl068Oqd4K3OFbTc6AHJwzweUwwWG3GIFY74OKks2PJUDkQPeddOQES9mLn1CTEQ==} + '@types/node@20.11.26': dependencies: undici-types: 5.26.5 - dev: true - /@types/normalize-package-data@2.4.4: - resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} - dev: true + '@types/normalize-package-data@2.4.4': {} - /@types/prompts@2.0.1: - resolution: {integrity: sha512-AhtMcmETelF8wFDV1ucbChKhLgsc+ytXZXkNz/nnTAMSDeqsjALknEFxi7ZtLgS/G8bV2rp90LhDW5SGACimIQ==} - dev: true + '@types/prompts@2.0.1': {} - /@types/responselike@1.0.3: - resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==} + '@types/responselike@1.0.3': dependencies: '@types/node': 20.11.26 - dev: true - /@types/retry@0.12.5: - resolution: {integrity: sha512-3xSjTp3v03X/lSQLkczaN9UIEwJMoMCA1+Nb5HfbJEQWogdeQIyVtTvxPXDQjZ5zws8rFQfVfRdz03ARihPJgw==} - dev: true + '@types/retry@0.12.5': {} - /@types/semver@7.5.8: - resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} - dev: true + '@types/semver@7.5.8': {} - /@types/tar@6.1.5: - resolution: {integrity: sha512-qm2I/RlZij5RofuY7vohTpYNaYcrSQlN2MyjucQc7ZweDwaEWkdN/EeNh6e9zjK6uEm6PwjdMXkcj05BxZdX1Q==} + '@types/tar@6.1.5': dependencies: '@types/node': 20.11.26 minipass: 4.2.8 - dev: true - /@types/validate-npm-package-name@3.0.0: - resolution: {integrity: sha512-iFNNIrEaJH1lbPiyX+O/QyxSbKxrTjdNBVZGckt+iEL9So0hdZNBL68sOfHnt2txuUD8UJXvmKv/1DkgkebgUg==} - dev: true + '@types/validate-npm-package-name@3.0.0': {} - /@ungap/structured-clone@1.2.0: - resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} - dev: true + '@ungap/structured-clone@1.2.0': {} - /@vercel/ncc@0.38.1: - resolution: {integrity: sha512-IBBb+iI2NLu4VQn3Vwldyi2QwaXt5+hTyh58ggAMoCGE6DJmPvwL3KPBWcJl1m9LYPChBLE980Jw+CS4Wokqxw==} - hasBin: true - dev: true + '@vercel/ncc@0.38.1': {} - /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 + acorn-jsx@5.3.2(acorn@8.11.3): dependencies: acorn: 8.11.3 - dev: true - /acorn@8.11.3: - resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} - engines: {node: '>=0.4.0'} - hasBin: true - dev: true + acorn@8.11.3: {} - /ajv-formats@2.1.1(ajv@8.12.0): - resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} - peerDependencies: - ajv: ^8.0.0 - peerDependenciesMeta: - ajv: - optional: true - dependencies: + ajv-formats@2.1.1(ajv@8.12.0): + optionalDependencies: ajv: 8.12.0 - dev: true - /ajv@6.12.6: - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + ajv@6.12.6: 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==} + ajv@8.12.0: 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 - /ansi-colors@4.1.3: - resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} - engines: {node: '>=6'} - dev: true + ansi-colors@4.1.3: {} - /ansi-escapes@5.0.0: - resolution: {integrity: sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA==} - engines: {node: '>=12'} + ansi-escapes@5.0.0: dependencies: type-fest: 1.4.0 - dev: true - /ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - dev: true + ansi-regex@5.0.1: {} - /ansi-regex@6.0.1: - resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} - engines: {node: '>=12'} - dev: true + ansi-regex@6.0.1: {} - /ansi-styles@3.2.1: - resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} - engines: {node: '>=4'} + ansi-styles@3.2.1: dependencies: color-convert: 1.9.3 - dev: true - /ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} + ansi-styles@4.3.0: dependencies: color-convert: 2.0.1 - dev: true - /ansi-styles@6.2.1: - resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} - engines: {node: '>=12'} - dev: true + ansi-styles@6.2.1: {} - /argparse@1.0.10: - resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + argparse@1.0.10: dependencies: sprintf-js: 1.0.3 - dev: true - /argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - dev: true + argparse@2.0.1: {} - /array-buffer-byte-length@1.0.1: - resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} - engines: {node: '>= 0.4'} + array-buffer-byte-length@1.0.1: dependencies: call-bind: 1.0.7 is-array-buffer: 3.0.4 - dev: true - /array-union@2.1.0: - resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} - engines: {node: '>=8'} - dev: true + array-union@2.1.0: {} - /array.prototype.flat@1.3.2: - resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==} - engines: {node: '>= 0.4'} + array.prototype.flat@1.3.2: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.22.5 es-shim-unscopables: 1.0.2 - dev: true - /arraybuffer.prototype.slice@1.0.3: - resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==} - engines: {node: '>= 0.4'} + arraybuffer.prototype.slice@1.0.3: dependencies: array-buffer-byte-length: 1.0.1 call-bind: 1.0.7 @@ -710,87 +2321,52 @@ packages: get-intrinsic: 1.2.4 is-array-buffer: 3.0.4 is-shared-array-buffer: 1.0.3 - dev: true - /arrify@1.0.1: - resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} - engines: {node: '>=0.10.0'} - dev: true + arrify@1.0.1: {} - /async-retry@1.3.1: - resolution: {integrity: sha512-aiieFW/7h3hY0Bq5d+ktDBejxuwR78vRu9hDUdR8rNhSaQ29VzPL4AoIRG7D/c7tdenwOcKvgPM6tIxB3cB6HA==} + async-retry@1.3.1: dependencies: retry: 0.12.0 - dev: true - /async-sema@3.0.1: - resolution: {integrity: sha512-fKT2riE8EHAvJEfLJXZiATQWqZttjx1+tfgnVshCDrH8vlw4YC8aECe0B8MU184g+aVRFVgmfxFlKZKaozSrNw==} - dev: true + async-sema@3.0.1: {} - /atomically@1.7.0: - resolution: {integrity: sha512-Xcz9l0z7y9yQ9rdDaxlmaI4uJHf/T8g9hOEzJcsEqX2SjCj4J20uK7+ldkDHMbpJDK76wF7xEIgxc/vSlsfw5w==} - engines: {node: '>=10.12.0'} - dev: true + atomically@1.7.0: {} - /available-typed-arrays@1.0.7: - resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} - engines: {node: '>= 0.4'} + available-typed-arrays@1.0.7: dependencies: possible-typed-array-names: 1.0.0 - dev: true - /balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - dev: true + balanced-match@1.0.2: {} - /better-path-resolve@1.0.0: - resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} - engines: {node: '>=4'} + better-path-resolve@1.0.0: dependencies: is-windows: 1.0.2 - dev: true - /brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + brace-expansion@1.1.11: dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 - dev: true - /brace-expansion@2.0.1: - resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + brace-expansion@2.0.1: dependencies: balanced-match: 1.0.2 - dev: true - /braces@3.0.2: - resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} - engines: {node: '>=8'} + braces@3.0.2: dependencies: fill-range: 7.0.1 - dev: true - /breakword@1.0.6: - resolution: {integrity: sha512-yjxDAYyK/pBvws9H4xKYpLDpYKEH6CzrBPAuXq3x18I+c/2MkVtT3qAr7Oloi6Dss9qNhPVueAAVU1CSeNDIXw==} + breakword@1.0.6: dependencies: wcwidth: 1.0.1 - dev: true - /builtins@1.0.3: - resolution: {integrity: sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ==} - dev: true + builtins@1.0.3: {} - /cacheable-lookup@2.0.1: - resolution: {integrity: sha512-EMMbsiOTcdngM/K6gV/OxF2x0t07+vMOWxZNSCRQMjO2MY2nhZQ6OYhOOpyQrbhqsgtvKGI7hcq6xjnA92USjg==} - engines: {node: '>=10'} + cacheable-lookup@2.0.1: dependencies: '@types/keyv': 3.1.4 keyv: 4.5.4 - dev: true - /cacheable-request@7.0.4: - resolution: {integrity: sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==} - engines: {node: '>=8'} + cacheable-request@7.0.4: dependencies: clone-response: 1.0.3 get-stream: 5.2.0 @@ -799,151 +2375,89 @@ packages: lowercase-keys: 2.0.0 normalize-url: 6.1.0 responselike: 2.0.1 - dev: true - /call-bind@1.0.7: - resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} - engines: {node: '>= 0.4'} + call-bind@1.0.7: dependencies: es-define-property: 1.0.0 es-errors: 1.3.0 function-bind: 1.1.2 get-intrinsic: 1.2.4 set-function-length: 1.2.2 - dev: true - /callsites@3.1.0: - resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} - engines: {node: '>=6'} - dev: true + callsites@3.1.0: {} - /camelcase-keys@6.2.2: - resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==} - engines: {node: '>=8'} + camelcase-keys@6.2.2: 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@5.3.1: {} - /chalk@2.4.2: - resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} - engines: {node: '>=4'} + chalk@2.4.2: dependencies: ansi-styles: 3.2.1 escape-string-regexp: 1.0.5 supports-color: 5.5.0 - dev: true - /chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} + chalk@4.1.2: 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 + chalk@5.3.0: {} - /chardet@0.7.0: - resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} - dev: true + chardet@0.7.0: {} - /chownr@2.0.0: - resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} - engines: {node: '>=10'} - dev: true + chownr@2.0.0: {} - /ci-info@3.9.0: - resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} - engines: {node: '>=8'} - dev: true + ci-info@3.9.0: {} - /cli-cursor@4.0.0: - resolution: {integrity: sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + ci-info@https://codeload.github.com/watson/ci-info/tar.gz/f43f6a1cefff47fb361c88cf4b943fdbcaafe540: {} + + cli-cursor@4.0.0: dependencies: restore-cursor: 4.0.0 - dev: true - /cli-spinners@2.9.2: - resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} - engines: {node: '>=6'} - dev: true + cli-spinners@2.9.2: {} - /cliui@6.0.0: - resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} + cliui@6.0.0: dependencies: string-width: 4.2.3 strip-ansi: 6.0.1 wrap-ansi: 6.2.0 - dev: true - /cliui@8.0.1: - resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} - engines: {node: '>=12'} + cliui@8.0.1: dependencies: string-width: 4.2.3 strip-ansi: 6.0.1 wrap-ansi: 7.0.0 - dev: true - /clone-response@1.0.3: - resolution: {integrity: sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==} + clone-response@1.0.3: dependencies: mimic-response: 1.0.1 - dev: true - /clone@1.0.4: - resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} - engines: {node: '>=0.8'} - dev: true + clone@1.0.4: {} - /color-convert@1.9.3: - resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + color-convert@1.9.3: dependencies: color-name: 1.1.3 - dev: true - /color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} + color-convert@2.0.1: dependencies: color-name: 1.1.4 - dev: true - /color-name@1.1.3: - resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} - dev: true + color-name@1.1.3: {} - /color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - dev: true + color-name@1.1.4: {} - /commander@2.20.0: - resolution: {integrity: sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==} - dev: true + commander@2.20.0: {} - /commander@9.5.0: - resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} - engines: {node: ^12.20.0 || >=14} - dev: true + commander@9.5.0: {} - /concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - dev: true + concat-map@0.0.1: {} - /conf@10.2.0: - resolution: {integrity: sha512-8fLl9F04EJqjSqH+QjITQfJF8BrOVaYr1jewVgSRAEWePfxT0sku4w2hrGQ60BC/TNLGQ2pgxNlTbWQmMPFvXg==} - engines: {node: '>=12'} + conf@10.2.0: dependencies: ajv: 8.12.0 ajv-formats: 2.1.1(ajv@8.12.0) @@ -955,198 +2469,113 @@ packages: onetime: 5.1.2 pkg-up: 3.1.0 semver: 7.6.0 - dev: true - /cross-spawn@5.1.0: - resolution: {integrity: sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==} + cross-spawn@5.1.0: dependencies: lru-cache: 4.1.5 shebang-command: 1.2.0 which: 1.3.1 - dev: true - /cross-spawn@7.0.3: - resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} - engines: {node: '>= 8'} + cross-spawn@7.0.3: dependencies: path-key: 3.1.1 shebang-command: 2.0.0 which: 2.0.2 - dev: true - /csv-generate@3.4.3: - resolution: {integrity: sha512-w/T+rqR0vwvHqWs/1ZyMDWtHHSJaN06klRqJXBEpDJaM/+dZkso0OKh1VcuuYvK3XM53KysVNq8Ko/epCK8wOw==} - dev: true + csv-generate@3.4.3: {} - /csv-parse@4.16.3: - resolution: {integrity: sha512-cO1I/zmz4w2dcKHVvpCr7JVRu8/FymG5OEpmvsZYlccYolPBLoVGKUHgNoc4ZGkFeFlWGEDmMyBM+TTqRdW/wg==} - dev: true + csv-parse@4.16.3: {} - /csv-stringify@5.6.5: - resolution: {integrity: sha512-PjiQ659aQ+fUTQqSrd1XEDnOr52jh30RBurfzkscaE2tPaFsDH5wOAHJiw8XAHphRknCwMUE9KRayc4K/NbO8A==} - dev: true + csv-stringify@5.6.5: {} - /csv@5.5.3: - resolution: {integrity: sha512-QTaY0XjjhTQOdguARF0lGKm5/mEq9PD9/VhZZegHDIBq2tQwgNpHc3dneD4mGo2iJs+fTKv5Bp0fZ+BRuY3Z0g==} - engines: {node: '>= 0.1.90'} + csv@5.5.3: dependencies: csv-generate: 3.4.3 csv-parse: 4.16.3 csv-stringify: 5.6.5 stream-transform: 2.1.3 - dev: true - /debounce-fn@4.0.0: - resolution: {integrity: sha512-8pYCQiL9Xdcg0UPSD3d+0KMlOjp+KGU5EPwYddgzQ7DATsg4fuUDjQtsYLmWjnk2obnNHgV3vE2Y4jejSOJVBQ==} - engines: {node: '>=10'} + debounce-fn@4.0.0: dependencies: mimic-fn: 3.1.0 - dev: true - /debug@4.3.4: - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true + debug@4.3.4: dependencies: ms: 2.1.2 - dev: true - /decamelize-keys@1.1.1: - resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} - engines: {node: '>=0.10.0'} + decamelize-keys@1.1.1: 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@1.2.0: {} - /decompress-response@5.0.0: - resolution: {integrity: sha512-TLZWWybuxWgoW7Lykv+gq9xvzOsUjQ9tF09Tj6NSTYGMTCHNXzrPnD6Hi+TgZq19PyTAGH4Ll/NIM/eTGglnMw==} - engines: {node: '>=10'} + decompress-response@5.0.0: dependencies: mimic-response: 2.1.0 - dev: true - /deep-extend@0.6.0: - resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} - engines: {node: '>=4.0.0'} - dev: true + deep-extend@0.6.0: {} - /deep-is@0.1.4: - resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - dev: true + deep-is@0.1.4: {} - /defaults@1.0.4: - resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} + defaults@1.0.4: dependencies: clone: 1.0.4 - dev: true - /defer-to-connect@2.0.1: - resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} - engines: {node: '>=10'} - dev: true + defer-to-connect@2.0.1: {} - /define-data-property@1.1.4: - resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} - engines: {node: '>= 0.4'} + define-data-property@1.1.4: dependencies: es-define-property: 1.0.0 es-errors: 1.3.0 gopd: 1.0.1 - dev: true - /define-properties@1.2.1: - resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} - engines: {node: '>= 0.4'} + define-properties@1.2.1: dependencies: define-data-property: 1.1.4 has-property-descriptors: 1.0.2 object-keys: 1.1.1 - dev: true - /detect-indent@6.1.0: - resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} - engines: {node: '>=8'} - dev: true + detect-indent@6.1.0: {} - /dir-glob@3.0.1: - resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} - engines: {node: '>=8'} + dir-glob@3.0.1: dependencies: path-type: 4.0.0 - dev: true - /doctrine@3.0.0: - resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} - engines: {node: '>=6.0.0'} + doctrine@3.0.0: dependencies: esutils: 2.0.3 - dev: true - /dot-prop@6.0.1: - resolution: {integrity: sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==} - engines: {node: '>=10'} + dot-prop@6.0.1: dependencies: is-obj: 2.0.0 - dev: true - /duplexer3@0.1.5: - resolution: {integrity: sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==} - dev: true + duplexer3@0.1.5: {} - /eastasianwidth@0.2.0: - resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - dev: true + eastasianwidth@0.2.0: {} - /emoji-regex@10.3.0: - resolution: {integrity: sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==} - dev: true + emoji-regex@10.3.0: {} - /emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - dev: true + emoji-regex@8.0.0: {} - /emoji-regex@9.2.2: - resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - dev: true + emoji-regex@9.2.2: {} - /end-of-stream@1.4.4: - resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + end-of-stream@1.4.4: dependencies: once: 1.4.0 - dev: true - /enquirer@2.4.1: - resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} - engines: {node: '>=8.6'} + enquirer@2.4.1: dependencies: ansi-colors: 4.1.3 strip-ansi: 6.0.1 - dev: true - /env-paths@2.2.1: - resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} - engines: {node: '>=6'} - dev: true + env-paths@2.2.1: {} - /error-ex@1.3.2: - resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + error-ex@1.3.2: dependencies: is-arrayish: 0.2.1 - dev: true - /es-abstract@1.22.5: - resolution: {integrity: sha512-oW69R+4q2wG+Hc3KZePPZxOiisRIqfKBVo/HLx94QcJeWGU/8sZhCvc829rd1kS366vlJbzBfXf9yWwf0+Ko7w==} - engines: {node: '>= 0.4'} + es-abstract@1.22.5: dependencies: array-buffer-byte-length: 1.0.1 arraybuffer.prototype.slice: 1.0.3 @@ -1189,85 +2618,47 @@ packages: typed-array-length: 1.0.5 unbox-primitive: 1.0.2 which-typed-array: 1.1.15 - dev: true - /es-define-property@1.0.0: - resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} - engines: {node: '>= 0.4'} + es-define-property@1.0.0: dependencies: get-intrinsic: 1.2.4 - dev: true - /es-errors@1.3.0: - resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} - engines: {node: '>= 0.4'} - dev: true + es-errors@1.3.0: {} - /es-set-tostringtag@2.0.3: - resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} - engines: {node: '>= 0.4'} + es-set-tostringtag@2.0.3: dependencies: get-intrinsic: 1.2.4 has-tostringtag: 1.0.2 hasown: 2.0.2 - dev: true - /es-shim-unscopables@1.0.2: - resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} + es-shim-unscopables@1.0.2: dependencies: hasown: 2.0.2 - dev: true - /es-to-primitive@1.2.1: - resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} - engines: {node: '>= 0.4'} + es-to-primitive@1.2.1: dependencies: is-callable: 1.2.7 is-date-object: 1.0.5 is-symbol: 1.0.4 - dev: true - /escalade@3.1.2: - resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} - engines: {node: '>=6'} - dev: true + escalade@3.1.2: {} - /escape-string-regexp@1.0.5: - resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} - engines: {node: '>=0.8.0'} - dev: true + escape-string-regexp@1.0.5: {} - /escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - dev: true + escape-string-regexp@4.0.0: {} - /eslint-config-prettier@8.10.0(eslint@8.57.0): - resolution: {integrity: sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==} - hasBin: true - peerDependencies: - eslint: '>=7.0.0' + eslint-config-prettier@8.10.0(eslint@8.57.0): dependencies: eslint: 8.57.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} + eslint-scope@7.2.2: 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-visitor-keys@3.4.3: {} - /eslint@8.57.0: - resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - hasBin: true + eslint@8.57.0: dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) '@eslint-community/regexpp': 4.10.0 @@ -1309,289 +2700,174 @@ packages: 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} + espree@9.6.1: 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'} - hasBin: true - dev: true + esprima@4.0.1: {} - /esquery@1.5.0: - resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} - engines: {node: '>=0.10'} + esquery@1.5.0: dependencies: estraverse: 5.3.0 - dev: true - /esrecurse@4.3.0: - resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} - engines: {node: '>=4.0'} + esrecurse@4.3.0: dependencies: estraverse: 5.3.0 - dev: true - /estraverse@5.3.0: - resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} - engines: {node: '>=4.0'} - dev: true + estraverse@5.3.0: {} - /esutils@2.0.3: - resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} - engines: {node: '>=0.10.0'} - dev: true + esutils@2.0.3: {} - /extendable-error@0.1.7: - resolution: {integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==} - dev: true + extendable-error@0.1.7: {} - /external-editor@3.1.0: - resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} - engines: {node: '>=4'} + external-editor@3.1.0: dependencies: chardet: 0.7.0 iconv-lite: 0.4.24 tmp: 0.0.33 - dev: true - /fast-deep-equal@3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - dev: true + fast-deep-equal@3.1.3: {} - /fast-glob@3.3.1: - resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} - engines: {node: '>=8.6.0'} + fast-glob@3.3.1: 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 - dev: true - /fast-json-stable-stringify@2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - dev: true + fast-json-stable-stringify@2.1.0: {} - /fast-levenshtein@2.0.6: - resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - dev: true + fast-levenshtein@2.0.6: {} - /fastq@1.17.1: - resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + fastq@1.17.1: dependencies: reusify: 1.0.4 - dev: true - /file-entry-cache@6.0.1: - resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} - engines: {node: ^10.12.0 || >=12.0.0} + file-entry-cache@6.0.1: dependencies: flat-cache: 3.2.0 - dev: true - /fill-range@7.0.1: - resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} - engines: {node: '>=8'} + fill-range@7.0.1: dependencies: to-regex-range: 5.0.1 - dev: true - /find-up@3.0.0: - resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==} - engines: {node: '>=6'} + find-up@3.0.0: dependencies: locate-path: 3.0.0 - dev: true - /find-up@4.1.0: - resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} - engines: {node: '>=8'} + find-up@4.1.0: 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'} + find-up@5.0.0: dependencies: locate-path: 6.0.0 path-exists: 4.0.0 - dev: true - /find-yarn-workspace-root2@1.2.16: - resolution: {integrity: sha512-hr6hb1w8ePMpPVUK39S4RlwJzi+xPLuVuG8XlwXU3KD5Yn3qgBWVfy3AzNlDhWvE1EORCE65/Qm26rFQt3VLVA==} + find-yarn-workspace-root2@1.2.16: dependencies: micromatch: 4.0.5 pkg-dir: 4.2.0 - dev: true - /flat-cache@3.2.0: - resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} - engines: {node: ^10.12.0 || >=12.0.0} + flat-cache@3.2.0: dependencies: flatted: 3.3.1 keyv: 4.5.4 rimraf: 3.0.2 - dev: true - /flatted@3.3.1: - resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} - dev: true + flatted@3.3.1: {} - /for-each@0.3.3: - resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + for-each@0.3.3: 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'} + foreground-child@3.1.1: dependencies: cross-spawn: 7.0.3 signal-exit: 4.1.0 - dev: true - /fs-extra@11.2.0: - resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==} - engines: {node: '>=14.14'} + fs-extra@11.2.0: dependencies: graceful-fs: 4.2.11 jsonfile: 6.1.0 universalify: 2.0.1 - dev: true - /fs-extra@7.0.1: - resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} - engines: {node: '>=6 <7 || >=8'} + fs-extra@7.0.1: dependencies: graceful-fs: 4.2.11 jsonfile: 4.0.0 universalify: 0.1.2 - dev: true - /fs-extra@8.1.0: - resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} - engines: {node: '>=6 <7 || >=8'} + fs-extra@8.1.0: dependencies: graceful-fs: 4.2.11 jsonfile: 4.0.0 universalify: 0.1.2 - dev: true - /fs-minipass@2.1.0: - resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} - engines: {node: '>= 8'} + fs-minipass@2.1.0: dependencies: minipass: 3.3.6 - dev: true - /fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - dev: true + fs.realpath@1.0.0: {} - /fsevents@2.3.2: - resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - requiresBuild: true - dev: true + fsevents@2.3.2: optional: true - /function-bind@1.1.2: - resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - dev: true + function-bind@1.1.2: {} - /function.prototype.name@1.1.6: - resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} - engines: {node: '>= 0.4'} + function.prototype.name@1.1.6: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.22.5 functions-have-names: 1.2.3 - dev: true - /functions-have-names@1.2.3: - resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} - dev: true + functions-have-names@1.2.3: {} - /get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} - dev: true + get-caller-file@2.0.5: {} - /get-east-asian-width@1.2.0: - resolution: {integrity: sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==} - engines: {node: '>=18'} - dev: true + get-east-asian-width@1.2.0: {} - /get-intrinsic@1.2.4: - resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} - engines: {node: '>= 0.4'} + get-intrinsic@1.2.4: dependencies: es-errors: 1.3.0 function-bind: 1.1.2 has-proto: 1.0.3 has-symbols: 1.0.3 hasown: 2.0.2 - dev: true - /get-stream@5.2.0: - resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} - engines: {node: '>=8'} + get-stream@5.2.0: dependencies: pump: 3.0.0 - dev: true - /get-symbol-description@1.0.2: - resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} - engines: {node: '>= 0.4'} + get-symbol-description@1.0.2: dependencies: call-bind: 1.0.7 es-errors: 1.3.0 get-intrinsic: 1.2.4 - dev: true - /glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} + glob-parent@5.1.2: dependencies: is-glob: 4.0.3 - dev: true - /glob-parent@6.0.2: - resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} - engines: {node: '>=10.13.0'} + glob-parent@6.0.2: dependencies: is-glob: 4.0.3 - dev: true - /glob@10.3.10: - resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==} - engines: {node: '>=16 || 14 >=14.17'} - hasBin: true + glob@10.3.10: 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.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + glob@7.2.3: dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 @@ -1599,25 +2875,16 @@ packages: minimatch: 3.1.2 once: 1.4.0 path-is-absolute: 1.0.1 - dev: true - /globals@13.24.0: - resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} - engines: {node: '>=8'} + globals@13.24.0: dependencies: type-fest: 0.20.2 - dev: true - /globalthis@1.0.3: - resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} - engines: {node: '>= 0.4'} + globalthis@1.0.3: dependencies: define-properties: 1.2.1 - dev: true - /globby@11.1.0: - resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} - engines: {node: '>=10'} + globby@11.1.0: dependencies: array-union: 2.1.0 dir-glob: 3.0.1 @@ -1625,17 +2892,12 @@ packages: ignore: 5.3.1 merge2: 1.4.1 slash: 3.0.0 - dev: true - /gopd@1.0.1: - resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + gopd@1.0.1: dependencies: get-intrinsic: 1.2.4 - dev: true - /got@10.7.0: - resolution: {integrity: sha512-aWTDeNw9g+XqEZNcTjMMZSy7B7yE9toWOFYip7ofFTLleJhvZwUxxTxkTpKvF+p1SAA4VHmuEy7PiHTHyq8tJg==} - engines: {node: '>=10'} + got@10.7.0: dependencies: '@sindresorhus/is': 2.1.1 '@szmarczak/http-timer': 4.0.6 @@ -1654,495 +2916,267 @@ packages: responselike: 2.0.1 to-readable-stream: 2.1.0 type-fest: 0.10.0 - dev: true - /graceful-fs@4.2.11: - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - dev: true + graceful-fs@4.2.11: {} - /grapheme-splitter@1.0.4: - resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} - dev: true + grapheme-splitter@1.0.4: {} - /graphemer@1.4.0: - resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - dev: true + graphemer@1.4.0: {} - /hard-rejection@2.1.0: - resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} - engines: {node: '>=6'} - dev: true + hard-rejection@2.1.0: {} - /has-bigints@1.0.2: - resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} - dev: true + has-bigints@1.0.2: {} - /has-flag@3.0.0: - resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} - engines: {node: '>=4'} - dev: true + has-flag@3.0.0: {} - /has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - dev: true + has-flag@4.0.0: {} - /has-property-descriptors@1.0.2: - resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + has-property-descriptors@1.0.2: dependencies: es-define-property: 1.0.0 - dev: true - /has-proto@1.0.3: - resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} - engines: {node: '>= 0.4'} - dev: true + has-proto@1.0.3: {} - /has-symbols@1.0.3: - resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} - engines: {node: '>= 0.4'} - dev: true + has-symbols@1.0.3: {} - /has-tostringtag@1.0.2: - resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} - engines: {node: '>= 0.4'} + has-tostringtag@1.0.2: dependencies: has-symbols: 1.0.3 - dev: true - /hasown@2.0.2: - resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} - engines: {node: '>= 0.4'} + hasown@2.0.2: dependencies: function-bind: 1.1.2 - dev: true - /hosted-git-info@2.8.9: - resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} - dev: true + hosted-git-info@2.8.9: {} - /http-cache-semantics@4.1.1: - resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} - dev: true + http-cache-semantics@4.1.1: {} - /human-id@1.0.2: - resolution: {integrity: sha512-UNopramDEhHJD+VR+ehk8rOslwSfByxPIZyJRfV739NDhN5LF1fa1MqnzKm2lGTQRjNrjK19Q5fhkgIfjlVUKw==} - dev: true + human-id@1.0.2: {} - /husky@9.0.11: - resolution: {integrity: sha512-AB6lFlbwwyIqMdHYhwPe+kjOC3Oc5P3nThEoW/AaO2BX3vJDjWPFxYLxokUZOo6RNX20He3AaT8sESs9NJcmEw==} - engines: {node: '>=18'} - hasBin: true - dev: true + husky@9.0.11: {} - /iconv-lite@0.4.24: - resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} - engines: {node: '>=0.10.0'} + iconv-lite@0.4.24: dependencies: safer-buffer: 2.1.2 - dev: true - /ignore@5.3.1: - resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} - engines: {node: '>= 4'} - dev: true + ignore@5.3.1: {} - /import-fresh@3.3.0: - resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} - engines: {node: '>=6'} + import-fresh@3.3.0: dependencies: parent-module: 1.0.1 resolve-from: 4.0.0 - dev: true - /imurmurhash@0.1.4: - resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} - engines: {node: '>=0.8.19'} - dev: true + imurmurhash@0.1.4: {} - /indent-string@4.0.0: - resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} - engines: {node: '>=8'} - dev: true + indent-string@4.0.0: {} - /inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + inflight@1.0.6: dependencies: once: 1.4.0 wrappy: 1.0.2 - dev: true - /inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - dev: true + inherits@2.0.4: {} - /ini@1.3.8: - resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} - dev: true + ini@1.3.8: {} - /internal-slot@1.0.7: - resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} - engines: {node: '>= 0.4'} + internal-slot@1.0.7: dependencies: es-errors: 1.3.0 hasown: 2.0.2 side-channel: 1.0.6 - dev: true - /is-array-buffer@3.0.4: - resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} - engines: {node: '>= 0.4'} + is-array-buffer@3.0.4: dependencies: call-bind: 1.0.7 get-intrinsic: 1.2.4 - dev: true - /is-arrayish@0.2.1: - resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} - dev: true + is-arrayish@0.2.1: {} - /is-bigint@1.0.4: - resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} + is-bigint@1.0.4: dependencies: has-bigints: 1.0.2 - dev: true - /is-boolean-object@1.1.2: - resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} - engines: {node: '>= 0.4'} + is-boolean-object@1.1.2: dependencies: call-bind: 1.0.7 has-tostringtag: 1.0.2 - dev: true - /is-callable@1.2.7: - resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} - engines: {node: '>= 0.4'} - dev: true + is-callable@1.2.7: {} - /is-core-module@2.13.1: - resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} + is-core-module@2.13.1: dependencies: hasown: 2.0.2 - dev: true - /is-date-object@1.0.5: - resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} - engines: {node: '>= 0.4'} + is-date-object@1.0.5: dependencies: has-tostringtag: 1.0.2 - dev: true - /is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - dev: true + is-extglob@2.1.1: {} - /is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - dev: true + is-fullwidth-code-point@3.0.0: {} - /is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} + is-glob@4.0.3: dependencies: is-extglob: 2.1.1 - dev: true - /is-interactive@2.0.0: - resolution: {integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==} - engines: {node: '>=12'} - dev: true + is-interactive@2.0.0: {} - /is-negative-zero@2.0.3: - resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} - engines: {node: '>= 0.4'} - dev: true + is-negative-zero@2.0.3: {} - /is-number-object@1.0.7: - resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} - engines: {node: '>= 0.4'} + is-number-object@1.0.7: dependencies: has-tostringtag: 1.0.2 - dev: true - /is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - dev: true + is-number@7.0.0: {} - /is-obj@2.0.0: - resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} - engines: {node: '>=8'} - dev: true + is-obj@2.0.0: {} - /is-path-inside@3.0.3: - resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} - engines: {node: '>=8'} - dev: true + is-path-inside@3.0.3: {} - /is-plain-obj@1.1.0: - resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} - engines: {node: '>=0.10.0'} - dev: true + is-plain-obj@1.1.0: {} - /is-regex@1.1.4: - resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} - engines: {node: '>= 0.4'} + is-regex@1.1.4: dependencies: call-bind: 1.0.7 has-tostringtag: 1.0.2 - dev: true - /is-shared-array-buffer@1.0.3: - resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} - engines: {node: '>= 0.4'} + is-shared-array-buffer@1.0.3: dependencies: call-bind: 1.0.7 - dev: true - /is-string@1.0.7: - resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} - engines: {node: '>= 0.4'} + is-string@1.0.7: dependencies: has-tostringtag: 1.0.2 - dev: true - /is-subdir@1.2.0: - resolution: {integrity: sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==} - engines: {node: '>=4'} + is-subdir@1.2.0: dependencies: better-path-resolve: 1.0.0 - dev: true - /is-symbol@1.0.4: - resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} - engines: {node: '>= 0.4'} + is-symbol@1.0.4: dependencies: has-symbols: 1.0.3 - dev: true - /is-typed-array@1.1.13: - resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} - engines: {node: '>= 0.4'} + is-typed-array@1.1.13: dependencies: which-typed-array: 1.1.15 - dev: true - /is-unicode-supported@1.3.0: - resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==} - engines: {node: '>=12'} - dev: true + is-unicode-supported@1.3.0: {} - /is-unicode-supported@2.0.0: - resolution: {integrity: sha512-FRdAyx5lusK1iHG0TWpVtk9+1i+GjrzRffhDg4ovQ7mcidMQ6mj+MhKPmvh7Xwyv5gIS06ns49CA7Sqg7lC22Q==} - engines: {node: '>=18'} - dev: true + is-unicode-supported@2.0.0: {} - /is-weakref@1.0.2: - resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} + is-weakref@1.0.2: dependencies: call-bind: 1.0.7 - dev: true - /is-windows@1.0.2: - resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} - engines: {node: '>=0.10.0'} - dev: true + is-windows@1.0.2: {} - /isarray@2.0.5: - resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} - dev: true + isarray@2.0.5: {} - /isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - dev: true + isexe@2.0.0: {} - /jackspeak@2.3.6: - resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} - engines: {node: '>=14'} + jackspeak@2.3.6: dependencies: '@isaacs/cliui': 8.0.2 optionalDependencies: '@pkgjs/parseargs': 0.11.0 - dev: true - /js-tokens@4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - dev: true + js-tokens@4.0.0: {} - /js-yaml@3.14.1: - resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} - hasBin: true + js-yaml@3.14.1: dependencies: argparse: 1.0.10 esprima: 4.0.1 - dev: true - /js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true + js-yaml@4.1.0: dependencies: argparse: 2.0.1 - dev: true - /json-buffer@3.0.1: - resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} - dev: true + json-buffer@3.0.1: {} - /json-parse-even-better-errors@2.3.1: - resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} - dev: true + json-parse-even-better-errors@2.3.1: {} - /json-schema-traverse@0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - dev: true + json-schema-traverse@0.4.1: {} - /json-schema-traverse@1.0.0: - resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} - dev: true + json-schema-traverse@1.0.0: {} - /json-schema-typed@7.0.3: - resolution: {integrity: sha512-7DE8mpG+/fVw+dTpjbxnx47TaMnDfOI1jwft9g1VybltZCduyRQPJPvc+zzKY9WPHxhPWczyFuYa6I8Mw4iU5A==} - dev: true + json-schema-typed@7.0.3: {} - /json-stable-stringify-without-jsonify@1.0.1: - resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - dev: true + json-stable-stringify-without-jsonify@1.0.1: {} - /jsonfile@4.0.0: - resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + jsonfile@4.0.0: optionalDependencies: graceful-fs: 4.2.11 - dev: true - /jsonfile@6.1.0: - resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + jsonfile@6.1.0: dependencies: universalify: 2.0.1 optionalDependencies: graceful-fs: 4.2.11 - dev: true - /keyv@4.5.4: - resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + keyv@4.5.4: dependencies: json-buffer: 3.0.1 - dev: true - /kind-of@6.0.3: - resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} - engines: {node: '>=0.10.0'} - dev: true + kind-of@6.0.3: {} - /kleur@3.0.3: - resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} - engines: {node: '>=6'} - dev: true + kleur@3.0.3: {} - /kleur@4.1.5: - resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} - engines: {node: '>=6'} - dev: true + kleur@4.1.5: {} - /levn@0.4.1: - resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} - engines: {node: '>= 0.8.0'} + levn@0.4.1: dependencies: prelude-ls: 1.2.1 type-check: 0.4.0 - dev: true - /lines-and-columns@1.2.4: - resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - dev: true + lines-and-columns@1.2.4: {} - /load-yaml-file@0.2.0: - resolution: {integrity: sha512-OfCBkGEw4nN6JLtgRidPX6QxjBQGQf72q3si2uvqyFEMbycSFFHwAZeXx6cJgFM9wmLrf9zBwCP3Ivqa+LLZPw==} - engines: {node: '>=6'} + load-yaml-file@0.2.0: dependencies: graceful-fs: 4.2.11 js-yaml: 3.14.1 pify: 4.0.1 strip-bom: 3.0.0 - dev: true - /locate-path@3.0.0: - resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==} - engines: {node: '>=6'} + locate-path@3.0.0: dependencies: p-locate: 3.0.0 path-exists: 3.0.0 - dev: true - /locate-path@5.0.0: - resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} - engines: {node: '>=8'} + locate-path@5.0.0: dependencies: p-locate: 4.1.0 - dev: true - /locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} + locate-path@6.0.0: dependencies: p-locate: 5.0.0 - dev: true - /lodash.merge@4.6.2: - resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - dev: true + lodash.merge@4.6.2: {} - /lodash.startcase@4.4.0: - resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} - dev: true + lodash.startcase@4.4.0: {} - /log-symbols@6.0.0: - resolution: {integrity: sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==} - engines: {node: '>=18'} + log-symbols@6.0.0: dependencies: chalk: 5.3.0 is-unicode-supported: 1.3.0 - dev: true - /lowercase-keys@2.0.0: - resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==} - engines: {node: '>=8'} - dev: true + lowercase-keys@2.0.0: {} - /lru-cache@10.2.0: - resolution: {integrity: sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==} - engines: {node: 14 || >=16.14} - dev: true + lru-cache@10.2.0: {} - /lru-cache@4.1.5: - resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} + lru-cache@4.1.5: dependencies: pseudomap: 1.0.2 yallist: 2.1.2 - dev: true - /lru-cache@6.0.0: - resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} - engines: {node: '>=10'} + lru-cache@6.0.0: dependencies: yallist: 4.0.0 - dev: true - /map-obj@1.0.1: - resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} - engines: {node: '>=0.10.0'} - dev: true + map-obj@1.0.1: {} - /map-obj@4.3.0: - resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} - engines: {node: '>=8'} - dev: true + map-obj@4.3.0: {} - /meow@6.1.1: - resolution: {integrity: sha512-3YffViIt2QWgTy6Pale5QpopX/IvU3LPL03jOTqp6pGj3VjesdO/U8CuHMKpnQr4shCNCM5fd5XFFvIIl6JBHg==} - engines: {node: '>=8'} + meow@6.1.1: dependencies: '@types/minimist': 1.2.5 camelcase-keys: 6.2.2 @@ -2155,170 +3189,96 @@ packages: trim-newlines: 3.0.1 type-fest: 0.13.1 yargs-parser: 18.1.3 - dev: true - /merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} - dev: true + merge2@1.4.1: {} - /micromatch@4.0.5: - resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} - engines: {node: '>=8.6'} + micromatch@4.0.5: dependencies: braces: 3.0.2 picomatch: 2.3.1 - dev: true - /mimic-fn@2.1.0: - resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} - engines: {node: '>=6'} - dev: true + mimic-fn@2.1.0: {} - /mimic-fn@3.1.0: - resolution: {integrity: sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ==} - engines: {node: '>=8'} - dev: true + mimic-fn@3.1.0: {} - /mimic-response@1.0.1: - resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==} - engines: {node: '>=4'} - dev: true + mimic-response@1.0.1: {} - /mimic-response@2.1.0: - resolution: {integrity: sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==} - engines: {node: '>=8'} - dev: true + mimic-response@2.1.0: {} - /min-indent@1.0.1: - resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} - engines: {node: '>=4'} - dev: true + min-indent@1.0.1: {} - /minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + minimatch@3.1.2: dependencies: brace-expansion: 1.1.11 - dev: true - /minimatch@9.0.3: - resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} - engines: {node: '>=16 || 14 >=14.17'} + minimatch@9.0.3: dependencies: brace-expansion: 2.0.1 - dev: true - /minimist-options@4.1.0: - resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} - engines: {node: '>= 6'} + minimist-options@4.1.0: 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 + minimist@1.2.8: {} - /minipass@3.3.6: - resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} - engines: {node: '>=8'} + minipass@3.3.6: dependencies: yallist: 4.0.0 - dev: true - /minipass@4.2.8: - resolution: {integrity: sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==} - engines: {node: '>=8'} - dev: true + minipass@4.2.8: {} - /minipass@5.0.0: - resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} - engines: {node: '>=8'} - dev: true + minipass@5.0.0: {} - /minipass@7.0.4: - resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} - engines: {node: '>=16 || 14 >=14.17'} - dev: true + minipass@7.0.4: {} - /minizlib@2.1.2: - resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} - engines: {node: '>= 8'} + minizlib@2.1.2: dependencies: minipass: 3.3.6 yallist: 4.0.0 - dev: true - /mixme@0.5.10: - resolution: {integrity: sha512-5H76ANWinB1H3twpJ6JY8uvAtpmFvHNArpilJAjXRKXSDDLPIMoZArw5SH0q9z+lLs8IrMw7Q2VWpWimFKFT1Q==} - engines: {node: '>= 8.0.0'} - dev: true + mixme@0.5.10: {} - /mkdirp@1.0.4: - resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} - engines: {node: '>=10'} - hasBin: true - dev: true + mkdirp@1.0.4: {} - /ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - dev: true + ms@2.1.2: {} - /natural-compare@1.4.0: - resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - dev: true + natural-compare@1.4.0: {} - /normalize-package-data@2.5.0: - resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} + normalize-package-data@2.5.0: 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-url@6.1.0: - resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==} - engines: {node: '>=10'} - dev: true + normalize-url@6.1.0: {} - /object-inspect@1.13.1: - resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} - dev: true + object-inspect@1.13.1: {} - /object-keys@1.1.1: - resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} - engines: {node: '>= 0.4'} - dev: true + object-keys@1.1.1: {} - /object.assign@4.1.5: - resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} - engines: {node: '>= 0.4'} + object.assign@4.1.5: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 has-symbols: 1.0.3 object-keys: 1.1.1 - dev: true - /once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + ollama@0.5.0: + dependencies: + whatwg-fetch: 3.6.20 + + once@1.4.0: dependencies: wrappy: 1.0.2 - dev: true - /onetime@5.1.2: - resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} - engines: {node: '>=6'} + onetime@5.1.2: dependencies: mimic-fn: 2.1.0 - dev: true - /optionator@0.9.3: - resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} - engines: {node: '>= 0.8.0'} + optionator@0.9.3: dependencies: '@aashutoshrathi/word-wrap': 1.2.6 deep-is: 0.1.4 @@ -2326,11 +3286,8 @@ packages: levn: 0.4.1 prelude-ls: 1.2.1 type-check: 0.4.0 - dev: true - /ora@8.0.1: - resolution: {integrity: sha512-ANIvzobt1rls2BDny5fWZ3ZVKyD6nscLvfFRpQgfWsythlcsVUC9kL0zq6j2Z5z9wwp1kd7wpsD/T9qNPVLCaQ==} - engines: {node: '>=18'} + ora@8.0.1: dependencies: chalk: 5.3.0 cli-cursor: 4.0.0 @@ -2341,473 +3298,256 @@ packages: stdin-discarder: 0.2.2 string-width: 7.1.0 strip-ansi: 7.1.0 - dev: true - /os-tmpdir@1.0.2: - resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} - engines: {node: '>=0.10.0'} - dev: true + os-tmpdir@1.0.2: {} - /outdent@0.5.0: - resolution: {integrity: sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==} - dev: true + outdent@0.5.0: {} - /p-cancelable@2.1.1: - resolution: {integrity: sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==} - engines: {node: '>=8'} - dev: true + p-cancelable@2.1.1: {} - /p-event@4.2.0: - resolution: {integrity: sha512-KXatOjCRXXkSePPb1Nbi0p0m+gQAwdlbhi4wQKJPI1HsMQS9g+Sqp2o+QHziPr7eYJyOZet836KoHEVM1mwOrQ==} - engines: {node: '>=8'} + p-event@4.2.0: dependencies: p-timeout: 3.2.0 - dev: true - /p-filter@2.1.0: - resolution: {integrity: sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==} - engines: {node: '>=8'} + p-filter@2.1.0: dependencies: p-map: 2.1.0 - dev: true - /p-finally@1.0.0: - resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} - engines: {node: '>=4'} - dev: true + p-finally@1.0.0: {} - /p-limit@2.3.0: - resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} - engines: {node: '>=6'} + p-limit@2.3.0: dependencies: p-try: 2.2.0 - dev: true - /p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} + p-limit@3.1.0: dependencies: yocto-queue: 0.1.0 - dev: true - /p-locate@3.0.0: - resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==} - engines: {node: '>=6'} + p-locate@3.0.0: dependencies: p-limit: 2.3.0 - dev: true - /p-locate@4.1.0: - resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} - engines: {node: '>=8'} + p-locate@4.1.0: 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'} + p-locate@5.0.0: dependencies: p-limit: 3.1.0 - dev: true - /p-map@2.1.0: - resolution: {integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==} - engines: {node: '>=6'} - dev: true + p-map@2.1.0: {} - /p-timeout@3.2.0: - resolution: {integrity: sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==} - engines: {node: '>=8'} + p-timeout@3.2.0: dependencies: p-finally: 1.0.0 - dev: true - /p-try@2.2.0: - resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} - engines: {node: '>=6'} - dev: true + p-try@2.2.0: {} - /parent-module@1.0.1: - resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} - engines: {node: '>=6'} + parent-module@1.0.1: dependencies: callsites: 3.1.0 - dev: true - /parse-json@5.2.0: - resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} - engines: {node: '>=8'} + parse-json@5.2.0: 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 - /path-exists@3.0.0: - resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} - engines: {node: '>=4'} - dev: true + path-exists@3.0.0: {} - /path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - dev: true + path-exists@4.0.0: {} - /path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - dev: true + path-is-absolute@1.0.1: {} - /path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} - dev: true + path-key@3.1.1: {} - /path-parse@1.0.7: - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - dev: true + path-parse@1.0.7: {} - /path-scurry@1.10.1: - resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} - engines: {node: '>=16 || 14 >=14.17'} + path-scurry@1.10.1: dependencies: lru-cache: 10.2.0 minipass: 7.0.4 - dev: true - /path-type@4.0.0: - resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} - engines: {node: '>=8'} - dev: true - - /picocolors@1.0.0: - resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} - dev: true + path-type@4.0.0: {} - /picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} - dev: true + picocolors@1.0.0: {} - /pify@4.0.1: - resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} - engines: {node: '>=6'} - dev: true + picomatch@2.3.1: {} - /pkg-dir@4.2.0: - resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} - engines: {node: '>=8'} + pify@4.0.1: {} + + pkg-dir@4.2.0: dependencies: find-up: 4.1.0 - dev: true - /pkg-up@3.1.0: - resolution: {integrity: sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==} - engines: {node: '>=8'} + pkg-up@3.1.0: dependencies: find-up: 3.0.0 - dev: true - /playwright-core@1.42.1: - resolution: {integrity: sha512-mxz6zclokgrke9p1vtdy/COWBH+eOZgYUVVU34C73M+4j4HLlQJHtfcqiqqxpP0o8HhMkflvfbquLX5dg6wlfA==} - engines: {node: '>=16'} - hasBin: true - dev: true + playwright-core@1.42.1: {} - /playwright@1.42.1: - resolution: {integrity: sha512-PgwB03s2DZBcNRoW+1w9E+VkLBxweib6KTXM0M3tkiT4jVxKSi6PmVJ591J+0u10LUrgxB7dLRbiJqO5s2QPMg==} - engines: {node: '>=16'} - hasBin: true + playwright@1.42.1: dependencies: playwright-core: 1.42.1 optionalDependencies: fsevents: 2.3.2 - dev: true - /possible-typed-array-names@1.0.0: - resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} - engines: {node: '>= 0.4'} - dev: true + possible-typed-array-names@1.0.0: {} - /preferred-pm@3.1.3: - resolution: {integrity: sha512-MkXsENfftWSRpzCzImcp4FRsCc3y1opwB73CfCNWyzMqArju2CrlMHlqB7VexKiPEOjGMbttv1r9fSCn5S610w==} - engines: {node: '>=10'} + preferred-pm@3.1.3: dependencies: find-up: 5.0.0 find-yarn-workspace-root2: 1.2.16 path-exists: 4.0.0 which-pm: 2.0.0 - dev: true - /prelude-ls@1.2.1: - resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} - engines: {node: '>= 0.8.0'} - dev: true + prelude-ls@1.2.1: {} - /prettier-plugin-organize-imports@3.2.4(prettier@3.2.5)(typescript@5.4.2): - resolution: {integrity: sha512-6m8WBhIp0dfwu0SkgfOxJqh+HpdyfqSSLfKKRZSFbDuEQXDDndb8fTpRWkUrX/uBenkex3MgnVk0J3b3Y5byog==} - peerDependencies: - '@volar/vue-language-plugin-pug': ^1.0.4 - '@volar/vue-typescript': ^1.0.4 - prettier: '>=2.0' - typescript: '>=2.9' - peerDependenciesMeta: - '@volar/vue-language-plugin-pug': - optional: true - '@volar/vue-typescript': - optional: true + prettier-plugin-organize-imports@3.2.4(prettier@3.2.5)(typescript@5.4.2): dependencies: prettier: 3.2.5 typescript: 5.4.2 - dev: true - /prettier@2.8.8: - resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} - engines: {node: '>=10.13.0'} - hasBin: true - dev: true + prettier@2.8.8: {} - /prettier@3.2.5: - resolution: {integrity: sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==} - engines: {node: '>=14'} - hasBin: true - dev: true + prettier@3.2.5: {} - /prompts@2.1.0: - resolution: {integrity: sha512-+x5TozgqYdOwWsQFZizE/Tra3fKvAoy037kOyU6cgz84n8f6zxngLOV4O32kTwt9FcLCxAqw0P/c8rOr9y+Gfg==} - engines: {node: '>= 6'} + prompts@2.1.0: dependencies: kleur: 3.0.3 sisteransi: 1.0.5 - dev: true - /pseudomap@1.0.2: - resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} - dev: true + pseudomap@1.0.2: {} - /pump@3.0.0: - resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} + pump@3.0.0: dependencies: end-of-stream: 1.4.4 once: 1.4.0 - dev: true - /punycode@2.3.1: - resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} - engines: {node: '>=6'} - dev: true + punycode@2.3.1: {} - /queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - dev: true + queue-microtask@1.2.3: {} - /quick-lru@4.0.1: - resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} - engines: {node: '>=8'} - dev: true + quick-lru@4.0.1: {} - /rc@1.2.8: - resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} - hasBin: true + rc@1.2.8: dependencies: deep-extend: 0.6.0 ini: 1.3.8 minimist: 1.2.8 strip-json-comments: 2.0.1 - dev: true - /read-pkg-up@7.0.1: - resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} - engines: {node: '>=8'} + read-pkg-up@7.0.1: 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'} + read-pkg@5.2.0: 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-yaml-file@1.1.0: - resolution: {integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==} - engines: {node: '>=6'} + read-yaml-file@1.1.0: dependencies: graceful-fs: 4.2.11 js-yaml: 3.14.1 pify: 4.0.1 strip-bom: 3.0.0 - dev: true - /redent@3.0.0: - resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} - engines: {node: '>=8'} + redent@3.0.0: dependencies: indent-string: 4.0.0 strip-indent: 3.0.0 - dev: true - /regenerator-runtime@0.14.1: - resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} - dev: true + regenerator-runtime@0.14.1: {} - /regexp.prototype.flags@1.5.2: - resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==} - engines: {node: '>= 0.4'} + regexp.prototype.flags@1.5.2: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-errors: 1.3.0 set-function-name: 2.0.2 - dev: true - /registry-auth-token@3.3.2: - resolution: {integrity: sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==} + registry-auth-token@3.3.2: dependencies: rc: 1.2.8 safe-buffer: 5.2.1 - dev: true - /registry-url@3.1.0: - resolution: {integrity: sha512-ZbgR5aZEdf4UKZVBPYIgaglBmSF2Hi94s2PcIHhRGFjKYu+chjJdYfHn4rt3hB6eCKLJ8giVIIfgMa1ehDfZKA==} - engines: {node: '>=0.10.0'} + registry-url@3.1.0: dependencies: rc: 1.2.8 - 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-directory@2.1.1: {} - /require-from-string@2.0.2: - resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} - engines: {node: '>=0.10.0'} - dev: true + require-from-string@2.0.2: {} - /require-main-filename@2.0.0: - resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} - dev: true + require-main-filename@2.0.0: {} - /resolve-from@4.0.0: - resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} - engines: {node: '>=4'} - dev: true + resolve-from@4.0.0: {} - /resolve-from@5.0.0: - resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} - engines: {node: '>=8'} - dev: true + resolve-from@5.0.0: {} - /resolve@1.22.8: - resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} - hasBin: true + resolve@1.22.8: dependencies: is-core-module: 2.13.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - dev: true - /responselike@2.0.1: - resolution: {integrity: sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==} + responselike@2.0.1: dependencies: lowercase-keys: 2.0.0 - dev: true - /restore-cursor@4.0.0: - resolution: {integrity: sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + restore-cursor@4.0.0: dependencies: onetime: 5.1.2 signal-exit: 3.0.7 - dev: true - /retry@0.12.0: - resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} - engines: {node: '>= 4'} - dev: true + retry@0.12.0: {} - /reusify@1.0.4: - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - dev: true + reusify@1.0.4: {} - /rimraf@3.0.2: - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} - hasBin: true + rimraf@3.0.2: dependencies: glob: 7.2.3 - dev: true - /rimraf@5.0.5: - resolution: {integrity: sha512-CqDakW+hMe/Bz202FPEymy68P+G50RfMQK+Qo5YUqc9SPipvbGjCGKd0RSKEelbsfQuw3g5NZDSrlZZAJurH1A==} - engines: {node: '>=14'} - hasBin: true + rimraf@5.0.5: dependencies: glob: 10.3.10 - dev: true - /run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 - dev: true - /safe-array-concat@1.1.2: - resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} - engines: {node: '>=0.4'} + safe-array-concat@1.1.2: dependencies: call-bind: 1.0.7 get-intrinsic: 1.2.4 has-symbols: 1.0.3 isarray: 2.0.5 - dev: true - /safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - dev: true + safe-buffer@5.2.1: {} - /safe-regex-test@1.0.3: - resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} - engines: {node: '>= 0.4'} + safe-regex-test@1.0.3: dependencies: call-bind: 1.0.7 es-errors: 1.3.0 is-regex: 1.1.4 - dev: true - /safer-buffer@2.1.2: - resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - dev: true + safer-buffer@2.1.2: {} - /semver@5.7.2: - resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} - hasBin: true - dev: true + semver@5.7.2: {} - /semver@7.6.0: - resolution: {integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==} - engines: {node: '>=10'} - hasBin: true + semver@7.6.0: dependencies: lru-cache: 6.0.0 - dev: true - /set-blocking@2.0.0: - resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} - dev: true + set-blocking@2.0.0: {} - /set-function-length@1.2.2: - resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} - engines: {node: '>= 0.4'} + set-function-length@1.2.2: dependencies: define-data-property: 1.1.4 es-errors: 1.3.0 @@ -2815,74 +3555,42 @@ packages: get-intrinsic: 1.2.4 gopd: 1.0.1 has-property-descriptors: 1.0.2 - dev: true - /set-function-name@2.0.2: - resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} - engines: {node: '>= 0.4'} + set-function-name@2.0.2: dependencies: define-data-property: 1.1.4 es-errors: 1.3.0 functions-have-names: 1.2.3 has-property-descriptors: 1.0.2 - dev: true - /shebang-command@1.2.0: - resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} - engines: {node: '>=0.10.0'} + shebang-command@1.2.0: dependencies: shebang-regex: 1.0.0 - dev: true - /shebang-command@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} + shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 - dev: true - /shebang-regex@1.0.0: - resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} - engines: {node: '>=0.10.0'} - dev: true + shebang-regex@1.0.0: {} - /shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} - dev: true + shebang-regex@3.0.0: {} - /side-channel@1.0.6: - resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} - engines: {node: '>= 0.4'} + side-channel@1.0.6: dependencies: call-bind: 1.0.7 es-errors: 1.3.0 get-intrinsic: 1.2.4 object-inspect: 1.13.1 - dev: true - /signal-exit@3.0.7: - resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} - dev: true + signal-exit@3.0.7: {} - /signal-exit@4.1.0: - resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} - engines: {node: '>=14'} - dev: true + signal-exit@4.1.0: {} - /sisteransi@1.0.5: - resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} - dev: true + sisteransi@1.0.5: {} - /slash@3.0.0: - resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} - engines: {node: '>=8'} - dev: true + slash@3.0.0: {} - /smartwrap@2.0.2: - resolution: {integrity: sha512-vCsKNQxb7PnCNd2wY1WClWifAc2lwqsG8OaswpJkVJsvMGcnEntdTCDajZCkk93Ay1U3t/9puJmb525Rg5MZBA==} - engines: {node: '>=6'} - hasBin: true + smartwrap@2.0.2: dependencies: array.prototype.flat: 1.3.2 breakword: 1.0.6 @@ -2890,175 +3598,106 @@ packages: strip-ansi: 6.0.1 wcwidth: 1.0.1 yargs: 15.4.1 - dev: true - /smol-toml@1.1.4: - resolution: {integrity: sha512-Y0OT8HezWsTNeEOSVxDnKOW/AyNXHQ4BwJNbAXlLTF5wWsBvrcHhIkE5Rf8kQMLmgf7nDX3PVOlgC6/Aiggu3Q==} - engines: {node: '>= 18', pnpm: '>= 8'} - dev: true + smol-toml@1.1.4: {} - /spawndamnit@2.0.0: - resolution: {integrity: sha512-j4JKEcncSjFlqIwU5L/rp2N5SIPsdxaRsIv678+TZxZ0SRDJTm8JrxJMjE/XuiEZNEir3S8l0Fa3Ke339WI4qA==} + spawndamnit@2.0.0: dependencies: cross-spawn: 5.1.0 signal-exit: 3.0.7 - dev: true - /spdx-correct@3.2.0: - resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + spdx-correct@3.2.0: dependencies: spdx-expression-parse: 3.0.1 spdx-license-ids: 3.0.17 - dev: true - /spdx-exceptions@2.5.0: - resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} - dev: true + spdx-exceptions@2.5.0: {} - /spdx-expression-parse@3.0.1: - resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + spdx-expression-parse@3.0.1: dependencies: spdx-exceptions: 2.5.0 spdx-license-ids: 3.0.17 - dev: true - /spdx-license-ids@3.0.17: - resolution: {integrity: sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==} - dev: true + spdx-license-ids@3.0.17: {} - /sprintf-js@1.0.3: - resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} - dev: true + sprintf-js@1.0.3: {} - /stdin-discarder@0.2.2: - resolution: {integrity: sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==} - engines: {node: '>=18'} - dev: true + stdin-discarder@0.2.2: {} - /stream-transform@2.1.3: - resolution: {integrity: sha512-9GHUiM5hMiCi6Y03jD2ARC1ettBXkQBoQAe7nJsPknnI0ow10aXjTnew8QtYQmLjzn974BnmWEAJgCY6ZP1DeQ==} + stream-transform@2.1.3: dependencies: mixme: 0.5.10 - dev: true - /string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} + string-width@4.2.3: 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'} + string-width@5.1.2: dependencies: eastasianwidth: 0.2.0 emoji-regex: 9.2.2 strip-ansi: 7.1.0 - dev: true - /string-width@7.1.0: - resolution: {integrity: sha512-SEIJCWiX7Kg4c129n48aDRwLbFb2LJmXXFrWBG4NGaRtMQ3myKPKbwrD1BKqQn74oCoNMBVrfDEr5M9YxCsrkw==} - engines: {node: '>=18'} + string-width@7.1.0: dependencies: emoji-regex: 10.3.0 get-east-asian-width: 1.2.0 strip-ansi: 7.1.0 - dev: true - /string.prototype.trim@1.2.8: - resolution: {integrity: sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==} - engines: {node: '>= 0.4'} + string.prototype.trim@1.2.8: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.22.5 - dev: true - /string.prototype.trimend@1.0.7: - resolution: {integrity: sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==} + string.prototype.trimend@1.0.7: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.22.5 - dev: true - /string.prototype.trimstart@1.0.7: - resolution: {integrity: sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==} + string.prototype.trimstart@1.0.7: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.22.5 - dev: true - /strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} + strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 - dev: true - /strip-ansi@7.1.0: - resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} - engines: {node: '>=12'} + strip-ansi@7.1.0: 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@3.0.0: {} - /strip-indent@3.0.0: - resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} - engines: {node: '>=8'} + strip-indent@3.0.0: 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@2.0.1: {} - /strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - dev: true + strip-json-comments@3.1.1: {} - /supports-color@5.5.0: - resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} - engines: {node: '>=4'} + supports-color@5.5.0: dependencies: has-flag: 3.0.0 - dev: true - /supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} + supports-color@7.2.0: dependencies: has-flag: 4.0.0 - dev: true - /supports-hyperlinks@2.3.0: - resolution: {integrity: sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==} - engines: {node: '>=8'} + supports-hyperlinks@2.3.0: 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'} - dev: true + supports-preserve-symlinks-flag@1.0.0: {} - /tar@6.1.15: - resolution: {integrity: sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A==} - engines: {node: '>=10'} + tar@6.1.15: dependencies: chownr: 2.0.0 fs-minipass: 2.1.0 @@ -3066,53 +3705,29 @@ packages: minizlib: 2.1.2 mkdirp: 1.0.4 yallist: 4.0.0 - dev: true - /term-size@2.2.1: - resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} - engines: {node: '>=8'} - dev: true + term-size@2.2.1: {} - /terminal-link@3.0.0: - resolution: {integrity: sha512-flFL3m4wuixmf6IfhFJd1YPiLiMuxEc8uHRM1buzIeZPm22Au2pDqBJQgdo7n1WfPU1ONFGv7YDwpFBmHGF6lg==} - engines: {node: '>=12'} + terminal-link@3.0.0: dependencies: ansi-escapes: 5.0.0 supports-hyperlinks: 2.3.0 - dev: true - /text-table@0.2.0: - resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} - dev: true + text-table@0.2.0: {} - /tmp@0.0.33: - resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} - engines: {node: '>=0.6.0'} + tmp@0.0.33: dependencies: os-tmpdir: 1.0.2 - dev: true - /to-readable-stream@2.1.0: - resolution: {integrity: sha512-o3Qa6DGg1CEXshSdvWNX2sN4QHqg03SPq7U6jPXRahlQdl5dK8oXjkU/2/sGrnOZKeGV1zLSO8qPwyKklPPE7w==} - engines: {node: '>=8'} - dev: true + to-readable-stream@2.1.0: {} - /to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} + to-regex-range@5.0.1: dependencies: is-number: 7.0.0 - dev: true - /trim-newlines@3.0.1: - resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} - engines: {node: '>=8'} - dev: true + trim-newlines@3.0.1: {} - /tty-table@4.2.3: - resolution: {integrity: sha512-Fs15mu0vGzCrj8fmJNP7Ynxt5J7praPXqFN0leZeZBXJwkMxv9cb2D454k1ltrtUSJbZ4yH4e0CynsHLxmUfFA==} - engines: {node: '>=8.0.0'} - hasBin: true + tty-table@4.2.3: dependencies: chalk: 4.1.2 csv: 5.5.3 @@ -3121,68 +3736,38 @@ packages: strip-ansi: 6.0.1 wcwidth: 1.0.1 yargs: 17.7.2 - dev: true - /type-check@0.4.0: - resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} - engines: {node: '>= 0.8.0'} + type-check@0.4.0: dependencies: prelude-ls: 1.2.1 - dev: true - /type-fest@0.10.0: - resolution: {integrity: sha512-EUV9jo4sffrwlg8s0zDhP0T2WD3pru5Xi0+HTE3zTUmBaZNhfkite9PdSJwdXLwPVW0jnAHT56pZHIOYckPEiw==} - engines: {node: '>=8'} - dev: true + type-fest@0.10.0: {} - /type-fest@0.13.1: - resolution: {integrity: sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==} - engines: {node: '>=10'} - dev: true + type-fest@0.13.1: {} - /type-fest@0.20.2: - resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} - engines: {node: '>=10'} - dev: true + type-fest@0.20.2: {} - /type-fest@0.6.0: - resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} - engines: {node: '>=8'} - dev: true + type-fest@0.6.0: {} - /type-fest@0.8.1: - resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} - engines: {node: '>=8'} - dev: true + type-fest@0.8.1: {} - /type-fest@1.4.0: - resolution: {integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==} - engines: {node: '>=10'} - dev: true + type-fest@1.4.0: {} - /typed-array-buffer@1.0.2: - resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} - engines: {node: '>= 0.4'} + typed-array-buffer@1.0.2: dependencies: call-bind: 1.0.7 es-errors: 1.3.0 is-typed-array: 1.1.13 - dev: true - /typed-array-byte-length@1.0.1: - resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==} - engines: {node: '>= 0.4'} + typed-array-byte-length@1.0.1: dependencies: call-bind: 1.0.7 for-each: 0.3.3 gopd: 1.0.1 has-proto: 1.0.3 is-typed-array: 1.1.13 - dev: true - /typed-array-byte-offset@1.0.2: - resolution: {integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==} - engines: {node: '>= 0.4'} + typed-array-byte-offset@1.0.2: dependencies: available-typed-arrays: 1.0.7 call-bind: 1.0.7 @@ -3190,11 +3775,8 @@ packages: gopd: 1.0.1 has-proto: 1.0.3 is-typed-array: 1.1.13 - dev: true - /typed-array-length@1.0.5: - resolution: {integrity: sha512-yMi0PlwuznKHxKmcpoOdeLwxBoVPkqZxd7q2FgMkmD3bNwvF5VW0+UlUQ1k1vmktTu4Yu13Q0RIxEP8+B+wloA==} - engines: {node: '>= 0.4'} + typed-array-length@1.0.5: dependencies: call-bind: 1.0.7 for-each: 0.3.3 @@ -3202,199 +3784,123 @@ packages: has-proto: 1.0.3 is-typed-array: 1.1.13 possible-typed-array-names: 1.0.0 - dev: true - /typescript@5.4.2: - resolution: {integrity: sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ==} - engines: {node: '>=14.17'} - hasBin: true - dev: true + typescript@5.4.2: {} - /unbox-primitive@1.0.2: - resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} + unbox-primitive@1.0.2: dependencies: call-bind: 1.0.7 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==} - dev: true + undici-types@5.26.5: {} - /universalify@0.1.2: - resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} - engines: {node: '>= 4.0.0'} - dev: true + universalify@0.1.2: {} - /universalify@2.0.1: - resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} - engines: {node: '>= 10.0.0'} - dev: true + universalify@2.0.1: {} - /update-check@1.5.4: - resolution: {integrity: sha512-5YHsflzHP4t1G+8WGPlvKbJEbAJGCgw+Em+dGR1KmBUbr1J36SJBqlHLjR7oob7sco5hWHGQVcr9B2poIVDDTQ==} + update-check@1.5.4: dependencies: registry-auth-token: 3.3.2 registry-url: 3.1.0 - dev: true - /uri-js@4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + uri-js@4.4.1: dependencies: punycode: 2.3.1 - dev: true - /validate-npm-package-license@3.0.4: - resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + validate-npm-package-license@3.0.4: dependencies: spdx-correct: 3.2.0 spdx-expression-parse: 3.0.1 - dev: true - /validate-npm-package-name@3.0.0: - resolution: {integrity: sha512-M6w37eVCMMouJ9V/sdPGnC5H4uDr73/+xdq0FBLO3TFFX1+7wiUY6Es328NN+y43tmY+doUdN9g9J21vqB7iLw==} + validate-npm-package-name@3.0.0: dependencies: builtins: 1.0.3 - dev: true - /wait-port@1.1.0: - resolution: {integrity: sha512-3e04qkoN3LxTMLakdqeWth8nih8usyg+sf1Bgdf9wwUkp05iuK1eSY/QpLvscT/+F/gA89+LpUmmgBtesbqI2Q==} - engines: {node: '>=10'} - hasBin: true + wait-port@1.1.0: dependencies: chalk: 4.1.2 commander: 9.5.0 debug: 4.3.4 transitivePeerDependencies: - supports-color - dev: true - /wcwidth@1.0.1: - resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + wcwidth@1.0.1: dependencies: defaults: 1.0.4 - dev: true - /which-boxed-primitive@1.0.2: - resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} + whatwg-fetch@3.6.20: {} + + which-boxed-primitive@1.0.2: 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-module@2.0.1: - resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} - dev: true + which-module@2.0.1: {} - /which-pm@2.0.0: - resolution: {integrity: sha512-Lhs9Pmyph0p5n5Z3mVnN0yWcbQYUAD7rbQUiMsQxOJ3T57k7RFe35SUwWMf7dsbDZks1uOmw4AecB/JMDj3v/w==} - engines: {node: '>=8.15'} + which-pm@2.0.0: dependencies: load-yaml-file: 0.2.0 path-exists: 4.0.0 - dev: true - /which-typed-array@1.1.15: - resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} - engines: {node: '>= 0.4'} + which-typed-array@1.1.15: dependencies: available-typed-arrays: 1.0.7 call-bind: 1.0.7 for-each: 0.3.3 gopd: 1.0.1 has-tostringtag: 1.0.2 - dev: true - /which@1.3.1: - resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} - hasBin: true + which@1.3.1: dependencies: isexe: 2.0.0 - dev: true - /which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true + which@2.0.2: dependencies: isexe: 2.0.0 - dev: true - /wrap-ansi@6.2.0: - resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} - engines: {node: '>=8'} + wrap-ansi@6.2.0: 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'} + wrap-ansi@7.0.0: 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'} + wrap-ansi@8.1.0: 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==} - dev: true + wrappy@1.0.2: {} - /y18n@4.0.3: - resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} - dev: true + y18n@4.0.3: {} - /y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} - dev: true + y18n@5.0.8: {} - /yallist@2.1.2: - resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==} - dev: true + yallist@2.1.2: {} - /yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - dev: true + yallist@4.0.0: {} - /yaml@2.4.1: - resolution: {integrity: sha512-pIXzoImaqmfOrL7teGUBt/T7ZDnyeGBWyXQBvOVhLkWLN37GXv8NMLK406UY6dS51JfcQHsmcW5cJ441bHg6Lg==} - engines: {node: '>= 14'} - hasBin: true - dev: true + yaml@2.4.1: {} - /yargs-parser@18.1.3: - resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} - engines: {node: '>=6'} + yargs-parser@18.1.3: dependencies: camelcase: 5.3.1 decamelize: 1.2.0 - dev: true - /yargs-parser@21.1.1: - resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} - engines: {node: '>=12'} - dev: true + yargs-parser@21.1.1: {} - /yargs@15.4.1: - resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} - engines: {node: '>=8'} + yargs@15.4.1: dependencies: cliui: 6.0.0 decamelize: 1.2.0 @@ -3407,11 +3913,8 @@ packages: which-module: 2.0.1 y18n: 4.0.3 yargs-parser: 18.1.3 - dev: true - /yargs@17.7.2: - resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} - engines: {node: '>=12'} + yargs@17.7.2: dependencies: cliui: 8.0.1 escalade: 3.1.2 @@ -3420,15 +3923,5 @@ packages: string-width: 4.2.3 y18n: 5.0.8 yargs-parser: 21.1.1 - dev: true - - /yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - dev: true - github.com/watson/ci-info/f43f6a1cefff47fb361c88cf4b943fdbcaafe540: - resolution: {tarball: https://codeload.github.com/watson/ci-info/tar.gz/f43f6a1cefff47fb361c88cf4b943fdbcaafe540} - name: ci-info - version: 2.0.0 - dev: true + yocto-queue@0.1.0: {} diff --git a/prettier.config.js b/prettier.config.js index a4dc7135..1fe03c66 100644 --- a/prettier.config.js +++ b/prettier.config.js @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2024 Deutsche Telekom AG, LlamaIndex, Vercel, Inc. -// -// SPDX-License-Identifier: MIT - module.exports = { plugins: ["prettier-plugin-organize-imports"], }; diff --git a/questions.ts b/questions.ts index e81e7fae..31eed224 100644 --- a/questions.ts +++ b/questions.ts @@ -1,12 +1,6 @@ -// SPDX-FileCopyrightText: 2024 Deutsche Telekom AG, LlamaIndex, Vercel, Inc. -// -// SPDX-License-Identifier: MIT - import { execSync } from "child_process"; import ciInfo from "ci-info"; import fs from "fs"; -import got from "got"; -import ora from "ora"; import path from "path"; import { blue, green, red } from "picocolors"; import prompts from "prompts"; @@ -16,17 +10,19 @@ import { TemplateDataSourceType, TemplateFramework, } from "./helpers"; +import { COMMUNITY_OWNER, COMMUNITY_REPO } from "./helpers/constant"; import { EXAMPLE_FILE } from "./helpers/datasources"; import { templatesDir } from "./helpers/dir"; +import { getAvailableLlamapackOptions } from "./helpers/llama-pack"; +import { askModelConfig, isModelConfigured } from "./helpers/providers"; +import { getProjectOptions } from "./helpers/repo"; import { supportedTools, toolsRequireConfig } from "./helpers/tools"; -const OPENAI_API_URL = "https://llm-server.llmhub.t-systems.net/v2"; - export type QuestionArgs = Omit< InstallAppArgs, "appPath" | "packageManager" > & { - listServerModels?: boolean; + askModels?: boolean; }; const supportedContextFileTypes = [ ".pdf", @@ -68,18 +64,13 @@ if ($dialogResult -eq [System.Windows.Forms.DialogResult]::OK) } `; -const defaults: QuestionArgs = { +const defaults: Omit = { template: "streaming", - framework: "fastapi", - listServerModels: true, - observability: "none", + framework: "nextjs", ui: "shadcn", frontend: false, - openAiKey: "", llamaCloudKey: "", useLlamaParse: false, - model: "gpt-3.5-turbo", - embeddingModel: "text-embedding-ada-002", communityProjectConfig: undefined, llamapack: "", postInstallAction: "dependencies", @@ -87,7 +78,7 @@ const defaults: QuestionArgs = { tools: [], }; -const handlers = { +export const questionHandlers = { onCancel: () => { console.error("Exiting."); process.exit(1); @@ -104,6 +95,8 @@ const getVectorDbChoices = (framework: TemplateFramework) => { { title: "PostgreSQL", value: "pg" }, { title: "Pinecone", value: "pinecone" }, { title: "Milvus", value: "milvus" }, + { title: "Astra", value: "astra" }, + { title: "Qdrant", value: "qdrant" }, ]; const vectordbLang = framework === "fastapi" ? "python" : "typescript"; @@ -134,7 +127,7 @@ export const getDataSourceChoices = ( } if (selectedDataSource === undefined || selectedDataSource.length === 0) { choices.push({ - title: "No data, just a simple chat", + title: "No data, just a simple chat or agent", value: "none", }); choices.push({ @@ -162,13 +155,10 @@ export const getDataSourceChoices = ( title: "Use website content (requires Chrome)", value: "web", }); - // Add db source if there is no db source already - if (!selectedDataSource.some((ds) => ds.type === "db")) { - choices.push({ - title: "Use data from a database (Mysql)", - value: "db", - }); - } + choices.push({ + title: "Use data from a database (Mysql, PostgreSQL)", + value: "db", + }); } return choices; }; @@ -236,84 +226,15 @@ export const onPromptState = (state: any) => { } }; -const getAvailableModelChoices = async ( - selectEmbedding: boolean, - apiKey?: string, - listServerModels?: boolean, -) => { - const defaultLLMModels = [ - "Llama2-70b-Instruct", - "Mixtral-8x7B-Instruct-v0.1", - "Zephyr-7b-beta", - ]; - const defaultEmbeddingModels = [ - "paraphrase-multilingual-mpnet-base-v2", - "jina-embeddings-v2-base-de", - "text-embedding-bge-m3", - ]; - - const isEmbeddingModel = (model_id: string) => { - return ( - model_id.includes("embedding") || - defaultEmbeddingModels.includes(model_id) - ); - }; - - const isLLMModels = (model_id: string) => { - return !isEmbeddingModel(model_id); - }; - - if (apiKey && listServerModels) { - const spinner = ora("Fetching available models").start(); - try { - const response = await got(`${OPENAI_API_URL}/models`, { - headers: { - Authorization: "Bearer " + apiKey, - }, - timeout: 5000, - responseType: "json", - }); - const data: any = await response.body; - spinner.stop(); - return data.data - .filter((model: any) => - selectEmbedding ? isEmbeddingModel(model.id) : isLLMModels(model.id), - ) - .map((el: any) => { - return { - title: el.id, - value: el.id, - }; - }); - } catch (error) { - spinner.stop(); - if ((error as any).response?.statusCode === 401) { - console.log( - red( - "Invalid T-Systems API key provided! Please provide a valid key and try again!", - ), - ); - } else { - console.log(red("Request failed: " + error)); - } - process.exit(1); - } - } else { - const data = selectEmbedding ? defaultEmbeddingModels : defaultLLMModels; - return data.map((model) => ({ - title: model, - value: model, - })); - } -}; - export const askQuestions = async ( program: QuestionArgs, preferences: QuestionArgs, + openAiKey?: string, ) => { - const getPrefOrDefault = ( + const getPrefOrDefault = >( field: K, - ): QuestionArgs[K] => preferences[field] ?? defaults[field]; + ): Omit[K] => + preferences[field] ?? defaults[field]; // Ask for next action after installation async function askPostInstallAction() { @@ -336,8 +257,7 @@ export const askQuestions = async ( }, ]; - const openAiKeyConfigured = - program.openAiKey || process.env["TSI_API_KEY"]; + const modelConfigured = isModelConfigured(program.modelConfig); // If using LlamaParse, require LlamaCloud API key const llamaCloudKeyConfigured = program.useLlamaParse ? program.llamaCloudKey || process.env["LLAMA_CLOUD_API_KEY"] @@ -346,7 +266,7 @@ export const askQuestions = async ( // Can run the app if all tools do not require configuration if ( !hasVectorDb && - openAiKeyConfigured && + modelConfigured && llamaCloudKeyConfigured && !toolsRequireConfig(program.tools) && !program.llamapack @@ -366,7 +286,7 @@ export const askQuestions = async ( choices: actionChoices, initial: 1, }, - handlers, + questionHandlers, ); program.postInstallAction = action; @@ -374,9 +294,107 @@ export const askQuestions = async ( } } - program.template = getPrefOrDefault("template"); - program.framework = getPrefOrDefault("framework"); - program.listServerModels = getPrefOrDefault("listServerModels"); + if (!program.template) { + if (ciInfo.isCI) { + program.template = getPrefOrDefault("template"); + } else { + const styledRepo = blue( + `https://github.com/${COMMUNITY_OWNER}/${COMMUNITY_REPO}`, + ); + const { template } = await prompts( + { + type: "select", + name: "template", + message: "Which template would you like to use?", + choices: [ + { title: "Chat", value: "streaming" }, + { + title: `Community template from ${styledRepo}`, + value: "community", + }, + { + title: "Example using a LlamaPack", + value: "llamapack", + }, + ], + initial: 0, + }, + questionHandlers, + ); + program.template = template; + preferences.template = template; + } + } + + if (program.template === "community") { + const projectOptions = await getProjectOptions( + COMMUNITY_OWNER, + COMMUNITY_REPO, + ); + const { communityProjectConfig } = await prompts( + { + type: "select", + name: "communityProjectConfig", + message: "Select community template", + choices: projectOptions.map(({ title, value }) => ({ + title, + value: JSON.stringify(value), // serialize value to string in terminal + })), + initial: 0, + }, + questionHandlers, + ); + const projectConfig = JSON.parse(communityProjectConfig); + program.communityProjectConfig = projectConfig; + preferences.communityProjectConfig = projectConfig; + return; // early return - no further questions needed for community projects + } + + if (program.template === "llamapack") { + const availableLlamaPacks = await getAvailableLlamapackOptions(); + const { llamapack } = await prompts( + { + type: "select", + name: "llamapack", + message: "Select LlamaPack", + choices: availableLlamaPacks.map((pack) => ({ + title: pack.name, + value: pack.folderPath, + })), + initial: 0, + }, + questionHandlers, + ); + program.llamapack = llamapack; + preferences.llamapack = llamapack; + await askPostInstallAction(); + return; // early return - no further questions needed for llamapack projects + } + + if (!program.framework) { + if (ciInfo.isCI) { + program.framework = getPrefOrDefault("framework"); + } else { + const choices = [ + { title: "NextJS", value: "nextjs" }, + { title: "Express", value: "express" }, + { title: "FastAPI (Python)", value: "fastapi" }, + ]; + + const { framework } = await prompts( + { + type: "select", + name: "framework", + message: "Which framework would you like to use?", + choices, + initial: 0, + }, + questionHandlers, + ); + program.framework = framework; + preferences.framework = framework; + } + } if (program.framework === "express" || program.framework === "fastapi") { // if a backend-only framework is selected, ask whether we should create a frontend @@ -410,78 +428,42 @@ export const askQuestions = async ( program.frontend = false; } - program.ui = getPrefOrDefault("ui"); - program.observability = getPrefOrDefault("observability"); - - if (!program.openAiKey) { - const { key } = await prompts( - { - type: "text", - name: "key", - message: program.listServerModels - ? "Please provide your T-Systems API key (or reuse TSI_API_KEY env variable):" - : "Please provide your T-Systems API key (leave blank to skip):", - validate: (value: string) => { - if (program.listServerModels && !value) { - if (process.env.TSI_API_KEY) { - return true; - } - return "T-Systems API key is required"; - } - return true; - }, - }, - handlers, - ); - - program.openAiKey = key || process.env.TSI_API_KEY; - preferences.openAiKey = key || process.env.TSI_API_KEY; + if (program.framework === "nextjs" || program.frontend) { + if (!program.ui) { + program.ui = defaults.ui; + } } - if (!program.model) { + if (!program.observability) { if (ciInfo.isCI) { - program.model = getPrefOrDefault("model"); + program.observability = getPrefOrDefault("observability"); } else { - const { model } = await prompts( + const { observability } = await prompts( { type: "select", - name: "model", - message: "Which model would you like to use?", - choices: await getAvailableModelChoices( - false, - program.openAiKey, - program.listServerModels, - ), + name: "observability", + message: "Would you like to set up observability?", + choices: [ + { title: "No", value: "none" }, + { title: "OpenTelemetry", value: "opentelemetry" }, + ], initial: 0, }, - handlers, + questionHandlers, ); - program.model = model; - preferences.model = model; + + program.observability = observability; + preferences.observability = observability; } } - if (!program.embeddingModel && program.framework === "fastapi") { - if (ciInfo.isCI) { - program.embeddingModel = getPrefOrDefault("embeddingModel"); - } else { - const { embeddingModel } = await prompts( - { - type: "select", - name: "embeddingModel", - message: "Which embedding model would you like to use?", - choices: await getAvailableModelChoices( - true, - program.openAiKey, - program.listServerModels, - ), - initial: 0, - }, - handlers, - ); - program.embeddingModel = embeddingModel; - preferences.embeddingModel = embeddingModel; - } + if (!program.modelConfig) { + const modelConfig = await askModelConfig({ + openAiKey, + askModels: program.askModels ?? false, + }); + program.modelConfig = modelConfig; + preferences.modelConfig = modelConfig; } if (!program.dataSources) { @@ -505,87 +487,100 @@ export const askQuestions = async ( ), initial: firstQuestion ? 1 : 0, }, - handlers, + questionHandlers, ); if (selectedSource === "no" || selectedSource === "none") { // user doesn't want another data source or any data source break; } - if (selectedSource === "exampleFile") { - program.dataSources.push(EXAMPLE_FILE); - } else if (selectedSource === "file" || selectedSource === "folder") { - // Select local data source - const selectedPaths = await selectLocalContextData(selectedSource); - for (const p of selectedPaths) { + switch (selectedSource) { + case "exampleFile": { + program.dataSources.push(EXAMPLE_FILE); + break; + } + case "file": + case "folder": { + const selectedPaths = await selectLocalContextData(selectedSource); + for (const p of selectedPaths) { + program.dataSources.push({ + type: "file", + config: { + path: p, + }, + }); + } + break; + } + case "web": { + const { baseUrl } = await prompts( + { + type: "text", + name: "baseUrl", + message: "Please provide base URL of the website: ", + initial: "https://www.llamaindex.ai", + validate: (value: string) => { + if (!value.includes("://")) { + value = `https://${value}`; + } + const urlObj = new URL(value); + if ( + urlObj.protocol !== "https:" && + urlObj.protocol !== "http:" + ) { + return `URL=${value} has invalid protocol, only allow http or https`; + } + return true; + }, + }, + questionHandlers, + ); + program.dataSources.push({ - type: "file", + type: "web", config: { - path: p, + baseUrl, + prefix: baseUrl, + depth: 1, }, }); + break; } - } else if (selectedSource === "web") { - // Selected web data source - const { baseUrl } = await prompts( - { - type: "text", - name: "baseUrl", - message: "Please provide base URL of the website: ", - initial: "https://www.llamaindex.ai", - validate: (value: string) => { - if (!value.includes("://")) { - value = `https://${value}`; - } - const urlObj = new URL(value); - if ( - urlObj.protocol !== "https:" && - urlObj.protocol !== "http:" - ) { - return `URL=${value} has invalid protocol, only allow http or https`; - } - return true; + case "db": { + const dbPrompts: prompts.PromptObject[] = [ + { + type: "text", + name: "uri", + message: + "Please enter the connection string (URI) for the database.", + initial: "mysql+pymysql://user:pass@localhost:3306/mydb", + validate: (value: string) => { + if (!value) { + return "Please provide a valid connection string"; + } else if ( + !( + value.startsWith("mysql+pymysql://") || + value.startsWith("postgresql+psycopg://") + ) + ) { + return "The connection string must start with 'mysql+pymysql://' for MySQL or 'postgresql+psycopg://' for PostgreSQL"; + } + return true; + }, }, - }, - handlers, - ); - - program.dataSources.push({ - type: "web", - config: { - baseUrl, - prefix: baseUrl, - depth: 1, - }, - }); - } else if (selectedSource === "db") { - const dbPrompts: prompts.PromptObject[] = [ - { - type: "text", - name: "dbUri", - message: - "Please enter the connection string (URI) for the database:", - initial: "mysql+pymysql://user:pass@localhost:3306/mydb", - validate: (value: string) => { - if (!value) { - return "Please provide a valid connection string"; - } else if (!value.startsWith("mysql+pymysql://")) { - return "The connection string must start with 'mysql+pymysql://'"; - } - return true; + // Only ask for a query, user can provide more complex queries in the config file later + { + type: (prev) => (prev ? "text" : null), + name: "queries", + message: "Please enter the SQL query to fetch data:", + initial: "SELECT * FROM mytable", }, - }, - { - type: (prev) => (prev ? "text" : null), - name: "query", - message: "Please enter the SQL query to fetch data:", - initial: "SELECT * FROM mytable", - }, - ]; - program.dataSources.push({ - type: "db", - config: await prompts(dbPrompts, handlers), - }); + ]; + program.dataSources.push({ + type: "db", + config: await prompts(dbPrompts, questionHandlers), + }); + } } } } @@ -610,7 +605,7 @@ export const askQuestions = async ( active: "yes", inactive: "no", }, - handlers, + questionHandlers, ); program.useLlamaParse = useLlamaParse; @@ -623,7 +618,7 @@ export const askQuestions = async ( message: "Please provide your LlamaIndex Cloud API key (leave blank to skip):", }, - handlers, + questionHandlers, ); program.llamaCloudKey = llamaCloudKey; } @@ -642,15 +637,14 @@ export const askQuestions = async ( choices: getVectorDbChoices(program.framework), initial: 0, }, - handlers, + questionHandlers, ); program.vectorDb = vectorDb; preferences.vectorDb = vectorDb; } } - // TODO: allow tools also without datasources - if (!program.tools && program.dataSources.length > 0) { + if (!program.tools) { if (ciInfo.isCI) { program.tools = getPrefOrDefault("tools"); } else { @@ -678,3 +672,7 @@ export const askQuestions = async ( await askPostInstallAction(); }; + +export const toChoice = (value: string) => { + return { title: value, value }; +}; diff --git a/scripts/build.sh b/scripts/build.sh index 068850e4..498fe508 100644 --- a/scripts/build.sh +++ b/scripts/build.sh @@ -1,9 +1,5 @@ #!/usr/bin/env bash -# SPDX-FileCopyrightText: 2024 Deutsche Telekom AG, LlamaIndex, Vercel, Inc. -# -# SPDX-License-Identifier: MIT - # build dist/index.js file pnpm run build:ncc diff --git a/scripts/pack.sh b/scripts/pack.sh index 99f99a34..3009ef80 100644 --- a/scripts/pack.sh +++ b/scripts/pack.sh @@ -1,7 +1,3 @@ #!/usr/bin/env bash -# SPDX-FileCopyrightText: 2024 Deutsche Telekom AG, LlamaIndex, Vercel, Inc. -# -# SPDX-License-Identifier: MIT - pnpm pack && npm install -g $(pwd)/$(ls ./*.tgz | head -1) \ No newline at end of file diff --git a/templates/.gitignore b/templates/.gitignore index 49e8107f..ec6c67b6 100644 --- a/templates/.gitignore +++ b/templates/.gitignore @@ -1,7 +1,3 @@ -# SPDX-FileCopyrightText: 2024 Deutsche Telekom AG, LlamaIndex, Vercel, Inc. -# -# SPDX-License-Identifier: MIT - __pycache__ poetry.lock storage diff --git a/templates/README-fullstack.md b/templates/README-fullstack.md index 7cfee6da..5a41b8cf 100644 --- a/templates/README-fullstack.md +++ b/templates/README-fullstack.md @@ -1,9 +1,3 @@ - - This is a [LlamaIndex](https://www.llamaindex.ai/) project bootstrapped with [`create-llama`](https://github.com/run-llama/LlamaIndexTS/tree/main/packages/create-llama). ## Getting Started diff --git a/templates/components/data/101.pdf b/templates/components/data/101.pdf new file mode 100644 index 0000000000000000000000000000000000000000..ae5acffd5398b7c59e2df9e6dead2d99128b719c GIT binary patch literal 47931 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 list[FunctionTool]: @staticmethod def from_env() -> list[FunctionTool]: tools = [] - with open("config/tools.yaml", "r") as f: - tool_configs = yaml.safe_load(f) - for name, config in tool_configs.items(): - tools += ToolFactory.create_tool(name, **config) + if os.path.exists("config/tools.yaml"): + with open("config/tools.yaml", "r") as f: + tool_configs = yaml.safe_load(f) + for name, config in tool_configs.items(): + tools += ToolFactory.create_tool(name, **config) return tools diff --git a/templates/components/engines/python/chat/__init__.py b/templates/components/engines/python/chat/__init__.py index 4ff737a1..80bcc41a 100644 --- a/templates/components/engines/python/chat/__init__.py +++ b/templates/components/engines/python/chat/__init__.py @@ -1,16 +1,22 @@ -# SPDX-FileCopyrightText: 2024 Deutsche Telekom AG, LlamaIndex, Vercel, Inc. -# -# SPDX-License-Identifier: MIT - import os from app.engine.index import get_index +from fastapi import HTTPException def get_chat_engine(): system_prompt = os.getenv("SYSTEM_PROMPT") top_k = os.getenv("TOP_K", 3) - return get_index().as_chat_engine( + index = get_index() + if index is None: + raise HTTPException( + status_code=500, + detail=str( + "StorageContext is empty - call 'poetry run generate' to generate the storage first" + ), + ) + + return index.as_chat_engine( similarity_top_k=int(top_k), system_prompt=system_prompt, chat_mode="condense_plus_context", diff --git a/templates/components/engines/typescript/agent/chat.ts b/templates/components/engines/typescript/agent/chat.ts index 9815a768..8fdbe272 100644 --- a/templates/components/engines/typescript/agent/chat.ts +++ b/templates/components/engines/typescript/agent/chat.ts @@ -1,30 +1,37 @@ -// SPDX-FileCopyrightText: 2024 Deutsche Telekom AG, LlamaIndex, Vercel, Inc. -// -// SPDX-License-Identifier: MIT - -import config from "@/config/tools.json"; -import { OpenAI, OpenAIAgent, QueryEngineTool, ToolFactory } from "llamaindex"; -import { STORAGE_CACHE_DIR } from "./constants.mjs"; +import { BaseTool, OpenAIAgent, QueryEngineTool } from "llamaindex"; +import { ToolsFactory } from "llamaindex/tools/ToolsFactory"; +import fs from "node:fs/promises"; +import path from "node:path"; import { getDataSource } from "./index"; +import { STORAGE_CACHE_DIR } from "./shared"; -export async function createChatEngine(llm: OpenAI) { - const index = await getDataSource(llm); - const queryEngine = index.asQueryEngine(); - const queryEngineTool = new QueryEngineTool({ - queryEngine: queryEngine, - metadata: { - name: "data_query_engine", - description: `A query engine for documents in storage folder: ${STORAGE_CACHE_DIR}`, - }, - }); +export async function createChatEngine() { + let tools: BaseTool[] = []; - const externalTools = await ToolFactory.createTools(config); + // Add a query engine tool if we have a data source + // Delete this code if you don't have a data source + const index = await getDataSource(); + if (index) { + tools.push( + new QueryEngineTool({ + queryEngine: index.asQueryEngine(), + metadata: { + name: "data_query_engine", + description: `A query engine for documents in storage folder: ${STORAGE_CACHE_DIR}`, + }, + }), + ); + } - const agent = new OpenAIAgent({ - tools: [queryEngineTool, ...externalTools], - verbose: true, - llm, - }); + try { + // add tools from config file if it exists + const config = JSON.parse( + await fs.readFile(path.join("config", "tools.json"), "utf8"), + ); + tools = tools.concat(await ToolsFactory.createTools(config)); + } catch {} - return agent; + return new OpenAIAgent({ + tools, + }); } diff --git a/templates/components/engines/typescript/chat/chat.ts b/templates/components/engines/typescript/chat/chat.ts index ed15e511..62cc77df 100644 --- a/templates/components/engines/typescript/chat/chat.ts +++ b/templates/components/engines/typescript/chat/chat.ts @@ -1,17 +1,18 @@ -// SPDX-FileCopyrightText: 2024 Deutsche Telekom AG, LlamaIndex, Vercel, Inc. -// -// SPDX-License-Identifier: MIT - -import { ContextChatEngine, LLM } from "llamaindex"; +import { ContextChatEngine, Settings } from "llamaindex"; import { getDataSource } from "./index"; -export async function createChatEngine(llm: LLM) { - const index = await getDataSource(llm); +export async function createChatEngine() { + const index = await getDataSource(); + if (!index) { + throw new Error( + `StorageContext is empty - call 'npm run generate' to generate the storage first`, + ); + } const retriever = index.asRetriever(); retriever.similarityTopK = 3; return new ContextChatEngine({ - chatModel: llm, + chatModel: Settings.llm, retriever, }); } diff --git a/templates/components/loaders/python/__init__.py b/templates/components/loaders/python/__init__.py index 99a70707..d17df8e0 100644 --- a/templates/components/loaders/python/__init__.py +++ b/templates/components/loaders/python/__init__.py @@ -1,7 +1,3 @@ -# SPDX-FileCopyrightText: 2024 Deutsche Telekom AG, LlamaIndex, Vercel, Inc. -# -# SPDX-License-Identifier: MIT - import os import yaml import importlib @@ -27,14 +23,17 @@ def get_documents(): logger.info( f"Loading documents from loader: {loader_type}, config: {loader_config}" ) - if loader_type == "file": - document = get_file_documents(FileLoaderConfig(**loader_config)) - documents.extend(document) - elif loader_type == "web": - document = get_web_documents(WebLoaderConfig(**loader_config)) - documents.extend(document) - elif loader_type == "db": - document = get_db_documents(DBLoaderConfig(**loader_config)) - documents.extend(document) + match loader_type: + case "file": + document = get_file_documents(FileLoaderConfig(**loader_config)) + case "web": + document = get_web_documents(WebLoaderConfig(**loader_config)) + case "db": + document = get_db_documents( + configs=[DBLoaderConfig(**cfg) for cfg in loader_config] + ) + case _: + raise ValueError(f"Invalid loader type: {loader_type}") + documents.extend(document) return documents diff --git a/templates/components/loaders/python/db.py b/templates/components/loaders/python/db.py index a452906e..d5c9ffde 100644 --- a/templates/components/loaders/python/db.py +++ b/templates/components/loaders/python/db.py @@ -1,21 +1,26 @@ -# SPDX-FileCopyrightText: 2024 Deutsche Telekom AG, LlamaIndex, Vercel, Inc. -# -# SPDX-License-Identifier: MIT - import os -from pydantic import BaseModel +import logging +from typing import List +from pydantic import BaseModel, validator from llama_index.core.indices.vector_store import VectorStoreIndex +logger = logging.getLogger(__name__) + class DBLoaderConfig(BaseModel): uri: str - query: str + queries: List[str] -def get_db_documents(config: DBLoaderConfig): +def get_db_documents(configs: list[DBLoaderConfig]): from llama_index.readers.database import DatabaseReader - loader = DatabaseReader(uri=config.uri) - documents = loader.load_data(query=config.query) + docs = [] + for entry in configs: + loader = DatabaseReader(uri=entry.uri) + for query in entry.queries: + logger.info(f"Loading data from database with query: {query}") + documents = loader.load_data(query=query) + docs.extend(documents) return documents diff --git a/templates/components/loaders/python/file.py b/templates/components/loaders/python/file.py index 85c3b1a5..a814b0d0 100644 --- a/templates/components/loaders/python/file.py +++ b/templates/components/loaders/python/file.py @@ -1,7 +1,3 @@ -# SPDX-FileCopyrightText: 2024 Deutsche Telekom AG, LlamaIndex, Vercel, Inc. -# -# SPDX-License-Identifier: MIT - import os from llama_parse import LlamaParse from pydantic import BaseModel, validator diff --git a/templates/components/loaders/python/web.py b/templates/components/loaders/python/web.py index 7d06ff13..563e51b5 100644 --- a/templates/components/loaders/python/web.py +++ b/templates/components/loaders/python/web.py @@ -1,7 +1,3 @@ -# SPDX-FileCopyrightText: 2024 Deutsche Telekom AG, LlamaIndex, Vercel, Inc. -# -# SPDX-License-Identifier: MIT - import os import json from pydantic import BaseModel, Field diff --git a/templates/components/loaders/typescript/file/loader.ts b/templates/components/loaders/typescript/file/loader.ts new file mode 100644 index 00000000..3039f34f --- /dev/null +++ b/templates/components/loaders/typescript/file/loader.ts @@ -0,0 +1,9 @@ +import { SimpleDirectoryReader } from "llamaindex"; + +export const DATA_DIR = "./data"; + +export async function getDocuments() { + return await new SimpleDirectoryReader().loadData({ + directoryPath: DATA_DIR, + }); +} diff --git a/templates/components/loaders/typescript/llama_parse/loader.ts b/templates/components/loaders/typescript/llama_parse/loader.ts new file mode 100644 index 00000000..f285673f --- /dev/null +++ b/templates/components/loaders/typescript/llama_parse/loader.ts @@ -0,0 +1,19 @@ +import { + FILE_EXT_TO_READER, + LlamaParseReader, + SimpleDirectoryReader, +} from "llamaindex"; + +export const DATA_DIR = "./data"; + +export async function getDocuments() { + const reader = new SimpleDirectoryReader(); + // Load PDFs using LlamaParseReader + return await reader.loadData({ + directoryPath: DATA_DIR, + fileExtToReader: { + ...FILE_EXT_TO_READER, + pdf: new LlamaParseReader({ resultType: "markdown" }), + }, + }); +} diff --git a/templates/components/observability/python/opentelemetry/observability.py b/templates/components/observability/python/opentelemetry/observability.py new file mode 100644 index 00000000..046d714e --- /dev/null +++ b/templates/components/observability/python/opentelemetry/observability.py @@ -0,0 +1,5 @@ +from traceloop.sdk import Traceloop + + +def init_observability(): + Traceloop.init() diff --git a/templates/components/observability/typescript/opentelemetry/index.ts b/templates/components/observability/typescript/opentelemetry/index.ts index ba59a71c..7e54b5fe 100644 --- a/templates/components/observability/typescript/opentelemetry/index.ts +++ b/templates/components/observability/typescript/opentelemetry/index.ts @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2024 Deutsche Telekom AG, LlamaIndex, Vercel, Inc. -// -// SPDX-License-Identifier: MIT - import * as traceloop from "@traceloop/node-server-sdk"; import * as LlamaIndex from "llamaindex"; diff --git a/templates/components/sample-projects/llamapack/README-template.md b/templates/components/sample-projects/llamapack/README-template.md index b7ff4ecb..f669c38c 100644 --- a/templates/components/sample-projects/llamapack/README-template.md +++ b/templates/components/sample-projects/llamapack/README-template.md @@ -1,9 +1,3 @@ - - --- ## Quickstart diff --git a/templates/components/sample-projects/llamapack/pyproject.toml b/templates/components/sample-projects/llamapack/pyproject.toml index 5cc1d04f..4bd28bd8 100644 --- a/templates/components/sample-projects/llamapack/pyproject.toml +++ b/templates/components/sample-projects/llamapack/pyproject.toml @@ -1,7 +1,3 @@ -# SPDX-FileCopyrightText: 2024 Deutsche Telekom AG, LlamaIndex, Vercel, Inc. -# -# SPDX-License-Identifier: MIT - [tool.poetry] name = "app" version = "0.1.0" diff --git a/templates/components/ui/html/chat/chat-avatar.tsx b/templates/components/ui/html/chat/chat-avatar.tsx index 127620f0..cd241104 100644 --- a/templates/components/ui/html/chat/chat-avatar.tsx +++ b/templates/components/ui/html/chat/chat-avatar.tsx @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2024 Deutsche Telekom AG, LlamaIndex, Vercel, Inc. -// -// SPDX-License-Identifier: MIT - "use client"; import Image from "next/image"; diff --git a/templates/components/ui/html/chat/chat-input.tsx b/templates/components/ui/html/chat/chat-input.tsx index 7183137f..7c3e8728 100644 --- a/templates/components/ui/html/chat/chat-input.tsx +++ b/templates/components/ui/html/chat/chat-input.tsx @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2024 Deutsche Telekom AG, LlamaIndex, Vercel, Inc. -// -// SPDX-License-Identifier: MIT - "use client"; export interface ChatInputProps { diff --git a/templates/components/ui/html/chat/chat-item.tsx b/templates/components/ui/html/chat/chat-item.tsx index fa1289ae..790fbed6 100644 --- a/templates/components/ui/html/chat/chat-item.tsx +++ b/templates/components/ui/html/chat/chat-item.tsx @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2024 Deutsche Telekom AG, LlamaIndex, Vercel, Inc. -// -// SPDX-License-Identifier: MIT - "use client"; import ChatAvatar from "./chat-avatar"; diff --git a/templates/components/ui/html/chat/chat-messages.tsx b/templates/components/ui/html/chat/chat-messages.tsx index f3e35e99..0e978394 100644 --- a/templates/components/ui/html/chat/chat-messages.tsx +++ b/templates/components/ui/html/chat/chat-messages.tsx @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2024 Deutsche Telekom AG, LlamaIndex, Vercel, Inc. -// -// SPDX-License-Identifier: MIT - "use client"; import { useEffect, useRef } from "react"; diff --git a/templates/components/ui/html/chat/index.ts b/templates/components/ui/html/chat/index.ts index 47464072..5de7dce4 100644 --- a/templates/components/ui/html/chat/index.ts +++ b/templates/components/ui/html/chat/index.ts @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2024 Deutsche Telekom AG, LlamaIndex, Vercel, Inc. -// -// SPDX-License-Identifier: MIT - import ChatInput from "./chat-input"; import ChatMessages from "./chat-messages"; diff --git a/templates/components/vectordbs/python/astra/__init__.py b/templates/components/vectordbs/python/astra/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/templates/components/vectordbs/python/astra/generate.py b/templates/components/vectordbs/python/astra/generate.py new file mode 100644 index 00000000..4d2a54af --- /dev/null +++ b/templates/components/vectordbs/python/astra/generate.py @@ -0,0 +1,37 @@ +from dotenv import load_dotenv + +load_dotenv() + +import os +import logging +from llama_index.core.storage import StorageContext +from llama_index.core.indices import VectorStoreIndex +from llama_index.vector_stores.astra_db import AstraDBVectorStore +from app.settings import init_settings +from app.engine.loaders import get_documents + +logging.basicConfig(level=logging.INFO) +logger = logging.getLogger() + + +def generate_datasource(): + init_settings() + logger.info("Creating new index") + documents = get_documents() + store = AstraDBVectorStore( + token=os.environ["ASTRA_DB_APPLICATION_TOKEN"], + api_endpoint=os.environ["ASTRA_DB_ENDPOINT"], + collection_name=os.environ["ASTRA_DB_COLLECTION"], + embedding_dimension=int(os.environ["EMBEDDING_DIM"]), + ) + storage_context = StorageContext.from_defaults(vector_store=store) + VectorStoreIndex.from_documents( + documents, + storage_context=storage_context, + show_progress=True, # this will show you a progress bar as the embeddings are created + ) + logger.info(f"Successfully created embeddings in the AstraDB") + + +if __name__ == "__main__": + generate_datasource() diff --git a/templates/components/vectordbs/python/astra/index.py b/templates/components/vectordbs/python/astra/index.py new file mode 100644 index 00000000..b1389f76 --- /dev/null +++ b/templates/components/vectordbs/python/astra/index.py @@ -0,0 +1,21 @@ +import logging +import os + +from llama_index.core.indices import VectorStoreIndex +from llama_index.vector_stores.astra_db import AstraDBVectorStore + + +logger = logging.getLogger("uvicorn") + + +def get_index(): + logger.info("Connecting to index from AstraDB...") + store = AstraDBVectorStore( + token=os.environ["ASTRA_DB_APPLICATION_TOKEN"], + api_endpoint=os.environ["ASTRA_DB_ENDPOINT"], + collection_name=os.environ["ASTRA_DB_COLLECTION"], + embedding_dimension=int(os.environ["EMBEDDING_DIM"]), + ) + index = VectorStoreIndex.from_vector_store(store) + logger.info("Finished connecting to index from AstraDB.") + return index diff --git a/templates/components/vectordbs/python/milvus/generate.py b/templates/components/vectordbs/python/milvus/generate.py index 9ee20ad8..b5bfc9f9 100644 --- a/templates/components/vectordbs/python/milvus/generate.py +++ b/templates/components/vectordbs/python/milvus/generate.py @@ -1,7 +1,3 @@ -# SPDX-FileCopyrightText: 2024 Deutsche Telekom AG, LlamaIndex, Vercel, Inc. -# -# SPDX-License-Identifier: MIT - from dotenv import load_dotenv load_dotenv() @@ -19,6 +15,7 @@ def generate_datasource(): + init_settings() logger.info("Creating new index") # load the documents and create the index documents = get_documents() @@ -39,5 +36,4 @@ def generate_datasource(): if __name__ == "__main__": - init_settings() generate_datasource() diff --git a/templates/components/vectordbs/python/milvus/index.py b/templates/components/vectordbs/python/milvus/index.py index a1c8fa6e..ffd87e63 100644 --- a/templates/components/vectordbs/python/milvus/index.py +++ b/templates/components/vectordbs/python/milvus/index.py @@ -1,7 +1,3 @@ -# SPDX-FileCopyrightText: 2024 Deutsche Telekom AG, LlamaIndex, Vercel, Inc. -# -# SPDX-License-Identifier: MIT - import logging import os diff --git a/templates/components/vectordbs/python/mongo/generate.py b/templates/components/vectordbs/python/mongo/generate.py index ea391429..abe844c0 100644 --- a/templates/components/vectordbs/python/mongo/generate.py +++ b/templates/components/vectordbs/python/mongo/generate.py @@ -1,7 +1,3 @@ -# SPDX-FileCopyrightText: 2024 Deutsche Telekom AG, LlamaIndex, Vercel, Inc. -# -# SPDX-License-Identifier: MIT - from dotenv import load_dotenv load_dotenv() @@ -19,6 +15,7 @@ def generate_datasource(): + init_settings() logger.info("Creating new index") # load the documents and create the index documents = get_documents() @@ -43,5 +40,4 @@ def generate_datasource(): if __name__ == "__main__": - init_settings() generate_datasource() diff --git a/templates/components/vectordbs/python/mongo/index.py b/templates/components/vectordbs/python/mongo/index.py index 06c788a4..6dba7c1d 100644 --- a/templates/components/vectordbs/python/mongo/index.py +++ b/templates/components/vectordbs/python/mongo/index.py @@ -1,7 +1,3 @@ -# SPDX-FileCopyrightText: 2024 Deutsche Telekom AG, LlamaIndex, Vercel, Inc. -# -# SPDX-License-Identifier: MIT - import logging import os diff --git a/templates/components/vectordbs/python/none/constants.py b/templates/components/vectordbs/python/none/constants.py index 6da783a6..254998eb 100644 --- a/templates/components/vectordbs/python/none/constants.py +++ b/templates/components/vectordbs/python/none/constants.py @@ -1,5 +1 @@ -# SPDX-FileCopyrightText: 2024 Deutsche Telekom AG, LlamaIndex, Vercel, Inc. -# -# SPDX-License-Identifier: MIT - STORAGE_DIR = "storage" # directory to cache the generated index diff --git a/templates/components/vectordbs/python/none/generate.py b/templates/components/vectordbs/python/none/generate.py index f605285f..e38d89cb 100644 --- a/templates/components/vectordbs/python/none/generate.py +++ b/templates/components/vectordbs/python/none/generate.py @@ -1,7 +1,3 @@ -# SPDX-FileCopyrightText: 2024 Deutsche Telekom AG, LlamaIndex, Vercel, Inc. -# -# SPDX-License-Identifier: MIT - from dotenv import load_dotenv load_dotenv() @@ -20,6 +16,7 @@ def generate_datasource(): + init_settings() logger.info("Creating new index") # load the documents and create the index documents = get_documents() @@ -32,5 +29,4 @@ def generate_datasource(): if __name__ == "__main__": - init_settings() generate_datasource() diff --git a/templates/components/vectordbs/python/none/index.py b/templates/components/vectordbs/python/none/index.py index 3182d3db..8b77414a 100644 --- a/templates/components/vectordbs/python/none/index.py +++ b/templates/components/vectordbs/python/none/index.py @@ -1,7 +1,3 @@ -# SPDX-FileCopyrightText: 2024 Deutsche Telekom AG, LlamaIndex, Vercel, Inc. -# -# SPDX-License-Identifier: MIT - import logging import os @@ -15,10 +11,7 @@ def get_index(): # check if storage already exists if not os.path.exists(STORAGE_DIR): - raise Exception( - "StorageContext is empty - call 'python app/engine/generate.py' to generate the storage first" - ) - + return None # load the existing index logger.info(f"Loading index from {STORAGE_DIR}...") storage_context = StorageContext.from_defaults(persist_dir=STORAGE_DIR) diff --git a/templates/components/vectordbs/python/pg/constants.py b/templates/components/vectordbs/python/pg/constants.py index 4d44e1df..a4ebd918 100644 --- a/templates/components/vectordbs/python/pg/constants.py +++ b/templates/components/vectordbs/python/pg/constants.py @@ -1,6 +1,2 @@ -# SPDX-FileCopyrightText: 2024 Deutsche Telekom AG, LlamaIndex, Vercel, Inc. -# -# SPDX-License-Identifier: MIT - PGVECTOR_SCHEMA = "public" PGVECTOR_TABLE = "llamaindex_embedding" \ No newline at end of file diff --git a/templates/components/vectordbs/python/pg/generate.py b/templates/components/vectordbs/python/pg/generate.py index 0780d42d..79fa3bd7 100644 --- a/templates/components/vectordbs/python/pg/generate.py +++ b/templates/components/vectordbs/python/pg/generate.py @@ -1,7 +1,3 @@ -# SPDX-FileCopyrightText: 2024 Deutsche Telekom AG, LlamaIndex, Vercel, Inc. -# -# SPDX-License-Identifier: MIT - from dotenv import load_dotenv load_dotenv() @@ -19,6 +15,7 @@ def generate_datasource(): + init_settings() logger.info("Creating new index") # load the documents and create the index documents = get_documents() @@ -35,5 +32,4 @@ def generate_datasource(): if __name__ == "__main__": - init_settings() generate_datasource() diff --git a/templates/components/vectordbs/python/pg/index.py b/templates/components/vectordbs/python/pg/index.py index 1e50c06f..3c4f3180 100644 --- a/templates/components/vectordbs/python/pg/index.py +++ b/templates/components/vectordbs/python/pg/index.py @@ -1,7 +1,3 @@ -# SPDX-FileCopyrightText: 2024 Deutsche Telekom AG, LlamaIndex, Vercel, Inc. -# -# SPDX-License-Identifier: MIT - import logging from llama_index.core.indices.vector_store import VectorStoreIndex from app.engine.utils import init_pg_vector_store_from_env diff --git a/templates/components/vectordbs/python/pg/utils.py b/templates/components/vectordbs/python/pg/utils.py index 131cf780..39127846 100644 --- a/templates/components/vectordbs/python/pg/utils.py +++ b/templates/components/vectordbs/python/pg/utils.py @@ -1,7 +1,3 @@ -# SPDX-FileCopyrightText: 2024 Deutsche Telekom AG, LlamaIndex, Vercel, Inc. -# -# SPDX-License-Identifier: MIT - import os from llama_index.vector_stores.postgres import PGVectorStore from urllib.parse import urlparse @@ -28,5 +24,4 @@ def init_pg_vector_store_from_env(): async_connection_string=async_conn_string, schema_name=PGVECTOR_SCHEMA, table_name=PGVECTOR_TABLE, - embed_dim=768, ) diff --git a/templates/components/vectordbs/python/pinecone/generate.py b/templates/components/vectordbs/python/pinecone/generate.py index 5086eeed..5f233ba2 100644 --- a/templates/components/vectordbs/python/pinecone/generate.py +++ b/templates/components/vectordbs/python/pinecone/generate.py @@ -1,7 +1,3 @@ -# SPDX-FileCopyrightText: 2024 Deutsche Telekom AG, LlamaIndex, Vercel, Inc. -# -# SPDX-License-Identifier: MIT - from dotenv import load_dotenv load_dotenv() @@ -19,6 +15,7 @@ def generate_datasource(): + init_settings() logger.info("Creating new index") # load the documents and create the index documents = get_documents() @@ -39,5 +36,4 @@ def generate_datasource(): if __name__ == "__main__": - init_settings() generate_datasource() diff --git a/templates/components/vectordbs/python/pinecone/index.py b/templates/components/vectordbs/python/pinecone/index.py index 16aa8dfb..98824ffd 100644 --- a/templates/components/vectordbs/python/pinecone/index.py +++ b/templates/components/vectordbs/python/pinecone/index.py @@ -1,7 +1,3 @@ -# SPDX-FileCopyrightText: 2024 Deutsche Telekom AG, LlamaIndex, Vercel, Inc. -# -# SPDX-License-Identifier: MIT - import logging import os diff --git a/templates/components/vectordbs/python/qdrant/__init__.py b/templates/components/vectordbs/python/qdrant/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/templates/components/vectordbs/python/qdrant/generate.py b/templates/components/vectordbs/python/qdrant/generate.py new file mode 100644 index 00000000..db7c055e --- /dev/null +++ b/templates/components/vectordbs/python/qdrant/generate.py @@ -0,0 +1,37 @@ +import logging +import os +from app.engine.loaders import get_documents +from app.settings import init_settings +from dotenv import load_dotenv +from llama_index.core.indices import VectorStoreIndex +from llama_index.core.storage import StorageContext +from llama_index.vector_stores.qdrant import QdrantVectorStore +load_dotenv() + +logging.basicConfig(level=logging.INFO) +logger = logging.getLogger() + + +def generate_datasource(): + init_settings() + logger.info("Creating new index with Qdrant") + # load the documents and create the index + documents = get_documents() + store = QdrantVectorStore( + collection_name=os.getenv("QDRANT_COLLECTION"), + url=os.getenv("QDRANT_URL"), + api_key=os.getenv("QDRANT_API_KEY"), + ) + storage_context = StorageContext.from_defaults(vector_store=store) + VectorStoreIndex.from_documents( + documents, + storage_context=storage_context, + show_progress=True, # this will show you a progress bar as the embeddings are created + ) + logger.info( + f"Successfully uploaded documents to the {os.getenv('QDRANT_COLLECTION')} collection." + ) + + +if __name__ == "__main__": + generate_datasource() diff --git a/templates/components/vectordbs/python/qdrant/index.py b/templates/components/vectordbs/python/qdrant/index.py new file mode 100644 index 00000000..0a388d8a --- /dev/null +++ b/templates/components/vectordbs/python/qdrant/index.py @@ -0,0 +1,20 @@ +import logging +import os + +from llama_index.core.indices import VectorStoreIndex +from llama_index.vector_stores.qdrant import QdrantVectorStore + + +logger = logging.getLogger("uvicorn") + + +def get_index(): + logger.info("Connecting to Qdrant collection..") + store = QdrantVectorStore( + collection_name=os.getenv("QDRANT_COLLECTION"), + url=os.getenv("QDRANT_URL"), + api_key=os.getenv("QDRANT_API_KEY"), + ) + index = VectorStoreIndex.from_vector_store(store) + logger.info("Finished connecting to Qdrant collection.") + return index diff --git a/templates/components/vectordbs/typescript/astra/generate.ts b/templates/components/vectordbs/typescript/astra/generate.ts new file mode 100644 index 00000000..50b9c349 --- /dev/null +++ b/templates/components/vectordbs/typescript/astra/generate.ts @@ -0,0 +1,43 @@ +/* eslint-disable turbo/no-undeclared-env-vars */ +import * as dotenv from "dotenv"; +import { + AstraDBVectorStore, + VectorStoreIndex, + storageContextFromDefaults, +} from "llamaindex"; +import { getDocuments } from "./loader"; +import { initSettings } from "./settings"; +import { checkRequiredEnvVars } from "./shared"; + +dotenv.config(); + +async function loadAndIndex() { + // load objects from storage and convert them into LlamaIndex Document objects + const documents = await getDocuments(); + + // create vector store and a collection + const collectionName = process.env.ASTRA_DB_COLLECTION!; + const vectorStore = new AstraDBVectorStore(); + await vectorStore.create(collectionName, { + vector: { + dimension: parseInt(process.env.EMBEDDING_DIM!), + metric: "cosine", + }, + }); + await vectorStore.connect(collectionName); + + // create index from documents and store them in Astra + console.log("Start creating embeddings..."); + const storageContext = await storageContextFromDefaults({ vectorStore }); + await VectorStoreIndex.fromDocuments(documents, { storageContext }); + console.log( + "Successfully created embeddings and save to your Astra database.", + ); +} + +(async () => { + checkRequiredEnvVars(); + initSettings(); + await loadAndIndex(); + console.log("Finished generating storage."); +})(); diff --git a/templates/components/vectordbs/typescript/astra/index.ts b/templates/components/vectordbs/typescript/astra/index.ts new file mode 100644 index 00000000..c659bc92 --- /dev/null +++ b/templates/components/vectordbs/typescript/astra/index.ts @@ -0,0 +1,10 @@ +/* eslint-disable turbo/no-undeclared-env-vars */ +import { AstraDBVectorStore, VectorStoreIndex } from "llamaindex"; +import { checkRequiredEnvVars } from "./shared"; + +export async function getDataSource() { + checkRequiredEnvVars(); + const store = new AstraDBVectorStore(); + await store.connect(process.env.ASTRA_DB_COLLECTION!); + return await VectorStoreIndex.fromVectorStore(store); +} diff --git a/templates/components/vectordbs/typescript/astra/shared.ts b/templates/components/vectordbs/typescript/astra/shared.ts new file mode 100644 index 00000000..20d0ad09 --- /dev/null +++ b/templates/components/vectordbs/typescript/astra/shared.ts @@ -0,0 +1,23 @@ +const REQUIRED_ENV_VARS = [ + "ASTRA_DB_APPLICATION_TOKEN", + "ASTRA_DB_ENDPOINT", + "ASTRA_DB_COLLECTION", + "EMBEDDING_DIM", +]; + +export function checkRequiredEnvVars() { + const missingEnvVars = REQUIRED_ENV_VARS.filter((envVar) => { + return !process.env[envVar]; + }); + + if (missingEnvVars.length > 0) { + console.log( + `The following environment variables are required but missing: ${missingEnvVars.join( + ", ", + )}`, + ); + throw new Error( + `Missing environment variables: ${missingEnvVars.join(", ")}`, + ); + } +} diff --git a/templates/components/vectordbs/typescript/milvus/generate.ts b/templates/components/vectordbs/typescript/milvus/generate.ts new file mode 100644 index 00000000..709d3546 --- /dev/null +++ b/templates/components/vectordbs/typescript/milvus/generate.ts @@ -0,0 +1,39 @@ +/* eslint-disable turbo/no-undeclared-env-vars */ +import * as dotenv from "dotenv"; +import { + MilvusVectorStore, + VectorStoreIndex, + storageContextFromDefaults, +} from "llamaindex"; +import { getDocuments } from "./loader"; +import { initSettings } from "./settings"; +import { checkRequiredEnvVars, getMilvusClient } from "./shared"; + +dotenv.config(); + +const collectionName = process.env.MILVUS_COLLECTION; + +async function loadAndIndex() { + // load objects from storage and convert them into LlamaIndex Document objects + const documents = await getDocuments(); + + // Connect to Milvus + const milvusClient = getMilvusClient(); + const vectorStore = new MilvusVectorStore({ milvusClient }); + + // now create an index from all the Documents and store them in Milvus + const storageContext = await storageContextFromDefaults({ vectorStore }); + await VectorStoreIndex.fromDocuments(documents, { + storageContext: storageContext, + }); + console.log( + `Successfully created embeddings in the Milvus collection ${collectionName}.`, + ); +} + +(async () => { + checkRequiredEnvVars(); + initSettings(); + await loadAndIndex(); + console.log("Finished generating storage."); +})(); diff --git a/templates/components/vectordbs/typescript/milvus/index.ts b/templates/components/vectordbs/typescript/milvus/index.ts index 5e45ae66..c10bad6d 100644 --- a/templates/components/vectordbs/typescript/milvus/index.ts +++ b/templates/components/vectordbs/typescript/milvus/index.ts @@ -1,39 +1,10 @@ -// SPDX-FileCopyrightText: 2024 Deutsche Telekom AG, LlamaIndex, Vercel, Inc. -// -// SPDX-License-Identifier: MIT +import { MilvusVectorStore, VectorStoreIndex } from "llamaindex"; +import { checkRequiredEnvVars, getMilvusClient } from "./shared"; -import { - ContextChatEngine, - LLM, - MilvusVectorStore, - serviceContextFromDefaults, - VectorStoreIndex, -} from "llamaindex"; -import { - checkRequiredEnvVars, - CHUNK_OVERLAP, - CHUNK_SIZE, - getMilvusClient, -} from "./shared.mjs"; - -async function getDataSource(llm: LLM) { +export async function getDataSource() { checkRequiredEnvVars(); - const serviceContext = serviceContextFromDefaults({ - llm, - chunkSize: CHUNK_SIZE, - chunkOverlap: CHUNK_OVERLAP, - }); const milvusClient = getMilvusClient(); const store = new MilvusVectorStore({ milvusClient }); - return await VectorStoreIndex.fromVectorStore(store, serviceContext); -} - -export async function createChatEngine(llm: LLM) { - const index = await getDataSource(llm); - const retriever = index.asRetriever({ similarityTopK: 3 }); - return new ContextChatEngine({ - chatModel: llm, - retriever, - }); + return await VectorStoreIndex.fromVectorStore(store); } diff --git a/templates/components/vectordbs/typescript/milvus/shared.ts b/templates/components/vectordbs/typescript/milvus/shared.ts new file mode 100644 index 00000000..5f4139aa --- /dev/null +++ b/templates/components/vectordbs/typescript/milvus/shared.ts @@ -0,0 +1,37 @@ +import { MilvusClient } from "@zilliz/milvus2-sdk-node"; + +const REQUIRED_ENV_VARS = [ + "MILVUS_ADDRESS", + "MILVUS_USERNAME", + "MILVUS_PASSWORD", + "MILVUS_COLLECTION", +]; + +export function getMilvusClient() { + const milvusAddress = process.env.MILVUS_ADDRESS; + if (!milvusAddress) { + throw new Error("MILVUS_ADDRESS environment variable is required"); + } + return new MilvusClient({ + address: process.env.MILVUS_ADDRESS!, + username: process.env.MILVUS_USERNAME, + password: process.env.MILVUS_PASSWORD, + }); +} + +export function checkRequiredEnvVars() { + const missingEnvVars = REQUIRED_ENV_VARS.filter((envVar) => { + return !process.env[envVar]; + }); + + if (missingEnvVars.length > 0) { + console.log( + `The following environment variables are required but missing: ${missingEnvVars.join( + ", ", + )}`, + ); + throw new Error( + `Missing environment variables: ${missingEnvVars.join(", ")}`, + ); + } +} diff --git a/templates/components/vectordbs/typescript/mongo/generate.ts b/templates/components/vectordbs/typescript/mongo/generate.ts new file mode 100644 index 00000000..da7aed57 --- /dev/null +++ b/templates/components/vectordbs/typescript/mongo/generate.ts @@ -0,0 +1,49 @@ +/* eslint-disable turbo/no-undeclared-env-vars */ +import * as dotenv from "dotenv"; +import { + MongoDBAtlasVectorSearch, + VectorStoreIndex, + storageContextFromDefaults, +} from "llamaindex"; +import { MongoClient } from "mongodb"; +import { getDocuments } from "./loader"; +import { initSettings } from "./settings"; +import { checkRequiredEnvVars } from "./shared"; + +dotenv.config(); + +const mongoUri = process.env.MONGO_URI!; +const databaseName = process.env.MONGODB_DATABASE!; +const vectorCollectionName = process.env.MONGODB_VECTORS!; +const indexName = process.env.MONGODB_VECTOR_INDEX; + +async function loadAndIndex() { + // Create a new client and connect to the server + const client = new MongoClient(mongoUri); + + // load objects from storage and convert them into LlamaIndex Document objects + const documents = await getDocuments(); + + // create Atlas as a vector store + const vectorStore = new MongoDBAtlasVectorSearch({ + mongodbClient: client, + dbName: databaseName, + collectionName: vectorCollectionName, // this is where your embeddings will be stored + indexName: indexName, // this is the name of the index you will need to create + }); + + // now create an index from all the Documents and store them in Atlas + const storageContext = await storageContextFromDefaults({ vectorStore }); + await VectorStoreIndex.fromDocuments(documents, { storageContext }); + console.log( + `Successfully created embeddings in the MongoDB collection ${vectorCollectionName}.`, + ); + await client.close(); +} + +(async () => { + checkRequiredEnvVars(); + initSettings(); + await loadAndIndex(); + console.log("Finished generating storage."); +})(); diff --git a/templates/components/vectordbs/typescript/mongo/index.ts b/templates/components/vectordbs/typescript/mongo/index.ts index 6d86e2dd..77dc7b4d 100644 --- a/templates/components/vectordbs/typescript/mongo/index.ts +++ b/templates/components/vectordbs/typescript/mongo/index.ts @@ -1,41 +1,17 @@ -// SPDX-FileCopyrightText: 2024 Deutsche Telekom AG, LlamaIndex, Vercel, Inc. -// -// SPDX-License-Identifier: MIT - /* eslint-disable turbo/no-undeclared-env-vars */ -import { - ContextChatEngine, - LLM, - MongoDBAtlasVectorSearch, - serviceContextFromDefaults, - VectorStoreIndex, -} from "llamaindex"; +import { MongoDBAtlasVectorSearch, VectorStoreIndex } from "llamaindex"; import { MongoClient } from "mongodb"; -import { checkRequiredEnvVars, CHUNK_OVERLAP, CHUNK_SIZE } from "./shared.mjs"; +import { checkRequiredEnvVars } from "./shared"; -async function getDataSource(llm: LLM) { +export async function getDataSource() { checkRequiredEnvVars(); const client = new MongoClient(process.env.MONGO_URI!); - const serviceContext = serviceContextFromDefaults({ - llm, - chunkSize: CHUNK_SIZE, - chunkOverlap: CHUNK_OVERLAP, - }); const store = new MongoDBAtlasVectorSearch({ mongodbClient: client, - dbName: process.env.MONGODB_DATABASE, - collectionName: process.env.MONGODB_VECTORS, + dbName: process.env.MONGODB_DATABASE!, + collectionName: process.env.MONGODB_VECTORS!, indexName: process.env.MONGODB_VECTOR_INDEX, }); - return await VectorStoreIndex.fromVectorStore(store, serviceContext); -} - -export async function createChatEngine(llm: LLM) { - const index = await getDataSource(llm); - const retriever = index.asRetriever({ similarityTopK: 3 }); - return new ContextChatEngine({ - chatModel: llm, - retriever, - }); + return await VectorStoreIndex.fromVectorStore(store); } diff --git a/templates/components/vectordbs/typescript/mongo/shared.ts b/templates/components/vectordbs/typescript/mongo/shared.ts new file mode 100644 index 00000000..d6532a56 --- /dev/null +++ b/templates/components/vectordbs/typescript/mongo/shared.ts @@ -0,0 +1,23 @@ +const REQUIRED_ENV_VARS = [ + "MONGO_URI", + "MONGODB_DATABASE", + "MONGODB_VECTORS", + "MONGODB_VECTOR_INDEX", +]; + +export function checkRequiredEnvVars() { + const missingEnvVars = REQUIRED_ENV_VARS.filter((envVar) => { + return !process.env[envVar]; + }); + + if (missingEnvVars.length > 0) { + console.log( + `The following environment variables are required but missing: ${missingEnvVars.join( + ", ", + )}`, + ); + throw new Error( + `Missing environment variables: ${missingEnvVars.join(", ")}`, + ); + } +} diff --git a/templates/components/vectordbs/typescript/none/generate.ts b/templates/components/vectordbs/typescript/none/generate.ts new file mode 100644 index 00000000..732ba211 --- /dev/null +++ b/templates/components/vectordbs/typescript/none/generate.ts @@ -0,0 +1,38 @@ +import { VectorStoreIndex, storageContextFromDefaults } from "llamaindex"; + +import * as dotenv from "dotenv"; + +import { getDocuments } from "./loader"; +import { initSettings } from "./settings"; +import { STORAGE_CACHE_DIR } from "./shared"; + +// Load environment variables from local .env file +dotenv.config(); + +async function getRuntime(func: any) { + const start = Date.now(); + await func(); + const end = Date.now(); + return end - start; +} + +async function generateDatasource() { + console.log(`Generating storage context...`); + // Split documents, create embeddings and store them in the storage context + const ms = await getRuntime(async () => { + const storageContext = await storageContextFromDefaults({ + persistDir: STORAGE_CACHE_DIR, + }); + const documents = await getDocuments(); + await VectorStoreIndex.fromDocuments(documents, { + storageContext, + }); + }); + console.log(`Storage context successfully generated in ${ms / 1000}s.`); +} + +(async () => { + initSettings(); + await generateDatasource(); + console.log("Finished generating storage."); +})(); diff --git a/templates/components/vectordbs/typescript/none/index.ts b/templates/components/vectordbs/typescript/none/index.ts index ab4e03e9..919ba3a6 100644 --- a/templates/components/vectordbs/typescript/none/index.ts +++ b/templates/components/vectordbs/typescript/none/index.ts @@ -1,22 +1,11 @@ -// SPDX-FileCopyrightText: 2024 Deutsche Telekom AG, LlamaIndex, Vercel, Inc. -// -// SPDX-License-Identifier: MIT - import { - LLM, - serviceContextFromDefaults, SimpleDocumentStore, storageContextFromDefaults, VectorStoreIndex, } from "llamaindex"; -import { CHUNK_OVERLAP, CHUNK_SIZE, STORAGE_CACHE_DIR } from "./constants.mjs"; +import { STORAGE_CACHE_DIR } from "./shared"; -export async function getDataSource(llm: LLM) { - const serviceContext = serviceContextFromDefaults({ - llm, - chunkSize: CHUNK_SIZE, - chunkOverlap: CHUNK_OVERLAP, - }); +export async function getDataSource() { const storageContext = await storageContextFromDefaults({ persistDir: `${STORAGE_CACHE_DIR}`, }); @@ -25,12 +14,9 @@ export async function getDataSource(llm: LLM) { (storageContext.docStore as SimpleDocumentStore).toDict(), ).length; if (numberOfDocs === 0) { - throw new Error( - `StorageContext is empty - call 'npm run generate' to generate the storage first`, - ); + return null; } return await VectorStoreIndex.init({ storageContext, - serviceContext, }); } diff --git a/templates/components/vectordbs/typescript/none/shared.ts b/templates/components/vectordbs/typescript/none/shared.ts new file mode 100644 index 00000000..e7736e5b --- /dev/null +++ b/templates/components/vectordbs/typescript/none/shared.ts @@ -0,0 +1 @@ +export const STORAGE_CACHE_DIR = "./cache"; diff --git a/templates/components/vectordbs/typescript/pg/generate.ts b/templates/components/vectordbs/typescript/pg/generate.ts new file mode 100644 index 00000000..f5664b6f --- /dev/null +++ b/templates/components/vectordbs/typescript/pg/generate.ts @@ -0,0 +1,45 @@ +/* eslint-disable turbo/no-undeclared-env-vars */ +import * as dotenv from "dotenv"; +import { + PGVectorStore, + VectorStoreIndex, + storageContextFromDefaults, +} from "llamaindex"; +import { getDocuments } from "./loader"; +import { initSettings } from "./settings"; +import { + PGVECTOR_COLLECTION, + PGVECTOR_SCHEMA, + PGVECTOR_TABLE, + checkRequiredEnvVars, +} from "./shared"; + +dotenv.config(); + +async function loadAndIndex() { + // load objects from storage and convert them into LlamaIndex Document objects + const documents = await getDocuments(); + + // create postgres vector store + const vectorStore = new PGVectorStore({ + connectionString: process.env.PG_CONNECTION_STRING, + schemaName: PGVECTOR_SCHEMA, + tableName: PGVECTOR_TABLE, + }); + vectorStore.setCollection(PGVECTOR_COLLECTION); + vectorStore.clearCollection(); + + // create index from all the Documents + console.log("Start creating embeddings..."); + const storageContext = await storageContextFromDefaults({ vectorStore }); + await VectorStoreIndex.fromDocuments(documents, { storageContext }); + console.log(`Successfully created embeddings.`); +} + +(async () => { + checkRequiredEnvVars(); + initSettings(); + await loadAndIndex(); + console.log("Finished generating storage."); + process.exit(0); +})(); diff --git a/templates/components/vectordbs/typescript/pg/index.ts b/templates/components/vectordbs/typescript/pg/index.ts index bb44a5b4..0b572d74 100644 --- a/templates/components/vectordbs/typescript/pg/index.ts +++ b/templates/components/vectordbs/typescript/pg/index.ts @@ -1,43 +1,17 @@ -// SPDX-FileCopyrightText: 2024 Deutsche Telekom AG, LlamaIndex, Vercel, Inc. -// -// SPDX-License-Identifier: MIT - /* eslint-disable turbo/no-undeclared-env-vars */ +import { PGVectorStore, VectorStoreIndex } from "llamaindex"; import { - ContextChatEngine, - LLM, - PGVectorStore, - VectorStoreIndex, - serviceContextFromDefaults, -} from "llamaindex"; -import { - CHUNK_OVERLAP, - CHUNK_SIZE, PGVECTOR_SCHEMA, PGVECTOR_TABLE, checkRequiredEnvVars, -} from "./shared.mjs"; +} from "./shared"; -async function getDataSource(llm: LLM) { +export async function getDataSource() { checkRequiredEnvVars(); const pgvs = new PGVectorStore({ connectionString: process.env.PG_CONNECTION_STRING, schemaName: PGVECTOR_SCHEMA, tableName: PGVECTOR_TABLE, }); - const serviceContext = serviceContextFromDefaults({ - llm, - chunkSize: CHUNK_SIZE, - chunkOverlap: CHUNK_OVERLAP, - }); - return await VectorStoreIndex.fromVectorStore(pgvs, serviceContext); -} - -export async function createChatEngine(llm: LLM) { - const index = await getDataSource(llm); - const retriever = index.asRetriever({ similarityTopK: 3 }); - return new ContextChatEngine({ - chatModel: llm, - retriever, - }); + return await VectorStoreIndex.fromVectorStore(pgvs); } diff --git a/templates/components/vectordbs/typescript/pg/shared.ts b/templates/components/vectordbs/typescript/pg/shared.ts new file mode 100644 index 00000000..e241f907 --- /dev/null +++ b/templates/components/vectordbs/typescript/pg/shared.ts @@ -0,0 +1,22 @@ +export const PGVECTOR_COLLECTION = "data"; +export const PGVECTOR_SCHEMA = "public"; +export const PGVECTOR_TABLE = "llamaindex_embedding"; + +const REQUIRED_ENV_VARS = ["PG_CONNECTION_STRING"]; + +export function checkRequiredEnvVars() { + const missingEnvVars = REQUIRED_ENV_VARS.filter((envVar) => { + return !process.env[envVar]; + }); + + if (missingEnvVars.length > 0) { + console.log( + `The following environment variables are required but missing: ${missingEnvVars.join( + ", ", + )}`, + ); + throw new Error( + `Missing environment variables: ${missingEnvVars.join(", ")}`, + ); + } +} diff --git a/templates/components/vectordbs/typescript/pinecone/generate.ts b/templates/components/vectordbs/typescript/pinecone/generate.ts new file mode 100644 index 00000000..c275bc58 --- /dev/null +++ b/templates/components/vectordbs/typescript/pinecone/generate.ts @@ -0,0 +1,35 @@ +/* eslint-disable turbo/no-undeclared-env-vars */ +import * as dotenv from "dotenv"; +import { + PineconeVectorStore, + VectorStoreIndex, + storageContextFromDefaults, +} from "llamaindex"; +import { getDocuments } from "./loader"; +import { initSettings } from "./settings"; +import { checkRequiredEnvVars } from "./shared"; + +dotenv.config(); + +async function loadAndIndex() { + // load objects from storage and convert them into LlamaIndex Document objects + const documents = await getDocuments(); + + // create vector store + const vectorStore = new PineconeVectorStore(); + + // create index from all the Documentss and store them in Pinecone + console.log("Start creating embeddings..."); + const storageContext = await storageContextFromDefaults({ vectorStore }); + await VectorStoreIndex.fromDocuments(documents, { storageContext }); + console.log( + "Successfully created embeddings and save to your Pinecone index.", + ); +} + +(async () => { + checkRequiredEnvVars(); + initSettings(); + await loadAndIndex(); + console.log("Finished generating storage."); +})(); diff --git a/templates/components/vectordbs/typescript/pinecone/index.ts b/templates/components/vectordbs/typescript/pinecone/index.ts index c8f6d9e4..226713d9 100644 --- a/templates/components/vectordbs/typescript/pinecone/index.ts +++ b/templates/components/vectordbs/typescript/pinecone/index.ts @@ -1,33 +1,9 @@ -// SPDX-FileCopyrightText: 2024 Deutsche Telekom AG, LlamaIndex, Vercel, Inc. -// -// SPDX-License-Identifier: MIT - /* eslint-disable turbo/no-undeclared-env-vars */ -import { - ContextChatEngine, - LLM, - PineconeVectorStore, - VectorStoreIndex, - serviceContextFromDefaults, -} from "llamaindex"; -import { CHUNK_OVERLAP, CHUNK_SIZE, checkRequiredEnvVars } from "./shared.mjs"; +import { PineconeVectorStore, VectorStoreIndex } from "llamaindex"; +import { checkRequiredEnvVars } from "./shared"; -async function getDataSource(llm: LLM) { +export async function getDataSource() { checkRequiredEnvVars(); - const serviceContext = serviceContextFromDefaults({ - llm, - chunkSize: CHUNK_SIZE, - chunkOverlap: CHUNK_OVERLAP, - }); const store = new PineconeVectorStore(); - return await VectorStoreIndex.fromVectorStore(store, serviceContext); -} - -export async function createChatEngine(llm: LLM) { - const index = await getDataSource(llm); - const retriever = index.asRetriever({ similarityTopK: 5 }); - return new ContextChatEngine({ - chatModel: llm, - retriever, - }); + return await VectorStoreIndex.fromVectorStore(store); } diff --git a/templates/components/vectordbs/typescript/pinecone/shared.ts b/templates/components/vectordbs/typescript/pinecone/shared.ts new file mode 100644 index 00000000..c4e9911d --- /dev/null +++ b/templates/components/vectordbs/typescript/pinecone/shared.ts @@ -0,0 +1,18 @@ +const REQUIRED_ENV_VARS = ["PINECONE_ENVIRONMENT", "PINECONE_API_KEY"]; + +export function checkRequiredEnvVars() { + const missingEnvVars = REQUIRED_ENV_VARS.filter((envVar) => { + return !process.env[envVar]; + }); + + if (missingEnvVars.length > 0) { + console.log( + `The following environment variables are required but missing: ${missingEnvVars.join( + ", ", + )}`, + ); + throw new Error( + `Missing environment variables: ${missingEnvVars.join(", ")}`, + ); + } +} diff --git a/templates/components/vectordbs/typescript/qdrant/generate.ts b/templates/components/vectordbs/typescript/qdrant/generate.ts new file mode 100644 index 00000000..f0e7fa40 --- /dev/null +++ b/templates/components/vectordbs/typescript/qdrant/generate.ts @@ -0,0 +1,37 @@ +/* eslint-disable turbo/no-undeclared-env-vars */ +import * as dotenv from "dotenv"; +import { + QdrantVectorStore, + VectorStoreIndex, + storageContextFromDefaults, +} from "llamaindex"; +import { getDocuments } from "./loader"; +import { initSettings } from "./settings"; +import { checkRequiredEnvVars, getQdrantClient } from "./shared"; + +dotenv.config(); + +const collectionName = process.env.QDRANT_COLLECTION; + +async function loadAndIndex() { + // load objects from storage and convert them into LlamaIndex Document objects + const documents = await getDocuments(); + + // Connect to Qdrant + const vectorStore = new QdrantVectorStore(collectionName, getQdrantClient()); + + const storageContext = await storageContextFromDefaults({ vectorStore }); + await VectorStoreIndex.fromDocuments(documents, { + storageContext: storageContext, + }); + console.log( + `Successfully upload embeddings to Qdrant collection ${collectionName}.`, + ); +} + +(async () => { + checkRequiredEnvVars(); + initSettings(); + await loadAndIndex(); + console.log("Finished generating storage."); +})(); diff --git a/templates/components/vectordbs/typescript/qdrant/index.ts b/templates/components/vectordbs/typescript/qdrant/index.ts new file mode 100644 index 00000000..229d7a39 --- /dev/null +++ b/templates/components/vectordbs/typescript/qdrant/index.ts @@ -0,0 +1,13 @@ +import * as dotenv from "dotenv"; +import { QdrantVectorStore, VectorStoreIndex } from "llamaindex"; +import { checkRequiredEnvVars, getQdrantClient } from "./shared"; + +dotenv.config(); + +export async function getDataSource() { + checkRequiredEnvVars(); + const collectionName = process.env.QDRANT_COLLECTION; + const store = new QdrantVectorStore(collectionName, getQdrantClient()); + + return await VectorStoreIndex.fromVectorStore(store); +} diff --git a/templates/components/vectordbs/typescript/qdrant/shared.ts b/templates/components/vectordbs/typescript/qdrant/shared.ts new file mode 100644 index 00000000..e1475eee --- /dev/null +++ b/templates/components/vectordbs/typescript/qdrant/shared.ts @@ -0,0 +1,32 @@ +import { QdrantClient } from "@qdrant/js-client-rest"; + +const REQUIRED_ENV_VARS = ["QDRANT_URL", "QDRANT_COLLECTION"]; // QDRANT_API_KEY is optional + +export function getQdrantClient() { + const url = process.env.QDRANT_URL; + if (!url) { + throw new Error("QDRANT_URL environment variable is required"); + } + const apiKey = process.env?.QDRANT_API_KEY; + return new QdrantClient({ + url, + apiKey, + }); +} + +export function checkRequiredEnvVars() { + const missingEnvVars = REQUIRED_ENV_VARS.filter((envVar) => { + return !process.env[envVar]; + }); + + if (missingEnvVars.length > 0) { + console.log( + `The following environment variables are required but missing: ${missingEnvVars.join( + ", ", + )}`, + ); + throw new Error( + `Missing environment variables: ${missingEnvVars.join(", ")}`, + ); + } +} diff --git a/templates/types/streaming/express/README-template.md b/templates/types/streaming/express/README-template.md index 61033885..8ec04664 100644 --- a/templates/types/streaming/express/README-template.md +++ b/templates/types/streaming/express/README-template.md @@ -1,9 +1,3 @@ - - This is a [LlamaIndex](https://www.llamaindex.ai/) project using [Express](https://expressjs.com/) bootstrapped with [`create-llama`](https://github.com/run-llama/LlamaIndexTS/tree/main/packages/create-llama). ## Getting Started diff --git a/templates/types/streaming/express/index.ts b/templates/types/streaming/express/index.ts index 444fb1fd..150dbf59 100644 --- a/templates/types/streaming/express/index.ts +++ b/templates/types/streaming/express/index.ts @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2024 Deutsche Telekom AG, LlamaIndex, Vercel, Inc. -// -// SPDX-License-Identifier: MIT - /* eslint-disable turbo/no-undeclared-env-vars */ import cors from "cors"; import "dotenv/config"; diff --git a/templates/types/streaming/express/npmrc b/templates/types/streaming/express/npmrc new file mode 100644 index 00000000..cc8df9de --- /dev/null +++ b/templates/types/streaming/express/npmrc @@ -0,0 +1 @@ +node-linker=hoisted \ No newline at end of file diff --git a/templates/types/streaming/express/package.json b/templates/types/streaming/express/package.json index 12530b24..612076e5 100644 --- a/templates/types/streaming/express/package.json +++ b/templates/types/streaming/express/package.json @@ -10,11 +10,11 @@ "dev": "concurrently \"tsup index.ts --format esm --dts --watch\" \"nodemon -q dist/index.mjs\"" }, "dependencies": { - "ai": "^2.2.25", + "ai": "^3.0.21", "cors": "^2.8.5", "dotenv": "^16.3.1", "express": "^4.18.2", - "llamaindex": "latest" + "llamaindex": "0.2.10" }, "devDependencies": { "@types/cors": "^2.8.16", @@ -22,11 +22,12 @@ "@types/node": "^20.9.5", "concurrently": "^8.2.2", "eslint": "^8.54.0", + "eslint-config-prettier": "^8.10.0", "nodemon": "^3.0.1", - "tsup": "^8.0.1", - "typescript": "^5.3.2", "prettier": "^3.2.5", "prettier-plugin-organize-imports": "^3.2.4", - "eslint-config-prettier": "^8.10.0" + "tsx": "^4.7.2", + "tsup": "^8.0.1", + "typescript": "^5.3.2" } } diff --git a/templates/types/streaming/express/prettier.config.js b/templates/types/streaming/express/prettier.config.js index a4dc7135..1fe03c66 100644 --- a/templates/types/streaming/express/prettier.config.js +++ b/templates/types/streaming/express/prettier.config.js @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2024 Deutsche Telekom AG, LlamaIndex, Vercel, Inc. -// -// SPDX-License-Identifier: MIT - module.exports = { plugins: ["prettier-plugin-organize-imports"], }; diff --git a/templates/types/streaming/express/src/controllers/chat-request.controller.ts b/templates/types/streaming/express/src/controllers/chat-request.controller.ts index feac025e..117713fb 100644 --- a/templates/types/streaming/express/src/controllers/chat-request.controller.ts +++ b/templates/types/streaming/express/src/controllers/chat-request.controller.ts @@ -1,9 +1,5 @@ -// SPDX-FileCopyrightText: 2024 Deutsche Telekom AG, LlamaIndex, Vercel, Inc. -// -// SPDX-License-Identifier: MIT - import { Request, Response } from "express"; -import { ChatMessage, MessageContent, OpenAI } from "llamaindex"; +import { ChatMessage, MessageContent } from "llamaindex"; import { createChatEngine } from "./engine/chat"; const convertMessageContent = ( @@ -36,10 +32,6 @@ export const chatRequest = async (req: Request, res: Response) => { }); } - const llm = new OpenAI({ - model: process.env.MODEL || "gpt-3.5-turbo", - }); - // Convert message content from Vercel/AI format to LlamaIndex/OpenAI format // Note: The non-streaming template does not need the Vercel/AI format, we're still using it for consistency with the streaming template const userMessageContent = convertMessageContent( @@ -47,7 +39,7 @@ export const chatRequest = async (req: Request, res: Response) => { data?.imageUrl, ); - const chatEngine = await createChatEngine(llm); + const chatEngine = await createChatEngine(); // Calling LlamaIndex's ChatEngine to get a response const response = await chatEngine.chat({ @@ -65,7 +57,7 @@ export const chatRequest = async (req: Request, res: Response) => { } catch (error) { console.error("[LlamaIndex]", error); return res.status(500).json({ - error: (error as Error).message, + detail: (error as Error).message, }); } }; diff --git a/templates/types/streaming/express/src/controllers/chat.controller.ts b/templates/types/streaming/express/src/controllers/chat.controller.ts index 78815d39..f200628a 100644 --- a/templates/types/streaming/express/src/controllers/chat.controller.ts +++ b/templates/types/streaming/express/src/controllers/chat.controller.ts @@ -1,10 +1,6 @@ -// SPDX-FileCopyrightText: 2024 Deutsche Telekom AG, LlamaIndex, Vercel, Inc. -// -// SPDX-License-Identifier: MIT - import { streamToResponse } from "ai"; import { Request, Response } from "express"; -import { ChatMessage, MessageContent, OpenAI } from "llamaindex"; +import { ChatMessage, MessageContent } from "llamaindex"; import { createChatEngine } from "./engine/chat"; import { LlamaIndexStream } from "./llamaindex-stream"; @@ -38,11 +34,7 @@ export const chat = async (req: Request, res: Response) => { }); } - const llm = new OpenAI({ - model: (process.env.MODEL as any) || "gpt-3.5-turbo", - }); - - const chatEngine = await createChatEngine(llm); + const chatEngine = await createChatEngine(); // Convert message content from Vercel/AI format to LlamaIndex/OpenAI format const userMessageContent = convertMessageContent( @@ -79,7 +71,7 @@ export const chat = async (req: Request, res: Response) => { } catch (error) { console.error("[LlamaIndex]", error); return res.status(500).json({ - error: (error as Error).message, + detail: (error as Error).message, }); } }; diff --git a/templates/types/streaming/express/src/controllers/engine/chat.ts b/templates/types/streaming/express/src/controllers/engine/chat.ts index c6d34e5e..a42ac41c 100644 --- a/templates/types/streaming/express/src/controllers/engine/chat.ts +++ b/templates/types/streaming/express/src/controllers/engine/chat.ts @@ -1,11 +1,7 @@ -// SPDX-FileCopyrightText: 2024 Deutsche Telekom AG, LlamaIndex, Vercel, Inc. -// -// SPDX-License-Identifier: MIT +import { Settings, SimpleChatEngine } from "llamaindex"; -import { LLM, SimpleChatEngine } from "llamaindex"; - -export async function createChatEngine(llm: LLM) { +export async function createChatEngine() { return new SimpleChatEngine({ - llm, + llm: Settings.llm, }); } diff --git a/templates/types/streaming/express/src/controllers/engine/settings.ts b/templates/types/streaming/express/src/controllers/engine/settings.ts new file mode 100644 index 00000000..25804399 --- /dev/null +++ b/templates/types/streaming/express/src/controllers/engine/settings.ts @@ -0,0 +1,52 @@ +import { + Ollama, + OllamaEmbedding, + OpenAI, + OpenAIEmbedding, + Settings, +} from "llamaindex"; + +const CHUNK_SIZE = 512; +const CHUNK_OVERLAP = 20; + +export const initSettings = async () => { + // HINT: you can delete the initialization code for unused model providers + console.log(`Using '${process.env.MODEL_PROVIDER}' model provider`); + switch (process.env.MODEL_PROVIDER) { + case "ollama": + initOllama(); + break; + default: + initOpenAI(); + break; + } + Settings.chunkSize = CHUNK_SIZE; + Settings.chunkOverlap = CHUNK_OVERLAP; +}; + +function initOpenAI() { + Settings.llm = new OpenAI({ + model: process.env.MODEL ?? "gpt-3.5-turbo", + maxTokens: 512, + }); + Settings.embedModel = new OpenAIEmbedding({ + model: process.env.EMBEDDING_MODEL, + dimensions: process.env.EMBEDDING_DIM + ? parseInt(process.env.EMBEDDING_DIM) + : undefined, + }); +} + +function initOllama() { + if (!process.env.MODEL || !process.env.EMBEDDING_MODEL) { + throw new Error( + "Using Ollama as model provider, 'MODEL' and 'EMBEDDING_MODEL' env variables must be set.", + ); + } + Settings.llm = new Ollama({ + model: process.env.MODEL ?? "", + }); + Settings.embedModel = new OllamaEmbedding({ + model: process.env.EMBEDDING_MODEL ?? "", + }); +} diff --git a/templates/types/streaming/express/src/controllers/llamaindex-stream.ts b/templates/types/streaming/express/src/controllers/llamaindex-stream.ts index f8fce930..866acc8a 100644 --- a/templates/types/streaming/express/src/controllers/llamaindex-stream.ts +++ b/templates/types/streaming/express/src/controllers/llamaindex-stream.ts @@ -1,52 +1,74 @@ -// SPDX-FileCopyrightText: 2024 Deutsche Telekom AG, LlamaIndex, Vercel, Inc. -// -// SPDX-License-Identifier: MIT - import { - JSONValue, + StreamData, createCallbacksTransformer, createStreamDataTransformer, - experimental_StreamData, trimStartOfStreamHelper, type AIStreamCallbacksAndOptions, } from "ai"; -import { Response, StreamingAgentChatResponse } from "llamaindex"; +import { + Metadata, + NodeWithScore, + Response, + StreamingAgentChatResponse, +} from "llamaindex"; type ParserOptions = { image_url?: string; }; +function appendImageData(data: StreamData, imageUrl?: string) { + if (!imageUrl) return; + data.appendMessageAnnotation({ + type: "image", + data: { + url: imageUrl, + }, + }); +} + +function appendSourceData( + data: StreamData, + sourceNodes?: NodeWithScore[], +) { + if (!sourceNodes?.length) return; + data.appendMessageAnnotation({ + type: "sources", + data: { + nodes: sourceNodes.map((node) => ({ + ...node.node.toMutableJSON(), + id: node.node.id_, + score: node.score ?? null, + })), + }, + }); +} + function createParser( res: AsyncIterable, - data: experimental_StreamData, + data: StreamData, opts?: ParserOptions, ) { const it = res[Symbol.asyncIterator](); const trimStartOfStream = trimStartOfStreamHelper(); + + let sourceNodes: NodeWithScore[] | undefined; return new ReadableStream({ start() { - // if image_url is provided, send it via the data stream - if (opts?.image_url) { - const message: JSONValue = { - type: "image_url", - image_url: { - url: opts.image_url, - }, - }; - data.append(message); - } else { - data.append({}); // send an empty image response for the user's message - } + appendImageData(data, opts?.image_url); }, async pull(controller): Promise { const { value, done } = await it.next(); if (done) { + appendSourceData(data, sourceNodes); controller.close(); - data.append({}); // send an empty image response for the assistant's message data.close(); return; } + if (!sourceNodes) { + // get source nodes from the first response + sourceNodes = value.sourceNodes; + } const text = trimStartOfStream(value.response ?? ""); if (text) { controller.enqueue(text); @@ -61,8 +83,8 @@ export function LlamaIndexStream( callbacks?: AIStreamCallbacksAndOptions; parserOptions?: ParserOptions; }, -): { stream: ReadableStream; data: experimental_StreamData } { - const data = new experimental_StreamData(); +): { stream: ReadableStream; data: StreamData } { + const data = new StreamData(); const res = response instanceof StreamingAgentChatResponse ? response.response @@ -70,7 +92,7 @@ export function LlamaIndexStream( return { stream: createParser(res, data, opts?.parserOptions) .pipeThrough(createCallbacksTransformer(opts?.callbacks)) - .pipeThrough(createStreamDataTransformer(true)), + .pipeThrough(createStreamDataTransformer()), data, }; } diff --git a/templates/types/streaming/express/src/observability/index.ts b/templates/types/streaming/express/src/observability/index.ts index f1dece29..2e4ce2b1 100644 --- a/templates/types/streaming/express/src/observability/index.ts +++ b/templates/types/streaming/express/src/observability/index.ts @@ -1,5 +1 @@ -// SPDX-FileCopyrightText: 2024 Deutsche Telekom AG, LlamaIndex, Vercel, Inc. -// -// SPDX-License-Identifier: MIT - export const initObservability = () => {}; diff --git a/templates/types/streaming/express/src/routes/chat.route.ts b/templates/types/streaming/express/src/routes/chat.route.ts index 8fdfb8d4..34a3e005 100644 --- a/templates/types/streaming/express/src/routes/chat.route.ts +++ b/templates/types/streaming/express/src/routes/chat.route.ts @@ -1,13 +1,11 @@ -// SPDX-FileCopyrightText: 2024 Deutsche Telekom AG, LlamaIndex, Vercel, Inc. -// -// SPDX-License-Identifier: MIT - import express, { Router } from "express"; import { chatRequest } from "../controllers/chat-request.controller"; import { chat } from "../controllers/chat.controller"; +import { initSettings } from "../controllers/engine/settings"; const llmRouter: Router = express.Router(); +initSettings(); llmRouter.route("/").post(chat); llmRouter.route("/request").post(chatRequest); diff --git a/templates/types/streaming/fastapi/README-template.md b/templates/types/streaming/fastapi/README-template.md index e6791c73..7969ff0e 100644 --- a/templates/types/streaming/fastapi/README-template.md +++ b/templates/types/streaming/fastapi/README-template.md @@ -1,9 +1,3 @@ - - This is a [LlamaIndex](https://www.llamaindex.ai/) project using [FastAPI](https://fastapi.tiangolo.com/) bootstrapped with [`create-llama`](https://github.com/run-llama/LlamaIndexTS/tree/main/packages/create-llama). ## Getting Started @@ -17,20 +11,14 @@ poetry install poetry shell ``` -By default, we use the T-Systems LLM (though you can customize, see `app/settings.py`). As a result you need to specify an `TSI_API_KEY` in an .env file in this directory. - -Example `.env` file: - -``` -TSI_API_KEY= -``` +Then check the parameters that have been pre-configured in the `.env` file in this directory. (E.g. you might need to configure an `OPENAI_API_KEY` if you're using OpenAI as model provider). If you are using any tools or data sources, you can update their config files in the `config` folder. Second, generate the embeddings of the documents in the `./data` directory (if this folder exists - otherwise, skip this step): ``` -python app/engine/generate.py +poetry run generate ``` Third, run the development server: @@ -90,7 +78,7 @@ docker run \ -v $(pwd)/data:/app/data \ # Use your local folder to read the data -v $(pwd)/storage:/app/storage \ # Use your file system to store the vector database \ - python app/engine/generate.py + poetry run generate ``` 3. Start the API: diff --git a/templates/types/streaming/fastapi/app/api/routers/chat.py b/templates/types/streaming/fastapi/app/api/routers/chat.py index 6dcc4684..12810f5a 100644 --- a/templates/types/streaming/fastapi/app/api/routers/chat.py +++ b/templates/types/streaming/fastapi/app/api/routers/chat.py @@ -1,15 +1,14 @@ -# SPDX-FileCopyrightText: 2024 Deutsche Telekom AG, LlamaIndex, Vercel, Inc. -# -# SPDX-License-Identifier: MIT - -from typing import List from pydantic import BaseModel -from fastapi.responses import StreamingResponse +from typing import List, Any, Optional, Dict, Tuple from fastapi import APIRouter, Depends, HTTPException, Request, status -from llama_index.core.chat_engine.types import BaseChatEngine +from llama_index.core.chat_engine.types import ( + BaseChatEngine, + StreamingAgentChatResponse, +) +from llama_index.core.schema import NodeWithScore from llama_index.core.llms import ChatMessage, MessageRole from app.engine import get_chat_engine -from typing import List, Tuple +from app.api.routers.vercel_response import VercelStreamResponse chat_router = r = APIRouter() @@ -22,9 +21,42 @@ class _Message(BaseModel): class _ChatData(BaseModel): messages: List[_Message] + class Config: + json_schema_extra = { + "example": { + "messages": [ + { + "role": "user", + "content": "What standards for letters exist?", + } + ] + } + } + + +class _SourceNodes(BaseModel): + id: str + metadata: Dict[str, Any] + score: Optional[float] + text: str + + @classmethod + def from_source_node(cls, source_node: NodeWithScore): + return cls( + id=source_node.node.node_id, + metadata=source_node.node.metadata, + score=source_node.score, + text=source_node.node.text, + ) + + @classmethod + def from_source_nodes(cls, source_nodes: List[NodeWithScore]): + return [cls.from_source_node(node) for node in source_nodes] + class _Result(BaseModel): result: _Message + nodes: List[_SourceNodes] async def parse_chat_data(data: _ChatData) -> Tuple[str, List[ChatMessage]]: @@ -62,13 +94,28 @@ async def chat( response = await chat_engine.astream_chat(last_message_content, messages) - async def event_generator(): + async def event_generator(request: Request, response: StreamingAgentChatResponse): + # Yield the text response async for token in response.async_response_gen(): + # If client closes connection, stop sending events if await request.is_disconnected(): break - yield token + yield VercelStreamResponse.convert_text(token) + + # Yield the source nodes + yield VercelStreamResponse.convert_data( + { + "type": "sources", + "data": { + "nodes": [ + _SourceNodes.from_source_node(node).dict() + for node in response.source_nodes + ] + }, + } + ) - return StreamingResponse(event_generator(), media_type="text/plain") + return VercelStreamResponse(content=event_generator(request, response)) # non-streaming endpoint - delete if not needed @@ -81,5 +128,6 @@ async def chat_request( response = await chat_engine.achat(last_message_content, messages) return _Result( - result=_Message(role=MessageRole.ASSISTANT, content=response.response) + result=_Message(role=MessageRole.ASSISTANT, content=response.response), + nodes=_SourceNodes.from_source_nodes(response.source_nodes), ) diff --git a/templates/types/streaming/fastapi/app/api/routers/vercel_response.py b/templates/types/streaming/fastapi/app/api/routers/vercel_response.py new file mode 100644 index 00000000..abb0185f --- /dev/null +++ b/templates/types/streaming/fastapi/app/api/routers/vercel_response.py @@ -0,0 +1,29 @@ +import json +from typing import Any +from fastapi.responses import StreamingResponse + + +class VercelStreamResponse(StreamingResponse): + """ + Class to convert the response from the chat engine to the streaming format expected by Vercel + """ + + TEXT_PREFIX = "0:" + DATA_PREFIX = "8:" + + @classmethod + def convert_text(cls, token: str): + # Escape newlines to avoid breaking the stream + token = token.replace("\n", "\\n") + return f'{cls.TEXT_PREFIX}"{token}"\n' + + @classmethod + def convert_data(cls, data: dict): + data_str = json.dumps(data) + return f"{cls.DATA_PREFIX}[{data_str}]\n" + + def __init__(self, content: Any, **kwargs): + super().__init__( + content=content, + **kwargs, + ) diff --git a/templates/types/streaming/fastapi/app/engine/__init__.py b/templates/types/streaming/fastapi/app/engine/__init__.py index 3e18cac8..fd8bb96a 100644 --- a/templates/types/streaming/fastapi/app/engine/__init__.py +++ b/templates/types/streaming/fastapi/app/engine/__init__.py @@ -1,7 +1,3 @@ -# SPDX-FileCopyrightText: 2024 Deutsche Telekom AG, LlamaIndex, Vercel, Inc. -# -# SPDX-License-Identifier: MIT - from llama_index.core.chat_engine import SimpleChatEngine diff --git a/templates/types/streaming/fastapi/app/observability.py b/templates/types/streaming/fastapi/app/observability.py new file mode 100644 index 00000000..28019c37 --- /dev/null +++ b/templates/types/streaming/fastapi/app/observability.py @@ -0,0 +1,2 @@ +def init_observability(): + pass diff --git a/templates/types/streaming/fastapi/app/settings.py b/templates/types/streaming/fastapi/app/settings.py index 9178c201..be272d54 100644 --- a/templates/types/streaming/fastapi/app/settings.py +++ b/templates/types/streaming/fastapi/app/settings.py @@ -1,65 +1,44 @@ -# SPDX-FileCopyrightText: 2024 Deutsche Telekom AG, LlamaIndex, Vercel, Inc. -# -# SPDX-License-Identifier: MIT - import os from typing import Dict from llama_index.core.settings import Settings -from llama_index.llms.openai import OpenAI -from llama_index.llms.openai_like import OpenAILike -from llama_index.embeddings.openai import OpenAIEmbedding -class TSIEmbedding(OpenAIEmbedding): - def __init__(self, **kwargs): - super().__init__(**kwargs) - self._query_engine = self._text_engine = self.model_name +def init_settings(): + model_provider = os.getenv("MODEL_PROVIDER") + if model_provider == "openai": + init_openai() + elif model_provider == "ollama": + init_ollama() + else: + raise ValueError(f"Invalid model provider: {model_provider}") + Settings.chunk_size = int(os.getenv("CHUNK_SIZE", "1024")) + Settings.chunk_overlap = int(os.getenv("CHUNK_OVERLAP", "20")) + + +def init_ollama(): + from llama_index.llms.ollama import Ollama + from llama_index.embeddings.ollama import OllamaEmbedding + Settings.embed_model = OllamaEmbedding(model_name=os.getenv("EMBEDDING_MODEL")) + Settings.llm = Ollama(model=os.getenv("MODEL")) -def llm_config_from_env() -> Dict: + +def init_openai(): + from llama_index.llms.openai import OpenAI + from llama_index.embeddings.openai import OpenAIEmbedding from llama_index.core.constants import DEFAULT_TEMPERATURE - model = os.getenv("MODEL") - temperature = os.getenv("LLM_TEMPERATURE", DEFAULT_TEMPERATURE) max_tokens = os.getenv("LLM_MAX_TOKENS") - api_key = os.getenv("TSI_API_KEY") - api_base = os.getenv("TSI_API_BASE_URL") - config = { - "model": model, - "api_key": api_key, - "api_base": api_base, - "temperature": float(temperature), + "model": os.getenv("MODEL"), + "temperature": float(os.getenv("LLM_TEMPERATURE", DEFAULT_TEMPERATURE)), "max_tokens": int(max_tokens) if max_tokens is not None else None, } - return config + Settings.llm = OpenAI(**config) - -def embedding_config_from_env() -> Dict: - model = os.getenv("EMBEDDING_MODEL") dimension = os.getenv("EMBEDDING_DIM") - api_key = os.getenv("TSI_API_KEY") - api_base = os.getenv("TSI_EMBED_API_BASE_URL") - config = { - "model_name": model, + "model": os.getenv("EMBEDDING_MODEL"), "dimension": int(dimension) if dimension is not None else None, - "api_key": api_key, - "api_base": api_base, } - return config - - -def init_settings(): - llm_configs = llm_config_from_env() - embedding_configs = embedding_config_from_env() - - Settings.embed_model = TSIEmbedding(**embedding_configs) - Settings.llm = OpenAILike( - **llm_configs, - is_chat_model=True, - is_function_calling_model=False, - context_window=4096, - ) - Settings.chunk_size = int(os.getenv("CHUNK_SIZE", "1024")) - Settings.chunk_overlap = int(os.getenv("CHUNK_OVERLAP", "20")) + Settings.embed_model = OpenAIEmbedding(**config) diff --git a/templates/types/streaming/fastapi/main.py b/templates/types/streaming/fastapi/main.py index 56f5672d..1a4e58be 100644 --- a/templates/types/streaming/fastapi/main.py +++ b/templates/types/streaming/fastapi/main.py @@ -1,7 +1,3 @@ -# SPDX-FileCopyrightText: 2024 Deutsche Telekom AG, LlamaIndex, Vercel, Inc. -# -# SPDX-License-Identifier: MIT - from dotenv import load_dotenv load_dotenv() @@ -11,13 +7,16 @@ import uvicorn from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware +from fastapi.responses import RedirectResponse from app.api.routers.chat import chat_router from app.settings import init_settings +from app.observability import init_observability app = FastAPI() init_settings() +init_observability() environment = os.getenv("ENVIRONMENT", "dev") # Default to 'development' if not set @@ -33,6 +32,12 @@ allow_headers=["*"], ) + # Redirect to documentation page when accessing base URL + @app.get("/") + async def redirect_to_docs(): + return RedirectResponse(url="/docs") + + app.include_router(chat_router, prefix="/api/chat") diff --git a/templates/types/streaming/fastapi/pyproject.toml b/templates/types/streaming/fastapi/pyproject.toml index f98ffe31..93176212 100644 --- a/templates/types/streaming/fastapi/pyproject.toml +++ b/templates/types/streaming/fastapi/pyproject.toml @@ -1,7 +1,3 @@ -# SPDX-FileCopyrightText: 2024 Deutsche Telekom AG, LlamaIndex, Vercel, Inc. -# -# SPDX-License-Identifier: MIT - [tool.poetry] name = "app" version = "0.1.0" @@ -9,15 +5,16 @@ description = "" authors = ["Marcus Schiesser "] readme = "README.md" +[tool.poetry.scripts] +generate = "app.engine.generate:generate_datasource" + [tool.poetry.dependencies] python = "^3.11,<3.12" fastapi = "^0.109.1" uvicorn = { extras = ["standard"], version = "^0.23.2" } python-dotenv = "^1.0.0" -llama-index = "0.10.15" -llama-index-core = "0.10.15" -llama-index-agent-openai = "0.1.5" -llama-index-llms-openai-like="^0.1.3" +llama-index = "0.10.28" +llama-index-core = "0.10.28" [build-system] requires = ["poetry-core"] diff --git a/templates/types/streaming/nextjs/README-template.md b/templates/types/streaming/nextjs/README-template.md index 4f14b70b..d2eb1eb8 100644 --- a/templates/types/streaming/nextjs/README-template.md +++ b/templates/types/streaming/nextjs/README-template.md @@ -1,9 +1,3 @@ - - This is a [LlamaIndex](https://www.llamaindex.ai/) project using [Next.js](https://nextjs.org/) bootstrapped with [`create-llama`](https://github.com/run-llama/LlamaIndexTS/tree/main/packages/create-llama). ## Getting Started diff --git a/templates/types/streaming/nextjs/app/api/chat/engine/chat.ts b/templates/types/streaming/nextjs/app/api/chat/engine/chat.ts index c6d34e5e..a42ac41c 100644 --- a/templates/types/streaming/nextjs/app/api/chat/engine/chat.ts +++ b/templates/types/streaming/nextjs/app/api/chat/engine/chat.ts @@ -1,11 +1,7 @@ -// SPDX-FileCopyrightText: 2024 Deutsche Telekom AG, LlamaIndex, Vercel, Inc. -// -// SPDX-License-Identifier: MIT +import { Settings, SimpleChatEngine } from "llamaindex"; -import { LLM, SimpleChatEngine } from "llamaindex"; - -export async function createChatEngine(llm: LLM) { +export async function createChatEngine() { return new SimpleChatEngine({ - llm, + llm: Settings.llm, }); } diff --git a/templates/types/streaming/nextjs/app/api/chat/engine/settings.ts b/templates/types/streaming/nextjs/app/api/chat/engine/settings.ts new file mode 100644 index 00000000..25804399 --- /dev/null +++ b/templates/types/streaming/nextjs/app/api/chat/engine/settings.ts @@ -0,0 +1,52 @@ +import { + Ollama, + OllamaEmbedding, + OpenAI, + OpenAIEmbedding, + Settings, +} from "llamaindex"; + +const CHUNK_SIZE = 512; +const CHUNK_OVERLAP = 20; + +export const initSettings = async () => { + // HINT: you can delete the initialization code for unused model providers + console.log(`Using '${process.env.MODEL_PROVIDER}' model provider`); + switch (process.env.MODEL_PROVIDER) { + case "ollama": + initOllama(); + break; + default: + initOpenAI(); + break; + } + Settings.chunkSize = CHUNK_SIZE; + Settings.chunkOverlap = CHUNK_OVERLAP; +}; + +function initOpenAI() { + Settings.llm = new OpenAI({ + model: process.env.MODEL ?? "gpt-3.5-turbo", + maxTokens: 512, + }); + Settings.embedModel = new OpenAIEmbedding({ + model: process.env.EMBEDDING_MODEL, + dimensions: process.env.EMBEDDING_DIM + ? parseInt(process.env.EMBEDDING_DIM) + : undefined, + }); +} + +function initOllama() { + if (!process.env.MODEL || !process.env.EMBEDDING_MODEL) { + throw new Error( + "Using Ollama as model provider, 'MODEL' and 'EMBEDDING_MODEL' env variables must be set.", + ); + } + Settings.llm = new Ollama({ + model: process.env.MODEL ?? "", + }); + Settings.embedModel = new OllamaEmbedding({ + model: process.env.EMBEDDING_MODEL ?? "", + }); +} diff --git a/templates/types/streaming/nextjs/app/api/chat/llamaindex-stream.ts b/templates/types/streaming/nextjs/app/api/chat/llamaindex-stream.ts index f8fce930..866acc8a 100644 --- a/templates/types/streaming/nextjs/app/api/chat/llamaindex-stream.ts +++ b/templates/types/streaming/nextjs/app/api/chat/llamaindex-stream.ts @@ -1,52 +1,74 @@ -// SPDX-FileCopyrightText: 2024 Deutsche Telekom AG, LlamaIndex, Vercel, Inc. -// -// SPDX-License-Identifier: MIT - import { - JSONValue, + StreamData, createCallbacksTransformer, createStreamDataTransformer, - experimental_StreamData, trimStartOfStreamHelper, type AIStreamCallbacksAndOptions, } from "ai"; -import { Response, StreamingAgentChatResponse } from "llamaindex"; +import { + Metadata, + NodeWithScore, + Response, + StreamingAgentChatResponse, +} from "llamaindex"; type ParserOptions = { image_url?: string; }; +function appendImageData(data: StreamData, imageUrl?: string) { + if (!imageUrl) return; + data.appendMessageAnnotation({ + type: "image", + data: { + url: imageUrl, + }, + }); +} + +function appendSourceData( + data: StreamData, + sourceNodes?: NodeWithScore[], +) { + if (!sourceNodes?.length) return; + data.appendMessageAnnotation({ + type: "sources", + data: { + nodes: sourceNodes.map((node) => ({ + ...node.node.toMutableJSON(), + id: node.node.id_, + score: node.score ?? null, + })), + }, + }); +} + function createParser( res: AsyncIterable, - data: experimental_StreamData, + data: StreamData, opts?: ParserOptions, ) { const it = res[Symbol.asyncIterator](); const trimStartOfStream = trimStartOfStreamHelper(); + + let sourceNodes: NodeWithScore[] | undefined; return new ReadableStream({ start() { - // if image_url is provided, send it via the data stream - if (opts?.image_url) { - const message: JSONValue = { - type: "image_url", - image_url: { - url: opts.image_url, - }, - }; - data.append(message); - } else { - data.append({}); // send an empty image response for the user's message - } + appendImageData(data, opts?.image_url); }, async pull(controller): Promise { const { value, done } = await it.next(); if (done) { + appendSourceData(data, sourceNodes); controller.close(); - data.append({}); // send an empty image response for the assistant's message data.close(); return; } + if (!sourceNodes) { + // get source nodes from the first response + sourceNodes = value.sourceNodes; + } const text = trimStartOfStream(value.response ?? ""); if (text) { controller.enqueue(text); @@ -61,8 +83,8 @@ export function LlamaIndexStream( callbacks?: AIStreamCallbacksAndOptions; parserOptions?: ParserOptions; }, -): { stream: ReadableStream; data: experimental_StreamData } { - const data = new experimental_StreamData(); +): { stream: ReadableStream; data: StreamData } { + const data = new StreamData(); const res = response instanceof StreamingAgentChatResponse ? response.response @@ -70,7 +92,7 @@ export function LlamaIndexStream( return { stream: createParser(res, data, opts?.parserOptions) .pipeThrough(createCallbacksTransformer(opts?.callbacks)) - .pipeThrough(createStreamDataTransformer(true)), + .pipeThrough(createStreamDataTransformer()), data, }; } diff --git a/templates/types/streaming/nextjs/app/api/chat/route.ts b/templates/types/streaming/nextjs/app/api/chat/route.ts index 1b7047e5..f836cbed 100644 --- a/templates/types/streaming/nextjs/app/api/chat/route.ts +++ b/templates/types/streaming/nextjs/app/api/chat/route.ts @@ -1,13 +1,14 @@ -// SPDX-FileCopyrightText: 2024 Deutsche Telekom AG, LlamaIndex, Vercel, Inc. -// -// SPDX-License-Identifier: MIT - -import { StreamingTextResponse } from "ai"; -import { ChatMessage, MessageContent, OpenAI } from "llamaindex"; +import { initObservability } from "@/app/observability"; +import { Message, StreamingTextResponse } from "ai"; +import { ChatMessage, MessageContent } from "llamaindex"; import { NextRequest, NextResponse } from "next/server"; import { createChatEngine } from "./engine/chat"; +import { initSettings } from "./engine/settings"; import { LlamaIndexStream } from "./llamaindex-stream"; +initObservability(); +initSettings(); + export const runtime = "nodejs"; export const dynamic = "force-dynamic"; @@ -33,7 +34,7 @@ const convertMessageContent = ( export async function POST(request: NextRequest) { try { const body = await request.json(); - const { messages, data }: { messages: ChatMessage[]; data: any } = body; + const { messages, data }: { messages: Message[]; data: any } = body; const userMessage = messages.pop(); if (!messages || !userMessage || userMessage.role !== "user") { return NextResponse.json( @@ -45,12 +46,7 @@ export async function POST(request: NextRequest) { ); } - const llm = new OpenAI({ - model: (process.env.MODEL as any) ?? "gpt-3.5-turbo", - maxTokens: 512, - }); - - const chatEngine = await createChatEngine(llm); + const chatEngine = await createChatEngine(); // Convert message content from Vercel/AI format to LlamaIndex/OpenAI format const userMessageContent = convertMessageContent( @@ -61,7 +57,7 @@ export async function POST(request: NextRequest) { // Calling LlamaIndex's ChatEngine to get a streamed response const response = await chatEngine.chat({ message: userMessageContent, - chatHistory: messages, + chatHistory: messages as ChatMessage[], stream: true, }); @@ -78,7 +74,7 @@ export async function POST(request: NextRequest) { console.error("[LlamaIndex]", error); return NextResponse.json( { - error: (error as Error).message, + detail: (error as Error).message, }, { status: 500, diff --git a/templates/types/streaming/nextjs/app/components/chat-section.tsx b/templates/types/streaming/nextjs/app/components/chat-section.tsx index 0f4e00e8..afb59960 100644 --- a/templates/types/streaming/nextjs/app/components/chat-section.tsx +++ b/templates/types/streaming/nextjs/app/components/chat-section.tsx @@ -1,12 +1,6 @@ -// SPDX-FileCopyrightText: 2024 Deutsche Telekom AG, LlamaIndex, Vercel, Inc. -// -// SPDX-License-Identifier: MIT - "use client"; import { useChat } from "ai/react"; -import { useMemo } from "react"; -import { insertDataIntoMessages } from "./transform"; import { ChatInput, ChatMessages } from "./ui/chat"; export default function ChatSection() { @@ -18,22 +12,21 @@ export default function ChatSection() { handleInputChange, reload, stop, - data, } = useChat({ api: process.env.NEXT_PUBLIC_CHAT_API, headers: { "Content-Type": "application/json", // using JSON because of vercel/ai 2.2.26 }, + onError: (error) => { + const message = JSON.parse(error.message); + alert(message.detail); + }, }); - const transformedMessages = useMemo(() => { - return insertDataIntoMessages(messages, data); - }, [messages, data]); - return (

); diff --git a/templates/types/streaming/nextjs/app/components/header.tsx b/templates/types/streaming/nextjs/app/components/header.tsx index e199e02f..2b0e488f 100644 --- a/templates/types/streaming/nextjs/app/components/header.tsx +++ b/templates/types/streaming/nextjs/app/components/header.tsx @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2024 Deutsche Telekom AG, LlamaIndex, Vercel, Inc. -// -// SPDX-License-Identifier: MIT - import Image from "next/image"; export default function Header() { @@ -16,12 +12,13 @@ export default function Header() { href="https://www.llamaindex.ai/" className="flex items-center justify-center font-nunito text-lg font-bold gap-2" > - Built by + Built by LlamaIndex T-Systems Logo diff --git a/templates/types/streaming/nextjs/app/components/ui/README-template.md b/templates/types/streaming/nextjs/app/components/ui/README-template.md index 83b75dff..ebfcf48c 100644 --- a/templates/types/streaming/nextjs/app/components/ui/README-template.md +++ b/templates/types/streaming/nextjs/app/components/ui/README-template.md @@ -1,7 +1 @@ - - Using the chat component from https://github.com/marcusschiesser/ui (based on https://ui.shadcn.com/) diff --git a/templates/types/streaming/nextjs/app/components/ui/button.tsx b/templates/types/streaming/nextjs/app/components/ui/button.tsx index c80a5972..662b0404 100644 --- a/templates/types/streaming/nextjs/app/components/ui/button.tsx +++ b/templates/types/streaming/nextjs/app/components/ui/button.tsx @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2024 Deutsche Telekom AG, LlamaIndex, Vercel, Inc. -// -// SPDX-License-Identifier: MIT - import { Slot } from "@radix-ui/react-slot"; import { cva, type VariantProps } from "class-variance-authority"; import * as React from "react"; diff --git a/templates/types/streaming/nextjs/app/components/ui/chat/chat-actions.tsx b/templates/types/streaming/nextjs/app/components/ui/chat/chat-actions.tsx index 98df8e29..151ef61a 100644 --- a/templates/types/streaming/nextjs/app/components/ui/chat/chat-actions.tsx +++ b/templates/types/streaming/nextjs/app/components/ui/chat/chat-actions.tsx @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2024 Deutsche Telekom AG, LlamaIndex, Vercel, Inc. -// -// SPDX-License-Identifier: MIT - import { PauseCircle, RefreshCw } from "lucide-react"; import { Button } from "../button"; diff --git a/templates/types/streaming/nextjs/app/components/ui/chat/chat-avatar.tsx b/templates/types/streaming/nextjs/app/components/ui/chat/chat-avatar.tsx index 964a446d..ce04e306 100644 --- a/templates/types/streaming/nextjs/app/components/ui/chat/chat-avatar.tsx +++ b/templates/types/streaming/nextjs/app/components/ui/chat/chat-avatar.tsx @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2024 Deutsche Telekom AG, LlamaIndex, Vercel, Inc. -// -// SPDX-License-Identifier: MIT - import { User2 } from "lucide-react"; import Image from "next/image"; @@ -15,13 +11,13 @@ export default function ChatAvatar({ role }: { role: string }) { } return ( -
+
T-Systems Logo
diff --git a/templates/types/streaming/nextjs/app/components/ui/chat/chat-image.tsx b/templates/types/streaming/nextjs/app/components/ui/chat/chat-image.tsx new file mode 100644 index 00000000..05609213 --- /dev/null +++ b/templates/types/streaming/nextjs/app/components/ui/chat/chat-image.tsx @@ -0,0 +1,17 @@ +import Image from "next/image"; +import { type ImageData } from "./index"; + +export function ChatImage({ data }: { data: ImageData }) { + return ( +
+ +
+ ); +} diff --git a/templates/types/streaming/nextjs/app/components/ui/chat/chat-input.tsx b/templates/types/streaming/nextjs/app/components/ui/chat/chat-input.tsx index d70a92ae..435637e5 100644 --- a/templates/types/streaming/nextjs/app/components/ui/chat/chat-input.tsx +++ b/templates/types/streaming/nextjs/app/components/ui/chat/chat-input.tsx @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2024 Deutsche Telekom AG, LlamaIndex, Vercel, Inc. -// -// SPDX-License-Identifier: MIT - import { useState } from "react"; import { Button } from "../button"; import FileUploader from "../file-uploader"; @@ -71,16 +67,14 @@ export default function ChatInput( autoFocus name="message" placeholder="Type a message" - className="flex-1 text-field" + className="flex-1" value={props.input} onChange={props.handleInputChange} /> - {props.onFileUpload && ( - - )} + diff --git a/templates/types/streaming/nextjs/app/components/ui/chat/chat-message.tsx b/templates/types/streaming/nextjs/app/components/ui/chat/chat-message.tsx index 9a927897..cc037f91 100644 --- a/templates/types/streaming/nextjs/app/components/ui/chat/chat-message.tsx +++ b/templates/types/streaming/nextjs/app/components/ui/chat/chat-message.tsx @@ -1,41 +1,70 @@ -// SPDX-FileCopyrightText: 2024 Deutsche Telekom AG, LlamaIndex, Vercel, Inc. -// -// SPDX-License-Identifier: MIT - import { Check, Copy } from "lucide-react"; -import { JSONValue, Message } from "ai"; -import Image from "next/image"; +import { Message } from "ai"; +import { Fragment } from "react"; import { Button } from "../button"; import ChatAvatar from "./chat-avatar"; +import { ChatImage } from "./chat-image"; +import { ChatSources } from "./chat-sources"; +import { + AnnotationData, + ImageData, + MessageAnnotation, + MessageAnnotationType, + SourceData, +} from "./index"; import Markdown from "./markdown"; import { useCopyToClipboard } from "./use-copy-to-clipboard"; -interface ChatMessageImageData { - type: "image_url"; - image_url: { - url: string; - }; +type ContentDiplayConfig = { + order: number; + component: JSX.Element | null; +}; + +function getAnnotationData( + annotations: MessageAnnotation[], + type: MessageAnnotationType, +): T | undefined { + return annotations.find((a) => a.type === type)?.data as T | undefined; } -// This component will parse message data and render the appropriate UI. -function ChatMessageData({ messageData }: { messageData: JSONValue }) { - const { image_url, type } = messageData as unknown as ChatMessageImageData; - if (type === "image_url") { - return ( -
- -
- ); - } - return null; +function ChatMessageContent({ message }: { message: Message }) { + const annotations = message.annotations as MessageAnnotation[] | undefined; + if (!annotations?.length) return ; + + const imageData = getAnnotationData( + annotations, + MessageAnnotationType.IMAGE, + ); + const sourceData = getAnnotationData( + annotations, + MessageAnnotationType.SOURCES, + ); + + const contents: ContentDiplayConfig[] = [ + { + order: -1, + component: imageData ? : null, + }, + { + order: 0, + component: , + }, + { + order: 1, + component: sourceData ? : null, + }, + ]; + + return ( +
+ {contents + .sort((a, b) => a.order - b.order) + .map((content, index) => ( + {content.component} + ))} +
+ ); } export default function ChatMessage(chatMessage: Message) { @@ -44,12 +73,7 @@ export default function ChatMessage(chatMessage: Message) {
-
- {chatMessage.data && ( - - )} - -
+
diff --git a/templates/types/streaming/nextjs/app/components/ui/chat/chat-sources.tsx b/templates/types/streaming/nextjs/app/components/ui/chat/chat-sources.tsx new file mode 100644 index 00000000..de8c3edb --- /dev/null +++ b/templates/types/streaming/nextjs/app/components/ui/chat/chat-sources.tsx @@ -0,0 +1,94 @@ +import { ArrowUpRightSquare, Check, Copy } from "lucide-react"; +import { useMemo } from "react"; +import { Button } from "../button"; +import { HoverCard, HoverCardContent, HoverCardTrigger } from "../hover-card"; +import { SourceData, SourceNode } from "./index"; +import { useCopyToClipboard } from "./use-copy-to-clipboard"; + +const SCORE_THRESHOLD = 0.5; + +export function ChatSources({ data }: { data: SourceData }) { + const sources = useMemo(() => { + return ( + data.nodes + ?.filter((node) => Object.keys(node.metadata).length > 0) + ?.filter((node) => (node.score ?? 1) > SCORE_THRESHOLD) + .sort((a, b) => (b.score ?? 1) - (a.score ?? 1)) || [] + ); + }, [data.nodes]); + + if (sources.length === 0) return null; + + return ( +
+ Sources: +
+ {sources.map((node: SourceNode, index: number) => ( +
+ + +
+ {index + 1} +
+
+ + + +
+
+ ))} +
+
+ ); +} + +function NodeInfo({ node }: { node: SourceNode }) { + const { isCopied, copyToClipboard } = useCopyToClipboard({ timeout: 1000 }); + + if (typeof node.metadata["URL"] === "string") { + // this is a node generated by the web loader, it contains an external URL + // add a link to view this URL + return ( + + {node.metadata["URL"]} + + + ); + } + + if (typeof node.metadata["file_path"] === "string") { + // this is a node generated by the file loader, it contains file path + // add a button to copy the path to the clipboard + const filePath = node.metadata["file_path"]; + return ( +
+ {filePath} + +
+ ); + } + + // node generated by unknown loader, implement renderer by analyzing logged out metadata + console.log("Node metadata", node.metadata); + return ( +

+ Sorry, unknown node type. Please add a new renderer in the NodeInfo + component. +

+ ); +} diff --git a/templates/types/streaming/nextjs/app/components/ui/chat/chat.interface.ts b/templates/types/streaming/nextjs/app/components/ui/chat/chat.interface.ts index f98019fd..5b9f2253 100644 --- a/templates/types/streaming/nextjs/app/components/ui/chat/chat.interface.ts +++ b/templates/types/streaming/nextjs/app/components/ui/chat/chat.interface.ts @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2024 Deutsche Telekom AG, LlamaIndex, Vercel, Inc. -// -// SPDX-License-Identifier: MIT - import { Message } from "ai"; export interface ChatHandler { diff --git a/templates/types/streaming/nextjs/app/components/ui/chat/codeblock.tsx b/templates/types/streaming/nextjs/app/components/ui/chat/codeblock.tsx index 5f187d65..014a0fc3 100644 --- a/templates/types/streaming/nextjs/app/components/ui/chat/codeblock.tsx +++ b/templates/types/streaming/nextjs/app/components/ui/chat/codeblock.tsx @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2024 Deutsche Telekom AG, LlamaIndex, Vercel, Inc. -// -// SPDX-License-Identifier: MIT - "use client"; import { Check, Copy, Download } from "lucide-react"; diff --git a/templates/types/streaming/nextjs/app/components/ui/chat/index.ts b/templates/types/streaming/nextjs/app/components/ui/chat/index.ts index 65f6101e..87d8d306 100644 --- a/templates/types/streaming/nextjs/app/components/ui/chat/index.ts +++ b/templates/types/streaming/nextjs/app/components/ui/chat/index.ts @@ -1,9 +1,32 @@ -// SPDX-FileCopyrightText: 2024 Deutsche Telekom AG, LlamaIndex, Vercel, Inc. -// -// SPDX-License-Identifier: MIT - import ChatInput from "./chat-input"; import ChatMessages from "./chat-messages"; export { type ChatHandler } from "./chat.interface"; export { ChatInput, ChatMessages }; + +export enum MessageAnnotationType { + IMAGE = "image", + SOURCES = "sources", +} + +export type ImageData = { + url: string; +}; + +export type SourceNode = { + id: string; + metadata: Record; + score?: number; + text: string; +}; + +export type SourceData = { + nodes: SourceNode[]; +}; + +export type AnnotationData = ImageData | SourceData; + +export type MessageAnnotation = { + type: MessageAnnotationType; + data: AnnotationData; +}; diff --git a/templates/types/streaming/nextjs/app/components/ui/chat/markdown.tsx b/templates/types/streaming/nextjs/app/components/ui/chat/markdown.tsx index f2ab497c..fab4cc57 100644 --- a/templates/types/streaming/nextjs/app/components/ui/chat/markdown.tsx +++ b/templates/types/streaming/nextjs/app/components/ui/chat/markdown.tsx @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2024 Deutsche Telekom AG, LlamaIndex, Vercel, Inc. -// -// SPDX-License-Identifier: MIT - import { FC, memo } from "react"; import ReactMarkdown, { Options } from "react-markdown"; import remarkGfm from "remark-gfm"; diff --git a/templates/types/streaming/nextjs/app/components/ui/chat/use-copy-to-clipboard.tsx b/templates/types/streaming/nextjs/app/components/ui/chat/use-copy-to-clipboard.tsx index 7583dcfd..e011d69b 100644 --- a/templates/types/streaming/nextjs/app/components/ui/chat/use-copy-to-clipboard.tsx +++ b/templates/types/streaming/nextjs/app/components/ui/chat/use-copy-to-clipboard.tsx @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2024 Deutsche Telekom AG, LlamaIndex, Vercel, Inc. -// -// SPDX-License-Identifier: MIT - "use client"; import * as React from "react"; diff --git a/templates/types/streaming/nextjs/app/components/ui/file-uploader.tsx b/templates/types/streaming/nextjs/app/components/ui/file-uploader.tsx index 917ca7f0..e42a267d 100644 --- a/templates/types/streaming/nextjs/app/components/ui/file-uploader.tsx +++ b/templates/types/streaming/nextjs/app/components/ui/file-uploader.tsx @@ -1,14 +1,9 @@ -// SPDX-FileCopyrightText: 2024 Deutsche Telekom AG, LlamaIndex, Vercel, Inc. -// -// SPDX-License-Identifier: MIT - "use client"; -import { Paperclip } from "lucide-react"; +import { Loader2, Paperclip } from "lucide-react"; import { ChangeEvent, useState } from "react"; import { buttonVariants } from "./button"; import { cn } from "./lib/utils"; -import Loader from "./telekom/loader"; export interface FileUploaderProps { config?: { @@ -99,7 +94,11 @@ export default function FileUploader({ uploading && "opacity-50", )} > - {uploading ? : } + {uploading ? ( + + ) : ( + + )}
); diff --git a/templates/types/streaming/nextjs/app/components/ui/hover-card.tsx b/templates/types/streaming/nextjs/app/components/ui/hover-card.tsx new file mode 100644 index 00000000..e8862359 --- /dev/null +++ b/templates/types/streaming/nextjs/app/components/ui/hover-card.tsx @@ -0,0 +1,29 @@ +"use client"; + +import * as HoverCardPrimitive from "@radix-ui/react-hover-card"; +import * as React from "react"; + +import { cn } from "./lib/utils"; + +const HoverCard = HoverCardPrimitive.Root; + +const HoverCardTrigger = HoverCardPrimitive.Trigger; + +const HoverCardContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, align = "center", sideOffset = 4, ...props }, ref) => ( + +)); +HoverCardContent.displayName = HoverCardPrimitive.Content.displayName; + +export { HoverCard, HoverCardContent, HoverCardTrigger }; diff --git a/templates/types/streaming/nextjs/app/components/ui/input.tsx b/templates/types/streaming/nextjs/app/components/ui/input.tsx index 922d1a63..edfa129e 100644 --- a/templates/types/streaming/nextjs/app/components/ui/input.tsx +++ b/templates/types/streaming/nextjs/app/components/ui/input.tsx @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2024 Deutsche Telekom AG, LlamaIndex, Vercel, Inc. -// -// SPDX-License-Identifier: MIT - import * as React from "react"; import { cn } from "./lib/utils"; diff --git a/templates/types/streaming/nextjs/app/components/ui/lib/utils.ts b/templates/types/streaming/nextjs/app/components/ui/lib/utils.ts index 2a87c6fa..a5ef1935 100644 --- a/templates/types/streaming/nextjs/app/components/ui/lib/utils.ts +++ b/templates/types/streaming/nextjs/app/components/ui/lib/utils.ts @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2024 Deutsche Telekom AG, LlamaIndex, Vercel, Inc. -// -// SPDX-License-Identifier: MIT - import { clsx, type ClassValue } from "clsx"; import { twMerge } from "tailwind-merge"; diff --git a/templates/types/streaming/nextjs/app/components/ui/upload-image-preview.tsx b/templates/types/streaming/nextjs/app/components/ui/upload-image-preview.tsx index 1fb70a21..55ef6e9c 100644 --- a/templates/types/streaming/nextjs/app/components/ui/upload-image-preview.tsx +++ b/templates/types/streaming/nextjs/app/components/ui/upload-image-preview.tsx @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2024 Deutsche Telekom AG, LlamaIndex, Vercel, Inc. -// -// SPDX-License-Identifier: MIT - import { XCircleIcon } from "lucide-react"; import Image from "next/image"; import { cn } from "./lib/utils"; diff --git a/templates/types/streaming/nextjs/app/favicon.ico b/templates/types/streaming/nextjs/app/favicon.ico index 5d023f82d9d50e66251de333c566d5e140235ab6..a1eaef62f2dfa895f1bbffc6595bb53d9604963e 100644 GIT binary patch literal 15406 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 KfA0a-1OEqKLE94m literal 152126 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 - {children} + {children} ); } diff --git a/templates/types/streaming/nextjs/app/markdown.css b/templates/types/streaming/nextjs/app/markdown.css index bad5e729..a843eeb7 100644 --- a/templates/types/streaming/nextjs/app/markdown.css +++ b/templates/types/streaming/nextjs/app/markdown.css @@ -1,9 +1,3 @@ -/* - * SPDX-FileCopyrightText: 2024 Deutsche Telekom AG, LlamaIndex, Vercel, Inc. - * - * SPDX-License-Identifier: MIT - */ - /* Custom CSS for chat message markdown */ .custom-markdown ul { list-style-type: disc; diff --git a/templates/types/streaming/nextjs/app/observability/index.ts b/templates/types/streaming/nextjs/app/observability/index.ts index f1dece29..2e4ce2b1 100644 --- a/templates/types/streaming/nextjs/app/observability/index.ts +++ b/templates/types/streaming/nextjs/app/observability/index.ts @@ -1,5 +1 @@ -// SPDX-FileCopyrightText: 2024 Deutsche Telekom AG, LlamaIndex, Vercel, Inc. -// -// SPDX-License-Identifier: MIT - export const initObservability = () => {}; diff --git a/templates/types/streaming/nextjs/app/page.tsx b/templates/types/streaming/nextjs/app/page.tsx index 22f51729..ef00262b 100644 --- a/templates/types/streaming/nextjs/app/page.tsx +++ b/templates/types/streaming/nextjs/app/page.tsx @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2024 Deutsche Telekom AG, LlamaIndex, Vercel, Inc. -// -// SPDX-License-Identifier: MIT - import Header from "@/app/components/header"; import ChatSection from "./components/chat-section"; diff --git a/templates/types/streaming/nextjs/next-env.d.ts b/templates/types/streaming/nextjs/next-env.d.ts index 9ad73239..4f11a03d 100644 --- a/templates/types/streaming/nextjs/next-env.d.ts +++ b/templates/types/streaming/nextjs/next-env.d.ts @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2024 Deutsche Telekom AG, LlamaIndex, Vercel, Inc. -// -// SPDX-License-Identifier: MIT - /// /// diff --git a/templates/types/streaming/nextjs/next.config.mjs b/templates/types/streaming/nextjs/next.config.mjs index 08bd1afa..124122bf 100644 --- a/templates/types/streaming/nextjs/next.config.mjs +++ b/templates/types/streaming/nextjs/next.config.mjs @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2024 Deutsche Telekom AG, LlamaIndex, Vercel, Inc. -// -// SPDX-License-Identifier: MIT - /** @type {import('next').NextConfig} */ import fs from "fs"; import webpack from "./webpack.config.mjs"; diff --git a/templates/types/streaming/nextjs/package.json b/templates/types/streaming/nextjs/package.json index 0f97c3e8..221c6998 100644 --- a/templates/types/streaming/nextjs/package.json +++ b/templates/types/streaming/nextjs/package.json @@ -10,12 +10,13 @@ "lint": "next lint" }, "dependencies": { + "@radix-ui/react-hover-card": "^1.0.7", "@radix-ui/react-slot": "^1.0.2", - "ai": "^2.2.27", + "ai": "^3.0.21", "class-variance-authority": "^0.7.0", "clsx": "^1.2.1", "dotenv": "^16.3.1", - "llamaindex": "latest", + "llamaindex": "0.2.10", "lucide-react": "^0.294.0", "next": "^14.0.3", "react": "^18.2.0", @@ -33,16 +34,17 @@ "@types/node": "^20.10.3", "@types/react": "^18.2.42", "@types/react-dom": "^18.2.17", + "@types/react-syntax-highlighter": "^15.5.11", "autoprefixer": "^10.4.16", + "cross-env": "^7.0.3", "eslint": "^8.55.0", "eslint-config-next": "^14.0.3", + "eslint-config-prettier": "^8.10.0", "postcss": "^8.4.32", - "tailwindcss": "^3.3.6", - "typescript": "^5.3.2", - "@types/react-syntax-highlighter": "^15.5.11", - "cross-env": "^7.0.3", "prettier": "^3.2.5", "prettier-plugin-organize-imports": "^3.2.4", - "eslint-config-prettier": "^8.10.0" + "tailwindcss": "^3.3.6", + "tsx": "^4.7.2", + "typescript": "^5.3.2" } } diff --git a/templates/types/streaming/nextjs/postcss.config.js b/templates/types/streaming/nextjs/postcss.config.js index bce39984..12a703d9 100644 --- a/templates/types/streaming/nextjs/postcss.config.js +++ b/templates/types/streaming/nextjs/postcss.config.js @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2024 Deutsche Telekom AG, LlamaIndex, Vercel, Inc. -// -// SPDX-License-Identifier: MIT - module.exports = { plugins: { tailwindcss: {}, diff --git a/templates/types/streaming/nextjs/prettier.config.js b/templates/types/streaming/nextjs/prettier.config.js index a4dc7135..1fe03c66 100644 --- a/templates/types/streaming/nextjs/prettier.config.js +++ b/templates/types/streaming/nextjs/prettier.config.js @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2024 Deutsche Telekom AG, LlamaIndex, Vercel, Inc. -// -// SPDX-License-Identifier: MIT - module.exports = { plugins: ["prettier-plugin-organize-imports"], }; diff --git a/templates/types/streaming/nextjs/tailwind.config.ts b/templates/types/streaming/nextjs/tailwind.config.ts index e5a0975c..aa5580af 100644 --- a/templates/types/streaming/nextjs/tailwind.config.ts +++ b/templates/types/streaming/nextjs/tailwind.config.ts @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2024 Deutsche Telekom AG, LlamaIndex, Vercel, Inc. -// -// SPDX-License-Identifier: MIT - import type { Config } from "tailwindcss"; import { fontFamily } from "tailwindcss/defaultTheme"; @@ -60,8 +56,6 @@ const config: Config = { }, fontFamily: { sans: ["var(--font-sans)", ...fontFamily.sans], - mono: ["var(--font-mono)", ...fontFamily.mono], - serif: ["var(--font-serif)", ...fontFamily.serif], }, keyframes: { "accordion-down": { diff --git a/templates/types/streaming/nextjs/webpack.config.mjs b/templates/types/streaming/nextjs/webpack.config.mjs index dfb40893..8c9edeb1 100644 --- a/templates/types/streaming/nextjs/webpack.config.mjs +++ b/templates/types/streaming/nextjs/webpack.config.mjs @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2024 Deutsche Telekom AG, LlamaIndex, Vercel, Inc. -// -// SPDX-License-Identifier: MIT - // webpack config must be a function in NextJS that is used to patch the default webpack config provided by NextJS, see https://nextjs.org/docs/pages/api-reference/next-config-js/webpack export default function webpack(config) { // See https://webpack.js.org/configuration/resolve/#resolvealias @@ -10,5 +6,8 @@ export default function webpack(config) { sharp$: false, "onnxruntime-node$": false, }; + config.resolve.fallback = { + aws4: false, + }; return config; } diff --git a/templates/types/streaming/nextjs/webpack.config.o11y.mjs b/templates/types/streaming/nextjs/webpack.config.o11y.mjs index c09ffc49..c7c7ad3f 100644 --- a/templates/types/streaming/nextjs/webpack.config.o11y.mjs +++ b/templates/types/streaming/nextjs/webpack.config.o11y.mjs @@ -1,7 +1,3 @@ -// SPDX-FileCopyrightText: 2024 Deutsche Telekom AG, LlamaIndex, Vercel, Inc. -// -// SPDX-License-Identifier: MIT - export default function webpack(config, isServer) { // See https://webpack.js.org/configuration/resolve/#resolvealias config.resolve.alias = { @@ -9,6 +5,9 @@ export default function webpack(config, isServer) { sharp$: false, "onnxruntime-node$": false, }; + config.resolve.fallback = { + aws4: false, + }; config.module.rules.push({ test: /\.node$/, loader: "node-loader",