diff --git a/.clusterfuzzlite/Dockerfile b/.clusterfuzzlite/Dockerfile index 230a00091c..bd23fe0a4b 100644 --- a/.clusterfuzzlite/Dockerfile +++ b/.clusterfuzzlite/Dockerfile @@ -6,7 +6,7 @@ # Pinned by digest for supply-chain integrity. Bump periodically (the OSS-Fuzz # base-builder is updated frequently with toolchain fixes); resolve a fresh digest with: # docker buildx imagetools inspect gcr.io/oss-fuzz-base/base-builder-python:latest --format '{{.Manifest.Digest}}' -FROM gcr.io/oss-fuzz-base/base-builder-python@sha256:e0e18dea5d2e4107a4f5d04652e6c278fbea32dc6d6861ee8de29402d0916746 +FROM gcr.io/oss-fuzz-base/base-builder-python@sha256:6768b69b56e3c6e654742e5109559fc37601b45d0cfe2e15ecb8e14f0e941a57 COPY . $SRC/haystack WORKDIR $SRC/haystack diff --git a/.github/utils/prepare_release_notification.sh b/.github/utils/prepare_release_notification.sh index 61c3584215..e4b562361d 100755 --- a/.github/utils/prepare_release_notification.sh +++ b/.github/utils/prepare_release_notification.sh @@ -3,8 +3,8 @@ # # Requires: VERSION, RUN_URL, HAS_FAILURE, GH_TOKEN, GITHUB_REPOSITORY # Optional: IS_RC, IS_FIRST_RC, MAJOR_MINOR, GITHUB_URL, PYPI_URL, DOCKER_URL, -# BUMP_VERSION_PR_URL, DC_PIPELINE_TEMPLATES_PR_URL, CUSTOM_NODES_PR_URL, -# DC_PIPELINE_IMAGES_PR_URL (haystack-runtime bump PR), GITHUB_WORKSPACE +# BUMP_VERSION_PR_URL, DC_PIPELINE_TEMPLATES_PR_URL, DC_CUSTOM_NODES_PR_URL, +# HAYSTACK_RUNTIME_PR_URL, GITHUB_WORKSPACE # Output: slack_payload.json # # This script is used in the release.yml workflow to prepare the notification payload @@ -64,7 +64,7 @@ if [[ "${IS_RC:-}" == "true" ]]; then PLATFORM_PRS="" [[ -n "${DC_PIPELINE_TEMPLATES_PR_URL:-}" ]] && PLATFORM_PRS+=$'\n'"- <${DC_PIPELINE_TEMPLATES_PR_URL}|dc-pipeline-templates>" [[ -n "${DC_CUSTOM_NODES_PR_URL:-}" ]] && PLATFORM_PRS+=$'\n'"- <${DC_CUSTOM_NODES_PR_URL}|deepset-cloud-custom-nodes>" - [[ -n "${DC_PIPELINE_IMAGES_PR_URL:-}" ]] && PLATFORM_PRS+=$'\n'"- <${DC_PIPELINE_IMAGES_PR_URL}|haystack-runtime>" + [[ -n "${HAYSTACK_RUNTIME_PR_URL:-}" ]] && PLATFORM_PRS+=$'\n'"- <${HAYSTACK_RUNTIME_PR_URL}|haystack-runtime>" if [[ -n "${PLATFORM_PRS}" ]]; then TXT+=$'\n\n'":factory: *Test PRs opened on Platform:*${PLATFORM_PRS}" fi diff --git a/.github/workflows/claude-code-review.yml b/.github/workflows/claude-code-review.yml index 162a94d117..14b050c4cf 100644 --- a/.github/workflows/claude-code-review.yml +++ b/.github/workflows/claude-code-review.yml @@ -36,7 +36,7 @@ jobs: - name: Run Claude Code Review id: claude-review - uses: anthropics/claude-code-action@521136812280ae7ef256e06045655b9da02793f0 # v1.0.158 + uses: anthropics/claude-code-action@6c0083bb7289c31716797a039b6367b3079cc46e # v1.0.162 with: anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY_PR_REVIEWS_PUBLIC_REPOS }} plugin_marketplaces: 'https://github.com/anthropics/claude-code.git' diff --git a/.github/workflows/claude.yml b/.github/workflows/claude.yml index fd74be6469..7c6fe2fdf8 100644 --- a/.github/workflows/claude.yml +++ b/.github/workflows/claude.yml @@ -57,7 +57,7 @@ jobs: - name: Run Claude Code id: claude - uses: anthropics/claude-code-action@521136812280ae7ef256e06045655b9da02793f0 # v1.0.158 + uses: anthropics/claude-code-action@6c0083bb7289c31716797a039b6367b3079cc46e # v1.0.162 with: anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY_PR_REVIEWS_PUBLIC_REPOS }} additional_permissions: | diff --git a/.github/workflows/docker_release.yml b/.github/workflows/docker_release.yml index b0df363070..f881a3f4cf 100644 --- a/.github/workflows/docker_release.yml +++ b/.github/workflows/docker_release.yml @@ -36,10 +36,10 @@ jobs: uses: docker/setup-qemu-action@06116385d9baf250c9f4dcb4858b16962ea869c3 # v4.1.0 - name: Set up Docker Buildx - uses: docker/setup-buildx-action@d7f5e7f509e45cec5c76c4d5afdd7de93d0b3df5 # v4.1.0 + uses: docker/setup-buildx-action@bb05f3f5519dd87d3ba754cc423b652a5edd6d2c # v4.2.0 - name: Login to DockerHub - uses: docker/login-action@650006c6eb7dba73a995cc03b0b2d7f5ca915bee # v4.2.0 + uses: docker/login-action@c99871dec2022cc055c062a10cc1a1310835ceb4 # v4.3.0 with: username: ${{ secrets.DOCKER_HUB_USER }} password: ${{ secrets.DOCKER_HUB_TOKEN }} @@ -59,7 +59,7 @@ jobs: echo "Not a stable version" fi - name: Build base images - uses: docker/bake-action@6614cfa25eff9a0b2b2697efb0b6159e7680d584 # v7.2.0 + uses: docker/bake-action@d3418bd7d0e9324001bca92fa8ba175ea7e6dc9b # v7.3.0 env: IMAGE_TAG_SUFFIX: ${{ steps.meta.outputs.version }} HAYSTACK_VERSION: ${{ steps.meta.outputs.version }} diff --git a/.github/workflows/docs_search_sync.yml b/.github/workflows/docs_search_sync.yml index 67511f34d0..d34f32c750 100644 --- a/.github/workflows/docs_search_sync.yml +++ b/.github/workflows/docs_search_sync.yml @@ -36,7 +36,7 @@ jobs: - name: Install Docusaurus and build docs-website working-directory: docs-website run: | - npm ci --ignore-scripts + npm install --ignore-scripts npm rebuild sharp npm run build diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 13b5e3e586..18f6d946a0 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -57,7 +57,8 @@ jobs: id: parse-validate env: GH_TOKEN: ${{ github.token }} - run: .github/utils/parse_validate_version.sh "${{ inputs.version }}" + VERSION: ${{ inputs.version }} + run: .github/utils/parse_validate_version.sh "$VERSION" branch-off: needs: ["parse-validate-version"] @@ -290,7 +291,7 @@ jobs: BUMP_VERSION_PR_URL: ${{ needs.branch-off.outputs.bump_version_pr_url }} DC_PIPELINE_TEMPLATES_PR_URL: ${{ needs.bump-dc-pipeline-templates.outputs.pr_url }} DC_CUSTOM_NODES_PR_URL: ${{ needs.bump-deepset-cloud-custom-nodes.outputs.pr_url }} - DC_PIPELINE_IMAGES_PR_URL: ${{ needs.bump-haystack-runtime.outputs.pr_url }} + HAYSTACK_RUNTIME_PR_URL: ${{ needs.bump-haystack-runtime.outputs.pr_url }} run: .github/utils/prepare_release_notification.sh - name: Send release notification to Slack diff --git a/.github/workflows/scorecard.yml b/.github/workflows/scorecard.yml index d9237dff71..051d21b455 100644 --- a/.github/workflows/scorecard.yml +++ b/.github/workflows/scorecard.yml @@ -61,6 +61,6 @@ jobs: retention-days: 5 - name: Upload to code-scanning - uses: github/codeql-action/upload-sarif@8aad20d150bbac5944a9f9d289da16a4b0d87c1e # v4.36.2 + uses: github/codeql-action/upload-sarif@54f647b7e1bb85c95cddabcd46b0c578ec92bc1a # v4.36.3 with: sarif_file: results.sarif diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index cdce451d79..9d00590ed5 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -148,7 +148,7 @@ jobs: - name: Run run: hatch run test:unit - - uses: actions/cache/save@2c8a9bd7457de244a408f35966fab2fb45fda9c8 # v6.0.0 + - uses: actions/cache/save@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0 id: cache if: matrix.os == 'macos-latest' with: @@ -265,7 +265,7 @@ jobs: pip install hatch==${{ env.HATCH_VERSION }} --uploaded-prior-to=P1D echo "env=$(hatch env find test)" >> "$GITHUB_OUTPUT" - - uses: actions/cache/restore@2c8a9bd7457de244a408f35966fab2fb45fda9c8 # v6.0.0 + - uses: actions/cache/restore@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0 id: cache with: path: ${{ steps.hatch.outputs.env }} diff --git a/.github/workflows/update-platform-components.yml b/.github/workflows/update-platform-components.yml new file mode 100644 index 0000000000..527c81a52a --- /dev/null +++ b/.github/workflows/update-platform-components.yml @@ -0,0 +1,99 @@ +name: Update Platform Components Table + +on: + push: + branches: + - main + workflow_dispatch: + +concurrency: + group: update-platform-components + cancel-in-progress: false + +env: + PYTHON_VERSION: "3.11" + OUTPUT_FILE: docs-website/docs/overview/platform-components.mdx + +permissions: + contents: read + +jobs: + update: + runs-on: ubuntu-slim + + steps: + - name: Checkout deepset-ai/haystack + uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 + with: + token: ${{ secrets.HAYSTACK_BOT_TOKEN }} + # Full history so git diff against HEAD works correctly + fetch-depth: 0 + + - name: Checkout deepset-ai/haystack-core-integrations + uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 + with: + repository: deepset-ai/haystack-core-integrations + path: haystack-core-integrations + fetch-depth: 1 + sparse-checkout: integrations + sparse-checkout-cone-mode: true + + - name: Checkout platform repo (sparse — schema file only) + uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 + with: + repository: ${{ secrets.SCHEMA_REPO }} + token: ${{ secrets.PLATFORM_REPO_PAT }} + path: platform-repo + sparse-checkout: | + ${{ secrets.SCHEMA_REPO_PATH }} + sparse-checkout-cone-mode: false + + - name: Set up Python ${{ env.PYTHON_VERSION }} + uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6.3.0 + with: + python-version: "${{ env.PYTHON_VERSION }}" + + - name: Generate platform components table + run: | + python scripts/generate_platform_components_table.py \ + --haystack-src . \ + --integrations-src ./haystack-core-integrations \ + --schema ./platform-repo/${{ secrets.SCHEMA_REPO_PATH }} \ + --output ./${{ env.OUTPUT_FILE }} + + - name: Compute PR body + id: pr_body + run: | + FILE="${{ env.OUTPUT_FILE }}" + if git ls-files --error-unmatch "$FILE" 2>/dev/null; then + ADDED=$(git diff HEAD -- "$FILE" | grep -cE '^\+\| `' || true) + REMOVED=$(git diff HEAD -- "$FILE" | grep -cE '^\-\| `' || true) + SUMMARY="Component rows changed: **+${ADDED}** added, **-${REMOVED}** removed." + else + SUMMARY="Initial generation of the platform components table." + fi + + { + echo "body<> "$GITHUB_OUTPUT" + + - name: Open or update pull request + uses: peter-evans/create-pull-request@5f6978faf089d4d20b00c7766989d076bb2fc7f1 # v8.1.1 + with: + token: ${{ secrets.HAYSTACK_BOT_TOKEN }} + commit-message: "chore: update platform components table" + branch: chore/update-platform-components + base: main + title: "chore: update platform components table" + add-paths: | + ${{ env.OUTPUT_FILE }} + body: ${{ steps.pr_body.outputs.body }} + labels: | + documentation + ignore-for-release-notes diff --git a/docs-website/.gitignore b/docs-website/.gitignore index 9426cf8b4e..ab00b6deb4 100644 --- a/docs-website/.gitignore +++ b/docs-website/.gitignore @@ -9,6 +9,7 @@ node_modules .yarn +package-lock.json .eslintcache diff --git a/docs-website/docs/concepts/agents.mdx b/docs-website/docs/concepts/agents.mdx index 05adf2955d..3dff04932b 100644 --- a/docs-website/docs/concepts/agents.mdx +++ b/docs-website/docs/concepts/agents.mdx @@ -76,11 +76,17 @@ export OPENAI_API_KEY= export SERPERDEV_API_KEY= ``` +The examples on this page use SerperDev web search component that have moved to the `serperdev-haystack` package. Install it to run the examples: + +```shell +pip install serperdev-haystack +``` + ```python from haystack.components.agents import Agent from haystack.components.generators.chat import OpenAIChatGenerator from haystack.components.generators.utils import print_streaming_chunk -from haystack.components.websearch import SerperDevWebSearch +from haystack_integrations.components.websearch.serperdev import SerperDevWebSearch from haystack.dataclasses import ChatMessage from haystack.tools import ComponentTool diff --git a/docs-website/docs/concepts/agents/multi-agent-systems.mdx b/docs-website/docs/concepts/agents/multi-agent-systems.mdx index 0f9aaba083..bcfbccdee8 100644 --- a/docs-website/docs/concepts/agents/multi-agent-systems.mdx +++ b/docs-website/docs/concepts/agents/multi-agent-systems.mdx @@ -31,6 +31,12 @@ Wrapping an agent inside a `@tool` function gives you full control over what the This approach works better with smaller LLMs because the tool has a clean, minimal signature. The coordinator only needs to provide a query string - all the `ChatMessage` construction and result unpacking is hidden inside the function. +The examples on this page use SerperDev web search component that have moved to the `serperdev-haystack` package. Install it to run the examples: + +```shell +pip install serperdev-haystack +``` + ```python from typing import Annotated from haystack.components.agents import Agent @@ -38,7 +44,7 @@ from haystack.components.generators.chat import OpenAIChatGenerator from haystack.components.generators.utils import print_streaming_chunk from haystack.dataclasses import ChatMessage from haystack.tools import ComponentTool, tool -from haystack.components.websearch import SerperDevWebSearch +from haystack_integrations.components.websearch.serperdev import SerperDevWebSearch from haystack.utils import Secret @@ -198,7 +204,7 @@ components: exclude_subdomains: false search_params: {} top_k: 3 - type: haystack.components.websearch.serper_dev.SerperDevWebSearch + type: haystack_integrations.components.websearch.serperdev.websearch.SerperDevWebSearch description: Search the web for current information on any topic inputs_from_state: null name: web_search @@ -254,7 +260,7 @@ from haystack.components.converters import HTMLToDocument from haystack.components.fetchers.link_content import LinkContentFetcher from haystack.components.generators.chat import OpenAIChatGenerator from haystack.components.generators.utils import print_streaming_chunk -from haystack.components.websearch import SerperDevWebSearch +from haystack_integrations.components.websearch.serperdev import SerperDevWebSearch from haystack.dataclasses import ChatMessage from haystack.tools import ComponentTool, tool from haystack.utils import Secret diff --git a/docs-website/docs/concepts/components.mdx b/docs-website/docs/concepts/components.mdx index d067ad5e03..07820dda6d 100644 --- a/docs-website/docs/concepts/components.mdx +++ b/docs-website/docs/concepts/components.mdx @@ -45,9 +45,17 @@ Returns a list of Documents ranked by their similarity to the given query. Components that use heavy resources, like LLMs or embedding models, have a `warm_up()` method that loads the necessary resources (such as models) into memory. This method is automatically called the first time the component runs, so you can use components directly without explicitly calling `warm_up()`: +The examples on this page use Sentence Transformers embedders that have moved to the `sentence-transformers-haystack` package. Install it to run the examples: + +```shell +pip install sentence-transformers-haystack +``` + ```python from haystack import Document -from haystack.components.embedders import SentenceTransformersDocumentEmbedder +from haystack_integrations.components.embedders.sentence_transformers import ( + SentenceTransformersDocumentEmbedder, +) doc = Document(content="I love pizza!") doc_embedder = SentenceTransformersDocumentEmbedder() diff --git a/docs-website/docs/concepts/components/supercomponents.mdx b/docs-website/docs/concepts/components/supercomponents.mdx index 87978b0b40..0e0898b0d1 100644 --- a/docs-website/docs/concepts/components/supercomponents.mdx +++ b/docs-website/docs/concepts/components/supercomponents.mdx @@ -19,12 +19,20 @@ With this decorator, the `to_dict` and `from_dict` serialization is optional, as The custom HybridRetriever example SuperComponent below turns your query into embeddings, then runs both a BM25 search and an embedding-based search at the same time. It finally merges those two result sets and returns the combined documents. +The examples on this page use Sentence Transformers embedders that have moved to the `sentence-transformers-haystack` package. Install it to run the examples: + +```shell +pip install sentence-transformers-haystack +``` + ```python -# pip install haystack-ai datasets "sentence-transformers>=3.0.0" +# pip install haystack-ai datasets sentence-transformers-haystack from haystack import Document, Pipeline, super_component from haystack.components.joiners import DocumentJoiner -from haystack.components.embedders import SentenceTransformersTextEmbedder +from haystack_integrations.components.embedders.sentence_transformers import ( + SentenceTransformersTextEmbedder, +) from haystack.components.retrievers import ( InMemoryBM25Retriever, InMemoryEmbeddingRetriever, diff --git a/docs-website/docs/concepts/pipelines/asyncpipeline.mdx b/docs-website/docs/concepts/pipelines/asyncpipeline.mdx index b291245ae1..75d8ad20e5 100644 --- a/docs-website/docs/concepts/pipelines/asyncpipeline.mdx +++ b/docs-website/docs/concepts/pipelines/asyncpipeline.mdx @@ -50,12 +50,18 @@ You can find more details in our [API Reference](/reference/pipeline-api#asyncpi ## Example +The examples on this page use Sentence Transformers embedders that have moved to the `sentence-transformers-haystack` package. Install it to run the examples: + +```shell +pip install sentence-transformers-haystack +``` + ```python import asyncio from haystack import AsyncPipeline, Document from haystack.components.builders import ChatPromptBuilder -from haystack.components.embedders import ( +from haystack_integrations.components.embedders.sentence_transformers import ( SentenceTransformersDocumentEmbedder, SentenceTransformersTextEmbedder, ) @@ -75,7 +81,6 @@ documents = [ ] docs_embedder = SentenceTransformersDocumentEmbedder() -docs_embedder.warm_up() document_store = InMemoryDocumentStore() document_store.write_documents(docs_embedder.run(documents=documents)["documents"]) diff --git a/docs-website/docs/concepts/pipelines/creating-pipelines.mdx b/docs-website/docs/concepts/pipelines/creating-pipelines.mdx index fbdc7ea594..0b713a9eed 100644 --- a/docs-website/docs/concepts/pipelines/creating-pipelines.mdx +++ b/docs-website/docs/concepts/pipelines/creating-pipelines.mdx @@ -26,10 +26,18 @@ For each component you want to use in your pipeline, you must know the names of Import all the dependencies, like pipeline, documents, Document Store, and all the components you want to use in your pipeline. For example, to create a semantic document search pipelines, you need the `Document` object, the pipeline, the Document Store, Embedders, and a Retriever: +The examples on this page use Sentence Transformers embedders that have moved to the `sentence-transformers-haystack` package. Install it to run the examples: + +```shell +pip install sentence-transformers-haystack +``` + ```python from haystack import Document, Pipeline from haystack.document_stores.in_memory import InMemoryDocumentStore -from haystack.components.embedders import SentenceTransformersTextEmbedder +from haystack_integrations.components.embedders.sentence_transformers import ( + SentenceTransformersTextEmbedder, +) from haystack.components.retrievers.in_memory import InMemoryEmbeddingRetriever ``` diff --git a/docs-website/docs/document-stores/oracledocumentstore.mdx b/docs-website/docs/document-stores/oracledocumentstore.mdx index f5c0728113..6a8b13d80b 100644 --- a/docs-website/docs/document-stores/oracledocumentstore.mdx +++ b/docs-website/docs/document-stores/oracledocumentstore.mdx @@ -25,6 +25,12 @@ It stores documents alongside dense vector embeddings in a native `VECTOR` colum pip install oracle-haystack ``` +The examples on this page use Sentence Transformers embedders that have moved to the `sentence-transformers-haystack` package. Install it to run the examples: + +```shell +pip install sentence-transformers-haystack +``` + ## Connection `OracleDocumentStore` connects to Oracle using the `OracleConnectionConfig` dataclass, which supports two connection modes: @@ -108,7 +114,7 @@ document_store = OracleDocumentStore( ```python from haystack import Document, Pipeline from haystack.document_stores.types import DuplicatePolicy -from haystack.components.embedders import ( +from haystack_integrations.components.embedders.sentence_transformers import ( SentenceTransformersDocumentEmbedder, SentenceTransformersTextEmbedder, ) @@ -146,7 +152,6 @@ documents = [ doc_embedder = SentenceTransformersDocumentEmbedder( model="sentence-transformers/all-MiniLM-L6-v2", ) -doc_embedder.warm_up() embedded_docs = doc_embedder.run(documents)["documents"] document_store.write_documents(embedded_docs, policy=DuplicatePolicy.OVERWRITE) diff --git a/docs-website/docs/document-stores/supabasedocumentstore.mdx b/docs-website/docs/document-stores/supabasedocumentstore.mdx index f249ae97eb..e1179db3ed 100644 --- a/docs-website/docs/document-stores/supabasedocumentstore.mdx +++ b/docs-website/docs/document-stores/supabasedocumentstore.mdx @@ -27,6 +27,12 @@ description: "Use Supabase as a document store in Haystack, with vector search ( pip install supabase-haystack ``` +The examples on this page use Sentence Transformers embedders that have moved to the `sentence-transformers-haystack` package. Install it to run the examples: + +```shell +pip install sentence-transformers-haystack +``` + ## SupabasePgvectorDocumentStore `SupabasePgvectorDocumentStore` is a thin wrapper around [`PgvectorDocumentStore`](./pgvectordocumentstore.mdx) with Supabase-specific defaults: @@ -70,7 +76,7 @@ To learn more about the initialization parameters, see the [API docs](/reference ```python from haystack import Document, Pipeline from haystack.document_stores.types.policy import DuplicatePolicy -from haystack.components.embedders import ( +from haystack_integrations.components.embedders.sentence_transformers import ( SentenceTransformersTextEmbedder, SentenceTransformersDocumentEmbedder, ) diff --git a/docs-website/docs/document-stores/valkeydocumentstore.mdx b/docs-website/docs/document-stores/valkeydocumentstore.mdx index 0a6db044dd..03af41a0e6 100644 --- a/docs-website/docs/document-stores/valkeydocumentstore.mdx +++ b/docs-website/docs/document-stores/valkeydocumentstore.mdx @@ -28,6 +28,12 @@ You can install the Valkey Haystack integration with: pip install valkey-haystack ``` +The examples on this page use Sentence Transformers embedders that have moved to the `sentence-transformers-haystack` package. Install it to run the examples: + +```shell +pip install sentence-transformers-haystack +``` + ## Initialization To use Valkey as your data storage for Haystack pipelines, you need a Valkey server with the search module running. Initialize a `ValkeyDocumentStore` like this: @@ -65,7 +71,9 @@ To write documents to your `ValkeyDocumentStore`, create an indexing pipeline or from haystack import Pipeline from haystack.components.converters import MarkdownToDocument from haystack.components.writers import DocumentWriter -from haystack.components.embedders import SentenceTransformersDocumentEmbedder +from haystack_integrations.components.embedders.sentence_transformers import ( + SentenceTransformersDocumentEmbedder, +) from haystack.components.preprocessors import DocumentSplitter from haystack_integrations.document_stores.valkey import ValkeyDocumentStore @@ -99,7 +107,9 @@ Once documents are in your `ValkeyDocumentStore`, you can use [`ValkeyEmbeddingR from haystack import Pipeline from haystack.utils import Secret from haystack.dataclasses import ChatMessage -from haystack.components.embedders import SentenceTransformersTextEmbedder +from haystack_integrations.components.embedders.sentence_transformers import ( + SentenceTransformersTextEmbedder, +) from haystack.components.builders import ChatPromptBuilder from haystack.components.generators.chat import OpenAIChatGenerator from haystack_integrations.document_stores.valkey import ValkeyDocumentStore diff --git a/docs-website/docs/optimization/advanced-rag-techniques/hypothetical-document-embeddings-hyde.mdx b/docs-website/docs/optimization/advanced-rag-techniques/hypothetical-document-embeddings-hyde.mdx index c8b2d8fd66..5c8956337c 100644 --- a/docs-website/docs/optimization/advanced-rag-techniques/hypothetical-document-embeddings-hyde.mdx +++ b/docs-website/docs/optimization/advanced-rag-techniques/hypothetical-document-embeddings-hyde.mdx @@ -28,6 +28,12 @@ Many embedding retrievers generalize poorly to new, unseen domains. This approac First, prepare all the components that you would need: +The examples on this page use Sentence Transformers embedders that have moved to the `sentence-transformers-haystack` package. Install it to run the examples: + +```shell +pip install sentence-transformers-haystack +``` + ```python import os from numpy import array, mean @@ -37,7 +43,9 @@ from haystack.components.generators.chat import OpenAIChatGenerator from haystack.components.builders import ChatPromptBuilder from haystack import component, Document from haystack.components.converters import OutputAdapter -from haystack.components.embedders import SentenceTransformersDocumentEmbedder +from haystack_integrations.components.embedders.sentence_transformers import ( + SentenceTransformersDocumentEmbedder, +) from haystack.dataclasses import ChatMessage # We need to ensure we have the OpenAI API key in our environment variables @@ -69,7 +77,6 @@ adapter = OutputAdapter( embedder = SentenceTransformersDocumentEmbedder( model="sentence-transformers/all-MiniLM-L6-v2", ) -embedder.warm_up() # Adding one custom component that returns one, "average" embedding from multiple (hypothetical) document embeddings diff --git a/docs-website/docs/overview/get-started.mdx b/docs-website/docs/overview/get-started.mdx index e3bce8b76d..b2bc68027a 100644 --- a/docs-website/docs/overview/get-started.mdx +++ b/docs-website/docs/overview/get-started.mdx @@ -88,11 +88,19 @@ print(results["llm"]["replies"]) -[HuggingFaceAPIChatGenerator](../pipeline-components/generators/huggingfaceapichatgenerator.mdx) is included in the `haystack-ai` package. You can get a [free Hugging Face token](https://huggingface.co/settings/tokens) to use the Serverless Inference API. +[HuggingFaceAPIChatGenerator](../pipeline-components/generators/huggingfaceapichatgenerator.mdx) is included in the `huggingface-api-haystack` package. You can get a [free Hugging Face token](https://huggingface.co/settings/tokens) to use the Serverless Inference API. + +The examples on this page use the Hugging Face API components and the SerperDev web search component, which have moved to the `huggingface-api-haystack` and `serperdev-haystack` packages. Install them to run the examples: + +```shell +pip install huggingface-api-haystack serperdev-haystack +``` ```python from haystack import Pipeline, Document -from haystack.components.generators.chat import HuggingFaceAPIChatGenerator +from haystack_integrations.components.generators.huggingface_api import ( + HuggingFaceAPIChatGenerator, +) from haystack.components.retrievers import InMemoryBM25Retriever from haystack.document_stores.in_memory import InMemoryDocumentStore from haystack.components.builders import ChatPromptBuilder @@ -389,7 +397,7 @@ from haystack.components.agents import Agent from haystack.components.generators.chat import OpenAIChatGenerator from haystack.dataclasses import ChatMessage from haystack.tools import ComponentTool -from haystack.components.websearch import SerperDevWebSearch +from haystack_integrations.components.websearch.serperdev import SerperDevWebSearch from haystack.utils import Secret search_tool = ComponentTool(component=SerperDevWebSearch()) @@ -411,14 +419,16 @@ print(result["last_message"].text) -[HuggingFaceAPIChatGenerator](../pipeline-components/generators/huggingfaceapichatgenerator.mdx) is included in the `haystack-ai` package. You can get a [free Hugging Face token](https://huggingface.co/settings/tokens) to use the Serverless Inference API. +[HuggingFaceAPIChatGenerator](../pipeline-components/generators/huggingfaceapichatgenerator.mdx) is included in the `huggingface-api-haystack` package. You can get a [free Hugging Face token](https://huggingface.co/settings/tokens) to use the Serverless Inference API. ```python from haystack.components.agents import Agent -from haystack.components.generators.chat import HuggingFaceAPIChatGenerator +from haystack_integrations.components.generators.huggingface_api import ( + HuggingFaceAPIChatGenerator, +) from haystack.dataclasses import ChatMessage from haystack.tools import ComponentTool -from haystack.components.websearch import SerperDevWebSearch +from haystack_integrations.components.websearch.serperdev import SerperDevWebSearch from haystack.utils import Secret search_tool = ComponentTool(component=SerperDevWebSearch()) @@ -454,7 +464,7 @@ from haystack.components.agents import Agent from haystack_integrations.components.generators.anthropic import AnthropicChatGenerator from haystack.dataclasses import ChatMessage from haystack.tools import ComponentTool -from haystack.components.websearch import SerperDevWebSearch +from haystack_integrations.components.websearch.serperdev import SerperDevWebSearch from haystack.utils import Secret search_tool = ComponentTool(component=SerperDevWebSearch()) @@ -492,7 +502,7 @@ from haystack_integrations.components.generators.amazon_bedrock import ( ) from haystack.dataclasses import ChatMessage from haystack.tools import ComponentTool -from haystack.components.websearch import SerperDevWebSearch +from haystack_integrations.components.websearch.serperdev import SerperDevWebSearch os.environ["AWS_ACCESS_KEY_ID"] = "YOUR_AWS_ACCESS_KEY_ID" os.environ["AWS_SECRET_ACCESS_KEY"] = "YOUR_AWS_SECRET_ACCESS_KEY" @@ -531,7 +541,7 @@ from haystack_integrations.components.generators.google_genai import ( ) from haystack.dataclasses import ChatMessage from haystack.tools import ComponentTool -from haystack.components.websearch import SerperDevWebSearch +from haystack_integrations.components.websearch.serperdev import SerperDevWebSearch from haystack.utils import Secret search_tool = ComponentTool(component=SerperDevWebSearch()) diff --git a/docs-website/docs/overview/migrating-from-langgraphlangchain-to-haystack.mdx b/docs-website/docs/overview/migrating-from-langgraphlangchain-to-haystack.mdx index 5b9839150b..bfde61efe5 100644 --- a/docs-website/docs/overview/migrating-from-langgraphlangchain-to-haystack.mdx +++ b/docs-website/docs/overview/migrating-from-langgraphlangchain-to-haystack.mdx @@ -459,11 +459,11 @@ Both frameworks offer in-memory stores for prototyping and a wide range of produ
- {`# pip install haystack-ai sentence-transformers + {`# pip install haystack-ai sentence-transformers-haystack from haystack import Document from haystack.document_stores.in_memory import InMemoryDocumentStore -from haystack.components.embedders import SentenceTransformersDocumentEmbedder +from haystack_integrations.components.embedders.sentence_transformers import SentenceTransformersDocumentEmbedder # Embed and write documents to the document store document_store = InMemoryDocumentStore() @@ -505,7 +505,7 @@ vectorstore.add_documents([
{`from haystack import Pipeline -from haystack.components.embedders import SentenceTransformersTextEmbedder +from haystack_integrations.components.embedders.sentence_transformers import SentenceTransformersTextEmbedder from haystack.components.retrievers.in_memory import InMemoryEmbeddingRetriever from haystack.components.builders import ChatPromptBuilder from haystack.dataclasses import ChatMessage diff --git a/docs-website/docs/overview/platform-components.mdx b/docs-website/docs/overview/platform-components.mdx new file mode 100644 index 0000000000..bbefdfcd0d --- /dev/null +++ b/docs-website/docs/overview/platform-components.mdx @@ -0,0 +1,514 @@ +--- +title: "Haystack Enterprise Components" +id: platform-components +slug: "/platform-components" +description: "A complete list of Haystack components available on the Haystack Enterprise Platform, grouped by integration partner." +--- + +# Haystack Enterprise Components + +The Haystack Enterprise Platform currently supports **224 components** and **55 integrations**. The following table lists them grouped by integration partner. + +## Core Components + +| Component | Type | Haystack Enterprise Platform | +|-----------|------|------------------------------| +| [Agent](https://docs.haystack.deepset.ai/docs/agent) | Component | ✅ Available | +| [AnswerBuilder](https://docs.haystack.deepset.ai/docs/answerbuilder) | Builder | ✅ Available | +| [AnswerJoiner](https://docs.haystack.deepset.ai/docs/answerjoiner) | Joiner | ✅ Available | +| [AutoMergingRetriever](https://docs.haystack.deepset.ai/docs/automergingretriever) | Retriever | ✅ Available | +| [AzureOCRDocumentConverter](https://docs.haystack.deepset.ai/docs/azureocrdocumentconverter) | Converter | ✅ Available | +| [AzureOpenAIChatGenerator](https://docs.haystack.deepset.ai/docs/azureopenaichatgenerator) | Generator | ✅ Available | +| [AzureOpenAIDocumentEmbedder](https://docs.haystack.deepset.ai/docs/azureopenaidocumentembedder) | Embedder | ✅ Available | +| [AzureOpenAIResponsesChatGenerator](https://docs.haystack.deepset.ai/docs/azureopenairesponseschatgenerator) | Generator | ✅ Available | +| [AzureOpenAITextEmbedder](https://docs.haystack.deepset.ai/docs/azureopenaitextembedder) | Embedder | ✅ Available | +| [BranchJoiner](https://docs.haystack.deepset.ai/docs/branchjoiner) | Joiner | ✅ Available | +| [CacheChecker](https://docs.haystack.deepset.ai/docs/cachechecker) | Component | ✅ Available | +| [ChatPromptBuilder](https://docs.haystack.deepset.ai/docs/chatpromptbuilder) | Builder | ✅ Available | +| [ConditionalRouter](https://docs.haystack.deepset.ai/docs/conditionalrouter) | Router | ✅ Available | +| [CSVDocumentCleaner](https://docs.haystack.deepset.ai/docs/csvdocumentcleaner) | Preprocessor | ✅ Available | +| [CSVDocumentSplitter](https://docs.haystack.deepset.ai/docs/csvdocumentsplitter) | Preprocessor | ✅ Available | +| [CSVToDocument](https://docs.haystack.deepset.ai/docs/csvtodocument) | Converter | ✅ Available | +| [DocumentCleaner](https://docs.haystack.deepset.ai/docs/documentcleaner) | Preprocessor | ✅ Available | +| [DocumentJoiner](https://docs.haystack.deepset.ai/docs/documentjoiner) | Joiner | ✅ Available | +| [DocumentLanguageClassifier](https://docs.haystack.deepset.ai/docs/documentlanguageclassifier) | Classifier | ✅ Available | +| [DocumentLengthRouter](https://docs.haystack.deepset.ai/docs/documentlengthrouter) | Router | ✅ Available | +| [DocumentPreprocessor](https://docs.haystack.deepset.ai/docs/documentpreprocessor) | Preprocessor | ✅ Available | +| [DocumentSplitter](https://docs.haystack.deepset.ai/docs/documentsplitter) | Preprocessor | ✅ Available | +| [DocumentToImageContent](https://docs.haystack.deepset.ai/docs/documenttoimagecontent) | Converter | ✅ Available | +| [DocumentTypeRouter](https://docs.haystack.deepset.ai/docs/documenttyperouter) | Router | ✅ Available | +| [DocumentWriter](https://docs.haystack.deepset.ai/docs/documentwriter) | Writer | ✅ Available | +| [DOCXToDocument](https://docs.haystack.deepset.ai/docs/docxtodocument) | Converter | ✅ Available | +| [EmbeddingBasedDocumentSplitter](https://docs.haystack.deepset.ai/docs/embeddingbaseddocumentsplitter) | Preprocessor | ✅ Available | +| [ExtractiveReader](https://docs.haystack.deepset.ai/docs/extractivereader) | Reader | ✅ Available | +| [FallbackChatGenerator](https://docs.haystack.deepset.ai/docs/fallbackchatgenerator) | Generator | ✅ Available | +| [FileToFileContent](https://docs.haystack.deepset.ai/docs/filetofilecontent) | Converter | ✅ Available | +| [FileTypeRouter](https://docs.haystack.deepset.ai/docs/filetyperouter) | Router | ✅ Available | +| [FilterRetriever](https://docs.haystack.deepset.ai/docs/filterretriever) | Retriever | ✅ Available | +| [HierarchicalDocumentSplitter](https://docs.haystack.deepset.ai/docs/hierarchicaldocumentsplitter) | Preprocessor | ✅ Available | +| [HTMLToDocument](https://docs.haystack.deepset.ai/docs/htmltodocument) | Converter | ✅ Available | +| [HuggingFaceAPIChatGenerator](https://docs.haystack.deepset.ai/docs/huggingfaceapichatgenerator) | Generator | ✅ Available | +| [HuggingFaceAPIDocumentEmbedder](https://docs.haystack.deepset.ai/docs/huggingfaceapidocumentembedder) | Embedder | ✅ Available | +| [HuggingFaceAPITextEmbedder](https://docs.haystack.deepset.ai/docs/huggingfaceapitextembedder) | Embedder | ✅ Available | +| [HuggingFaceLocalChatGenerator](https://docs.haystack.deepset.ai/docs/huggingfacelocalchatgenerator) | Generator | ✅ Available | +| [HuggingFaceTEIRanker](https://docs.haystack.deepset.ai/docs/huggingfaceteiranker) | Ranker | ✅ Available | +| [ImageFileToDocument](https://docs.haystack.deepset.ai/docs/imagefiletodocument) | Converter | ✅ Available | +| [ImageFileToImageContent](https://docs.haystack.deepset.ai/docs/imagefiletoimagecontent) | Converter | ✅ Available | +| [JSONConverter](https://docs.haystack.deepset.ai/docs/jsonconverter) | Converter | ✅ Available | +| [JsonSchemaValidator](https://docs.haystack.deepset.ai/docs/jsonschemavalidator) | Validator | ✅ Available | +| [LinkContentFetcher](https://docs.haystack.deepset.ai/docs/linkcontentfetcher) | Fetcher | ✅ Available | +| [ListJoiner](https://docs.haystack.deepset.ai/docs/listjoiner) | Joiner | ✅ Available | +| [LLMDocumentContentExtractor](https://docs.haystack.deepset.ai/docs/llmdocumentcontentextractor) | Extractor | ✅ Available | +| [LLMMessagesRouter](https://docs.haystack.deepset.ai/docs/llmmessagesrouter) | Router | ✅ Available | +| [LLMMetadataExtractor](https://docs.haystack.deepset.ai/docs/llmmetadataextractor) | Extractor | ✅ Available | +| [LLMRanker](https://docs.haystack.deepset.ai/docs/llmranker) | Ranker | ✅ Available | +| [LostInTheMiddleRanker](https://docs.haystack.deepset.ai/docs/lostinthemiddleranker) | Ranker | ✅ Available | +| [MarkdownHeaderSplitter](https://docs.haystack.deepset.ai/docs/markdownheadersplitter) | Preprocessor | ✅ Available | +| [MarkdownToDocument](https://docs.haystack.deepset.ai/docs/markdowntodocument) | Converter | ✅ Available | +| [MetadataRouter](https://docs.haystack.deepset.ai/docs/metadatarouter) | Router | ✅ Available | +| [MetaFieldGroupingRanker](https://docs.haystack.deepset.ai/docs/metafieldgroupingranker) | Ranker | ✅ Available | +| [MetaFieldRanker](https://docs.haystack.deepset.ai/docs/metafieldranker) | Ranker | ✅ Available | +| [MSGToDocument](https://docs.haystack.deepset.ai/docs/msgtodocument) | Converter | ✅ Available | +| [MultiFileConverter](https://docs.haystack.deepset.ai/docs/multifileconverter) | Converter | ✅ Available | +| [MultiQueryEmbeddingRetriever](https://docs.haystack.deepset.ai/docs/multiqueryembeddingretriever) | Retriever | ✅ Available | +| [MultiQueryTextRetriever](https://docs.haystack.deepset.ai/docs/multiquerytextretriever) | Retriever | ✅ Available | +| [MultiRetriever](https://docs.haystack.deepset.ai/docs/multiretriever) | Retriever | ✅ Available | +| [NamedEntityExtractor](https://docs.haystack.deepset.ai/docs/namedentityextractor) | Extractor | ✅ Available | +| [OpenAIChatGenerator](https://docs.haystack.deepset.ai/docs/openaichatgenerator) | Generator | ✅ Available | +| [OpenAIDocumentEmbedder](https://docs.haystack.deepset.ai/docs/openaidocumentembedder) | Embedder | ✅ Available | +| [OpenAIResponsesChatGenerator](https://docs.haystack.deepset.ai/docs/openairesponseschatgenerator) | Generator | ✅ Available | +| [OpenAITextEmbedder](https://docs.haystack.deepset.ai/docs/openaitextembedder) | Embedder | ✅ Available | +| [OpenAPIConnector](https://docs.haystack.deepset.ai/docs/openapiconnector) | Connector | ✅ Available | +| [OpenAPIServiceConnector](https://docs.haystack.deepset.ai/docs/openapiserviceconnector) | Connector | ✅ Available | +| [OpenAPIServiceToFunctions](https://docs.haystack.deepset.ai/docs/openapiservicetofunctions) | Converter | ✅ Available | +| [OutputAdapter](https://docs.haystack.deepset.ai/docs/outputadapter) | Converter | ✅ Available | +| [PDFMinerToDocument](https://docs.haystack.deepset.ai/docs/pdfminertodocument) | Converter | ✅ Available | +| [PDFToImageContent](https://docs.haystack.deepset.ai/docs/pdftoimagecontent) | Converter | ✅ Available | +| [PPTXToDocument](https://docs.haystack.deepset.ai/docs/pptxtodocument) | Converter | ✅ Available | +| [PromptBuilder](https://docs.haystack.deepset.ai/docs/promptbuilder) | Builder | ✅ Available | +| [PyPDFToDocument](https://docs.haystack.deepset.ai/docs/pypdftodocument) | Converter | ✅ Available | +| [PythonCodeSplitter](https://docs.haystack.deepset.ai/docs/pythoncodesplitter) | Preprocessor | ✅ Available | +| [QueryExpander](https://docs.haystack.deepset.ai/docs/queryexpander) | Component | ✅ Available | +| [RecursiveDocumentSplitter](https://docs.haystack.deepset.ai/docs/recursivesplitter) | Preprocessor | ✅ Available | +| [RegexTextExtractor](https://docs.haystack.deepset.ai/docs/regextextextractor) | Extractor | ✅ Available | +| [RemoteWhisperTranscriber](https://docs.haystack.deepset.ai/docs/remotewhispertranscriber) | Audio | ✅ Available | +| [SearchApiWebSearch](https://docs.haystack.deepset.ai/docs/searchapiwebsearch) | Component | ✅ Available | +| [SentenceTransformersDiversityRanker](https://docs.haystack.deepset.ai/docs/sentencetransformersdiversityranker) | Ranker | ✅ Available | +| [SentenceTransformersDocumentEmbedder](https://docs.haystack.deepset.ai/docs/sentencetransformersdocumentembedder) | Embedder | ✅ Available | +| [SentenceTransformersDocumentImageEmbedder](https://docs.haystack.deepset.ai/docs/sentencetransformersdocumentimageembedder) | Embedder | ✅ Available | +| [SentenceTransformersSimilarityRanker](https://docs.haystack.deepset.ai/docs/sentencetransformerssimilarityranker) | Ranker | ✅ Available | +| [SentenceTransformersSparseDocumentEmbedder](https://docs.haystack.deepset.ai/docs/sentencetransformerssparsedocumentembedder) | Embedder | ✅ Available | +| [SentenceTransformersSparseTextEmbedder](https://docs.haystack.deepset.ai/docs/sentencetransformerssparsetextembedder) | Embedder | ✅ Available | +| [SentenceTransformersTextEmbedder](https://docs.haystack.deepset.ai/docs/sentencetransformerstextembedder) | Embedder | ✅ Available | +| [SentenceWindowRetriever](https://docs.haystack.deepset.ai/docs/sentencewindowretriever) | Retriever | ✅ Available | +| [SerperDevWebSearch](https://docs.haystack.deepset.ai/docs/serperdevwebsearch) | Component | ✅ Available | +| [StringJoiner](https://docs.haystack.deepset.ai/docs/stringjoiner) | Joiner | ✅ Available | +| [TextCleaner](https://docs.haystack.deepset.ai/docs/textcleaner) | Preprocessor | ✅ Available | +| [TextEmbeddingRetriever](https://docs.haystack.deepset.ai/docs/textembeddingretriever) | Retriever | ✅ Available | +| [TextFileToDocument](https://docs.haystack.deepset.ai/docs/textfiletodocument) | Converter | ✅ Available | +| [TextLanguageRouter](https://docs.haystack.deepset.ai/docs/textlanguagerouter) | Router | ✅ Available | +| [TikaDocumentConverter](https://docs.haystack.deepset.ai/docs/tikadocumentconverter) | Converter | ✅ Available | +| [ToolInvoker](https://docs.haystack.deepset.ai/docs/toolinvoker) | Component | ✅ Available | +| [TopPSampler](https://docs.haystack.deepset.ai/docs/toppsampler) | Sampler | ✅ Available | +| [TransformersSimilarityRanker](https://docs.haystack.deepset.ai/docs/transformerssimilarityranker) | Ranker | ✅ Available | +| [TransformersTextRouter](https://docs.haystack.deepset.ai/docs/transformerstextrouter) | Router | ✅ Available | +| [TransformersZeroShotDocumentClassifier](https://docs.haystack.deepset.ai/docs/transformerszeroshotdocumentclassifier) | Classifier | ✅ Available | +| [TransformersZeroShotTextRouter](https://docs.haystack.deepset.ai/docs/transformerszeroshottextrouter) | Router | ✅ Available | +| [XLSXToDocument](https://docs.haystack.deepset.ai/docs/xlsxtodocument) | Converter | ✅ Available | + +## AIML API + +| Component | Type | Haystack Enterprise Platform | +|-----------|------|------------------------------| +| [AIMLAPIChatGenerator](https://docs.haystack.deepset.ai/docs/aimllapichatgenerator) | Generator | ✅ Available | + +## AlloyDB + +| Component | Type | Haystack Enterprise Platform | +|-----------|------|------------------------------| +| [AlloyDBEmbeddingRetriever](https://docs.haystack.deepset.ai/docs/alloydbembeddingretriever) | Retriever | ✅ Available | +| [AlloyDBKeywordRetriever](https://docs.haystack.deepset.ai/docs/alloydbkeywordretriever) | Retriever | ✅ Available | + +## Amazon Bedrock + +| Component | Type | Haystack Enterprise Platform | +|-----------|------|------------------------------| +| [AmazonBedrockChatGenerator](https://docs.haystack.deepset.ai/docs/amazonbedrockchatgenerator) | Generator | ✅ Available | +| [AmazonBedrockDocumentEmbedder](https://docs.haystack.deepset.ai/docs/amazonbedrockdocumentembedder) | Embedder | ✅ Available | +| [AmazonBedrockDocumentImageEmbedder](https://docs.haystack.deepset.ai/docs/amazonbedrockdocumentimageembedder) | Embedder | ✅ Available | +| [AmazonBedrockRanker](https://docs.haystack.deepset.ai/docs/amazonbedrockranker) | Ranker | ✅ Available | +| [AmazonBedrockTextEmbedder](https://docs.haystack.deepset.ai/docs/amazonbedrocktextembedder) | Embedder | ✅ Available | + +## Amazon S3 + +| Component | Type | Haystack Enterprise Platform | +|-----------|------|------------------------------| +| [S3Downloader](https://docs.haystack.deepset.ai/docs/s3downloader) | Component | ✅ Available | + +## Amazon Textract + +| Component | Type | Haystack Enterprise Platform | +|-----------|------|------------------------------| +| [AmazonTextractConverter](https://docs.haystack.deepset.ai/docs/amazontextractconverter) | Converter | ✅ Available | + +## Anthropic + +| Component | Type | Haystack Enterprise Platform | +|-----------|------|------------------------------| +| [AnthropicChatGenerator](https://docs.haystack.deepset.ai/docs/anthropicchatgenerator) | Generator | ✅ Available | +| [AnthropicFoundryChatGenerator](https://docs.haystack.deepset.ai/docs/anthropicfoundrychatgenerator) | Generator | ✅ Available | +| [AnthropicVertexChatGenerator](https://docs.haystack.deepset.ai/docs/anthropicvertexchatgenerator) | Generator | ✅ Available | + +## ArcadeDB + +| Component | Type | Haystack Enterprise Platform | +|-----------|------|------------------------------| +| [ArcadeDBEmbeddingRetriever](https://docs.haystack.deepset.ai/docs/arcadedbembeddingretriever) | Retriever | ✅ Available | + +## Astra + +| Component | Type | Haystack Enterprise Platform | +|-----------|------|------------------------------| +| [AstraEmbeddingRetriever](https://docs.haystack.deepset.ai/docs/astraretriever) | Retriever | ✅ Available | + +## Azure AI Search + +| Component | Type | Haystack Enterprise Platform | +|-----------|------|------------------------------| +| [AzureAISearchBM25Retriever](https://docs.haystack.deepset.ai/docs/azureaisearchbm25retriever) | Retriever | ✅ Available | +| [AzureAISearchEmbeddingRetriever](https://docs.haystack.deepset.ai/docs/azureaisearchembeddingretriever) | Retriever | ✅ Available | +| [AzureAISearchHybridRetriever](https://docs.haystack.deepset.ai/docs/azureaisearchhybridretriever) | Retriever | ✅ Available | + +## Azure Document Intelligence + +| Component | Type | Haystack Enterprise Platform | +|-----------|------|------------------------------| +| [AzureDocumentIntelligenceConverter](https://docs.haystack.deepset.ai/docs/azuredocumentintelligenceconverter) | Converter | ✅ Available | + +## Brave + +| Component | Type | Haystack Enterprise Platform | +|-----------|------|------------------------------| +| [BraveWebSearch](https://docs.haystack.deepset.ai/docs/bravewebsearch) | Component | ✅ Available | + +## Chroma + +| Component | Type | Haystack Enterprise Platform | +|-----------|------|------------------------------| +| [ChromaEmbeddingRetriever](https://docs.haystack.deepset.ai/docs/chromaembeddingretriever) | Retriever | ✅ Available | +| [ChromaQueryTextRetriever](https://docs.haystack.deepset.ai/docs/chromaqueryretriever) | Retriever | ✅ Available | + +## Cohere + +| Component | Type | Haystack Enterprise Platform | +|-----------|------|------------------------------| +| [CohereChatGenerator](https://docs.haystack.deepset.ai/docs/coherechatgenerator) | Generator | ✅ Available | +| [CohereDocumentEmbedder](https://docs.haystack.deepset.ai/docs/coheredocumentembedder) | Embedder | ✅ Available | +| [CohereRanker](https://docs.haystack.deepset.ai/docs/cohereranker) | Ranker | ✅ Available | +| [CohereTextEmbedder](https://docs.haystack.deepset.ai/docs/coheretextembedder) | Embedder | ✅ Available | + +## Docling + +| Component | Type | Haystack Enterprise Platform | +|-----------|------|------------------------------| +| [DoclingConverter](https://docs.haystack.deepset.ai/docs/doclingconverter) | Converter | ✅ Available | +| [DoclingServeConverter](https://docs.haystack.deepset.ai/docs/doclingserveconverter) | Converter | ✅ Available | + +## Elasticsearch + +| Component | Type | Haystack Enterprise Platform | +|-----------|------|------------------------------| +| [ElasticsearchBM25Retriever](https://docs.haystack.deepset.ai/docs/elasticsearchbm25retriever) | Retriever | ✅ Available | +| [ElasticsearchEmbeddingRetriever](https://docs.haystack.deepset.ai/docs/elasticsearchembeddingretriever) | Retriever | ✅ Available | +| [ElasticsearchHybridRetriever](https://docs.haystack.deepset.ai/docs/elasticsearchhybridretriever) | Retriever | ✅ Available | +| [ElasticsearchSQLRetriever](https://docs.haystack.deepset.ai/docs/elasticsearchsqlretriever) | Retriever | ✅ Available | + +## FalkorDB + +| Component | Type | Haystack Enterprise Platform | +|-----------|------|------------------------------| +| [FalkorDBCypherRetriever](https://docs.haystack.deepset.ai/docs/falkordbcypherretriever) | Retriever | ✅ Available | +| [FalkorDBEmbeddingRetriever](https://docs.haystack.deepset.ai/docs/falkordbembeddingretriever) | Retriever | ✅ Available | + +## FastEmbed + +| Component | Type | Haystack Enterprise Platform | +|-----------|------|------------------------------| +| [FastembedDocumentEmbedder](https://docs.haystack.deepset.ai/docs/fastembeddocumentembedder) | Embedder | ✅ Available | +| [FastembedRanker](https://docs.haystack.deepset.ai/docs/fastembedranker) | Ranker | ✅ Available | +| [FastembedSparseDocumentEmbedder](https://docs.haystack.deepset.ai/docs/fastembedsparsedocumentembedder) | Embedder | ✅ Available | +| [FastembedSparseTextEmbedder](https://docs.haystack.deepset.ai/docs/fastembedsparsetextembedder) | Embedder | ✅ Available | +| [FastembedTextEmbedder](https://docs.haystack.deepset.ai/docs/fastembedtextembedder) | Embedder | ✅ Available | + +## Firecrawl + +| Component | Type | Haystack Enterprise Platform | +|-----------|------|------------------------------| +| [FirecrawlCrawler](https://docs.haystack.deepset.ai/docs/firecrawlcrawler) | Fetcher | ✅ Available | +| [FirecrawlWebSearch](https://docs.haystack.deepset.ai/docs/firecrawlwebsearch) | Component | ✅ Available | + +## GitHub + +| Component | Type | Haystack Enterprise Platform | +|-----------|------|------------------------------| +| [GitHubFileEditor](https://docs.haystack.deepset.ai/docs/githubfileeditor) | Connector | ✅ Available | +| [GitHubIssueCommenter](https://docs.haystack.deepset.ai/docs/githubissuecommenter) | Connector | ✅ Available | +| [GitHubIssueViewer](https://docs.haystack.deepset.ai/docs/githubissueviewer) | Connector | ✅ Available | +| [GitHubPRCreator](https://docs.haystack.deepset.ai/docs/githubprcreator) | Connector | ✅ Available | +| [GitHubRepoForker](https://docs.haystack.deepset.ai/docs/githubrepoforker) | Connector | ✅ Available | +| [GitHubRepoViewer](https://docs.haystack.deepset.ai/docs/githubrepoviewer) | Connector | ✅ Available | + +## Google Generative AI + +| Component | Type | Haystack Enterprise Platform | +|-----------|------|------------------------------| +| [GoogleGenAIChatGenerator](https://docs.haystack.deepset.ai/docs/googlegenaichatgenerator) | Generator | ✅ Available | +| [GoogleGenAIDocumentEmbedder](https://docs.haystack.deepset.ai/docs/googlegenaidocumentembedder) | Embedder | ✅ Available | +| [GoogleGenAITextEmbedder](https://docs.haystack.deepset.ai/docs/googlegenaitextembedder) | Embedder | ✅ Available | + +## Hugging Face API + +| Component | Type | Haystack Enterprise Platform | +|-----------|------|------------------------------| +| [HuggingFaceAPIChatGenerator](https://docs.haystack.deepset.ai/docs/huggingfaceapichatgenerator) | Generator | ✅ Available | +| [HuggingFaceAPIDocumentEmbedder](https://docs.haystack.deepset.ai/docs/huggingfaceapidocumentembedder) | Embedder | ✅ Available | +| [HuggingFaceAPITextEmbedder](https://docs.haystack.deepset.ai/docs/huggingfaceapitextembedder) | Embedder | ✅ Available | +| [HuggingFaceTEIRanker](https://docs.haystack.deepset.ai/docs/huggingfaceteiranker) | Ranker | ✅ Available | + +## Jina AI + +| Component | Type | Haystack Enterprise Platform | +|-----------|------|------------------------------| +| [JinaDocumentEmbedder](https://docs.haystack.deepset.ai/docs/jinadocumentembedder) | Embedder | ✅ Available | +| [JinaRanker](https://docs.haystack.deepset.ai/docs/jinaranker) | Ranker | ✅ Available | +| [JinaReaderConnector](https://docs.haystack.deepset.ai/docs/jinareaderconnector) | Connector | ✅ Available | +| [JinaTextEmbedder](https://docs.haystack.deepset.ai/docs/jinatextembedder) | Embedder | ✅ Available | + +## Langfuse + +| Component | Type | Haystack Enterprise Platform | +|-----------|------|------------------------------| +| [LangfuseConnector](https://docs.haystack.deepset.ai/docs/langfuseconnector) | Connector | ✅ Available | + +## Lara + +| Component | Type | Haystack Enterprise Platform | +|-----------|------|------------------------------| +| [LaraDocumentTranslator](https://docs.haystack.deepset.ai/docs/laradocumenttranslator) | Component | ✅ Available | + +## LiteLLM + +| Component | Type | Haystack Enterprise Platform | +|-----------|------|------------------------------| +| [LiteLLMChatGenerator](https://docs.haystack.deepset.ai/docs/litellmchatgenerator) | Generator | ✅ Available | + +## Llama Stack + +| Component | Type | Haystack Enterprise Platform | +|-----------|------|------------------------------| +| [LlamaStackChatGenerator](https://docs.haystack.deepset.ai/docs/llamastackchatgenerator) | Generator | ✅ Available | + +## Llama.cpp + +| Component | Type | Haystack Enterprise Platform | +|-----------|------|------------------------------| +| [LlamaCppChatGenerator](https://docs.haystack.deepset.ai/docs/llamacppchatgenerator) | Generator | ✅ Available | + +## MarkItDown + +| Component | Type | Haystack Enterprise Platform | +|-----------|------|------------------------------| +| [MarkItDownConverter](https://docs.haystack.deepset.ai/docs/markitdownconverter) | Converter | ✅ Available | + +## Mem0 + +| Component | Type | Haystack Enterprise Platform | +|-----------|------|------------------------------| +| [Mem0MemoryRetriever](https://docs.haystack.deepset.ai/docs/mem0memoryretriever) | Retriever | ✅ Available | +| [Mem0MemoryWriter](https://docs.haystack.deepset.ai/docs/mem0memorywriter) | Writer | ✅ Available | + +## Meta Llama + +| Component | Type | Haystack Enterprise Platform | +|-----------|------|------------------------------| +| [MetaLlamaChatGenerator](https://docs.haystack.deepset.ai/docs/metallamachatgenerator) | Generator | ✅ Available | + +## Mistral + +| Component | Type | Haystack Enterprise Platform | +|-----------|------|------------------------------| +| [MistralChatGenerator](https://docs.haystack.deepset.ai/docs/mistralchatgenerator) | Generator | ✅ Available | +| [MistralDocumentEmbedder](https://docs.haystack.deepset.ai/docs/mistraldocumentembedder) | Embedder | ✅ Available | +| [MistralOCRDocumentConverter](https://docs.haystack.deepset.ai/docs/mistralocrdocumentconverter) | Converter | ✅ Available | +| [MistralTextEmbedder](https://docs.haystack.deepset.ai/docs/mistraltextembedder) | Embedder | ✅ Available | + +## MongoDB Atlas + +| Component | Type | Haystack Enterprise Platform | +|-----------|------|------------------------------| +| [MongoDBAtlasEmbeddingRetriever](https://docs.haystack.deepset.ai/docs/mongodbatlasembeddingretriever) | Retriever | ✅ Available | +| [MongoDBAtlasFullTextRetriever](https://docs.haystack.deepset.ai/docs/mongodbatlasfulltextretriever) | Retriever | ✅ Available | + +## NVIDIA + +| Component | Type | Haystack Enterprise Platform | +|-----------|------|------------------------------| +| [NvidiaChatGenerator](https://docs.haystack.deepset.ai/docs/nvidiachatgenerator) | Generator | ✅ Available | +| [NvidiaDocumentEmbedder](https://docs.haystack.deepset.ai/docs/nvidiadocumentembedder) | Embedder | ✅ Available | +| [NvidiaRanker](https://docs.haystack.deepset.ai/docs/nvidiaranker) | Ranker | ✅ Available | +| [NvidiaTextEmbedder](https://docs.haystack.deepset.ai/docs/nvidiatextembedder) | Embedder | ✅ Available | + +## Ollama + +| Component | Type | Haystack Enterprise Platform | +|-----------|------|------------------------------| +| [OllamaChatGenerator](https://docs.haystack.deepset.ai/docs/ollamachatgenerator) | Generator | ✅ Available | +| [OllamaDocumentEmbedder](https://docs.haystack.deepset.ai/docs/ollamadocumentembedder) | Embedder | ✅ Available | +| [OllamaTextEmbedder](https://docs.haystack.deepset.ai/docs/ollamatextembedder) | Embedder | ✅ Available | + +## OpenRouter + +| Component | Type | Haystack Enterprise Platform | +|-----------|------|------------------------------| +| [OpenRouterChatGenerator](https://docs.haystack.deepset.ai/docs/openrouterchatgenerator) | Generator | ✅ Available | + +## OpenSearch + +| Component | Type | Haystack Enterprise Platform | +|-----------|------|------------------------------| +| [OpenSearchBM25Retriever](https://docs.haystack.deepset.ai/docs/opensearchbm25retriever) | Retriever | ✅ Available | +| [OpenSearchEmbeddingRetriever](https://docs.haystack.deepset.ai/docs/opensearchembeddingretriever) | Retriever | ✅ Available | +| [OpenSearchHybridRetriever](https://docs.haystack.deepset.ai/docs/opensearchhybridretriever) | Retriever | ✅ Available | +| [OpenSearchMetadataRetriever](https://docs.haystack.deepset.ai/docs/opensearchmetadataretriever) | Retriever | ✅ Available | +| [OpenSearchSQLRetriever](https://docs.haystack.deepset.ai/docs/opensearchsqlretriever) | Retriever | ✅ Available | + +## Oracle + +| Component | Type | Haystack Enterprise Platform | +|-----------|------|------------------------------| +| [OracleEmbeddingRetriever](https://docs.haystack.deepset.ai/docs/oracleembeddingretriever) | Retriever | ✅ Available | +| [OracleKeywordRetriever](https://docs.haystack.deepset.ai/docs/oraclekeywordretriever) | Retriever | ✅ Available | + +## Perplexity + +| Component | Type | Haystack Enterprise Platform | +|-----------|------|------------------------------| +| [PerplexityChatGenerator](https://docs.haystack.deepset.ai/docs/perplexitychatgenerator) | Generator | ✅ Available | +| [PerplexityDocumentEmbedder](https://docs.haystack.deepset.ai/docs/perplexitydocumentembedder) | Embedder | ✅ Available | +| [PerplexityTextEmbedder](https://docs.haystack.deepset.ai/docs/perplexitytextembedder) | Embedder | ✅ Available | +| [PerplexityWebSearch](https://docs.haystack.deepset.ai/docs/perplexitywebsearch) | Component | ✅ Available | + +## pgvector + +| Component | Type | Haystack Enterprise Platform | +|-----------|------|------------------------------| +| [PgvectorEmbeddingRetriever](https://docs.haystack.deepset.ai/docs/pgvectorembeddingretriever) | Retriever | ✅ Available | +| [PgvectorKeywordRetriever](https://docs.haystack.deepset.ai/docs/pgvectorkeywordretriever) | Retriever | ✅ Available | + +## Pinecone + +| Component | Type | Haystack Enterprise Platform | +|-----------|------|------------------------------| +| [PineconeEmbeddingRetriever](https://docs.haystack.deepset.ai/docs/pineconedenseretriever) | Retriever | ✅ Available | + +## Presidio + +| Component | Type | Haystack Enterprise Platform | +|-----------|------|------------------------------| +| [PresidioDocumentCleaner](https://docs.haystack.deepset.ai/docs/presidiodocumentcleaner) | Preprocessor | ✅ Available | +| [PresidioEntityExtractor](https://docs.haystack.deepset.ai/docs/presidioentityextractor) | Extractor | ✅ Available | +| [PresidioTextCleaner](https://docs.haystack.deepset.ai/docs/presidiotextcleaner) | Preprocessor | ✅ Available | + +## Pyversity + +| Component | Type | Haystack Enterprise Platform | +|-----------|------|------------------------------| +| [PyversityRanker](https://docs.haystack.deepset.ai/docs/pyversityranker) | Ranker | ✅ Available | + +## Qdrant + +| Component | Type | Haystack Enterprise Platform | +|-----------|------|------------------------------| +| [QdrantEmbeddingRetriever](https://docs.haystack.deepset.ai/docs/qdrantembeddingretriever) | Retriever | ✅ Available | +| [QdrantHybridRetriever](https://docs.haystack.deepset.ai/docs/qdranthybridretriever) | Retriever | ✅ Available | +| [QdrantSparseEmbeddingRetriever](https://docs.haystack.deepset.ai/docs/qdrantsparseembeddingretriever) | Retriever | ✅ Available | + +## Snowflake + +| Component | Type | Haystack Enterprise Platform | +|-----------|------|------------------------------| +| [SnowflakeTableRetriever](https://docs.haystack.deepset.ai/docs/snowflaketableretriever) | Retriever | ✅ Available | + +## SQLAlchemy + +| Component | Type | Haystack Enterprise Platform | +|-----------|------|------------------------------| +| SQLAlchemyTableRetriever | Retriever | ✅ Available | + +## STACKIT + +| Component | Type | Haystack Enterprise Platform | +|-----------|------|------------------------------| +| [STACKITChatGenerator](https://docs.haystack.deepset.ai/docs/stackitchatgenerator) | Generator | ✅ Available | +| [STACKITDocumentEmbedder](https://docs.haystack.deepset.ai/docs/stackitdocumentembedder) | Embedder | ✅ Available | +| [STACKITTextEmbedder](https://docs.haystack.deepset.ai/docs/stackittextembedder) | Embedder | ✅ Available | + +## Supabase + +| Component | Type | Haystack Enterprise Platform | +|-----------|------|------------------------------| +| [SupabasePgvectorEmbeddingRetriever](https://docs.haystack.deepset.ai/docs/supabasepgvectorembeddingretriever) | Retriever | ✅ Available | +| [SupabasePgvectorKeywordRetriever](https://docs.haystack.deepset.ai/docs/supabasepgvectorkeywordretriever) | Retriever | ✅ Available | + +## Tavily + +| Component | Type | Haystack Enterprise Platform | +|-----------|------|------------------------------| +| [TavilyWebSearch](https://docs.haystack.deepset.ai/docs/tavilywebsearch) | Component | ✅ Available | + +## TogetherAI + +| Component | Type | Haystack Enterprise Platform | +|-----------|------|------------------------------| +| [TogetherAIChatGenerator](https://docs.haystack.deepset.ai/docs/togetheraichatgenerator) | Generator | ✅ Available | + +## Unstructured + +| Component | Type | Haystack Enterprise Platform | +|-----------|------|------------------------------| +| [UnstructuredFileConverter](https://docs.haystack.deepset.ai/docs/unstructuredfileconverter) | Converter | ✅ Available | + +## Valkey + +| Component | Type | Haystack Enterprise Platform | +|-----------|------|------------------------------| +| [ValkeyEmbeddingRetriever](https://docs.haystack.deepset.ai/docs/valkeyembeddingretriever) | Retriever | ✅ Available | + +## Vespa + +| Component | Type | Haystack Enterprise Platform | +|-----------|------|------------------------------| +| [VespaEmbeddingRetriever](https://docs.haystack.deepset.ai/docs/vespaembeddingretriever) | Retriever | ✅ Available | +| [VespaKeywordRetriever](https://docs.haystack.deepset.ai/docs/vespakeywordretriever) | Retriever | ✅ Available | + +## vLLM + +| Component | Type | Haystack Enterprise Platform | +|-----------|------|------------------------------| +| [VLLMChatGenerator](https://docs.haystack.deepset.ai/docs/vllmchatgenerator) | Generator | ✅ Available | +| [VLLMDocumentEmbedder](https://docs.haystack.deepset.ai/docs/vllmdocumentembedder) | Embedder | ✅ Available | +| [VLLMRanker](https://docs.haystack.deepset.ai/docs/vllmranker) | Ranker | ✅ Available | +| [VLLMTextEmbedder](https://docs.haystack.deepset.ai/docs/vllmtextembedder) | Embedder | ✅ Available | + +## Weaviate + +| Component | Type | Haystack Enterprise Platform | +|-----------|------|------------------------------| +| [WeaviateBM25Retriever](https://docs.haystack.deepset.ai/docs/weaviatebm25retriever) | Retriever | ✅ Available | +| [WeaviateEmbeddingRetriever](https://docs.haystack.deepset.ai/docs/weaviateembeddingretriever) | Retriever | ✅ Available | + +## Weights & Biases (Weave) + +| Component | Type | Haystack Enterprise Platform | +|-----------|------|------------------------------| +| [WeaveConnector](https://docs.haystack.deepset.ai/docs/weaveconnector) | Connector | ✅ Available | diff --git a/docs-website/docs/pipeline-components/agents-1/agent.mdx b/docs-website/docs/pipeline-components/agents-1/agent.mdx index fef0f17e64..8c6e3c1aa6 100644 --- a/docs-website/docs/pipeline-components/agents-1/agent.mdx +++ b/docs-website/docs/pipeline-components/agents-1/agent.mdx @@ -250,7 +250,7 @@ components: exclude_subdomains: false search_params: {} top_k: 3 - type: haystack.components.websearch.serper_dev.SerperDevWebSearch + type: haystack_integrations.components.websearch.serperdev.websearch.SerperDevWebSearch description: Search the web for current information on any topic inputs_from_state: null name: web_search diff --git a/docs-website/docs/pipeline-components/audio/funasrtranscriber.mdx b/docs-website/docs/pipeline-components/audio/funasrtranscriber.mdx index d537719a69..194bdc184e 100644 --- a/docs-website/docs/pipeline-components/audio/funasrtranscriber.mdx +++ b/docs-website/docs/pipeline-components/audio/funasrtranscriber.mdx @@ -27,7 +27,7 @@ Transcribe audio files to Haystack Documents using FunASR — a local, open-sour The default model is `iic/SenseVoiceSmall`, a multilingual model supporting 50+ languages that is 5–10x faster than Whisper. Models are downloaded from ModelScope on first use and cached in `~/.cache/modelscope`. -The component accepts audio file paths (`str` or `Path`) as well as `ByteStream` objects. Call `warm_up()` before running in a pipeline to load the model into memory. +The component accepts audio file paths (`str` or `Path`) as well as `ByteStream` objects. The model is loaded into memory automatically the first time the component runs. ## Usage @@ -37,7 +37,6 @@ The component accepts audio file paths (`str` or `Path`) as well as `ByteStream` from haystack_integrations.components.audio.funasr import FunASRTranscriber transcriber = FunASRTranscriber() -transcriber.warm_up() result = transcriber.run(sources=["speech.wav"]) print(result["documents"][0].content) @@ -61,7 +60,7 @@ result = pipe.run( "fetcher": { "urls": ["https://example.com/interview.wav"], }, - } + }, ) print(result["transcriber"]["documents"][0].content) ``` diff --git a/docs-website/docs/pipeline-components/classifiers/documentlanguageclassifier.mdx b/docs-website/docs/pipeline-components/classifiers/documentlanguageclassifier.mdx index 6cfffcdfe7..86d0415276 100644 --- a/docs-website/docs/pipeline-components/classifiers/documentlanguageclassifier.mdx +++ b/docs-website/docs/pipeline-components/classifiers/documentlanguageclassifier.mdx @@ -44,6 +44,12 @@ pip install langdetect-haystack Below, we are using the `DocumentLanguageClassifier` to classify English and German documents: +The examples on this page use Sentence Transformers embedders that have moved to the `sentence-transformers-haystack` package. Install it to run the examples: + +```shell +pip install sentence-transformers-haystack +``` + ```python from haystack_integrations.components.classifiers.langdetect import ( DocumentLanguageClassifier, @@ -74,7 +80,9 @@ from haystack.document_stores.in_memory import InMemoryDocumentStore from haystack_integrations.components.classifiers.langdetect import ( DocumentLanguageClassifier, ) -from haystack.components.embedders import SentenceTransformersDocumentEmbedder +from haystack_integrations.components.embedders.sentence_transformers import ( + SentenceTransformersDocumentEmbedder, +) from haystack.components.writers import DocumentWriter from haystack.components.routers import MetadataRouter diff --git a/docs-website/docs/pipeline-components/converters/amazontextractconverter.mdx b/docs-website/docs/pipeline-components/converters/amazontextractconverter.mdx index fe340ecb77..2a593e9240 100644 --- a/docs-website/docs/pipeline-components/converters/amazontextractconverter.mdx +++ b/docs-website/docs/pipeline-components/converters/amazontextractconverter.mdx @@ -72,7 +72,6 @@ from haystack_integrations.components.converters.amazon_textract import ( ) converter = AmazonTextractConverter(feature_types=["TABLES", "FORMS"]) -converter.warm_up() result = converter.run(sources=["invoice.pdf"]) documents = result["documents"] raw_responses = result["raw_textract_response"] diff --git a/docs-website/docs/pipeline-components/converters/imagefiletodocument.mdx b/docs-website/docs/pipeline-components/converters/imagefiletodocument.mdx index 07ce1d9305..0227f69972 100644 --- a/docs-website/docs/pipeline-components/converters/imagefiletodocument.mdx +++ b/docs-website/docs/pipeline-components/converters/imagefiletodocument.mdx @@ -64,10 +64,16 @@ print(documents) In the following Pipeline, image documents are created using the `ImageFileToDocument` component, then they are enriched with image embeddings and saved in the Document Store. +The examples on this page use Sentence Transformers embedders that have moved to the `sentence-transformers-haystack` package. Install it to run the examples: + +```shell +pip install sentence-transformers-haystack +``` + ```python from haystack import Pipeline from haystack.components.converters.image import ImageFileToDocument -from haystack.components.embedders.image import ( +from haystack_integrations.components.embedders.sentence_transformers import ( SentenceTransformersDocumentImageEmbedder, ) from haystack.components.writers.document_writer import DocumentWriter diff --git a/docs-website/docs/pipeline-components/generators.mdx b/docs-website/docs/pipeline-components/generators.mdx index 9b4a48db07..d742f44d49 100644 --- a/docs-website/docs/pipeline-components/generators.mdx +++ b/docs-website/docs/pipeline-components/generators.mdx @@ -15,6 +15,7 @@ Generators are responsible for generating text after you give them a prompt. The | [AmazonBedrockGenerator](generators/amazonbedrockgenerator.mdx) | Enables text generation using models through Amazon Bedrock service. | ✅ | | [AIMLAPIChatGenerator](generators/aimllapichatgenerator.mdx) | Enables chat completion using AI models through the AIMLAPI. | ✅ | | [AnthropicChatGenerator](generators/anthropicchatgenerator.mdx) | This component enables chat completions using Anthropic large language models (LLMs). | ✅ | +| [AnthropicFoundryChatGenerator](generators/anthropicfoundrychatgenerator.mdx) | This component enables chat completions using Anthropic models served through Azure Foundry. | ✅ | | [AnthropicVertexChatGenerator](generators/anthropicvertexchatgenerator.mdx) | This component enables chat completions using AnthropicVertex API. | ✅ | | [AnthropicGenerator](generators/anthropicgenerator.mdx) | This component enables text completions using Anthropic large language models (LLMs). | ✅ | | [AzureOpenAIChatGenerator](generators/azureopenaichatgenerator.mdx) | Enables chat completion using OpenAI's LLMs through Azure services. | ✅ | diff --git a/docs-website/docs/pipeline-components/generators/anthropicfoundrychatgenerator.mdx b/docs-website/docs/pipeline-components/generators/anthropicfoundrychatgenerator.mdx new file mode 100644 index 0000000000..6657e5654d --- /dev/null +++ b/docs-website/docs/pipeline-components/generators/anthropicfoundrychatgenerator.mdx @@ -0,0 +1,173 @@ +--- +title: "AnthropicFoundryChatGenerator" +id: anthropicfoundrychatgenerator +slug: "/anthropicfoundrychatgenerator" +description: "This component enables chat completions using Anthropic models served through Azure Foundry." +--- + +# AnthropicFoundryChatGenerator + +This component enables chat completions using Anthropic models served through Azure Foundry. + +
+ +| | | +| --- | --- | +| **Most common position in a pipeline** | After a [`ChatPromptBuilder`](../builders/chatpromptbuilder.mdx) | +| **Mandatory init variables** | `api_key`: Your Azure Foundry API key. Can be set with the `ANTHROPIC_FOUNDRY_API_KEY` env var. Alternatively, pass an `azure_ad_token_provider` callable.

`resource`: Your Azure Foundry resource name. Can be set with the `ANTHROPIC_FOUNDRY_RESOURCE` env var. Alternatively, pass a full `endpoint` URL. | +| **Mandatory run variables** | `messages`: A list of [`ChatMessage`](../../concepts/data-classes/chatmessage.mdx) objects | +| **Output variables** | `replies`: A list of [`ChatMessage`](../../concepts/data-classes/chatmessage.mdx) objects

`meta`: A dictionary on each reply with metadata such as the model name, finish reason, and token usage | +| **API reference** | [Anthropic](/reference/integrations-anthropic) | +| **GitHub link** | https://github.com/deepset-ai/haystack-core-integrations/tree/main/integrations/anthropic | +| **Package name** | `anthropic-haystack` | + +
+ +## Overview + +`AnthropicFoundryChatGenerator` lets you call Anthropic's Claude models through an [Azure Foundry](https://learn.microsoft.com/en-us/azure/ai-foundry/) deployment. It is a thin subclass of [`AnthropicChatGenerator`](anthropicchatgenerator.mdx) — the request and response shapes match the Anthropic Messages API, but the traffic flows through your Azure resource instead of `api.anthropic.com`. + +Use this generator when your organization standardizes on Azure for model hosting (billing, networking, compliance) but still wants to work against Claude. If you don't need Azure, prefer `AnthropicChatGenerator`. + +The default model is `claude-sonnet-4-5`. Other models known to work include `claude-opus-4-6`, `claude-sonnet-4-6`, `claude-opus-4-5`, `claude-opus-4-1`, and `claude-haiku-4-5`. This list is not exhaustive — the actual catalog depends on what is deployed in your Foundry resource. See the [Anthropic model overview](https://docs.anthropic.com/en/docs/about-claude/models) for guidance on picking a model. + +### Parameters + +`AnthropicFoundryChatGenerator` needs two things to talk to Azure: credentials and an endpoint. + +**Credentials.** Pick one of: + +- The `ANTHROPIC_FOUNDRY_API_KEY` environment variable (recommended). +- The `api_key` init parameter using the Haystack [Secret](../../concepts/secret-management.mdx) API: `Secret.from_token("your-api-key-here")`. +- A callable passed as `azure_ad_token_provider` that returns a fresh Azure AD token on demand. Use this for Entra ID / managed-identity setups where a static key isn't appropriate. + +**Endpoint.** Pick one of: + +- The `resource` init parameter (or the `ANTHROPIC_FOUNDRY_RESOURCE` environment variable) — the short Foundry resource name, used to derive the URL. +- The `endpoint` init parameter — a full URL, useful for custom domains or non-standard routes. + +Once configured, pass any text-generation parameter supported by the Anthropic [Messages API](https://docs.anthropic.com/en/api/messages) through `generation_kwargs`, either at init or per call. Common keys include `system`, `max_tokens`, `temperature`, `top_p`, `top_k`, `stop_sequences`, `metadata`, and `extra_headers`. You can also tune `timeout` and `max_retries` to control client-side resilience. + +The component takes a list of `ChatMessage` objects. `ChatMessage` is a data class that holds a message, a role (`user`, `assistant`, `system`, or `function`), and optional metadata. Only text input is supported. + +### Tool Support + +`AnthropicFoundryChatGenerator` supports function calling through the `tools` parameter, which accepts: + +- **A list of Tool objects**: Pass individual tools as a list. +- **A single Toolset**: Pass an entire Toolset directly. +- **Mixed Tools and Toolsets**: Combine multiple Toolsets with standalone tools in a single list. + +```python +from haystack.tools import Tool, Toolset +from haystack_integrations.components.generators.anthropic import AnthropicFoundryChatGenerator + +weather_tool = Tool(name="weather", description="Get weather info", ...) +math_toolset = Toolset([add_tool, subtract_tool, multiply_tool]) + +generator = AnthropicFoundryChatGenerator( + resource="my-resource", + tools=[math_toolset, weather_tool], +) +``` + +Tools passed to `run()` override any tools set at init time. For more details, see the [Tool](../../tools/tool.mdx) and [Toolset](../../tools/toolset.mdx) documentation. + +### Streaming + +You can stream output as it's generated. Pass a callback to `streaming_callback`. The built-in `print_streaming_chunk` prints text tokens and tool events to stdout. + +```python +from haystack.components.generators.utils import print_streaming_chunk +from haystack.dataclasses import ChatMessage +from haystack_integrations.components.generators.anthropic import AnthropicFoundryChatGenerator + +generator = AnthropicFoundryChatGenerator( + resource="my-resource", + streaming_callback=print_streaming_chunk, +) +generator.run([ChatMessage.from_user("Your question here")]) +``` + +:::info +Streaming works only with a single response. If a provider supports multiple candidates, set `n=1`. +::: + +See [Streaming Support](guides-to-generators/choosing-the-right-generator.mdx#streaming-support) for how `StreamingChunk` works and how to write a custom callback. Prefer `print_streaming_chunk` unless you need a specific transport (such as SSE or WebSocket) or custom UI formatting. + +### Async + +`run_async` mirrors `run` and is wired up automatically — useful inside an async pipeline or web handler. + +```python +import asyncio +from haystack.dataclasses import ChatMessage +from haystack_integrations.components.generators.anthropic import AnthropicFoundryChatGenerator + +async def main(): + generator = AnthropicFoundryChatGenerator(resource="my-resource") + result = await generator.run_async([ChatMessage.from_user("Hello!")]) + print(result["replies"][0].text) + +asyncio.run(main()) +``` + +## Usage + +Install the `anthropic-haystack` package to use the `AnthropicFoundryChatGenerator`: + +```shell +pip install anthropic-haystack +``` + +### On its own + +```python +from haystack.dataclasses import ChatMessage +from haystack.utils import Secret +from haystack_integrations.components.generators.anthropic import AnthropicFoundryChatGenerator + +generator = AnthropicFoundryChatGenerator( + model="claude-sonnet-4-5", + api_key=Secret.from_env_var("ANTHROPIC_FOUNDRY_API_KEY"), + resource="my-resource", +) + +response = generator.run([ChatMessage.from_user("What's Natural Language Processing?")]) +print(response) +``` + +### In a pipeline + +```python +from haystack import Pipeline +from haystack.components.builders import ChatPromptBuilder +from haystack.dataclasses import ChatMessage +from haystack_integrations.components.generators.anthropic import AnthropicFoundryChatGenerator + +pipe = Pipeline() +pipe.add_component("prompt_builder", ChatPromptBuilder()) +pipe.add_component( + "llm", + AnthropicFoundryChatGenerator(resource="my-resource"), +) +pipe.connect("prompt_builder", "llm") + +country = "Germany" +messages = [ + ChatMessage.from_system( + "You are an assistant giving out valuable information to language learners.", + ), + ChatMessage.from_user("What's the official language of {{ country }}?"), +] + +res = pipe.run( + data={ + "prompt_builder": { + "template_variables": {"country": country}, + "template": messages, + }, + }, +) +print(res) +``` diff --git a/docs-website/docs/pipeline-components/generators/llamacppchatgenerator.mdx b/docs-website/docs/pipeline-components/generators/llamacppchatgenerator.mdx index cbd09ab9e7..2b3d2e6cf6 100644 --- a/docs-website/docs/pipeline-components/generators/llamacppchatgenerator.mdx +++ b/docs-website/docs/pipeline-components/generators/llamacppchatgenerator.mdx @@ -82,6 +82,12 @@ CMAKE_ARGS="-DGGML_CUDA=on" pip install llama-cpp-python pip install llama-cpp-haystack ``` +The examples on this page use Sentence Transformers embedders that have moved to the `sentence-transformers-haystack` package. Install it to run the examples: + +```shell +pip install sentence-transformers-haystack +``` + ## Usage 1. Download the GGUF version of the desired LLM. The GGUF versions of popular models can be downloaded from [Hugging Face](https://huggingface.co/models?library=gguf). @@ -97,7 +103,6 @@ generator = LlamaCppChatGenerator( model_kwargs={"n_gpu_layers": -1}, generation_kwargs={"max_tokens": 128, "temperature": 0.1}, ) -generator.warm_up() messages = [ChatMessage.from_user("Who is the best American actor?")] result = generator.run(messages) ``` @@ -209,7 +214,7 @@ from datasets import load_dataset from haystack import Document, Pipeline from haystack.components.builders.answer_builder import AnswerBuilder from haystack.components.builders import ChatPromptBuilder -from haystack.components.embedders import ( +from haystack_integrations.components.embedders.sentence_transformers import ( SentenceTransformersDocumentEmbedder, SentenceTransformersTextEmbedder, ) @@ -240,7 +245,7 @@ Index the documents to the `InMemoryDocumentStore` using the `SentenceTransforme ```python doc_store = InMemoryDocumentStore(embedding_similarity_function="cosine") -# Install sentence transformers using "pip install sentence-transformers" +# Install the Sentence Transformers embedders using "pip install sentence-transformers-haystack" doc_embedder = SentenceTransformersDocumentEmbedder( model="sentence-transformers/all-MiniLM-L6-v2", ) diff --git a/docs-website/docs/pipeline-components/generators/llamacppgenerator.mdx b/docs-website/docs/pipeline-components/generators/llamacppgenerator.mdx index 2cfdf2ceec..f09113d5f2 100644 --- a/docs-website/docs/pipeline-components/generators/llamacppgenerator.mdx +++ b/docs-website/docs/pipeline-components/generators/llamacppgenerator.mdx @@ -52,6 +52,12 @@ CMAKE_ARGS="-DGGML_CUDA=on" pip install llama-cpp-python pip install llama-cpp-haystack ``` +The examples on this page use Sentence Transformers embedders that have moved to the `sentence-transformers-haystack` package. Install it to run the examples: + +```shell +pip install sentence-transformers-haystack +``` + ## Usage 1. You need to download the GGUF version of the desired LLM. The GGUF versions of popular models can be downloaded from [Hugging Face](https://huggingface.co/models?library=gguf). @@ -67,7 +73,6 @@ generator = LlamaCppGenerator( model_kwargs={"n_gpu_layers": -1}, generation_kwargs={"max_tokens": 128, "temperature": 0.1}, ) -generator.warm_up() prompt = f"Who is the best American actor?" result = generator.run(prompt) ``` @@ -147,7 +152,7 @@ from datasets import load_dataset from haystack import Document, Pipeline from haystack.components.builders.answer_builder import AnswerBuilder from haystack.components.builders.prompt_builder import PromptBuilder -from haystack.components.embedders import ( +from haystack_integrations.components.embedders.sentence_transformers import ( SentenceTransformersDocumentEmbedder, SentenceTransformersTextEmbedder, ) diff --git a/docs-website/docs/pipeline-components/joiners/branchjoiner.mdx b/docs-website/docs/pipeline-components/joiners/branchjoiner.mdx index 0c39275229..4f49313e6d 100644 --- a/docs-website/docs/pipeline-components/joiners/branchjoiner.mdx +++ b/docs-website/docs/pipeline-components/joiners/branchjoiner.mdx @@ -130,6 +130,12 @@ print(json.loads(result["validator"]["validated"][0].text)) In this example, the `TextLanguageRouter` component directs the query to one of three language-specific Retrievers. The next component would be a `PromptBuilder`, but we cannot connect multiple Retrievers to a single `PromptBuilder` directly. Instead, we connect all the Retrievers to the `BranchJoiner` component. The `BranchJoiner` then takes the output from the Retriever that was actually called and passes it as a single list of documents to the `PromptBuilder`. The `BranchJoiner` ensures that the pipeline can handle multiple languages seamlessly by consolidating different outputs from the Retrievers into a unified connection for further processing. +The examples on this page use language classification components that have moved to the `langdetect-haystack` package. Install it to run the examples: + +```shell +pip install langdetect-haystack +``` + ```python from haystack import Document, Pipeline from haystack.document_stores.in_memory import InMemoryDocumentStore @@ -137,7 +143,7 @@ from haystack.components.retrievers.in_memory import InMemoryBM25Retriever from haystack.components.joiners import BranchJoiner from haystack.components.builders import ChatPromptBuilder from haystack.components.generators.chat import OpenAIChatGenerator -from haystack.components.routers import TextLanguageRouter +from haystack_integrations.components.routers.langdetect import TextLanguageRouter from haystack.dataclasses import ChatMessage prompt_template = [ diff --git a/docs-website/docs/pipeline-components/joiners/documentjoiner.mdx b/docs-website/docs/pipeline-components/joiners/documentjoiner.mdx index cc5998e317..c2fac5a012 100644 --- a/docs-website/docs/pipeline-components/joiners/documentjoiner.mdx +++ b/docs-website/docs/pipeline-components/joiners/documentjoiner.mdx @@ -63,6 +63,12 @@ joiner.run(documents=[docs_1, docs_2]) Below is an example of a hybrid retrieval pipeline that retrieves documents from an `InMemoryDocumentStore` based on keyword search (using `InMemoryBM25Retriever`) and embedding search (using `InMemoryEmbeddingRetriever`). It then uses the `DocumentJoiner` with its default join mode to concatenate the retrieved documents into one list. The Document Store must contain documents with embeddings, otherwise the `InMemoryEmbeddingRetriever` will not return any documents. +The examples on this page use Sentence Transformers embedders that have moved to the `sentence-transformers-haystack` package. Install it to run the examples: + +```shell +pip install sentence-transformers-haystack +``` + ```python from haystack.components.joiners.document_joiner import DocumentJoiner from haystack import Pipeline @@ -71,7 +77,9 @@ from haystack.components.retrievers.in_memory import ( InMemoryBM25Retriever, InMemoryEmbeddingRetriever, ) -from haystack.components.embedders import SentenceTransformersTextEmbedder +from haystack_integrations.components.embedders.sentence_transformers import ( + SentenceTransformersTextEmbedder, +) document_store = InMemoryDocumentStore() p = Pipeline() @@ -111,7 +119,9 @@ from haystack.components.converters import ( from haystack.components.preprocessors import DocumentSplitter, DocumentCleaner from haystack.components.routers import FileTypeRouter from haystack.components.joiners import DocumentJoiner -from haystack.components.embedders import SentenceTransformersDocumentEmbedder +from haystack_integrations.components.embedders.sentence_transformers import ( + SentenceTransformersDocumentEmbedder, +) from haystack import Pipeline from haystack.document_stores.in_memory import InMemoryDocumentStore from pathlib import Path diff --git a/docs-website/docs/pipeline-components/preprocessors/chinesedocumentsplitter.mdx b/docs-website/docs/pipeline-components/preprocessors/chinesedocumentsplitter.mdx index ce3bd9dd1c..c926468ee2 100644 --- a/docs-website/docs/pipeline-components/preprocessors/chinesedocumentsplitter.mdx +++ b/docs-website/docs/pipeline-components/preprocessors/chinesedocumentsplitter.mdx @@ -144,7 +144,6 @@ def custom_split(text: str) -> list[str]: doc = Document(content="第一段,第二段,第三段,第四段") splitter = ChineseDocumentSplitter(split_by="function", splitting_function=custom_split) -splitter.warm_up() result = splitter.run(documents=[doc]) print(result["documents"]) ``` diff --git a/docs-website/docs/pipeline-components/preprocessors/embeddingbaseddocumentsplitter.mdx b/docs-website/docs/pipeline-components/preprocessors/embeddingbaseddocumentsplitter.mdx index e80ce7c52e..942436fe3f 100644 --- a/docs-website/docs/pipeline-components/preprocessors/embeddingbaseddocumentsplitter.mdx +++ b/docs-website/docs/pipeline-components/preprocessors/embeddingbaseddocumentsplitter.mdx @@ -36,10 +36,18 @@ This component is inspired by [5 Levels of Text Splitting](https://github.com/Fu ### On its own +The examples on this page use Sentence Transformers embedders that have moved to the `sentence-transformers-haystack` package. Install it to run the examples: + +```shell +pip install sentence-transformers-haystack +``` + ```python from haystack import Document -from haystack.components.embedders import SentenceTransformersDocumentEmbedder +from haystack_integrations.components.embedders.sentence_transformers import ( + SentenceTransformersDocumentEmbedder, +) from haystack.components.preprocessors import EmbeddingBasedDocumentSplitter # Create a document with content that has a clear topic shift diff --git a/docs-website/docs/pipeline-components/preprocessors/textcleaner.mdx b/docs-website/docs/pipeline-components/preprocessors/textcleaner.mdx index 63b1381442..463085718d 100644 --- a/docs-website/docs/pipeline-components/preprocessors/textcleaner.mdx +++ b/docs-website/docs/pipeline-components/preprocessors/textcleaner.mdx @@ -55,14 +55,22 @@ result = cleaner.run(texts=[text_to_clean]) ### In a pipeline -In this example, we are using `TextCleaner` after an `ExtractiveReader` and an `OutputAdapter` to remove the punctuation in texts. Then, our custom-made `ExactMatchEvaluator` component compares the retrieved answer to the ground truth answer. +In this example, we are using `TextCleaner` after a `TransformersExtractiveReader` and an `OutputAdapter` to remove the punctuation in texts. Then, our custom-made `ExactMatchEvaluator` component compares the retrieved answer to the ground truth answer. + +The examples on this page use Transformers components that have moved to the `transformers-haystack` package. Install it to run the examples: + +```shell +pip install transformers-haystack +``` ```python from typing import List from haystack import component, Document, Pipeline from haystack.components.converters import OutputAdapter from haystack.components.preprocessors import TextCleaner -from haystack.components.readers import ExtractiveReader +from haystack_integrations.components.readers.transformers import ( + TransformersExtractiveReader, +) from haystack.components.retrievers.in_memory import InMemoryBM25Retriever from haystack.document_stores.in_memory import InMemoryDocumentStore @@ -96,7 +104,7 @@ adapter = OutputAdapter( p = Pipeline() p.add_component("retriever", InMemoryBM25Retriever(document_store=document_store)) -p.add_component("reader", ExtractiveReader()) +p.add_component("reader", TransformersExtractiveReader()) p.add_component("adapter", adapter) p.add_component("cleaner", TextCleaner(remove_punctuation=True)) p.add_component("evaluator", ExactMatchEvaluator()) diff --git a/docs-website/docs/pipeline-components/rankers/fastembedlateinteractionranker.mdx b/docs-website/docs/pipeline-components/rankers/fastembedlateinteractionranker.mdx index 8cc8a9000c..b72aff16dc 100644 --- a/docs-website/docs/pipeline-components/rankers/fastembedlateinteractionranker.mdx +++ b/docs-website/docs/pipeline-components/rankers/fastembedlateinteractionranker.mdx @@ -95,19 +95,27 @@ print(result["documents"][0].content) Below is an example of a full RAG pipeline that retrieves documents using embedding similarity, reranks them with `FastembedLateInteractionRanker`, and generates an answer with an LLM. -This example uses the `HuggingFaceLocalChatGenerator`, which requires additional packages: +This example uses the `TransformersChatGenerator`, which requires additional packages: ```shell pip install "transformers[torch]" ``` +The examples on this page use Transformers components that have moved to the `transformers-haystack` package. Install it to run the examples: + +```shell +pip install transformers-haystack +``` + ```python from haystack import Document, Pipeline from haystack.document_stores.in_memory import InMemoryDocumentStore from haystack.components.retrievers.in_memory import InMemoryEmbeddingRetriever from haystack.components.builders.chat_prompt_builder import ChatPromptBuilder -from haystack.components.generators.chat import HuggingFaceLocalChatGenerator +from haystack_integrations.components.generators.transformers import ( + TransformersChatGenerator, +) from haystack.components.writers import DocumentWriter from haystack.dataclasses import ChatMessage from haystack_integrations.components.rankers.fastembed import ( @@ -162,7 +170,7 @@ rag.add_component( ) rag.add_component( "llm", - HuggingFaceLocalChatGenerator(model="HuggingFaceTB/SmolLM2-360M-Instruct"), + TransformersChatGenerator(model="HuggingFaceTB/SmolLM2-360M-Instruct"), ) rag.connect("text_embedder.embedding", "retriever.query_embedding") diff --git a/docs-website/docs/pipeline-components/rankers/pyversityranker.mdx b/docs-website/docs/pipeline-components/rankers/pyversityranker.mdx index 4d084dc819..af5c37229d 100644 --- a/docs-website/docs/pipeline-components/rankers/pyversityranker.mdx +++ b/docs-website/docs/pipeline-components/rankers/pyversityranker.mdx @@ -96,9 +96,15 @@ Below is an example of a pipeline that embeds documents and stores them in an `I Note that the retriever must be configured with `return_embedding=True` so that documents have embeddings available for the ranker. +The examples on this page use Sentence Transformers embedders that have moved to the `sentence-transformers-haystack` package. Install it to run the examples: + +```shell +pip install sentence-transformers-haystack +``` + ```python from haystack import Document, Pipeline -from haystack.components.embedders import ( +from haystack_integrations.components.embedders.sentence_transformers import ( SentenceTransformersDocumentEmbedder, SentenceTransformersTextEmbedder, ) diff --git a/docs-website/docs/pipeline-components/retrievers.mdx b/docs-website/docs/pipeline-components/retrievers.mdx index 1bff1d7719..f6e2f19e10 100644 --- a/docs-website/docs/pipeline-components/retrievers.mdx +++ b/docs-website/docs/pipeline-components/retrievers.mdx @@ -167,6 +167,7 @@ For details on how to initialize and use a Retriever in a pipeline, see the docu | [CogneeRetriever](retrievers/cogneeretriever.mdx) | Retrieves memories from a CogneeMemoryStore and returns them as system ChatMessage objects. | | [ElasticsearchEmbeddingRetriever](retrievers/elasticsearchembeddingretriever.mdx) | An embedding-based Retriever compatible with the Elasticsearch Document Store. | | [ElasticsearchBM25Retriever](retrievers/elasticsearchbm25retriever.mdx) | A keyword-based Retriever that fetches Documents matching a query from the Elasticsearch Document Store. | +| [ElasticsearchHybridRetriever](retrievers/elasticsearchhybridretriever.mdx) | A SuperComponent that combines BM25 and embedding-based retrieval from the Elasticsearch Document Store. | | [ElasticsearchSQLRetriever](retrievers/elasticsearchsqlretriever.mdx) | Executes raw Elasticsearch SQL queries against an Elasticsearch Document Store and returns the raw JSON response. | | [FAISSEmbeddingRetriever](retrievers/faissembeddingretriever.mdx) | An embedding-based Retriever compatible with the FAISSDocumentStore. | | [FalkorDBCypherRetriever](retrievers/falkordbcypherretriever.mdx) | A Retriever that executes arbitrary OpenCypher queries against a FalkorDB Document Store. | @@ -185,6 +186,7 @@ For details on how to initialize and use a Retriever in a pipeline, see the docu | [OpenSearchBM25Retriever](retrievers/opensearchbm25retriever.mdx) | A keyword-based Retriever that fetches Documents matching a query from an OpenSearch Document Store. | | [OpenSearchEmbeddingRetriever](retrievers/opensearchembeddingretriever.mdx) | An embedding-based Retriever compatible with the OpenSearch Document Store. | | [OpenSearchHybridRetriever](retrievers/opensearchhybridretriever.mdx) | A SuperComponent that implements a Hybrid Retriever in a single component, relying on OpenSearch as the backend Document Store. | +| [OpenSearchMetadataRetriever](retrievers/opensearchmetadataretriever.mdx) | Searches and ranks the metadata fields of documents stored in an OpenSearch Document Store and returns the matching metadata values. | | [OpenSearchSQLRetriever](retrievers/opensearchsqlretriever.mdx) | Executes raw OpenSearch SQL queries against an OpenSearch Document Store and returns the raw JSON response. | | [OracleEmbeddingRetriever](retrievers/oracleembeddingretriever.mdx) | An embedding-based Retriever compatible with the Oracle Document Store. | | [OracleKeywordRetriever](retrievers/oraclekeywordretriever.mdx) | A keyword-based Retriever that fetches Documents matching a query from the Oracle Document Store. | @@ -194,7 +196,7 @@ For details on how to initialize and use a Retriever in a pipeline, see the docu | [QdrantEmbeddingRetriever](retrievers/qdrantembeddingretriever.mdx) | An embedding-based Retriever compatible with the Qdrant Document Store. | | [QdrantSparseEmbeddingRetriever](retrievers/qdrantsparseembeddingretriever.mdx) | A sparse embedding-based Retriever compatible with the Qdrant Document Store. | | [QdrantHybridRetriever](retrievers/qdranthybridretriever.mdx) | A Retriever based both on dense and sparse embeddings, compatible with the Qdrant Document Store. | -| [SentenceWindowRetriever](retrievers/sentencewindowretrieval.mdx) | Retrieves neighboring sentences around relevant sentences to get the full context. | +| [SentenceWindowRetriever](retrievers/sentencewindowretriever.mdx) | Retrieves neighboring sentences around relevant sentences to get the full context. | | [SnowflakeTableRetriever](retrievers/snowflaketableretriever.mdx) | Connects to a Snowflake database to execute an SQL query. | | [SupabaseGroongaBM25Retriever](retrievers/supabasegroongabm25retriever.mdx) | A full-text Retriever that fetches documents from the SupabaseGroongaDocumentStore using PGroonga search. | | [SupabasePgvectorEmbeddingRetriever](retrievers/supabasepgvectorembeddingretriever.mdx) | An embedding-based Retriever compatible with the SupabasePgvectorDocumentStore. | diff --git a/docs-website/docs/pipeline-components/retrievers/alloydbembeddingretriever.mdx b/docs-website/docs/pipeline-components/retrievers/alloydbembeddingretriever.mdx index bf598f7556..bd97f726ba 100644 --- a/docs-website/docs/pipeline-components/retrievers/alloydbembeddingretriever.mdx +++ b/docs-website/docs/pipeline-components/retrievers/alloydbembeddingretriever.mdx @@ -13,7 +13,7 @@ An embedding-based Retriever compatible with the AlloyDB Document Store. | | | | --- | --- | -| **Most common position in a pipeline** | 1. After a Text Embedder and before a [`PromptBuilder`](../builders/promptbuilder.mdx) in a RAG pipeline 2. The last component in the semantic search pipeline 3. After a Text Embedder and before an [`ExtractiveReader`](../readers/extractivereader.mdx) in an extractive QA pipeline | +| **Most common position in a pipeline** | 1. After a Text Embedder and before a [`PromptBuilder`](../builders/promptbuilder.mdx) in a RAG pipeline 2. The last component in the semantic search pipeline 3. After a Text Embedder and before a [`TransformersExtractiveReader`](../readers/transformersextractivereader.mdx) in an extractive QA pipeline | | **Mandatory init variables** | `document_store`: An instance of an [AlloyDBDocumentStore](../../document-stores/alloydbdocumentstore.mdx) | | **Mandatory run variables** | `query_embedding`: A vector representing the query (a list of floats) | | **Output variables** | `documents`: A list of documents | @@ -43,6 +43,12 @@ pip install alloydb-haystack To set up an AlloyDB cluster and instance, follow the [AlloyDB quickstart](https://cloud.google.com/alloydb/docs/quickstart). +The examples on this page use Sentence Transformers embedders that have moved to the `sentence-transformers-haystack` package. Install it to run the examples: + +```shell +pip install sentence-transformers-haystack +``` + ## Usage ### On its own @@ -69,7 +75,7 @@ retriever.run(query_embedding=[0.1] * 768) ```python from haystack import Document, Pipeline from haystack.document_stores.types import DuplicatePolicy -from haystack.components.embedders import ( +from haystack_integrations.components.embedders.sentence_transformers import ( SentenceTransformersTextEmbedder, SentenceTransformersDocumentEmbedder, ) diff --git a/docs-website/docs/pipeline-components/retrievers/arangoembeddingretriever.mdx b/docs-website/docs/pipeline-components/retrievers/arangoembeddingretriever.mdx index 78022c10ec..ce4b645d60 100644 --- a/docs-website/docs/pipeline-components/retrievers/arangoembeddingretriever.mdx +++ b/docs-website/docs/pipeline-components/retrievers/arangoembeddingretriever.mdx @@ -45,6 +45,12 @@ docker run -d -p 8529:8529 \ arangodb:3.12 arangod --vector-index ``` +The examples on this page use Sentence Transformers embedders that have moved to the `sentence-transformers-haystack` package. Install it to run the examples: + +```shell +pip install sentence-transformers-haystack +``` + ## Usage ### On its own @@ -84,7 +90,7 @@ print(result["documents"][0].content) ```python from haystack import Document, Pipeline from haystack.document_stores.types import DuplicatePolicy -from haystack.components.embedders import ( +from haystack_integrations.components.embedders.sentence_transformers import ( SentenceTransformersDocumentEmbedder, SentenceTransformersTextEmbedder, ) diff --git a/docs-website/docs/pipeline-components/retrievers/arcadedbembeddingretriever.mdx b/docs-website/docs/pipeline-components/retrievers/arcadedbembeddingretriever.mdx index 697c945932..99fdb0262b 100644 --- a/docs-website/docs/pipeline-components/retrievers/arcadedbembeddingretriever.mdx +++ b/docs-website/docs/pipeline-components/retrievers/arcadedbembeddingretriever.mdx @@ -35,6 +35,12 @@ pip install arcadedb-haystack Ensure ArcadeDB is running, for example via Docker, and credentials are set (`ARCADEDB_USERNAME`, `ARCADEDB_PASSWORD`). +The examples on this page use Sentence Transformers embedders that have moved to the `sentence-transformers-haystack` package. Install it to run the examples: + +```shell +pip install sentence-transformers-haystack +``` + ## Usage ### On its own @@ -63,7 +69,7 @@ for doc in result["documents"]: ```python from haystack import Document, Pipeline from haystack.document_stores.types import DuplicatePolicy -from haystack.components.embedders import ( +from haystack_integrations.components.embedders.sentence_transformers import ( SentenceTransformersTextEmbedder, SentenceTransformersDocumentEmbedder, ) diff --git a/docs-website/docs/pipeline-components/retrievers/astraretriever.mdx b/docs-website/docs/pipeline-components/retrievers/astraretriever.mdx index 9f3773d899..c79f9723a5 100644 --- a/docs-website/docs/pipeline-components/retrievers/astraretriever.mdx +++ b/docs-website/docs/pipeline-components/retrievers/astraretriever.mdx @@ -13,7 +13,7 @@ This is an embedding-based Retriever compatible with the Astra Document Store. | | | | --- | --- | -| **Most common position in a pipeline** | 1. After a Text Embedder and before a [`PromptBuilder`](../builders/promptbuilder.mdx) in a RAG pipeline
2. The last component in the semantic search pipeline
3. After a Text Embedder and before an [`ExtractiveReader`](../readers/extractivereader.mdx) in an extractive QA pipeline | +| **Most common position in a pipeline** | 1. After a Text Embedder and before a [`PromptBuilder`](../builders/promptbuilder.mdx) in a RAG pipeline
2. The last component in the semantic search pipeline
3. After a Text Embedder and before a [`TransformersExtractiveReader`](../readers/transformersextractivereader.mdx) in an extractive QA pipeline | | **Mandatory init variables** | `document_store`: An instance of [AstraDocumentStore](../../document-stores/astradocumentstore.mdx) | | **Mandatory run variables** | `query_embedding`: A list of floats | | **Output variables** | `documents`: A list of documents | @@ -43,10 +43,10 @@ From the configuration in AstraDB’s web UI, you need the database ID and a gen You will additionally need a collection name and a namespace. When you create the collection name, you also need to set the embedding dimensions and the similarity metric. The namespace organizes data in a database and is called a keyspace in Apache Cassandra. -Then, optionally, install sentence-transformers as well to run the example below: +Then, optionally, install the `sentence-transformers-haystack` package as well to run the example below: ```shell -pip install sentence-transformers +pip install sentence-transformers-haystack ``` ## Usage @@ -59,7 +59,7 @@ Use this Retriever in a query pipeline like this: ```python from haystack import Document, Pipeline -from haystack.components.embedders import ( +from haystack_integrations.components.embedders.sentence_transformers import ( SentenceTransformersTextEmbedder, SentenceTransformersDocumentEmbedder, ) diff --git a/docs-website/docs/pipeline-components/retrievers/azureaisearchembeddingretriever.mdx b/docs-website/docs/pipeline-components/retrievers/azureaisearchembeddingretriever.mdx index 7fb26bedbe..22cb29506c 100644 --- a/docs-website/docs/pipeline-components/retrievers/azureaisearchembeddingretriever.mdx +++ b/docs-website/docs/pipeline-components/retrievers/azureaisearchembeddingretriever.mdx @@ -15,7 +15,7 @@ This Retriever accepts the embeddings of a single query as input and returns a l | | | | --- | --- | -| **Most common position in a pipeline** | 1. After a Text Embedder and before a [`PromptBuilder`](../builders/promptbuilder.mdx) in a RAG pipeline 2. The last component in the embedding retrieval pipeline 3. After a Text Embedder and before an [`ExtractiveReader`](../readers/extractivereader.mdx) in an extractive QA pipeline | +| **Most common position in a pipeline** | 1. After a Text Embedder and before a [`PromptBuilder`](../builders/promptbuilder.mdx) in a RAG pipeline 2. The last component in the embedding retrieval pipeline 3. After a Text Embedder and before an [`TransformersExtractiveReader`](../readers/transformersextractivereader.mdx) in an extractive QA pipeline | | **Mandatory init variables** | `document_store`: An instance of [`AzureAISearchDocumentStore`](../../document-stores/azureaisearchdocumentstore.mdx) | | **Mandatory run variables** | `query_embedding`: A list of floats | | **Output variables** | `documents`: A list of documents | @@ -80,9 +80,15 @@ In the indexing pipeline, the documents are passed to the Document Embedder and Then, in the querying pipeline, we use a Text Embedder to get the vector representation of the input query that will be then passed to the `AzureAISearchEmbeddingRetriever` to get the results. +The examples on this page use Sentence Transformers embedders that have moved to the `sentence-transformers-haystack` package. Install it to run the examples: + +```shell +pip install sentence-transformers-haystack +``` + ```python from haystack import Document, Pipeline -from haystack.components.embedders import ( +from haystack_integrations.components.embedders.sentence_transformers import ( SentenceTransformersDocumentEmbedder, SentenceTransformersTextEmbedder, ) diff --git a/docs-website/docs/pipeline-components/retrievers/azureaisearchhybridretriever.mdx b/docs-website/docs/pipeline-components/retrievers/azureaisearchhybridretriever.mdx index fe532a10cc..68bc03fe74 100644 --- a/docs-website/docs/pipeline-components/retrievers/azureaisearchhybridretriever.mdx +++ b/docs-website/docs/pipeline-components/retrievers/azureaisearchhybridretriever.mdx @@ -15,7 +15,7 @@ This Retriever combines embedding-based retrieval and BM25 text search search to | | | | --- | --- | -| **Most common position in a pipeline** | 1. After a TextEmbedder and before a [`PromptBuilder`](../builders/promptbuilder.mdx) in a RAG pipeline 2. The last component in a hybrid search pipeline 3. After a TextEmbedder and before an [`ExtractiveReader`](../readers/extractivereader.mdx) in an extractive QA pipeline | +| **Most common position in a pipeline** | 1. After a TextEmbedder and before a [`PromptBuilder`](../builders/promptbuilder.mdx) in a RAG pipeline 2. The last component in a hybrid search pipeline 3. After a TextEmbedder and before an [`TransformersExtractiveReader`](../readers/transformersextractivereader.mdx) in an extractive QA pipeline | | **Mandatory init variables** | `document_store`: An instance of [`AzureAISearchDocumentStore`](../../document-stores/azureaisearchdocumentstore.mdx) | | **Mandatory run variables** | `query`: A string

`query_embedding`: A list of floats | | **Output variables** | `documents`: A list of documents (matching the query) | @@ -84,9 +84,15 @@ retriever.run( The following example demonstrates using the `AzureAISearchHybridRetriever` in a pipeline. An indexing pipeline is responsible for indexing and storing documents with embeddings in the `AzureAISearchDocumentStore`, while the query pipeline uses hybrid retrieval to fetch relevant documents based on a given query. +The examples on this page use Sentence Transformers embedders that have moved to the `sentence-transformers-haystack` package. Install it to run the examples: + +```shell +pip install sentence-transformers-haystack +``` + ```python from haystack import Document, Pipeline -from haystack.components.embedders import ( +from haystack_integrations.components.embedders.sentence_transformers import ( SentenceTransformersDocumentEmbedder, SentenceTransformersTextEmbedder, ) diff --git a/docs-website/docs/pipeline-components/retrievers/chromaembeddingretriever.mdx b/docs-website/docs/pipeline-components/retrievers/chromaembeddingretriever.mdx index d108a3985b..01dc63e5fe 100644 --- a/docs-website/docs/pipeline-components/retrievers/chromaembeddingretriever.mdx +++ b/docs-website/docs/pipeline-components/retrievers/chromaembeddingretriever.mdx @@ -13,7 +13,7 @@ This is an embedding Retriever compatible with the Chroma Document Store. | | | | --- | --- | -| **Most common position in a pipeline** | 1. After a Text Embedder and before a [`PromptBuilder`](../builders/promptbuilder.mdx) in a RAG pipeline 2. The last component in the semantic search pipeline 3. After a Text Embedder and before an [`ExtractiveReader`](../readers/extractivereader.mdx) in an extractive QA pipeline | +| **Most common position in a pipeline** | 1. After a Text Embedder and before a [`PromptBuilder`](../builders/promptbuilder.mdx) in a RAG pipeline 2. The last component in the semantic search pipeline 3. After a Text Embedder and before a [`TransformersExtractiveReader`](../readers/transformersextractivereader.mdx) in an extractive QA pipeline | | **Mandatory init variables** | `document_store`: An instance of a [ChromaDocumentStore](../../document-stores/chromadocumentstore.mdx) | | **Mandatory run variables** | `query_embedding`: A list of floats | | **Output variables** | `documents`: A list of documents | @@ -65,8 +65,8 @@ from haystack import Pipeline from haystack.dataclasses import Document from haystack.components.writers import DocumentWriter -# Note: the following requires a "pip install sentence-transformers" -from haystack.components.embedders import ( +# Note: the following requires a "pip install sentence-transformers-haystack" +from haystack_integrations.components.embedders.sentence_transformers import ( SentenceTransformersDocumentEmbedder, SentenceTransformersTextEmbedder, ) diff --git a/docs-website/docs/pipeline-components/retrievers/elasticsearchembeddingretriever.mdx b/docs-website/docs/pipeline-components/retrievers/elasticsearchembeddingretriever.mdx index b059e95145..307a62ba24 100644 --- a/docs-website/docs/pipeline-components/retrievers/elasticsearchembeddingretriever.mdx +++ b/docs-website/docs/pipeline-components/retrievers/elasticsearchembeddingretriever.mdx @@ -13,7 +13,7 @@ An embedding-based Retriever compatible with the Elasticsearch Document Store. | | | | --- | --- | -| **Most common position in a pipeline** | 1. After a Text Embedder and before a [`PromptBuilder`](../builders/promptbuilder.mdx) in a RAG pipeline 2. The last component in the semantic search pipeline 3. After a Text Embedder and before an [`ExtractiveReader`](../readers/extractivereader.mdx) in an extractive QA pipeline | +| **Most common position in a pipeline** | 1. After a Text Embedder and before a [`PromptBuilder`](../builders/promptbuilder.mdx) in a RAG pipeline 2. The last component in the semantic search pipeline 3. After a Text Embedder and before a [`TransformersExtractiveReader`](../readers/transformersextractivereader.mdx) in an extractive QA pipeline | | **Mandatory init variables** | `document_store`: An instance of [ElasticsearchDocumentStore](../../document-stores/elasticsearch-document-store.mdx) | | **Mandatory run variables** | `query_embedding`: A list of floats | | **Output variables** | `documents`: A list of documents | @@ -58,6 +58,12 @@ Once you have a running Elasticsearch instance, install the `elasticsearch-hayst pip install elasticsearch-haystack ``` +The examples on this page use Sentence Transformers embedders that have moved to the `sentence-transformers-haystack` package. Install it to run the examples: + +```shell +pip install sentence-transformers-haystack +``` + ## Usage ### In a pipeline @@ -74,7 +80,7 @@ from haystack_integrations.document_stores.elasticsearch import ( from haystack.document_stores.types import DuplicatePolicy from haystack import Document, Pipeline -from haystack.components.embedders import ( +from haystack_integrations.components.embedders.sentence_transformers import ( SentenceTransformersTextEmbedder, SentenceTransformersDocumentEmbedder, ) diff --git a/docs-website/docs/pipeline-components/retrievers/elasticsearchhybridretriever.mdx b/docs-website/docs/pipeline-components/retrievers/elasticsearchhybridretriever.mdx new file mode 100644 index 0000000000..99774ae78e --- /dev/null +++ b/docs-website/docs/pipeline-components/retrievers/elasticsearchhybridretriever.mdx @@ -0,0 +1,214 @@ +--- +title: "ElasticsearchHybridRetriever" +id: elasticsearchhybridretriever +slug: "/elasticsearchhybridretriever" +description: "This is a SuperComponent that implements a Hybrid Retriever in a single component, relying on Elasticsearch as the backend Document Store." +--- + +# ElasticsearchHybridRetriever + +This is a [SuperComponent](../../concepts/components/supercomponents.mdx) that implements a Hybrid Retriever in a single component, relying on Elasticsearch as the backend Document Store. + +A Hybrid Retriever uses both traditional keyword-based search (BM25) and embedding-based search to retrieve documents, combining the strengths of both approaches. The Retriever then merges and re-ranks the results from both methods. + +
+ +| | | +| --- | --- | +| **Most common position in a pipeline** | 1. After a TextEmbedder and before a PromptBuilder in a RAG pipeline 2. The last component in a hybrid search pipeline 3. After a TextEmbedder and before an ExtractiveReader in an extractive QA pipeline | +| **Mandatory init variables** | `document_store`: An instance of [`ElasticsearchDocumentStore`](../../document-stores/elasticsearch-document-store.mdx)

`embedder`: Any [Embedder](../embedders.mdx) implementing the `TextEmbedder` protocol | +| **Mandatory run variables** | `query`: A query string | +| **Output variables** | `documents`: A list of documents matching the query | +| **API reference** | [Elasticsearch](/reference/integrations-elasticsearch) | +| **GitHub link** | https://github.com/deepset-ai/haystack-core-integrations/tree/main/integrations/elasticsearch | +| **Package name** | `elasticsearch-haystack` | + +
+ +## Overview + +The `ElasticsearchHybridRetriever` combines two retrieval methods: + +1. **BM25 Retrieval**: A keyword-based search that uses the BM25 algorithm to find documents based on term frequency and inverse document frequency. It's based on the [`ElasticsearchBM25Retriever`](elasticsearchbm25retriever.mdx) component and is suitable for finding exact matches to names, IDs, or well-defined terms. +2. **Embedding-based Retrieval**: A semantic search that uses vector similarity to find documents that are semantically similar to the query. It's based on the [`ElasticsearchEmbeddingRetriever`](elasticsearchembeddingretriever.mdx) component and is suitable for semantic search. + +The component automatically handles: + +- Converting the query into an embedding using the provided embedder, +- Running both retrieval methods in parallel, +- Merging and re-ranking the results using the specified join mode (default: Reciprocal Rank Fusion). + +### Installation + +[Install](https://www.elastic.co/guide/en/elasticsearch/reference/current/install-elasticsearch.html) Elasticsearch and then [start](https://www.elastic.co/guide/en/elasticsearch/reference/current/starting-elasticsearch.html) an instance. Haystack supports Elasticsearch 8. + +If you have Docker set up, we recommend pulling the Docker image and running it. + +```shell +docker pull docker.elastic.co/elasticsearch/elasticsearch:8.11.1 +docker run -p 9200:9200 -e "discovery.type=single-node" -e "ES_JAVA_OPTS=-Xms1024m -Xmx1024m" -e "xpack.security.enabled=false" elasticsearch:8.11.1 +``` + +As an alternative, you can go to the [Elasticsearch integration GitHub](https://github.com/deepset-ai/haystack-core-integrations/tree/main/integrations/elasticsearch) and start a Docker container running Elasticsearch using the provided `docker-compose.yml`: + +```shell +docker compose up +``` + +Once you have a running Elasticsearch instance, install the `elasticsearch-haystack` integration: + +```shell +pip install elasticsearch-haystack +``` + +### Optional Parameters + +This Retriever accepts various optional parameters. You can verify the most up-to-date list of parameters in our [API Reference](/reference/integrations-elasticsearch). + +You can pass additional parameters to the underlying BM25 and embedding retriever components using the `top_k_bm25`, `fuzziness`, `filters_bm25`, `scale_score`, `filter_policy_bm25`, `top_k_embedding`, `filters_embedding`, `num_candidates`, and `filter_policy_embedding` parameters. + +The `DocumentJoiner` parameters (`join_mode`, `weights`, `top_k`, and `sort_by_score`) are all exposed directly on the `ElasticsearchHybridRetriever` class. + +## Usage + +### On its own + +This Retriever needs the `ElasticsearchDocumentStore` populated with documents (including embeddings) to run. + +```python +from haystack import Document +from haystack_integrations.components.embedders.sentence_transformers import ( + SentenceTransformersTextEmbedder, + SentenceTransformersDocumentEmbedder, +) +from haystack_integrations.components.retrievers.elasticsearch import ( + ElasticsearchHybridRetriever, +) +from haystack_integrations.document_stores.elasticsearch import ( + ElasticsearchDocumentStore, +) + +document_store = ElasticsearchDocumentStore(hosts="http://localhost:9200/") + +model = "sentence-transformers/all-MiniLM-L6-v2" + +documents = [ + Document(content="There are over 7,000 languages spoken around the world today."), + Document( + content="Elephants have been observed to behave in a way that indicates a high level of self-awareness, such as recognizing themselves in mirrors.", + ), + Document( + content="In certain parts of the world, like the Maldives, Puerto Rico, and San Diego, you can witness the phenomenon of bioluminescent waves.", + ), +] + +doc_embedder = SentenceTransformersDocumentEmbedder(model=model) +docs_with_embeddings = doc_embedder.run(documents) +document_store.write_documents(docs_with_embeddings["documents"]) + +embedder = SentenceTransformersTextEmbedder(model=model) + +retriever = ElasticsearchHybridRetriever( + document_store=document_store, + embedder=embedder, +) + +results = retriever.run(query="How many languages are spoken around the world today?") +print(results["documents"]) +``` + +### In a pipeline + +Here's a full example that uses an indexing pipeline to store documents with embeddings, and a query pipeline that uses `ElasticsearchHybridRetriever` for hybrid retrieval. + +Set your `OPENAI_API_KEY` as an environment variable and then run the following code: + +```python +from haystack import Document, Pipeline +from haystack.components.builders import ChatPromptBuilder +from haystack.components.generators.chat import OpenAIChatGenerator +from haystack_integrations.components.embedders.sentence_transformers import ( + SentenceTransformersDocumentEmbedder, + SentenceTransformersTextEmbedder, +) +from haystack.components.writers import DocumentWriter +from haystack.dataclasses import ChatMessage +from haystack.document_stores.types import DuplicatePolicy +from haystack_integrations.components.retrievers.elasticsearch import ( + ElasticsearchHybridRetriever, +) +from haystack_integrations.document_stores.elasticsearch import ( + ElasticsearchDocumentStore, +) + +document_store = ElasticsearchDocumentStore(hosts="http://localhost:9200/") + +model = "sentence-transformers/all-MiniLM-L6-v2" + +documents = [ + Document(content="There are over 7,000 languages spoken around the world today."), + Document( + content="Elephants have been observed to behave in a way that indicates a high level of self-awareness, such as recognizing themselves in mirrors.", + ), + Document( + content="In certain parts of the world, like the Maldives, Puerto Rico, and San Diego, you can witness the phenomenon of bioluminescent waves.", + ), +] + +# Indexing Pipeline +indexing_pipeline = Pipeline() +indexing_pipeline.add_component( + "doc_embedder", + SentenceTransformersDocumentEmbedder(model=model), +) +indexing_pipeline.add_component( + "doc_writer", + DocumentWriter(document_store=document_store, policy=DuplicatePolicy.SKIP), +) +indexing_pipeline.connect("doc_embedder", "doc_writer") +indexing_pipeline.run({"doc_embedder": {"documents": documents}}) + +# Query Pipeline +prompt_template = [ + ChatMessage.from_user( + """ + Given these documents, answer the question.\nDocuments: + {% for doc in documents %} + {{ doc.content }} + {% endfor %} + + \nQuestion: {{question}} + \nAnswer: + """, + ), +] + +embedder = SentenceTransformersTextEmbedder(model=model) +retriever = ElasticsearchHybridRetriever( + document_store=document_store, + embedder=embedder, + top_k_bm25=3, + top_k_embedding=3, + join_mode="reciprocal_rank_fusion", +) + +query_pipeline = Pipeline() +query_pipeline.add_component("retriever", retriever) +query_pipeline.add_component( + "prompt_builder", + ChatPromptBuilder(template=prompt_template, required_variables="*"), +) +query_pipeline.add_component("llm", OpenAIChatGenerator()) +query_pipeline.connect("retriever.documents", "prompt_builder.documents") +query_pipeline.connect("prompt_builder.prompt", "llm.messages") + +question = "How many languages are spoken around the world today?" +result = query_pipeline.run( + { + "retriever": {"query": question}, + "prompt_builder": {"question": question}, + }, +) + +print(result["llm"]["replies"][0].text) +``` diff --git a/docs-website/docs/pipeline-components/retrievers/faissembeddingretriever.mdx b/docs-website/docs/pipeline-components/retrievers/faissembeddingretriever.mdx index ddce627ee5..51328cd7cf 100644 --- a/docs-website/docs/pipeline-components/retrievers/faissembeddingretriever.mdx +++ b/docs-website/docs/pipeline-components/retrievers/faissembeddingretriever.mdx @@ -13,7 +13,7 @@ An embedding-based Retriever compatible with the FAISSDocumentStore. | | | | --- | --- | -| **Most common position in a pipeline** | 1. After a Text Embedder and before a [`PromptBuilder`](../builders/promptbuilder.mdx) in a RAG pipeline 2. The last component in a semantic search pipeline 3. After a Text Embedder and before an [`ExtractiveReader`](../readers/extractivereader.mdx) in an extractive QA pipeline | +| **Most common position in a pipeline** | 1. After a Text Embedder and before a [`PromptBuilder`](../builders/promptbuilder.mdx) in a RAG pipeline 2. The last component in a semantic search pipeline 3. After a Text Embedder and before a [`TransformersExtractiveReader`](../readers/transformersextractivereader.mdx) in an extractive QA pipeline | | **Mandatory init variables** | `document_store`: An instance of a [`FAISSDocumentStore`](../../document-stores/faissdocumentstore.mdx) | | **Mandatory run variables** | `query_embedding`: A vector representing the query (a list of floats) | | **Output variables** | `documents`: A list of documents | @@ -54,9 +54,15 @@ print(result["documents"]) ### In a pipeline +The examples on this page use Sentence Transformers embedders that have moved to the `sentence-transformers-haystack` package. Install it to run the examples: + +```shell +pip install sentence-transformers-haystack +``` + ```python from haystack import Document, Pipeline -from haystack.components.embedders import ( +from haystack_integrations.components.embedders.sentence_transformers import ( SentenceTransformersDocumentEmbedder, SentenceTransformersTextEmbedder, ) diff --git a/docs-website/docs/pipeline-components/retrievers/falkordbcypherretriever.mdx b/docs-website/docs/pipeline-components/retrievers/falkordbcypherretriever.mdx index 336821f040..fa70c1cca2 100644 --- a/docs-website/docs/pipeline-components/retrievers/falkordbcypherretriever.mdx +++ b/docs-website/docs/pipeline-components/retrievers/falkordbcypherretriever.mdx @@ -45,6 +45,12 @@ Ensure FalkorDB is running, for example via Docker: docker run -d -p 6379:6379 falkordb/falkordb:latest ``` +The examples on this page use Transformers components that have moved to the `transformers-haystack` package. Install it to run the examples: + +```shell +pip install transformers-haystack +``` + ## Usage ### On its own @@ -85,7 +91,9 @@ print(result["documents"][0].content) ```python from haystack import Document, Pipeline from haystack.components.builders import ChatPromptBuilder -from haystack.components.generators.chat import HuggingFaceLocalChatGenerator +from haystack_integrations.components.generators.transformers import ( + TransformersChatGenerator, +) from haystack.dataclasses import ChatMessage from haystack_integrations.document_stores.falkordb import FalkorDBDocumentStore from haystack_integrations.components.retrievers.falkordb import FalkorDBCypherRetriever @@ -130,7 +138,7 @@ pipeline.add_component( pipeline.add_component("prompt_builder", ChatPromptBuilder(template=prompt_template)) pipeline.add_component( "llm", - HuggingFaceLocalChatGenerator(model="HuggingFaceTB/SmolLM2-135M-Instruct"), + TransformersChatGenerator(model="HuggingFaceTB/SmolLM2-135M-Instruct"), ) pipeline.connect("retriever.documents", "prompt_builder.documents") pipeline.connect("prompt_builder.prompt", "llm.messages") diff --git a/docs-website/docs/pipeline-components/retrievers/falkordbembeddingretriever.mdx b/docs-website/docs/pipeline-components/retrievers/falkordbembeddingretriever.mdx index f44e59092d..90602992ca 100644 --- a/docs-website/docs/pipeline-components/retrievers/falkordbembeddingretriever.mdx +++ b/docs-website/docs/pipeline-components/retrievers/falkordbembeddingretriever.mdx @@ -43,6 +43,12 @@ Ensure FalkorDB is running, for example via Docker: docker run -d -p 6379:6379 falkordb/falkordb:latest ``` +The examples on this page use Sentence Transformers embedders that have moved to the `sentence-transformers-haystack` package. Install it to run the examples: + +```shell +pip install sentence-transformers-haystack +``` + ## Usage ### On its own @@ -83,7 +89,7 @@ print(result["documents"][0].content) ```python from haystack import Document, Pipeline from haystack.document_stores.types import DuplicatePolicy -from haystack.components.embedders import ( +from haystack_integrations.components.embedders.sentence_transformers import ( SentenceTransformersDocumentEmbedder, SentenceTransformersTextEmbedder, ) @@ -112,7 +118,6 @@ documents = [ document_embedder = SentenceTransformersDocumentEmbedder( model="sentence-transformers/all-MiniLM-L6-v2", ) -document_embedder.warm_up() documents_with_embeddings = document_embedder.run(documents) document_store.write_documents( diff --git a/docs-website/docs/pipeline-components/retrievers/inmemoryembeddingretriever.mdx b/docs-website/docs/pipeline-components/retrievers/inmemoryembeddingretriever.mdx index 81090e876f..e7ddab2f24 100644 --- a/docs-website/docs/pipeline-components/retrievers/inmemoryembeddingretriever.mdx +++ b/docs-website/docs/pipeline-components/retrievers/inmemoryembeddingretriever.mdx @@ -13,7 +13,7 @@ Use this Retriever with the InMemoryDocumentStore if you're looking for embeddin | | | | --- | --- | -| **Most common position in a pipeline** | In query pipelines:
In a RAG pipeline, before a [`PromptBuilder`](../builders/promptbuilder.mdx)
In a semantic search pipeline, as the last component
In an extractive QA pipeline, after a Tex tEmbedder and before an [`ExtractiveReader`](../readers/extractivereader.mdx) | +| **Most common position in a pipeline** | In query pipelines:
In a RAG pipeline, before a [`PromptBuilder`](../builders/promptbuilder.mdx)
In a semantic search pipeline, as the last component
In an extractive QA pipeline, after a Tex tEmbedder and before a [`TransformersExtractiveReader`](../readers/transformersextractivereader.mdx) | | **Mandatory init variables** | `document_store`: An instance of [InMemoryDocumentStore](../../document-stores/inmemorydocumentstore.mdx) | | **Mandatory run variables** | `query_embedding`: A list of floating point numbers | | **Output variables** | `documents`: A list of documents | @@ -39,10 +39,16 @@ The `embedding_similarity_function` to use for embedding retrieval must be defi Use this Retriever in a query pipeline like this: +The examples on this page use Sentence Transformers embedders that have moved to the `sentence-transformers-haystack` package. Install it to run the examples: + +```shell +pip install sentence-transformers-haystack +``` + ```python from haystack import Document, Pipeline from haystack.document_stores.in_memory import InMemoryDocumentStore -from haystack.components.embedders import ( +from haystack_integrations.components.embedders.sentence_transformers import ( SentenceTransformersTextEmbedder, SentenceTransformersDocumentEmbedder, ) diff --git a/docs-website/docs/pipeline-components/retrievers/mongodbatlasembeddingretriever.mdx b/docs-website/docs/pipeline-components/retrievers/mongodbatlasembeddingretriever.mdx index df1d707d89..df1db8c4b4 100644 --- a/docs-website/docs/pipeline-components/retrievers/mongodbatlasembeddingretriever.mdx +++ b/docs-website/docs/pipeline-components/retrievers/mongodbatlasembeddingretriever.mdx @@ -13,7 +13,7 @@ This is an embedding Retriever compatible with the MongoDB Atlas Document Store. | | | | --- | --- | -| **Most common position in a pipeline** | 1. After a Text Embedder and before a [`PromptBuilder`](../builders/promptbuilder.mdx) in a RAG pipeline 2. The last component in the semantic search pipeline 3. After a Text Embedder and before an [`ExtractiveReader`](../readers/extractivereader.mdx) in an extractive QA pipeline | +| **Most common position in a pipeline** | 1. After a Text Embedder and before a [`PromptBuilder`](../builders/promptbuilder.mdx) in a RAG pipeline 2. The last component in the semantic search pipeline 3. After a Text Embedder and before a [`TransformersExtractiveReader`](../readers/transformersextractivereader.mdx) in an extractive QA pipeline | | **Mandatory init variables** | `document_store`: An instance of a [MongoDBAtlasDocumentStore](../../document-stores/mongodbatlasdocumentstore.mdx) | | **Mandatory run variables** | `query_embedding`: A list of floats | | **Output variables** | `documents`: A list of documents | @@ -63,6 +63,12 @@ retriever.run(query_embedding=[0.1] * 384) ### In a Pipeline +The examples on this page use Sentence Transformers embedders that have moved to the `sentence-transformers-haystack` package. Install it to run the examples: + +```shell +pip install sentence-transformers-haystack +``` + ```python from haystack import Pipeline, Document from haystack.document_stores.types import DuplicatePolicy @@ -70,7 +76,7 @@ from haystack.components.writers import DocumentWriter from haystack.components.generators.chat import OpenAIChatGenerator from haystack.components.builders import ChatPromptBuilder from haystack.dataclasses import ChatMessage -from haystack.components.embedders import ( +from haystack_integrations.components.embedders.sentence_transformers import ( SentenceTransformersDocumentEmbedder, SentenceTransformersTextEmbedder, ) diff --git a/docs-website/docs/pipeline-components/retrievers/mongodbatlasfulltextretriever.mdx b/docs-website/docs/pipeline-components/retrievers/mongodbatlasfulltextretriever.mdx index 8c9f7468d8..9616cf01c1 100644 --- a/docs-website/docs/pipeline-components/retrievers/mongodbatlasfulltextretriever.mdx +++ b/docs-website/docs/pipeline-components/retrievers/mongodbatlasfulltextretriever.mdx @@ -13,7 +13,7 @@ This is a full-text search Retriever compatible with the MongoDB Atlas Document | | | | --- | --- | -| **Most common position in a pipeline** | 1. Before a [ChatPromptBuilder](../builders/chatpromptbuilder.mdx) in a RAG pipeline 2. The last component in the semantic search pipeline 3. Before an [ExtractiveReader](../readers/extractivereader.mdx) in an extractive QA pipeline | +| **Most common position in a pipeline** | 1. Before a [ChatPromptBuilder](../builders/chatpromptbuilder.mdx) in a RAG pipeline 2. The last component in the semantic search pipeline 3. Before a [TransformersExtractiveReader](../readers/transformersextractivereader.mdx) in an extractive QA pipeline | | **Mandatory init variables** | `document_store`: An instance of a [MongoDBAtlasDocumentStore](../../document-stores/mongodbatlasdocumentstore.mdx) | | **Mandatory run variables** | `query`: A query string to search for. If the query contains multiple terms, Atlas Search evaluates each term separately for matches. | | **Output variables** | `documents`: A list of documents | @@ -69,11 +69,17 @@ print(results["documents"]) Here's a Hybrid Retrieval pipeline example that makes use of both available MongoDB Atlas Retrievers: +The examples on this page use Sentence Transformers embedders that have moved to the `sentence-transformers-haystack` package. Install it to run the examples: + +```shell +pip install sentence-transformers-haystack +``` + ```python from haystack import Pipeline, Document from haystack.document_stores.types import DuplicatePolicy from haystack.components.writers import DocumentWriter -from haystack.components.embedders import ( +from haystack_integrations.components.embedders.sentence_transformers import ( SentenceTransformersDocumentEmbedder, SentenceTransformersTextEmbedder, ) diff --git a/docs-website/docs/pipeline-components/retrievers/multiqueryembeddingretriever.mdx b/docs-website/docs/pipeline-components/retrievers/multiqueryembeddingretriever.mdx index ce3aeb541d..d52f9ce73b 100644 --- a/docs-website/docs/pipeline-components/retrievers/multiqueryembeddingretriever.mdx +++ b/docs-website/docs/pipeline-components/retrievers/multiqueryembeddingretriever.mdx @@ -64,10 +64,16 @@ Before running the pipeline, documents must be embedded using a Document Embedde +The examples on this page use Sentence Transformers embedders that have moved to the `sentence-transformers-haystack` package. Install it to run the examples: + +```shell +pip install sentence-transformers-haystack +``` + ```python from haystack import Document, Pipeline from haystack.document_stores.in_memory import InMemoryDocumentStore -from haystack.components.embedders import ( +from haystack_integrations.components.embedders.sentence_transformers import ( SentenceTransformersTextEmbedder, SentenceTransformersDocumentEmbedder, ) @@ -138,7 +144,7 @@ components: init_parameters: {} top_k: 2 query_embedder: - type: haystack.components.embedders.sentence_transformers_text_embedder.SentenceTransformersTextEmbedder + type: haystack_integrations.components.embedders.sentence_transformers.sentence_transformers_text_embedder.SentenceTransformersTextEmbedder init_parameters: model: sentence-transformers/all-MiniLM-L6-v2 diff --git a/docs-website/docs/pipeline-components/retrievers/multiretriever.mdx b/docs-website/docs/pipeline-components/retrievers/multiretriever.mdx index c1244fc041..d1f9f0f6fd 100644 --- a/docs-website/docs/pipeline-components/retrievers/multiretriever.mdx +++ b/docs-website/docs/pipeline-components/retrievers/multiretriever.mdx @@ -54,11 +54,17 @@ The `join_mode` parameter controls how results from multiple retrievers are merg This example sets up a `MultiRetriever` combining a BM25 retriever and an embedding-based retriever (wrapped with `TextEmbeddingRetriever`). Both are queried in parallel and the results are merged using reciprocal rank fusion. +The examples on this page use Sentence Transformers embedders that have moved to the `sentence-transformers-haystack` package. Install it to run the examples: + +```shell +pip install sentence-transformers-haystack +``` + ```python from haystack import Document from haystack.document_stores.in_memory import InMemoryDocumentStore from haystack.document_stores.types import DuplicatePolicy -from haystack.components.embedders import ( +from haystack_integrations.components.embedders.sentence_transformers import ( SentenceTransformersDocumentEmbedder, SentenceTransformersTextEmbedder, ) @@ -126,7 +132,7 @@ from haystack import Document, Pipeline from haystack.document_stores.in_memory import InMemoryDocumentStore from haystack.document_stores.types import DuplicatePolicy from haystack.components.builders import ChatPromptBuilder -from haystack.components.embedders import ( +from haystack_integrations.components.embedders.sentence_transformers import ( SentenceTransformersDocumentEmbedder, SentenceTransformersTextEmbedder, ) diff --git a/docs-website/docs/pipeline-components/retrievers/opensearchembeddingretriever.mdx b/docs-website/docs/pipeline-components/retrievers/opensearchembeddingretriever.mdx index 7735f126ca..194287593b 100644 --- a/docs-website/docs/pipeline-components/retrievers/opensearchembeddingretriever.mdx +++ b/docs-website/docs/pipeline-components/retrievers/opensearchembeddingretriever.mdx @@ -13,7 +13,7 @@ An embedding-based Retriever compatible with the OpenSearch Document Store. | | | | --- | --- | -| **Most common position in a pipeline** | 1. After a Text Embedder and before a [`PromptBuilder`](../builders/promptbuilder.mdx) in a RAG pipeline 2. The last component in the semantic search pipeline 3. After a Text Embedder and before an [`ExtractiveReader`](../readers/extractivereader.mdx) in an extractive QA pipeline | +| **Most common position in a pipeline** | 1. After a Text Embedder and before a [`PromptBuilder`](../builders/promptbuilder.mdx) in a RAG pipeline 2. The last component in the semantic search pipeline 3. After a Text Embedder and before a [`TransformersExtractiveReader`](../readers/transformersextractivereader.mdx) in an extractive QA pipeline | | **Mandatory init variables** | `document_store`: An instance of an [OpenSearchDocumentStore](../../document-stores/opensearch-document-store.mdx) | | **Mandatory run variables** | `query_embedding`: A list of floats | | **Output variables** | `documents`: A list of documents | @@ -62,6 +62,12 @@ pip install opensearch-haystack Use this Retriever in a query Pipeline like this: +The examples on this page use Sentence Transformers embedders that have moved to the `sentence-transformers-haystack` package. Install it to run the examples: + +```shell +pip install sentence-transformers-haystack +``` + ```python from haystack_integrations.components.retrievers.opensearch import ( OpenSearchEmbeddingRetriever, @@ -71,7 +77,7 @@ from haystack_integrations.document_stores.opensearch import OpenSearchDocumentS from haystack.document_stores.types import DuplicatePolicy from haystack import Document from haystack import Pipeline -from haystack.components.embedders import ( +from haystack_integrations.components.embedders.sentence_transformers import ( SentenceTransformersTextEmbedder, SentenceTransformersDocumentEmbedder, ) diff --git a/docs-website/docs/pipeline-components/retrievers/opensearchhybridretriever.mdx b/docs-website/docs/pipeline-components/retrievers/opensearchhybridretriever.mdx index ac6b2fab26..ea74b615cb 100644 --- a/docs-website/docs/pipeline-components/retrievers/opensearchhybridretriever.mdx +++ b/docs-website/docs/pipeline-components/retrievers/opensearchhybridretriever.mdx @@ -15,7 +15,7 @@ A Hybrid Retriever uses both traditional keyword-based search (such as BM25) and | | | | --- | --- | -| Most common position in a pipeline | After an [OpenSearchDocumentStore](../../document-stores/opensearch-document-store.mdx) | +| Most common position in a pipeline | 1. After a TextEmbedder and before a PromptBuilder in a RAG pipeline 2. The last component in a hybrid search pipeline 3. After a TextEmbedder and before a TransformersExtractiveReader in an extractive QA pipeline | | Mandatory init variables | `document_store`: An instance of `OpenSearchDocumentStore` to use for retrieval

`embedder`: Any [Embedder](../embedders.mdx) implementing the `TextEmbedder` protocol | | Mandatory run variables | `query`: A query string | | Output variables | `documents`: A list of documents matching the query | @@ -83,9 +83,15 @@ docker run -d \\ opensearchproject/opensearch:2.12.0 ``` +The examples on this page use Sentence Transformers embedders that have moved to the `sentence-transformers-haystack` package. Install it to run the examples: + +```shell +pip install sentence-transformers-haystack +``` + ```python from haystack import Document -from haystack.components.embedders import SentenceTransformersTextEmbedder, SentenceTransformersDocumentEmbedder +from haystack_integrations.components.embedders.sentence_transformers import SentenceTransformersTextEmbedder, SentenceTransformersDocumentEmbedder from haystack_integrations.components.retrievers.opensearch import OpenSearchHybridRetriever from haystack_integrations.document_stores.opensearch import OpenSearchDocumentStore diff --git a/docs-website/docs/pipeline-components/retrievers/opensearchmetadataretriever.mdx b/docs-website/docs/pipeline-components/retrievers/opensearchmetadataretriever.mdx new file mode 100644 index 0000000000..609e044b58 --- /dev/null +++ b/docs-website/docs/pipeline-components/retrievers/opensearchmetadataretriever.mdx @@ -0,0 +1,184 @@ +--- +title: OpenSearchMetadataRetriever +id: opensearchmetadataretriever +slug: /opensearchmetadataretriever +description: Searches and ranks the metadata fields of documents stored in an OpenSearch Document Store and returns the matching metadata values. +--- + +# OpenSearchMetadataRetriever + +Searches and ranks the metadata fields of documents stored in an OpenSearch Document Store and returns the matching metadata values. + +
+ +| | | +| --------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------- | +| **Most common position in a pipeline** | The last component in a metadata lookup pipeline, or wherever you need other structured data from an OpenSearchDocumentStore index | +| **Mandatory init variables** | `document_store`: An instance of `OpenSearchDocumentStore`; `metadata_fields`: List of metadata field names to search and return | +| **Mandatory run variables** | `query`: A search query string (may contain comma-separated parts) | +| **Output variables** | `metadata`: A list of dictionaries containing only the requested metadata fields | +| **API reference** | [OpenSearch](/reference/integrations-opensearch) | +| **GitHub link** | https://github.com/deepset-ai/haystack-core-integrations/tree/main/integrations/opensearch | +| **Package name** | `opensearch-haystack` | + +
+ +## Overview + +`OpenSearchMetadataRetriever` searches the metadata of documents stored in an `OpenSearchDocumentStore` and returns the matching metadata values, not the documents themselves. It is useful when the metadata is the answer: for example, listing the categories or tags that match a partial query, building a metadata autocomplete, or surfacing the structured side of an index without pulling back document content. + +Unlike the other OpenSearch retrievers (`OpenSearchBM25Retriever`, `OpenSearchEmbeddingRetriever`, `OpenSearchHybridRetriever`), this component does not return `Document` objects. The output is a list under `metadata`, where each entry is a dictionary containing only the fields you listed in `metadata_fields`. Document content and any other metadata are excluded from the result. + +The retriever supports two search modes: + +- `strict` uses prefix and wildcard matching on the configured metadata fields. +- `fuzzy` (the default) uses fuzzy matching with `dis_max` queries, allowing typos and partial matches. + +In both modes, candidate documents are scored server-side with Jaccard similarity on character n-grams (the `jaccard_n` parameter controls the n-gram size), and exact matches receive an additional boost controlled by `exact_match_weight`. Up to 1000 hits are fetched from OpenSearch, and the top `top_k` results are returned. + +Both a synchronous `run` method and an asynchronous `run_async` method are available with the same parameters. + +### Field types + +The matching engine only operates on metadata fields that OpenSearch indexes as text or keyword values. Numeric, boolean, and array-of-non-strings fields are not valid search targets, because prefix, wildcard, and full-text matching do not apply to them. Mixed-type fields, such as a list that combines strings and numbers, are also not supported. + + +## Installation + +If you have Docker set up, the easiest way to run OpenSearch is to pull and run the Docker image. + +```bash +docker pull opensearchproject/opensearch:2 +docker run -p 9200:9200 -p 9600:9600 -e "discovery.type=single-node" -e "OPENSEARCH_INITIAL_ADMIN_PASSWORD=" opensearchproject/opensearch:2 +``` + +As an alternative, you can go to the [OpenSearch integration GitHub](https://github.com/deepset-ai/haystack-core-integrations/tree/main/integrations/opensearch) and start a Docker container using the provided `docker-compose.yml`: + +```bash +docker compose up +``` + +Once you have a running OpenSearch instance, install the `opensearch-haystack` integration: + +```bash +pip install opensearch-haystack +``` + +## Usage + +### On its own + +This Retriever needs an `OpenSearchDocumentStore` with indexed documents. The example below writes three documents with simple categorical metadata and queries the `category` and `status` fields: + +```python +from haystack import Document +from haystack_integrations.components.retrievers.opensearch import ( + OpenSearchMetadataRetriever, +) +from haystack_integrations.document_stores.opensearch import OpenSearchDocumentStore +from haystack.document_stores.types import DuplicatePolicy + +document_store = OpenSearchDocumentStore( + hosts="http://localhost:9200", + index="my_index", +) + +documents = [ + Document( + content="Python programming guide", + meta={ + "category": "Python", + "status": "active", + "priority": 1, + "author": "John Doe", + }, + ), + Document( + content="Java tutorial", + meta={ + "category": "Java", + "status": "active", + "priority": 2, + "author": "Jane Smith", + }, + ), + Document( + content="Python advanced topics", + meta={ + "category": "Python", + "status": "inactive", + "priority": 3, + "author": "John Doe", + }, + ), +] + +document_store.write_documents(documents=documents, policy=DuplicatePolicy.SKIP) + +retriever = OpenSearchMetadataRetriever( + document_store=document_store, + metadata_fields=["category", "status"], + top_k=10, +) + +result = retriever.run(query="Python") + +print(result) +# { +# "metadata": [ +# {"category": "Python", "status": "active"}, +# {"category": "Python", "status": "inactive"}, +# ] +# } +``` + +Only the fields listed in `metadata_fields` appear in each result dictionary. The `author` metadata and the document content are excluded. + +### Multi-part queries + +The `query` string can contain several comma-separated parts. Each part is searched across every field listed in `metadata_fields`, and a document that matches multiple parts is ranked higher (controlled by `exact_match_weight`). + +```python +result = retriever.run(query="Python, active") +# Returns the metadata of documents whose fields match both "Python" and "active". +``` + +### Strict mode + +By default the retriever runs in `fuzzy` mode, which tolerates typos and partial matches. For lookups where you only want prefix or wildcard matches and no edit-distance tolerance, switch to `strict`: + +```python +retriever = OpenSearchMetadataRetriever( + document_store=document_store, + metadata_fields=["category"], + mode="strict", +) + +result = retriever.run(query="Pyth") +# Matches "Python" through prefix matching, but not transposed-letter variants. +``` + +The fuzzy-mode parameters (`fuzziness`, `prefix_length`, `max_expansions`, `tie_breaker`) only take effect when `mode="fuzzy"`. + +### Combining with filters + +You can narrow the candidate set before scoring by passing standard Haystack `filters` at run time. The filters are applied in a `bool` `filter` context, so they exclude non-matching documents without affecting scores: + +```python +result = retriever.run( + query="Python", + filters={"field": "status", "operator": "==", "value": "active"}, +) +``` + +### Asynchronous execution + +For pipelines that mix synchronous and asynchronous components, the retriever exposes `run_async` with the same signature: + +```python +result = await retriever.run_async(query="Python, active") +``` + +### Error handling + +By default, a failed OpenSearch request raises an exception. To treat a failure as an empty result instead — for example, when the retriever sits behind a forgiving API — initialize the component with `raise_on_failure=False`. The error is then logged as a warning and `metadata` is returned as an empty list. diff --git a/docs-website/docs/pipeline-components/retrievers/oracleembeddingretriever.mdx b/docs-website/docs/pipeline-components/retrievers/oracleembeddingretriever.mdx index 6f63f6f2db..108c0c3058 100644 --- a/docs-website/docs/pipeline-components/retrievers/oracleembeddingretriever.mdx +++ b/docs-website/docs/pipeline-components/retrievers/oracleembeddingretriever.mdx @@ -13,7 +13,7 @@ An embedding-based Retriever compatible with the Oracle Document Store. | | | | --- | --- | -| **Most common position in a pipeline** | 1. After a Text Embedder and before a [`PromptBuilder`](../builders/promptbuilder.mdx) in a RAG pipeline 2. The last component in a semantic search pipeline 3. After a Text Embedder and before an [`ExtractiveReader`](../readers/extractivereader.mdx) in an extractive QA pipeline | +| **Most common position in a pipeline** | 1. After a Text Embedder and before a [`PromptBuilder`](../builders/promptbuilder.mdx) in a RAG pipeline 2. The last component in a semantic search pipeline 3. After a Text Embedder and before a [`TransformersExtractiveReader`](../readers/transformersextractivereader.mdx) in an extractive QA pipeline | | **Mandatory init variables** | `document_store`: An instance of an [OracleDocumentStore](../../document-stores/oracledocumentstore.mdx) | | **Mandatory run variables** | `query_embedding`: A vector representing the query (a list of floats) | | **Output variables** | `documents`: A list of documents | @@ -48,6 +48,12 @@ Install the Oracle integration for Haystack: pip install oracle-haystack ``` +The examples on this page use Sentence Transformers embedders that have moved to the `sentence-transformers-haystack` package. Install it to run the examples: + +```shell +pip install sentence-transformers-haystack +``` + ## Usage ### On its own @@ -82,7 +88,7 @@ retriever.run(query_embedding=[0.1] * 768) ```python from haystack import Document, Pipeline from haystack.document_stores.types import DuplicatePolicy -from haystack.components.embedders import ( +from haystack_integrations.components.embedders.sentence_transformers import ( SentenceTransformersDocumentEmbedder, SentenceTransformersTextEmbedder, ) @@ -116,7 +122,6 @@ documents = [ document_embedder = SentenceTransformersDocumentEmbedder( model="sentence-transformers/all-MiniLM-L6-v2", ) -document_embedder.warm_up() documents_with_embeddings = document_embedder.run(documents) document_store.write_documents( diff --git a/docs-website/docs/pipeline-components/retrievers/pgvectorembeddingretriever.mdx b/docs-website/docs/pipeline-components/retrievers/pgvectorembeddingretriever.mdx index 83f1b61a0c..af6cda6f1e 100644 --- a/docs-website/docs/pipeline-components/retrievers/pgvectorembeddingretriever.mdx +++ b/docs-website/docs/pipeline-components/retrievers/pgvectorembeddingretriever.mdx @@ -13,7 +13,7 @@ An embedding-based Retriever compatible with the Pgvector Document Store. | | | | --- | --- | -| **Most common position in a pipeline** | 1. After a Text Embedder and before a [`PromptBuilder`](../builders/promptbuilder.mdx) in a RAG pipeline 2. The last component in the semantic search pipeline 3. After a Text Embedder and before an [`ExtractiveReader`](../readers/extractivereader.mdx) in an extractive QA pipeline | +| **Most common position in a pipeline** | 1. After a Text Embedder and before a [`PromptBuilder`](../builders/promptbuilder.mdx) in a RAG pipeline 2. The last component in the semantic search pipeline 3. After a Text Embedder and before a [`TransformersExtractiveReader`](../readers/transformersextractivereader.mdx) in an extractive QA pipeline | | **Mandatory init variables** | `document_store`: An instance of a [PgvectorDocumentStore](../../document-stores/pgvectordocumentstore.mdx) | | **Mandatory run variables** | `query_embedding`: A vector representing the query (a list of floats) | | **Output variables** | `documents`: A list of documents | @@ -49,6 +49,12 @@ To use pgvector with Haystack, install the `pgvector-haystack` integration: pip install pgvector-haystack ``` +The examples on this page use Sentence Transformers embedders that have moved to the `sentence-transformers-haystack` package. Install it to run the examples: + +```shell +pip install sentence-transformers-haystack +``` + ## Usage ### On its own @@ -77,7 +83,7 @@ retriever.run(query_embedding=[0.1] * 768) import os from haystack.document_stores import DuplicatePolicy from haystack import Document, Pipeline -from haystack.components.embedders import ( +from haystack_integrations.components.embedders.sentence_transformers import ( SentenceTransformersTextEmbedder, SentenceTransformersDocumentEmbedder, ) diff --git a/docs-website/docs/pipeline-components/retrievers/pineconedenseretriever.mdx b/docs-website/docs/pipeline-components/retrievers/pineconedenseretriever.mdx index a1778c1e88..4fa7c824bd 100644 --- a/docs-website/docs/pipeline-components/retrievers/pineconedenseretriever.mdx +++ b/docs-website/docs/pipeline-components/retrievers/pineconedenseretriever.mdx @@ -13,7 +13,7 @@ An embedding-based Retriever compatible with the Pinecone Document Store. | | | | --- | --- | -| **Most common position in a pipeline** | 1. After a Text Embedder and before a [`PromptBuilder`](../builders/promptbuilder.mdx) in a RAG pipeline 2. The last component in the semantic search pipeline 3. After a Text Embedder and before an [`ExtractiveReader`](../readers/extractivereader.mdx) in an extractive QA pipeline | +| **Most common position in a pipeline** | 1. After a Text Embedder and before a [`PromptBuilder`](../builders/promptbuilder.mdx) in a RAG pipeline 2. The last component in the semantic search pipeline 3. After a Text Embedder and before a [`TransformersExtractiveReader`](../readers/transformersextractivereader.mdx) in an extractive QA pipeline | | **Mandatory init variables** | `document_store`: An instance of a [PineconeDocumentStore](../../document-stores/pinecone-document-store.mdx) | | **Mandatory run variables** | `query_embedding`: A vector representing the query (a list of floats) | | **Output variables** | `documents`: A list of documents | @@ -64,7 +64,7 @@ Install the dependencies you’ll need: ```shell pip install pinecone-haystack -pip install sentence-transformers +pip install sentence-transformers-haystack ``` Use this Retriever in a query Pipeline like this: @@ -73,7 +73,7 @@ Use this Retriever in a query Pipeline like this: from haystack.document_stores.types import DuplicatePolicy from haystack import Document from haystack import Pipeline -from haystack.components.embedders import ( +from haystack_integrations.components.embedders.sentence_transformers import ( SentenceTransformersTextEmbedder, SentenceTransformersDocumentEmbedder, ) diff --git a/docs-website/docs/pipeline-components/retrievers/qdrantembeddingretriever.mdx b/docs-website/docs/pipeline-components/retrievers/qdrantembeddingretriever.mdx index aad3925c43..9007e93ee7 100644 --- a/docs-website/docs/pipeline-components/retrievers/qdrantembeddingretriever.mdx +++ b/docs-website/docs/pipeline-components/retrievers/qdrantembeddingretriever.mdx @@ -13,7 +13,7 @@ An embedding-based Retriever compatible with the Qdrant Document Store. | | | | --- | --- | -| **Most common position in a pipeline** | 1\. After a Text Embedder and before a [`PromptBuilder`](../builders/promptbuilder.mdx) in a RAG Pipeline

2. The last component in the semantic search pipeline
3. After a Text Embedder and before an [`ExtractiveReader`](../readers/extractivereader.mdx) in an extractive QA pipeline | +| **Most common position in a pipeline** | 1\. After a Text Embedder and before a [`PromptBuilder`](../builders/promptbuilder.mdx) in a RAG Pipeline

2. The last component in the semantic search pipeline
3. After a Text Embedder and before a [`TransformersExtractiveReader`](../readers/transformersextractivereader.mdx) in an extractive QA pipeline | | **Mandatory init variables** | `document_store`: An instance of a [QdrantDocumentStore](../../document-stores/qdrant-document-store.mdx) | | **Mandatory run variables** | `query_embedding`: A vector representing the query (a list of floats) | | **Output variables** | `documents`: A list of documents | @@ -65,11 +65,17 @@ retriever.run(query_embedding=[0.1] * 768) #### In a Pipeline +The examples on this page use Sentence Transformers embedders that have moved to the `sentence-transformers-haystack` package. Install it to run the examples: + +```shell +pip install sentence-transformers-haystack +``` + ```python from haystack.document_stores.types import DuplicatePolicy from haystack import Document from haystack import Pipeline -from haystack.components.embedders import ( +from haystack_integrations.components.embedders.sentence_transformers import ( SentenceTransformersTextEmbedder, SentenceTransformersDocumentEmbedder, ) diff --git a/docs-website/docs/pipeline-components/retrievers/sentencewindowretrieval.mdx b/docs-website/docs/pipeline-components/retrievers/sentencewindowretriever.mdx similarity index 98% rename from docs-website/docs/pipeline-components/retrievers/sentencewindowretrieval.mdx rename to docs-website/docs/pipeline-components/retrievers/sentencewindowretriever.mdx index b673661f65..e9c5de9fc9 100644 --- a/docs-website/docs/pipeline-components/retrievers/sentencewindowretrieval.mdx +++ b/docs-website/docs/pipeline-components/retrievers/sentencewindowretriever.mdx @@ -1,7 +1,7 @@ --- title: "SentenceWindowRetriever" -id: sentencewindowretrieval -slug: "/sentencewindowretrieval" +id: sentencewindowretriever +slug: "/sentencewindowretriever" description: "Use this component to retrieve neighboring sentences around relevant sentences to get the full context." --- diff --git a/docs-website/docs/pipeline-components/retrievers/supabasepgvectorembeddingretriever.mdx b/docs-website/docs/pipeline-components/retrievers/supabasepgvectorembeddingretriever.mdx index 80c6cc870b..97079c517a 100644 --- a/docs-website/docs/pipeline-components/retrievers/supabasepgvectorembeddingretriever.mdx +++ b/docs-website/docs/pipeline-components/retrievers/supabasepgvectorembeddingretriever.mdx @@ -13,7 +13,7 @@ An embedding-based Retriever compatible with the SupabasePgvectorDocumentStore. | | | | --- | --- | -| **Most common position in a pipeline** | 1. After a Text Embedder and before a [`PromptBuilder`](../builders/promptbuilder.mdx) in a RAG pipeline 2. The last component in the semantic search pipeline 3. After a Text Embedder and before an [`ExtractiveReader`](../readers/extractivereader.mdx) in an extractive QA pipeline | +| **Most common position in a pipeline** | 1. After a Text Embedder and before a [`PromptBuilder`](../builders/promptbuilder.mdx) in a RAG pipeline 2. The last component in the semantic search pipeline 3. After a Text Embedder and before a [`TransformersExtractiveReader`](../readers/transformersextractivereader.mdx) in an extractive QA pipeline | | **Mandatory init variables** | `document_store`: An instance of a [SupabasePgvectorDocumentStore](../../document-stores/supabasedocumentstore.mdx) | | **Mandatory run variables** | `query_embedding`: A vector representing the query (a list of floats) | | **Output variables** | `documents`: A list of documents | @@ -39,6 +39,12 @@ Some relevant parameters that impact embedding retrieval must be defined when th pip install supabase-haystack ``` +The examples on this page use Sentence Transformers embedders that have moved to the `sentence-transformers-haystack` package. Install it to run the examples: + +```shell +pip install sentence-transformers-haystack +``` + ## Usage ### On its own @@ -65,7 +71,7 @@ retriever.run(query_embedding=[0.1] * 768) ```python from haystack import Document, Pipeline from haystack.document_stores.types import DuplicatePolicy -from haystack.components.embedders import ( +from haystack_integrations.components.embedders.sentence_transformers import ( SentenceTransformersTextEmbedder, SentenceTransformersDocumentEmbedder, ) diff --git a/docs-website/docs/pipeline-components/retrievers/textembeddingretriever.mdx b/docs-website/docs/pipeline-components/retrievers/textembeddingretriever.mdx index ac946ec6b7..a006818832 100644 --- a/docs-website/docs/pipeline-components/retrievers/textembeddingretriever.mdx +++ b/docs-website/docs/pipeline-components/retrievers/textembeddingretriever.mdx @@ -33,11 +33,17 @@ You can use it anywhere an embedding-based retriever fits: in RAG pipelines befo ### On its own +The examples on this page use Sentence Transformers embedders that have moved to the `sentence-transformers-haystack` package. Install it to run the examples: + +```shell +pip install sentence-transformers-haystack +``` + ```python from haystack import Document from haystack.document_stores.in_memory import InMemoryDocumentStore from haystack.document_stores.types import DuplicatePolicy -from haystack.components.embedders import ( +from haystack_integrations.components.embedders.sentence_transformers import ( SentenceTransformersDocumentEmbedder, SentenceTransformersTextEmbedder, ) @@ -86,7 +92,9 @@ for doc in result["documents"]: `TextEmbeddingRetriever` is most commonly used as one of the retrievers inside a [`MultiRetriever`](multiretriever.mdx): ```python -from haystack.components.embedders import SentenceTransformersTextEmbedder +from haystack_integrations.components.embedders.sentence_transformers import ( + SentenceTransformersTextEmbedder, +) from haystack.components.retrievers import ( InMemoryBM25Retriever, InMemoryEmbeddingRetriever, diff --git a/docs-website/docs/pipeline-components/retrievers/valkeyembeddingretriever.mdx b/docs-website/docs/pipeline-components/retrievers/valkeyembeddingretriever.mdx index 1fdbfe2e59..82f2742068 100644 --- a/docs-website/docs/pipeline-components/retrievers/valkeyembeddingretriever.mdx +++ b/docs-website/docs/pipeline-components/retrievers/valkeyembeddingretriever.mdx @@ -13,7 +13,7 @@ This is an embedding Retriever compatible with the Valkey Document Store. | | | | --- | --- | -| **Most common position in a pipeline** | 1. After a Text Embedder and before a [`ChatPromptBuilder`](../builders/chatpromptbuilder.mdx) or [`PromptBuilder`](../builders/promptbuilder.mdx) in a RAG pipeline 2. The last component in a semantic search pipeline 3. After a Text Embedder and before an [`ExtractiveReader`](../readers/extractivereader.mdx) in an extractive QA pipeline | +| **Most common position in a pipeline** | 1. After a Text Embedder and before a [`ChatPromptBuilder`](../builders/chatpromptbuilder.mdx) or [`PromptBuilder`](../builders/promptbuilder.mdx) in a RAG pipeline 2. The last component in a semantic search pipeline 3. After a Text Embedder and before a [`TransformersExtractiveReader`](../readers/transformersextractivereader.mdx) in an extractive QA pipeline | | **Mandatory init variables** | `document_store`: An instance of a [ValkeyDocumentStore](../../document-stores/valkeydocumentstore.mdx) | | **Mandatory run variables** | `query_embedding`: A list of floats | | **Output variables** | `documents`: A list of documents | @@ -66,9 +66,15 @@ retriever.run(query_embedding=[0.1] * 768) ### In a Pipeline +The examples on this page use Sentence Transformers embedders that have moved to the `sentence-transformers-haystack` package. Install it to run the examples: + +```shell +pip install sentence-transformers-haystack +``` + ```python from haystack import Document, Pipeline -from haystack.components.embedders import ( +from haystack_integrations.components.embedders.sentence_transformers import ( SentenceTransformersDocumentEmbedder, SentenceTransformersTextEmbedder, ) diff --git a/docs-website/docs/pipeline-components/retrievers/vespaembeddingretriever.mdx b/docs-website/docs/pipeline-components/retrievers/vespaembeddingretriever.mdx index ff4ad486d8..5cfbff411b 100644 --- a/docs-website/docs/pipeline-components/retrievers/vespaembeddingretriever.mdx +++ b/docs-website/docs/pipeline-components/retrievers/vespaembeddingretriever.mdx @@ -13,7 +13,7 @@ An embedding-based Retriever compatible with the Vespa Document Store. | | | | --- | --- | -| **Most common position in a pipeline** | 1. After a Text Embedder and before a [`PromptBuilder`](../builders/promptbuilder.mdx) in a RAG pipeline 2. The last component in the semantic search pipeline 3. After a Text Embedder and before an [`ExtractiveReader`](../readers/extractivereader.mdx) in an extractive QA pipeline | +| **Most common position in a pipeline** | 1. After a Text Embedder and before a [`PromptBuilder`](../builders/promptbuilder.mdx) in a RAG pipeline 2. The last component in the semantic search pipeline 3. After a Text Embedder and before a [`TransformersExtractiveReader`](../readers/transformersextractivereader.mdx) in an extractive QA pipeline | | **Mandatory init variables** | `document_store`: An instance of a [VespaDocumentStore](../../document-stores/vespadocumentstore.mdx) | | **Mandatory run variables** | `query_embedding`: A vector representing the query (a list of floats) | | **Output variables** | `documents`: A list of documents | @@ -48,6 +48,12 @@ pip install vespa-haystack To run Vespa locally, see the [Vespa quick start](https://docs.vespa.ai/en/vespa-quick-start.html). +The examples on this page use Sentence Transformers embedders that have moved to the `sentence-transformers-haystack` package. Install it to run the examples: + +```shell +pip install sentence-transformers-haystack +``` + ## Usage ### On its own @@ -71,7 +77,7 @@ retriever.run(query_embedding=[0.1] * 768) ```python from haystack import Document, Pipeline -from haystack.components.embedders import ( +from haystack_integrations.components.embedders.sentence_transformers import ( SentenceTransformersDocumentEmbedder, SentenceTransformersTextEmbedder, ) diff --git a/docs-website/docs/pipeline-components/retrievers/weaviateembeddingretriever.mdx b/docs-website/docs/pipeline-components/retrievers/weaviateembeddingretriever.mdx index 85842658d2..f754922709 100644 --- a/docs-website/docs/pipeline-components/retrievers/weaviateembeddingretriever.mdx +++ b/docs-website/docs/pipeline-components/retrievers/weaviateembeddingretriever.mdx @@ -13,7 +13,7 @@ This is an embedding Retriever compatible with the Weaviate Document Store. | | | | --- | --- | -| **Most common position in a pipeline** | 1. After a Text Embedder and before a [`PromptBuilder`](../builders/promptbuilder.mdx) in a RAG pipeline 2. The last component in the semantic search pipeline 3. After a Text Embedder and before an [`ExtractiveReader`](../readers/extractivereader.mdx) in an extractive QA pipeline | +| **Most common position in a pipeline** | 1. After a Text Embedder and before a [`PromptBuilder`](../builders/promptbuilder.mdx) in a RAG pipeline 2. The last component in the semantic search pipeline 3. After a Text Embedder and before a [`TransformersExtractiveReader`](../readers/transformersextractivereader.mdx) in an extractive QA pipeline | | **Mandatory init variables** | `document_store`: An instance of a [WeaviateDocumentStore](../../document-stores/weaviatedocumentstore.mdx) | | **Mandatory run variables** | `query_embedding`: A list of floats | | **Output variables** | `documents`: A list of documents | @@ -69,11 +69,17 @@ retriever.run(query_embedding=[0.1] * 768) ### In a Pipeline +The examples on this page use Sentence Transformers embedders that have moved to the `sentence-transformers-haystack` package. Install it to run the examples: + +```shell +pip install sentence-transformers-haystack +``` + ```python from haystack.document_stores.types import DuplicatePolicy from haystack import Document from haystack import Pipeline -from haystack.components.embedders import ( +from haystack_integrations.components.embedders.sentence_transformers import ( SentenceTransformersTextEmbedder, SentenceTransformersDocumentEmbedder, ) diff --git a/docs-website/docs/pipeline-components/retrievers/weaviatehybridretriever.mdx b/docs-website/docs/pipeline-components/retrievers/weaviatehybridretriever.mdx index 645da4ddba..094a50c97c 100644 --- a/docs-website/docs/pipeline-components/retrievers/weaviatehybridretriever.mdx +++ b/docs-website/docs/pipeline-components/retrievers/weaviatehybridretriever.mdx @@ -13,7 +13,7 @@ A Retriever that combines BM25 keyword search and vector similarity to fetch doc | | | | --- | --- | -| **Most common position in a pipeline** | 1. After a Text Embedder and before a [`PromptBuilder`](../builders/promptbuilder.mdx) in a RAG pipeline 2. The last component in a hybrid search pipeline 3. After a Text Embedder and before an [`ExtractiveReader`](../readers/extractivereader.mdx) in an extractive QA pipeline | +| **Most common position in a pipeline** | 1. After a Text Embedder and before a [`PromptBuilder`](../builders/promptbuilder.mdx) in a RAG pipeline 2. The last component in a hybrid search pipeline 3. After a Text Embedder and before a [`TransformersExtractiveReader`](../readers/transformersextractivereader.mdx) in an extractive QA pipeline | | **Mandatory init variables** | `document_store`: An instance of a [WeaviateDocumentStore](../../document-stores/weaviatedocumentstore.mdx) | | **Mandatory run variables** | `query`: A string

`query_embedding`: A list of floats | | **Output variables** | `documents`: A list of documents (matching the query) | @@ -75,11 +75,17 @@ retriever.run(query="How many languages are there?", query_embedding=[0.1] * 768 ### In a pipeline +The examples on this page use Sentence Transformers embedders that have moved to the `sentence-transformers-haystack` package. Install it to run the examples: + +```shell +pip install sentence-transformers-haystack +``` + ```python from haystack.document_stores.types import DuplicatePolicy from haystack import Document from haystack import Pipeline -from haystack.components.embedders import ( +from haystack_integrations.components.embedders.sentence_transformers import ( SentenceTransformersTextEmbedder, SentenceTransformersDocumentEmbedder, ) diff --git a/docs-website/docs/pipeline-components/routers/llmmessagesrouter.mdx b/docs-website/docs/pipeline-components/routers/llmmessagesrouter.mdx index 370f2f2cb0..c94e0f08ee 100644 --- a/docs-website/docs/pipeline-components/routers/llmmessagesrouter.mdx +++ b/docs-website/docs/pipeline-components/routers/llmmessagesrouter.mdx @@ -49,8 +49,16 @@ Below is an example of using `LLMMessagesRouter` to route Chat Messages to two We use Llama Guard 4 for content moderation. To use this model with the Hugging Face API, you need to [request access](https://huggingface.co/meta-llama/Llama-Guard-4-12B) and set the `HF_TOKEN` environment variable. +The examples on this page use Hugging Face API components that have moved to the `huggingface-api-haystack` package. Install it to run the examples: + +```shell +pip install huggingface-api-haystack +``` + ```python -from haystack.components.generators.chat import HuggingFaceAPIChatGenerator +from haystack_integrations.components.generators.huggingface_api import ( + HuggingFaceAPIChatGenerator, +) from haystack.components.routers.llm_messages_router import LLMMessagesRouter from haystack.dataclasses import ChatMessage @@ -129,9 +137,9 @@ from haystack import Document, Pipeline from haystack.dataclasses import ChatMessage from haystack.document_stores.in_memory import InMemoryDocumentStore from haystack.components.builders import ChatPromptBuilder -from haystack.components.generators.chat import ( +from haystack.components.generators.chat import OpenAIChatGenerator +from haystack_integrations.components.generators.huggingface_api import ( HuggingFaceAPIChatGenerator, - OpenAIChatGenerator, ) from haystack.components.retrievers.in_memory import InMemoryBM25Retriever from haystack.components.routers import LLMMessagesRouter diff --git a/docs-website/docs/pipeline-components/routers/metadatarouter.mdx b/docs-website/docs/pipeline-components/routers/metadatarouter.mdx index 41a82f6456..fdd8213430 100644 --- a/docs-website/docs/pipeline-components/routers/metadatarouter.mdx +++ b/docs-website/docs/pipeline-components/routers/metadatarouter.mdx @@ -80,10 +80,18 @@ result = router.run(documents=streams) Below is an example of an indexing pipeline that converts text files to documents and uses the `DocumentLanguageClassifier` to detect the language of the text and add it to the documents' metadata. It then uses the `MetadataRouter` to forward only English language documents to the `DocumentWriter`. Documents of other languages will not be added to the `DocumentStore`. +The examples on this page use language classification components that have moved to the `langdetect-haystack` package. Install it to run the examples: + +```shell +pip install langdetect-haystack +``` + ```python from haystack import Pipeline from haystack.components.file_converters import TextFileToDocument -from haystack.components.classifiers import DocumentLanguageClassifier +from haystack_integrations.components.classifiers.langdetect import ( + DocumentLanguageClassifier, +) from haystack.components.routers import MetadataRouter from haystack.components.writers import DocumentWriter from haystack.document_stores.in_memory import InMemoryDocumentStore diff --git a/docs-website/docs/pipeline-components/routers/transformerszeroshottextrouter.mdx b/docs-website/docs/pipeline-components/routers/transformerszeroshottextrouter.mdx index 2c79d89f0a..8c3cd3529e 100644 --- a/docs-website/docs/pipeline-components/routers/transformerszeroshottextrouter.mdx +++ b/docs-website/docs/pipeline-components/routers/transformerszeroshottextrouter.mdx @@ -55,12 +55,18 @@ We then create a retrieving pipeline with the `TransformersZeroShotTextRouter` t Finally, the pipeline is executed with a sample text: "What is the capital of Germany?” which categorizes this input text as “query” and routes it to Query Embedder and subsequently Query Retriever to return the relevant results. +The examples on this page use Sentence Transformers embedders that have moved to the `sentence-transformers-haystack` package. Install it to run the examples: + +```shell +pip install sentence-transformers-haystack +``` + ```python from haystack import Document from haystack.document_stores.in_memory import InMemoryDocumentStore from haystack.core.pipeline import Pipeline from haystack_integrations.components.routers.transformers import TransformersZeroShotTextRouter -from haystack.components.embedders import SentenceTransformersTextEmbedder, SentenceTransformersDocumentEmbedder +from haystack_integrations.components.embedders.sentence_transformers import SentenceTransformersTextEmbedder, SentenceTransformersDocumentEmbedder from haystack.components.retrievers import InMemoryEmbeddingRetriever document_store = InMemoryDocumentStore() diff --git a/docs-website/docs/pipeline-components/samplers/toppsampler.mdx b/docs-website/docs/pipeline-components/samplers/toppsampler.mdx index 3e1ab2e3b2..d982dede8c 100644 --- a/docs-website/docs/pipeline-components/samplers/toppsampler.mdx +++ b/docs-website/docs/pipeline-components/samplers/toppsampler.mdx @@ -54,6 +54,12 @@ print(docs) To best understand how can you use a `TopPSampler` and which components to pair it with, explore the following example. +The examples on this page use Sentence Transformers rankers and SerperDev web search component that have moved to the `sentence-transformers-haystack` and `serperdev-haystack` packages. Install them to run the examples: + +```shell +pip install sentence-transformers-haystack serperdev-haystack +``` + ```python # import necessary dependencies from haystack import Pipeline @@ -62,10 +68,12 @@ from haystack.components.fetchers import LinkContentFetcher from haystack.components.converters import HTMLToDocument from haystack.components.generators.chat import OpenAIChatGenerator from haystack.components.preprocessors import DocumentSplitter -from haystack.components.rankers import SentenceTransformersSimilarityRanker +from haystack_integrations.components.rankers.sentence_transformers import ( + SentenceTransformersSimilarityRanker, +) from haystack.components.routers.file_type_router import FileTypeRouter from haystack.components.samplers import TopPSampler -from haystack.components.websearch import SerperDevWebSearch +from haystack_integrations.components.websearch.serperdev import SerperDevWebSearch from haystack.utils import Secret from haystack.dataclasses import ChatMessage diff --git a/docs-website/docs/pipeline-components/writers/documentwriter.mdx b/docs-website/docs/pipeline-components/writers/documentwriter.mdx index ec93c17268..f4782cd5ee 100644 --- a/docs-website/docs/pipeline-components/writers/documentwriter.mdx +++ b/docs-website/docs/pipeline-components/writers/documentwriter.mdx @@ -63,11 +63,19 @@ document_writer.run(documents=documents) Below is an example of an indexing pipeline that first uses the `SentenceTransformersDocumentEmbedder` to create embeddings of documents and then use the `DocumentWriter` to write the documents to an `InMemoryDocumentStore`: +The examples on this page use Sentence Transformers embedders that have moved to the `sentence-transformers-haystack` package. Install it to run the examples: + +```shell +pip install sentence-transformers-haystack +``` + ```python from haystack.pipeline import Pipeline from haystack.document_stores.in_memory import InMemoryDocumentStore from haystack.document_stores.types import DuplicatePolicy -from haystack.components.embedders import SentenceTransformersDocumentEmbedder +from haystack_integrations.components.embedders.sentence_transformers import ( + SentenceTransformersDocumentEmbedder, +) from haystack.components.writers import DocumentWriter documents = [ diff --git a/docs-website/docs/tools/componenttool.mdx b/docs-website/docs/tools/componenttool.mdx index fb72975f92..71601a76ce 100644 --- a/docs-website/docs/tools/componenttool.mdx +++ b/docs-website/docs/tools/componenttool.mdx @@ -50,12 +50,18 @@ The recommended way to use `ComponentTool` in Haystack is with the [`Agent`](../ ### With the Agent Component +The examples on this page use SerperDev web search component that have moved to the `serperdev-haystack` package. Install it to run the examples: + +```shell +pip install serperdev-haystack +``` + ```python from haystack.components.generators.chat import OpenAIChatGenerator from haystack.dataclasses import ChatMessage from haystack.tools import ComponentTool from haystack.components.agents import Agent -from haystack.components.websearch import SerperDevWebSearch +from haystack_integrations.components.websearch.serperdev import SerperDevWebSearch from haystack.utils import Secret # Create a SerperDev search component @@ -88,7 +94,7 @@ You can also wire `ComponentTool` into a pipeline manually with `ChatGenerator` ```python from haystack import Pipeline from haystack.tools import ComponentTool -from haystack.components.websearch import SerperDevWebSearch +from haystack_integrations.components.websearch.serperdev import SerperDevWebSearch from haystack.utils import Secret from haystack.components.tools.tool_invoker import ToolInvoker from haystack.components.generators.chat import OpenAIChatGenerator diff --git a/docs-website/docs/tools/pipelinetool.mdx b/docs-website/docs/tools/pipelinetool.mdx index 28c16d1a27..3d46c64a98 100644 --- a/docs-website/docs/tools/pipelinetool.mdx +++ b/docs-website/docs/tools/pipelinetool.mdx @@ -51,11 +51,17 @@ The recommended way to use `PipelineTool` in Haystack is with the [`Agent`](../p You can create a `PipelineTool` from any existing Haystack pipeline: +The examples on this page use Sentence Transformers embedders that have moved to the `sentence-transformers-haystack` package. Install it to run the examples: + +```shell +pip install sentence-transformers-haystack +``` + ```python from haystack import Document, Pipeline from haystack.tools import PipelineTool from haystack.components.retrievers.in_memory import InMemoryBM25Retriever -from haystack.components.rankers.sentence_transformers_similarity import ( +from haystack_integrations.components.rankers.sentence_transformers import ( SentenceTransformersSimilarityRanker, ) from haystack.document_stores.in_memory import InMemoryDocumentStore @@ -105,10 +111,8 @@ print(retrieval_tool) from haystack import Document, Pipeline from haystack.tools import PipelineTool from haystack.document_stores.in_memory import InMemoryDocumentStore -from haystack.components.embedders.sentence_transformers_text_embedder import ( +from haystack_integrations.components.embedders.sentence_transformers import ( SentenceTransformersTextEmbedder, -) -from haystack.components.embedders.sentence_transformers_document_embedder import ( SentenceTransformersDocumentEmbedder, ) from haystack.components.retrievers import InMemoryEmbeddingRetriever @@ -173,10 +177,8 @@ You can also wire `PipelineTool` into a pipeline manually with `ChatGenerator` a from haystack import Document, Pipeline from haystack.tools import PipelineTool from haystack.document_stores.in_memory import InMemoryDocumentStore -from haystack.components.embedders.sentence_transformers_text_embedder import ( +from haystack_integrations.components.embedders.sentence_transformers import ( SentenceTransformersTextEmbedder, -) -from haystack.components.embedders.sentence_transformers_document_embedder import ( SentenceTransformersDocumentEmbedder, ) from haystack.components.retrievers import InMemoryEmbeddingRetriever @@ -197,7 +199,6 @@ documents = [ content="He is best known for his contributions to the design of the modern alternating current (AC) electricity supply system.", ), ] -document_embedder.warm_up() docs_with_embeddings = document_embedder.run(documents=documents)["documents"] document_store.write_documents(docs_with_embeddings) diff --git a/docs-website/package-lock.json b/docs-website/package-lock.json deleted file mode 100644 index fe58ce073b..0000000000 --- a/docs-website/package-lock.json +++ /dev/null @@ -1,21731 +0,0 @@ -{ - "name": "haystack-docs-website", - "version": "0.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "haystack-docs-website", - "version": "0.0.0", - "dependencies": { - "@docusaurus/core": "^3.10.0", - "@docusaurus/faster": "^3.10.0", - "@docusaurus/plugin-client-redirects": "^3.10.0", - "@docusaurus/plugin-content-docs": "^3.10.0", - "@docusaurus/plugin-ideal-image": "^3.10.0", - "@docusaurus/preset-classic": "^3.10.0", - "@mdx-js/react": "^3.0.0", - "@types/turndown": "^5.0.6", - "@vercel/node": "^5.5.6", - "clsx": "^2.0.0", - "docusaurus-plugin-generate-llms-txt": "^0.0.1", - "prism-react-renderer": "^2.3.0", - "react": "^19.0.0", - "react-dom": "^19.0.0", - "sharp": "^0.35.0", - "turndown": "^7.2.2", - "vercel": "^54.2.0" - }, - "devDependencies": { - "@docusaurus/module-type-aliases": "^3.10.0", - "@docusaurus/types": "^3.10.0" - }, - "engines": { - "node": ">=18.0" - } - }, - "node_modules/@algolia/abtesting": { - "version": "1.16.1", - "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.50.1", - "@algolia/requester-browser-xhr": "5.50.1", - "@algolia/requester-fetch": "5.50.1", - "@algolia/requester-node-http": "5.50.1" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/autocomplete-core": { - "version": "1.19.8", - "license": "MIT", - "dependencies": { - "@algolia/autocomplete-plugin-algolia-insights": "1.19.8", - "@algolia/autocomplete-shared": "1.19.8" - } - }, - "node_modules/@algolia/autocomplete-plugin-algolia-insights": { - "version": "1.19.8", - "license": "MIT", - "dependencies": { - "@algolia/autocomplete-shared": "1.19.8" - }, - "peerDependencies": { - "search-insights": ">= 1 < 3" - } - }, - "node_modules/@algolia/autocomplete-shared": { - "version": "1.19.8", - "license": "MIT", - "peerDependencies": { - "@algolia/client-search": ">= 4.9.1 < 6", - "algoliasearch": ">= 4.9.1 < 6" - } - }, - "node_modules/@algolia/client-abtesting": { - "version": "5.50.1", - "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.50.1", - "@algolia/requester-browser-xhr": "5.50.1", - "@algolia/requester-fetch": "5.50.1", - "@algolia/requester-node-http": "5.50.1" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/client-analytics": { - "version": "5.50.1", - "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.50.1", - "@algolia/requester-browser-xhr": "5.50.1", - "@algolia/requester-fetch": "5.50.1", - "@algolia/requester-node-http": "5.50.1" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/client-common": { - "version": "5.50.1", - "license": "MIT", - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/client-insights": { - "version": "5.50.1", - "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.50.1", - "@algolia/requester-browser-xhr": "5.50.1", - "@algolia/requester-fetch": "5.50.1", - "@algolia/requester-node-http": "5.50.1" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/client-personalization": { - "version": "5.50.1", - "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.50.1", - "@algolia/requester-browser-xhr": "5.50.1", - "@algolia/requester-fetch": "5.50.1", - "@algolia/requester-node-http": "5.50.1" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/client-query-suggestions": { - "version": "5.50.1", - "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.50.1", - "@algolia/requester-browser-xhr": "5.50.1", - "@algolia/requester-fetch": "5.50.1", - "@algolia/requester-node-http": "5.50.1" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/client-search": { - "version": "5.50.1", - "license": "MIT", - "peer": true, - "dependencies": { - "@algolia/client-common": "5.50.1", - "@algolia/requester-browser-xhr": "5.50.1", - "@algolia/requester-fetch": "5.50.1", - "@algolia/requester-node-http": "5.50.1" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/events": { - "version": "4.0.1", - "license": "MIT" - }, - "node_modules/@algolia/ingestion": { - "version": "1.50.1", - "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.50.1", - "@algolia/requester-browser-xhr": "5.50.1", - "@algolia/requester-fetch": "5.50.1", - "@algolia/requester-node-http": "5.50.1" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/monitoring": { - "version": "1.50.1", - "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.50.1", - "@algolia/requester-browser-xhr": "5.50.1", - "@algolia/requester-fetch": "5.50.1", - "@algolia/requester-node-http": "5.50.1" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/recommend": { - "version": "5.50.1", - "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.50.1", - "@algolia/requester-browser-xhr": "5.50.1", - "@algolia/requester-fetch": "5.50.1", - "@algolia/requester-node-http": "5.50.1" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/requester-browser-xhr": { - "version": "5.50.1", - "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.50.1" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/requester-fetch": { - "version": "5.50.1", - "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.50.1" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/requester-node-http": { - "version": "5.50.1", - "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.50.1" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.29.0", - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.28.5", - "js-tokens": "^4.0.0", - "picocolors": "^1.1.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.29.0", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.29.0", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/code-frame": "^7.29.0", - "@babel/generator": "^7.29.0", - "@babel/helper-compilation-targets": "^7.28.6", - "@babel/helper-module-transforms": "^7.28.6", - "@babel/helpers": "^7.28.6", - "@babel/parser": "^7.29.0", - "@babel/template": "^7.28.6", - "@babel/traverse": "^7.29.0", - "@babel/types": "^7.29.0", - "@jridgewell/remapping": "^2.3.5", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/generator": { - "version": "7.29.1", - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.29.0", - "@babel/types": "^7.29.0", - "@jridgewell/gen-mapping": "^0.3.12", - "@jridgewell/trace-mapping": "^0.3.28", - "jsesc": "^3.0.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.27.3", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.27.3" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.28.6", - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.28.6", - "@babel/helper-validator-option": "^7.27.1", - "browserslist": "^4.24.0", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.1", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.28.6", - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.3", - "@babel/helper-member-expression-to-functions": "^7.28.5", - "@babel/helper-optimise-call-expression": "^7.27.1", - "@babel/helper-replace-supers": "^7.28.6", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", - "@babel/traverse": "^7.28.6", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { - "version": "6.3.1", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.28.5", - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.3", - "regexpu-core": "^6.3.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { - "version": "6.3.1", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.6.8", - "license": "MIT", - "dependencies": { - "@babel/helper-compilation-targets": "^7.28.6", - "@babel/helper-plugin-utils": "^7.28.6", - "debug": "^4.4.3", - "lodash.debounce": "^4.0.8", - "resolve": "^1.22.11" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/@babel/helper-globals": { - "version": "7.28.0", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.28.5", - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.28.5", - "@babel/types": "^7.28.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.28.6", - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.28.6", - "@babel/types": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.28.6", - "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.28.6", - "@babel/helper-validator-identifier": "^7.28.5", - "@babel/traverse": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.27.1", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.28.6", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.27.1", - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.1", - "@babel/helper-wrap-function": "^7.27.1", - "@babel/traverse": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-replace-supers": { - "version": "7.28.6", - "license": "MIT", - "dependencies": { - "@babel/helper-member-expression-to-functions": "^7.28.5", - "@babel/helper-optimise-call-expression": "^7.27.1", - "@babel/traverse": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.27.1", - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.27.1", - "@babel/types": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.27.1", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.28.5", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.27.1", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-wrap-function": { - "version": "7.28.6", - "license": "MIT", - "dependencies": { - "@babel/template": "^7.28.6", - "@babel/traverse": "^7.28.6", - "@babel/types": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.29.2", - "license": "MIT", - "dependencies": { - "@babel/template": "^7.28.6", - "@babel/types": "^7.29.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.29.2", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.29.0" - }, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { - "version": "7.28.5", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/traverse": "^7.28.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { - "version": "7.27.1", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.27.1", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.27.1", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", - "@babel/plugin-transform-optional-chaining": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.13.0" - } - }, - "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.28.6", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6", - "@babel/traverse": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-proposal-private-property-in-object": { - "version": "7.21.0-placeholder-for-preset-env.2", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.28.6", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.28.6", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.28.6", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.28.6", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-unicode-sets-regex": { - "version": "7.18.6", - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.27.1", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.29.0", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6", - "@babel/helper-remap-async-to-generator": "^7.27.1", - "@babel/traverse": "^7.29.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.28.6", - "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.28.6", - "@babel/helper-plugin-utils": "^7.28.6", - "@babel/helper-remap-async-to-generator": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.27.1", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.28.6", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-class-properties": { - "version": "7.28.6", - "license": "MIT", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.28.6", - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.28.6", - "license": "MIT", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.28.6", - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.12.0" - } - }, - "node_modules/@babel/plugin-transform-classes": { - "version": "7.28.6", - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.3", - "@babel/helper-compilation-targets": "^7.28.6", - "@babel/helper-globals": "^7.28.0", - "@babel/helper-plugin-utils": "^7.28.6", - "@babel/helper-replace-supers": "^7.28.6", - "@babel/traverse": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.28.6", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6", - "@babel/template": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.28.5", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/traverse": "^7.28.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.28.6", - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.28.5", - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.27.1", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { - "version": "7.29.0", - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.28.5", - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-transform-dynamic-import": { - "version": "7.27.1", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-explicit-resource-management": { - "version": "7.28.6", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6", - "@babel/plugin-transform-destructuring": "^7.28.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.28.6", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-export-namespace-from": { - "version": "7.27.1", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-for-of": { - "version": "7.27.1", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-function-name": { - "version": "7.27.1", - "license": "MIT", - "dependencies": { - "@babel/helper-compilation-targets": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/traverse": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.28.6", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-literals": { - "version": "7.27.1", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.28.6", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.27.1", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.27.1", - "license": "MIT", - "dependencies": { - "@babel/helper-module-transforms": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.28.6", - "license": "MIT", - "dependencies": { - "@babel/helper-module-transforms": "^7.28.6", - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.29.0", - "license": "MIT", - "dependencies": { - "@babel/helper-module-transforms": "^7.28.6", - "@babel/helper-plugin-utils": "^7.28.6", - "@babel/helper-validator-identifier": "^7.28.5", - "@babel/traverse": "^7.29.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.27.1", - "license": "MIT", - "dependencies": { - "@babel/helper-module-transforms": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.29.0", - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.28.5", - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-transform-new-target": { - "version": "7.27.1", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.28.6", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.28.6", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.28.6", - "license": "MIT", - "dependencies": { - "@babel/helper-compilation-targets": "^7.28.6", - "@babel/helper-plugin-utils": "^7.28.6", - "@babel/plugin-transform-destructuring": "^7.28.5", - "@babel/plugin-transform-parameters": "^7.27.7", - "@babel/traverse": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-object-super": { - "version": "7.27.1", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-replace-supers": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.28.6", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.28.6", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-parameters": { - "version": "7.27.7", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-private-methods": { - "version": "7.28.6", - "license": "MIT", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.28.6", - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.28.6", - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.3", - "@babel/helper-create-class-features-plugin": "^7.28.6", - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.27.1", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-constant-elements": { - "version": "7.27.1", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-display-name": { - "version": "7.28.0", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx": { - "version": "7.28.6", - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.3", - "@babel/helper-module-imports": "^7.28.6", - "@babel/helper-plugin-utils": "^7.28.6", - "@babel/plugin-syntax-jsx": "^7.28.6", - "@babel/types": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-development": { - "version": "7.27.1", - "license": "MIT", - "dependencies": { - "@babel/plugin-transform-react-jsx": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-pure-annotations": { - "version": "7.27.1", - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.29.0", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-regexp-modifiers": { - "version": "7.28.6", - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.28.5", - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.27.1", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-runtime": { - "version": "7.29.0", - "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.28.6", - "@babel/helper-plugin-utils": "^7.28.6", - "babel-plugin-polyfill-corejs2": "^0.4.14", - "babel-plugin-polyfill-corejs3": "^0.13.0", - "babel-plugin-polyfill-regenerator": "^0.6.5", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { - "version": "6.3.1", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.27.1", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-spread": { - "version": "7.28.6", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.27.1", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.27.1", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.27.1", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-typescript": { - "version": "7.28.6", - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.3", - "@babel/helper-create-class-features-plugin": "^7.28.6", - "@babel/helper-plugin-utils": "^7.28.6", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", - "@babel/plugin-syntax-typescript": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.27.1", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-property-regex": { - "version": "7.28.6", - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.28.5", - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.27.1", - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-sets-regex": { - "version": "7.28.6", - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.28.5", - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/preset-env": { - "version": "7.29.2", - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.29.0", - "@babel/helper-compilation-targets": "^7.28.6", - "@babel/helper-plugin-utils": "^7.28.6", - "@babel/helper-validator-option": "^7.27.1", - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.28.5", - "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.27.1", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.27.1", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.27.1", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.28.6", - "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", - "@babel/plugin-syntax-import-assertions": "^7.28.6", - "@babel/plugin-syntax-import-attributes": "^7.28.6", - "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-arrow-functions": "^7.27.1", - "@babel/plugin-transform-async-generator-functions": "^7.29.0", - "@babel/plugin-transform-async-to-generator": "^7.28.6", - "@babel/plugin-transform-block-scoped-functions": "^7.27.1", - "@babel/plugin-transform-block-scoping": "^7.28.6", - "@babel/plugin-transform-class-properties": "^7.28.6", - "@babel/plugin-transform-class-static-block": "^7.28.6", - "@babel/plugin-transform-classes": "^7.28.6", - "@babel/plugin-transform-computed-properties": "^7.28.6", - "@babel/plugin-transform-destructuring": "^7.28.5", - "@babel/plugin-transform-dotall-regex": "^7.28.6", - "@babel/plugin-transform-duplicate-keys": "^7.27.1", - "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.29.0", - "@babel/plugin-transform-dynamic-import": "^7.27.1", - "@babel/plugin-transform-explicit-resource-management": "^7.28.6", - "@babel/plugin-transform-exponentiation-operator": "^7.28.6", - "@babel/plugin-transform-export-namespace-from": "^7.27.1", - "@babel/plugin-transform-for-of": "^7.27.1", - "@babel/plugin-transform-function-name": "^7.27.1", - "@babel/plugin-transform-json-strings": "^7.28.6", - "@babel/plugin-transform-literals": "^7.27.1", - "@babel/plugin-transform-logical-assignment-operators": "^7.28.6", - "@babel/plugin-transform-member-expression-literals": "^7.27.1", - "@babel/plugin-transform-modules-amd": "^7.27.1", - "@babel/plugin-transform-modules-commonjs": "^7.28.6", - "@babel/plugin-transform-modules-systemjs": "^7.29.0", - "@babel/plugin-transform-modules-umd": "^7.27.1", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.29.0", - "@babel/plugin-transform-new-target": "^7.27.1", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.28.6", - "@babel/plugin-transform-numeric-separator": "^7.28.6", - "@babel/plugin-transform-object-rest-spread": "^7.28.6", - "@babel/plugin-transform-object-super": "^7.27.1", - "@babel/plugin-transform-optional-catch-binding": "^7.28.6", - "@babel/plugin-transform-optional-chaining": "^7.28.6", - "@babel/plugin-transform-parameters": "^7.27.7", - "@babel/plugin-transform-private-methods": "^7.28.6", - "@babel/plugin-transform-private-property-in-object": "^7.28.6", - "@babel/plugin-transform-property-literals": "^7.27.1", - "@babel/plugin-transform-regenerator": "^7.29.0", - "@babel/plugin-transform-regexp-modifiers": "^7.28.6", - "@babel/plugin-transform-reserved-words": "^7.27.1", - "@babel/plugin-transform-shorthand-properties": "^7.27.1", - "@babel/plugin-transform-spread": "^7.28.6", - "@babel/plugin-transform-sticky-regex": "^7.27.1", - "@babel/plugin-transform-template-literals": "^7.27.1", - "@babel/plugin-transform-typeof-symbol": "^7.27.1", - "@babel/plugin-transform-unicode-escapes": "^7.27.1", - "@babel/plugin-transform-unicode-property-regex": "^7.28.6", - "@babel/plugin-transform-unicode-regex": "^7.27.1", - "@babel/plugin-transform-unicode-sets-regex": "^7.28.6", - "@babel/preset-modules": "0.1.6-no-external-plugins", - "babel-plugin-polyfill-corejs2": "^0.4.15", - "babel-plugin-polyfill-corejs3": "^0.14.0", - "babel-plugin-polyfill-regenerator": "^0.6.6", - "core-js-compat": "^3.48.0", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-env/node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.14.2", - "license": "MIT", - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.8", - "core-js-compat": "^3.48.0" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/@babel/preset-env/node_modules/semver": { - "version": "6.3.1", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/preset-modules": { - "version": "0.1.6-no-external-plugins", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/@babel/preset-react": { - "version": "7.28.5", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-validator-option": "^7.27.1", - "@babel/plugin-transform-react-display-name": "^7.28.0", - "@babel/plugin-transform-react-jsx": "^7.27.1", - "@babel/plugin-transform-react-jsx-development": "^7.27.1", - "@babel/plugin-transform-react-pure-annotations": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-typescript": { - "version": "7.28.5", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-validator-option": "^7.27.1", - "@babel/plugin-syntax-jsx": "^7.27.1", - "@babel/plugin-transform-modules-commonjs": "^7.27.1", - "@babel/plugin-transform-typescript": "^7.28.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/runtime": { - "version": "7.28.6", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/template": { - "version": "7.28.6", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.28.6", - "@babel/parser": "^7.28.6", - "@babel/types": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.29.0", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.29.0", - "@babel/generator": "^7.29.0", - "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.29.0", - "@babel/template": "^7.28.6", - "@babel/types": "^7.29.0", - "debug": "^4.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.29.0", - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.28.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@bytecodealliance/preview2-shim": { - "version": "0.17.6", - "resolved": "https://registry.npmjs.org/@bytecodealliance/preview2-shim/-/preview2-shim-0.17.6.tgz", - "integrity": "sha512-n3cM88gTen5980UOBAD6xDcNNL3ocTK8keab21bpx1ONdA+ARj7uD1qoFxOWCyKlkpSi195FH+GeAut7Oc6zZw==", - "license": "(Apache-2.0 WITH LLVM-exception)" - }, - "node_modules/@colors/colors": { - "version": "1.5.0", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/@csstools/cascade-layer-name-parser": { - "version": "2.0.5", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4" - } - }, - "node_modules/@csstools/color-helpers": { - "version": "5.1.0", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "engines": { - "node": ">=18" - } - }, - "node_modules/@csstools/css-calc": { - "version": "2.1.4", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4" - } - }, - "node_modules/@csstools/css-color-parser": { - "version": "3.1.0", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "dependencies": { - "@csstools/color-helpers": "^5.1.0", - "@csstools/css-calc": "^2.1.4" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4" - } - }, - "node_modules/@csstools/css-parser-algorithms": { - "version": "3.0.5", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "peer": true, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@csstools/css-tokenizer": "^3.0.4" - } - }, - "node_modules/@csstools/css-tokenizer": { - "version": "3.0.4", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@csstools/media-query-list-parser": { - "version": "4.0.3", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4" - } - }, - "node_modules/@csstools/postcss-alpha-function": { - "version": "1.0.1", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-color-parser": "^3.1.0", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/postcss-progressive-custom-properties": "^4.2.1", - "@csstools/utilities": "^2.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-cascade-layers": { - "version": "5.0.2", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/selector-specificity": "^5.0.0", - "postcss-selector-parser": "^7.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-cascade-layers/node_modules/@csstools/selector-specificity": { - "version": "5.0.0", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss-selector-parser": "^7.0.0" - } - }, - "node_modules/@csstools/postcss-cascade-layers/node_modules/postcss-selector-parser": { - "version": "7.1.1", - "license": "MIT", - "peer": true, - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@csstools/postcss-color-function": { - "version": "4.0.12", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-color-parser": "^3.1.0", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/postcss-progressive-custom-properties": "^4.2.1", - "@csstools/utilities": "^2.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-color-function-display-p3-linear": { - "version": "1.0.1", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-color-parser": "^3.1.0", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/postcss-progressive-custom-properties": "^4.2.1", - "@csstools/utilities": "^2.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-color-mix-function": { - "version": "3.0.12", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-color-parser": "^3.1.0", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/postcss-progressive-custom-properties": "^4.2.1", - "@csstools/utilities": "^2.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-color-mix-variadic-function-arguments": { - "version": "1.0.2", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-color-parser": "^3.1.0", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/postcss-progressive-custom-properties": "^4.2.1", - "@csstools/utilities": "^2.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-content-alt-text": { - "version": "2.0.8", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/postcss-progressive-custom-properties": "^4.2.1", - "@csstools/utilities": "^2.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-contrast-color-function": { - "version": "2.0.12", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-color-parser": "^3.1.0", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/postcss-progressive-custom-properties": "^4.2.1", - "@csstools/utilities": "^2.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-exponential-functions": { - "version": "2.0.9", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-calc": "^2.1.4", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-font-format-keywords": { - "version": "4.0.0", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/utilities": "^2.0.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-gamut-mapping": { - "version": "2.0.11", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-color-parser": "^3.1.0", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-gradients-interpolation-method": { - "version": "5.0.12", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-color-parser": "^3.1.0", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/postcss-progressive-custom-properties": "^4.2.1", - "@csstools/utilities": "^2.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-hwb-function": { - "version": "4.0.12", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-color-parser": "^3.1.0", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/postcss-progressive-custom-properties": "^4.2.1", - "@csstools/utilities": "^2.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-ic-unit": { - "version": "4.0.4", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/postcss-progressive-custom-properties": "^4.2.1", - "@csstools/utilities": "^2.0.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-initial": { - "version": "2.0.1", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-is-pseudo-class": { - "version": "5.0.3", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/selector-specificity": "^5.0.0", - "postcss-selector-parser": "^7.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-is-pseudo-class/node_modules/@csstools/selector-specificity": { - "version": "5.0.0", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss-selector-parser": "^7.0.0" - } - }, - "node_modules/@csstools/postcss-is-pseudo-class/node_modules/postcss-selector-parser": { - "version": "7.1.1", - "license": "MIT", - "peer": true, - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@csstools/postcss-light-dark-function": { - "version": "2.0.11", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/postcss-progressive-custom-properties": "^4.2.1", - "@csstools/utilities": "^2.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-logical-float-and-clear": { - "version": "3.0.0", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-logical-overflow": { - "version": "2.0.0", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-logical-overscroll-behavior": { - "version": "2.0.0", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-logical-resize": { - "version": "3.0.0", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-logical-viewport-units": { - "version": "3.0.4", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/utilities": "^2.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-media-minmax": { - "version": "2.0.9", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "dependencies": { - "@csstools/css-calc": "^2.1.4", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/media-query-list-parser": "^4.0.3" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-media-queries-aspect-ratio-number-values": { - "version": "3.0.5", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/media-query-list-parser": "^4.0.3" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-nested-calc": { - "version": "4.0.0", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/utilities": "^2.0.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-normalize-display-values": { - "version": "4.0.1", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-oklab-function": { - "version": "4.0.12", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-color-parser": "^3.1.0", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/postcss-progressive-custom-properties": "^4.2.1", - "@csstools/utilities": "^2.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-position-area-property": { - "version": "1.0.0", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-progressive-custom-properties": { - "version": "4.2.1", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-property-rule-prelude-list": { - "version": "1.0.0", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-random-function": { - "version": "2.0.1", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-calc": "^2.1.4", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-relative-color-syntax": { - "version": "3.0.12", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-color-parser": "^3.1.0", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/postcss-progressive-custom-properties": "^4.2.1", - "@csstools/utilities": "^2.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-scope-pseudo-class": { - "version": "4.0.1", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "postcss-selector-parser": "^7.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-scope-pseudo-class/node_modules/postcss-selector-parser": { - "version": "7.1.1", - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@csstools/postcss-sign-functions": { - "version": "1.1.4", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-calc": "^2.1.4", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-stepped-value-functions": { - "version": "4.0.9", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-calc": "^2.1.4", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-syntax-descriptor-syntax-production": { - "version": "1.0.1", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-tokenizer": "^3.0.4" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-system-ui-font-family": { - "version": "1.0.0", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-text-decoration-shorthand": { - "version": "4.0.3", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/color-helpers": "^5.1.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-trigonometric-functions": { - "version": "4.0.9", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-calc": "^2.1.4", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-unset-value": { - "version": "4.0.0", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/utilities": { - "version": "2.0.0", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@discoveryjs/json-ext": { - "version": "0.5.7", - "license": "MIT", - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/@docsearch/core": { - "version": "4.6.2", - "license": "MIT", - "peerDependencies": { - "@types/react": ">= 16.8.0 < 20.0.0", - "react": ">= 16.8.0 < 20.0.0", - "react-dom": ">= 16.8.0 < 20.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "react": { - "optional": true - }, - "react-dom": { - "optional": true - } - } - }, - "node_modules/@docsearch/css": { - "version": "4.6.2", - "license": "MIT" - }, - "node_modules/@docsearch/react": { - "version": "4.6.2", - "license": "MIT", - "dependencies": { - "@algolia/autocomplete-core": "1.19.2", - "@docsearch/core": "4.6.2", - "@docsearch/css": "4.6.2" - }, - "peerDependencies": { - "@types/react": ">= 16.8.0 < 20.0.0", - "react": ">= 16.8.0 < 20.0.0", - "react-dom": ">= 16.8.0 < 20.0.0", - "search-insights": ">= 1 < 3" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "react": { - "optional": true - }, - "react-dom": { - "optional": true - }, - "search-insights": { - "optional": true - } - } - }, - "node_modules/@docsearch/react/node_modules/@algolia/autocomplete-core": { - "version": "1.19.2", - "license": "MIT", - "dependencies": { - "@algolia/autocomplete-plugin-algolia-insights": "1.19.2", - "@algolia/autocomplete-shared": "1.19.2" - } - }, - "node_modules/@docsearch/react/node_modules/@algolia/autocomplete-plugin-algolia-insights": { - "version": "1.19.2", - "license": "MIT", - "dependencies": { - "@algolia/autocomplete-shared": "1.19.2" - }, - "peerDependencies": { - "search-insights": ">= 1 < 3" - } - }, - "node_modules/@docsearch/react/node_modules/@algolia/autocomplete-shared": { - "version": "1.19.2", - "license": "MIT", - "peerDependencies": { - "@algolia/client-search": ">= 4.9.1 < 6", - "algoliasearch": ">= 4.9.1 < 6" - } - }, - "node_modules/@docusaurus/babel": { - "version": "3.10.0", - "license": "MIT", - "dependencies": { - "@babel/core": "^7.25.9", - "@babel/generator": "^7.25.9", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-transform-runtime": "^7.25.9", - "@babel/preset-env": "^7.25.9", - "@babel/preset-react": "^7.25.9", - "@babel/preset-typescript": "^7.25.9", - "@babel/runtime": "^7.25.9", - "@babel/traverse": "^7.25.9", - "@docusaurus/logger": "3.10.0", - "@docusaurus/utils": "3.10.0", - "babel-plugin-dynamic-import-node": "^2.3.3", - "fs-extra": "^11.1.1", - "tslib": "^2.6.0" - }, - "engines": { - "node": ">=20.0" - } - }, - "node_modules/@docusaurus/bundler": { - "version": "3.10.0", - "license": "MIT", - "dependencies": { - "@babel/core": "^7.25.9", - "@docusaurus/babel": "3.10.0", - "@docusaurus/cssnano-preset": "3.10.0", - "@docusaurus/logger": "3.10.0", - "@docusaurus/types": "3.10.0", - "@docusaurus/utils": "3.10.0", - "babel-loader": "^9.2.1", - "clean-css": "^5.3.3", - "copy-webpack-plugin": "^11.0.0", - "css-loader": "^6.11.0", - "css-minimizer-webpack-plugin": "^5.0.1", - "cssnano": "^6.1.2", - "file-loader": "^6.2.0", - "html-minifier-terser": "^7.2.0", - "mini-css-extract-plugin": "^2.9.2", - "null-loader": "^4.0.1", - "postcss": "^8.5.4", - "postcss-loader": "^7.3.4", - "postcss-preset-env": "^10.2.1", - "terser-webpack-plugin": "^5.3.9", - "tslib": "^2.6.0", - "url-loader": "^4.1.1", - "webpack": "^5.95.0", - "webpackbar": "^6.0.1" - }, - "engines": { - "node": ">=20.0" - }, - "peerDependencies": { - "@docusaurus/faster": "*" - }, - "peerDependenciesMeta": { - "@docusaurus/faster": { - "optional": true - } - } - }, - "node_modules/@docusaurus/core": { - "version": "3.10.0", - "license": "MIT", - "peer": true, - "dependencies": { - "@docusaurus/babel": "3.10.0", - "@docusaurus/bundler": "3.10.0", - "@docusaurus/logger": "3.10.0", - "@docusaurus/mdx-loader": "3.10.0", - "@docusaurus/utils": "3.10.0", - "@docusaurus/utils-common": "3.10.0", - "@docusaurus/utils-validation": "3.10.0", - "boxen": "^6.2.1", - "chalk": "^4.1.2", - "chokidar": "^3.5.3", - "cli-table3": "^0.6.3", - "combine-promises": "^1.1.0", - "commander": "^5.1.0", - "core-js": "^3.31.1", - "detect-port": "^1.5.1", - "escape-html": "^1.0.3", - "eta": "^2.2.0", - "eval": "^0.1.8", - "execa": "^5.1.1", - "fs-extra": "^11.1.1", - "html-tags": "^3.3.1", - "html-webpack-plugin": "^5.6.0", - "leven": "^3.1.0", - "lodash": "^4.17.21", - "open": "^8.4.0", - "p-map": "^4.0.0", - "prompts": "^2.4.2", - "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", - "react-loadable": "npm:@docusaurus/react-loadable@6.0.0", - "react-loadable-ssr-addon-v5-slorber": "^1.0.3", - "react-router": "^5.3.4", - "react-router-config": "^5.1.1", - "react-router-dom": "^5.3.4", - "semver": "^7.5.4", - "serve-handler": "^6.1.7", - "tinypool": "^1.0.2", - "tslib": "^2.6.0", - "update-notifier": "^6.0.2", - "webpack": "^5.95.0", - "webpack-bundle-analyzer": "^4.10.2", - "webpack-dev-server": "^5.2.2", - "webpack-merge": "^6.0.1" - }, - "bin": { - "docusaurus": "bin/docusaurus.mjs" - }, - "engines": { - "node": ">=20.0" - }, - "peerDependencies": { - "@docusaurus/faster": "*", - "@mdx-js/react": "^3.0.0", - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - }, - "peerDependenciesMeta": { - "@docusaurus/faster": { - "optional": true - } - } - }, - "node_modules/@docusaurus/cssnano-preset": { - "version": "3.10.0", - "license": "MIT", - "dependencies": { - "cssnano-preset-advanced": "^6.1.2", - "postcss": "^8.5.4", - "postcss-sort-media-queries": "^5.2.0", - "tslib": "^2.6.0" - }, - "engines": { - "node": ">=20.0" - } - }, - "node_modules/@docusaurus/faster": { - "version": "3.10.0", - "license": "MIT", - "peer": true, - "dependencies": { - "@docusaurus/types": "3.10.0", - "@rspack/core": "^1.7.10", - "@swc/core": "^1.7.39", - "@swc/html": "^1.13.5", - "browserslist": "^4.24.2", - "lightningcss": "^1.27.0", - "semver": "^7.5.4", - "swc-loader": "^0.2.6", - "tslib": "^2.6.0", - "webpack": "^5.95.0" - }, - "engines": { - "node": ">=20.0" - }, - "peerDependencies": { - "@docusaurus/types": "*" - } - }, - "node_modules/@docusaurus/logger": { - "version": "3.10.0", - "license": "MIT", - "dependencies": { - "chalk": "^4.1.2", - "tslib": "^2.6.0" - }, - "engines": { - "node": ">=20.0" - } - }, - "node_modules/@docusaurus/lqip-loader": { - "version": "3.10.0", - "license": "MIT", - "dependencies": { - "@docusaurus/logger": "3.10.0", - "file-loader": "^6.2.0", - "lodash": "^4.17.21", - "sharp": "^0.32.3", - "tslib": "^2.6.0" - }, - "engines": { - "node": ">=20.0" - } - }, - "node_modules/@docusaurus/lqip-loader/node_modules/sharp": { - "version": "0.32.6", - "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.32.6.tgz", - "integrity": "sha512-KyLTWwgcR9Oe4d9HwCwNM2l7+J0dUQwn/yf7S0EnTtb0eVS4RxO0eUSvxPtzT4F3SY+C4K6fqdv/DO27sJ/v/w==", - "hasInstallScript": true, - "license": "Apache-2.0", - "dependencies": { - "color": "^4.2.3", - "detect-libc": "^2.0.2", - "node-addon-api": "^6.1.0", - "prebuild-install": "^7.1.1", - "semver": "^7.5.4", - "simple-get": "^4.0.1", - "tar-fs": "^3.0.4", - "tunnel-agent": "^0.6.0" - }, - "engines": { - "node": ">=14.15.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@docusaurus/mdx-loader": { - "version": "3.10.0", - "license": "MIT", - "dependencies": { - "@docusaurus/logger": "3.10.0", - "@docusaurus/utils": "3.10.0", - "@docusaurus/utils-validation": "3.10.0", - "@mdx-js/mdx": "^3.0.0", - "@slorber/remark-comment": "^1.0.0", - "escape-html": "^1.0.3", - "estree-util-value-to-estree": "^3.0.1", - "file-loader": "^6.2.0", - "fs-extra": "^11.1.1", - "image-size": "^2.0.2", - "mdast-util-mdx": "^3.0.0", - "mdast-util-to-string": "^4.0.0", - "rehype-raw": "^7.0.0", - "remark-directive": "^3.0.0", - "remark-emoji": "^4.0.0", - "remark-frontmatter": "^5.0.0", - "remark-gfm": "^4.0.0", - "stringify-object": "^3.3.0", - "tslib": "^2.6.0", - "unified": "^11.0.3", - "unist-util-visit": "^5.0.0", - "url-loader": "^4.1.1", - "vfile": "^6.0.1", - "webpack": "^5.88.1" - }, - "engines": { - "node": ">=20.0" - }, - "peerDependencies": { - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - } - }, - "node_modules/@docusaurus/module-type-aliases": { - "version": "3.10.0", - "license": "MIT", - "dependencies": { - "@docusaurus/types": "3.10.0", - "@types/history": "^4.7.11", - "@types/react": "*", - "@types/react-router-config": "*", - "@types/react-router-dom": "*", - "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", - "react-loadable": "npm:@docusaurus/react-loadable@6.0.0" - }, - "peerDependencies": { - "react": "*", - "react-dom": "*" - } - }, - "node_modules/@docusaurus/plugin-client-redirects": { - "version": "3.10.0", - "license": "MIT", - "dependencies": { - "@docusaurus/core": "3.10.0", - "@docusaurus/logger": "3.10.0", - "@docusaurus/utils": "3.10.0", - "@docusaurus/utils-common": "3.10.0", - "@docusaurus/utils-validation": "3.10.0", - "eta": "^2.2.0", - "fs-extra": "^11.1.1", - "lodash": "^4.17.21", - "tslib": "^2.6.0" - }, - "engines": { - "node": ">=20.0" - }, - "peerDependencies": { - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - } - }, - "node_modules/@docusaurus/plugin-content-blog": { - "version": "3.10.0", - "license": "MIT", - "dependencies": { - "@docusaurus/core": "3.10.0", - "@docusaurus/logger": "3.10.0", - "@docusaurus/mdx-loader": "3.10.0", - "@docusaurus/theme-common": "3.10.0", - "@docusaurus/types": "3.10.0", - "@docusaurus/utils": "3.10.0", - "@docusaurus/utils-common": "3.10.0", - "@docusaurus/utils-validation": "3.10.0", - "cheerio": "1.0.0-rc.12", - "combine-promises": "^1.1.0", - "feed": "^4.2.2", - "fs-extra": "^11.1.1", - "lodash": "^4.17.21", - "schema-dts": "^1.1.2", - "srcset": "^4.0.0", - "tslib": "^2.6.0", - "unist-util-visit": "^5.0.0", - "utility-types": "^3.10.0", - "webpack": "^5.88.1" - }, - "engines": { - "node": ">=20.0" - }, - "peerDependencies": { - "@docusaurus/plugin-content-docs": "*", - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - } - }, - "node_modules/@docusaurus/plugin-content-docs": { - "version": "3.10.0", - "license": "MIT", - "peer": true, - "dependencies": { - "@docusaurus/core": "3.10.0", - "@docusaurus/logger": "3.10.0", - "@docusaurus/mdx-loader": "3.10.0", - "@docusaurus/module-type-aliases": "3.10.0", - "@docusaurus/theme-common": "3.10.0", - "@docusaurus/types": "3.10.0", - "@docusaurus/utils": "3.10.0", - "@docusaurus/utils-common": "3.10.0", - "@docusaurus/utils-validation": "3.10.0", - "@types/react-router-config": "^5.0.7", - "combine-promises": "^1.1.0", - "fs-extra": "^11.1.1", - "js-yaml": "^4.1.0", - "lodash": "^4.17.21", - "schema-dts": "^1.1.2", - "tslib": "^2.6.0", - "utility-types": "^3.10.0", - "webpack": "^5.88.1" - }, - "engines": { - "node": ">=20.0" - }, - "peerDependencies": { - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - } - }, - "node_modules/@docusaurus/plugin-content-pages": { - "version": "3.10.0", - "license": "MIT", - "dependencies": { - "@docusaurus/core": "3.10.0", - "@docusaurus/mdx-loader": "3.10.0", - "@docusaurus/types": "3.10.0", - "@docusaurus/utils": "3.10.0", - "@docusaurus/utils-validation": "3.10.0", - "fs-extra": "^11.1.1", - "tslib": "^2.6.0", - "webpack": "^5.88.1" - }, - "engines": { - "node": ">=20.0" - }, - "peerDependencies": { - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - } - }, - "node_modules/@docusaurus/plugin-css-cascade-layers": { - "version": "3.10.0", - "license": "MIT", - "dependencies": { - "@docusaurus/core": "3.10.0", - "@docusaurus/types": "3.10.0", - "@docusaurus/utils": "3.10.0", - "@docusaurus/utils-validation": "3.10.0", - "tslib": "^2.6.0" - }, - "engines": { - "node": ">=20.0" - } - }, - "node_modules/@docusaurus/plugin-debug": { - "version": "3.10.0", - "license": "MIT", - "dependencies": { - "@docusaurus/core": "3.10.0", - "@docusaurus/types": "3.10.0", - "@docusaurus/utils": "3.10.0", - "fs-extra": "^11.1.1", - "react-json-view-lite": "^2.3.0", - "tslib": "^2.6.0" - }, - "engines": { - "node": ">=20.0" - }, - "peerDependencies": { - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - } - }, - "node_modules/@docusaurus/plugin-google-analytics": { - "version": "3.10.0", - "license": "MIT", - "dependencies": { - "@docusaurus/core": "3.10.0", - "@docusaurus/types": "3.10.0", - "@docusaurus/utils-validation": "3.10.0", - "tslib": "^2.6.0" - }, - "engines": { - "node": ">=20.0" - }, - "peerDependencies": { - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - } - }, - "node_modules/@docusaurus/plugin-google-gtag": { - "version": "3.10.0", - "license": "MIT", - "dependencies": { - "@docusaurus/core": "3.10.0", - "@docusaurus/types": "3.10.0", - "@docusaurus/utils-validation": "3.10.0", - "@types/gtag.js": "^0.0.20", - "tslib": "^2.6.0" - }, - "engines": { - "node": ">=20.0" - }, - "peerDependencies": { - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - } - }, - "node_modules/@docusaurus/plugin-google-tag-manager": { - "version": "3.10.0", - "license": "MIT", - "dependencies": { - "@docusaurus/core": "3.10.0", - "@docusaurus/types": "3.10.0", - "@docusaurus/utils-validation": "3.10.0", - "tslib": "^2.6.0" - }, - "engines": { - "node": ">=20.0" - }, - "peerDependencies": { - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - } - }, - "node_modules/@docusaurus/plugin-ideal-image": { - "version": "3.10.0", - "license": "MIT", - "dependencies": { - "@docusaurus/core": "3.10.0", - "@docusaurus/lqip-loader": "3.10.0", - "@docusaurus/responsive-loader": "^1.7.0", - "@docusaurus/theme-translations": "3.10.0", - "@docusaurus/types": "3.10.0", - "@docusaurus/utils-validation": "3.10.0", - "sharp": "^0.32.3", - "tslib": "^2.6.0", - "webpack": "^5.88.1" - }, - "engines": { - "node": ">=20.0" - }, - "peerDependencies": { - "jimp": "*", - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - }, - "peerDependenciesMeta": { - "jimp": { - "optional": true - } - } - }, - "node_modules/@docusaurus/plugin-ideal-image/node_modules/sharp": { - "version": "0.32.6", - "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.32.6.tgz", - "integrity": "sha512-KyLTWwgcR9Oe4d9HwCwNM2l7+J0dUQwn/yf7S0EnTtb0eVS4RxO0eUSvxPtzT4F3SY+C4K6fqdv/DO27sJ/v/w==", - "hasInstallScript": true, - "license": "Apache-2.0", - "dependencies": { - "color": "^4.2.3", - "detect-libc": "^2.0.2", - "node-addon-api": "^6.1.0", - "prebuild-install": "^7.1.1", - "semver": "^7.5.4", - "simple-get": "^4.0.1", - "tar-fs": "^3.0.4", - "tunnel-agent": "^0.6.0" - }, - "engines": { - "node": ">=14.15.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@docusaurus/plugin-sitemap": { - "version": "3.10.0", - "license": "MIT", - "dependencies": { - "@docusaurus/core": "3.10.0", - "@docusaurus/logger": "3.10.0", - "@docusaurus/types": "3.10.0", - "@docusaurus/utils": "3.10.0", - "@docusaurus/utils-common": "3.10.0", - "@docusaurus/utils-validation": "3.10.0", - "fs-extra": "^11.1.1", - "sitemap": "^7.1.1", - "tslib": "^2.6.0" - }, - "engines": { - "node": ">=20.0" - }, - "peerDependencies": { - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - } - }, - "node_modules/@docusaurus/plugin-svgr": { - "version": "3.10.0", - "license": "MIT", - "dependencies": { - "@docusaurus/core": "3.10.0", - "@docusaurus/types": "3.10.0", - "@docusaurus/utils": "3.10.0", - "@docusaurus/utils-validation": "3.10.0", - "@svgr/core": "8.1.0", - "@svgr/webpack": "^8.1.0", - "tslib": "^2.6.0", - "webpack": "^5.88.1" - }, - "engines": { - "node": ">=20.0" - }, - "peerDependencies": { - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - } - }, - "node_modules/@docusaurus/preset-classic": { - "version": "3.10.0", - "license": "MIT", - "dependencies": { - "@docusaurus/core": "3.10.0", - "@docusaurus/plugin-content-blog": "3.10.0", - "@docusaurus/plugin-content-docs": "3.10.0", - "@docusaurus/plugin-content-pages": "3.10.0", - "@docusaurus/plugin-css-cascade-layers": "3.10.0", - "@docusaurus/plugin-debug": "3.10.0", - "@docusaurus/plugin-google-analytics": "3.10.0", - "@docusaurus/plugin-google-gtag": "3.10.0", - "@docusaurus/plugin-google-tag-manager": "3.10.0", - "@docusaurus/plugin-sitemap": "3.10.0", - "@docusaurus/plugin-svgr": "3.10.0", - "@docusaurus/theme-classic": "3.10.0", - "@docusaurus/theme-common": "3.10.0", - "@docusaurus/theme-search-algolia": "3.10.0", - "@docusaurus/types": "3.10.0" - }, - "engines": { - "node": ">=20.0" - }, - "peerDependencies": { - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - } - }, - "node_modules/@docusaurus/responsive-loader": { - "version": "1.7.1", - "license": "BSD-3-Clause", - "dependencies": { - "loader-utils": "^2.0.0" - }, - "engines": { - "node": ">=12" - }, - "peerDependencies": { - "jimp": "*", - "sharp": "*" - }, - "peerDependenciesMeta": { - "jimp": { - "optional": true - }, - "sharp": { - "optional": true - } - } - }, - "node_modules/@docusaurus/theme-classic": { - "version": "3.10.0", - "license": "MIT", - "dependencies": { - "@docusaurus/core": "3.10.0", - "@docusaurus/logger": "3.10.0", - "@docusaurus/mdx-loader": "3.10.0", - "@docusaurus/module-type-aliases": "3.10.0", - "@docusaurus/plugin-content-blog": "3.10.0", - "@docusaurus/plugin-content-docs": "3.10.0", - "@docusaurus/plugin-content-pages": "3.10.0", - "@docusaurus/theme-common": "3.10.0", - "@docusaurus/theme-translations": "3.10.0", - "@docusaurus/types": "3.10.0", - "@docusaurus/utils": "3.10.0", - "@docusaurus/utils-common": "3.10.0", - "@docusaurus/utils-validation": "3.10.0", - "@mdx-js/react": "^3.0.0", - "clsx": "^2.0.0", - "copy-text-to-clipboard": "^3.2.0", - "infima": "0.2.0-alpha.45", - "lodash": "^4.17.21", - "nprogress": "^0.2.0", - "postcss": "^8.5.4", - "prism-react-renderer": "^2.3.0", - "prismjs": "^1.29.0", - "react-router-dom": "^5.3.4", - "rtlcss": "^4.1.0", - "tslib": "^2.6.0", - "utility-types": "^3.10.0" - }, - "engines": { - "node": ">=20.0" - }, - "peerDependencies": { - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - } - }, - "node_modules/@docusaurus/theme-common": { - "version": "3.10.0", - "license": "MIT", - "dependencies": { - "@docusaurus/mdx-loader": "3.10.0", - "@docusaurus/module-type-aliases": "3.10.0", - "@docusaurus/utils": "3.10.0", - "@docusaurus/utils-common": "3.10.0", - "@types/history": "^4.7.11", - "@types/react": "*", - "@types/react-router-config": "*", - "clsx": "^2.0.0", - "parse-numeric-range": "^1.3.0", - "prism-react-renderer": "^2.3.0", - "tslib": "^2.6.0", - "utility-types": "^3.10.0" - }, - "engines": { - "node": ">=20.0" - }, - "peerDependencies": { - "@docusaurus/plugin-content-docs": "*", - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - } - }, - "node_modules/@docusaurus/theme-search-algolia": { - "version": "3.10.0", - "license": "MIT", - "dependencies": { - "@algolia/autocomplete-core": "^1.19.2", - "@docsearch/react": "^3.9.0 || ^4.3.2", - "@docusaurus/core": "3.10.0", - "@docusaurus/logger": "3.10.0", - "@docusaurus/plugin-content-docs": "3.10.0", - "@docusaurus/theme-common": "3.10.0", - "@docusaurus/theme-translations": "3.10.0", - "@docusaurus/utils": "3.10.0", - "@docusaurus/utils-validation": "3.10.0", - "algoliasearch": "^5.37.0", - "algoliasearch-helper": "^3.26.0", - "clsx": "^2.0.0", - "eta": "^2.2.0", - "fs-extra": "^11.1.1", - "lodash": "^4.17.21", - "tslib": "^2.6.0", - "utility-types": "^3.10.0" - }, - "engines": { - "node": ">=20.0" - }, - "peerDependencies": { - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - } - }, - "node_modules/@docusaurus/theme-translations": { - "version": "3.10.0", - "license": "MIT", - "dependencies": { - "fs-extra": "^11.1.1", - "tslib": "^2.6.0" - }, - "engines": { - "node": ">=20.0" - } - }, - "node_modules/@docusaurus/types": { - "version": "3.10.0", - "license": "MIT", - "dependencies": { - "@mdx-js/mdx": "^3.0.0", - "@types/history": "^4.7.11", - "@types/mdast": "^4.0.2", - "@types/react": "*", - "commander": "^5.1.0", - "joi": "^17.9.2", - "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", - "utility-types": "^3.10.0", - "webpack": "^5.95.0", - "webpack-merge": "^5.9.0" - }, - "peerDependencies": { - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - } - }, - "node_modules/@docusaurus/types/node_modules/webpack-merge": { - "version": "5.10.0", - "license": "MIT", - "dependencies": { - "clone-deep": "^4.0.1", - "flat": "^5.0.2", - "wildcard": "^2.0.0" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/@docusaurus/utils": { - "version": "3.10.0", - "license": "MIT", - "dependencies": { - "@docusaurus/logger": "3.10.0", - "@docusaurus/types": "3.10.0", - "@docusaurus/utils-common": "3.10.0", - "escape-string-regexp": "^4.0.0", - "execa": "^5.1.1", - "file-loader": "^6.2.0", - "fs-extra": "^11.1.1", - "github-slugger": "^1.5.0", - "globby": "^11.1.0", - "gray-matter": "^4.0.3", - "jiti": "^1.20.0", - "js-yaml": "^4.1.0", - "lodash": "^4.17.21", - "micromatch": "^4.0.5", - "p-queue": "^6.6.2", - "prompts": "^2.4.2", - "resolve-pathname": "^3.0.0", - "tslib": "^2.6.0", - "url-loader": "^4.1.1", - "utility-types": "^3.10.0", - "webpack": "^5.88.1" - }, - "engines": { - "node": ">=20.0" - } - }, - "node_modules/@docusaurus/utils-common": { - "version": "3.10.0", - "license": "MIT", - "dependencies": { - "@docusaurus/types": "3.10.0", - "tslib": "^2.6.0" - }, - "engines": { - "node": ">=20.0" - } - }, - "node_modules/@docusaurus/utils-validation": { - "version": "3.10.0", - "license": "MIT", - "dependencies": { - "@docusaurus/logger": "3.10.0", - "@docusaurus/utils": "3.10.0", - "@docusaurus/utils-common": "3.10.0", - "fs-extra": "^11.2.0", - "joi": "^17.9.2", - "js-yaml": "^4.1.0", - "lodash": "^4.17.21", - "tslib": "^2.6.0" - }, - "engines": { - "node": ">=20.0" - } - }, - "node_modules/@edge-runtime/format": { - "version": "2.2.1", - "license": "MPL-2.0", - "engines": { - "node": ">=16" - } - }, - "node_modules/@edge-runtime/node-utils": { - "version": "2.3.0", - "license": "MPL-2.0", - "engines": { - "node": ">=16" - } - }, - "node_modules/@edge-runtime/ponyfill": { - "version": "2.4.2", - "license": "MPL-2.0", - "engines": { - "node": ">=16" - } - }, - "node_modules/@edge-runtime/primitives": { - "version": "4.1.0", - "license": "MPL-2.0", - "engines": { - "node": ">=16" - } - }, - "node_modules/@edge-runtime/vm": { - "version": "3.2.0", - "license": "MPL-2.0", - "dependencies": { - "@edge-runtime/primitives": "4.1.0" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/@emnapi/wasi-threads": { - "version": "1.1.0", - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.0.tgz", - "integrity": "sha512-KuZrd2hRjz01y5JK9mEBSD3Vj3mbCvemhT466rSuJYeE/hjuBrHfjjcjMdTm/sz7au+++sdbJZJmuBwQLuw68A==", - "cpu": [ - "ppc64" - ], - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.0.tgz", - "integrity": "sha512-j67aezrPNYWJEOHUNLPj9maeJte7uSMM6gMoxfPC9hOg8N02JuQi/T7ewumf4tNvJadFkvLZMlAq73b9uwdMyQ==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.0.tgz", - "integrity": "sha512-CC3vt4+1xZrs97/PKDkl0yN7w8edvU2vZvAFGD16n9F0Cvniy5qvzRXjfO1l94efczkkQE6g1x0i73Qf5uthOQ==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.0.tgz", - "integrity": "sha512-wurMkF1nmQajBO1+0CJmcN17U4BP6GqNSROP8t0X/Jiw2ltYGLHpEksp9MpoBqkrFR3kv2/te6Sha26k3+yZ9Q==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.27.0", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.0.tgz", - "integrity": "sha512-8mG6arH3yB/4ZXiEnXof5MK72dE6zM9cDvUcPtxhUZsDjESl9JipZYW60C3JGreKCEP+p8P/72r69m4AZGJd5g==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.0.tgz", - "integrity": "sha512-9FHtyO988CwNMMOE3YIeci+UV+x5Zy8fI2qHNpsEtSF83YPBmE8UWmfYAQg6Ux7Gsmd4FejZqnEUZCMGaNQHQw==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.0.tgz", - "integrity": "sha512-zCMeMXI4HS/tXvJz8vWGexpZj2YVtRAihHLk1imZj4efx1BQzN76YFeKqlDr3bUWI26wHwLWPd3rwh6pe4EV7g==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.0.tgz", - "integrity": "sha512-t76XLQDpxgmq2cNXKTVEB7O7YMb42atj2Re2Haf45HkaUpjM2J0UuJZDuaGbPbamzZ7bawyGFUkodL+zcE+jvQ==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.0.tgz", - "integrity": "sha512-AS18v0V+vZiLJyi/4LphvBE+OIX682Pu7ZYNsdUHyUKSoRwdnOsMf6FDekwoAFKej14WAkOef3zAORJgAtXnlQ==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.0.tgz", - "integrity": "sha512-Mz1jxqm/kfgKkc/KLHC5qIujMvnnarD9ra1cEcrs7qshTUSksPihGrWHVG5+osAIQ68577Zpww7SGapmzSt4Nw==", - "cpu": [ - "ia32" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.0.tgz", - "integrity": "sha512-QbEREjdJeIreIAbdG2hLU1yXm1uu+LTdzoq1KCo4G4pFOLlvIspBm36QrQOar9LFduavoWX2msNFAAAY9j4BDg==", - "cpu": [ - "loong64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.0.tgz", - "integrity": "sha512-sJz3zRNe4tO2wxvDpH/HYJilb6+2YJxo/ZNbVdtFiKDufzWq4JmKAiHy9iGoLjAV7r/W32VgaHGkk35cUXlNOg==", - "cpu": [ - "mips64el" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.0.tgz", - "integrity": "sha512-z9N10FBD0DCS2dmSABDBb5TLAyF1/ydVb+N4pi88T45efQ/w4ohr/F/QYCkxDPnkhkp6AIpIcQKQ8F0ANoA2JA==", - "cpu": [ - "ppc64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.0.tgz", - "integrity": "sha512-pQdyAIZ0BWIC5GyvVFn5awDiO14TkT/19FTmFcPdDec94KJ1uZcmFs21Fo8auMXzD4Tt+diXu1LW1gHus9fhFQ==", - "cpu": [ - "riscv64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.0.tgz", - "integrity": "sha512-hPlRWR4eIDDEci953RI1BLZitgi5uqcsjKMxwYfmi4LcwyWo2IcRP+lThVnKjNtk90pLS8nKdroXYOqW+QQH+w==", - "cpu": [ - "s390x" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.0.tgz", - "integrity": "sha512-1hBWx4OUJE2cab++aVZ7pObD6s+DK4mPGpemtnAORBvb5l/g5xFGk0vc0PjSkrDs0XaXj9yyob3d14XqvnQ4gw==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-arm64": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.0.tgz", - "integrity": "sha512-6m0sfQfxfQfy1qRuecMkJlf1cIzTOgyaeXaiVaaki8/v+WB+U4hc6ik15ZW6TAllRlg/WuQXxWj1jx6C+dfy3w==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.0.tgz", - "integrity": "sha512-xbbOdfn06FtcJ9d0ShxxvSn2iUsGd/lgPIO2V3VZIPDbEaIj1/3nBBe1AwuEZKXVXkMmpr6LUAgMkLD/4D2PPA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-arm64": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.0.tgz", - "integrity": "sha512-fWgqR8uNbCQ/GGv0yhzttj6sU/9Z5/Sv/VGU3F5OuXK6J6SlriONKrQ7tNlwBrJZXRYk5jUhuWvF7GYzGguBZQ==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.0.tgz", - "integrity": "sha512-aCwlRdSNMNxkGGqQajMUza6uXzR/U0dIl1QmLjPtRbLOx3Gy3otfFu/VjATy4yQzo9yFDGTxYDo1FfAD9oRD2A==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openharmony-arm64": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.0.tgz", - "integrity": "sha512-nyvsBccxNAsNYz2jVFYwEGuRRomqZ149A39SHWk4hV0jWxKM0hjBPm3AmdxcbHiFLbBSwG6SbpIcUbXjgyECfA==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.0.tgz", - "integrity": "sha512-Q1KY1iJafM+UX6CFEL+F4HRTgygmEW568YMqDA5UV97AuZSm21b7SXIrRJDwXWPzr8MGr75fUZPV67FdtMHlHA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.0.tgz", - "integrity": "sha512-W1eyGNi6d+8kOmZIwi/EDjrL9nxQIQ0MiGqe/AWc6+IaHloxHSGoeRgDRKHFISThLmsewZ5nHFvGFWdBYlgKPg==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.0.tgz", - "integrity": "sha512-30z1aKL9h22kQhilnYkORFYt+3wp7yZsHWus+wSKAJR8JtdfI76LJ4SBdMsCopTR3z/ORqVu5L1vtnHZWVj4cQ==", - "cpu": [ - "ia32" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.0.tgz", - "integrity": "sha512-aIitBcjQeyOhMTImhLZmtxfdOcuNRpwlPNmlFKPcHQYPhEssw75Cl1TSXJXpMkzaua9FUetx/4OQKq7eJul5Cg==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@fastify/busboy": { - "version": "2.1.1", - "license": "MIT", - "engines": { - "node": ">=14" - } - }, - "node_modules/@hapi/hoek": { - "version": "9.3.0", - "license": "BSD-3-Clause" - }, - "node_modules/@hapi/topo": { - "version": "5.1.0", - "license": "BSD-3-Clause", - "dependencies": { - "@hapi/hoek": "^9.0.0" - } - }, - "node_modules/@img/colour": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.1.0.tgz", - "integrity": "sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==", - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/@img/sharp-darwin-arm64": { - "version": "0.35.2", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.35.2.tgz", - "integrity": "sha512-eEieHsMksAW4IiO5NzauESRl2D2qz3J/kwUxUrSfV06A93eEaRfMpHXyUb1mAqrR7i8U9A0GRqE9pjn6u1Jjpg==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=20.9.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-darwin-arm64": "1.3.1" - } - }, - "node_modules/@img/sharp-darwin-x64": { - "version": "0.35.2", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.35.2.tgz", - "integrity": "sha512-BaktuGPCeHJMARpodR8jK4uKiZrPAy9WrfQW0sdI37clracq8Bp01AYS3SZgi5FS/y5twa9t4+LIuuxQjqRrWw==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=20.9.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-darwin-x64": "1.3.1" - } - }, - "node_modules/@img/sharp-freebsd-wasm32": { - "version": "0.35.2", - "resolved": "https://registry.npmjs.org/@img/sharp-freebsd-wasm32/-/sharp-freebsd-wasm32-0.35.2.tgz", - "integrity": "sha512-YoAxdnd8hPUkvLHd3bWY+YA8nw3xM/RyRopYucNsWHVSan8NLVM3X2volsfoRDcXdUJPg6tXahSd7HXPK7lRnw==", - "license": "Apache-2.0", - "optional": true, - "os": [ - "freebsd" - ], - "dependencies": { - "@img/sharp-wasm32": "0.35.2" - }, - "engines": { - "node": ">=20.9.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-darwin-arm64": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.3.1.tgz", - "integrity": "sha512-4V/M3roRMTYjiwZY9IOVQOE8OyeCxFAkYmyZDrZl51uOKjibm3oeEJ4WAmLxutAfzFbC9jqUiPs2gbnGflH+7g==", - "cpu": [ - "arm64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "darwin" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-darwin-x64": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.3.1.tgz", - "integrity": "sha512-c0/DxItpJv2+dGhgycJBBgotdqruGYDvA79drdh0MD1dFpy7JzJ/PlXwi1H4rFf0eTy8tgbI91aHDnZIceY3jQ==", - "cpu": [ - "x64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "darwin" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-arm": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.3.1.tgz", - "integrity": "sha512-aGGy9aWzXgHBG7HNyQPWorZthlp7+x6fDRoPAQbGO3ThcttuTyKIx3NuSHb6zb4gBNq6/yNn9f1cy9nFKS/Vmg==", - "cpu": [ - "arm" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-arm64": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.3.1.tgz", - "integrity": "sha512-JznefmcK9j1JKPz8AkQDh89kjojubyfOasWBPKfzMIhPwsgDy9evpE/naJTXXXmghS1iFwR8u/kTwh/I2/+GCw==", - "cpu": [ - "arm64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-ppc64": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.3.1.tgz", - "integrity": "sha512-1EkwGNCZk6iWNCMWqrvdJ+r1j0PT1zIz60CNPhYnJlK/zyeWqlsPZIe+ocBVqPF8k/Ssee/NCk+tE9Ryrko6ng==", - "cpu": [ - "ppc64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-riscv64": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.3.1.tgz", - "integrity": "sha512-Ilays+w2bXdnxzxtQdmXR62u8o8GYa3eL4+Gr+1KiE4xperMZUslRaVPJwwPkzlHEjGfXAfRVAa/7CYCtSqsBw==", - "cpu": [ - "riscv64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-s390x": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.3.1.tgz", - "integrity": "sha512-VfBwVHQTbRoj4XlpA/KLZ7ltgMpz+4WSejFzQ+GnoImjo1PtEJ59QB2qR1xQEeRPYIkNrPIm2L4cICMvz4C2ew==", - "cpu": [ - "s390x" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-x64": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.3.1.tgz", - "integrity": "sha512-+c8ukgwU62DS54nCAjw7keOfHUkmr0B5QHEdcOqRnodF/MNXJbVI8Eopoj4B/0H8Asr65I+A4Amrn7a85/md6A==", - "cpu": [ - "x64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linuxmusl-arm64": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.3.1.tgz", - "integrity": "sha512-qlKb/pwbkAi1WMsJrYHk7CuDrd12s27U2QnRhFYUoJNrRCmkosMTttuRFat/DDB3IlDm5qE1TJgZ4JDnHX8Ldw==", - "cpu": [ - "arm64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linuxmusl-x64": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.3.1.tgz", - "integrity": "sha512-yO21HwoUVLN8Qa+/SBjQLMYwBWAVJjeGPNe+hc0OUeMeifEtJqu5a1c4HayE1nNpDih9y3/KkoltfkDodmKAlg==", - "cpu": [ - "x64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-linux-arm": { - "version": "0.35.2", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.35.2.tgz", - "integrity": "sha512-SE4kzF2mepn6z+6E7L6lsV8FzuLL6IPQdyX8ZiwROAG/G8td+hP/m7FsFPwidtrF19gvajuC9l6TxAVcsA4S7A==", - "cpu": [ - "arm" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=20.9.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-arm": "1.3.1" - } - }, - "node_modules/@img/sharp-linux-arm64": { - "version": "0.35.2", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.35.2.tgz", - "integrity": "sha512-af12Pnd0ZGu2HfP8NayB0kk6eC/lrfbQE6HlR4jD+34wdJ1Vw9TF6TMn6ZvffT+WgqVsl0hRbmNvz2u/23VmwA==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=20.9.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-arm64": "1.3.1" - } - }, - "node_modules/@img/sharp-linux-ppc64": { - "version": "0.35.2", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.35.2.tgz", - "integrity": "sha512-hYSBm7zcNtDCozCxQHYZJiu63b/bXsgRZuOxCIBZsStMM9Vap47iFHdbX4kCvQsblPB/k+clhELpdQJHQLSHvg==", - "cpu": [ - "ppc64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=20.9.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-ppc64": "1.3.1" - } - }, - "node_modules/@img/sharp-linux-riscv64": { - "version": "0.35.2", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.35.2.tgz", - "integrity": "sha512-qQt0Kc13+Hoan/Awq/qMSQw3L+RI1NCRPgD5cUJ/1WSSmIoysLOc72jlRM3E0OHN9Yr313jgeQ2T+zW+F03QFA==", - "cpu": [ - "riscv64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=20.9.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-riscv64": "1.3.1" - } - }, - "node_modules/@img/sharp-linux-s390x": { - "version": "0.35.2", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.35.2.tgz", - "integrity": "sha512-E4fLLfRPzDLlEeDaTzI98OFLcv++WL5ChLLMwPoVd0CIoZQqupBSNbOisPL5am9XsbQ9T84+iiMpUvbFtkunbA==", - "cpu": [ - "s390x" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=20.9.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-s390x": "1.3.1" - } - }, - "node_modules/@img/sharp-linux-x64": { - "version": "0.35.2", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.35.2.tgz", - "integrity": "sha512-gi0zFJJRLswfCZmHtJdikXPOc5u7qamSOS3NHedLqLd4W8Q0NqjdBr6TTRIgsfFjqfTsHFgdfvJ9LwqSgcHiAA==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=20.9.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-x64": "1.3.1" - } - }, - "node_modules/@img/sharp-linuxmusl-arm64": { - "version": "0.35.2", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.35.2.tgz", - "integrity": "sha512-siWbOW1u6HFnFLrp0waKyW7VEf7jYvcDWdrXEFa8AkdAQgEvuu5Fz8/Y70w9EeqAdwDtfU012BhEHHaDqvQNzg==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=20.9.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-arm64": "1.3.1" - } - }, - "node_modules/@img/sharp-linuxmusl-x64": { - "version": "0.35.2", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.35.2.tgz", - "integrity": "sha512-YBqMMcjDi4QGYiSn4vNOYBhmlC4z5AXqkOUUqI2e0AFA4urNv4ESgOgwNl3K+4etQhha0twXlzeF20bbULm9Yg==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=20.9.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-x64": "1.3.1" - } - }, - "node_modules/@img/sharp-wasm32": { - "version": "0.35.2", - "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.35.2.tgz", - "integrity": "sha512-Mrv4JQNYVQ94xH+jzZ9r+gowleN8mv2FTgKT+PI6bx5C0G8TdNYndu161pg2i7uoBwxy2ImPMHrJOM2LZef7Bw==", - "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", - "optional": true, - "dependencies": { - "@emnapi/runtime": "^1.11.1" - }, - "engines": { - "node": ">=20.9.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-webcontainers-wasm32": { - "version": "0.35.2", - "resolved": "https://registry.npmjs.org/@img/sharp-webcontainers-wasm32/-/sharp-webcontainers-wasm32-0.35.2.tgz", - "integrity": "sha512-QNV27pxs9wpApEiCfvHM1RDoP1w1+2KrUWWDPEhEwg+latvOrfuhWrHWZKwdSFwU6jh3myjw/yOCRsUIuOft3g==", - "cpu": [ - "wasm32" - ], - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@img/sharp-wasm32": "0.35.2" - }, - "engines": { - "node": ">=20.9.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-win32-arm64": { - "version": "0.35.2", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.35.2.tgz", - "integrity": "sha512-BiVRYc/t6/Vl3e1hBx0hugG4oN9Pydf4fgMSpxTQJmwGUg/YoXTWHiFeRymHfCZzifxu4F4rpk/I67D0LQ20wQ==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0 AND LGPL-3.0-or-later", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=20.9.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-win32-ia32": { - "version": "0.35.2", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.35.2.tgz", - "integrity": "sha512-YYEhx9PImCC7T0tI8JDMi4DB9LwLCXCU5OWNYEXAxh5Q1ShKkyC6byxzoBJ3gEFDnH2lQckWuDe70G7mB2XJog==", - "cpu": [ - "ia32" - ], - "license": "Apache-2.0 AND LGPL-3.0-or-later", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^20.9.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-win32-x64": { - "version": "0.35.2", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.35.2.tgz", - "integrity": "sha512-imoOyBcoM/iiUr4J6VPpCNjPnjvP/Gks95898yB8YqoGGYmHYbOyCuNv9FMhFgtaiHFGbHW8bxKqRV6VjtXThQ==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0 AND LGPL-3.0-or-later", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=20.9.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@isaacs/balanced-match": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz", - "integrity": "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==", - "license": "MIT", - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/@isaacs/brace-expansion": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@isaacs/brace-expansion/-/brace-expansion-5.0.1.tgz", - "integrity": "sha512-WMz71T1JS624nWj2n2fnYAuPovhv7EUhk69R6i9dsVyzxt5eM3bjwvgk9L+APE1TRscGysAVMANkB0jh0LQZrQ==", - "license": "MIT", - "dependencies": { - "@isaacs/balanced-match": "^4.0.1" - }, - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/@isaacs/fs-minipass": { - "version": "4.0.1", - "license": "ISC", - "dependencies": { - "minipass": "^7.0.4" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@jest/schemas": { - "version": "29.6.3", - "license": "MIT", - "dependencies": { - "@sinclair/typebox": "^0.27.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/types": { - "version": "29.6.3", - "license": "MIT", - "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.13", - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/remapping": { - "version": "2.3.5", - "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.11", - "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.5", - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.31", - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@jsonjoy.com/base64": { - "version": "1.1.2", - "license": "Apache-2.0", - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@jsonjoy.com/buffers": { - "version": "17.65.0", - "license": "Apache-2.0", - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@jsonjoy.com/codegen": { - "version": "1.0.0", - "license": "Apache-2.0", - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@jsonjoy.com/fs-core": { - "version": "4.56.10", - "license": "Apache-2.0", - "dependencies": { - "@jsonjoy.com/fs-node-builtins": "4.56.10", - "@jsonjoy.com/fs-node-utils": "4.56.10", - "thingies": "^2.5.0" - }, - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@jsonjoy.com/fs-fsa": { - "version": "4.56.10", - "license": "Apache-2.0", - "dependencies": { - "@jsonjoy.com/fs-core": "4.56.10", - "@jsonjoy.com/fs-node-builtins": "4.56.10", - "@jsonjoy.com/fs-node-utils": "4.56.10", - "thingies": "^2.5.0" - }, - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@jsonjoy.com/fs-node": { - "version": "4.56.10", - "license": "Apache-2.0", - "dependencies": { - "@jsonjoy.com/fs-core": "4.56.10", - "@jsonjoy.com/fs-node-builtins": "4.56.10", - "@jsonjoy.com/fs-node-utils": "4.56.10", - "@jsonjoy.com/fs-print": "4.56.10", - "@jsonjoy.com/fs-snapshot": "4.56.10", - "glob-to-regex.js": "^1.0.0", - "thingies": "^2.5.0" - }, - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@jsonjoy.com/fs-node-builtins": { - "version": "4.56.10", - "license": "Apache-2.0", - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@jsonjoy.com/fs-node-to-fsa": { - "version": "4.56.10", - "license": "Apache-2.0", - "dependencies": { - "@jsonjoy.com/fs-fsa": "4.56.10", - "@jsonjoy.com/fs-node-builtins": "4.56.10", - "@jsonjoy.com/fs-node-utils": "4.56.10" - }, - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@jsonjoy.com/fs-node-utils": { - "version": "4.56.10", - "license": "Apache-2.0", - "dependencies": { - "@jsonjoy.com/fs-node-builtins": "4.56.10" - }, - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@jsonjoy.com/fs-print": { - "version": "4.56.10", - "license": "Apache-2.0", - "dependencies": { - "@jsonjoy.com/fs-node-utils": "4.56.10", - "tree-dump": "^1.1.0" - }, - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@jsonjoy.com/fs-snapshot": { - "version": "4.56.10", - "license": "Apache-2.0", - "dependencies": { - "@jsonjoy.com/buffers": "^17.65.0", - "@jsonjoy.com/fs-node-utils": "4.56.10", - "@jsonjoy.com/json-pack": "^17.65.0", - "@jsonjoy.com/util": "^17.65.0" - }, - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/base64": { - "version": "17.65.0", - "license": "Apache-2.0", - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/codegen": { - "version": "17.65.0", - "license": "Apache-2.0", - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/json-pack": { - "version": "17.65.0", - "license": "Apache-2.0", - "dependencies": { - "@jsonjoy.com/base64": "17.65.0", - "@jsonjoy.com/buffers": "17.65.0", - "@jsonjoy.com/codegen": "17.65.0", - "@jsonjoy.com/json-pointer": "17.65.0", - "@jsonjoy.com/util": "17.65.0", - "hyperdyperid": "^1.2.0", - "thingies": "^2.5.0", - "tree-dump": "^1.1.0" - }, - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/json-pointer": { - "version": "17.65.0", - "license": "Apache-2.0", - "dependencies": { - "@jsonjoy.com/util": "17.65.0" - }, - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/util": { - "version": "17.65.0", - "license": "Apache-2.0", - "dependencies": { - "@jsonjoy.com/buffers": "17.65.0", - "@jsonjoy.com/codegen": "17.65.0" - }, - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@jsonjoy.com/json-pack": { - "version": "1.21.0", - "license": "Apache-2.0", - "dependencies": { - "@jsonjoy.com/base64": "^1.1.2", - "@jsonjoy.com/buffers": "^1.2.0", - "@jsonjoy.com/codegen": "^1.0.0", - "@jsonjoy.com/json-pointer": "^1.0.2", - "@jsonjoy.com/util": "^1.9.0", - "hyperdyperid": "^1.2.0", - "thingies": "^2.5.0", - "tree-dump": "^1.1.0" - }, - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@jsonjoy.com/json-pack/node_modules/@jsonjoy.com/buffers": { - "version": "1.2.1", - "license": "Apache-2.0", - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@jsonjoy.com/json-pointer": { - "version": "1.0.2", - "license": "Apache-2.0", - "dependencies": { - "@jsonjoy.com/codegen": "^1.0.0", - "@jsonjoy.com/util": "^1.9.0" - }, - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@jsonjoy.com/util": { - "version": "1.9.0", - "license": "Apache-2.0", - "dependencies": { - "@jsonjoy.com/buffers": "^1.0.0", - "@jsonjoy.com/codegen": "^1.0.0" - }, - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@jsonjoy.com/util/node_modules/@jsonjoy.com/buffers": { - "version": "1.2.1", - "license": "Apache-2.0", - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@leichtgewicht/ip-codec": { - "version": "2.0.5", - "license": "MIT" - }, - "node_modules/@mapbox/node-pre-gyp": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-2.0.3.tgz", - "integrity": "sha512-uwPAhccfFJlsfCxMYTwOdVfOz3xqyj8xYL3zJj8f0pb30tLohnnFPhLuqp4/qoEz8sNxe4SESZedcBojRefIzg==", - "license": "BSD-3-Clause", - "dependencies": { - "consola": "^3.2.3", - "detect-libc": "^2.0.0", - "https-proxy-agent": "^7.0.5", - "node-fetch": "^2.6.7", - "nopt": "^8.0.0", - "semver": "^7.5.3", - "tar": "^7.4.0" - }, - "bin": { - "node-pre-gyp": "bin/node-pre-gyp" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@mdx-js/mdx": { - "version": "3.1.1", - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0", - "@types/estree-jsx": "^1.0.0", - "@types/hast": "^3.0.0", - "@types/mdx": "^2.0.0", - "acorn": "^8.0.0", - "collapse-white-space": "^2.0.0", - "devlop": "^1.0.0", - "estree-util-is-identifier-name": "^3.0.0", - "estree-util-scope": "^1.0.0", - "estree-walker": "^3.0.0", - "hast-util-to-jsx-runtime": "^2.0.0", - "markdown-extensions": "^2.0.0", - "recma-build-jsx": "^1.0.0", - "recma-jsx": "^1.0.0", - "recma-stringify": "^1.0.0", - "rehype-recma": "^1.0.0", - "remark-mdx": "^3.0.0", - "remark-parse": "^11.0.0", - "remark-rehype": "^11.0.0", - "source-map": "^0.7.0", - "unified": "^11.0.0", - "unist-util-position-from-estree": "^2.0.0", - "unist-util-stringify-position": "^4.0.0", - "unist-util-visit": "^5.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/@mdx-js/react": { - "version": "3.1.1", - "license": "MIT", - "peer": true, - "dependencies": { - "@types/mdx": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - }, - "peerDependencies": { - "@types/react": ">=16", - "react": ">=16" - } - }, - "node_modules/@mixmark-io/domino": { - "version": "2.2.0", - "license": "BSD-2-Clause" - }, - "node_modules/@module-federation/error-codes": { - "version": "0.22.0", - "license": "MIT" - }, - "node_modules/@module-federation/runtime": { - "version": "0.22.0", - "license": "MIT", - "dependencies": { - "@module-federation/error-codes": "0.22.0", - "@module-federation/runtime-core": "0.22.0", - "@module-federation/sdk": "0.22.0" - } - }, - "node_modules/@module-federation/runtime-core": { - "version": "0.22.0", - "license": "MIT", - "dependencies": { - "@module-federation/error-codes": "0.22.0", - "@module-federation/sdk": "0.22.0" - } - }, - "node_modules/@module-federation/runtime-tools": { - "version": "0.22.0", - "license": "MIT", - "dependencies": { - "@module-federation/runtime": "0.22.0", - "@module-federation/webpack-bundler-runtime": "0.22.0" - } - }, - "node_modules/@module-federation/sdk": { - "version": "0.22.0", - "license": "MIT" - }, - "node_modules/@module-federation/webpack-bundler-runtime": { - "version": "0.22.0", - "license": "MIT", - "dependencies": { - "@module-federation/runtime": "0.22.0", - "@module-federation/sdk": "0.22.0" - } - }, - "node_modules/@napi-rs/keyring": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@napi-rs/keyring/-/keyring-1.2.0.tgz", - "integrity": "sha512-d0d4Oyxm+v980PEq1ZH2PmS6cvpMIRc17eYpiU47KgW+lzxklMu6+HOEOPmxrpnF/XQZ0+Q78I2mgMhbIIo/dg==", - "license": "MIT", - "engines": { - "node": ">= 10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Brooooooklyn" - }, - "optionalDependencies": { - "@napi-rs/keyring-darwin-arm64": "1.2.0", - "@napi-rs/keyring-darwin-x64": "1.2.0", - "@napi-rs/keyring-freebsd-x64": "1.2.0", - "@napi-rs/keyring-linux-arm-gnueabihf": "1.2.0", - "@napi-rs/keyring-linux-arm64-gnu": "1.2.0", - "@napi-rs/keyring-linux-arm64-musl": "1.2.0", - "@napi-rs/keyring-linux-riscv64-gnu": "1.2.0", - "@napi-rs/keyring-linux-x64-gnu": "1.2.0", - "@napi-rs/keyring-linux-x64-musl": "1.2.0", - "@napi-rs/keyring-win32-arm64-msvc": "1.2.0", - "@napi-rs/keyring-win32-ia32-msvc": "1.2.0", - "@napi-rs/keyring-win32-x64-msvc": "1.2.0" - } - }, - "node_modules/@napi-rs/keyring-darwin-arm64": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@napi-rs/keyring-darwin-arm64/-/keyring-darwin-arm64-1.2.0.tgz", - "integrity": "sha512-CA83rDeyONDADO25JLZsh3eHY8yTEtm/RS6ecPsY+1v+dSawzT9GywBMu2r6uOp1IEhQs/xAfxgybGAFr17lSA==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/keyring-darwin-x64": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@napi-rs/keyring-darwin-x64/-/keyring-darwin-x64-1.2.0.tgz", - "integrity": "sha512-dBHjtKRCj4ByfnfqIKIJLo3wueQNJhLRyuxtX/rR4K/XtcS7VLlRD01XXizjpre54vpmObj63w+ZpHG+mGM8uA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/keyring-freebsd-x64": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@napi-rs/keyring-freebsd-x64/-/keyring-freebsd-x64-1.2.0.tgz", - "integrity": "sha512-DPZFr11pNJSnaoh0dzSUNF+T6ORhy3CkzUT3uGixbA71cAOPJ24iG8e8QrLOkuC/StWrAku3gBnth2XMWOcR3Q==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/keyring-linux-arm-gnueabihf": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@napi-rs/keyring-linux-arm-gnueabihf/-/keyring-linux-arm-gnueabihf-1.2.0.tgz", - "integrity": "sha512-8xv6DyEMlvRdqJzp4F39RLUmmTQsLcGYYv/3eIfZNZN1O5257tHxTrFYqAsny659rJJK2EKeSa7PhrSibQqRWQ==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/keyring-linux-arm64-gnu": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@napi-rs/keyring-linux-arm64-gnu/-/keyring-linux-arm64-gnu-1.2.0.tgz", - "integrity": "sha512-Pu2V6Py+PBt7inryEecirl+t+ti8bhZphjP+W68iVaXHUxLdWmkgL9KI1VkbRHbx5k8K5Tew9OP218YfmVguIA==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/keyring-linux-arm64-musl": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@napi-rs/keyring-linux-arm64-musl/-/keyring-linux-arm64-musl-1.2.0.tgz", - "integrity": "sha512-8TDymrpC4P1a9iDEaegT7RnrkmrJN5eNZh3Im3UEV5PPYGtrb82CRxsuFohthCWQW81O483u1bu+25+XA4nKUw==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/keyring-linux-riscv64-gnu": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@napi-rs/keyring-linux-riscv64-gnu/-/keyring-linux-riscv64-gnu-1.2.0.tgz", - "integrity": "sha512-awsB5XI1MYL7fwfjMDGmKOWvNgJEO7mM7iVEMS0fO39f0kVJnOSjlu7RHcXAF0LOx+0VfF3oxbWqJmZbvRCRHw==", - "cpu": [ - "riscv64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/keyring-linux-x64-gnu": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@napi-rs/keyring-linux-x64-gnu/-/keyring-linux-x64-gnu-1.2.0.tgz", - "integrity": "sha512-8E+7z4tbxSJXxIBqA+vfB1CGajpCDRyTyqXkBig5NtASrv4YXcntSo96Iah2QDR5zD3dSTsmbqJudcj9rKKuHQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/keyring-linux-x64-musl": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@napi-rs/keyring-linux-x64-musl/-/keyring-linux-x64-musl-1.2.0.tgz", - "integrity": "sha512-8RZ8yVEnmWr/3BxKgBSzmgntI7lNEsY7xouNfOsQkuVAiCNmxzJwETspzK3PQ2FHtDxgz5vHQDEBVGMyM4hUHA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/keyring-win32-arm64-msvc": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@napi-rs/keyring-win32-arm64-msvc/-/keyring-win32-arm64-msvc-1.2.0.tgz", - "integrity": "sha512-AoqaDZpQ6KPE19VBLpxyORcp+yWmHI9Xs9Oo0PJ4mfHma4nFSLVdhAubJCxdlNptHe5va7ghGCHj3L9Akiv4cQ==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/keyring-win32-ia32-msvc": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@napi-rs/keyring-win32-ia32-msvc/-/keyring-win32-ia32-msvc-1.2.0.tgz", - "integrity": "sha512-EYL+EEI6bCsYi3LfwcQdnX3P/R76ENKNn+3PmpGheBsUFLuh0gQuP7aMVHM4rTw6UVe+L3vCLZSptq/oeacz0A==", - "cpu": [ - "ia32" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/keyring-win32-x64-msvc": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@napi-rs/keyring-win32-x64-msvc/-/keyring-win32-x64-msvc-1.2.0.tgz", - "integrity": "sha512-xFlx/TsmqmCwNU9v+AVnEJgoEAlBYgzFF5Ihz1rMpPAt4qQWWkMd4sCyM1gMJ1A/GnRqRegDiQpwaxGUHFtFbA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/wasm-runtime": { - "version": "1.0.7", - "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/core": "^1.5.0", - "@emnapi/runtime": "^1.5.0", - "@tybys/wasm-util": "^0.10.1" - } - }, - "node_modules/@noble/hashes": { - "version": "1.4.0", - "license": "MIT", - "engines": { - "node": ">= 16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "license": "MIT", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@oxc-project/types": { - "version": "0.110.0", - "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.110.0.tgz", - "integrity": "sha512-6Ct21OIlrEnFEJk5LT4e63pk3btsI6/TusD/GStLi7wYlGJNOl1GI9qvXAnRAxQU9zqA2Oz+UwhfTOU2rPZVow==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/Boshen" - } - }, - "node_modules/@oxc-transform/binding-android-arm-eabi": { - "version": "0.111.0", - "resolved": "https://registry.npmjs.org/@oxc-transform/binding-android-arm-eabi/-/binding-android-arm-eabi-0.111.0.tgz", - "integrity": "sha512-NdFLicvorfHYu0g2ftjVJaH7+Dz27AQUNJOq8t/ofRUoWmczOodgUCHx8C1M1htCN4ZmhS/FzfSy6yd/UngJGg==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxc-transform/binding-android-arm64": { - "version": "0.111.0", - "resolved": "https://registry.npmjs.org/@oxc-transform/binding-android-arm64/-/binding-android-arm64-0.111.0.tgz", - "integrity": "sha512-J2v9ajarD2FYlhHtjbgZUFsS2Kvi27pPxDWLGCy7i8tO60xBoozX9/ktSgbiE/QsxKaUhfv4zVKppKWUo71PmQ==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxc-transform/binding-darwin-arm64": { - "version": "0.111.0", - "resolved": "https://registry.npmjs.org/@oxc-transform/binding-darwin-arm64/-/binding-darwin-arm64-0.111.0.tgz", - "integrity": "sha512-2UYmExxpXzmiHTldhNlosWqG9Nc4US51K0GB9RLcGlTE23WO33vVo1NVAKwxPE+KYuhffwDnRYTovTMUjzwvZA==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxc-transform/binding-darwin-x64": { - "version": "0.111.0", - "resolved": "https://registry.npmjs.org/@oxc-transform/binding-darwin-x64/-/binding-darwin-x64-0.111.0.tgz", - "integrity": "sha512-c4YRwfLV8Pj/ToiTCbndZaHxM2BD4W3bltr/fjXZcGypEK+U2RZFDL7tIZYT/tyneAC9hCORZKDaKhLLNuzPtA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxc-transform/binding-freebsd-x64": { - "version": "0.111.0", - "resolved": "https://registry.npmjs.org/@oxc-transform/binding-freebsd-x64/-/binding-freebsd-x64-0.111.0.tgz", - "integrity": "sha512-prvf32IcEuLnLZbNVomFosBu0CaZpyj3YsZ6epbOgJy8iJjfLsXBb+PrkO/NBKzjuJoJa2+u7jFKRE0KT7gSOw==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxc-transform/binding-linux-arm-gnueabihf": { - "version": "0.111.0", - "resolved": "https://registry.npmjs.org/@oxc-transform/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-0.111.0.tgz", - "integrity": "sha512-+se3579Wp7VOk8TnTZCpT+obTAyzOw2b/UuoM0+51LtbzCSfjKxd4A+o7zRl7GyPrPZvx57KdbMOC9rWB1xNrw==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxc-transform/binding-linux-arm-musleabihf": { - "version": "0.111.0", - "resolved": "https://registry.npmjs.org/@oxc-transform/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-0.111.0.tgz", - "integrity": "sha512-8faC99pStqaSDPK/vBgaagAHUeL0LcIzfeSjSiDTtvPGc3AwZIeqC1tx3CP15a6tWXjdgS/IUw4IjfD5HweBlg==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxc-transform/binding-linux-arm64-gnu": { - "version": "0.111.0", - "resolved": "https://registry.npmjs.org/@oxc-transform/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-0.111.0.tgz", - "integrity": "sha512-HtfQv8j796gzI5WR/RaP6IMwFpiL0vYeDrUA1hYhlPzTHKYan/B+NlhJkKOI1v24yAl/yEnFmb0pxIxLNqBqBA==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxc-transform/binding-linux-arm64-musl": { - "version": "0.111.0", - "resolved": "https://registry.npmjs.org/@oxc-transform/binding-linux-arm64-musl/-/binding-linux-arm64-musl-0.111.0.tgz", - "integrity": "sha512-ARyfcMCIxVLDgLf6FQ8Oo1/TFySpnquV+vuSb4SFQZfYDqgMklzwv0NYXxWD0aB6enElyMDs6pQJBzusEKCkOg==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxc-transform/binding-linux-ppc64-gnu": { - "version": "0.111.0", - "resolved": "https://registry.npmjs.org/@oxc-transform/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-0.111.0.tgz", - "integrity": "sha512-PKpVRrSvBNK3tv9vwxn7Fay+QWZmprPGlEqJcseBJllQc5mFMD4Q/w44chu5iR9ZLsDeSHzmNWrgMLo4J0sP2A==", - "cpu": [ - "ppc64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxc-transform/binding-linux-riscv64-gnu": { - "version": "0.111.0", - "resolved": "https://registry.npmjs.org/@oxc-transform/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-0.111.0.tgz", - "integrity": "sha512-9bUml6rMgk+8GF5rvNMweFspkzSiCjqpV6HduwiUyexqfGKrmjq9IZOxxvnzkE2RGdQzP507NNDoVNYIoGQYuA==", - "cpu": [ - "riscv64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxc-transform/binding-linux-riscv64-musl": { - "version": "0.111.0", - "resolved": "https://registry.npmjs.org/@oxc-transform/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-0.111.0.tgz", - "integrity": "sha512-tzGCohGxaeH6KRJjfYZd4mHCoGjCai6N+zZi1Oj+tSDMAAdyvs1dRzYb8PNUGnybCg3Te4M0jLPzWZaSmnKraQ==", - "cpu": [ - "riscv64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxc-transform/binding-linux-s390x-gnu": { - "version": "0.111.0", - "resolved": "https://registry.npmjs.org/@oxc-transform/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-0.111.0.tgz", - "integrity": "sha512-sRG1KIfZ0ML9ToEygm5aM/5GJeBA05uHlgW3M0Rx/DNWMJhuahLmqWuB02aWSmijndLfEKXLLXIWhvWupRG8lg==", - "cpu": [ - "s390x" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxc-transform/binding-linux-x64-gnu": { - "version": "0.111.0", - "resolved": "https://registry.npmjs.org/@oxc-transform/binding-linux-x64-gnu/-/binding-linux-x64-gnu-0.111.0.tgz", - "integrity": "sha512-T0Kmvk+OdlUdABdXlDIf3MQReMzFfC75NEI9x8jxy5pKooACEFg0k0V8gyR3gq4DzbDCfucqFQDWNvSgIopAbQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxc-transform/binding-linux-x64-musl": { - "version": "0.111.0", - "resolved": "https://registry.npmjs.org/@oxc-transform/binding-linux-x64-musl/-/binding-linux-x64-musl-0.111.0.tgz", - "integrity": "sha512-EgoutsP3YfqzN8a9vpc9+XLr0bmBl0dA3uOMiP77+exATCPxJBkJErGmQkqk6RtTp5XqX6q6mB45qWQyKk6+pA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxc-transform/binding-openharmony-arm64": { - "version": "0.111.0", - "resolved": "https://registry.npmjs.org/@oxc-transform/binding-openharmony-arm64/-/binding-openharmony-arm64-0.111.0.tgz", - "integrity": "sha512-d8J+ejc0j5WODbVwR/QxFaI65YMwvG0W53vcVCHwa6ja1QI5lpe7sislrefG2EFYgnY47voMRzlXab5d4gEcDw==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxc-transform/binding-wasm32-wasi": { - "version": "0.111.0", - "resolved": "https://registry.npmjs.org/@oxc-transform/binding-wasm32-wasi/-/binding-wasm32-wasi-0.111.0.tgz", - "integrity": "sha512-HtyIZO8IwuZgXkyb56rysLz1OLbfLhEu8A3BeuyJXzUseAj96yuxgGt3cu3QYX9AXb9pfRfA3c/fvlhsDugyTQ==", - "cpu": [ - "wasm32" - ], - "license": "MIT", - "optional": true, - "dependencies": { - "@napi-rs/wasm-runtime": "^1.1.1" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@oxc-transform/binding-wasm32-wasi/node_modules/@napi-rs/wasm-runtime": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.6.tgz", - "integrity": "sha512-ZLv/JdUfkvOy9eCnnBaGfiO+XimbjebAeO+MRQqD/B+FR1tnRN0tpKSJHRbE8sFfS6aqsXZ67TQjfwfsxULVbg==", - "license": "MIT", - "optional": true, - "dependencies": { - "@tybys/wasm-util": "^0.10.3" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Brooooooklyn" - }, - "peerDependencies": { - "@emnapi/core": "^1.7.1", - "@emnapi/runtime": "^1.7.1" - } - }, - "node_modules/@oxc-transform/binding-win32-arm64-msvc": { - "version": "0.111.0", - "resolved": "https://registry.npmjs.org/@oxc-transform/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-0.111.0.tgz", - "integrity": "sha512-YeP80Riptc0MkVVBnzbmoFuHVLUq278+MbwNo9sTLALmzTIJxJqN029xRZbG+Bun7aLsoZhmRnm3J5JZ1NcP5w==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxc-transform/binding-win32-ia32-msvc": { - "version": "0.111.0", - "resolved": "https://registry.npmjs.org/@oxc-transform/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-0.111.0.tgz", - "integrity": "sha512-A6ztCXpoSHt6PbvGAFqB0MLOcGG7ZJrrPXY1iB0zfOB1atLgI8oNePGxPl03XSbwpiTsFJ1oo8rj9DXcBzgT9g==", - "cpu": [ - "ia32" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxc-transform/binding-win32-x64-msvc": { - "version": "0.111.0", - "resolved": "https://registry.npmjs.org/@oxc-transform/binding-win32-x64-msvc/-/binding-win32-x64-msvc-0.111.0.tgz", - "integrity": "sha512-QddKW4kBH0Wof6Y65eYCNHM4iOGmCTWLLcNYY1FGswhzmTYOUVXajNROR+iCXAOFnOF0ldtsR79SyqgyHH1Bgg==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@peculiar/asn1-cms": { - "version": "2.6.0", - "license": "MIT", - "dependencies": { - "@peculiar/asn1-schema": "^2.6.0", - "@peculiar/asn1-x509": "^2.6.0", - "@peculiar/asn1-x509-attr": "^2.6.0", - "asn1js": "^3.0.6", - "tslib": "^2.8.1" - } - }, - "node_modules/@peculiar/asn1-csr": { - "version": "2.6.0", - "license": "MIT", - "dependencies": { - "@peculiar/asn1-schema": "^2.6.0", - "@peculiar/asn1-x509": "^2.6.0", - "asn1js": "^3.0.6", - "tslib": "^2.8.1" - } - }, - "node_modules/@peculiar/asn1-ecc": { - "version": "2.6.0", - "license": "MIT", - "dependencies": { - "@peculiar/asn1-schema": "^2.6.0", - "@peculiar/asn1-x509": "^2.6.0", - "asn1js": "^3.0.6", - "tslib": "^2.8.1" - } - }, - "node_modules/@peculiar/asn1-pfx": { - "version": "2.6.0", - "license": "MIT", - "dependencies": { - "@peculiar/asn1-cms": "^2.6.0", - "@peculiar/asn1-pkcs8": "^2.6.0", - "@peculiar/asn1-rsa": "^2.6.0", - "@peculiar/asn1-schema": "^2.6.0", - "asn1js": "^3.0.6", - "tslib": "^2.8.1" - } - }, - "node_modules/@peculiar/asn1-pkcs8": { - "version": "2.6.0", - "license": "MIT", - "dependencies": { - "@peculiar/asn1-schema": "^2.6.0", - "@peculiar/asn1-x509": "^2.6.0", - "asn1js": "^3.0.6", - "tslib": "^2.8.1" - } - }, - "node_modules/@peculiar/asn1-pkcs9": { - "version": "2.6.0", - "license": "MIT", - "dependencies": { - "@peculiar/asn1-cms": "^2.6.0", - "@peculiar/asn1-pfx": "^2.6.0", - "@peculiar/asn1-pkcs8": "^2.6.0", - "@peculiar/asn1-schema": "^2.6.0", - "@peculiar/asn1-x509": "^2.6.0", - "@peculiar/asn1-x509-attr": "^2.6.0", - "asn1js": "^3.0.6", - "tslib": "^2.8.1" - } - }, - "node_modules/@peculiar/asn1-rsa": { - "version": "2.6.0", - "license": "MIT", - "dependencies": { - "@peculiar/asn1-schema": "^2.6.0", - "@peculiar/asn1-x509": "^2.6.0", - "asn1js": "^3.0.6", - "tslib": "^2.8.1" - } - }, - "node_modules/@peculiar/asn1-schema": { - "version": "2.6.0", - "license": "MIT", - "dependencies": { - "asn1js": "^3.0.6", - "pvtsutils": "^1.3.6", - "tslib": "^2.8.1" - } - }, - "node_modules/@peculiar/asn1-x509": { - "version": "2.6.0", - "license": "MIT", - "dependencies": { - "@peculiar/asn1-schema": "^2.6.0", - "asn1js": "^3.0.6", - "pvtsutils": "^1.3.6", - "tslib": "^2.8.1" - } - }, - "node_modules/@peculiar/asn1-x509-attr": { - "version": "2.6.0", - "license": "MIT", - "dependencies": { - "@peculiar/asn1-schema": "^2.6.0", - "@peculiar/asn1-x509": "^2.6.0", - "asn1js": "^3.0.6", - "tslib": "^2.8.1" - } - }, - "node_modules/@peculiar/x509": { - "version": "1.14.3", - "license": "MIT", - "dependencies": { - "@peculiar/asn1-cms": "^2.6.0", - "@peculiar/asn1-csr": "^2.6.0", - "@peculiar/asn1-ecc": "^2.6.0", - "@peculiar/asn1-pkcs9": "^2.6.0", - "@peculiar/asn1-rsa": "^2.6.0", - "@peculiar/asn1-schema": "^2.6.0", - "@peculiar/asn1-x509": "^2.6.0", - "pvtsutils": "^1.3.6", - "reflect-metadata": "^0.2.2", - "tslib": "^2.8.1", - "tsyringe": "^4.10.0" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@pnpm/config.env-replace": { - "version": "1.1.0", - "license": "MIT", - "engines": { - "node": ">=12.22.0" - } - }, - "node_modules/@pnpm/network.ca-file": { - "version": "1.0.2", - "license": "MIT", - "dependencies": { - "graceful-fs": "4.2.10" - }, - "engines": { - "node": ">=12.22.0" - } - }, - "node_modules/@pnpm/network.ca-file/node_modules/graceful-fs": { - "version": "4.2.10", - "license": "ISC" - }, - "node_modules/@pnpm/npm-conf": { - "version": "3.0.2", - "license": "MIT", - "dependencies": { - "@pnpm/config.env-replace": "^1.1.0", - "@pnpm/network.ca-file": "^1.0.1", - "config-chain": "^1.1.11" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@polka/url": { - "version": "1.0.0-next.29", - "license": "MIT" - }, - "node_modules/@renovatebot/pep440": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@renovatebot/pep440/-/pep440-4.2.1.tgz", - "integrity": "sha512-2FK1hF93Fuf1laSdfiEmJvSJPVIDHEUTz68D3Fi9s0IZrrpaEcj6pTFBTbYvsgC5du4ogrtf5re7yMMvrKNgkw==", - "license": "Apache-2.0", - "engines": { - "node": "^20.9.0 || ^22.11.0 || ^24", - "pnpm": "^10.0.0" - } - }, - "node_modules/@rolldown/binding-android-arm64": { - "version": "1.0.0-rc.1", - "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.0-rc.1.tgz", - "integrity": "sha512-He6ZoCfv5D7dlRbrhNBkuMVIHd0GDnjJwbICE1OWpG7G3S2gmJ+eXkcNLJjzjNDpeI2aRy56ou39AJM9AD8YFA==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-darwin-arm64": { - "version": "1.0.0-rc.1", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.0-rc.1.tgz", - "integrity": "sha512-YzJdn08kSOXnj85ghHauH2iHpOJ6eSmstdRTLyaziDcUxe9SyQJgGyx/5jDIhDvtOcNvMm2Ju7m19+S/Rm1jFg==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-darwin-x64": { - "version": "1.0.0-rc.1", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.0-rc.1.tgz", - "integrity": "sha512-cIvAbqM+ZVV6lBSKSBtlNqH5iCiW933t1q8j0H66B3sjbe8AxIRetVqfGgcHcJtMzBIkIALlL9fcDrElWLJQcQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-freebsd-x64": { - "version": "1.0.0-rc.1", - "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.0-rc.1.tgz", - "integrity": "sha512-rVt+B1B/qmKwCl1XD02wKfgh3vQPXRXdB/TicV2w6g7RVAM1+cZcpigwhLarqiVCxDObFZ7UgXCxPC7tpDoRog==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-arm-gnueabihf": { - "version": "1.0.0-rc.1", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.0-rc.1.tgz", - "integrity": "sha512-69YKwJJBOFprQa1GktPgbuBOfnn+EGxu8sBJ1TjPER+zhSpYeaU4N07uqmyBiksOLGXsMegymuecLobfz03h8Q==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-arm64-gnu": { - "version": "1.0.0-rc.1", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.0-rc.1.tgz", - "integrity": "sha512-9JDhHUf3WcLfnViFWm+TyorqUtnSAHaCzlSNmMOq824prVuuzDOK91K0Hl8DUcEb9M5x2O+d2/jmBMsetRIn3g==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-arm64-musl": { - "version": "1.0.0-rc.1", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.0-rc.1.tgz", - "integrity": "sha512-UvApLEGholmxw/HIwmUnLq3CwdydbhaHHllvWiCTNbyGom7wTwOtz5OAQbAKZYyiEOeIXZNPkM7nA4Dtng7CLw==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-x64-gnu": { - "version": "1.0.0-rc.1", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.0-rc.1.tgz", - "integrity": "sha512-uVctNgZHiGnJx5Fij7wHLhgw4uyZBVi6mykeWKOqE7bVy9Hcxn0fM/IuqdMwk6hXlaf9fFShDTFz2+YejP+x0A==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-x64-musl": { - "version": "1.0.0-rc.1", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.0-rc.1.tgz", - "integrity": "sha512-T6Eg0xWwcxd/MzBcuv4Z37YVbUbJxy5cMNnbIt/Yr99wFwli30O4BPlY8hKeGyn6lWNtU0QioBS46lVzDN38bg==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-openharmony-arm64": { - "version": "1.0.0-rc.1", - "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.0-rc.1.tgz", - "integrity": "sha512-PuGZVS2xNJyLADeh2F04b+Cz4NwvpglbtWACgrDOa5YDTEHKwmiTDjoD5eZ9/ptXtcpeFrMqD2H4Zn33KAh1Eg==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-wasm32-wasi": { - "version": "1.0.0-rc.1", - "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.0-rc.1.tgz", - "integrity": "sha512-2mOxY562ihHlz9lEXuaGEIDCZ1vI+zyFdtsoa3M62xsEunDXQE+DVPO4S4x5MPK9tKulG/aFcA/IH5eVN257Cw==", - "cpu": [ - "wasm32" - ], - "license": "MIT", - "optional": true, - "dependencies": { - "@napi-rs/wasm-runtime": "^1.1.1" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@rolldown/binding-wasm32-wasi/node_modules/@napi-rs/wasm-runtime": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.6.tgz", - "integrity": "sha512-ZLv/JdUfkvOy9eCnnBaGfiO+XimbjebAeO+MRQqD/B+FR1tnRN0tpKSJHRbE8sFfS6aqsXZ67TQjfwfsxULVbg==", - "license": "MIT", - "optional": true, - "dependencies": { - "@tybys/wasm-util": "^0.10.3" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Brooooooklyn" - }, - "peerDependencies": { - "@emnapi/core": "^1.7.1", - "@emnapi/runtime": "^1.7.1" - } - }, - "node_modules/@rolldown/binding-win32-arm64-msvc": { - "version": "1.0.0-rc.1", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.0-rc.1.tgz", - "integrity": "sha512-oQVOP5cfAWZwRD0Q3nGn/cA9FW3KhMMuQ0NIndALAe6obqjLhqYVYDiGGRGrxvnjJsVbpLwR14gIUYnpIcHR1g==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-win32-x64-msvc": { - "version": "1.0.0-rc.1", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.0-rc.1.tgz", - "integrity": "sha512-Ydsxxx++FNOuov3wCBPaYjZrEvKOOGq3k+BF4BPridhg2pENfitSRD2TEuQ8i33bp5VptuNdC9IzxRKU031z5A==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/pluginutils": { - "version": "1.0.0-rc.1", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.1.tgz", - "integrity": "sha512-UTBjtTxVOhodhzFVp/ayITaTETRHPUPYZPXQe0WU0wOgxghMojXxYjOiPOauKIYNWJAWS2fd7gJgGQK8GU8vDA==", - "license": "MIT" - }, - "node_modules/@rollup/pluginutils": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.4.0.tgz", - "integrity": "sha512-MfPp06CjRLfXQ3wY0R8vJDYBy/MvVcc9OulEfR0B8Iv9ko+GCNaRZ+EpJYFl27LhKsZK0o420sYCRHCjfCgeUg==", - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0", - "estree-walker": "^2.0.2", - "picomatch": "^4.0.2" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, - "node_modules/@rollup/pluginutils/node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "license": "MIT" - }, - "node_modules/@rspack/binding": { - "version": "1.7.11", - "license": "MIT", - "optionalDependencies": { - "@rspack/binding-darwin-arm64": "1.7.11", - "@rspack/binding-darwin-x64": "1.7.11", - "@rspack/binding-linux-arm64-gnu": "1.7.11", - "@rspack/binding-linux-arm64-musl": "1.7.11", - "@rspack/binding-linux-x64-gnu": "1.7.11", - "@rspack/binding-linux-x64-musl": "1.7.11", - "@rspack/binding-wasm32-wasi": "1.7.11", - "@rspack/binding-win32-arm64-msvc": "1.7.11", - "@rspack/binding-win32-ia32-msvc": "1.7.11", - "@rspack/binding-win32-x64-msvc": "1.7.11" - } - }, - "node_modules/@rspack/binding-darwin-arm64": { - "version": "1.7.11", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rspack/binding-darwin-x64": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@rspack/binding-darwin-x64/-/binding-darwin-x64-1.7.11.tgz", - "integrity": "sha512-a1+TtTE9ap6RalgFi7FGIgkJP6O4Vy6ctv+9WGJy53E4kuqHR0RygzaiVxCI/GMc/vBT9vY23hyrpWb3d1vtXA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rspack/binding-linux-arm64-gnu": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@rspack/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.7.11.tgz", - "integrity": "sha512-P0QrGRPbTWu6RKWfN0bDtbnEps3rXH0MWIMreZABoUrVmNQKtXR6e73J3ub6a+di5s2+K0M2LJ9Bh2/H4UsDUA==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rspack/binding-linux-arm64-musl": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@rspack/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.7.11.tgz", - "integrity": "sha512-6ky7R43VMjWwmx3Yx7Jl7faLBBMAgMDt+/bN35RgwjiPgsIByz65EwytUVuW9rikB43BGHvA/eqlnjLrUzNBqw==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rspack/binding-linux-x64-gnu": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@rspack/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.7.11.tgz", - "integrity": "sha512-cuOJMfCOvb2Wgsry5enXJ3iT1FGUjdPqtGUBVupQlEG4ntSYsQ2PtF4wIDVasR3wdxC5nQbipOrDiN/u6fYsdQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rspack/binding-linux-x64-musl": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@rspack/binding-linux-x64-musl/-/binding-linux-x64-musl-1.7.11.tgz", - "integrity": "sha512-CoK37hva4AmHGh3VCsQXmGr40L36m1/AdnN5LEjUX6kx5rEH7/1nEBN6Ii72pejqDVvk9anEROmPDiPw10tpFg==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rspack/binding-wasm32-wasi": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@rspack/binding-wasm32-wasi/-/binding-wasm32-wasi-1.7.11.tgz", - "integrity": "sha512-OtrmnPUVJMxjNa3eDMfHyPdtlLRmmp/aIm0fQHlAOATbZvlGm12q7rhPW5BXTu1yh+1rQ1/uqvz+SzKEZXuJaQ==", - "cpu": [ - "wasm32" - ], - "license": "MIT", - "optional": true, - "dependencies": { - "@napi-rs/wasm-runtime": "1.0.7" - } - }, - "node_modules/@rspack/binding-win32-arm64-msvc": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@rspack/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.7.11.tgz", - "integrity": "sha512-lObFW6e5lCWNgTBNwT//yiEDbsxm9QG4BYUojqeXxothuzJ/L6ibXz6+gLMvbOvLGV3nKgkXmx8GvT9WDKR0mA==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rspack/binding-win32-ia32-msvc": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@rspack/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.7.11.tgz", - "integrity": "sha512-0pYGnZd8PPqNR68zQ8skamqNAXEA1sUfXuAdYcknIIRq2wsbiwFzIc0Pov1cIfHYab37G7sSIPBiOUdOWF5Ivw==", - "cpu": [ - "ia32" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rspack/binding-win32-x64-msvc": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@rspack/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.7.11.tgz", - "integrity": "sha512-EeQXayoQk/uBkI3pdoXfQBXNIUrADq56L3s/DFyM2pJeUDrWmhfIw2UFIGkYPTMSCo8F2JcdcGM32FGJrSnU0Q==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rspack/core": { - "version": "1.7.11", - "license": "MIT", - "dependencies": { - "@module-federation/runtime-tools": "0.22.0", - "@rspack/binding": "1.7.11", - "@rspack/lite-tapable": "1.1.0" - }, - "engines": { - "node": ">=18.12.0" - }, - "peerDependencies": { - "@swc/helpers": ">=0.5.1" - }, - "peerDependenciesMeta": { - "@swc/helpers": { - "optional": true - } - } - }, - "node_modules/@rspack/lite-tapable": { - "version": "1.1.0", - "license": "MIT" - }, - "node_modules/@sideway/address": { - "version": "4.1.5", - "license": "BSD-3-Clause", - "dependencies": { - "@hapi/hoek": "^9.0.0" - } - }, - "node_modules/@sideway/formula": { - "version": "3.0.1", - "license": "BSD-3-Clause" - }, - "node_modules/@sideway/pinpoint": { - "version": "2.0.0", - "license": "BSD-3-Clause" - }, - "node_modules/@sinclair/typebox": { - "version": "0.27.10", - "license": "MIT" - }, - "node_modules/@sindresorhus/is": { - "version": "4.6.0", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" - } - }, - "node_modules/@slorber/remark-comment": { - "version": "1.0.0", - "license": "MIT", - "dependencies": { - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.1.0", - "micromark-util-symbol": "^1.0.1" - } - }, - "node_modules/@svgr/babel-plugin-add-jsx-attribute": { - "version": "8.0.0", - "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-plugin-remove-jsx-attribute": { - "version": "8.0.0", - "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": { - "version": "8.0.0", - "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { - "version": "8.0.0", - "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-plugin-svg-dynamic-title": { - "version": "8.0.0", - "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-plugin-svg-em-dimensions": { - "version": "8.0.0", - "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-plugin-transform-react-native-svg": { - "version": "8.1.0", - "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-plugin-transform-svg-component": { - "version": "8.0.0", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-preset": { - "version": "8.1.0", - "license": "MIT", - "dependencies": { - "@svgr/babel-plugin-add-jsx-attribute": "8.0.0", - "@svgr/babel-plugin-remove-jsx-attribute": "8.0.0", - "@svgr/babel-plugin-remove-jsx-empty-expression": "8.0.0", - "@svgr/babel-plugin-replace-jsx-attribute-value": "8.0.0", - "@svgr/babel-plugin-svg-dynamic-title": "8.0.0", - "@svgr/babel-plugin-svg-em-dimensions": "8.0.0", - "@svgr/babel-plugin-transform-react-native-svg": "8.1.0", - "@svgr/babel-plugin-transform-svg-component": "8.0.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/core": { - "version": "8.1.0", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/core": "^7.21.3", - "@svgr/babel-preset": "8.1.0", - "camelcase": "^6.2.0", - "cosmiconfig": "^8.1.3", - "snake-case": "^3.0.4" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/hast-util-to-babel-ast": { - "version": "8.0.0", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.21.3", - "entities": "^4.4.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/plugin-jsx": { - "version": "8.1.0", - "license": "MIT", - "dependencies": { - "@babel/core": "^7.21.3", - "@svgr/babel-preset": "8.1.0", - "@svgr/hast-util-to-babel-ast": "8.0.0", - "svg-parser": "^2.0.4" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@svgr/core": "*" - } - }, - "node_modules/@svgr/plugin-svgo": { - "version": "8.1.0", - "license": "MIT", - "dependencies": { - "cosmiconfig": "^8.1.3", - "deepmerge": "^4.3.1", - "svgo": "^3.0.2" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@svgr/core": "*" - } - }, - "node_modules/@svgr/webpack": { - "version": "8.1.0", - "license": "MIT", - "dependencies": { - "@babel/core": "^7.21.3", - "@babel/plugin-transform-react-constant-elements": "^7.21.3", - "@babel/preset-env": "^7.20.2", - "@babel/preset-react": "^7.18.6", - "@babel/preset-typescript": "^7.21.0", - "@svgr/core": "8.1.0", - "@svgr/plugin-jsx": "8.1.0", - "@svgr/plugin-svgo": "8.1.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@swc/core": { - "version": "1.15.11", - "hasInstallScript": true, - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@swc/counter": "^0.1.3", - "@swc/types": "^0.1.25" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/swc" - }, - "optionalDependencies": { - "@swc/core-darwin-arm64": "1.15.11", - "@swc/core-darwin-x64": "1.15.11", - "@swc/core-linux-arm-gnueabihf": "1.15.11", - "@swc/core-linux-arm64-gnu": "1.15.11", - "@swc/core-linux-arm64-musl": "1.15.11", - "@swc/core-linux-x64-gnu": "1.15.11", - "@swc/core-linux-x64-musl": "1.15.11", - "@swc/core-win32-arm64-msvc": "1.15.11", - "@swc/core-win32-ia32-msvc": "1.15.11", - "@swc/core-win32-x64-msvc": "1.15.11" - }, - "peerDependencies": { - "@swc/helpers": ">=0.5.17" - }, - "peerDependenciesMeta": { - "@swc/helpers": { - "optional": true - } - } - }, - "node_modules/@swc/core-darwin-arm64": { - "version": "1.15.11", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-darwin-x64": { - "version": "1.15.11", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.15.11.tgz", - "integrity": "sha512-S52Gu1QtPSfBYDiejlcfp9GlN+NjTZBRRNsz8PNwBgSE626/FUf2PcllVUix7jqkoMC+t0rS8t+2/aSWlMuQtA==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-linux-arm-gnueabihf": { - "version": "1.15.11", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.15.11.tgz", - "integrity": "sha512-lXJs8oXo6Z4yCpimpQ8vPeCjkgoHu5NoMvmJZ8qxDyU99KVdg6KwU9H79vzrmB+HfH+dCZ7JGMqMF//f8Cfvdg==", - "cpu": [ - "arm" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-linux-arm64-gnu": { - "version": "1.15.11", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.15.11.tgz", - "integrity": "sha512-chRsz1K52/vj8Mfq/QOugVphlKPWlMh10V99qfH41hbGvwAU6xSPd681upO4bKiOr9+mRIZZW+EfJqY42ZzRyA==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-linux-arm64-musl": { - "version": "1.15.11", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.15.11.tgz", - "integrity": "sha512-PYftgsTaGnfDK4m6/dty9ryK1FbLk+LosDJ/RJR2nkXGc8rd+WenXIlvHjWULiBVnS1RsjHHOXmTS4nDhe0v0w==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-linux-x64-gnu": { - "version": "1.15.11", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.15.11.tgz", - "integrity": "sha512-DKtnJKIHiZdARyTKiX7zdRjiDS1KihkQWatQiCHMv+zc2sfwb4Glrodx2VLOX4rsa92NLR0Sw8WLcPEMFY1szQ==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-linux-x64-musl": { - "version": "1.15.11", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.15.11.tgz", - "integrity": "sha512-mUjjntHj4+8WBaiDe5UwRNHuEzLjIWBTSGTw0JT9+C9/Yyuh4KQqlcEQ3ro6GkHmBGXBFpGIj/o5VMyRWfVfWw==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-win32-arm64-msvc": { - "version": "1.15.11", - "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.15.11.tgz", - "integrity": "sha512-ZkNNG5zL49YpaFzfl6fskNOSxtcZ5uOYmWBkY4wVAvgbSAQzLRVBp+xArGWh2oXlY/WgL99zQSGTv7RI5E6nzA==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-win32-ia32-msvc": { - "version": "1.15.11", - "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.15.11.tgz", - "integrity": "sha512-6XnzORkZCQzvTQ6cPrU7iaT9+i145oLwnin8JrfsLG41wl26+5cNQ2XV3zcbrnFEV6esjOceom9YO1w9mGJByw==", - "cpu": [ - "ia32" - ], - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-win32-x64-msvc": { - "version": "1.15.11", - "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.15.11.tgz", - "integrity": "sha512-IQ2n6af7XKLL6P1gIeZACskSxK8jWtoKpJWLZmdXTDj1MGzktUy4i+FvpdtxFmJWNavRWH1VmTr6kAubRDHeKw==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/counter": { - "version": "0.1.3", - "license": "Apache-2.0" - }, - "node_modules/@swc/html": { - "version": "1.15.24", - "license": "Apache-2.0", - "dependencies": { - "@swc/counter": "^0.1.3" - }, - "engines": { - "node": ">=14" - }, - "optionalDependencies": { - "@swc/html-darwin-arm64": "1.15.24", - "@swc/html-darwin-x64": "1.15.24", - "@swc/html-linux-arm-gnueabihf": "1.15.24", - "@swc/html-linux-arm64-gnu": "1.15.24", - "@swc/html-linux-arm64-musl": "1.15.24", - "@swc/html-linux-ppc64-gnu": "1.15.24", - "@swc/html-linux-s390x-gnu": "1.15.24", - "@swc/html-linux-x64-gnu": "1.15.24", - "@swc/html-linux-x64-musl": "1.15.24", - "@swc/html-win32-arm64-msvc": "1.15.24", - "@swc/html-win32-ia32-msvc": "1.15.24", - "@swc/html-win32-x64-msvc": "1.15.24" - } - }, - "node_modules/@swc/html-darwin-arm64": { - "version": "1.15.24", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/html-darwin-x64": { - "version": "1.15.24", - "resolved": "https://registry.npmjs.org/@swc/html-darwin-x64/-/html-darwin-x64-1.15.24.tgz", - "integrity": "sha512-1k4Wl1eExT9yal3fX6MGcrpWOvYo+f7jnzw+ksg+8ifpYqpcrcy6Rv6cB78SgXzZJRpx8zBY1luk+zYyoDlrWA==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/html-linux-arm-gnueabihf": { - "version": "1.15.24", - "resolved": "https://registry.npmjs.org/@swc/html-linux-arm-gnueabihf/-/html-linux-arm-gnueabihf-1.15.24.tgz", - "integrity": "sha512-XbqWgyBE6tukUs+0zwzW+Xo3N/P6SoiJJ44QfB3RCb5Naz/1vwJbNgn9erFDgoq7CChmCooFuMfNnmh/E/Orsg==", - "cpu": [ - "arm" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/html-linux-arm64-gnu": { - "version": "1.15.24", - "resolved": "https://registry.npmjs.org/@swc/html-linux-arm64-gnu/-/html-linux-arm64-gnu-1.15.24.tgz", - "integrity": "sha512-GqJgkJHTlLM0tzJHX0tmU0ZAU4rIfMYZ2yJwCBwnFaLw4NacpimyWnWGJxH83SViVZ33DfLD2LG/dHN8xDAmRA==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/html-linux-arm64-musl": { - "version": "1.15.24", - "resolved": "https://registry.npmjs.org/@swc/html-linux-arm64-musl/-/html-linux-arm64-musl-1.15.24.tgz", - "integrity": "sha512-+7Xw69Y4p/LwhudMJZOQ++mKeXWTnh3vpNv5Ar+X1x8kfPBHKRXI3sRKf5JqE0oJqJXTgFP5xByzmO/KBee3sQ==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/html-linux-ppc64-gnu": { - "version": "1.15.24", - "resolved": "https://registry.npmjs.org/@swc/html-linux-ppc64-gnu/-/html-linux-ppc64-gnu-1.15.24.tgz", - "integrity": "sha512-ZKxckgQkOY2a54jiCnIBs5TkMNx7zvuKbe1WsM/WV0BiTfMfw5iMmtCKAIuYCz/PJRXVK0dY4VH3DS7jabBvwg==", - "cpu": [ - "ppc64" - ], - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/html-linux-s390x-gnu": { - "version": "1.15.24", - "resolved": "https://registry.npmjs.org/@swc/html-linux-s390x-gnu/-/html-linux-s390x-gnu-1.15.24.tgz", - "integrity": "sha512-y0WBjqDZALqOzasxrEOlgHq6SX34nAE4+0MATufmSoFEdiQIBYkm9m4C8XQNCNHv52ERCu/EPGK3Q8RfXaBLhQ==", - "cpu": [ - "s390x" - ], - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/html-linux-x64-gnu": { - "version": "1.15.24", - "resolved": "https://registry.npmjs.org/@swc/html-linux-x64-gnu/-/html-linux-x64-gnu-1.15.24.tgz", - "integrity": "sha512-U//u302yBSgh6vFfJmrw17Xm7k9a17m/E3AcHK4w12CZOFtsKHQnxE3i9uFWhNbW5F70w2A9QENml5b0Us8XMg==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/html-linux-x64-musl": { - "version": "1.15.24", - "resolved": "https://registry.npmjs.org/@swc/html-linux-x64-musl/-/html-linux-x64-musl-1.15.24.tgz", - "integrity": "sha512-U9gsAQCPiCROWKhLhSnW4JzkkOY6X4q0ZP/nA6UeKoahDdw4E8onPujtRSivt4ZxwdJKfAnsxeJY07V9YLZu9Q==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/html-win32-arm64-msvc": { - "version": "1.15.24", - "resolved": "https://registry.npmjs.org/@swc/html-win32-arm64-msvc/-/html-win32-arm64-msvc-1.15.24.tgz", - "integrity": "sha512-AETh78z9ig4e1eAlx8a02BnIS5iNIJ7C43swQsxMraSDZvZuBxnvEXHqnt94jRlw7fzmJRRpJdVcInQ21u/xGA==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/html-win32-ia32-msvc": { - "version": "1.15.24", - "resolved": "https://registry.npmjs.org/@swc/html-win32-ia32-msvc/-/html-win32-ia32-msvc-1.15.24.tgz", - "integrity": "sha512-ymJkEATvFF1+So41/SkulPBoRzRXP6HxUGfvdSJ29qeYejxWMrIWyjDE1+vAalo4IAR0cWFE2Ef2A2Qeg8QbGA==", - "cpu": [ - "ia32" - ], - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/html-win32-x64-msvc": { - "version": "1.15.24", - "resolved": "https://registry.npmjs.org/@swc/html-win32-x64-msvc/-/html-win32-x64-msvc-1.15.24.tgz", - "integrity": "sha512-l+Gv0+jcSaDILljpEMC8pQE+ubRoZcft+woUgKTTlJQEFS+MgxKKLQjNCXx3hzhuru5/Yo8x71Ng/aVT7PwprA==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/types": { - "version": "0.1.25", - "license": "Apache-2.0", - "dependencies": { - "@swc/counter": "^0.1.3" - } - }, - "node_modules/@szmarczak/http-timer": { - "version": "5.0.1", - "license": "MIT", - "dependencies": { - "defer-to-connect": "^2.0.1" - }, - "engines": { - "node": ">=14.16" - } - }, - "node_modules/@tootallnate/once": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", - "license": "MIT", - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tootallnate/quickjs-emscripten": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz", - "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==", - "license": "MIT" - }, - "node_modules/@ts-morph/common": { - "version": "0.11.1", - "license": "MIT", - "dependencies": { - "fast-glob": "^3.2.7", - "minimatch": "^3.0.4", - "mkdirp": "^1.0.4", - "path-browserify": "^1.0.1" - } - }, - "node_modules/@ts-morph/common/node_modules/minimatch": { - "version": "3.1.2", - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/@tybys/wasm-util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.3.tgz", - "integrity": "sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==", - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@types/body-parser": { - "version": "1.19.6", - "license": "MIT", - "dependencies": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "node_modules/@types/bonjour": { - "version": "3.5.13", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/connect": { - "version": "3.4.38", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/connect-history-api-fallback": { - "version": "1.5.4", - "license": "MIT", - "dependencies": { - "@types/express-serve-static-core": "*", - "@types/node": "*" - } - }, - "node_modules/@types/debug": { - "version": "4.1.13", - "license": "MIT", - "dependencies": { - "@types/ms": "*" - } - }, - "node_modules/@types/eslint": { - "version": "9.6.1", - "license": "MIT", - "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "node_modules/@types/eslint-scope": { - "version": "3.7.7", - "license": "MIT", - "dependencies": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, - "node_modules/@types/estree": { - "version": "1.0.8", - "license": "MIT" - }, - "node_modules/@types/estree-jsx": { - "version": "1.0.5", - "license": "MIT", - "dependencies": { - "@types/estree": "*" - } - }, - "node_modules/@types/express": { - "version": "4.17.25", - "license": "MIT", - "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.33", - "@types/qs": "*", - "@types/serve-static": "^1" - } - }, - "node_modules/@types/express-serve-static-core": { - "version": "4.19.8", - "license": "MIT", - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" - } - }, - "node_modules/@types/gtag.js": { - "version": "0.0.20", - "license": "MIT" - }, - "node_modules/@types/hast": { - "version": "3.0.4", - "license": "MIT", - "dependencies": { - "@types/unist": "*" - } - }, - "node_modules/@types/history": { - "version": "4.7.11", - "license": "MIT" - }, - "node_modules/@types/html-minifier-terser": { - "version": "6.1.0", - "license": "MIT" - }, - "node_modules/@types/http-cache-semantics": { - "version": "4.2.0", - "license": "MIT" - }, - "node_modules/@types/http-errors": { - "version": "2.0.5", - "license": "MIT" - }, - "node_modules/@types/http-proxy": { - "version": "1.17.17", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.6", - "license": "MIT" - }, - "node_modules/@types/istanbul-lib-report": { - "version": "3.0.3", - "license": "MIT", - "dependencies": { - "@types/istanbul-lib-coverage": "*" - } - }, - "node_modules/@types/istanbul-reports": { - "version": "3.0.4", - "license": "MIT", - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "license": "MIT" - }, - "node_modules/@types/mdast": { - "version": "4.0.4", - "license": "MIT", - "dependencies": { - "@types/unist": "*" - } - }, - "node_modules/@types/mdx": { - "version": "2.0.13", - "license": "MIT" - }, - "node_modules/@types/mime": { - "version": "1.3.5", - "license": "MIT" - }, - "node_modules/@types/ms": { - "version": "2.1.0", - "license": "MIT" - }, - "node_modules/@types/node": { - "version": "20.11.0", - "license": "MIT", - "dependencies": { - "undici-types": "~5.26.4" - } - }, - "node_modules/@types/prismjs": { - "version": "1.26.5", - "license": "MIT" - }, - "node_modules/@types/qs": { - "version": "6.14.0", - "license": "MIT" - }, - "node_modules/@types/range-parser": { - "version": "1.2.7", - "license": "MIT" - }, - "node_modules/@types/react": { - "version": "19.2.11", - "license": "MIT", - "peer": true, - "dependencies": { - "csstype": "^3.2.2" - } - }, - "node_modules/@types/react-router": { - "version": "5.1.20", - "license": "MIT", - "dependencies": { - "@types/history": "^4.7.11", - "@types/react": "*" - } - }, - "node_modules/@types/react-router-config": { - "version": "5.0.11", - "license": "MIT", - "dependencies": { - "@types/history": "^4.7.11", - "@types/react": "*", - "@types/react-router": "^5.1.0" - } - }, - "node_modules/@types/react-router-dom": { - "version": "5.3.3", - "license": "MIT", - "dependencies": { - "@types/history": "^4.7.11", - "@types/react": "*", - "@types/react-router": "*" - } - }, - "node_modules/@types/retry": { - "version": "0.12.2", - "license": "MIT" - }, - "node_modules/@types/sax": { - "version": "1.2.7", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/send": { - "version": "1.2.1", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/serve-index": { - "version": "1.9.4", - "license": "MIT", - "dependencies": { - "@types/express": "*" - } - }, - "node_modules/@types/serve-static": { - "version": "1.15.10", - "license": "MIT", - "dependencies": { - "@types/http-errors": "*", - "@types/node": "*", - "@types/send": "<1" - } - }, - "node_modules/@types/serve-static/node_modules/@types/send": { - "version": "0.17.6", - "license": "MIT", - "dependencies": { - "@types/mime": "^1", - "@types/node": "*" - } - }, - "node_modules/@types/sockjs": { - "version": "0.3.36", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/turndown": { - "version": "5.0.6", - "license": "MIT" - }, - "node_modules/@types/unist": { - "version": "3.0.3", - "license": "MIT" - }, - "node_modules/@types/ws": { - "version": "8.18.1", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/yargs": { - "version": "17.0.35", - "license": "MIT", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@types/yargs-parser": { - "version": "21.0.3", - "license": "MIT" - }, - "node_modules/@ungap/structured-clone": { - "version": "1.3.0", - "license": "ISC" - }, - "node_modules/@vercel/backends": { - "version": "0.8.18", - "resolved": "https://registry.npmjs.org/@vercel/backends/-/backends-0.8.18.tgz", - "integrity": "sha512-HMUwm923y8AxXKp1j1VqlWFmpN0gubeU4UDgskDjDeU7kHwYEfaZT9c2iOUAqhwmnrpp0mAEAM9d8PjtFJ4O/w==", - "license": "Apache-2.0", - "dependencies": { - "@vercel/build-utils": "13.32.1", - "@vercel/nft": "1.10.0", - "execa": "3.2.0", - "fs-extra": "11.1.0", - "get-port": "5.1.1", - "oxc-transform": "0.111.0", - "path-to-regexp": "8.3.0", - "resolve.exports": "2.0.3", - "rolldown": "1.0.0-rc.1", - "srvx": "0.11.16", - "tsx": "4.21.0", - "zod": "3.22.4" - } - }, - "node_modules/@vercel/backends/node_modules/execa": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-3.2.0.tgz", - "integrity": "sha512-kJJfVbI/lZE1PZYDI5VPxp8zXPO9rtxOkhpZ0jMKha56AI9y2gGVC6bkukStQf0ka5Rh15BA5m7cCCH4jmHqkw==", - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.0", - "get-stream": "^5.0.0", - "human-signals": "^1.1.1", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.0", - "onetime": "^5.1.0", - "p-finally": "^2.0.0", - "signal-exit": "^3.0.2", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": "^8.12.0 || >=9.7.0" - } - }, - "node_modules/@vercel/backends/node_modules/fs-extra": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.0.tgz", - "integrity": "sha512-0rcTq621PD5jM/e0a3EJoGC/1TC5ZBCERW82LQuwfGnCa1V8w7dpYH1yNu+SLb6E5dkeCBzKEyLGlFrnr+dUyw==", - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/@vercel/backends/node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "license": "MIT", - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@vercel/backends/node_modules/human-signals": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", - "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", - "license": "Apache-2.0", - "engines": { - "node": ">=8.12.0" - } - }, - "node_modules/@vercel/backends/node_modules/p-finally": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-2.0.1.tgz", - "integrity": "sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@vercel/backends/node_modules/path-to-regexp": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz", - "integrity": "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/@vercel/backends/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "license": "ISC" - }, - "node_modules/@vercel/backends/node_modules/zod": { - "version": "3.22.4", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.22.4.tgz", - "integrity": "sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } - }, - "node_modules/@vercel/blob": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@vercel/blob/-/blob-2.4.0.tgz", - "integrity": "sha512-ncQ8CRb6XoEAYJwjOTRGpACRT6h/AeY+/33gLyeVxG5BIes27OPm1jmqreF+JHjcTmGhClTP+kBpmyLfbV0xew==", - "license": "Apache-2.0", - "dependencies": { - "async-retry": "^1.3.3", - "is-buffer": "^2.0.5", - "is-node-process": "^1.2.0", - "throttleit": "^2.1.0", - "undici": "^6.23.0" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@vercel/blob/node_modules/undici": { - "version": "6.27.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-6.27.0.tgz", - "integrity": "sha512-YmfV3YnEDzXRC5lZ2jWtWWHKGUm1zIt8AhesR1tens+HTNv+YZlN/dp6G727LOvMJ8xjP9Be7Y2Sdr96LDm+pg==", - "license": "MIT", - "engines": { - "node": ">=18.17" - } - }, - "node_modules/@vercel/build-utils": { - "version": "13.32.1", - "resolved": "https://registry.npmjs.org/@vercel/build-utils/-/build-utils-13.32.1.tgz", - "integrity": "sha512-r8H6DZ1NLi2i4mY7YGOeb5b8mtGPaTtYe5ezYbLoV7nrjCSRMqHKKsAWOjPYDRKZ2Vf48OQB0OZ4lj9Cc5Vwhw==", - "license": "Apache-2.0", - "dependencies": { - "@vercel/python-analysis": "0.11.1", - "cjs-module-lexer": "1.2.3", - "es-module-lexer": "1.5.0" - } - }, - "node_modules/@vercel/build-utils/node_modules/es-module-lexer": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.0.tgz", - "integrity": "sha512-pqrTKmwEIgafsYZAGw9kszYzmagcE/n4dbgwGWLEXg7J4QFJVQRBld8j3Q3GNez79jzxZshq0bcT962QHOghjw==", - "license": "MIT" - }, - "node_modules/@vercel/cervel": { - "version": "0.1.26", - "resolved": "https://registry.npmjs.org/@vercel/cervel/-/cervel-0.1.26.tgz", - "integrity": "sha512-n2qeyZs96XbnBfKDsQ/8QPr12Mb8ZFMcxdQJFEvciWK9+nygrWKEEuC6akH3tK3Pw7IubQY07Yn3rMUXfhdLxA==", - "license": "Apache-2.0", - "dependencies": { - "@vercel/backends": "0.8.18" - }, - "bin": { - "cervel": "bin/cervel.mjs" - } - }, - "node_modules/@vercel/cli-auth": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@vercel/cli-auth/-/cli-auth-0.3.0.tgz", - "integrity": "sha512-9nsdxUpV/L+9CBVGeRw/Qby2azhi2lk01jp0aTH+Hxx2U61+mAmbi5qChHnrbEmQdx2Ih7dp4LxO3nj1Q7f/5Q==", - "dependencies": { - "@napi-rs/keyring": "1.2.0", - "@vercel/cli-config": "0.2.0", - "async-listen": "3.0.0", - "open": "8.4.0", - "zod": "4.1.11" - } - }, - "node_modules/@vercel/cli-auth/node_modules/open": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz", - "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==", - "license": "MIT", - "dependencies": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@vercel/cli-config": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@vercel/cli-config/-/cli-config-0.2.0.tgz", - "integrity": "sha512-fJRRRB7734BDuXZ89yBEaA2ncYhH7bWX30mk04W80J6VAfQc+4iB8lyzAdaGpFV3/vNlkt9VZt+/uoQoWX6UsQ==", - "license": "Apache-2.0", - "dependencies": { - "xdg-app-paths": "5", - "zod": "4.1.11" - } - }, - "node_modules/@vercel/container": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/@vercel/container/-/container-0.0.2.tgz", - "integrity": "sha512-t7vIpTRejh7zoxxcqa9lNSwlzYqB/mOYo3cQjifnBvBPyrFI3OXdW9WCFl+y3hgOAY6cIUnNFeD3OHzAZf3cwA==", - "license": "Apache-2.0" - }, - "node_modules/@vercel/detect-agent": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@vercel/detect-agent/-/detect-agent-1.2.3.tgz", - "integrity": "sha512-VYNCgUc0nOmC4WJmWw9GkrKdfr8Zl4/rxhC5SvgacBgxiW9W/9NRttUoHHXV8xdII3MaRgkZZVX8Ikzc/Jmjag==", - "license": "Apache-2.0", - "engines": { - "node": ">=14" - } - }, - "node_modules/@vercel/elysia": { - "version": "0.1.97", - "resolved": "https://registry.npmjs.org/@vercel/elysia/-/elysia-0.1.97.tgz", - "integrity": "sha512-ShEPurEH8Q+htrCBj0b8okmX5x92F8VosIKhHRpz51jb/TW5iUblgBhHkbJKMrSTXeUvV6KvzPr5nY2HrWgCAg==", - "license": "Apache-2.0", - "dependencies": { - "@vercel/node": "5.8.21", - "@vercel/static-config": "3.4.0" - } - }, - "node_modules/@vercel/error-utils": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@vercel/error-utils/-/error-utils-2.2.0.tgz", - "integrity": "sha512-WFWiRxfPzoYWYifaj4thSKvAaZZwUOqD4k5GINRIgZgCiS2E3iAJbWbIsIZmkQdTecWFHcWGA6q48CjisgpOBA==", - "license": "Apache-2.0" - }, - "node_modules/@vercel/express": { - "version": "0.1.109", - "resolved": "https://registry.npmjs.org/@vercel/express/-/express-0.1.109.tgz", - "integrity": "sha512-X/NMmEPoRjgcy8jqc+Op4L/r8g2wTKB/X7aNWJ9+/3aGIHlnwVU7Fp2R+tQUH2/yW0eGyGtwZWX81M1uZK3phg==", - "license": "Apache-2.0", - "dependencies": { - "@vercel/cervel": "0.1.26", - "@vercel/nft": "1.10.0", - "@vercel/node": "5.8.21", - "@vercel/static-config": "3.4.0", - "fs-extra": "11.1.0", - "path-to-regexp": "8.3.0", - "ts-morph": "12.0.0", - "zod": "3.22.4" - } - }, - "node_modules/@vercel/express/node_modules/fs-extra": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.0.tgz", - "integrity": "sha512-0rcTq621PD5jM/e0a3EJoGC/1TC5ZBCERW82LQuwfGnCa1V8w7dpYH1yNu+SLb6E5dkeCBzKEyLGlFrnr+dUyw==", - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/@vercel/express/node_modules/path-to-regexp": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz", - "integrity": "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/@vercel/express/node_modules/zod": { - "version": "3.22.4", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.22.4.tgz", - "integrity": "sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } - }, - "node_modules/@vercel/fastify": { - "version": "0.1.100", - "resolved": "https://registry.npmjs.org/@vercel/fastify/-/fastify-0.1.100.tgz", - "integrity": "sha512-X2aTOnb630pi7e7a6pA4UtMbXaFXhuEwWfKMBtYmJEAwI2SxLG0DhL5byYIpd6/KENYH5M+PvsBJQOxMdGR3cg==", - "license": "Apache-2.0", - "dependencies": { - "@vercel/node": "5.8.21", - "@vercel/static-config": "3.4.0" - } - }, - "node_modules/@vercel/fun": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@vercel/fun/-/fun-1.3.0.tgz", - "integrity": "sha512-8erw9uPe0dFg45THkNxmjtvMX143SkZebmjgSVbcM3XCkXu3RIiBaJMcMNG8aaS+rnTuw8+d4De9HVT0M/r3wg==", - "license": "Apache-2.0", - "dependencies": { - "@tootallnate/once": "2.0.0", - "async-listen": "1.2.0", - "debug": "4.3.4", - "generic-pool": "3.4.2", - "micro": "9.3.5-canary.3", - "ms": "2.1.1", - "node-fetch": "2.6.7", - "path-to-regexp": "8.2.0", - "promisepipe": "3.0.0", - "semver": "7.5.4", - "stat-mode": "0.3.0", - "stream-to-promise": "2.2.0", - "tar": "7.5.7", - "tinyexec": "0.3.2", - "tree-kill": "1.2.2", - "uid-promise": "1.0.0", - "xdg-app-paths": "5.1.0", - "yauzl-promise": "2.1.3" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/@vercel/fun/node_modules/async-listen": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/async-listen/-/async-listen-1.2.0.tgz", - "integrity": "sha512-CcEtRh/oc9Jc4uWeUwdpG/+Mb2YUHKmdaTf0gUr7Wa+bfp4xx70HOb3RuSTJMvqKNB1TkdTfjLdrcz2X4rkkZA==", - "license": "MIT" - }, - "node_modules/@vercel/fun/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "license": "MIT", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@vercel/fun/node_modules/debug/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "license": "MIT" - }, - "node_modules/@vercel/fun/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@vercel/fun/node_modules/ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "license": "MIT" - }, - "node_modules/@vercel/fun/node_modules/path-to-regexp": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.2.0.tgz", - "integrity": "sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==", - "license": "MIT", - "engines": { - "node": ">=16" - } - }, - "node_modules/@vercel/fun/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@vercel/fun/node_modules/xdg-app-paths": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/xdg-app-paths/-/xdg-app-paths-5.1.0.tgz", - "integrity": "sha512-RAQ3WkPf4KTU1A8RtFx3gWywzVKe00tfOPFfl2NDGqbIFENQO4kqAJp7mhQjNj/33W5x5hiWWUdyfPq/5SU3QA==", - "license": "MIT", - "dependencies": { - "xdg-portable": "^7.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@vercel/fun/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "license": "ISC" - }, - "node_modules/@vercel/gatsby-plugin-vercel-analytics": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@vercel/gatsby-plugin-vercel-analytics/-/gatsby-plugin-vercel-analytics-1.0.11.tgz", - "integrity": "sha512-iTEA0vY6RBPuEzkwUTVzSHDATo1aF6bdLLspI68mQ/BTbi5UQEGjpjyzdKOVcSYApDtFU6M6vypZ1t4vIEnHvw==", - "license": "Apache-2.0", - "dependencies": { - "web-vitals": "0.2.4" - } - }, - "node_modules/@vercel/gatsby-plugin-vercel-builder": { - "version": "2.2.23", - "resolved": "https://registry.npmjs.org/@vercel/gatsby-plugin-vercel-builder/-/gatsby-plugin-vercel-builder-2.2.23.tgz", - "integrity": "sha512-UxInx6QtZZQkjeoOK+fMBxavlS+GWm1PUWAvCvZpyCNO971JzdlGwW6zzSIeUsBrHB8SozPqnG1PMQisLY6TxQ==", - "license": "Apache-2.0", - "dependencies": { - "@sinclair/typebox": "0.25.24", - "@vercel/build-utils": "13.32.1", - "esbuild": "0.27.0", - "etag": "1.8.1", - "fs-extra": "11.1.0" - } - }, - "node_modules/@vercel/gatsby-plugin-vercel-builder/node_modules/@sinclair/typebox": { - "version": "0.25.24", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz", - "integrity": "sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==", - "license": "MIT" - }, - "node_modules/@vercel/gatsby-plugin-vercel-builder/node_modules/fs-extra": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.0.tgz", - "integrity": "sha512-0rcTq621PD5jM/e0a3EJoGC/1TC5ZBCERW82LQuwfGnCa1V8w7dpYH1yNu+SLb6E5dkeCBzKEyLGlFrnr+dUyw==", - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/@vercel/go": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/@vercel/go/-/go-3.10.1.tgz", - "integrity": "sha512-6i37zdMUS4PX1BWRHBCUqp5Ev0NbOrfrRVCwAzKj8YKh48LNu/Ye5r5NFI3JW7g40HkAC8wBMwZ7fRQPlWgBSg==", - "license": "Apache-2.0" - }, - "node_modules/@vercel/h3": { - "version": "0.1.106", - "resolved": "https://registry.npmjs.org/@vercel/h3/-/h3-0.1.106.tgz", - "integrity": "sha512-Sl9k42VQnlbPgtg0vQyUmhhQ0LmjSYhLklLKjd5pzD0GXITKbhPXa+0QwdnRtJo0Eb2kFzluZmypEF7KoNxW4g==", - "license": "Apache-2.0", - "dependencies": { - "@vercel/node": "5.8.21", - "@vercel/static-config": "3.4.0" - } - }, - "node_modules/@vercel/hono": { - "version": "0.2.100", - "resolved": "https://registry.npmjs.org/@vercel/hono/-/hono-0.2.100.tgz", - "integrity": "sha512-AIVfTN2txUEj7yLEUdbDCfBLgQOe+jbnQUgWWFAI5nH0RAn4I3OtySp6xI3FlP+TOCOAe0hdsbTF+7bpDyG52A==", - "license": "Apache-2.0", - "dependencies": { - "@vercel/nft": "1.10.0", - "@vercel/node": "5.8.21", - "@vercel/static-config": "3.4.0", - "fs-extra": "11.1.0", - "path-to-regexp": "8.3.0", - "ts-morph": "12.0.0", - "zod": "3.22.4" - } - }, - "node_modules/@vercel/hono/node_modules/fs-extra": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.0.tgz", - "integrity": "sha512-0rcTq621PD5jM/e0a3EJoGC/1TC5ZBCERW82LQuwfGnCa1V8w7dpYH1yNu+SLb6E5dkeCBzKEyLGlFrnr+dUyw==", - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/@vercel/hono/node_modules/path-to-regexp": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz", - "integrity": "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/@vercel/hono/node_modules/zod": { - "version": "3.22.4", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.22.4.tgz", - "integrity": "sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } - }, - "node_modules/@vercel/hydrogen": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@vercel/hydrogen/-/hydrogen-1.4.0.tgz", - "integrity": "sha512-gf3ELmAjcia7WNGNHAB/rFWFU0l5fJ7mTMgGC5hvcCjSIE4kp8WWuGYiTQgQ8W6GF/1FJAxa2J3BhY/yxjY8tA==", - "license": "Apache-2.0", - "dependencies": { - "@vercel/static-config": "3.4.0", - "ts-morph": "12.0.0" - } - }, - "node_modules/@vercel/koa": { - "version": "0.1.80", - "resolved": "https://registry.npmjs.org/@vercel/koa/-/koa-0.1.80.tgz", - "integrity": "sha512-Ul9G9P7Jy/vh0M8OH4A14WId96l2FLqwtUKnuuwKF4m1Fun8NvUw+5AM/xVwT0GQUNJsRJpVlTuGX+vhmgDFhA==", - "license": "Apache-2.0", - "dependencies": { - "@vercel/node": "5.8.21", - "@vercel/static-config": "3.4.0" - } - }, - "node_modules/@vercel/nestjs": { - "version": "0.2.101", - "resolved": "https://registry.npmjs.org/@vercel/nestjs/-/nestjs-0.2.101.tgz", - "integrity": "sha512-twHcHBLJN97bK6z9NtGOzwrd9HrR/10e6FGGMCgckz3REAS4a4Us2dyS3IQennNbAT0Nfc1zdH/+trB5WIHUaw==", - "license": "Apache-2.0", - "dependencies": { - "@vercel/node": "5.8.21", - "@vercel/static-config": "3.4.0" - } - }, - "node_modules/@vercel/next": { - "version": "4.20.1", - "resolved": "https://registry.npmjs.org/@vercel/next/-/next-4.20.1.tgz", - "integrity": "sha512-MvZSuRQUGvd4W9rcztpbj+7cNzCFlxhjEFMF4gJbW635+ZP7tN44wEcr7bzVj1m8wi6lYlrs19qXr5vsJKlsmw==", - "license": "Apache-2.0", - "dependencies": { - "@vercel/nft": "1.10.0" - } - }, - "node_modules/@vercel/nft": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@vercel/nft/-/nft-1.10.0.tgz", - "integrity": "sha512-iLOW4fcsgkipfOh2Bw3wB38YDfxTlxr7+j4uFeui2OswkNT28jIitS/aMce7tS0mef1YPQ8zLIDYr3a0aahNrA==", - "license": "MIT", - "dependencies": { - "@mapbox/node-pre-gyp": "^2.0.0", - "@rollup/pluginutils": "^5.1.3", - "acorn": "^8.6.0", - "acorn-import-attributes": "^1.9.5", - "async-sema": "^3.1.1", - "bindings": "^1.4.0", - "estree-walker": "2.0.2", - "glob": "^13.0.0", - "graceful-fs": "^4.2.9", - "node-gyp-build": "^4.2.2", - "picomatch": "^4.0.2", - "resolve-from": "^5.0.0" - }, - "bin": { - "nft": "out/cli.js" - }, - "engines": { - "node": ">=20" - } - }, - "node_modules/@vercel/nft/node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "license": "MIT" - }, - "node_modules/@vercel/node": { - "version": "5.8.21", - "resolved": "https://registry.npmjs.org/@vercel/node/-/node-5.8.21.tgz", - "integrity": "sha512-h49+XWY9nPEu2atBkbs5izbzlOVx4RxwJQrgYUpcp6KG2Ib2WRQ81uUKCIevm4O0qwAo6w7mgNN11yp8XGWK7g==", - "license": "Apache-2.0", - "dependencies": { - "@edge-runtime/node-utils": "2.3.0", - "@edge-runtime/primitives": "4.1.0", - "@edge-runtime/vm": "3.2.0", - "@types/node": "20.11.0", - "@vercel/build-utils": "13.32.1", - "@vercel/error-utils": "2.2.0", - "@vercel/nft": "1.10.0", - "@vercel/static-config": "3.4.0", - "async-listen": "3.0.0", - "cjs-module-lexer": "1.2.3", - "edge-runtime": "2.5.9", - "es-module-lexer": "1.4.1", - "esbuild": "0.27.0", - "etag": "1.8.1", - "mime-types": "2.1.35", - "node-fetch": "2.6.9", - "path-to-regexp": "6.1.0", - "path-to-regexp-updated": "npm:path-to-regexp@6.3.0", - "ts-morph": "12.0.0", - "tsx": "4.21.0", - "typescript": "npm:typescript@5.9.3", - "undici": "5.28.4" - } - }, - "node_modules/@vercel/node/node_modules/node-fetch": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz", - "integrity": "sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==", - "license": "MIT", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/@vercel/oidc": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@vercel/oidc/-/oidc-3.2.0.tgz", - "integrity": "sha512-UycprH3T6n3jH0k44NHMa7pnFHGu/N05MjojYr+Mc6I7obkoLIJujSWwin1pCvdy/eOxrI/l3uDLQsmcrOb4ug==", - "license": "Apache-2.0", - "engines": { - "node": ">= 20" - } - }, - "node_modules/@vercel/prepare-flags-definitions": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@vercel/prepare-flags-definitions/-/prepare-flags-definitions-0.3.0.tgz", - "integrity": "sha512-/0nuDFwYje0nqZnVKSd2VfJy2wOPQwbkas1qO1JQgtb0sLl+EeSCW4O9hrvq55pN50PNlAZ/APSeWHIAT9ZGHg==", - "license": "MIT" - }, - "node_modules/@vercel/python": { - "version": "6.47.2", - "resolved": "https://registry.npmjs.org/@vercel/python/-/python-6.47.2.tgz", - "integrity": "sha512-ayP1s8dfCtW4XmvUFDRdA7ETbkEbRWChfCv66FZNHWgMRKELxhsuO1OHPnK+7hwHwEjpxPqZyilRO64RBKlYfw==", - "license": "Apache-2.0", - "dependencies": { - "@vercel/python-analysis": "0.11.1" - } - }, - "node_modules/@vercel/python-analysis": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/@vercel/python-analysis/-/python-analysis-0.11.1.tgz", - "integrity": "sha512-EPPLuXJQhIDUx08H9nG76AR2HSgBquwe3OAX5s2w20M923iaWeGGVkhX/4yZ89CJfXEZgE1Aj/mX7lVHOVIcYA==", - "license": "Apache-2.0", - "dependencies": { - "@bytecodealliance/preview2-shim": "0.17.6", - "@renovatebot/pep440": "4.2.1", - "fs-extra": "11.1.1", - "js-yaml": "4.1.1", - "minimatch": "10.1.1", - "smol-toml": "1.5.2", - "zod": "3.22.4" - } - }, - "node_modules/@vercel/python-analysis/node_modules/fs-extra": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz", - "integrity": "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==", - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/@vercel/python-analysis/node_modules/zod": { - "version": "3.22.4", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.22.4.tgz", - "integrity": "sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } - }, - "node_modules/@vercel/redwood": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@vercel/redwood/-/redwood-2.5.0.tgz", - "integrity": "sha512-LO24CbieV57rGAqrq5n5z/B+fMYeUqbE/Ge3qMeKRuS3Q9awgcBgB6WYLCe8crHM7XJd5AZjbuyoS/6k3r0X0w==", - "license": "Apache-2.0", - "dependencies": { - "@vercel/nft": "1.10.0", - "@vercel/static-config": "3.4.0", - "semver": "6.3.1", - "ts-morph": "12.0.0" - } - }, - "node_modules/@vercel/redwood/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@vercel/remix-builder": { - "version": "5.9.1", - "resolved": "https://registry.npmjs.org/@vercel/remix-builder/-/remix-builder-5.9.1.tgz", - "integrity": "sha512-s0SpfV640nmQ1BsKCPMYugGrH/V+319onTo2ZILSmsy6NTBlmeN0zJU9nPcP8dBEotGqtp68NfOlOUUdrVBzkw==", - "license": "Apache-2.0", - "dependencies": { - "@vercel/error-utils": "2.2.0", - "@vercel/nft": "1.10.0", - "@vercel/static-config": "3.4.0", - "path-to-regexp": "6.1.0", - "path-to-regexp-updated": "npm:path-to-regexp@6.3.0", - "ts-morph": "12.0.0" - } - }, - "node_modules/@vercel/ruby": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@vercel/ruby/-/ruby-2.5.1.tgz", - "integrity": "sha512-e23M7pfORQyyxSUmeQ8PqEnyLJ4swhtNrnyctU5E02UCaUYFm5YAdNfdPYRP4It874H4Wyvm+LV8u7CPBrfcPA==", - "license": "Apache-2.0" - }, - "node_modules/@vercel/rust": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@vercel/rust/-/rust-1.3.0.tgz", - "integrity": "sha512-z1X0z1NM+ISunm/scgRpuENNwcKlh7DjXn0QvKE0n10DcaYqxkBQVK8iRA9X05xSK9AzPlnB9DHdGKiXZO5buw==", - "license": "Apache-2.0", - "dependencies": { - "execa": "5", - "smol-toml": "1.5.2" - } - }, - "node_modules/@vercel/sandbox": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@vercel/sandbox/-/sandbox-2.1.1.tgz", - "integrity": "sha512-gKhW+YlvU15Qxya7jQKByB+sqA1dWat5zx/rvxT52E3Ryg9MAIXgqD5wd1d+CoJDbdHL26gIOcksTZY5sFpplA==", - "license": "Apache-2.0", - "dependencies": { - "@vercel/oidc": "3.2.0", - "@workflow/serde": "4.1.0-beta.2", - "async-retry": "1.3.3", - "jose": "6.2.3", - "jsonlines": "0.1.1", - "ms": "2.1.3", - "picocolors": "^1.1.1", - "tar-stream": "3.1.7", - "undici": "^7.27.1", - "xdg-app-paths": "5.1.0", - "zod": "3.24.4" - } - }, - "node_modules/@vercel/sandbox/node_modules/jose": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/jose/-/jose-6.2.3.tgz", - "integrity": "sha512-YYVDInQKFJfR/xa3ojUTl8c2KoTwiL1R5Wg9YCydwH0x0B9grbzlg5HC7mMjCtUJjbQ/YnGEZIhI5tCgfTb4Hw==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/panva" - } - }, - "node_modules/@vercel/sandbox/node_modules/undici": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-7.28.0.tgz", - "integrity": "sha512-cRZYrTDwWznlnRiPjggAGxZXanty6M8RV1ff8Wm4LWXBp7/IG8v5DnOm74DtUBp9OONpK75YlPnIjQqX0dBDtA==", - "license": "MIT", - "engines": { - "node": ">=20.18.1" - } - }, - "node_modules/@vercel/sandbox/node_modules/xdg-app-paths": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/xdg-app-paths/-/xdg-app-paths-5.1.0.tgz", - "integrity": "sha512-RAQ3WkPf4KTU1A8RtFx3gWywzVKe00tfOPFfl2NDGqbIFENQO4kqAJp7mhQjNj/33W5x5hiWWUdyfPq/5SU3QA==", - "license": "MIT", - "dependencies": { - "xdg-portable": "^7.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@vercel/sandbox/node_modules/zod": { - "version": "3.24.4", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.24.4.tgz", - "integrity": "sha512-OdqJE9UDRPwWsrHjLN2F8bPxvwJBK22EHLWtanu0LSYr5YqzsaaW3RMgmjwr8Rypg5k+meEJdSPXJZXE/yqOMg==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } - }, - "node_modules/@vercel/static-build": { - "version": "2.11.3", - "resolved": "https://registry.npmjs.org/@vercel/static-build/-/static-build-2.11.3.tgz", - "integrity": "sha512-7twXLgeCbG9A0uiH9hnDmmYR5pn++0i3LCRpsO9hMyLwEGzkYxjgtA9blWBQk9dkVhDa4WGo1xGlyBKXT10dOw==", - "license": "Apache-2.0", - "dependencies": { - "@vercel/gatsby-plugin-vercel-analytics": "1.0.11", - "@vercel/gatsby-plugin-vercel-builder": "2.2.23", - "@vercel/static-config": "3.4.0", - "ts-morph": "12.0.0" - } - }, - "node_modules/@vercel/static-config": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@vercel/static-config/-/static-config-3.4.0.tgz", - "integrity": "sha512-wCq90CMUB//ggnFh77NQO1xaLFsS4LigQIqKrH6ohnr9Br/KI1FhlErx62WfCOuueWaW+LVsbLOqNXIUjK8t6A==", - "license": "Apache-2.0", - "dependencies": { - "ajv": "8.6.3", - "json-schema-to-ts": "1.6.4", - "ts-morph": "12.0.0" - } - }, - "node_modules/@webassemblyjs/ast": { - "version": "1.14.1", - "license": "MIT", - "dependencies": { - "@webassemblyjs/helper-numbers": "1.13.2", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2" - } - }, - "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.13.2", - "license": "MIT" - }, - "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.13.2", - "license": "MIT" - }, - "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.14.1", - "license": "MIT" - }, - "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.13.2", - "license": "MIT", - "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.13.2", - "@webassemblyjs/helper-api-error": "1.13.2", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.13.2", - "license": "MIT" - }, - "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.14.1", - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/wasm-gen": "1.14.1" - } - }, - "node_modules/@webassemblyjs/ieee754": { - "version": "1.13.2", - "license": "MIT", - "dependencies": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "node_modules/@webassemblyjs/leb128": { - "version": "1.13.2", - "license": "Apache-2.0", - "dependencies": { - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/utf8": { - "version": "1.13.2", - "license": "MIT" - }, - "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.14.1", - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/helper-wasm-section": "1.14.1", - "@webassemblyjs/wasm-gen": "1.14.1", - "@webassemblyjs/wasm-opt": "1.14.1", - "@webassemblyjs/wasm-parser": "1.14.1", - "@webassemblyjs/wast-printer": "1.14.1" - } - }, - "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.14.1", - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/ieee754": "1.13.2", - "@webassemblyjs/leb128": "1.13.2", - "@webassemblyjs/utf8": "1.13.2" - } - }, - "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.14.1", - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/wasm-gen": "1.14.1", - "@webassemblyjs/wasm-parser": "1.14.1" - } - }, - "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.14.1", - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-api-error": "1.13.2", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/ieee754": "1.13.2", - "@webassemblyjs/leb128": "1.13.2", - "@webassemblyjs/utf8": "1.13.2" - } - }, - "node_modules/@webassemblyjs/wast-printer": { - "version": "1.14.1", - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@workflow/serde": { - "version": "4.1.0-beta.2", - "resolved": "https://registry.npmjs.org/@workflow/serde/-/serde-4.1.0-beta.2.tgz", - "integrity": "sha512-8kkeoQKLDaKXefjV5dbhBj2aErfKp1Mc4pb6tj8144cF+Em5SPbyMbyLCHp+BVrFfFVCBluCtMx+jjvaFVZGww==", - "license": "Apache-2.0" - }, - "node_modules/@xtuc/ieee754": { - "version": "1.2.0", - "license": "BSD-3-Clause" - }, - "node_modules/@xtuc/long": { - "version": "4.2.2", - "license": "Apache-2.0" - }, - "node_modules/abbrev": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-3.0.1.tgz", - "integrity": "sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg==", - "license": "ISC", - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/accepts": { - "version": "1.3.8", - "license": "MIT", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/accepts/node_modules/negotiator": { - "version": "0.6.3", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/acorn": { - "version": "8.15.0", - "license": "MIT", - "peer": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-import-attributes": { - "version": "1.9.5", - "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", - "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", - "license": "MIT", - "peerDependencies": { - "acorn": "^8" - } - }, - "node_modules/acorn-import-phases": { - "version": "1.0.4", - "license": "MIT", - "engines": { - "node": ">=10.13.0" - }, - "peerDependencies": { - "acorn": "^8.14.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "license": "MIT", - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/acorn-walk": { - "version": "8.3.4", - "license": "MIT", - "dependencies": { - "acorn": "^8.11.0" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/address": { - "version": "1.2.2", - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/agent-base": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", - "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", - "license": "MIT", - "engines": { - "node": ">= 14" - } - }, - "node_modules/aggregate-error": { - "version": "3.1.0", - "license": "MIT", - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ajv": { - "version": "8.6.3", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-formats": { - "version": "2.1.1", - "license": "MIT", - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "node_modules/algoliasearch": { - "version": "5.50.1", - "license": "MIT", - "peer": true, - "dependencies": { - "@algolia/abtesting": "1.16.1", - "@algolia/client-abtesting": "5.50.1", - "@algolia/client-analytics": "5.50.1", - "@algolia/client-common": "5.50.1", - "@algolia/client-insights": "5.50.1", - "@algolia/client-personalization": "5.50.1", - "@algolia/client-query-suggestions": "5.50.1", - "@algolia/client-search": "5.50.1", - "@algolia/ingestion": "1.50.1", - "@algolia/monitoring": "1.50.1", - "@algolia/recommend": "5.50.1", - "@algolia/requester-browser-xhr": "5.50.1", - "@algolia/requester-fetch": "5.50.1", - "@algolia/requester-node-http": "5.50.1" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/algoliasearch-helper": { - "version": "3.28.1", - "license": "MIT", - "dependencies": { - "@algolia/events": "^4.0.1" - }, - "peerDependencies": { - "algoliasearch": ">= 3.1 < 6" - } - }, - "node_modules/ansi-align": { - "version": "3.0.1", - "license": "ISC", - "dependencies": { - "string-width": "^4.1.0" - } - }, - "node_modules/ansi-align/node_modules/emoji-regex": { - "version": "8.0.0", - "license": "MIT" - }, - "node_modules/ansi-align/node_modules/string-width": { - "version": "4.2.3", - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "license": "MIT", - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-escapes/node_modules/type-fest": { - "version": "0.21.3", - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-html-community": { - "version": "0.0.8", - "engines": [ - "node >= 0.8.0" - ], - "license": "Apache-2.0", - "bin": { - "ansi-html": "bin/ansi-html" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", - "license": "MIT" - }, - "node_modules/anymatch": { - "version": "3.1.3", - "license": "ISC", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/anymatch/node_modules/picomatch": { - "version": "2.3.1", - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/arg": { - "version": "5.0.2", - "license": "MIT" - }, - "node_modules/argparse": { - "version": "2.0.1", - "license": "Python-2.0" - }, - "node_modules/array-flatten": { - "version": "1.1.1", - "license": "MIT" - }, - "node_modules/array-union": { - "version": "2.1.0", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/asn1js": { - "version": "3.0.7", - "license": "BSD-3-Clause", - "dependencies": { - "pvtsutils": "^1.3.6", - "pvutils": "^1.1.3", - "tslib": "^2.8.1" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/ast-types": { - "version": "0.13.4", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", - "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", - "license": "MIT", - "dependencies": { - "tslib": "^2.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/astring": { - "version": "1.9.0", - "license": "MIT", - "bin": { - "astring": "bin/astring" - } - }, - "node_modules/async-listen": { - "version": "3.0.0", - "license": "MIT", - "engines": { - "node": ">= 14" - } - }, - "node_modules/async-retry": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.3.3.tgz", - "integrity": "sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==", - "license": "MIT", - "dependencies": { - "retry": "0.13.1" - } - }, - "node_modules/async-sema": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/async-sema/-/async-sema-3.1.1.tgz", - "integrity": "sha512-tLRNUXati5MFePdAk8dw7Qt7DpxPB60ofAgn8WRhW6a2rcimZnYBP9oxHiv0OHy+Wz7kPMG+t4LGdt31+4EmGg==", - "license": "MIT" - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "license": "MIT" - }, - "node_modules/autoprefixer": { - "version": "10.4.27", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/autoprefixer" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "browserslist": "^4.28.1", - "caniuse-lite": "^1.0.30001774", - "fraction.js": "^5.3.4", - "picocolors": "^1.1.1", - "postcss-value-parser": "^4.2.0" - }, - "bin": { - "autoprefixer": "bin/autoprefixer" - }, - "engines": { - "node": "^10 || ^12 || >=14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/b4a": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.8.1.tgz", - "integrity": "sha512-aiqre1Nr0B/6DgE2N5vwTc+2/oQZ4Wh1t4NznYY4E00y8LCt6NqdRv81so00oo27D8MVKTpUa/MwUUtBLXCoDw==", - "license": "Apache-2.0", - "peerDependencies": { - "react-native-b4a": "*" - }, - "peerDependenciesMeta": { - "react-native-b4a": { - "optional": true - } - } - }, - "node_modules/babel-loader": { - "version": "9.2.1", - "license": "MIT", - "dependencies": { - "find-cache-dir": "^4.0.0", - "schema-utils": "^4.0.0" - }, - "engines": { - "node": ">= 14.15.0" - }, - "peerDependencies": { - "@babel/core": "^7.12.0", - "webpack": ">=5" - } - }, - "node_modules/babel-plugin-dynamic-import-node": { - "version": "2.3.3", - "license": "MIT", - "dependencies": { - "object.assign": "^4.1.0" - } - }, - "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.17", - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.28.6", - "@babel/helper-define-polyfill-provider": "^0.6.8", - "semver": "^6.3.1" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { - "version": "6.3.1", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.13.0", - "license": "MIT", - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.5", - "core-js-compat": "^3.43.0" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.6.8", - "license": "MIT", - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.8" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/bail": { - "version": "2.0.2", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "license": "MIT" - }, - "node_modules/bare-events": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.9.1.tgz", - "integrity": "sha512-Z0oHEHAFDZkffN8Qc39zNZjQlMDkPJRyyyZieU1VH7u8c5S+qHZ2S8ixdKIAxEjfHO7FJxXmJWgteOghVanIsg==", - "license": "Apache-2.0", - "peer": true, - "peerDependencies": { - "bare-abort-controller": "*" - }, - "peerDependenciesMeta": { - "bare-abort-controller": { - "optional": true - } - } - }, - "node_modules/bare-fs": { - "version": "4.7.2", - "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.7.2.tgz", - "integrity": "sha512-aTvMFUWkBmjzKtEQMDGGDNF8bkfpD5N1b/FCwt7A3wrU4t1o/e/85Wzkluh6JlODCjqVESYCkQCdTXqZ9G7VFg==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "bare-events": "^2.5.4", - "bare-path": "^3.0.0", - "bare-stream": "^2.6.4", - "bare-url": "^2.2.2", - "fast-fifo": "^1.3.2" - }, - "engines": { - "bare": ">=1.16.0" - }, - "peerDependencies": { - "bare-buffer": "*" - }, - "peerDependenciesMeta": { - "bare-buffer": { - "optional": true - } - } - }, - "node_modules/bare-os": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-3.9.1.tgz", - "integrity": "sha512-6M5XjcnsygQNPMCMPXSK379xrJFiZ/AEMNBmFEmQW8d/789VQATvriyi5r0HYTL9TkQ26rn3kgdTG3aisbrXkQ==", - "license": "Apache-2.0", - "optional": true, - "engines": { - "bare": ">=1.14.0" - } - }, - "node_modules/bare-path": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-3.0.1.tgz", - "integrity": "sha512-ghj2DSK/2e99a1anTVPCV4m4YIYtrbXhfM7V3D7XZLOTsybnYyaJloymGqssQc8l/or0UoDyRtNQkmkEF/ysgQ==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "bare-os": "^3.0.1" - } - }, - "node_modules/bare-stream": { - "version": "2.13.3", - "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.13.3.tgz", - "integrity": "sha512-Kc+brLqvEqGkjyfiwJmImAOqLZL7OsoLKuavx+hJjgVV3nLTOjloJyPMFxjUPerGGHrNH0fLU06jjykMLWrERQ==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "b4a": "^1.8.1", - "streamx": "^2.25.0", - "teex": "^1.0.1" - }, - "peerDependencies": { - "bare-abort-controller": "*", - "bare-buffer": "*", - "bare-events": "*" - }, - "peerDependenciesMeta": { - "bare-abort-controller": { - "optional": true - }, - "bare-buffer": { - "optional": true - }, - "bare-events": { - "optional": true - } - } - }, - "node_modules/bare-url": { - "version": "2.4.5", - "resolved": "https://registry.npmjs.org/bare-url/-/bare-url-2.4.5.tgz", - "integrity": "sha512-K+y9xF1tN+CdPu4qWwr0QiK1Al07eFPGYK5M2pDXcmHdMdgC/tT/bpmMe1hrmRHaidKLkXrC+cRNYf3XVDUhSQ==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "bare-path": "^3.0.0" - } - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/baseline-browser-mapping": { - "version": "2.9.19", - "license": "Apache-2.0", - "bin": { - "baseline-browser-mapping": "dist/cli.js" - } - }, - "node_modules/basic-ftp": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.3.1.tgz", - "integrity": "sha512-bopVNp6ugyA150DDuZfPFdt1KZ5a94ZDiwX4hMgZDzF+GttD80lEy8kj98kbyhLXnPvhtIo93mdnLIjpCAeeOw==", - "license": "MIT", - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/batch": { - "version": "0.6.1", - "license": "MIT" - }, - "node_modules/big.js": { - "version": "5.2.2", - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/binary-extensions": { - "version": "2.3.0", - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "license": "MIT", - "dependencies": { - "file-uri-to-path": "1.0.0" - } - }, - "node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "license": "MIT", - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "node_modules/body-parser": { - "version": "1.20.4", - "license": "MIT", - "dependencies": { - "bytes": "~3.1.2", - "content-type": "~1.0.5", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "~1.2.0", - "http-errors": "~2.0.1", - "iconv-lite": "~0.4.24", - "on-finished": "~2.4.1", - "qs": "~6.14.0", - "raw-body": "~2.5.3", - "type-is": "~1.6.18", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/body-parser/node_modules/bytes": { - "version": "3.1.2", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/body-parser/node_modules/content-type": { - "version": "1.0.5", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/body-parser/node_modules/debug": { - "version": "2.6.9", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/body-parser/node_modules/http-errors": { - "version": "2.0.1", - "license": "MIT", - "dependencies": { - "depd": "~2.0.0", - "inherits": "~2.0.4", - "setprototypeof": "~1.2.0", - "statuses": "~2.0.2", - "toidentifier": "~1.0.1" - }, - "engines": { - "node": ">= 0.8" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/body-parser/node_modules/ms": { - "version": "2.0.0", - "license": "MIT" - }, - "node_modules/body-parser/node_modules/raw-body": { - "version": "2.5.3", - "license": "MIT", - "dependencies": { - "bytes": "~3.1.2", - "http-errors": "~2.0.1", - "iconv-lite": "~0.4.24", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/body-parser/node_modules/statuses": { - "version": "2.0.2", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/bonjour-service": { - "version": "1.3.0", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "multicast-dns": "^7.2.5" - } - }, - "node_modules/boolbase": { - "version": "1.0.0", - "license": "ISC" - }, - "node_modules/boxen": { - "version": "6.2.1", - "license": "MIT", - "dependencies": { - "ansi-align": "^3.0.1", - "camelcase": "^6.2.0", - "chalk": "^4.1.2", - "cli-boxes": "^3.0.0", - "string-width": "^5.0.1", - "type-fest": "^2.5.0", - "widest-line": "^4.0.1", - "wrap-ansi": "^8.0.1" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/brace-expansion": { - "version": "1.1.12", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "license": "MIT", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browserslist": { - "version": "4.28.1", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "peer": true, - "dependencies": { - "baseline-browser-mapping": "^2.9.0", - "caniuse-lite": "^1.0.30001759", - "electron-to-chromium": "^1.5.263", - "node-releases": "^2.0.27", - "update-browserslist-db": "^1.2.0" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "license": "MIT" - }, - "node_modules/bundle-name": { - "version": "4.1.0", - "license": "MIT", - "dependencies": { - "run-applescript": "^7.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/bytes": { - "version": "3.0.0", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/bytestreamjs": { - "version": "2.0.1", - "license": "BSD-3-Clause", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/cacheable-lookup": { - "version": "7.0.0", - "license": "MIT", - "engines": { - "node": ">=14.16" - } - }, - "node_modules/cacheable-request": { - "version": "10.2.14", - "license": "MIT", - "dependencies": { - "@types/http-cache-semantics": "^4.0.2", - "get-stream": "^6.0.1", - "http-cache-semantics": "^4.1.1", - "keyv": "^4.5.3", - "mimic-response": "^4.0.0", - "normalize-url": "^8.0.0", - "responselike": "^3.0.0" - }, - "engines": { - "node": ">=14.16" - } - }, - "node_modules/cacheable-request/node_modules/mimic-response": { - "version": "4.0.0", - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/call-bind": { - "version": "1.0.8", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.0", - "es-define-property": "^1.0.0", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.2", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/call-bound": { - "version": "1.0.4", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "get-intrinsic": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/camel-case": { - "version": "4.1.2", - "license": "MIT", - "dependencies": { - "pascal-case": "^3.1.2", - "tslib": "^2.0.3" - } - }, - "node_modules/camelcase": { - "version": "6.3.0", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/caniuse-api": { - "version": "3.0.0", - "license": "MIT", - "dependencies": { - "browserslist": "^4.0.0", - "caniuse-lite": "^1.0.0", - "lodash.memoize": "^4.1.2", - "lodash.uniq": "^4.5.0" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001787", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "CC-BY-4.0" - }, - "node_modules/ccount": { - "version": "2.0.1", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/chalk": { - "version": "4.1.2", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/char-regex": { - "version": "1.0.2", - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/character-entities": { - "version": "2.0.2", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/character-entities-html4": { - "version": "2.1.0", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/character-entities-legacy": { - "version": "3.0.0", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/character-reference-invalid": { - "version": "2.0.1", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/cheerio": { - "version": "1.0.0-rc.12", - "license": "MIT", - "dependencies": { - "cheerio-select": "^2.1.0", - "dom-serializer": "^2.0.0", - "domhandler": "^5.0.3", - "domutils": "^3.0.1", - "htmlparser2": "^8.0.1", - "parse5": "^7.0.0", - "parse5-htmlparser2-tree-adapter": "^7.0.0" - }, - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/cheeriojs/cheerio?sponsor=1" - } - }, - "node_modules/cheerio-select": { - "version": "2.1.0", - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0", - "css-select": "^5.1.0", - "css-what": "^6.1.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3", - "domutils": "^3.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/chokidar": { - "version": "3.6.0", - "license": "MIT", - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chownr": { - "version": "3.0.0", - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=18" - } - }, - "node_modules/chrome-trace-event": { - "version": "1.0.4", - "license": "MIT", - "engines": { - "node": ">=6.0" - } - }, - "node_modules/ci-info": { - "version": "3.9.0", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/cjs-module-lexer": { - "version": "1.2.3", - "license": "MIT" - }, - "node_modules/clean-css": { - "version": "5.3.3", - "license": "MIT", - "dependencies": { - "source-map": "~0.6.0" - }, - "engines": { - "node": ">= 10.0" - } - }, - "node_modules/clean-css/node_modules/source-map": { - "version": "0.6.1", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/clean-stack": { - "version": "2.2.0", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/cli-boxes": { - "version": "3.0.0", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-table3": { - "version": "0.6.5", - "license": "MIT", - "dependencies": { - "string-width": "^4.2.0" - }, - "engines": { - "node": "10.* || >= 12.*" - }, - "optionalDependencies": { - "@colors/colors": "1.5.0" - } - }, - "node_modules/cli-table3/node_modules/emoji-regex": { - "version": "8.0.0", - "license": "MIT" - }, - "node_modules/cli-table3/node_modules/string-width": { - "version": "4.2.3", - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/clone-deep": { - "version": "4.0.1", - "license": "MIT", - "dependencies": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/clsx": { - "version": "2.1.1", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/code-block-writer": { - "version": "10.1.1", - "license": "MIT" - }, - "node_modules/collapse-white-space": { - "version": "2.1.0", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/color": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", - "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1", - "color-string": "^1.9.0" - }, - "engines": { - "node": ">=12.5.0" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "license": "MIT" - }, - "node_modules/color-string": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", - "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", - "license": "MIT", - "dependencies": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" - } - }, - "node_modules/colord": { - "version": "2.9.3", - "license": "MIT" - }, - "node_modules/colorette": { - "version": "2.0.20", - "license": "MIT" - }, - "node_modules/combine-promises": { - "version": "1.2.0", - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "license": "MIT", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/comma-separated-tokens": { - "version": "2.0.3", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/commander": { - "version": "5.1.0", - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/common-path-prefix": { - "version": "3.0.0", - "license": "ISC" - }, - "node_modules/compressible": { - "version": "2.0.18", - "license": "MIT", - "dependencies": { - "mime-db": ">= 1.43.0 < 2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/compression": { - "version": "1.8.1", - "license": "MIT", - "dependencies": { - "bytes": "3.1.2", - "compressible": "~2.0.18", - "debug": "2.6.9", - "negotiator": "~0.6.4", - "on-headers": "~1.1.0", - "safe-buffer": "5.2.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/compression/node_modules/bytes": { - "version": "3.1.2", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/compression/node_modules/debug": { - "version": "2.6.9", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/compression/node_modules/ms": { - "version": "2.0.0", - "license": "MIT" - }, - "node_modules/concat-map": { - "version": "0.0.1", - "license": "MIT" - }, - "node_modules/config-chain": { - "version": "1.1.13", - "license": "MIT", - "dependencies": { - "ini": "^1.3.4", - "proto-list": "~1.2.1" - } - }, - "node_modules/configstore": { - "version": "6.0.0", - "license": "BSD-2-Clause", - "dependencies": { - "dot-prop": "^6.0.1", - "graceful-fs": "^4.2.6", - "unique-string": "^3.0.0", - "write-file-atomic": "^3.0.3", - "xdg-basedir": "^5.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/yeoman/configstore?sponsor=1" - } - }, - "node_modules/connect-history-api-fallback": { - "version": "2.0.0", - "license": "MIT", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/consola": { - "version": "3.4.2", - "license": "MIT", - "engines": { - "node": "^14.18.0 || >=16.10.0" - } - }, - "node_modules/content-disposition": { - "version": "0.5.2", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/content-type": { - "version": "1.0.4", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/convert-hrtime": { - "version": "3.0.0", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "license": "MIT" - }, - "node_modules/cookie": { - "version": "0.7.2", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie-signature": { - "version": "1.0.7", - "license": "MIT" - }, - "node_modules/copy-text-to-clipboard": { - "version": "3.2.2", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/copy-webpack-plugin": { - "version": "11.0.0", - "license": "MIT", - "dependencies": { - "fast-glob": "^3.2.11", - "glob-parent": "^6.0.1", - "globby": "^13.1.1", - "normalize-path": "^3.0.0", - "schema-utils": "^4.0.0", - "serialize-javascript": "^6.0.0" - }, - "engines": { - "node": ">= 14.15.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.1.0" - } - }, - "node_modules/copy-webpack-plugin/node_modules/glob-parent": { - "version": "6.0.2", - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/copy-webpack-plugin/node_modules/globby": { - "version": "13.2.2", - "license": "MIT", - "dependencies": { - "dir-glob": "^3.0.1", - "fast-glob": "^3.3.0", - "ignore": "^5.2.4", - "merge2": "^1.4.1", - "slash": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/copy-webpack-plugin/node_modules/slash": { - "version": "4.0.0", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/core-js": { - "version": "3.48.0", - "hasInstallScript": true, - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/core-js-compat": { - "version": "3.49.0", - "license": "MIT", - "dependencies": { - "browserslist": "^4.28.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/core-util-is": { - "version": "1.0.3", - "license": "MIT" - }, - "node_modules/cosmiconfig": { - "version": "8.3.6", - "license": "MIT", - "dependencies": { - "import-fresh": "^3.3.0", - "js-yaml": "^4.1.0", - "parse-json": "^5.2.0", - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/d-fischer" - }, - "peerDependencies": { - "typescript": ">=4.9.5" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/crypto-random-string": { - "version": "4.0.0", - "license": "MIT", - "dependencies": { - "type-fest": "^1.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/crypto-random-string/node_modules/type-fest": { - "version": "1.4.0", - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/css-blank-pseudo": { - "version": "7.0.1", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "postcss-selector-parser": "^7.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/css-blank-pseudo/node_modules/postcss-selector-parser": { - "version": "7.1.1", - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/css-declaration-sorter": { - "version": "7.4.0", - "license": "ISC", - "engines": { - "node": "^14 || ^16 || >=18" - }, - "peerDependencies": { - "postcss": "^8.0.9" - } - }, - "node_modules/css-has-pseudo": { - "version": "7.0.3", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/selector-specificity": "^5.0.0", - "postcss-selector-parser": "^7.0.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/css-has-pseudo/node_modules/@csstools/selector-specificity": { - "version": "5.0.0", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss-selector-parser": "^7.0.0" - } - }, - "node_modules/css-has-pseudo/node_modules/postcss-selector-parser": { - "version": "7.1.1", - "license": "MIT", - "peer": true, - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/css-loader": { - "version": "6.11.0", - "license": "MIT", - "dependencies": { - "icss-utils": "^5.1.0", - "postcss": "^8.4.33", - "postcss-modules-extract-imports": "^3.1.0", - "postcss-modules-local-by-default": "^4.0.5", - "postcss-modules-scope": "^3.2.0", - "postcss-modules-values": "^4.0.0", - "postcss-value-parser": "^4.2.0", - "semver": "^7.5.4" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "@rspack/core": "0.x || 1.x", - "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "@rspack/core": { - "optional": true - }, - "webpack": { - "optional": true - } - } - }, - "node_modules/css-minimizer-webpack-plugin": { - "version": "5.0.1", - "license": "MIT", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.18", - "cssnano": "^6.0.1", - "jest-worker": "^29.4.3", - "postcss": "^8.4.24", - "schema-utils": "^4.0.1", - "serialize-javascript": "^6.0.1" - }, - "engines": { - "node": ">= 14.15.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "@parcel/css": { - "optional": true - }, - "@swc/css": { - "optional": true - }, - "clean-css": { - "optional": true - }, - "csso": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "lightningcss": { - "optional": true - } - } - }, - "node_modules/css-prefers-color-scheme": { - "version": "10.0.0", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/css-select": { - "version": "5.2.2", - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.1.0", - "domhandler": "^5.0.2", - "domutils": "^3.0.1", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/css-tree": { - "version": "2.3.1", - "license": "MIT", - "dependencies": { - "mdn-data": "2.0.30", - "source-map-js": "^1.0.1" - }, - "engines": { - "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" - } - }, - "node_modules/css-what": { - "version": "6.2.2", - "license": "BSD-2-Clause", - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/cssdb": { - "version": "8.8.0", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - } - ], - "license": "MIT-0" - }, - "node_modules/cssesc": { - "version": "3.0.0", - "license": "MIT", - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/cssnano": { - "version": "6.1.2", - "license": "MIT", - "dependencies": { - "cssnano-preset-default": "^6.1.2", - "lilconfig": "^3.1.1" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/cssnano" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/cssnano-preset-advanced": { - "version": "6.1.2", - "license": "MIT", - "dependencies": { - "autoprefixer": "^10.4.19", - "browserslist": "^4.23.0", - "cssnano-preset-default": "^6.1.2", - "postcss-discard-unused": "^6.0.5", - "postcss-merge-idents": "^6.0.3", - "postcss-reduce-idents": "^6.0.3", - "postcss-zindex": "^6.0.2" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/cssnano-preset-default": { - "version": "6.1.2", - "license": "MIT", - "dependencies": { - "browserslist": "^4.23.0", - "css-declaration-sorter": "^7.2.0", - "cssnano-utils": "^4.0.2", - "postcss-calc": "^9.0.1", - "postcss-colormin": "^6.1.0", - "postcss-convert-values": "^6.1.0", - "postcss-discard-comments": "^6.0.2", - "postcss-discard-duplicates": "^6.0.3", - "postcss-discard-empty": "^6.0.3", - "postcss-discard-overridden": "^6.0.2", - "postcss-merge-longhand": "^6.0.5", - "postcss-merge-rules": "^6.1.1", - "postcss-minify-font-values": "^6.1.0", - "postcss-minify-gradients": "^6.0.3", - "postcss-minify-params": "^6.1.0", - "postcss-minify-selectors": "^6.0.4", - "postcss-normalize-charset": "^6.0.2", - "postcss-normalize-display-values": "^6.0.2", - "postcss-normalize-positions": "^6.0.2", - "postcss-normalize-repeat-style": "^6.0.2", - "postcss-normalize-string": "^6.0.2", - "postcss-normalize-timing-functions": "^6.0.2", - "postcss-normalize-unicode": "^6.1.0", - "postcss-normalize-url": "^6.0.2", - "postcss-normalize-whitespace": "^6.0.2", - "postcss-ordered-values": "^6.0.2", - "postcss-reduce-initial": "^6.1.0", - "postcss-reduce-transforms": "^6.0.2", - "postcss-svgo": "^6.0.3", - "postcss-unique-selectors": "^6.0.4" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/cssnano-utils": { - "version": "4.0.2", - "license": "MIT", - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/csso": { - "version": "5.0.5", - "license": "MIT", - "dependencies": { - "css-tree": "~2.2.0" - }, - "engines": { - "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/csso/node_modules/css-tree": { - "version": "2.2.1", - "license": "MIT", - "dependencies": { - "mdn-data": "2.0.28", - "source-map-js": "^1.0.1" - }, - "engines": { - "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/csso/node_modules/mdn-data": { - "version": "2.0.28", - "license": "CC0-1.0" - }, - "node_modules/csstype": { - "version": "3.2.3", - "license": "MIT" - }, - "node_modules/data-uri-to-buffer": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz", - "integrity": "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==", - "license": "MIT", - "engines": { - "node": ">= 14" - } - }, - "node_modules/debounce": { - "version": "1.2.1", - "license": "MIT" - }, - "node_modules/debug": { - "version": "4.4.3", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decode-named-character-reference": { - "version": "1.3.0", - "license": "MIT", - "dependencies": { - "character-entities": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/decompress-response": { - "version": "6.0.0", - "license": "MIT", - "dependencies": { - "mimic-response": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/deep-extend": { - "version": "0.6.0", - "license": "MIT", - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/deepmerge": { - "version": "4.3.1", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/default-browser": { - "version": "5.5.0", - "license": "MIT", - "dependencies": { - "bundle-name": "^4.1.0", - "default-browser-id": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/default-browser-id": { - "version": "5.0.1", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/defer-to-connect": { - "version": "2.0.1", - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/define-data-property": { - "version": "1.1.4", - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/define-lazy-prop": { - "version": "2.0.0", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/define-properties": { - "version": "1.2.1", - "license": "MIT", - "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/degenerator": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz", - "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==", - "license": "MIT", - "dependencies": { - "ast-types": "^0.13.4", - "escodegen": "^2.1.0", - "esprima": "^4.0.1" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/depd": { - "version": "2.0.0", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/dequal": { - "version": "2.0.3", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/destroy": { - "version": "1.2.0", - "license": "MIT", - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/detect-libc": { - "version": "2.1.2", - "license": "Apache-2.0", - "engines": { - "node": ">=8" - } - }, - "node_modules/detect-node": { - "version": "2.1.0", - "license": "MIT" - }, - "node_modules/detect-port": { - "version": "1.6.1", - "license": "MIT", - "dependencies": { - "address": "^1.0.1", - "debug": "4" - }, - "bin": { - "detect": "bin/detect-port.js", - "detect-port": "bin/detect-port.js" - }, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/devlop": { - "version": "1.1.0", - "license": "MIT", - "dependencies": { - "dequal": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "license": "MIT", - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/dns-packet": { - "version": "5.6.1", - "license": "MIT", - "dependencies": { - "@leichtgewicht/ip-codec": "^2.0.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/docusaurus-plugin-generate-llms-txt": { - "version": "0.0.1", - "license": "MIT", - "dependencies": { - "js-yaml": "^4.1.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@docusaurus/core": ">=2.0.0" - } - }, - "node_modules/dom-converter": { - "version": "0.2.0", - "license": "MIT", - "dependencies": { - "utila": "~0.4" - } - }, - "node_modules/dom-serializer": { - "version": "2.0.0", - "license": "MIT", - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "entities": "^4.2.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/domelementtype": { - "version": "2.3.0", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "license": "BSD-2-Clause" - }, - "node_modules/domhandler": { - "version": "5.0.3", - "license": "BSD-2-Clause", - "dependencies": { - "domelementtype": "^2.3.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/domutils": { - "version": "3.2.2", - "license": "BSD-2-Clause", - "dependencies": { - "dom-serializer": "^2.0.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "node_modules/dot-case": { - "version": "3.0.4", - "license": "MIT", - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/dot-prop": { - "version": "6.0.1", - "license": "MIT", - "dependencies": { - "is-obj": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/dot-prop/node_modules/is-obj": { - "version": "2.0.0", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/duplexer": { - "version": "0.1.2", - "license": "MIT" - }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "license": "MIT" - }, - "node_modules/edge-runtime": { - "version": "2.5.9", - "license": "MPL-2.0", - "dependencies": { - "@edge-runtime/format": "2.2.1", - "@edge-runtime/ponyfill": "2.4.2", - "@edge-runtime/vm": "3.2.0", - "async-listen": "3.0.1", - "mri": "1.2.0", - "picocolors": "1.0.0", - "pretty-ms": "7.0.1", - "signal-exit": "4.0.2", - "time-span": "4.0.0" - }, - "bin": { - "edge-runtime": "dist/cli/index.js" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/edge-runtime/node_modules/async-listen": { - "version": "3.0.1", - "license": "MIT", - "engines": { - "node": ">= 14" - } - }, - "node_modules/edge-runtime/node_modules/picocolors": { - "version": "1.0.0", - "license": "ISC" - }, - "node_modules/ee-first": { - "version": "1.1.1", - "license": "MIT" - }, - "node_modules/electron-to-chromium": { - "version": "1.5.286", - "license": "ISC" - }, - "node_modules/emoji-regex": { - "version": "9.2.2", - "license": "MIT" - }, - "node_modules/emojilib": { - "version": "2.4.0", - "license": "MIT" - }, - "node_modules/emojis-list": { - "version": "3.0.0", - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/emoticon": { - "version": "4.1.0", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/encodeurl": { - "version": "2.0.0", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/end-of-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.1.0.tgz", - "integrity": "sha512-EoulkdKF/1xa92q25PbjuDcgJ9RDHYU2Rs3SCIvs2/dSQ3BpmxneNHmA/M7fe60M3PrV7nNGTTNbkK62l6vXiQ==", - "license": "MIT", - "dependencies": { - "once": "~1.3.0" - } - }, - "node_modules/enhanced-resolve": { - "version": "5.19.0", - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.3.0" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/entities": { - "version": "4.5.0", - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/error-ex": { - "version": "1.3.4", - "license": "MIT", - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/es-define-property": { - "version": "1.0.1", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-module-lexer": { - "version": "1.4.1", - "license": "MIT" - }, - "node_modules/es-object-atoms": { - "version": "1.1.1", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-set-tostringtag": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", - "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/esast-util-from-estree": { - "version": "2.0.0", - "license": "MIT", - "dependencies": { - "@types/estree-jsx": "^1.0.0", - "devlop": "^1.0.0", - "estree-util-visit": "^2.0.0", - "unist-util-position-from-estree": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/esast-util-from-js": { - "version": "2.0.1", - "license": "MIT", - "dependencies": { - "@types/estree-jsx": "^1.0.0", - "acorn": "^8.0.0", - "esast-util-from-estree": "^2.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/esbuild": { - "version": "0.27.0", - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.27.0", - "@esbuild/android-arm": "0.27.0", - "@esbuild/android-arm64": "0.27.0", - "@esbuild/android-x64": "0.27.0", - "@esbuild/darwin-arm64": "0.27.0", - "@esbuild/darwin-x64": "0.27.0", - "@esbuild/freebsd-arm64": "0.27.0", - "@esbuild/freebsd-x64": "0.27.0", - "@esbuild/linux-arm": "0.27.0", - "@esbuild/linux-arm64": "0.27.0", - "@esbuild/linux-ia32": "0.27.0", - "@esbuild/linux-loong64": "0.27.0", - "@esbuild/linux-mips64el": "0.27.0", - "@esbuild/linux-ppc64": "0.27.0", - "@esbuild/linux-riscv64": "0.27.0", - "@esbuild/linux-s390x": "0.27.0", - "@esbuild/linux-x64": "0.27.0", - "@esbuild/netbsd-arm64": "0.27.0", - "@esbuild/netbsd-x64": "0.27.0", - "@esbuild/openbsd-arm64": "0.27.0", - "@esbuild/openbsd-x64": "0.27.0", - "@esbuild/openharmony-arm64": "0.27.0", - "@esbuild/sunos-x64": "0.27.0", - "@esbuild/win32-arm64": "0.27.0", - "@esbuild/win32-ia32": "0.27.0", - "@esbuild/win32-x64": "0.27.0" - } - }, - "node_modules/escalade": { - "version": "3.2.0", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-goat": { - "version": "4.0.0", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "license": "MIT" - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/escodegen": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", - "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", - "license": "BSD-2-Clause", - "dependencies": { - "esprima": "^4.0.1", - "estraverse": "^5.2.0", - "esutils": "^2.0.2" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" - }, - "engines": { - "node": ">=6.0" - }, - "optionalDependencies": { - "source-map": "~0.6.1" - } - }, - "node_modules/escodegen/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/escodegen/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "license": "BSD-3-Clause", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint-scope": { - "version": "5.1.1", - "license": "BSD-2-Clause", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "license": "BSD-2-Clause", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "license": "BSD-2-Clause", - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esrecurse/node_modules/estraverse": { - "version": "5.3.0", - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "4.3.0", - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estree-util-attach-comments": { - "version": "3.0.0", - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/estree-util-build-jsx": { - "version": "3.0.1", - "license": "MIT", - "dependencies": { - "@types/estree-jsx": "^1.0.0", - "devlop": "^1.0.0", - "estree-util-is-identifier-name": "^3.0.0", - "estree-walker": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/estree-util-is-identifier-name": { - "version": "3.0.0", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/estree-util-scope": { - "version": "1.0.0", - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0", - "devlop": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/estree-util-to-js": { - "version": "2.0.0", - "license": "MIT", - "dependencies": { - "@types/estree-jsx": "^1.0.0", - "astring": "^1.8.0", - "source-map": "^0.7.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/estree-util-value-to-estree": { - "version": "3.5.0", - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/remcohaszing" - } - }, - "node_modules/estree-util-visit": { - "version": "2.0.0", - "license": "MIT", - "dependencies": { - "@types/estree-jsx": "^1.0.0", - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/estree-walker": { - "version": "3.0.3", - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eta": { - "version": "2.2.0", - "license": "MIT", - "engines": { - "node": ">=6.0.0" - }, - "funding": { - "url": "https://github.com/eta-dev/eta?sponsor=1" - } - }, - "node_modules/etag": { - "version": "1.8.1", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/eval": { - "version": "0.1.8", - "dependencies": { - "@types/node": "*", - "require-like": ">= 0.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/eventemitter3": { - "version": "4.0.7", - "license": "MIT" - }, - "node_modules/events": { - "version": "3.3.0", - "license": "MIT", - "engines": { - "node": ">=0.8.x" - } - }, - "node_modules/events-intercept": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/events-intercept/-/events-intercept-2.0.0.tgz", - "integrity": "sha512-blk1va0zol9QOrdZt0rFXo5KMkNPVSp92Eju/Qz8THwKWKRKeE0T8Br/1aW6+Edkyq9xHYgYxn2QtOnUKPUp+Q==", - "license": "MIT" - }, - "node_modules/events-universal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/events-universal/-/events-universal-1.0.1.tgz", - "integrity": "sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==", - "license": "Apache-2.0", - "dependencies": { - "bare-events": "^2.7.0" - } - }, - "node_modules/execa": { - "version": "5.1.1", - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/execa/node_modules/signal-exit": { - "version": "3.0.7", - "license": "ISC" - }, - "node_modules/expand-template": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", - "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", - "license": "(MIT OR WTFPL)", - "engines": { - "node": ">=6" - } - }, - "node_modules/express": { - "version": "4.22.1", - "license": "MIT", - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "~1.20.3", - "content-disposition": "~0.5.4", - "content-type": "~1.0.4", - "cookie": "~0.7.1", - "cookie-signature": "~1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "~1.3.1", - "fresh": "~0.5.2", - "http-errors": "~2.0.0", - "merge-descriptors": "1.0.3", - "methods": "~1.1.2", - "on-finished": "~2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "~0.1.12", - "proxy-addr": "~2.0.7", - "qs": "~6.14.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "~0.19.0", - "serve-static": "~1.16.2", - "setprototypeof": "1.2.0", - "statuses": "~2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/express/node_modules/content-disposition": { - "version": "0.5.4", - "license": "MIT", - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/express/node_modules/debug": { - "version": "2.6.9", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/express/node_modules/http-errors": { - "version": "2.0.1", - "license": "MIT", - "dependencies": { - "depd": "~2.0.0", - "inherits": "~2.0.4", - "setprototypeof": "~1.2.0", - "statuses": "~2.0.2", - "toidentifier": "~1.0.1" - }, - "engines": { - "node": ">= 0.8" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/express/node_modules/ms": { - "version": "2.0.0", - "license": "MIT" - }, - "node_modules/express/node_modules/path-to-regexp": { - "version": "0.1.12", - "license": "MIT" - }, - "node_modules/express/node_modules/range-parser": { - "version": "1.2.1", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/express/node_modules/statuses": { - "version": "2.0.2", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/extend": { - "version": "3.0.2", - "license": "MIT" - }, - "node_modules/extend-shallow": { - "version": "2.0.1", - "license": "MIT", - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "license": "MIT" - }, - "node_modules/fast-fifo": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", - "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", - "license": "MIT" - }, - "node_modules/fast-glob": { - "version": "3.3.3", - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.8" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "license": "MIT" - }, - "node_modules/fast-uri": { - "version": "3.1.0", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fastify" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fastify" - } - ], - "license": "BSD-3-Clause" - }, - "node_modules/fastq": { - "version": "1.20.1", - "license": "ISC", - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/fault": { - "version": "2.0.1", - "license": "MIT", - "dependencies": { - "format": "^0.2.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/faye-websocket": { - "version": "0.11.4", - "license": "Apache-2.0", - "dependencies": { - "websocket-driver": ">=0.5.1" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", - "license": "MIT", - "dependencies": { - "pend": "~1.2.0" - } - }, - "node_modules/feed": { - "version": "4.2.2", - "license": "MIT", - "dependencies": { - "xml-js": "^1.6.11" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/figures": { - "version": "3.2.0", - "license": "MIT", - "dependencies": { - "escape-string-regexp": "^1.0.5" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/figures/node_modules/escape-string-regexp": { - "version": "1.0.5", - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/file-loader": { - "version": "6.2.0", - "license": "MIT", - "dependencies": { - "loader-utils": "^2.0.0", - "schema-utils": "^3.0.0" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" - } - }, - "node_modules/file-loader/node_modules/ajv": { - "version": "6.14.0", - "license": "MIT", - "peer": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/file-loader/node_modules/ajv-keywords": { - "version": "3.5.2", - "license": "MIT", - "peerDependencies": { - "ajv": "^6.9.1" - } - }, - "node_modules/file-loader/node_modules/json-schema-traverse": { - "version": "0.4.1", - "license": "MIT" - }, - "node_modules/file-loader/node_modules/schema-utils": { - "version": "3.3.0", - "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "license": "MIT" - }, - "node_modules/fill-range": { - "version": "7.1.1", - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/finalhandler": { - "version": "1.3.2", - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "on-finished": "~2.4.1", - "parseurl": "~1.3.3", - "statuses": "~2.0.2", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/finalhandler/node_modules/debug": { - "version": "2.6.9", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/finalhandler/node_modules/ms": { - "version": "2.0.0", - "license": "MIT" - }, - "node_modules/finalhandler/node_modules/statuses": { - "version": "2.0.2", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/find-cache-dir": { - "version": "4.0.0", - "license": "MIT", - "dependencies": { - "common-path-prefix": "^3.0.0", - "pkg-dir": "^7.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/find-up": { - "version": "6.3.0", - "license": "MIT", - "dependencies": { - "locate-path": "^7.1.0", - "path-exists": "^5.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flat": { - "version": "5.0.2", - "license": "BSD-3-Clause", - "bin": { - "flat": "cli.js" - } - }, - "node_modules/follow-redirects": { - "version": "1.15.11", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "license": "MIT", - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/form-data": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.6.tgz", - "integrity": "sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ==", - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "es-set-tostringtag": "^2.1.0", - "hasown": "^2.0.4", - "mime-types": "^2.1.35" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/form-data-encoder": { - "version": "2.1.4", - "license": "MIT", - "engines": { - "node": ">= 14.17" - } - }, - "node_modules/format": { - "version": "0.2.2", - "engines": { - "node": ">=0.4.x" - } - }, - "node_modules/forwarded": { - "version": "0.2.0", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fraction.js": { - "version": "5.3.4", - "license": "MIT", - "engines": { - "node": "*" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/rawify" - } - }, - "node_modules/fresh": { - "version": "0.5.2", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "license": "MIT" - }, - "node_modules/fs-extra": { - "version": "11.3.3", - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/fsevents": { - "version": "2.3.3", - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/generic-pool": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-3.4.2.tgz", - "integrity": "sha512-H7cUpwCQSiJmAHM4c/aFu6fUfrhWXW1ncyh8ftxEPMu6AiYkHw9K8br720TGPZJbk5eOH2bynjZD1yPvdDAmag==", - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-intrinsic": { - "version": "1.3.0", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-own-enumerable-property-symbols": { - "version": "3.0.2", - "license": "ISC" - }, - "node_modules/get-port": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/get-port/-/get-port-5.1.1.tgz", - "integrity": "sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==", - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/get-proto": { - "version": "1.0.1", - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/get-stream": { - "version": "6.0.1", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/get-tsconfig": { - "version": "4.14.0", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.14.0.tgz", - "integrity": "sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA==", - "license": "MIT", - "dependencies": { - "resolve-pkg-maps": "^1.0.0" - }, - "funding": { - "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" - } - }, - "node_modules/get-uri": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.5.tgz", - "integrity": "sha512-b1O07XYq8eRuVzBNgJLstU6FYc1tS6wnMtF1I1D9lE8LxZSOGZ7LhxN54yPP6mGw5f2CkXY2BQUL9Fx41qvcIg==", - "license": "MIT", - "dependencies": { - "basic-ftp": "^5.0.2", - "data-uri-to-buffer": "^6.0.2", - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/github-from-package": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", - "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", - "license": "MIT" - }, - "node_modules/github-slugger": { - "version": "1.5.0", - "license": "ISC" - }, - "node_modules/glob": { - "version": "13.0.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.6.tgz", - "integrity": "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==", - "license": "BlueOak-1.0.0", - "dependencies": { - "minimatch": "^10.2.2", - "minipass": "^7.1.3", - "path-scurry": "^2.0.2" - }, - "engines": { - "node": "18 || 20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "5.1.2", - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/glob-to-regex.js": { - "version": "1.2.0", - "license": "Apache-2.0", - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/glob-to-regexp": { - "version": "0.4.1", - "license": "BSD-2-Clause" - }, - "node_modules/glob/node_modules/balanced-match": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", - "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", - "license": "MIT", - "engines": { - "node": "18 || 20 || >=22" - } - }, - "node_modules/glob/node_modules/brace-expansion": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", - "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", - "license": "MIT", - "dependencies": { - "balanced-match": "^4.0.2" - }, - "engines": { - "node": "18 || 20 || >=22" - } - }, - "node_modules/glob/node_modules/minimatch": { - "version": "10.2.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", - "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", - "license": "BlueOak-1.0.0", - "dependencies": { - "brace-expansion": "^5.0.5" - }, - "engines": { - "node": "18 || 20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/global-dirs": { - "version": "3.0.1", - "license": "MIT", - "dependencies": { - "ini": "2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/global-dirs/node_modules/ini": { - "version": "2.0.0", - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/globby": { - "version": "11.1.0", - "license": "MIT", - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/gopd": { - "version": "1.2.0", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/got": { - "version": "12.6.1", - "license": "MIT", - "dependencies": { - "@sindresorhus/is": "^5.2.0", - "@szmarczak/http-timer": "^5.0.1", - "cacheable-lookup": "^7.0.0", - "cacheable-request": "^10.2.8", - "decompress-response": "^6.0.0", - "form-data-encoder": "^2.1.2", - "get-stream": "^6.0.1", - "http2-wrapper": "^2.1.10", - "lowercase-keys": "^3.0.0", - "p-cancelable": "^3.0.0", - "responselike": "^3.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sindresorhus/got?sponsor=1" - } - }, - "node_modules/got/node_modules/@sindresorhus/is": { - "version": "5.6.0", - "license": "MIT", - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "license": "ISC" - }, - "node_modules/gray-matter": { - "version": "4.0.3", - "license": "MIT", - "dependencies": { - "js-yaml": "^3.13.1", - "kind-of": "^6.0.2", - "section-matter": "^1.0.0", - "strip-bom-string": "^1.0.0" - }, - "engines": { - "node": ">=6.0" - } - }, - "node_modules/gray-matter/node_modules/argparse": { - "version": "1.0.10", - "license": "MIT", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/gray-matter/node_modules/js-yaml": { - "version": "3.14.2", - "license": "MIT", - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/gzip-size": { - "version": "6.0.0", - "license": "MIT", - "dependencies": { - "duplexer": "^0.1.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/handle-thing": { - "version": "2.0.1", - "license": "MIT" - }, - "node_modules/has-flag": { - "version": "4.0.0", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.2", - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.1.0", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "license": "MIT", - "dependencies": { - "has-symbols": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-yarn": { - "version": "3.0.0", - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/hasown": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", - "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/hast-util-from-parse5": { - "version": "8.0.3", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/unist": "^3.0.0", - "devlop": "^1.0.0", - "hastscript": "^9.0.0", - "property-information": "^7.0.0", - "vfile": "^6.0.0", - "vfile-location": "^5.0.0", - "web-namespaces": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-parse-selector": { - "version": "4.0.0", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-raw": { - "version": "9.1.0", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/unist": "^3.0.0", - "@ungap/structured-clone": "^1.0.0", - "hast-util-from-parse5": "^8.0.0", - "hast-util-to-parse5": "^8.0.0", - "html-void-elements": "^3.0.0", - "mdast-util-to-hast": "^13.0.0", - "parse5": "^7.0.0", - "unist-util-position": "^5.0.0", - "unist-util-visit": "^5.0.0", - "vfile": "^6.0.0", - "web-namespaces": "^2.0.0", - "zwitch": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-to-estree": { - "version": "3.1.3", - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0", - "@types/estree-jsx": "^1.0.0", - "@types/hast": "^3.0.0", - "comma-separated-tokens": "^2.0.0", - "devlop": "^1.0.0", - "estree-util-attach-comments": "^3.0.0", - "estree-util-is-identifier-name": "^3.0.0", - "hast-util-whitespace": "^3.0.0", - "mdast-util-mdx-expression": "^2.0.0", - "mdast-util-mdx-jsx": "^3.0.0", - "mdast-util-mdxjs-esm": "^2.0.0", - "property-information": "^7.0.0", - "space-separated-tokens": "^2.0.0", - "style-to-js": "^1.0.0", - "unist-util-position": "^5.0.0", - "zwitch": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-to-jsx-runtime": { - "version": "2.3.6", - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0", - "@types/hast": "^3.0.0", - "@types/unist": "^3.0.0", - "comma-separated-tokens": "^2.0.0", - "devlop": "^1.0.0", - "estree-util-is-identifier-name": "^3.0.0", - "hast-util-whitespace": "^3.0.0", - "mdast-util-mdx-expression": "^2.0.0", - "mdast-util-mdx-jsx": "^3.0.0", - "mdast-util-mdxjs-esm": "^2.0.0", - "property-information": "^7.0.0", - "space-separated-tokens": "^2.0.0", - "style-to-js": "^1.0.0", - "unist-util-position": "^5.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-to-parse5": { - "version": "8.0.1", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "comma-separated-tokens": "^2.0.0", - "devlop": "^1.0.0", - "property-information": "^7.0.0", - "space-separated-tokens": "^2.0.0", - "web-namespaces": "^2.0.0", - "zwitch": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-whitespace": { - "version": "3.0.0", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hastscript": { - "version": "9.0.1", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "comma-separated-tokens": "^2.0.0", - "hast-util-parse-selector": "^4.0.0", - "property-information": "^7.0.0", - "space-separated-tokens": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/he": { - "version": "1.2.0", - "license": "MIT", - "bin": { - "he": "bin/he" - } - }, - "node_modules/history": { - "version": "4.10.1", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.1.2", - "loose-envify": "^1.2.0", - "resolve-pathname": "^3.0.0", - "tiny-invariant": "^1.0.2", - "tiny-warning": "^1.0.0", - "value-equal": "^1.0.1" - } - }, - "node_modules/hoist-non-react-statics": { - "version": "3.3.2", - "license": "BSD-3-Clause", - "dependencies": { - "react-is": "^16.7.0" - } - }, - "node_modules/hpack.js": { - "version": "2.1.6", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.1", - "obuf": "^1.0.0", - "readable-stream": "^2.0.1", - "wbuf": "^1.1.0" - } - }, - "node_modules/hpack.js/node_modules/readable-stream": { - "version": "2.3.8", - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/hpack.js/node_modules/safe-buffer": { - "version": "5.1.2", - "license": "MIT" - }, - "node_modules/hpack.js/node_modules/string_decoder": { - "version": "1.1.1", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/html-escaper": { - "version": "2.0.2", - "license": "MIT" - }, - "node_modules/html-minifier-terser": { - "version": "7.2.0", - "license": "MIT", - "dependencies": { - "camel-case": "^4.1.2", - "clean-css": "~5.3.2", - "commander": "^10.0.0", - "entities": "^4.4.0", - "param-case": "^3.0.4", - "relateurl": "^0.2.7", - "terser": "^5.15.1" - }, - "bin": { - "html-minifier-terser": "cli.js" - }, - "engines": { - "node": "^14.13.1 || >=16.0.0" - } - }, - "node_modules/html-minifier-terser/node_modules/commander": { - "version": "10.0.1", - "license": "MIT", - "engines": { - "node": ">=14" - } - }, - "node_modules/html-tags": { - "version": "3.3.1", - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/html-void-elements": { - "version": "3.0.0", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/html-webpack-plugin": { - "version": "5.6.6", - "license": "MIT", - "dependencies": { - "@types/html-minifier-terser": "^6.0.0", - "html-minifier-terser": "^6.0.2", - "lodash": "^4.17.21", - "pretty-error": "^4.0.0", - "tapable": "^2.0.0" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/html-webpack-plugin" - }, - "peerDependencies": { - "@rspack/core": "0.x || 1.x", - "webpack": "^5.20.0" - }, - "peerDependenciesMeta": { - "@rspack/core": { - "optional": true - }, - "webpack": { - "optional": true - } - } - }, - "node_modules/html-webpack-plugin/node_modules/commander": { - "version": "8.3.0", - "license": "MIT", - "engines": { - "node": ">= 12" - } - }, - "node_modules/html-webpack-plugin/node_modules/html-minifier-terser": { - "version": "6.1.0", - "license": "MIT", - "dependencies": { - "camel-case": "^4.1.2", - "clean-css": "^5.2.2", - "commander": "^8.3.0", - "he": "^1.2.0", - "param-case": "^3.0.4", - "relateurl": "^0.2.7", - "terser": "^5.10.0" - }, - "bin": { - "html-minifier-terser": "cli.js" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/htmlparser2": { - "version": "8.0.2", - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "license": "MIT", - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3", - "domutils": "^3.0.1", - "entities": "^4.4.0" - } - }, - "node_modules/http-cache-semantics": { - "version": "4.2.0", - "license": "BSD-2-Clause" - }, - "node_modules/http-deceiver": { - "version": "1.2.7", - "license": "MIT" - }, - "node_modules/http-errors": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz", - "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==", - "license": "MIT", - "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.4", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/http-errors/node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/http-errors/node_modules/setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", - "license": "ISC" - }, - "node_modules/http-errors/node_modules/toidentifier": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", - "license": "MIT", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/http-parser-js": { - "version": "0.5.10", - "license": "MIT" - }, - "node_modules/http-proxy": { - "version": "1.18.1", - "license": "MIT", - "dependencies": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/http-proxy-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", - "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.0", - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/http-proxy-middleware": { - "version": "2.0.9", - "license": "MIT", - "dependencies": { - "@types/http-proxy": "^1.17.8", - "http-proxy": "^1.18.1", - "is-glob": "^4.0.1", - "is-plain-obj": "^3.0.0", - "micromatch": "^4.0.2" - }, - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "@types/express": "^4.17.13" - }, - "peerDependenciesMeta": { - "@types/express": { - "optional": true - } - } - }, - "node_modules/http-proxy-middleware/node_modules/is-plain-obj": { - "version": "3.0.0", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/http2-wrapper": { - "version": "2.2.1", - "license": "MIT", - "dependencies": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.2.0" - }, - "engines": { - "node": ">=10.19.0" - } - }, - "node_modules/https-proxy-agent": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", - "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/human-signals": { - "version": "2.1.0", - "license": "Apache-2.0", - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/hyperdyperid": { - "version": "1.2.0", - "license": "MIT", - "engines": { - "node": ">=10.18" - } - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/icss-utils": { - "version": "5.1.0", - "license": "ISC", - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "BSD-3-Clause" - }, - "node_modules/ignore": { - "version": "5.3.2", - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/image-size": { - "version": "2.0.2", - "license": "MIT", - "bin": { - "image-size": "bin/image-size.js" - }, - "engines": { - "node": ">=16.x" - } - }, - "node_modules/import-fresh": { - "version": "3.3.1", - "license": "MIT", - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/import-fresh/node_modules/resolve-from": { - "version": "4.0.0", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/import-lazy": { - "version": "4.0.0", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "license": "MIT", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/indent-string": { - "version": "4.0.0", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/infima": { - "version": "0.2.0-alpha.45", - "license": "MIT", - "engines": { - "node": ">=12" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "license": "ISC" - }, - "node_modules/ini": { - "version": "1.3.8", - "license": "ISC" - }, - "node_modules/inline-style-parser": { - "version": "0.2.7", - "license": "MIT" - }, - "node_modules/invariant": { - "version": "2.2.4", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.0.0" - } - }, - "node_modules/ip-address": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.2.0.tgz", - "integrity": "sha512-/+S6j4E9AHvW9SWMSEY9Xfy66O5PWvVEJ08O0y5JGyEKQpojb0K0GKpz/v5HJ/G0vi3D2sjGK78119oXZeE0qA==", - "license": "MIT", - "engines": { - "node": ">= 12" - } - }, - "node_modules/ipaddr.js": { - "version": "2.3.0", - "license": "MIT", - "engines": { - "node": ">= 10" - } - }, - "node_modules/is-alphabetical": { - "version": "2.0.1", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-alphanumerical": { - "version": "2.0.1", - "license": "MIT", - "dependencies": { - "is-alphabetical": "^2.0.0", - "is-decimal": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "license": "MIT" - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "license": "MIT", - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-buffer": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", - "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/is-ci": { - "version": "3.0.1", - "license": "MIT", - "dependencies": { - "ci-info": "^3.2.0" - }, - "bin": { - "is-ci": "bin.js" - } - }, - "node_modules/is-core-module": { - "version": "2.16.1", - "license": "MIT", - "dependencies": { - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-decimal": { - "version": "2.0.1", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-docker": { - "version": "2.2.1", - "license": "MIT", - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-extendable": { - "version": "0.1.1", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "license": "MIT", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-hexadecimal": { - "version": "2.0.1", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-inside-container": { - "version": "1.0.0", - "license": "MIT", - "dependencies": { - "is-docker": "^3.0.0" - }, - "bin": { - "is-inside-container": "cli.js" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-inside-container/node_modules/is-docker": { - "version": "3.0.0", - "license": "MIT", - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-installed-globally": { - "version": "0.4.0", - "license": "MIT", - "dependencies": { - "global-dirs": "^3.0.0", - "is-path-inside": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-network-error": { - "version": "1.3.0", - "license": "MIT", - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-node-process": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-node-process/-/is-node-process-1.2.0.tgz", - "integrity": "sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==", - "license": "MIT" - }, - "node_modules/is-npm": { - "version": "6.1.0", - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-obj": { - "version": "1.0.1", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-plain-obj": { - "version": "4.1.0", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-plain-object": { - "version": "2.0.4", - "license": "MIT", - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-regexp": { - "version": "1.0.0", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-stream": { - "version": "2.0.1", - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "license": "MIT" - }, - "node_modules/is-wsl": { - "version": "2.2.0", - "license": "MIT", - "dependencies": { - "is-docker": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-yarn-global": { - "version": "0.4.1", - "license": "MIT", - "engines": { - "node": ">=12" - } - }, - "node_modules/isarray": { - "version": "1.0.0", - "license": "MIT" - }, - "node_modules/isexe": { - "version": "2.0.0", - "license": "ISC" - }, - "node_modules/isobject": { - "version": "3.0.1", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/jest-util": { - "version": "29.7.0", - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-util/node_modules/picomatch": { - "version": "2.3.2", - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/jest-worker": { - "version": "29.7.0", - "license": "MIT", - "dependencies": { - "@types/node": "*", - "jest-util": "^29.7.0", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-worker/node_modules/supports-color": { - "version": "8.1.1", - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/jiti": { - "version": "1.21.7", - "license": "MIT", - "bin": { - "jiti": "bin/jiti.js" - } - }, - "node_modules/joi": { - "version": "17.13.3", - "license": "BSD-3-Clause", - "dependencies": { - "@hapi/hoek": "^9.3.0", - "@hapi/topo": "^5.1.0", - "@sideway/address": "^4.1.5", - "@sideway/formula": "^3.0.1", - "@sideway/pinpoint": "^2.0.0" - } - }, - "node_modules/jose": { - "version": "5.9.6", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/panva" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "license": "MIT" - }, - "node_modules/js-yaml": { - "version": "4.1.1", - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsesc": { - "version": "3.1.0", - "license": "MIT", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/json-buffer": { - "version": "3.0.1", - "license": "MIT" - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "license": "MIT" - }, - "node_modules/json-schema-to-ts": { - "version": "1.6.4", - "resolved": "https://registry.npmjs.org/json-schema-to-ts/-/json-schema-to-ts-1.6.4.tgz", - "integrity": "sha512-pR4yQ9DHz6itqswtHCm26mw45FSNfQ9rEQjosaZErhn5J3J2sIViQiz8rDaezjKAhFGpmsoczYVBgGHzFw/stA==", - "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.6", - "ts-toolbelt": "^6.15.5" - } - }, - "node_modules/json-schema-traverse": { - "version": "1.0.0", - "license": "MIT" - }, - "node_modules/json5": { - "version": "2.2.3", - "license": "MIT", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsonfile": { - "version": "6.2.0", - "license": "MIT", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/jsonlines": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsonlines/-/jsonlines-0.1.1.tgz", - "integrity": "sha512-ekDrAGso79Cvf+dtm+mL8OBI2bmAOt3gssYs833De/C9NmIpWDWyUO4zPgB5x2/OhY366dkhgfPMYfwZF7yOZA==", - "license": "MIT" - }, - "node_modules/keyv": { - "version": "4.5.4", - "license": "MIT", - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/kind-of": { - "version": "6.0.3", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/kleur": { - "version": "3.0.3", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/latest-version": { - "version": "7.0.0", - "license": "MIT", - "dependencies": { - "package-json": "^8.1.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/launch-editor": { - "version": "2.12.0", - "license": "MIT", - "dependencies": { - "picocolors": "^1.1.1", - "shell-quote": "^1.8.3" - } - }, - "node_modules/leven": { - "version": "3.1.0", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/lightningcss": { - "version": "1.32.0", - "license": "MPL-2.0", - "dependencies": { - "detect-libc": "^2.0.3" - }, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - }, - "optionalDependencies": { - "lightningcss-android-arm64": "1.32.0", - "lightningcss-darwin-arm64": "1.32.0", - "lightningcss-darwin-x64": "1.32.0", - "lightningcss-freebsd-x64": "1.32.0", - "lightningcss-linux-arm-gnueabihf": "1.32.0", - "lightningcss-linux-arm64-gnu": "1.32.0", - "lightningcss-linux-arm64-musl": "1.32.0", - "lightningcss-linux-x64-gnu": "1.32.0", - "lightningcss-linux-x64-musl": "1.32.0", - "lightningcss-win32-arm64-msvc": "1.32.0", - "lightningcss-win32-x64-msvc": "1.32.0" - } - }, - "node_modules/lightningcss-android-arm64": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", - "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", - "cpu": [ - "arm64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-darwin-arm64": { - "version": "1.32.0", - "cpu": [ - "arm64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-darwin-x64": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", - "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", - "cpu": [ - "x64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-freebsd-x64": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", - "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", - "cpu": [ - "x64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm-gnueabihf": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", - "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", - "cpu": [ - "arm" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm64-gnu": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", - "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", - "cpu": [ - "arm64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm64-musl": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", - "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", - "cpu": [ - "arm64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-x64-gnu": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", - "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", - "cpu": [ - "x64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-x64-musl": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", - "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", - "cpu": [ - "x64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-win32-arm64-msvc": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", - "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", - "cpu": [ - "arm64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-win32-x64-msvc": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", - "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", - "cpu": [ - "x64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lilconfig": { - "version": "3.1.3", - "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antonk52" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "license": "MIT" - }, - "node_modules/loader-runner": { - "version": "4.3.1", - "license": "MIT", - "engines": { - "node": ">=6.11.5" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/loader-utils": { - "version": "2.0.4", - "license": "MIT", - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - }, - "engines": { - "node": ">=8.9.0" - } - }, - "node_modules/locate-path": { - "version": "7.2.0", - "license": "MIT", - "dependencies": { - "p-locate": "^6.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash": { - "version": "4.17.23", - "license": "MIT" - }, - "node_modules/lodash.debounce": { - "version": "4.0.8", - "license": "MIT" - }, - "node_modules/lodash.memoize": { - "version": "4.1.2", - "license": "MIT" - }, - "node_modules/lodash.uniq": { - "version": "4.5.0", - "license": "MIT" - }, - "node_modules/longest-streak": { - "version": "3.1.0", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "license": "MIT", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/lower-case": { - "version": "2.0.2", - "license": "MIT", - "dependencies": { - "tslib": "^2.0.3" - } - }, - "node_modules/lowercase-keys": { - "version": "3.0.0", - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "license": "ISC", - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/luxon": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.7.2.tgz", - "integrity": "sha512-vtEhXh/gNjI9Yg1u4jX/0YVPMvxzHuGgCm6tC5kZyb08yjGWGnqAjGJvcXbqQR2P3MyMEFnRbpcdFS6PBcLqew==", - "license": "MIT", - "engines": { - "node": ">=12" - } - }, - "node_modules/markdown-extensions": { - "version": "2.0.0", - "license": "MIT", - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/markdown-table": { - "version": "3.0.4", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/math-intrinsics": { - "version": "1.1.0", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/mdast-util-directive": { - "version": "3.1.0", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "@types/unist": "^3.0.0", - "ccount": "^2.0.0", - "devlop": "^1.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0", - "parse-entities": "^4.0.0", - "stringify-entities": "^4.0.0", - "unist-util-visit-parents": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-find-and-replace": { - "version": "3.0.2", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "escape-string-regexp": "^5.0.0", - "unist-util-is": "^6.0.0", - "unist-util-visit-parents": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-find-and-replace/node_modules/escape-string-regexp": { - "version": "5.0.0", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mdast-util-from-markdown": { - "version": "2.0.3", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "@types/unist": "^3.0.0", - "decode-named-character-reference": "^1.0.0", - "devlop": "^1.0.0", - "mdast-util-to-string": "^4.0.0", - "micromark": "^4.0.0", - "micromark-util-decode-numeric-character-reference": "^2.0.0", - "micromark-util-decode-string": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0", - "unist-util-stringify-position": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-from-markdown/node_modules/micromark-util-symbol": { - "version": "2.0.1", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/mdast-util-frontmatter": { - "version": "2.0.1", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "devlop": "^1.0.0", - "escape-string-regexp": "^5.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0", - "micromark-extension-frontmatter": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-frontmatter/node_modules/escape-string-regexp": { - "version": "5.0.0", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mdast-util-gfm": { - "version": "3.1.0", - "license": "MIT", - "dependencies": { - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-gfm-autolink-literal": "^2.0.0", - "mdast-util-gfm-footnote": "^2.0.0", - "mdast-util-gfm-strikethrough": "^2.0.0", - "mdast-util-gfm-table": "^2.0.0", - "mdast-util-gfm-task-list-item": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm-autolink-literal": { - "version": "2.0.1", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "ccount": "^2.0.0", - "devlop": "^1.0.0", - "mdast-util-find-and-replace": "^3.0.0", - "micromark-util-character": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm-autolink-literal/node_modules/micromark-util-character": { - "version": "2.1.1", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/mdast-util-gfm-autolink-literal/node_modules/micromark-util-symbol": { - "version": "2.0.1", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/mdast-util-gfm-footnote": { - "version": "2.1.0", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "devlop": "^1.1.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm-strikethrough": { - "version": "2.0.0", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm-table": { - "version": "2.0.0", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "devlop": "^1.0.0", - "markdown-table": "^3.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm-task-list-item": { - "version": "2.0.0", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "devlop": "^1.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-mdx": { - "version": "3.0.0", - "license": "MIT", - "dependencies": { - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-mdx-expression": "^2.0.0", - "mdast-util-mdx-jsx": "^3.0.0", - "mdast-util-mdxjs-esm": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-mdx-expression": { - "version": "2.0.1", - "license": "MIT", - "dependencies": { - "@types/estree-jsx": "^1.0.0", - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "devlop": "^1.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-mdx-jsx": { - "version": "3.2.0", - "license": "MIT", - "dependencies": { - "@types/estree-jsx": "^1.0.0", - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "@types/unist": "^3.0.0", - "ccount": "^2.0.0", - "devlop": "^1.1.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0", - "parse-entities": "^4.0.0", - "stringify-entities": "^4.0.0", - "unist-util-stringify-position": "^4.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-mdxjs-esm": { - "version": "2.0.1", - "license": "MIT", - "dependencies": { - "@types/estree-jsx": "^1.0.0", - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "devlop": "^1.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-phrasing": { - "version": "4.1.0", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "unist-util-is": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-to-hast": { - "version": "13.2.1", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "@ungap/structured-clone": "^1.0.0", - "devlop": "^1.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "trim-lines": "^3.0.0", - "unist-util-position": "^5.0.0", - "unist-util-visit": "^5.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-to-markdown": { - "version": "2.1.2", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "@types/unist": "^3.0.0", - "longest-streak": "^3.0.0", - "mdast-util-phrasing": "^4.0.0", - "mdast-util-to-string": "^4.0.0", - "micromark-util-classify-character": "^2.0.0", - "micromark-util-decode-string": "^2.0.0", - "unist-util-visit": "^5.0.0", - "zwitch": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-to-string": { - "version": "4.0.0", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdn-data": { - "version": "2.0.30", - "license": "CC0-1.0" - }, - "node_modules/media-typer": { - "version": "0.3.0", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/memfs": { - "version": "4.56.10", - "license": "Apache-2.0", - "dependencies": { - "@jsonjoy.com/fs-core": "4.56.10", - "@jsonjoy.com/fs-fsa": "4.56.10", - "@jsonjoy.com/fs-node": "4.56.10", - "@jsonjoy.com/fs-node-builtins": "4.56.10", - "@jsonjoy.com/fs-node-to-fsa": "4.56.10", - "@jsonjoy.com/fs-node-utils": "4.56.10", - "@jsonjoy.com/fs-print": "4.56.10", - "@jsonjoy.com/fs-snapshot": "4.56.10", - "@jsonjoy.com/json-pack": "^1.11.0", - "@jsonjoy.com/util": "^1.9.0", - "glob-to-regex.js": "^1.0.1", - "thingies": "^2.5.0", - "tree-dump": "^1.0.3", - "tslib": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/merge-descriptors": { - "version": "1.0.3", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "license": "MIT" - }, - "node_modules/merge2": { - "version": "1.4.1", - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/methods": { - "version": "1.1.2", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/micro": { - "version": "9.3.5-canary.3", - "resolved": "https://registry.npmjs.org/micro/-/micro-9.3.5-canary.3.tgz", - "integrity": "sha512-viYIo9PefV+w9dvoIBh1gI44Mvx1BOk67B4BpC2QK77qdY0xZF0Q+vWLt/BII6cLkIc8rLmSIcJaB/OrXXKe1g==", - "license": "MIT", - "dependencies": { - "arg": "4.1.0", - "content-type": "1.0.4", - "raw-body": "2.4.1" - }, - "bin": { - "micro": "bin/micro.js" - }, - "engines": { - "node": ">= 8.0.0" - } - }, - "node_modules/micro/node_modules/arg": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.0.tgz", - "integrity": "sha512-ZWc51jO3qegGkVh8Hwpv636EkbesNV5ZNQPCtRa+0qytRYPEs9IYT9qITY9buezqUH5uqyzlWLcufrzU2rffdg==", - "license": "MIT" - }, - "node_modules/micromark": { - "version": "4.0.2", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "@types/debug": "^4.0.0", - "debug": "^4.0.0", - "decode-named-character-reference": "^1.0.0", - "devlop": "^1.0.0", - "micromark-core-commonmark": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-combine-extensions": "^2.0.0", - "micromark-util-decode-numeric-character-reference": "^2.0.0", - "micromark-util-encode": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-resolve-all": "^2.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "micromark-util-subtokenize": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-core-commonmark": { - "version": "2.0.3", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "decode-named-character-reference": "^1.0.0", - "devlop": "^1.0.0", - "micromark-factory-destination": "^2.0.0", - "micromark-factory-label": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-factory-title": "^2.0.0", - "micromark-factory-whitespace": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-classify-character": "^2.0.0", - "micromark-util-html-tag-name": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-resolve-all": "^2.0.0", - "micromark-util-subtokenize": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-core-commonmark/node_modules/micromark-factory-space": { - "version": "2.0.1", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-core-commonmark/node_modules/micromark-util-character": { - "version": "2.1.1", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-core-commonmark/node_modules/micromark-util-symbol": { - "version": "2.0.1", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-extension-directive": { - "version": "3.0.2", - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-factory-whitespace": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0", - "parse-entities": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-directive/node_modules/micromark-factory-space": { - "version": "2.0.1", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-extension-directive/node_modules/micromark-util-character": { - "version": "2.1.1", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-extension-directive/node_modules/micromark-util-symbol": { - "version": "2.0.1", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-extension-frontmatter": { - "version": "2.0.0", - "license": "MIT", - "dependencies": { - "fault": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-frontmatter/node_modules/micromark-util-character": { - "version": "2.1.1", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-extension-frontmatter/node_modules/micromark-util-symbol": { - "version": "2.0.1", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-extension-gfm": { - "version": "3.0.0", - "license": "MIT", - "dependencies": { - "micromark-extension-gfm-autolink-literal": "^2.0.0", - "micromark-extension-gfm-footnote": "^2.0.0", - "micromark-extension-gfm-strikethrough": "^2.0.0", - "micromark-extension-gfm-table": "^2.0.0", - "micromark-extension-gfm-tagfilter": "^2.0.0", - "micromark-extension-gfm-task-list-item": "^2.0.0", - "micromark-util-combine-extensions": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-autolink-literal": { - "version": "2.1.0", - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-autolink-literal/node_modules/micromark-util-character": { - "version": "2.1.1", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-extension-gfm-autolink-literal/node_modules/micromark-util-symbol": { - "version": "2.0.1", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-extension-gfm-footnote": { - "version": "2.1.0", - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-core-commonmark": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-factory-space": { - "version": "2.0.1", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-util-character": { - "version": "2.1.1", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-util-symbol": { - "version": "2.0.1", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-extension-gfm-strikethrough": { - "version": "2.1.0", - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-classify-character": "^2.0.0", - "micromark-util-resolve-all": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-strikethrough/node_modules/micromark-util-symbol": { - "version": "2.0.1", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-extension-gfm-table": { - "version": "2.1.1", - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-table/node_modules/micromark-factory-space": { - "version": "2.0.1", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-extension-gfm-table/node_modules/micromark-util-character": { - "version": "2.1.1", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-extension-gfm-table/node_modules/micromark-util-symbol": { - "version": "2.0.1", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-extension-gfm-tagfilter": { - "version": "2.0.0", - "license": "MIT", - "dependencies": { - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-task-list-item": { - "version": "2.1.0", - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-task-list-item/node_modules/micromark-factory-space": { - "version": "2.0.1", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-extension-gfm-task-list-item/node_modules/micromark-util-character": { - "version": "2.1.1", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-extension-gfm-task-list-item/node_modules/micromark-util-symbol": { - "version": "2.0.1", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-extension-mdx-expression": { - "version": "3.0.1", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0", - "devlop": "^1.0.0", - "micromark-factory-mdx-expression": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-events-to-acorn": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-extension-mdx-expression/node_modules/micromark-factory-space": { - "version": "2.0.1", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-extension-mdx-expression/node_modules/micromark-util-character": { - "version": "2.1.1", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-extension-mdx-expression/node_modules/micromark-util-symbol": { - "version": "2.0.1", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-extension-mdx-jsx": { - "version": "3.0.2", - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0", - "devlop": "^1.0.0", - "estree-util-is-identifier-name": "^3.0.0", - "micromark-factory-mdx-expression": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-events-to-acorn": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-mdx-jsx/node_modules/micromark-factory-space": { - "version": "2.0.1", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-extension-mdx-jsx/node_modules/micromark-util-character": { - "version": "2.1.1", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-extension-mdx-jsx/node_modules/micromark-util-symbol": { - "version": "2.0.1", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-extension-mdx-md": { - "version": "2.0.0", - "license": "MIT", - "dependencies": { - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-mdxjs": { - "version": "3.0.0", - "license": "MIT", - "dependencies": { - "acorn": "^8.0.0", - "acorn-jsx": "^5.0.0", - "micromark-extension-mdx-expression": "^3.0.0", - "micromark-extension-mdx-jsx": "^3.0.0", - "micromark-extension-mdx-md": "^2.0.0", - "micromark-extension-mdxjs-esm": "^3.0.0", - "micromark-util-combine-extensions": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-mdxjs-esm": { - "version": "3.0.0", - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0", - "devlop": "^1.0.0", - "micromark-core-commonmark": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-events-to-acorn": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0", - "unist-util-position-from-estree": "^2.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-mdxjs-esm/node_modules/micromark-util-character": { - "version": "2.1.1", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-extension-mdxjs-esm/node_modules/micromark-util-symbol": { - "version": "2.0.1", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-factory-destination": { - "version": "2.0.1", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-destination/node_modules/micromark-util-character": { - "version": "2.1.1", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-destination/node_modules/micromark-util-symbol": { - "version": "2.0.1", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-factory-label": { - "version": "2.0.1", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-label/node_modules/micromark-util-character": { - "version": "2.1.1", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-label/node_modules/micromark-util-symbol": { - "version": "2.0.1", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-factory-mdx-expression": { - "version": "2.0.3", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0", - "devlop": "^1.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-events-to-acorn": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0", - "unist-util-position-from-estree": "^2.0.0", - "vfile-message": "^4.0.0" - } - }, - "node_modules/micromark-factory-mdx-expression/node_modules/micromark-factory-space": { - "version": "2.0.1", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-mdx-expression/node_modules/micromark-util-character": { - "version": "2.1.1", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-mdx-expression/node_modules/micromark-util-symbol": { - "version": "2.0.1", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-factory-space": { - "version": "1.1.0", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "node_modules/micromark-factory-space/node_modules/micromark-util-types": { - "version": "1.1.0", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-factory-title": { - "version": "2.0.1", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-title/node_modules/micromark-factory-space": { - "version": "2.0.1", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-title/node_modules/micromark-util-character": { - "version": "2.1.1", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-title/node_modules/micromark-util-symbol": { - "version": "2.0.1", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-factory-whitespace": { - "version": "2.0.1", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-whitespace/node_modules/micromark-factory-space": { - "version": "2.0.1", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-whitespace/node_modules/micromark-util-character": { - "version": "2.1.1", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-whitespace/node_modules/micromark-util-symbol": { - "version": "2.0.1", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-util-character": { - "version": "1.2.0", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "node_modules/micromark-util-character/node_modules/micromark-util-types": { - "version": "1.1.0", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-util-chunked": { - "version": "2.0.1", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-chunked/node_modules/micromark-util-symbol": { - "version": "2.0.1", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-util-classify-character": { - "version": "2.0.1", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-classify-character/node_modules/micromark-util-character": { - "version": "2.1.1", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-classify-character/node_modules/micromark-util-symbol": { - "version": "2.0.1", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-util-combine-extensions": { - "version": "2.0.1", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-chunked": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-decode-numeric-character-reference": { - "version": "2.0.2", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-decode-numeric-character-reference/node_modules/micromark-util-symbol": { - "version": "2.0.1", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-util-decode-string": { - "version": "2.0.1", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "decode-named-character-reference": "^1.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-decode-numeric-character-reference": "^2.0.0", - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-decode-string/node_modules/micromark-util-character": { - "version": "2.1.1", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-decode-string/node_modules/micromark-util-symbol": { - "version": "2.0.1", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-util-encode": { - "version": "2.0.1", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-util-events-to-acorn": { - "version": "2.0.3", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0", - "@types/unist": "^3.0.0", - "devlop": "^1.0.0", - "estree-util-visit": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0", - "vfile-message": "^4.0.0" - } - }, - "node_modules/micromark-util-events-to-acorn/node_modules/micromark-util-symbol": { - "version": "2.0.1", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-util-html-tag-name": { - "version": "2.0.1", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-util-normalize-identifier": { - "version": "2.0.1", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-normalize-identifier/node_modules/micromark-util-symbol": { - "version": "2.0.1", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-util-resolve-all": { - "version": "2.0.1", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-sanitize-uri": { - "version": "2.0.1", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-encode": "^2.0.0", - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-sanitize-uri/node_modules/micromark-util-character": { - "version": "2.1.1", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-sanitize-uri/node_modules/micromark-util-symbol": { - "version": "2.0.1", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-util-subtokenize": { - "version": "2.1.0", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-subtokenize/node_modules/micromark-util-symbol": { - "version": "2.0.1", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-util-symbol": { - "version": "1.1.0", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-util-types": { - "version": "2.0.2", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark/node_modules/micromark-factory-space": { - "version": "2.0.1", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark/node_modules/micromark-util-character": { - "version": "2.1.1", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark/node_modules/micromark-util-symbol": { - "version": "2.0.1", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromatch": { - "version": "4.0.8", - "license": "MIT", - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/micromatch/node_modules/picomatch": { - "version": "2.3.1", - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/mime": { - "version": "1.6.0", - "license": "MIT", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/mimic-response": { - "version": "3.1.0", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mini-css-extract-plugin": { - "version": "2.10.2", - "license": "MIT", - "dependencies": { - "schema-utils": "^4.0.0", - "tapable": "^2.2.1" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - } - }, - "node_modules/minimalistic-assert": { - "version": "1.0.1", - "license": "ISC" - }, - "node_modules/minimatch": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz", - "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/brace-expansion": "^5.0.0" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/minipass": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", - "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/minizlib": { - "version": "3.1.0", - "license": "MIT", - "dependencies": { - "minipass": "^7.1.2" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/mkdirp": { - "version": "1.0.4", - "license": "MIT", - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/mkdirp-classic": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", - "license": "MIT" - }, - "node_modules/mri": { - "version": "1.2.0", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/mrmime": { - "version": "2.0.1", - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/ms": { - "version": "2.1.3", - "license": "MIT" - }, - "node_modules/multicast-dns": { - "version": "7.2.5", - "license": "MIT", - "dependencies": { - "dns-packet": "^5.2.2", - "thunky": "^1.0.2" - }, - "bin": { - "multicast-dns": "cli.js" - } - }, - "node_modules/nanoid": { - "version": "3.3.11", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/napi-build-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-2.0.0.tgz", - "integrity": "sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==", - "license": "MIT" - }, - "node_modules/negotiator": { - "version": "0.6.4", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/neo-async": { - "version": "2.6.2", - "license": "MIT" - }, - "node_modules/netmask": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.1.1.tgz", - "integrity": "sha512-eonl3sLUha+S1GzTPxychyhnUzKyeQkZ7jLjKrBagJgPla13F+uQ71HgpFefyHgqrjEbCPkDArxYsjY8/+gLKA==", - "license": "MIT", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/no-case": { - "version": "3.0.4", - "license": "MIT", - "dependencies": { - "lower-case": "^2.0.2", - "tslib": "^2.0.3" - } - }, - "node_modules/node-abi": { - "version": "3.92.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.92.0.tgz", - "integrity": "sha512-KdHvFWZjEKDf0cakgFjebl371GPsISX2oZHcuyKqM7DtogIsHrqKeLTo8wBHxaXRAQlY2PsPlZmfo+9ZCxEREQ==", - "license": "MIT", - "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/node-addon-api": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-6.1.0.tgz", - "integrity": "sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==", - "license": "MIT" - }, - "node_modules/node-emoji": { - "version": "2.2.0", - "license": "MIT", - "dependencies": { - "@sindresorhus/is": "^4.6.0", - "char-regex": "^1.0.2", - "emojilib": "^2.4.0", - "skin-tone": "^2.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "license": "MIT", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/node-gyp-build": { - "version": "4.8.4", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz", - "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==", - "license": "MIT", - "bin": { - "node-gyp-build": "bin.js", - "node-gyp-build-optional": "optional.js", - "node-gyp-build-test": "build-test.js" - } - }, - "node_modules/node-releases": { - "version": "2.0.27", - "license": "MIT" - }, - "node_modules/nopt": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-8.1.0.tgz", - "integrity": "sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A==", - "license": "ISC", - "dependencies": { - "abbrev": "^3.0.0" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-url": { - "version": "8.1.1", - "license": "MIT", - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "license": "MIT", - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nprogress": { - "version": "0.2.0", - "license": "MIT" - }, - "node_modules/nth-check": { - "version": "2.1.1", - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0" - }, - "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" - } - }, - "node_modules/null-loader": { - "version": "4.0.1", - "license": "MIT", - "dependencies": { - "loader-utils": "^2.0.0", - "schema-utils": "^3.0.0" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" - } - }, - "node_modules/null-loader/node_modules/ajv": { - "version": "6.14.0", - "license": "MIT", - "peer": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/null-loader/node_modules/ajv-keywords": { - "version": "3.5.2", - "license": "MIT", - "peerDependencies": { - "ajv": "^6.9.1" - } - }, - "node_modules/null-loader/node_modules/json-schema-traverse": { - "version": "0.4.1", - "license": "MIT" - }, - "node_modules/null-loader/node_modules/schema-utils": { - "version": "3.3.0", - "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-inspect": { - "version": "1.13.4", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.assign": { - "version": "4.1.7", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0", - "has-symbols": "^1.1.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/obuf": { - "version": "1.1.2", - "license": "MIT" - }, - "node_modules/on-finished": { - "version": "2.4.1", - "license": "MIT", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/on-headers": { - "version": "1.1.0", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/once": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", - "integrity": "sha512-6vaNInhu+CHxtONf3zw3vq4SP2DOQhjBvIa3rNcG0+P7eKWlYH6Peu7rHizSloRU2EwMz6GraLieis9Ac9+p1w==", - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "5.1.2", - "license": "MIT", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/open": { - "version": "8.4.2", - "license": "MIT", - "dependencies": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/opener": { - "version": "1.5.2", - "license": "(WTFPL OR MIT)", - "bin": { - "opener": "bin/opener-bin.js" - } - }, - "node_modules/os-paths": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/os-paths/-/os-paths-4.4.0.tgz", - "integrity": "sha512-wrAwOeXp1RRMFfQY8Sy7VaGVmPocaLwSFOYCGKSyo8qmJ+/yaafCl5BCA1IQZWqFSRBrKDYFeR9d/VyQzfH/jg==", - "license": "MIT", - "engines": { - "node": ">= 6.0" - } - }, - "node_modules/oxc-transform": { - "version": "0.111.0", - "resolved": "https://registry.npmjs.org/oxc-transform/-/oxc-transform-0.111.0.tgz", - "integrity": "sha512-oa5KKSDNLHZGaiqIGAbCWXeN9IJUAz9MElWcQX90epDxdKc9Hrt/BsLj3K4gDqfAYa5dwdH+ZCFJG9hR74fiGg==", - "license": "MIT", - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "funding": { - "url": "https://github.com/sponsors/Boshen" - }, - "optionalDependencies": { - "@oxc-transform/binding-android-arm-eabi": "0.111.0", - "@oxc-transform/binding-android-arm64": "0.111.0", - "@oxc-transform/binding-darwin-arm64": "0.111.0", - "@oxc-transform/binding-darwin-x64": "0.111.0", - "@oxc-transform/binding-freebsd-x64": "0.111.0", - "@oxc-transform/binding-linux-arm-gnueabihf": "0.111.0", - "@oxc-transform/binding-linux-arm-musleabihf": "0.111.0", - "@oxc-transform/binding-linux-arm64-gnu": "0.111.0", - "@oxc-transform/binding-linux-arm64-musl": "0.111.0", - "@oxc-transform/binding-linux-ppc64-gnu": "0.111.0", - "@oxc-transform/binding-linux-riscv64-gnu": "0.111.0", - "@oxc-transform/binding-linux-riscv64-musl": "0.111.0", - "@oxc-transform/binding-linux-s390x-gnu": "0.111.0", - "@oxc-transform/binding-linux-x64-gnu": "0.111.0", - "@oxc-transform/binding-linux-x64-musl": "0.111.0", - "@oxc-transform/binding-openharmony-arm64": "0.111.0", - "@oxc-transform/binding-wasm32-wasi": "0.111.0", - "@oxc-transform/binding-win32-arm64-msvc": "0.111.0", - "@oxc-transform/binding-win32-ia32-msvc": "0.111.0", - "@oxc-transform/binding-win32-x64-msvc": "0.111.0" - } - }, - "node_modules/p-cancelable": { - "version": "3.0.0", - "license": "MIT", - "engines": { - "node": ">=12.20" - } - }, - "node_modules/p-finally": { - "version": "1.0.0", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/p-limit": { - "version": "4.0.0", - "license": "MIT", - "dependencies": { - "yocto-queue": "^1.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "6.0.0", - "license": "MIT", - "dependencies": { - "p-limit": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-map": { - "version": "4.0.0", - "license": "MIT", - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-queue": { - "version": "6.6.2", - "license": "MIT", - "dependencies": { - "eventemitter3": "^4.0.4", - "p-timeout": "^3.2.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-retry": { - "version": "6.2.1", - "license": "MIT", - "dependencies": { - "@types/retry": "0.12.2", - "is-network-error": "^1.0.0", - "retry": "^0.13.1" - }, - "engines": { - "node": ">=16.17" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-timeout": { - "version": "3.2.0", - "license": "MIT", - "dependencies": { - "p-finally": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pac-proxy-agent": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.2.0.tgz", - "integrity": "sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA==", - "license": "MIT", - "dependencies": { - "@tootallnate/quickjs-emscripten": "^0.23.0", - "agent-base": "^7.1.2", - "debug": "^4.3.4", - "get-uri": "^6.0.1", - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.6", - "pac-resolver": "^7.0.1", - "socks-proxy-agent": "^8.0.5" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/pac-resolver": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.1.tgz", - "integrity": "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==", - "license": "MIT", - "dependencies": { - "degenerator": "^5.0.0", - "netmask": "^2.0.2" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/package-json": { - "version": "8.1.1", - "license": "MIT", - "dependencies": { - "got": "^12.1.0", - "registry-auth-token": "^5.0.1", - "registry-url": "^6.0.0", - "semver": "^7.3.7" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/param-case": { - "version": "3.0.4", - "license": "MIT", - "dependencies": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "license": "MIT", - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-entities": { - "version": "4.0.2", - "license": "MIT", - "dependencies": { - "@types/unist": "^2.0.0", - "character-entities-legacy": "^3.0.0", - "character-reference-invalid": "^2.0.0", - "decode-named-character-reference": "^1.0.0", - "is-alphanumerical": "^2.0.0", - "is-decimal": "^2.0.0", - "is-hexadecimal": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/parse-entities/node_modules/@types/unist": { - "version": "2.0.11", - "license": "MIT" - }, - "node_modules/parse-json": { - "version": "5.2.0", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parse-ms": { - "version": "2.1.0", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-numeric-range": { - "version": "1.3.0", - "license": "ISC" - }, - "node_modules/parse5": { - "version": "7.3.0", - "license": "MIT", - "dependencies": { - "entities": "^6.0.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, - "node_modules/parse5-htmlparser2-tree-adapter": { - "version": "7.1.0", - "license": "MIT", - "dependencies": { - "domhandler": "^5.0.3", - "parse5": "^7.0.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, - "node_modules/parse5/node_modules/entities": { - "version": "6.0.1", - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/parseurl": { - "version": "1.3.3", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/pascal-case": { - "version": "3.1.2", - "license": "MIT", - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/path-browserify": { - "version": "1.0.1", - "license": "MIT" - }, - "node_modules/path-exists": { - "version": "5.0.0", - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, - "node_modules/path-is-inside": { - "version": "1.0.2", - "license": "(WTFPL OR MIT)" - }, - "node_modules/path-key": { - "version": "3.1.1", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "license": "MIT" - }, - "node_modules/path-scurry": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.2.tgz", - "integrity": "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==", - "license": "BlueOak-1.0.0", - "dependencies": { - "lru-cache": "^11.0.0", - "minipass": "^7.1.2" - }, - "engines": { - "node": "18 || 20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/path-scurry/node_modules/lru-cache": { - "version": "11.5.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.1.tgz", - "integrity": "sha512-RPimw/7aMdv2oqRrxKwvZXcPfwBrn/JZ2xYcY9Hus/6LaS3VOAKVWKWgNLCFSiOm1ESXinjsDlidVU7JlnCN2A==", - "license": "BlueOak-1.0.0", - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/path-to-regexp": { - "version": "6.1.0", - "license": "MIT" - }, - "node_modules/path-to-regexp-updated": { - "name": "path-to-regexp", - "version": "6.3.0", - "license": "MIT" - }, - "node_modules/path-type": { - "version": "4.0.0", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", - "license": "MIT" - }, - "node_modules/picocolors": { - "version": "1.1.1", - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", - "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pkg-dir": { - "version": "7.0.0", - "license": "MIT", - "dependencies": { - "find-up": "^6.3.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkijs": { - "version": "3.3.3", - "license": "BSD-3-Clause", - "dependencies": { - "@noble/hashes": "1.4.0", - "asn1js": "^3.0.6", - "bytestreamjs": "^2.0.1", - "pvtsutils": "^1.3.6", - "pvutils": "^1.1.3", - "tslib": "^2.8.1" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/postcss": { - "version": "8.5.9", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "peer": true, - "dependencies": { - "nanoid": "^3.3.11", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/postcss-attribute-case-insensitive": { - "version": "7.0.1", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "dependencies": { - "postcss-selector-parser": "^7.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-attribute-case-insensitive/node_modules/postcss-selector-parser": { - "version": "7.1.1", - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-calc": { - "version": "9.0.1", - "license": "MIT", - "dependencies": { - "postcss-selector-parser": "^6.0.11", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.2.2" - } - }, - "node_modules/postcss-clamp": { - "version": "4.1.0", - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": ">=7.6.0" - }, - "peerDependencies": { - "postcss": "^8.4.6" - } - }, - "node_modules/postcss-color-functional-notation": { - "version": "7.0.12", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-color-parser": "^3.1.0", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/postcss-progressive-custom-properties": "^4.2.1", - "@csstools/utilities": "^2.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-color-hex-alpha": { - "version": "10.0.0", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "dependencies": { - "@csstools/utilities": "^2.0.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-color-rebeccapurple": { - "version": "10.0.0", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/utilities": "^2.0.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-colormin": { - "version": "6.1.0", - "license": "MIT", - "dependencies": { - "browserslist": "^4.23.0", - "caniuse-api": "^3.0.0", - "colord": "^2.9.3", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-convert-values": { - "version": "6.1.0", - "license": "MIT", - "dependencies": { - "browserslist": "^4.23.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-custom-media": { - "version": "11.0.6", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "dependencies": { - "@csstools/cascade-layer-name-parser": "^2.0.5", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/media-query-list-parser": "^4.0.3" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-custom-properties": { - "version": "14.0.6", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "dependencies": { - "@csstools/cascade-layer-name-parser": "^2.0.5", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/utilities": "^2.0.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-custom-selectors": { - "version": "8.0.5", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "dependencies": { - "@csstools/cascade-layer-name-parser": "^2.0.5", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "postcss-selector-parser": "^7.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-custom-selectors/node_modules/postcss-selector-parser": { - "version": "7.1.1", - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-dir-pseudo-class": { - "version": "9.0.1", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "postcss-selector-parser": "^7.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-dir-pseudo-class/node_modules/postcss-selector-parser": { - "version": "7.1.1", - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-discard-comments": { - "version": "6.0.2", - "license": "MIT", - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-discard-duplicates": { - "version": "6.0.3", - "license": "MIT", - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-discard-empty": { - "version": "6.0.3", - "license": "MIT", - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-discard-overridden": { - "version": "6.0.2", - "license": "MIT", - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-discard-unused": { - "version": "6.0.5", - "license": "MIT", - "dependencies": { - "postcss-selector-parser": "^6.0.16" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-double-position-gradients": { - "version": "6.0.4", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/postcss-progressive-custom-properties": "^4.2.1", - "@csstools/utilities": "^2.0.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-focus-visible": { - "version": "10.0.1", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "postcss-selector-parser": "^7.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-focus-visible/node_modules/postcss-selector-parser": { - "version": "7.1.1", - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-focus-within": { - "version": "9.0.1", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "postcss-selector-parser": "^7.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-focus-within/node_modules/postcss-selector-parser": { - "version": "7.1.1", - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-font-variant": { - "version": "5.0.0", - "license": "MIT", - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-gap-properties": { - "version": "6.0.0", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-image-set-function": { - "version": "7.0.0", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/utilities": "^2.0.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-lab-function": { - "version": "7.0.12", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-color-parser": "^3.1.0", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/postcss-progressive-custom-properties": "^4.2.1", - "@csstools/utilities": "^2.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-loader": { - "version": "7.3.4", - "license": "MIT", - "dependencies": { - "cosmiconfig": "^8.3.5", - "jiti": "^1.20.0", - "semver": "^7.5.4" - }, - "engines": { - "node": ">= 14.15.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "postcss": "^7.0.0 || ^8.0.1", - "webpack": "^5.0.0" - } - }, - "node_modules/postcss-logical": { - "version": "8.1.0", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-merge-idents": { - "version": "6.0.3", - "license": "MIT", - "dependencies": { - "cssnano-utils": "^4.0.2", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-merge-longhand": { - "version": "6.0.5", - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0", - "stylehacks": "^6.1.1" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-merge-rules": { - "version": "6.1.1", - "license": "MIT", - "dependencies": { - "browserslist": "^4.23.0", - "caniuse-api": "^3.0.0", - "cssnano-utils": "^4.0.2", - "postcss-selector-parser": "^6.0.16" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-minify-font-values": { - "version": "6.1.0", - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-minify-gradients": { - "version": "6.0.3", - "license": "MIT", - "dependencies": { - "colord": "^2.9.3", - "cssnano-utils": "^4.0.2", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-minify-params": { - "version": "6.1.0", - "license": "MIT", - "dependencies": { - "browserslist": "^4.23.0", - "cssnano-utils": "^4.0.2", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-minify-selectors": { - "version": "6.0.4", - "license": "MIT", - "dependencies": { - "postcss-selector-parser": "^6.0.16" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-modules-extract-imports": { - "version": "3.1.0", - "license": "ISC", - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-local-by-default": { - "version": "4.2.0", - "license": "MIT", - "dependencies": { - "icss-utils": "^5.0.0", - "postcss-selector-parser": "^7.0.0", - "postcss-value-parser": "^4.1.0" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-local-by-default/node_modules/postcss-selector-parser": { - "version": "7.1.1", - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-modules-scope": { - "version": "3.2.1", - "license": "ISC", - "dependencies": { - "postcss-selector-parser": "^7.0.0" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-scope/node_modules/postcss-selector-parser": { - "version": "7.1.1", - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-modules-values": { - "version": "4.0.0", - "license": "ISC", - "dependencies": { - "icss-utils": "^5.0.0" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-nesting": { - "version": "13.0.2", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/selector-resolve-nested": "^3.1.0", - "@csstools/selector-specificity": "^5.0.0", - "postcss-selector-parser": "^7.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-nesting/node_modules/@csstools/selector-resolve-nested": { - "version": "3.1.0", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss-selector-parser": "^7.0.0" - } - }, - "node_modules/postcss-nesting/node_modules/@csstools/selector-specificity": { - "version": "5.0.0", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss-selector-parser": "^7.0.0" - } - }, - "node_modules/postcss-nesting/node_modules/postcss-selector-parser": { - "version": "7.1.1", - "license": "MIT", - "peer": true, - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-normalize-charset": { - "version": "6.0.2", - "license": "MIT", - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-normalize-display-values": { - "version": "6.0.2", - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-normalize-positions": { - "version": "6.0.2", - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-normalize-repeat-style": { - "version": "6.0.2", - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-normalize-string": { - "version": "6.0.2", - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-normalize-timing-functions": { - "version": "6.0.2", - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-normalize-unicode": { - "version": "6.1.0", - "license": "MIT", - "dependencies": { - "browserslist": "^4.23.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-normalize-url": { - "version": "6.0.2", - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-normalize-whitespace": { - "version": "6.0.2", - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-opacity-percentage": { - "version": "3.0.0", - "funding": [ - { - "type": "kofi", - "url": "https://ko-fi.com/mrcgrtz" - }, - { - "type": "liberapay", - "url": "https://liberapay.com/mrcgrtz" - } - ], - "license": "MIT", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-ordered-values": { - "version": "6.0.2", - "license": "MIT", - "dependencies": { - "cssnano-utils": "^4.0.2", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-overflow-shorthand": { - "version": "6.0.0", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-page-break": { - "version": "3.0.4", - "license": "MIT", - "peerDependencies": { - "postcss": "^8" - } - }, - "node_modules/postcss-place": { - "version": "10.0.0", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-preset-env": { - "version": "10.6.1", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/postcss-alpha-function": "^1.0.1", - "@csstools/postcss-cascade-layers": "^5.0.2", - "@csstools/postcss-color-function": "^4.0.12", - "@csstools/postcss-color-function-display-p3-linear": "^1.0.1", - "@csstools/postcss-color-mix-function": "^3.0.12", - "@csstools/postcss-color-mix-variadic-function-arguments": "^1.0.2", - "@csstools/postcss-content-alt-text": "^2.0.8", - "@csstools/postcss-contrast-color-function": "^2.0.12", - "@csstools/postcss-exponential-functions": "^2.0.9", - "@csstools/postcss-font-format-keywords": "^4.0.0", - "@csstools/postcss-gamut-mapping": "^2.0.11", - "@csstools/postcss-gradients-interpolation-method": "^5.0.12", - "@csstools/postcss-hwb-function": "^4.0.12", - "@csstools/postcss-ic-unit": "^4.0.4", - "@csstools/postcss-initial": "^2.0.1", - "@csstools/postcss-is-pseudo-class": "^5.0.3", - "@csstools/postcss-light-dark-function": "^2.0.11", - "@csstools/postcss-logical-float-and-clear": "^3.0.0", - "@csstools/postcss-logical-overflow": "^2.0.0", - "@csstools/postcss-logical-overscroll-behavior": "^2.0.0", - "@csstools/postcss-logical-resize": "^3.0.0", - "@csstools/postcss-logical-viewport-units": "^3.0.4", - "@csstools/postcss-media-minmax": "^2.0.9", - "@csstools/postcss-media-queries-aspect-ratio-number-values": "^3.0.5", - "@csstools/postcss-nested-calc": "^4.0.0", - "@csstools/postcss-normalize-display-values": "^4.0.1", - "@csstools/postcss-oklab-function": "^4.0.12", - "@csstools/postcss-position-area-property": "^1.0.0", - "@csstools/postcss-progressive-custom-properties": "^4.2.1", - "@csstools/postcss-property-rule-prelude-list": "^1.0.0", - "@csstools/postcss-random-function": "^2.0.1", - "@csstools/postcss-relative-color-syntax": "^3.0.12", - "@csstools/postcss-scope-pseudo-class": "^4.0.1", - "@csstools/postcss-sign-functions": "^1.1.4", - "@csstools/postcss-stepped-value-functions": "^4.0.9", - "@csstools/postcss-syntax-descriptor-syntax-production": "^1.0.1", - "@csstools/postcss-system-ui-font-family": "^1.0.0", - "@csstools/postcss-text-decoration-shorthand": "^4.0.3", - "@csstools/postcss-trigonometric-functions": "^4.0.9", - "@csstools/postcss-unset-value": "^4.0.0", - "autoprefixer": "^10.4.23", - "browserslist": "^4.28.1", - "css-blank-pseudo": "^7.0.1", - "css-has-pseudo": "^7.0.3", - "css-prefers-color-scheme": "^10.0.0", - "cssdb": "^8.6.0", - "postcss-attribute-case-insensitive": "^7.0.1", - "postcss-clamp": "^4.1.0", - "postcss-color-functional-notation": "^7.0.12", - "postcss-color-hex-alpha": "^10.0.0", - "postcss-color-rebeccapurple": "^10.0.0", - "postcss-custom-media": "^11.0.6", - "postcss-custom-properties": "^14.0.6", - "postcss-custom-selectors": "^8.0.5", - "postcss-dir-pseudo-class": "^9.0.1", - "postcss-double-position-gradients": "^6.0.4", - "postcss-focus-visible": "^10.0.1", - "postcss-focus-within": "^9.0.1", - "postcss-font-variant": "^5.0.0", - "postcss-gap-properties": "^6.0.0", - "postcss-image-set-function": "^7.0.0", - "postcss-lab-function": "^7.0.12", - "postcss-logical": "^8.1.0", - "postcss-nesting": "^13.0.2", - "postcss-opacity-percentage": "^3.0.0", - "postcss-overflow-shorthand": "^6.0.0", - "postcss-page-break": "^3.0.4", - "postcss-place": "^10.0.0", - "postcss-pseudo-class-any-link": "^10.0.1", - "postcss-replace-overflow-wrap": "^4.0.0", - "postcss-selector-not": "^8.0.1" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-pseudo-class-any-link": { - "version": "10.0.1", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "postcss-selector-parser": "^7.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-pseudo-class-any-link/node_modules/postcss-selector-parser": { - "version": "7.1.1", - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-reduce-idents": { - "version": "6.0.3", - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-reduce-initial": { - "version": "6.1.0", - "license": "MIT", - "dependencies": { - "browserslist": "^4.23.0", - "caniuse-api": "^3.0.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-reduce-transforms": { - "version": "6.0.2", - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-replace-overflow-wrap": { - "version": "4.0.0", - "license": "MIT", - "peerDependencies": { - "postcss": "^8.0.3" - } - }, - "node_modules/postcss-selector-not": { - "version": "8.0.1", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "dependencies": { - "postcss-selector-parser": "^7.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-selector-not/node_modules/postcss-selector-parser": { - "version": "7.1.1", - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-selector-parser": { - "version": "6.1.2", - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-sort-media-queries": { - "version": "5.2.0", - "license": "MIT", - "dependencies": { - "sort-css-media-queries": "2.2.0" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "postcss": "^8.4.23" - } - }, - "node_modules/postcss-svgo": { - "version": "6.0.3", - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0", - "svgo": "^3.2.0" - }, - "engines": { - "node": "^14 || ^16 || >= 18" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-unique-selectors": { - "version": "6.0.4", - "license": "MIT", - "dependencies": { - "postcss-selector-parser": "^6.0.16" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "license": "MIT" - }, - "node_modules/postcss-zindex": { - "version": "6.0.2", - "license": "MIT", - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/prebuild-install": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.3.tgz", - "integrity": "sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==", - "deprecated": "No longer maintained. Please contact the author of the relevant native addon; alternatives are available.", - "license": "MIT", - "dependencies": { - "detect-libc": "^2.0.0", - "expand-template": "^2.0.3", - "github-from-package": "0.0.0", - "minimist": "^1.2.3", - "mkdirp-classic": "^0.5.3", - "napi-build-utils": "^2.0.0", - "node-abi": "^3.3.0", - "pump": "^3.0.0", - "rc": "^1.2.7", - "simple-get": "^4.0.0", - "tar-fs": "^2.0.0", - "tunnel-agent": "^0.6.0" - }, - "bin": { - "prebuild-install": "bin.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/prebuild-install/node_modules/chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "license": "ISC" - }, - "node_modules/prebuild-install/node_modules/end-of-stream": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", - "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", - "license": "MIT", - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/prebuild-install/node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/prebuild-install/node_modules/tar-fs": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.4.tgz", - "integrity": "sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ==", - "license": "MIT", - "dependencies": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^2.1.4" - } - }, - "node_modules/prebuild-install/node_modules/tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "license": "MIT", - "dependencies": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/pretty-error": { - "version": "4.0.0", - "license": "MIT", - "dependencies": { - "lodash": "^4.17.20", - "renderkid": "^3.0.0" - } - }, - "node_modules/pretty-ms": { - "version": "7.0.1", - "license": "MIT", - "dependencies": { - "parse-ms": "^2.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pretty-time": { - "version": "1.1.0", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/prism-react-renderer": { - "version": "2.4.1", - "license": "MIT", - "dependencies": { - "@types/prismjs": "^1.26.0", - "clsx": "^2.0.0" - }, - "peerDependencies": { - "react": ">=16.0.0" - } - }, - "node_modules/prismjs": { - "version": "1.30.0", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "license": "MIT" - }, - "node_modules/promisepipe": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/promisepipe/-/promisepipe-3.0.0.tgz", - "integrity": "sha512-V6TbZDJ/ZswevgkDNpGt/YqNCiZP9ASfgU+p83uJE6NrGtvSGoOcHLiDCqkMs2+yg7F5qHdLV8d0aS8O26G/KA==", - "license": "MIT" - }, - "node_modules/prompts": { - "version": "2.4.2", - "license": "MIT", - "dependencies": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/prop-types": { - "version": "15.8.1", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "node_modules/property-information": { - "version": "7.1.0", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/proto-list": { - "version": "1.2.4", - "license": "ISC" - }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "license": "MIT", - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/proxy-addr/node_modules/ipaddr.js": { - "version": "1.9.1", - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/proxy-agent": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.4.0.tgz", - "integrity": "sha512-u0piLU+nCOHMgGjRbimiXmA9kM/L9EHh3zL81xCdp7m+Y2pHIsnmbdDoEDoAz5geaonNR6q6+yOPQs6n4T6sBQ==", - "license": "MIT", - "dependencies": { - "agent-base": "^7.0.2", - "debug": "^4.3.4", - "http-proxy-agent": "^7.0.1", - "https-proxy-agent": "^7.0.3", - "lru-cache": "^7.14.1", - "pac-proxy-agent": "^7.0.1", - "proxy-from-env": "^1.1.0", - "socks-proxy-agent": "^8.0.2" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/proxy-agent/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "license": "MIT" - }, - "node_modules/pump": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.4.tgz", - "integrity": "sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==", - "license": "MIT", - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/punycode": { - "version": "2.3.1", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/pupa": { - "version": "3.3.0", - "license": "MIT", - "dependencies": { - "escape-goat": "^4.0.0" - }, - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pvtsutils": { - "version": "1.3.6", - "license": "MIT", - "dependencies": { - "tslib": "^2.8.1" - } - }, - "node_modules/pvutils": { - "version": "1.1.5", - "license": "MIT", - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/qs": { - "version": "6.14.1", - "license": "BSD-3-Clause", - "dependencies": { - "side-channel": "^1.1.0" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/quick-lru": { - "version": "5.1.1", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/randombytes": { - "version": "2.1.0", - "license": "MIT", - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/range-parser": { - "version": "1.2.0", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/raw-body": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.1.tgz", - "integrity": "sha512-9WmIKF6mkvA0SLmA2Knm9+qj89e+j1zqgyn8aXGd7+nAduPoqgI9lO57SAZNn/Byzo5P7JhXTyg9PzaJbH73bA==", - "license": "MIT", - "dependencies": { - "bytes": "3.1.0", - "http-errors": "1.7.3", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/raw-body/node_modules/bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/rc": { - "version": "1.2.8", - "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", - "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "bin": { - "rc": "cli.js" - } - }, - "node_modules/rc/node_modules/strip-json-comments": { - "version": "2.0.1", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react": { - "version": "19.2.4", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-dom": { - "version": "19.2.4", - "license": "MIT", - "peer": true, - "dependencies": { - "scheduler": "^0.27.0" - }, - "peerDependencies": { - "react": "^19.2.4" - } - }, - "node_modules/react-fast-compare": { - "version": "3.2.2", - "license": "MIT" - }, - "node_modules/react-helmet-async": { - "name": "@slorber/react-helmet-async", - "version": "1.3.0", - "license": "Apache-2.0", - "dependencies": { - "@babel/runtime": "^7.12.5", - "invariant": "^2.2.4", - "prop-types": "^15.7.2", - "react-fast-compare": "^3.2.0", - "shallowequal": "^1.1.0" - }, - "peerDependencies": { - "react": "^16.6.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", - "react-dom": "^16.6.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" - } - }, - "node_modules/react-is": { - "version": "16.13.1", - "license": "MIT" - }, - "node_modules/react-json-view-lite": { - "version": "2.5.0", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "react": "^18.0.0 || ^19.0.0" - } - }, - "node_modules/react-loadable": { - "name": "@docusaurus/react-loadable", - "version": "6.0.0", - "license": "MIT", - "peer": true, - "dependencies": { - "@types/react": "*" - }, - "peerDependencies": { - "react": "*" - } - }, - "node_modules/react-loadable-ssr-addon-v5-slorber": { - "version": "1.0.3", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.10.3" - }, - "engines": { - "node": ">=10.13.0" - }, - "peerDependencies": { - "react-loadable": "*", - "webpack": ">=4.41.1 || 5.x" - } - }, - "node_modules/react-router": { - "version": "5.3.4", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/runtime": "^7.12.13", - "history": "^4.9.0", - "hoist-non-react-statics": "^3.1.0", - "loose-envify": "^1.3.1", - "path-to-regexp": "^1.7.0", - "prop-types": "^15.6.2", - "react-is": "^16.6.0", - "tiny-invariant": "^1.0.2", - "tiny-warning": "^1.0.0" - }, - "peerDependencies": { - "react": ">=15" - } - }, - "node_modules/react-router-config": { - "version": "5.1.1", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.1.2" - }, - "peerDependencies": { - "react": ">=15", - "react-router": ">=5" - } - }, - "node_modules/react-router-dom": { - "version": "5.3.4", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.12.13", - "history": "^4.9.0", - "loose-envify": "^1.3.1", - "prop-types": "^15.6.2", - "react-router": "5.3.4", - "tiny-invariant": "^1.0.2", - "tiny-warning": "^1.0.0" - }, - "peerDependencies": { - "react": ">=15" - } - }, - "node_modules/react-router/node_modules/isarray": { - "version": "0.0.1", - "license": "MIT" - }, - "node_modules/react-router/node_modules/path-to-regexp": { - "version": "1.9.0", - "license": "MIT", - "dependencies": { - "isarray": "0.0.1" - } - }, - "node_modules/readable-stream": { - "version": "3.6.2", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "license": "MIT", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/readdirp/node_modules/picomatch": { - "version": "2.3.1", - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/recma-build-jsx": { - "version": "1.0.0", - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0", - "estree-util-build-jsx": "^3.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/recma-jsx": { - "version": "1.0.1", - "license": "MIT", - "dependencies": { - "acorn-jsx": "^5.0.0", - "estree-util-to-js": "^2.0.0", - "recma-parse": "^1.0.0", - "recma-stringify": "^1.0.0", - "unified": "^11.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - }, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/recma-parse": { - "version": "1.0.0", - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0", - "esast-util-from-js": "^2.0.0", - "unified": "^11.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/recma-stringify": { - "version": "1.0.0", - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0", - "estree-util-to-js": "^2.0.0", - "unified": "^11.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/reflect-metadata": { - "version": "0.2.2", - "license": "Apache-2.0" - }, - "node_modules/regenerate": { - "version": "1.4.2", - "license": "MIT" - }, - "node_modules/regenerate-unicode-properties": { - "version": "10.2.2", - "license": "MIT", - "dependencies": { - "regenerate": "^1.4.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/regexpu-core": { - "version": "6.4.0", - "license": "MIT", - "dependencies": { - "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.2.2", - "regjsgen": "^0.8.0", - "regjsparser": "^0.13.0", - "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.2.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/registry-auth-token": { - "version": "5.1.1", - "license": "MIT", - "dependencies": { - "@pnpm/npm-conf": "^3.0.2" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/registry-url": { - "version": "6.0.1", - "license": "MIT", - "dependencies": { - "rc": "1.2.8" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/regjsgen": { - "version": "0.8.0", - "license": "MIT" - }, - "node_modules/regjsparser": { - "version": "0.13.1", - "license": "BSD-2-Clause", - "dependencies": { - "jsesc": "~3.1.0" - }, - "bin": { - "regjsparser": "bin/parser" - } - }, - "node_modules/rehype-raw": { - "version": "7.0.0", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "hast-util-raw": "^9.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/rehype-recma": { - "version": "1.0.0", - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0", - "@types/hast": "^3.0.0", - "hast-util-to-estree": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/relateurl": { - "version": "0.2.7", - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/remark-directive": { - "version": "3.0.1", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "mdast-util-directive": "^3.0.0", - "micromark-extension-directive": "^3.0.0", - "unified": "^11.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-emoji": { - "version": "4.0.1", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.2", - "emoticon": "^4.0.1", - "mdast-util-find-and-replace": "^3.0.1", - "node-emoji": "^2.1.0", - "unified": "^11.0.4" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, - "node_modules/remark-frontmatter": { - "version": "5.0.0", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "mdast-util-frontmatter": "^2.0.0", - "micromark-extension-frontmatter": "^2.0.0", - "unified": "^11.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-gfm": { - "version": "4.0.1", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "mdast-util-gfm": "^3.0.0", - "micromark-extension-gfm": "^3.0.0", - "remark-parse": "^11.0.0", - "remark-stringify": "^11.0.0", - "unified": "^11.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-mdx": { - "version": "3.1.1", - "license": "MIT", - "dependencies": { - "mdast-util-mdx": "^3.0.0", - "micromark-extension-mdxjs": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-parse": { - "version": "11.0.0", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "mdast-util-from-markdown": "^2.0.0", - "micromark-util-types": "^2.0.0", - "unified": "^11.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-rehype": { - "version": "11.1.2", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "mdast-util-to-hast": "^13.0.0", - "unified": "^11.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-stringify": { - "version": "11.0.0", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "mdast-util-to-markdown": "^2.0.0", - "unified": "^11.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/renderkid": { - "version": "3.0.0", - "license": "MIT", - "dependencies": { - "css-select": "^4.1.3", - "dom-converter": "^0.2.0", - "htmlparser2": "^6.1.0", - "lodash": "^4.17.21", - "strip-ansi": "^6.0.1" - } - }, - "node_modules/renderkid/node_modules/css-select": { - "version": "4.3.0", - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.0.1", - "domhandler": "^4.3.1", - "domutils": "^2.8.0", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/renderkid/node_modules/dom-serializer": { - "version": "1.4.1", - "license": "MIT", - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/renderkid/node_modules/domhandler": { - "version": "4.3.1", - "license": "BSD-2-Clause", - "dependencies": { - "domelementtype": "^2.2.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/renderkid/node_modules/domutils": { - "version": "2.8.0", - "license": "BSD-2-Clause", - "dependencies": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "node_modules/renderkid/node_modules/entities": { - "version": "2.2.0", - "license": "BSD-2-Clause", - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/renderkid/node_modules/htmlparser2": { - "version": "6.1.0", - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "license": "MIT", - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.0.0", - "domutils": "^2.5.2", - "entities": "^2.0.0" - } - }, - "node_modules/repeat-string": { - "version": "1.6.1", - "license": "MIT", - "engines": { - "node": ">=0.10" - } - }, - "node_modules/require-from-string": { - "version": "2.0.2", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-like": { - "version": "0.1.2", - "engines": { - "node": "*" - } - }, - "node_modules/requires-port": { - "version": "1.0.0", - "license": "MIT" - }, - "node_modules/resolve": { - "version": "1.22.11", - "license": "MIT", - "dependencies": { - "is-core-module": "^2.16.1", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-alpn": { - "version": "1.2.1", - "license": "MIT" - }, - "node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-pathname": { - "version": "3.0.0", - "license": "MIT" - }, - "node_modules/resolve-pkg-maps": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", - "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", - "license": "MIT", - "funding": { - "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" - } - }, - "node_modules/resolve.exports": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.3.tgz", - "integrity": "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==", - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/responselike": { - "version": "3.0.0", - "license": "MIT", - "dependencies": { - "lowercase-keys": "^3.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/retry": { - "version": "0.13.1", - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/reusify": { - "version": "1.1.0", - "license": "MIT", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rolldown": { - "version": "1.0.0-rc.1", - "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.0-rc.1.tgz", - "integrity": "sha512-M3AeZjYE6UclblEf531Hch0WfVC/NOL43Cc+WdF3J50kk5/fvouHhDumSGTh0oRjbZ8C4faaVr5r6Nx1xMqDGg==", - "license": "MIT", - "dependencies": { - "@oxc-project/types": "=0.110.0", - "@rolldown/pluginutils": "1.0.0-rc.1" - }, - "bin": { - "rolldown": "bin/cli.mjs" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "optionalDependencies": { - "@rolldown/binding-android-arm64": "1.0.0-rc.1", - "@rolldown/binding-darwin-arm64": "1.0.0-rc.1", - "@rolldown/binding-darwin-x64": "1.0.0-rc.1", - "@rolldown/binding-freebsd-x64": "1.0.0-rc.1", - "@rolldown/binding-linux-arm-gnueabihf": "1.0.0-rc.1", - "@rolldown/binding-linux-arm64-gnu": "1.0.0-rc.1", - "@rolldown/binding-linux-arm64-musl": "1.0.0-rc.1", - "@rolldown/binding-linux-x64-gnu": "1.0.0-rc.1", - "@rolldown/binding-linux-x64-musl": "1.0.0-rc.1", - "@rolldown/binding-openharmony-arm64": "1.0.0-rc.1", - "@rolldown/binding-wasm32-wasi": "1.0.0-rc.1", - "@rolldown/binding-win32-arm64-msvc": "1.0.0-rc.1", - "@rolldown/binding-win32-x64-msvc": "1.0.0-rc.1" - } - }, - "node_modules/rtlcss": { - "version": "4.3.0", - "license": "MIT", - "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0", - "postcss": "^8.4.21", - "strip-json-comments": "^3.1.1" - }, - "bin": { - "rtlcss": "bin/rtlcss.js" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/run-applescript": { - "version": "7.1.0", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "license": "MIT" - }, - "node_modules/sandbox": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/sandbox/-/sandbox-3.1.2.tgz", - "integrity": "sha512-g93rma0Z9Aa6EoTktzYnGZmQvMzm7j73BekJIMwmkdWR5uryZ+6hBCADtd3JKGAB27k+ubnG7HHsZqtscAMzIQ==", - "license": "Apache-2.0", - "dependencies": { - "@vercel/sandbox": "2.1.1", - "async-retry": "1.3.3", - "debug": "^4.4.1", - "zod": "^4.1.1" - }, - "bin": { - "sandbox": "bin/sandbox.mjs", - "sbx": "bin/sandbox.mjs" - } - }, - "node_modules/sax": { - "version": "1.6.0", - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=11.0.0" - } - }, - "node_modules/scheduler": { - "version": "0.27.0", - "license": "MIT" - }, - "node_modules/schema-dts": { - "version": "1.1.5", - "license": "Apache-2.0" - }, - "node_modules/schema-utils": { - "version": "4.3.3", - "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/schema-utils/node_modules/ajv": { - "version": "8.17.1", - "license": "MIT", - "peer": true, - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/schema-utils/node_modules/ajv-keywords": { - "version": "5.1.0", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "node_modules/search-insights": { - "version": "2.17.3", - "license": "MIT", - "peer": true - }, - "node_modules/section-matter": { - "version": "1.0.0", - "license": "MIT", - "dependencies": { - "extend-shallow": "^2.0.1", - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/select-hose": { - "version": "2.0.0", - "license": "MIT" - }, - "node_modules/selfsigned": { - "version": "5.5.0", - "license": "MIT", - "dependencies": { - "@peculiar/x509": "^1.14.2", - "pkijs": "^3.3.3" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/semver": { - "version": "7.8.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", - "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver-diff": { - "version": "4.0.0", - "license": "MIT", - "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/send": { - "version": "0.19.2", - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "~0.5.2", - "http-errors": "~2.0.1", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "~2.4.1", - "range-parser": "~1.2.1", - "statuses": "~2.0.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/send/node_modules/debug": { - "version": "2.6.9", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/send/node_modules/debug/node_modules/ms": { - "version": "2.0.0", - "license": "MIT" - }, - "node_modules/send/node_modules/http-errors": { - "version": "2.0.1", - "license": "MIT", - "dependencies": { - "depd": "~2.0.0", - "inherits": "~2.0.4", - "setprototypeof": "~1.2.0", - "statuses": "~2.0.2", - "toidentifier": "~1.0.1" - }, - "engines": { - "node": ">= 0.8" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/send/node_modules/range-parser": { - "version": "1.2.1", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/send/node_modules/statuses": { - "version": "2.0.2", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/serialize-javascript": { - "version": "6.0.2", - "license": "BSD-3-Clause", - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/serve-handler": { - "version": "6.1.7", - "license": "MIT", - "dependencies": { - "bytes": "3.0.0", - "content-disposition": "0.5.2", - "mime-types": "2.1.18", - "minimatch": "3.1.5", - "path-is-inside": "1.0.2", - "path-to-regexp": "3.3.0", - "range-parser": "1.2.0" - } - }, - "node_modules/serve-handler/node_modules/mime-db": { - "version": "1.33.0", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serve-handler/node_modules/mime-types": { - "version": "2.1.18", - "license": "MIT", - "dependencies": { - "mime-db": "~1.33.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serve-handler/node_modules/minimatch": { - "version": "3.1.5", - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/serve-handler/node_modules/path-to-regexp": { - "version": "3.3.0", - "license": "MIT" - }, - "node_modules/serve-index": { - "version": "1.9.2", - "license": "MIT", - "dependencies": { - "accepts": "~1.3.8", - "batch": "0.6.1", - "debug": "2.6.9", - "escape-html": "~1.0.3", - "http-errors": "~1.8.0", - "mime-types": "~2.1.35", - "parseurl": "~1.3.3" - }, - "engines": { - "node": ">= 0.8.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/serve-index/node_modules/debug": { - "version": "2.6.9", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/serve-index/node_modules/depd": { - "version": "1.1.2", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serve-index/node_modules/http-errors": { - "version": "1.8.1", - "license": "MIT", - "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serve-index/node_modules/ms": { - "version": "2.0.0", - "license": "MIT" - }, - "node_modules/serve-static": { - "version": "1.16.3", - "license": "MIT", - "dependencies": { - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "~0.19.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/set-function-length": { - "version": "1.2.2", - "license": "MIT", - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "license": "ISC" - }, - "node_modules/shallow-clone": { - "version": "3.0.1", - "license": "MIT", - "dependencies": { - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shallowequal": { - "version": "1.1.0", - "license": "MIT" - }, - "node_modules/sharp": { - "version": "0.35.2", - "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.35.2.tgz", - "integrity": "sha512-FVtFjtBCMiJS6yb5CX7Sop45WFMpeGw6oRKuJnXYgf/f1ms/D7LE/ZUSNxnW7rZ/dbslQWYkoqFHGPaDBtaK4w==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@img/colour": "^1.1.0", - "detect-libc": "^2.1.2", - "semver": "^7.8.4" - }, - "engines": { - "node": ">=20.9.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-darwin-arm64": "0.35.2", - "@img/sharp-darwin-x64": "0.35.2", - "@img/sharp-freebsd-wasm32": "0.35.2", - "@img/sharp-libvips-darwin-arm64": "1.3.1", - "@img/sharp-libvips-darwin-x64": "1.3.1", - "@img/sharp-libvips-linux-arm": "1.3.1", - "@img/sharp-libvips-linux-arm64": "1.3.1", - "@img/sharp-libvips-linux-ppc64": "1.3.1", - "@img/sharp-libvips-linux-riscv64": "1.3.1", - "@img/sharp-libvips-linux-s390x": "1.3.1", - "@img/sharp-libvips-linux-x64": "1.3.1", - "@img/sharp-libvips-linuxmusl-arm64": "1.3.1", - "@img/sharp-libvips-linuxmusl-x64": "1.3.1", - "@img/sharp-linux-arm": "0.35.2", - "@img/sharp-linux-arm64": "0.35.2", - "@img/sharp-linux-ppc64": "0.35.2", - "@img/sharp-linux-riscv64": "0.35.2", - "@img/sharp-linux-s390x": "0.35.2", - "@img/sharp-linux-x64": "0.35.2", - "@img/sharp-linuxmusl-arm64": "0.35.2", - "@img/sharp-linuxmusl-x64": "0.35.2", - "@img/sharp-webcontainers-wasm32": "0.35.2", - "@img/sharp-win32-arm64": "0.35.2", - "@img/sharp-win32-ia32": "0.35.2", - "@img/sharp-win32-x64": "0.35.2" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "license": "MIT", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/shell-quote": { - "version": "1.8.3", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel": { - "version": "1.1.0", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3", - "side-channel-list": "^1.0.0", - "side-channel-map": "^1.0.1", - "side-channel-weakmap": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-list": { - "version": "1.0.0", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-map": { - "version": "1.0.1", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-weakmap": { - "version": "1.0.2", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3", - "side-channel-map": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/signal-exit": { - "version": "4.0.2", - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/simple-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", - "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/simple-get": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", - "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "decompress-response": "^6.0.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } - }, - "node_modules/simple-swizzle": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.4.tgz", - "integrity": "sha512-nAu1WFPQSMNr2Zn9PGSZK9AGn4t/y97lEm+MXTtUDwfP0ksAIX4nO+6ruD9Jwut4C49SB1Ws+fbXsm/yScWOHw==", - "license": "MIT", - "dependencies": { - "is-arrayish": "^0.3.1" - } - }, - "node_modules/simple-swizzle/node_modules/is-arrayish": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.4.tgz", - "integrity": "sha512-m6UrgzFVUYawGBh1dUsWR5M2Clqic9RVXC/9f8ceNlv2IcO9j9J/z8UoCLPqtsPBFNzEpfR3xftohbfqDx8EQA==", - "license": "MIT" - }, - "node_modules/sirv": { - "version": "2.0.4", - "license": "MIT", - "dependencies": { - "@polka/url": "^1.0.0-next.24", - "mrmime": "^2.0.0", - "totalist": "^3.0.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/sisteransi": { - "version": "1.0.5", - "license": "MIT" - }, - "node_modules/sitemap": { - "version": "7.1.3", - "license": "MIT", - "dependencies": { - "@types/node": "^17.0.5", - "@types/sax": "^1.2.1", - "arg": "^5.0.0", - "sax": "^1.2.4" - }, - "bin": { - "sitemap": "dist/cli.js" - }, - "engines": { - "node": ">=12.0.0", - "npm": ">=5.6.0" - } - }, - "node_modules/sitemap/node_modules/@types/node": { - "version": "17.0.45", - "license": "MIT" - }, - "node_modules/skin-tone": { - "version": "2.0.0", - "license": "MIT", - "dependencies": { - "unicode-emoji-modifier-base": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/slash": { - "version": "3.0.0", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/smart-buffer": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", - "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", - "license": "MIT", - "engines": { - "node": ">= 6.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/smol-toml": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/smol-toml/-/smol-toml-1.5.2.tgz", - "integrity": "sha512-QlaZEqcAH3/RtNyet1IPIYPsEWAaYyXXv1Krsi+1L/QHppjX4Ifm8MQsBISz9vE8cHicIq3clogsheili5vhaQ==", - "license": "BSD-3-Clause", - "engines": { - "node": ">= 18" - }, - "funding": { - "url": "https://github.com/sponsors/cyyynthia" - } - }, - "node_modules/snake-case": { - "version": "3.0.4", - "license": "MIT", - "dependencies": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/sockjs": { - "version": "0.3.24", - "license": "MIT", - "dependencies": { - "faye-websocket": "^0.11.3", - "uuid": "^8.3.2", - "websocket-driver": "^0.7.4" - } - }, - "node_modules/socks": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.9.tgz", - "integrity": "sha512-LJhUYUvItdQ0LkJTmPeaEObWXAqFyfmP85x0tch/ez9cahmhlBBLbIqDFnvBnUJGagb0JbIQrkBs1wJ+yRYpEw==", - "license": "MIT", - "dependencies": { - "ip-address": "^10.1.1", - "smart-buffer": "^4.2.0" - }, - "engines": { - "node": ">= 10.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/socks-proxy-agent": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz", - "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==", - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.2", - "debug": "^4.3.4", - "socks": "^2.8.3" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/sort-css-media-queries": { - "version": "2.2.0", - "license": "MIT", - "engines": { - "node": ">= 6.3.0" - } - }, - "node_modules/source-map": { - "version": "0.7.6", - "license": "BSD-3-Clause", - "engines": { - "node": ">= 12" - } - }, - "node_modules/source-map-js": { - "version": "1.2.1", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.21", - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/source-map-support/node_modules/source-map": { - "version": "0.6.1", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/space-separated-tokens": { - "version": "2.0.2", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/spdy": { - "version": "4.0.2", - "license": "MIT", - "dependencies": { - "debug": "^4.1.0", - "handle-thing": "^2.0.0", - "http-deceiver": "^1.2.7", - "select-hose": "^2.0.0", - "spdy-transport": "^3.0.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/spdy-transport": { - "version": "3.0.0", - "license": "MIT", - "dependencies": { - "debug": "^4.1.0", - "detect-node": "^2.0.4", - "hpack.js": "^2.1.6", - "obuf": "^1.1.2", - "readable-stream": "^3.0.6", - "wbuf": "^1.7.3" - } - }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "license": "BSD-3-Clause" - }, - "node_modules/srcset": { - "version": "4.0.0", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/srvx": { - "version": "0.11.16", - "resolved": "https://registry.npmjs.org/srvx/-/srvx-0.11.16.tgz", - "integrity": "sha512-bp07zRuycfTY43IjAvvTFnmnJi8ikW0VFiHwOhhYcVW/L4xQ1XY4PAd4Nuum1rsA17C39zL7x+CDhrn5AL32Rw==", - "license": "MIT", - "bin": { - "srvx": "bin/srvx.mjs" - }, - "engines": { - "node": ">=20.16.0" - } - }, - "node_modules/stat-mode": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/stat-mode/-/stat-mode-0.3.0.tgz", - "integrity": "sha512-QjMLR0A3WwFY2aZdV0okfFEJB5TRjkggXZjxP3A1RsWsNHNu3YPv8btmtc6iCFZ0Rul3FE93OYogvhOUClU+ng==", - "license": "MIT" - }, - "node_modules/statuses": { - "version": "1.5.0", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/std-env": { - "version": "3.10.0", - "license": "MIT" - }, - "node_modules/stream-to-array": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/stream-to-array/-/stream-to-array-2.3.0.tgz", - "integrity": "sha512-UsZtOYEn4tWU2RGLOXr/o/xjRBftZRlG3dEWoaHr8j4GuypJ3isitGbVyjQKAuMu+xbiop8q224TjiZWc4XTZA==", - "license": "MIT", - "dependencies": { - "any-promise": "^1.1.0" - } - }, - "node_modules/stream-to-promise": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/stream-to-promise/-/stream-to-promise-2.2.0.tgz", - "integrity": "sha512-HAGUASw8NT0k8JvIVutB2Y/9iBk7gpgEyAudXwNJmZERdMITGdajOa4VJfD/kNiA3TppQpTP4J+CtcHwdzKBAw==", - "deprecated": "Deprecated. Use node:stream/promises and node:stream/consumers instead.", - "license": "MIT", - "dependencies": { - "any-promise": "~1.3.0", - "end-of-stream": "~1.1.0", - "stream-to-array": "~2.3.0" - } - }, - "node_modules/streamx": { - "version": "2.28.0", - "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.28.0.tgz", - "integrity": "sha512-1Yowhzjf0ivGMrTIkY9hav5TxobO9qIVqUE41fiCGMGgc3CLlf4MY+9AHmZqBWgDTue0fY9zWjYFVyf6Diuobw==", - "license": "MIT", - "dependencies": { - "events-universal": "^1.0.0", - "fast-fifo": "^1.3.2", - "text-decoder": "^1.1.0" - } - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/string-width": { - "version": "5.1.2", - "license": "MIT", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/string-width/node_modules/ansi-regex": { - "version": "6.2.2", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/string-width/node_modules/strip-ansi": { - "version": "7.1.2", - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/stringify-entities": { - "version": "4.0.4", - "license": "MIT", - "dependencies": { - "character-entities-html4": "^2.0.0", - "character-entities-legacy": "^3.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/stringify-object": { - "version": "3.3.0", - "license": "BSD-2-Clause", - "dependencies": { - "get-own-enumerable-property-symbols": "^3.0.0", - "is-obj": "^1.0.1", - "is-regexp": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom-string": { - "version": "1.0.0", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/style-to-js": { - "version": "1.1.21", - "license": "MIT", - "dependencies": { - "style-to-object": "1.0.14" - } - }, - "node_modules/style-to-object": { - "version": "1.0.14", - "license": "MIT", - "dependencies": { - "inline-style-parser": "0.2.7" - } - }, - "node_modules/stylehacks": { - "version": "6.1.1", - "license": "MIT", - "dependencies": { - "browserslist": "^4.23.0", - "postcss-selector-parser": "^6.0.16" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/svg-parser": { - "version": "2.0.4", - "license": "MIT" - }, - "node_modules/svgo": { - "version": "3.3.3", - "license": "MIT", - "dependencies": { - "commander": "^7.2.0", - "css-select": "^5.1.0", - "css-tree": "^2.3.1", - "css-what": "^6.1.0", - "csso": "^5.0.5", - "picocolors": "^1.0.0", - "sax": "^1.5.0" - }, - "bin": { - "svgo": "bin/svgo" - }, - "engines": { - "node": ">=14.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/svgo" - } - }, - "node_modules/svgo/node_modules/commander": { - "version": "7.2.0", - "license": "MIT", - "engines": { - "node": ">= 10" - } - }, - "node_modules/swc-loader": { - "version": "0.2.7", - "license": "MIT", - "dependencies": { - "@swc/counter": "^0.1.3" - }, - "peerDependencies": { - "@swc/core": "^1.2.147", - "webpack": ">=2" - } - }, - "node_modules/tapable": { - "version": "2.3.0", - "license": "MIT", - "engines": { - "node": ">=6" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/tar": { - "version": "7.5.7", - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/fs-minipass": "^4.0.0", - "chownr": "^3.0.0", - "minipass": "^7.1.2", - "minizlib": "^3.1.0", - "yallist": "^5.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/tar-fs": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.1.2.tgz", - "integrity": "sha512-QGxxTxxyleAdyM3kpFs14ymbYmNFrfY+pHj7Z8FgtbZ7w2//VAgLMac7sT6nRpIHjppXO2AwwEOg0bPFVRcmXw==", - "license": "MIT", - "dependencies": { - "pump": "^3.0.0", - "tar-stream": "^3.1.5" - }, - "optionalDependencies": { - "bare-fs": "^4.0.1", - "bare-path": "^3.0.0" - } - }, - "node_modules/tar-stream": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", - "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", - "license": "MIT", - "dependencies": { - "b4a": "^1.6.4", - "fast-fifo": "^1.2.0", - "streamx": "^2.15.0" - } - }, - "node_modules/tar/node_modules/yallist": { - "version": "5.0.0", - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=18" - } - }, - "node_modules/teex": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/teex/-/teex-1.0.1.tgz", - "integrity": "sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg==", - "license": "MIT", - "optional": true, - "dependencies": { - "streamx": "^2.12.5" - } - }, - "node_modules/terser": { - "version": "5.46.0", - "license": "BSD-2-Clause", - "dependencies": { - "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.15.0", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/terser-webpack-plugin": { - "version": "5.3.16", - "license": "MIT", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.25", - "jest-worker": "^27.4.5", - "schema-utils": "^4.3.0", - "serialize-javascript": "^6.0.2", - "terser": "^5.31.1" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.1.0" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "uglify-js": { - "optional": true - } - } - }, - "node_modules/terser-webpack-plugin/node_modules/jest-worker": { - "version": "27.5.1", - "license": "MIT", - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/terser-webpack-plugin/node_modules/supports-color": { - "version": "8.1.1", - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/terser/node_modules/commander": { - "version": "2.20.3", - "license": "MIT" - }, - "node_modules/text-decoder": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.7.tgz", - "integrity": "sha512-vlLytXkeP4xvEq2otHeJfSQIRyWxo/oZGEbXrtEEF9Hnmrdly59sUbzZ/QgyWuLYHctCHxFF4tRQZNQ9k60ExQ==", - "license": "Apache-2.0", - "dependencies": { - "b4a": "^1.6.4" - } - }, - "node_modules/thingies": { - "version": "2.5.0", - "license": "MIT", - "engines": { - "node": ">=10.18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "^2" - } - }, - "node_modules/throttleit": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-2.1.0.tgz", - "integrity": "sha512-nt6AMGKW1p/70DF/hGBdJB57B8Tspmbp5gfJ8ilhLnt7kkr2ye7hzD6NVG8GGErk2HWF34igrL2CXmNIkzKqKw==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/thunky": { - "version": "1.1.0", - "license": "MIT" - }, - "node_modules/time-span": { - "version": "4.0.0", - "license": "MIT", - "dependencies": { - "convert-hrtime": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/tiny-invariant": { - "version": "1.3.3", - "license": "MIT" - }, - "node_modules/tiny-warning": { - "version": "1.0.3", - "license": "MIT" - }, - "node_modules/tinyexec": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", - "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", - "license": "MIT" - }, - "node_modules/tinypool": { - "version": "1.1.1", - "license": "MIT", - "engines": { - "node": "^18.0.0 || >=20.0.0" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/toidentifier": { - "version": "1.0.1", - "license": "MIT", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/totalist": { - "version": "3.0.1", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "license": "MIT" - }, - "node_modules/tree-dump": { - "version": "1.1.0", - "license": "Apache-2.0", - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/tree-kill": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", - "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", - "license": "MIT", - "bin": { - "tree-kill": "cli.js" - } - }, - "node_modules/trim-lines": { - "version": "3.0.1", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/trough": { - "version": "2.2.0", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/ts-morph": { - "version": "12.0.0", - "license": "MIT", - "dependencies": { - "@ts-morph/common": "~0.11.0", - "code-block-writer": "^10.1.1" - } - }, - "node_modules/ts-toolbelt": { - "version": "6.15.5", - "resolved": "https://registry.npmjs.org/ts-toolbelt/-/ts-toolbelt-6.15.5.tgz", - "integrity": "sha512-FZIXf1ksVyLcfr7M317jbB67XFJhOO1YqdTcuGaq9q5jLUoTikukZ+98TPjKiP2jC5CgmYdWWYs0s2nLSU0/1A==", - "license": "Apache-2.0" - }, - "node_modules/tslib": { - "version": "2.8.1", - "license": "0BSD", - "peer": true - }, - "node_modules/tsx": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.21.0.tgz", - "integrity": "sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==", - "license": "MIT", - "dependencies": { - "esbuild": "~0.27.0", - "get-tsconfig": "^4.7.5" - }, - "bin": { - "tsx": "dist/cli.mjs" - }, - "engines": { - "node": ">=18.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - } - }, - "node_modules/tsyringe": { - "version": "4.10.0", - "license": "MIT", - "dependencies": { - "tslib": "^1.9.3" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/tsyringe/node_modules/tslib": { - "version": "1.14.1", - "license": "0BSD" - }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", - "license": "Apache-2.0", - "dependencies": { - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": "*" - } - }, - "node_modules/turndown": { - "version": "7.2.2", - "license": "MIT", - "dependencies": { - "@mixmark-io/domino": "^2.2.0" - } - }, - "node_modules/type-fest": { - "version": "2.19.0", - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/type-is": { - "version": "1.6.18", - "license": "MIT", - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/typedarray-to-buffer": { - "version": "3.1.5", - "license": "MIT", - "dependencies": { - "is-typedarray": "^1.0.0" - } - }, - "node_modules/typescript": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", - "license": "Apache-2.0", - "peer": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/uid-promise": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/uid-promise/-/uid-promise-1.0.0.tgz", - "integrity": "sha512-R8375j0qwXyIu/7R0tjdF06/sElHqbmdmWC9M2qQHpEVbvE4I5+38KJI7LUUmQMp7NVq4tKHiBMkT0NFM453Ig==", - "license": "MIT" - }, - "node_modules/undici": { - "version": "5.28.4", - "license": "MIT", - "dependencies": { - "@fastify/busboy": "^2.0.0" - }, - "engines": { - "node": ">=14.0" - } - }, - "node_modules/undici-types": { - "version": "5.26.5", - "license": "MIT" - }, - "node_modules/unicode-canonical-property-names-ecmascript": { - "version": "2.0.1", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-emoji-modifier-base": { - "version": "1.0.0", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-match-property-ecmascript": { - "version": "2.0.0", - "license": "MIT", - "dependencies": { - "unicode-canonical-property-names-ecmascript": "^2.0.0", - "unicode-property-aliases-ecmascript": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-match-property-value-ecmascript": { - "version": "2.2.1", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-property-aliases-ecmascript": { - "version": "2.2.0", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/unified": { - "version": "11.0.5", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "bail": "^2.0.0", - "devlop": "^1.0.0", - "extend": "^3.0.0", - "is-plain-obj": "^4.0.0", - "trough": "^2.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unique-string": { - "version": "3.0.0", - "license": "MIT", - "dependencies": { - "crypto-random-string": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/unist-util-is": { - "version": "6.0.1", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-position": { - "version": "5.0.0", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-position-from-estree": { - "version": "2.0.0", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-stringify-position": { - "version": "4.0.0", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-visit": { - "version": "5.1.0", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-is": "^6.0.0", - "unist-util-visit-parents": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-visit-parents": { - "version": "6.0.2", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-is": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/universalify": { - "version": "2.0.1", - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/unpipe": { - "version": "1.0.0", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.2.3", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "escalade": "^3.2.0", - "picocolors": "^1.1.1" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/update-notifier": { - "version": "6.0.2", - "license": "BSD-2-Clause", - "dependencies": { - "boxen": "^7.0.0", - "chalk": "^5.0.1", - "configstore": "^6.0.0", - "has-yarn": "^3.0.0", - "import-lazy": "^4.0.0", - "is-ci": "^3.0.1", - "is-installed-globally": "^0.4.0", - "is-npm": "^6.0.0", - "is-yarn-global": "^0.4.0", - "latest-version": "^7.0.0", - "pupa": "^3.1.0", - "semver": "^7.3.7", - "semver-diff": "^4.0.0", - "xdg-basedir": "^5.1.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/yeoman/update-notifier?sponsor=1" - } - }, - "node_modules/update-notifier/node_modules/boxen": { - "version": "7.1.1", - "license": "MIT", - "dependencies": { - "ansi-align": "^3.0.1", - "camelcase": "^7.0.1", - "chalk": "^5.2.0", - "cli-boxes": "^3.0.0", - "string-width": "^5.1.2", - "type-fest": "^2.13.0", - "widest-line": "^4.0.1", - "wrap-ansi": "^8.1.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/update-notifier/node_modules/camelcase": { - "version": "7.0.1", - "license": "MIT", - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/update-notifier/node_modules/chalk": { - "version": "5.6.2", - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "license": "BSD-2-Clause", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/url-loader": { - "version": "4.1.1", - "license": "MIT", - "dependencies": { - "loader-utils": "^2.0.0", - "mime-types": "^2.1.27", - "schema-utils": "^3.0.0" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "file-loader": "*", - "webpack": "^4.0.0 || ^5.0.0" - }, - "peerDependenciesMeta": { - "file-loader": { - "optional": true - } - } - }, - "node_modules/url-loader/node_modules/ajv": { - "version": "6.14.0", - "license": "MIT", - "peer": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/url-loader/node_modules/ajv-keywords": { - "version": "3.5.2", - "license": "MIT", - "peerDependencies": { - "ajv": "^6.9.1" - } - }, - "node_modules/url-loader/node_modules/json-schema-traverse": { - "version": "0.4.1", - "license": "MIT" - }, - "node_modules/url-loader/node_modules/schema-utils": { - "version": "3.3.0", - "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "license": "MIT" - }, - "node_modules/utila": { - "version": "0.4.0", - "license": "MIT" - }, - "node_modules/utility-types": { - "version": "3.11.0", - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/utils-merge": { - "version": "1.0.1", - "license": "MIT", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/uuid": { - "version": "8.3.2", - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/value-equal": { - "version": "1.0.1", - "license": "MIT" - }, - "node_modules/vary": { - "version": "1.1.2", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/vercel": { - "version": "54.17.3", - "resolved": "https://registry.npmjs.org/vercel/-/vercel-54.17.3.tgz", - "integrity": "sha512-HVmYSzxvG6kDp0pqKJCdzaRUsopDVx6VyuGEWIVuyRGZWs6Tw/eUZ2OVl+VRTGn5yGOLaCPpI5nVqnk1689MSg==", - "license": "Apache-2.0", - "dependencies": { - "@vercel/backends": "0.8.18", - "@vercel/blob": "2.4.0", - "@vercel/build-utils": "13.32.1", - "@vercel/cli-auth": "0.3.0", - "@vercel/cli-config": "0.2.0", - "@vercel/container": "0.0.2", - "@vercel/detect-agent": "1.2.3", - "@vercel/elysia": "0.1.97", - "@vercel/express": "0.1.109", - "@vercel/fastify": "0.1.100", - "@vercel/fun": "1.3.0", - "@vercel/go": "3.10.1", - "@vercel/h3": "0.1.106", - "@vercel/hono": "0.2.100", - "@vercel/hydrogen": "1.4.0", - "@vercel/koa": "0.1.80", - "@vercel/nestjs": "0.2.101", - "@vercel/next": "4.20.1", - "@vercel/node": "5.8.21", - "@vercel/prepare-flags-definitions": "0.3.0", - "@vercel/python": "6.47.2", - "@vercel/redwood": "2.5.0", - "@vercel/remix-builder": "5.9.1", - "@vercel/ruby": "2.5.1", - "@vercel/rust": "1.3.0", - "@vercel/static-build": "2.11.3", - "chokidar": "4.0.0", - "esbuild": "0.27.0", - "form-data": "^4.0.0", - "jose": "5.9.6", - "luxon": "^3.4.0", - "proxy-agent": "6.4.0", - "sandbox": "3.1.2", - "smol-toml": "1.5.2", - "zod": "4.1.11" - }, - "bin": { - "vc": "dist/vc.js", - "vercel": "dist/vc.js" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/vercel/node_modules/chokidar": { - "version": "4.0.0", - "license": "MIT", - "dependencies": { - "readdirp": "^4.0.1" - }, - "engines": { - "node": ">= 14.16.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/vercel/node_modules/readdirp": { - "version": "4.1.2", - "license": "MIT", - "engines": { - "node": ">= 14.18.0" - }, - "funding": { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/vfile": { - "version": "6.0.3", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/vfile-location": { - "version": "5.0.3", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/vfile-message": { - "version": "4.0.3", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-stringify-position": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/watchpack": { - "version": "2.5.1", - "license": "MIT", - "dependencies": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/wbuf": { - "version": "1.7.3", - "license": "MIT", - "dependencies": { - "minimalistic-assert": "^1.0.0" - } - }, - "node_modules/web-namespaces": { - "version": "2.0.1", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/web-vitals": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-0.2.4.tgz", - "integrity": "sha512-6BjspCO9VriYy12z356nL6JBS0GYeEcA457YyRzD+dD6XYCQ75NKhcOHUMHentOE7OcVCIXXDvOm0jKFfQG2Gg==", - "license": "Apache-2.0" - }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "license": "BSD-2-Clause" - }, - "node_modules/webpack": { - "version": "5.105.0", - "license": "MIT", - "peer": true, - "dependencies": { - "@types/eslint-scope": "^3.7.7", - "@types/estree": "^1.0.8", - "@types/json-schema": "^7.0.15", - "@webassemblyjs/ast": "^1.14.1", - "@webassemblyjs/wasm-edit": "^1.14.1", - "@webassemblyjs/wasm-parser": "^1.14.1", - "acorn": "^8.15.0", - "acorn-import-phases": "^1.0.3", - "browserslist": "^4.28.1", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.19.0", - "es-module-lexer": "^2.0.0", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.11", - "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.3.1", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^4.3.3", - "tapable": "^2.3.0", - "terser-webpack-plugin": "^5.3.16", - "watchpack": "^2.5.1", - "webpack-sources": "^3.3.3" - }, - "bin": { - "webpack": "bin/webpack.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependenciesMeta": { - "webpack-cli": { - "optional": true - } - } - }, - "node_modules/webpack-bundle-analyzer": { - "version": "4.10.2", - "license": "MIT", - "dependencies": { - "@discoveryjs/json-ext": "0.5.7", - "acorn": "^8.0.4", - "acorn-walk": "^8.0.0", - "commander": "^7.2.0", - "debounce": "^1.2.1", - "escape-string-regexp": "^4.0.0", - "gzip-size": "^6.0.0", - "html-escaper": "^2.0.2", - "opener": "^1.5.2", - "picocolors": "^1.0.0", - "sirv": "^2.0.3", - "ws": "^7.3.1" - }, - "bin": { - "webpack-bundle-analyzer": "lib/bin/analyzer.js" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/webpack-bundle-analyzer/node_modules/commander": { - "version": "7.2.0", - "license": "MIT", - "engines": { - "node": ">= 10" - } - }, - "node_modules/webpack-dev-middleware": { - "version": "7.4.5", - "license": "MIT", - "dependencies": { - "colorette": "^2.0.10", - "memfs": "^4.43.1", - "mime-types": "^3.0.1", - "on-finished": "^2.4.1", - "range-parser": "^1.2.1", - "schema-utils": "^4.0.0" - }, - "engines": { - "node": ">= 18.12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "webpack": { - "optional": true - } - } - }, - "node_modules/webpack-dev-middleware/node_modules/mime-db": { - "version": "1.54.0", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/webpack-dev-middleware/node_modules/mime-types": { - "version": "3.0.2", - "license": "MIT", - "dependencies": { - "mime-db": "^1.54.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/webpack-dev-middleware/node_modules/range-parser": { - "version": "1.2.1", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/webpack-dev-server": { - "version": "5.2.3", - "license": "MIT", - "dependencies": { - "@types/bonjour": "^3.5.13", - "@types/connect-history-api-fallback": "^1.5.4", - "@types/express": "^4.17.25", - "@types/express-serve-static-core": "^4.17.21", - "@types/serve-index": "^1.9.4", - "@types/serve-static": "^1.15.5", - "@types/sockjs": "^0.3.36", - "@types/ws": "^8.5.10", - "ansi-html-community": "^0.0.8", - "bonjour-service": "^1.2.1", - "chokidar": "^3.6.0", - "colorette": "^2.0.10", - "compression": "^1.8.1", - "connect-history-api-fallback": "^2.0.0", - "express": "^4.22.1", - "graceful-fs": "^4.2.6", - "http-proxy-middleware": "^2.0.9", - "ipaddr.js": "^2.1.0", - "launch-editor": "^2.6.1", - "open": "^10.0.3", - "p-retry": "^6.2.0", - "schema-utils": "^4.2.0", - "selfsigned": "^5.5.0", - "serve-index": "^1.9.1", - "sockjs": "^0.3.24", - "spdy": "^4.0.2", - "webpack-dev-middleware": "^7.4.2", - "ws": "^8.18.0" - }, - "bin": { - "webpack-dev-server": "bin/webpack-dev-server.js" - }, - "engines": { - "node": ">= 18.12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "webpack": { - "optional": true - }, - "webpack-cli": { - "optional": true - } - } - }, - "node_modules/webpack-dev-server/node_modules/define-lazy-prop": { - "version": "3.0.0", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/webpack-dev-server/node_modules/open": { - "version": "10.2.0", - "license": "MIT", - "dependencies": { - "default-browser": "^5.2.1", - "define-lazy-prop": "^3.0.0", - "is-inside-container": "^1.0.0", - "wsl-utils": "^0.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/webpack-dev-server/node_modules/ws": { - "version": "8.19.0", - "license": "MIT", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/webpack-merge": { - "version": "6.0.1", - "license": "MIT", - "dependencies": { - "clone-deep": "^4.0.1", - "flat": "^5.0.2", - "wildcard": "^2.0.1" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/webpack-sources": { - "version": "3.3.3", - "license": "MIT", - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/webpack/node_modules/es-module-lexer": { - "version": "2.0.0", - "license": "MIT" - }, - "node_modules/webpackbar": { - "version": "6.0.1", - "license": "MIT", - "dependencies": { - "ansi-escapes": "^4.3.2", - "chalk": "^4.1.2", - "consola": "^3.2.3", - "figures": "^3.2.0", - "markdown-table": "^2.0.0", - "pretty-time": "^1.1.0", - "std-env": "^3.7.0", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=14.21.3" - }, - "peerDependencies": { - "webpack": "3 || 4 || 5" - } - }, - "node_modules/webpackbar/node_modules/emoji-regex": { - "version": "8.0.0", - "license": "MIT" - }, - "node_modules/webpackbar/node_modules/markdown-table": { - "version": "2.0.0", - "license": "MIT", - "dependencies": { - "repeat-string": "^1.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/webpackbar/node_modules/string-width": { - "version": "4.2.3", - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/webpackbar/node_modules/wrap-ansi": { - "version": "7.0.0", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/websocket-driver": { - "version": "0.7.4", - "license": "Apache-2.0", - "dependencies": { - "http-parser-js": ">=0.5.1", - "safe-buffer": ">=5.1.0", - "websocket-extensions": ">=0.1.1" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/websocket-extensions": { - "version": "0.1.4", - "license": "Apache-2.0", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "license": "MIT", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "node_modules/which": { - "version": "2.0.2", - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/widest-line": { - "version": "4.0.1", - "license": "MIT", - "dependencies": { - "string-width": "^5.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/wildcard": { - "version": "2.0.1", - "license": "MIT" - }, - "node_modules/wrap-ansi": { - "version": "8.1.0", - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "6.2.2", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "6.2.3", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "7.1.2", - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "license": "ISC" - }, - "node_modules/write-file-atomic": { - "version": "3.0.3", - "license": "ISC", - "dependencies": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "node_modules/write-file-atomic/node_modules/signal-exit": { - "version": "3.0.7", - "license": "ISC" - }, - "node_modules/ws": { - "version": "7.5.10", - "license": "MIT", - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/wsl-utils": { - "version": "0.1.0", - "license": "MIT", - "dependencies": { - "is-wsl": "^3.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/wsl-utils/node_modules/is-wsl": { - "version": "3.1.0", - "license": "MIT", - "dependencies": { - "is-inside-container": "^1.0.0" - }, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/xdg-app-paths": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/xdg-app-paths/-/xdg-app-paths-5.5.1.tgz", - "integrity": "sha512-hI3flOB4PLZIy5prbtTpirobtPE2ZtZ52szO+2mM9Efp6ErM398La+C1lIpNWDfNoQk+6Lsi6nMcCwVB7pxeMQ==", - "license": "MIT", - "dependencies": { - "os-paths": "^4.0.1", - "xdg-portable": "^7.2.0" - }, - "engines": { - "node": ">= 6.0" - } - }, - "node_modules/xdg-basedir": { - "version": "5.1.0", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/xdg-portable": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/xdg-portable/-/xdg-portable-7.3.0.tgz", - "integrity": "sha512-sqMMuL1rc0FmMBOzCpd0yuy9trqF2yTTVe+E9ogwCSWQCdDEtQUwrZPT6AxqtsFGRNxycgncbP/xmOOSPw5ZUw==", - "license": "MIT", - "dependencies": { - "os-paths": "^4.0.1" - }, - "engines": { - "node": ">= 6.0" - } - }, - "node_modules/xml-js": { - "version": "1.6.11", - "license": "MIT", - "dependencies": { - "sax": "^1.2.4" - }, - "bin": { - "xml-js": "bin/cli.js" - } - }, - "node_modules/yallist": { - "version": "3.1.1", - "license": "ISC" - }, - "node_modules/yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", - "license": "MIT", - "dependencies": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" - } - }, - "node_modules/yauzl-clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/yauzl-clone/-/yauzl-clone-1.0.4.tgz", - "integrity": "sha512-igM2RRCf3k8TvZoxR2oguuw4z1xasOnA31joCqHIyLkeWrvAc2Jgay5ISQ2ZplinkoGaJ6orCz56Ey456c5ESA==", - "license": "MIT", - "dependencies": { - "events-intercept": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/yauzl-promise": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/yauzl-promise/-/yauzl-promise-2.1.3.tgz", - "integrity": "sha512-A1pf6fzh6eYkK0L4Qp7g9jzJSDrM6nN0bOn5T0IbY4Yo3w+YkWlHFkJP7mzknMXjqusHFHlKsK2N+4OLsK2MRA==", - "license": "MIT", - "dependencies": { - "yauzl": "^2.9.1", - "yauzl-clone": "^1.0.4" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/yocto-queue": { - "version": "1.2.2", - "license": "MIT", - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/zod": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/zod/-/zod-4.1.11.tgz", - "integrity": "sha512-WPsqwxITS2tzx1bzhIKsEs19ABD5vmCVa4xBo2tq/SrV4RNZtfws1EnCWQXM6yh8bD08a1idvkB5MZSBiZsjwg==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } - }, - "node_modules/zwitch": { - "version": "2.0.4", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - } - } -} diff --git a/docs-website/reference/haystack-api/converters_api.md b/docs-website/reference/haystack-api/converters_api.md index d90228325c..2ea0c90456 100644 --- a/docs-website/reference/haystack-api/converters_api.md +++ b/docs-website/reference/haystack-api/converters_api.md @@ -446,6 +446,7 @@ print(documents[0].content) __init__( extraction_kwargs: dict[str, Any] | None = None, store_full_path: bool = False, + encoding: str = "utf-8", ) -> None ``` @@ -458,6 +459,8 @@ Create an HTMLToDocument component. the [Trafilatura documentation](https://trafilatura.readthedocs.io/en/latest/corefunctions.html#extract). - **store_full_path** (bool) – If True, the full path of the file is stored in the metadata of the document. If False, only the file name is stored. +- **encoding** (str) – The default encoding to use when converting HTML files. If the encoding is specified in the metadata of a + source ByteStream, it overrides this value. #### to_dict @@ -1060,6 +1063,7 @@ __init__( table_to_single_line: bool = False, progress_bar: bool = True, store_full_path: bool = False, + encoding: str = "utf-8", *, extract_frontmatter: bool = False ) -> None @@ -1073,6 +1077,8 @@ Create a MarkdownToDocument component. - **progress_bar** (bool) – If True shows a progress bar when running. - **store_full_path** (bool) – If True, the full path of the file is stored in the metadata of the document. If False, only the file name is stored. +- **encoding** (str) – The default encoding to use when converting Markdown files. If the encoding is specified in the metadata + of a source ByteStream, it overrides this value. - **extract_frontmatter** (bool) – If True, YAML frontmatter at the beginning of the Markdown file is removed from the document content and added to the document metadata. diff --git a/docs-website/reference/haystack-api/generators_api.md b/docs-website/reference/haystack-api/generators_api.md index 87aa43939d..140195f5fb 100644 --- a/docs-website/reference/haystack-api/generators_api.md +++ b/docs-website/reference/haystack-api/generators_api.md @@ -609,7 +609,7 @@ Creates an instance of FallbackChatGenerator. to_dict() -> dict[str, Any] ``` -Serialize the component, including nested chat generators when they support serialization. +Serialize the component, including nested chat generators. #### from_dict diff --git a/docs-website/reference/haystack-api/joiners_api.md b/docs-website/reference/haystack-api/joiners_api.md index 26a98dd893..62e33cc716 100644 --- a/docs-website/reference/haystack-api/joiners_api.md +++ b/docs-website/reference/haystack-api/joiners_api.md @@ -299,7 +299,9 @@ It supports different join modes: ```python from haystack import Pipeline, Document -from haystack.components.embedders import SentenceTransformersTextEmbedder, SentenceTransformersDocumentEmbedder +# Requires: pip install sentence-transformers-haystack +from haystack_integrations.components.embedders.sentence_transformers import SentenceTransformersTextEmbedder +from haystack_integrations.components.embedders.sentence_transformers import SentenceTransformersDocumentEmbedder from haystack.components.joiners import DocumentJoiner from haystack.components.retrievers import InMemoryBM25Retriever from haystack.components.retrievers import InMemoryEmbeddingRetriever diff --git a/docs-website/reference/haystack-api/preprocessors_api.md b/docs-website/reference/haystack-api/preprocessors_api.md index 9eaedbf13a..7df1a3ad65 100644 --- a/docs-website/reference/haystack-api/preprocessors_api.md +++ b/docs-website/reference/haystack-api/preprocessors_api.md @@ -488,7 +488,8 @@ This component is inspired by [5 Levels of Text Splitting](https://github.com/Fu ```python from haystack import Document -from haystack.components.embedders import SentenceTransformersDocumentEmbedder +# Requires: pip install sentence-transformers-haystack +from haystack_integrations.components.embedders.sentence_transformers import SentenceTransformersDocumentEmbedder from haystack.components.preprocessors import EmbeddingBasedDocumentSplitter # Create a document with content that has a clear topic shift diff --git a/docs-website/reference/haystack-api/retrievers_api.md b/docs-website/reference/haystack-api/retrievers_api.md index 0122a7f6f7..b953c50692 100644 --- a/docs-website/reference/haystack-api/retrievers_api.md +++ b/docs-website/reference/haystack-api/retrievers_api.md @@ -408,7 +408,9 @@ In query pipelines, use a TextEmbedder to embed queries and send them to the ret ```python from haystack import Document -from haystack.components.embedders import SentenceTransformersDocumentEmbedder, SentenceTransformersTextEmbedder +# Requires: pip install sentence-transformers-haystack +from haystack_integrations.components.embedders.sentence_transformers import SentenceTransformersDocumentEmbedder +from haystack_integrations.components.embedders.sentence_transformers import SentenceTransformersTextEmbedder from haystack.components.retrievers.in_memory import InMemoryEmbeddingRetriever from haystack.document_stores.in_memory import InMemoryDocumentStore @@ -575,8 +577,9 @@ The results are combined and sorted by relevance score. from haystack import Document from haystack.document_stores.in_memory import InMemoryDocumentStore from haystack.document_stores.types import DuplicatePolicy -from haystack.components.embedders import SentenceTransformersTextEmbedder -from haystack.components.embedders import SentenceTransformersDocumentEmbedder +# Requires: pip install sentence-transformers-haystack +from haystack_integrations.components.embedders.sentence_transformers import SentenceTransformersTextEmbedder +from haystack_integrations.components.embedders.sentence_transformers import SentenceTransformersDocumentEmbedder from haystack.components.retrievers import InMemoryEmbeddingRetriever from haystack.components.writers import DocumentWriter from haystack.components.retrievers import MultiQueryEmbeddingRetriever @@ -878,7 +881,9 @@ from haystack.document_stores.in_memory import InMemoryDocumentStore from haystack.document_stores.types import DuplicatePolicy from haystack.components.retrievers import InMemoryBM25Retriever, InMemoryEmbeddingRetriever from haystack.components.retrievers import TextEmbeddingRetriever, MultiRetriever -from haystack.components.embedders import SentenceTransformersTextEmbedder, SentenceTransformersDocumentEmbedder +# Requires: pip install sentence-transformers-haystack +from haystack_integrations.components.embedders.sentence_transformers import SentenceTransformersTextEmbedder +from haystack_integrations.components.embedders.sentence_transformers import SentenceTransformersDocumentEmbedder from haystack.components.writers import DocumentWriter documents = [ @@ -922,7 +927,8 @@ __init__( *, retrievers: dict[str, TextRetriever], filters: dict[str, Any] | None = None, - top_k: int = 10, + top_k_per_retriever: int | None = None, + top_k: int | None = None, max_workers: int = 4, join_mode: Literal[ "concatenate", "reciprocal_rank_fusion" @@ -937,7 +943,12 @@ Create the MultiRetriever component. - **retrievers** (dict\[str, TextRetriever\]) – A dictionary mapping names to text retrievers (implementing the `TextRetriever` protocol) to run in parallel. - **filters** (dict\[str, Any\] | None) – A dictionary of filters to apply when retrieving documents. -- **top_k** (int) – The maximum number of documents to return per retriever. +- **top_k_per_retriever** (int | None) – The maximum number of documents to return per retriever. If set, this will override the `top_k` + parameter for each retriever. If None, the `top_k` parameter of retrievers will be used. +- **top_k** (int | None) – The maximum number of documents to return overall, extracted from the combined results of all + retrievers. When set, the results are always merged using reciprocal rank fusion (regardless of + `join_mode`) so that the combined list has a consistent global ranking before it is truncated to + `top_k`. If None, all results are returned. - **max_workers** (int) – The maximum number of threads to use for parallel retrieval. - **join_mode** (Literal['concatenate', 'reciprocal_rank_fusion']) – How to merge results from multiple retrievers. Available modes: - `concatenate`: Combines all results into a single list and deduplicates. @@ -957,6 +968,7 @@ Warm up the retrievers if any has a warm_up method. run( query: str, filters: dict[str, Any] | None = None, + top_k_per_retriever: int | None = None, top_k: int | None = None, *, active_retrievers: list[str] | None = None @@ -969,7 +981,13 @@ Runs retrievers in parallel on the given query and returns deduplicated results. - **query** (str) – The query to run the retrievers on. - **filters** (dict\[str, Any\] | None) – Filters to apply. Defaults to the value set at initialization. -- **top_k** (int | None) – Maximum documents to return per retriever. Defaults to the value set at initialization. +- **top_k_per_retriever** (int | None) – The maximum number of documents to return per retriever. When set, this will override the `top_k` + parameter for each retriever. If None, the `top_k` parameter set for retrievers will be used. + Defaults to the value set at initialization. +- **top_k** (int | None) – The maximum number of documents to return overall, extracted from the combined results of all + retrievers. When set, the results are always merged using reciprocal rank fusion (regardless of + `join_mode`) so that the combined list has a consistent global ranking before it is truncated to + `top_k`. If None, all results are returned. Defaults to the value set at initialization. - **active_retrievers** (list\[str\] | None) – Names of retrievers to run. Defaults to all. Must match keys in the `retrievers` dictionary. **Returns:** @@ -987,6 +1005,7 @@ Runs retrievers in parallel on the given query and returns deduplicated results. run_async( query: str, filters: dict[str, Any] | None = None, + top_k_per_retriever: int | None = None, top_k: int | None = None, *, active_retrievers: list[str] | None = None @@ -1001,7 +1020,13 @@ Uses each retriever's `run_async` method if available, otherwise runs `run` in a - **query** (str) – The query to run the retrievers on. - **filters** (dict\[str, Any\] | None) – Filters to apply. Defaults to the value set at initialization. -- **top_k** (int | None) – Maximum documents to return per retriever. Defaults to the value set at initialization. +- **top_k_per_retriever** (int | None) – The maximum number of documents to return per retriever. When set, this will override the `top_k` + parameter for each retriever. If None, the `top_k` parameter set for retrievers will be used. + Defaults to the value set at initialization. +- **top_k** (int | None) – The maximum number of documents to return overall, extracted from the combined results of all + retrievers. When set, the results are always merged using reciprocal rank fusion (regardless of + `join_mode`) so that the combined list has a consistent global ranking before it is truncated to + `top_k`. If None, all results are returned. Defaults to the value set at initialization. - **active_retrievers** (list\[str\] | None) – Names of retrievers to run. Defaults to all. Must match keys in the `retrievers` dictionary. **Returns:** @@ -1249,7 +1274,9 @@ The results are sorted by relevance score. from haystack import Document from haystack.document_stores.in_memory import InMemoryDocumentStore from haystack.document_stores.types import DuplicatePolicy -from haystack.components.embedders import SentenceTransformersTextEmbedder, SentenceTransformersDocumentEmbedder +# Requires: pip install sentence-transformers-haystack +from haystack_integrations.components.embedders.sentence_transformers import SentenceTransformersTextEmbedder +from haystack_integrations.components.embedders.sentence_transformers import SentenceTransformersDocumentEmbedder from haystack.components.retrievers import InMemoryEmbeddingRetriever, TextEmbeddingRetriever from haystack.components.writers import DocumentWriter diff --git a/docs-website/reference/haystack-api/tools_api.md b/docs-website/reference/haystack-api/tools_api.md index d71226ccfd..b6f6ab0aaf 100644 --- a/docs-website/reference/haystack-api/tools_api.md +++ b/docs-website/reference/haystack-api/tools_api.md @@ -446,10 +446,9 @@ Below is an example of creating a PipelineTool from haystack import Document, Pipeline from haystack.dataclasses import ChatMessage from haystack.document_stores.in_memory import InMemoryDocumentStore -from haystack.components.embedders.sentence_transformers_text_embedder import SentenceTransformersTextEmbedder -from haystack.components.embedders.sentence_transformers_document_embedder import ( - SentenceTransformersDocumentEmbedder -) +# Requires: pip install sentence-transformers-haystack +from haystack_integrations.components.embedders.sentence_transformers import SentenceTransformersTextEmbedder +from haystack_integrations.components.embedders.sentence_transformers import SentenceTransformersDocumentEmbedder from haystack.components.generators.chat import OpenAIChatGenerator from haystack.components.retrievers import InMemoryEmbeddingRetriever from haystack.components.agents import Agent diff --git a/docs-website/reference/integrations-api/mirage.md b/docs-website/reference/integrations-api/mirage.md new file mode 100644 index 0000000000..09bcf73a40 --- /dev/null +++ b/docs-website/reference/integrations-api/mirage.md @@ -0,0 +1,288 @@ +--- +title: "Mirage" +id: integrations-mirage +description: "Mirage integration for Haystack" +slug: "/integrations-mirage" +--- + + +## haystack_integrations.tools.mirage.shell_tool + +### MirageShellTool + +Bases: Tool + +A Haystack `Tool` that lets an `Agent` run bash commands across a Mirage virtual filesystem. + +Mirage mounts heterogeneous backends (object storage, databases, SaaS apps, local disk) as one +filesystem; this tool exposes Mirage's single `execute` surface to an Agent as one well-described +tool with a `command` parameter. Output is normalized to text and truncated before it reaches the +model. + +### Security model + +Mirage never shells out to the host: every command runs inside Mirage's own virtual-filesystem +interpreter, so the blast radius is confined to the mounts you attach. Two controls shape what an +Agent can do: + +- **Per-mount read-only mode** (`MirageMount(..., read_only=True)`) is the authoritative write + boundary. Mirage refuses any write to a read-only mount regardless of the command used, so this + -- not the allowlist -- is how you prevent modification or deletion. Mount anything the Agent + should not change as read-only. +- **The command allowlist** (`allowed_commands`) restricts *which* commands may run. It is + enforced against every command Mirage would execute, including commands nested inside + `$(...)`, backticks, `<(...)` and subshells, so `ls "$(rm x)"` is rejected unless `rm` + is also allowed. Treat it as a best-effort filter to steer the Agent, not a sandbox: allowing a + command that itself runs other commands (`eval`, `bash`, `sh`, `source`, `xargs`, + `timeout`) effectively allows anything, so do not list those for untrusted/hosted use. +- **`denied_paths`** rejects any command whose text references one of the given path substrings. + +### Usage example + +```python +from haystack.components.agents import Agent +from haystack.components.generators.chat import OpenAIChatGenerator +from haystack.dataclasses import ChatMessage +from haystack_integrations.tools.mirage import MirageWorkspace, MirageMount, MirageShellTool + +workspace = MirageWorkspace([ + MirageMount(path="/data", resource="ram"), + MirageMount(path="/s3", resource="s3", config={"bucket": "my-bucket"}, read_only=True), +]) +tool = MirageShellTool(workspace, allowed_commands=["ls", "cat", "grep", "head", "wc", "cp"]) + +agent = Agent(chat_generator=OpenAIChatGenerator(model="gpt-4o-mini"), tools=[tool]) +result = agent.run(messages=[ChatMessage.from_user("How many lines in /s3/log.txt mention 'alert'?")]) +print(result["messages"][-1].text) +``` + +#### __init__ + +```python +__init__( + workspace: MirageWorkspace, + *, + name: str = "mirage_shell", + description: str | None = None, + invocation_timeout: float = 60.0, + max_output_chars: int = 20000, + allowed_commands: list[str] | None = None, + denied_paths: list[str] | None = None +) -> None +``` + +Initialize the Mirage shell tool. + +**Parameters:** + +- **workspace** (MirageWorkspace) – The :class:`MirageWorkspace` describing the mount tree. +- **name** (str) – Tool name exposed to the LLM. +- **description** (str | None) – Custom description. If None, one is generated from the mount tree. +- **invocation_timeout** (float) – Maximum seconds to wait for a command to finish. +- **max_output_chars** (int) – Truncate command output to this many characters before returning it. +- **allowed_commands** (list\[str\] | None) – If set, only these command names may run, e.g. + `["ls", "cat", "grep", "head", "wc"]`. The allowlist is enforced against *every* command + Mirage would execute -- including commands nested in substitutions/subshells -- so + `ls "$(rm x)"` is rejected unless `rm` is also allowed. It is a filter over Mirage's + virtual commands to steer the Agent, not a security sandbox; the write boundary is + per-mount `read_only` (see the class "Security model" section). If None, any command is + allowed (not recommended for untrusted/hosted use). +- **denied_paths** (list\[str\] | None) – If set, any command referencing one of these path substrings is rejected. + +#### warm_up + +```python +warm_up() -> None +``` + +Build the underlying live workspace eagerly. Called by `Agent.warm_up()`/`Pipeline.warm_up()`. + +#### to_dict + +```python +to_dict() -> dict[str, Any] +``` + +Serialize the tool to a dictionary in the `{"type": ..., "data": ...}` format. + +#### from_dict + +```python +from_dict(data: dict[str, Any]) -> MirageShellTool +``` + +Deserialize the tool from a dictionary. + +#### close + +```python +close() -> None +``` + +Close the underlying workspace. + +## haystack_integrations.tools.mirage.workspace + +### MirageMount + +Declarative description of a single backend mounted into a :class:`MirageWorkspace`. + +A mount is the serializable unit of a Mirage workspace: it names *where* a backend is mounted +(`path`), *which* backend it is (`resource`, a Mirage registry name such as `"s3"` or `"gdrive"`), +and *how* to configure it (`config`). + +`config` values may be plain values, Haystack `Secret` objects for credentials, or an OAuth token +source (e.g. `OAuthRefreshTokenSource`) for backends whose config accepts a token-provider callable +(such as Mirage's OneDrive `access_token`). Secrets and token sources are resolved only when the +live workspace is built. + +Every backend is created the same way. Use the Mirage registry name and the config keys that backend expects +(discover names with `MirageMount.available_resources()`; config keys come from the backend's Mirage config class): + +```python +from haystack.utils import Secret + +MirageMount(path="/data", resource="ram") # in-memory scratch +MirageMount(path="/local", resource="disk", config={"root": "/srv/data"}) # local disk +MirageMount(path="/s3", resource="s3", config={"bucket": "my-bucket"}, read_only=True) +MirageMount( + path="/drive", + resource="gdrive", + config={"client_id": "...", "refresh_token": Secret.from_env_var("GDRIVE_REFRESH_TOKEN")}, + read_only=True, +) +``` + +**Parameters:** + +- **path** (str) – Mount point in the virtual filesystem, e.g. `"/s3"`. +- **resource** (str) – Mirage registry name of the backend, e.g. `"ram"`, `"disk"`, `"s3"`, `"gdrive"`. + See `mirage.resource.registry.REGISTRY` or `MirageMount.available_resources()` for the full list. +- **config** (dict\[str, Any\]) – Keyword arguments passed to the backend's Mirage config. Values may be `Secret`s, or + an OAuth token source that is turned into a token-provider callable when the workspace is built. +- **read_only** (bool) – If True, the mount is mounted in Mirage's READ mode and writes are rejected by + Mirage itself. + +#### available_resources + +```python +available_resources() -> list[str] +``` + +Return the Mirage registry names usable as `resource`. + +These are short backend names such as `"s3"`, `"gdrive"`, `"postgres"`. Pass one to +`MirageMount(resource=...)`; the config keys each backend expects come from its Mirage +config class. + +### MirageWorkspace + +A description of a Mirage mount tree that lazily builds a live `mirage.Workspace`. + +`MirageWorkspace` is the shared backend behind the Mirage tools and components: it holds the list of +:class:`MirageMount`s and the cache configuration, serializes cleanly (resolving `Secret`s only at +build time), and constructs the live workspace on first use via Mirage's resource registry. + +### Usage example + +```python +from haystack.utils import Secret +from haystack_integrations.tools.mirage import MirageWorkspace, MirageMount + +ws = MirageWorkspace( + mounts=[ + MirageMount(path="/data", resource="ram"), + MirageMount(path="/s3", resource="s3", config={"bucket": "my-bucket"}, read_only=True), + ] +) +print(ws.run("ls /s3")) +``` + +#### __init__ + +```python +__init__( + mounts: list[MirageMount], *, cache_limit: str | int = "512MB" +) -> None +``` + +Initialize the workspace description. + +**Parameters:** + +- **mounts** (list\[MirageMount\]) – The backends to mount, as a list of :class:`MirageMount`. +- **cache_limit** (str | int) – Mirage file-cache size limit (e.g. `"512MB"` or an int byte count). + +**Raises:** + +- MirageConfigError – If no mounts are provided or mount paths are not unique. + +#### warm_up + +```python +warm_up() -> None +``` + +Build the live `mirage.Workspace` eagerly. Idempotent. + +#### close + +```python +close() -> None +``` + +Close the live workspace and release its resources, if it was built. Thread-safe. + +#### run + +```python +run( + command: str, *, timeout: float = 60.0, max_chars: int | None = None +) -> str +``` + +Run a bash `command` against the mount tree from a synchronous context and return its output. + +**Parameters:** + +- **command** (str) – A bash command line, e.g. `"grep -r alert /s3/logs | wc -l"`. +- **timeout** (float) – Maximum seconds to wait for the command. +- **max_chars** (int | None) – If set, truncate the returned text to this many characters. + +**Returns:** + +- str – Combined stdout (plus a trailing error note on non-zero exit) as a string. + +#### run_async + +```python +run_async( + command: str, *, timeout: float = 60.0, max_chars: int | None = None +) -> str +``` + +Async counterpart of :meth:`run`. + +#### to_dict + +```python +to_dict() -> dict[str, Any] +``` + +Serialize the workspace description to a dictionary (Secret-safe). + +#### from_dict + +```python +from_dict(data: dict[str, Any]) -> MirageWorkspace +``` + +Deserialize a workspace description from a dictionary. + +#### describe + +```python +describe() -> str +``` + +Return a human/LLM-readable summary of the mount tree (used in tool descriptions). diff --git a/docs-website/reference_versioned_docs/version-2.18/integrations-api/mirage.md b/docs-website/reference_versioned_docs/version-2.18/integrations-api/mirage.md new file mode 100644 index 0000000000..09bcf73a40 --- /dev/null +++ b/docs-website/reference_versioned_docs/version-2.18/integrations-api/mirage.md @@ -0,0 +1,288 @@ +--- +title: "Mirage" +id: integrations-mirage +description: "Mirage integration for Haystack" +slug: "/integrations-mirage" +--- + + +## haystack_integrations.tools.mirage.shell_tool + +### MirageShellTool + +Bases: Tool + +A Haystack `Tool` that lets an `Agent` run bash commands across a Mirage virtual filesystem. + +Mirage mounts heterogeneous backends (object storage, databases, SaaS apps, local disk) as one +filesystem; this tool exposes Mirage's single `execute` surface to an Agent as one well-described +tool with a `command` parameter. Output is normalized to text and truncated before it reaches the +model. + +### Security model + +Mirage never shells out to the host: every command runs inside Mirage's own virtual-filesystem +interpreter, so the blast radius is confined to the mounts you attach. Two controls shape what an +Agent can do: + +- **Per-mount read-only mode** (`MirageMount(..., read_only=True)`) is the authoritative write + boundary. Mirage refuses any write to a read-only mount regardless of the command used, so this + -- not the allowlist -- is how you prevent modification or deletion. Mount anything the Agent + should not change as read-only. +- **The command allowlist** (`allowed_commands`) restricts *which* commands may run. It is + enforced against every command Mirage would execute, including commands nested inside + `$(...)`, backticks, `<(...)` and subshells, so `ls "$(rm x)"` is rejected unless `rm` + is also allowed. Treat it as a best-effort filter to steer the Agent, not a sandbox: allowing a + command that itself runs other commands (`eval`, `bash`, `sh`, `source`, `xargs`, + `timeout`) effectively allows anything, so do not list those for untrusted/hosted use. +- **`denied_paths`** rejects any command whose text references one of the given path substrings. + +### Usage example + +```python +from haystack.components.agents import Agent +from haystack.components.generators.chat import OpenAIChatGenerator +from haystack.dataclasses import ChatMessage +from haystack_integrations.tools.mirage import MirageWorkspace, MirageMount, MirageShellTool + +workspace = MirageWorkspace([ + MirageMount(path="/data", resource="ram"), + MirageMount(path="/s3", resource="s3", config={"bucket": "my-bucket"}, read_only=True), +]) +tool = MirageShellTool(workspace, allowed_commands=["ls", "cat", "grep", "head", "wc", "cp"]) + +agent = Agent(chat_generator=OpenAIChatGenerator(model="gpt-4o-mini"), tools=[tool]) +result = agent.run(messages=[ChatMessage.from_user("How many lines in /s3/log.txt mention 'alert'?")]) +print(result["messages"][-1].text) +``` + +#### __init__ + +```python +__init__( + workspace: MirageWorkspace, + *, + name: str = "mirage_shell", + description: str | None = None, + invocation_timeout: float = 60.0, + max_output_chars: int = 20000, + allowed_commands: list[str] | None = None, + denied_paths: list[str] | None = None +) -> None +``` + +Initialize the Mirage shell tool. + +**Parameters:** + +- **workspace** (MirageWorkspace) – The :class:`MirageWorkspace` describing the mount tree. +- **name** (str) – Tool name exposed to the LLM. +- **description** (str | None) – Custom description. If None, one is generated from the mount tree. +- **invocation_timeout** (float) – Maximum seconds to wait for a command to finish. +- **max_output_chars** (int) – Truncate command output to this many characters before returning it. +- **allowed_commands** (list\[str\] | None) – If set, only these command names may run, e.g. + `["ls", "cat", "grep", "head", "wc"]`. The allowlist is enforced against *every* command + Mirage would execute -- including commands nested in substitutions/subshells -- so + `ls "$(rm x)"` is rejected unless `rm` is also allowed. It is a filter over Mirage's + virtual commands to steer the Agent, not a security sandbox; the write boundary is + per-mount `read_only` (see the class "Security model" section). If None, any command is + allowed (not recommended for untrusted/hosted use). +- **denied_paths** (list\[str\] | None) – If set, any command referencing one of these path substrings is rejected. + +#### warm_up + +```python +warm_up() -> None +``` + +Build the underlying live workspace eagerly. Called by `Agent.warm_up()`/`Pipeline.warm_up()`. + +#### to_dict + +```python +to_dict() -> dict[str, Any] +``` + +Serialize the tool to a dictionary in the `{"type": ..., "data": ...}` format. + +#### from_dict + +```python +from_dict(data: dict[str, Any]) -> MirageShellTool +``` + +Deserialize the tool from a dictionary. + +#### close + +```python +close() -> None +``` + +Close the underlying workspace. + +## haystack_integrations.tools.mirage.workspace + +### MirageMount + +Declarative description of a single backend mounted into a :class:`MirageWorkspace`. + +A mount is the serializable unit of a Mirage workspace: it names *where* a backend is mounted +(`path`), *which* backend it is (`resource`, a Mirage registry name such as `"s3"` or `"gdrive"`), +and *how* to configure it (`config`). + +`config` values may be plain values, Haystack `Secret` objects for credentials, or an OAuth token +source (e.g. `OAuthRefreshTokenSource`) for backends whose config accepts a token-provider callable +(such as Mirage's OneDrive `access_token`). Secrets and token sources are resolved only when the +live workspace is built. + +Every backend is created the same way. Use the Mirage registry name and the config keys that backend expects +(discover names with `MirageMount.available_resources()`; config keys come from the backend's Mirage config class): + +```python +from haystack.utils import Secret + +MirageMount(path="/data", resource="ram") # in-memory scratch +MirageMount(path="/local", resource="disk", config={"root": "/srv/data"}) # local disk +MirageMount(path="/s3", resource="s3", config={"bucket": "my-bucket"}, read_only=True) +MirageMount( + path="/drive", + resource="gdrive", + config={"client_id": "...", "refresh_token": Secret.from_env_var("GDRIVE_REFRESH_TOKEN")}, + read_only=True, +) +``` + +**Parameters:** + +- **path** (str) – Mount point in the virtual filesystem, e.g. `"/s3"`. +- **resource** (str) – Mirage registry name of the backend, e.g. `"ram"`, `"disk"`, `"s3"`, `"gdrive"`. + See `mirage.resource.registry.REGISTRY` or `MirageMount.available_resources()` for the full list. +- **config** (dict\[str, Any\]) – Keyword arguments passed to the backend's Mirage config. Values may be `Secret`s, or + an OAuth token source that is turned into a token-provider callable when the workspace is built. +- **read_only** (bool) – If True, the mount is mounted in Mirage's READ mode and writes are rejected by + Mirage itself. + +#### available_resources + +```python +available_resources() -> list[str] +``` + +Return the Mirage registry names usable as `resource`. + +These are short backend names such as `"s3"`, `"gdrive"`, `"postgres"`. Pass one to +`MirageMount(resource=...)`; the config keys each backend expects come from its Mirage +config class. + +### MirageWorkspace + +A description of a Mirage mount tree that lazily builds a live `mirage.Workspace`. + +`MirageWorkspace` is the shared backend behind the Mirage tools and components: it holds the list of +:class:`MirageMount`s and the cache configuration, serializes cleanly (resolving `Secret`s only at +build time), and constructs the live workspace on first use via Mirage's resource registry. + +### Usage example + +```python +from haystack.utils import Secret +from haystack_integrations.tools.mirage import MirageWorkspace, MirageMount + +ws = MirageWorkspace( + mounts=[ + MirageMount(path="/data", resource="ram"), + MirageMount(path="/s3", resource="s3", config={"bucket": "my-bucket"}, read_only=True), + ] +) +print(ws.run("ls /s3")) +``` + +#### __init__ + +```python +__init__( + mounts: list[MirageMount], *, cache_limit: str | int = "512MB" +) -> None +``` + +Initialize the workspace description. + +**Parameters:** + +- **mounts** (list\[MirageMount\]) – The backends to mount, as a list of :class:`MirageMount`. +- **cache_limit** (str | int) – Mirage file-cache size limit (e.g. `"512MB"` or an int byte count). + +**Raises:** + +- MirageConfigError – If no mounts are provided or mount paths are not unique. + +#### warm_up + +```python +warm_up() -> None +``` + +Build the live `mirage.Workspace` eagerly. Idempotent. + +#### close + +```python +close() -> None +``` + +Close the live workspace and release its resources, if it was built. Thread-safe. + +#### run + +```python +run( + command: str, *, timeout: float = 60.0, max_chars: int | None = None +) -> str +``` + +Run a bash `command` against the mount tree from a synchronous context and return its output. + +**Parameters:** + +- **command** (str) – A bash command line, e.g. `"grep -r alert /s3/logs | wc -l"`. +- **timeout** (float) – Maximum seconds to wait for the command. +- **max_chars** (int | None) – If set, truncate the returned text to this many characters. + +**Returns:** + +- str – Combined stdout (plus a trailing error note on non-zero exit) as a string. + +#### run_async + +```python +run_async( + command: str, *, timeout: float = 60.0, max_chars: int | None = None +) -> str +``` + +Async counterpart of :meth:`run`. + +#### to_dict + +```python +to_dict() -> dict[str, Any] +``` + +Serialize the workspace description to a dictionary (Secret-safe). + +#### from_dict + +```python +from_dict(data: dict[str, Any]) -> MirageWorkspace +``` + +Deserialize a workspace description from a dictionary. + +#### describe + +```python +describe() -> str +``` + +Return a human/LLM-readable summary of the mount tree (used in tool descriptions). diff --git a/docs-website/reference_versioned_docs/version-2.19/integrations-api/mirage.md b/docs-website/reference_versioned_docs/version-2.19/integrations-api/mirage.md new file mode 100644 index 0000000000..09bcf73a40 --- /dev/null +++ b/docs-website/reference_versioned_docs/version-2.19/integrations-api/mirage.md @@ -0,0 +1,288 @@ +--- +title: "Mirage" +id: integrations-mirage +description: "Mirage integration for Haystack" +slug: "/integrations-mirage" +--- + + +## haystack_integrations.tools.mirage.shell_tool + +### MirageShellTool + +Bases: Tool + +A Haystack `Tool` that lets an `Agent` run bash commands across a Mirage virtual filesystem. + +Mirage mounts heterogeneous backends (object storage, databases, SaaS apps, local disk) as one +filesystem; this tool exposes Mirage's single `execute` surface to an Agent as one well-described +tool with a `command` parameter. Output is normalized to text and truncated before it reaches the +model. + +### Security model + +Mirage never shells out to the host: every command runs inside Mirage's own virtual-filesystem +interpreter, so the blast radius is confined to the mounts you attach. Two controls shape what an +Agent can do: + +- **Per-mount read-only mode** (`MirageMount(..., read_only=True)`) is the authoritative write + boundary. Mirage refuses any write to a read-only mount regardless of the command used, so this + -- not the allowlist -- is how you prevent modification or deletion. Mount anything the Agent + should not change as read-only. +- **The command allowlist** (`allowed_commands`) restricts *which* commands may run. It is + enforced against every command Mirage would execute, including commands nested inside + `$(...)`, backticks, `<(...)` and subshells, so `ls "$(rm x)"` is rejected unless `rm` + is also allowed. Treat it as a best-effort filter to steer the Agent, not a sandbox: allowing a + command that itself runs other commands (`eval`, `bash`, `sh`, `source`, `xargs`, + `timeout`) effectively allows anything, so do not list those for untrusted/hosted use. +- **`denied_paths`** rejects any command whose text references one of the given path substrings. + +### Usage example + +```python +from haystack.components.agents import Agent +from haystack.components.generators.chat import OpenAIChatGenerator +from haystack.dataclasses import ChatMessage +from haystack_integrations.tools.mirage import MirageWorkspace, MirageMount, MirageShellTool + +workspace = MirageWorkspace([ + MirageMount(path="/data", resource="ram"), + MirageMount(path="/s3", resource="s3", config={"bucket": "my-bucket"}, read_only=True), +]) +tool = MirageShellTool(workspace, allowed_commands=["ls", "cat", "grep", "head", "wc", "cp"]) + +agent = Agent(chat_generator=OpenAIChatGenerator(model="gpt-4o-mini"), tools=[tool]) +result = agent.run(messages=[ChatMessage.from_user("How many lines in /s3/log.txt mention 'alert'?")]) +print(result["messages"][-1].text) +``` + +#### __init__ + +```python +__init__( + workspace: MirageWorkspace, + *, + name: str = "mirage_shell", + description: str | None = None, + invocation_timeout: float = 60.0, + max_output_chars: int = 20000, + allowed_commands: list[str] | None = None, + denied_paths: list[str] | None = None +) -> None +``` + +Initialize the Mirage shell tool. + +**Parameters:** + +- **workspace** (MirageWorkspace) – The :class:`MirageWorkspace` describing the mount tree. +- **name** (str) – Tool name exposed to the LLM. +- **description** (str | None) – Custom description. If None, one is generated from the mount tree. +- **invocation_timeout** (float) – Maximum seconds to wait for a command to finish. +- **max_output_chars** (int) – Truncate command output to this many characters before returning it. +- **allowed_commands** (list\[str\] | None) – If set, only these command names may run, e.g. + `["ls", "cat", "grep", "head", "wc"]`. The allowlist is enforced against *every* command + Mirage would execute -- including commands nested in substitutions/subshells -- so + `ls "$(rm x)"` is rejected unless `rm` is also allowed. It is a filter over Mirage's + virtual commands to steer the Agent, not a security sandbox; the write boundary is + per-mount `read_only` (see the class "Security model" section). If None, any command is + allowed (not recommended for untrusted/hosted use). +- **denied_paths** (list\[str\] | None) – If set, any command referencing one of these path substrings is rejected. + +#### warm_up + +```python +warm_up() -> None +``` + +Build the underlying live workspace eagerly. Called by `Agent.warm_up()`/`Pipeline.warm_up()`. + +#### to_dict + +```python +to_dict() -> dict[str, Any] +``` + +Serialize the tool to a dictionary in the `{"type": ..., "data": ...}` format. + +#### from_dict + +```python +from_dict(data: dict[str, Any]) -> MirageShellTool +``` + +Deserialize the tool from a dictionary. + +#### close + +```python +close() -> None +``` + +Close the underlying workspace. + +## haystack_integrations.tools.mirage.workspace + +### MirageMount + +Declarative description of a single backend mounted into a :class:`MirageWorkspace`. + +A mount is the serializable unit of a Mirage workspace: it names *where* a backend is mounted +(`path`), *which* backend it is (`resource`, a Mirage registry name such as `"s3"` or `"gdrive"`), +and *how* to configure it (`config`). + +`config` values may be plain values, Haystack `Secret` objects for credentials, or an OAuth token +source (e.g. `OAuthRefreshTokenSource`) for backends whose config accepts a token-provider callable +(such as Mirage's OneDrive `access_token`). Secrets and token sources are resolved only when the +live workspace is built. + +Every backend is created the same way. Use the Mirage registry name and the config keys that backend expects +(discover names with `MirageMount.available_resources()`; config keys come from the backend's Mirage config class): + +```python +from haystack.utils import Secret + +MirageMount(path="/data", resource="ram") # in-memory scratch +MirageMount(path="/local", resource="disk", config={"root": "/srv/data"}) # local disk +MirageMount(path="/s3", resource="s3", config={"bucket": "my-bucket"}, read_only=True) +MirageMount( + path="/drive", + resource="gdrive", + config={"client_id": "...", "refresh_token": Secret.from_env_var("GDRIVE_REFRESH_TOKEN")}, + read_only=True, +) +``` + +**Parameters:** + +- **path** (str) – Mount point in the virtual filesystem, e.g. `"/s3"`. +- **resource** (str) – Mirage registry name of the backend, e.g. `"ram"`, `"disk"`, `"s3"`, `"gdrive"`. + See `mirage.resource.registry.REGISTRY` or `MirageMount.available_resources()` for the full list. +- **config** (dict\[str, Any\]) – Keyword arguments passed to the backend's Mirage config. Values may be `Secret`s, or + an OAuth token source that is turned into a token-provider callable when the workspace is built. +- **read_only** (bool) – If True, the mount is mounted in Mirage's READ mode and writes are rejected by + Mirage itself. + +#### available_resources + +```python +available_resources() -> list[str] +``` + +Return the Mirage registry names usable as `resource`. + +These are short backend names such as `"s3"`, `"gdrive"`, `"postgres"`. Pass one to +`MirageMount(resource=...)`; the config keys each backend expects come from its Mirage +config class. + +### MirageWorkspace + +A description of a Mirage mount tree that lazily builds a live `mirage.Workspace`. + +`MirageWorkspace` is the shared backend behind the Mirage tools and components: it holds the list of +:class:`MirageMount`s and the cache configuration, serializes cleanly (resolving `Secret`s only at +build time), and constructs the live workspace on first use via Mirage's resource registry. + +### Usage example + +```python +from haystack.utils import Secret +from haystack_integrations.tools.mirage import MirageWorkspace, MirageMount + +ws = MirageWorkspace( + mounts=[ + MirageMount(path="/data", resource="ram"), + MirageMount(path="/s3", resource="s3", config={"bucket": "my-bucket"}, read_only=True), + ] +) +print(ws.run("ls /s3")) +``` + +#### __init__ + +```python +__init__( + mounts: list[MirageMount], *, cache_limit: str | int = "512MB" +) -> None +``` + +Initialize the workspace description. + +**Parameters:** + +- **mounts** (list\[MirageMount\]) – The backends to mount, as a list of :class:`MirageMount`. +- **cache_limit** (str | int) – Mirage file-cache size limit (e.g. `"512MB"` or an int byte count). + +**Raises:** + +- MirageConfigError – If no mounts are provided or mount paths are not unique. + +#### warm_up + +```python +warm_up() -> None +``` + +Build the live `mirage.Workspace` eagerly. Idempotent. + +#### close + +```python +close() -> None +``` + +Close the live workspace and release its resources, if it was built. Thread-safe. + +#### run + +```python +run( + command: str, *, timeout: float = 60.0, max_chars: int | None = None +) -> str +``` + +Run a bash `command` against the mount tree from a synchronous context and return its output. + +**Parameters:** + +- **command** (str) – A bash command line, e.g. `"grep -r alert /s3/logs | wc -l"`. +- **timeout** (float) – Maximum seconds to wait for the command. +- **max_chars** (int | None) – If set, truncate the returned text to this many characters. + +**Returns:** + +- str – Combined stdout (plus a trailing error note on non-zero exit) as a string. + +#### run_async + +```python +run_async( + command: str, *, timeout: float = 60.0, max_chars: int | None = None +) -> str +``` + +Async counterpart of :meth:`run`. + +#### to_dict + +```python +to_dict() -> dict[str, Any] +``` + +Serialize the workspace description to a dictionary (Secret-safe). + +#### from_dict + +```python +from_dict(data: dict[str, Any]) -> MirageWorkspace +``` + +Deserialize a workspace description from a dictionary. + +#### describe + +```python +describe() -> str +``` + +Return a human/LLM-readable summary of the mount tree (used in tool descriptions). diff --git a/docs-website/reference_versioned_docs/version-2.20/integrations-api/mirage.md b/docs-website/reference_versioned_docs/version-2.20/integrations-api/mirage.md new file mode 100644 index 0000000000..09bcf73a40 --- /dev/null +++ b/docs-website/reference_versioned_docs/version-2.20/integrations-api/mirage.md @@ -0,0 +1,288 @@ +--- +title: "Mirage" +id: integrations-mirage +description: "Mirage integration for Haystack" +slug: "/integrations-mirage" +--- + + +## haystack_integrations.tools.mirage.shell_tool + +### MirageShellTool + +Bases: Tool + +A Haystack `Tool` that lets an `Agent` run bash commands across a Mirage virtual filesystem. + +Mirage mounts heterogeneous backends (object storage, databases, SaaS apps, local disk) as one +filesystem; this tool exposes Mirage's single `execute` surface to an Agent as one well-described +tool with a `command` parameter. Output is normalized to text and truncated before it reaches the +model. + +### Security model + +Mirage never shells out to the host: every command runs inside Mirage's own virtual-filesystem +interpreter, so the blast radius is confined to the mounts you attach. Two controls shape what an +Agent can do: + +- **Per-mount read-only mode** (`MirageMount(..., read_only=True)`) is the authoritative write + boundary. Mirage refuses any write to a read-only mount regardless of the command used, so this + -- not the allowlist -- is how you prevent modification or deletion. Mount anything the Agent + should not change as read-only. +- **The command allowlist** (`allowed_commands`) restricts *which* commands may run. It is + enforced against every command Mirage would execute, including commands nested inside + `$(...)`, backticks, `<(...)` and subshells, so `ls "$(rm x)"` is rejected unless `rm` + is also allowed. Treat it as a best-effort filter to steer the Agent, not a sandbox: allowing a + command that itself runs other commands (`eval`, `bash`, `sh`, `source`, `xargs`, + `timeout`) effectively allows anything, so do not list those for untrusted/hosted use. +- **`denied_paths`** rejects any command whose text references one of the given path substrings. + +### Usage example + +```python +from haystack.components.agents import Agent +from haystack.components.generators.chat import OpenAIChatGenerator +from haystack.dataclasses import ChatMessage +from haystack_integrations.tools.mirage import MirageWorkspace, MirageMount, MirageShellTool + +workspace = MirageWorkspace([ + MirageMount(path="/data", resource="ram"), + MirageMount(path="/s3", resource="s3", config={"bucket": "my-bucket"}, read_only=True), +]) +tool = MirageShellTool(workspace, allowed_commands=["ls", "cat", "grep", "head", "wc", "cp"]) + +agent = Agent(chat_generator=OpenAIChatGenerator(model="gpt-4o-mini"), tools=[tool]) +result = agent.run(messages=[ChatMessage.from_user("How many lines in /s3/log.txt mention 'alert'?")]) +print(result["messages"][-1].text) +``` + +#### __init__ + +```python +__init__( + workspace: MirageWorkspace, + *, + name: str = "mirage_shell", + description: str | None = None, + invocation_timeout: float = 60.0, + max_output_chars: int = 20000, + allowed_commands: list[str] | None = None, + denied_paths: list[str] | None = None +) -> None +``` + +Initialize the Mirage shell tool. + +**Parameters:** + +- **workspace** (MirageWorkspace) – The :class:`MirageWorkspace` describing the mount tree. +- **name** (str) – Tool name exposed to the LLM. +- **description** (str | None) – Custom description. If None, one is generated from the mount tree. +- **invocation_timeout** (float) – Maximum seconds to wait for a command to finish. +- **max_output_chars** (int) – Truncate command output to this many characters before returning it. +- **allowed_commands** (list\[str\] | None) – If set, only these command names may run, e.g. + `["ls", "cat", "grep", "head", "wc"]`. The allowlist is enforced against *every* command + Mirage would execute -- including commands nested in substitutions/subshells -- so + `ls "$(rm x)"` is rejected unless `rm` is also allowed. It is a filter over Mirage's + virtual commands to steer the Agent, not a security sandbox; the write boundary is + per-mount `read_only` (see the class "Security model" section). If None, any command is + allowed (not recommended for untrusted/hosted use). +- **denied_paths** (list\[str\] | None) – If set, any command referencing one of these path substrings is rejected. + +#### warm_up + +```python +warm_up() -> None +``` + +Build the underlying live workspace eagerly. Called by `Agent.warm_up()`/`Pipeline.warm_up()`. + +#### to_dict + +```python +to_dict() -> dict[str, Any] +``` + +Serialize the tool to a dictionary in the `{"type": ..., "data": ...}` format. + +#### from_dict + +```python +from_dict(data: dict[str, Any]) -> MirageShellTool +``` + +Deserialize the tool from a dictionary. + +#### close + +```python +close() -> None +``` + +Close the underlying workspace. + +## haystack_integrations.tools.mirage.workspace + +### MirageMount + +Declarative description of a single backend mounted into a :class:`MirageWorkspace`. + +A mount is the serializable unit of a Mirage workspace: it names *where* a backend is mounted +(`path`), *which* backend it is (`resource`, a Mirage registry name such as `"s3"` or `"gdrive"`), +and *how* to configure it (`config`). + +`config` values may be plain values, Haystack `Secret` objects for credentials, or an OAuth token +source (e.g. `OAuthRefreshTokenSource`) for backends whose config accepts a token-provider callable +(such as Mirage's OneDrive `access_token`). Secrets and token sources are resolved only when the +live workspace is built. + +Every backend is created the same way. Use the Mirage registry name and the config keys that backend expects +(discover names with `MirageMount.available_resources()`; config keys come from the backend's Mirage config class): + +```python +from haystack.utils import Secret + +MirageMount(path="/data", resource="ram") # in-memory scratch +MirageMount(path="/local", resource="disk", config={"root": "/srv/data"}) # local disk +MirageMount(path="/s3", resource="s3", config={"bucket": "my-bucket"}, read_only=True) +MirageMount( + path="/drive", + resource="gdrive", + config={"client_id": "...", "refresh_token": Secret.from_env_var("GDRIVE_REFRESH_TOKEN")}, + read_only=True, +) +``` + +**Parameters:** + +- **path** (str) – Mount point in the virtual filesystem, e.g. `"/s3"`. +- **resource** (str) – Mirage registry name of the backend, e.g. `"ram"`, `"disk"`, `"s3"`, `"gdrive"`. + See `mirage.resource.registry.REGISTRY` or `MirageMount.available_resources()` for the full list. +- **config** (dict\[str, Any\]) – Keyword arguments passed to the backend's Mirage config. Values may be `Secret`s, or + an OAuth token source that is turned into a token-provider callable when the workspace is built. +- **read_only** (bool) – If True, the mount is mounted in Mirage's READ mode and writes are rejected by + Mirage itself. + +#### available_resources + +```python +available_resources() -> list[str] +``` + +Return the Mirage registry names usable as `resource`. + +These are short backend names such as `"s3"`, `"gdrive"`, `"postgres"`. Pass one to +`MirageMount(resource=...)`; the config keys each backend expects come from its Mirage +config class. + +### MirageWorkspace + +A description of a Mirage mount tree that lazily builds a live `mirage.Workspace`. + +`MirageWorkspace` is the shared backend behind the Mirage tools and components: it holds the list of +:class:`MirageMount`s and the cache configuration, serializes cleanly (resolving `Secret`s only at +build time), and constructs the live workspace on first use via Mirage's resource registry. + +### Usage example + +```python +from haystack.utils import Secret +from haystack_integrations.tools.mirage import MirageWorkspace, MirageMount + +ws = MirageWorkspace( + mounts=[ + MirageMount(path="/data", resource="ram"), + MirageMount(path="/s3", resource="s3", config={"bucket": "my-bucket"}, read_only=True), + ] +) +print(ws.run("ls /s3")) +``` + +#### __init__ + +```python +__init__( + mounts: list[MirageMount], *, cache_limit: str | int = "512MB" +) -> None +``` + +Initialize the workspace description. + +**Parameters:** + +- **mounts** (list\[MirageMount\]) – The backends to mount, as a list of :class:`MirageMount`. +- **cache_limit** (str | int) – Mirage file-cache size limit (e.g. `"512MB"` or an int byte count). + +**Raises:** + +- MirageConfigError – If no mounts are provided or mount paths are not unique. + +#### warm_up + +```python +warm_up() -> None +``` + +Build the live `mirage.Workspace` eagerly. Idempotent. + +#### close + +```python +close() -> None +``` + +Close the live workspace and release its resources, if it was built. Thread-safe. + +#### run + +```python +run( + command: str, *, timeout: float = 60.0, max_chars: int | None = None +) -> str +``` + +Run a bash `command` against the mount tree from a synchronous context and return its output. + +**Parameters:** + +- **command** (str) – A bash command line, e.g. `"grep -r alert /s3/logs | wc -l"`. +- **timeout** (float) – Maximum seconds to wait for the command. +- **max_chars** (int | None) – If set, truncate the returned text to this many characters. + +**Returns:** + +- str – Combined stdout (plus a trailing error note on non-zero exit) as a string. + +#### run_async + +```python +run_async( + command: str, *, timeout: float = 60.0, max_chars: int | None = None +) -> str +``` + +Async counterpart of :meth:`run`. + +#### to_dict + +```python +to_dict() -> dict[str, Any] +``` + +Serialize the workspace description to a dictionary (Secret-safe). + +#### from_dict + +```python +from_dict(data: dict[str, Any]) -> MirageWorkspace +``` + +Deserialize a workspace description from a dictionary. + +#### describe + +```python +describe() -> str +``` + +Return a human/LLM-readable summary of the mount tree (used in tool descriptions). diff --git a/docs-website/reference_versioned_docs/version-2.21/integrations-api/mirage.md b/docs-website/reference_versioned_docs/version-2.21/integrations-api/mirage.md new file mode 100644 index 0000000000..09bcf73a40 --- /dev/null +++ b/docs-website/reference_versioned_docs/version-2.21/integrations-api/mirage.md @@ -0,0 +1,288 @@ +--- +title: "Mirage" +id: integrations-mirage +description: "Mirage integration for Haystack" +slug: "/integrations-mirage" +--- + + +## haystack_integrations.tools.mirage.shell_tool + +### MirageShellTool + +Bases: Tool + +A Haystack `Tool` that lets an `Agent` run bash commands across a Mirage virtual filesystem. + +Mirage mounts heterogeneous backends (object storage, databases, SaaS apps, local disk) as one +filesystem; this tool exposes Mirage's single `execute` surface to an Agent as one well-described +tool with a `command` parameter. Output is normalized to text and truncated before it reaches the +model. + +### Security model + +Mirage never shells out to the host: every command runs inside Mirage's own virtual-filesystem +interpreter, so the blast radius is confined to the mounts you attach. Two controls shape what an +Agent can do: + +- **Per-mount read-only mode** (`MirageMount(..., read_only=True)`) is the authoritative write + boundary. Mirage refuses any write to a read-only mount regardless of the command used, so this + -- not the allowlist -- is how you prevent modification or deletion. Mount anything the Agent + should not change as read-only. +- **The command allowlist** (`allowed_commands`) restricts *which* commands may run. It is + enforced against every command Mirage would execute, including commands nested inside + `$(...)`, backticks, `<(...)` and subshells, so `ls "$(rm x)"` is rejected unless `rm` + is also allowed. Treat it as a best-effort filter to steer the Agent, not a sandbox: allowing a + command that itself runs other commands (`eval`, `bash`, `sh`, `source`, `xargs`, + `timeout`) effectively allows anything, so do not list those for untrusted/hosted use. +- **`denied_paths`** rejects any command whose text references one of the given path substrings. + +### Usage example + +```python +from haystack.components.agents import Agent +from haystack.components.generators.chat import OpenAIChatGenerator +from haystack.dataclasses import ChatMessage +from haystack_integrations.tools.mirage import MirageWorkspace, MirageMount, MirageShellTool + +workspace = MirageWorkspace([ + MirageMount(path="/data", resource="ram"), + MirageMount(path="/s3", resource="s3", config={"bucket": "my-bucket"}, read_only=True), +]) +tool = MirageShellTool(workspace, allowed_commands=["ls", "cat", "grep", "head", "wc", "cp"]) + +agent = Agent(chat_generator=OpenAIChatGenerator(model="gpt-4o-mini"), tools=[tool]) +result = agent.run(messages=[ChatMessage.from_user("How many lines in /s3/log.txt mention 'alert'?")]) +print(result["messages"][-1].text) +``` + +#### __init__ + +```python +__init__( + workspace: MirageWorkspace, + *, + name: str = "mirage_shell", + description: str | None = None, + invocation_timeout: float = 60.0, + max_output_chars: int = 20000, + allowed_commands: list[str] | None = None, + denied_paths: list[str] | None = None +) -> None +``` + +Initialize the Mirage shell tool. + +**Parameters:** + +- **workspace** (MirageWorkspace) – The :class:`MirageWorkspace` describing the mount tree. +- **name** (str) – Tool name exposed to the LLM. +- **description** (str | None) – Custom description. If None, one is generated from the mount tree. +- **invocation_timeout** (float) – Maximum seconds to wait for a command to finish. +- **max_output_chars** (int) – Truncate command output to this many characters before returning it. +- **allowed_commands** (list\[str\] | None) – If set, only these command names may run, e.g. + `["ls", "cat", "grep", "head", "wc"]`. The allowlist is enforced against *every* command + Mirage would execute -- including commands nested in substitutions/subshells -- so + `ls "$(rm x)"` is rejected unless `rm` is also allowed. It is a filter over Mirage's + virtual commands to steer the Agent, not a security sandbox; the write boundary is + per-mount `read_only` (see the class "Security model" section). If None, any command is + allowed (not recommended for untrusted/hosted use). +- **denied_paths** (list\[str\] | None) – If set, any command referencing one of these path substrings is rejected. + +#### warm_up + +```python +warm_up() -> None +``` + +Build the underlying live workspace eagerly. Called by `Agent.warm_up()`/`Pipeline.warm_up()`. + +#### to_dict + +```python +to_dict() -> dict[str, Any] +``` + +Serialize the tool to a dictionary in the `{"type": ..., "data": ...}` format. + +#### from_dict + +```python +from_dict(data: dict[str, Any]) -> MirageShellTool +``` + +Deserialize the tool from a dictionary. + +#### close + +```python +close() -> None +``` + +Close the underlying workspace. + +## haystack_integrations.tools.mirage.workspace + +### MirageMount + +Declarative description of a single backend mounted into a :class:`MirageWorkspace`. + +A mount is the serializable unit of a Mirage workspace: it names *where* a backend is mounted +(`path`), *which* backend it is (`resource`, a Mirage registry name such as `"s3"` or `"gdrive"`), +and *how* to configure it (`config`). + +`config` values may be plain values, Haystack `Secret` objects for credentials, or an OAuth token +source (e.g. `OAuthRefreshTokenSource`) for backends whose config accepts a token-provider callable +(such as Mirage's OneDrive `access_token`). Secrets and token sources are resolved only when the +live workspace is built. + +Every backend is created the same way. Use the Mirage registry name and the config keys that backend expects +(discover names with `MirageMount.available_resources()`; config keys come from the backend's Mirage config class): + +```python +from haystack.utils import Secret + +MirageMount(path="/data", resource="ram") # in-memory scratch +MirageMount(path="/local", resource="disk", config={"root": "/srv/data"}) # local disk +MirageMount(path="/s3", resource="s3", config={"bucket": "my-bucket"}, read_only=True) +MirageMount( + path="/drive", + resource="gdrive", + config={"client_id": "...", "refresh_token": Secret.from_env_var("GDRIVE_REFRESH_TOKEN")}, + read_only=True, +) +``` + +**Parameters:** + +- **path** (str) – Mount point in the virtual filesystem, e.g. `"/s3"`. +- **resource** (str) – Mirage registry name of the backend, e.g. `"ram"`, `"disk"`, `"s3"`, `"gdrive"`. + See `mirage.resource.registry.REGISTRY` or `MirageMount.available_resources()` for the full list. +- **config** (dict\[str, Any\]) – Keyword arguments passed to the backend's Mirage config. Values may be `Secret`s, or + an OAuth token source that is turned into a token-provider callable when the workspace is built. +- **read_only** (bool) – If True, the mount is mounted in Mirage's READ mode and writes are rejected by + Mirage itself. + +#### available_resources + +```python +available_resources() -> list[str] +``` + +Return the Mirage registry names usable as `resource`. + +These are short backend names such as `"s3"`, `"gdrive"`, `"postgres"`. Pass one to +`MirageMount(resource=...)`; the config keys each backend expects come from its Mirage +config class. + +### MirageWorkspace + +A description of a Mirage mount tree that lazily builds a live `mirage.Workspace`. + +`MirageWorkspace` is the shared backend behind the Mirage tools and components: it holds the list of +:class:`MirageMount`s and the cache configuration, serializes cleanly (resolving `Secret`s only at +build time), and constructs the live workspace on first use via Mirage's resource registry. + +### Usage example + +```python +from haystack.utils import Secret +from haystack_integrations.tools.mirage import MirageWorkspace, MirageMount + +ws = MirageWorkspace( + mounts=[ + MirageMount(path="/data", resource="ram"), + MirageMount(path="/s3", resource="s3", config={"bucket": "my-bucket"}, read_only=True), + ] +) +print(ws.run("ls /s3")) +``` + +#### __init__ + +```python +__init__( + mounts: list[MirageMount], *, cache_limit: str | int = "512MB" +) -> None +``` + +Initialize the workspace description. + +**Parameters:** + +- **mounts** (list\[MirageMount\]) – The backends to mount, as a list of :class:`MirageMount`. +- **cache_limit** (str | int) – Mirage file-cache size limit (e.g. `"512MB"` or an int byte count). + +**Raises:** + +- MirageConfigError – If no mounts are provided or mount paths are not unique. + +#### warm_up + +```python +warm_up() -> None +``` + +Build the live `mirage.Workspace` eagerly. Idempotent. + +#### close + +```python +close() -> None +``` + +Close the live workspace and release its resources, if it was built. Thread-safe. + +#### run + +```python +run( + command: str, *, timeout: float = 60.0, max_chars: int | None = None +) -> str +``` + +Run a bash `command` against the mount tree from a synchronous context and return its output. + +**Parameters:** + +- **command** (str) – A bash command line, e.g. `"grep -r alert /s3/logs | wc -l"`. +- **timeout** (float) – Maximum seconds to wait for the command. +- **max_chars** (int | None) – If set, truncate the returned text to this many characters. + +**Returns:** + +- str – Combined stdout (plus a trailing error note on non-zero exit) as a string. + +#### run_async + +```python +run_async( + command: str, *, timeout: float = 60.0, max_chars: int | None = None +) -> str +``` + +Async counterpart of :meth:`run`. + +#### to_dict + +```python +to_dict() -> dict[str, Any] +``` + +Serialize the workspace description to a dictionary (Secret-safe). + +#### from_dict + +```python +from_dict(data: dict[str, Any]) -> MirageWorkspace +``` + +Deserialize a workspace description from a dictionary. + +#### describe + +```python +describe() -> str +``` + +Return a human/LLM-readable summary of the mount tree (used in tool descriptions). diff --git a/docs-website/reference_versioned_docs/version-2.22/integrations-api/mirage.md b/docs-website/reference_versioned_docs/version-2.22/integrations-api/mirage.md new file mode 100644 index 0000000000..09bcf73a40 --- /dev/null +++ b/docs-website/reference_versioned_docs/version-2.22/integrations-api/mirage.md @@ -0,0 +1,288 @@ +--- +title: "Mirage" +id: integrations-mirage +description: "Mirage integration for Haystack" +slug: "/integrations-mirage" +--- + + +## haystack_integrations.tools.mirage.shell_tool + +### MirageShellTool + +Bases: Tool + +A Haystack `Tool` that lets an `Agent` run bash commands across a Mirage virtual filesystem. + +Mirage mounts heterogeneous backends (object storage, databases, SaaS apps, local disk) as one +filesystem; this tool exposes Mirage's single `execute` surface to an Agent as one well-described +tool with a `command` parameter. Output is normalized to text and truncated before it reaches the +model. + +### Security model + +Mirage never shells out to the host: every command runs inside Mirage's own virtual-filesystem +interpreter, so the blast radius is confined to the mounts you attach. Two controls shape what an +Agent can do: + +- **Per-mount read-only mode** (`MirageMount(..., read_only=True)`) is the authoritative write + boundary. Mirage refuses any write to a read-only mount regardless of the command used, so this + -- not the allowlist -- is how you prevent modification or deletion. Mount anything the Agent + should not change as read-only. +- **The command allowlist** (`allowed_commands`) restricts *which* commands may run. It is + enforced against every command Mirage would execute, including commands nested inside + `$(...)`, backticks, `<(...)` and subshells, so `ls "$(rm x)"` is rejected unless `rm` + is also allowed. Treat it as a best-effort filter to steer the Agent, not a sandbox: allowing a + command that itself runs other commands (`eval`, `bash`, `sh`, `source`, `xargs`, + `timeout`) effectively allows anything, so do not list those for untrusted/hosted use. +- **`denied_paths`** rejects any command whose text references one of the given path substrings. + +### Usage example + +```python +from haystack.components.agents import Agent +from haystack.components.generators.chat import OpenAIChatGenerator +from haystack.dataclasses import ChatMessage +from haystack_integrations.tools.mirage import MirageWorkspace, MirageMount, MirageShellTool + +workspace = MirageWorkspace([ + MirageMount(path="/data", resource="ram"), + MirageMount(path="/s3", resource="s3", config={"bucket": "my-bucket"}, read_only=True), +]) +tool = MirageShellTool(workspace, allowed_commands=["ls", "cat", "grep", "head", "wc", "cp"]) + +agent = Agent(chat_generator=OpenAIChatGenerator(model="gpt-4o-mini"), tools=[tool]) +result = agent.run(messages=[ChatMessage.from_user("How many lines in /s3/log.txt mention 'alert'?")]) +print(result["messages"][-1].text) +``` + +#### __init__ + +```python +__init__( + workspace: MirageWorkspace, + *, + name: str = "mirage_shell", + description: str | None = None, + invocation_timeout: float = 60.0, + max_output_chars: int = 20000, + allowed_commands: list[str] | None = None, + denied_paths: list[str] | None = None +) -> None +``` + +Initialize the Mirage shell tool. + +**Parameters:** + +- **workspace** (MirageWorkspace) – The :class:`MirageWorkspace` describing the mount tree. +- **name** (str) – Tool name exposed to the LLM. +- **description** (str | None) – Custom description. If None, one is generated from the mount tree. +- **invocation_timeout** (float) – Maximum seconds to wait for a command to finish. +- **max_output_chars** (int) – Truncate command output to this many characters before returning it. +- **allowed_commands** (list\[str\] | None) – If set, only these command names may run, e.g. + `["ls", "cat", "grep", "head", "wc"]`. The allowlist is enforced against *every* command + Mirage would execute -- including commands nested in substitutions/subshells -- so + `ls "$(rm x)"` is rejected unless `rm` is also allowed. It is a filter over Mirage's + virtual commands to steer the Agent, not a security sandbox; the write boundary is + per-mount `read_only` (see the class "Security model" section). If None, any command is + allowed (not recommended for untrusted/hosted use). +- **denied_paths** (list\[str\] | None) – If set, any command referencing one of these path substrings is rejected. + +#### warm_up + +```python +warm_up() -> None +``` + +Build the underlying live workspace eagerly. Called by `Agent.warm_up()`/`Pipeline.warm_up()`. + +#### to_dict + +```python +to_dict() -> dict[str, Any] +``` + +Serialize the tool to a dictionary in the `{"type": ..., "data": ...}` format. + +#### from_dict + +```python +from_dict(data: dict[str, Any]) -> MirageShellTool +``` + +Deserialize the tool from a dictionary. + +#### close + +```python +close() -> None +``` + +Close the underlying workspace. + +## haystack_integrations.tools.mirage.workspace + +### MirageMount + +Declarative description of a single backend mounted into a :class:`MirageWorkspace`. + +A mount is the serializable unit of a Mirage workspace: it names *where* a backend is mounted +(`path`), *which* backend it is (`resource`, a Mirage registry name such as `"s3"` or `"gdrive"`), +and *how* to configure it (`config`). + +`config` values may be plain values, Haystack `Secret` objects for credentials, or an OAuth token +source (e.g. `OAuthRefreshTokenSource`) for backends whose config accepts a token-provider callable +(such as Mirage's OneDrive `access_token`). Secrets and token sources are resolved only when the +live workspace is built. + +Every backend is created the same way. Use the Mirage registry name and the config keys that backend expects +(discover names with `MirageMount.available_resources()`; config keys come from the backend's Mirage config class): + +```python +from haystack.utils import Secret + +MirageMount(path="/data", resource="ram") # in-memory scratch +MirageMount(path="/local", resource="disk", config={"root": "/srv/data"}) # local disk +MirageMount(path="/s3", resource="s3", config={"bucket": "my-bucket"}, read_only=True) +MirageMount( + path="/drive", + resource="gdrive", + config={"client_id": "...", "refresh_token": Secret.from_env_var("GDRIVE_REFRESH_TOKEN")}, + read_only=True, +) +``` + +**Parameters:** + +- **path** (str) – Mount point in the virtual filesystem, e.g. `"/s3"`. +- **resource** (str) – Mirage registry name of the backend, e.g. `"ram"`, `"disk"`, `"s3"`, `"gdrive"`. + See `mirage.resource.registry.REGISTRY` or `MirageMount.available_resources()` for the full list. +- **config** (dict\[str, Any\]) – Keyword arguments passed to the backend's Mirage config. Values may be `Secret`s, or + an OAuth token source that is turned into a token-provider callable when the workspace is built. +- **read_only** (bool) – If True, the mount is mounted in Mirage's READ mode and writes are rejected by + Mirage itself. + +#### available_resources + +```python +available_resources() -> list[str] +``` + +Return the Mirage registry names usable as `resource`. + +These are short backend names such as `"s3"`, `"gdrive"`, `"postgres"`. Pass one to +`MirageMount(resource=...)`; the config keys each backend expects come from its Mirage +config class. + +### MirageWorkspace + +A description of a Mirage mount tree that lazily builds a live `mirage.Workspace`. + +`MirageWorkspace` is the shared backend behind the Mirage tools and components: it holds the list of +:class:`MirageMount`s and the cache configuration, serializes cleanly (resolving `Secret`s only at +build time), and constructs the live workspace on first use via Mirage's resource registry. + +### Usage example + +```python +from haystack.utils import Secret +from haystack_integrations.tools.mirage import MirageWorkspace, MirageMount + +ws = MirageWorkspace( + mounts=[ + MirageMount(path="/data", resource="ram"), + MirageMount(path="/s3", resource="s3", config={"bucket": "my-bucket"}, read_only=True), + ] +) +print(ws.run("ls /s3")) +``` + +#### __init__ + +```python +__init__( + mounts: list[MirageMount], *, cache_limit: str | int = "512MB" +) -> None +``` + +Initialize the workspace description. + +**Parameters:** + +- **mounts** (list\[MirageMount\]) – The backends to mount, as a list of :class:`MirageMount`. +- **cache_limit** (str | int) – Mirage file-cache size limit (e.g. `"512MB"` or an int byte count). + +**Raises:** + +- MirageConfigError – If no mounts are provided or mount paths are not unique. + +#### warm_up + +```python +warm_up() -> None +``` + +Build the live `mirage.Workspace` eagerly. Idempotent. + +#### close + +```python +close() -> None +``` + +Close the live workspace and release its resources, if it was built. Thread-safe. + +#### run + +```python +run( + command: str, *, timeout: float = 60.0, max_chars: int | None = None +) -> str +``` + +Run a bash `command` against the mount tree from a synchronous context and return its output. + +**Parameters:** + +- **command** (str) – A bash command line, e.g. `"grep -r alert /s3/logs | wc -l"`. +- **timeout** (float) – Maximum seconds to wait for the command. +- **max_chars** (int | None) – If set, truncate the returned text to this many characters. + +**Returns:** + +- str – Combined stdout (plus a trailing error note on non-zero exit) as a string. + +#### run_async + +```python +run_async( + command: str, *, timeout: float = 60.0, max_chars: int | None = None +) -> str +``` + +Async counterpart of :meth:`run`. + +#### to_dict + +```python +to_dict() -> dict[str, Any] +``` + +Serialize the workspace description to a dictionary (Secret-safe). + +#### from_dict + +```python +from_dict(data: dict[str, Any]) -> MirageWorkspace +``` + +Deserialize a workspace description from a dictionary. + +#### describe + +```python +describe() -> str +``` + +Return a human/LLM-readable summary of the mount tree (used in tool descriptions). diff --git a/docs-website/reference_versioned_docs/version-2.23/integrations-api/mirage.md b/docs-website/reference_versioned_docs/version-2.23/integrations-api/mirage.md new file mode 100644 index 0000000000..09bcf73a40 --- /dev/null +++ b/docs-website/reference_versioned_docs/version-2.23/integrations-api/mirage.md @@ -0,0 +1,288 @@ +--- +title: "Mirage" +id: integrations-mirage +description: "Mirage integration for Haystack" +slug: "/integrations-mirage" +--- + + +## haystack_integrations.tools.mirage.shell_tool + +### MirageShellTool + +Bases: Tool + +A Haystack `Tool` that lets an `Agent` run bash commands across a Mirage virtual filesystem. + +Mirage mounts heterogeneous backends (object storage, databases, SaaS apps, local disk) as one +filesystem; this tool exposes Mirage's single `execute` surface to an Agent as one well-described +tool with a `command` parameter. Output is normalized to text and truncated before it reaches the +model. + +### Security model + +Mirage never shells out to the host: every command runs inside Mirage's own virtual-filesystem +interpreter, so the blast radius is confined to the mounts you attach. Two controls shape what an +Agent can do: + +- **Per-mount read-only mode** (`MirageMount(..., read_only=True)`) is the authoritative write + boundary. Mirage refuses any write to a read-only mount regardless of the command used, so this + -- not the allowlist -- is how you prevent modification or deletion. Mount anything the Agent + should not change as read-only. +- **The command allowlist** (`allowed_commands`) restricts *which* commands may run. It is + enforced against every command Mirage would execute, including commands nested inside + `$(...)`, backticks, `<(...)` and subshells, so `ls "$(rm x)"` is rejected unless `rm` + is also allowed. Treat it as a best-effort filter to steer the Agent, not a sandbox: allowing a + command that itself runs other commands (`eval`, `bash`, `sh`, `source`, `xargs`, + `timeout`) effectively allows anything, so do not list those for untrusted/hosted use. +- **`denied_paths`** rejects any command whose text references one of the given path substrings. + +### Usage example + +```python +from haystack.components.agents import Agent +from haystack.components.generators.chat import OpenAIChatGenerator +from haystack.dataclasses import ChatMessage +from haystack_integrations.tools.mirage import MirageWorkspace, MirageMount, MirageShellTool + +workspace = MirageWorkspace([ + MirageMount(path="/data", resource="ram"), + MirageMount(path="/s3", resource="s3", config={"bucket": "my-bucket"}, read_only=True), +]) +tool = MirageShellTool(workspace, allowed_commands=["ls", "cat", "grep", "head", "wc", "cp"]) + +agent = Agent(chat_generator=OpenAIChatGenerator(model="gpt-4o-mini"), tools=[tool]) +result = agent.run(messages=[ChatMessage.from_user("How many lines in /s3/log.txt mention 'alert'?")]) +print(result["messages"][-1].text) +``` + +#### __init__ + +```python +__init__( + workspace: MirageWorkspace, + *, + name: str = "mirage_shell", + description: str | None = None, + invocation_timeout: float = 60.0, + max_output_chars: int = 20000, + allowed_commands: list[str] | None = None, + denied_paths: list[str] | None = None +) -> None +``` + +Initialize the Mirage shell tool. + +**Parameters:** + +- **workspace** (MirageWorkspace) – The :class:`MirageWorkspace` describing the mount tree. +- **name** (str) – Tool name exposed to the LLM. +- **description** (str | None) – Custom description. If None, one is generated from the mount tree. +- **invocation_timeout** (float) – Maximum seconds to wait for a command to finish. +- **max_output_chars** (int) – Truncate command output to this many characters before returning it. +- **allowed_commands** (list\[str\] | None) – If set, only these command names may run, e.g. + `["ls", "cat", "grep", "head", "wc"]`. The allowlist is enforced against *every* command + Mirage would execute -- including commands nested in substitutions/subshells -- so + `ls "$(rm x)"` is rejected unless `rm` is also allowed. It is a filter over Mirage's + virtual commands to steer the Agent, not a security sandbox; the write boundary is + per-mount `read_only` (see the class "Security model" section). If None, any command is + allowed (not recommended for untrusted/hosted use). +- **denied_paths** (list\[str\] | None) – If set, any command referencing one of these path substrings is rejected. + +#### warm_up + +```python +warm_up() -> None +``` + +Build the underlying live workspace eagerly. Called by `Agent.warm_up()`/`Pipeline.warm_up()`. + +#### to_dict + +```python +to_dict() -> dict[str, Any] +``` + +Serialize the tool to a dictionary in the `{"type": ..., "data": ...}` format. + +#### from_dict + +```python +from_dict(data: dict[str, Any]) -> MirageShellTool +``` + +Deserialize the tool from a dictionary. + +#### close + +```python +close() -> None +``` + +Close the underlying workspace. + +## haystack_integrations.tools.mirage.workspace + +### MirageMount + +Declarative description of a single backend mounted into a :class:`MirageWorkspace`. + +A mount is the serializable unit of a Mirage workspace: it names *where* a backend is mounted +(`path`), *which* backend it is (`resource`, a Mirage registry name such as `"s3"` or `"gdrive"`), +and *how* to configure it (`config`). + +`config` values may be plain values, Haystack `Secret` objects for credentials, or an OAuth token +source (e.g. `OAuthRefreshTokenSource`) for backends whose config accepts a token-provider callable +(such as Mirage's OneDrive `access_token`). Secrets and token sources are resolved only when the +live workspace is built. + +Every backend is created the same way. Use the Mirage registry name and the config keys that backend expects +(discover names with `MirageMount.available_resources()`; config keys come from the backend's Mirage config class): + +```python +from haystack.utils import Secret + +MirageMount(path="/data", resource="ram") # in-memory scratch +MirageMount(path="/local", resource="disk", config={"root": "/srv/data"}) # local disk +MirageMount(path="/s3", resource="s3", config={"bucket": "my-bucket"}, read_only=True) +MirageMount( + path="/drive", + resource="gdrive", + config={"client_id": "...", "refresh_token": Secret.from_env_var("GDRIVE_REFRESH_TOKEN")}, + read_only=True, +) +``` + +**Parameters:** + +- **path** (str) – Mount point in the virtual filesystem, e.g. `"/s3"`. +- **resource** (str) – Mirage registry name of the backend, e.g. `"ram"`, `"disk"`, `"s3"`, `"gdrive"`. + See `mirage.resource.registry.REGISTRY` or `MirageMount.available_resources()` for the full list. +- **config** (dict\[str, Any\]) – Keyword arguments passed to the backend's Mirage config. Values may be `Secret`s, or + an OAuth token source that is turned into a token-provider callable when the workspace is built. +- **read_only** (bool) – If True, the mount is mounted in Mirage's READ mode and writes are rejected by + Mirage itself. + +#### available_resources + +```python +available_resources() -> list[str] +``` + +Return the Mirage registry names usable as `resource`. + +These are short backend names such as `"s3"`, `"gdrive"`, `"postgres"`. Pass one to +`MirageMount(resource=...)`; the config keys each backend expects come from its Mirage +config class. + +### MirageWorkspace + +A description of a Mirage mount tree that lazily builds a live `mirage.Workspace`. + +`MirageWorkspace` is the shared backend behind the Mirage tools and components: it holds the list of +:class:`MirageMount`s and the cache configuration, serializes cleanly (resolving `Secret`s only at +build time), and constructs the live workspace on first use via Mirage's resource registry. + +### Usage example + +```python +from haystack.utils import Secret +from haystack_integrations.tools.mirage import MirageWorkspace, MirageMount + +ws = MirageWorkspace( + mounts=[ + MirageMount(path="/data", resource="ram"), + MirageMount(path="/s3", resource="s3", config={"bucket": "my-bucket"}, read_only=True), + ] +) +print(ws.run("ls /s3")) +``` + +#### __init__ + +```python +__init__( + mounts: list[MirageMount], *, cache_limit: str | int = "512MB" +) -> None +``` + +Initialize the workspace description. + +**Parameters:** + +- **mounts** (list\[MirageMount\]) – The backends to mount, as a list of :class:`MirageMount`. +- **cache_limit** (str | int) – Mirage file-cache size limit (e.g. `"512MB"` or an int byte count). + +**Raises:** + +- MirageConfigError – If no mounts are provided or mount paths are not unique. + +#### warm_up + +```python +warm_up() -> None +``` + +Build the live `mirage.Workspace` eagerly. Idempotent. + +#### close + +```python +close() -> None +``` + +Close the live workspace and release its resources, if it was built. Thread-safe. + +#### run + +```python +run( + command: str, *, timeout: float = 60.0, max_chars: int | None = None +) -> str +``` + +Run a bash `command` against the mount tree from a synchronous context and return its output. + +**Parameters:** + +- **command** (str) – A bash command line, e.g. `"grep -r alert /s3/logs | wc -l"`. +- **timeout** (float) – Maximum seconds to wait for the command. +- **max_chars** (int | None) – If set, truncate the returned text to this many characters. + +**Returns:** + +- str – Combined stdout (plus a trailing error note on non-zero exit) as a string. + +#### run_async + +```python +run_async( + command: str, *, timeout: float = 60.0, max_chars: int | None = None +) -> str +``` + +Async counterpart of :meth:`run`. + +#### to_dict + +```python +to_dict() -> dict[str, Any] +``` + +Serialize the workspace description to a dictionary (Secret-safe). + +#### from_dict + +```python +from_dict(data: dict[str, Any]) -> MirageWorkspace +``` + +Deserialize a workspace description from a dictionary. + +#### describe + +```python +describe() -> str +``` + +Return a human/LLM-readable summary of the mount tree (used in tool descriptions). diff --git a/docs-website/reference_versioned_docs/version-2.24/integrations-api/mirage.md b/docs-website/reference_versioned_docs/version-2.24/integrations-api/mirage.md new file mode 100644 index 0000000000..09bcf73a40 --- /dev/null +++ b/docs-website/reference_versioned_docs/version-2.24/integrations-api/mirage.md @@ -0,0 +1,288 @@ +--- +title: "Mirage" +id: integrations-mirage +description: "Mirage integration for Haystack" +slug: "/integrations-mirage" +--- + + +## haystack_integrations.tools.mirage.shell_tool + +### MirageShellTool + +Bases: Tool + +A Haystack `Tool` that lets an `Agent` run bash commands across a Mirage virtual filesystem. + +Mirage mounts heterogeneous backends (object storage, databases, SaaS apps, local disk) as one +filesystem; this tool exposes Mirage's single `execute` surface to an Agent as one well-described +tool with a `command` parameter. Output is normalized to text and truncated before it reaches the +model. + +### Security model + +Mirage never shells out to the host: every command runs inside Mirage's own virtual-filesystem +interpreter, so the blast radius is confined to the mounts you attach. Two controls shape what an +Agent can do: + +- **Per-mount read-only mode** (`MirageMount(..., read_only=True)`) is the authoritative write + boundary. Mirage refuses any write to a read-only mount regardless of the command used, so this + -- not the allowlist -- is how you prevent modification or deletion. Mount anything the Agent + should not change as read-only. +- **The command allowlist** (`allowed_commands`) restricts *which* commands may run. It is + enforced against every command Mirage would execute, including commands nested inside + `$(...)`, backticks, `<(...)` and subshells, so `ls "$(rm x)"` is rejected unless `rm` + is also allowed. Treat it as a best-effort filter to steer the Agent, not a sandbox: allowing a + command that itself runs other commands (`eval`, `bash`, `sh`, `source`, `xargs`, + `timeout`) effectively allows anything, so do not list those for untrusted/hosted use. +- **`denied_paths`** rejects any command whose text references one of the given path substrings. + +### Usage example + +```python +from haystack.components.agents import Agent +from haystack.components.generators.chat import OpenAIChatGenerator +from haystack.dataclasses import ChatMessage +from haystack_integrations.tools.mirage import MirageWorkspace, MirageMount, MirageShellTool + +workspace = MirageWorkspace([ + MirageMount(path="/data", resource="ram"), + MirageMount(path="/s3", resource="s3", config={"bucket": "my-bucket"}, read_only=True), +]) +tool = MirageShellTool(workspace, allowed_commands=["ls", "cat", "grep", "head", "wc", "cp"]) + +agent = Agent(chat_generator=OpenAIChatGenerator(model="gpt-4o-mini"), tools=[tool]) +result = agent.run(messages=[ChatMessage.from_user("How many lines in /s3/log.txt mention 'alert'?")]) +print(result["messages"][-1].text) +``` + +#### __init__ + +```python +__init__( + workspace: MirageWorkspace, + *, + name: str = "mirage_shell", + description: str | None = None, + invocation_timeout: float = 60.0, + max_output_chars: int = 20000, + allowed_commands: list[str] | None = None, + denied_paths: list[str] | None = None +) -> None +``` + +Initialize the Mirage shell tool. + +**Parameters:** + +- **workspace** (MirageWorkspace) – The :class:`MirageWorkspace` describing the mount tree. +- **name** (str) – Tool name exposed to the LLM. +- **description** (str | None) – Custom description. If None, one is generated from the mount tree. +- **invocation_timeout** (float) – Maximum seconds to wait for a command to finish. +- **max_output_chars** (int) – Truncate command output to this many characters before returning it. +- **allowed_commands** (list\[str\] | None) – If set, only these command names may run, e.g. + `["ls", "cat", "grep", "head", "wc"]`. The allowlist is enforced against *every* command + Mirage would execute -- including commands nested in substitutions/subshells -- so + `ls "$(rm x)"` is rejected unless `rm` is also allowed. It is a filter over Mirage's + virtual commands to steer the Agent, not a security sandbox; the write boundary is + per-mount `read_only` (see the class "Security model" section). If None, any command is + allowed (not recommended for untrusted/hosted use). +- **denied_paths** (list\[str\] | None) – If set, any command referencing one of these path substrings is rejected. + +#### warm_up + +```python +warm_up() -> None +``` + +Build the underlying live workspace eagerly. Called by `Agent.warm_up()`/`Pipeline.warm_up()`. + +#### to_dict + +```python +to_dict() -> dict[str, Any] +``` + +Serialize the tool to a dictionary in the `{"type": ..., "data": ...}` format. + +#### from_dict + +```python +from_dict(data: dict[str, Any]) -> MirageShellTool +``` + +Deserialize the tool from a dictionary. + +#### close + +```python +close() -> None +``` + +Close the underlying workspace. + +## haystack_integrations.tools.mirage.workspace + +### MirageMount + +Declarative description of a single backend mounted into a :class:`MirageWorkspace`. + +A mount is the serializable unit of a Mirage workspace: it names *where* a backend is mounted +(`path`), *which* backend it is (`resource`, a Mirage registry name such as `"s3"` or `"gdrive"`), +and *how* to configure it (`config`). + +`config` values may be plain values, Haystack `Secret` objects for credentials, or an OAuth token +source (e.g. `OAuthRefreshTokenSource`) for backends whose config accepts a token-provider callable +(such as Mirage's OneDrive `access_token`). Secrets and token sources are resolved only when the +live workspace is built. + +Every backend is created the same way. Use the Mirage registry name and the config keys that backend expects +(discover names with `MirageMount.available_resources()`; config keys come from the backend's Mirage config class): + +```python +from haystack.utils import Secret + +MirageMount(path="/data", resource="ram") # in-memory scratch +MirageMount(path="/local", resource="disk", config={"root": "/srv/data"}) # local disk +MirageMount(path="/s3", resource="s3", config={"bucket": "my-bucket"}, read_only=True) +MirageMount( + path="/drive", + resource="gdrive", + config={"client_id": "...", "refresh_token": Secret.from_env_var("GDRIVE_REFRESH_TOKEN")}, + read_only=True, +) +``` + +**Parameters:** + +- **path** (str) – Mount point in the virtual filesystem, e.g. `"/s3"`. +- **resource** (str) – Mirage registry name of the backend, e.g. `"ram"`, `"disk"`, `"s3"`, `"gdrive"`. + See `mirage.resource.registry.REGISTRY` or `MirageMount.available_resources()` for the full list. +- **config** (dict\[str, Any\]) – Keyword arguments passed to the backend's Mirage config. Values may be `Secret`s, or + an OAuth token source that is turned into a token-provider callable when the workspace is built. +- **read_only** (bool) – If True, the mount is mounted in Mirage's READ mode and writes are rejected by + Mirage itself. + +#### available_resources + +```python +available_resources() -> list[str] +``` + +Return the Mirage registry names usable as `resource`. + +These are short backend names such as `"s3"`, `"gdrive"`, `"postgres"`. Pass one to +`MirageMount(resource=...)`; the config keys each backend expects come from its Mirage +config class. + +### MirageWorkspace + +A description of a Mirage mount tree that lazily builds a live `mirage.Workspace`. + +`MirageWorkspace` is the shared backend behind the Mirage tools and components: it holds the list of +:class:`MirageMount`s and the cache configuration, serializes cleanly (resolving `Secret`s only at +build time), and constructs the live workspace on first use via Mirage's resource registry. + +### Usage example + +```python +from haystack.utils import Secret +from haystack_integrations.tools.mirage import MirageWorkspace, MirageMount + +ws = MirageWorkspace( + mounts=[ + MirageMount(path="/data", resource="ram"), + MirageMount(path="/s3", resource="s3", config={"bucket": "my-bucket"}, read_only=True), + ] +) +print(ws.run("ls /s3")) +``` + +#### __init__ + +```python +__init__( + mounts: list[MirageMount], *, cache_limit: str | int = "512MB" +) -> None +``` + +Initialize the workspace description. + +**Parameters:** + +- **mounts** (list\[MirageMount\]) – The backends to mount, as a list of :class:`MirageMount`. +- **cache_limit** (str | int) – Mirage file-cache size limit (e.g. `"512MB"` or an int byte count). + +**Raises:** + +- MirageConfigError – If no mounts are provided or mount paths are not unique. + +#### warm_up + +```python +warm_up() -> None +``` + +Build the live `mirage.Workspace` eagerly. Idempotent. + +#### close + +```python +close() -> None +``` + +Close the live workspace and release its resources, if it was built. Thread-safe. + +#### run + +```python +run( + command: str, *, timeout: float = 60.0, max_chars: int | None = None +) -> str +``` + +Run a bash `command` against the mount tree from a synchronous context and return its output. + +**Parameters:** + +- **command** (str) – A bash command line, e.g. `"grep -r alert /s3/logs | wc -l"`. +- **timeout** (float) – Maximum seconds to wait for the command. +- **max_chars** (int | None) – If set, truncate the returned text to this many characters. + +**Returns:** + +- str – Combined stdout (plus a trailing error note on non-zero exit) as a string. + +#### run_async + +```python +run_async( + command: str, *, timeout: float = 60.0, max_chars: int | None = None +) -> str +``` + +Async counterpart of :meth:`run`. + +#### to_dict + +```python +to_dict() -> dict[str, Any] +``` + +Serialize the workspace description to a dictionary (Secret-safe). + +#### from_dict + +```python +from_dict(data: dict[str, Any]) -> MirageWorkspace +``` + +Deserialize a workspace description from a dictionary. + +#### describe + +```python +describe() -> str +``` + +Return a human/LLM-readable summary of the mount tree (used in tool descriptions). diff --git a/docs-website/reference_versioned_docs/version-2.25/integrations-api/mirage.md b/docs-website/reference_versioned_docs/version-2.25/integrations-api/mirage.md new file mode 100644 index 0000000000..09bcf73a40 --- /dev/null +++ b/docs-website/reference_versioned_docs/version-2.25/integrations-api/mirage.md @@ -0,0 +1,288 @@ +--- +title: "Mirage" +id: integrations-mirage +description: "Mirage integration for Haystack" +slug: "/integrations-mirage" +--- + + +## haystack_integrations.tools.mirage.shell_tool + +### MirageShellTool + +Bases: Tool + +A Haystack `Tool` that lets an `Agent` run bash commands across a Mirage virtual filesystem. + +Mirage mounts heterogeneous backends (object storage, databases, SaaS apps, local disk) as one +filesystem; this tool exposes Mirage's single `execute` surface to an Agent as one well-described +tool with a `command` parameter. Output is normalized to text and truncated before it reaches the +model. + +### Security model + +Mirage never shells out to the host: every command runs inside Mirage's own virtual-filesystem +interpreter, so the blast radius is confined to the mounts you attach. Two controls shape what an +Agent can do: + +- **Per-mount read-only mode** (`MirageMount(..., read_only=True)`) is the authoritative write + boundary. Mirage refuses any write to a read-only mount regardless of the command used, so this + -- not the allowlist -- is how you prevent modification or deletion. Mount anything the Agent + should not change as read-only. +- **The command allowlist** (`allowed_commands`) restricts *which* commands may run. It is + enforced against every command Mirage would execute, including commands nested inside + `$(...)`, backticks, `<(...)` and subshells, so `ls "$(rm x)"` is rejected unless `rm` + is also allowed. Treat it as a best-effort filter to steer the Agent, not a sandbox: allowing a + command that itself runs other commands (`eval`, `bash`, `sh`, `source`, `xargs`, + `timeout`) effectively allows anything, so do not list those for untrusted/hosted use. +- **`denied_paths`** rejects any command whose text references one of the given path substrings. + +### Usage example + +```python +from haystack.components.agents import Agent +from haystack.components.generators.chat import OpenAIChatGenerator +from haystack.dataclasses import ChatMessage +from haystack_integrations.tools.mirage import MirageWorkspace, MirageMount, MirageShellTool + +workspace = MirageWorkspace([ + MirageMount(path="/data", resource="ram"), + MirageMount(path="/s3", resource="s3", config={"bucket": "my-bucket"}, read_only=True), +]) +tool = MirageShellTool(workspace, allowed_commands=["ls", "cat", "grep", "head", "wc", "cp"]) + +agent = Agent(chat_generator=OpenAIChatGenerator(model="gpt-4o-mini"), tools=[tool]) +result = agent.run(messages=[ChatMessage.from_user("How many lines in /s3/log.txt mention 'alert'?")]) +print(result["messages"][-1].text) +``` + +#### __init__ + +```python +__init__( + workspace: MirageWorkspace, + *, + name: str = "mirage_shell", + description: str | None = None, + invocation_timeout: float = 60.0, + max_output_chars: int = 20000, + allowed_commands: list[str] | None = None, + denied_paths: list[str] | None = None +) -> None +``` + +Initialize the Mirage shell tool. + +**Parameters:** + +- **workspace** (MirageWorkspace) – The :class:`MirageWorkspace` describing the mount tree. +- **name** (str) – Tool name exposed to the LLM. +- **description** (str | None) – Custom description. If None, one is generated from the mount tree. +- **invocation_timeout** (float) – Maximum seconds to wait for a command to finish. +- **max_output_chars** (int) – Truncate command output to this many characters before returning it. +- **allowed_commands** (list\[str\] | None) – If set, only these command names may run, e.g. + `["ls", "cat", "grep", "head", "wc"]`. The allowlist is enforced against *every* command + Mirage would execute -- including commands nested in substitutions/subshells -- so + `ls "$(rm x)"` is rejected unless `rm` is also allowed. It is a filter over Mirage's + virtual commands to steer the Agent, not a security sandbox; the write boundary is + per-mount `read_only` (see the class "Security model" section). If None, any command is + allowed (not recommended for untrusted/hosted use). +- **denied_paths** (list\[str\] | None) – If set, any command referencing one of these path substrings is rejected. + +#### warm_up + +```python +warm_up() -> None +``` + +Build the underlying live workspace eagerly. Called by `Agent.warm_up()`/`Pipeline.warm_up()`. + +#### to_dict + +```python +to_dict() -> dict[str, Any] +``` + +Serialize the tool to a dictionary in the `{"type": ..., "data": ...}` format. + +#### from_dict + +```python +from_dict(data: dict[str, Any]) -> MirageShellTool +``` + +Deserialize the tool from a dictionary. + +#### close + +```python +close() -> None +``` + +Close the underlying workspace. + +## haystack_integrations.tools.mirage.workspace + +### MirageMount + +Declarative description of a single backend mounted into a :class:`MirageWorkspace`. + +A mount is the serializable unit of a Mirage workspace: it names *where* a backend is mounted +(`path`), *which* backend it is (`resource`, a Mirage registry name such as `"s3"` or `"gdrive"`), +and *how* to configure it (`config`). + +`config` values may be plain values, Haystack `Secret` objects for credentials, or an OAuth token +source (e.g. `OAuthRefreshTokenSource`) for backends whose config accepts a token-provider callable +(such as Mirage's OneDrive `access_token`). Secrets and token sources are resolved only when the +live workspace is built. + +Every backend is created the same way. Use the Mirage registry name and the config keys that backend expects +(discover names with `MirageMount.available_resources()`; config keys come from the backend's Mirage config class): + +```python +from haystack.utils import Secret + +MirageMount(path="/data", resource="ram") # in-memory scratch +MirageMount(path="/local", resource="disk", config={"root": "/srv/data"}) # local disk +MirageMount(path="/s3", resource="s3", config={"bucket": "my-bucket"}, read_only=True) +MirageMount( + path="/drive", + resource="gdrive", + config={"client_id": "...", "refresh_token": Secret.from_env_var("GDRIVE_REFRESH_TOKEN")}, + read_only=True, +) +``` + +**Parameters:** + +- **path** (str) – Mount point in the virtual filesystem, e.g. `"/s3"`. +- **resource** (str) – Mirage registry name of the backend, e.g. `"ram"`, `"disk"`, `"s3"`, `"gdrive"`. + See `mirage.resource.registry.REGISTRY` or `MirageMount.available_resources()` for the full list. +- **config** (dict\[str, Any\]) – Keyword arguments passed to the backend's Mirage config. Values may be `Secret`s, or + an OAuth token source that is turned into a token-provider callable when the workspace is built. +- **read_only** (bool) – If True, the mount is mounted in Mirage's READ mode and writes are rejected by + Mirage itself. + +#### available_resources + +```python +available_resources() -> list[str] +``` + +Return the Mirage registry names usable as `resource`. + +These are short backend names such as `"s3"`, `"gdrive"`, `"postgres"`. Pass one to +`MirageMount(resource=...)`; the config keys each backend expects come from its Mirage +config class. + +### MirageWorkspace + +A description of a Mirage mount tree that lazily builds a live `mirage.Workspace`. + +`MirageWorkspace` is the shared backend behind the Mirage tools and components: it holds the list of +:class:`MirageMount`s and the cache configuration, serializes cleanly (resolving `Secret`s only at +build time), and constructs the live workspace on first use via Mirage's resource registry. + +### Usage example + +```python +from haystack.utils import Secret +from haystack_integrations.tools.mirage import MirageWorkspace, MirageMount + +ws = MirageWorkspace( + mounts=[ + MirageMount(path="/data", resource="ram"), + MirageMount(path="/s3", resource="s3", config={"bucket": "my-bucket"}, read_only=True), + ] +) +print(ws.run("ls /s3")) +``` + +#### __init__ + +```python +__init__( + mounts: list[MirageMount], *, cache_limit: str | int = "512MB" +) -> None +``` + +Initialize the workspace description. + +**Parameters:** + +- **mounts** (list\[MirageMount\]) – The backends to mount, as a list of :class:`MirageMount`. +- **cache_limit** (str | int) – Mirage file-cache size limit (e.g. `"512MB"` or an int byte count). + +**Raises:** + +- MirageConfigError – If no mounts are provided or mount paths are not unique. + +#### warm_up + +```python +warm_up() -> None +``` + +Build the live `mirage.Workspace` eagerly. Idempotent. + +#### close + +```python +close() -> None +``` + +Close the live workspace and release its resources, if it was built. Thread-safe. + +#### run + +```python +run( + command: str, *, timeout: float = 60.0, max_chars: int | None = None +) -> str +``` + +Run a bash `command` against the mount tree from a synchronous context and return its output. + +**Parameters:** + +- **command** (str) – A bash command line, e.g. `"grep -r alert /s3/logs | wc -l"`. +- **timeout** (float) – Maximum seconds to wait for the command. +- **max_chars** (int | None) – If set, truncate the returned text to this many characters. + +**Returns:** + +- str – Combined stdout (plus a trailing error note on non-zero exit) as a string. + +#### run_async + +```python +run_async( + command: str, *, timeout: float = 60.0, max_chars: int | None = None +) -> str +``` + +Async counterpart of :meth:`run`. + +#### to_dict + +```python +to_dict() -> dict[str, Any] +``` + +Serialize the workspace description to a dictionary (Secret-safe). + +#### from_dict + +```python +from_dict(data: dict[str, Any]) -> MirageWorkspace +``` + +Deserialize a workspace description from a dictionary. + +#### describe + +```python +describe() -> str +``` + +Return a human/LLM-readable summary of the mount tree (used in tool descriptions). diff --git a/docs-website/reference_versioned_docs/version-2.26/integrations-api/mirage.md b/docs-website/reference_versioned_docs/version-2.26/integrations-api/mirage.md new file mode 100644 index 0000000000..09bcf73a40 --- /dev/null +++ b/docs-website/reference_versioned_docs/version-2.26/integrations-api/mirage.md @@ -0,0 +1,288 @@ +--- +title: "Mirage" +id: integrations-mirage +description: "Mirage integration for Haystack" +slug: "/integrations-mirage" +--- + + +## haystack_integrations.tools.mirage.shell_tool + +### MirageShellTool + +Bases: Tool + +A Haystack `Tool` that lets an `Agent` run bash commands across a Mirage virtual filesystem. + +Mirage mounts heterogeneous backends (object storage, databases, SaaS apps, local disk) as one +filesystem; this tool exposes Mirage's single `execute` surface to an Agent as one well-described +tool with a `command` parameter. Output is normalized to text and truncated before it reaches the +model. + +### Security model + +Mirage never shells out to the host: every command runs inside Mirage's own virtual-filesystem +interpreter, so the blast radius is confined to the mounts you attach. Two controls shape what an +Agent can do: + +- **Per-mount read-only mode** (`MirageMount(..., read_only=True)`) is the authoritative write + boundary. Mirage refuses any write to a read-only mount regardless of the command used, so this + -- not the allowlist -- is how you prevent modification or deletion. Mount anything the Agent + should not change as read-only. +- **The command allowlist** (`allowed_commands`) restricts *which* commands may run. It is + enforced against every command Mirage would execute, including commands nested inside + `$(...)`, backticks, `<(...)` and subshells, so `ls "$(rm x)"` is rejected unless `rm` + is also allowed. Treat it as a best-effort filter to steer the Agent, not a sandbox: allowing a + command that itself runs other commands (`eval`, `bash`, `sh`, `source`, `xargs`, + `timeout`) effectively allows anything, so do not list those for untrusted/hosted use. +- **`denied_paths`** rejects any command whose text references one of the given path substrings. + +### Usage example + +```python +from haystack.components.agents import Agent +from haystack.components.generators.chat import OpenAIChatGenerator +from haystack.dataclasses import ChatMessage +from haystack_integrations.tools.mirage import MirageWorkspace, MirageMount, MirageShellTool + +workspace = MirageWorkspace([ + MirageMount(path="/data", resource="ram"), + MirageMount(path="/s3", resource="s3", config={"bucket": "my-bucket"}, read_only=True), +]) +tool = MirageShellTool(workspace, allowed_commands=["ls", "cat", "grep", "head", "wc", "cp"]) + +agent = Agent(chat_generator=OpenAIChatGenerator(model="gpt-4o-mini"), tools=[tool]) +result = agent.run(messages=[ChatMessage.from_user("How many lines in /s3/log.txt mention 'alert'?")]) +print(result["messages"][-1].text) +``` + +#### __init__ + +```python +__init__( + workspace: MirageWorkspace, + *, + name: str = "mirage_shell", + description: str | None = None, + invocation_timeout: float = 60.0, + max_output_chars: int = 20000, + allowed_commands: list[str] | None = None, + denied_paths: list[str] | None = None +) -> None +``` + +Initialize the Mirage shell tool. + +**Parameters:** + +- **workspace** (MirageWorkspace) – The :class:`MirageWorkspace` describing the mount tree. +- **name** (str) – Tool name exposed to the LLM. +- **description** (str | None) – Custom description. If None, one is generated from the mount tree. +- **invocation_timeout** (float) – Maximum seconds to wait for a command to finish. +- **max_output_chars** (int) – Truncate command output to this many characters before returning it. +- **allowed_commands** (list\[str\] | None) – If set, only these command names may run, e.g. + `["ls", "cat", "grep", "head", "wc"]`. The allowlist is enforced against *every* command + Mirage would execute -- including commands nested in substitutions/subshells -- so + `ls "$(rm x)"` is rejected unless `rm` is also allowed. It is a filter over Mirage's + virtual commands to steer the Agent, not a security sandbox; the write boundary is + per-mount `read_only` (see the class "Security model" section). If None, any command is + allowed (not recommended for untrusted/hosted use). +- **denied_paths** (list\[str\] | None) – If set, any command referencing one of these path substrings is rejected. + +#### warm_up + +```python +warm_up() -> None +``` + +Build the underlying live workspace eagerly. Called by `Agent.warm_up()`/`Pipeline.warm_up()`. + +#### to_dict + +```python +to_dict() -> dict[str, Any] +``` + +Serialize the tool to a dictionary in the `{"type": ..., "data": ...}` format. + +#### from_dict + +```python +from_dict(data: dict[str, Any]) -> MirageShellTool +``` + +Deserialize the tool from a dictionary. + +#### close + +```python +close() -> None +``` + +Close the underlying workspace. + +## haystack_integrations.tools.mirage.workspace + +### MirageMount + +Declarative description of a single backend mounted into a :class:`MirageWorkspace`. + +A mount is the serializable unit of a Mirage workspace: it names *where* a backend is mounted +(`path`), *which* backend it is (`resource`, a Mirage registry name such as `"s3"` or `"gdrive"`), +and *how* to configure it (`config`). + +`config` values may be plain values, Haystack `Secret` objects for credentials, or an OAuth token +source (e.g. `OAuthRefreshTokenSource`) for backends whose config accepts a token-provider callable +(such as Mirage's OneDrive `access_token`). Secrets and token sources are resolved only when the +live workspace is built. + +Every backend is created the same way. Use the Mirage registry name and the config keys that backend expects +(discover names with `MirageMount.available_resources()`; config keys come from the backend's Mirage config class): + +```python +from haystack.utils import Secret + +MirageMount(path="/data", resource="ram") # in-memory scratch +MirageMount(path="/local", resource="disk", config={"root": "/srv/data"}) # local disk +MirageMount(path="/s3", resource="s3", config={"bucket": "my-bucket"}, read_only=True) +MirageMount( + path="/drive", + resource="gdrive", + config={"client_id": "...", "refresh_token": Secret.from_env_var("GDRIVE_REFRESH_TOKEN")}, + read_only=True, +) +``` + +**Parameters:** + +- **path** (str) – Mount point in the virtual filesystem, e.g. `"/s3"`. +- **resource** (str) – Mirage registry name of the backend, e.g. `"ram"`, `"disk"`, `"s3"`, `"gdrive"`. + See `mirage.resource.registry.REGISTRY` or `MirageMount.available_resources()` for the full list. +- **config** (dict\[str, Any\]) – Keyword arguments passed to the backend's Mirage config. Values may be `Secret`s, or + an OAuth token source that is turned into a token-provider callable when the workspace is built. +- **read_only** (bool) – If True, the mount is mounted in Mirage's READ mode and writes are rejected by + Mirage itself. + +#### available_resources + +```python +available_resources() -> list[str] +``` + +Return the Mirage registry names usable as `resource`. + +These are short backend names such as `"s3"`, `"gdrive"`, `"postgres"`. Pass one to +`MirageMount(resource=...)`; the config keys each backend expects come from its Mirage +config class. + +### MirageWorkspace + +A description of a Mirage mount tree that lazily builds a live `mirage.Workspace`. + +`MirageWorkspace` is the shared backend behind the Mirage tools and components: it holds the list of +:class:`MirageMount`s and the cache configuration, serializes cleanly (resolving `Secret`s only at +build time), and constructs the live workspace on first use via Mirage's resource registry. + +### Usage example + +```python +from haystack.utils import Secret +from haystack_integrations.tools.mirage import MirageWorkspace, MirageMount + +ws = MirageWorkspace( + mounts=[ + MirageMount(path="/data", resource="ram"), + MirageMount(path="/s3", resource="s3", config={"bucket": "my-bucket"}, read_only=True), + ] +) +print(ws.run("ls /s3")) +``` + +#### __init__ + +```python +__init__( + mounts: list[MirageMount], *, cache_limit: str | int = "512MB" +) -> None +``` + +Initialize the workspace description. + +**Parameters:** + +- **mounts** (list\[MirageMount\]) – The backends to mount, as a list of :class:`MirageMount`. +- **cache_limit** (str | int) – Mirage file-cache size limit (e.g. `"512MB"` or an int byte count). + +**Raises:** + +- MirageConfigError – If no mounts are provided or mount paths are not unique. + +#### warm_up + +```python +warm_up() -> None +``` + +Build the live `mirage.Workspace` eagerly. Idempotent. + +#### close + +```python +close() -> None +``` + +Close the live workspace and release its resources, if it was built. Thread-safe. + +#### run + +```python +run( + command: str, *, timeout: float = 60.0, max_chars: int | None = None +) -> str +``` + +Run a bash `command` against the mount tree from a synchronous context and return its output. + +**Parameters:** + +- **command** (str) – A bash command line, e.g. `"grep -r alert /s3/logs | wc -l"`. +- **timeout** (float) – Maximum seconds to wait for the command. +- **max_chars** (int | None) – If set, truncate the returned text to this many characters. + +**Returns:** + +- str – Combined stdout (plus a trailing error note on non-zero exit) as a string. + +#### run_async + +```python +run_async( + command: str, *, timeout: float = 60.0, max_chars: int | None = None +) -> str +``` + +Async counterpart of :meth:`run`. + +#### to_dict + +```python +to_dict() -> dict[str, Any] +``` + +Serialize the workspace description to a dictionary (Secret-safe). + +#### from_dict + +```python +from_dict(data: dict[str, Any]) -> MirageWorkspace +``` + +Deserialize a workspace description from a dictionary. + +#### describe + +```python +describe() -> str +``` + +Return a human/LLM-readable summary of the mount tree (used in tool descriptions). diff --git a/docs-website/reference_versioned_docs/version-2.27/integrations-api/mirage.md b/docs-website/reference_versioned_docs/version-2.27/integrations-api/mirage.md new file mode 100644 index 0000000000..09bcf73a40 --- /dev/null +++ b/docs-website/reference_versioned_docs/version-2.27/integrations-api/mirage.md @@ -0,0 +1,288 @@ +--- +title: "Mirage" +id: integrations-mirage +description: "Mirage integration for Haystack" +slug: "/integrations-mirage" +--- + + +## haystack_integrations.tools.mirage.shell_tool + +### MirageShellTool + +Bases: Tool + +A Haystack `Tool` that lets an `Agent` run bash commands across a Mirage virtual filesystem. + +Mirage mounts heterogeneous backends (object storage, databases, SaaS apps, local disk) as one +filesystem; this tool exposes Mirage's single `execute` surface to an Agent as one well-described +tool with a `command` parameter. Output is normalized to text and truncated before it reaches the +model. + +### Security model + +Mirage never shells out to the host: every command runs inside Mirage's own virtual-filesystem +interpreter, so the blast radius is confined to the mounts you attach. Two controls shape what an +Agent can do: + +- **Per-mount read-only mode** (`MirageMount(..., read_only=True)`) is the authoritative write + boundary. Mirage refuses any write to a read-only mount regardless of the command used, so this + -- not the allowlist -- is how you prevent modification or deletion. Mount anything the Agent + should not change as read-only. +- **The command allowlist** (`allowed_commands`) restricts *which* commands may run. It is + enforced against every command Mirage would execute, including commands nested inside + `$(...)`, backticks, `<(...)` and subshells, so `ls "$(rm x)"` is rejected unless `rm` + is also allowed. Treat it as a best-effort filter to steer the Agent, not a sandbox: allowing a + command that itself runs other commands (`eval`, `bash`, `sh`, `source`, `xargs`, + `timeout`) effectively allows anything, so do not list those for untrusted/hosted use. +- **`denied_paths`** rejects any command whose text references one of the given path substrings. + +### Usage example + +```python +from haystack.components.agents import Agent +from haystack.components.generators.chat import OpenAIChatGenerator +from haystack.dataclasses import ChatMessage +from haystack_integrations.tools.mirage import MirageWorkspace, MirageMount, MirageShellTool + +workspace = MirageWorkspace([ + MirageMount(path="/data", resource="ram"), + MirageMount(path="/s3", resource="s3", config={"bucket": "my-bucket"}, read_only=True), +]) +tool = MirageShellTool(workspace, allowed_commands=["ls", "cat", "grep", "head", "wc", "cp"]) + +agent = Agent(chat_generator=OpenAIChatGenerator(model="gpt-4o-mini"), tools=[tool]) +result = agent.run(messages=[ChatMessage.from_user("How many lines in /s3/log.txt mention 'alert'?")]) +print(result["messages"][-1].text) +``` + +#### __init__ + +```python +__init__( + workspace: MirageWorkspace, + *, + name: str = "mirage_shell", + description: str | None = None, + invocation_timeout: float = 60.0, + max_output_chars: int = 20000, + allowed_commands: list[str] | None = None, + denied_paths: list[str] | None = None +) -> None +``` + +Initialize the Mirage shell tool. + +**Parameters:** + +- **workspace** (MirageWorkspace) – The :class:`MirageWorkspace` describing the mount tree. +- **name** (str) – Tool name exposed to the LLM. +- **description** (str | None) – Custom description. If None, one is generated from the mount tree. +- **invocation_timeout** (float) – Maximum seconds to wait for a command to finish. +- **max_output_chars** (int) – Truncate command output to this many characters before returning it. +- **allowed_commands** (list\[str\] | None) – If set, only these command names may run, e.g. + `["ls", "cat", "grep", "head", "wc"]`. The allowlist is enforced against *every* command + Mirage would execute -- including commands nested in substitutions/subshells -- so + `ls "$(rm x)"` is rejected unless `rm` is also allowed. It is a filter over Mirage's + virtual commands to steer the Agent, not a security sandbox; the write boundary is + per-mount `read_only` (see the class "Security model" section). If None, any command is + allowed (not recommended for untrusted/hosted use). +- **denied_paths** (list\[str\] | None) – If set, any command referencing one of these path substrings is rejected. + +#### warm_up + +```python +warm_up() -> None +``` + +Build the underlying live workspace eagerly. Called by `Agent.warm_up()`/`Pipeline.warm_up()`. + +#### to_dict + +```python +to_dict() -> dict[str, Any] +``` + +Serialize the tool to a dictionary in the `{"type": ..., "data": ...}` format. + +#### from_dict + +```python +from_dict(data: dict[str, Any]) -> MirageShellTool +``` + +Deserialize the tool from a dictionary. + +#### close + +```python +close() -> None +``` + +Close the underlying workspace. + +## haystack_integrations.tools.mirage.workspace + +### MirageMount + +Declarative description of a single backend mounted into a :class:`MirageWorkspace`. + +A mount is the serializable unit of a Mirage workspace: it names *where* a backend is mounted +(`path`), *which* backend it is (`resource`, a Mirage registry name such as `"s3"` or `"gdrive"`), +and *how* to configure it (`config`). + +`config` values may be plain values, Haystack `Secret` objects for credentials, or an OAuth token +source (e.g. `OAuthRefreshTokenSource`) for backends whose config accepts a token-provider callable +(such as Mirage's OneDrive `access_token`). Secrets and token sources are resolved only when the +live workspace is built. + +Every backend is created the same way. Use the Mirage registry name and the config keys that backend expects +(discover names with `MirageMount.available_resources()`; config keys come from the backend's Mirage config class): + +```python +from haystack.utils import Secret + +MirageMount(path="/data", resource="ram") # in-memory scratch +MirageMount(path="/local", resource="disk", config={"root": "/srv/data"}) # local disk +MirageMount(path="/s3", resource="s3", config={"bucket": "my-bucket"}, read_only=True) +MirageMount( + path="/drive", + resource="gdrive", + config={"client_id": "...", "refresh_token": Secret.from_env_var("GDRIVE_REFRESH_TOKEN")}, + read_only=True, +) +``` + +**Parameters:** + +- **path** (str) – Mount point in the virtual filesystem, e.g. `"/s3"`. +- **resource** (str) – Mirage registry name of the backend, e.g. `"ram"`, `"disk"`, `"s3"`, `"gdrive"`. + See `mirage.resource.registry.REGISTRY` or `MirageMount.available_resources()` for the full list. +- **config** (dict\[str, Any\]) – Keyword arguments passed to the backend's Mirage config. Values may be `Secret`s, or + an OAuth token source that is turned into a token-provider callable when the workspace is built. +- **read_only** (bool) – If True, the mount is mounted in Mirage's READ mode and writes are rejected by + Mirage itself. + +#### available_resources + +```python +available_resources() -> list[str] +``` + +Return the Mirage registry names usable as `resource`. + +These are short backend names such as `"s3"`, `"gdrive"`, `"postgres"`. Pass one to +`MirageMount(resource=...)`; the config keys each backend expects come from its Mirage +config class. + +### MirageWorkspace + +A description of a Mirage mount tree that lazily builds a live `mirage.Workspace`. + +`MirageWorkspace` is the shared backend behind the Mirage tools and components: it holds the list of +:class:`MirageMount`s and the cache configuration, serializes cleanly (resolving `Secret`s only at +build time), and constructs the live workspace on first use via Mirage's resource registry. + +### Usage example + +```python +from haystack.utils import Secret +from haystack_integrations.tools.mirage import MirageWorkspace, MirageMount + +ws = MirageWorkspace( + mounts=[ + MirageMount(path="/data", resource="ram"), + MirageMount(path="/s3", resource="s3", config={"bucket": "my-bucket"}, read_only=True), + ] +) +print(ws.run("ls /s3")) +``` + +#### __init__ + +```python +__init__( + mounts: list[MirageMount], *, cache_limit: str | int = "512MB" +) -> None +``` + +Initialize the workspace description. + +**Parameters:** + +- **mounts** (list\[MirageMount\]) – The backends to mount, as a list of :class:`MirageMount`. +- **cache_limit** (str | int) – Mirage file-cache size limit (e.g. `"512MB"` or an int byte count). + +**Raises:** + +- MirageConfigError – If no mounts are provided or mount paths are not unique. + +#### warm_up + +```python +warm_up() -> None +``` + +Build the live `mirage.Workspace` eagerly. Idempotent. + +#### close + +```python +close() -> None +``` + +Close the live workspace and release its resources, if it was built. Thread-safe. + +#### run + +```python +run( + command: str, *, timeout: float = 60.0, max_chars: int | None = None +) -> str +``` + +Run a bash `command` against the mount tree from a synchronous context and return its output. + +**Parameters:** + +- **command** (str) – A bash command line, e.g. `"grep -r alert /s3/logs | wc -l"`. +- **timeout** (float) – Maximum seconds to wait for the command. +- **max_chars** (int | None) – If set, truncate the returned text to this many characters. + +**Returns:** + +- str – Combined stdout (plus a trailing error note on non-zero exit) as a string. + +#### run_async + +```python +run_async( + command: str, *, timeout: float = 60.0, max_chars: int | None = None +) -> str +``` + +Async counterpart of :meth:`run`. + +#### to_dict + +```python +to_dict() -> dict[str, Any] +``` + +Serialize the workspace description to a dictionary (Secret-safe). + +#### from_dict + +```python +from_dict(data: dict[str, Any]) -> MirageWorkspace +``` + +Deserialize a workspace description from a dictionary. + +#### describe + +```python +describe() -> str +``` + +Return a human/LLM-readable summary of the mount tree (used in tool descriptions). diff --git a/docs-website/reference_versioned_docs/version-2.28/integrations-api/mirage.md b/docs-website/reference_versioned_docs/version-2.28/integrations-api/mirage.md new file mode 100644 index 0000000000..09bcf73a40 --- /dev/null +++ b/docs-website/reference_versioned_docs/version-2.28/integrations-api/mirage.md @@ -0,0 +1,288 @@ +--- +title: "Mirage" +id: integrations-mirage +description: "Mirage integration for Haystack" +slug: "/integrations-mirage" +--- + + +## haystack_integrations.tools.mirage.shell_tool + +### MirageShellTool + +Bases: Tool + +A Haystack `Tool` that lets an `Agent` run bash commands across a Mirage virtual filesystem. + +Mirage mounts heterogeneous backends (object storage, databases, SaaS apps, local disk) as one +filesystem; this tool exposes Mirage's single `execute` surface to an Agent as one well-described +tool with a `command` parameter. Output is normalized to text and truncated before it reaches the +model. + +### Security model + +Mirage never shells out to the host: every command runs inside Mirage's own virtual-filesystem +interpreter, so the blast radius is confined to the mounts you attach. Two controls shape what an +Agent can do: + +- **Per-mount read-only mode** (`MirageMount(..., read_only=True)`) is the authoritative write + boundary. Mirage refuses any write to a read-only mount regardless of the command used, so this + -- not the allowlist -- is how you prevent modification or deletion. Mount anything the Agent + should not change as read-only. +- **The command allowlist** (`allowed_commands`) restricts *which* commands may run. It is + enforced against every command Mirage would execute, including commands nested inside + `$(...)`, backticks, `<(...)` and subshells, so `ls "$(rm x)"` is rejected unless `rm` + is also allowed. Treat it as a best-effort filter to steer the Agent, not a sandbox: allowing a + command that itself runs other commands (`eval`, `bash`, `sh`, `source`, `xargs`, + `timeout`) effectively allows anything, so do not list those for untrusted/hosted use. +- **`denied_paths`** rejects any command whose text references one of the given path substrings. + +### Usage example + +```python +from haystack.components.agents import Agent +from haystack.components.generators.chat import OpenAIChatGenerator +from haystack.dataclasses import ChatMessage +from haystack_integrations.tools.mirage import MirageWorkspace, MirageMount, MirageShellTool + +workspace = MirageWorkspace([ + MirageMount(path="/data", resource="ram"), + MirageMount(path="/s3", resource="s3", config={"bucket": "my-bucket"}, read_only=True), +]) +tool = MirageShellTool(workspace, allowed_commands=["ls", "cat", "grep", "head", "wc", "cp"]) + +agent = Agent(chat_generator=OpenAIChatGenerator(model="gpt-4o-mini"), tools=[tool]) +result = agent.run(messages=[ChatMessage.from_user("How many lines in /s3/log.txt mention 'alert'?")]) +print(result["messages"][-1].text) +``` + +#### __init__ + +```python +__init__( + workspace: MirageWorkspace, + *, + name: str = "mirage_shell", + description: str | None = None, + invocation_timeout: float = 60.0, + max_output_chars: int = 20000, + allowed_commands: list[str] | None = None, + denied_paths: list[str] | None = None +) -> None +``` + +Initialize the Mirage shell tool. + +**Parameters:** + +- **workspace** (MirageWorkspace) – The :class:`MirageWorkspace` describing the mount tree. +- **name** (str) – Tool name exposed to the LLM. +- **description** (str | None) – Custom description. If None, one is generated from the mount tree. +- **invocation_timeout** (float) – Maximum seconds to wait for a command to finish. +- **max_output_chars** (int) – Truncate command output to this many characters before returning it. +- **allowed_commands** (list\[str\] | None) – If set, only these command names may run, e.g. + `["ls", "cat", "grep", "head", "wc"]`. The allowlist is enforced against *every* command + Mirage would execute -- including commands nested in substitutions/subshells -- so + `ls "$(rm x)"` is rejected unless `rm` is also allowed. It is a filter over Mirage's + virtual commands to steer the Agent, not a security sandbox; the write boundary is + per-mount `read_only` (see the class "Security model" section). If None, any command is + allowed (not recommended for untrusted/hosted use). +- **denied_paths** (list\[str\] | None) – If set, any command referencing one of these path substrings is rejected. + +#### warm_up + +```python +warm_up() -> None +``` + +Build the underlying live workspace eagerly. Called by `Agent.warm_up()`/`Pipeline.warm_up()`. + +#### to_dict + +```python +to_dict() -> dict[str, Any] +``` + +Serialize the tool to a dictionary in the `{"type": ..., "data": ...}` format. + +#### from_dict + +```python +from_dict(data: dict[str, Any]) -> MirageShellTool +``` + +Deserialize the tool from a dictionary. + +#### close + +```python +close() -> None +``` + +Close the underlying workspace. + +## haystack_integrations.tools.mirage.workspace + +### MirageMount + +Declarative description of a single backend mounted into a :class:`MirageWorkspace`. + +A mount is the serializable unit of a Mirage workspace: it names *where* a backend is mounted +(`path`), *which* backend it is (`resource`, a Mirage registry name such as `"s3"` or `"gdrive"`), +and *how* to configure it (`config`). + +`config` values may be plain values, Haystack `Secret` objects for credentials, or an OAuth token +source (e.g. `OAuthRefreshTokenSource`) for backends whose config accepts a token-provider callable +(such as Mirage's OneDrive `access_token`). Secrets and token sources are resolved only when the +live workspace is built. + +Every backend is created the same way. Use the Mirage registry name and the config keys that backend expects +(discover names with `MirageMount.available_resources()`; config keys come from the backend's Mirage config class): + +```python +from haystack.utils import Secret + +MirageMount(path="/data", resource="ram") # in-memory scratch +MirageMount(path="/local", resource="disk", config={"root": "/srv/data"}) # local disk +MirageMount(path="/s3", resource="s3", config={"bucket": "my-bucket"}, read_only=True) +MirageMount( + path="/drive", + resource="gdrive", + config={"client_id": "...", "refresh_token": Secret.from_env_var("GDRIVE_REFRESH_TOKEN")}, + read_only=True, +) +``` + +**Parameters:** + +- **path** (str) – Mount point in the virtual filesystem, e.g. `"/s3"`. +- **resource** (str) – Mirage registry name of the backend, e.g. `"ram"`, `"disk"`, `"s3"`, `"gdrive"`. + See `mirage.resource.registry.REGISTRY` or `MirageMount.available_resources()` for the full list. +- **config** (dict\[str, Any\]) – Keyword arguments passed to the backend's Mirage config. Values may be `Secret`s, or + an OAuth token source that is turned into a token-provider callable when the workspace is built. +- **read_only** (bool) – If True, the mount is mounted in Mirage's READ mode and writes are rejected by + Mirage itself. + +#### available_resources + +```python +available_resources() -> list[str] +``` + +Return the Mirage registry names usable as `resource`. + +These are short backend names such as `"s3"`, `"gdrive"`, `"postgres"`. Pass one to +`MirageMount(resource=...)`; the config keys each backend expects come from its Mirage +config class. + +### MirageWorkspace + +A description of a Mirage mount tree that lazily builds a live `mirage.Workspace`. + +`MirageWorkspace` is the shared backend behind the Mirage tools and components: it holds the list of +:class:`MirageMount`s and the cache configuration, serializes cleanly (resolving `Secret`s only at +build time), and constructs the live workspace on first use via Mirage's resource registry. + +### Usage example + +```python +from haystack.utils import Secret +from haystack_integrations.tools.mirage import MirageWorkspace, MirageMount + +ws = MirageWorkspace( + mounts=[ + MirageMount(path="/data", resource="ram"), + MirageMount(path="/s3", resource="s3", config={"bucket": "my-bucket"}, read_only=True), + ] +) +print(ws.run("ls /s3")) +``` + +#### __init__ + +```python +__init__( + mounts: list[MirageMount], *, cache_limit: str | int = "512MB" +) -> None +``` + +Initialize the workspace description. + +**Parameters:** + +- **mounts** (list\[MirageMount\]) – The backends to mount, as a list of :class:`MirageMount`. +- **cache_limit** (str | int) – Mirage file-cache size limit (e.g. `"512MB"` or an int byte count). + +**Raises:** + +- MirageConfigError – If no mounts are provided or mount paths are not unique. + +#### warm_up + +```python +warm_up() -> None +``` + +Build the live `mirage.Workspace` eagerly. Idempotent. + +#### close + +```python +close() -> None +``` + +Close the live workspace and release its resources, if it was built. Thread-safe. + +#### run + +```python +run( + command: str, *, timeout: float = 60.0, max_chars: int | None = None +) -> str +``` + +Run a bash `command` against the mount tree from a synchronous context and return its output. + +**Parameters:** + +- **command** (str) – A bash command line, e.g. `"grep -r alert /s3/logs | wc -l"`. +- **timeout** (float) – Maximum seconds to wait for the command. +- **max_chars** (int | None) – If set, truncate the returned text to this many characters. + +**Returns:** + +- str – Combined stdout (plus a trailing error note on non-zero exit) as a string. + +#### run_async + +```python +run_async( + command: str, *, timeout: float = 60.0, max_chars: int | None = None +) -> str +``` + +Async counterpart of :meth:`run`. + +#### to_dict + +```python +to_dict() -> dict[str, Any] +``` + +Serialize the workspace description to a dictionary (Secret-safe). + +#### from_dict + +```python +from_dict(data: dict[str, Any]) -> MirageWorkspace +``` + +Deserialize a workspace description from a dictionary. + +#### describe + +```python +describe() -> str +``` + +Return a human/LLM-readable summary of the mount tree (used in tool descriptions). diff --git a/docs-website/reference_versioned_docs/version-2.29/integrations-api/mirage.md b/docs-website/reference_versioned_docs/version-2.29/integrations-api/mirage.md new file mode 100644 index 0000000000..09bcf73a40 --- /dev/null +++ b/docs-website/reference_versioned_docs/version-2.29/integrations-api/mirage.md @@ -0,0 +1,288 @@ +--- +title: "Mirage" +id: integrations-mirage +description: "Mirage integration for Haystack" +slug: "/integrations-mirage" +--- + + +## haystack_integrations.tools.mirage.shell_tool + +### MirageShellTool + +Bases: Tool + +A Haystack `Tool` that lets an `Agent` run bash commands across a Mirage virtual filesystem. + +Mirage mounts heterogeneous backends (object storage, databases, SaaS apps, local disk) as one +filesystem; this tool exposes Mirage's single `execute` surface to an Agent as one well-described +tool with a `command` parameter. Output is normalized to text and truncated before it reaches the +model. + +### Security model + +Mirage never shells out to the host: every command runs inside Mirage's own virtual-filesystem +interpreter, so the blast radius is confined to the mounts you attach. Two controls shape what an +Agent can do: + +- **Per-mount read-only mode** (`MirageMount(..., read_only=True)`) is the authoritative write + boundary. Mirage refuses any write to a read-only mount regardless of the command used, so this + -- not the allowlist -- is how you prevent modification or deletion. Mount anything the Agent + should not change as read-only. +- **The command allowlist** (`allowed_commands`) restricts *which* commands may run. It is + enforced against every command Mirage would execute, including commands nested inside + `$(...)`, backticks, `<(...)` and subshells, so `ls "$(rm x)"` is rejected unless `rm` + is also allowed. Treat it as a best-effort filter to steer the Agent, not a sandbox: allowing a + command that itself runs other commands (`eval`, `bash`, `sh`, `source`, `xargs`, + `timeout`) effectively allows anything, so do not list those for untrusted/hosted use. +- **`denied_paths`** rejects any command whose text references one of the given path substrings. + +### Usage example + +```python +from haystack.components.agents import Agent +from haystack.components.generators.chat import OpenAIChatGenerator +from haystack.dataclasses import ChatMessage +from haystack_integrations.tools.mirage import MirageWorkspace, MirageMount, MirageShellTool + +workspace = MirageWorkspace([ + MirageMount(path="/data", resource="ram"), + MirageMount(path="/s3", resource="s3", config={"bucket": "my-bucket"}, read_only=True), +]) +tool = MirageShellTool(workspace, allowed_commands=["ls", "cat", "grep", "head", "wc", "cp"]) + +agent = Agent(chat_generator=OpenAIChatGenerator(model="gpt-4o-mini"), tools=[tool]) +result = agent.run(messages=[ChatMessage.from_user("How many lines in /s3/log.txt mention 'alert'?")]) +print(result["messages"][-1].text) +``` + +#### __init__ + +```python +__init__( + workspace: MirageWorkspace, + *, + name: str = "mirage_shell", + description: str | None = None, + invocation_timeout: float = 60.0, + max_output_chars: int = 20000, + allowed_commands: list[str] | None = None, + denied_paths: list[str] | None = None +) -> None +``` + +Initialize the Mirage shell tool. + +**Parameters:** + +- **workspace** (MirageWorkspace) – The :class:`MirageWorkspace` describing the mount tree. +- **name** (str) – Tool name exposed to the LLM. +- **description** (str | None) – Custom description. If None, one is generated from the mount tree. +- **invocation_timeout** (float) – Maximum seconds to wait for a command to finish. +- **max_output_chars** (int) – Truncate command output to this many characters before returning it. +- **allowed_commands** (list\[str\] | None) – If set, only these command names may run, e.g. + `["ls", "cat", "grep", "head", "wc"]`. The allowlist is enforced against *every* command + Mirage would execute -- including commands nested in substitutions/subshells -- so + `ls "$(rm x)"` is rejected unless `rm` is also allowed. It is a filter over Mirage's + virtual commands to steer the Agent, not a security sandbox; the write boundary is + per-mount `read_only` (see the class "Security model" section). If None, any command is + allowed (not recommended for untrusted/hosted use). +- **denied_paths** (list\[str\] | None) – If set, any command referencing one of these path substrings is rejected. + +#### warm_up + +```python +warm_up() -> None +``` + +Build the underlying live workspace eagerly. Called by `Agent.warm_up()`/`Pipeline.warm_up()`. + +#### to_dict + +```python +to_dict() -> dict[str, Any] +``` + +Serialize the tool to a dictionary in the `{"type": ..., "data": ...}` format. + +#### from_dict + +```python +from_dict(data: dict[str, Any]) -> MirageShellTool +``` + +Deserialize the tool from a dictionary. + +#### close + +```python +close() -> None +``` + +Close the underlying workspace. + +## haystack_integrations.tools.mirage.workspace + +### MirageMount + +Declarative description of a single backend mounted into a :class:`MirageWorkspace`. + +A mount is the serializable unit of a Mirage workspace: it names *where* a backend is mounted +(`path`), *which* backend it is (`resource`, a Mirage registry name such as `"s3"` or `"gdrive"`), +and *how* to configure it (`config`). + +`config` values may be plain values, Haystack `Secret` objects for credentials, or an OAuth token +source (e.g. `OAuthRefreshTokenSource`) for backends whose config accepts a token-provider callable +(such as Mirage's OneDrive `access_token`). Secrets and token sources are resolved only when the +live workspace is built. + +Every backend is created the same way. Use the Mirage registry name and the config keys that backend expects +(discover names with `MirageMount.available_resources()`; config keys come from the backend's Mirage config class): + +```python +from haystack.utils import Secret + +MirageMount(path="/data", resource="ram") # in-memory scratch +MirageMount(path="/local", resource="disk", config={"root": "/srv/data"}) # local disk +MirageMount(path="/s3", resource="s3", config={"bucket": "my-bucket"}, read_only=True) +MirageMount( + path="/drive", + resource="gdrive", + config={"client_id": "...", "refresh_token": Secret.from_env_var("GDRIVE_REFRESH_TOKEN")}, + read_only=True, +) +``` + +**Parameters:** + +- **path** (str) – Mount point in the virtual filesystem, e.g. `"/s3"`. +- **resource** (str) – Mirage registry name of the backend, e.g. `"ram"`, `"disk"`, `"s3"`, `"gdrive"`. + See `mirage.resource.registry.REGISTRY` or `MirageMount.available_resources()` for the full list. +- **config** (dict\[str, Any\]) – Keyword arguments passed to the backend's Mirage config. Values may be `Secret`s, or + an OAuth token source that is turned into a token-provider callable when the workspace is built. +- **read_only** (bool) – If True, the mount is mounted in Mirage's READ mode and writes are rejected by + Mirage itself. + +#### available_resources + +```python +available_resources() -> list[str] +``` + +Return the Mirage registry names usable as `resource`. + +These are short backend names such as `"s3"`, `"gdrive"`, `"postgres"`. Pass one to +`MirageMount(resource=...)`; the config keys each backend expects come from its Mirage +config class. + +### MirageWorkspace + +A description of a Mirage mount tree that lazily builds a live `mirage.Workspace`. + +`MirageWorkspace` is the shared backend behind the Mirage tools and components: it holds the list of +:class:`MirageMount`s and the cache configuration, serializes cleanly (resolving `Secret`s only at +build time), and constructs the live workspace on first use via Mirage's resource registry. + +### Usage example + +```python +from haystack.utils import Secret +from haystack_integrations.tools.mirage import MirageWorkspace, MirageMount + +ws = MirageWorkspace( + mounts=[ + MirageMount(path="/data", resource="ram"), + MirageMount(path="/s3", resource="s3", config={"bucket": "my-bucket"}, read_only=True), + ] +) +print(ws.run("ls /s3")) +``` + +#### __init__ + +```python +__init__( + mounts: list[MirageMount], *, cache_limit: str | int = "512MB" +) -> None +``` + +Initialize the workspace description. + +**Parameters:** + +- **mounts** (list\[MirageMount\]) – The backends to mount, as a list of :class:`MirageMount`. +- **cache_limit** (str | int) – Mirage file-cache size limit (e.g. `"512MB"` or an int byte count). + +**Raises:** + +- MirageConfigError – If no mounts are provided or mount paths are not unique. + +#### warm_up + +```python +warm_up() -> None +``` + +Build the live `mirage.Workspace` eagerly. Idempotent. + +#### close + +```python +close() -> None +``` + +Close the live workspace and release its resources, if it was built. Thread-safe. + +#### run + +```python +run( + command: str, *, timeout: float = 60.0, max_chars: int | None = None +) -> str +``` + +Run a bash `command` against the mount tree from a synchronous context and return its output. + +**Parameters:** + +- **command** (str) – A bash command line, e.g. `"grep -r alert /s3/logs | wc -l"`. +- **timeout** (float) – Maximum seconds to wait for the command. +- **max_chars** (int | None) – If set, truncate the returned text to this many characters. + +**Returns:** + +- str – Combined stdout (plus a trailing error note on non-zero exit) as a string. + +#### run_async + +```python +run_async( + command: str, *, timeout: float = 60.0, max_chars: int | None = None +) -> str +``` + +Async counterpart of :meth:`run`. + +#### to_dict + +```python +to_dict() -> dict[str, Any] +``` + +Serialize the workspace description to a dictionary (Secret-safe). + +#### from_dict + +```python +from_dict(data: dict[str, Any]) -> MirageWorkspace +``` + +Deserialize a workspace description from a dictionary. + +#### describe + +```python +describe() -> str +``` + +Return a human/LLM-readable summary of the mount tree (used in tool descriptions). diff --git a/docs-website/reference_versioned_docs/version-2.30/integrations-api/mirage.md b/docs-website/reference_versioned_docs/version-2.30/integrations-api/mirage.md new file mode 100644 index 0000000000..09bcf73a40 --- /dev/null +++ b/docs-website/reference_versioned_docs/version-2.30/integrations-api/mirage.md @@ -0,0 +1,288 @@ +--- +title: "Mirage" +id: integrations-mirage +description: "Mirage integration for Haystack" +slug: "/integrations-mirage" +--- + + +## haystack_integrations.tools.mirage.shell_tool + +### MirageShellTool + +Bases: Tool + +A Haystack `Tool` that lets an `Agent` run bash commands across a Mirage virtual filesystem. + +Mirage mounts heterogeneous backends (object storage, databases, SaaS apps, local disk) as one +filesystem; this tool exposes Mirage's single `execute` surface to an Agent as one well-described +tool with a `command` parameter. Output is normalized to text and truncated before it reaches the +model. + +### Security model + +Mirage never shells out to the host: every command runs inside Mirage's own virtual-filesystem +interpreter, so the blast radius is confined to the mounts you attach. Two controls shape what an +Agent can do: + +- **Per-mount read-only mode** (`MirageMount(..., read_only=True)`) is the authoritative write + boundary. Mirage refuses any write to a read-only mount regardless of the command used, so this + -- not the allowlist -- is how you prevent modification or deletion. Mount anything the Agent + should not change as read-only. +- **The command allowlist** (`allowed_commands`) restricts *which* commands may run. It is + enforced against every command Mirage would execute, including commands nested inside + `$(...)`, backticks, `<(...)` and subshells, so `ls "$(rm x)"` is rejected unless `rm` + is also allowed. Treat it as a best-effort filter to steer the Agent, not a sandbox: allowing a + command that itself runs other commands (`eval`, `bash`, `sh`, `source`, `xargs`, + `timeout`) effectively allows anything, so do not list those for untrusted/hosted use. +- **`denied_paths`** rejects any command whose text references one of the given path substrings. + +### Usage example + +```python +from haystack.components.agents import Agent +from haystack.components.generators.chat import OpenAIChatGenerator +from haystack.dataclasses import ChatMessage +from haystack_integrations.tools.mirage import MirageWorkspace, MirageMount, MirageShellTool + +workspace = MirageWorkspace([ + MirageMount(path="/data", resource="ram"), + MirageMount(path="/s3", resource="s3", config={"bucket": "my-bucket"}, read_only=True), +]) +tool = MirageShellTool(workspace, allowed_commands=["ls", "cat", "grep", "head", "wc", "cp"]) + +agent = Agent(chat_generator=OpenAIChatGenerator(model="gpt-4o-mini"), tools=[tool]) +result = agent.run(messages=[ChatMessage.from_user("How many lines in /s3/log.txt mention 'alert'?")]) +print(result["messages"][-1].text) +``` + +#### __init__ + +```python +__init__( + workspace: MirageWorkspace, + *, + name: str = "mirage_shell", + description: str | None = None, + invocation_timeout: float = 60.0, + max_output_chars: int = 20000, + allowed_commands: list[str] | None = None, + denied_paths: list[str] | None = None +) -> None +``` + +Initialize the Mirage shell tool. + +**Parameters:** + +- **workspace** (MirageWorkspace) – The :class:`MirageWorkspace` describing the mount tree. +- **name** (str) – Tool name exposed to the LLM. +- **description** (str | None) – Custom description. If None, one is generated from the mount tree. +- **invocation_timeout** (float) – Maximum seconds to wait for a command to finish. +- **max_output_chars** (int) – Truncate command output to this many characters before returning it. +- **allowed_commands** (list\[str\] | None) – If set, only these command names may run, e.g. + `["ls", "cat", "grep", "head", "wc"]`. The allowlist is enforced against *every* command + Mirage would execute -- including commands nested in substitutions/subshells -- so + `ls "$(rm x)"` is rejected unless `rm` is also allowed. It is a filter over Mirage's + virtual commands to steer the Agent, not a security sandbox; the write boundary is + per-mount `read_only` (see the class "Security model" section). If None, any command is + allowed (not recommended for untrusted/hosted use). +- **denied_paths** (list\[str\] | None) – If set, any command referencing one of these path substrings is rejected. + +#### warm_up + +```python +warm_up() -> None +``` + +Build the underlying live workspace eagerly. Called by `Agent.warm_up()`/`Pipeline.warm_up()`. + +#### to_dict + +```python +to_dict() -> dict[str, Any] +``` + +Serialize the tool to a dictionary in the `{"type": ..., "data": ...}` format. + +#### from_dict + +```python +from_dict(data: dict[str, Any]) -> MirageShellTool +``` + +Deserialize the tool from a dictionary. + +#### close + +```python +close() -> None +``` + +Close the underlying workspace. + +## haystack_integrations.tools.mirage.workspace + +### MirageMount + +Declarative description of a single backend mounted into a :class:`MirageWorkspace`. + +A mount is the serializable unit of a Mirage workspace: it names *where* a backend is mounted +(`path`), *which* backend it is (`resource`, a Mirage registry name such as `"s3"` or `"gdrive"`), +and *how* to configure it (`config`). + +`config` values may be plain values, Haystack `Secret` objects for credentials, or an OAuth token +source (e.g. `OAuthRefreshTokenSource`) for backends whose config accepts a token-provider callable +(such as Mirage's OneDrive `access_token`). Secrets and token sources are resolved only when the +live workspace is built. + +Every backend is created the same way. Use the Mirage registry name and the config keys that backend expects +(discover names with `MirageMount.available_resources()`; config keys come from the backend's Mirage config class): + +```python +from haystack.utils import Secret + +MirageMount(path="/data", resource="ram") # in-memory scratch +MirageMount(path="/local", resource="disk", config={"root": "/srv/data"}) # local disk +MirageMount(path="/s3", resource="s3", config={"bucket": "my-bucket"}, read_only=True) +MirageMount( + path="/drive", + resource="gdrive", + config={"client_id": "...", "refresh_token": Secret.from_env_var("GDRIVE_REFRESH_TOKEN")}, + read_only=True, +) +``` + +**Parameters:** + +- **path** (str) – Mount point in the virtual filesystem, e.g. `"/s3"`. +- **resource** (str) – Mirage registry name of the backend, e.g. `"ram"`, `"disk"`, `"s3"`, `"gdrive"`. + See `mirage.resource.registry.REGISTRY` or `MirageMount.available_resources()` for the full list. +- **config** (dict\[str, Any\]) – Keyword arguments passed to the backend's Mirage config. Values may be `Secret`s, or + an OAuth token source that is turned into a token-provider callable when the workspace is built. +- **read_only** (bool) – If True, the mount is mounted in Mirage's READ mode and writes are rejected by + Mirage itself. + +#### available_resources + +```python +available_resources() -> list[str] +``` + +Return the Mirage registry names usable as `resource`. + +These are short backend names such as `"s3"`, `"gdrive"`, `"postgres"`. Pass one to +`MirageMount(resource=...)`; the config keys each backend expects come from its Mirage +config class. + +### MirageWorkspace + +A description of a Mirage mount tree that lazily builds a live `mirage.Workspace`. + +`MirageWorkspace` is the shared backend behind the Mirage tools and components: it holds the list of +:class:`MirageMount`s and the cache configuration, serializes cleanly (resolving `Secret`s only at +build time), and constructs the live workspace on first use via Mirage's resource registry. + +### Usage example + +```python +from haystack.utils import Secret +from haystack_integrations.tools.mirage import MirageWorkspace, MirageMount + +ws = MirageWorkspace( + mounts=[ + MirageMount(path="/data", resource="ram"), + MirageMount(path="/s3", resource="s3", config={"bucket": "my-bucket"}, read_only=True), + ] +) +print(ws.run("ls /s3")) +``` + +#### __init__ + +```python +__init__( + mounts: list[MirageMount], *, cache_limit: str | int = "512MB" +) -> None +``` + +Initialize the workspace description. + +**Parameters:** + +- **mounts** (list\[MirageMount\]) – The backends to mount, as a list of :class:`MirageMount`. +- **cache_limit** (str | int) – Mirage file-cache size limit (e.g. `"512MB"` or an int byte count). + +**Raises:** + +- MirageConfigError – If no mounts are provided or mount paths are not unique. + +#### warm_up + +```python +warm_up() -> None +``` + +Build the live `mirage.Workspace` eagerly. Idempotent. + +#### close + +```python +close() -> None +``` + +Close the live workspace and release its resources, if it was built. Thread-safe. + +#### run + +```python +run( + command: str, *, timeout: float = 60.0, max_chars: int | None = None +) -> str +``` + +Run a bash `command` against the mount tree from a synchronous context and return its output. + +**Parameters:** + +- **command** (str) – A bash command line, e.g. `"grep -r alert /s3/logs | wc -l"`. +- **timeout** (float) – Maximum seconds to wait for the command. +- **max_chars** (int | None) – If set, truncate the returned text to this many characters. + +**Returns:** + +- str – Combined stdout (plus a trailing error note on non-zero exit) as a string. + +#### run_async + +```python +run_async( + command: str, *, timeout: float = 60.0, max_chars: int | None = None +) -> str +``` + +Async counterpart of :meth:`run`. + +#### to_dict + +```python +to_dict() -> dict[str, Any] +``` + +Serialize the workspace description to a dictionary (Secret-safe). + +#### from_dict + +```python +from_dict(data: dict[str, Any]) -> MirageWorkspace +``` + +Deserialize a workspace description from a dictionary. + +#### describe + +```python +describe() -> str +``` + +Return a human/LLM-readable summary of the mount tree (used in tool descriptions). diff --git a/docs-website/sidebars.js b/docs-website/sidebars.js index 4d99fa7780..a309ad10c6 100644 --- a/docs-website/sidebars.js +++ b/docs-website/sidebars.js @@ -21,6 +21,7 @@ export default { 'overview/breaking-change-policy', 'overview/migration', 'overview/migrating-from-langgraphlangchain-to-haystack', + 'overview/platform-components', ], }, { @@ -413,6 +414,7 @@ export default { 'pipeline-components/generators/amazonbedrockgenerator', 'pipeline-components/generators/aimllapichatgenerator', 'pipeline-components/generators/anthropicchatgenerator', + 'pipeline-components/generators/anthropicfoundrychatgenerator', 'pipeline-components/generators/anthropicgenerator', 'pipeline-components/generators/anthropicvertexchatgenerator', 'pipeline-components/generators/azureopenaichatgenerator', @@ -574,6 +576,7 @@ export default { 'pipeline-components/retrievers/chromaqueryretriever', 'pipeline-components/retrievers/elasticsearchbm25retriever', 'pipeline-components/retrievers/elasticsearchembeddingretriever', + 'pipeline-components/retrievers/elasticsearchhybridretriever', 'pipeline-components/retrievers/elasticsearchsqlretriever', 'pipeline-components/retrievers/faissembeddingretriever', 'pipeline-components/retrievers/falkordbcypherretriever', @@ -593,6 +596,7 @@ export default { 'pipeline-components/retrievers/opensearchbm25retriever', 'pipeline-components/retrievers/opensearchembeddingretriever', 'pipeline-components/retrievers/opensearchhybridretriever', + 'pipeline-components/retrievers/opensearchmetadataretriever', 'pipeline-components/retrievers/opensearchsqlretriever', 'pipeline-components/retrievers/oracleembeddingretriever', 'pipeline-components/retrievers/oraclekeywordretriever', @@ -602,7 +606,7 @@ export default { 'pipeline-components/retrievers/qdrantembeddingretriever', 'pipeline-components/retrievers/qdranthybridretriever', 'pipeline-components/retrievers/qdrantsparseembeddingretriever', - 'pipeline-components/retrievers/sentencewindowretrieval', + 'pipeline-components/retrievers/sentencewindowretriever', 'pipeline-components/retrievers/snowflaketableretriever', 'pipeline-components/retrievers/supabasegroongabm25retriever', 'pipeline-components/retrievers/supabasepgvectorembeddingretriever', diff --git a/docs-website/versioned_docs/version-2.30/pipeline-components/generators.mdx b/docs-website/versioned_docs/version-2.30/pipeline-components/generators.mdx index 098c9b3989..d7d7b3b0ca 100644 --- a/docs-website/versioned_docs/version-2.30/pipeline-components/generators.mdx +++ b/docs-website/versioned_docs/version-2.30/pipeline-components/generators.mdx @@ -15,6 +15,7 @@ Generators are responsible for generating text after you give them a prompt. The | [AmazonBedrockGenerator](generators/amazonbedrockgenerator.mdx) | Enables text generation using models through Amazon Bedrock service. | ✅ | | [AIMLAPIChatGenerator](generators/aimllapichatgenerator.mdx) | Enables chat completion using AI models through the AIMLAPI. | ✅ | | [AnthropicChatGenerator](generators/anthropicchatgenerator.mdx) | This component enables chat completions using Anthropic large language models (LLMs). | ✅ | +| [AnthropicFoundryChatGenerator](generators/anthropicfoundrychatgenerator.mdx) | This component enables chat completions using Anthropic models served through Azure Foundry. | ✅ | | [AnthropicVertexChatGenerator](generators/anthropicvertexchatgenerator.mdx) | This component enables chat completions using AnthropicVertex API. | ✅ | | [AnthropicGenerator](generators/anthropicgenerator.mdx) | This component enables text completions using Anthropic large language models (LLMs). | ✅ | | [AzureOpenAIChatGenerator](generators/azureopenaichatgenerator.mdx) | Enables chat completion using OpenAI's LLMs through Azure services. | ✅ | diff --git a/docs-website/versioned_docs/version-2.30/pipeline-components/generators/anthropicfoundrychatgenerator.mdx b/docs-website/versioned_docs/version-2.30/pipeline-components/generators/anthropicfoundrychatgenerator.mdx new file mode 100644 index 0000000000..6657e5654d --- /dev/null +++ b/docs-website/versioned_docs/version-2.30/pipeline-components/generators/anthropicfoundrychatgenerator.mdx @@ -0,0 +1,173 @@ +--- +title: "AnthropicFoundryChatGenerator" +id: anthropicfoundrychatgenerator +slug: "/anthropicfoundrychatgenerator" +description: "This component enables chat completions using Anthropic models served through Azure Foundry." +--- + +# AnthropicFoundryChatGenerator + +This component enables chat completions using Anthropic models served through Azure Foundry. + +
+ +| | | +| --- | --- | +| **Most common position in a pipeline** | After a [`ChatPromptBuilder`](../builders/chatpromptbuilder.mdx) | +| **Mandatory init variables** | `api_key`: Your Azure Foundry API key. Can be set with the `ANTHROPIC_FOUNDRY_API_KEY` env var. Alternatively, pass an `azure_ad_token_provider` callable.

`resource`: Your Azure Foundry resource name. Can be set with the `ANTHROPIC_FOUNDRY_RESOURCE` env var. Alternatively, pass a full `endpoint` URL. | +| **Mandatory run variables** | `messages`: A list of [`ChatMessage`](../../concepts/data-classes/chatmessage.mdx) objects | +| **Output variables** | `replies`: A list of [`ChatMessage`](../../concepts/data-classes/chatmessage.mdx) objects

`meta`: A dictionary on each reply with metadata such as the model name, finish reason, and token usage | +| **API reference** | [Anthropic](/reference/integrations-anthropic) | +| **GitHub link** | https://github.com/deepset-ai/haystack-core-integrations/tree/main/integrations/anthropic | +| **Package name** | `anthropic-haystack` | + +
+ +## Overview + +`AnthropicFoundryChatGenerator` lets you call Anthropic's Claude models through an [Azure Foundry](https://learn.microsoft.com/en-us/azure/ai-foundry/) deployment. It is a thin subclass of [`AnthropicChatGenerator`](anthropicchatgenerator.mdx) — the request and response shapes match the Anthropic Messages API, but the traffic flows through your Azure resource instead of `api.anthropic.com`. + +Use this generator when your organization standardizes on Azure for model hosting (billing, networking, compliance) but still wants to work against Claude. If you don't need Azure, prefer `AnthropicChatGenerator`. + +The default model is `claude-sonnet-4-5`. Other models known to work include `claude-opus-4-6`, `claude-sonnet-4-6`, `claude-opus-4-5`, `claude-opus-4-1`, and `claude-haiku-4-5`. This list is not exhaustive — the actual catalog depends on what is deployed in your Foundry resource. See the [Anthropic model overview](https://docs.anthropic.com/en/docs/about-claude/models) for guidance on picking a model. + +### Parameters + +`AnthropicFoundryChatGenerator` needs two things to talk to Azure: credentials and an endpoint. + +**Credentials.** Pick one of: + +- The `ANTHROPIC_FOUNDRY_API_KEY` environment variable (recommended). +- The `api_key` init parameter using the Haystack [Secret](../../concepts/secret-management.mdx) API: `Secret.from_token("your-api-key-here")`. +- A callable passed as `azure_ad_token_provider` that returns a fresh Azure AD token on demand. Use this for Entra ID / managed-identity setups where a static key isn't appropriate. + +**Endpoint.** Pick one of: + +- The `resource` init parameter (or the `ANTHROPIC_FOUNDRY_RESOURCE` environment variable) — the short Foundry resource name, used to derive the URL. +- The `endpoint` init parameter — a full URL, useful for custom domains or non-standard routes. + +Once configured, pass any text-generation parameter supported by the Anthropic [Messages API](https://docs.anthropic.com/en/api/messages) through `generation_kwargs`, either at init or per call. Common keys include `system`, `max_tokens`, `temperature`, `top_p`, `top_k`, `stop_sequences`, `metadata`, and `extra_headers`. You can also tune `timeout` and `max_retries` to control client-side resilience. + +The component takes a list of `ChatMessage` objects. `ChatMessage` is a data class that holds a message, a role (`user`, `assistant`, `system`, or `function`), and optional metadata. Only text input is supported. + +### Tool Support + +`AnthropicFoundryChatGenerator` supports function calling through the `tools` parameter, which accepts: + +- **A list of Tool objects**: Pass individual tools as a list. +- **A single Toolset**: Pass an entire Toolset directly. +- **Mixed Tools and Toolsets**: Combine multiple Toolsets with standalone tools in a single list. + +```python +from haystack.tools import Tool, Toolset +from haystack_integrations.components.generators.anthropic import AnthropicFoundryChatGenerator + +weather_tool = Tool(name="weather", description="Get weather info", ...) +math_toolset = Toolset([add_tool, subtract_tool, multiply_tool]) + +generator = AnthropicFoundryChatGenerator( + resource="my-resource", + tools=[math_toolset, weather_tool], +) +``` + +Tools passed to `run()` override any tools set at init time. For more details, see the [Tool](../../tools/tool.mdx) and [Toolset](../../tools/toolset.mdx) documentation. + +### Streaming + +You can stream output as it's generated. Pass a callback to `streaming_callback`. The built-in `print_streaming_chunk` prints text tokens and tool events to stdout. + +```python +from haystack.components.generators.utils import print_streaming_chunk +from haystack.dataclasses import ChatMessage +from haystack_integrations.components.generators.anthropic import AnthropicFoundryChatGenerator + +generator = AnthropicFoundryChatGenerator( + resource="my-resource", + streaming_callback=print_streaming_chunk, +) +generator.run([ChatMessage.from_user("Your question here")]) +``` + +:::info +Streaming works only with a single response. If a provider supports multiple candidates, set `n=1`. +::: + +See [Streaming Support](guides-to-generators/choosing-the-right-generator.mdx#streaming-support) for how `StreamingChunk` works and how to write a custom callback. Prefer `print_streaming_chunk` unless you need a specific transport (such as SSE or WebSocket) or custom UI formatting. + +### Async + +`run_async` mirrors `run` and is wired up automatically — useful inside an async pipeline or web handler. + +```python +import asyncio +from haystack.dataclasses import ChatMessage +from haystack_integrations.components.generators.anthropic import AnthropicFoundryChatGenerator + +async def main(): + generator = AnthropicFoundryChatGenerator(resource="my-resource") + result = await generator.run_async([ChatMessage.from_user("Hello!")]) + print(result["replies"][0].text) + +asyncio.run(main()) +``` + +## Usage + +Install the `anthropic-haystack` package to use the `AnthropicFoundryChatGenerator`: + +```shell +pip install anthropic-haystack +``` + +### On its own + +```python +from haystack.dataclasses import ChatMessage +from haystack.utils import Secret +from haystack_integrations.components.generators.anthropic import AnthropicFoundryChatGenerator + +generator = AnthropicFoundryChatGenerator( + model="claude-sonnet-4-5", + api_key=Secret.from_env_var("ANTHROPIC_FOUNDRY_API_KEY"), + resource="my-resource", +) + +response = generator.run([ChatMessage.from_user("What's Natural Language Processing?")]) +print(response) +``` + +### In a pipeline + +```python +from haystack import Pipeline +from haystack.components.builders import ChatPromptBuilder +from haystack.dataclasses import ChatMessage +from haystack_integrations.components.generators.anthropic import AnthropicFoundryChatGenerator + +pipe = Pipeline() +pipe.add_component("prompt_builder", ChatPromptBuilder()) +pipe.add_component( + "llm", + AnthropicFoundryChatGenerator(resource="my-resource"), +) +pipe.connect("prompt_builder", "llm") + +country = "Germany" +messages = [ + ChatMessage.from_system( + "You are an assistant giving out valuable information to language learners.", + ), + ChatMessage.from_user("What's the official language of {{ country }}?"), +] + +res = pipe.run( + data={ + "prompt_builder": { + "template_variables": {"country": country}, + "template": messages, + }, + }, +) +print(res) +``` diff --git a/docs-website/versioned_docs/version-2.30/pipeline-components/retrievers.mdx b/docs-website/versioned_docs/version-2.30/pipeline-components/retrievers.mdx index cbc46c31fe..de7aef9b6b 100644 --- a/docs-website/versioned_docs/version-2.30/pipeline-components/retrievers.mdx +++ b/docs-website/versioned_docs/version-2.30/pipeline-components/retrievers.mdx @@ -167,6 +167,7 @@ For details on how to initialize and use a Retriever in a pipeline, see the docu | [CogneeRetriever](retrievers/cogneeretriever.mdx) | Retrieves memories from a CogneeMemoryStore and returns them as system ChatMessage objects. | | [ElasticsearchEmbeddingRetriever](retrievers/elasticsearchembeddingretriever.mdx) | An embedding-based Retriever compatible with the Elasticsearch Document Store. | | [ElasticsearchBM25Retriever](retrievers/elasticsearchbm25retriever.mdx) | A keyword-based Retriever that fetches Documents matching a query from the Elasticsearch Document Store. | +| [ElasticsearchHybridRetriever](retrievers/elasticsearchhybridretriever.mdx) | A SuperComponent that combines BM25 and embedding-based retrieval from the Elasticsearch Document Store. | | [ElasticsearchSQLRetriever](retrievers/elasticsearchsqlretriever.mdx) | Executes raw Elasticsearch SQL queries against an Elasticsearch Document Store and returns the raw JSON response. | | [FAISSEmbeddingRetriever](retrievers/faissembeddingretriever.mdx) | An embedding-based Retriever compatible with the FAISSDocumentStore. | | [FalkorDBCypherRetriever](retrievers/falkordbcypherretriever.mdx) | A Retriever that executes arbitrary OpenCypher queries against a FalkorDB Document Store. | @@ -185,6 +186,7 @@ For details on how to initialize and use a Retriever in a pipeline, see the docu | [OpenSearchBM25Retriever](retrievers/opensearchbm25retriever.mdx) | A keyword-based Retriever that fetches Documents matching a query from an OpenSearch Document Store. | | [OpenSearchEmbeddingRetriever](retrievers/opensearchembeddingretriever.mdx) | An embedding-based Retriever compatible with the OpenSearch Document Store. | | [OpenSearchHybridRetriever](retrievers/opensearchhybridretriever.mdx) | A SuperComponent that implements a Hybrid Retriever in a single component, relying on OpenSearch as the backend Document Store. | +| [OpenSearchMetadataRetriever](retrievers/opensearchmetadataretriever.mdx) | Searches and ranks the metadata fields of documents stored in an OpenSearch Document Store and returns the matching metadata values. | | [OpenSearchSQLRetriever](retrievers/opensearchsqlretriever.mdx) | Executes raw OpenSearch SQL queries against an OpenSearch Document Store and returns the raw JSON response. | | [OracleEmbeddingRetriever](retrievers/oracleembeddingretriever.mdx) | An embedding-based Retriever compatible with the Oracle Document Store. | | [OracleKeywordRetriever](retrievers/oraclekeywordretriever.mdx) | A keyword-based Retriever that fetches Documents matching a query from the Oracle Document Store. | diff --git a/docs-website/versioned_docs/version-2.30/pipeline-components/retrievers/elasticsearchhybridretriever.mdx b/docs-website/versioned_docs/version-2.30/pipeline-components/retrievers/elasticsearchhybridretriever.mdx new file mode 100644 index 0000000000..99774ae78e --- /dev/null +++ b/docs-website/versioned_docs/version-2.30/pipeline-components/retrievers/elasticsearchhybridretriever.mdx @@ -0,0 +1,214 @@ +--- +title: "ElasticsearchHybridRetriever" +id: elasticsearchhybridretriever +slug: "/elasticsearchhybridretriever" +description: "This is a SuperComponent that implements a Hybrid Retriever in a single component, relying on Elasticsearch as the backend Document Store." +--- + +# ElasticsearchHybridRetriever + +This is a [SuperComponent](../../concepts/components/supercomponents.mdx) that implements a Hybrid Retriever in a single component, relying on Elasticsearch as the backend Document Store. + +A Hybrid Retriever uses both traditional keyword-based search (BM25) and embedding-based search to retrieve documents, combining the strengths of both approaches. The Retriever then merges and re-ranks the results from both methods. + +
+ +| | | +| --- | --- | +| **Most common position in a pipeline** | 1. After a TextEmbedder and before a PromptBuilder in a RAG pipeline 2. The last component in a hybrid search pipeline 3. After a TextEmbedder and before an ExtractiveReader in an extractive QA pipeline | +| **Mandatory init variables** | `document_store`: An instance of [`ElasticsearchDocumentStore`](../../document-stores/elasticsearch-document-store.mdx)

`embedder`: Any [Embedder](../embedders.mdx) implementing the `TextEmbedder` protocol | +| **Mandatory run variables** | `query`: A query string | +| **Output variables** | `documents`: A list of documents matching the query | +| **API reference** | [Elasticsearch](/reference/integrations-elasticsearch) | +| **GitHub link** | https://github.com/deepset-ai/haystack-core-integrations/tree/main/integrations/elasticsearch | +| **Package name** | `elasticsearch-haystack` | + +
+ +## Overview + +The `ElasticsearchHybridRetriever` combines two retrieval methods: + +1. **BM25 Retrieval**: A keyword-based search that uses the BM25 algorithm to find documents based on term frequency and inverse document frequency. It's based on the [`ElasticsearchBM25Retriever`](elasticsearchbm25retriever.mdx) component and is suitable for finding exact matches to names, IDs, or well-defined terms. +2. **Embedding-based Retrieval**: A semantic search that uses vector similarity to find documents that are semantically similar to the query. It's based on the [`ElasticsearchEmbeddingRetriever`](elasticsearchembeddingretriever.mdx) component and is suitable for semantic search. + +The component automatically handles: + +- Converting the query into an embedding using the provided embedder, +- Running both retrieval methods in parallel, +- Merging and re-ranking the results using the specified join mode (default: Reciprocal Rank Fusion). + +### Installation + +[Install](https://www.elastic.co/guide/en/elasticsearch/reference/current/install-elasticsearch.html) Elasticsearch and then [start](https://www.elastic.co/guide/en/elasticsearch/reference/current/starting-elasticsearch.html) an instance. Haystack supports Elasticsearch 8. + +If you have Docker set up, we recommend pulling the Docker image and running it. + +```shell +docker pull docker.elastic.co/elasticsearch/elasticsearch:8.11.1 +docker run -p 9200:9200 -e "discovery.type=single-node" -e "ES_JAVA_OPTS=-Xms1024m -Xmx1024m" -e "xpack.security.enabled=false" elasticsearch:8.11.1 +``` + +As an alternative, you can go to the [Elasticsearch integration GitHub](https://github.com/deepset-ai/haystack-core-integrations/tree/main/integrations/elasticsearch) and start a Docker container running Elasticsearch using the provided `docker-compose.yml`: + +```shell +docker compose up +``` + +Once you have a running Elasticsearch instance, install the `elasticsearch-haystack` integration: + +```shell +pip install elasticsearch-haystack +``` + +### Optional Parameters + +This Retriever accepts various optional parameters. You can verify the most up-to-date list of parameters in our [API Reference](/reference/integrations-elasticsearch). + +You can pass additional parameters to the underlying BM25 and embedding retriever components using the `top_k_bm25`, `fuzziness`, `filters_bm25`, `scale_score`, `filter_policy_bm25`, `top_k_embedding`, `filters_embedding`, `num_candidates`, and `filter_policy_embedding` parameters. + +The `DocumentJoiner` parameters (`join_mode`, `weights`, `top_k`, and `sort_by_score`) are all exposed directly on the `ElasticsearchHybridRetriever` class. + +## Usage + +### On its own + +This Retriever needs the `ElasticsearchDocumentStore` populated with documents (including embeddings) to run. + +```python +from haystack import Document +from haystack_integrations.components.embedders.sentence_transformers import ( + SentenceTransformersTextEmbedder, + SentenceTransformersDocumentEmbedder, +) +from haystack_integrations.components.retrievers.elasticsearch import ( + ElasticsearchHybridRetriever, +) +from haystack_integrations.document_stores.elasticsearch import ( + ElasticsearchDocumentStore, +) + +document_store = ElasticsearchDocumentStore(hosts="http://localhost:9200/") + +model = "sentence-transformers/all-MiniLM-L6-v2" + +documents = [ + Document(content="There are over 7,000 languages spoken around the world today."), + Document( + content="Elephants have been observed to behave in a way that indicates a high level of self-awareness, such as recognizing themselves in mirrors.", + ), + Document( + content="In certain parts of the world, like the Maldives, Puerto Rico, and San Diego, you can witness the phenomenon of bioluminescent waves.", + ), +] + +doc_embedder = SentenceTransformersDocumentEmbedder(model=model) +docs_with_embeddings = doc_embedder.run(documents) +document_store.write_documents(docs_with_embeddings["documents"]) + +embedder = SentenceTransformersTextEmbedder(model=model) + +retriever = ElasticsearchHybridRetriever( + document_store=document_store, + embedder=embedder, +) + +results = retriever.run(query="How many languages are spoken around the world today?") +print(results["documents"]) +``` + +### In a pipeline + +Here's a full example that uses an indexing pipeline to store documents with embeddings, and a query pipeline that uses `ElasticsearchHybridRetriever` for hybrid retrieval. + +Set your `OPENAI_API_KEY` as an environment variable and then run the following code: + +```python +from haystack import Document, Pipeline +from haystack.components.builders import ChatPromptBuilder +from haystack.components.generators.chat import OpenAIChatGenerator +from haystack_integrations.components.embedders.sentence_transformers import ( + SentenceTransformersDocumentEmbedder, + SentenceTransformersTextEmbedder, +) +from haystack.components.writers import DocumentWriter +from haystack.dataclasses import ChatMessage +from haystack.document_stores.types import DuplicatePolicy +from haystack_integrations.components.retrievers.elasticsearch import ( + ElasticsearchHybridRetriever, +) +from haystack_integrations.document_stores.elasticsearch import ( + ElasticsearchDocumentStore, +) + +document_store = ElasticsearchDocumentStore(hosts="http://localhost:9200/") + +model = "sentence-transformers/all-MiniLM-L6-v2" + +documents = [ + Document(content="There are over 7,000 languages spoken around the world today."), + Document( + content="Elephants have been observed to behave in a way that indicates a high level of self-awareness, such as recognizing themselves in mirrors.", + ), + Document( + content="In certain parts of the world, like the Maldives, Puerto Rico, and San Diego, you can witness the phenomenon of bioluminescent waves.", + ), +] + +# Indexing Pipeline +indexing_pipeline = Pipeline() +indexing_pipeline.add_component( + "doc_embedder", + SentenceTransformersDocumentEmbedder(model=model), +) +indexing_pipeline.add_component( + "doc_writer", + DocumentWriter(document_store=document_store, policy=DuplicatePolicy.SKIP), +) +indexing_pipeline.connect("doc_embedder", "doc_writer") +indexing_pipeline.run({"doc_embedder": {"documents": documents}}) + +# Query Pipeline +prompt_template = [ + ChatMessage.from_user( + """ + Given these documents, answer the question.\nDocuments: + {% for doc in documents %} + {{ doc.content }} + {% endfor %} + + \nQuestion: {{question}} + \nAnswer: + """, + ), +] + +embedder = SentenceTransformersTextEmbedder(model=model) +retriever = ElasticsearchHybridRetriever( + document_store=document_store, + embedder=embedder, + top_k_bm25=3, + top_k_embedding=3, + join_mode="reciprocal_rank_fusion", +) + +query_pipeline = Pipeline() +query_pipeline.add_component("retriever", retriever) +query_pipeline.add_component( + "prompt_builder", + ChatPromptBuilder(template=prompt_template, required_variables="*"), +) +query_pipeline.add_component("llm", OpenAIChatGenerator()) +query_pipeline.connect("retriever.documents", "prompt_builder.documents") +query_pipeline.connect("prompt_builder.prompt", "llm.messages") + +question = "How many languages are spoken around the world today?" +result = query_pipeline.run( + { + "retriever": {"query": question}, + "prompt_builder": {"question": question}, + }, +) + +print(result["llm"]["replies"][0].text) +``` diff --git a/docs-website/versioned_docs/version-2.30/pipeline-components/retrievers/opensearchhybridretriever.mdx b/docs-website/versioned_docs/version-2.30/pipeline-components/retrievers/opensearchhybridretriever.mdx index ac6b2fab26..b95a4253f3 100644 --- a/docs-website/versioned_docs/version-2.30/pipeline-components/retrievers/opensearchhybridretriever.mdx +++ b/docs-website/versioned_docs/version-2.30/pipeline-components/retrievers/opensearchhybridretriever.mdx @@ -15,7 +15,7 @@ A Hybrid Retriever uses both traditional keyword-based search (such as BM25) and | | | | --- | --- | -| Most common position in a pipeline | After an [OpenSearchDocumentStore](../../document-stores/opensearch-document-store.mdx) | +| Most common position in a pipeline | 1. After a TextEmbedder and before a PromptBuilder in a RAG pipeline 2. The last component in a hybrid search pipeline 3. After a TextEmbedder and before an ExtractiveReader in an extractive QA pipeline | | Mandatory init variables | `document_store`: An instance of `OpenSearchDocumentStore` to use for retrieval

`embedder`: Any [Embedder](../embedders.mdx) implementing the `TextEmbedder` protocol | | Mandatory run variables | `query`: A query string | | Output variables | `documents`: A list of documents matching the query | diff --git a/docs-website/versioned_docs/version-2.30/pipeline-components/retrievers/opensearchmetadataretriever.mdx b/docs-website/versioned_docs/version-2.30/pipeline-components/retrievers/opensearchmetadataretriever.mdx new file mode 100644 index 0000000000..609e044b58 --- /dev/null +++ b/docs-website/versioned_docs/version-2.30/pipeline-components/retrievers/opensearchmetadataretriever.mdx @@ -0,0 +1,184 @@ +--- +title: OpenSearchMetadataRetriever +id: opensearchmetadataretriever +slug: /opensearchmetadataretriever +description: Searches and ranks the metadata fields of documents stored in an OpenSearch Document Store and returns the matching metadata values. +--- + +# OpenSearchMetadataRetriever + +Searches and ranks the metadata fields of documents stored in an OpenSearch Document Store and returns the matching metadata values. + +
+ +| | | +| --------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------- | +| **Most common position in a pipeline** | The last component in a metadata lookup pipeline, or wherever you need other structured data from an OpenSearchDocumentStore index | +| **Mandatory init variables** | `document_store`: An instance of `OpenSearchDocumentStore`; `metadata_fields`: List of metadata field names to search and return | +| **Mandatory run variables** | `query`: A search query string (may contain comma-separated parts) | +| **Output variables** | `metadata`: A list of dictionaries containing only the requested metadata fields | +| **API reference** | [OpenSearch](/reference/integrations-opensearch) | +| **GitHub link** | https://github.com/deepset-ai/haystack-core-integrations/tree/main/integrations/opensearch | +| **Package name** | `opensearch-haystack` | + +
+ +## Overview + +`OpenSearchMetadataRetriever` searches the metadata of documents stored in an `OpenSearchDocumentStore` and returns the matching metadata values, not the documents themselves. It is useful when the metadata is the answer: for example, listing the categories or tags that match a partial query, building a metadata autocomplete, or surfacing the structured side of an index without pulling back document content. + +Unlike the other OpenSearch retrievers (`OpenSearchBM25Retriever`, `OpenSearchEmbeddingRetriever`, `OpenSearchHybridRetriever`), this component does not return `Document` objects. The output is a list under `metadata`, where each entry is a dictionary containing only the fields you listed in `metadata_fields`. Document content and any other metadata are excluded from the result. + +The retriever supports two search modes: + +- `strict` uses prefix and wildcard matching on the configured metadata fields. +- `fuzzy` (the default) uses fuzzy matching with `dis_max` queries, allowing typos and partial matches. + +In both modes, candidate documents are scored server-side with Jaccard similarity on character n-grams (the `jaccard_n` parameter controls the n-gram size), and exact matches receive an additional boost controlled by `exact_match_weight`. Up to 1000 hits are fetched from OpenSearch, and the top `top_k` results are returned. + +Both a synchronous `run` method and an asynchronous `run_async` method are available with the same parameters. + +### Field types + +The matching engine only operates on metadata fields that OpenSearch indexes as text or keyword values. Numeric, boolean, and array-of-non-strings fields are not valid search targets, because prefix, wildcard, and full-text matching do not apply to them. Mixed-type fields, such as a list that combines strings and numbers, are also not supported. + + +## Installation + +If you have Docker set up, the easiest way to run OpenSearch is to pull and run the Docker image. + +```bash +docker pull opensearchproject/opensearch:2 +docker run -p 9200:9200 -p 9600:9600 -e "discovery.type=single-node" -e "OPENSEARCH_INITIAL_ADMIN_PASSWORD=" opensearchproject/opensearch:2 +``` + +As an alternative, you can go to the [OpenSearch integration GitHub](https://github.com/deepset-ai/haystack-core-integrations/tree/main/integrations/opensearch) and start a Docker container using the provided `docker-compose.yml`: + +```bash +docker compose up +``` + +Once you have a running OpenSearch instance, install the `opensearch-haystack` integration: + +```bash +pip install opensearch-haystack +``` + +## Usage + +### On its own + +This Retriever needs an `OpenSearchDocumentStore` with indexed documents. The example below writes three documents with simple categorical metadata and queries the `category` and `status` fields: + +```python +from haystack import Document +from haystack_integrations.components.retrievers.opensearch import ( + OpenSearchMetadataRetriever, +) +from haystack_integrations.document_stores.opensearch import OpenSearchDocumentStore +from haystack.document_stores.types import DuplicatePolicy + +document_store = OpenSearchDocumentStore( + hosts="http://localhost:9200", + index="my_index", +) + +documents = [ + Document( + content="Python programming guide", + meta={ + "category": "Python", + "status": "active", + "priority": 1, + "author": "John Doe", + }, + ), + Document( + content="Java tutorial", + meta={ + "category": "Java", + "status": "active", + "priority": 2, + "author": "Jane Smith", + }, + ), + Document( + content="Python advanced topics", + meta={ + "category": "Python", + "status": "inactive", + "priority": 3, + "author": "John Doe", + }, + ), +] + +document_store.write_documents(documents=documents, policy=DuplicatePolicy.SKIP) + +retriever = OpenSearchMetadataRetriever( + document_store=document_store, + metadata_fields=["category", "status"], + top_k=10, +) + +result = retriever.run(query="Python") + +print(result) +# { +# "metadata": [ +# {"category": "Python", "status": "active"}, +# {"category": "Python", "status": "inactive"}, +# ] +# } +``` + +Only the fields listed in `metadata_fields` appear in each result dictionary. The `author` metadata and the document content are excluded. + +### Multi-part queries + +The `query` string can contain several comma-separated parts. Each part is searched across every field listed in `metadata_fields`, and a document that matches multiple parts is ranked higher (controlled by `exact_match_weight`). + +```python +result = retriever.run(query="Python, active") +# Returns the metadata of documents whose fields match both "Python" and "active". +``` + +### Strict mode + +By default the retriever runs in `fuzzy` mode, which tolerates typos and partial matches. For lookups where you only want prefix or wildcard matches and no edit-distance tolerance, switch to `strict`: + +```python +retriever = OpenSearchMetadataRetriever( + document_store=document_store, + metadata_fields=["category"], + mode="strict", +) + +result = retriever.run(query="Pyth") +# Matches "Python" through prefix matching, but not transposed-letter variants. +``` + +The fuzzy-mode parameters (`fuzziness`, `prefix_length`, `max_expansions`, `tie_breaker`) only take effect when `mode="fuzzy"`. + +### Combining with filters + +You can narrow the candidate set before scoring by passing standard Haystack `filters` at run time. The filters are applied in a `bool` `filter` context, so they exclude non-matching documents without affecting scores: + +```python +result = retriever.run( + query="Python", + filters={"field": "status", "operator": "==", "value": "active"}, +) +``` + +### Asynchronous execution + +For pipelines that mix synchronous and asynchronous components, the retriever exposes `run_async` with the same signature: + +```python +result = await retriever.run_async(query="Python, active") +``` + +### Error handling + +By default, a failed OpenSearch request raises an exception. To treat a failure as an empty result instead — for example, when the retriever sits behind a forgiving API — initialize the component with `raise_on_failure=False`. The error is then logged as a warning and `metadata` is returned as an empty list. diff --git a/docs-website/versioned_sidebars/version-2.30-sidebars.json b/docs-website/versioned_sidebars/version-2.30-sidebars.json index 55d212b3b9..cc4bd5b30b 100644 --- a/docs-website/versioned_sidebars/version-2.30-sidebars.json +++ b/docs-website/versioned_sidebars/version-2.30-sidebars.json @@ -409,6 +409,7 @@ "pipeline-components/generators/amazonbedrockgenerator", "pipeline-components/generators/aimllapichatgenerator", "pipeline-components/generators/anthropicchatgenerator", + "pipeline-components/generators/anthropicfoundrychatgenerator", "pipeline-components/generators/anthropicgenerator", "pipeline-components/generators/anthropicvertexchatgenerator", "pipeline-components/generators/azureopenaichatgenerator", @@ -570,6 +571,7 @@ "pipeline-components/retrievers/chromaqueryretriever", "pipeline-components/retrievers/elasticsearchbm25retriever", "pipeline-components/retrievers/elasticsearchembeddingretriever", + "pipeline-components/retrievers/elasticsearchhybridretriever", "pipeline-components/retrievers/elasticsearchsqlretriever", "pipeline-components/retrievers/faissembeddingretriever", "pipeline-components/retrievers/falkordbcypherretriever", @@ -589,6 +591,7 @@ "pipeline-components/retrievers/opensearchbm25retriever", "pipeline-components/retrievers/opensearchembeddingretriever", "pipeline-components/retrievers/opensearchhybridretriever", + "pipeline-components/retrievers/opensearchmetadataretriever", "pipeline-components/retrievers/opensearchsqlretriever", "pipeline-components/retrievers/oracleembeddingretriever", "pipeline-components/retrievers/oraclekeywordretriever", diff --git a/haystack/components/converters/html.py b/haystack/components/converters/html.py index f4770ba0c3..35a702f4c0 100644 --- a/haystack/components/converters/html.py +++ b/haystack/components/converters/html.py @@ -35,7 +35,9 @@ class HTMLToDocument: ``` """ - def __init__(self, extraction_kwargs: dict[str, Any] | None = None, store_full_path: bool = False) -> None: + def __init__( + self, extraction_kwargs: dict[str, Any] | None = None, store_full_path: bool = False, encoding: str = "utf-8" + ) -> None: """ Create an HTMLToDocument component. @@ -45,11 +47,15 @@ class HTMLToDocument: :param store_full_path: If True, the full path of the file is stored in the metadata of the document. If False, only the file name is stored. + :param encoding: + The default encoding to use when converting HTML files. If the encoding is specified in the metadata of a + source ByteStream, it overrides this value. """ trafilatura_import.check() self.extraction_kwargs = extraction_kwargs or {} self.store_full_path = store_full_path + self.encoding = encoding def to_dict(self) -> dict[str, Any]: """ @@ -58,7 +64,9 @@ class HTMLToDocument: :returns: Dictionary with serialized data. """ - return default_to_dict(self, extraction_kwargs=self.extraction_kwargs, store_full_path=self.store_full_path) + return default_to_dict( + self, extraction_kwargs=self.extraction_kwargs, store_full_path=self.store_full_path, encoding=self.encoding + ) @classmethod def from_dict(cls, data: dict[str, Any]) -> "HTMLToDocument": @@ -116,7 +124,8 @@ class HTMLToDocument: continue try: - text = extract(bytestream.data.decode("utf-8"), **merged_extraction_kwargs) + encoding = bytestream.meta.get("encoding", self.encoding) + text = extract(bytestream.data.decode(encoding), **merged_extraction_kwargs) except Exception as conversion_e: logger.warning( "Failed to extract text from {source}. Skipping it. Error: {error}", diff --git a/haystack/components/converters/image/image_utils.py b/haystack/components/converters/image/image_utils.py index 1775ae2aa5..742b08a9ce 100644 --- a/haystack/components/converters/image/image_utils.py +++ b/haystack/components/converters/image/image_utils.py @@ -248,6 +248,18 @@ def _extract_image_sources_info( ) resolved_file_path = Path(root_path, file_path) + + # When root_path is set, ensure the resolved path stays within it to block path-traversal + # payloads (e.g. "../../etc/passwd") coming from document metadata. + if root_path: + resolved_file_path = resolved_file_path.resolve() + resolved_root = Path(root_path).resolve() + if not resolved_file_path.is_relative_to(resolved_root): + raise ValueError( + f"Document with ID '{doc.id}' has a file path '{file_path}' that escapes the " + f"configured root '{root_path}'. Resolved path: '{resolved_file_path}'." + ) + if not resolved_file_path.is_file(): raise ValueError( f"Document with ID '{doc.id}' has an invalid file path '{resolved_file_path}'. " diff --git a/haystack/components/converters/markdown.py b/haystack/components/converters/markdown.py index d7f15bbc5c..ffcd5f78fb 100644 --- a/haystack/components/converters/markdown.py +++ b/haystack/components/converters/markdown.py @@ -52,6 +52,7 @@ class MarkdownToDocument: table_to_single_line: bool = False, progress_bar: bool = True, store_full_path: bool = False, + encoding: str = "utf-8", *, extract_frontmatter: bool = False, ) -> None: @@ -65,6 +66,9 @@ class MarkdownToDocument: :param store_full_path: If True, the full path of the file is stored in the metadata of the document. If False, only the file name is stored. + :param encoding: + The default encoding to use when converting Markdown files. If the encoding is specified in the metadata + of a source ByteStream, it overrides this value. :param extract_frontmatter: If True, YAML frontmatter at the beginning of the Markdown file is removed from the document content and added to the document metadata. @@ -74,6 +78,7 @@ class MarkdownToDocument: self.table_to_single_line = table_to_single_line self.progress_bar = progress_bar self.store_full_path = store_full_path + self.encoding = encoding self.extract_frontmatter = extract_frontmatter @component.output_types(documents=list[Document]) @@ -116,7 +121,8 @@ class MarkdownToDocument: logger.warning("Could not read {source}. Skipping it. Error: {error}", source=source, error=e) continue try: - file_content = bytestream.data.decode("utf-8") + encoding = bytestream.meta.get("encoding", self.encoding) + file_content = bytestream.data.decode(encoding) file_content, frontmatter = self._extract_frontmatter(file_content, source) text = parser.render(file_content) except Exception as conversion_e: diff --git a/haystack/components/generators/chat/fallback.py b/haystack/components/generators/chat/fallback.py index c2083dd9a7..091c4aa5ab 100644 --- a/haystack/components/generators/chat/fallback.py +++ b/haystack/components/generators/chat/fallback.py @@ -9,6 +9,7 @@ from typing import Any from haystack import component, default_from_dict, default_to_dict, logging from haystack.components.generators.chat.types import ChatGenerator from haystack.components.generators.utils import _normalize_messages +from haystack.core.serialization import component_to_dict from haystack.dataclasses import ChatMessage, StreamingCallbackT from haystack.tools import ToolsType from haystack.utils.async_utils import _execute_component_async @@ -61,9 +62,12 @@ class FallbackChatGenerator: self.chat_generators = list(chat_generators) def to_dict(self) -> dict[str, Any]: - """Serialize the component, including nested chat generators when they support serialization.""" + """Serialize the component, including nested chat generators.""" return default_to_dict( - self, chat_generators=[gen.to_dict() for gen in self.chat_generators if hasattr(gen, "to_dict")] + self, + chat_generators=[ + component_to_dict(gen, name=f"chat_generator_{idx}") for idx, gen in enumerate(self.chat_generators) + ], ) @classmethod diff --git a/haystack/components/preprocessors/recursive_splitter.py b/haystack/components/preprocessors/recursive_splitter.py index f8508cd6ae..129ec13309 100644 --- a/haystack/components/preprocessors/recursive_splitter.py +++ b/haystack/components/preprocessors/recursive_splitter.py @@ -405,17 +405,14 @@ class RecursiveDocumentSplitter: def _add_overlap_info(self, curr_pos: int, new_doc: Document, new_docs: list[Document]) -> None: prev_doc = new_docs[-1] - overlap_length = self._chunk_length(prev_doc.content) - (curr_pos - prev_doc.meta["split_idx_start"]) # type: ignore + # curr_pos and split_idx_start are character offsets, so measure the + # overlap and range in characters too (not via _chunk_length, which returns a word/token count). + prev_doc_length = len(prev_doc.content) # type: ignore + overlap_length = prev_doc_length - (curr_pos - prev_doc.meta["split_idx_start"]) if overlap_length > 0: prev_doc.meta["_split_overlap"].append({"doc_id": new_doc.id, "range": (0, overlap_length)}) new_doc.meta["_split_overlap"].append( - { - "doc_id": prev_doc.id, - "range": ( - self._chunk_length(prev_doc.content) - overlap_length, # type: ignore - self._chunk_length(prev_doc.content), # type: ignore - ), - } + {"doc_id": prev_doc.id, "range": (prev_doc_length - overlap_length, prev_doc_length)} ) def _run_one(self, doc: Document) -> list[Document]: diff --git a/haystack/components/retrievers/multi_retriever.py b/haystack/components/retrievers/multi_retriever.py index 47beefe2fc..6a9d87fd4d 100644 --- a/haystack/components/retrievers/multi_retriever.py +++ b/haystack/components/retrievers/multi_retriever.py @@ -82,7 +82,8 @@ class MultiRetriever: *, retrievers: dict[str, TextRetriever], filters: dict[str, Any] | None = None, - top_k: int = 10, + top_k_per_retriever: int | None = None, + top_k: int | None = None, max_workers: int = 4, join_mode: Literal["concatenate", "reciprocal_rank_fusion"] = "reciprocal_rank_fusion", ) -> None: @@ -94,8 +95,14 @@ class MultiRetriever: parallel. :param filters: A dictionary of filters to apply when retrieving documents. + :param top_k_per_retriever: + The maximum number of documents to return per retriever. If set, this will override the `top_k` + parameter for each retriever. If None, the `top_k` parameter of retrievers will be used. :param top_k: - The maximum number of documents to return per retriever. + The maximum number of documents to return overall, extracted from the combined results of all + retrievers. When set, the results are always merged using reciprocal rank fusion (regardless of + `join_mode`) so that the combined list has a consistent global ranking before it is truncated to + `top_k`. If None, all results are returned. :param max_workers: The maximum number of threads to use for parallel retrieval. :param join_mode: @@ -105,20 +112,26 @@ class MultiRetriever: """ self.retrievers = retrievers self.filters = filters + self.top_k_per_retriever = top_k_per_retriever self.top_k = top_k self.max_workers = max_workers self.join_mode = join_mode - def _merge_results(self, document_lists: list[list[Document]]) -> list[Document]: + def _merge_results(self, document_lists: list[list[Document]], top_k: int | None = None) -> list[Document]: """ Merge per-retriever result lists according to `join_mode`. In `concatenate` mode, all lists are flattened and deduplicated. In `reciprocal_rank_fusion` mode, results - are deduplicated and re-scored using RRF, then returned in descending score order. + are deduplicated and re-scored using RRF, then returned in descending score order. When `top_k` is set, RRF + is always used so the combined results have a consistent global ranking, and only the top `top_k` documents + are returned. """ - if self.join_mode == "reciprocal_rank_fusion": + # When top_k is set we always use reciprocal rank fusion to merge the results, regardless of join_mode, + # so that truncation is applied to a consistently ranked list. + if top_k is not None or self.join_mode == "reciprocal_rank_fusion": documents = _reciprocal_rank_fusion(document_lists) - return sorted(documents, key=lambda d: d.score if d.score is not None else -inf, reverse=True) + merged = sorted(documents, key=lambda d: d.score if d.score is not None else -inf, reverse=True) + return merged[:top_k] if top_k is not None else merged return _deduplicate_documents([doc for docs in document_lists for doc in docs]) def _resolve_retrievers(self, active_retrievers: list[str] | None) -> dict[str, TextRetriever]: @@ -184,6 +197,7 @@ class MultiRetriever: self, query: str, filters: dict[str, Any] | None = None, + top_k_per_retriever: int | None = None, top_k: int | None = None, *, active_retrievers: list[str] | None = None, @@ -195,8 +209,15 @@ class MultiRetriever: The query to run the retrievers on. :param filters: Filters to apply. Defaults to the value set at initialization. + :param top_k_per_retriever: + The maximum number of documents to return per retriever. When set, this will override the `top_k` + parameter for each retriever. If None, the `top_k` parameter set for retrievers will be used. + Defaults to the value set at initialization. :param top_k: - Maximum documents to return per retriever. Defaults to the value set at initialization. + The maximum number of documents to return overall, extracted from the combined results of all + retrievers. When set, the results are always merged using reciprocal rank fusion (regardless of + `join_mode`) so that the combined list has a consistent global ranking before it is truncated to + `top_k`. If None, all results are returned. Defaults to the value set at initialization. :param active_retrievers: Names of retrievers to run. Defaults to all. Must match keys in the `retrievers` dictionary. @@ -209,6 +230,9 @@ class MultiRetriever: """ self.warm_up() + resolved_top_k_per_retriever = ( + top_k_per_retriever if top_k_per_retriever is not None else self.top_k_per_retriever + ) resolved_top_k = top_k if top_k is not None else self.top_k resolved_filters = filters if filters is not None else self.filters @@ -216,10 +240,15 @@ class MultiRetriever: results_by_name: dict[str, list[Document]] = {} with ThreadPoolExecutor(max_workers=self.max_workers) as executor: - future_to_name = { - executor.submit(retriever.run, query=query, filters=resolved_filters, top_k=resolved_top_k): name - for name, retriever in retrievers_to_run.items() - } + future_to_name = {} + for name, retriever in retrievers_to_run.items(): + run_kwargs: dict[str, Any] = {"query": query} + if resolved_top_k_per_retriever is not None: + run_kwargs["top_k"] = resolved_top_k_per_retriever + if resolved_filters is not None: + run_kwargs["filters"] = resolved_filters + future_to_name[executor.submit(retriever.run, **run_kwargs)] = name + for future in as_completed(future_to_name): name = future_to_name[future] try: @@ -228,13 +257,14 @@ class MultiRetriever: raise RuntimeError(f"Retriever '{name}' failed: {e}") from e document_lists = [results_by_name[name] for name in retrievers_to_run] - return {"documents": self._merge_results(document_lists)} + return {"documents": self._merge_results(document_lists, top_k=resolved_top_k)} @component.output_types(documents=list[Document]) async def run_async( self, query: str, filters: dict[str, Any] | None = None, + top_k_per_retriever: int | None = None, top_k: int | None = None, *, active_retrievers: list[str] | None = None, @@ -248,8 +278,15 @@ class MultiRetriever: The query to run the retrievers on. :param filters: Filters to apply. Defaults to the value set at initialization. + :param top_k_per_retriever: + The maximum number of documents to return per retriever. When set, this will override the `top_k` + parameter for each retriever. If None, the `top_k` parameter set for retrievers will be used. + Defaults to the value set at initialization. :param top_k: - Maximum documents to return per retriever. Defaults to the value set at initialization. + The maximum number of documents to return overall, extracted from the combined results of all + retrievers. When set, the results are always merged using reciprocal rank fusion (regardless of + `join_mode`) so that the combined list has a consistent global ranking before it is truncated to + `top_k`. If None, all results are returned. Defaults to the value set at initialization. :param active_retrievers: Names of retrievers to run. Defaults to all. Must match keys in the `retrievers` dictionary. @@ -262,22 +299,29 @@ class MultiRetriever: """ await self.warm_up_async() + resolved_top_k_per_retriever = ( + top_k_per_retriever if top_k_per_retriever is not None else self.top_k_per_retriever + ) resolved_top_k = top_k if top_k is not None else self.top_k resolved_filters = filters if filters is not None else self.filters retrievers_to_run = self._resolve_retrievers(active_retrievers) + run_kwargs: dict[str, Any] = {"query": query} + if resolved_top_k_per_retriever is not None: + run_kwargs["top_k"] = resolved_top_k_per_retriever + if resolved_filters is not None: + run_kwargs["filters"] = resolved_filters + async def _run_one(name: str, retriever: TextRetriever) -> list[Document]: try: - result = await _execute_component_async( - retriever, query=query, filters=resolved_filters, top_k=resolved_top_k - ) + result = await _execute_component_async(retriever, **run_kwargs) return result.get("documents", []) except Exception as e: raise RuntimeError(f"Retriever '{name}' failed: {e}") from e document_lists = list(await asyncio.gather(*[_run_one(name, r) for name, r in retrievers_to_run.items()])) - return {"documents": self._merge_results(document_lists)} + return {"documents": self._merge_results(document_lists, top_k=resolved_top_k)} def to_dict(self) -> dict[str, Any]: """ @@ -290,6 +334,7 @@ class MultiRetriever: self, retrievers={name: component_to_dict(obj=r, name=name) for name, r in self.retrievers.items()}, filters=self.filters, + top_k_per_retriever=self.top_k_per_retriever, top_k=self.top_k, max_workers=self.max_workers, join_mode=self.join_mode, diff --git a/haystack/dataclasses/answer.py b/haystack/dataclasses/answer.py index 56ef08f42e..37da0d2c40 100644 --- a/haystack/dataclasses/answer.py +++ b/haystack/dataclasses/answer.py @@ -5,7 +5,6 @@ from dataclasses import asdict, dataclass, field from typing import Any, Optional, Protocol, runtime_checkable -from haystack.core.serialization import default_from_dict, default_to_dict from haystack.dataclasses import ChatMessage, Document from haystack.utils.dataclasses import _warn_on_inplace_mutation @@ -54,20 +53,16 @@ class ExtractedAnswer: :returns: Serialized dictionary representation of the object. """ - document = self.document.to_dict(flatten=False) if self.document is not None else None - document_offset = asdict(self.document_offset) if self.document_offset is not None else None - context_offset = asdict(self.context_offset) if self.context_offset is not None else None - return default_to_dict( - self, - data=self.data, - query=self.query, - document=document, - context=self.context, - score=self.score, - document_offset=document_offset, - context_offset=context_offset, - meta=self.meta, - ) + return { + "data": self.data, + "query": self.query, + "document": self.document.to_dict(flatten=False) if self.document is not None else None, + "context": self.context, + "score": self.score, + "document_offset": asdict(self.document_offset) if self.document_offset is not None else None, + "context_offset": asdict(self.context_offset) if self.context_offset is not None else None, + "meta": self.meta, + } @classmethod def from_dict(cls, data: dict[str, Any]) -> "ExtractedAnswer": @@ -79,16 +74,32 @@ class ExtractedAnswer: :returns: Deserialized object. """ - init_params = data.get("init_parameters", {}) - if (doc := init_params.get("document")) is not None: - data["init_parameters"]["document"] = Document.from_dict(doc) + # backward compat: old format wrapped fields in init_parameters + if "init_parameters" in data: + data = data["init_parameters"] - if (offset := init_params.get("document_offset")) is not None: - data["init_parameters"]["document_offset"] = ExtractedAnswer.Span(**offset) + document = data.get("document") + if document is not None: + document = Document.from_dict(document) - if (offset := init_params.get("context_offset")) is not None: - data["init_parameters"]["context_offset"] = ExtractedAnswer.Span(**offset) - return default_from_dict(cls, data) + document_offset = data.get("document_offset") + if document_offset is not None: + document_offset = ExtractedAnswer.Span(**document_offset) + + context_offset = data.get("context_offset") + if context_offset is not None: + context_offset = ExtractedAnswer.Span(**context_offset) + + return cls( + data=data.get("data"), + query=data["query"], + score=data["score"], + document=document, + context=data.get("context"), + document_offset=document_offset, + context_offset=context_offset, + meta=data.get("meta", {}), + ) @_warn_on_inplace_mutation @@ -110,17 +121,18 @@ class GeneratedAnswer: :returns: Serialized dictionary representation of the object. """ - documents = [doc.to_dict(flatten=False) for doc in self.documents] - - # Serialize ChatMessage objects to dicts + # all_messages is either a list of ChatMessage objects or a list of strings meta = self.meta all_messages = meta.get("all_messages") - - # all_messages is either a list of ChatMessage objects or a list of strings if all_messages and isinstance(all_messages[0], ChatMessage): meta = {**meta, "all_messages": [msg.to_dict() for msg in all_messages]} - return default_to_dict(self, data=self.data, query=self.query, documents=documents, meta=meta) + return { + "data": self.data, + "query": self.query, + "documents": [doc.to_dict(flatten=False) for doc in self.documents], + "meta": meta, + } @classmethod def from_dict(cls, data: dict[str, Any]) -> "GeneratedAnswer": @@ -133,14 +145,15 @@ class GeneratedAnswer: :returns: Deserialized object. """ - init_params = data.get("init_parameters", {}) + # backward compatibility: old format wrapped fields in init_parameters + if "init_parameters" in data: + data = data["init_parameters"] - if (documents := init_params.get("documents")) is not None: - init_params["documents"] = [Document.from_dict(d) for d in documents] + documents = [Document.from_dict(d) for d in data.get("documents", [])] - meta = init_params.get("meta", {}) + # copy to avoid mutating the caller's input dict when converting all_messages + meta = dict(data.get("meta", {})) if (all_messages := meta.get("all_messages")) and isinstance(all_messages[0], dict): meta["all_messages"] = [ChatMessage.from_dict(m) for m in all_messages] - init_params["meta"] = meta - return default_from_dict(cls, data) + return cls(data=data["data"], query=data["query"], documents=documents, meta=meta) diff --git a/haystack/utils/auth.py b/haystack/utils/auth.py index 2c575a687d..d26794fd19 100644 --- a/haystack/utils/auth.py +++ b/haystack/utils/auth.py @@ -162,6 +162,10 @@ class TokenSecret(Secret): "Cannot deserialize token-based secret. Use an alternative secret type like environment variables." ) + def __repr__(self) -> str: + # Hide the token so it can't leak through print/log/traceback formatting. + return f"TokenSecret(_token=, _type={self._type!r})" + def resolve_value(self) -> Any | None: """Return the token.""" return self._token diff --git a/haystack/utils/filters.py b/haystack/utils/filters.py index 5d89e9eefa..7443bcc14c 100644 --- a/haystack/utils/filters.py +++ b/haystack/utils/filters.py @@ -173,6 +173,9 @@ def _logic_condition(condition: dict[str, Any], document: Document | ByteStream) msg = f"'conditions' key missing in {condition}" raise FilterError(msg) operator: str = condition["operator"] + if operator not in LOGICAL_OPERATORS: + msg = f"Unknown logical operator '{operator}'. Valid operators are: {sorted(LOGICAL_OPERATORS)}" + raise FilterError(msg) conditions: list[dict[str, Any]] = condition["conditions"] return LOGICAL_OPERATORS[operator](document=document, conditions=conditions) @@ -214,5 +217,8 @@ def _comparison_condition(condition: dict[str, Any], document: Document | ByteSt else: document_value = getattr(document, field) operator: str = condition["operator"] + if operator not in COMPARISON_OPERATORS: + msg = f"Unknown comparison operator '{operator}'. Valid operators are: {sorted(COMPARISON_OPERATORS)}" + raise FilterError(msg) filter_value: Any = condition["value"] return COMPARISON_OPERATORS[operator](filter_value=filter_value, value=document_value) diff --git a/haystack/utils/http_client.py b/haystack/utils/http_client.py index 61d323172c..7b198e4c4a 100644 --- a/haystack/utils/http_client.py +++ b/haystack/utils/http_client.py @@ -7,22 +7,14 @@ from typing import Any, Literal, overload import httpx -@overload -def init_http_client(http_client_kwargs: dict[str, Any], async_client: Literal[False]) -> httpx.Client: ... @overload def init_http_client( - http_client_kwargs: dict[str, Any] | None, async_client: Literal[False] + http_client_kwargs: dict[str, Any] | None = ..., async_client: Literal[False] = ... ) -> httpx.Client | None: ... @overload -def init_http_client(http_client_kwargs: dict[str, Any], async_client: Literal[True]) -> httpx.AsyncClient: ... -@overload def init_http_client( - http_client_kwargs: dict[str, Any] | None, async_client: Literal[True] + http_client_kwargs: dict[str, Any] | None = ..., async_client: Literal[True] = ... ) -> httpx.AsyncClient | None: ... -@overload -def init_http_client( - http_client_kwargs: dict[str, Any] | None, async_client: bool -) -> httpx.Client | httpx.AsyncClient | None: ... def init_http_client( http_client_kwargs: dict[str, Any] | None = None, async_client: bool = False ) -> httpx.Client | httpx.AsyncClient | None: diff --git a/pyproject.toml b/pyproject.toml index 51d39e04ee..cd6e7262c6 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -149,7 +149,7 @@ all = 'pytest {args:test}' e2e = 'pytest {args:e2e}' # TODO We want to eventually type the whole test folder -types = "mypy --install-types --non-interactive --cache-dir=.mypy_cache/ {args:haystack test/core/ test/marshal/ test/testing/ test/tracing/ test/tools/ test/human_in_the_loop test/evaluation test/document_stores test/dataclasses}" +types = "mypy --install-types --non-interactive --cache-dir=.mypy_cache/ {args:haystack test/core/ test/marshal/ test/testing/ test/tracing/ test/tools/ test/human_in_the_loop test/evaluation test/document_stores test/dataclasses test/utils/}" [project.urls] "CI: GitHub" = "https://github.com/deepset-ai/haystack/actions" @@ -174,7 +174,7 @@ packages = ["haystack"] [tool.codespell] ignore-words-list = "ans,astroid,nd,ned,nin,ue,rouge,ist, Claus,SME" quiet-level = 3 -skip = "./test,./e2e,*.svg,*/abbreviations/*,*/package-lock.json" +skip = "./test,./e2e,*.svg,*/abbreviations/*" [tool.pytest.ini_options] minversion = "6.0" diff --git a/releasenotes/notes/filter-unknown-operator-error-8df4039c0db976ff.yaml b/releasenotes/notes/filter-unknown-operator-error-8df4039c0db976ff.yaml new file mode 100644 index 0000000000..d3c566bf04 --- /dev/null +++ b/releasenotes/notes/filter-unknown-operator-error-8df4039c0db976ff.yaml @@ -0,0 +1,8 @@ +--- +fixes: + - | + Metadata filters that use an unsupported operator now raise a clear ``FilterError`` + that lists the valid operators, instead of a cryptic ``KeyError``. For example, a + typo such as ``{"field": "meta.year", "operator": "gt", "value": 2000}`` (instead of + ``">"``) previously surfaced as ``KeyError: 'gt'``. This applies to both comparison + operators and logical operators (``AND``, ``OR``, ``NOT``). diff --git a/releasenotes/notes/fix-dataclasses-deseria-0bb839b5edd3fca6.yaml b/releasenotes/notes/fix-dataclasses-deseria-0bb839b5edd3fca6.yaml new file mode 100644 index 0000000000..c13d586fa5 --- /dev/null +++ b/releasenotes/notes/fix-dataclasses-deseria-0bb839b5edd3fca6.yaml @@ -0,0 +1,8 @@ +--- +fixes: + - | + ``GeneratedAnswer`` and ``ExtractedAnswer`` now serialize to the same flat format as + all other Haystack dataclasses (``Document``, ``ChatMessage``, etc.), removing an + inconsistency that caused redundant type metadata to be embedded in pipeline + snapshots and ``State`` objects. Deserialization is backward compatible: ``from_dict()`` + still accepts the old ``{"type": "...", "init_parameters": {...}}`` format. diff --git a/releasenotes/notes/fix-multiretriever-params-c893b8d7e41afde4.yaml b/releasenotes/notes/fix-multiretriever-params-c893b8d7e41afde4.yaml new file mode 100644 index 0000000000..f8aa56deca --- /dev/null +++ b/releasenotes/notes/fix-multiretriever-params-c893b8d7e41afde4.yaml @@ -0,0 +1,6 @@ +--- +fixes: + - | + Update parameters in MultiRetriever to allow for more flexible retrieval of documents. Changes include: + - ``top_k_per_retriever``: Allows specifying the maximum number of documents to return per retriever + - ``top_k``: Allows specifying the maximum number of documents to be retrieved from combined results of all retrievers diff --git a/releasenotes/notes/fix-recursive-splitter-word-token-overlap-metadata-9f3c1a7be0d24856.yaml b/releasenotes/notes/fix-recursive-splitter-word-token-overlap-metadata-9f3c1a7be0d24856.yaml new file mode 100644 index 0000000000..24d9622419 --- /dev/null +++ b/releasenotes/notes/fix-recursive-splitter-word-token-overlap-metadata-9f3c1a7be0d24856.yaml @@ -0,0 +1,9 @@ +--- +fixes: + - | + Fixed ``RecursiveDocumentSplitter`` not populating the ``_split_overlap`` + metadata when ``split_unit`` is ``"word"`` or ``"token"`` and ``split_overlap`` + is greater than 0. The overlap length was computed with a word/token count + while the offsets it is compared against are character positions, so it + became negative and the overlap metadata was silently dropped. The overlap + is now measured in characters, matching the ranges it records. diff --git a/releasenotes/notes/fix_fallback_chat_generator_serialization-9498ee2bbe2971be.yaml b/releasenotes/notes/fix_fallback_chat_generator_serialization-9498ee2bbe2971be.yaml new file mode 100644 index 0000000000..aa6968dbab --- /dev/null +++ b/releasenotes/notes/fix_fallback_chat_generator_serialization-9498ee2bbe2971be.yaml @@ -0,0 +1,5 @@ +--- +fixes: + - | + Fixed serialization of ``FallbackChatGenerator`` to use the standard ``component_to_dict`` serialization path. This ensures custom chat generator components without an explicit ``to_dict`` method are no longer silently omitted from the serialized ``chat_generators`` list. + diff --git a/releasenotes/notes/html-md-converter-encoding-87047137c613d143.yaml b/releasenotes/notes/html-md-converter-encoding-87047137c613d143.yaml new file mode 100644 index 0000000000..2e655bc6a5 --- /dev/null +++ b/releasenotes/notes/html-md-converter-encoding-87047137c613d143.yaml @@ -0,0 +1,8 @@ +--- +fixes: + - | + ``HTMLToDocument`` and ``MarkdownToDocument`` now accept an ``encoding`` parameter (default + ``"utf-8"``) and honour ``ByteStream.meta["encoding"]`` at run time, mirroring the + behaviour of ``TextFileToDocument``. Previously both converters hardcoded + ``decode("utf-8")``, causing ``UnicodeDecodeError`` for non-UTF-8 sources whose + encoding was supplied via ``ByteStream`` metadata. diff --git a/releasenotes/notes/image_utils-path-traversal-guard-951e4271322a3bf5.yaml b/releasenotes/notes/image_utils-path-traversal-guard-951e4271322a3bf5.yaml new file mode 100644 index 0000000000..db829f8fa9 --- /dev/null +++ b/releasenotes/notes/image_utils-path-traversal-guard-951e4271322a3bf5.yaml @@ -0,0 +1,7 @@ +--- +security: + - | + Fixed a path-traversal issue in ``DocumentToImageContent`` and ``LLMDocumentContentExtractor``. + When ``root_path`` is set, a ``file_path`` in document metadata that escapes the root (via + ``../`` or an absolute path) now raises a ``ValueError`` before any file is read, preventing + attacker-controlled metadata from reading arbitrary files on the host. diff --git a/releasenotes/notes/redact-tokensecret-repr-34c7549247f4b6e4.yaml b/releasenotes/notes/redact-tokensecret-repr-34c7549247f4b6e4.yaml new file mode 100644 index 0000000000..5091475897 --- /dev/null +++ b/releasenotes/notes/redact-tokensecret-repr-34c7549247f4b6e4.yaml @@ -0,0 +1,8 @@ +--- +security: + - | + The ``repr()`` of a ``Secret`` built via ``Secret.from_token(...)`` no longer + includes the raw token. Previously the dataclass-generated repr printed the + token verbatim, so any path that formats a component's locals — exception + tracebacks, ``print()``, Jupyter echo, log aggregators — could leak the API + key. The token is now rendered as ````. diff --git a/scripts/generate_platform_components_table.py b/scripts/generate_platform_components_table.py new file mode 100644 index 0000000000..e3ec95ca1e --- /dev/null +++ b/scripts/generate_platform_components_table.py @@ -0,0 +1,403 @@ +# SPDX-FileCopyrightText: 2022-present deepset GmbH +# +# SPDX-License-Identifier: Apache-2.0 + +""" +Generate a Haystack Enterprise Platform Components MDX table. + +Scans deepset-ai/haystack and deepset-ai/haystack-core-integrations for classes +decorated with @component, cross-references them against the platform component +schema (schema-full-component-list.json from deepset-ai/haystack-runtime), and +writes a formatted MDX page. +""" + +from __future__ import annotations + +import argparse +import ast +import json +import logging +import sys +from pathlib import Path + +logging.basicConfig(level=logging.INFO, format="%(levelname)s: %(message)s") +logger = logging.getLogger(__name__) + +# Maps schema `family` value / module path segment → display type name +TYPE_MAP: dict[str, str] = { + "generators": "Generator", + "retrievers": "Retriever", + "embedders": "Embedder", + "converters": "Converter", + "rankers": "Ranker", + "document_stores": "Document Store", + "preprocessors": "Preprocessor", + "readers": "Reader", + "routers": "Router", + "joiners": "Joiner", + "builders": "Builder", + "classifiers": "Classifier", + "extractors": "Extractor", + "samplers": "Sampler", + "writers": "Writer", + "connectors": "Connector", + "fetchers": "Fetcher", + "validators": "Validator", + "audio": "Audio", +} + +# Human-readable partner labels; snake_case partner keys → display name. +# Keys that map to the same value are intentionally merged into one section. +PARTNER_LABELS: dict[str, str] = { + "aimlapi": "AIML API", + "alloydb": "AlloyDB", + "amazon_bedrock": "Amazon Bedrock", + "amazon_sagemaker": "Amazon SageMaker", + "amazon_textract": "Amazon Textract", + "anthropic": "Anthropic", + "arcadedb": "ArcadeDB", + "astra": "Astra", + "azure_ai_search": "Azure AI Search", + "azure_doc_intelligence": "Azure Document Intelligence", + "brave": "Brave", + "chroma": "Chroma", + "cohere": "Cohere", + "docling": "Docling", + "docling_serve": "Docling", # merged with docling + "elasticsearch": "Elasticsearch", + "falkordb": "FalkorDB", + "fastembed": "FastEmbed", + "firecrawl": "Firecrawl", + "github": "GitHub", + "google_genai": "Google Generative AI", + "huggingface_api": "Hugging Face API", + "jina": "Jina AI", + "langfuse": "Langfuse", + "lara": "Lara", + "litellm": "LiteLLM", + "llama_cpp": "Llama.cpp", + "llama_stack": "Llama Stack", + "markitdown": "MarkItDown", + "mem0": "Mem0", + "meta_llama": "Meta Llama", + "mistral": "Mistral", + "mongodb_atlas": "MongoDB Atlas", + "nvidia": "NVIDIA", + "ollama": "Ollama", + "opensearch": "OpenSearch", + "openrouter": "OpenRouter", + "oracle": "Oracle", + "perplexity": "Perplexity", + "pgvector": "pgvector", + "pinecone": "Pinecone", + "presidio": "Presidio", + "pyversity": "Pyversity", + "qdrant": "Qdrant", + "s3": "Amazon S3", + "snowflake": "Snowflake", + "sqlalchemy": "SQLAlchemy", + "stackit": "STACKIT", + "supabase": "Supabase", + "tavily": "Tavily", + "togetherai": "TogetherAI", + "unstructured": "Unstructured", + "valkey": "Valkey", + "vespa": "Vespa", + "vllm": "vLLM", + "voyage": "Voyage AI", + "voyage_embedders": "Voyage AI", # merged with voyage + "weave": "Weights & Biases (Weave)", + "weaviate": "Weaviate", +} + +_HAYSTACK_DOCS_BASE = "https://docs.haystack.deepset.ai" +_HAYSTACK_DOCS_PREFIX = "/docs" # Docusaurus routeBasePath + +# Namespaces that must never appear in public documentation +_EXCLUDED_NAMESPACES = ("deepset_cloud_custom_nodes.", "studio_internal.", "haystack_experimental.", "deepl_haystack.") + +# Individual class names to exclude regardless of namespace +_EXCLUDED_CLASS_NAMES = { + "SuperComponent", # internal base class, not a user-facing component + "LLM", # alias not present in Haystack OS +} + +# Sets allow O(1) membership tests +_PACKAGE_ROOTS: set[str] = {"haystack_integrations", "haystack"} +_COMPONENT_DECORATORS: set[str] = {"component", "super_component"} + + +# ── Component type helpers ──────────────────────────────────────────────────── + + +def infer_type(family: str | None, fqn: str) -> str: + """Return a human-readable type string from the schema family or FQN path segments.""" + if family and family in TYPE_MAP: + return TYPE_MAP[family] + return next((TYPE_MAP[seg] for seg in fqn.split(".") if seg in TYPE_MAP), "Component") + + +def partner_label_for(fqn: str) -> str | None: + """Return the display-name partner label for a ``haystack_integrations.*`` FQN.""" + parts = fqn.split(".") + # haystack_integrations . components . . . … + if len(parts) < 4: + return None + key = parts[3] + return PARTNER_LABELS.get(key, key.replace("_", " ").title()) + + +# ── Docs-site link map ──────────────────────────────────────────────────────── + + +def _parse_frontmatter(text: str) -> dict[str, str]: + """Extract key-value pairs from YAML-style frontmatter delimited by ``---``.""" + if not text.startswith("---"): + return {} + try: + end = text.index("---", 3) + except ValueError: + return {} + result: dict[str, str] = {} + for line in text[3:end].splitlines(): + if ":" in line: + key, _, value = line.partition(":") + result[key.strip()] = value.strip().strip('"') + return result + + +def scan_docs_links(docs_src: Path) -> dict[str, str]: + """ + Scan docs-website MDX files and return ``{component_title: absolute_url}``. + + Reads only the first 1 KB of each file — enough to cover the frontmatter — + avoiding the cost of loading large MDX files in full. + """ + link_map: dict[str, str] = {} + for mdx_file in docs_src.rglob("*.mdx"): + try: + with mdx_file.open(encoding="utf-8") as fh: + head = fh.read(1024) + except OSError: + continue + fm = _parse_frontmatter(head) + title = fm.get("title", "") + slug = fm.get("slug", "") + if title and slug: + link_map[title] = f"{_HAYSTACK_DOCS_BASE}{_HAYSTACK_DOCS_PREFIX}{slug}" + return link_map + + +# ── Source-scanning helpers ─────────────────────────────────────────────────── + + +def has_component_decorator(node: ast.ClassDef) -> bool: + """Return True if *node* has a ``@component`` or ``@super_component`` decorator.""" + for dec in node.decorator_list: + if isinstance(dec, ast.Name) and dec.id in _COMPONENT_DECORATORS: + return True + if isinstance(dec, ast.Call) and isinstance(dec.func, ast.Name) and dec.func.id in _COMPONENT_DECORATORS: + return True + return False + + +def compute_module_path(file_path: Path, repo_root: Path) -> str | None: + """Convert a ``.py`` file path to a dotted Python module path.""" + try: + parts = list(file_path.relative_to(repo_root).with_suffix("").parts) + except ValueError: + return None + if parts and parts[-1] == "__init__": + parts.pop() + start = next((i for i, p in enumerate(parts) if p in _PACKAGE_ROOTS), None) + return ".".join(parts[start:]) if start is not None else None + + +def scan_for_components(scan_dir: Path, repo_root: Path) -> set[str]: + """Scan *scan_dir* for Python files with ``@component``-decorated classes.""" + found: set[str] = set() + py_files = list(scan_dir.rglob("*.py")) + logger.info("Scanned %d Python files in %s", len(py_files), scan_dir) + + for py_file in py_files: + module_path = compute_module_path(py_file, repo_root) + if module_path is None: + continue + try: + source = py_file.read_text(encoding="utf-8") + except UnicodeDecodeError: + continue + # Fast pre-filter: skip files with no decorator mention at all + if "@component" not in source and "@super_component" not in source: + continue + try: + tree = ast.parse(source, filename=str(py_file)) + except SyntaxError as exc: + logger.warning("Could not parse %s: %s", py_file, exc) + continue + for node in ast.walk(tree): + if isinstance(node, ast.ClassDef) and has_component_decorator(node): + found.add(f"{module_path}.{node.name}") + + return found + + +# ── Schema loading ──────────────────────────────────────────────────────────── + + +def load_platform_components(schema_path: Path) -> dict[str, dict]: + """Parse ``schema-full-component-list.json`` and return public components.""" + all_defs: dict = json.loads(schema_path.read_text(encoding="utf-8")).get("definitions", {}).get("Components", {}) + result: dict[str, dict] = {} + for fqn, defn in all_defs.items(): + if any(fqn.startswith(ns) for ns in _EXCLUDED_NAMESPACES): + continue + if not fqn.startswith(("haystack.", "haystack_integrations.")): + continue + if fqn.split(".")[-1] in _EXCLUDED_CLASS_NAMES: + continue + type_props = defn.get("properties", {}).get("type", {}) + result[fqn] = {"title": defn.get("title", fqn.split(".")[-1]), "family": type_props.get("family", "")} + return result + + +# ── MDX generation ──────────────────────────────────────────────────────────── + + +def build_mdx( + platform_components: dict[str, dict], source_components: set[str], docs_link_map: dict[str, str] | None = None +) -> str: + """Render the MDX page content.""" + _link_map = docs_link_map or {} + core_fqns: list[str] = [] + partner_components: dict[str, list[str]] = {} + visible_count = 0 + + for fqn in platform_components: + if fqn not in source_components: + logger.warning("Schema component not found in source scan: %s", fqn) + continue + cls = fqn.split(".")[-1] + if cls.endswith("Generator") and not cls.endswith("ChatGenerator"): + continue + visible_count += 1 + if fqn.startswith("haystack_integrations."): + partner_components.setdefault(partner_label_for(fqn) or "Other", []).append(fqn) + else: + core_fqns.append(fqn) + + def render_table(fqns: list[str]) -> list[str]: + rows = [ + "| Component | Type | Haystack Enterprise Platform |", + "|-----------|------|------------------------------|", + ] + for fqn in sorted(fqns, key=lambda x: x.split(".")[-1].lower()): + meta = platform_components[fqn] + name = meta["title"] + link = _link_map.get(name, "") + name_cell = f"[{name}]({link})" if link else name + rows.append(f"| {name_cell} | {infer_type(meta.get('family'), fqn)} | ✅ Available |") + return rows + + sections: list[str] = [ + "---", + 'title: "Haystack Enterprise Components"', + "id: platform-components", + 'slug: "/platform-components"', + 'description: "A complete list of Haystack components available on the Haystack Enterprise Platform,' + ' grouped by integration partner."', + "---", + "", + "# Haystack Enterprise Components", + "", + f"The Haystack Enterprise Platform currently supports **{visible_count} components**" + f" and **{len(partner_components)} integrations**." + " The following table lists them grouped by integration partner.", + "", + ] + + if core_fqns: + sections += ["## Core Components", "", *render_table(core_fqns), ""] + + for label in sorted(partner_components, key=str.lower): + sections += [f"## {label}", "", *render_table(partner_components[label]), ""] + + return "\n".join(sections) + + +# ── Entry point ─────────────────────────────────────────────────────────────── + + +def main(argv: list[str] | None = None) -> None: + """Entry point: parse arguments, run the scan, and write the MDX file.""" + parser = argparse.ArgumentParser(description="Generate the Haystack Enterprise Platform Components MDX table.") + parser.add_argument( + "--haystack-src", required=True, type=Path, metavar="PATH", help="Root of the deepset-ai/haystack checkout." + ) + parser.add_argument( + "--integrations-src", + required=True, + type=Path, + metavar="PATH", + help="Root of the deepset-ai/haystack-core-integrations checkout.", + ) + parser.add_argument( + "--schema", required=True, type=Path, metavar="PATH", help="Path to schema JSON file in the platform repo." + ) + parser.add_argument( + "--output", + type=Path, + metavar="PATH", + default=Path("docs-website/docs/overview/platform-components.mdx"), + help="Destination .mdx file path (default: docs-website/docs/overview/platform-components.mdx).", + ) + parser.add_argument( + "--dry-run", action="store_true", help="Print generated content to stdout instead of writing the file." + ) + + args = parser.parse_args(argv) + + for path, flag in [ + (args.haystack_src, "--haystack-src"), + (args.integrations_src, "--integrations-src"), + (args.schema, "--schema"), + ]: + if not path.exists(): + print(f"ERROR: {flag} path does not exist: {path}", file=sys.stderr) + sys.exit(1) + + try: + platform_components = load_platform_components(args.schema) + except (json.JSONDecodeError, OSError) as exc: + print(f"ERROR: Cannot load schema file: {exc}", file=sys.stderr) + sys.exit(1) + + haystack_pkg = args.haystack_src / "haystack" + source_components = scan_for_components( + haystack_pkg if haystack_pkg.is_dir() else args.haystack_src, args.haystack_src + ) + integrations_pkg = args.integrations_src / "integrations" + source_components |= scan_for_components( + integrations_pkg if integrations_pkg.is_dir() else args.integrations_src, args.integrations_src + ) + + logger.info("Platform components in schema (public namespaces): %d", len(platform_components)) + logger.info("Components matched to source scan: %d", sum(1 for f in platform_components if f in source_components)) + + docs_src = args.haystack_src / "docs-website" / "docs" + if not docs_src.is_dir(): + logger.warning("docs-website/docs not found under --haystack-src, component links will be omitted") + docs_link_map = scan_docs_links(docs_src) if docs_src.is_dir() else {} + + mdx = build_mdx(platform_components, source_components, docs_link_map) + + if args.dry_run: + print(mdx) + else: + args.output.parent.mkdir(parents=True, exist_ok=True) + args.output.write_text(mdx, encoding="utf-8") + logger.info("Written to %s", args.output) + + +if __name__ == "__main__": + main() diff --git a/test/components/converters/image/test_image_utils.py b/test/components/converters/image/test_image_utils.py index 6fb37c1edb..ac455f1642 100644 --- a/test/components/converters/image/test_image_utils.py +++ b/test/components/converters/image/test_image_utils.py @@ -149,6 +149,31 @@ class TestExtractImageSourcesInfo: with pytest.raises(ValueError, match="missing the 'page_number' key"): _extract_image_sources_info(documents=[document], file_path_meta_field="file_path", root_path="") + def test_extract_image_source_info_rejects_path_traversal(self, test_files_path): + # Attacker-controlled document metadata attempts to escape the configured root. + document = Document(content="test", meta={"file_path": "../../../../../../etc/passwd"}) + with pytest.raises(ValueError, match="escapes the configured root"): + _extract_image_sources_info( + documents=[document], file_path_meta_field="file_path", root_path=str(test_files_path / "images") + ) + + def test_extract_image_source_info_rejects_absolute_outside_root(self, test_files_path): + # Absolute path that lies outside the configured root must be rejected before any IO. + document = Document(content="test", meta={"file_path": "/etc/passwd"}) + with pytest.raises(ValueError, match="escapes the configured root"): + _extract_image_sources_info( + documents=[document], file_path_meta_field="file_path", root_path=str(test_files_path / "images") + ) + + def test_extract_image_source_info_accepts_path_inside_root(self, test_files_path): + # When the resolved path is inside the configured root, processing must succeed. + document = Document(content="test", meta={"file_path": "haystack-logo.png"}) + images_source_info = _extract_image_sources_info( + documents=[document], file_path_meta_field="file_path", root_path=str(test_files_path / "images") + ) + assert len(images_source_info) == 1 + assert images_source_info[0]["mime_type"] == "image/png" + class TestBatchConvertPdfPagesToImages: @patch("haystack.components.converters.image.image_utils._convert_pdf_to_images") diff --git a/test/components/converters/test_html_to_document.py b/test/components/converters/test_html_to_document.py index b32509ce4b..53ca7a1b10 100644 --- a/test/components/converters/test_html_to_document.py +++ b/test/components/converters/test_html_to_document.py @@ -192,14 +192,44 @@ class TestHTMLToDocument: for doc in docs: assert "Haystack" in doc.content + def test_bytestream_encoding_from_meta(self): + """ + Test that a non-UTF-8 ByteStream is decoded using the encoding specified in its meta. + """ + # "caf\xe9" is "café" in latin-1; decoding as utf-8 would raise UnicodeDecodeError. + latin1_html = b"

caf\xe9

" + bytestream = ByteStream(data=latin1_html, meta={"encoding": "latin-1"}) + + converter = HTMLToDocument() + results = converter.run(sources=[bytestream]) + docs = results["documents"] + + assert len(docs) == 1 + assert "café" in docs[0].content + + def test_bytestream_encoding_from_init(self): + """ + Test that the encoding passed to __init__ is used as a fallback when not set in ByteStream meta. + """ + latin1_html = b"

caf\xe9

" + bytestream = ByteStream(data=latin1_html) + + converter = HTMLToDocument(encoding="latin-1") + results = converter.run(sources=[bytestream]) + docs = results["documents"] + + assert len(docs) == 1 + assert "café" in docs[0].content + def test_serde(self): """ Test if the component runs correctly gets serialized and deserialized. """ - converter = HTMLToDocument() + converter = HTMLToDocument(encoding="latin-1") serde_data = converter.to_dict() new_converter = HTMLToDocument.from_dict(serde_data) assert new_converter.extraction_kwargs == converter.extraction_kwargs + assert new_converter.encoding == converter.encoding def test_run_difficult_html(self, test_files_path): converter = HTMLToDocument() diff --git a/test/components/converters/test_markdown_to_document.py b/test/components/converters/test_markdown_to_document.py index a427d7c655..19a86e8d58 100644 --- a/test/components/converters/test_markdown_to_document.py +++ b/test/components/converters/test_markdown_to_document.py @@ -16,6 +16,7 @@ class TestMarkdownToDocument: converter = MarkdownToDocument() assert converter.table_to_single_line is False assert converter.progress_bar is True + assert converter.encoding == "utf-8" assert converter.extract_frontmatter is False def test_init_params_custom(self): @@ -201,3 +202,32 @@ class TestMarkdownToDocument: for doc in docs: assert "What to build with Haystack" in doc.content assert "# git clone https://github.com/deepset-ai/haystack.git" in doc.content + + def test_bytestream_encoding_from_meta(self): + """ + Test that a non-UTF-8 ByteStream is decoded using the encoding specified in its meta. + """ + # "caf\xe9" is "café" in latin-1; decoding as utf-8 would raise UnicodeDecodeError. + latin1_md = "# caf\xe9".encode("latin-1") + bytestream = ByteStream(data=latin1_md, meta={"encoding": "latin-1"}) + + converter = MarkdownToDocument(progress_bar=False) + output = converter.run(sources=[bytestream]) + docs = output["documents"] + + assert len(docs) == 1 + assert "café" in docs[0].content + + def test_bytestream_encoding_from_init(self): + """ + Test that the encoding passed to __init__ is used as a fallback when not set in ByteStream meta. + """ + latin1_md = "# caf\xe9".encode("latin-1") + bytestream = ByteStream(data=latin1_md) + + converter = MarkdownToDocument(encoding="latin-1", progress_bar=False) + output = converter.run(sources=[bytestream]) + docs = output["documents"] + + assert len(docs) == 1 + assert "café" in docs[0].content diff --git a/test/components/generators/chat/test_fallback.py b/test/components/generators/chat/test_fallback.py index ceaa023843..c654e20922 100644 --- a/test/components/generators/chat/test_fallback.py +++ b/test/components/generators/chat/test_fallback.py @@ -12,6 +12,7 @@ import pytest from haystack import component, default_from_dict, default_to_dict from haystack.components.generators.chat.fallback import FallbackChatGenerator +from haystack.core.errors import SerializationError from haystack.dataclasses import ChatMessage, StreamingCallbackT from haystack.tools import ToolsType @@ -428,3 +429,61 @@ class TestComponentLifecycle: fallback = FallbackChatGenerator(chat_generators=gens) fallback.warm_up() fallback.close() + + +@component +class CustomGeneratorWithoutSerDe: + def __init__(self, text: str = "custom_ok"): + self.text = text + + def run( + self, + messages: list[ChatMessage], + generation_kwargs: dict[str, Any] | None = None, + tools: ToolsType | None = None, + streaming_callback: StreamingCallbackT | None = None, + ) -> dict[str, Any]: + return {"replies": [ChatMessage.from_assistant(self.text)], "meta": {}} + + +@component +class NonSerializableGenerator: + def __init__(self, non_serializable_arg: Any): + self.non_serializable_arg = non_serializable_arg + + def run(self, messages: list[ChatMessage]) -> dict[str, Any]: + return {"replies": []} + + +def test_serialization_with_custom_generators_without_to_dict(): + # 1. Test mixed chain serialization, order preservation, execution, and round-trip + gen0 = _DummySuccessGen(text="dummy_has_dict") + gen1 = CustomGeneratorWithoutSerDe(text="custom_no_dict_1") + gen2 = CustomGeneratorWithoutSerDe(text="custom_no_dict_2") + + original = FallbackChatGenerator(chat_generators=[gen0, gen1, gen2]) + data = original.to_dict() + + # Ensure all three components are serialized and not silently omitted + assert len(data["init_parameters"]["chat_generators"]) == 3 + + # Reconstruct/Deserialize + restored = FallbackChatGenerator.from_dict(data) + assert isinstance(restored, FallbackChatGenerator) + assert len(restored.chat_generators) == 3 + + # Assert fallback order is exactly preserved + assert restored.chat_generators[0].text == "dummy_has_dict" + assert restored.chat_generators[1].text == "custom_no_dict_1" + assert restored.chat_generators[2].text == "custom_no_dict_2" + assert isinstance(restored.chat_generators[1], CustomGeneratorWithoutSerDe) + assert isinstance(restored.chat_generators[2], CustomGeneratorWithoutSerDe) + + # Verify pipeline execution on the restored instance + res = restored.run([ChatMessage.from_user("hi")]) + assert res["replies"][0].text == "dummy_has_dict" + + # 2. Test failure path (fail loud) when a component is not serializable + non_serializable_fallback = FallbackChatGenerator(chat_generators=[NonSerializableGenerator(object())]) + with pytest.raises(SerializationError, match="unsupported value of type"): + non_serializable_fallback.to_dict() diff --git a/test/components/preprocessors/test_recursive_splitter.py b/test/components/preprocessors/test_recursive_splitter.py index 7461540809..d334af5b8e 100644 --- a/test/components/preprocessors/test_recursive_splitter.py +++ b/test/components/preprocessors/test_recursive_splitter.py @@ -751,6 +751,60 @@ def test_run_split_by_dot_and_overlap_1_word_unit_split_idx_start(): ) +def test_word_unit_split_populates_split_overlap_metadata(): + """ + _split_overlap ranges must be character offsets into the referenced chunk when + split_unit="word" and split_overlap > 0 + """ + splitter = RecursiveDocumentSplitter(split_length=4, split_overlap=1, separators=["."], split_unit="word") + text = "This is sentence one. This is sentence two. This is sentence three. This is sentence four." + chunks = splitter.run([Document(content=text)])["documents"] + assert len(chunks) == 5 + + assert chunks[0].content == "This is sentence one." + assert chunks[0].meta["_split_overlap"] == [{"doc_id": chunks[1].id, "range": (0, 4)}] # "one." + + assert chunks[1].content == "one. This is sentence" + assert chunks[1].meta["_split_overlap"] == [ + {"doc_id": chunks[0].id, "range": (17, 21)}, # "one." + {"doc_id": chunks[2].id, "range": (0, 8)}, # "sentence" + ] + + assert chunks[2].content == "sentence two. This is" + assert chunks[2].meta["_split_overlap"] == [ + {"doc_id": chunks[1].id, "range": (13, 21)}, # "sentence" + {"doc_id": chunks[3].id, "range": (0, 2)}, # "is" + ] + + assert chunks[3].content == "is sentence three. This" + assert chunks[3].meta["_split_overlap"] == [ + {"doc_id": chunks[2].id, "range": (19, 21)}, # "is" + {"doc_id": chunks[4].id, "range": (0, 4)}, # "This" + ] + + assert chunks[4].content == "This is sentence four." + assert chunks[4].meta["_split_overlap"] == [{"doc_id": chunks[3].id, "range": (19, 23)}] # "This" + + +@pytest.mark.integration +def test_token_unit_split_populates_split_overlap_metadata(): + """ + _split_overlap ranges must be character offsets into the referenced chunk when + split_unit="token" and split_overlap > 0 + """ + splitter = RecursiveDocumentSplitter(split_length=4, split_overlap=1, separators=["."], split_unit="token") + text = "This is sentence one. This is sentence two. This is sentence three. This is sentence four." + chunks = splitter.run([Document(content=text)])["documents"] + assert len(chunks) == 8 + + assert chunks[0].meta["_split_overlap"] == [{"doc_id": chunks[1].id, "range": (0, 4)}] + assert chunks[1].meta["_split_overlap"] == [ + {"doc_id": chunks[0].id, "range": (16, 20)}, + {"doc_id": chunks[2].id, "range": (0, 1)}, + ] + assert chunks[7].meta["_split_overlap"] == [{"doc_id": chunks[6].id, "range": (9, 18)}] + + def test_run_trigger_dealing_with_remaining_word_larger_than_split_length(): splitter = RecursiveDocumentSplitter(split_length=3, split_overlap=2, separators=["."], split_unit="word") text = """A simple sentence1. A bright sentence2. A clever sentence3""" diff --git a/test/components/retrievers/test_multi_retriever.py b/test/components/retrievers/test_multi_retriever.py index 8a0d1f071c..620bb3d91b 100644 --- a/test/components/retrievers/test_multi_retriever.py +++ b/test/components/retrievers/test_multi_retriever.py @@ -102,7 +102,8 @@ class TestMultiRetriever: retriever = MultiRetriever(retrievers=retrievers) assert retriever.retrievers == retrievers assert retriever.filters is None - assert retriever.top_k == 10 + assert retriever.top_k_per_retriever is None + assert retriever.top_k is None assert retriever.max_workers == 4 assert retriever.join_mode == "reciprocal_rank_fusion" @@ -162,7 +163,7 @@ class TestMultiRetriever: ids = [doc.id for doc in result["documents"]] assert ids.count("doc1") == 1 - def test_run_resolves_filters_and_top_k(self): + def test_run_resolves_filters_and_top_k_per_retriever(self): received: dict = {} @component @@ -174,19 +175,68 @@ class TestMultiRetriever: return {"documents": []} retriever = MultiRetriever( - retrievers={"capturing": CapturingRetriever()}, filters={"field": "meta.category"}, top_k=5 + retrievers={"capturing": CapturingRetriever()}, filters={"field": "meta.category"}, top_k_per_retriever=5 ) - # Should use init-time values when not overridden + # Should use init-time values when not overridden (top_k_per_retriever is forwarded as the retriever's top_k) retriever.run(query="energy") assert received["filters"] == {"field": "meta.category"} assert received["top_k"] == 5 # Should prefer run-time values when provided - retriever.run(query="energy", filters={"field": "meta.other"}, top_k=2) + retriever.run(query="energy", filters={"field": "meta.other"}, top_k_per_retriever=2) assert received["filters"] == {"field": "meta.other"} assert received["top_k"] == 2 + def test_run_forwards_top_k_per_retriever_not_overall_top_k(self): + received: dict = {} + + @component + class CapturingRetriever: + @component.output_types(documents=list[Document]) + def run(self, query: str, filters: dict[str, Any] | None = None, top_k: int | None = None): + received["top_k"] = top_k + return {"documents": []} + + retriever = MultiRetriever(retrievers={"capturing": CapturingRetriever()}) + + # top_k_per_retriever is forwarded to each retriever as its top_k + retriever.run(query="energy", top_k_per_retriever=3) + assert received["top_k"] == 3 + + # the overall top_k is applied at merge-time only, not forwarded to retrievers + received.clear() + retriever.run(query="energy", top_k=5) + assert received.get("top_k") is None + + def test_run_top_k_truncates_merged_results(self, sample_documents): + retriever = MultiRetriever( + retrievers={ + "a": MockRetriever(documents=sample_documents[:3]), + "b": MockRetriever(documents=sample_documents[2:5]), + }, + max_workers=2, + ) + result = retriever.run(query="energy", top_k=2) + assert len(result["documents"]) == 2 + scores = [doc.score for doc in result["documents"]] + assert all(score is not None for score in scores) + assert scores == sorted(scores, reverse=True) + + def test_run_top_k_forces_rrf_in_concatenate_mode(self, sample_documents): + # In concatenate mode there is no global ranking, so setting top_k falls back to RRF to truncate consistently + retriever = MultiRetriever( + retrievers={ + "a": MockRetriever(documents=sample_documents[:3]), + "b": MockRetriever(documents=sample_documents[1:4]), + }, + join_mode="concatenate", + max_workers=2, + ) + result = retriever.run(query="energy", top_k=2) + assert len(result["documents"]) == 2 + assert all(doc.score is not None for doc in result["documents"]) + def test_run_with_active_retrievers(self, sample_documents): retriever = MultiRetriever( retrievers={"a": MockRetriever([sample_documents[0]]), "b": MockRetriever([sample_documents[1]])} @@ -210,6 +260,7 @@ class TestMultiRetriever: retriever = MultiRetriever( retrievers={"bm25": InMemoryBM25Retriever(document_store=InMemoryDocumentStore())}, filters=None, + top_k_per_retriever=3, top_k=5, max_workers=2, ) @@ -241,6 +292,7 @@ class TestMultiRetriever: } }, "filters": None, + "top_k_per_retriever": 3, "top_k": 5, "max_workers": 2, "join_mode": "reciprocal_rank_fusion", @@ -275,6 +327,7 @@ class TestMultiRetriever: } }, "filters": None, + "top_k_per_retriever": 3, "top_k": 5, "max_workers": 2, "join_mode": "concatenate", @@ -285,6 +338,7 @@ class TestMultiRetriever: assert len(result.retrievers) == 1 assert "bm25" in result.retrievers assert isinstance(result.retrievers["bm25"], InMemoryBM25Retriever) + assert result.top_k_per_retriever == 3 assert result.top_k == 5 assert result.max_workers == 2 assert result.join_mode == "concatenate" @@ -385,7 +439,7 @@ class TestMultiRetrieverAsync: assert ids.index("doc1") < ids.index("doc3") @pytest.mark.asyncio - async def test_run_async_resolves_filters_and_top_k(self): + async def test_run_async_resolves_filters_and_top_k_per_retriever(self): received: dict = {} @component @@ -397,17 +451,68 @@ class TestMultiRetrieverAsync: return {"documents": []} retriever = MultiRetriever( - retrievers={"capturing": CapturingRetriever()}, filters={"field": "meta.category"}, top_k=5 + retrievers={"capturing": CapturingRetriever()}, filters={"field": "meta.category"}, top_k_per_retriever=5 ) + # top_k_per_retriever is forwarded as the retriever's top_k await retriever.run_async(query="energy") assert received["filters"] == {"field": "meta.category"} assert received["top_k"] == 5 - await retriever.run_async(query="energy", filters={"field": "meta.other"}, top_k=2) + await retriever.run_async(query="energy", filters={"field": "meta.other"}, top_k_per_retriever=2) assert received["filters"] == {"field": "meta.other"} assert received["top_k"] == 2 + @pytest.mark.asyncio + async def test_run_async_forwards_top_k_per_retriever_not_overall_top_k(self): + received: dict = {} + + @component + class CapturingRetriever: + @component.output_types(documents=list[Document]) + def run(self, query: str, filters: dict[str, Any] | None = None, top_k: int | None = None): + received["top_k"] = top_k + return {"documents": []} + + retriever = MultiRetriever(retrievers={"capturing": CapturingRetriever()}) + + # top_k_per_retriever is forwarded to each retriever as its top_k + await retriever.run_async(query="energy", top_k_per_retriever=3) + assert received["top_k"] == 3 + + # the overall top_k is applied at merge-time only, not forwarded to retrievers + received.clear() + await retriever.run_async(query="energy", top_k=5) + assert received.get("top_k") is None + + @pytest.mark.asyncio + async def test_run_async_top_k_truncates_merged_results(self, sample_documents): + retriever = MultiRetriever( + retrievers={ + "a": MockRetriever(documents=sample_documents[:3]), + "b": MockRetriever(documents=sample_documents[2:5]), + } + ) + result = await retriever.run_async(query="energy", top_k=2) + assert len(result["documents"]) == 2 + scores = [doc.score for doc in result["documents"]] + assert all(score is not None for score in scores) + assert scores == sorted(scores, reverse=True) + + @pytest.mark.asyncio + async def test_run_async_top_k_forces_rrf_in_concatenate_mode(self, sample_documents): + # In concatenate mode there is no global ranking, so setting top_k falls back to RRF to truncate consistently + retriever = MultiRetriever( + retrievers={ + "a": MockRetriever(documents=sample_documents[:3]), + "b": MockRetriever(documents=sample_documents[1:4]), + }, + join_mode="concatenate", + ) + result = await retriever.run_async(query="energy", top_k=2) + assert len(result["documents"]) == 2 + assert all(doc.score is not None for doc in result["documents"]) + @pytest.mark.asyncio async def test_run_async_with_active_retrievers(self, sample_documents): retriever = MultiRetriever( diff --git a/test/dataclasses/test_answer.py b/test/dataclasses/test_answer.py index 68f4648637..2d4fde3f76 100644 --- a/test/dataclasses/test_answer.py +++ b/test/dataclasses/test_answer.py @@ -57,20 +57,17 @@ class TestExtractedAnswer: meta={"meta_key": "meta_value"}, ) assert answer.to_dict() == { - "type": "haystack.dataclasses.answer.ExtractedAnswer", - "init_parameters": { - "data": "42", - "query": "What is the answer?", - "document": document.to_dict(flatten=False), - "context": "The answer is 42.", - "score": 1.0, - "document_offset": {"start": 42, "end": 44}, - "context_offset": {"start": 14, "end": 16}, - "meta": {"meta_key": "meta_value"}, - }, + "data": "42", + "query": "What is the answer?", + "document": document.to_dict(flatten=False), + "context": "The answer is 42.", + "score": 1.0, + "document_offset": {"start": 42, "end": 44}, + "context_offset": {"start": 14, "end": 16}, + "meta": {"meta_key": "meta_value"}, } - def test_from_dict(self): + def test_from_dict_legacy(self): answer = ExtractedAnswer.from_dict( { "type": "haystack.dataclasses.answer.ExtractedAnswer", @@ -101,6 +98,34 @@ class TestExtractedAnswer: assert answer.context_offset == ExtractedAnswer.Span(14, 16) assert answer.meta == {"meta_key": "meta_value"} + def test_from_dict(self): + answer = ExtractedAnswer.from_dict( + { + "data": "42", + "query": "What is the answer?", + "document": { + "id": "8f800a524b139484fc719ecc35f971a080de87618319bc4836b784d69baca57f", + "content": "I thought a lot about this. The answer is 42.", + }, + "context": "The answer is 42.", + "score": 1.0, + "document_offset": {"start": 42, "end": 44}, + "context_offset": {"start": 14, "end": 16}, + "meta": {"meta_key": "meta_value"}, + } + ) + assert answer.data == "42" + assert answer.query == "What is the answer?" + assert answer.document == Document( + id="8f800a524b139484fc719ecc35f971a080de87618319bc4836b784d69baca57f", + content="I thought a lot about this. The answer is 42.", + ) + assert answer.context == "The answer is 42." + assert answer.score == 1.0 + assert answer.document_offset == ExtractedAnswer.Span(42, 44) + assert answer.context_offset == ExtractedAnswer.Span(14, 16) + assert answer.meta == {"meta_key": "meta_value"} + def test_no_warning_on_init(self): with warnings.catch_warnings(): warnings.simplefilter("error", Warning) @@ -158,10 +183,7 @@ class TestGeneratedAnswer: def test_to_dict(self): answer = GeneratedAnswer(data="42", query="What is the answer?", documents=[]) - assert answer.to_dict() == { - "type": "haystack.dataclasses.answer.GeneratedAnswer", - "init_parameters": {"data": "42", "query": "What is the answer?", "documents": [], "meta": {}}, - } + assert answer.to_dict() == {"data": "42", "query": "What is the answer?", "documents": [], "meta": {}} def test_to_dict_with_meta(self): answer = GeneratedAnswer( @@ -171,13 +193,10 @@ class TestGeneratedAnswer: meta={"meta_key": "meta_value", "all_messages": ["What is the answer?"]}, ) assert answer.to_dict() == { - "type": "haystack.dataclasses.answer.GeneratedAnswer", - "init_parameters": { - "data": "42", - "query": "What is the answer?", - "documents": [], - "meta": {"meta_key": "meta_value", "all_messages": ["What is the answer?"]}, - }, + "data": "42", + "query": "What is the answer?", + "documents": [], + "meta": {"meta_key": "meta_value", "all_messages": ["What is the answer?"]}, } def test_to_dict_with_chat_message_in_meta(self): @@ -193,19 +212,16 @@ class TestGeneratedAnswer: meta={"meta_key": "meta_value", "all_messages": [ChatMessage.from_user("What is the answer?")]}, ) assert answer.to_dict() == { - "type": "haystack.dataclasses.answer.GeneratedAnswer", - "init_parameters": { - "data": "42", - "query": "What is the answer?", - "documents": [d.to_dict(flatten=False) for d in documents], - "meta": { - "meta_key": "meta_value", - "all_messages": [ChatMessage.from_user("What is the answer?").to_dict()], - }, + "data": "42", + "query": "What is the answer?", + "documents": [d.to_dict(flatten=False) for d in documents], + "meta": { + "meta_key": "meta_value", + "all_messages": [ChatMessage.from_user("What is the answer?").to_dict()], }, } - def test_from_dict(self): + def test_from_dict_legacy(self): answer = GeneratedAnswer.from_dict( { "type": "haystack.dataclasses.answer.GeneratedAnswer", @@ -217,7 +233,7 @@ class TestGeneratedAnswer: assert answer.documents == [] assert answer.meta == {} - def test_from_dict_with_meta(self): + def test_from_dict_with_meta_legacy(self): answer = GeneratedAnswer.from_dict( { "type": "haystack.dataclasses.answer.GeneratedAnswer", @@ -235,7 +251,7 @@ class TestGeneratedAnswer: assert answer.meta["meta_key"] == "meta_value" assert answer.meta["all_messages"] == ["What is the answer?"] - def test_from_dict_with_chat_message_in_meta(self): + def test_from_dict_with_chat_message_in_meta_legacy(self): answer = GeneratedAnswer.from_dict( { "type": "haystack.dataclasses.answer.GeneratedAnswer", @@ -264,7 +280,7 @@ class TestGeneratedAnswer: assert answer.meta["meta_key"] == "meta_value" assert answer.meta["all_messages"] == [ChatMessage.from_user("What is the answer?")] - def test_from_dict_with_empty_all_messages(self): + def test_from_dict_with_empty_all_messages_legacy(self): # An empty `all_messages` list must not crash deserialization: `is not None` # let `[]` through and then indexed `all_messages[0]`, raising IndexError. answer = GeneratedAnswer.from_dict( @@ -280,6 +296,73 @@ class TestGeneratedAnswer: ) assert answer.meta["all_messages"] == [] + def test_from_dict(self): + answer = GeneratedAnswer.from_dict({"data": "42", "query": "What is the answer?", "documents": [], "meta": {}}) + assert answer.data == "42" + assert answer.query == "What is the answer?" + assert answer.documents == [] + assert answer.meta == {} + + def test_from_dict_with_meta(self): + answer = GeneratedAnswer.from_dict( + { + "data": "42", + "query": "What is the answer?", + "documents": [], + "meta": {"meta_key": "meta_value", "all_messages": ["What is the answer?"]}, + } + ) + assert answer.data == "42" + assert answer.query == "What is the answer?" + assert answer.documents == [] + assert answer.meta["meta_key"] == "meta_value" + assert answer.meta["all_messages"] == ["What is the answer?"] + + def test_from_dict_with_chat_message_in_meta(self): + answer = GeneratedAnswer.from_dict( + { + "data": "42", + "query": "What is the answer?", + "documents": [ + {"id": "1", "content": "The answer is 42."}, + {"id": "2", "content": "I believe the answer is 42."}, + {"id": "3", "content": "42 is definitely the answer."}, + ], + "meta": { + "meta_key": "meta_value", + "all_messages": [ChatMessage.from_user("What is the answer?").to_dict()], + }, + } + ) + assert answer.data == "42" + assert answer.query == "What is the answer?" + assert answer.documents == [ + Document(id="1", content="The answer is 42."), + Document(id="2", content="I believe the answer is 42."), + Document(id="3", content="42 is definitely the answer."), + ] + assert answer.meta["meta_key"] == "meta_value" + assert answer.meta["all_messages"] == [ChatMessage.from_user("What is the answer?")] + + def test_from_dict_with_empty_all_messages(self): + answer = GeneratedAnswer.from_dict( + {"data": "42", "query": "What is the answer?", "documents": [], "meta": {"all_messages": []}} + ) + assert answer.meta["all_messages"] == [] + + def test_from_dict_does_not_mutate_input(self): + # from_dict must not mutate the caller's input dict while converting + # `all_messages` dicts into ChatMessage objects (regression test). + meta = {"all_messages": [ChatMessage.from_user("What is the answer?").to_dict()]} + serialized = {"data": "42", "query": "What is the answer?", "documents": [], "meta": meta} + answer = GeneratedAnswer.from_dict(serialized) + + # the deserialized answer still holds ChatMessage objects + assert answer.meta["all_messages"] == [ChatMessage.from_user("What is the answer?")] + # but the caller's meta dict is left untouched: it still holds plain dicts + assert isinstance(meta["all_messages"][0], dict) + assert meta["all_messages"] == [ChatMessage.from_user("What is the answer?").to_dict()] + def test_to_dict_from_dict_round_trip_with_empty_all_messages(self): answer = GeneratedAnswer(data="42", query="What is the answer?", documents=[], meta={"all_messages": []}) assert GeneratedAnswer.from_dict(answer.to_dict()) == answer diff --git a/test/utils/test_auth.py b/test/utils/test_auth.py index a7b40424ff..e94ecbe815 100644 --- a/test/utils/test_auth.py +++ b/test/utils/test_auth.py @@ -32,9 +32,14 @@ def test_token_secret(): Secret.from_token("") with pytest.raises(FrozenInstanceError): - secret._token = "abba" + secret._token = "abba" # type: ignore[misc] with pytest.raises(FrozenInstanceError): - secret._type = SecretType.ENV_VAR + secret._type = SecretType.ENV_VAR # type: ignore[misc] + + secret = Secret.from_token("sk-supersecret-1234567890ABCDEF") + assert "sk-supersecret-1234567890ABCDEF" not in repr(secret) + assert "sk-supersecret-1234567890ABCDEF" not in str(secret) + assert "" in repr(secret) def test_env_var_secret(): @@ -52,10 +57,12 @@ def test_env_var_secret(): secret.resolve_value() secret = Secret.from_env_var("TEST_ENV_VAR2", strict=False) + assert isinstance(secret, EnvVarSecret) assert secret._strict is False assert secret.resolve_value() is None secret = Secret.from_env_var(["TEST_ENV_VAR2", "TEST_ENV_VAR1"], strict=True) + assert isinstance(secret, EnvVarSecret) assert secret._env_vars == ("TEST_ENV_VAR2", "TEST_ENV_VAR1") with pytest.raises(ValueError, match="None of the following .* variables are set"): secret.resolve_value() @@ -73,8 +80,8 @@ def test_env_var_secret(): ) with pytest.raises(FrozenInstanceError): - secret._env_vars = ("A", "B") + secret._env_vars = ("A", "B") # type: ignore[misc] with pytest.raises(FrozenInstanceError): - secret._strict = False + secret._strict = False # type: ignore[misc] with pytest.raises(FrozenInstanceError): - secret._type = SecretType.TOKEN + secret._type = SecretType.TOKEN # type: ignore[misc] diff --git a/test/utils/test_base_serialization.py b/test/utils/test_base_serialization.py index 8f83c8f384..e6cbbb99fc 100644 --- a/test/utils/test_base_serialization.py +++ b/test/utils/test_base_serialization.py @@ -233,44 +233,38 @@ def test_serializing_and_deserializing_empty_structures(value, result): "serialized_data": [ [ { - "type": "haystack.dataclasses.answer.GeneratedAnswer", - "init_parameters": { - "data": "Paris", - "query": "What is the capital of France?", - "documents": [ - { - "id": "1", - "content": "Paris is the capital of France", - "blob": None, - "meta": {}, - "score": None, - "embedding": None, - "sparse_embedding": None, - } - ], - "meta": {"page": 1}, - }, + "data": "Paris", + "query": "What is the capital of France?", + "documents": [ + { + "id": "1", + "content": "Paris is the capital of France", + "blob": None, + "meta": {}, + "score": None, + "embedding": None, + "sparse_embedding": None, + } + ], + "meta": {"page": 1}, } ], [ { - "type": "haystack.dataclasses.answer.GeneratedAnswer", - "init_parameters": { - "data": "Berlin", - "query": "What is the capital of Germany?", - "documents": [ - { - "id": "2", - "content": "Berlin is the capital of Germany", - "blob": None, - "meta": {}, - "score": None, - "embedding": None, - "sparse_embedding": None, - } - ], - "meta": {"page": 1}, - }, + "data": "Berlin", + "query": "What is the capital of Germany?", + "documents": [ + { + "id": "2", + "content": "Berlin is the capital of Germany", + "blob": None, + "meta": {}, + "score": None, + "embedding": None, + "sparse_embedding": None, + } + ], + "meta": {"page": 1}, } ], ], @@ -364,23 +358,20 @@ def test_serialize_and_deserialize_value_with_schema_with_various_types(): "list_of_dicts": [{"numbers": [1, 2, 3]}], "answers": [ { - "type": "haystack.dataclasses.answer.GeneratedAnswer", - "init_parameters": { - "data": "Paris", - "query": "What is the capital of France?", - "documents": [ - { - "id": "2", - "content": "Paris is the capital of France", - "blob": None, - "meta": {}, - "score": None, - "embedding": None, - "sparse_embedding": None, - } - ], - "meta": {"page": 1}, - }, + "data": "Paris", + "query": "What is the capital of France?", + "documents": [ + { + "id": "2", + "content": "Paris is the capital of France", + "blob": None, + "meta": {}, + "score": None, + "embedding": None, + "sparse_embedding": None, + } + ], + "meta": {"page": 1}, } ], }, diff --git a/test/utils/test_callable_serialization.py b/test/utils/test_callable_serialization.py index 10039f0f32..cf91d5e1f3 100644 --- a/test/utils/test_callable_serialization.py +++ b/test/utils/test_callable_serialization.py @@ -14,7 +14,7 @@ from haystack.tools import tool from haystack.utils import deserialize_callable, serialize_callable -def some_random_callable_for_testing(some_ignored_arg: str): +def some_random_callable_for_testing(some_ignored_arg: str) -> None: pass diff --git a/test/utils/test_device.py b/test/utils/test_device.py index abd74827d2..2d7c1b7d88 100644 --- a/test/utils/test_device.py +++ b/test/utils/test_device.py @@ -57,7 +57,7 @@ def test_device_map(): ) with pytest.raises(TypeError, match="unexpected device"): - DeviceMap.from_hf({"layer1": 0.1}) + DeviceMap.from_hf({"layer1": 0.1}) # type: ignore[dict-item] assert device_map.first_device == Device.gpu(0) assert DeviceMap({}).first_device is None diff --git a/test/utils/test_experimental.py b/test/utils/test_experimental.py index 257d3252ac..627f241ad8 100644 --- a/test/utils/test_experimental.py +++ b/test/utils/test_experimental.py @@ -39,7 +39,7 @@ class TestExperimentalDecorator: def run(self, value: int) -> dict: return {"value": value} - assert MyComponent.__experimental__ is True + assert getattr(MyComponent, "__experimental__") is True # noqa: B009 def test_passes_args_and_kwargs_to_init(self): @_experimental diff --git a/test/utils/test_filters.py b/test/utils/test_filters.py index f5fbf66d6a..777105a01d 100644 --- a/test/utils/test_filters.py +++ b/test/utils/test_filters.py @@ -566,6 +566,23 @@ document_matches_filter_raises_error_data = [ pytest.param({"operator": "==", "value": "test"}, id="Missing condition field key"), pytest.param({"field": "meta.name", "value": "test"}, id="Missing condition operator key"), pytest.param({"field": "meta.name", "operator": "=="}, id="Missing condition value key"), + # Unknown operators + pytest.param({"field": "meta.page", "operator": "gt", "value": 10}, id="Unknown comparison operator"), + pytest.param( + {"operator": "XOR", "conditions": [{"field": "meta.page", "operator": "==", "value": 10}]}, + id="Unknown logical operator", + ), + pytest.param( + { + "operator": "AND", + "conditions": [{"operator": "XOR", "conditions": [{"field": "meta.page", "operator": "==", "value": 10}]}], + }, + id="Unknown nested logical operator", + ), + pytest.param( + {"operator": "and", "conditions": [{"field": "meta.page", "operator": "==", "value": 10}]}, + id="Lowercase logical operator", + ), ] @@ -574,3 +591,38 @@ def test_document_matches_filter_raises_error(filters): with pytest.raises(FilterError): document = Document(meta={"page": 10}) document_matches_filter(filters, document) + + +@pytest.mark.parametrize( + "filters,expected_message", + [ + pytest.param( + {"field": "meta.page", "operator": "gt", "value": 10}, + "Unknown comparison operator 'gt'", + id="Unknown comparison operator", + ), + pytest.param( + {"operator": "XOR", "conditions": [{"field": "meta.page", "operator": "==", "value": 10}]}, + "Unknown logical operator 'XOR'", + id="Unknown logical operator", + ), + pytest.param( + { + "operator": "AND", + "conditions": [ + {"operator": "XOR", "conditions": [{"field": "meta.page", "operator": "==", "value": 10}]} + ], + }, + "Unknown logical operator 'XOR'", + id="Unknown nested logical operator", + ), + pytest.param( + {"operator": "and", "conditions": [{"field": "meta.page", "operator": "==", "value": 10}]}, + "Unknown logical operator 'and'", + id="Lowercase logical operator", + ), + ], +) +def test_document_matches_filter_unknown_operator_error_message(filters, expected_message): + with pytest.raises(FilterError, match=expected_message): + document_matches_filter(filters, Document(meta={"page": 10})) diff --git a/test/utils/test_hf.py b/test/utils/test_hf.py index 61a0a97931..83925a8313 100644 --- a/test/utils/test_hf.py +++ b/test/utils/test_hf.py @@ -37,7 +37,7 @@ def test_convert_message_to_hf_format(): "tool_calls": [{"type": "function", "function": {"name": "weather", "arguments": {"city": "Paris"}}}], } - tool_result = {"weather": "sunny", "temperature": "25"} + tool_result = '{"weather": "sunny", "temperature": "25"}' message = ChatMessage.from_tool( tool_result=tool_result, origin=ToolCall(id="123", tool_name="weather", arguments={"city": "Paris"}) ) @@ -61,7 +61,7 @@ def test_convert_message_to_hf_invalid(): ToolCallResult( result="result!", origin=ToolCall(id="123", tool_name="weather", arguments={"city": "Paris"}), - error=None, + error=None, # type: ignore[arg-type] ), ], ) diff --git a/test/utils/test_http_client.py b/test/utils/test_http_client.py index 8c52c265b2..43c4c2496c 100644 --- a/test/utils/test_http_client.py +++ b/test/utils/test_http_client.py @@ -14,7 +14,8 @@ def test_init_http_client(): assert http_client is None # test client is initialized with http_client_kwargs - http_client = init_http_client(http_client_kwargs={"base_url": "https://example.com"}) + client_kwargs = {"base_url": "https://example.com"} + http_client = init_http_client(http_client_kwargs=client_kwargs) assert http_client is not None assert isinstance(http_client, httpx.Client) assert http_client.base_url == "https://example.com" @@ -35,7 +36,7 @@ def test_init_http_client_async(): def test_http_client_kwargs_type_validation(): # test http_client_kwargs is not a dictionary with pytest.raises(TypeError, match="The parameter 'http_client_kwargs' must be a dictionary."): - init_http_client(http_client_kwargs="invalid") + init_http_client(http_client_kwargs="invalid") # type: ignore[call-overload] def test_http_client_kwargs_with_invalid_params(): diff --git a/test/utils/test_jinja2_chat_extension.py b/test/utils/test_jinja2_chat_extension.py index ab0bfd344a..58fcfb59e7 100644 --- a/test/utils/test_jinja2_chat_extension.py +++ b/test/utils/test_jinja2_chat_extension.py @@ -4,6 +4,7 @@ import base64 import json +from typing import Any from unittest.mock import patch import pytest @@ -98,7 +99,12 @@ class TestChatMessageExtension: """ rendered = jinja_env.from_string(template).render() output = json.loads(rendered.strip()) - expected = {"role": "system", "content": [{"text": "You are a helpful assistant."}], "name": None, "meta": {}} + expected: dict[str, Any] = { + "role": "system", + "content": [{"text": "You are a helpful assistant."}], + "name": None, + "meta": {}, + } assert output == expected def test_user_message_with_variable(self, jinja_env): @@ -109,7 +115,12 @@ class TestChatMessageExtension: """ rendered = jinja_env.from_string(template).render(name="Alice") output = json.loads(rendered.strip()) - expected = {"role": "user", "content": [{"text": "Hello, my name is Alice!"}], "name": None, "meta": {}} + expected: dict[str, Any] = { + "role": "user", + "content": [{"text": "Hello, my name is Alice!"}], + "name": None, + "meta": {}, + } assert output == expected def test_assistant_message_with_tool_call(self, jinja_env): @@ -122,7 +133,7 @@ class TestChatMessageExtension: tool_call = ToolCall(tool_name="search", arguments={"query": "an interesting question"}, id="search_1") rendered = jinja_env.from_string(template).render(tool_call=tool_call) output = json.loads(rendered.strip()) - expected = { + expected: dict[str, Any] = { "role": "assistant", "content": [ {"text": "Let me search for that information."}, @@ -150,7 +161,7 @@ class TestChatMessageExtension: reasoning = ReasoningContent(reasoning_text="Let me think about it...", extra={"key": "value"}) rendered = jinja_env.from_string(template).render(reasoning=reasoning) output = json.loads(rendered.strip()) - expected = { + expected: dict[str, Any] = { "role": "assistant", "content": [ {"reasoning": {"reasoning_text": "Let me think about it...", "extra": {"key": "value"}}}, @@ -171,7 +182,7 @@ class TestChatMessageExtension: tool_result = ToolCallResult(result="Here are the search results", origin=tool_call, error=False) rendered = jinja_env.from_string(template).render(tool_result=tool_result) output = json.loads(rendered.strip()) - expected = { + expected: dict[str, Any] = { "role": "tool", "content": [ { @@ -209,7 +220,7 @@ class TestChatMessageExtension: ) rendered = jinja_env.from_string(template).render(tool_result=tool_result) output = json.loads(rendered.strip()) - expected = { + expected: dict[str, Any] = { "role": "tool", "content": [ { @@ -251,7 +262,7 @@ class TestChatMessageExtension: image = ImageContent(base64_image=base64_image_string, mime_type="image/png") rendered = jinja_env.from_string(template).render(image=image) output = json.loads(rendered.strip()) - expected = { + expected: dict[str, Any] = { "role": "user", "content": [ {"text": "Please describe this image:"}, @@ -285,7 +296,7 @@ class TestChatMessageExtension: ] rendered = jinja_env.from_string(template).render(images=images) output = json.loads(rendered.strip()) - expected = { + expected: dict[str, Any] = { "role": "user", "content": [ {"text": "Compare these images:"}, @@ -332,7 +343,7 @@ class TestChatMessageExtension: rendered = jinja_env.from_string(template).render(images=[image, image]) output = json.loads(rendered.strip()) - expected = { + expected: dict[str, Any] = { "role": "user", "content": [ {"text": "Image 1:"}, @@ -373,7 +384,7 @@ class TestChatMessageExtension: rendered = jinja_env.from_string(template).render(file=file) output = json.loads(rendered.strip()) - expected = { + expected: dict[str, Any] = { "role": "user", "content": [ {"text": "Please describe this document:"}, @@ -403,7 +414,7 @@ But my favorite subject is Small Language Models. """ rendered = jinja_env.from_string(template).render() output = json.loads(rendered.strip()) - expected = { + expected: dict[str, Any] = { "role": "user", "content": [ { @@ -429,7 +440,7 @@ But my favorite subject is Small Language Models. def test_templatize_part_filter_with_invalid_type(self, jinja_env): with pytest.raises(TypeError, match="Unsupported type in ChatMessage content"): - templatize_part(jinja_env, 123) + templatize_part(jinja_env, 123) # type: ignore[arg-type] def test_empty_message_content_raises_error(self, jinja_env): error_message = "Message content in template is empty or contains only whitespace characters." @@ -483,7 +494,7 @@ But my favorite subject is Small Language Models. {% endmessage %}""", """{% message role="user" %}\tString\t{% endmessage %}""", ] - expected = {"role": "user", "content": [{"text": "String"}], "name": None, "meta": {}} + expected: dict[str, Any] = {"role": "user", "content": [{"text": "String"}], "name": None, "meta": {}} for template in templates: rendered = jinja_env.from_string(template).render() output = json.loads(rendered.strip()) diff --git a/test/utils/test_jinja2_extensions.py b/test/utils/test_jinja2_extensions.py index 0d1dd09770..e578d44499 100644 --- a/test/utils/test_jinja2_extensions.py +++ b/test/utils/test_jinja2_extensions.py @@ -2,7 +2,7 @@ # # SPDX-License-Identifier: Apache-2.0 -from unittest.mock import patch +from unittest.mock import MagicMock, patch import arrow import pytest @@ -26,7 +26,7 @@ class TestJinja2TimeExtension: return Jinja2TimeExtension(jinja_env) @patch("haystack.utils.jinja2_extensions.arrow_import") - def test_init_fails_without_arrow(self, arrow_import_mock) -> None: + def test_init_fails_without_arrow(self, arrow_import_mock: MagicMock) -> None: arrow_import_mock.check.side_effect = ImportError with pytest.raises(ImportError): Jinja2TimeExtension(Environment()) diff --git a/test/utils/test_misc.py b/test/utils/test_misc.py index 2e241a872d..4e2286dea8 100644 --- a/test/utils/test_misc.py +++ b/test/utils/test_misc.py @@ -70,6 +70,7 @@ class TestReciprocalRankFusion: docs = [Document(id="a"), Document(id="b"), Document(id="c")] result = _reciprocal_rank_fusion([docs]) by_id = {doc.id: doc.score for doc in result} + assert by_id["a"] is not None and by_id["b"] is not None and by_id["c"] is not None assert by_id["a"] > by_id["b"] > by_id["c"] def test_deduplicates_across_lists(self): @@ -85,6 +86,7 @@ class TestReciprocalRankFusion: result = _reciprocal_rank_fusion([docs_a, docs_b]) by_id = {doc.id: doc.score for doc in result} # "a" is ranked 1st and 2nd; "c" is ranked 3rd and 1st — "a" should win + assert by_id["a"] is not None and by_id["c"] is not None assert by_id["a"] > by_id["c"] def test_equal_weights_by_default(self): @@ -103,6 +105,7 @@ class TestReciprocalRankFusion: weighted_by_id = {doc.id: doc.score for doc in result_weighted} # with equal weights both docs score the same; with heavy weight on list_a, "a" should outscore "b" assert equal_by_id["a"] == pytest.approx(equal_by_id["b"]) + assert weighted_by_id["a"] is not None and weighted_by_id["b"] is not None assert weighted_by_id["a"] > weighted_by_id["b"] diff --git a/test/utils/test_requests_utils.py b/test/utils/test_requests_utils.py index fd6de9b302..9bf621268a 100644 --- a/test/utils/test_requests_utils.py +++ b/test/utils/test_requests_utils.py @@ -104,10 +104,10 @@ class TestRequestWithRetry: "Service Unavailable", request=error_response.request, response=error_response ) - error_response.raise_for_status = raise_for_status + error_response.raise_for_status = raise_for_status # type: ignore[method-assign] success_response = httpx.Response(status_code=200, request=httpx.Request("GET", "https://example.com")) - success_response.raise_for_status = lambda: None + success_response.raise_for_status = lambda: None # type: ignore[method-assign, assignment, return-value] with patch("httpx.Client.request") as mock_request: # First call returns error status code, second call succeeds @@ -218,10 +218,10 @@ class TestAsyncRequestWithRetry: "Service Unavailable", request=error_response.request, response=error_response ) - error_response.raise_for_status = raise_for_status + error_response.raise_for_status = raise_for_status # type: ignore[method-assign] success_response = httpx.Response(status_code=200, request=httpx.Request("GET", "https://example.com")) - success_response.raise_for_status = lambda: None + success_response.raise_for_status = lambda: None # type: ignore[method-assign, assignment, return-value] with patch("httpx.AsyncClient.request") as mock_request: # First call returns error status code, second call succeeds diff --git a/test/utils/test_type_serialization.py b/test/utils/test_type_serialization.py index 7a484e4ccb..af68b9e378 100644 --- a/test/utils/test_type_serialization.py +++ b/test/utils/test_type_serialization.py @@ -151,7 +151,7 @@ def test_output_type_deserialization(): assert deserialize_type("float") == float assert deserialize_type("bool") == bool assert deserialize_type("None") is None - assert deserialize_type("NoneType") == type(None) # type: ignore + assert deserialize_type("NoneType") == type(None) def test_output_builtin_type_deserialization(): @@ -223,10 +223,10 @@ def test_output_type_deserialization_nested(): def test_output_type_serialization_typing_generic_with_nonetype(): # NoneType used as a regular argument of a typing generic (not the implicit None of Optional) # must be kept, otherwise the serialized type is malformed (e.g. "typing.Dict[str]") or loses information. - assert serialize_type(Dict[str, type(None)]) == "typing.Dict[str, None]" - assert serialize_type(Dict[type(None), str]) == "typing.Dict[None, str]" + assert serialize_type(Dict[str, type(None)]) == "typing.Dict[str, None]" # type: ignore[misc] + assert serialize_type(Dict[type(None), str]) == "typing.Dict[None, str]" # type: ignore[misc] assert serialize_type(Tuple[int, type(None)]) == "typing.Tuple[int, None]" - assert serialize_type(List[type(None)]) == "typing.List[None]" + assert serialize_type(List[type(None)]) == "typing.List[None]" # type: ignore[misc] # A Union with more than two members that includes None must keep None as well. assert serialize_type(Union[str, int, None]) == "typing.Union[str, int, None]" # Optional must still be serialized without a redundant trailing None. @@ -235,10 +235,10 @@ def test_output_type_serialization_typing_generic_with_nonetype(): def test_output_type_round_trip_typing_generic_with_nonetype(): for type_ in [ - Dict[str, type(None)], - Dict[type(None), str], + Dict[str, type(None)], # type: ignore[misc] + Dict[type(None), str], # type: ignore[misc] Tuple[int, type(None)], - List[type(None)], + List[type(None)], # type: ignore[misc] Union[str, int, None], Optional[str], ]: