diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md
index 9f9657d3de..e522a25e2f 100644
--- a/.github/CONTRIBUTING.md
+++ b/.github/CONTRIBUTING.md
@@ -33,7 +33,7 @@ For developers who want to contribute to our code, here is the guidance:
+ A function in plan
## 2. Install environment for development
-+ We strongly suggest you to read our **[Document](http://xxx/docs/)** before developing
++ We strongly suggest you to read our **[Document](../docs/src/content/docs/en/index.md)** before developing
+ For setting environment, please check our **[Readme file](/README.md)**
## 3. Build our project
diff --git a/.github/CONTRIBUTING_zh.md b/.github/CONTRIBUTING_zh.md
index 2e48f869dc..7c73dd1094 100644
--- a/.github/CONTRIBUTING_zh.md
+++ b/.github/CONTRIBUTING_zh.md
@@ -36,7 +36,7 @@ xLLM致力于为每一位用户和开发者提供开放的XX,因此无论您
+ 计划实现的功能
## 2. 配置开发环境
-+ 在开发之前,可以参考我们的 **[文档](http://xxx/docs/)**
++ 在开发之前,可以参考我们的 **[文档](../docs/src/content/docs/zh/index.md)**
+ 关于环境配置,参见 **[Readme file](/README.md)**
## 3. 项目构建和运行
@@ -45,4 +45,4 @@ xLLM致力于为每一位用户和开发者提供开放的XX,因此无论您
## 4. 测试
在pr提交之后,我们会对代码进行格式化及进一步测试。
-我们的测试目前还很不完善,因此欢迎开发者为测试作出贡献!
\ No newline at end of file
+我们的测试目前还很不完善,因此欢迎开发者为测试作出贡献!
diff --git a/.github/workflows/deploy_docs.yml b/.github/workflows/deploy_docs.yml
new file mode 100644
index 0000000000..1156881003
--- /dev/null
+++ b/.github/workflows/deploy_docs.yml
@@ -0,0 +1,65 @@
+name: Deploy Docs
+
+on:
+ push:
+ branches: [main]
+ paths:
+ - 'docs/**'
+ - '.github/workflows/deploy_docs.yml'
+ pull_request:
+ branches: [main]
+ paths:
+ - 'docs/**'
+ - '.github/workflows/deploy_docs.yml'
+ workflow_dispatch:
+
+permissions:
+ contents: read
+ pages: write
+ id-token: write
+
+concurrency:
+ group: pages
+ cancel-in-progress: false
+
+jobs:
+ build:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v4
+
+ - name: Setup Node.js
+ uses: actions/setup-node@v4
+ with:
+ node-version: 22
+ cache: npm
+ cache-dependency-path: docs/package-lock.json
+
+ - name: Install dependencies
+ working-directory: docs
+ run: npm ci
+
+ - name: Build
+ working-directory: docs
+ env:
+ BASE_PATH: /xllm
+ SITE_URL: https://jd-opensource.github.io/xllm
+ run: npm run build
+
+ - name: Upload Pages artifact
+ uses: actions/upload-pages-artifact@v3
+ with:
+ path: docs/dist
+
+ deploy:
+ if: github.event_name != 'pull_request'
+ needs: build
+ runs-on: ubuntu-latest
+ environment:
+ name: github-pages
+ url: ${{ steps.deployment.outputs.page_url }}
+ steps:
+ - name: Deploy to GitHub Pages
+ id: deployment
+ uses: actions/deploy-pages@v4
diff --git a/README.md b/README.md
index 915223714a..aedb191d8e 100755
--- a/README.md
+++ b/README.md
@@ -12,19 +12,19 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License. -->
-[English](./README.md) | [中文](./docs/project/README_zh.md)
+[English](./README.md) | [中文](./README.zh-CN.md)
-
+
-[](https://xllm.readthedocs.io/zh-cn/latest/) [](https://hub.docker.com/r/xllm/xllm-ai) [](https://opensource.org/licenses/Apache-2.0) [](https://arxiv.org/abs/2510.14686) [](https://deepwiki.com/jd-opensource/xllm)
+[](https://jd-opensource.github.io/xllm/en/) [](https://hub.docker.com/r/xllm/xllm-ai) [](https://opensource.org/licenses/Apache-2.0) [](https://arxiv.org/abs/2510.14686) [](https://deepwiki.com/jd-opensource/xllm)
---------------------
-| Documentation | Technical Report |
+| Documentation | Technical Report |
@@ -43,7 +43,7 @@ limitations under the License. -->
**xLLM** is an **efficient LLM inference framework**, specifically optimized for **Chinese AI accelerators**, enabling enterprise-grade deployment with enhanced efficiency and reduced cost. The framework adopts a **service-engine decoupled** inference architecture, achieving breakthrough efficiency through several technologies: at the service layer, including elastic scheduling of online/offline requests, dynamic PD disaggregation, a hybrid EPD mechanism for multimodal and high-availability fault tolerance; and at the engine layer, combined with technologies such as multi-stream parallel computing, graph fusion optimization, speculative inference, dynamic load balancing and global KV cache management. The overall architecture is shown below:
-
+
**xLLM** already supports efficient deployment of mainstream large models (such as *DeepSeek-V3.1*, *Qwen2/3*, etc.) on Chinese AI accelerators, empowering enterprises to implement high-performance, low-cost AI large model applications. xLLM has been fully deployed in JD.com’s real core retail businesses, covering a variety of scenarios including intelligent customer service, risk control, supply chain optimization, ad recommendation, and more.
@@ -88,13 +88,13 @@ limitations under the License. -->
| ILU | BI150 | |
| MUSA | S5000 | |
-Besides, please check the supported models on different hardwares at [Supported Models List](docs/en/supported_models.md).
+Besides, please check the supported models on different hardwares at [Supported Models List](docs/src/content/docs/en/supported_models.md).
---
## Quick Start
-Please refer to [Quick Start](docs/en/getting_started/quick_start.md) for more details.
+Please refer to [Quick Start](docs/src/content/docs/en/getting_started/quick_start.md) for more details.
---
@@ -114,7 +114,7 @@ There are several ways you can contribute to xLLM:
+ Send your pull request
We appreciate all kinds of contributions! 🎉🎉🎉
-If you have problems about development, please check our document: **[Document](https://xllm.readthedocs.io/zh-cn/latest)**
+If you have problems about development, please check our document: **[Document](https://jd-opensource.github.io/xllm/en/)**
---
@@ -122,7 +122,7 @@ If you have problems about development, please check our document: **[Document](
If you encounter any issues along the way, you are welcomed to submit reproducible steps and log snippets in the project's Issues area, or contact the xLLM Core team directly via your internal Slack. In addition, we have established official WeChat groups. You can access the following QR code to join. Welcome to contact us!
-
+
## Acknowledgment
diff --git a/docs/project/README_zh.md b/README.zh-CN.md
similarity index 84%
rename from docs/project/README_zh.md
rename to README.zh-CN.md
index 7dda100f4d..fa7be8b21c 100644
--- a/docs/project/README_zh.md
+++ b/README.zh-CN.md
@@ -12,18 +12,18 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License. -->
-[English](../../README.md) | [中文](./README_zh.md)
+[English](./README.md) | [中文](./README.zh-CN.md)
-
+
-[](https://xllm.readthedocs.io/zh-cn/latest/) [](https://hub.docker.com/r/xllm/xllm-ai) [](https://opensource.org/licenses/Apache-2.0) [](https://arxiv.org/abs/2510.14686) [](https://deepwiki.com/jd-opensource/xllm)
+[](https://jd-opensource.github.io/xllm/zh/) [](https://hub.docker.com/r/xllm/xllm-ai) [](https://opensource.org/licenses/Apache-2.0) [](https://arxiv.org/abs/2510.14686) [](https://deepwiki.com/jd-opensource/xllm)
---------------------
-| Documentation | Technical Report |
+| Documentation | Technical Report |
### 📢 新闻
@@ -41,7 +41,7 @@ limitations under the License. -->
**xLLM** 是一个高效的开源大模型推理框架,专为**国产芯片**优化设计,提供企业级的服务部署,使得性能更高、成本更低。该框架采用**服务-引擎分离的推理架构**,通过服务层的在离线请求弹性调度、动态PD分离、EPD混合机制及高可用容错设计,结合引擎层的多流并行计算、图融合优化、投机推理、动态负载均衡及全局KV缓存管理,实现推理效率突破性提升。xLLM整体架构和功能如下图所示:
-
+
**xLLM** 已支持主流大模型(如 *DeepSeek-V3.1*,*Qwen2/3*等)在国产芯片上的高效部署,助力企业实现高性能、低成本的 AI 大模型应用落地。xLLM已全面落地京东零售核心业务,涵盖智能客服、风控、供应链优化、广告推荐等多种场景。
@@ -85,13 +85,13 @@ xLLM 提供了强大的智能计算能力,通过硬件系统的算力优化与
| ILU | BI150 | |
| MUSA | S5000 | |
-此外,请在[模型支持列表](../zh/supported_models.md)查看不同硬件上的模型支持情况。
+此外,请在[模型支持列表](docs/src/content/docs/zh/supported_models.md)查看不同硬件上的模型支持情况。
---
## 快速开始
-请参考[快速开始文档](../zh/getting_started/quick_start.md)。
+请参考[快速开始文档](docs/src/content/docs/zh/getting_started/quick_start.md)。
---
@@ -111,7 +111,7 @@ xLLM 提供了强大的智能计算能力,通过硬件系统的算力优化与
+ 提出pull request
感谢您的贡献! 🎉🎉🎉
-如果您在开发中遇到问题,请参阅**[xLLM中文指南](https://xllm.readthedocs.io/zh-cn/latest)**
+如果您在开发中遇到问题,请参阅**[xLLM中文指南](https://jd-opensource.github.io/xllm/zh/)**
---
@@ -120,7 +120,7 @@ xLLM 提供了强大的智能计算能力,通过硬件系统的算力优化与
如果您有企业内部Slack,请直接联系xLLM Core团队。另外,我们建立了官方微信群,可以访问以下二维码加入。欢迎沟通和联系我们:
-
+
---
diff --git a/docs/.gitignore b/docs/.gitignore
new file mode 100644
index 0000000000..6240da8b10
--- /dev/null
+++ b/docs/.gitignore
@@ -0,0 +1,21 @@
+# build output
+dist/
+# generated types
+.astro/
+
+# dependencies
+node_modules/
+
+# logs
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+
+
+# environment variables
+.env
+.env.production
+
+# macOS-specific files
+.DS_Store
diff --git a/docs/LICENSE b/docs/LICENSE
new file mode 100644
index 0000000000..3239ec2541
--- /dev/null
+++ b/docs/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2026 xLLM-AI
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/docs/README.md b/docs/README.md
new file mode 100644
index 0000000000..bdff35ca0b
--- /dev/null
+++ b/docs/README.md
@@ -0,0 +1,96 @@
+# xLLM Documentation
+
+[English](./README.md) | [简体中文](./README.zh-CN.md)
+
+This directory contains the Astro + Starlight documentation site for
+[xLLM](https://github.com/jd-opensource/xllm), an LLM inference framework for
+high-performance serving on domestic AI accelerators.
+
+The site is built with Starlight and `starlight-theme-rapide`. It includes a
+custom header, bilingual navigation, and a page-level `Copy page` action for
+copying documentation content as Markdown.
+
+## Documentation Structure
+
+The documentation is maintained in two parallel language trees:
+
+- English: `src/content/docs/en`
+- Simplified Chinese: `src/content/docs/zh`
+
+The root path redirects to the English documentation. When the site is deployed
+under a base path such as `/xllm`, the same route structure is prefixed by that
+base path.
+
+- `/` redirects to `/en/`
+- `/en/` serves the English documentation
+- `/zh/` serves the Simplified Chinese documentation
+
+When adding or moving pages, keep matching relative paths in both language
+trees so Starlight can switch between languages for the same topic.
+
+## Project Layout
+
+```text
+.
+├── astro.config.mjs # Starlight, locale, sidebar, and component config
+├── package.json # npm scripts and dependencies
+├── src/
+│ ├── assets/ # Site-level assets such as the logo
+│ ├── components/ # Starlight component overrides
+│ ├── content/
+│ │ └── docs/
+│ │ ├── en/ # English documentation
+│ │ ├── zh/ # Simplified Chinese documentation
+│ │ └── assets/ # Documentation images and diagrams
+│ ├── pages/index.astro # Redirect from / to /en/
+│ └── styles/theme.css # Project theme customizations
+└── public/ # Static public assets
+```
+
+## Local Development
+
+From the xLLM repository root, enter this directory first:
+
+```sh
+cd docs
+```
+
+Install dependencies:
+
+```sh
+npm install
+```
+
+Start the local development server:
+
+```sh
+npm run dev
+```
+
+Build the production site:
+
+```sh
+npm run build
+```
+
+Preview the production build:
+
+```sh
+npm run preview
+```
+
+## Editing Documentation
+
+- Put user-facing content under `src/content/docs/en` and
+ `src/content/docs/zh`.
+- Keep English and Chinese files aligned by path when a page exists in both
+ languages.
+- Store shared documentation images in `src/content/docs/assets`.
+- Update the `sidebar` section in `astro.config.mjs` when adding new sections
+ that should appear in navigation.
+- Run `npm run build` before submitting changes to catch broken routes,
+ frontmatter errors, and Starlight content issues.
+
+## Related Repository
+
+- xLLM source code:
diff --git a/docs/README.zh-CN.md b/docs/README.zh-CN.md
new file mode 100644
index 0000000000..e9d442f21a
--- /dev/null
+++ b/docs/README.zh-CN.md
@@ -0,0 +1,91 @@
+# xLLM 文档站
+
+[English](./README.md) | [简体中文](./README.zh-CN.md)
+
+本目录是 [xLLM](https://github.com/jd-opensource/xllm) 的 Astro + Starlight
+文档站。xLLM 是面向国产 AI 加速器的高性能大语言模型推理框架。
+
+站点基于 Starlight 和 `starlight-theme-rapide` 构建,包含自定义顶部导航、
+中英文切换,以及用于将文档正文复制为 Markdown 的 `Copy page` 页面操作。
+
+## 文档结构
+
+文档内容按语言维护在两个并行目录中:
+
+- 英文:`src/content/docs/en`
+- 简体中文:`src/content/docs/zh`
+
+当前站点路由规则如下。部署到 `/xllm` 等 base path 下时,下面的路由都会自动加上
+对应前缀。
+
+- `/` 重定向到 `/en/`
+- `/en/` 对应英文文档
+- `/zh/` 对应简体中文文档
+
+新增或移动页面时,请尽量在两个语言目录中保持相同的相对路径,方便 Starlight
+在同一主题的不同语言版本之间切换。
+
+## 项目结构
+
+```text
+.
+├── astro.config.mjs # Starlight、语言、侧边栏和组件配置
+├── package.json # npm 脚本和依赖
+├── src/
+│ ├── assets/ # 站点级资源,例如 logo
+│ ├── components/ # Starlight 组件覆盖
+│ ├── content/
+│ │ └── docs/
+│ │ ├── en/ # 英文文档
+│ │ ├── zh/ # 简体中文文档
+│ │ └── assets/ # 文档图片和架构图
+│ ├── pages/index.astro # 从 / 重定向到 /en/
+│ └── styles/theme.css # 项目主题样式
+└── public/ # 静态公共资源
+```
+
+## 本地开发
+
+从 xLLM 仓库根目录进入本目录:
+
+```sh
+cd docs
+```
+
+安装依赖:
+
+```sh
+npm install
+```
+
+启动本地开发服务:
+
+```sh
+npm run dev
+```
+
+构建生产站点:
+
+```sh
+npm run build
+```
+
+预览生产构建结果:
+
+```sh
+npm run preview
+```
+
+## 编辑文档
+
+- 面向用户的文档内容放在 `src/content/docs/en` 和 `src/content/docs/zh`。
+- 同一个页面同时存在中英文版本时,尽量保持两个文件的相对路径一致。
+- 共享的文档图片放在 `src/content/docs/assets`。
+- 新增需要出现在导航中的章节时,更新 `astro.config.mjs` 中的 `sidebar`
+ 配置。
+- 提交前运行 `npm run build`,用于检查路由、frontmatter 和 Starlight
+ 内容问题。
+
+## 相关仓库
+
+- xLLM 源码:
diff --git a/docs/assets/groupmatmul_performance.png b/docs/assets/groupmatmul_performance.png
deleted file mode 100644
index 65a23fe8c6..0000000000
Binary files a/docs/assets/groupmatmul_performance.png and /dev/null differ
diff --git a/docs/astro.config.mjs b/docs/astro.config.mjs
new file mode 100644
index 0000000000..0e5c24033a
--- /dev/null
+++ b/docs/astro.config.mjs
@@ -0,0 +1,90 @@
+// @ts-check
+import { defineConfig } from 'astro/config';
+import starlight from '@astrojs/starlight';
+import starlightThemeRapide from 'starlight-theme-rapide';
+
+const base = process.env.BASE_PATH ?? '/';
+const site = process.env.SITE_URL ?? 'https://jd-opensource.github.io/xllm';
+
+// https://astro.build/config
+export default defineConfig({
+ site,
+ base,
+ integrations: [
+ starlight({
+ plugins: [starlightThemeRapide()],
+ customCss: ['./src/styles/theme.css'],
+ components: {
+ Header: './src/components/Header.astro',
+ PageTitle: './src/components/PageTitle.astro',
+ },
+ title: {
+ en: 'xLLM',
+ 'zh-CN': 'xLLM',
+ },
+ locales: {
+ en: {
+ label: 'EN',
+ lang: 'en',
+ },
+ zh: {
+ label: '中',
+ lang: 'zh-CN',
+ },
+ },
+ defaultLocale: 'en',
+ logo: {
+ src: './src/assets/logo_with_llm.png',
+ alt: 'xLLM',
+ replacesTitle: true,
+ },
+ social: [{ icon: 'github', label: 'GitHub', href: 'https://github.com/jd-opensource/xllm' }],
+ sidebar: [
+ { label: 'Home', translations: { 'zh-CN': '主页' }, slug: '' },
+ {
+ label: 'User Guide',
+ translations: { 'zh-CN': '用户指南' },
+ items: [
+ {
+ label: 'Getting Started',
+ translations: { 'zh-CN': '开始使用' },
+ autogenerate: { directory: 'getting_started' },
+ },
+ {
+ label: 'Supported Models',
+ translations: { 'zh-CN': '模型支持列表' },
+ slug: 'supported_models',
+ },
+ {
+ label: 'Popular Model Usage',
+ translations: { 'zh-CN': '热门模型使用' },
+ autogenerate: { directory: 'popular_model_usage' },
+ },
+ ],
+ },
+ {
+ label: 'Advanced Features',
+ translations: { 'zh-CN': '高级功能' },
+ autogenerate: { directory: 'features' },
+ },
+ {
+ label: 'Developer Guide',
+ translations: { 'zh-CN': '开发者指南' },
+ items: [
+ {
+ label: 'Development',
+ translations: { 'zh-CN': '开发' },
+ autogenerate: { directory: 'dev_guide' },
+ },
+ {
+ label: 'Design',
+ translations: { 'zh-CN': '设计文档' },
+ autogenerate: { directory: 'design' },
+ },
+ ],
+ },
+ { label: 'CLI Reference', translations: { 'zh-CN': 'CLI 参考' }, slug: 'cli_reference' },
+ ],
+ }),
+ ],
+});
diff --git a/docs/en/.readthedocs.yaml b/docs/en/.readthedocs.yaml
deleted file mode 100644
index ddc39e591a..0000000000
--- a/docs/en/.readthedocs.yaml
+++ /dev/null
@@ -1,28 +0,0 @@
-# Read the Docs configuration file
-# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details
-
-# Required
-version: 2
-
-# Set the OS, Python version, and other tools you might need
-build:
- os: ubuntu-24.04
- tools:
- python: "3.13"
- jobs:
- pre_build:
- # - cp -r docs/en/* docs/
- - mv docs/en/* docs/
- - rm -rf docs/zh/
- - find docs/ -name "*.md" -exec sed -i 's#../assets/#assets/#g' {} \;
-
-# Build documentation with Mkdocs
-mkdocs:
- configuration: mkdocs_en.yml
-
-# Optionally, but recommended,
-# declare the Python requirements required to build your documentation
-# See https://docs.readthedocs.io/en/stable/guides/reproducible-builds.html
-python:
- install:
- - requirements: docs/requirements.txt
\ No newline at end of file
diff --git a/docs/en/accuracy_test.md b/docs/en/accuracy_test.md
deleted file mode 100644
index d761f2234e..0000000000
--- a/docs/en/accuracy_test.md
+++ /dev/null
@@ -1,59 +0,0 @@
-# 1. LLM Accuracy Test
-## 1.1 Setup ais_bench
-```bash
-# Create a virtual environment for ais_bench using conda or uv
-conda create --name ais_bench python=3.10 -y
-conda activate ais_bench
-
-# Clone ais_bench and install dependencies
-git clone https://gitee.com/aisbench/benchmark.git
-cd benchmark/
-pip3 install -e ./ --use-pep517
-
-# Download the dataset and copy it to the ais_bench directory
-cp -r /path/to/dataset /path/to/benchmark/ais_bench/datasets
-```
-
-## 1.2 Modify Configuration
-Modify the accuracy test configuration file according to your actual situation: `/path/to/benchmark/ais_bench/benchmark/configs/models/vllm_api/vllm_api_general_chat.py`. It is recommended to set the sampling parameters as follows:
-```python
-models = [
- dict(
- attr="service",
- type=VLLMCustomAPIChat,
- abbr='vllm-api-general-chat',
- path="/path/to/model/Qwen3-8B", # Model path
- model="Qwen3-8B", # Model name
- request_rate = 0,
- retry = 2,
- host_ip = "127.0.0.1",
- host_port = 19000, # xllm server port
- max_out_len = 32768, # Limit maximum model length
- batch_size=32,
- trust_remote_code=False,
- generation_kwargs = dict(
- temperature = 0.6,
- # top_k = -1,
- top_p = 0.95,
- # seed = None,
- # repetition_penalty = 1,
- ),
- pred_postprocessor=dict(type=extract_non_reasoning_content)
- )
-]
-```
-
-## 1.3 Launch ais_bench
-Before using ais_bench, you need to start the xllm server first. Use `ais_bench -h` to get parameter descriptions. The launch commands for gsm8k and ceval datasets are as follows:
-```bash
-# Using gsm8k dataset
-ais_bench --models vllm_api_general_chat --datasets gsm8k_gen_0_shot_cot_chat_prompt --dump-eval-details
-
-# Using ceval dataset
-ais_bench --models vllm_api_general_chat --datasets ceval_gen_0_shot_cot_chat_prompt --merge-ds --dump-eval-details
-```
-
-We will integrate ais_bench and datasets (ceval and gsm8k) into the development image in the future. The ais_bench documentation and datasets are as follows:
-* [ais_bench Documentation](https://ais-bench-benchmark.readthedocs.io/en/latest/index.html)
-* [Datasets](https://ais-bench-benchmark.readthedocs.io/en/latest/base_tutorials/all_params/datasets.html)
-
diff --git a/docs/en/features/basics.md b/docs/en/features/basics.md
deleted file mode 100644
index 7705216449..0000000000
--- a/docs/en/features/basics.md
+++ /dev/null
@@ -1,5 +0,0 @@
-# Basics
-
-- xLLM uses a one-device-per-process architecture. Across multiple devices, RPC is used for function calls, and data communication during model computation uses device collective communication libraries.
-
-- HCCL/LCCL are high-performance collective communication frameworks that provide data-parallel and model-parallel collective communication for both single-node multi-device and multi-node multi-device scenarios.
diff --git a/docs/en/features/continuous_scheduler.md b/docs/en/features/continuous_scheduler.md
deleted file mode 100644
index bd96f9ab5e..0000000000
--- a/docs/en/features/continuous_scheduler.md
+++ /dev/null
@@ -1,7 +0,0 @@
-# Continuous Scheduler
-
-## Feature Introduction
-xLLM implements a scheduling strategy that supports continuous batching. Continuous batching is a dynamic batching strategy that does not wait for a batch to be filled. Instead, it starts processing as soon as requests are available, while continuously accepting new requests and adding them to the currently executing batch. This approach significantly reduces latency while maintaining high throughput.
-
-## Usage
-xLLM implements the continuous batching scheduling strategy. And, the default scheduler is chunked prefill, `enable_chunked_prefill=true` by default.
diff --git a/docs/en/features/groupgemm.md b/docs/en/features/groupgemm.md
deleted file mode 100644
index fd8de8e466..0000000000
--- a/docs/en/features/groupgemm.md
+++ /dev/null
@@ -1,40 +0,0 @@
-# GroupGEMM Operator Optimization
-
-## Background
-The Mixture of Experts (MoE) architecture has become an important paradigm for scaling large language models. Its core idea is to dynamically route input tokens to different expert sub-networks for processing. During inference, the GroupGEMM operator is a key computational unit in the MoE architecture, responsible for efficiently executing parallel computations of multiple expert matrix multiplications, which dominate the overall inference time.
-
-## Function Introduction
-Considering the current performance bottleneck of GroupGEMM being I/O constrained, an optimization scheme is proposed that replaces data copying with index reordering, eliminating multiple copies of the token vector and instead maintaining an index table for expert allocation. Through this line number index, tokens are directly mapped to the corresponding expert computation units, and the allocation scheduling of tokens is fused with matrix multiplication into a single kernel.
-
-## User Interface
-
-### Operator Direct Call API
-```c++
-aclnnStatus aclnnIndexGroupMatmulGetWorkspaceSize(
- const aclTensorList *x,
- const aclTensorList *weight,
- const aclTensorList *scale,
- const aclTensorList *perTokenScale,
- const aclTensor *groupList,
- const aclTensorList *out,
- uint64_t *workspaceSize,
- aclOpExecutor **executor);
-
-aclnnStatus aclnnIndexGroupMatmul(
- void *workspace,
- uint64_t workspaceSize,
- aclOpExecutor *executor,
- aclrtStream stream);
-```
-
-- `x`: The input tensor list containing the data to be processed.
-- `weight`: The weight tensor containing the model parameters.
-- `scale`: The scaling factor used to adjust the values of the input tensors.
-- `perTokenScale`: The scaling factor for each token, used for dynamic adjustment.
-- `groupList`: The list of expert groups indicating which experts participate in the computation.
-- `out`: The output tensor list that stores the computation results.
-
-## Performance Effects
-
-
-* The optimized GroupMatmul operator shows significant advantages in computation time, especially when \( k = 128 \) and \( m = 64 \). As shown in the figure, the computation delay of the optimized operator is **reduced by 50%**.
\ No newline at end of file
diff --git a/docs/en/features/overview.md b/docs/en/features/overview.md
deleted file mode 100644
index d0a810def7..0000000000
--- a/docs/en/features/overview.md
+++ /dev/null
@@ -1,51 +0,0 @@
-# Overall Architecture
-
-## Backgroud
-
-In recent years, with the groundbreaking progress of large language models (LLMs) ranging from tens of billions to trillions of parameters (such as GPT, Claude, DeepSeek, LLaMA, etc.) in the fields of natural language processing and multimodal interaction, the industry has an urgent need for efficient inference engines and service systems. How to reduce cluster inference costs and improve inference efficiency has become a key challenge for achieving large-scale commercial deployment.
-
-Although a number of optimization engines for large model inference have emerged, several technical bottlenecks remain in practical deployment:
-
-* **Hardware Adaptability Challenges:** Existing inference engines lack sufficient support for the architectural characteristics of specialized accelerators like domestic chips, making it difficult to fully exploit the performance potential of heterogeneous computing hardware, leading to low computational resource utilization.
-* **MoE Architecture Optimization Difficulties:** The token distribution process in expert parallelism mechanisms generates significant All-to-All communication overhead, while dynamic routing strategies cause expert load imbalance, severely constraining system scalability.
-* **Long Context Management Bottlenecks:** As model context windows continue to expand, the efficiency of optimizations in KV cache handling—such as memory fragmentation management and cross-node synchronization—directly impacts overall inference throughput performance.
-* **Hybrid Deployment Efficiency Limitations:** Existing inference clusters struggle to simultaneously guarantee service quality (SLO) and optimize resource utilization when handling both online services and offline tasks.
-* **Insufficient Dynamic PD Adaptation:** When input/output sequence lengths fluctuate drastically, static PD resource partitioning lacks the ability to adjust PD resource configurations in real-time. This can lead to idle GPU resources and poses a risk of SLO violations.
-
-To address these challenges, we present xLLM—an efficient and user-friendly open-source intelligent inference framework that provides enterprise-grade service guarantees and high-performance engine computing capabilities for model inference on domestic chips.
-
-## Feature Introduction
-
-xLLM provides intelligent computing capabilities, implementing joint inference acceleration across multiple computational system layers and algorithm-driven layers:
-
-### Computational System Layer
-
-#### Multi-Level Pipeline Execution Orchestration
-Asynchronizes CPU scheduling at the framework layer to pipeline it with chip inference computation, reducing computation bubbles; at the model graph layer, splits single batches to create pipelines between micro-batches, overlapping computation and communication; at the operator kernel layer, pipelines different computing units, overlapping computation and memory access.
-#### Dynamic Shape Graph Execution Optimization
-Addressing the static graph adaptation problem for large language models processing dynamic inputs (e.g., variable sequence lengths and batch sizes), xLLM achieves dynamic adaptation through parametric design capturing input dimensions. It combines a multi-graph caching scheme to reduce compilation overhead and uses a managed memory pool instead of absolute addresses to ensure safe reuse, ultimately achieving high execution efficiency while maintaining high flexibility.
-#### Operator Optimization
-xLLM implements specific optimizations for key operators in LLMs on domestic hardware chips, including GroupMatmul, Chunked Prefill, and others.
-#### xTensor Memory Management
-The xTensor memory management framework employs a method of *pre-allocated physical memory page pools + contiguous virtual address mapping*. It achieves efficient dynamic memory management through dynamic on-demand mapping of physical pages, reuse of reusable memory pages (Reusable), and optimized scheduling with asynchronous pre-mapping. Combined with NPU operator adaptation (such as virtual address FlashMLA), it results in improved memory utilization and reduced latency.
-
-### Algorithm-Driven Layer
-
-#### PD Separation
-xLLM fully supports PD separation scenarios, enabling efficient management of PD instances, communication between PD instances, and KV cache transfer.
-#### Global Scheduling
-xLLM provides intelligent, full-lifecycle resource scheduling management for requests and instances.
-##### Instance Scheduling
-We have implemented various instance scheduling strategies to select how to assign instances to more suitable ones. These include a simple Round Robin strategy, a prefix cache-aware strategy based on the prefix cache hit rate of requests on each instance, and a KV cache-aware strategy based on the free memory level of instances. Furthermore, for PD separation scenarios, where static PD ratios often struggle with traffic fluctuations and sudden changes in request input/output lengths, we implemented an adaptive PD dynamic scheduler responsible for global instance allocation for online requests and runtime PD dynamic adjustment.
-##### Request Scheduling
-We have implemented various request scheduling strategies supporting continuous batching, including chunked prefill, prefill priority, decode priority, and other batch strategies, all while fully supporting PD separation scenarios.
-#### Global KV Cache Management
-Utilizes ETCD as a metadata service middleware at the global level for cluster service registration, load information synchronization, and global cache state management. Each compute instance maintains a local multi-level cache pool. Regarding scheduling strategy, the system adopts a dynamic decision-making mechanism based on KV cache: it first performs prefix matching detection, calculates the KV cache reuse rate of candidate nodes, and finally selects the node with the optimal comprehensive performance for processing, achieving dynamic offloading and migration of KV cache.
-#### Speculative Inference
-xLLM incorporates an optimized speculative inference algorithm that generates multiple tokens at once to boost throughput. xLLM reduces communication costs by sinking the speculative module and optimizes speculative inference computation through methods like overlapping scheduling and computation timelines and reducing operator data movement in speculative scenarios.
-#### MoE Load Balancing
-xLLM implements expert weight updates based on historical expert load statistics for MoE models. During inference, it achieves effective dynamic load balancing through efficient expert load statistics and double-buffered, seamless expert weight updates.
-
-### Multimodal Support
-
-xLLM provides comprehensive support for various multimodal models, including Qwen2-VL and MiniCPMV.
diff --git a/docs/en/features/ppmatmul.md b/docs/en/features/ppmatmul.md
deleted file mode 100644
index 07ac17338f..0000000000
--- a/docs/en/features/ppmatmul.md
+++ /dev/null
@@ -1,36 +0,0 @@
-# PpMatmul Operator Optimization
-
-## Background
-
-In the inference of large models, matrix multiplication accounts for a high proportion and takes a long time. We have optimized the implementation of the matrix multiplication operator.
-
-## Feature Introduction
-
-The PpMatmul operator uses a Tiling strategy to decompose matrix multiplication into multiple smaller matrix multiplication tasks. However, when the number of tiles is small, tasks cannot be evenly distributed across all NPU cores, leading to the tail effect problem, which affects computational efficiency. We optimize the performance of the PpMatmul operator by prefetching memory or redistributing tasks.
-
-## User Interface
-
-### Operator Direct Call API
-
-```cpp
-aclnnStatus aclnnPpMatmulOptGetWorkspaceSize(
- const aclTensor *a,
- const aclTensor *b,
- const aclTensor *out,
- uint64_t *workspaceSize,
- aclOpExecutor **executor);
-
-aclnnStatus aclnnPpMatmulOpt(
- void *workspace,
- uint64_t workspaceSize,
- aclOpExecutor *executor,
- aclrtStream stream);
-```
-
-- `a`: Input matrix A.
-- `b`: Input matrix B.
-- `out`: Output matrix, storing the computation result.
-
-## Performance Effect
-
-For cases with a small number of tiles (e.g., when M is small, corresponding to a small batch size), there is an **18%** performance improvement of the operator compared to before optimization when (TP=4).
\ No newline at end of file
diff --git a/docs/en/features/topk_topp.md b/docs/en/features/topk_topp.md
deleted file mode 100644
index eb842f409f..0000000000
--- a/docs/en/features/topk_topp.md
+++ /dev/null
@@ -1,27 +0,0 @@
-# Topk & Topp Operator Optimization
-
-## Background
-
-In natural language generation tasks, the topK and topP sampling strategies are widely used to control the diversity and quality of generated text. However, in small models, the computation time for these two strategies is relatively long. This is mainly due to the fewer parameters in small models, which leads to reduced efficiency in sorting and filtering when processing probability distributions, thereby affecting generation speed. Therefore, optimizing the implementation of topK and topP in small models can enhance their sampling efficiency.
-
-## Feature Introduction
-
-The implementation of the topKtopP operator merges multiple small operators, such as sorting, topK, softmax, and topP, into a single large operator, thereby improving computational efficiency and performance.
-
-## User Interface
-
-### Operator Call API
-
-```c++
-void top_k_top_p(torch::Tensor& logits,
- const torch::Tensor& topK,
- const torch::Tensor& topP);
-```
-
-- `logits`: The input logits tensor containing the model's output scores.
-- `topK`: The threshold tensor for selecting the top K probabilities.
-- `topP`: The threshold tensor for selecting the cumulative probabilities.
-
-## Performance Effect
-
-* After using the topKtopP fused operator, in the qwen2-0.5B model, TTOT **decreased by 37%**, and TTFT **increased by 10%**.
\ No newline at end of file
diff --git a/docs/en/getting_started/disagg_pd.md b/docs/en/getting_started/disagg_pd.md
deleted file mode 100644
index 564c0532ef..0000000000
--- a/docs/en/getting_started/disagg_pd.md
+++ /dev/null
@@ -1,99 +0,0 @@
-# PD disaggregation
-
-`xllm` supports PD disaggregation deployment, which requires integration with our other open-source library [xllm service](https://github.com/jd-opensource/xllm-service).
-
-## xLLM Service Dependencies
-
-First, download and install `xllm service`, similar to installing and compiling `xllm`:
-```bash
-git clone https://github.com/jd-opensource/xllm-service
-cd xllm_service
-git submodule init
-git submodule update
-```
-
-
-### etcd Installation
-
-`xllm_service` compilation and operation depend on [etcd](https://github.com/etcd-io/etcd).Use the [installation script](https://github.com/etcd-io/etcd/releases) provided by etcd for installation. The default installation path provided by the script is `/tmp/etcd-download-test/etcd`. You can either manually modify the installation path in the script or manually migrate after running the script:
-```bash
-mv /tmp/etcd-download-test/etcd /path/to/your/etcd
-```
-
-### xLLM Service Compilation
-Apply patch:
-```bash
-sh prepare.sh
-```
-Then execute the compilation:
-```bash
-mkdir -p build
-cd build
-cmake ..
-make -j 8
-cd ..
-```
-
-!!! warning "Potential Errors"
- You may encounter installation errors related to `boost-locale` and `boost-interprocess`: `vcpkg-src/packages/boost-locale_x64-linux/include: No such file or directory`, `/vcpkg-src/packages/boost-interprocess_x64-linux/include: No such file or directory`
- Reinstall these packages using `vcpkg`:
- ```bash
- /path/to/vcpkg remove boost-locale boost-interprocess
- /path/to/vcpkg install boost-locale:x64-linux
- /path/to/vcpkg install boost-interprocess:x64-linux
- ```
-
-## PD Disaggregation Execution
-
-Start etcd:
-```bash
-./etcd-download-test/etcd --listen-peer-urls 'http://localhost:2390' --listen-client-urls 'http://localhost:2389' --advertise-client-urls 'http://localhost:2391'
-```
-
-Start xllm service:
-```bash
-ENABLE_DECODE_RESPONSE_TO_SERVICE=true ./xllm_master_serving --etcd_addr="127.0.0.1:12389" --http_server_port 28888 --rpc_server_port 28889 --tokenizer_path=/path/to/tokenizer_config_dir/
-```
-
-Taking Qwen2-7B as an example:
-
-- Start Prefill Instance
- ```bash
- /path/to/xllm --model=path/to/Qwen2-7B-Instruct \
- --port=8010 \
- --devices="npu:0" \
- --master_node_addr="127.0.0.1:18888" \
- --enable_prefix_cache=false \
- --enable_chunked_prefill=false \
- --enable_disagg_pd=true \
- --instance_role=PREFILL \
- --etcd_addr=127.0.0.1:12389 \
- --transfer_listen_port=26000 \
- --disagg_pd_port=7777 \
- --node_rank=0 \
- --nnodes=1
- ```
-- Start Decode Instance
- ```bash
- /path/to/xllm --model=path/to/Qwen2-7B-Instruct \
- --port=8020 \
- --devices="npu:1" \
- --master_node_addr="127.0.0.1:18898" \
- --enable_prefix_cache=false \
- --enable_chunked_prefill=false \
- --enable_disagg_pd=true \
- --instance_role=DECODE \
- --etcd_addr=127.0.0.1:12389 \
- --transfer_listen_port=26100 \
- --disagg_pd_port=7787 \
- --node_rank=0 \
- --nnodes=1
- ```
-
-Important notes:
-
-- PD disaggregation requires reading the `/etc/hccn.conf` file. Make sure this file on the physical machine is mapped into the container.
-
-- `etcd_addr` must match the `etcd_addr` of `xllm_service`
-
-The test command is similar to above. Note that the `PORT` in `curl http://localhost:{PORT}/v1/chat/completions ...` should be the `port` of the `http_server_port` of xLLM service.
\ No newline at end of file
diff --git a/docs/mkdocs/javascripts/mathjax.js b/docs/mkdocs/javascripts/mathjax.js
deleted file mode 100644
index f0d0ad52c9..0000000000
--- a/docs/mkdocs/javascripts/mathjax.js
+++ /dev/null
@@ -1,19 +0,0 @@
-window.MathJax = {
- tex: {
- inlineMath: [["\\(", "\\)"]],
- displayMath: [["\\[", "\\]"]],
- processEscapes: true,
- processEnvironments: true
- },
- options: {
- ignoreHtmlClass: ".*|",
- processHtmlClass: "arithmatex"
- }
-};
-
-document$.subscribe(() => {
- MathJax.startup.output.clearCache()
- MathJax.typesetClear()
- MathJax.texReset()
- MathJax.typesetPromise()
-})
\ No newline at end of file
diff --git a/docs/mkdocs/overrides/.icons/email-fill.svg b/docs/mkdocs/overrides/.icons/email-fill.svg
deleted file mode 100644
index f8623f2fcf..0000000000
--- a/docs/mkdocs/overrides/.icons/email-fill.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/docs/mkdocs/overrides/.icons/gitcodeai.svg b/docs/mkdocs/overrides/.icons/gitcodeai.svg
deleted file mode 100644
index 665891a4cf..0000000000
--- a/docs/mkdocs/overrides/.icons/gitcodeai.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/docs/mkdocs/stylesheets/extra.css b/docs/mkdocs/stylesheets/extra.css
deleted file mode 100644
index dcdcc20cf7..0000000000
--- a/docs/mkdocs/stylesheets/extra.css
+++ /dev/null
@@ -1,27 +0,0 @@
-:root > * {
- --md-primary-fg-color: #F1002B;
- --md-primary-fg-color--light: #F1002B;
- --md-primary-fg-color--dark: #af0510;
-
- --md-accent-fg-color: #F1002B;
- --md-accent-fg-color--light: #F1002B;
- --md-accent-fg-color--dark: #af0510;
-}
-
-/* :root > * {
- --md-footer-bg-color: var(--md-primary-fg-color);
- --md-footer-fg-color: var(--md-primary-bg-color);
- --md-footer-fg-color--light: var(--md-primary-bg-color--light);
- --md-footer-fg-color--lighter: var(--md-primary-bg-color--lighter);
-} */
-
-[data-md-color-scheme="jd"] {
- --md-primary-fg-color: #FB002B;
- --md-primary-fg-color--light: #FB002B;
- --md-primary-fg-color--dark: #af0510;
-
- --md-accent-fg-color: #FB002B;
- --md-accent-fg-color--light: #FB002B;
- --md-accent-fg-color--dark: #af0510;
-}
-
diff --git a/docs/package-lock.json b/docs/package-lock.json
new file mode 100644
index 0000000000..372b0b7629
--- /dev/null
+++ b/docs/package-lock.json
@@ -0,0 +1,6347 @@
+{
+ "name": "xllm-docs",
+ "version": "0.0.1",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "xllm-docs",
+ "version": "0.0.1",
+ "dependencies": {
+ "@astrojs/starlight": "^0.38.4",
+ "astro": "^6.1.9",
+ "sharp": "^0.34.5",
+ "starlight-theme-rapide": "^0.5.2"
+ }
+ },
+ "node_modules/@astrojs/compiler": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/@astrojs/compiler/-/compiler-3.0.1.tgz",
+ "integrity": "sha512-z97oYbdebO5aoWzuJ/8q5hLK232+17KcLZ7cJ8BCWk6+qNzVxn/gftC0KzMBUTD8WAaBkPpNSQK6PXLnNrZ0CA==",
+ "license": "MIT"
+ },
+ "node_modules/@astrojs/internal-helpers": {
+ "version": "0.9.0",
+ "resolved": "https://registry.npmjs.org/@astrojs/internal-helpers/-/internal-helpers-0.9.0.tgz",
+ "integrity": "sha512-GdYkzR26re8izmyYlBqf4z2s7zNngmWLFuxw0UKiPNqHraZGS6GKWIwSHgS22RDlu2ePFJ8bzmpBcUszut/SDg==",
+ "license": "MIT",
+ "dependencies": {
+ "picomatch": "^4.0.4"
+ }
+ },
+ "node_modules/@astrojs/markdown-remark": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/@astrojs/markdown-remark/-/markdown-remark-7.1.1.tgz",
+ "integrity": "sha512-C6e9BnLGlbdv6bV8MYGeHpHxsUHrCrB4OuRLqi5LI7oiBVcBcqfUN06zpwFQdHgV48QCCrMmLpyqBr7VqC+swA==",
+ "license": "MIT",
+ "dependencies": {
+ "@astrojs/internal-helpers": "0.9.0",
+ "@astrojs/prism": "4.0.1",
+ "github-slugger": "^2.0.0",
+ "hast-util-from-html": "^2.0.3",
+ "hast-util-to-text": "^4.0.2",
+ "js-yaml": "^4.1.1",
+ "mdast-util-definitions": "^6.0.0",
+ "rehype-raw": "^7.0.0",
+ "rehype-stringify": "^10.0.1",
+ "remark-gfm": "^4.0.1",
+ "remark-parse": "^11.0.0",
+ "remark-rehype": "^11.1.2",
+ "remark-smartypants": "^3.0.2",
+ "retext-smartypants": "^6.2.0",
+ "shiki": "^4.0.0",
+ "smol-toml": "^1.6.0",
+ "unified": "^11.0.5",
+ "unist-util-remove-position": "^5.0.0",
+ "unist-util-visit": "^5.1.0",
+ "unist-util-visit-parents": "^6.0.2",
+ "vfile": "^6.0.3"
+ }
+ },
+ "node_modules/@astrojs/mdx": {
+ "version": "5.0.4",
+ "resolved": "https://registry.npmjs.org/@astrojs/mdx/-/mdx-5.0.4.tgz",
+ "integrity": "sha512-tSbuuYueNODiFAFaME7pjHY5lOLoxBYJi1cKd6scw9+a4ZO7C7UGdafEoVAQvOV2eO8a6RaHSAJYGVPL1w8BPA==",
+ "license": "MIT",
+ "dependencies": {
+ "@astrojs/markdown-remark": "7.1.1",
+ "@mdx-js/mdx": "^3.1.1",
+ "acorn": "^8.16.0",
+ "es-module-lexer": "^2.0.0",
+ "estree-util-visit": "^2.0.0",
+ "hast-util-to-html": "^9.0.5",
+ "piccolore": "^0.1.3",
+ "rehype-raw": "^7.0.0",
+ "remark-gfm": "^4.0.1",
+ "remark-smartypants": "^3.0.2",
+ "source-map": "^0.7.6",
+ "unist-util-visit": "^5.1.0",
+ "vfile": "^6.0.3"
+ },
+ "engines": {
+ "node": ">=22.12.0"
+ },
+ "peerDependencies": {
+ "astro": "^6.0.0"
+ }
+ },
+ "node_modules/@astrojs/prism": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/@astrojs/prism/-/prism-4.0.1.tgz",
+ "integrity": "sha512-nksZQVjlferuWzhPsBpQ1JE5XuKAf1id1/9Hj4a9KG4+ofrlzxUUwX4YGQF/SuDiuiGKEnzopGOt38F3AnVWsQ==",
+ "license": "MIT",
+ "dependencies": {
+ "prismjs": "^1.30.0"
+ },
+ "engines": {
+ "node": ">=22.12.0"
+ }
+ },
+ "node_modules/@astrojs/sitemap": {
+ "version": "3.7.2",
+ "resolved": "https://registry.npmjs.org/@astrojs/sitemap/-/sitemap-3.7.2.tgz",
+ "integrity": "sha512-PqkzkcZTb5ICiyIR8VoKbIAP/laNRXi5tw616N1Ckk+40oNB8Can1AzVV56lrbC5GKSZFCyJYUVYqVivMisvpA==",
+ "license": "MIT",
+ "dependencies": {
+ "sitemap": "^9.0.0",
+ "stream-replace-string": "^2.0.0",
+ "zod": "^4.3.6"
+ }
+ },
+ "node_modules/@astrojs/starlight": {
+ "version": "0.38.4",
+ "resolved": "https://registry.npmjs.org/@astrojs/starlight/-/starlight-0.38.4.tgz",
+ "integrity": "sha512-TGFIr2aVC+gcZCPQzJOO4ZnA/yL3jRnsUDcKlVdEhxhxaOQnWr9lZ9MRScg9zU6uh3HVeZAmmjkLCdTlHdcaZA==",
+ "license": "MIT",
+ "dependencies": {
+ "@astrojs/markdown-remark": "^7.0.0",
+ "@astrojs/mdx": "^5.0.0",
+ "@astrojs/sitemap": "^3.7.1",
+ "@pagefind/default-ui": "^1.3.0",
+ "@types/hast": "^3.0.4",
+ "@types/js-yaml": "^4.0.9",
+ "@types/mdast": "^4.0.4",
+ "astro-expressive-code": "^0.41.6",
+ "bcp-47": "^2.1.0",
+ "hast-util-from-html": "^2.0.1",
+ "hast-util-select": "^6.0.2",
+ "hast-util-to-string": "^3.0.0",
+ "hastscript": "^9.0.0",
+ "i18next": "^23.11.5",
+ "js-yaml": "^4.1.0",
+ "klona": "^2.0.6",
+ "magic-string": "^0.30.17",
+ "mdast-util-directive": "^3.0.0",
+ "mdast-util-to-markdown": "^2.1.0",
+ "mdast-util-to-string": "^4.0.0",
+ "pagefind": "^1.3.0",
+ "rehype": "^13.0.1",
+ "rehype-format": "^5.0.0",
+ "remark-directive": "^3.0.0",
+ "ultrahtml": "^1.6.0",
+ "unified": "^11.0.5",
+ "unist-util-visit": "^5.0.0",
+ "vfile": "^6.0.2"
+ },
+ "peerDependencies": {
+ "astro": "^6.0.0"
+ }
+ },
+ "node_modules/@astrojs/telemetry": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/@astrojs/telemetry/-/telemetry-3.3.1.tgz",
+ "integrity": "sha512-7fcIxXS9J4ls5tr8b3ww9rbAIz2+HrhNJYZdkAhhB4za/I5IZ/60g+Bs8q7zwG0tOIZfNB4JWhVJ1Qkl/OrNCw==",
+ "license": "MIT",
+ "dependencies": {
+ "ci-info": "^4.4.0",
+ "dlv": "^1.1.3",
+ "dset": "^3.1.4",
+ "is-docker": "^4.0.0",
+ "is-wsl": "^3.1.1",
+ "which-pm-runs": "^1.1.0"
+ },
+ "engines": {
+ "node": "18.20.8 || ^20.3.0 || >=22.0.0"
+ }
+ },
+ "node_modules/@babel/helper-string-parser": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz",
+ "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-identifier": {
+ "version": "7.28.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz",
+ "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/parser": {
+ "version": "7.29.2",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.2.tgz",
+ "integrity": "sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.29.0"
+ },
+ "bin": {
+ "parser": "bin/babel-parser.js"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@babel/runtime": {
+ "version": "7.29.2",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.2.tgz",
+ "integrity": "sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/types": {
+ "version": "7.29.0",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz",
+ "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-string-parser": "^7.27.1",
+ "@babel/helper-validator-identifier": "^7.28.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@capsizecss/unpack": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/@capsizecss/unpack/-/unpack-4.0.0.tgz",
+ "integrity": "sha512-VERIM64vtTP1C4mxQ5thVT9fK0apjPFobqybMtA1UdUujWka24ERHbRHFGmpbbhp73MhV+KSsHQH9C6uOTdEQA==",
+ "license": "MIT",
+ "dependencies": {
+ "fontkitten": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@clack/core": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@clack/core/-/core-1.2.0.tgz",
+ "integrity": "sha512-qfxof/3T3t9DPU/Rj3OmcFyZInceqj/NVtO9rwIuJqCUgh32gwPjpFQQp/ben07qKlhpwq7GzfWpST4qdJ5Drg==",
+ "license": "MIT",
+ "dependencies": {
+ "fast-wrap-ansi": "^0.1.3",
+ "sisteransi": "^1.0.5"
+ }
+ },
+ "node_modules/@clack/prompts": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@clack/prompts/-/prompts-1.2.0.tgz",
+ "integrity": "sha512-4jmztR9fMqPMjz6H/UZXj0zEmE43ha1euENwkckKKel4XpSfokExPo5AiVStdHSAlHekz4d0CA/r45Ok1E4D3w==",
+ "license": "MIT",
+ "dependencies": {
+ "@clack/core": "1.2.0",
+ "fast-string-width": "^1.1.0",
+ "fast-wrap-ansi": "^0.1.3",
+ "sisteransi": "^1.0.5"
+ }
+ },
+ "node_modules/@ctrl/tinycolor": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-4.2.0.tgz",
+ "integrity": "sha512-kzyuwOAQnXJNLS9PSyrk0CWk35nWJW/zl/6KvnTBMFK65gm7U1/Z5BqjxeapjZCIhQcM/DsrEmcbRwDyXyXK4A==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/@emnapi/runtime": {
+ "version": "1.10.0",
+ "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.10.0.tgz",
+ "integrity": "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==",
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "tslib": "^2.4.0"
+ }
+ },
+ "node_modules/@esbuild/aix-ppc64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.7.tgz",
+ "integrity": "sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==",
+ "cpu": [
+ "ppc64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "aix"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/android-arm": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.7.tgz",
+ "integrity": "sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/android-arm64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.7.tgz",
+ "integrity": "sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/android-x64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.7.tgz",
+ "integrity": "sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/darwin-arm64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.7.tgz",
+ "integrity": "sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/darwin-x64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.7.tgz",
+ "integrity": "sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/freebsd-arm64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.7.tgz",
+ "integrity": "sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/freebsd-x64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.7.tgz",
+ "integrity": "sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-arm": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.7.tgz",
+ "integrity": "sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-arm64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.7.tgz",
+ "integrity": "sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-ia32": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.7.tgz",
+ "integrity": "sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg==",
+ "cpu": [
+ "ia32"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-loong64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.7.tgz",
+ "integrity": "sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q==",
+ "cpu": [
+ "loong64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-mips64el": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.7.tgz",
+ "integrity": "sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw==",
+ "cpu": [
+ "mips64el"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-ppc64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.7.tgz",
+ "integrity": "sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ==",
+ "cpu": [
+ "ppc64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-riscv64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.7.tgz",
+ "integrity": "sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ==",
+ "cpu": [
+ "riscv64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-s390x": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.7.tgz",
+ "integrity": "sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw==",
+ "cpu": [
+ "s390x"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-x64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.7.tgz",
+ "integrity": "sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/netbsd-arm64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.7.tgz",
+ "integrity": "sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/netbsd-x64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.7.tgz",
+ "integrity": "sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/openbsd-arm64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.7.tgz",
+ "integrity": "sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/openbsd-x64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.7.tgz",
+ "integrity": "sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/openharmony-arm64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.7.tgz",
+ "integrity": "sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openharmony"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/sunos-x64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.7.tgz",
+ "integrity": "sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "sunos"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/win32-arm64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.7.tgz",
+ "integrity": "sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/win32-ia32": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.7.tgz",
+ "integrity": "sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw==",
+ "cpu": [
+ "ia32"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/win32-x64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.7.tgz",
+ "integrity": "sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@expressive-code/core": {
+ "version": "0.41.7",
+ "resolved": "https://registry.npmjs.org/@expressive-code/core/-/core-0.41.7.tgz",
+ "integrity": "sha512-ck92uZYZ9Wba2zxkiZLsZGi9N54pMSAVdrI9uW3Oo9AtLglD5RmrdTwbYPCT2S/jC36JGB2i+pnQtBm/Ib2+dg==",
+ "license": "MIT",
+ "dependencies": {
+ "@ctrl/tinycolor": "^4.0.4",
+ "hast-util-select": "^6.0.2",
+ "hast-util-to-html": "^9.0.1",
+ "hast-util-to-text": "^4.0.1",
+ "hastscript": "^9.0.0",
+ "postcss": "^8.4.38",
+ "postcss-nested": "^6.0.1",
+ "unist-util-visit": "^5.0.0",
+ "unist-util-visit-parents": "^6.0.1"
+ }
+ },
+ "node_modules/@expressive-code/plugin-frames": {
+ "version": "0.41.7",
+ "resolved": "https://registry.npmjs.org/@expressive-code/plugin-frames/-/plugin-frames-0.41.7.tgz",
+ "integrity": "sha512-diKtxjQw/979cTglRFaMCY/sR6hWF0kSMg8jsKLXaZBSfGS0I/Hoe7Qds3vVEgeoW+GHHQzMcwvgx/MOIXhrTA==",
+ "license": "MIT",
+ "dependencies": {
+ "@expressive-code/core": "^0.41.7"
+ }
+ },
+ "node_modules/@expressive-code/plugin-shiki": {
+ "version": "0.41.7",
+ "resolved": "https://registry.npmjs.org/@expressive-code/plugin-shiki/-/plugin-shiki-0.41.7.tgz",
+ "integrity": "sha512-DL605bLrUOgqTdZ0Ot5MlTaWzppRkzzqzeGEu7ODnHF39IkEBbFdsC7pbl3LbUQ1DFtnfx6rD54k/cdofbW6KQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@expressive-code/core": "^0.41.7",
+ "shiki": "^3.2.2"
+ }
+ },
+ "node_modules/@expressive-code/plugin-shiki/node_modules/@shikijs/core": {
+ "version": "3.23.0",
+ "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-3.23.0.tgz",
+ "integrity": "sha512-NSWQz0riNb67xthdm5br6lAkvpDJRTgB36fxlo37ZzM2yq0PQFFzbd8psqC2XMPgCzo1fW6cVi18+ArJ44wqgA==",
+ "license": "MIT",
+ "dependencies": {
+ "@shikijs/types": "3.23.0",
+ "@shikijs/vscode-textmate": "^10.0.2",
+ "@types/hast": "^3.0.4",
+ "hast-util-to-html": "^9.0.5"
+ }
+ },
+ "node_modules/@expressive-code/plugin-shiki/node_modules/@shikijs/engine-javascript": {
+ "version": "3.23.0",
+ "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-3.23.0.tgz",
+ "integrity": "sha512-aHt9eiGFobmWR5uqJUViySI1bHMqrAgamWE1TYSUoftkAeCCAiGawPMwM+VCadylQtF4V3VNOZ5LmfItH5f3yA==",
+ "license": "MIT",
+ "dependencies": {
+ "@shikijs/types": "3.23.0",
+ "@shikijs/vscode-textmate": "^10.0.2",
+ "oniguruma-to-es": "^4.3.4"
+ }
+ },
+ "node_modules/@expressive-code/plugin-shiki/node_modules/@shikijs/engine-oniguruma": {
+ "version": "3.23.0",
+ "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-3.23.0.tgz",
+ "integrity": "sha512-1nWINwKXxKKLqPibT5f4pAFLej9oZzQTsby8942OTlsJzOBZ0MWKiwzMsd+jhzu8YPCHAswGnnN1YtQfirL35g==",
+ "license": "MIT",
+ "dependencies": {
+ "@shikijs/types": "3.23.0",
+ "@shikijs/vscode-textmate": "^10.0.2"
+ }
+ },
+ "node_modules/@expressive-code/plugin-shiki/node_modules/@shikijs/langs": {
+ "version": "3.23.0",
+ "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-3.23.0.tgz",
+ "integrity": "sha512-2Ep4W3Re5aB1/62RSYQInK9mM3HsLeB91cHqznAJMuylqjzNVAVCMnNWRHFtcNHXsoNRayP9z1qj4Sq3nMqYXg==",
+ "license": "MIT",
+ "dependencies": {
+ "@shikijs/types": "3.23.0"
+ }
+ },
+ "node_modules/@expressive-code/plugin-shiki/node_modules/@shikijs/themes": {
+ "version": "3.23.0",
+ "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-3.23.0.tgz",
+ "integrity": "sha512-5qySYa1ZgAT18HR/ypENL9cUSGOeI2x+4IvYJu4JgVJdizn6kG4ia5Q1jDEOi7gTbN4RbuYtmHh0W3eccOrjMA==",
+ "license": "MIT",
+ "dependencies": {
+ "@shikijs/types": "3.23.0"
+ }
+ },
+ "node_modules/@expressive-code/plugin-shiki/node_modules/@shikijs/types": {
+ "version": "3.23.0",
+ "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-3.23.0.tgz",
+ "integrity": "sha512-3JZ5HXOZfYjsYSk0yPwBrkupyYSLpAE26Qc0HLghhZNGTZg/SKxXIIgoxOpmmeQP0RRSDJTk1/vPfw9tbw+jSQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@shikijs/vscode-textmate": "^10.0.2",
+ "@types/hast": "^3.0.4"
+ }
+ },
+ "node_modules/@expressive-code/plugin-shiki/node_modules/shiki": {
+ "version": "3.23.0",
+ "resolved": "https://registry.npmjs.org/shiki/-/shiki-3.23.0.tgz",
+ "integrity": "sha512-55Dj73uq9ZXL5zyeRPzHQsK7Nbyt6Y10k5s7OjuFZGMhpp4r/rsLBH0o/0fstIzX1Lep9VxefWljK/SKCzygIA==",
+ "license": "MIT",
+ "dependencies": {
+ "@shikijs/core": "3.23.0",
+ "@shikijs/engine-javascript": "3.23.0",
+ "@shikijs/engine-oniguruma": "3.23.0",
+ "@shikijs/langs": "3.23.0",
+ "@shikijs/themes": "3.23.0",
+ "@shikijs/types": "3.23.0",
+ "@shikijs/vscode-textmate": "^10.0.2",
+ "@types/hast": "^3.0.4"
+ }
+ },
+ "node_modules/@expressive-code/plugin-text-markers": {
+ "version": "0.41.7",
+ "resolved": "https://registry.npmjs.org/@expressive-code/plugin-text-markers/-/plugin-text-markers-0.41.7.tgz",
+ "integrity": "sha512-Ewpwuc5t6eFdZmWlFyeuy3e1PTQC0jFvw2Q+2bpcWXbOZhPLsT7+h8lsSIJxb5mS7wZko7cKyQ2RLYDyK6Fpmw==",
+ "license": "MIT",
+ "dependencies": {
+ "@expressive-code/core": "^0.41.7"
+ }
+ },
+ "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.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.5.tgz",
+ "integrity": "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-darwin-arm64": "1.2.4"
+ }
+ },
+ "node_modules/@img/sharp-darwin-x64": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.5.tgz",
+ "integrity": "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-darwin-x64": "1.2.4"
+ }
+ },
+ "node_modules/@img/sharp-libvips-darwin-arm64": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.4.tgz",
+ "integrity": "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==",
+ "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.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.4.tgz",
+ "integrity": "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==",
+ "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.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.4.tgz",
+ "integrity": "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==",
+ "cpu": [
+ "arm"
+ ],
+ "libc": [
+ "glibc"
+ ],
+ "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.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.4.tgz",
+ "integrity": "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==",
+ "cpu": [
+ "arm64"
+ ],
+ "libc": [
+ "glibc"
+ ],
+ "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.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.4.tgz",
+ "integrity": "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==",
+ "cpu": [
+ "ppc64"
+ ],
+ "libc": [
+ "glibc"
+ ],
+ "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.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.2.4.tgz",
+ "integrity": "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==",
+ "cpu": [
+ "riscv64"
+ ],
+ "libc": [
+ "glibc"
+ ],
+ "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.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.4.tgz",
+ "integrity": "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==",
+ "cpu": [
+ "s390x"
+ ],
+ "libc": [
+ "glibc"
+ ],
+ "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.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.4.tgz",
+ "integrity": "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==",
+ "cpu": [
+ "x64"
+ ],
+ "libc": [
+ "glibc"
+ ],
+ "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.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.4.tgz",
+ "integrity": "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==",
+ "cpu": [
+ "arm64"
+ ],
+ "libc": [
+ "musl"
+ ],
+ "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.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.4.tgz",
+ "integrity": "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==",
+ "cpu": [
+ "x64"
+ ],
+ "libc": [
+ "musl"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-linux-arm": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.5.tgz",
+ "integrity": "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==",
+ "cpu": [
+ "arm"
+ ],
+ "libc": [
+ "glibc"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linux-arm": "1.2.4"
+ }
+ },
+ "node_modules/@img/sharp-linux-arm64": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.5.tgz",
+ "integrity": "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==",
+ "cpu": [
+ "arm64"
+ ],
+ "libc": [
+ "glibc"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linux-arm64": "1.2.4"
+ }
+ },
+ "node_modules/@img/sharp-linux-ppc64": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.5.tgz",
+ "integrity": "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==",
+ "cpu": [
+ "ppc64"
+ ],
+ "libc": [
+ "glibc"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linux-ppc64": "1.2.4"
+ }
+ },
+ "node_modules/@img/sharp-linux-riscv64": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.34.5.tgz",
+ "integrity": "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==",
+ "cpu": [
+ "riscv64"
+ ],
+ "libc": [
+ "glibc"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linux-riscv64": "1.2.4"
+ }
+ },
+ "node_modules/@img/sharp-linux-s390x": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.5.tgz",
+ "integrity": "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==",
+ "cpu": [
+ "s390x"
+ ],
+ "libc": [
+ "glibc"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linux-s390x": "1.2.4"
+ }
+ },
+ "node_modules/@img/sharp-linux-x64": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz",
+ "integrity": "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==",
+ "cpu": [
+ "x64"
+ ],
+ "libc": [
+ "glibc"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linux-x64": "1.2.4"
+ }
+ },
+ "node_modules/@img/sharp-linuxmusl-arm64": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.5.tgz",
+ "integrity": "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==",
+ "cpu": [
+ "arm64"
+ ],
+ "libc": [
+ "musl"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linuxmusl-arm64": "1.2.4"
+ }
+ },
+ "node_modules/@img/sharp-linuxmusl-x64": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.5.tgz",
+ "integrity": "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==",
+ "cpu": [
+ "x64"
+ ],
+ "libc": [
+ "musl"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linuxmusl-x64": "1.2.4"
+ }
+ },
+ "node_modules/@img/sharp-wasm32": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.5.tgz",
+ "integrity": "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==",
+ "cpu": [
+ "wasm32"
+ ],
+ "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT",
+ "optional": true,
+ "dependencies": {
+ "@emnapi/runtime": "^1.7.0"
+ },
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-win32-arm64": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.5.tgz",
+ "integrity": "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "Apache-2.0 AND LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-win32-ia32": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.5.tgz",
+ "integrity": "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==",
+ "cpu": [
+ "ia32"
+ ],
+ "license": "Apache-2.0 AND LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-win32-x64": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.5.tgz",
+ "integrity": "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "Apache-2.0 AND LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@jridgewell/sourcemap-codec": {
+ "version": "1.5.5",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz",
+ "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==",
+ "license": "MIT"
+ },
+ "node_modules/@mdx-js/mdx": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-3.1.1.tgz",
+ "integrity": "sha512-f6ZO2ifpwAQIpzGWaBQT2TXxPv6z3RBzQKpVftEWN78Vl/YweF1uwussDx8ECAXVtr3Rs89fKyG9YlzUs9DyGQ==",
+ "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/@oslojs/encoding": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@oslojs/encoding/-/encoding-1.1.0.tgz",
+ "integrity": "sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ==",
+ "license": "MIT"
+ },
+ "node_modules/@pagefind/darwin-arm64": {
+ "version": "1.5.2",
+ "resolved": "https://registry.npmjs.org/@pagefind/darwin-arm64/-/darwin-arm64-1.5.2.tgz",
+ "integrity": "sha512-MXpI+7HsAdPkvJ0gk9xj9g541BCqBZOBbdwj9g6lB5LCj6kSV6nqDSjzcAJwvOsfu0fjwvC8hQU+ecfhp+MpiQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@pagefind/darwin-x64": {
+ "version": "1.5.2",
+ "resolved": "https://registry.npmjs.org/@pagefind/darwin-x64/-/darwin-x64-1.5.2.tgz",
+ "integrity": "sha512-IojxFWMEJe0RQ7PQ3KXQsPIImNsbpPYpoZ+QUDrL8fAl/O27IX+LVLs74/UzEZy5uA2LD8Nz1AiwKr72vrkZQw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@pagefind/default-ui": {
+ "version": "1.5.2",
+ "resolved": "https://registry.npmjs.org/@pagefind/default-ui/-/default-ui-1.5.2.tgz",
+ "integrity": "sha512-pm1LMnQg8N2B3n2TnjKlhaFihpz6zTiA4HiGQ6/slKO/+8K9CAU5kcjdSSPgpuk1PMuuN4hxLipUIifnrkl3Sg==",
+ "license": "MIT"
+ },
+ "node_modules/@pagefind/freebsd-x64": {
+ "version": "1.5.2",
+ "resolved": "https://registry.npmjs.org/@pagefind/freebsd-x64/-/freebsd-x64-1.5.2.tgz",
+ "integrity": "sha512-7EVzo9+0w+2cbe671BtMj10UlNo83I+HrLVLfRxO731svHRJKUfJ/mo05gU14pe9PCfpKNQT8FS3Xc/oDN6pOA==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ]
+ },
+ "node_modules/@pagefind/linux-arm64": {
+ "version": "1.5.2",
+ "resolved": "https://registry.npmjs.org/@pagefind/linux-arm64/-/linux-arm64-1.5.2.tgz",
+ "integrity": "sha512-Ovt9+K35sqzn8H3ZMXGwls4TD/wMJuvRtShHIsmUQREmaxjrDEX7gHckRCrwYJ4XE1H1p6HkLz3wukrAnsfXQw==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@pagefind/linux-x64": {
+ "version": "1.5.2",
+ "resolved": "https://registry.npmjs.org/@pagefind/linux-x64/-/linux-x64-1.5.2.tgz",
+ "integrity": "sha512-V+tFqHKXhQKq/WqPBD67AFy7scn1/aZID00ws4fSDd+1daSi5UHR9VVlRrOUYKxn3VuFQYRD7lYXdZK1WED1YA==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@pagefind/windows-arm64": {
+ "version": "1.5.2",
+ "resolved": "https://registry.npmjs.org/@pagefind/windows-arm64/-/windows-arm64-1.5.2.tgz",
+ "integrity": "sha512-hN9Nh90fNW61nNRCW9ZyQrAj/mD0eRvmJ8NlTUzkbuW8kIzGJUi3cxjFkEcMZ5h/8FsKWD/VcouZl4yo1F7B6g==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@pagefind/windows-x64": {
+ "version": "1.5.2",
+ "resolved": "https://registry.npmjs.org/@pagefind/windows-x64/-/windows-x64-1.5.2.tgz",
+ "integrity": "sha512-Fa2Iyw7kaDRzGMfNYNUXNW2zbL5FQVDgSOcbDHdzBrDEdpqOqg8TcZ68F22ol6NJ9IGzvUdmeyZypLW5dyhqsg==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/pluginutils": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.3.0.tgz",
+ "integrity": "sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==",
+ "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/@rollup/rollup-android-arm-eabi": {
+ "version": "4.60.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.60.2.tgz",
+ "integrity": "sha512-dnlp69efPPg6Uaw2dVqzWRfAWRnYVb1XJ8CyyhIbZeaq4CA5/mLeZ1IEt9QqQxmbdvagjLIm2ZL8BxXv5lH4Yw==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@rollup/rollup-android-arm64": {
+ "version": "4.60.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.60.2.tgz",
+ "integrity": "sha512-OqZTwDRDchGRHHm/hwLOL7uVPB9aUvI0am/eQuWMNyFHf5PSEQmyEeYYheA0EPPKUO/l0uigCp+iaTjoLjVoHg==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@rollup/rollup-darwin-arm64": {
+ "version": "4.60.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.60.2.tgz",
+ "integrity": "sha512-UwRE7CGpvSVEQS8gUMBe1uADWjNnVgP3Iusyda1nSRwNDCsRjnGc7w6El6WLQsXmZTbLZx9cecegumcitNfpmA==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@rollup/rollup-darwin-x64": {
+ "version": "4.60.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.60.2.tgz",
+ "integrity": "sha512-gjEtURKLCC5VXm1I+2i1u9OhxFsKAQJKTVB8WvDAHF+oZlq0GTVFOlTlO1q3AlCTE/DF32c16ESvfgqR7343/g==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@rollup/rollup-freebsd-arm64": {
+ "version": "4.60.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.60.2.tgz",
+ "integrity": "sha512-Bcl6CYDeAgE70cqZaMojOi/eK63h5Me97ZqAQoh77VPjMysA/4ORQBRGo3rRy45x4MzVlU9uZxs8Uwy7ZaKnBw==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ]
+ },
+ "node_modules/@rollup/rollup-freebsd-x64": {
+ "version": "4.60.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.60.2.tgz",
+ "integrity": "sha512-LU+TPda3mAE2QB0/Hp5VyeKJivpC6+tlOXd1VMoXV/YFMvk/MNk5iXeBfB4MQGRWyOYVJ01625vjkr0Az98OJQ==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
+ "version": "4.60.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.60.2.tgz",
+ "integrity": "sha512-2QxQrM+KQ7DAW4o22j+XZ6RKdxjLD7BOWTP0Bv0tmjdyhXSsr2Ul1oJDQqh9Zf5qOwTuTc7Ek83mOFaKnodPjg==",
+ "cpu": [
+ "arm"
+ ],
+ "libc": [
+ "glibc"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm-musleabihf": {
+ "version": "4.60.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.60.2.tgz",
+ "integrity": "sha512-TbziEu2DVsTEOPif2mKWkMeDMLoYjx95oESa9fkQQK7r/Orta0gnkcDpzwufEcAO2BLBsD7mZkXGFqEdMRRwfw==",
+ "cpu": [
+ "arm"
+ ],
+ "libc": [
+ "musl"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm64-gnu": {
+ "version": "4.60.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.60.2.tgz",
+ "integrity": "sha512-bO/rVDiDUuM2YfuCUwZ1t1cP+/yqjqz+Xf2VtkdppefuOFS2OSeAfgafaHNkFn0t02hEyXngZkxtGqXcXwO8Rg==",
+ "cpu": [
+ "arm64"
+ ],
+ "libc": [
+ "glibc"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm64-musl": {
+ "version": "4.60.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.60.2.tgz",
+ "integrity": "sha512-hr26p7e93Rl0Za+JwW7EAnwAvKkehh12BU1Llm9Ykiibg4uIr2rbpxG9WCf56GuvidlTG9KiiQT/TXT1yAWxTA==",
+ "cpu": [
+ "arm64"
+ ],
+ "libc": [
+ "musl"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-loong64-gnu": {
+ "version": "4.60.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.60.2.tgz",
+ "integrity": "sha512-pOjB/uSIyDt+ow3k/RcLvUAOGpysT2phDn7TTUB3n75SlIgZzM6NKAqlErPhoFU+npgY3/n+2HYIQVbF70P9/A==",
+ "cpu": [
+ "loong64"
+ ],
+ "libc": [
+ "glibc"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-loong64-musl": {
+ "version": "4.60.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.60.2.tgz",
+ "integrity": "sha512-2/w+q8jszv9Ww1c+6uJT3OwqhdmGP2/4T17cu8WuwyUuuaCDDJ2ojdyYwZzCxx0GcsZBhzi3HmH+J5pZNXnd+Q==",
+ "cpu": [
+ "loong64"
+ ],
+ "libc": [
+ "musl"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-ppc64-gnu": {
+ "version": "4.60.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.60.2.tgz",
+ "integrity": "sha512-11+aL5vKheYgczxtPVVRhdptAM2H7fcDR5Gw4/bTcteuZBlH4oP9f5s9zYO9aGZvoGeBpqXI/9TZZihZ609wKw==",
+ "cpu": [
+ "ppc64"
+ ],
+ "libc": [
+ "glibc"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-ppc64-musl": {
+ "version": "4.60.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.60.2.tgz",
+ "integrity": "sha512-i16fokAGK46IVZuV8LIIwMdtqhin9hfYkCh8pf8iC3QU3LpwL+1FSFGej+O7l3E/AoknL6Dclh2oTdnRMpTzFQ==",
+ "cpu": [
+ "ppc64"
+ ],
+ "libc": [
+ "musl"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-riscv64-gnu": {
+ "version": "4.60.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.60.2.tgz",
+ "integrity": "sha512-49FkKS6RGQoriDSK/6E2GkAsAuU5kETFCh7pG4yD/ylj9rKhTmO3elsnmBvRD4PgJPds5W2PkhC82aVwmUcJ7A==",
+ "cpu": [
+ "riscv64"
+ ],
+ "libc": [
+ "glibc"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-riscv64-musl": {
+ "version": "4.60.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.60.2.tgz",
+ "integrity": "sha512-mjYNkHPfGpUR00DuM1ZZIgs64Hpf4bWcz9Z41+4Q+pgDx73UwWdAYyf6EG/lRFldmdHHzgrYyge5akFUW0D3mQ==",
+ "cpu": [
+ "riscv64"
+ ],
+ "libc": [
+ "musl"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-s390x-gnu": {
+ "version": "4.60.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.60.2.tgz",
+ "integrity": "sha512-ALyvJz965BQk8E9Al/JDKKDLH2kfKFLTGMlgkAbbYtZuJt9LU8DW3ZoDMCtQpXAltZxwBHevXz5u+gf0yA0YoA==",
+ "cpu": [
+ "s390x"
+ ],
+ "libc": [
+ "glibc"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-x64-gnu": {
+ "version": "4.60.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.60.2.tgz",
+ "integrity": "sha512-UQjrkIdWrKI626Du8lCQ6MJp/6V1LAo2bOK9OTu4mSn8GGXIkPXk/Vsp4bLHCd9Z9Iz2OTEaokUE90VweJgIYQ==",
+ "cpu": [
+ "x64"
+ ],
+ "libc": [
+ "glibc"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-x64-musl": {
+ "version": "4.60.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.60.2.tgz",
+ "integrity": "sha512-bTsRGj6VlSdn/XD4CGyzMnzaBs9bsRxy79eTqTCBsA8TMIEky7qg48aPkvJvFe1HyzQ5oMZdg7AnVlWQSKLTnw==",
+ "cpu": [
+ "x64"
+ ],
+ "libc": [
+ "musl"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-openbsd-x64": {
+ "version": "4.60.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.60.2.tgz",
+ "integrity": "sha512-6d4Z3534xitaA1FcMWP7mQPq5zGwBmGbhphh2DwaA1aNIXUu3KTOfwrWpbwI4/Gr0uANo7NTtaykFyO2hPuFLg==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openbsd"
+ ]
+ },
+ "node_modules/@rollup/rollup-openharmony-arm64": {
+ "version": "4.60.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.60.2.tgz",
+ "integrity": "sha512-NetAg5iO2uN7eB8zE5qrZ3CSil+7IJt4WDFLcC75Ymywq1VZVD6qJ6EvNLjZ3rEm6gB7XW5JdT60c6MN35Z85Q==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openharmony"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-arm64-msvc": {
+ "version": "4.60.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.60.2.tgz",
+ "integrity": "sha512-NCYhOotpgWZ5kdxCZsv6Iudx0wX8980Q/oW4pNFNihpBKsDbEA1zpkfxJGC0yugsUuyDZ7gL37dbzwhR0VI7pQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-ia32-msvc": {
+ "version": "4.60.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.60.2.tgz",
+ "integrity": "sha512-RXsaOqXxfoUBQoOgvmmijVxJnW2IGB0eoMO7F8FAjaj0UTywUO/luSqimWBJn04WNgUkeNhh7fs7pESXajWmkg==",
+ "cpu": [
+ "ia32"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-x64-gnu": {
+ "version": "4.60.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.60.2.tgz",
+ "integrity": "sha512-qdAzEULD+/hzObedtmV6iBpdL5TIbKVztGiK7O3/KYSf+HIzU257+MX1EXJcyIiDbMAqmbwaufcYPvyRryeZtA==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-x64-msvc": {
+ "version": "4.60.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.60.2.tgz",
+ "integrity": "sha512-Nd/SgG27WoA9e+/TdK74KnHz852TLa94ovOYySo/yMPuTmpckK/jIF2jSwS3g7ELSKXK13/cVdmg1Z/DaCWKxA==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@shikijs/core": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-4.0.2.tgz",
+ "integrity": "sha512-hxT0YF4ExEqB8G/qFdtJvpmHXBYJ2lWW7qTHDarVkIudPFE6iCIrqdgWxGn5s+ppkGXI0aEGlibI0PAyzP3zlw==",
+ "license": "MIT",
+ "dependencies": {
+ "@shikijs/primitive": "4.0.2",
+ "@shikijs/types": "4.0.2",
+ "@shikijs/vscode-textmate": "^10.0.2",
+ "@types/hast": "^3.0.4",
+ "hast-util-to-html": "^9.0.5"
+ },
+ "engines": {
+ "node": ">=20"
+ }
+ },
+ "node_modules/@shikijs/engine-javascript": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-4.0.2.tgz",
+ "integrity": "sha512-7PW0Nm49DcoUIQEXlJhNNBHyoGMjalRETTCcjMqEaMoJRLljy1Bi/EGV3/qLBgLKQejdspiiYuHGQW6dX94Nag==",
+ "license": "MIT",
+ "dependencies": {
+ "@shikijs/types": "4.0.2",
+ "@shikijs/vscode-textmate": "^10.0.2",
+ "oniguruma-to-es": "^4.3.4"
+ },
+ "engines": {
+ "node": ">=20"
+ }
+ },
+ "node_modules/@shikijs/engine-oniguruma": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-4.0.2.tgz",
+ "integrity": "sha512-UpCB9Y2sUKlS9z8juFSKz7ZtysmeXCgnRF0dlhXBkmQnek7lAToPte8DkxmEYGNTMii72zU/lyXiCB6StuZeJg==",
+ "license": "MIT",
+ "dependencies": {
+ "@shikijs/types": "4.0.2",
+ "@shikijs/vscode-textmate": "^10.0.2"
+ },
+ "engines": {
+ "node": ">=20"
+ }
+ },
+ "node_modules/@shikijs/langs": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-4.0.2.tgz",
+ "integrity": "sha512-KaXby5dvoeuZzN0rYQiPMjFoUrz4hgwIE+D6Du9owcHcl6/g16/yT5BQxSW5cGt2MZBz6Hl0YuRqf12omRfUUg==",
+ "license": "MIT",
+ "dependencies": {
+ "@shikijs/types": "4.0.2"
+ },
+ "engines": {
+ "node": ">=20"
+ }
+ },
+ "node_modules/@shikijs/primitive": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/@shikijs/primitive/-/primitive-4.0.2.tgz",
+ "integrity": "sha512-M6UMPrSa3fN5ayeJwFVl9qWofl273wtK1VG8ySDZ1mQBfhCpdd8nEx7nPZ/tk7k+TYcpqBZzj/AnwxT9lO+HJw==",
+ "license": "MIT",
+ "dependencies": {
+ "@shikijs/types": "4.0.2",
+ "@shikijs/vscode-textmate": "^10.0.2",
+ "@types/hast": "^3.0.4"
+ },
+ "engines": {
+ "node": ">=20"
+ }
+ },
+ "node_modules/@shikijs/themes": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-4.0.2.tgz",
+ "integrity": "sha512-mjCafwt8lJJaVSsQvNVrJumbnnj1RI8jbUKrPKgE6E3OvQKxnuRoBaYC51H4IGHePsGN/QtALglWBU7DoKDFnA==",
+ "license": "MIT",
+ "dependencies": {
+ "@shikijs/types": "4.0.2"
+ },
+ "engines": {
+ "node": ">=20"
+ }
+ },
+ "node_modules/@shikijs/types": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-4.0.2.tgz",
+ "integrity": "sha512-qzbeRooUTPnLE+sHD/Z8DStmaDgnbbc/pMrU203950aRqjX/6AFHeDYT+j00y2lPdz0ywJKx7o/7qnqTivtlXg==",
+ "license": "MIT",
+ "dependencies": {
+ "@shikijs/vscode-textmate": "^10.0.2",
+ "@types/hast": "^3.0.4"
+ },
+ "engines": {
+ "node": ">=20"
+ }
+ },
+ "node_modules/@shikijs/vscode-textmate": {
+ "version": "10.0.2",
+ "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz",
+ "integrity": "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==",
+ "license": "MIT"
+ },
+ "node_modules/@types/debug": {
+ "version": "4.1.13",
+ "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.13.tgz",
+ "integrity": "sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/ms": "*"
+ }
+ },
+ "node_modules/@types/estree": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz",
+ "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==",
+ "license": "MIT"
+ },
+ "node_modules/@types/estree-jsx": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz",
+ "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "*"
+ }
+ },
+ "node_modules/@types/hast": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz",
+ "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "*"
+ }
+ },
+ "node_modules/@types/js-yaml": {
+ "version": "4.0.9",
+ "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.9.tgz",
+ "integrity": "sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==",
+ "license": "MIT"
+ },
+ "node_modules/@types/mdast": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz",
+ "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "*"
+ }
+ },
+ "node_modules/@types/mdx": {
+ "version": "2.0.13",
+ "resolved": "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.13.tgz",
+ "integrity": "sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==",
+ "license": "MIT"
+ },
+ "node_modules/@types/ms": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz",
+ "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==",
+ "license": "MIT"
+ },
+ "node_modules/@types/nlcst": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/@types/nlcst/-/nlcst-2.0.3.tgz",
+ "integrity": "sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "*"
+ }
+ },
+ "node_modules/@types/node": {
+ "version": "24.12.2",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-24.12.2.tgz",
+ "integrity": "sha512-A1sre26ke7HDIuY/M23nd9gfB+nrmhtYyMINbjI1zHJxYteKR6qSMX56FsmjMcDb3SMcjJg5BiRRgOCC/yBD0g==",
+ "license": "MIT",
+ "dependencies": {
+ "undici-types": "~7.16.0"
+ }
+ },
+ "node_modules/@types/sax": {
+ "version": "1.2.7",
+ "resolved": "https://registry.npmjs.org/@types/sax/-/sax-1.2.7.tgz",
+ "integrity": "sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/unist": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz",
+ "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==",
+ "license": "MIT"
+ },
+ "node_modules/@ungap/structured-clone": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz",
+ "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==",
+ "license": "ISC"
+ },
+ "node_modules/acorn": {
+ "version": "8.16.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz",
+ "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==",
+ "license": "MIT",
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/acorn-jsx": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
+ "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
+ "license": "MIT",
+ "peerDependencies": {
+ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ }
+ },
+ "node_modules/anymatch": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
+ "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
+ "license": "ISC",
+ "dependencies": {
+ "normalize-path": "^3.0.0",
+ "picomatch": "^2.0.4"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/anymatch/node_modules/picomatch": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz",
+ "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/arg": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz",
+ "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==",
+ "license": "MIT"
+ },
+ "node_modules/argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+ "license": "Python-2.0"
+ },
+ "node_modules/aria-query": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz",
+ "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/array-iterate": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/array-iterate/-/array-iterate-2.0.1.tgz",
+ "integrity": "sha512-I1jXZMjAgCMmxT4qxXfPXa6SthSoE8h6gkSI9BGGNv8mP8G/v0blc+qFnZu6K42vTOiuME596QaLO0TP3Lk0xg==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/astring": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/astring/-/astring-1.9.0.tgz",
+ "integrity": "sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==",
+ "license": "MIT",
+ "bin": {
+ "astring": "bin/astring"
+ }
+ },
+ "node_modules/astro": {
+ "version": "6.1.9",
+ "resolved": "https://registry.npmjs.org/astro/-/astro-6.1.9.tgz",
+ "integrity": "sha512-NsAHzMzpznB281g2aM5qnBt2QjfH6ttKiZ3hSZw52If8JJ+62kbnBKbyKhR2glQcJLl7Jfe4GSl0DihFZ36rRQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@astrojs/compiler": "^3.0.1",
+ "@astrojs/internal-helpers": "0.9.0",
+ "@astrojs/markdown-remark": "7.1.1",
+ "@astrojs/telemetry": "3.3.1",
+ "@capsizecss/unpack": "^4.0.0",
+ "@clack/prompts": "^1.1.0",
+ "@oslojs/encoding": "^1.1.0",
+ "@rollup/pluginutils": "^5.3.0",
+ "aria-query": "^5.3.2",
+ "axobject-query": "^4.1.0",
+ "ci-info": "^4.4.0",
+ "clsx": "^2.1.1",
+ "common-ancestor-path": "^2.0.0",
+ "cookie": "^1.1.1",
+ "devalue": "^5.6.3",
+ "diff": "^8.0.3",
+ "dset": "^3.1.4",
+ "es-module-lexer": "^2.0.0",
+ "esbuild": "^0.27.3",
+ "flattie": "^1.1.1",
+ "fontace": "~0.4.1",
+ "github-slugger": "^2.0.0",
+ "html-escaper": "3.0.3",
+ "http-cache-semantics": "^4.2.0",
+ "js-yaml": "^4.1.1",
+ "magic-string": "^0.30.21",
+ "magicast": "^0.5.2",
+ "mrmime": "^2.0.1",
+ "neotraverse": "^0.6.18",
+ "obug": "^2.1.1",
+ "p-limit": "^7.3.0",
+ "p-queue": "^9.1.0",
+ "package-manager-detector": "^1.6.0",
+ "piccolore": "^0.1.3",
+ "picomatch": "^4.0.4",
+ "rehype": "^13.0.2",
+ "semver": "^7.7.4",
+ "shiki": "^4.0.2",
+ "smol-toml": "^1.6.0",
+ "svgo": "^4.0.1",
+ "tinyclip": "^0.1.12",
+ "tinyexec": "^1.0.4",
+ "tinyglobby": "^0.2.15",
+ "tsconfck": "^3.1.6",
+ "ultrahtml": "^1.6.0",
+ "unifont": "~0.7.4",
+ "unist-util-visit": "^5.1.0",
+ "unstorage": "^1.17.5",
+ "vfile": "^6.0.3",
+ "vite": "^7.3.2",
+ "vitefu": "^1.1.2",
+ "xxhash-wasm": "^1.1.0",
+ "yargs-parser": "^22.0.0",
+ "zod": "^4.3.6"
+ },
+ "bin": {
+ "astro": "bin/astro.mjs"
+ },
+ "engines": {
+ "node": ">=22.12.0",
+ "npm": ">=9.6.5",
+ "pnpm": ">=7.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/astrodotbuild"
+ },
+ "optionalDependencies": {
+ "sharp": "^0.34.0"
+ }
+ },
+ "node_modules/astro-expressive-code": {
+ "version": "0.41.7",
+ "resolved": "https://registry.npmjs.org/astro-expressive-code/-/astro-expressive-code-0.41.7.tgz",
+ "integrity": "sha512-hUpogGc6DdAd+I7pPXsctyYPRBJDK7Q7d06s4cyP0Vz3OcbziP3FNzN0jZci1BpCvLn9675DvS7B9ctKKX64JQ==",
+ "license": "MIT",
+ "dependencies": {
+ "rehype-expressive-code": "^0.41.7"
+ },
+ "peerDependencies": {
+ "astro": "^4.0.0-beta || ^5.0.0-beta || ^3.3.0 || ^6.0.0-beta"
+ }
+ },
+ "node_modules/axobject-query": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz",
+ "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/bail": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz",
+ "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/bcp-47": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/bcp-47/-/bcp-47-2.1.0.tgz",
+ "integrity": "sha512-9IIS3UPrvIa1Ej+lVDdDwO7zLehjqsaByECw0bu2RRGP73jALm6FYbzI5gWbgHLvNdkvfXB5YrSbocZdOS0c0w==",
+ "license": "MIT",
+ "dependencies": {
+ "is-alphabetical": "^2.0.0",
+ "is-alphanumerical": "^2.0.0",
+ "is-decimal": "^2.0.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/bcp-47-match": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/bcp-47-match/-/bcp-47-match-2.0.3.tgz",
+ "integrity": "sha512-JtTezzbAibu8G0R9op9zb3vcWZd9JF6M0xOYGPn0fNCd7wOpRB1mU2mH9T8gaBGbAAyIIVgB2G7xG0GP98zMAQ==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/boolbase": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
+ "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==",
+ "license": "ISC"
+ },
+ "node_modules/ccount": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz",
+ "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/character-entities": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz",
+ "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/character-entities-html4": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz",
+ "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/character-entities-legacy": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz",
+ "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/character-reference-invalid": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz",
+ "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/chokidar": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz",
+ "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==",
+ "license": "MIT",
+ "dependencies": {
+ "readdirp": "^5.0.0"
+ },
+ "engines": {
+ "node": ">= 20.19.0"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
+ "node_modules/ci-info": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.4.0.tgz",
+ "integrity": "sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/sibiraj-s"
+ }
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/clsx": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz",
+ "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/collapse-white-space": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-2.1.0.tgz",
+ "integrity": "sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/comma-separated-tokens": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz",
+ "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/commander": {
+ "version": "11.1.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz",
+ "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/common-ancestor-path": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/common-ancestor-path/-/common-ancestor-path-2.0.0.tgz",
+ "integrity": "sha512-dnN3ibLeoRf2HNC+OlCiNc5d2zxbLJXOtiZUudNFSXZrNSydxcCsSpRzXwfu7BBWCIfHPw+xTayeBvJCP/D8Ng==",
+ "license": "BlueOak-1.0.0",
+ "engines": {
+ "node": ">= 18"
+ }
+ },
+ "node_modules/cookie": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz",
+ "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
+ }
+ },
+ "node_modules/cookie-es": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/cookie-es/-/cookie-es-1.2.3.tgz",
+ "integrity": "sha512-lXVyvUvrNXblMqzIRrxHb57UUVmqsSWlxqt3XIjCkUP0wDAf6uicO6KMbEgYrMNtEvWgWHwe42CKxPu9MYAnWw==",
+ "license": "MIT"
+ },
+ "node_modules/crossws": {
+ "version": "0.3.5",
+ "resolved": "https://registry.npmjs.org/crossws/-/crossws-0.3.5.tgz",
+ "integrity": "sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA==",
+ "license": "MIT",
+ "dependencies": {
+ "uncrypto": "^0.1.3"
+ }
+ },
+ "node_modules/css-select": {
+ "version": "5.2.2",
+ "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz",
+ "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==",
+ "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-selector-parser": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/css-selector-parser/-/css-selector-parser-3.3.0.tgz",
+ "integrity": "sha512-Y2asgMGFqJKF4fq4xHDSlFYIkeVfRsm69lQC1q9kbEsH5XtnINTMrweLkjYMeaUgiXBy/uvKeO/a1JHTNnmB2g==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/mdevils"
+ },
+ {
+ "type": "patreon",
+ "url": "https://patreon.com/mdevils"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/css-tree": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.2.1.tgz",
+ "integrity": "sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==",
+ "license": "MIT",
+ "dependencies": {
+ "mdn-data": "2.27.1",
+ "source-map-js": "^1.2.1"
+ },
+ "engines": {
+ "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0"
+ }
+ },
+ "node_modules/css-what": {
+ "version": "6.2.2",
+ "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz",
+ "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==",
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">= 6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/fb55"
+ }
+ },
+ "node_modules/cssesc": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
+ "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
+ "license": "MIT",
+ "bin": {
+ "cssesc": "bin/cssesc"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/csso": {
+ "version": "5.0.5",
+ "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz",
+ "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==",
+ "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",
+ "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz",
+ "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==",
+ "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",
+ "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz",
+ "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==",
+ "license": "CC0-1.0"
+ },
+ "node_modules/debug": {
+ "version": "4.4.3",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
+ "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
+ "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",
+ "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.3.0.tgz",
+ "integrity": "sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==",
+ "license": "MIT",
+ "dependencies": {
+ "character-entities": "^2.0.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/defu": {
+ "version": "6.1.7",
+ "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.7.tgz",
+ "integrity": "sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==",
+ "license": "MIT"
+ },
+ "node_modules/dequal": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz",
+ "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/destr": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/destr/-/destr-2.0.5.tgz",
+ "integrity": "sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==",
+ "license": "MIT"
+ },
+ "node_modules/detect-libc": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz",
+ "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/devalue": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/devalue/-/devalue-5.7.1.tgz",
+ "integrity": "sha512-MUbZ586EgQqdRnC4yDrlod3BEdyvE4TapGYHMW2CiaW+KkkFmWEFqBUaLltEZCGi0iFXCEjRF0OjF0DV2QHjOA==",
+ "license": "MIT"
+ },
+ "node_modules/devlop": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz",
+ "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==",
+ "license": "MIT",
+ "dependencies": {
+ "dequal": "^2.0.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/diff": {
+ "version": "8.0.4",
+ "resolved": "https://registry.npmjs.org/diff/-/diff-8.0.4.tgz",
+ "integrity": "sha512-DPi0FmjiSU5EvQV0++GFDOJ9ASQUVFh5kD+OzOnYdi7n3Wpm9hWWGfB/O2blfHcMVTL5WkQXSnRiK9makhrcnw==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.3.1"
+ }
+ },
+ "node_modules/direction": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/direction/-/direction-2.0.1.tgz",
+ "integrity": "sha512-9S6m9Sukh1cZNknO1CWAr2QAWsbKLafQiyM5gZ7VgXHeuaoUwffKN4q6NC4A/Mf9iiPlOXQEKW/Mv/mh9/3YFA==",
+ "license": "MIT",
+ "bin": {
+ "direction": "cli.js"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/dlv": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz",
+ "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==",
+ "license": "MIT"
+ },
+ "node_modules/dom-serializer": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz",
+ "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==",
+ "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/dom-serializer/node_modules/entities": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
+ "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=0.12"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
+ "node_modules/domelementtype": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz",
+ "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fb55"
+ }
+ ],
+ "license": "BSD-2-Clause"
+ },
+ "node_modules/domhandler": {
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz",
+ "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==",
+ "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",
+ "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz",
+ "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==",
+ "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/dset": {
+ "version": "3.1.4",
+ "resolved": "https://registry.npmjs.org/dset/-/dset-3.1.4.tgz",
+ "integrity": "sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/entities": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz",
+ "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==",
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=0.12"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
+ "node_modules/es-module-lexer": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.0.0.tgz",
+ "integrity": "sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==",
+ "license": "MIT"
+ },
+ "node_modules/esast-util-from-estree": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/esast-util-from-estree/-/esast-util-from-estree-2.0.0.tgz",
+ "integrity": "sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ==",
+ "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",
+ "resolved": "https://registry.npmjs.org/esast-util-from-js/-/esast-util-from-js-2.0.1.tgz",
+ "integrity": "sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw==",
+ "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.7",
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.7.tgz",
+ "integrity": "sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w==",
+ "hasInstallScript": true,
+ "license": "MIT",
+ "bin": {
+ "esbuild": "bin/esbuild"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "optionalDependencies": {
+ "@esbuild/aix-ppc64": "0.27.7",
+ "@esbuild/android-arm": "0.27.7",
+ "@esbuild/android-arm64": "0.27.7",
+ "@esbuild/android-x64": "0.27.7",
+ "@esbuild/darwin-arm64": "0.27.7",
+ "@esbuild/darwin-x64": "0.27.7",
+ "@esbuild/freebsd-arm64": "0.27.7",
+ "@esbuild/freebsd-x64": "0.27.7",
+ "@esbuild/linux-arm": "0.27.7",
+ "@esbuild/linux-arm64": "0.27.7",
+ "@esbuild/linux-ia32": "0.27.7",
+ "@esbuild/linux-loong64": "0.27.7",
+ "@esbuild/linux-mips64el": "0.27.7",
+ "@esbuild/linux-ppc64": "0.27.7",
+ "@esbuild/linux-riscv64": "0.27.7",
+ "@esbuild/linux-s390x": "0.27.7",
+ "@esbuild/linux-x64": "0.27.7",
+ "@esbuild/netbsd-arm64": "0.27.7",
+ "@esbuild/netbsd-x64": "0.27.7",
+ "@esbuild/openbsd-arm64": "0.27.7",
+ "@esbuild/openbsd-x64": "0.27.7",
+ "@esbuild/openharmony-arm64": "0.27.7",
+ "@esbuild/sunos-x64": "0.27.7",
+ "@esbuild/win32-arm64": "0.27.7",
+ "@esbuild/win32-ia32": "0.27.7",
+ "@esbuild/win32-x64": "0.27.7"
+ }
+ },
+ "node_modules/escape-string-regexp": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz",
+ "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/estree-util-attach-comments": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/estree-util-attach-comments/-/estree-util-attach-comments-3.0.0.tgz",
+ "integrity": "sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==",
+ "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",
+ "resolved": "https://registry.npmjs.org/estree-util-build-jsx/-/estree-util-build-jsx-3.0.1.tgz",
+ "integrity": "sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ==",
+ "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",
+ "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz",
+ "integrity": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==",
+ "license": "MIT",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/estree-util-scope": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/estree-util-scope/-/estree-util-scope-1.0.0.tgz",
+ "integrity": "sha512-2CAASclonf+JFWBNJPndcOpA8EMJwa0Q8LUFJEKqXLW6+qBvbFZuF5gItbQOs/umBUkjviCSDCbBwU2cXbmrhQ==",
+ "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",
+ "resolved": "https://registry.npmjs.org/estree-util-to-js/-/estree-util-to-js-2.0.0.tgz",
+ "integrity": "sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==",
+ "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-visit": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/estree-util-visit/-/estree-util-visit-2.0.0.tgz",
+ "integrity": "sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==",
+ "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",
+ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz",
+ "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.0"
+ }
+ },
+ "node_modules/eventemitter3": {
+ "version": "5.0.4",
+ "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz",
+ "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==",
+ "license": "MIT"
+ },
+ "node_modules/expressive-code": {
+ "version": "0.41.7",
+ "resolved": "https://registry.npmjs.org/expressive-code/-/expressive-code-0.41.7.tgz",
+ "integrity": "sha512-2wZjC8OQ3TaVEMcBtYY4Va3lo6J+Ai9jf3d4dbhURMJcU4Pbqe6EcHe424MIZI0VHUA1bR6xdpoHYi3yxokWqA==",
+ "license": "MIT",
+ "dependencies": {
+ "@expressive-code/core": "^0.41.7",
+ "@expressive-code/plugin-frames": "^0.41.7",
+ "@expressive-code/plugin-shiki": "^0.41.7",
+ "@expressive-code/plugin-text-markers": "^0.41.7"
+ }
+ },
+ "node_modules/extend": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
+ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
+ "license": "MIT"
+ },
+ "node_modules/fast-string-truncated-width": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/fast-string-truncated-width/-/fast-string-truncated-width-1.2.1.tgz",
+ "integrity": "sha512-Q9acT/+Uu3GwGj+5w/zsGuQjh9O1TyywhIwAxHudtWrgF09nHOPrvTLhQevPbttcxjr/SNN7mJmfOw/B1bXgow==",
+ "license": "MIT"
+ },
+ "node_modules/fast-string-width": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/fast-string-width/-/fast-string-width-1.1.0.tgz",
+ "integrity": "sha512-O3fwIVIH5gKB38QNbdg+3760ZmGz0SZMgvwJbA1b2TGXceKE6A2cOlfogh1iw8lr049zPyd7YADHy+B7U4W9bQ==",
+ "license": "MIT",
+ "dependencies": {
+ "fast-string-truncated-width": "^1.2.0"
+ }
+ },
+ "node_modules/fast-wrap-ansi": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/fast-wrap-ansi/-/fast-wrap-ansi-0.1.6.tgz",
+ "integrity": "sha512-HlUwET7a5gqjURj70D5jl7aC3Zmy4weA1SHUfM0JFI0Ptq987NH2TwbBFLoERhfwk+E+eaq4EK3jXoT+R3yp3w==",
+ "license": "MIT",
+ "dependencies": {
+ "fast-string-width": "^1.1.0"
+ }
+ },
+ "node_modules/fdir": {
+ "version": "6.5.0",
+ "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
+ "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "peerDependencies": {
+ "picomatch": "^3 || ^4"
+ },
+ "peerDependenciesMeta": {
+ "picomatch": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/flattie": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/flattie/-/flattie-1.1.1.tgz",
+ "integrity": "sha512-9UbaD6XdAL97+k/n+N7JwX46K/M6Zc6KcFYskrYL8wbBV/Uyk0CTAMY0VT+qiK5PM7AIc9aTWYtq65U7T+aCNQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/fontace": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/fontace/-/fontace-0.4.1.tgz",
+ "integrity": "sha512-lDMvbAzSnHmbYMTEld5qdtvNH2/pWpICOqpean9IgC7vUbUJc3k+k5Dokp85CegamqQpFbXf0rAVkbzpyTA8aw==",
+ "license": "MIT",
+ "dependencies": {
+ "fontkitten": "^1.0.2"
+ }
+ },
+ "node_modules/fontkitten": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/fontkitten/-/fontkitten-1.0.3.tgz",
+ "integrity": "sha512-Wp1zXWPVUPBmfoa3Cqc9ctaKuzKAV6uLstRqlR56kSjplf5uAce+qeyYym7F+PHbGTk+tCEdkCW6RD7DX/gBZw==",
+ "license": "MIT",
+ "dependencies": {
+ "tiny-inflate": "^1.0.3"
+ },
+ "engines": {
+ "node": ">=20"
+ }
+ },
+ "node_modules/fsevents": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+ "hasInstallScript": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ }
+ },
+ "node_modules/github-slugger": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-2.0.0.tgz",
+ "integrity": "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==",
+ "license": "ISC"
+ },
+ "node_modules/h3": {
+ "version": "1.15.11",
+ "resolved": "https://registry.npmjs.org/h3/-/h3-1.15.11.tgz",
+ "integrity": "sha512-L3THSe2MPeBwgIZVSH5zLdBBU90TOxarvhK9d04IDY2AmVS8j2Jz2LIWtwsGOU3lu2I5jCN7FNvVfY2+XyF+mg==",
+ "license": "MIT",
+ "dependencies": {
+ "cookie-es": "^1.2.3",
+ "crossws": "^0.3.5",
+ "defu": "^6.1.6",
+ "destr": "^2.0.5",
+ "iron-webcrypto": "^1.2.1",
+ "node-mock-http": "^1.0.4",
+ "radix3": "^1.1.2",
+ "ufo": "^1.6.3",
+ "uncrypto": "^0.1.3"
+ }
+ },
+ "node_modules/hast-util-embedded": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/hast-util-embedded/-/hast-util-embedded-3.0.0.tgz",
+ "integrity": "sha512-naH8sld4Pe2ep03qqULEtvYr7EjrLK2QHY8KJR6RJkTUjPGObe1vnx585uzem2hGra+s1q08DZZpfgDVYRbaXA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0",
+ "hast-util-is-element": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/hast-util-format": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/hast-util-format/-/hast-util-format-1.1.0.tgz",
+ "integrity": "sha512-yY1UDz6bC9rDvCWHpx12aIBGRG7krurX0p0Fm6pT547LwDIZZiNr8a+IHDogorAdreULSEzP82Nlv5SZkHZcjA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0",
+ "hast-util-embedded": "^3.0.0",
+ "hast-util-minify-whitespace": "^1.0.0",
+ "hast-util-phrasing": "^3.0.0",
+ "hast-util-whitespace": "^3.0.0",
+ "html-whitespace-sensitive-tag-names": "^3.0.0",
+ "unist-util-visit-parents": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/hast-util-from-html": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/hast-util-from-html/-/hast-util-from-html-2.0.3.tgz",
+ "integrity": "sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0",
+ "devlop": "^1.1.0",
+ "hast-util-from-parse5": "^8.0.0",
+ "parse5": "^7.0.0",
+ "vfile": "^6.0.0",
+ "vfile-message": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/hast-util-from-parse5": {
+ "version": "8.0.3",
+ "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-8.0.3.tgz",
+ "integrity": "sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==",
+ "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-has-property": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/hast-util-has-property/-/hast-util-has-property-3.0.0.tgz",
+ "integrity": "sha512-MNilsvEKLFpV604hwfhVStK0usFY/QmM5zX16bo7EjnAEGofr5YyI37kzopBlZJkHD4t887i+q/C8/tr5Q94cA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/hast-util-is-body-ok-link": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/hast-util-is-body-ok-link/-/hast-util-is-body-ok-link-3.0.1.tgz",
+ "integrity": "sha512-0qpnzOBLztXHbHQenVB8uNuxTnm/QBFUOmdOSsEn7GnBtyY07+ENTWVFBAnXd/zEgd9/SUG3lRY7hSIBWRgGpQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/hast-util-is-element": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-3.0.0.tgz",
+ "integrity": "sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/hast-util-minify-whitespace": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/hast-util-minify-whitespace/-/hast-util-minify-whitespace-1.0.1.tgz",
+ "integrity": "sha512-L96fPOVpnclQE0xzdWb/D12VT5FabA7SnZOUMtL1DbXmYiHJMXZvFkIZfiMmTCNJHUeO2K9UYNXoVyfz+QHuOw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0",
+ "hast-util-embedded": "^3.0.0",
+ "hast-util-is-element": "^3.0.0",
+ "hast-util-whitespace": "^3.0.0",
+ "unist-util-is": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/hast-util-parse-selector": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz",
+ "integrity": "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/hast-util-phrasing": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/hast-util-phrasing/-/hast-util-phrasing-3.0.1.tgz",
+ "integrity": "sha512-6h60VfI3uBQUxHqTyMymMZnEbNl1XmEGtOxxKYL7stY2o601COo62AWAYBQR9lZbYXYSBoxag8UpPRXK+9fqSQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0",
+ "hast-util-embedded": "^3.0.0",
+ "hast-util-has-property": "^3.0.0",
+ "hast-util-is-body-ok-link": "^3.0.0",
+ "hast-util-is-element": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/hast-util-raw": {
+ "version": "9.1.0",
+ "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-9.1.0.tgz",
+ "integrity": "sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==",
+ "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-select": {
+ "version": "6.0.4",
+ "resolved": "https://registry.npmjs.org/hast-util-select/-/hast-util-select-6.0.4.tgz",
+ "integrity": "sha512-RqGS1ZgI0MwxLaKLDxjprynNzINEkRHY2i8ln4DDjgv9ZhcYVIHN9rlpiYsqtFwrgpYU361SyWDQcGNIBVu3lw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0",
+ "@types/unist": "^3.0.0",
+ "bcp-47-match": "^2.0.0",
+ "comma-separated-tokens": "^2.0.0",
+ "css-selector-parser": "^3.0.0",
+ "devlop": "^1.0.0",
+ "direction": "^2.0.0",
+ "hast-util-has-property": "^3.0.0",
+ "hast-util-to-string": "^3.0.0",
+ "hast-util-whitespace": "^3.0.0",
+ "nth-check": "^2.0.0",
+ "property-information": "^7.0.0",
+ "space-separated-tokens": "^2.0.0",
+ "unist-util-visit": "^5.0.0",
+ "zwitch": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/hast-util-to-estree": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/hast-util-to-estree/-/hast-util-to-estree-3.1.3.tgz",
+ "integrity": "sha512-48+B/rJWAp0jamNbAAf9M7Uf//UVqAoMmgXhBdxTDJLGKY+LRnZ99qcG+Qjl5HfMpYNzS5v4EAwVEF34LeAj7w==",
+ "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-html": {
+ "version": "9.0.5",
+ "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.5.tgz",
+ "integrity": "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0",
+ "@types/unist": "^3.0.0",
+ "ccount": "^2.0.0",
+ "comma-separated-tokens": "^2.0.0",
+ "hast-util-whitespace": "^3.0.0",
+ "html-void-elements": "^3.0.0",
+ "mdast-util-to-hast": "^13.0.0",
+ "property-information": "^7.0.0",
+ "space-separated-tokens": "^2.0.0",
+ "stringify-entities": "^4.0.0",
+ "zwitch": "^2.0.4"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/hast-util-to-jsx-runtime": {
+ "version": "2.3.6",
+ "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.6.tgz",
+ "integrity": "sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==",
+ "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",
+ "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-8.0.1.tgz",
+ "integrity": "sha512-MlWT6Pjt4CG9lFCjiz4BH7l9wmrMkfkJYCxFwKQic8+RTZgWPuWxwAfjJElsXkex7DJjfSJsQIt931ilUgmwdA==",
+ "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-to-string": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/hast-util-to-string/-/hast-util-to-string-3.0.1.tgz",
+ "integrity": "sha512-XelQVTDWvqcl3axRfI0xSeoVKzyIFPwsAGSLIsKdJKQMXDYJS4WYrBNF/8J7RdhIcFI2BOHgAifggsvsxp/3+A==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/hast-util-to-text": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/hast-util-to-text/-/hast-util-to-text-4.0.2.tgz",
+ "integrity": "sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0",
+ "@types/unist": "^3.0.0",
+ "hast-util-is-element": "^3.0.0",
+ "unist-util-find-after": "^5.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/hast-util-whitespace": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz",
+ "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/hastscript": {
+ "version": "9.0.1",
+ "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-9.0.1.tgz",
+ "integrity": "sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==",
+ "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/html-escaper": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-3.0.3.tgz",
+ "integrity": "sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==",
+ "license": "MIT"
+ },
+ "node_modules/html-void-elements": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz",
+ "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/html-whitespace-sensitive-tag-names": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/html-whitespace-sensitive-tag-names/-/html-whitespace-sensitive-tag-names-3.0.1.tgz",
+ "integrity": "sha512-q+310vW8zmymYHALr1da4HyXUQ0zgiIwIicEfotYPWGN0OJVEN/58IJ3A4GBYcEq3LGAZqKb+ugvP0GNB9CEAA==",
+ "license": "MIT",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/http-cache-semantics": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz",
+ "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==",
+ "license": "BSD-2-Clause"
+ },
+ "node_modules/i18next": {
+ "version": "23.16.8",
+ "resolved": "https://registry.npmjs.org/i18next/-/i18next-23.16.8.tgz",
+ "integrity": "sha512-06r/TitrM88Mg5FdUXAKL96dJMzgqLE5dv3ryBAra4KCwD9mJ4ndOTS95ZuymIGoE+2hzfdaMak2X11/es7ZWg==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://locize.com"
+ },
+ {
+ "type": "individual",
+ "url": "https://locize.com/i18next.html"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.23.2"
+ }
+ },
+ "node_modules/inline-style-parser": {
+ "version": "0.2.7",
+ "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.7.tgz",
+ "integrity": "sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==",
+ "license": "MIT"
+ },
+ "node_modules/iron-webcrypto": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/iron-webcrypto/-/iron-webcrypto-1.2.1.tgz",
+ "integrity": "sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/brc-dd"
+ }
+ },
+ "node_modules/is-alphabetical": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz",
+ "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/is-alphanumerical": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz",
+ "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==",
+ "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-decimal": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz",
+ "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/is-docker": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-4.0.0.tgz",
+ "integrity": "sha512-LHE+wROyG/Y/0ZnbktRCoTix2c1RhgWaZraMZ8o1Q7zCh0VSrICJQO5oqIIISrcSBtrXv0o233w1IYwsWCjTzA==",
+ "license": "MIT",
+ "bin": {
+ "is-docker": "cli.js"
+ },
+ "engines": {
+ "node": ">=20"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-hexadecimal": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz",
+ "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/is-inside-container": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz",
+ "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==",
+ "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",
+ "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz",
+ "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==",
+ "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-plain-obj": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz",
+ "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-wsl": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.1.tgz",
+ "integrity": "sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==",
+ "license": "MIT",
+ "dependencies": {
+ "is-inside-container": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/js-yaml": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz",
+ "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==",
+ "license": "MIT",
+ "dependencies": {
+ "argparse": "^2.0.1"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/klona": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz",
+ "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/longest-streak": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz",
+ "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/lru-cache": {
+ "version": "11.3.5",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.3.5.tgz",
+ "integrity": "sha512-NxVFwLAnrd9i7KUBxC4DrUhmgjzOs+1Qm50D3oF1/oL+r1NpZ4gA7xvG0/zJ8evR7zIKn4vLf7qTNduWFtCrRw==",
+ "license": "BlueOak-1.0.0",
+ "engines": {
+ "node": "20 || >=22"
+ }
+ },
+ "node_modules/magic-string": {
+ "version": "0.30.21",
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz",
+ "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.5.5"
+ }
+ },
+ "node_modules/magicast": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.5.2.tgz",
+ "integrity": "sha512-E3ZJh4J3S9KfwdjZhe2afj6R9lGIN5Pher1pF39UGrXRqq/VDaGVIGN13BjHd2u8B61hArAGOnso7nBOouW3TQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/parser": "^7.29.0",
+ "@babel/types": "^7.29.0",
+ "source-map-js": "^1.2.1"
+ }
+ },
+ "node_modules/markdown-extensions": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/markdown-extensions/-/markdown-extensions-2.0.0.tgz",
+ "integrity": "sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/markdown-table": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.4.tgz",
+ "integrity": "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/mdast-util-definitions": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-6.0.0.tgz",
+ "integrity": "sha512-scTllyX6pnYNZH/AIp/0ePz6s4cZtARxImwoPJ7kS42n+MnVsI4XbnG6d4ibehRIldYMWM2LD7ImQblVhUejVQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "@types/unist": "^3.0.0",
+ "unist-util-visit": "^5.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-directive": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-directive/-/mdast-util-directive-3.1.0.tgz",
+ "integrity": "sha512-I3fNFt+DHmpWCYAT7quoM6lHf9wuqtI+oCOfvILnoicNIqjh5E3dEJWiXuYME2gNe8vl1iMQwyUHa7bgFmak6Q==",
+ "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",
+ "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.2.tgz",
+ "integrity": "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==",
+ "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-from-markdown": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.3.tgz",
+ "integrity": "sha512-W4mAWTvSlKvf8L6J+VN9yLSqQ9AOAAvHuoDAmPkz4dHf553m5gVj2ejadHJhoJmcmxEnOv6Pa8XJhpxE93kb8Q==",
+ "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-gfm": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.1.0.tgz",
+ "integrity": "sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==",
+ "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",
+ "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.1.tgz",
+ "integrity": "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==",
+ "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-footnote": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.1.0.tgz",
+ "integrity": "sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==",
+ "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",
+ "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz",
+ "integrity": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==",
+ "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",
+ "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz",
+ "integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==",
+ "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",
+ "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz",
+ "integrity": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==",
+ "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",
+ "resolved": "https://registry.npmjs.org/mdast-util-mdx/-/mdast-util-mdx-3.0.0.tgz",
+ "integrity": "sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==",
+ "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",
+ "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.1.tgz",
+ "integrity": "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==",
+ "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",
+ "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.2.0.tgz",
+ "integrity": "sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==",
+ "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",
+ "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz",
+ "integrity": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==",
+ "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",
+ "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz",
+ "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==",
+ "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",
+ "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz",
+ "integrity": "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==",
+ "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",
+ "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz",
+ "integrity": "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==",
+ "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",
+ "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz",
+ "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdn-data": {
+ "version": "2.27.1",
+ "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.27.1.tgz",
+ "integrity": "sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==",
+ "license": "CC0-1.0"
+ },
+ "node_modules/micromark": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz",
+ "integrity": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==",
+ "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",
+ "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz",
+ "integrity": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==",
+ "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-extension-directive": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/micromark-extension-directive/-/micromark-extension-directive-3.0.2.tgz",
+ "integrity": "sha512-wjcXHgk+PPdmvR58Le9d7zQYWy+vKEU9Se44p2CrCDPiLr2FMyiT4Fyb5UFKFC66wGB3kPlgD7q3TnoqPS7SZA==",
+ "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-gfm": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz",
+ "integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==",
+ "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",
+ "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz",
+ "integrity": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==",
+ "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-footnote": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz",
+ "integrity": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==",
+ "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-strikethrough": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz",
+ "integrity": "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==",
+ "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-table": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.1.tgz",
+ "integrity": "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==",
+ "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-tagfilter": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz",
+ "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==",
+ "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",
+ "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz",
+ "integrity": "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==",
+ "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-mdx-expression": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-extension-mdx-expression/-/micromark-extension-mdx-expression-3.0.1.tgz",
+ "integrity": "sha512-dD/ADLJ1AeMvSAKBwO22zG22N4ybhe7kFIZ3LsDI0GlsNr2A3KYxb0LdC1u5rj4Nw+CHKY0RVdnHX8vj8ejm4Q==",
+ "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-jsx": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-3.0.2.tgz",
+ "integrity": "sha512-e5+q1DjMh62LZAJOnDraSSbDMvGJ8x3cbjygy2qFEi7HCeUT4BDKCvMozPozcD6WmOt6sVvYDNBKhFSz3kjOVQ==",
+ "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-md": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/micromark-extension-mdx-md/-/micromark-extension-mdx-md-2.0.0.tgz",
+ "integrity": "sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==",
+ "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",
+ "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs/-/micromark-extension-mdxjs-3.0.0.tgz",
+ "integrity": "sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==",
+ "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",
+ "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs-esm/-/micromark-extension-mdxjs-esm-3.0.0.tgz",
+ "integrity": "sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==",
+ "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-factory-destination": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz",
+ "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==",
+ "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-label": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz",
+ "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==",
+ "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-mdx-expression": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/micromark-factory-mdx-expression/-/micromark-factory-mdx-expression-2.0.3.tgz",
+ "integrity": "sha512-kQnEtA3vzucU2BkrIa8/VaSAsP+EJ3CKOvhMuJgOEGg9KDC6OAY6nSnNDVRiVNRqj7Y4SlSzcStaH/5jge8JdQ==",
+ "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-space": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz",
+ "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==",
+ "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": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz",
+ "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==",
+ "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": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz",
+ "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==",
+ "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-util-character": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz",
+ "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==",
+ "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-chunked": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz",
+ "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==",
+ "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-classify-character": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz",
+ "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==",
+ "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-combine-extensions": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz",
+ "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==",
+ "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",
+ "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz",
+ "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==",
+ "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-string": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz",
+ "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==",
+ "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-encode": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz",
+ "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==",
+ "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",
+ "resolved": "https://registry.npmjs.org/micromark-util-events-to-acorn/-/micromark-util-events-to-acorn-2.0.3.tgz",
+ "integrity": "sha512-jmsiEIiZ1n7X1Rr5k8wVExBQCg5jy4UXVADItHmNk1zkwEVhBuIUKRu3fqv+hs4nxLISi2DQGlqIOGiFxgbfHg==",
+ "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-html-tag-name": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz",
+ "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==",
+ "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",
+ "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz",
+ "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==",
+ "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-resolve-all": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz",
+ "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==",
+ "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",
+ "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz",
+ "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==",
+ "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-subtokenize": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz",
+ "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==",
+ "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-symbol": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz",
+ "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==",
+ "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",
+ "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz",
+ "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/mrmime": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz",
+ "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+ "license": "MIT"
+ },
+ "node_modules/nanoid": {
+ "version": "3.3.11",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz",
+ "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==",
+ "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/neotraverse": {
+ "version": "0.6.18",
+ "resolved": "https://registry.npmjs.org/neotraverse/-/neotraverse-0.6.18.tgz",
+ "integrity": "sha512-Z4SmBUweYa09+o6pG+eASabEpP6QkQ70yHj351pQoEXIs8uHbaU2DWVmzBANKgflPa47A50PtB2+NgRpQvr7vA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/nlcst-to-string": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/nlcst-to-string/-/nlcst-to-string-4.0.0.tgz",
+ "integrity": "sha512-YKLBCcUYKAg0FNlOBT6aI91qFmSiFKiluk655WzPF+DDMA02qIyy8uiRqI8QXtcFpEvll12LpL5MXqEmAZ+dcA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/nlcst": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/node-fetch-native": {
+ "version": "1.6.7",
+ "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.6.7.tgz",
+ "integrity": "sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==",
+ "license": "MIT"
+ },
+ "node_modules/node-mock-http": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/node-mock-http/-/node-mock-http-1.0.4.tgz",
+ "integrity": "sha512-8DY+kFsDkNXy1sJglUfuODx1/opAGJGyrTuFqEoN90oRc2Vk0ZbD4K2qmKXBBEhZQzdKHIVfEJpDU8Ak2NJEvQ==",
+ "license": "MIT"
+ },
+ "node_modules/normalize-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/nth-check": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz",
+ "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "boolbase": "^1.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/nth-check?sponsor=1"
+ }
+ },
+ "node_modules/obug": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.1.tgz",
+ "integrity": "sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==",
+ "funding": [
+ "https://github.com/sponsors/sxzz",
+ "https://opencollective.com/debug"
+ ],
+ "license": "MIT"
+ },
+ "node_modules/ofetch": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/ofetch/-/ofetch-1.5.1.tgz",
+ "integrity": "sha512-2W4oUZlVaqAPAil6FUg/difl6YhqhUR7x2eZY4bQCko22UXg3hptq9KLQdqFClV+Wu85UX7hNtdGTngi/1BxcA==",
+ "license": "MIT",
+ "dependencies": {
+ "destr": "^2.0.5",
+ "node-fetch-native": "^1.6.7",
+ "ufo": "^1.6.1"
+ }
+ },
+ "node_modules/ohash": {
+ "version": "2.0.11",
+ "resolved": "https://registry.npmjs.org/ohash/-/ohash-2.0.11.tgz",
+ "integrity": "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==",
+ "license": "MIT"
+ },
+ "node_modules/oniguruma-parser": {
+ "version": "0.12.2",
+ "resolved": "https://registry.npmjs.org/oniguruma-parser/-/oniguruma-parser-0.12.2.tgz",
+ "integrity": "sha512-6HVa5oIrgMC6aA6WF6XyyqbhRPJrKR02L20+2+zpDtO5QAzGHAUGw5TKQvwi5vctNnRHkJYmjAhRVQF2EKdTQw==",
+ "license": "MIT"
+ },
+ "node_modules/oniguruma-to-es": {
+ "version": "4.3.6",
+ "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-4.3.6.tgz",
+ "integrity": "sha512-csuQ9x3Yr0cEIs/Zgx/OEt9iBw9vqIunAPQkx19R/fiMq2oGVTgcMqO/V3Ybqefr1TBvosI6jU539ksaBULJyA==",
+ "license": "MIT",
+ "dependencies": {
+ "oniguruma-parser": "^0.12.2",
+ "regex": "^6.1.0",
+ "regex-recursion": "^6.0.2"
+ }
+ },
+ "node_modules/p-limit": {
+ "version": "7.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-7.3.0.tgz",
+ "integrity": "sha512-7cIXg/Z0M5WZRblrsOla88S4wAK+zOQQWeBYfV3qJuJXMr+LnbYjaadrFaS0JILfEDPVqHyKnZ1Z/1d6J9VVUw==",
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^1.2.1"
+ },
+ "engines": {
+ "node": ">=20"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-queue": {
+ "version": "9.1.2",
+ "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-9.1.2.tgz",
+ "integrity": "sha512-ktsDOALzTYTWWF1PbkNVg2rOt+HaOaMWJMUnt7T3qf5tvZ1L8dBW3tObzprBcXNMKkwj+yFSLqHso0x+UFcJXw==",
+ "license": "MIT",
+ "dependencies": {
+ "eventemitter3": "^5.0.1",
+ "p-timeout": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=20"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-timeout": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-7.0.1.tgz",
+ "integrity": "sha512-AxTM2wDGORHGEkPCt8yqxOTMgpfbEHqF51f/5fJCmwFC3C/zNcGT63SymH2ttOAaiIws2zVg4+izQCjrakcwHg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=20"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/package-manager-detector": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-1.6.0.tgz",
+ "integrity": "sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA==",
+ "license": "MIT"
+ },
+ "node_modules/pagefind": {
+ "version": "1.5.2",
+ "resolved": "https://registry.npmjs.org/pagefind/-/pagefind-1.5.2.tgz",
+ "integrity": "sha512-XTUaK0hXMCu2jszWE584JGQT7y284TmMV9l/HX3rnG5uo3rHI/uHU56XTyyyPFjeWEBxECbAi0CaFDJOONtG0Q==",
+ "license": "MIT",
+ "bin": {
+ "pagefind": "lib/runner/bin.cjs"
+ },
+ "optionalDependencies": {
+ "@pagefind/darwin-arm64": "1.5.2",
+ "@pagefind/darwin-x64": "1.5.2",
+ "@pagefind/freebsd-x64": "1.5.2",
+ "@pagefind/linux-arm64": "1.5.2",
+ "@pagefind/linux-x64": "1.5.2",
+ "@pagefind/windows-arm64": "1.5.2",
+ "@pagefind/windows-x64": "1.5.2"
+ }
+ },
+ "node_modules/parse-entities": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz",
+ "integrity": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==",
+ "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",
+ "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz",
+ "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==",
+ "license": "MIT"
+ },
+ "node_modules/parse-latin": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/parse-latin/-/parse-latin-7.0.0.tgz",
+ "integrity": "sha512-mhHgobPPua5kZ98EF4HWiH167JWBfl4pvAIXXdbaVohtK7a6YBOy56kvhCqduqyo/f3yrHFWmqmiMg/BkBkYYQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/nlcst": "^2.0.0",
+ "@types/unist": "^3.0.0",
+ "nlcst-to-string": "^4.0.0",
+ "unist-util-modify-children": "^4.0.0",
+ "unist-util-visit-children": "^3.0.0",
+ "vfile": "^6.0.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/parse5": {
+ "version": "7.3.0",
+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz",
+ "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==",
+ "license": "MIT",
+ "dependencies": {
+ "entities": "^6.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/inikulin/parse5?sponsor=1"
+ }
+ },
+ "node_modules/piccolore": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/piccolore/-/piccolore-0.1.3.tgz",
+ "integrity": "sha512-o8bTeDWjE086iwKrROaDf31K0qC/BENdm15/uH9usSC/uZjJOKb2YGiVHfLY4GhwsERiPI1jmwI2XrA7ACOxVw==",
+ "license": "ISC"
+ },
+ "node_modules/picocolors": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
+ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
+ "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/postcss": {
+ "version": "8.5.10",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.10.tgz",
+ "integrity": "sha512-pMMHxBOZKFU6HgAZ4eyGnwXF/EvPGGqUr0MnZ5+99485wwW41kW91A4LOGxSHhgugZmSChL5AlElNdwlNgcnLQ==",
+ "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",
+ "dependencies": {
+ "nanoid": "^3.3.11",
+ "picocolors": "^1.1.1",
+ "source-map-js": "^1.2.1"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ }
+ },
+ "node_modules/postcss-nested": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz",
+ "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "postcss-selector-parser": "^6.1.1"
+ },
+ "engines": {
+ "node": ">=12.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.14"
+ }
+ },
+ "node_modules/postcss-selector-parser": {
+ "version": "6.1.2",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz",
+ "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==",
+ "license": "MIT",
+ "dependencies": {
+ "cssesc": "^3.0.0",
+ "util-deprecate": "^1.0.2"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/prismjs": {
+ "version": "1.30.0",
+ "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz",
+ "integrity": "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/property-information": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz",
+ "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/radix3": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/radix3/-/radix3-1.1.2.tgz",
+ "integrity": "sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==",
+ "license": "MIT"
+ },
+ "node_modules/readdirp": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.0.0.tgz",
+ "integrity": "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 20.19.0"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
+ "node_modules/recma-build-jsx": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/recma-build-jsx/-/recma-build-jsx-1.0.0.tgz",
+ "integrity": "sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew==",
+ "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",
+ "resolved": "https://registry.npmjs.org/recma-jsx/-/recma-jsx-1.0.1.tgz",
+ "integrity": "sha512-huSIy7VU2Z5OLv6oFLosQGGDqPqdO1iq6bWNAdhzMxSJP7RAso4fCZ1cKu8j9YHCZf3TPrq4dw3okhrylgcd7w==",
+ "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",
+ "resolved": "https://registry.npmjs.org/recma-parse/-/recma-parse-1.0.0.tgz",
+ "integrity": "sha512-OYLsIGBB5Y5wjnSnQW6t3Xg7q3fQ7FWbw/vcXtORTnyaSFscOtABg+7Pnz6YZ6c27fG1/aN8CjfwoUEUIdwqWQ==",
+ "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",
+ "resolved": "https://registry.npmjs.org/recma-stringify/-/recma-stringify-1.0.0.tgz",
+ "integrity": "sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g==",
+ "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/regex": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/regex/-/regex-6.1.0.tgz",
+ "integrity": "sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==",
+ "license": "MIT",
+ "dependencies": {
+ "regex-utilities": "^2.3.0"
+ }
+ },
+ "node_modules/regex-recursion": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/regex-recursion/-/regex-recursion-6.0.2.tgz",
+ "integrity": "sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==",
+ "license": "MIT",
+ "dependencies": {
+ "regex-utilities": "^2.3.0"
+ }
+ },
+ "node_modules/regex-utilities": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/regex-utilities/-/regex-utilities-2.3.0.tgz",
+ "integrity": "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==",
+ "license": "MIT"
+ },
+ "node_modules/rehype": {
+ "version": "13.0.2",
+ "resolved": "https://registry.npmjs.org/rehype/-/rehype-13.0.2.tgz",
+ "integrity": "sha512-j31mdaRFrwFRUIlxGeuPXXKWQxet52RBQRvCmzl5eCefn/KGbomK5GMHNMsOJf55fgo3qw5tST5neDuarDYR2A==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0",
+ "rehype-parse": "^9.0.0",
+ "rehype-stringify": "^10.0.0",
+ "unified": "^11.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/rehype-expressive-code": {
+ "version": "0.41.7",
+ "resolved": "https://registry.npmjs.org/rehype-expressive-code/-/rehype-expressive-code-0.41.7.tgz",
+ "integrity": "sha512-25f8ZMSF1d9CMscX7Cft0TSQIqdwjce2gDOvQ+d/w0FovsMwrSt3ODP4P3Z7wO1jsIJ4eYyaDRnIR/27bd/EMQ==",
+ "license": "MIT",
+ "dependencies": {
+ "expressive-code": "^0.41.7"
+ }
+ },
+ "node_modules/rehype-format": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/rehype-format/-/rehype-format-5.0.1.tgz",
+ "integrity": "sha512-zvmVru9uB0josBVpr946OR8ui7nJEdzZobwLOOqHb/OOD88W0Vk2SqLwoVOj0fM6IPCCO6TaV9CvQvJMWwukFQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0",
+ "hast-util-format": "^1.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/rehype-parse": {
+ "version": "9.0.1",
+ "resolved": "https://registry.npmjs.org/rehype-parse/-/rehype-parse-9.0.1.tgz",
+ "integrity": "sha512-ksCzCD0Fgfh7trPDxr2rSylbwq9iYDkSn8TCDmEJ49ljEUBxDVCzCHv7QNzZOfODanX4+bWQ4WZqLCRWYLfhag==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0",
+ "hast-util-from-html": "^2.0.0",
+ "unified": "^11.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/rehype-raw": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/rehype-raw/-/rehype-raw-7.0.0.tgz",
+ "integrity": "sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==",
+ "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",
+ "resolved": "https://registry.npmjs.org/rehype-recma/-/rehype-recma-1.0.0.tgz",
+ "integrity": "sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw==",
+ "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/rehype-stringify": {
+ "version": "10.0.1",
+ "resolved": "https://registry.npmjs.org/rehype-stringify/-/rehype-stringify-10.0.1.tgz",
+ "integrity": "sha512-k9ecfXHmIPuFVI61B9DeLPN0qFHfawM6RsuX48hoqlaKSF61RskNjSm1lI8PhBEM0MRdLxVVm4WmTqJQccH9mA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0",
+ "hast-util-to-html": "^9.0.0",
+ "unified": "^11.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/remark-directive": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/remark-directive/-/remark-directive-3.0.1.tgz",
+ "integrity": "sha512-gwglrEQEZcZYgVyG1tQuA+h58EZfq5CSULw7J90AFuCTyib1thgHPoqQ+h9iFvU6R+vnZ5oNFQR5QKgGpk741A==",
+ "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-gfm": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.1.tgz",
+ "integrity": "sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==",
+ "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",
+ "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-3.1.1.tgz",
+ "integrity": "sha512-Pjj2IYlUY3+D8x00UJsIOg5BEvfMyeI+2uLPn9VO9Wg4MEtN/VTIq2NEJQfde9PnX15KgtHyl9S0BcTnWrIuWg==",
+ "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",
+ "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz",
+ "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==",
+ "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",
+ "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.2.tgz",
+ "integrity": "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==",
+ "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-smartypants": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/remark-smartypants/-/remark-smartypants-3.0.2.tgz",
+ "integrity": "sha512-ILTWeOriIluwEvPjv67v7Blgrcx+LZOkAUVtKI3putuhlZm84FnqDORNXPPm+HY3NdZOMhyDwZ1E+eZB/Df5dA==",
+ "license": "MIT",
+ "dependencies": {
+ "retext": "^9.0.0",
+ "retext-smartypants": "^6.0.0",
+ "unified": "^11.0.4",
+ "unist-util-visit": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/remark-stringify": {
+ "version": "11.0.0",
+ "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-11.0.0.tgz",
+ "integrity": "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==",
+ "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/retext": {
+ "version": "9.0.0",
+ "resolved": "https://registry.npmjs.org/retext/-/retext-9.0.0.tgz",
+ "integrity": "sha512-sbMDcpHCNjvlheSgMfEcVrZko3cDzdbe1x/e7G66dFp0Ff7Mldvi2uv6JkJQzdRcvLYE8CA8Oe8siQx8ZOgTcA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/nlcst": "^2.0.0",
+ "retext-latin": "^4.0.0",
+ "retext-stringify": "^4.0.0",
+ "unified": "^11.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/retext-latin": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/retext-latin/-/retext-latin-4.0.0.tgz",
+ "integrity": "sha512-hv9woG7Fy0M9IlRQloq/N6atV82NxLGveq+3H2WOi79dtIYWN8OaxogDm77f8YnVXJL2VD3bbqowu5E3EMhBYA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/nlcst": "^2.0.0",
+ "parse-latin": "^7.0.0",
+ "unified": "^11.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/retext-smartypants": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/retext-smartypants/-/retext-smartypants-6.2.0.tgz",
+ "integrity": "sha512-kk0jOU7+zGv//kfjXEBjdIryL1Acl4i9XNkHxtM7Tm5lFiCog576fjNC9hjoR7LTKQ0DsPWy09JummSsH1uqfQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/nlcst": "^2.0.0",
+ "nlcst-to-string": "^4.0.0",
+ "unist-util-visit": "^5.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/retext-stringify": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/retext-stringify/-/retext-stringify-4.0.0.tgz",
+ "integrity": "sha512-rtfN/0o8kL1e+78+uxPTqu1Klt0yPzKuQ2BfWwwfgIUSayyzxpM1PJzkKt4V8803uB9qSy32MvI7Xep9khTpiA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/nlcst": "^2.0.0",
+ "nlcst-to-string": "^4.0.0",
+ "unified": "^11.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/rollup": {
+ "version": "4.60.2",
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.60.2.tgz",
+ "integrity": "sha512-J9qZyW++QK/09NyN/zeO0dG/1GdGfyp9lV8ajHnRVLfo/uFsbji5mHnDgn/qYdUHyCkM2N+8VyspgZclfAh0eQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "1.0.8"
+ },
+ "bin": {
+ "rollup": "dist/bin/rollup"
+ },
+ "engines": {
+ "node": ">=18.0.0",
+ "npm": ">=8.0.0"
+ },
+ "optionalDependencies": {
+ "@rollup/rollup-android-arm-eabi": "4.60.2",
+ "@rollup/rollup-android-arm64": "4.60.2",
+ "@rollup/rollup-darwin-arm64": "4.60.2",
+ "@rollup/rollup-darwin-x64": "4.60.2",
+ "@rollup/rollup-freebsd-arm64": "4.60.2",
+ "@rollup/rollup-freebsd-x64": "4.60.2",
+ "@rollup/rollup-linux-arm-gnueabihf": "4.60.2",
+ "@rollup/rollup-linux-arm-musleabihf": "4.60.2",
+ "@rollup/rollup-linux-arm64-gnu": "4.60.2",
+ "@rollup/rollup-linux-arm64-musl": "4.60.2",
+ "@rollup/rollup-linux-loong64-gnu": "4.60.2",
+ "@rollup/rollup-linux-loong64-musl": "4.60.2",
+ "@rollup/rollup-linux-ppc64-gnu": "4.60.2",
+ "@rollup/rollup-linux-ppc64-musl": "4.60.2",
+ "@rollup/rollup-linux-riscv64-gnu": "4.60.2",
+ "@rollup/rollup-linux-riscv64-musl": "4.60.2",
+ "@rollup/rollup-linux-s390x-gnu": "4.60.2",
+ "@rollup/rollup-linux-x64-gnu": "4.60.2",
+ "@rollup/rollup-linux-x64-musl": "4.60.2",
+ "@rollup/rollup-openbsd-x64": "4.60.2",
+ "@rollup/rollup-openharmony-arm64": "4.60.2",
+ "@rollup/rollup-win32-arm64-msvc": "4.60.2",
+ "@rollup/rollup-win32-ia32-msvc": "4.60.2",
+ "@rollup/rollup-win32-x64-gnu": "4.60.2",
+ "@rollup/rollup-win32-x64-msvc": "4.60.2",
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/sax": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/sax/-/sax-1.6.0.tgz",
+ "integrity": "sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==",
+ "license": "BlueOak-1.0.0",
+ "engines": {
+ "node": ">=11.0.0"
+ }
+ },
+ "node_modules/semver": {
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz",
+ "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==",
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/sharp": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.5.tgz",
+ "integrity": "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==",
+ "hasInstallScript": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@img/colour": "^1.0.0",
+ "detect-libc": "^2.1.2",
+ "semver": "^7.7.3"
+ },
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-darwin-arm64": "0.34.5",
+ "@img/sharp-darwin-x64": "0.34.5",
+ "@img/sharp-libvips-darwin-arm64": "1.2.4",
+ "@img/sharp-libvips-darwin-x64": "1.2.4",
+ "@img/sharp-libvips-linux-arm": "1.2.4",
+ "@img/sharp-libvips-linux-arm64": "1.2.4",
+ "@img/sharp-libvips-linux-ppc64": "1.2.4",
+ "@img/sharp-libvips-linux-riscv64": "1.2.4",
+ "@img/sharp-libvips-linux-s390x": "1.2.4",
+ "@img/sharp-libvips-linux-x64": "1.2.4",
+ "@img/sharp-libvips-linuxmusl-arm64": "1.2.4",
+ "@img/sharp-libvips-linuxmusl-x64": "1.2.4",
+ "@img/sharp-linux-arm": "0.34.5",
+ "@img/sharp-linux-arm64": "0.34.5",
+ "@img/sharp-linux-ppc64": "0.34.5",
+ "@img/sharp-linux-riscv64": "0.34.5",
+ "@img/sharp-linux-s390x": "0.34.5",
+ "@img/sharp-linux-x64": "0.34.5",
+ "@img/sharp-linuxmusl-arm64": "0.34.5",
+ "@img/sharp-linuxmusl-x64": "0.34.5",
+ "@img/sharp-wasm32": "0.34.5",
+ "@img/sharp-win32-arm64": "0.34.5",
+ "@img/sharp-win32-ia32": "0.34.5",
+ "@img/sharp-win32-x64": "0.34.5"
+ }
+ },
+ "node_modules/shiki": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/shiki/-/shiki-4.0.2.tgz",
+ "integrity": "sha512-eAVKTMedR5ckPo4xne/PjYQYrU3qx78gtJZ+sHlXEg5IHhhoQhMfZVzetTYuaJS0L2Ef3AcCRzCHV8T0WI6nIQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@shikijs/core": "4.0.2",
+ "@shikijs/engine-javascript": "4.0.2",
+ "@shikijs/engine-oniguruma": "4.0.2",
+ "@shikijs/langs": "4.0.2",
+ "@shikijs/themes": "4.0.2",
+ "@shikijs/types": "4.0.2",
+ "@shikijs/vscode-textmate": "^10.0.2",
+ "@types/hast": "^3.0.4"
+ },
+ "engines": {
+ "node": ">=20"
+ }
+ },
+ "node_modules/sisteransi": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz",
+ "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==",
+ "license": "MIT"
+ },
+ "node_modules/sitemap": {
+ "version": "9.0.1",
+ "resolved": "https://registry.npmjs.org/sitemap/-/sitemap-9.0.1.tgz",
+ "integrity": "sha512-S6hzjGJSG3d6if0YoF5kTyeRJvia6FSTBroE5fQ0bu1QNxyJqhhinfUsXi9fH3MgtXODWvwo2BDyQSnhPQ88uQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "^24.9.2",
+ "@types/sax": "^1.2.1",
+ "arg": "^5.0.0",
+ "sax": "^1.4.1"
+ },
+ "bin": {
+ "sitemap": "dist/esm/cli.js"
+ },
+ "engines": {
+ "node": ">=20.19.5",
+ "npm": ">=10.8.2"
+ }
+ },
+ "node_modules/smol-toml": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/smol-toml/-/smol-toml-1.6.1.tgz",
+ "integrity": "sha512-dWUG8F5sIIARXih1DTaQAX4SsiTXhInKf1buxdY9DIg4ZYPZK5nGM1VRIYmEbDbsHt7USo99xSLFu5Q1IqTmsg==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">= 18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/cyyynthia"
+ }
+ },
+ "node_modules/source-map": {
+ "version": "0.7.6",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz",
+ "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">= 12"
+ }
+ },
+ "node_modules/source-map-js": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
+ "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/space-separated-tokens": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz",
+ "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/starlight-theme-rapide": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/starlight-theme-rapide/-/starlight-theme-rapide-0.5.2.tgz",
+ "integrity": "sha512-4kNJutt0/3E0rjZvG9hvKeTTHGOHC97t2ZQDwDcokTM25yLgxavFu7BCm2Dm2UTw7fJpRXpu4gUWJ9xAOBmNww==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "@astrojs/starlight": ">=0.34.0"
+ }
+ },
+ "node_modules/stream-replace-string": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/stream-replace-string/-/stream-replace-string-2.0.0.tgz",
+ "integrity": "sha512-TlnjJ1C0QrmxRNrON00JvaFFlNh5TTG00APw23j74ET7gkQpTASi6/L2fuiav8pzK715HXtUeClpBTw2NPSn6w==",
+ "license": "MIT"
+ },
+ "node_modules/stringify-entities": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz",
+ "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==",
+ "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/style-to-js": {
+ "version": "1.1.21",
+ "resolved": "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.21.tgz",
+ "integrity": "sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ==",
+ "license": "MIT",
+ "dependencies": {
+ "style-to-object": "1.0.14"
+ }
+ },
+ "node_modules/style-to-object": {
+ "version": "1.0.14",
+ "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.14.tgz",
+ "integrity": "sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw==",
+ "license": "MIT",
+ "dependencies": {
+ "inline-style-parser": "0.2.7"
+ }
+ },
+ "node_modules/svgo": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/svgo/-/svgo-4.0.1.tgz",
+ "integrity": "sha512-XDpWUOPC6FEibaLzjfe0ucaV0YrOjYotGJO1WpF0Zd+n6ZGEQUsSugaoLq9QkEZtAfQIxT42UChcssDVPP3+/w==",
+ "license": "MIT",
+ "dependencies": {
+ "commander": "^11.1.0",
+ "css-select": "^5.1.0",
+ "css-tree": "^3.0.1",
+ "css-what": "^6.1.0",
+ "csso": "^5.0.5",
+ "picocolors": "^1.1.1",
+ "sax": "^1.5.0"
+ },
+ "bin": {
+ "svgo": "bin/svgo.js"
+ },
+ "engines": {
+ "node": ">=16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/svgo"
+ }
+ },
+ "node_modules/tiny-inflate": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/tiny-inflate/-/tiny-inflate-1.0.3.tgz",
+ "integrity": "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==",
+ "license": "MIT"
+ },
+ "node_modules/tinyclip": {
+ "version": "0.1.12",
+ "resolved": "https://registry.npmjs.org/tinyclip/-/tinyclip-0.1.12.tgz",
+ "integrity": "sha512-Ae3OVUqifDw0wBriIBS7yVaW44Dp6eSHQcyq4Igc7eN2TJH/2YsicswaW+J/OuMvhpDPOKEgpAZCjkb4hpoyeA==",
+ "license": "MIT",
+ "engines": {
+ "node": "^16.14.0 || >= 17.3.0"
+ }
+ },
+ "node_modules/tinyexec": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.1.1.tgz",
+ "integrity": "sha512-VKS/ZaQhhkKFMANmAOhhXVoIfBXblQxGX1myCQ2faQrfmobMftXeJPcZGp0gS07ocvGJWDLZGyOZDadDBqYIJg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/tinyglobby": {
+ "version": "0.2.16",
+ "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz",
+ "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==",
+ "license": "MIT",
+ "dependencies": {
+ "fdir": "^6.5.0",
+ "picomatch": "^4.0.4"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/SuperchupuDev"
+ }
+ },
+ "node_modules/trim-lines": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz",
+ "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/trough": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz",
+ "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/tsconfck": {
+ "version": "3.1.6",
+ "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-3.1.6.tgz",
+ "integrity": "sha512-ks6Vjr/jEw0P1gmOVwutM3B7fWxoWBL2KRDb1JfqGVawBmO5UsvmWOQFGHBPl5yxYz4eERr19E6L7NMv+Fej4w==",
+ "license": "MIT",
+ "bin": {
+ "tsconfck": "bin/tsconfck.js"
+ },
+ "engines": {
+ "node": "^18 || >=20"
+ },
+ "peerDependencies": {
+ "typescript": "^5.0.0"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/tslib": {
+ "version": "2.8.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+ "license": "0BSD",
+ "optional": true
+ },
+ "node_modules/ufo": {
+ "version": "1.6.3",
+ "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.3.tgz",
+ "integrity": "sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==",
+ "license": "MIT"
+ },
+ "node_modules/ultrahtml": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/ultrahtml/-/ultrahtml-1.6.0.tgz",
+ "integrity": "sha512-R9fBn90VTJrqqLDwyMph+HGne8eqY1iPfYhPzZrvKpIfwkWZbcYlfpsb8B9dTvBfpy1/hqAD7Wi8EKfP9e8zdw==",
+ "license": "MIT"
+ },
+ "node_modules/uncrypto": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/uncrypto/-/uncrypto-0.1.3.tgz",
+ "integrity": "sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==",
+ "license": "MIT"
+ },
+ "node_modules/undici-types": {
+ "version": "7.16.0",
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz",
+ "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==",
+ "license": "MIT"
+ },
+ "node_modules/unified": {
+ "version": "11.0.5",
+ "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz",
+ "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==",
+ "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/unifont": {
+ "version": "0.7.4",
+ "resolved": "https://registry.npmjs.org/unifont/-/unifont-0.7.4.tgz",
+ "integrity": "sha512-oHeis4/xl42HUIeHuNZRGEvxj5AaIKR+bHPNegRq5LV1gdc3jundpONbjglKpihmJf+dswygdMJn3eftGIMemg==",
+ "license": "MIT",
+ "dependencies": {
+ "css-tree": "^3.1.0",
+ "ofetch": "^1.5.1",
+ "ohash": "^2.0.11"
+ }
+ },
+ "node_modules/unist-util-find-after": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/unist-util-find-after/-/unist-util-find-after-5.0.0.tgz",
+ "integrity": "sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0",
+ "unist-util-is": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/unist-util-is": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.1.tgz",
+ "integrity": "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/unist-util-modify-children": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/unist-util-modify-children/-/unist-util-modify-children-4.0.0.tgz",
+ "integrity": "sha512-+tdN5fGNddvsQdIzUF3Xx82CU9sMM+fA0dLgR9vOmT0oPT2jH+P1nd5lSqfCfXAw+93NhcXNY2qqvTUtE4cQkw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0",
+ "array-iterate": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/unist-util-position": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz",
+ "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==",
+ "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",
+ "resolved": "https://registry.npmjs.org/unist-util-position-from-estree/-/unist-util-position-from-estree-2.0.0.tgz",
+ "integrity": "sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/unist-util-remove-position": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-5.0.0.tgz",
+ "integrity": "sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0",
+ "unist-util-visit": "^5.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/unist-util-stringify-position": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz",
+ "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==",
+ "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",
+ "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.1.0.tgz",
+ "integrity": "sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==",
+ "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-children": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/unist-util-visit-children/-/unist-util-visit-children-3.0.0.tgz",
+ "integrity": "sha512-RgmdTfSBOg04sdPcpTSD1jzoNBjt9a80/ZCzp5cI9n1qPzLZWF9YdvWGN2zmTumP1HWhXKdUWexjy/Wy/lJ7tA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/unist-util-visit-parents": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz",
+ "integrity": "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0",
+ "unist-util-is": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/unstorage": {
+ "version": "1.17.5",
+ "resolved": "https://registry.npmjs.org/unstorage/-/unstorage-1.17.5.tgz",
+ "integrity": "sha512-0i3iqvRfx29hkNntHyQvJTpf5W9dQ9ZadSoRU8+xVlhVtT7jAX57fazYO9EHvcRCfBCyi5YRya7XCDOsbTgkPg==",
+ "license": "MIT",
+ "dependencies": {
+ "anymatch": "^3.1.3",
+ "chokidar": "^5.0.0",
+ "destr": "^2.0.5",
+ "h3": "^1.15.10",
+ "lru-cache": "^11.2.7",
+ "node-fetch-native": "^1.6.7",
+ "ofetch": "^1.5.1",
+ "ufo": "^1.6.3"
+ },
+ "peerDependencies": {
+ "@azure/app-configuration": "^1.8.0",
+ "@azure/cosmos": "^4.2.0",
+ "@azure/data-tables": "^13.3.0",
+ "@azure/identity": "^4.6.0",
+ "@azure/keyvault-secrets": "^4.9.0",
+ "@azure/storage-blob": "^12.26.0",
+ "@capacitor/preferences": "^6 || ^7 || ^8",
+ "@deno/kv": ">=0.9.0",
+ "@netlify/blobs": "^6.5.0 || ^7.0.0 || ^8.1.0 || ^9.0.0 || ^10.0.0",
+ "@planetscale/database": "^1.19.0",
+ "@upstash/redis": "^1.34.3",
+ "@vercel/blob": ">=0.27.1",
+ "@vercel/functions": "^2.2.12 || ^3.0.0",
+ "@vercel/kv": "^1 || ^2 || ^3",
+ "aws4fetch": "^1.0.20",
+ "db0": ">=0.2.1",
+ "idb-keyval": "^6.2.1",
+ "ioredis": "^5.4.2",
+ "uploadthing": "^7.4.4"
+ },
+ "peerDependenciesMeta": {
+ "@azure/app-configuration": {
+ "optional": true
+ },
+ "@azure/cosmos": {
+ "optional": true
+ },
+ "@azure/data-tables": {
+ "optional": true
+ },
+ "@azure/identity": {
+ "optional": true
+ },
+ "@azure/keyvault-secrets": {
+ "optional": true
+ },
+ "@azure/storage-blob": {
+ "optional": true
+ },
+ "@capacitor/preferences": {
+ "optional": true
+ },
+ "@deno/kv": {
+ "optional": true
+ },
+ "@netlify/blobs": {
+ "optional": true
+ },
+ "@planetscale/database": {
+ "optional": true
+ },
+ "@upstash/redis": {
+ "optional": true
+ },
+ "@vercel/blob": {
+ "optional": true
+ },
+ "@vercel/functions": {
+ "optional": true
+ },
+ "@vercel/kv": {
+ "optional": true
+ },
+ "aws4fetch": {
+ "optional": true
+ },
+ "db0": {
+ "optional": true
+ },
+ "idb-keyval": {
+ "optional": true
+ },
+ "ioredis": {
+ "optional": true
+ },
+ "uploadthing": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
+ "license": "MIT"
+ },
+ "node_modules/vfile": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz",
+ "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==",
+ "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",
+ "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-5.0.3.tgz",
+ "integrity": "sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==",
+ "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",
+ "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz",
+ "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==",
+ "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/vite": {
+ "version": "7.3.2",
+ "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.2.tgz",
+ "integrity": "sha512-Bby3NOsna2jsjfLVOHKes8sGwgl4TT0E6vvpYgnAYDIF/tie7MRaFthmKuHx1NSXjiTueXH3do80FMQgvEktRg==",
+ "license": "MIT",
+ "dependencies": {
+ "esbuild": "^0.27.0",
+ "fdir": "^6.5.0",
+ "picomatch": "^4.0.3",
+ "postcss": "^8.5.6",
+ "rollup": "^4.43.0",
+ "tinyglobby": "^0.2.15"
+ },
+ "bin": {
+ "vite": "bin/vite.js"
+ },
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ },
+ "funding": {
+ "url": "https://github.com/vitejs/vite?sponsor=1"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.3"
+ },
+ "peerDependencies": {
+ "@types/node": "^20.19.0 || >=22.12.0",
+ "jiti": ">=1.21.0",
+ "less": "^4.0.0",
+ "lightningcss": "^1.21.0",
+ "sass": "^1.70.0",
+ "sass-embedded": "^1.70.0",
+ "stylus": ">=0.54.8",
+ "sugarss": "^5.0.0",
+ "terser": "^5.16.0",
+ "tsx": "^4.8.1",
+ "yaml": "^2.4.2"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ },
+ "jiti": {
+ "optional": true
+ },
+ "less": {
+ "optional": true
+ },
+ "lightningcss": {
+ "optional": true
+ },
+ "sass": {
+ "optional": true
+ },
+ "sass-embedded": {
+ "optional": true
+ },
+ "stylus": {
+ "optional": true
+ },
+ "sugarss": {
+ "optional": true
+ },
+ "terser": {
+ "optional": true
+ },
+ "tsx": {
+ "optional": true
+ },
+ "yaml": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/vitefu": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-1.1.3.tgz",
+ "integrity": "sha512-ub4okH7Z5KLjb6hDyjqrGXqWtWvoYdU3IGm/NorpgHncKoLTCfRIbvlhBm7r0YstIaQRYlp4yEbFqDcKSzXSSg==",
+ "license": "MIT",
+ "workspaces": [
+ "tests/deps/*",
+ "tests/projects/*",
+ "tests/projects/workspace/packages/*"
+ ],
+ "peerDependencies": {
+ "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0"
+ },
+ "peerDependenciesMeta": {
+ "vite": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/web-namespaces": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz",
+ "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/which-pm-runs": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.1.0.tgz",
+ "integrity": "sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/xxhash-wasm": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/xxhash-wasm/-/xxhash-wasm-1.1.0.tgz",
+ "integrity": "sha512-147y/6YNh+tlp6nd/2pWq38i9h6mz/EuQ6njIrmW8D1BS5nCqs0P6DG+m6zTGnNz5I+uhZ0SHxBs9BsPrwcKDA==",
+ "license": "MIT"
+ },
+ "node_modules/yargs-parser": {
+ "version": "22.0.0",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz",
+ "integrity": "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==",
+ "license": "ISC",
+ "engines": {
+ "node": "^20.19.0 || ^22.12.0 || >=23"
+ }
+ },
+ "node_modules/yocto-queue": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.2.tgz",
+ "integrity": "sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12.20"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/zod": {
+ "version": "4.3.6",
+ "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.6.tgz",
+ "integrity": "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/colinhacks"
+ }
+ },
+ "node_modules/zwitch": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz",
+ "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ }
+ }
+}
diff --git a/docs/package.json b/docs/package.json
new file mode 100644
index 0000000000..fac3683aed
--- /dev/null
+++ b/docs/package.json
@@ -0,0 +1,18 @@
+{
+ "name": "xllm-docs",
+ "type": "module",
+ "version": "0.0.1",
+ "scripts": {
+ "dev": "astro dev",
+ "start": "astro dev",
+ "build": "astro build",
+ "preview": "astro preview",
+ "astro": "astro"
+ },
+ "dependencies": {
+ "@astrojs/starlight": "^0.38.4",
+ "astro": "^6.1.9",
+ "sharp": "^0.34.5",
+ "starlight-theme-rapide": "^0.5.2"
+ }
+}
diff --git a/docs/project/RELEASE.md b/docs/project/RELEASE.md
deleted file mode 100644
index b7e5873629..0000000000
--- a/docs/project/RELEASE.md
+++ /dev/null
@@ -1,208 +0,0 @@
-# Release xllm 0.9.0
-
-## **Major Features and Improvements**
-
-### Model Support
-
-#### NPU
-- Support GLM-5 model.
-- Support GLM4.7-Flash model.
-- Support Qwen3-next model.
-- Support OneRec model.
-- Support Qwen3.5/Qwen3.5-MoE model.
-#### CUDA
-- Support LongCat-Image model.
-- Support LongCat-Image-Edit model.
-#### MLU
-- Support DeepSeek-V3.2 W4A8 MoE model.
-- Support GLM-5 W8A8 model.
-#### ILU
-- Support Qwen3-8B model.
-- Support Qwen3-30B-MoE model.
-
-### Feature
-- Adapt NPU builds to CANN 8.5 and PyTorch 2.7.1.
-- Support graph mode for the LLM part of VLM models on NPU devices.
-- Support context parallelism for NPU DeepSeek-V3.2 / GLM-5.
-- Support DeepSeek-V3.2 prefill sequence parallel on MLU devices.
-- Support rolling weight loading and loading model weights with varied prefixes.
-- Support dynamic and scalable multi-model serving.
-- Support bidirectional remote-host to local-device KV cache transfer and batch offload.
-- Support Qwen3 xattention on NPU devices.
-- Support prefix cache for DeepSeek-V3.2.
-- Support chunked prefill on CUDA devices.
-- Support embedding interface for all generate LLM models.
-- Support Anthropic Messages API.
-- Support the new `v1/sample` interface.
-- Support a single xLLM instance connecting to multiple xLLM services.
-- Support startup progress bar, worker health check, and unified request statistics logging.
-- Optimize Qwen3 MoE performance on NPU devices.
-- Add CUDA Graph Executor and piecewise prefill graph.
-- Support KV cache quantization on MLU devices.
-- Add VMM-based allocators to reuse graph buffers and physical memory.
-- Improve FP8 GEMM, fused RMSNorm, fused MoE, xattention, and activation kernel performance.
-
-### Bugfix
-- Support the new `compressed-tensors` FP8 config and fix Qwen2 prompt length.
-- Fix Qwen3 MoE VL parameter settings on MLU devices.
-- Fix Qwen VL issues on MLU devices and Qwen2.5 chunked-prefill accuracy on NPU.
-- Fix DeepSeek tool-call, prefix-cache, DP/MTP, and PD-disagg related issues.
-- Fix GLM-4.7 streaming function call issues and GLM detector stability issues.
-- Fix graph mode, schedule overlap, KV cache, and REC multi-round stability issues.
-- Fix multiple compile, link, env setup, and worker lifecycle issues.
-
-
-# Release xllm 0.8.0
-
-## **Major Features and Improvements**
-
-### Model Support
-
-#### NPU
-- Support DeepSeek-v3.2 model.
-- Support GLM4.7 model.
-- Support GLM4.6Vmodel.
-- Support GME-Qwen2-VL model.
-- Support FluxControl model.
-#### CUDA
-- Support Qwen2/3 Dense model.
-#### MLU
-- Support DeepSeek-v3.2 model.
-- Support Qwen2_5_vl/Qwen3_vl/Qwen3_vl_moe model.
-#### ILU
-- Support Qwen3-0.6B model.
-
-### Feature
-- Implement chunked prefill and prefix cache for Qwen3 MoE.
-- Support GLM-4.6V model.
-- Add wrappers for ATB and ACLNN fused operators.
-- Optimize prefetch from kv cache store.
-- Support Qwen2-VL & GME-Qwen2-VL model on npu device.
-- Fix hang issue when enable schedule overlap.
-- Add GLM-4.7 detector implementation and update tool call parser.
-- Adapt hierarchy block manager for disagg PD.
-- Support deepseek-v3.2-Exp for npu.
-- Support acl_graph for qwen3/qwen3_moe.
-- Support prefix cache for deepseek-v3/r1 models.
-- Support disagg PD for MTP.
-- Add mooncake kv cache transfer.
-- Add GLM-4.7 support to reasoning detector registry.
-- Support nd-to-nz continuous memory copy.
-- Support RPC-based link/unlink for PD disaggregation.
-- Support IntraLayerAddNorm, aclgraph, etc for DeepSeek V3.2.
-- Add activation, norm and rope ops for cuda device.
-- Support fused norm for Qwen3 and DeepSeek for cuda device.
-- Build deepseek v2 decoder layer and related model files for mlu device.
-- Support qwen2_5_vl/qwen3_vl/qwen3_vl_moe on mlu device.
-- Add moe all2all kernels and deep ep layer on mlu device.
-- Support deepseek mtp on mlu device.
-- Support graph executor on mlu device.
-- Support dp+ep moe and all2all computation on mlu device.
-- Support parallelized shared experts in fused moe on mlu device.
-- Support qwen3 0.6B model on iluvatar device.
-- Add rec proto,serivce and utils for rec framework
-- Support C api for llm inference.
-- Add constrained decoding for generative recommendation.
-- Add rec scheduler master and engine for rec framework.
-- Add rec_type and onerec batch input builder for rec framework.
-- Add onerec worker impl for rec framework.
-- Add qwen3/LlmRec support in rec framework.
-
-### Bugfix
-- Reslove core dump of stream chat completion request when backend is VLM.
-- Resolve duplicate content in multi-turn tool call conversations.
-- Fix core dump issue triggered by client disconnection.
-- Fix the memory leak issue in the completions interface.
-- Fix wrong positons of validate input when enable MTP.
-- Resolve kv_cache_num mismatch in ChunkedPrefill due to H2D block copy.
-- Fix the missing index shape in the allocate kv cache transfer.
-- Fix MiMo-VL weights loading crash on NPU device.
-- Fix inaccurate metrics issue when enabling schedule overlap.
-- Fix potential out-of-range and block leaks during deallocate in D2H copy.
-- Fix allocation failure in HierarchyBlockManagerPool::allocate.
-- Fix deepseek accuracy issues with prefix cache enabled.
-- Resolve Deepseek execution failure caused by invalid input.
-- Fix DeepSeek failing to run when enabling DP.
-- Fix the rate_limit bug for stream and non-stream request in PD disagg and refactor some callback logics.
-- Correct attn mask when prefix cache and MTP are both enabled in deepseek.
-- Correct precision loss when enabling prefixcache with disagg pd.
-- Fix incorrect async implementation in rerank interface.
-- Fix acl_graph_executor not handling q_cu_seq_lens parameter for deepseekv3.2.
-- Fix precision issue when enabling MTP in PD disaggregation mode.
-- Fix mrope calculation in the multimodal situation.
-- Fix core dump of large beam width.
-
-
-# Release xllm 0.7.0
-
-## **Major Features and Improvements**
-
-### Model Support
-
-- Support GLM-4.5.
-- Support Qwen3-Embedding.
-- Support Qwen3-VL.
-- Support FluxFill.
-
-### Feature
-- Support MLU backend, currently supports Qwen3 series models.
-- Support dynamic disaggregated PD, with dynamic switching between P and D phases based on strategy.
-- Support multi-stream parallel overlap optimization.
-- Support beam-search capability in generative models.
-- Support virtual memory continuous kv-cache capability.
-- Support ACL graph executor.
-- Support unified online-offline co-location scheduling in disaggregated PD scenarios.
-- Support PrefillOnly Scheduler.
-- Support v1/rerank model service interface.
-- Support communication between devices via shared memory instead of RPC on a single machine.
-- Support function call.
-- Support reasoning output in chat interface.
-- Support top-k+add fusion in the router component of MoE models.
-- Support offline inference for LLM, VLM, and Embedding models.
-- Optimized certain runtime performance.
-
-### Bugfix
-- Skip cancelled requests when processing stream output.
-- Resolve segmentation fault during qwen3 quantized inference.
-- Fix the alignment of monitoring metrics format for Prometheus.
-- Clear outdated tensors to save memory when loading model weights.
-- Fix attention mask to support long sequence requests.
-- Fix bugs caused by enabling scheduler overlap.
-
-# Release xllm 0.6.0
-
-## **Major Features and Improvements**
-
-### Model Support
-
-- Support DeepSeek-V3/R1.
-- Support DeepSeek-R1-Distill-Qwen.
-- Support Kimi-k2.
-- Support Llama2/3.
-- Support Qwen2/2.5/QwQ.
-- Support Qwen3/Qwen3-MoE.
-- Support MiniCPM-V.
-- Support MiMo-VL.
-- Support Qwen2.5-VL .
-
-### Feature
-
-- Support KV cache store.
-- Support Expert Parallelism Load Balance.
-- Support multi-priority on/offline scheduler.
-- Support latency-aware scheduler.
-- Support serving early stop.
-- Optimize ppmatmul kernel.
-- Support image url input for VLM.
-- Support disaggregated prefill and decoding.
-- Support large-scale EP parallelism.
-- Support Hash-based PrefixCache matching.
-- Support Multi-Token Prediction for DeepSeek.
-- Support asynchronous scheduling, allowing the scheduling and computational pipeline to execute in parallel.
-- Support EP, DP, TP model parallel.
-- Support multiple process and multiple nodes.
-
-### Docs
-
-- Add getting started docs.
-- Add features docs.
\ No newline at end of file
diff --git a/docs/requirements.txt b/docs/requirements.txt
deleted file mode 100644
index 75b2fae331..0000000000
--- a/docs/requirements.txt
+++ /dev/null
@@ -1,43 +0,0 @@
-
-# mkdocs-material
-# mkdocs-minify-plugin
-# python-markdown-math
-# regex
-# ruff
-
-# jinja2~=3.1
-# markdown~=3.2
-# mkdocs~=1.6
-# mkdocs-material-extensions~=1.3
-# pygments~=2.16
-# pymdown-extensions~=10.2
-
-# # Requirements for plugins
-# babel~=2.10
-# colorama~=0.4
-# paginate~=0.5
-# backrefs~=5.7.post1
-# requests~=2.26
-
-# Requirements for core
-jinja2
-markdown
-mkdocs
-mkdocs-material
-mkdocs-material-extensions
-pygments
-pymdown-extensions
-mkdocs-minify-plugin
-python-markdown-math
-
-mkdocs-git-revision-date-localized-plugin
-# Requirements for plugins
-babel
-colorama
-paginate
-backrefs
-requests
-
-# Temporarily pin click until this is resolved in MkDocs, see
-# https://github.com/mkdocs/mkdocs/issues/4014#issuecomment-3146508306
-click
\ No newline at end of file
diff --git a/docs/assets/logo_with_llm.png b/docs/src/assets/logo_with_llm.png
similarity index 100%
rename from docs/assets/logo_with_llm.png
rename to docs/src/assets/logo_with_llm.png
diff --git a/docs/src/components/Header.astro b/docs/src/components/Header.astro
new file mode 100644
index 0000000000..6c8e25dbef
--- /dev/null
+++ b/docs/src/components/Header.astro
@@ -0,0 +1,363 @@
+---
+import config from 'virtual:starlight/user-config';
+
+import Search from 'virtual:starlight/components/Search';
+import SiteTitle from 'virtual:starlight/components/SiteTitle';
+import SocialIcons from 'virtual:starlight/components/SocialIcons';
+import ThemeSelect from 'virtual:starlight/components/ThemeSelect';
+
+const { sidebar } = Astro.locals.starlightRoute;
+const currentLocale = Astro.locals.starlightRoute.locale;
+
+const shouldRenderSearch =
+ config.pagefind || config.components.Search !== '@astrojs/starlight/components/Search.astro';
+
+const getFirstHref = (entry) => {
+ if (entry.type === 'link') return entry.href;
+
+ for (const child of entry.entries) {
+ const href = getFirstHref(child);
+ if (href) return href;
+ }
+};
+
+const isCurrentEntry = (entry) => {
+ if (entry.type === 'link') return entry.isCurrent;
+
+ return entry.entries.some(isCurrentEntry);
+};
+
+const navItems = sidebar
+ .map((entry) => ({ label: entry.label, href: getFirstHref(entry), isCurrent: isCurrentEntry(entry) }))
+ .filter((entry) => entry.href);
+
+const localeEntries = Object.entries(config.locales ?? {}).map(([code, locale]) => ({
+ code,
+ label: locale?.label ?? code,
+ href: getLocalizedPathname(code),
+ isCurrent: code === currentLocale,
+}));
+
+function getLocalizedPathname(locale) {
+ const url = new URL(Astro.url);
+ const pathSegments = url.pathname.split('/');
+ const currentLocaleIndex = pathSegments.findIndex((segment) => segment in (config.locales ?? {}));
+
+ if (currentLocaleIndex === -1) {
+ pathSegments.splice(1, 0, locale);
+ } else {
+ pathSegments[currentLocaleIndex] = locale;
+ }
+
+ return pathSegments.join('/') + url.search + url.hash;
+}
+---
+
+
+
+
+
+
diff --git a/docs/src/components/PageTitle.astro b/docs/src/components/PageTitle.astro
new file mode 100644
index 0000000000..7849e19616
--- /dev/null
+++ b/docs/src/components/PageTitle.astro
@@ -0,0 +1,197 @@
+---
+import { existsSync, readFileSync } from 'node:fs';
+import { join } from 'node:path';
+
+const { entry } = Astro.locals.starlightRoute;
+const title = entry.data.title;
+const sourcePath = entry.filePath ? join(process.cwd(), entry.filePath) : undefined;
+const sourceMarkdown =
+ sourcePath && existsSync(sourcePath) ? readFileSync(sourcePath, 'utf-8') : '';
+const bodyMarkdown = stripFrontmatter(sourceMarkdown).trim();
+const copyMarkdown = [`# ${title}`, bodyMarkdown].filter(Boolean).join('\n\n') + '\n';
+const copyPayload = JSON.stringify(copyMarkdown).replace(/
+ {title}
+
+
+
+
+
+
+ Copy page
+
+
+
+
+
+
+
+
diff --git a/docs/src/content.config.ts b/docs/src/content.config.ts
new file mode 100644
index 0000000000..d9ee8c9d1c
--- /dev/null
+++ b/docs/src/content.config.ts
@@ -0,0 +1,7 @@
+import { defineCollection } from 'astro:content';
+import { docsLoader } from '@astrojs/starlight/loaders';
+import { docsSchema } from '@astrojs/starlight/schema';
+
+export const collections = {
+ docs: defineCollection({ loader: docsLoader(), schema: docsSchema() }),
+};
diff --git a/docs/assets/async_schedule_architecture.jpg b/docs/src/content/docs/assets/async_schedule_architecture.jpg
similarity index 100%
rename from docs/assets/async_schedule_architecture.jpg
rename to docs/src/content/docs/assets/async_schedule_architecture.jpg
diff --git a/docs/assets/eplb_architecture.png b/docs/src/content/docs/assets/eplb_architecture.png
similarity index 100%
rename from docs/assets/eplb_architecture.png
rename to docs/src/content/docs/assets/eplb_architecture.png
diff --git a/docs/assets/fixed_steps_scheduler_orca.png b/docs/src/content/docs/assets/fixed_steps_scheduler_orca.png
similarity index 100%
rename from docs/assets/fixed_steps_scheduler_orca.png
rename to docs/src/content/docs/assets/fixed_steps_scheduler_orca.png
diff --git a/docs/assets/generative_recommendation_beam_search.png b/docs/src/content/docs/assets/generative_recommendation_beam_search.png
similarity index 100%
rename from docs/assets/generative_recommendation_beam_search.png
rename to docs/src/content/docs/assets/generative_recommendation_beam_search.png
diff --git a/docs/assets/generative_recommendation_integration_architecture.jpg b/docs/src/content/docs/assets/generative_recommendation_integration_architecture.jpg
similarity index 100%
rename from docs/assets/generative_recommendation_integration_architecture.jpg
rename to docs/src/content/docs/assets/generative_recommendation_integration_architecture.jpg
diff --git a/docs/assets/generative_recommendation_integration_architecture_en.svg b/docs/src/content/docs/assets/generative_recommendation_integration_architecture_en.svg
similarity index 100%
rename from docs/assets/generative_recommendation_integration_architecture_en.svg
rename to docs/src/content/docs/assets/generative_recommendation_integration_architecture_en.svg
diff --git a/docs/assets/generative_recommendation_model_onerec.png b/docs/src/content/docs/assets/generative_recommendation_model_onerec.png
similarity index 100%
rename from docs/assets/generative_recommendation_model_onerec.png
rename to docs/src/content/docs/assets/generative_recommendation_model_onerec.png
diff --git a/docs/assets/generative_recommendation_model_onetrans.png b/docs/src/content/docs/assets/generative_recommendation_model_onetrans.png
similarity index 100%
rename from docs/assets/generative_recommendation_model_onetrans.png
rename to docs/src/content/docs/assets/generative_recommendation_model_onetrans.png
diff --git a/docs/assets/generative_recommendation_overview.png b/docs/src/content/docs/assets/generative_recommendation_overview.png
similarity index 100%
rename from docs/assets/generative_recommendation_overview.png
rename to docs/src/content/docs/assets/generative_recommendation_overview.png
diff --git a/docs/assets/globalkvcache_architecture.png b/docs/src/content/docs/assets/globalkvcache_architecture.png
similarity index 100%
rename from docs/assets/globalkvcache_architecture.png
rename to docs/src/content/docs/assets/globalkvcache_architecture.png
diff --git a/docs/assets/graph_mode.png b/docs/src/content/docs/assets/graph_mode.png
similarity index 100%
rename from docs/assets/graph_mode.png
rename to docs/src/content/docs/assets/graph_mode.png
diff --git a/docs/assets/logo.png b/docs/src/content/docs/assets/logo.png
similarity index 100%
rename from docs/assets/logo.png
rename to docs/src/content/docs/assets/logo.png
diff --git a/docs/src/content/docs/assets/logo_with_llm.png b/docs/src/content/docs/assets/logo_with_llm.png
new file mode 100644
index 0000000000..ee61bdf9b4
Binary files /dev/null and b/docs/src/content/docs/assets/logo_with_llm.png differ
diff --git a/docs/assets/moe_eplevel1.jpg b/docs/src/content/docs/assets/moe_eplevel1.jpg
similarity index 100%
rename from docs/assets/moe_eplevel1.jpg
rename to docs/src/content/docs/assets/moe_eplevel1.jpg
diff --git a/docs/assets/moe_eplevel2.jpg b/docs/src/content/docs/assets/moe_eplevel2.jpg
similarity index 100%
rename from docs/assets/moe_eplevel2.jpg
rename to docs/src/content/docs/assets/moe_eplevel2.jpg
diff --git a/docs/assets/multi_streams_architecture.jpg b/docs/src/content/docs/assets/multi_streams_architecture.jpg
similarity index 100%
rename from docs/assets/multi_streams_architecture.jpg
rename to docs/src/content/docs/assets/multi_streams_architecture.jpg
diff --git a/docs/assets/paged_attention_comparison.png b/docs/src/content/docs/assets/paged_attention_comparison.png
similarity index 100%
rename from docs/assets/paged_attention_comparison.png
rename to docs/src/content/docs/assets/paged_attention_comparison.png
diff --git a/docs/assets/pd_architecture.jpg b/docs/src/content/docs/assets/pd_architecture.jpg
similarity index 100%
rename from docs/assets/pd_architecture.jpg
rename to docs/src/content/docs/assets/pd_architecture.jpg
diff --git a/docs/assets/piecewise_graph_diagram.svg b/docs/src/content/docs/assets/piecewise_graph_diagram.svg
similarity index 100%
rename from docs/assets/piecewise_graph_diagram.svg
rename to docs/src/content/docs/assets/piecewise_graph_diagram.svg
diff --git a/docs/assets/service_arch.png b/docs/src/content/docs/assets/service_arch.png
similarity index 100%
rename from docs/assets/service_arch.png
rename to docs/src/content/docs/assets/service_arch.png
diff --git a/docs/assets/shared_vmm_mapping_diagram.svg b/docs/src/content/docs/assets/shared_vmm_mapping_diagram.svg
similarity index 100%
rename from docs/assets/shared_vmm_mapping_diagram.svg
rename to docs/src/content/docs/assets/shared_vmm_mapping_diagram.svg
diff --git a/docs/assets/wechat_qrcode.png b/docs/src/content/docs/assets/wechat_qrcode.png
similarity index 100%
rename from docs/assets/wechat_qrcode.png
rename to docs/src/content/docs/assets/wechat_qrcode.png
diff --git a/docs/assets/xattention_kv_layout.png b/docs/src/content/docs/assets/xattention_kv_layout.png
similarity index 100%
rename from docs/assets/xattention_kv_layout.png
rename to docs/src/content/docs/assets/xattention_kv_layout.png
diff --git a/docs/assets/xattention_kv_layout_en.svg b/docs/src/content/docs/assets/xattention_kv_layout_en.svg
similarity index 100%
rename from docs/assets/xattention_kv_layout_en.svg
rename to docs/src/content/docs/assets/xattention_kv_layout_en.svg
diff --git a/docs/assets/xattention_three_stage_pipeline.png b/docs/src/content/docs/assets/xattention_three_stage_pipeline.png
similarity index 100%
rename from docs/assets/xattention_three_stage_pipeline.png
rename to docs/src/content/docs/assets/xattention_three_stage_pipeline.png
diff --git a/docs/assets/xattention_three_stage_pipeline_en.svg b/docs/src/content/docs/assets/xattention_three_stage_pipeline_en.svg
similarity index 100%
rename from docs/assets/xattention_three_stage_pipeline_en.svg
rename to docs/src/content/docs/assets/xattention_three_stage_pipeline_en.svg
diff --git a/docs/assets/xllm_arch.png b/docs/src/content/docs/assets/xllm_arch.png
similarity index 100%
rename from docs/assets/xllm_arch.png
rename to docs/src/content/docs/assets/xllm_arch.png
diff --git a/docs/en/cli_reference.md b/docs/src/content/docs/en/cli_reference.md
similarity index 98%
rename from docs/en/cli_reference.md
rename to docs/src/content/docs/en/cli_reference.md
index d9373cb843..9e33d5d9d8 100644
--- a/docs/en/cli_reference.md
+++ b/docs/src/content/docs/en/cli_reference.md
@@ -1,17 +1,14 @@
---
-hide:
- - navigation
+title: "Service Startup Parameters"
+sidebar:
+ order: 100
---
-
-
-# Service Startup Parameters
-
xLLM uses gflags to manage service startup parameters. The specific parameter meanings are as follows:
## Common Parameters
| Parameter Name | Data Type | Default Value | Other Values | Description | Notes |
|:---------:|:---------:|:---------:|:---------:|:---------:|:---------:|
-| `master_node_addr` | `string` | "127.0.0.1:19888" | ip:port | The listening address of the master node's rpc server | [Details](./features/basics.md) |
+| `master_node_addr` | `string` | "127.0.0.1:19888" | ip:port | The listening address of the master node's rpc server | |
| `host` | `string` | "" | The machine IP where the current device is located | The host IP used by the current device for communication. An rpc server is started on each device for multi-device communication. | |
| `port` | `int32` | 8010 | Any available port | Used in conjunction with the `host` parameter. The combination is used for rpc communication between devices. | |
| `model` | `string` | "" | | Path to the model. | |
@@ -38,7 +35,6 @@ xLLM uses gflags to manage service startup parameters. The specific parameter me
| `ep_size` | `int32` | 1 | Power of 2 | The ep scale size for the MoE part. | |
| `expert_parallel_degree` | `int32` | 0 | 1,2 | Parameter related to ep parallelism. Defaults to 0 when ep is not used, and to 1 when ep is enabled. Can be set to 2 when `ep_size` equals the total number of devices (uses all2all communication). | |
-
## P-D Separation Related Parameters
| Parameter Name | Type | Default Value | Other Values | Description | Notes |
|:---------:|:---------:|:---------:|:---------:|:---------:|:---------:|
@@ -48,7 +44,6 @@ xLLM uses gflags to manage service startup parameters. The specific parameter me
| `kv_cache_transfer_mode` | `string` | "PUSH" | "PULL" | The mode for transferring KV Cache in P-D separation. PUSH mode: Prefill transmits layer by layer to Decode; PULL mode: Decode pulls the KV Cache from Prefill in one go. | |
| `transfer_listen_port` | `int32` | 26000 | Any available port | Configuration when P-D separation is enabled. Corresponds to the listening port for KV Cache Transfer on each card. | |
-
## MTP Related Parameters
| Parameter Name | Type | Default Value | Other Values | Description | Notes |
|:---------:|:---------:|:---------:|:---------:|:---------:|:---------:|
@@ -56,7 +51,6 @@ xLLM uses gflags to manage service startup parameters. The specific parameter me
| `draft_devices` | `string` | "npu:0" | Same format as `devices`, e.g. `npu:0` or `npu:0,npu:1` | Should be set consistently with the `devices` parameter. | |
| `num_speculative_tokens` | `int32` | 0 | Any integer, suggestion 1 or 2 | The number of tokens output by the MTP model per step. | |
-
## Graph Execution Related Parameters
| Parameter Name | Type | Default Value | Other Values | Description | Notes |
|:---------:|:---------:|:---------:|:---------:|:---------:|:---------:|
@@ -65,7 +59,6 @@ xLLM uses gflags to manage service startup parameters. The specific parameter me
| `enable_prefill_piecewise_graph` | `bool` | false | true | Whether to enable piecewise graph for prefill phase. Attention runs eagerly while other ops are captured into CUDA graphs. | |
| `max_tokens_for_graph_mode` | `int32` | 2048 | Any integer greater than or equal to 0 | Maximum number of tokens for graph execution. If 0, no limit is applied. | |
-
## Parameters for Use with xLLM-service
| Parameter Name | Type | Default Value | Other Values | Description | Notes |
|:---------:|:---------:|:---------:|:---------:|:---------:|:---------:|
diff --git a/docs/en/design/generative_recommendation_design.md b/docs/src/content/docs/en/design/generative_recommendation_design.md
similarity index 99%
rename from docs/en/design/generative_recommendation_design.md
rename to docs/src/content/docs/en/design/generative_recommendation_design.md
index f562e0a342..8b3a76f316 100644
--- a/docs/en/design/generative_recommendation_design.md
+++ b/docs/src/content/docs/en/design/generative_recommendation_design.md
@@ -1,5 +1,8 @@
-# Generative Recommendation Design Document
-
+---
+title: "Generative Recommendation Design Document"
+sidebar:
+ order: 2
+---
## Overview
xLLM provides generative recommendation inference through the `backend=rec` path. The goal is not to replace the existing recommendation system, but to reuse the LLM inference engine in the recommendation pipeline while keeping the original predictor-side sparse feature processing and online serving capabilities. In practice, the LLM body is executed by xLLM, while the traditional recommendation system continues to handle feature preparation and online integration.
@@ -734,7 +737,7 @@ Verification should not stop at “the document renders correctly”. It should
The most basic verification still matters:
- both the Chinese and English design documents render correctly;
-- all image references resolve to actual files under `docs/assets/`;
+- all image references resolve to actual files under `src/content/docs/assets/`;
- the English document points to English diagrams instead of Chinese-labeled figures;
- the entry pages and related feature pages can navigate to this design document.
diff --git a/docs/en/design/graph_mode_design.md b/docs/src/content/docs/en/design/graph_mode_design.md
similarity index 99%
rename from docs/en/design/graph_mode_design.md
rename to docs/src/content/docs/en/design/graph_mode_design.md
index 6dc92c302f..0f30e42249 100644
--- a/docs/en/design/graph_mode_design.md
+++ b/docs/src/content/docs/en/design/graph_mode_design.md
@@ -1,5 +1,8 @@
-# Graph Mode Design Document
-
+---
+title: "Graph Mode Design Document"
+sidebar:
+ order: 1
+---
## Overview
xLLM's Graph Mode supports multiple graph execution backends. Its goal is to turn the original Host-driven stream of fine-grained kernel launches into a capture-then-replay execution flow in inference serving, thereby reducing Host scheduling overhead, reducing device-side bubbles, and improving throughput and latency stability.
@@ -26,7 +29,7 @@ The non-goals of this document are:
Related design documents:
-- for a recommendation-oriented case study that focuses on fixed scheduling, multi-step execution, and custom operators, see: [Generative Recommendation Design Document](generative_recommendation_design.md)
+- for a recommendation-oriented case study that focuses on fixed scheduling, multi-step execution, and custom operators, see: [Generative Recommendation Design Document](./generative_recommendation_design.md)
## 1. Graph Mode Fundamentals
@@ -472,3 +475,4 @@ On 64-bit systems, virtual address space is usually much larger than single-devi
- [CudaGraph capture mechanism](https://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#cuda-graphs)
- [vLLM graph execution reference](https://github.com/vllm-project/vllm/blob/main/vllm/v1/worker/gpu/cudagraph_utils.py)
- [SGLang graph execution reference](https://github.com/sgl-project/sglang/blob/main/python/sglang/srt/model_executor/cuda_graph_runner.py)
+
diff --git a/docs/en/dev_guide/code_arch.md b/docs/src/content/docs/en/dev_guide/code_arch.md
similarity index 96%
rename from docs/en/dev_guide/code_arch.md
rename to docs/src/content/docs/en/dev_guide/code_arch.md
index da49f29fed..cb34c132ff 100644
--- a/docs/en/dev_guide/code_arch.md
+++ b/docs/src/content/docs/en/dev_guide/code_arch.md
@@ -1,5 +1,8 @@
-# Code Architecture
-
+---
+title: "Code Architecture"
+sidebar:
+ order: 1
+---
```
├── xllm/
| : main source folder
@@ -25,3 +28,4 @@
├── tools/ # code for npu time generations
└── xllm.cpp # entrypoint of xLLM
```
+
diff --git a/docs/en/dev_guide/tilelang_ascend_kernel_dev.md b/docs/src/content/docs/en/dev_guide/tilelang_ascend_kernel_dev.md
similarity index 99%
rename from docs/en/dev_guide/tilelang_ascend_kernel_dev.md
rename to docs/src/content/docs/en/dev_guide/tilelang_ascend_kernel_dev.md
index 95e6cdc780..4a07982dcf 100644
--- a/docs/en/dev_guide/tilelang_ascend_kernel_dev.md
+++ b/docs/src/content/docs/en/dev_guide/tilelang_ascend_kernel_dev.md
@@ -1,5 +1,8 @@
-# xLLM Ascend TileLang Kernel Development Guide
-
+---
+title: "xLLM Ascend TileLang Kernel Development Guide"
+sidebar:
+ order: 2
+---
This document explains how to add or modify an Ascend TileLang kernel in xLLM. The examples use the current `rope` kernel throughout.
Relevant directories:
@@ -145,7 +148,6 @@ The current minimal template in `rope.py` is:
```python
from ....common.spec import DispatchField, TilelangKernel, register_kernel
-
@register_kernel
class RopeKernel(TilelangKernel):
DISPATCH_SCHEMA = [
@@ -394,3 +396,4 @@ python setup.py test --test-name rope_wrapper_test --device a3
```
The first command generates `manifest.json`, `registry.inc`, and the object files. The second command validates the full integration path.
+
diff --git a/docs/en/features/async_schedule.md b/docs/src/content/docs/en/features/async_schedule.md
similarity index 97%
rename from docs/en/features/async_schedule.md
rename to docs/src/content/docs/en/features/async_schedule.md
index 96862398db..442bb6b37f 100644
--- a/docs/en/features/async_schedule.md
+++ b/docs/src/content/docs/en/features/async_schedule.md
@@ -1,16 +1,17 @@
-# Async schedule
-
+---
+title: "Async schedule"
+sidebar:
+ order: 10
+---
## Background
The inference process of large language models can be divided into three sequential stages:1) CPU-side scheduling (preparing model inputs), 2) Device computation (GPU/TPU execution), 3) CPU-side post-processing (output handling).
Due to the sequential nature of decoding operations, the input for step-i+1 depends on the output of step-i. This forces strict serial execution of all three stages, creating device idle periods (“bubbles”) during CPU-bound stages 1 and 3, leading to suboptimal resource utilization.
-
## Introduction
xLLM addresses this at the framework level by supporting asynchronous scheduling, where the CPU proactively executes scheduling operations for step-i+1 while the device is computing step-i. This allows the device to immediately begin computing step-i+1 upon completing step-i, thereby eliminating bubbles. Specifically, after initiating the computation call for step-i, the CPU does not wait for the device to finish computing. Instead, it constructs fake tokens for the step-i request, uses these fake tokens to perform scheduling operations for step-i+1 (such as allocating KV Cache), and replaces them with the true tokens computed in step-i when launching step-i+1 computation to ensure correctness. Meanwhile, the CPU processes the results of step-i in a separate thread and returns them to the client.
In the overall architecture, stages 1 and 3 on the CPU side are handled by different thread pools, and RPC function calls employ non-blocking C++ future and promise mechanisms to achieve a fully asynchronous runtime.

-
## Usage
xLLM provides the gflags parameter `enable_schedule_overlap`, which defaults to false. To enable this feature, set it to true in xLLM's service startup script:
@@ -23,7 +24,7 @@ xLLM provides the gflags parameter `enable_schedule_overlap`, which defaults to
- With asynchronous scheduling enabled, the device idle time between two steps is approximately 200us - comparable to a single kernel launch duration.
- On the DeepSeek-R1-Distill-Qwen-1.5B model with TPOT constrained to 50ms, this achieves 17% throughput improvement.
-
## Notice
The asynchronous scheduling feature requires the server to compute one additional step. For use cases involving limited output tokens (e.g., few-token generation) or single-output scenarios like embedding models, enabling this feature is not recommended as it may reduce server-side throughput, thus hard-disabled internally.
The VLM model is currently being adapted, will be temporarily disabled.
+
diff --git a/docs/en/features/chunked_scheduler.md b/docs/src/content/docs/en/features/chunked_scheduler.md
similarity index 87%
rename from docs/en/features/chunked_scheduler.md
rename to docs/src/content/docs/en/features/chunked_scheduler.md
index da2a41e322..d7222405cc 100644
--- a/docs/en/features/chunked_scheduler.md
+++ b/docs/src/content/docs/en/features/chunked_scheduler.md
@@ -1,5 +1,8 @@
-# ChunkedPrefill Scheduler
-
+---
+title: "ChunkedPrefill Scheduler"
+sidebar:
+ order: 21
+---
## Feature Introduction
xLLM supports the chunked prefill scheduling strategy. Chunked prefill is a technique that optimizes large language model inference by splitting long prompts into smaller chunks for batch processing, rather than processing the entire prompt at once.
This method can effectively reduce peak GPU memory usage, improve device utilization, and better schedule and mix processing with requests from the decode stage.
@@ -13,7 +16,5 @@ The aforementioned strategy has been implemented in xLLM and is exposed through
--max_tokens_per_chunk_for_prefill=20480 # optional
```
-
-
## Performance Impact
-After enabling chunked prefill, on the Qwen3-8B model with a TPOT constraint of 50ms, the TTFT latency **decreased by 46%**.
\ No newline at end of file
+After enabling chunked prefill, on the Qwen3-8B model with a TPOT constraint of 50ms, the TTFT latency **decreased by 46%**.
diff --git a/docs/en/features/disagg_pd.md b/docs/src/content/docs/en/features/disagg_pd.md
similarity index 95%
rename from docs/en/features/disagg_pd.md
rename to docs/src/content/docs/en/features/disagg_pd.md
index 730f419c89..0043ab6915 100644
--- a/docs/en/features/disagg_pd.md
+++ b/docs/src/content/docs/en/features/disagg_pd.md
@@ -1,4 +1,8 @@
-# Disaggregated PD
+---
+title: "Disaggregated PD"
+sidebar:
+ order: 30
+---
## Background
LLM online inference services typically need to meet two performance metrics: TTFT and TPOT. Traditional Contiguous Batching scheduling strategies mix Prefill and Decode requests during scheduling, causing Prefill and Decode phases to compete for computational resources. This prevents maximized utilization of computing resources and impacts performance metrics. To resolve this conflict, the Prefill and Decode phases are split to run on independent computational resources, enabling parallel execution. This simultaneously reduces TTFT and TPOT while improving throughput.
@@ -16,7 +20,7 @@ The overall architecture is shown below:
### Preparation
#### Install Dependencies
- **xLLM**: Refer to [Installation && Compilation](../getting_started/quick_start.md)
-- **xLLM Service**: Refer to [PD disaggregation](../getting_started/disagg_pd.md)
+- **xLLM Service**: Refer to [xLLM Service](https://github.com/jd-opensource/xllm-service)
#### Obtain Environment Information
Deploying Disaggregated PD Service requires obtaining the Device IP of the machine to create communication resources. Execute the command `cat /etc/hccn.conf | grep address` on the current AI Server to get the Device IP, for example:
diff --git a/docs/en/features/eplb.md b/docs/src/content/docs/en/features/eplb.md
similarity index 94%
rename from docs/en/features/eplb.md
rename to docs/src/content/docs/en/features/eplb.md
index 2628559b19..728a9fb20d 100644
--- a/docs/en/features/eplb.md
+++ b/docs/src/content/docs/en/features/eplb.md
@@ -1,5 +1,8 @@
-# MoE Load Balancing (EPLB)
-
+---
+title: "MoE Load Balancing (EPLB)"
+sidebar:
+ order: 71
+---
## Background
MoE models rely on dynamic token routing to distribute tokens among experts. However, in real-world deployments, uneven data distribution leads to expert load imbalance (some overloaded while others idle). Expert redundancy adjustment (e.g., adding/removing replicas) consumes additional GPU memory and may impact inference latency due to weight migration, posing significant implementation challenges. To address this, we employ an expert redundancy strategy (replicating hot experts) combined with hierarchical and global dynamic load balancing to achieve dynamic MoE load balancing.
@@ -27,4 +30,4 @@ Simply add the following gflag parameters when launching xLLM:
- The expert distribution update uses a layer-by-layer mechanism based on expert load. When the similarity between consecutive loads for a layer is below `eplb_update_threshold`, that layer is updated (default: 1, range: 0-1).
```bash
---enable_eplb=true --expert_parallel_degree=2 --ep_size=16 --eplb_update_interval=2000 --eplb_update_threshold=0.9
\ No newline at end of file
+--enable_eplb=true --expert_parallel_degree=2 --ep_size=16 --eplb_update_interval=2000 --eplb_update_threshold=0.9
diff --git a/docs/en/features/global_kvcache.md b/docs/src/content/docs/en/features/global_kvcache.md
similarity index 93%
rename from docs/en/features/global_kvcache.md
rename to docs/src/content/docs/en/features/global_kvcache.md
index 938b4bdff5..b3335f8bbb 100644
--- a/docs/en/features/global_kvcache.md
+++ b/docs/src/content/docs/en/features/global_kvcache.md
@@ -1,5 +1,8 @@
-# Global Multi-Level KV Cache
-
+---
+title: "Global Multi-Level KV Cache"
+sidebar:
+ order: 51
+---
## Background
In the decoding phase of large language models (LLMs), frequent access to historical KV cache due to autoregressive generation creates a bottleneck in memory bandwidth. As model sizes and context windows expand (e.g., 128K Tokens consuming over 40GB of memory), the pressure on single-device memory increases dramatically. Existing solutions (such as vLLM) exhibit significant limitations in long-context scenarios: prefill time surges, severe memory bandwidth contention during decoding, and the need for excessive resource reservation to meet SLO requirements (TTFT < 2s, TBT < 100ms). This often results in GPU utilization below 40% and difficulties in leveraging cross-server resources. To address this, we propose a distributed global multi-level KV cache management system, adopting a memory-compute integrated architecture to break through single-machine resource constraints.
@@ -18,7 +21,7 @@ The overall architecture is shown in the diagram below:
#### Install Dependencies
- **xLLM**: Refer to [Quick Start](../getting_started/quick_start.md)
-- **xLLM Service**: Refer to [PD disaggregation](../getting_started/disagg_pd.md)
+- **xLLM Service**: Refer to [xLLM Service](https://github.com/jd-opensource/xllm-service)
### Usage Instructions
@@ -39,4 +42,4 @@ The overall architecture is shown in the diagram below:
--enable_cache_upload=true
# PD separation currently does not support Global KVCache Management
--enable_disagg_pd=false
- ```
\ No newline at end of file
+ ```
diff --git a/docs/en/features/graph_mode.md b/docs/src/content/docs/en/features/graph_mode.md
similarity index 92%
rename from docs/en/features/graph_mode.md
rename to docs/src/content/docs/en/features/graph_mode.md
index f36491d33d..6a2dd272eb 100644
--- a/docs/en/features/graph_mode.md
+++ b/docs/src/content/docs/en/features/graph_mode.md
@@ -1,5 +1,8 @@
-# Graph Mode
-
+---
+title: "Graph Mode"
+sidebar:
+ order: 81
+---
## Overview
xLLM supports Graph Mode: computation graphs are pre-captured and replayed in subsequent runs to reduce CPU overhead and improve inference performance. Graph Mode has corresponding implementations on different hardware platforms.
@@ -71,9 +74,11 @@ The following table lists each model’s support on ACLGraph, CudaGraph, and MLU
| GLM4V | ✅ | | |
| GLM4V-MoE | ✅ | | |
-!!! warning "Adding Graph Mode support for new models"
- Ensure that the kernels used in the computation implement dynamic dimension parameterization; otherwise the graph may break and kernels may need to be re-implemented.
+:::caution[Adding Graph Mode support for new models]
+Ensure that the kernels used in the computation implement dynamic dimension parameterization; otherwise the graph may break and kernels may need to be re-implemented.
+:::
## Related Documentation
- For more detailed Graph Mode design and implementation notes, including ACL Graph / CUDA Graph fundamentals, dynamic dimension parameterization, Piecewise Graph, and multi-shape memory reuse, see: [Graph Mode Design Document](../design/graph_mode_design.md)
+
diff --git a/docs/en/features/moe_params.md b/docs/src/content/docs/en/features/moe_params.md
similarity index 97%
rename from docs/en/features/moe_params.md
rename to docs/src/content/docs/en/features/moe_params.md
index 3e86fd18e8..521a795ba0 100644
--- a/docs/en/features/moe_params.md
+++ b/docs/src/content/docs/en/features/moe_params.md
@@ -1,5 +1,8 @@
-# EP Parallelism
-
+---
+title: "EP Parallelism"
+sidebar:
+ order: 70
+---
## Background
When deploying the DeepSeek-R1 671B parameter-scale model, traditional distributed deployment faces core bottlenecks including low GPU memory utilization, high communication overhead, and expensive hardware costs. Therefore, Expert Parallelism (EP) is introduced.
@@ -22,3 +25,4 @@ Key advantages:
+ When ep_size equals the total number of devices, EP Level 2 can be enabled. Communication between Attention and MoE parts changes to ALL2ALL, sending data only to required devices to reduce communication volume and overhead. Example for 64 devices:

+
diff --git a/docs/en/features/mtp.md b/docs/src/content/docs/en/features/mtp.md
similarity index 88%
rename from docs/en/features/mtp.md
rename to docs/src/content/docs/en/features/mtp.md
index 45bbaf9a83..5ab859c088 100644
--- a/docs/en/features/mtp.md
+++ b/docs/src/content/docs/en/features/mtp.md
@@ -1,5 +1,8 @@
-# MTP Speculative Inference
-
+---
+title: "MTP Speculative Inference"
+sidebar:
+ order: 80
+---
## Background
MTP (Multi-Token Prediction) is an innovative inference acceleration technique that addresses efficiency bottlenecks in large language model generation. By incorporating specialized pre-training designs, MTP provides efficient draft token prediction capabilities during inference, significantly improving generation speed. Its core value lies in balancing inference efficiency with output quality, offering an optimal solution for long-sequence generation problems in LLMs, ultimately optimizing inference performance.
@@ -18,17 +21,18 @@ MTP offers the following core acceleration capabilities:
MTP technology provides a novel efficiency optimization solution for LLM inference, particularly well-suited for real-time applications requiring rapid responses, representing an important direction in language model inference optimization.
-!!! note "Model Support"
- Currently supports MTP structure export for the following models:
- - DeepSeek-V3 (input model_type: deepseek_v3, exported MTP model_type: deepseek_v3_mtp)
- - DeepSeek-V3.2 (input model_type: deepseek_v3, exported MTP model_type: deepseek_v32_mtp)
- - DeepSeek-R1 (input model_type: deepseek_v3, exported MTP model_type: deepseek_v3_mtp)
- - GLM4 MoE (e.g., GLM-4.5-Air, exported MTP model_type: glm4_moe_mtp)
-
- Note:
- - DeepSeek V3 and R1 both have input model_type "deepseek_v3", and the exported MTP model will have model_type "deepseek_v3_mtp"
- - DeepSeek V3.2 has input model_type "deepseek_v3" (but can be auto-detected by index_head_dim fields), and the exported MTP model will have model_type "deepseek_v32_mtp"
+:::note[Model Support]
+Currently supports MTP structure export for the following models:
+- DeepSeek-V3 (input model_type: deepseek_v3, exported MTP model_type: deepseek_v3_mtp)
+- DeepSeek-V3.2 (input model_type: deepseek_v3, exported MTP model_type: deepseek_v32_mtp)
+- DeepSeek-R1 (input model_type: deepseek_v3, exported MTP model_type: deepseek_v3_mtp)
+- GLM4 MoE (e.g., GLM-4.5-Air, exported MTP model_type: glm4_moe_mtp)
+
+Note:
+- DeepSeek V3 and R1 both have input model_type "deepseek_v3", and the exported MTP model will have model_type "deepseek_v3_mtp"
+- DeepSeek V3.2 has input model_type "deepseek_v3" (but can be auto-detected by index_head_dim fields), and the exported MTP model will have model_type "deepseek_v32_mtp"
+:::
## Usage Example
### Export Model
@@ -126,7 +130,7 @@ DRAFT_MODEL_PATH="/models/GLM-4.5-Air-mtp"
# ... same other configurations
```
-# Performance Data
+## Performance Data
Based on ShareGPT dataset with input length=2500, output length=1500, total requests=80.
| method | Concurrency | Mean TPOT(ms) | Mean TTFT(ms) | Output Tokens/s | Total Tokens/s |
@@ -147,3 +151,4 @@ Based on ShareGPT dataset with input length=2500, output length=1500, total requ
| mtp | 40 | 105.70 | 544.54 | 252.91 | 686.74 |
| baseline | 80 | 180.89 | 2996.21 | 192.09 | 522.06 |
| mtp | 80 | 152.19 | 2163.72 | 278.07 | 755.12 |
+
diff --git a/docs/en/features/multi_streams.md b/docs/src/content/docs/en/features/multi_streams.md
similarity index 93%
rename from docs/en/features/multi_streams.md
rename to docs/src/content/docs/en/features/multi_streams.md
index 08e90e89b6..c1d3c61422 100644
--- a/docs/en/features/multi_streams.md
+++ b/docs/src/content/docs/en/features/multi_streams.md
@@ -1,16 +1,17 @@
-# Multi-stream parallel
-
+---
+title: "Multi-stream parallel"
+sidebar:
+ order: 11
+---
## Background
In distributed inference scenarios for large-scale models, additional communication operations are required to aggregate computation results from different devices. Taking large-scale MoE models like Deepseek as an example, the distributed scale is typically substantial, leading to increased communication overhead.
If both computation and communication are performed on the same stream, the device’s computing resources will remain idle while waiting for communication to complete, resulting in wasted computational capacity before subsequent calculations can begin.
-
## Introduction
xLLM implements multi-stream parallelism at the model layer, where the input batch is split into 2 micro-batches. One stream handles computation for the first micro-batch, another concurrently executes communication for the second micro-batch.
This overlap of computation and communication effectively hides the communication latency.
-
## Usage
xLLM provides the gflags parameter `enable_multi_stream_parallel`, which defaults to false. To enable this feature, set it to true in xLLM’s service startup script, as:
@@ -18,14 +19,12 @@ xLLM provides the gflags parameter `enable_multi_stream_parallel`, which default
--enable_multi_stream_parallel=true
```
-
## Performance
With prefill dual-stream parallelism enabled, it can effectively mask over 75% of communication overhead.
On the DeepSeek-R1 model, when generating just 1 token, this achieves:
- **7%** reduction in TTFT.
- **7%** throughput improvement.
-
## Notice
The dual-stream parallelism currently only supports the prefill phase, with greater performance benefits observed for longer input requests.
-Only Support DeepSeek, Qwen3 dense(non-MoE) models.
\ No newline at end of file
+Only Support DeepSeek, Qwen3 dense(non-MoE) models.
diff --git a/docs/src/content/docs/en/features/multimodal.md b/docs/src/content/docs/en/features/multimodal.md
new file mode 100644
index 0000000000..4bcc591f65
--- /dev/null
+++ b/docs/src/content/docs/en/features/multimodal.md
@@ -0,0 +1,23 @@
+---
+title: "Multimodal Support"
+sidebar:
+ order: 60
+---
+This document introduces the current multimodal support in the xLLM inference engine, including supported models, modality types, and offline and online interfaces.
+
+## Supported Models
+- Qwen2.5-VL: including 7B/32B/72B.
+- Qwen3-VL: including 2B/4B/8B/32B.
+- Qwen3-VL-MoE: including A3B/A22B.
+- MiniCPM-V-2_6: 7B.
+
+## Modality Types
+- Images: supports single-image and multi-image inputs, image + prompt combinations, and text-only prompts.
+
+:::caution[Notes]
+- The multimodal backend does not currently support prefix cache or chunked prefill. Support is in progress.
+- xLLM now renders ChatTemplate uniformly based on JinJa. When deploying MiniCPM-V-2_6, the model directory must provide a ChatTemplate file.
+- Image inputs support Base64 data and image URLs.
+- Multimodal models currently mainly support the image modality. Video, audio, and other modalities are in progress.
+
+:::
diff --git a/docs/en/features/prefix_cache.md b/docs/src/content/docs/en/features/prefix_cache.md
similarity index 87%
rename from docs/en/features/prefix_cache.md
rename to docs/src/content/docs/en/features/prefix_cache.md
index 802430c64c..9038e52d40 100644
--- a/docs/en/features/prefix_cache.md
+++ b/docs/src/content/docs/en/features/prefix_cache.md
@@ -1,5 +1,8 @@
-# Prefix Cache Optimization
-
+---
+title: "Prefix Cache Optimization"
+sidebar:
+ order: 50
+---
## Feature Introduction
xLLM supports prefix cache matching. The prefix cache is based on `murmur_hash` and uses an LRU eviction policy, delivering superior matching efficiency and increased prefix cache hit rates.
Additionally, the prefix cache has been optimized to support the `continuous_scheduler`, `chunked_scheduler`, and `zero_evict_scheduler`. The cache is updated immediately after prefill operations, enhancing matching timeliness. For the `chunked_scheduler`, multi-stage chunked prefill matching is supported, reducing computational overhead and minimizing KV cache usage as much as possible.
@@ -15,5 +18,6 @@ The prefix cache is implemented in xLLM and exposed through gflags parameters to
## Performance Impact
After enabling prefix cache, on the Qwen3-8B model with a TPOT constraint of 50ms, the E2E latency **decreased by 10%**.
-!!! warning "Note"
- PD separation scheduler is not currently supported.
\ No newline at end of file
+:::caution[Note]
+PD separation scheduler is not currently supported.
+:::
diff --git a/docs/en/features/xllm_service_overview.md b/docs/src/content/docs/en/features/xllm_service_overview.md
similarity index 97%
rename from docs/en/features/xllm_service_overview.md
rename to docs/src/content/docs/en/features/xllm_service_overview.md
index b66dadacd1..ce95402cf8 100644
--- a/docs/en/features/xllm_service_overview.md
+++ b/docs/src/content/docs/en/features/xllm_service_overview.md
@@ -1,10 +1,10 @@
-
-
-# xLLM Service
-
+---
+title: "xLLM Service"
+sidebar:
+ order: 90
+---
[:simple-github: xLLM Service](https://github.com/jd-opensource/xllm-service)
-
## Project Overview
**xLLM-service** is a service-layer framework developed based on the **xLLM** inference engine, providing efficient, fault-tolerant, and flexible LLM inference services for clustered deployment.
@@ -51,4 +51,4 @@ It focuses on the full-lifecycle management of instances. All xllm instances mus
As the metrics and event hub, it receives Metrics data reported by various instances, uniformly collects and organizes statistical indicators, and provides data support for decisions such as service scheduling, fault tolerance, and scaling.
### Planner
-It undertakes the functions of strategy analysis and decision-making. Based on the Metrics data reported by the Event Plane (including instance runtime indicators, machine load indicators, etc.), it analyzes the service scaling needs and the necessity of expanding hot instances, and outputs resource adjustment and instance optimization strategies.
\ No newline at end of file
+It undertakes the functions of strategy analysis and decision-making. Based on the Metrics data reported by the Event Plane (including instance runtime indicators, machine load indicators, etc.), it analyzes the service scaling needs and the necessity of expanding hot instances, and outputs resource adjustment and instance optimization strategies.
diff --git a/docs/en/features/zero_evict_scheduler.md b/docs/src/content/docs/en/features/zero_evict_scheduler.md
similarity index 87%
rename from docs/en/features/zero_evict_scheduler.md
rename to docs/src/content/docs/en/features/zero_evict_scheduler.md
index fc3d16c7b8..90ccf30311 100644
--- a/docs/en/features/zero_evict_scheduler.md
+++ b/docs/src/content/docs/en/features/zero_evict_scheduler.md
@@ -1,5 +1,8 @@
-# Zero Evict Scheduler
-
+---
+title: "Zero Evict Scheduler"
+sidebar:
+ order: 22
+---
## Feature Introduction
xLLM supports the zero evict scheduling strategy. The zero evict scheduling strategy is an algorithm designed to minimize request eviction rates, reducing the need for prefill computation on evicted requests and consequently improving TPOT (Time Per Output Token).
This scheduling algorithm employs simulation rounds to detect whether a request can be scheduled without causing the eviction of other requests.
@@ -14,4 +17,4 @@ The aforementioned strategy has been implemented in xLLM and is exposed through
```
## Performance Impact
-After enabling zero evict, on the Qwen3-8B model with an E2E latency constraint, the TPOT latency **decreased by 27%**.
\ No newline at end of file
+After enabling zero evict, on the Qwen3-8B model with an E2E latency constraint, the TPOT latency **decreased by 27%**.
diff --git a/docs/en/getting_started/launch_xllm.md b/docs/src/content/docs/en/getting_started/launch_xllm.md
similarity index 98%
rename from docs/en/getting_started/launch_xllm.md
rename to docs/src/content/docs/en/getting_started/launch_xllm.md
index d1e80d1aed..720cc79b38 100644
--- a/docs/en/getting_started/launch_xllm.md
+++ b/docs/src/content/docs/en/getting_started/launch_xllm.md
@@ -1,5 +1,8 @@
-# Launch xllm
-
+---
+title: "Launch xllm"
+sidebar:
+ order: 3
+---
Taking Qwen3 as an example, the script for launching xllm is as follows. The provided script is suitable for both single-node single-device and single-node multi-device scenarios. When using multiple devices on a single node, you need to modify `NNODES` (one device represents one node), as well as environment variables such as `ASCEND_RT_VISIBLE_DEVICES`, `CUDA_VISIBLE_DEVICES`, or `MLU_VISIBLE_DEVICES`.
## NPU
@@ -15,7 +18,6 @@ source /usr/local/Ascend/nnal/atb/set_env.sh
export ASCEND_RT_VISIBLE_DEVICES=0
export HCCL_IF_BASE_PORT=43432 # HCCL communication base port
-
MODEL_PATH="/path/to/model/Qwen3-8B" # Model path
MASTER_NODE_ADDR="127.0.0.1:9748" # Master node address (must be globally consistent)
START_PORT=18000 # Service starting port
@@ -88,7 +90,6 @@ do
done
```
-
## MLU
```bash
@@ -123,3 +124,4 @@ do
--node_rank=$i \ > $LOG_FILE 2>&1 &
done
```
+
diff --git a/docs/en/getting_started/multi_machine.md b/docs/src/content/docs/en/getting_started/multi_machine.md
similarity index 98%
rename from docs/en/getting_started/multi_machine.md
rename to docs/src/content/docs/en/getting_started/multi_machine.md
index 448f8e3b68..199742acef 100644
--- a/docs/en/getting_started/multi_machine.md
+++ b/docs/src/content/docs/en/getting_started/multi_machine.md
@@ -1,4 +1,8 @@
-# Multi-Node Deployment
+---
+title: "Multi-Node Deployment"
+sidebar:
+ order: 5
+---
This example demonstrates how to launch a 32-GPU (NPU) deployment across 2 machines.
Launching Services on the First Machine:
```shell
@@ -16,7 +20,6 @@ source /usr/local/Ascend/ascend-toolkit/set_env.sh
source /usr/local/Ascend/nnal/atb/set_env.sh
export HCCL_IF_BASE_PORT=43432 # HCCL communication base port
-
# 4. Start distributed service
MODEL_PATH="/path/to/your/DeepSeek-R1" # Model path
MASTER_NODE_ADDR="123.123.123.123:9748" # Master node address (must be globally consistent)
@@ -107,3 +110,4 @@ done
```
This example uses 2 machines. You can set the total number of GPUs/NPUs via `--nnodes`, where `--node_rank` specifies the global rank ID for each node.
The `--rank_tablefile=./ranktable_2s_32p.json`parameter points to the configuration file required for establishing the NPU communication domain. For instructions on generating this file, refer to [Ranktable Generation](https://gitee.com/mindspore/models/blob/master/utils/hccl_tools/README.md).
+
diff --git a/docs/en/getting_started/offline_service.md b/docs/src/content/docs/en/getting_started/offline_service.md
similarity index 85%
rename from docs/en/getting_started/offline_service.md
rename to docs/src/content/docs/en/getting_started/offline_service.md
index 5ccd51e565..90473fcacc 100644
--- a/docs/en/getting_started/offline_service.md
+++ b/docs/src/content/docs/en/getting_started/offline_service.md
@@ -1,5 +1,8 @@
-# Offline Inference
-
+---
+title: "Offline Inference"
+sidebar:
+ order: 7
+---
To facilitate users in quickly using xLLM for offline inference, we provide Python script examples for launching offline inference.
## LLM
@@ -12,4 +15,4 @@ Generate embedding example: [:simple-github: https://github.com/jd-opensource/xl
## VLM
-VLM inference example: [:simple-github: https://github.com/jd-opensource/xllm/blob/main/examples/generate_vlm.py](https://github.com/jd-opensource/xllm/blob/main/examples/generate_vlm.py)
\ No newline at end of file
+VLM inference example: [:simple-github: https://github.com/jd-opensource/xllm/blob/main/examples/generate_vlm.py](https://github.com/jd-opensource/xllm/blob/main/examples/generate_vlm.py)
diff --git a/docs/en/getting_started/online_service.md b/docs/src/content/docs/en/getting_started/online_service.md
similarity index 96%
rename from docs/en/getting_started/online_service.md
rename to docs/src/content/docs/en/getting_started/online_service.md
index e7aa397fda..4e4f1b85c1 100644
--- a/docs/en/getting_started/online_service.md
+++ b/docs/src/content/docs/en/getting_started/online_service.md
@@ -1,6 +1,9 @@
-# Online Service
-
-First, start the xllm service according to the [xllm launch documentation](launch_xllm.md). Below are examples of client calls for LLM and VLM. Please modify the parameters according to your actual situation.
+---
+title: "Online Service"
+sidebar:
+ order: 6
+---
+First, start the xllm service according to the [xllm launch documentation](./launch_xllm.md). Below are examples of client calls for LLM and VLM. Please modify the parameters according to your actual situation.
## LLM Client Calls
### HTTP Call
@@ -135,7 +138,6 @@ else:
print(ans[0]['message'])
```
-
## VLM Client Calls
### HTTP API
@@ -179,7 +181,6 @@ response = requests.post(
print(response.json())
```
-
### OpenAI API
```python
from openai import OpenAI
@@ -223,3 +224,4 @@ chat_completion = client.chat.completions.create(
result = chat_completion.choices[0].message.content
print("Chat completion output:", result)
```
+
diff --git a/docs/en/getting_started/quick_start.md b/docs/src/content/docs/en/getting_started/quick_start.md
similarity index 87%
rename from docs/en/getting_started/quick_start.md
rename to docs/src/content/docs/en/getting_started/quick_start.md
index 98ca14d663..510a16545a 100644
--- a/docs/en/getting_started/quick_start.md
+++ b/docs/src/content/docs/en/getting_started/quick_start.md
@@ -1,5 +1,8 @@
-# Quick Start
-
+---
+title: "Quick Start"
+sidebar:
+ order: 1
+---
## Environment Setup
All images are stored [here](https://quay.io/repository/jd_xllm/xllm-ai?tab=tags). The docker startup command below uses the dev image as an example.
@@ -44,7 +47,7 @@ docker run -it \
### NVIDIA GPU
-We provide a [Dockerfile](../../../docker/Dockerfile.cuda) for NVIDIA GPU usage, which can be used to build custom image. Of course, you can also use dev image we built based on the default Dockerfile:
+We provide a [Dockerfile](https://github.com/jd-opensource/xllm/blob/main/docker/Dockerfile.cuda) for NVIDIA GPU usage, which can be used to build custom image. Of course, you can also use dev image we built based on the default Dockerfile:
```bash
docker pull quay.io/jd_xllm/xllm-ai:xllm-dev-cuda-x86
```
@@ -103,5 +106,6 @@ python setup.py build
```
## Launch xllm
-Please refer to [How to Launch xllm](launch_xllm.md).
+Please refer to [How to Launch xllm](./launch_xllm.md).
+
diff --git a/docs/en/index.md b/docs/src/content/docs/en/index.md
similarity index 93%
rename from docs/en/index.md
rename to docs/src/content/docs/en/index.md
index a291bb65c3..08221a0e52 100644
--- a/docs/en/index.md
+++ b/docs/src/content/docs/en/index.md
@@ -1,28 +1,17 @@
---
-hide:
- - navigation
+title: "xLLM"
+description: "xLLM documentation home"
---
-
-
-
-
-
-
+
## Project Overview
**xLLM** is an efficient and user-friendly LLM intelligent inference framework that provides enterprise-level service guarantees and high-performance engine computing capabilities for model inference on domestic AI accelerators.
-
#### Background
LLM with parameter scales ranging from tens of billions to trillions are being rapidly deployed in core business scenarios such as intelligent customer service, real-time recommendation, and content generation. Efficient support for domestic computing hardware has become a core requirement for low-cost inference deployment. Existing inference engines struggle to effectively adapt to the architectural characteristics of dedicated accelerators like domestic chips. Performance issues such as low utilization of computing units, load imbalance and communication overhead bottlenecks under the MoE architecture, and difficulties in kv cache management have restricted the efficient inference of requests and the scalability of the system. The xLLM inference engine improves the resource efficiency of the entire "communication-computation-storage" performance link and it provides crucial technical support for the large-scale implementation of LLM in real-world business scenarios.
-
## Core Features
**xLLM** delivers robust intelligent computing capabilities. By leveraging hardware system optimization and algorithm-driven decision control, it jointly accelerates the inference process, enabling high-throughput, low-latency distributed inference services.
@@ -55,3 +44,4 @@ LLM with parameter scales ranging from tens of billions to trillions are being r
**Algorithm-driven Acceleration**
- Speculative decoding optimization to improve efficiency through multi-core parallelism.
- Dynamic load balancing of MoE experts to achieve efficient adjustment of expert distribution.
+
diff --git a/docs/src/content/docs/en/popular_model_usage/quick_start_GLM5.md b/docs/src/content/docs/en/popular_model_usage/quick_start_GLM5.md
new file mode 100644
index 0000000000..fc770b5106
--- /dev/null
+++ b/docs/src/content/docs/en/popular_model_usage/quick_start_GLM5.md
@@ -0,0 +1,586 @@
+---
+title: "GLM5-W8A8"
+sidebar:
+ order: 2
+---
++ Source code: https://github.com/jd-opensource/xllm
+
++ Available in China: https://gitcode.com/xLLM-AI/xllm
+
++ Weight download: [modelscope-GLM-5-W8A8](https://www.modelscope.cn/models/Eco-Tech/GLM-5-W8A8-xLLM/files)
+
+## 1. Pull the Image Environment
+
+First, download the image provided by xLLM:
+
+```bash
+# A2 x86
+docker pull quay.io/jd_xllm/xllm-ai:xllm-dev-a2-x86-20260306
+# A2 arm
+docker pull quay.io/jd_xllm/xllm-ai:xllm-dev-a2-arm-20260306
+# A3 arm
+docker pull quay.io/jd_xllm/xllm-ai:xllm-dev-a3-arm-20260306
+```
+
+**Note**: Performance stress testing has not been performed on A2 machines.
+
+Then create the corresponding container:
+
+```bash
+sudo docker run -it --ipc=host -u 0 --privileged --name mydocker --network=host \
+ -v /var/queue_schedule:/var/queue_schedule \
+ -v /usr/local/Ascend/driver:/usr/local/Ascend/driver \
+ -v /usr/local/Ascend/add-ons/:/usr/local/Ascend/add-ons/ \
+ -v /usr/local/sbin/npu-smi:/usr/local/sbin/npu-smi \
+ -v /var/log/npu/conf/slog/slog.conf:/var/log/npu/conf/slog/slog.conf \
+ -v /var/log/npu/slog/:/var/log/npu/slog \
+ -v ~/.ssh:/root/.ssh \
+ -v /var/log/npu/profiling/:/var/log/npu/profiling \
+ -v /var/log/npu/dump/:/var/log/npu/dump \
+ -v /runtime/:/runtime/ -v /etc/hccn.conf:/etc/hccn.conf \
+ -v /export/home:/export/home \
+ -v /home/:/home/ \
+ -w /export/home \
+ quay.io/jd_xllm/xllm-ai:xllm-dev-hb-rc2-x86
+```
+
+## 2. Pull the Source Code and Build
+
+Download the official repository and module dependencies:
+
+```bash
+git clone https://github.com/jd-opensource/xllm
+cd xllm
+git checkout preview/glm-5
+git submodule init
+git submodule update
+```
+
+Download and install dependencies:
+
+```bash
+pip install --upgrade pre-commit
+yum install numactl
+```
+
+Run the build. The executable `build/xllm/core/server/xllm` will be generated under `build/`:
+
+```bash
+python setup.py build
+```
+
+## 3. Start the Model
+
+### If the service is being started for the first time after the machine has rebooted, run the following script first to initialize the devices
+
+If this is skipped and the NPU has not been initialized, the xLLM process may fail to start.
+
+```bash
+python -c "import torch_npu
+for i in range(16):torch_npu.npu.set_device(i)"
+```
+
+### Environment Variables
+
+```bash
+##### 1. Configure dependency path environment variables
+# export PYTHON_INCLUDE_PATH="$(python3 -c 'from sysconfig import get_paths; print(get_paths()["include"])')"
+# export PYTHON_LIB_PATH="$(python3 -c 'from sysconfig import get_paths; print(get_paths()["include"])')"
+# export PYTORCH_NPU_INSTALL_PATH=/usr/local/libtorch_npu/
+# export PYTORCH_INSTALL_PATH="$(python3 -c 'import torch, os; print(os.path.dirname(os.path.abspath(torch.__file__)))')"
+# export LIBTORCH_ROOT="$(python3 -c 'import torch, os; print(os.path.dirname(os.path.abspath(torch.__file__)))')"
+
+# export LD_LIBRARY_PATH=/usr/local/Ascend/ascend-toolkit/latest/opp/vendors/xllm/op_api/lib/:$LD_LIBRARY_PATH
+# export LD_LIBRARY_PATH=/usr/local/libtorch_npu/lib:$LD_LIBRARY_PATH
+export LD_PRELOAD=/usr/lib64/libjemalloc.so.2:$LD_PRELOAD
+
+# source /usr/local/Ascend/ascend-toolkit/set_env.sh
+# source /usr/local/Ascend/nnal/atb/set_env.sh
+
+##### 2. Configure log-related environment variables
+rm -rf /root/ascend/log/
+rm -rf core.*
+
+##### 3. Configure performance and communication-related environment variables
+export PYTORCH_NPU_ALLOC_CONF=expandable_segments:True
+export NPU_MEMORY_FRACTION=0.96
+export ATB_WORKSPACE_MEM_ALLOC_ALG_TYPE=3
+export ATB_WORKSPACE_MEM_ALLOC_GLOBAL=1
+
+export OMP_NUM_THREADS=12
+export ALLOW_INTERNAL_FORMAT=1
+
+export ATB_LAYER_INTERNAL_TENSOR_REUSE=1
+export ATB_LLM_ENABLE_AUTO_TRANSPOSE=0
+export ATB_CONVERT_NCHW_TO_AND=1
+export ATB_LAUNCH_KERNEL_WITH_TILING=1
+export ATB_OPERATION_EXECUTE_ASYNC=2
+export ATB_CONTEXT_WORKSPACE_SIZE=0
+export INF_NAN_MODE_ENABLE=1
+export HCCL_EXEC_TIMEOUT=300
+export HCCL_CONNECT_TIMEOUT=300
+export HCCL_OP_EXPANSION_MODE="AIV"
+export HCCL_IF_BASE_PORT=2864
+```
+
+## Startup Command - GLM-5 (W8A8 weights can be started on a single machine)
+
+```bash
+BATCH_SIZE=256
+# Maximum inference batch size
+XLLM_PATH="./myxllm/xllm/build/xllm/core/server/xllm"
+# Inference entry binary path, which is the build artifact from the previous step
+MODEL_PATH=/path/to/GLM-5-W8A8/
+# Model path, here using the int8-quantized GLM-5
+DRAFT_MODEL_PATH=/path/to/GLM-5-W8A8/GLM-5-W8A8-MTP/
+# Exported MTP weights for GLM-5
+
+MASTER_NODE_ADDR="11.87.49.110:10015"
+LOCAL_HOST="11.87.49.110"
+# Service port
+START_PORT=18994
+START_DEVICE=0
+LOG_DIR="logs"
+NNODES=16
+
+for (( i=0; i<$NNODES; i++ ))
+do
+ PORT=$((START_PORT + i))
+ DEVICE=$((START_DEVICE + i))
+ LOG_FILE="$LOG_DIR/node_$i.log"
+ nohup numactl -C $((DEVICE*40))-$((DEVICE*40+39)) $XLLM_PATH \
+ --model $MODEL_PATH \
+ --port $PORT \
+ --devices="npu:$DEVICE" \
+ --master_node_addr=$MASTER_NODE_ADDR \
+ --nnodes=$NNODES \
+ --node_rank=$i \
+ --max_memory_utilization=0.85 \
+ --max_tokens_per_batch=8192 \
+ --max_seqs_per_batch=32 \
+ --block_size=128 \
+ --enable_prefix_cache=false \
+ --enable_chunked_prefill=true \
+ --communication_backend="hccl" \
+ --enable_schedule_overlap=true \
+ --enable_graph=true \
+ --enable_graph_mode_decode_no_padding=true \
+ --draft_model=$DRAFT_MODEL_PATH \
+ --draft_devices="npu:$DEVICE" \
+ --num_speculative_tokens=1 \
+ --ep_size=8 \
+ --dp_size=1 \
+ > $LOG_FILE 2>&1 &
+done
+
+# numactl -C xxxxx Bind cores by affinity. NUMA affinity query command: npu-smi info -t topo.
+# --max_memory_utilization Maximum single-card memory usage ratio.
+# --max_tokens_per_batch Maximum token count per batch. Mainly limits prefill.
+# --max_seqs_per_batch Maximum request count per batch. Mainly limits decode.
+# --communication_backend Communication backend. Options: hccl / lccl. hccl is recommended here.
+# --enable_schedule_overlap Enable async scheduling.
+# --enable_prefix_cache Enable prefix cache.
+# --enable_chunked_prefill Enable chunked prefill.
+# --enable_graph Enable aclgraph.
+# --draft_model MTP weight path.
+# --draft_devices MTP inference device, the same as the main model.
+# --num_speculative_tokens Number of tokens predicted by MTP.
+```
+
+When the log contains `"Brpc Server Started"`, the service has started successfully.
+
+## Other Optional Environment Variables
+
+```bash
+# Enable deterministic computation
+export LCCL_DETERMINISTIC=1
+export HCCL_DETERMINISTIC=true
+export ATB_MATMUL_SHUFFLE_K_ENABLE=0
+
+# Enable dynamic profiling mode
+# export PROFILING_MODE=dynamic
+# \rm -rf ~/dynamic_profiling_socket_*
+```
+
+## Startup Command - Two-Machine Startup Example
+
+### Node0 (master)
+
+```bash
+MASTER_NODE_ADDR="11.87.49.110:19990"
+LOCAL_HOST="11.87.49.110"
+START_PORT=15890
+START_DEVICE=0
+LOG_DIR="logs"
+NNODES=32
+LOCAL_NODES=16
+export HCCL_IF_BASE_PORT=48439
+unset HCCL_OP_EXPANSION_MODE
+
+for (( i=0; i<$LOCAL_NODES; i++ ))do
+ PORT=$((START_PORT + i))
+ DEVICE=$((START_DEVICE + i)); LOG_FILE="$LOG_DIR/node_$i.log"
+ nohup numactl -C $((DEVICE*40))-$((DEVICE*40+39)) $XLLM_PATH \ --model $MODEL_PATH \
+ --host $LOCAL_HOST \
+ --port $PORT \
+ --devices="npu:$DEVICE" \
+ --master_node_addr=$MASTER_NODE_ADDR \
+ --nnodes=$NNODES \
+ --node_rank=$i \
+ --max_memory_utilization=0.85 \
+ --max_tokens_per_batch=8192 \
+ --max_seqs_per_batch=4 \
+ --block_size=128 \
+ --enable_prefix_cache=false \
+ --enable_chunked_prefill=true \
+ --communication_backend="hccl" \
+ --enable_schedule_overlap=true \
+ --enable_graph=true \
+ --enable_graph_mode_decode_no_padding=true \
+ --ep_size=16 \
+ --dp_size=1 \
+ --rank_tablefile=/yourPath/ranktable.json \
+ > $LOG_FILE 2>&1 &
+done
+```
+
+#### Node1 (worker)
+
+```bash
+MASTER_NODE_ADDR="11.87.49.110:19990"
+LOCAL_HOST="11.87.49.111"
+START_PORT=15890
+START_DEVICE=0
+LOG_DIR="logs"
+NNODES=32
+LOCAL_NODES=16
+export HCCL_IF_BASE_PORT=48439
+unset HCCL_OP_EXPANSION_MODE
+
+for (( i=0; i<$LOCAL_NODES; i++ ))do
+ PORT=$((START_PORT + i))
+ DEVICE=$((START_DEVICE + i)); LOG_FILE="$LOG_DIR/node_$i.log"
+ nohup numactl -C $((DEVICE*40))-$((DEVICE*40+39)) $XLLM_PATH \ --model $MODEL_PATH \
+ --host $LOCAL_HOST \
+ --port $PORT \
+ --devices="npu:$DEVICE" \
+ --master_node_addr=$MASTER_NODE_ADDR \
+ --nnodes=$NNODES \
+ --node_rank=$((i + LOCAL_NODES)) \
+ --max_memory_utilization=0.85 \
+ --max_tokens_per_batch=8192 \
+ --max_seqs_per_batch=4 \
+ --block_size=128 \
+ --enable_prefix_cache=false \
+ --enable_chunked_prefill=true \
+ --communication_backend="hccl" \
+ --enable_schedule_overlap=true \
+ --enable_graph=true \
+ --enable_graph_mode_decode_no_padding=true \
+ --ep_size=16 \
+ --dp_size=1 \
+ --rank_tablefile=/yourPath/ranktable.json \
+ > $LOG_FILE 2>&1 &
+done
+```
+
+#### ranktable Example
+
+ranktable configuration guide: https://www.hiascend.com/document/detail/zh/canncommercial/83RC1/hccl/hcclug/hcclug_000014.html
+
+```json
+{
+ "version": "1.0",
+ "server_count": "2",
+ "server_list": [
+ {
+ "server_id": "11.87.49.110",
+ "device": [
+ {
+ "device_id": "0",
+ "device_ip": "11.86.23.210",
+ "rank_id": "0"
+ },
+ ...
+ {
+ "device_id": "7",
+ "device_ip": "11.86.23.217",
+ "rank_id": "7"
+ }
+ ],
+ "host_nic_ip": "reserve"
+ },
+ {
+ "server_id": "11.87.49.111",
+ "device": [
+ {
+ "device_id": "0",
+ "device_ip": "11.87.63.202",
+ "rank_id": "8"
+ },
+ ...
+ {
+ "device_id": "7",
+ "device_ip": "11.87.63.209",
+ "rank_id": "15"
+ }
+ ],
+ "host_nic_ip": "reserve"
+ }
+ ],
+ "status": "completed"
+}
+```
+
+## View Device NUMA Affinity
+
+Command:
+
+```bash
+npu-smi info -t topo
+```
+
+In the preceding commands:
+
+```bash
+numactl -C $((DEVICE*12))-$((DEVICE*12+11))
+```
+
+indicates that the process is bound to the corresponding affinity cores. You can modify the bound core IDs according to the machine.
+
+## EX3. GLM-5 Weight Quantization
+
+### Install msmodelslim
+
+```bash
+git clone https://gitcode.com/shenxiaolong/msmodelslim.git
+cd msmodelslim
+bash install.sh
+```
+
+### Modify tokenizer_config.json
+
+```bash
+ "extra_special_tokens"
+ change to "additional_special_tokens"
+
+ "tokenizer_class": "TokenizersBackend"
+ change to "tokenizer_class": "PreTrainedTokenizer"
+```
+
+### Quantize W8A8 Weights from GLM-5-BF16 Weights
+
+```bash
+### Preprocess MTP-related weights
+python example/GLM5/extract_mtp.py --model-dir ${model_path}
+
+# Specify the transformers version
+pip install transformers==4.48.2
+
+# Run quantization and generate quantized weights
+msmodelslim quant --model_path ${model_path} --save_path ${save_path} --model_type DeepSeek-V3.2 --quant_type w8a8 --trust_remote_code True
+
+# Copy the chat_template file
+cp ${model_path}/chat_template.jinja ${save_path}
+
+# Export quantized MTP weights for xLLM inference
+python example/GLM5/export_mtp.py --input-dir ${int8_save_path} --output-dir ${mtp_save_path}
+```
+
+## PD Disaggregation
+
+### Install etcd and xllm-service
+
+#### PD Disaggregated Deployment
+
+`xllm` supports PD disaggregated deployment. This must be used together with another open-source library, [xllm service](https://github.com/jd-opensource/xllm-service).
+
+##### xLLM Service Dependencies
+
+First, download and install `xllm service`, similar to installing and building `xllm`:
+
+```bash
+git clone https://github.com/jd-opensource/xllm-service
+cd xllm_service
+git submodule init
+git submodule update
+```
+
+##### Install etcd
+
+`xllm_service` depends on [etcd](https://github.com/etcd-io/etcd). Use the official etcd [installation script](https://github.com/etcd-io/etcd/releases) to install it. The default installation path used by the script is `/tmp/etcd-download-test/etcd`. You can manually modify the installation path in the script, or move it manually after the script finishes:
+
+```bash
+mv /tmp/etcd-download-test/etcd /path/to/your/etcd
+```
+
+##### Build xLLM Service
+
+Apply the patch first:
+
+```bash
+sh prepare.sh
+```
+
+Then build:
+
+```bash
+mkdir -p build
+cd build
+cmake ..
+make -j 8
+cd ..
+```
+
+:::caution[Possible Errors]
+You may encounter installation errors related to `boost-locale` and `boost-interprocess`: `vcpkg-src/packages/boost-locale_x64-linux/include: No such file or directory`, `/vcpkg-src/packages/boost-interprocess_x64-linux/include: No such file or directory`.
+Reinstall these packages with `vcpkg`:
+```bash
+/path/to/vcpkg remove boost-locale boost-interprocess
+/path/to/vcpkg install boost-locale:x64-linux
+/path/to/vcpkg install boost-interprocess:x64-linux
+```
+
+:::
+### Run PD Disaggregation
+
+Start etcd:
+
+```bash
+./etcd-download-test/etcd --listen-peer-urls 'http://localhost:2390' --listen-client-urls 'http://localhost:2389' --advertise-client-urls 'http://localhost:2391'
+```
+
+For cross-machine configuration, refer to the following etcd command:
+
+```bash
+/tmp/etcd-download-test/etcd --listen-peer-urls 'http://0.0.0.0:3390' --listen-client-urls 'http://0.0.0.0:3389' --advertise-client-urls 'http://11.87.191.82:3389'
+```
+
+Start xllm service:
+
+```bash
+ENABLE_DECODE_RESPONSE_TO_SERVICE=true ./xllm_master_serving --etcd_addr="127.0.0.1:12389" --http_server_port 28888 --rpc_server_port 28889 --tokenizer_path=/export/home/models/GLM-5-W8A8/
+```
+
+For cross-machine configuration, start xllm service with:
+
+```bash
+ENABLE_DECODE_RESPONSE_TO_SERVICE=true ../xllm-service/build/xllm_service/xllm_master_serving --etcd_addr="11.87.191.82:3389" --http_server_port 38888 --rpc_server_port 38889 --tokenizer_path=/export/home/models/GLM-5-W8A8/
+```
+- Start the Prefill instance
+```bash
+ BATCH_SIZE=256
+ # Maximum inference batch size
+ XLLM_PATH="./myxllm/xllm/build/xllm/core/server/xllm"
+ # Inference entry binary path, which is the build artifact from the previous step
+ MODEL_PATH=/export/home/models/GLM-5-w8a8/
+ # Model path, here using the int-quantized GLM-5
+ DRAFT_MODEL_PATH=/export/home/models/GLM-5-MTP/
+
+ MASTER_NODE_ADDR="11.87.49.110:10015"
+ LOCAL_HOST="11.87.49.110"
+ # Service port
+ START_PORT=18994
+ START_DEVICE=0
+ LOG_DIR="logs"
+ NNODES=16
+
+ for (( i=0; i<$NNODES; i++ ))
+ do
+ PORT=$((START_PORT + i))
+ DEVICE=$((START_DEVICE + i))
+ LOG_FILE="$LOG_DIR/node_$i.log"
+ nohup numactl -C $((i*40))-$((i*40+39)) $XLLM_PATH \
+ --model $MODEL_PATH --model_id glmmoe \
+ --host $LOCAL_HOST \
+ --port $PORT \
+ --devices="npu:$DEVICE" \
+ --master_node_addr=$MASTER_NODE_ADDR \
+ --nnodes=$NNODES \
+ --node_rank=$i \
+ --max_memory_utilization=0.86 \
+ --max_tokens_per_batch=5000 \
+ --max_seqs_per_batch=$BATCH_SIZE \
+ --communication_backend=hccl \
+ --enable_schedule_overlap=true \
+ --enable_prefix_cache=false \
+ --enable_chunked_prefill=false \
+ --enable_graph=true \
+ --draft_model $DRAFT_MODEL_PATH \
+ --draft_devices="npu:$DEVICE" \
+ --num_speculative_tokens 1 \
+ --enable_disagg_pd=true \
+ --instance_role=PREFILL \
+ --etcd_addr=$LOCAL_HOST:3389 \
+ --transfer_listen_port=$((36100 + i)) \
+ --disagg_pd_port=8877 \
+ > $LOG_FILE 2>&1 &
+ done
+
+ # --etcd_addr=$LOCAL_HOST:3389 Refer to the advertise-client-urls configuration in etcd.
+ # --instance_role=DECODE PD configuration: DECODE or PREFILL.
+ ```
+
+- Start the Decode instance
+
+ ```bash
+ BATCH_SIZE=256
+ # Maximum inference batch size
+ XLLM_PATH="./myxllm/xllm/build/xllm/core/server/xllm"
+ # Inference entry binary path, which is the build artifact from the previous step
+ MODEL_PATH=/export/home/models/GLM-5-w8a8/
+ # Model path, here using the int-quantized GLM-5
+ DRAFT_MODEL_PATH=/export/home/models/GLM-5-MTP/
+
+ MASTER_NODE_ADDR="11.87.49.110:10015"
+ LOCAL_HOST="11.87.49.110"
+ # Service port
+ START_PORT=18994
+ START_DEVICE=0
+ LOG_DIR="logs"
+ NNODES=16
+
+ for (( i=0; i<$NNODES; i++ ))
+ do
+ PORT=$((START_PORT + i))
+ DEVICE=$((START_DEVICE + i))
+ LOG_FILE="$LOG_DIR/node_$i.log"
+ nohup numactl -C $((i*40))-$((i*40+39)) $XLLM_PATH \
+ --model $MODEL_PATH --model_id glmmoe \
+ --host $LOCAL_HOST \
+ --port $PORT \
+ --devices="npu:$DEVICE" \
+ --master_node_addr=$MASTER_NODE_ADDR \
+ --nnodes=$NNODES \
+ --node_rank=$i \
+ --max_memory_utilization=0.86 \
+ --max_tokens_per_batch=5000 \
+ --max_seqs_per_batch=$BATCH_SIZE \
+ --communication_backend=hccl \
+ --enable_schedule_overlap=true \
+ --enable_prefix_cache=false \
+ --enable_chunked_prefill=false \
+ --enable_graph=true \
+ --draft_model $DRAFT_MODEL_PATH \
+ --draft_devices="npu:$DEVICE" \
+ --num_speculative_tokens 1 \
+ --enable_disagg_pd=true \
+ --instance_role=DECODE \
+ --etcd_addr=$LOCAL_HOST:3389 \
+ --transfer_listen_port=$((36100 + i)) \
+ --disagg_pd_port=8877 \
+ > $LOG_FILE 2>&1 &
+ done
+
+ # --etcd_addr=$LOCAL_HOST:3389 Refer to the advertise-client-urls configuration in etcd.
+ # --instance_role=DECODE PD configuration: DECODE or PREFILL.
+ ```
+
+ Notes:
+
+- PD disaggregation needs to read `/etc/hccn.conf`. Make sure this file on the physical machine is mounted into the container.
+
+- `etcd_addr` must be the same as the `etcd_addr` used by `xllm_service`.
+ The test command is similar to the one above. Note that for `curl http://localhost:{PORT}/v1/chat/completions ...`, `PORT` should be the `http_server_port` used to start xLLM service.
+
+- When deploying P or Q across multiple machines, such as deploying two P instances, add `--rank_tablefile` to complete communication.
diff --git a/docs/zh/supported_models.md b/docs/src/content/docs/en/supported_models.md
similarity index 96%
rename from docs/zh/supported_models.md
rename to docs/src/content/docs/en/supported_models.md
index eb2c2c2ea2..e3f19bab6a 100644
--- a/docs/zh/supported_models.md
+++ b/docs/src/content/docs/en/supported_models.md
@@ -1,5 +1,8 @@
-# 模型支持列表
-
+---
+title: "Model Support List"
+sidebar:
+ order: 20
+---
## LLM
| | NPU | MLU | ILU |
| ------------------------ | :---: | :---: | :---: |
@@ -32,14 +35,11 @@
| -------------- | :---: | :---: | :---: |
| Qwen3-Reranker | ✅ | ❌ | ❌ |
-
## DiT
| | NPU | MLU | ILU |
| ---- | :---: | :---: | :---: |
| Flux | ✅ | ❌ | ❌ |
-
-
## Rec
| | NPU | MLU | ILU |
| --- | :---: | :---: | :---: |
@@ -47,3 +47,4 @@
| Qwen2 | ✅ | ❌ | ❌ |
| Qwen2.5 | ✅ | ❌ | ❌ |
| Qwen3 | ✅ | ❌ | ❌ |
+
diff --git a/docs/zh/cli_reference.md b/docs/src/content/docs/zh/cli_reference.md
similarity index 98%
rename from docs/zh/cli_reference.md
rename to docs/src/content/docs/zh/cli_reference.md
index 5ea91e3dc3..b139348f0b 100644
--- a/docs/zh/cli_reference.md
+++ b/docs/src/content/docs/zh/cli_reference.md
@@ -1,17 +1,14 @@
---
-hide:
- - navigation
+title: "服务启动参数"
+sidebar:
+ order: 100
---
-
-
-# 服务启动参数
-
xLLM使用gflags来管理服务启动参数,具体的参数含义如下:
## 常用参数
| 参数名称 | 类型 | 默认值 | 其他值 | 参数含义 | 其他 |
|:---------:|:---------:|:---------:|:---------:|:---------:|:---------:|
-| `master_node_addr` | `string` | "127.0.0.1:19888" | ip:port | master节点rpc server的监听地址 | [详情](./features/basics.md) |
+| `master_node_addr` | `string` | "127.0.0.1:19888" | ip:port | master节点rpc server的监听地址 | |
| `host` | `string` | "" | 当前device所在的机器ip | 当前device用于通信的host ip,每个device上会启动一个rpc server,用于多卡之间通信 | |
| `port` | `int32` | 8010 | 任意可用的端口 | 与host参数配套使用,组合后用于device间的rpc通信 | |
| `model` | `string` | "" | | 模型所在的路径 | |
@@ -40,7 +37,6 @@ xLLM使用gflags来管理服务启动参数,具体的参数含义如下:
支持 MLA 的模型会自动开启 MLA,不再需要单独配置 CLI 参数。
-
## PD分离相关参数
| 参数名称 | 类型 | 默认值 | 其他值 | 参数含义 | 其他 |
|:---------:|:---------:|:---------:|:---------:|:---------:|:---------:|
@@ -50,7 +46,6 @@ xLLM使用gflags来管理服务启动参数,具体的参数含义如下:
| `kv_cache_transfer_mode` | `string` | "PUSH" | "PULL" | PD分离传输KV Cache的模式。PUSH模式:Prefill逐层向Decode传输;PULL模式:Decode一次性拉取Prefill的KV Cache | |
| `transfer_listen_port` | `int32` | 26000 | 任意可用的端口 | 启用PD分离后配置,对应每张卡上KV Cache Transfer的监听端口 | |
-
## MTP相关参数
| 参数名称 | 类型 | 默认值 | 其他值 | 参数含义 | 其他 |
|:---------:|:---------:|:---------:|:---------:|:---------:|:---------:|
@@ -58,7 +53,6 @@ xLLM使用gflags来管理服务启动参数,具体的参数含义如下:
| `draft_devices` | `string` | "npu:0" | 与`devices`格式保持一致,如`npu:0`或`npu:0,npu:1` | 与devices设置保持一致 | |
| `num_speculative_tokens` | `int32` | 0 | 任意整数,建议1或者2 | MTP模型每次step输出token的个数 | |
-
## 图执行相关参数
| 参数名称 | 类型 | 默认值 | 其他值 | 参数含义 | 其他 |
|:---------:|:---------:|:---------:|:---------:|:---------:|:---------:|
@@ -67,7 +61,6 @@ xLLM使用gflags来管理服务启动参数,具体的参数含义如下:
| `enable_prefill_piecewise_graph` | `bool` | false | true | 是否启用prefill阶段的分段Graph。attention以eager执行,其他算子进入图捕获。 | |
| `max_tokens_for_graph_mode` | `int32` | 2048 | 任意大于等于0的整数 | 图执行模式最大token数。为0表示不限制。 | |
-
## 配套xLLM-service使用的参数
| 参数名称 | 类型 | 默认值 | 其他值 | 参数含义 | 其他 |
|:---------:|:---------:|:---------:|:---------:|:---------:|:---------:|
diff --git a/docs/zh/design/generative_recommendation_design.md b/docs/src/content/docs/zh/design/generative_recommendation_design.md
similarity index 99%
rename from docs/zh/design/generative_recommendation_design.md
rename to docs/src/content/docs/zh/design/generative_recommendation_design.md
index 0bcaa3545c..b142d8836d 100644
--- a/docs/zh/design/generative_recommendation_design.md
+++ b/docs/src/content/docs/zh/design/generative_recommendation_design.md
@@ -1,5 +1,8 @@
-# 生成式推荐设计文档
-
+---
+title: "生成式推荐设计文档"
+sidebar:
+ order: 2
+---
## 概述
xLLM 在 `backend=rec` 场景下提供了生成式推荐推理能力。其目标不是替代现有推荐系统,而是在保留 `predictor` 侧稀疏特征处理和在线服务能力的前提下,把 LLM 主体推理能力复用到推荐场景中,用于候选扩展、候选比较和最终结果生成。
@@ -744,7 +747,7 @@ Rec request
最基础的验证仍然需要保留:
- 中文与英文设计文档能够正常渲染;
-- 所有图片引用都能正确解析到 `docs/assets/`;
+- 所有图片引用都能正确解析到 `src/content/docs/assets/`;
- 英文文档引用的是英文版示意图,而不是中文标注图片;
- 入口页和相关 feature 文档能够导航到这篇设计文档。
diff --git a/docs/zh/design/graph_mode_design.md b/docs/src/content/docs/zh/design/graph_mode_design.md
similarity index 99%
rename from docs/zh/design/graph_mode_design.md
rename to docs/src/content/docs/zh/design/graph_mode_design.md
index f5d81f58a2..ee1f87ad3a 100644
--- a/docs/zh/design/graph_mode_design.md
+++ b/docs/src/content/docs/zh/design/graph_mode_design.md
@@ -1,5 +1,8 @@
-# Graph Mode 设计文档
-
+---
+title: "Graph Mode 设计文档"
+sidebar:
+ order: 1
+---
## 概述
xLLM 的 Graph Mode 覆盖多种图执行后端。其目标是在推理服务场景中,将原本由 Host 频繁发起的小粒度 kernel 启动,转化为先捕获、后重放的图执行流程,从而降低 Host 调度开销、减少设备气泡,并提升吞吐和时延稳定性。
@@ -26,7 +29,7 @@ xLLM 的 Graph Mode 覆盖多种图执行后端。其目标是在推理服务场
相关设计文档:
-- 若希望看一个更偏业务推理场景、并且聚焦固定调度、多步执行和定制算子的案例,可参考:[生成式推荐设计文档](generative_recommendation_design.md)
+- 若希望看一个更偏业务推理场景、并且聚焦固定调度、多步执行和定制算子的案例,可参考:[生成式推荐设计文档](./generative_recommendation_design.md)
## 1. Graph Mode 原理和在 xLLM 中的落地
@@ -41,7 +44,6 @@ Graph Mode 的基本思路是:

-
这类机制通常要求:
- **执行路径稳定**
@@ -473,3 +475,4 @@ Graph 捕获期显存复用的核心映射关系如下:
- [CudaGraph Capture 机制参考](https://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#cuda-graphs)
- [vLLM 图执行实现参考](https://github.com/vllm-project/vllm/blob/main/vllm/v1/worker/gpu/cudagraph_utils.py)
- [SGLang 图执行实现参考](https://github.com/sgl-project/sglang/blob/main/python/sglang/srt/model_executor/cuda_graph_runner.py)
+
diff --git a/docs/zh/dev_guide/code_arch.md b/docs/src/content/docs/zh/dev_guide/code_arch.md
similarity index 96%
rename from docs/zh/dev_guide/code_arch.md
rename to docs/src/content/docs/zh/dev_guide/code_arch.md
index a3e8a507b8..0d8ce5b124 100644
--- a/docs/zh/dev_guide/code_arch.md
+++ b/docs/src/content/docs/zh/dev_guide/code_arch.md
@@ -1,5 +1,8 @@
-# 代码结构
-
+---
+title: "代码结构"
+sidebar:
+ order: 1
+---
```
├── xllm/
| : 主代码目录
@@ -24,4 +27,4 @@
├── examples/ # 服务调用示例
├── tools/ # NPU Timeline生成工具
└── xllm.cpp # xLLM启动入口
-```
\ No newline at end of file
+```
diff --git a/docs/zh/dev_guide/tilelang_ascend_kernel_dev.md b/docs/src/content/docs/zh/dev_guide/tilelang_ascend_kernel_dev.md
similarity index 99%
rename from docs/zh/dev_guide/tilelang_ascend_kernel_dev.md
rename to docs/src/content/docs/zh/dev_guide/tilelang_ascend_kernel_dev.md
index b828094622..4969469e47 100644
--- a/docs/zh/dev_guide/tilelang_ascend_kernel_dev.md
+++ b/docs/src/content/docs/zh/dev_guide/tilelang_ascend_kernel_dev.md
@@ -1,5 +1,8 @@
-# xLLM Ascend TileLang Kernel 开发指南
-
+---
+title: "xLLM Ascend TileLang Kernel 开发指南"
+sidebar:
+ order: 2
+---
本文说明在 xLLM 中新增或修改 Ascend TileLang kernel 的开发方式。示例全程使用当前的 `rope` kernel。
相关目录:
@@ -145,7 +148,6 @@ def generate_source(head_dim: int, rope_dim: int, dtype: str) -> str:
```python
from ....common.spec import DispatchField, TilelangKernel, register_kernel
-
@register_kernel
class RopeKernel(TilelangKernel):
DISPATCH_SCHEMA = [
@@ -394,3 +396,4 @@ python setup.py test --test-name rope_wrapper_test --device a3
```
第一条命令用于生成 `manifest.json`、`registry.inc` 和 object;第二条命令用于验证完整接入路径。
+
diff --git a/docs/zh/features/async_schedule.md b/docs/src/content/docs/zh/features/async_schedule.md
similarity index 82%
rename from docs/zh/features/async_schedule.md
rename to docs/src/content/docs/zh/features/async_schedule.md
index 508907f3a2..7f50927b7f 100644
--- a/docs/zh/features/async_schedule.md
+++ b/docs/src/content/docs/zh/features/async_schedule.md
@@ -1,12 +1,13 @@
-# 异步调度
-
+---
+title: "异步调度"
+sidebar:
+ order: 10
+---
## 背景
大模型推理过程可划分为3个阶段,包括CPU执行调度准备模型输入阶段,device计算阶段,CPU处理输出阶段。
由于解码操作的序列性,step-i+1 的输入需要依赖 step-i 的输出结果,
上述3个阶段需要按顺序串行执行,导致在CPU执行阶段1和3的时候,device侧空闲等待出现空泡,资源利用不充分。
-
-
## 功能介绍
xLLM在框架层支持了异步调度功能,在device执行 step-i 计算的同时提前让CPU执行 step-i+1 的调度操作,device在完成 step-i 计算后可立即开始 step-i+1 的计算,从而消除空泡。
@@ -14,7 +15,6 @@ xLLM在框架层支持了异步调度功能,在device执行 step-i 计算的
整体架构如图,实现中CPU侧执行阶段1和阶段3的操作分别采用了不同的线程池,rpc等函数调用采用C++ future和promise非阻塞调用,实现全异步runtime。
-
## 使用方式
xLLM中提供了gflags参数`enable_schedule_overlap`,默认false,如需开启在xLLM的服务启动脚本中设置为true即可,示例如下:
@@ -22,12 +22,12 @@ xLLM中提供了gflags参数`enable_schedule_overlap`,默认false,如需开
--enable_schedule_overlap=true
```
-
## 性能效果
- 异步调度开启后,两个step之间的device空闲时在200us左右,基本类似一个kernel launch的时间。
- 在DeepSeek-R1-Distill-Qwen-1.5B模型上,限制TPOT 50ms,吞吐 **提升17%**。
+:::caution[注意]
+- 异步调度功能会在服务端额外计算一个step,当使用场景中输出token数量较少,或是类似embedding模型只一次性输出的场景,会影响服务端吞吐,所以强制关闭异步调度。
+- VLM模型正在适配中,暂时会强制关闭异步调度。
-!!! warning "注意"
- - 异步调度功能会在服务端额外计算一个step,当使用场景中输出token数量较少,或是类似embedding模型只一次性输出的场景,会影响服务端吞吐,所以强制关闭异步调度。
- - VLM模型正在适配中,暂时会强制关闭异步调度。
+:::
diff --git a/docs/zh/features/chunked_scheduler.md b/docs/src/content/docs/zh/features/chunked_scheduler.md
similarity index 92%
rename from docs/zh/features/chunked_scheduler.md
rename to docs/src/content/docs/zh/features/chunked_scheduler.md
index 561dbc3733..7cd595248e 100644
--- a/docs/zh/features/chunked_scheduler.md
+++ b/docs/src/content/docs/zh/features/chunked_scheduler.md
@@ -1,5 +1,8 @@
-# ChunkedPrefill调度器
-
+---
+title: "ChunkedPrefill调度器"
+sidebar:
+ order: 21
+---
## 功能介绍
xLLM支持chunked prefill调度策略。Chunked prefill是一种优化大语言模型推理的技术,将长prompt分割成多个较小的chunk进行分批处理,而不是一次性处理整个prompt。
这种方法可以有效降低显存峰值使用量,提高Device利用率,并且能够更好地与decode阶段的请求进行调度和混合处理。
@@ -15,3 +18,4 @@ xLLM支持chunked prefill调度策略。Chunked prefill是一种优化大语言
## 性能效果
开启chunked_prefill之后,在Qwen3-8B模型上,限制TPOT 50ms,TTFT时延 **下降46%**。
+
diff --git a/docs/zh/features/disagg_pd.md b/docs/src/content/docs/zh/features/disagg_pd.md
similarity index 88%
rename from docs/zh/features/disagg_pd.md
rename to docs/src/content/docs/zh/features/disagg_pd.md
index 684c436a00..6e6f5a739e 100644
--- a/docs/zh/features/disagg_pd.md
+++ b/docs/src/content/docs/zh/features/disagg_pd.md
@@ -1,4 +1,8 @@
-# PD分离
+---
+title: "PD分离"
+sidebar:
+ order: 30
+---
## 背景
LLM在线推理服务通常需要满足TTFT和TPOT两项性能指标,而传统的Contiguous Batching调度策略将Prefill和Decode请求混合在一起调度,导致P和D会互相抢占计算资源,影响性能指标无法最大程度的利用计算资源。为解决上述矛盾,将Prefill和Decode两阶段拆分到独立的计算资源并行执行,从而同时降低TTFT和TPOT并提升吞吐量。
## 功能介绍
@@ -14,7 +18,7 @@ xLLM PD分离功能主要通过以下三个模块实现:
### 使用准备
#### 安装相关依赖
- **xLLM**: 参见[安装编译](../getting_started/quick_start.md)
-- **xLLM Service**: 参见[PD分离部署](../getting_started/disagg_pd.md)
+- **xLLM Service**: 参见[xLLM Service](https://github.com/jd-opensource/xllm-service)
### 启动PD分离服务
1. 启动etcd
@@ -66,9 +70,11 @@ ENABLE_DECODE_RESPONSE_TO_SERVICE=true ./xllm_master_serving --etcd_addr="127.0.
- `etcd_addr`需与`xllm_service`的`etcd_addr`相同
-!!! warning "注意事项"
- PD分离目前不支持开启prefix cache及chunked prefill功能,需要通过以下参数关闭
- ``` shell
- --enable_prefix_cache=false
- --enable_chunked_prefill=false
- ```
+:::caution[注意事项]
+PD分离目前不支持开启prefix cache及chunked prefill功能,需要通过以下参数关闭
+``` shell
+--enable_prefix_cache=false
+--enable_chunked_prefill=false
+```
+
+:::
diff --git a/docs/zh/features/eplb.md b/docs/src/content/docs/zh/features/eplb.md
similarity index 96%
rename from docs/zh/features/eplb.md
rename to docs/src/content/docs/zh/features/eplb.md
index 1f23458a01..d778f70428 100644
--- a/docs/zh/features/eplb.md
+++ b/docs/src/content/docs/zh/features/eplb.md
@@ -1,5 +1,8 @@
-# MoE负载均衡(EPLB)
-
+---
+title: "MoE负载均衡(EPLB)"
+sidebar:
+ order: 71
+---
## 背景介绍
MoE模型依赖动态路由分配tokens给专家,但实际部署中因数据分布不均,导致专家负载失衡(部分过载、部分闲置)。专家冗余调整(如新增/删除副本)需要消耗额外显存,并可能因权重迁移影响推理延迟,如何高效、平滑地完成是一大挑战。为此,采用专家冗余策略(复制热点专家)结合分层和全局动态负载均衡实现了动态的MOE负载均衡。
@@ -33,3 +36,4 @@ xLLM MoE负载均衡(EPLB)功能主要通过以下三个模块实现:
* 采用更加细粒度的专家更新机制。
* 与调度层结合,通过请求batch的重组实现更好的负载均衡。
+
diff --git a/docs/zh/features/global_kvcache.md b/docs/src/content/docs/zh/features/global_kvcache.md
similarity index 91%
rename from docs/zh/features/global_kvcache.md
rename to docs/src/content/docs/zh/features/global_kvcache.md
index 778c761816..40c8191dbb 100644
--- a/docs/zh/features/global_kvcache.md
+++ b/docs/src/content/docs/zh/features/global_kvcache.md
@@ -1,4 +1,8 @@
-# 全局多级KV Cache
+---
+title: "全局多级KV Cache"
+sidebar:
+ order: 51
+---
## 背景
大型语言模型(LLM)解码阶段因自回归生成需频繁访问历史KV缓存,导致显存带宽成为瓶颈。随着模型规模与上下文窗口扩大(如128K Token消耗超40GB显存),单卡显存压力剧增。现有方案(如vLLM)在长上下文场景下存在明显局限:预填充耗时激增、解码阶段显存带宽争抢严重,为满足SLO(TTFT<2s, TBT<100ms)常需过量预留资源,致使GPU利用率不足40%,且难以利用跨服务器资源。为此,我们提出分布式全局多级KV缓存管理系统,采用存算一体架构以突破单机资源限制。
@@ -14,7 +18,7 @@ xLLM 全局KV Cache功能主要通过以下三个模块实现:
### 使用准备
#### 安装相关依赖
- **xLLM**: 参见[快速开始](../getting_started/quick_start.md)
-- **xLLM Service**: 参见[PD分离部署](../getting_started/disagg_pd.md)
+- **xLLM Service**: 参见[xLLM Service](https://github.com/jd-opensource/xllm-service)
### 使用方式
1. etcd启动配置:
@@ -31,4 +35,4 @@ xLLM 全局KV Cache功能主要通过以下三个模块实现:
--enable_cache_upload=true
# PD分离暂时不支持全局KVCache管理
--enable_disagg_pd=false
-```
\ No newline at end of file
+```
diff --git a/docs/zh/features/graph_mode.md b/docs/src/content/docs/zh/features/graph_mode.md
similarity index 98%
rename from docs/zh/features/graph_mode.md
rename to docs/src/content/docs/zh/features/graph_mode.md
index 343e2997a3..1bf05c4896 100644
--- a/docs/zh/features/graph_mode.md
+++ b/docs/src/content/docs/zh/features/graph_mode.md
@@ -1,5 +1,8 @@
-# Graph Mode
-
+---
+title: "Graph Mode"
+sidebar:
+ order: 81
+---
## 概述
xLLM 支持 Graph Mode,通过预捕获计算图并在后续执行中重放,减少 CPU 开销并提高推理性能。Graph Mode 在不同硬件平台上均有对应实现。
@@ -71,7 +74,6 @@ xLLM 支持 Graph Mode,通过预捕获计算图并在后续执行中重放,
| GLM4V | ✅ | | |
| GLM4V-MoE | ✅ | | |
-
-
## 相关文档
- 更详细的 Graph Mode 设计与实现说明(含 ACL Graph / CUDA Graph 基本原理、动态维度参数化、Piecewise Graph 与多 shape 复用内存方案)见:[Graph Mode 设计文档](../design/graph_mode_design.md)
+
diff --git a/docs/zh/features/moe_params.md b/docs/src/content/docs/zh/features/moe_params.md
similarity index 97%
rename from docs/zh/features/moe_params.md
rename to docs/src/content/docs/zh/features/moe_params.md
index b7fd615376..dc31367cca 100644
--- a/docs/zh/features/moe_params.md
+++ b/docs/src/content/docs/zh/features/moe_params.md
@@ -1,4 +1,8 @@
-# EP并行
+---
+title: "EP并行"
+sidebar:
+ order: 70
+---
## 背景介绍
在部署DeepSeek-R1 671B参数规模模型时传统分布式部署面临、显存利用率低、通信开销大、硬件成本高昂等核心瓶颈,因此需要引入ep并行。
+ 在同等资源下,单张卡上的Expert越少,可用于KV Cache的显存越多,可Cache的token个数越多。
@@ -15,3 +19,4 @@

+ 当ep_size设置为卡数时,可以开启ep level2,此时attn部分与moe部分之间通讯变为ALL2ALL,只向需要的卡发送数据,降低通讯量与通讯开销,以64卡部署为例,执行流程如下:

+
diff --git a/docs/zh/features/mtp.md b/docs/src/content/docs/zh/features/mtp.md
similarity index 88%
rename from docs/zh/features/mtp.md
rename to docs/src/content/docs/zh/features/mtp.md
index e2072670cf..eb06c21898 100644
--- a/docs/zh/features/mtp.md
+++ b/docs/src/content/docs/zh/features/mtp.md
@@ -1,5 +1,8 @@
-# MTP投机推理
-
+---
+title: "MTP投机推理"
+sidebar:
+ order: 80
+---
## 背景
MTP是一种创新的推理阶段加速技术,专注于解决大语言模型生成过程中的效率瓶颈。MTP的本质是通过预训练阶段的特殊设计,为推理阶段提供高效的草稿token预测能力,从而显著提升模型的生成速度。其核心价值在于平衡推理效率与输出质量,为大语言模型的长序列生成问题提供了一种高效的解决方案,最终实现推理性能的优化。
@@ -18,17 +21,18 @@ MTP在推理加速方面具有以下核心功能:
MTP技术为大语言模型的推理阶段提供了一种全新的效率优化方案,特别适合需要快速响应的实时应用场景,代表了语言模型推理优化的重要发展方向。
-!!! note "模型支持"
- 目前支持以下模型的MTP结构导出:
- - DeepSeek-V3 (输入 model_type: deepseek_v3, 导出 MTP model_type: deepseek_v3_mtp)
- - DeepSeek-V3.2 (输入 model_type: deepseek_v3, 导出 MTP model_type: deepseek_v32_mtp)
- - DeepSeek-R1 (输入 model_type: deepseek_v3, 导出 MTP model_type: deepseek_v3_mtp)
- - GLM4 MoE (如 GLM-4.5-Air, 导出 MTP model_type: glm4_moe_mtp)
-
- 注意:
- - DeepSeek V3 和 R1 的输入 model_type 都是 "deepseek_v3",导出的 MTP 模型 model_type 为 "deepseek_v3_mtp"
- - DeepSeek V3.2 的输入 model_type 是 "deepseek_v3"(但可通过 index_head_dim 等字段自动识别),导出的 MTP 模型 model_type 为 "deepseek_v32_mtp"
+:::note[模型支持]
+目前支持以下模型的MTP结构导出:
+- DeepSeek-V3 (输入 model_type: deepseek_v3, 导出 MTP model_type: deepseek_v3_mtp)
+- DeepSeek-V3.2 (输入 model_type: deepseek_v3, 导出 MTP model_type: deepseek_v32_mtp)
+- DeepSeek-R1 (输入 model_type: deepseek_v3, 导出 MTP model_type: deepseek_v3_mtp)
+- GLM4 MoE (如 GLM-4.5-Air, 导出 MTP model_type: glm4_moe_mtp)
+
+注意:
+- DeepSeek V3 和 R1 的输入 model_type 都是 "deepseek_v3",导出的 MTP 模型 model_type 为 "deepseek_v3_mtp"
+- DeepSeek V3.2 的输入 model_type 是 "deepseek_v3"(但可通过 index_head_dim 等字段自动识别),导出的 MTP 模型 model_type 为 "deepseek_v32_mtp"
+:::
## 使用示例
### 导出模型
@@ -126,7 +130,7 @@ DRAFT_MODEL_PATH="/models/GLM-4.5-Air-mtp"
# ... 其他配置相同
```
-# 性能数据
+## 性能数据
基于sharegpt数据集,输入长度2500,输出长度1500,请求总数80。
| method | Concurrency | Mean TPOT(ms) | Mean TTFT(ms) | Output Tokens/s | Total Tokens/s |
@@ -147,3 +151,4 @@ DRAFT_MODEL_PATH="/models/GLM-4.5-Air-mtp"
| mtp | 40 | 105.70 | 544.54 | 252.91 | 686.74 |
| baseline | 80 | 180.89 | 2996.21 | 192.09 | 522.06 |
| mtp | 80 | 152.19 | 2163.72 | 278.07 | 755.12 |
+
diff --git a/docs/zh/features/multi_streams.md b/docs/src/content/docs/zh/features/multi_streams.md
similarity index 84%
rename from docs/zh/features/multi_streams.md
rename to docs/src/content/docs/zh/features/multi_streams.md
index 5a9c8271c0..26ffa8a709 100644
--- a/docs/zh/features/multi_streams.md
+++ b/docs/src/content/docs/zh/features/multi_streams.md
@@ -1,14 +1,15 @@
-# 多流并行
-
+---
+title: "多流并行"
+sidebar:
+ order: 11
+---
## 背景
大模型分布式推理场景中需要引入额外的通信操作,将不同设备上的计算结果聚合在一起。以Deepseek这类大规模的MoE模型为例,分布式规模通常较大,通信开销也会随之变大。计算和通信都采用同一个stream的话,在通信的同时,device计算资源会出现浪费,一直等待通信完成才能开始后面的计算。
-
## 功能介绍
xLLM在模型图层支持了多流并行功能,将输入的batch拆分成2个micro batches,一个流执行一个micro batch的计算操作,另一个流执行另一个micro batch的通信操作,计算和通信同时执行,从而掩盖通信开销。

-
## 使用方式
xLLM中提供了gflags参数`enable_multi_stream_parallel`,默认false,如需开启在xLLM的服务启动脚本中设置为true即可,示例如下:
@@ -16,14 +17,13 @@ xLLM中提供了gflags参数`enable_multi_stream_parallel`,默认false,如
--enable_multi_stream_parallel=true
```
-
## 性能效果
prefill双流并行开启后,基本可掩盖75以上的通信开销,在DeepSeek-R1模型上,只输出1个token的情况下
- TTFT下降 **7%**
- 吞吐 **提升7%**
-
-!!! warning "注意"
- 双流并行目前只支持prefill阶段,请求输入越长,收益越大。
- 目前仅支持DeepSeek、Qwen3 dense(非MoE)模型。
\ No newline at end of file
+:::caution[注意]
+双流并行目前只支持prefill阶段,请求输入越长,收益越大。
+目前仅支持DeepSeek、Qwen3 dense(非MoE)模型。
+:::
diff --git a/docs/src/content/docs/zh/features/multimodal.md b/docs/src/content/docs/zh/features/multimodal.md
new file mode 100755
index 0000000000..01888114c3
--- /dev/null
+++ b/docs/src/content/docs/zh/features/multimodal.md
@@ -0,0 +1,23 @@
+---
+title: "多模态支持"
+sidebar:
+ order: 60
+---
+本文档主要介绍xLLM推理引擎中多模态的支持进展,包括支持模型及模态类型,以及离在线接口等。
+
+## 支持模型
+- Qwen2.5-VL: 包括7B/32B/72B。
+- Qwen3-VL: 包括2B/4B/8B/32B。
+- Qwen3-VL-MoE: 包括A3B/A22B。
+- MiniCPM-V-2_6: 7B。
+
+## 模态类型
+- 图片: 支持单图、多图的输入,以及图片+Prompt组合、纯文本Promot等输入方式。
+
+:::caution[注意事项]
+- 目前多模态后端不支持prefix cache以及chunk prefill,正在支持中。
+- 目前,xLLM统一基于JinJa渲染ChatTemplate,部署MiniCPM-V-2_6,模型目录需提供ChatTemplate文件。
+- 图片支持Base64输入以及图片Url。
+- 目前多模态模型主要支持了图片模态,视频、音频等模态正在推进中。
+
+:::
diff --git a/docs/zh/features/prefix_cache.md b/docs/src/content/docs/zh/features/prefix_cache.md
similarity index 87%
rename from docs/zh/features/prefix_cache.md
rename to docs/src/content/docs/zh/features/prefix_cache.md
index 9515e65ec4..a5bf5d835c 100644
--- a/docs/zh/features/prefix_cache.md
+++ b/docs/src/content/docs/zh/features/prefix_cache.md
@@ -1,5 +1,8 @@
-# Prefix Cache 优化
-
+---
+title: "Prefix Cache 优化"
+sidebar:
+ order: 50
+---
## 功能介绍
xLLM支持prefix_cache匹配。prefix_cache基于mermer_hash,使用lru淘汰策略,提供更极致的匹配效率,同时提高prefix_cache命中率。
同时对prefix_cache进行了优化,支持continuous_scheduler、chunked_scheduler和zero_evict_scheduler,在prefill之后即更新
@@ -16,5 +19,6 @@ prefix_cache已在xLLM实现,并向外暴露gflag参数,控制功能的开
## 性能效果
开启prefix_cache之后,在Qwen3-8B模型上,限制TPOT50ms,E2E时延 **下降10%**。
-!!! warning "注意"
- 暂不支持PD分离调度器
\ No newline at end of file
+:::caution[注意]
+暂不支持PD分离调度器
+:::
diff --git a/docs/zh/features/xllm_service_overview.md b/docs/src/content/docs/zh/features/xllm_service_overview.md
similarity index 96%
rename from docs/zh/features/xllm_service_overview.md
rename to docs/src/content/docs/zh/features/xllm_service_overview.md
index 1f07c17df0..e5382768d4 100644
--- a/docs/zh/features/xllm_service_overview.md
+++ b/docs/src/content/docs/zh/features/xllm_service_overview.md
@@ -1,6 +1,8 @@
-
-
-# xLLM Service
+---
+title: "xLLM Service"
+sidebar:
+ order: 90
+---
[:simple-github: xLLM Service](https://github.com/jd-opensource/xllm-service)
## 简介
@@ -45,4 +47,4 @@ xLLM-service 提供容错管理,保障服务质量以及稳定性。
作为指标与事件中枢,接收各实例上报的 Metrics 数据,对统计指标进行统一收集与整理,为服务调度、容错、扩缩容等决策提供数据支撑。
### Planner
-承担策略分析与决策职能,基于 Event Plane 上报的 Metrics 数据(含实例运行时指标、机器负载指标等),分析服务扩缩容需求、热点实例扩展必要性,输出资源调整与实例优化策略。
\ No newline at end of file
+承担策略分析与决策职能,基于 Event Plane 上报的 Metrics 数据(含实例运行时指标、机器负载指标等),分析服务扩缩容需求、热点实例扩展必要性,输出资源调整与实例优化策略。
diff --git a/docs/zh/features/zero_evict_scheduler.md b/docs/src/content/docs/zh/features/zero_evict_scheduler.md
similarity index 91%
rename from docs/zh/features/zero_evict_scheduler.md
rename to docs/src/content/docs/zh/features/zero_evict_scheduler.md
index 7750e97cc9..a87579fced 100644
--- a/docs/zh/features/zero_evict_scheduler.md
+++ b/docs/src/content/docs/zh/features/zero_evict_scheduler.md
@@ -1,5 +1,8 @@
-# Zero Evict调度器
-
+---
+title: "Zero Evict调度器"
+sidebar:
+ order: 22
+---
## 功能介绍
xLLM支持zero_evict调度策略。zero_evict调度策略是一种尽可能减少请求淘汰率的调度算法,可以减少淘汰请求的prefill计算,减少TPOT。
这种调度算法通过模拟轮次,检测请求是否调度可以被调度且不导致其它请求被淘汰。
@@ -15,3 +18,4 @@ xLLM支持zero_evict调度策略。zero_evict调度策略是一种尽可能减
## 性能效果
开启zero_evict之后,在Qwen3-8B模型上,限制E2E时延,TPOT时延 **下降27%**。
+
diff --git a/docs/zh/getting_started/launch_xllm.md b/docs/src/content/docs/zh/getting_started/launch_xllm.md
similarity index 98%
rename from docs/zh/getting_started/launch_xllm.md
rename to docs/src/content/docs/zh/getting_started/launch_xllm.md
index 042389da25..a673d14cb9 100644
--- a/docs/zh/getting_started/launch_xllm.md
+++ b/docs/src/content/docs/zh/getting_started/launch_xllm.md
@@ -1,5 +1,8 @@
-# 启动xllm
-
+---
+title: "启动xllm"
+sidebar:
+ order: 3
+---
以Qwen3为例,启动xllm的脚本如下,给出的脚本适用于单机单卡和单机多卡,当使用单机多卡时,需要修改`NNODES`(一张卡就代表一个node),以及`ASCEND_RT_VISIBLE_DEVICES`或`CUDA_VISIBLE_DEVICES`或`MLU_VISIBLE_DEVICES`等环境变量。
## NPU
@@ -15,7 +18,6 @@ source /usr/local/Ascend/nnal/atb/set_env.sh
export ASCEND_RT_VISIBLE_DEVICES=0
export HCCL_IF_BASE_PORT=43432 # HCCL 通信基础端口
-
MODEL_PATH="/path/to/model/Qwen3-8B" # 模型路径
MASTER_NODE_ADDR="127.0.0.1:9748" # Master 节点地址(需全局一致)
START_PORT=18000 # 服务起始端口
@@ -88,7 +90,6 @@ do
done
```
-
## MLU
```bash
@@ -123,3 +124,4 @@ do
--node_rank=$i \ > $LOG_FILE 2>&1 &
done
```
+
diff --git a/docs/zh/getting_started/multi_machine.md b/docs/src/content/docs/zh/getting_started/multi_machine.md
similarity index 98%
rename from docs/zh/getting_started/multi_machine.md
rename to docs/src/content/docs/zh/getting_started/multi_machine.md
index 9e0dc74d68..7eed9e114a 100644
--- a/docs/zh/getting_started/multi_machine.md
+++ b/docs/src/content/docs/zh/getting_started/multi_machine.md
@@ -1,4 +1,8 @@
-# 多机部署
+---
+title: "多机部署"
+sidebar:
+ order: 5
+---
该示例为两机32卡启动示例,第一台机器服务:
```shell
bash start_deepseek_machine_1.sh
@@ -14,7 +18,6 @@ source /usr/local/Ascend/ascend-toolkit/set_env.sh
source /usr/local/Ascend/nnal/atb/set_env.sh
export HCCL_IF_BASE_PORT=43432 # HCCL 通信基础端口
-
MODEL_PATH="/path/to/your/DeepSeek-R1" # 模型路径
MASTER_NODE_ADDR="123.123.123.123:9748" # Master 节点地址(需全局一致)
LOCAL_HOST=123.123.123.123 # 本机服务启动IP
@@ -104,3 +107,4 @@ done
```
这里使用了两台机器,可以通过 `--nnodes`设置总卡数,`--node_rank`为全局rank id。
`--rank_tablefile=./ranktable_2s_32p.json`为构建npu通信域所需文件,可参考[ranktable 生成](https://gitee.com/mindspore/models/blob/master/utils/hccl_tools/README.md)生成。
+
diff --git a/docs/zh/getting_started/offline_service.md b/docs/src/content/docs/zh/getting_started/offline_service.md
similarity index 93%
rename from docs/zh/getting_started/offline_service.md
rename to docs/src/content/docs/zh/getting_started/offline_service.md
index c20ab71542..f3ac93491d 100644
--- a/docs/zh/getting_started/offline_service.md
+++ b/docs/src/content/docs/zh/getting_started/offline_service.md
@@ -1,5 +1,8 @@
-# 离线推理
-
+---
+title: "离线推理"
+sidebar:
+ order: 7
+---
为了方便用户快速使用xLLM进行离线推理,我们提供了启动离线推理的python脚本例子
## LLM
@@ -14,3 +17,4 @@ LLM推理示例:[:simple-github: https://github.com/jd-opensource/xllm/blob/ma
VLM推理示例:[:simple-github: https://github.com/jd-opensource/xllm/blob/main/examples/generate_vlm.py](https://github.com/jd-opensource/xllm/blob/main/examples/generate_vlm.py)
+
diff --git a/docs/zh/getting_started/online_service.md b/docs/src/content/docs/zh/getting_started/online_service.md
similarity index 96%
rename from docs/zh/getting_started/online_service.md
rename to docs/src/content/docs/zh/getting_started/online_service.md
index c626ef9c09..4f5c743596 100644
--- a/docs/zh/getting_started/online_service.md
+++ b/docs/src/content/docs/zh/getting_started/online_service.md
@@ -1,5 +1,9 @@
-# 在线服务
-先按照[xllm启动文档](launch_xllm.md)启动xllm服务。下面给出LLM和VLM的客户端调用示例,需要根据实际情况修改其中的参数。
+---
+title: "在线服务"
+sidebar:
+ order: 6
+---
+先按照[xllm启动文档](./launch_xllm.md)启动xllm服务。下面给出LLM和VLM的客户端调用示例,需要根据实际情况修改其中的参数。
## LLM 客户端调用
### HTTP 调用
@@ -134,7 +138,6 @@ else:
print(ans[0]['message'])
```
-
## VLM 客户端调用
### HTTP API
@@ -178,7 +181,6 @@ response = requests.post(
print(response.json())
```
-
### OpenAI API
```python
from openai import OpenAI
@@ -222,3 +224,4 @@ chat_completion = client.chat.completions.create(
result = chat_completion.choices[0].message.content
print("Chat completion output:", result)
```
+
diff --git a/docs/zh/getting_started/quick_start.md b/docs/src/content/docs/zh/getting_started/quick_start.md
similarity index 88%
rename from docs/zh/getting_started/quick_start.md
rename to docs/src/content/docs/zh/getting_started/quick_start.md
index d08c91f5cb..aa64114d99 100644
--- a/docs/zh/getting_started/quick_start.md
+++ b/docs/src/content/docs/zh/getting_started/quick_start.md
@@ -1,5 +1,8 @@
-# 快速开始
-
+---
+title: "快速开始"
+sidebar:
+ order: 1
+---
## 环境设置
所有的镜像都存放在[这里](https://quay.io/repository/jd_xllm/xllm-ai?tab=tags),下面的docker启动命令以开发镜像为例。
@@ -44,7 +47,7 @@ docker run -it \
### NVIDIA GPU
-我们提供了NVIDIA GPU使用的[Dockerfile](../../../docker/Dockerfile.cuda),可以构建自定义镜像,当然也可以使用我们根据默认Dockerfile构建的开发镜像:
+我们提供了NVIDIA GPU使用的[Dockerfile](https://github.com/jd-opensource/xllm/blob/main/docker/Dockerfile.cuda),可以构建自定义镜像,当然也可以使用我们根据默认Dockerfile构建的开发镜像:
```bash
docker pull quay.io/jd_xllm/xllm-ai:xllm-dev-cuda-x86
```
@@ -103,4 +106,4 @@ python setup.py build
```
## 启动xllm
-请参考 [xllm启动方式](launch_xllm.md)。
\ No newline at end of file
+请参考 [xllm启动方式](./launch_xllm.md)。
diff --git a/docs/zh/index.md b/docs/src/content/docs/zh/index.md
similarity index 86%
rename from docs/zh/index.md
rename to docs/src/content/docs/zh/index.md
index 27d80b32ab..44f24cc316 100644
--- a/docs/zh/index.md
+++ b/docs/src/content/docs/zh/index.md
@@ -1,16 +1,8 @@
---
-hide:
- - navigation
+title: "xLLM"
+description: "xLLM 文档首页"
---
-
-
-
-
-
+
## 简介
@@ -61,6 +53,7 @@ xLLM 提供了强大的智能计算能力,通过硬件系统的算力优化与
## 设计文档
-- [Graph Mode 设计文档](design/graph_mode_design.md)
-- [生成式推荐设计文档](design/generative_recommendation_design.md)
+- [Graph Mode 设计文档](./design/graph_mode_design.md)
+- [生成式推荐设计文档](./design/generative_recommendation_design.md)
+
diff --git a/docs/zh/getting_started/quick_start_GLM5.md b/docs/src/content/docs/zh/popular_model_usage/quick_start_GLM5.md
similarity index 93%
rename from docs/zh/getting_started/quick_start_GLM5.md
rename to docs/src/content/docs/zh/popular_model_usage/quick_start_GLM5.md
index dd1f27524f..0af999f6ef 100644
--- a/docs/zh/getting_started/quick_start_GLM5.md
+++ b/docs/src/content/docs/zh/popular_model_usage/quick_start_GLM5.md
@@ -1,583 +1,586 @@
-# 使用 xLLM 在 Ascend A3设备 推理 GLM-5.0-W8A8 基座模型
-
-+ 源码地址:https://github.com/jd-opensource/xllm
-
-+ 国内可用: https://gitcode.com/xLLM-AI/xllm
-
-+ 权重下载: [modelscope-GLM-5-W8A8](https://www.modelscope.cn/models/Eco-Tech/GLM-5-W8A8-xLLM/files)
-
-## 1.拉取镜像环境
-
-首先下载xLLM提供的镜像:
-
-```bash
-# A2 x86
-docker pull quay.io/jd_xllm/xllm-ai:xllm-dev-a2-x86-20260306
-# A2 arm
-docker pull quay.io/jd_xllm/xllm-ai:xllm-dev-a2-arm-20260306
-# A3 arm
-docker pull quay.io/jd_xllm/xllm-ai:xllm-dev-a3-arm-20260306
-```
-
-**注意**: A2 机器性能未进行压测。
-
-然后创建对应的容器
-
-```bash
-sudo docker run -it --ipc=host -u 0 --privileged --name mydocker --network=host \
- -v /var/queue_schedule:/var/queue_schedule \
- -v /usr/local/Ascend/driver:/usr/local/Ascend/driver \
- -v /usr/local/Ascend/add-ons/:/usr/local/Ascend/add-ons/ \
- -v /usr/local/sbin/npu-smi:/usr/local/sbin/npu-smi \
- -v /var/log/npu/conf/slog/slog.conf:/var/log/npu/conf/slog/slog.conf \
- -v /var/log/npu/slog/:/var/log/npu/slog \
- -v ~/.ssh:/root/.ssh \
- -v /var/log/npu/profiling/:/var/log/npu/profiling \
- -v /var/log/npu/dump/:/var/log/npu/dump \
- -v /runtime/:/runtime/ -v /etc/hccn.conf:/etc/hccn.conf \
- -v /export/home:/export/home \
- -v /home/:/home/ \
- -w /export/home \
- quay.io/jd_xllm/xllm-ai:xllm-dev-hb-rc2-x86
-```
-
-## 2.拉取源码并编译
-
-下载官方仓库与模块依赖:
-
-```bash
-git clone https://github.com/jd-opensource/xllm
-cd xllm
-git checkout preview/glm-5
-git submodule init
-git submodule update
-```
-
-下载安装依赖:
-
-```bash
-pip install --upgrade pre-commit
-yum install numactl
-```
-
-执行编译,在`build/`下生成可执行文件`build/xllm/core/server/xllm`:
-
-```bash
-python setup.py build
-```
-
-## 3.启动模型
-
-### 若机器为重启后初次拉起服务,需先执行以下脚本对device进行初始化
-
-#若不执行且npu未初始化可能导致xllm进程拉起失败
-
-```bash
-python -c "import torch_npu
-for i in range(16):torch_npu.npu.set_device(i)"
-```
-
-### 环境变量
-
-```bash
-##### 1, 配置依赖路径相关环境变量
-# export PYTHON_INCLUDE_PATH="$(python3 -c 'from sysconfig import get_paths; print(get_paths()["include"])')"
-# export PYTHON_LIB_PATH="$(python3 -c 'from sysconfig import get_paths; print(get_paths()["include"])')"
-# export PYTORCH_NPU_INSTALL_PATH=/usr/local/libtorch_npu/
-# export PYTORCH_INSTALL_PATH="$(python3 -c 'import torch, os; print(os.path.dirname(os.path.abspath(torch.__file__)))')"
-# export LIBTORCH_ROOT="$(python3 -c 'import torch, os; print(os.path.dirname(os.path.abspath(torch.__file__)))')"
-
-# export LD_LIBRARY_PATH=/usr/local/Ascend/ascend-toolkit/latest/opp/vendors/xllm/op_api/lib/:$LD_LIBRARY_PATH
-# export LD_LIBRARY_PATH=/usr/local/libtorch_npu/lib:$LD_LIBRARY_PATH
-export LD_PRELOAD=/usr/lib64/libjemalloc.so.2:$LD_PRELOAD
-
-# source /usr/local/Ascend/ascend-toolkit/set_env.sh
-# source /usr/local/Ascend/nnal/atb/set_env.sh
-
-##### 2, 配置日志相关环境变量
-rm -rf /root/ascend/log/
-rm -rf core.*
-
-##### 3. 配置性能、通信相关环境变量
-export PYTORCH_NPU_ALLOC_CONF=expandable_segments:True
-export NPU_MEMORY_FRACTION=0.96
-export ATB_WORKSPACE_MEM_ALLOC_ALG_TYPE=3
-export ATB_WORKSPACE_MEM_ALLOC_GLOBAL=1
-
-export OMP_NUM_THREADS=12
-export ALLOW_INTERNAL_FORMAT=1
-
-export ATB_LAYER_INTERNAL_TENSOR_REUSE=1
-export ATB_LLM_ENABLE_AUTO_TRANSPOSE=0
-export ATB_CONVERT_NCHW_TO_AND=1
-export ATB_LAUNCH_KERNEL_WITH_TILING=1
-export ATB_OPERATION_EXECUTE_ASYNC=2
-export ATB_CONTEXT_WORKSPACE_SIZE=0
-export INF_NAN_MODE_ENABLE=1
-export HCCL_EXEC_TIMEOUT=300
-export HCCL_CONNECT_TIMEOUT=300
-export HCCL_OP_EXPANSION_MODE="AIV"
-export HCCL_IF_BASE_PORT=2864
-```
-
-## 启动命令 - GLM-5 (W8A8权重可单机拉起)
-
-```bash
-BATCH_SIZE=256
-#推理最大batch数量
-XLLM_PATH="./myxllm/xllm/build/xllm/core/server/xllm"
-#推理入口文件路径(上一步中编译产物)
-MODEL_PATH=/path/to/GLM-5-W8A8/
-#模型路径(此处为int8量化的Glm-5)
-DRAFT_MODEL_PATH=/path/to/GLM-5-W8A8/GLM-5-W8A8-MTP/
-#Glm-5 导出的mtp权重
-
-MASTER_NODE_ADDR="11.87.49.110:10015"
-LOCAL_HOST="11.87.49.110"
-# Service Port
-START_PORT=18994
-START_DEVICE=0
-LOG_DIR="logs"
-NNODES=16
-
-for (( i=0; i<$NNODES; i++ ))
-do
- PORT=$((START_PORT + i))
- DEVICE=$((START_DEVICE + i))
- LOG_FILE="$LOG_DIR/node_$i.log"
- nohup numactl -C $((DEVICE*40))-$((DEVICE*40+39)) $XLLM_PATH \
- --model $MODEL_PATH \
- --port $PORT \
- --devices="npu:$DEVICE" \
- --master_node_addr=$MASTER_NODE_ADDR \
- --nnodes=$NNODES \
- --node_rank=$i \
- --max_memory_utilization=0.85 \
- --max_tokens_per_batch=8192 \
- --max_seqs_per_batch=32 \
- --block_size=128 \
- --enable_prefix_cache=false \
- --enable_chunked_prefill=true \
- --communication_backend="hccl" \
- --enable_schedule_overlap=true \
- --enable_graph=true \
+---
+title: "GLM5-W8A8"
+sidebar:
+ order: 2
+---
++ 源码地址:https://github.com/jd-opensource/xllm
+
++ 国内可用: https://gitcode.com/xLLM-AI/xllm
+
++ 权重下载: [modelscope-GLM-5-W8A8](https://www.modelscope.cn/models/Eco-Tech/GLM-5-W8A8-xLLM/files)
+
+## 1.拉取镜像环境
+
+首先下载xLLM提供的镜像:
+
+```bash
+# A2 x86
+docker pull quay.io/jd_xllm/xllm-ai:xllm-dev-a2-x86-20260306
+# A2 arm
+docker pull quay.io/jd_xllm/xllm-ai:xllm-dev-a2-arm-20260306
+# A3 arm
+docker pull quay.io/jd_xllm/xllm-ai:xllm-dev-a3-arm-20260306
+```
+
+**注意**: A2 机器性能未进行压测。
+
+然后创建对应的容器
+
+```bash
+sudo docker run -it --ipc=host -u 0 --privileged --name mydocker --network=host \
+ -v /var/queue_schedule:/var/queue_schedule \
+ -v /usr/local/Ascend/driver:/usr/local/Ascend/driver \
+ -v /usr/local/Ascend/add-ons/:/usr/local/Ascend/add-ons/ \
+ -v /usr/local/sbin/npu-smi:/usr/local/sbin/npu-smi \
+ -v /var/log/npu/conf/slog/slog.conf:/var/log/npu/conf/slog/slog.conf \
+ -v /var/log/npu/slog/:/var/log/npu/slog \
+ -v ~/.ssh:/root/.ssh \
+ -v /var/log/npu/profiling/:/var/log/npu/profiling \
+ -v /var/log/npu/dump/:/var/log/npu/dump \
+ -v /runtime/:/runtime/ -v /etc/hccn.conf:/etc/hccn.conf \
+ -v /export/home:/export/home \
+ -v /home/:/home/ \
+ -w /export/home \
+ quay.io/jd_xllm/xllm-ai:xllm-dev-hb-rc2-x86
+```
+
+## 2.拉取源码并编译
+
+下载官方仓库与模块依赖:
+
+```bash
+git clone https://github.com/jd-opensource/xllm
+cd xllm
+git checkout preview/glm-5
+git submodule init
+git submodule update
+```
+
+下载安装依赖:
+
+```bash
+pip install --upgrade pre-commit
+yum install numactl
+```
+
+执行编译,在`build/`下生成可执行文件`build/xllm/core/server/xllm`:
+
+```bash
+python setup.py build
+```
+
+## 3.启动模型
+
+### 若机器为重启后初次拉起服务,需先执行以下脚本对device进行初始化
+
+#若不执行且npu未初始化可能导致xllm进程拉起失败
+
+```bash
+python -c "import torch_npu
+for i in range(16):torch_npu.npu.set_device(i)"
+```
+
+### 环境变量
+
+```bash
+##### 1, 配置依赖路径相关环境变量
+# export PYTHON_INCLUDE_PATH="$(python3 -c 'from sysconfig import get_paths; print(get_paths()["include"])')"
+# export PYTHON_LIB_PATH="$(python3 -c 'from sysconfig import get_paths; print(get_paths()["include"])')"
+# export PYTORCH_NPU_INSTALL_PATH=/usr/local/libtorch_npu/
+# export PYTORCH_INSTALL_PATH="$(python3 -c 'import torch, os; print(os.path.dirname(os.path.abspath(torch.__file__)))')"
+# export LIBTORCH_ROOT="$(python3 -c 'import torch, os; print(os.path.dirname(os.path.abspath(torch.__file__)))')"
+
+# export LD_LIBRARY_PATH=/usr/local/Ascend/ascend-toolkit/latest/opp/vendors/xllm/op_api/lib/:$LD_LIBRARY_PATH
+# export LD_LIBRARY_PATH=/usr/local/libtorch_npu/lib:$LD_LIBRARY_PATH
+export LD_PRELOAD=/usr/lib64/libjemalloc.so.2:$LD_PRELOAD
+
+# source /usr/local/Ascend/ascend-toolkit/set_env.sh
+# source /usr/local/Ascend/nnal/atb/set_env.sh
+
+##### 2, 配置日志相关环境变量
+rm -rf /root/ascend/log/
+rm -rf core.*
+
+##### 3. 配置性能、通信相关环境变量
+export PYTORCH_NPU_ALLOC_CONF=expandable_segments:True
+export NPU_MEMORY_FRACTION=0.96
+export ATB_WORKSPACE_MEM_ALLOC_ALG_TYPE=3
+export ATB_WORKSPACE_MEM_ALLOC_GLOBAL=1
+
+export OMP_NUM_THREADS=12
+export ALLOW_INTERNAL_FORMAT=1
+
+export ATB_LAYER_INTERNAL_TENSOR_REUSE=1
+export ATB_LLM_ENABLE_AUTO_TRANSPOSE=0
+export ATB_CONVERT_NCHW_TO_AND=1
+export ATB_LAUNCH_KERNEL_WITH_TILING=1
+export ATB_OPERATION_EXECUTE_ASYNC=2
+export ATB_CONTEXT_WORKSPACE_SIZE=0
+export INF_NAN_MODE_ENABLE=1
+export HCCL_EXEC_TIMEOUT=300
+export HCCL_CONNECT_TIMEOUT=300
+export HCCL_OP_EXPANSION_MODE="AIV"
+export HCCL_IF_BASE_PORT=2864
+```
+
+## 启动命令 - GLM-5 (W8A8权重可单机拉起)
+
+```bash
+BATCH_SIZE=256
+#推理最大batch数量
+XLLM_PATH="./myxllm/xllm/build/xllm/core/server/xllm"
+#推理入口文件路径(上一步中编译产物)
+MODEL_PATH=/path/to/GLM-5-W8A8/
+#模型路径(此处为int8量化的Glm-5)
+DRAFT_MODEL_PATH=/path/to/GLM-5-W8A8/GLM-5-W8A8-MTP/
+#Glm-5 导出的mtp权重
+
+MASTER_NODE_ADDR="11.87.49.110:10015"
+LOCAL_HOST="11.87.49.110"
+# Service Port
+START_PORT=18994
+START_DEVICE=0
+LOG_DIR="logs"
+NNODES=16
+
+for (( i=0; i<$NNODES; i++ ))
+do
+ PORT=$((START_PORT + i))
+ DEVICE=$((START_DEVICE + i))
+ LOG_FILE="$LOG_DIR/node_$i.log"
+ nohup numactl -C $((DEVICE*40))-$((DEVICE*40+39)) $XLLM_PATH \
+ --model $MODEL_PATH \
+ --port $PORT \
+ --devices="npu:$DEVICE" \
+ --master_node_addr=$MASTER_NODE_ADDR \
+ --nnodes=$NNODES \
+ --node_rank=$i \
+ --max_memory_utilization=0.85 \
+ --max_tokens_per_batch=8192 \
+ --max_seqs_per_batch=32 \
+ --block_size=128 \
+ --enable_prefix_cache=false \
+ --enable_chunked_prefill=true \
+ --communication_backend="hccl" \
+ --enable_schedule_overlap=true \
+ --enable_graph=true \
--enable_graph_mode_decode_no_padding=true \
- --draft_model=$DRAFT_MODEL_PATH \
- --draft_devices="npu:$DEVICE" \
- --num_speculative_tokens=1 \
- --ep_size=8 \
- --dp_size=1 \
- > $LOG_FILE 2>&1 &
-done
-
-# numactl -C xxxxx 亲和性绑核(NUMA亲和性查询命令: npu-smi info -t topo)
-#--max_memory_utilization 单卡最大显存占用比例
-#--max_tokens_per_batch 单batch最大token数 (主要限制prefill)
-#--max_seqs_per_batch 单batch最大请求数 (主要限制decoe)
-#--communication_backend 通信backend 可选(hccl / lccl) 此处建议hccl
-#--enable_schedule_overlap 开启异步调度
-#--enable_prefix_cache 开启prefix_cache
-#--enable_chunked_prefill 开启chunked_prefill
-#--enable_graph 开启aclgraph
-#--draft_model mtp - mtp权重路径
-#--draft_devices mtp - mtp推理设备(与主模型同一)
-#--num_speculative_tokens mtp - 预测token数
-```
-
-日志出现"Brpc Server Started"表示服务成功拉起。
-
-## 其他可选环境变量
-
-```bash
-#开启确定性计算
-export LCCL_DETERMINISTIC=1
-export HCCL_DETERMINISTIC=true
-export ATB_MATMUL_SHUFFLE_K_ENABLE=0
-
-# #开启动态profiling模式
-# export PROFILING_MODE=dynamic
-# \rm -rf ~/dynamic_profiling_socket_*
-```
-
-## 启动命令 - 双机拉起样例
-
-### Node0 (master)
-
-```bash
-MASTER_NODE_ADDR="11.87.49.110:19990"
-LOCAL_HOST="11.87.49.110"
-START_PORT=15890
-START_DEVICE=0
-LOG_DIR="logs"
-NNODES=32
-LOCAL_NODES=16
-export HCCL_IF_BASE_PORT=48439
-unset HCCL_OP_EXPANSION_MODE
-
-for (( i=0; i<$LOCAL_NODES; i++ ))do
- PORT=$((START_PORT + i))
- DEVICE=$((START_DEVICE + i)); LOG_FILE="$LOG_DIR/node_$i.log"
- nohup numactl -C $((DEVICE*40))-$((DEVICE*40+39)) $XLLM_PATH \ --model $MODEL_PATH \
- --host $LOCAL_HOST \
- --port $PORT \
- --devices="npu:$DEVICE" \
- --master_node_addr=$MASTER_NODE_ADDR \
- --nnodes=$NNODES \
- --node_rank=$i \
- --max_memory_utilization=0.85 \
- --max_tokens_per_batch=8192 \
- --max_seqs_per_batch=4 \
- --block_size=128 \
- --enable_prefix_cache=false \
- --enable_chunked_prefill=true \
- --communication_backend="hccl" \
- --enable_schedule_overlap=true \
- --enable_graph=true \
+ --draft_model=$DRAFT_MODEL_PATH \
+ --draft_devices="npu:$DEVICE" \
+ --num_speculative_tokens=1 \
+ --ep_size=8 \
+ --dp_size=1 \
+ > $LOG_FILE 2>&1 &
+done
+
+# numactl -C xxxxx 亲和性绑核(NUMA亲和性查询命令: npu-smi info -t topo)
+#--max_memory_utilization 单卡最大显存占用比例
+#--max_tokens_per_batch 单batch最大token数 (主要限制prefill)
+#--max_seqs_per_batch 单batch最大请求数 (主要限制decoe)
+#--communication_backend 通信backend 可选(hccl / lccl) 此处建议hccl
+#--enable_schedule_overlap 开启异步调度
+#--enable_prefix_cache 开启prefix_cache
+#--enable_chunked_prefill 开启chunked_prefill
+#--enable_graph 开启aclgraph
+#--draft_model mtp - mtp权重路径
+#--draft_devices mtp - mtp推理设备(与主模型同一)
+#--num_speculative_tokens mtp - 预测token数
+```
+
+日志出现"Brpc Server Started"表示服务成功拉起。
+
+## 其他可选环境变量
+
+```bash
+#开启确定性计算
+export LCCL_DETERMINISTIC=1
+export HCCL_DETERMINISTIC=true
+export ATB_MATMUL_SHUFFLE_K_ENABLE=0
+
+# #开启动态profiling模式
+# export PROFILING_MODE=dynamic
+# \rm -rf ~/dynamic_profiling_socket_*
+```
+
+## 启动命令 - 双机拉起样例
+
+### Node0 (master)
+
+```bash
+MASTER_NODE_ADDR="11.87.49.110:19990"
+LOCAL_HOST="11.87.49.110"
+START_PORT=15890
+START_DEVICE=0
+LOG_DIR="logs"
+NNODES=32
+LOCAL_NODES=16
+export HCCL_IF_BASE_PORT=48439
+unset HCCL_OP_EXPANSION_MODE
+
+for (( i=0; i<$LOCAL_NODES; i++ ))do
+ PORT=$((START_PORT + i))
+ DEVICE=$((START_DEVICE + i)); LOG_FILE="$LOG_DIR/node_$i.log"
+ nohup numactl -C $((DEVICE*40))-$((DEVICE*40+39)) $XLLM_PATH \ --model $MODEL_PATH \
+ --host $LOCAL_HOST \
+ --port $PORT \
+ --devices="npu:$DEVICE" \
+ --master_node_addr=$MASTER_NODE_ADDR \
+ --nnodes=$NNODES \
+ --node_rank=$i \
+ --max_memory_utilization=0.85 \
+ --max_tokens_per_batch=8192 \
+ --max_seqs_per_batch=4 \
+ --block_size=128 \
+ --enable_prefix_cache=false \
+ --enable_chunked_prefill=true \
+ --communication_backend="hccl" \
+ --enable_schedule_overlap=true \
+ --enable_graph=true \
--enable_graph_mode_decode_no_padding=true \
- --ep_size=16 \
- --dp_size=1 \
- --rank_tablefile=/yourPath/ranktable.json \
- > $LOG_FILE 2>&1 &
-done
-```
-
-#### Node1 (worker)
-
-```bash
-MASTER_NODE_ADDR="11.87.49.110:19990"
-LOCAL_HOST="11.87.49.111"
-START_PORT=15890
-START_DEVICE=0
-LOG_DIR="logs"
-NNODES=32
-LOCAL_NODES=16
-export HCCL_IF_BASE_PORT=48439
-unset HCCL_OP_EXPANSION_MODE
-
-for (( i=0; i<$LOCAL_NODES; i++ ))do
- PORT=$((START_PORT + i))
- DEVICE=$((START_DEVICE + i)); LOG_FILE="$LOG_DIR/node_$i.log"
- nohup numactl -C $((DEVICE*40))-$((DEVICE*40+39)) $XLLM_PATH \ --model $MODEL_PATH \
- --host $LOCAL_HOST \
- --port $PORT \
- --devices="npu:$DEVICE" \
- --master_node_addr=$MASTER_NODE_ADDR \
- --nnodes=$NNODES \
- --node_rank=$((i + LOCAL_NODES)) \
- --max_memory_utilization=0.85 \
- --max_tokens_per_batch=8192 \
- --max_seqs_per_batch=4 \
- --block_size=128 \
- --enable_prefix_cache=false \
- --enable_chunked_prefill=true \
- --communication_backend="hccl" \
- --enable_schedule_overlap=true \
- --enable_graph=true \
+ --ep_size=16 \
+ --dp_size=1 \
+ --rank_tablefile=/yourPath/ranktable.json \
+ > $LOG_FILE 2>&1 &
+done
+```
+
+#### Node1 (worker)
+
+```bash
+MASTER_NODE_ADDR="11.87.49.110:19990"
+LOCAL_HOST="11.87.49.111"
+START_PORT=15890
+START_DEVICE=0
+LOG_DIR="logs"
+NNODES=32
+LOCAL_NODES=16
+export HCCL_IF_BASE_PORT=48439
+unset HCCL_OP_EXPANSION_MODE
+
+for (( i=0; i<$LOCAL_NODES; i++ ))do
+ PORT=$((START_PORT + i))
+ DEVICE=$((START_DEVICE + i)); LOG_FILE="$LOG_DIR/node_$i.log"
+ nohup numactl -C $((DEVICE*40))-$((DEVICE*40+39)) $XLLM_PATH \ --model $MODEL_PATH \
+ --host $LOCAL_HOST \
+ --port $PORT \
+ --devices="npu:$DEVICE" \
+ --master_node_addr=$MASTER_NODE_ADDR \
+ --nnodes=$NNODES \
+ --node_rank=$((i + LOCAL_NODES)) \
+ --max_memory_utilization=0.85 \
+ --max_tokens_per_batch=8192 \
+ --max_seqs_per_batch=4 \
+ --block_size=128 \
+ --enable_prefix_cache=false \
+ --enable_chunked_prefill=true \
+ --communication_backend="hccl" \
+ --enable_schedule_overlap=true \
+ --enable_graph=true \
--enable_graph_mode_decode_no_padding=true \
- --ep_size=16 \
- --dp_size=1 \
- --rank_tablefile=/yourPath/ranktable.json \
- > $LOG_FILE 2>&1 &
-done
-```
-
-#### ranktable样例
-
- ranktable配置指导:https://www.hiascend.com/document/detail/zh/canncommercial/83RC1/hccl/hcclug/hcclug_000014.html
-
-```json
-{
- "version": "1.0",
- "server_count": "2",
- "server_list": [
- {
- "server_id": "11.87.49.110",
- "device": [
- {
- "device_id": "0",
- "device_ip": "11.86.23.210",
- "rank_id": "0"
- },
- ...
- {
- "device_id": "7",
- "device_ip": "11.86.23.217",
- "rank_id": "7"
- }
- ],
- "host_nic_ip": "reserve"
- },
- {
- "server_id": "11.87.49.111",
- "device": [
- {
- "device_id": "0",
- "device_ip": "11.87.63.202",
- "rank_id": "8"
- },
- ...
- {
- "device_id": "7",
- "device_ip": "11.87.63.209",
- "rank_id": "15"
- }
- ],
- "host_nic_ip": "reserve"
- }
- ],
- "status": "completed"
-}
-```
-
-
-## device NUMA亲和性查看
-
-命令:
-
-```bash
-npu-smi info -t topo
-```
-
-前述命令中
-
-```bash
-numactl -C $((DEVICE*12))-$((DEVICE*12+11))
-```
-
-表示该进程绑在对应亲和的核上,可根据机器具体情况修改绑定的核id
-
-## EX3.Glm-5 权重量化
-
-### 安装msmodelslim
-
-```bash
-git clone https://gitcode.com/shenxiaolong/msmodelslim.git
-cd msmodelslim
-bash install.sh
-```
-
-### 修改tokenizer_config.json
-
-```bash
- "extra_special_tokens"
- 改成 "additional_special_tokens"
-
- "tokenizer_class": "TokenizersBackend"
- 改成 "tokenizer_class": "PreTrainedTokenizer"
-```
-
-### 基于GLM-5-BF16 权重量化W8A8权重
-
-```bash
-### 预处理mtp相关权重
-python example/GLM5/extract_mtp.py --model-dir ${model_path}
-
-#指定transformers版本
-pip install transformers==4.48.2
-
-#量化执行(生成量化权重)
-msmodelslim quant --model_path ${model_path} --save_path ${save_path} --model_type DeepSeek-V3.2 --quant_type w8a8 --trust_remote_code True
-
-#拷贝chat_template文件
-cp ${model_path}/chat_template.jinja ${save_path}
-
-#量化mtp权重导出(用于xllm推理)
-python example/GLM5/export_mtp.py --input-dir ${int8_save_path} --output-dir ${mtp_save_path}
-```
-
-## PD分离
-
-### etcd\xllm-service 安装
-
-#### PD分离部署
-
-`xllm`支持PD分离部署,这需要与另一个开源库[xllm service](https://github.com/jd-opensource/xllm-service)配套使用。
-
-##### xLLM Service依赖
-
-首先,我们下载安装`xllm service`,与安装编译`xllm`类似:
-
-```bash
-git clone https://github.com/jd-opensource/xllm-service
-cd xllm_service
-git submodule init
-git submodule update
-```
-
-##### etcd安装
-
-`xllm_service`依赖[etcd](https://github.com/etcd-io/etcd),使用etcd官方提供的[安装脚本](https://github.com/etcd-io/etcd/releases)进行安装,其脚本提供的默认安装路径是`/tmp/etcd-download-test/etcd`,我们可以手动修改其脚本中的安装路径,也可以运行完脚本之后手动迁移:
-
-```bash
-mv /tmp/etcd-download-test/etcd /path/to/your/etcd
-```
-
-##### xLLM Service编译
-
-先应用patch:
-
-```bash
-sh prepare.sh
-```
-
-再执行编译:
-
-```bash
-mkdir -p build
-cd build
-cmake ..
-make -j 8
-cd ..
-```
-
-!!! warning "可能的错误"
- 这里能会遇到关于`boost-locale`和`boost-interprocess`的安装错误:`vcpkg-src/packages/boost-locale_x64-linux/include: No such file or directory`,`/vcpkg-src/packages/boost-interprocess_x64-linux/include: No such file or directory`
- 我们使用`vcpkg`重新安装这些包:
- ```bash
- /path/to/vcpkg remove boost-locale boost-interprocess
- /path/to/vcpkg install boost-locale:x64-linux
- /path/to/vcpkg install boost-interprocess:x64-linux
- ```
-
-### PD分离运行
-
-启动etcd:
-
-```bash
-./etcd-download-test/etcd --listen-peer-urls 'http://localhost:2390' --listen-client-urls 'http://localhost:2389' --advertise-client-urls 'http://localhost:2391'
-```
-
-跨机配置时,etcd参考如下:
-
-```bash
-/tmp/etcd-download-test/etcd --listen-peer-urls 'http://0.0.0.0:3390' --listen-client-urls 'http://0.0.0.0:3389' --advertise-client-urls 'http://11.87.191.82:3389'
-```
-
-启动xllm service:
-
-```bash
-ENABLE_DECODE_RESPONSE_TO_SERVICE=true ./xllm_master_serving --etcd_addr="127.0.0.1:12389" --http_server_port 28888 --rpc_server_port 28889 --tokenizer_path=/export/home/models/GLM-5-W8A8/
-```
-
-跨机配置时,启动xllm service:
-
-```bash
-ENABLE_DECODE_RESPONSE_TO_SERVICE=true ../xllm-service/build/xllm_service/xllm_master_serving --etcd_addr="11.87.191.82:3389" --http_server_port 38888 --rpc_server_port 38889 --tokenizer_path=/export/home/models/GLM-5-W8A8/
-```
-- 启动Prefill实例
-```bash
- BATCH_SIZE=256
- #推理最大batch数量
- XLLM_PATH="./myxllm/xllm/build/xllm/core/server/xllm"
- #推理入口文件路径(上一步中编译产物)
- MODEL_PATH=/export/home/models/GLM-5-w8a8/
- #模型路径(此处为int量化的Glm-5)
- DRAFT_MODEL_PATH=/export/home/models/GLM-5-MTP/
-
- MASTER_NODE_ADDR="11.87.49.110:10015"
- LOCAL_HOST="11.87.49.110"
- # Service Port
- START_PORT=18994
- START_DEVICE=0
- LOG_DIR="logs"
- NNODES=16
-
- for (( i=0; i<$NNODES; i++ ))
- do
- PORT=$((START_PORT + i))
- DEVICE=$((START_DEVICE + i))
- LOG_FILE="$LOG_DIR/node_$i.log"
- nohup numactl -C $((i*40))-$((i*40+39)) $XLLM_PATH \
- --model $MODEL_PATH --model_id glmmoe \
- --host $LOCAL_HOST \
- --port $PORT \
- --devices="npu:$DEVICE" \
- --master_node_addr=$MASTER_NODE_ADDR \
- --nnodes=$NNODES \
- --node_rank=$i \
- --max_memory_utilization=0.86 \
- --max_tokens_per_batch=5000 \
- --max_seqs_per_batch=$BATCH_SIZE \
- --communication_backend=hccl \
- --enable_schedule_overlap=true \
- --enable_prefix_cache=false \
- --enable_chunked_prefill=false \
- --enable_graph=true \
- --draft_model $DRAFT_MODEL_PATH \
- --draft_devices="npu:$DEVICE" \
- --num_speculative_tokens 1 \
- --enable_disagg_pd=true \
- --instance_role=PREFILL \
- --etcd_addr=$LOCAL_HOST:3389 \
- --transfer_listen_port=$((36100 + i)) \
- --disagg_pd_port=8877 \
- > $LOG_FILE 2>&1 &
- done
-
- #--etcd_addr=$LOCAL_HOST:3389 参考etcd中advertise-client-urls的配置
- #--instance_role=DECODE PD配置,DECODE\PREFILL
- ```
-
-- 启动Decode实例
-
- ```bash
- BATCH_SIZE=256
- #推理最大batch数量
- XLLM_PATH="./myxllm/xllm/build/xllm/core/server/xllm"
- #推理入口文件路径(上一步中编译产物)
- MODEL_PATH=/export/home/models/GLM-5-w8a8/
- #模型路径(此处为int量化的Glm-5)
- DRAFT_MODEL_PATH=/export/home/models/GLM-5-MTP/
-
- MASTER_NODE_ADDR="11.87.49.110:10015"
- LOCAL_HOST="11.87.49.110"
- # Service Port
- START_PORT=18994
- START_DEVICE=0
- LOG_DIR="logs"
- NNODES=16
-
- for (( i=0; i<$NNODES; i++ ))
- do
- PORT=$((START_PORT + i))
- DEVICE=$((START_DEVICE + i))
- LOG_FILE="$LOG_DIR/node_$i.log"
- nohup numactl -C $((i*40))-$((i*40+39)) $XLLM_PATH \
- --model $MODEL_PATH --model_id glmmoe \
- --host $LOCAL_HOST \
- --port $PORT \
- --devices="npu:$DEVICE" \
- --master_node_addr=$MASTER_NODE_ADDR \
- --nnodes=$NNODES \
- --node_rank=$i \
- --max_memory_utilization=0.86 \
- --max_tokens_per_batch=5000 \
- --max_seqs_per_batch=$BATCH_SIZE \
- --communication_backend=hccl \
- --enable_schedule_overlap=true \
- --enable_prefix_cache=false \
- --enable_chunked_prefill=false \
- --enable_graph=true \
- --draft_model $DRAFT_MODEL_PATH \
- --draft_devices="npu:$DEVICE" \
- --num_speculative_tokens 1 \
- --enable_disagg_pd=true \
- --instance_role=DECODE \
- --etcd_addr=$LOCAL_HOST:3389 \
- --transfer_listen_port=$((36100 + i)) \
- --disagg_pd_port=8877 \
- > $LOG_FILE 2>&1 &
- done
-
- #--etcd_addr=$LOCAL_HOST:3389 参考etcd中advertise-client-urls的配置
- #--instance_role=DECODE PD配置,DECODE\PREFILL
- ```
-
- 需要注意:
-
-- PD分离需要读取`/etc/hccn.conf`文件,确保将物理机上的该文件映射到了容器中
-
-- `etcd_addr`需与`xllm_service`的`etcd_addr`相同
- 测试命令和上面类似,注意`curl http://localhost:{PORT}/v1/chat/completions ...`的`PORT`选择为启动xLLM service的`http_server_port`。
-
-- 多机部署P或者Q时(例如部署两个P),需要增加--rank_tablefile来完成通信。
+ --ep_size=16 \
+ --dp_size=1 \
+ --rank_tablefile=/yourPath/ranktable.json \
+ > $LOG_FILE 2>&1 &
+done
+```
+
+#### ranktable样例
+
+ ranktable配置指导:https://www.hiascend.com/document/detail/zh/canncommercial/83RC1/hccl/hcclug/hcclug_000014.html
+
+```json
+{
+ "version": "1.0",
+ "server_count": "2",
+ "server_list": [
+ {
+ "server_id": "11.87.49.110",
+ "device": [
+ {
+ "device_id": "0",
+ "device_ip": "11.86.23.210",
+ "rank_id": "0"
+ },
+ ...
+ {
+ "device_id": "7",
+ "device_ip": "11.86.23.217",
+ "rank_id": "7"
+ }
+ ],
+ "host_nic_ip": "reserve"
+ },
+ {
+ "server_id": "11.87.49.111",
+ "device": [
+ {
+ "device_id": "0",
+ "device_ip": "11.87.63.202",
+ "rank_id": "8"
+ },
+ ...
+ {
+ "device_id": "7",
+ "device_ip": "11.87.63.209",
+ "rank_id": "15"
+ }
+ ],
+ "host_nic_ip": "reserve"
+ }
+ ],
+ "status": "completed"
+}
+```
+
+## device NUMA亲和性查看
+
+命令:
+
+```bash
+npu-smi info -t topo
+```
+
+前述命令中
+
+```bash
+numactl -C $((DEVICE*12))-$((DEVICE*12+11))
+```
+
+表示该进程绑在对应亲和的核上,可根据机器具体情况修改绑定的核id
+
+## EX3.Glm-5 权重量化
+
+### 安装msmodelslim
+
+```bash
+git clone https://gitcode.com/shenxiaolong/msmodelslim.git
+cd msmodelslim
+bash install.sh
+```
+
+### 修改tokenizer_config.json
+
+```bash
+ "extra_special_tokens"
+ 改成 "additional_special_tokens"
+
+ "tokenizer_class": "TokenizersBackend"
+ 改成 "tokenizer_class": "PreTrainedTokenizer"
+```
+
+### 基于GLM-5-BF16 权重量化W8A8权重
+
+```bash
+### 预处理mtp相关权重
+python example/GLM5/extract_mtp.py --model-dir ${model_path}
+
+#指定transformers版本
+pip install transformers==4.48.2
+
+#量化执行(生成量化权重)
+msmodelslim quant --model_path ${model_path} --save_path ${save_path} --model_type DeepSeek-V3.2 --quant_type w8a8 --trust_remote_code True
+
+#拷贝chat_template文件
+cp ${model_path}/chat_template.jinja ${save_path}
+
+#量化mtp权重导出(用于xllm推理)
+python example/GLM5/export_mtp.py --input-dir ${int8_save_path} --output-dir ${mtp_save_path}
+```
+
+## PD分离
+
+### etcd\xllm-service 安装
+
+#### PD分离部署
+
+`xllm`支持PD分离部署,这需要与另一个开源库[xllm service](https://github.com/jd-opensource/xllm-service)配套使用。
+
+##### xLLM Service依赖
+
+首先,我们下载安装`xllm service`,与安装编译`xllm`类似:
+
+```bash
+git clone https://github.com/jd-opensource/xllm-service
+cd xllm_service
+git submodule init
+git submodule update
+```
+
+##### etcd安装
+
+`xllm_service`依赖[etcd](https://github.com/etcd-io/etcd),使用etcd官方提供的[安装脚本](https://github.com/etcd-io/etcd/releases)进行安装,其脚本提供的默认安装路径是`/tmp/etcd-download-test/etcd`,我们可以手动修改其脚本中的安装路径,也可以运行完脚本之后手动迁移:
+
+```bash
+mv /tmp/etcd-download-test/etcd /path/to/your/etcd
+```
+
+##### xLLM Service编译
+
+先应用patch:
+
+```bash
+sh prepare.sh
+```
+
+再执行编译:
+
+```bash
+mkdir -p build
+cd build
+cmake ..
+make -j 8
+cd ..
+```
+
+:::caution[可能的错误]
+这里能会遇到关于`boost-locale`和`boost-interprocess`的安装错误:`vcpkg-src/packages/boost-locale_x64-linux/include: No such file or directory`,`/vcpkg-src/packages/boost-interprocess_x64-linux/include: No such file or directory`
+我们使用`vcpkg`重新安装这些包:
+```bash
+/path/to/vcpkg remove boost-locale boost-interprocess
+/path/to/vcpkg install boost-locale:x64-linux
+/path/to/vcpkg install boost-interprocess:x64-linux
+```
+
+:::
+### PD分离运行
+
+启动etcd:
+
+```bash
+./etcd-download-test/etcd --listen-peer-urls 'http://localhost:2390' --listen-client-urls 'http://localhost:2389' --advertise-client-urls 'http://localhost:2391'
+```
+
+跨机配置时,etcd参考如下:
+
+```bash
+/tmp/etcd-download-test/etcd --listen-peer-urls 'http://0.0.0.0:3390' --listen-client-urls 'http://0.0.0.0:3389' --advertise-client-urls 'http://11.87.191.82:3389'
+```
+
+启动xllm service:
+
+```bash
+ENABLE_DECODE_RESPONSE_TO_SERVICE=true ./xllm_master_serving --etcd_addr="127.0.0.1:12389" --http_server_port 28888 --rpc_server_port 28889 --tokenizer_path=/export/home/models/GLM-5-W8A8/
+```
+
+跨机配置时,启动xllm service:
+
+```bash
+ENABLE_DECODE_RESPONSE_TO_SERVICE=true ../xllm-service/build/xllm_service/xllm_master_serving --etcd_addr="11.87.191.82:3389" --http_server_port 38888 --rpc_server_port 38889 --tokenizer_path=/export/home/models/GLM-5-W8A8/
+```
+- 启动Prefill实例
+```bash
+ BATCH_SIZE=256
+ #推理最大batch数量
+ XLLM_PATH="./myxllm/xllm/build/xllm/core/server/xllm"
+ #推理入口文件路径(上一步中编译产物)
+ MODEL_PATH=/export/home/models/GLM-5-w8a8/
+ #模型路径(此处为int量化的Glm-5)
+ DRAFT_MODEL_PATH=/export/home/models/GLM-5-MTP/
+
+ MASTER_NODE_ADDR="11.87.49.110:10015"
+ LOCAL_HOST="11.87.49.110"
+ # Service Port
+ START_PORT=18994
+ START_DEVICE=0
+ LOG_DIR="logs"
+ NNODES=16
+
+ for (( i=0; i<$NNODES; i++ ))
+ do
+ PORT=$((START_PORT + i))
+ DEVICE=$((START_DEVICE + i))
+ LOG_FILE="$LOG_DIR/node_$i.log"
+ nohup numactl -C $((i*40))-$((i*40+39)) $XLLM_PATH \
+ --model $MODEL_PATH --model_id glmmoe \
+ --host $LOCAL_HOST \
+ --port $PORT \
+ --devices="npu:$DEVICE" \
+ --master_node_addr=$MASTER_NODE_ADDR \
+ --nnodes=$NNODES \
+ --node_rank=$i \
+ --max_memory_utilization=0.86 \
+ --max_tokens_per_batch=5000 \
+ --max_seqs_per_batch=$BATCH_SIZE \
+ --communication_backend=hccl \
+ --enable_schedule_overlap=true \
+ --enable_prefix_cache=false \
+ --enable_chunked_prefill=false \
+ --enable_graph=true \
+ --draft_model $DRAFT_MODEL_PATH \
+ --draft_devices="npu:$DEVICE" \
+ --num_speculative_tokens 1 \
+ --enable_disagg_pd=true \
+ --instance_role=PREFILL \
+ --etcd_addr=$LOCAL_HOST:3389 \
+ --transfer_listen_port=$((36100 + i)) \
+ --disagg_pd_port=8877 \
+ > $LOG_FILE 2>&1 &
+ done
+
+ #--etcd_addr=$LOCAL_HOST:3389 参考etcd中advertise-client-urls的配置
+ #--instance_role=DECODE PD配置,DECODE\PREFILL
+ ```
+
+- 启动Decode实例
+
+ ```bash
+ BATCH_SIZE=256
+ #推理最大batch数量
+ XLLM_PATH="./myxllm/xllm/build/xllm/core/server/xllm"
+ #推理入口文件路径(上一步中编译产物)
+ MODEL_PATH=/export/home/models/GLM-5-w8a8/
+ #模型路径(此处为int量化的Glm-5)
+ DRAFT_MODEL_PATH=/export/home/models/GLM-5-MTP/
+
+ MASTER_NODE_ADDR="11.87.49.110:10015"
+ LOCAL_HOST="11.87.49.110"
+ # Service Port
+ START_PORT=18994
+ START_DEVICE=0
+ LOG_DIR="logs"
+ NNODES=16
+
+ for (( i=0; i<$NNODES; i++ ))
+ do
+ PORT=$((START_PORT + i))
+ DEVICE=$((START_DEVICE + i))
+ LOG_FILE="$LOG_DIR/node_$i.log"
+ nohup numactl -C $((i*40))-$((i*40+39)) $XLLM_PATH \
+ --model $MODEL_PATH --model_id glmmoe \
+ --host $LOCAL_HOST \
+ --port $PORT \
+ --devices="npu:$DEVICE" \
+ --master_node_addr=$MASTER_NODE_ADDR \
+ --nnodes=$NNODES \
+ --node_rank=$i \
+ --max_memory_utilization=0.86 \
+ --max_tokens_per_batch=5000 \
+ --max_seqs_per_batch=$BATCH_SIZE \
+ --communication_backend=hccl \
+ --enable_schedule_overlap=true \
+ --enable_prefix_cache=false \
+ --enable_chunked_prefill=false \
+ --enable_graph=true \
+ --draft_model $DRAFT_MODEL_PATH \
+ --draft_devices="npu:$DEVICE" \
+ --num_speculative_tokens 1 \
+ --enable_disagg_pd=true \
+ --instance_role=DECODE \
+ --etcd_addr=$LOCAL_HOST:3389 \
+ --transfer_listen_port=$((36100 + i)) \
+ --disagg_pd_port=8877 \
+ > $LOG_FILE 2>&1 &
+ done
+
+ #--etcd_addr=$LOCAL_HOST:3389 参考etcd中advertise-client-urls的配置
+ #--instance_role=DECODE PD配置,DECODE\PREFILL
+ ```
+
+ 需要注意:
+
+- PD分离需要读取`/etc/hccn.conf`文件,确保将物理机上的该文件映射到了容器中
+
+- `etcd_addr`需与`xllm_service`的`etcd_addr`相同
+ 测试命令和上面类似,注意`curl http://localhost:{PORT}/v1/chat/completions ...`的`PORT`选择为启动xLLM service的`http_server_port`。
+
+- 多机部署P或者Q时(例如部署两个P),需要增加--rank_tablefile来完成通信。
diff --git a/docs/en/supported_models.md b/docs/src/content/docs/zh/supported_models.md
similarity index 96%
rename from docs/en/supported_models.md
rename to docs/src/content/docs/zh/supported_models.md
index f8731093ea..5e5afcbefb 100644
--- a/docs/en/supported_models.md
+++ b/docs/src/content/docs/zh/supported_models.md
@@ -1,5 +1,8 @@
-# Model Support List
-
+---
+title: "模型支持列表"
+sidebar:
+ order: 20
+---
## LLM
| | NPU | MLU | ILU |
| ------------------------ | :---: | :---: | :---: |
@@ -32,14 +35,11 @@
| -------------- | :---: | :---: | :---: |
| Qwen3-Reranker | ✅ | ❌ | ❌ |
-
## DiT
| | NPU | MLU | ILU |
| ---- | :---: | :---: | :---: |
| Flux | ✅ | ❌ | ❌ |
-
-
## Rec
| | NPU | MLU | ILU |
| --- | :---: | :---: | :---: |
@@ -47,3 +47,4 @@
| Qwen2 | ✅ | ❌ | ❌ |
| Qwen2.5 | ✅ | ❌ | ❌ |
| Qwen3 | ✅ | ❌ | ❌ |
+
diff --git a/docs/src/pages/index.astro b/docs/src/pages/index.astro
new file mode 100644
index 0000000000..9023dd6295
--- /dev/null
+++ b/docs/src/pages/index.astro
@@ -0,0 +1,21 @@
+---
+const basePath = import.meta.env.BASE_URL.replace(/\/$/, '');
+const defaultLocalePath = `${basePath}/en/`;
+---
+
+
+
+
+
+
+
+
+ Redirecting to English docs
+
+
+
+ Redirecting to English docs
+
+
diff --git a/docs/src/styles/theme.css b/docs/src/styles/theme.css
new file mode 100644
index 0000000000..7792f2d617
--- /dev/null
+++ b/docs/src/styles/theme.css
@@ -0,0 +1,191 @@
+:root,
+::backdrop,
+:root[data-theme='light'],
+[data-theme='light'] ::backdrop {
+ --docs-theme-color: rgba(220, 38, 38, 0.8);
+ --sl-color-accent: var(--docs-theme-color);
+ --sl-color-accent-high: var(--docs-theme-color);
+ --sl-color-bg-accent: var(--docs-theme-color);
+ --sl-color-text-accent: var(--docs-theme-color);
+ --sl-content-width: 60rem;
+}
+
+.sidebar-pane a > span:first-child,
+.sidebar-pane summary .group-label {
+ display: inline-block;
+ transform: scale(1);
+ transform-origin: left center;
+ transition:
+ color 160ms ease,
+ transform 220ms cubic-bezier(0.34, 1.56, 0.64, 1);
+}
+
+.sidebar-pane summary .group-label .large {
+ transition: color 160ms ease;
+}
+
+.sidebar-pane a:is(:hover, :focus-visible),
+.sidebar-pane summary:is(:hover, :focus-visible),
+.sidebar-pane a:is(:hover, :focus-visible) > span:first-child,
+.sidebar-pane summary:is(:hover, :focus-visible) .group-label,
+.sidebar-pane summary:is(:hover, :focus-visible) .group-label .large {
+ color: rgba(220, 38, 38, 1) !important;
+}
+
+.sidebar-pane a:is(:hover, :focus-visible) > span:first-child,
+.sidebar-pane summary:is(:hover, :focus-visible) .group-label {
+ transform: scale(1.035);
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .sidebar-pane a > span:first-child,
+ .sidebar-pane summary .group-label,
+ .sidebar-pane summary .group-label .large {
+ transition: color 160ms ease;
+ }
+
+ .sidebar-pane a:is(:hover, :focus-visible) > span:first-child,
+ .sidebar-pane summary:is(:hover, :focus-visible) .group-label {
+ transform: none;
+ }
+}
+
+starlight-toc a > span {
+ display: inline-block;
+ transform: scale(1);
+ transform-origin: left center;
+ transition:
+ color 160ms ease,
+ transform 220ms cubic-bezier(0.34, 1.56, 0.64, 1);
+}
+
+starlight-toc a:is(:hover, :focus-visible) {
+ color: rgba(220, 38, 38, 0.8);
+}
+
+starlight-toc a[aria-current='true'],
+starlight-toc a[aria-current='true']:is(:hover, :focus-visible) {
+ color: rgba(220, 38, 38, 1) !important;
+}
+
+starlight-toc a:is(:hover, :focus-visible) > span {
+ transform: scale(1.035);
+}
+
+header.header .language-menu {
+ position: relative;
+}
+
+header.header .language-menu summary {
+ align-items: center;
+ background-clip: padding-box;
+ border: 1px solid transparent;
+ border-radius: 0.625rem;
+ color: var(--sl-color-gray-2);
+ cursor: pointer;
+ display: flex;
+ font-size: var(--sl-text-sm);
+ font-weight: 500;
+ gap: 0.35rem;
+ line-height: 1;
+ list-style: none;
+ padding: 0.55rem 0.75rem;
+ transform: scale(1);
+ transform-origin: center;
+ transition:
+ background-color 160ms ease,
+ border-color 160ms ease,
+ color 160ms ease,
+ transform 260ms cubic-bezier(0.34, 1.56, 0.64, 1);
+ user-select: none;
+ white-space: nowrap;
+ will-change: transform;
+}
+
+header.header .language-menu summary::-webkit-details-marker {
+ display: none;
+}
+
+header.header .language-menu summary:is(:hover, :focus-visible),
+header.header .language-menu[open] summary {
+ background-color: color-mix(in srgb, var(--sl-color-accent) 8%, transparent);
+ border-color: color-mix(in srgb, var(--sl-color-accent) 26%, transparent);
+ color: var(--sl-color-text-accent);
+ transform: scale(1.045);
+}
+
+header.header .language-menu svg {
+ fill: none;
+ flex: 0 0 auto;
+ height: 1rem;
+ stroke: currentColor;
+ stroke-linecap: round;
+ stroke-linejoin: round;
+ stroke-width: 2;
+ width: 1rem;
+}
+
+header.header .language-menu .chevron-icon {
+ transition: transform 160ms ease;
+}
+
+header.header .language-menu[open] .chevron-icon {
+ transform: rotate(180deg);
+}
+
+header.header .language-options {
+ background-color: color-mix(in srgb, var(--sl-color-bg-nav) 96%, transparent);
+ border: 1px solid var(--sl-color-gray-5);
+ border-radius: 0.625rem;
+ box-shadow: 0 0.85rem 2rem rgba(0, 0, 0, 0.12);
+ display: grid;
+ gap: 0.125rem;
+ inset-block-start: calc(100% + 0.4rem);
+ inset-inline-end: 0;
+ min-width: 100%;
+ padding: 0.25rem;
+ position: absolute;
+ z-index: calc(var(--sl-z-index-navbar) + 1);
+}
+
+header.header .language-options a {
+ border-radius: 0.5rem;
+ color: var(--sl-color-gray-2);
+ font-size: var(--sl-text-sm);
+ font-weight: 500;
+ line-height: 1;
+ padding: 0.55rem 0.75rem;
+ text-align: start;
+ text-decoration: none;
+ white-space: nowrap;
+}
+
+header.header .language-options a:is(:hover, :focus-visible),
+header.header .language-options a[aria-current='true'] {
+ background-color: color-mix(in srgb, var(--sl-color-accent) 10%, transparent);
+ color: var(--sl-color-text-accent);
+ outline: none;
+}
+
+@media (prefers-reduced-motion: reduce) {
+ starlight-toc a > span {
+ transition: color 160ms ease;
+ }
+
+ starlight-toc a:is(:hover, :focus-visible) > span,
+ header.header .language-menu summary:is(:hover, :focus-visible),
+ header.header .language-menu[open] summary {
+ transform: none;
+ }
+
+ header.header .language-menu summary {
+ transition:
+ background-color 160ms ease,
+ border-color 160ms ease,
+ color 160ms ease;
+ }
+
+ header.header .language-menu .chevron-icon {
+ transition: none;
+ }
+}
diff --git a/docs/tsconfig.json b/docs/tsconfig.json
new file mode 100644
index 0000000000..8bf91d3bb9
--- /dev/null
+++ b/docs/tsconfig.json
@@ -0,0 +1,5 @@
+{
+ "extends": "astro/tsconfigs/strict",
+ "include": [".astro/types.d.ts", "**/*"],
+ "exclude": ["dist"]
+}
diff --git a/docs/zh/.readthedocs.yaml b/docs/zh/.readthedocs.yaml
deleted file mode 100644
index 275f89f6f0..0000000000
--- a/docs/zh/.readthedocs.yaml
+++ /dev/null
@@ -1,28 +0,0 @@
-# Read the Docs configuration file
-# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details
-
-# Required
-version: 2
-
-# Set the OS, Python version, and other tools you might need
-build:
- os: ubuntu-24.04
- tools:
- python: "3.13"
- jobs:
- pre_build:
- # - cp -r docs/zh/* docs/
- - mv docs/zh/* docs/
- - rm -rf docs/en/
- - find docs/ -name "*.md" -exec sed -i 's#../assets/#assets/#g' {} \;
-
-# Build documentation with Mkdocs
-mkdocs:
- configuration: mkdocs_zh.yml
-
-# Optionally, but recommended,
-# declare the Python requirements required to build your documentation
-# See https://docs.readthedocs.io/en/stable/guides/reproducible-builds.html
-python:
- install:
- - requirements: docs/requirements.txt
\ No newline at end of file
diff --git a/docs/zh/accuracy_test.md b/docs/zh/accuracy_test.md
deleted file mode 100644
index c78e883067..0000000000
--- a/docs/zh/accuracy_test.md
+++ /dev/null
@@ -1,58 +0,0 @@
-# 1. LLM精度测试
-## 1.1 设置ais_bench
-```bash
-# 使用conda或uv为ais_bench创建虚拟环境
-conda create --name ais_bench python=3.10 -y
-conda activate ais_bench
-
-# 下载ais_bench并安装依赖
-git clone https://gitee.com/aisbench/benchmark.git
-cd benchmark/
-pip3 install -e ./ --use-pep517
-
-# 下载数据集并复制到ais_bench目录下
-cp -r /path/to/dataset /path/to/benchmark/ais_bench/datasets
-```
-
-## 1.2 修改配置
-根据实际情况修改精度测试配置文件:`/path/to/benchmark/ais_bench/benchmark/configs/models/vllm_api/vllm_api_general_chat.py`,采样参数建议按如下代码设置:
-```python
-models = [
- dict(
- attr="service",
- type=VLLMCustomAPIChat,
- abbr='vllm-api-general-chat',
- path="/path/to/model/Qwen3-8B", # 模型路径
- model="Qwen3-8B", # 模型名称
- request_rate = 0,
- retry = 2,
- host_ip = "127.0.0.1",
- host_port = 19000, # xllm服务端端口
- max_out_len = 32768, # 限制模型最大长度
- batch_size=32,
- trust_remote_code=False,
- generation_kwargs = dict(
- temperature = 0.6,
- # top_k = -1,
- top_p = 0.95,
- # seed = None,
- # repetition_penalty = 1,
- ),
- pred_postprocessor=dict(type=extract_non_reasoning_content)
- )
-]
-```
-
-## 1.3 启动ais_bench
-在使用ais_bench前需要先启动xllm服务。使用`ais_bench -h`能够获取参数含义,对于gsm8k和ceval数据集的启动命令如下:
-```bash
-# 使用gsm8k数据集
-ais_bench --models vllm_api_general_chat --datasets gsm8k_gen_0_shot_cot_chat_prompt --dump-eval-details
-
-# 使用ceval数据集
-ais_bench --models vllm_api_general_chat --datasets ceval_gen_0_shot_cot_chat_prompt --merge-ds --dump-eval-details
-```
-
-我们会在未来将ais_bench和数据集(ceval和gsm8k)集成进开发镜像,ais_bench文档和数据集如下:
-* [ais_bench文档](https://ais-bench-benchmark.readthedocs.io/zh-cn/latest/index.html)
-* [数据集](https://ais-bench-benchmark.readthedocs.io/zh-cn/latest/base_tutorials/all_params/datasets.html)
diff --git a/docs/zh/features/basics.md b/docs/zh/features/basics.md
deleted file mode 100644
index 919757e4b7..0000000000
--- a/docs/zh/features/basics.md
+++ /dev/null
@@ -1,9 +0,0 @@
-# 基础知识
-
-- xLLM使用一卡一进程模式,多卡之间使用rpc进行函数调用,模型计算过程中的数据通信使用device集合通信库。
-
-- HCCL/LCCL是高性能集合通信,提供单机多卡以及多机多卡间的数据并行、模型并行集合通信方案。
-
-
-
-
diff --git a/docs/zh/features/continuous_scheduler.md b/docs/zh/features/continuous_scheduler.md
deleted file mode 100644
index d8461ff8cd..0000000000
--- a/docs/zh/features/continuous_scheduler.md
+++ /dev/null
@@ -1,7 +0,0 @@
-# Continuous调度器
-
-## 功能介绍
-xLLM实现了支持continuous batching的调度策略,continuous_batch是一种动态批处理策略,它不等待批次填满,而是在有请求时就开始处理,同时持续接收新请求并将其加入正在执行的批次中,从而在保持高吞吐量的同时显著降低延迟。
-
-## 使用方式
-xLLM提供了continuous batching调度策略。目前`enable_chunked_prefill`默认值为true,开箱即用时默认调度器是chunked prefill调度器。
diff --git a/docs/zh/features/groupgemm.md b/docs/zh/features/groupgemm.md
deleted file mode 100644
index 2993c3d9d5..0000000000
--- a/docs/zh/features/groupgemm.md
+++ /dev/null
@@ -1,41 +0,0 @@
-# GroupGEMM算子优化
-
-# 背景
-混合专家(Mixture of Experts, MoE)架构已成为扩展大规模语言模型的重要范式,其核心思想是将输入token动态路由至不同的专家子网络进行处理。在推理过程中,GroupGEMM算子是MoE架构的关键计算单元,负责高效执行多个专家矩阵乘法的并行计算,且在整个推理耗时中占据主导地位。
-
-## 功能介绍
-结合当前GroupGEMM的性能瓶颈为I/O受限,提出了一种优化方案,通过索引重排替代数据拷贝,取消了对token向量的多次复制,改为维护专家分配的索引表。通过该行号索引,直接将token映射到相应的专家计算单元,并将token的分配调度与矩阵乘法融合为一个单一的kernel。
-
-
-## 用户接口
-
-### 算子直调API
-```c++
-aclnnStatus aclnnIndexGroupMatmulGetWorkspaceSize(
- const aclTensorList *x,
- const aclTensorList *weight,
- const aclTensorList *scale,
- const aclTensorList *perTokenScale,
- const aclTensor *groupList,
- const aclTensorList *out,
- uint64_t *workspaceSize,
- aclOpExecutor **executor);
-
-aclnnStatus aclnnIndexGroupMatmul(
- void *workspace,
- uint64_t workspaceSize,
- aclOpExecutor *executor,
- aclrtStream stream);
-```
-
-- `x`: 输入的张量列表,包含待处理的数据。
-- `weight`: 权重张量,包含模型的参数。
-- `scale`: 缩放因子,用于调整输入张量的值。
-- `perTokenScale`:每个token的缩放因子,用于动态调整。
-- `groupList`: 专家组列表,指示哪些专家参与计算。
-- `out`: 输出张量列表,存储计算结果。
-
-## 性能效果
-
-
-* 优化后的GroupMatmul算子在计算时间上表现出明显的优势,尤其是在k为128,m为64情况下,如图所示,优化后算子计算延时 **减少50%**。
diff --git a/docs/zh/features/multimodal.md b/docs/zh/features/multimodal.md
deleted file mode 100755
index e786493260..0000000000
--- a/docs/zh/features/multimodal.md
+++ /dev/null
@@ -1,19 +0,0 @@
-# 多模态支持
-本文档主要介绍xLLM推理引擎中多模态的支持进展,包括支持模型及模态类型,以及离在线接口等。
-
-## 支持模型
-- Qwen2.5-VL: 包括7B/32B/72B。
-- Qwen3-VL: 包括2B/4B/8B/32B。
-- Qwen3-VL-MoE: 包括A3B/A22B。
-- MiniCPM-V-2_6: 7B。
-
-## 模态类型
-- 图片: 支持单图、多图的输入,以及图片+Prompt组合、纯文本Promot等输入方式。
-
-
-!!! warning "注意事项"
- - 目前多模态后端不支持prefix cache以及chunk prefill,正在支持中。
- - 目前,xLLM统一基于JinJa渲染ChatTemplate,部署MiniCPM-V-2_6,模型目录需提供ChatTemplate文件。
- - 图片支持Base64输入以及图片Url。
- - 目前多模态模型主要支持了图片模态,视频、音频等模态正在推进中。
-
diff --git a/docs/zh/features/overview.md b/docs/zh/features/overview.md
deleted file mode 100644
index 197c688991..0000000000
--- a/docs/zh/features/overview.md
+++ /dev/null
@@ -1,57 +0,0 @@
-# 整体架构
-
-## 背景
-
-近年来,随着百亿至万亿参数规模的大语言模型(如GPT、Claude、DeepSeek、LLaMA等)在自然语言处理和多模态交互领域取得突破性进展,产业界对高效推理引擎与服务体系的构建提出了迫切需求。如何降低集群推理成本、提升推理效率已成为实现规模化商业落地的关键挑战。
-
-尽管当前已涌现出一批面向大模型推理的优化引擎,但在实际部署过程中仍面临诸多技术瓶颈:
-
-- 硬件适配性挑战:现有推理引擎对国产芯片等专用加速器的架构特性支持不足,难以充分发挥异构计算硬件的性能潜力,导致计算资源利用率低下;
-- MoE架构优化难题:专家并行机制中的令牌分发过程产生显著的All-to-All通信开销,同时动态路由策略引发的专家负载不均衡问题严重制约了系统的可扩展性;
-- 长上下文管理瓶颈:随着模型上下文窗口持续扩展,KV缓存在内存碎片化处理、跨节点同步等方面的优化效率直接影响整体推理吞吐性能;
-- 混合部署效能局限:现有推理集群在同时处理在线服务和离线任务时,难以兼顾服务质量(SLO)保障与资源利用率优化。
-- 动态PD适配不足:当输入/输出序列长度出现剧烈波动时,静态PD资源划分缺乏实时调整PD资源配置的能力,既可能导致GPU资源闲置,又存在SLO违约风险。
-
-为此,我们提出了xLLM——高效且易用的开源智能推理框架,为模型在国产芯片上的推理提供企业级服务保障与高性能引擎计算能力。
-## 功能介绍
-
-xLLM提供智能计算能力,我们实现了多种计算系统层和算法驱动层的联合推理加速:
-
-### 计算系统层
-
-#### 多层流水线执行编排
-在框架层异步化CPU调度,使其与芯片推理计算形成流水线,减少计算空泡;在模型图层,切分单个batch,形成两个micro-batches之间的流水线,重叠计算通信;在算子内核层,不同计算单元间流水,重叠计算访存。
-#### 动态shape的图执行优化
-针对大语言模型处理动态输入(如可变序列长度和批大小)时面临的静态图适配问题,xLLM通过参数化设计捕获输入维度实现动态适配,并结合多图缓存方案减小编译开销,使用受管控的显存池替代绝对地址保障安全复用,最终在保持高灵活性的同时获得较高的执行效率。
-#### 算子优化
-xLLM实现了LLM中的关键算子在国产硬件芯片上的特定优化,包括GroupMatmul、Chunked Prefill等。
-#### xTensor显存管理
-xTensor 显存管理框架采用 物理内存页池预分配 + 虚拟地址连续性映射 的方法,通过动态按需映射物理页、复用可重用内存页(Reusable)及异步预映射优化调度,结合 NPU 算子适配(如虚拟地址化 FlashMLA),实现了高效动态内存管理,取得了内存利用率提升以及延迟降低。
-
-### 算法驱动层
-
-#### PD分离
-xLLM全面支持PD分离场景,实现了高效的PD实例的管理以及PD实例之间的通信以及kv cache传输。
-
-#### 全局调度
-xLLM对请求和实例做全周期的资源调度智能管理。
-##### 实例调度
-我们实现了多种实例调度策略来选择如何将实例分配到更适合的实例。包括简单的Round Robin策略,基于请求在各实例上的 prefix cache 命中率来选择的 prefix cache-aware 策略,基于实例上的显存空闲程度的 KV Cache-aware 策略。另外,针对PD分离场景,由于静态的PD比例往往无法很好应对流量以及请求输入输出长度突变的场景,我们实现了一种自适应的PD动态调度器,负责在线请求的全局实例分配与运行时PD动态调整。
-##### 请求调度
-我们实现了多种请求调度策略,支持continuous batching,包括chunked prefill,prefill优先和decode优先等batch策略,同时全面支持PD分离场景。
-#### 全局kv cache管理
-在全局层面采用ETCD作为元数据服务中间件,实现集群服务注册、负载信息同步及全局缓存状态管理。每个计算实例维护本地多级缓存池。在调度策略方面,系统采用基于 KV Cache 的动态决策机制:首先进行前缀匹配检测,计算各候选节点的 KV Cache 复用率,最终选择综合性能最优的节点进行处理,实现 KV Cache 的动态卸载与迁移。
-
-#### 投机推理
-xLLM内置优化后的投机推理算法,一次生成多个tokens提升吞吐。xLLM通过投机模块下沉减少通信成本,并使用调度和计算时序重叠优化、减少投机场景算子数据搬运等方式优化投机推理计算。
-#### MOE负载均衡
-xLLM针对MoE模型实现了基于历史专家负载统计的专家权重更新,在推理时通过高效专家负责统计和双缓冲无感知的专家权重更新实现有效的动态负载均衡。
-
-### 多模态支持
-
-xLLM对包括Qwen2-VL,MiniCPMV在内的多种多模态模型提供全面的支持。
-
-### 相关设计文档
-
-- [Graph Mode 设计文档](../design/graph_mode_design.md)
-- [生成式推荐设计文档](../design/generative_recommendation_design.md)
diff --git a/docs/zh/features/ppmatmul.md b/docs/zh/features/ppmatmul.md
deleted file mode 100644
index 038e931dad..0000000000
--- a/docs/zh/features/ppmatmul.md
+++ /dev/null
@@ -1,36 +0,0 @@
-# PpMatmul 算子优化
-
-## 背景
-
-针对大模型推理中矩阵乘法占比高、耗时长的问题,优化了矩阵乘法算子的实现。
-
-## 功能介绍
-
-PpMatmul 算子使用 Tiling 切分策略,将矩阵乘法分解为多个小的矩阵乘法任务。然而当 tile 数量较小时任务无法被均匀分配到所有 npu 核心上,导致 tail effect 问题,影响计算效率。我们通过预取内存或重新划分任务的方式,优化 PpMatmul 算子的性能。
-
-## 用户接口
-
-### 算子直调 API
-
-```cpp
-aclnnStatus aclnnPpMatmulOptGetWorkspaceSize(
- const aclTensor *a,
- const aclTensor *b,
- const aclTensor *out,
- uint64_t *workspaceSize,
- aclOpExecutor **executor);
-
-aclnnStatus aclnnPpMatmulOpt(
- void *workspace,
- uint64_t workspaceSize,
- aclOpExecutor *executor,
- aclrtStream stream);
-```
-
-- `a`: 输入矩阵 A。
-- `b`: 输入矩阵 B。
-- `out`: 输出矩阵,存储计算结果。
-
-## 性能效果
-
-对于 tile 数量较小的情况(例如 M 较小,对应于 batch size 较小的情况),在(TP=4)时,算子较优化前有 **18%** 的性能提升。
\ No newline at end of file
diff --git a/docs/zh/features/topk_topP.md b/docs/zh/features/topk_topP.md
deleted file mode 100644
index 4ba2a78108..0000000000
--- a/docs/zh/features/topk_topP.md
+++ /dev/null
@@ -1,27 +0,0 @@
-# Topk&Topp算子优化
-
-## 背景
-在自然语言生成任务中,topK和topP采样策略被广泛应用于控制生成文本的多样性和质量。然而,在小模型中,这两种策略的计算耗时相对较长。这主要是由于小模型的参数较少,导致在处理概率分布时,排序和筛选的效率降低,从而影响了生成速度。因此,优化小模型中topK和topP的实现,可以提升其采样效率。
-
-
-## 功能介绍
-
-topKtopP算子的实现将排序、topK、softmax和topP等多个小算子融合为一个大算子,从而提高了计算效率和性能。
-
-
-## 用户接口
-### 算子调用API
-```c++
-void top_k_top_p(torch::Tensor& logits,
- const torch::Tensor& topK,
- const torch::Tensor& topP);
-```
-
-- `logits`: 输入的logits张量,包含模型的输出分数。
-- `topK`: 用于选择的前K个概率的阈值张量。
-- `topP`: 用于选择的累积概率的阈值张量。
-
-
-## 性能效果
-
-* 使用topKtopP融合算子后,在qwen2-0.5B模型中,TTOT **下降37%**,TTFT **提升10%**。
diff --git a/docs/zh/getting_started/disagg_pd.md b/docs/zh/getting_started/disagg_pd.md
deleted file mode 100644
index 1efe40cc98..0000000000
--- a/docs/zh/getting_started/disagg_pd.md
+++ /dev/null
@@ -1,88 +0,0 @@
-# PD分离部署
-
-`xllm`支持PD分离部署,这需要与我们的另一个开源库[xllm service](https://github.com/jd-opensource/xllm-service)配套使用。
-## xLLM Service依赖
-首先,我们下载安装`xllm service`,与安装编译`xllm`类似:
-```bash
-git clone https://github.com/jd-opensource/xllm-service
-cd xllm_service
-git submodule init
-git submodule update
-```
-### etcd安装
-`xllm_service`依赖[etcd](https://github.com/etcd-io/etcd),使用etcd官方提供的[安装脚本](https://github.com/etcd-io/etcd/releases)进行安装,其脚本提供的默认安装路径是`/tmp/etcd-download-test/etcd`,我们可以手动修改其脚本中的安装路径,也可以运行完脚本之后手动迁移:
-```bash
-mv /tmp/etcd-download-test/etcd /path/to/your/etcd
-```
-### xLLM Service编译
-先应用patch:
-```bash
-sh prepare.sh
-```
-
-再执行编译:
-```bash
-mkdir -p build
-cd build
-cmake ..
-make -j 8
-cd ..
-```
-!!! warning "可能的错误"
- 这里能会遇到关于`boost-locale`和`boost-interprocess`的安装错误:`vcpkg-src/packages/boost-locale_x64-linux/include: No such file or directory`,`/vcpkg-src/packages/boost-interprocess_x64-linux/include: No such file or directory`
- 我们使用`vcpkg`重新安装这些包:
- ```bash
- /path/to/vcpkg remove boost-locale boost-interprocess
- /path/to/vcpkg install boost-locale:x64-linux
- /path/to/vcpkg install boost-interprocess:x64-linux
- ```
-## PD分离运行
-启动etcd:
-```bash
-./etcd-download-test/etcd --listen-peer-urls 'http://localhost:2390' --listen-client-urls 'http://localhost:2389' --advertise-client-urls 'http://localhost:2391'
-```
-启动xllm service:
-```bash
-ENABLE_DECODE_RESPONSE_TO_SERVICE=true ./xllm_master_serving --etcd_addr="127.0.0.1:12389" --http_server_port 28888 --rpc_server_port 28889 --tokenizer_path=/path/to/tokenizer_config_dir/
-```
-
-以Qwen2-7B为例
-
-- 启动Prefill实例
- ```bash
- /path/to/xllm --model=path/to/Qwen2-7B-Instruct \
- --port=8010 \
- --devices="npu:0" \
- --master_node_addr="127.0.0.1:18888" \
- --enable_prefix_cache=false \
- --enable_chunked_prefill=false \
- --enable_disagg_pd=true \
- --instance_role=PREFILL \
- --etcd_addr=127.0.0.1:12389 \
- --transfer_listen_port=26000 \
- --disagg_pd_port=7777 \
- --node_rank=0 \
- --nnodes=1
- ```
-- 启动Decode实例
- ```bash
- /path/to/xllm --model=path/to/Qwen2-7B-Instruct \
- --port=8020 \
- --devices="npu:1" \
- --master_node_addr="127.0.0.1:18898" \
- --enable_prefix_cache=false \
- --enable_chunked_prefill=false \
- --enable_disagg_pd=true \
- --instance_role=DECODE \
- --etcd_addr=127.0.0.1:12389 \
- --transfer_listen_port=26100 \
- --disagg_pd_port=7787 \
- --node_rank=0 \
- --nnodes=1
- ```
-需要注意:
-
-- PD分离需要读取`/etc/hccn.conf`文件,确保将物理机上的该文件映射到了容器中
-- `etcd_addr`需与`xllm_service`的`etcd_addr`相同
-
-测试命令和上面类似,注意`curl http://localhost:{PORT}/v1/chat/completions ...`的`PORT`选择为启动xLLM service的`http_server_port`。
\ No newline at end of file
diff --git a/docs/zh/xLLM_Technical_Report_zh.pdf b/docs/zh/xLLM_Technical_Report_zh.pdf
deleted file mode 100644
index afb3b25df0..0000000000
Binary files a/docs/zh/xLLM_Technical_Report_zh.pdf and /dev/null differ
diff --git a/mkdocs_en.yml b/mkdocs_en.yml
deleted file mode 100644
index 0a5bdb0547..0000000000
--- a/mkdocs_en.yml
+++ /dev/null
@@ -1,228 +0,0 @@
-site_name: xLLM
-site_url: !ENV READTHEDOCS_CANONICAL_URL
-
-# Repository
-repo_name: jd-opensource/xllm
-repo_url: https://github.com/jd-opensource/xllm
-
-edit_uri: edit/main/docs/en
-use_directory_urls: true
-# Copyright
-copyright: Copyright © 2025 xLLM Team
-# docs_dir: docs/en
-# Configuration
-theme:
- name: material
- language: en
- custom_dir: docs/mkdocs/overrides
- features:
- - announce.dismiss
- - content.action.edit
- - content.action.view
- - content.code.annotate
- - content.code.copy
- - content.code.select
- - content.footnote.tooltips
- # - content.tabs.link
- - content.tooltips
- # - header.autohide
- - navigation.expand
- - navigation.footer
- - navigation.indexes
- - navigation.path
- # - navigation.instant
- # - navigation.instant.prefetch
- # - navigation.instant.progress
- # - navigation.prune
- - navigation.sections
- - navigation.tabs
- # - navigation.tabs.sticky
- - navigation.top
- - navigation.tracking
- - search.highlight
- - search.share
- - search.suggest
- - toc.follow
- # - toc.integrate
- palette:
- - media: "(prefers-color-scheme)"
- toggle:
- icon: material/link
- name: Switch to light mode
- - media: "(prefers-color-scheme: light)"
- scheme: default
- primary: custom
- accent: custom
- toggle:
- # icon: material/toggle-switch
- icon: material/eye
- name: Switch to dark mode
- - media: "(prefers-color-scheme: dark)"
- scheme: slate
- primary: black
- accent: custom
- toggle:
- # icon: material/toggle-switch-off
- icon: material/eye-outline
- name: Switch to system preference
- # primary: custom
- # accent: custom
- font:
- text: Roboto
- code: Roboto Mono
- favicon: assets/logo.png
- logo: assets/logo.png
- icon:
- annotation: material/arrow-right-circle
- # icon:
- # logo: logo
-# Plugins
-plugins:
- # - blog
- # - static-i18n
- - git-revision-date-localized:
- exclude:
- - argparse/*
- - examples/*
- - search:
- separator: '[\s\u200b\-_,:!=\[\]()"`/]+|\.(?!\d)|&[lg]t;|(?!\b)(?=[A-Z][a-z])'
- - minify:
- minify_html: true
-extra_css:
- - mkdocs/stylesheets/extra.css
-# extra_dir: assets
-# Hooks
-# hooks:
-# - material/overrides/hooks/shortcodes.py
-# - material/overrides/hooks/translations.py
-
-# Additional configuration
-extra:
- source:
- path: https://github.com/jd-opensource/xllm/blob/main/docs/en/
- status:
- new: Recently added
- deprecated: Deprecated
- # analytics:
- # provider: google
- # property: !ENV GOOGLE_ANALYTICS_KEY
- social:
- - icon: fontawesome/brands/github
- link: https://github.com/jd-opensource/xllm
- - icon: gitcodeai
- link: https://gitcode.com/xLLM-AI/xllm
- - icon: fontawesome/brands/docker
- link: https://hub.docker.com/r/xllm/xllm-ai
- - icon: email-fill
- link: https://github.com/jd-opensource/xllm
- # - icon: fontawesome/brands/python
- # link: https://pypi.org/project/mkdocs-material/
- # - icon: fontawesome/brands/bluesky
- # link: https://bsky.app/profile/squidfunk.bsky.social
- # - icon: fontawesome/brands/mastodon
- # link: https://fosstodon.org/@squidfunk
- # - icon: fontawesome/brands/x-twitter
- # link: https://x.com/squidfunk
-
-# Extensions
-markdown_extensions:
- - tables
- - abbr
- - admonition
- - attr_list
- - def_list
- - footnotes
- - md_in_html
- - toc:
- permalink: true
- - pymdownx.arithmatex:
- generic: true
- - pymdownx.betterem:
- smart_enable: all
- - pymdownx.caret
- - pymdownx.details
- - pymdownx.emoji:
- emoji_generator: !!python/name:material.extensions.emoji.to_svg
- emoji_index: !!python/name:material.extensions.emoji.twemoji
- - pymdownx.highlight:
- anchor_linenums: true
- line_spans: __span
- pygments_lang_class: true
- - pymdownx.inlinehilite
- - pymdownx.keys
- - pymdownx.magiclink:
- normalize_issue_symbols: true
- repo_url_shorthand: true
- user: jd-opensource
- repo: xllm
- - pymdownx.mark
- - pymdownx.smartsymbols
- - pymdownx.snippets
- - pymdownx.superfences
- - pymdownx.tabbed
- # - pymdownx.superfences:
- # custom_fences:
- # - name: mermaid
- # class: mermaid
- # format: !!python/name:pymdownx.superfences.fence_code_format
- # - pymdownx.tabbed:
- # alternate_style: true
- # combine_header_slug: true
- # slugify: !!python/object/apply:pymdownx.slugs.slugify
- # kwds:
- # case: lower
- - pymdownx.tasklist:
- custom_checkbox: true
- - pymdownx.tilde
- - mdx_math:
- enable_dollar_delimiter: true
-extra_javascript:
- - mkdocs/javascripts/mathjax.js
- - https://unpkg.com/mathjax@3/es5/tex-mml-chtml.js
-
-
-nav:
- - Home: index.md
- - User Guide:
- - getting_started/quick_start.md
- - supported_models.md
- - getting_started/launch_xllm.md
- - getting_started/disagg_pd.md
- - getting_started/multi_machine.md
- - Basic Usage:
- - getting_started/online_service.md
- - getting_started/offline_service.md
- - Features:
- - Overview:
- - features/overview.md
- - Feature List:
- - Runtime:
- - features/async_schedule.md
- - features/multi_streams.md
- - Scheduler:
- - features/continuous_scheduler.md
- - features/chunked_scheduler.md
- - features/zero_evict_scheduler.md
- - Distributed:
- - features/disagg_pd.md
- - Operators:
- - features/groupgemm.md
- - features/ppmatmul.md
- - features/topk_topP.md
- - Memory Management:
- - features/prefix_cache.md
- - features/global_kvcache.md
- - features/xtensor_memory.md
- - Multimodal:
- - features/multimodal.md
- - MoE Optimization:
- - features/moe_params.md
- - features/eplb.md
- - Advanced Guides:
- - Speculative Inference: features/mtp.md
- - GraphMode: features/graph_mode.md
- - Developer Guide:
- - dev_guide/code_arch.md
- - dev_guide/tilelang_ascend_kernel_dev.md
- - CLI Reference:
- - cli_reference.md
diff --git a/mkdocs_zh.yml b/mkdocs_zh.yml
deleted file mode 100644
index 13479521f9..0000000000
--- a/mkdocs_zh.yml
+++ /dev/null
@@ -1,281 +0,0 @@
-site_name: xLLM
-site_url: !ENV READTHEDOCS_CANONICAL_URL
-
-# Repository
-repo_name: jd-opensource/xllm
-repo_url: https://github.com/jd-opensource/xllm
-
-edit_uri: edit/main/docs/zh
-use_directory_urls: true
-# Copyright
-copyright: Copyright © 2025 xLLM Team
-# docs_dir: docs/zh
-# Configuration
-theme:
- name: material
- language: zh
- custom_dir: docs/mkdocs/overrides
- features:
- - announce.dismiss
- - content.action.edit
- - content.action.view
- - content.code.annotate
- - content.code.copy
- - content.code.select
- - content.footnote.tooltips
- # - content.tabs.link
- - content.tooltips
- # - header.autohide
- - navigation.expand
- - navigation.footer
- - navigation.indexes
- - navigation.path
- # - navigation.instant
- # - navigation.instant.prefetch
- # - navigation.instant.progress
- # - navigation.prune
- - navigation.sections
- - navigation.tabs
- # - navigation.tabs.sticky
- - navigation.top
- - navigation.tracking
- - search.highlight
- - search.share
- - search.suggest
- - toc.follow
- # - toc.integrate
- palette:
- - media: "(prefers-color-scheme)"
- toggle:
- icon: material/link
- name: 切换亮色模式
- - media: "(prefers-color-scheme: light)"
- scheme: default
- primary: custom
- accent: custom
- toggle:
- # icon: material/toggle-switch
- icon: material/eye
- name: 切换暗色模式
- - media: "(prefers-color-scheme: dark)"
- scheme: slate
- primary: black
- accent: custom
- toggle:
- # icon: material/toggle-switch-off
- icon: material/eye-outline
- name: 切换到系统偏好
- # primary: custom
- # accent: custom
- font:
- text: Roboto
- code: Roboto Mono
- favicon: assets/logo.png
- logo: assets/logo.png
- icon:
- annotation: material/arrow-right-circle
- # icon:
- # logo: logo
-# Plugins
-plugins:
- # - awesome-pages
- # - blog
- # - static-i18n
- - git-revision-date-localized:
- exclude:
- - argparse/*
- - examples/*
- - search:
- separator: '[\s\u200b\-_,:!=\[\]()"`/]+|\.(?!\d)|&[lg]t;|(?!\b)(?=[A-Z][a-z])'
- - minify:
- minify_html: true
-extra_css:
- - mkdocs/stylesheets/extra.css
-# extra_dir: assets
-# Hooks
-# hooks:
-# - material/overrides/hooks/shortcodes.py
-# - material/overrides/hooks/translations.py
-
-# Additional configuration
-extra:
- source:
- path: https://github.com/jd-opensource/xllm/blob/main/docs/zh/
-
- status:
- new: Recently added
- deprecated: Deprecated
- # analytics:
- # provider: google
- # property: !ENV GOOGLE_ANALYTICS_KEY
- social:
- - icon: fontawesome/brands/github
- link: https://github.com/jd-opensource/xllm
- - icon: gitcodeai
- link: https://gitcode.com/xLLM-AI/xllm
- - icon: fontawesome/brands/docker
- link: https://hub.docker.com/r/xllm/xllm-ai
- - icon: email-fill
- link: https://github.com/jd-opensource/xllm
- # - icon: fontawesome/brands/python
- # link: https://pypi.org/project/mkdocs-material/
- # - icon: fontawesome/brands/bluesky
- # link: https://bsky.app/profile/squidfunk.bsky.social
- # - icon: fontawesome/brands/mastodon
- # link: https://fosstodon.org/@squidfunk
- # - icon: fontawesome/brands/x-twitter
- # link: https://x.com/squidfunk
-
-# Extensions
-markdown_extensions:
- - tables
- - abbr
- - admonition
- - attr_list
- - def_list
- - footnotes
- - md_in_html
- - toc:
- permalink: true
- - pymdownx.arithmatex:
- generic: true
- - pymdownx.betterem:
- smart_enable: all
- - pymdownx.caret
- - pymdownx.details
- - pymdownx.emoji:
- emoji_generator: !!python/name:material.extensions.emoji.to_svg
- emoji_index: !!python/name:material.extensions.emoji.twemoji
- - pymdownx.highlight:
- anchor_linenums: true
- line_spans: __span
- pygments_lang_class: true
- - pymdownx.inlinehilite
- - pymdownx.keys
- - pymdownx.magiclink:
- normalize_issue_symbols: true
- repo_url_shorthand: true
- user: jd-opensource
- repo: xllm
- - pymdownx.mark
- - pymdownx.smartsymbols
- - pymdownx.snippets
- - pymdownx.superfences
- - pymdownx.tabbed
- # - pymdownx.superfences:
- # custom_fences:
- # - name: mermaid
- # class: mermaid
- # format: !!python/name:pymdownx.superfences.fence_code_format
- # - pymdownx.tabbed:
- # alternate_style: true
- # combine_header_slug: true
- # slugify: !!python/object/apply:pymdownx.slugs.slugify
- # kwds:
- # case: lower
- - pymdownx.tasklist:
- custom_checkbox: true
- - pymdownx.tilde
- - mdx_math:
- enable_dollar_delimiter: true
-extra_javascript:
- - mkdocs/javascripts/mathjax.js
- - https://unpkg.com/mathjax@3/es5/tex-mml-chtml.js
-
-
-nav:
- - 主页: index.md
- - 用户指南:
- - getting_started/quick_start.md
- - supported_models.md
- - getting_started/launch_xllm.md
- - getting_started/disagg_pd.md
- - getting_started/multi_machine.md
- - 基本用法:
- - getting_started/online_service.md
- - getting_started/offline_service.md
- - 功能介绍:
- - 概览:
- - features/overview.md
- - 功能列表:
- - 运行时:
- - features/async_schedule.md
- - features/multi_streams.md
- - 调度器:
- - features/continuous_scheduler.md
- - features/chunked_scheduler.md
- - features/zero_evict_scheduler.md
- - 分布式:
- - features/disagg_pd.md
- - 算子:
- - features/groupgemm.md
- - features/ppmatmul.md
- - features/topk_topP.md
- - KV存储管理:
- - features/prefix_cache.md
- - features/global_kvcache.md
- - features/xtensor_memory.md
- - 多模态:
- - features/multimodal.md
- - MoE优化:
- - features/moe_params.md
- - features/eplb.md
- - 进阶指南:
- - 投机推理: features/mtp.md
- - GraphMode: features/graph_mode.md
- - xLLM Service概览: features/xllm_service_overview.md
- - 开发者指南:
- - dev_guide/code_arch.md
- - dev_guide/tilelang_ascend_kernel_dev.md
- - CLI参考:
- - cli_reference.md
-
-# nav:
-# - 主页: index.md
-# - 开始使用: getting_started/
-# - 功能介绍: features/
-# - CLI参考: cli_reference.md
-# nav:
-# - 主页: zh/index.md
-# - 开始使用:
-# - zh/getting_started/compile.md
-# - 快速开始:
-# - 在线服务:
-# - zh/getting_started/single_node.md
-# - zh/getting_started/multi_node.md
-# - zh/getting_started/PD_disagg.md
-# - 多模态支持:
-# - zh/getting_started/start_vlm_service.md
-# - zh/getting_started/scripts.md
-# - 功能介绍:
-# - 概览:
-# - zh/features/overview.md
-# - 功能列表:
-# - 运行时:
-# - zh/features/async_schedule.md
-# - zh/features/multi_streams.md
-# - 调度算法:
-# - zh/features/continuous_scheduler.md
-# - zh/features/chunked_scheduler.md
-# - zh/features/zero_evict_scheduler.md
-# - zh/features/prefix_cache.md
-# - 分布式:
-# - zh/features/disagg_pd.md
-# - 算子:
-# - zh/features/groupgemm.md
-# - zh/features/ppmatmul.md
-# - zh/features/topk_topP.md
-# - KV存储管理:
-# - zh/features/global_kvcache.md
-# - zh/features/xtensor_memory.md
-# - 多模态:
-# - zh/features/multimodal.md
-# - MoE优化:
-# - zh/features/moe_params.md
-# - zh/features/eplb.md
-# - 进阶指南:
-# - 投机推理: zh/features/mtp.md
-# - ACLGraph: zh/features/acl_graph.md
-# - xLLM Service概览: zh/features/xllm_service_overview.md
-# - CLI参考:
-# - zh/cli_reference.md
diff --git a/pyproject.toml b/pyproject.toml
index 924ec7d448..b5b12713b8 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -24,8 +24,8 @@ classifiers = [
]
[project.urls]
-Homepage = "https://xllm.readthedocs.io/zh-cn/latest/"
-Documentation = "https://xllm.readthedocs.io/zh-cn/latest/"
+Homepage = "https://github.com/jd-opensource/xllm"
+Documentation = "https://jd-opensource.github.io/xllm/en/"
Repository = "https://github.com/jd-opensource/xllm"
[project.scripts]
diff --git a/setup.py b/setup.py
index 35885b8537..5f30919f77 100644
--- a/setup.py
+++ b/setup.py
@@ -638,8 +638,8 @@ def parse_arguments() -> dict[str, Any]:
long_description_content_type="text/markdown",
url="https://github.com/jd-opensource/xllm",
project_urls={
- "Homepage": "https://xllm.readthedocs.io/zh-cn/latest/",
- "Documentation": "https://xllm.readthedocs.io/zh-cn/latest/",
+ "Homepage": "https://github.com/jd-opensource/xllm",
+ "Documentation": "https://jd-opensource.github.io/xllm/en/",
},
classifiers=[
"Intended Audience :: Developers",