From 7d5c5e4c54eddae18fa8fab8412591dffe3329c3 Mon Sep 17 00:00:00 2001 From: wuyang <5700876+banisherwy@user.noreply.gitee.com> Date: Tue, 28 Jul 2026 21:55:19 +0800 Subject: [PATCH] feat: launch LLM Atlas research course --- .dockerignore | 6 + .gitignore | 11 + Dockerfile | 13 + LICENSE | 21 + PROGRESS.md | 54 + README.md | 41 + ROADMAP.md | 101 + astro.config.mjs | 9 + deploy/nginx.conf | 26 + package-lock.json | 4933 +++++++++++++++++++++ package.json | 21 + public/favicon.svg | 5 + public/robots.txt | 4 + research/GROK_RESEARCH_ROADMAP.md | 535 +++ research/METHODOLOGY.md | 46 + research/sources/README.md | 12 + src/components/ArchitectureExplorer.astro | 412 ++ src/components/AttentionLab.astro | 227 + src/components/DeepSeekLineage.astro | 152 + src/components/SiteFooter.astro | 13 + src/components/SiteHeader.astro | 50 + src/data/chapters.ts | 233 + src/data/papers.ts | 1058 +++++ src/layouts/BaseLayout.astro | 55 + src/pages/deepseek/index.astro | 815 ++++ src/pages/foundations/index.astro | 583 +++ src/pages/index.astro | 298 ++ src/pages/k3/index.astro | 710 +++ src/pages/papers/index.astro | 636 +++ src/pages/progress/index.astro | 372 ++ src/pages/roadmap/index.astro | 468 ++ src/styles/global.css | 1356 ++++++ tsconfig.json | 9 + 33 files changed, 13285 insertions(+) create mode 100644 .dockerignore create mode 100644 .gitignore create mode 100644 Dockerfile create mode 100644 LICENSE create mode 100644 PROGRESS.md create mode 100644 README.md create mode 100644 ROADMAP.md create mode 100644 astro.config.mjs create mode 100644 deploy/nginx.conf create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 public/favicon.svg create mode 100644 public/robots.txt create mode 100644 research/GROK_RESEARCH_ROADMAP.md create mode 100644 research/METHODOLOGY.md create mode 100644 research/sources/README.md create mode 100644 src/components/ArchitectureExplorer.astro create mode 100644 src/components/AttentionLab.astro create mode 100644 src/components/DeepSeekLineage.astro create mode 100644 src/components/SiteFooter.astro create mode 100644 src/components/SiteHeader.astro create mode 100644 src/data/chapters.ts create mode 100644 src/data/papers.ts create mode 100644 src/layouts/BaseLayout.astro create mode 100644 src/pages/deepseek/index.astro create mode 100644 src/pages/foundations/index.astro create mode 100644 src/pages/index.astro create mode 100644 src/pages/k3/index.astro create mode 100644 src/pages/papers/index.astro create mode 100644 src/pages/progress/index.astro create mode 100644 src/pages/roadmap/index.astro create mode 100644 src/styles/global.css create mode 100644 tsconfig.json diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..b0f0561 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,6 @@ +node_modules +dist +.astro +.git +research/sources +*.log diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..44318fa --- /dev/null +++ b/.gitignore @@ -0,0 +1,11 @@ +node_modules/ +dist/ +.astro/ +.DS_Store +*.log + +# Local primary-source cache. The public repository stores canonical URLs, +# checksums and research notes instead of redistributing downloaded papers. +research/sources/**/*.pdf +research/sources/**/*.txt +research/sources/**/*.html diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..03d4d16 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,13 @@ +FROM node:22-alpine AS build +WORKDIR /app +COPY --chmod=0644 package.json package-lock.json ./ +RUN npm ci +COPY --chmod=0644 . . +RUN npm run build + +FROM nginx:1.29-alpine +COPY --chmod=0644 deploy/nginx.conf /etc/nginx/conf.d/default.conf +COPY --chmod=0644 --from=build /app/dist/ /usr/share/nginx/html/ +EXPOSE 8080 +HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \ + CMD wget -q -O /dev/null http://127.0.0.1:8080/healthz || exit 1 diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..d885821 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2026 LLM Atlas contributors + +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/PROGRESS.md b/PROGRESS.md new file mode 100644 index 0000000..a859435 --- /dev/null +++ b/PROGRESS.md @@ -0,0 +1,54 @@ +# 持续进度 + +最后更新:2026-07-28 + +## 总体状态 + +| 工作流 | 状态 | 完成度 | 下一检查点 | +|---|---:|---:|---| +| 研究框架与规范 | 进行中 | 72% | 给 125 篇索引补充逐篇精读层级 | +| 网站设计系统 | 进行中 | 86% | 打印样式与更多通用可视化组件 | +| Kimi K3 深读 | 进行中 | 55% | 扩写 scaling / infra 逐图笔记 | +| Transformer 基础 | 进行中 | 52% | 矩阵形状动画与手算练习 | +| DeepSeek 专题 | 进行中 | 54% | MLA 与 GRPO 完整公式推导 | +| 引用与事实检查 | 进行中 | 48% | 自动化外链复查与来源等级扩展 | +| 开源仓库 | 待开始 | 0% | 首次提交并推送到 git.k1412.top | +| k1412 部署 | 待开始 | 0% | 首个公开预览与 HTTPS 验证 | + +## 已完成 + +- [x] 建立长期任务目标与阶段计划。 +- [x] 确认 K3 官方 47 页技术报告与官方模型仓库。 +- [x] 提取技术报告目录与 151 条参考来源,建立本地只读研究缓存。 +- [x] 从报告反推出 16 个专题与三条贯穿案例。 +- [x] 提炼参考网站的编辑设计语言。 +- [x] 确认 `git.k1412.top` 为 Gitea/Forgejo 兼容服务且本机 HTTPS 凭据可用于既有仓库。 +- [x] 使用 Grok CLI 检索并形成约 95 篇一手论文的补充路线,主代理已回查关键来源。 +- [x] 完成首批 125 篇关键论文索引,覆盖 12 个专题与 Kimi/DeepSeek 聚光主线。 +- [x] 完成可检索、可按专题筛选的论文库页面。 +- [x] 完成 K3、Transformer 基础与 DeepSeek 三篇首版长文。 +- [x] 完成 K3 三轴架构、Self-Attention 实验与 DeepSeek 谱系三张原创交互图。 +- [x] Astro 类型检查、生产构建、7 个内部路由和桌面/移动端视觉检查通过。 + +## 正在进行 + +- [ ] 开源仓库首次提交与远端公开验证。 +- [ ] 不可变容器镜像、NAS Compose Manager 部署与 HTTPS 验证。 +- [ ] 长上下文 / 高效注意力专题深度正文。 +- [ ] MoE 路由模拟器与通信成本账本。 + +## 研究账本 + +| 日期 | 决策/发现 | 影响 | +|---|---|---| +| 2026-07-28 | 网站命名为 **LLM Atlas / 大模型技术全景** | 既能容纳 K3 深读,也能承载完整 LLM 课程 | +| 2026-07-28 | K3 作为“汇流点”,不是课程起点 | 初学者可以先学基础,高阶读者可以从 K3 反向跳转 | +| 2026-07-28 | 优先重绘论文图并标明“简化/改绘” | 图可缩放、可交互,也减少脱离上下文复制论文图片 | +| 2026-07-28 | Grok 只用于线索扩展与交叉检查 | 正文事实必须回到论文、官方仓库或正式文档 | +| 2026-07-28 | 首批论文库收录 125 篇,按问题与专题多标签组织 | 论文库承担发现入口,专题正文承担深度精读与机制复核 | + +## 未决问题 + +- K3 报告给出了多项公开组件的整合方式;独立论文与 K3 内部最终实现之间仍需逐项对照。 +- 公开技术报告不会披露完整数据配比和训练细节;网站会把“已知”“合理推断”“未知”分开。 +- 2026 年模型与榜单变化快,所有动态比较都必须带研究截止日期。 diff --git a/README.md b/README.md new file mode 100644 index 0000000..ed5eafb --- /dev/null +++ b/README.md @@ -0,0 +1,41 @@ +# LLM Atlas + +一套以 Kimi K3 技术报告为锚点、从第一性原理重新梳理大语言模型技术发展的中文开放课程。 + +项目不把论文按年份堆成目录,而是持续回答四个问题: + +1. 当时真正卡住研究者的问题是什么? +2. 旧方法为什么不够? +3. 关键论文改变了哪个假设或工程瓶颈? +4. 这条思路如何汇入今天的 Kimi K3、DeepSeek 与前沿 Agent 系统? + +## 当前交付 + +- 网站:`https://llm-atlas.k1412.top/`(首次发布后生效) +- 开源仓库:`https://git.k1412.top/wuyang/llm-atlas`(首次推送后生效) +- 研究路线:[ROADMAP.md](./ROADMAP.md) +- 持续进度:[PROGRESS.md](./PROGRESS.md) +- 证据与写作规范:[research/METHODOLOGY.md](./research/METHODOLOGY.md) + +首个里程碑包含 16 专题学习地图、125 篇关键论文索引、Kimi K3 完整导读、 +Transformer 基础、DeepSeek 技术谱系,以及三张原创交互可视化。其余专题按进度账本持续扩建。 + +## 本地开发 + +```bash +npm install +npm run dev +``` + +生产构建与检查: + +```bash +npm run check +npm run build +``` + +## 内容与代码许可 + +- 网站代码采用 MIT License。 +- 原创文字与重绘图采用 [CC BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/deed.zh-hans)。 +- 被引用论文、图表、模型与商标仍归各自权利人所有;项目优先链接一手来源,并明确标注改绘与推断。 diff --git a/ROADMAP.md b/ROADMAP.md new file mode 100644 index 0000000..81bece4 --- /dev/null +++ b/ROADMAP.md @@ -0,0 +1,101 @@ +# LLM Atlas 总体研究地图 + +最后更新:2026-07-28 + +## 组织原则 + +全站采用“问题链”而不是“名词表”: + +> 现象与直觉 → 最小数学模型 → 旧方案瓶颈 → 关键论文 → 架构图/实验 → 与后继工作的桥 → K3/DeepSeek 中的落点 → 局限与开放问题 + +难度分为四层: + +- **L0 直觉**:不要求线性代数,先建立可视化心智模型。 +- **L1 机制**:理解张量形状、训练目标与计算流程。 +- **L2 论文**:能读关键公式、消融实验和训练配置。 +- **L3 工程**:理解并行、通信、显存、精度与服务系统。 + +## 16 个专题 + +### 00. 导航:先看懂一张大模型地图 + +学习依赖、术语、读论文方法、证据等级、K3 的全局坐标。 + +### 01. 语言模型从哪里来 + +N-gram → 神经概率语言模型 → 分布式词表示 → RNN/LSTM → Seq2Seq。解释“预测下一个词”为何最终能长成通用模型。 + +### 02. 注意力与 Transformer + +Bahdanau Attention → Self-Attention → Transformer → decoder-only GPT。逐项拆解 Q/K/V、因果掩码、多头、残差、归一化、FFN。 + +### 03. 表示层、位置与残差高速公路 + +BPE/SentencePiece、绝对/相对位置、RoPE/ALiBi、LayerNorm/RMSNorm、Pre-LN、SwiGLU,以及从 ResNet 到 K3 Attention Residuals 的深度信息流。 + +### 04. Scaling Laws:规模为什么有效 + +GPT 系列 → Kaplan scaling laws → Chinchilla compute-optimal → 数据质量与重复 → 推理时计算。区分参数、激活参数、训练 FLOPs 与能力。 + +### 05. 数据工程与预训练配方 + +采集、清洗、去重、质量分类、数据混合、课程学习、合成数据、污染控制;对公开报告中“没有说”的部分也明确标记。 + +### 06. 稀疏计算与 MoE + +Conditional Computation → Sparsely-Gated MoE → GShard/Switch → DeepSeekMoE → LatentMoE → K3 Stable LatentMoE。重点解释路由、专家特化、负载均衡与通信。 + +### 07. 长上下文与高效注意力 + +稀疏注意力、线性注意力、FlashAttention、MQA/GQA、MLA、状态空间模型、Delta Rule、Kimi Linear/KDA、混合注意力与 1M 上下文。 + +### 08. 大规模训练系统 + +数据/张量/流水线/序列/上下文/专家并行,ZeRO,Megatron,通信重叠,容错;对比 DeepSeek DualPipe/DeepEP 与 K3 MoonEP。 + +### 09. 数值精度、优化器与稳定性 + +Adam/AdamW、Adafactor、μP、Muon;FP16/BF16/FP8/MXFP4、量化感知训练、缩放与误差。重点讲 DeepSeek-V3 FP8 与 K3 per-head Muon/MXFP4。 + +### 10. 指令微调与人类偏好 + +Instruction Tuning、SFT、RLHF/PPO、RLAIF、Constitutional AI、DPO 及其后续。解释 base model 如何变成可协作助手。 + +### 11. 推理模型与测试时扩展 + +CoT、自洽性、搜索、验证器、过程奖励、GRPO、DeepSeekMath、DeepSeek-R1/R1-Zero、Kimi k1.5、multi-effort RL 与 on-policy distillation。 + +### 12. 工具使用与长程 Agent + +WebGPT、Toolformer、ReAct、Reflexion、代码 Agent、Computer Use、环境奖励、可验证任务、沙箱、百万 Token 轨迹与 K3 Agentic RL。 + +### 13. 原生多模态 + +ViT/CLIP → Flamingo/BLIP-2/LLaVA → 原生多模态与视频;Kimi-VL、MoonViT-V2 和“视觉进入同一主干”的意义。 + +### 14. 推理服务与低成本部署 + +KV Cache、PagedAttention/vLLM、连续批处理、推测解码、Prefill/Decode 解耦、前缀缓存、集群调度;Mooncake 与 K3 KDA-aware serving。 + +### 15. 评测、安全与“到底强不强” + +困惑度到 MMLU/GPQA/HLE,SWE-bench、OSWorld、BrowseComp;污染、harness、工具预算、LLM-as-a-judge、选择性报告与网络安全边界。 + +## 三条贯穿式案例 + +1. **Kimi K3 解剖**:把上述全部专题重新汇总到一张架构与训练系统图。 +2. **DeepSeek 技术谱系**:DeepSeek LLM → DeepSeekMoE → V2/MLA → V3/FP8/MTP/DualPipe → Math/GRPO → R1 → V3.2/DSA → V4 长上下文。 +3. **“一个 Token 的旅行”**:从文本分词,经注意力、MoE、GPU 集群、后训练,再到线上推理与工具调用。 + +## 完成标准 + +每个专题至少包含: + +- 1 条清晰问题链; +- 8–20 篇一手论文; +- 2 个以上可缩放架构图; +- 1 个交互演示或逐步动画; +- 1 个“常见误解”区; +- 1 个 K3 与 DeepSeek 对照落点; +- 所有外部事实的可点击来源、研究截止日期与证据等级; +- 独立技术复核与链接检查。 diff --git a/astro.config.mjs b/astro.config.mjs new file mode 100644 index 0000000..c356c00 --- /dev/null +++ b/astro.config.mjs @@ -0,0 +1,9 @@ +import { defineConfig } from "astro/config"; +import sitemap from "@astrojs/sitemap"; + +export default defineConfig({ + site: "https://llm-atlas.k1412.top", + output: "static", + trailingSlash: "always", + integrations: [sitemap()] +}); diff --git a/deploy/nginx.conf b/deploy/nginx.conf new file mode 100644 index 0000000..b73aed9 --- /dev/null +++ b/deploy/nginx.conf @@ -0,0 +1,26 @@ +server { + listen 8080; + listen [::]:8080; + server_name _; + root /usr/share/nginx/html; + index index.html; + + charset utf-8; + server_tokens off; + + location = /healthz { + access_log off; + default_type text/plain; + return 200 "ok\n"; + } + + location ~* \.(?:css|js|svg|png|jpg|jpeg|webp|woff2)$ { + expires 7d; + add_header Cache-Control "public, max-age=604800, immutable"; + try_files $uri =404; + } + + location / { + try_files $uri $uri/ $uri/index.html =404; + } +} diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..fad5bc1 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,4933 @@ +{ + "name": "llm-atlas", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "llm-atlas", + "version": "0.1.0", + "dependencies": { + "@astrojs/sitemap": "3.7.3", + "astro": "7.1.4" + }, + "devDependencies": { + "@astrojs/check": "0.9.6", + "typescript": "5.9.3" + } + }, + "node_modules/@astrojs/check": { + "version": "0.9.6", + "resolved": "https://registry.npmjs.org/@astrojs/check/-/check-0.9.6.tgz", + "integrity": "sha512-jlaEu5SxvSgmfGIFfNgcn5/f+29H61NJzEMfAZ82Xopr4XBchXB1GVlcJsE+elUlsYSbXlptZLX+JMG3b/wZEA==", + "dev": true, + "dependencies": { + "@astrojs/language-server": "^2.16.1", + "chokidar": "^4.0.1", + "kleur": "^4.1.5", + "yargs": "^17.7.2" + }, + "bin": { + "astro-check": "bin/astro-check.js" + }, + "peerDependencies": { + "typescript": "^5.0.0" + } + }, + "node_modules/@astrojs/compiler": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/@astrojs/compiler/-/compiler-2.13.1.tgz", + "integrity": "sha512-f3FN83d2G/v32ipNClRKgYv30onQlMZX1vCeZMjPsMMPl1mDpmbl0+N5BYo4S/ofzqJyS5hvwacEo0CCVDn/Qg==", + "dev": true + }, + "node_modules/@astrojs/compiler-binding": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@astrojs/compiler-binding/-/compiler-binding-0.3.1.tgz", + "integrity": "sha512-DaAUj29AIBU2XdJ8uwcab8lW5O2pk9pY8AXkcMw0sw77nVa3oeTYRcO+Dvbbpoexf6ThMc0FMWYCQ/wN1/T7oQ==", + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "optionalDependencies": { + "@astrojs/compiler-binding-darwin-arm64": "0.3.1", + "@astrojs/compiler-binding-darwin-x64": "0.3.1", + "@astrojs/compiler-binding-linux-arm64-gnu": "0.3.1", + "@astrojs/compiler-binding-linux-arm64-musl": "0.3.1", + "@astrojs/compiler-binding-linux-x64-gnu": "0.3.1", + "@astrojs/compiler-binding-linux-x64-musl": "0.3.1", + "@astrojs/compiler-binding-wasm32-wasi": "0.3.1", + "@astrojs/compiler-binding-win32-arm64-msvc": "0.3.1", + "@astrojs/compiler-binding-win32-x64-msvc": "0.3.1" + } + }, + "node_modules/@astrojs/compiler-binding-darwin-arm64": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@astrojs/compiler-binding-darwin-arm64/-/compiler-binding-darwin-arm64-0.3.1.tgz", + "integrity": "sha512-IEmEF2fUIlTHtpeE/isyEGVOB14cEyh/LZOFYt6wn3jNyVpdC8aR5OZ+RzFUR/f+8ZDM1LaMwZKvoA7eMyJeFw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@astrojs/compiler-binding-darwin-x64": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@astrojs/compiler-binding-darwin-x64/-/compiler-binding-darwin-x64-0.3.1.tgz", + "integrity": "sha512-GF2kIxjpPDLsn94zbZNMsxEmkU828QqnmM7kiQJnaooS3jmI+I7kk6+oI6EpwOsK3femCMdcm+wmOsEqtGrmjQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@astrojs/compiler-binding-linux-arm64-gnu": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@astrojs/compiler-binding-linux-arm64-gnu/-/compiler-binding-linux-arm64-gnu-0.3.1.tgz", + "integrity": "sha512-XJL3SDmOtVrqFhCirNcHwE91+IesJqlgNo23I4qW9QUYfwzm/TBZuH61fgqsb1ttgR1mMYz6ooPWs0JDhwMqpQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@astrojs/compiler-binding-linux-arm64-musl": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@astrojs/compiler-binding-linux-arm64-musl/-/compiler-binding-linux-arm64-musl-0.3.1.tgz", + "integrity": "sha512-xqE8BVbDoBueK/B47w30PtkVofUWJKGkwoMVE+EOMLf11rnoANxIAdA9FPqY+rng4oNI5ndHGsri1yPj2k8vZQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@astrojs/compiler-binding-linux-x64-gnu": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@astrojs/compiler-binding-linux-x64-gnu/-/compiler-binding-linux-x64-gnu-0.3.1.tgz", + "integrity": "sha512-1y0StU1qiCuDFH3rmbRJXcxdfHxFPrES1Rd+RLffosvUR7I2cH5SF5SFnBN9vXpzpkmyElZm3Yr47iJBPN7vVA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@astrojs/compiler-binding-linux-x64-musl": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@astrojs/compiler-binding-linux-x64-musl/-/compiler-binding-linux-x64-musl-0.3.1.tgz", + "integrity": "sha512-16q0fYf7kpbmdObZEeZJEup8hQv/whgNwVjrSvT8umrKwLDSnNIWiQpm09lQQu6bweZB0XyIvHwlPitvJhC+hg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@astrojs/compiler-binding-wasm32-wasi": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@astrojs/compiler-binding-wasm32-wasi/-/compiler-binding-wasm32-wasi-0.3.1.tgz", + "integrity": "sha512-cB456shIwDv/PrVT+2QG7LFndpHkVge5HjqADKZgGaAc9JHVktCtjSrcdkRQ+3tbkPazNKaTLRjXLIiz2NIx9g==", + "cpu": [ + "wasm32" + ], + "optional": true, + "dependencies": { + "@napi-rs/wasm-runtime": "^1.1.6" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@astrojs/compiler-binding-win32-arm64-msvc": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@astrojs/compiler-binding-win32-arm64-msvc/-/compiler-binding-win32-arm64-msvc-0.3.1.tgz", + "integrity": "sha512-ur/9+If/yTE69mmeX5MqSZndL0HOyx67GeNZUy3N7wVdWpLz9UTJXwyWS4UR2PUQHitghjsM5xoX0Ge56WRVQQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@astrojs/compiler-binding-win32-x64-msvc": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@astrojs/compiler-binding-win32-x64-msvc/-/compiler-binding-win32-x64-msvc-0.3.1.tgz", + "integrity": "sha512-k0W+kDBzDkNZOqu4kElDvCOIbKw5Ut9S1WZ1Krj3KTgNuBERNKXsMMsRLLcbgfdMdbe7bTekQLshZrrvmYpmwA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@astrojs/compiler-rs": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@astrojs/compiler-rs/-/compiler-rs-0.3.1.tgz", + "integrity": "sha512-aT7xkgsbNoS6nriY5qKpbihK43slFHO41iqgHCTdOvn1ifaQxLCc5yXy+6GzAtiafoaC1zA7OwVXCXMsvUZOkg==", + "dependencies": { + "@astrojs/compiler-binding": "0.3.1" + }, + "engines": { + "node": ">=22.12.0" + } + }, + "node_modules/@astrojs/internal-helpers": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@astrojs/internal-helpers/-/internal-helpers-0.10.1.tgz", + "integrity": "sha512-5phcroT/vmOOrYuuAxtkbPixy5hePtlz9i8K4OeDv3dNK6/UQRuXPOSRTxIOBbUY5Sonw2UaxjbuVc43Mcir6Q==", + "dependencies": { + "@types/hast": "^3.0.4", + "@types/mdast": "^4.0.4", + "js-yaml": "^4.1.1", + "picomatch": "^4.0.4", + "retext-smartypants": "^6.2.0", + "shiki": "^4.0.2", + "smol-toml": "^1.6.0", + "unified": "^11.0.5" + } + }, + "node_modules/@astrojs/language-server": { + "version": "2.16.13", + "resolved": "https://registry.npmjs.org/@astrojs/language-server/-/language-server-2.16.13.tgz", + "integrity": "sha512-ekOa+CYprEq5n4EJC1qTIAhLk49HZIUQuFwrEuF+3JK/pdMaYnWoREFUI2A0KEPOJiFA2kamBzKzbYljDvUxLg==", + "dev": true, + "dependencies": { + "@astrojs/compiler": "^2.13.1", + "@astrojs/yaml2ts": "^0.2.4", + "@jridgewell/sourcemap-codec": "^1.5.5", + "@volar/kit": "~2.4.28", + "@volar/language-core": "~2.4.28", + "@volar/language-server": "~2.4.28", + "@volar/language-service": "~2.4.28", + "muggle-string": "^0.4.1", + "tinyglobby": "^0.2.16", + "volar-service-css": "0.0.71", + "volar-service-emmet": "0.0.71", + "volar-service-html": "0.0.71", + "volar-service-prettier": "0.0.71", + "volar-service-typescript": "0.0.71", + "volar-service-typescript-twoslash-queries": "0.0.71", + "volar-service-yaml": "0.0.71", + "vscode-html-languageservice": "^5.6.2", + "vscode-uri": "^3.1.0" + }, + "bin": { + "astro-ls": "bin/nodeServer.js" + }, + "peerDependencies": { + "prettier": "^3.0.0", + "prettier-plugin-astro": ">=0.11.0" + }, + "peerDependenciesMeta": { + "prettier": { + "optional": true + }, + "prettier-plugin-astro": { + "optional": true + } + } + }, + "node_modules/@astrojs/markdown-satteri": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/@astrojs/markdown-satteri/-/markdown-satteri-0.3.4.tgz", + "integrity": "sha512-6Lvt/bQZEBW+zzdhPblvfZEy5PGEYJaUsUqaCgwHeRPxZJL1gc9I+DRLKWJjjYTWDzVUTzXlMq4WwSK+X34CVw==", + "dependencies": { + "@astrojs/internal-helpers": "0.10.1", + "@astrojs/prism": "4.0.2", + "github-slugger": "^2.0.0", + "hast-util-from-html": "^2.0.3", + "satteri": "^0.9.1" + } + }, + "node_modules/@astrojs/prism": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@astrojs/prism/-/prism-4.0.2.tgz", + "integrity": "sha512-KTivpmnz6lDsC6o9H4+DNm2SrE/GHzw8cNAvEJwAvUT+eoaEnn/4NtbDNfRRaxaJHdp15gf+tfHAWiXR4wB3BA==", + "dependencies": { + "prismjs": "^1.30.0" + }, + "engines": { + "node": ">=22.12.0" + } + }, + "node_modules/@astrojs/sitemap": { + "version": "3.7.3", + "resolved": "https://registry.npmjs.org/@astrojs/sitemap/-/sitemap-3.7.3.tgz", + "integrity": "sha512-f8euLVsyeAmAkSm/1M2Kb8sL8byQmfgbvBNaHFItCheTj/IpiJYSEWVcqDHZ/yEHxiS7+w87mQkzwZaPHmk5GA==", + "dependencies": { + "sitemap": "^9.0.0", + "stream-replace-string": "^2.0.0", + "zod": "^4.3.6" + } + }, + "node_modules/@astrojs/telemetry": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/@astrojs/telemetry/-/telemetry-3.3.3.tgz", + "integrity": "sha512-C1TLn5sPJr0x4vk56piHWKbnqlEB8BKyte5Y45V02U+D7BGO5eMqZDH5aPjnkXQWJggvmsTXxH03QMZ9NgWLzQ==", + "dependencies": { + "ci-info": "^4.4.0", + "dset": "^3.1.4", + "is-docker": "^4.0.0", + "package-manager-detector": "^1.6.0" + }, + "engines": { + "node": "18.20.8 || ^20.3.0 || >=22.0.0" + } + }, + "node_modules/@astrojs/yaml2ts": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@astrojs/yaml2ts/-/yaml2ts-0.2.4.tgz", + "integrity": "sha512-8oddpOae35pJsXPQXhTkM0ypfKPskVsh2bCxRtbf7e+/Epw2nReakFYpLKjZMEr75CsoF203PMnCocpfz0s69A==", + "dev": true, + "dependencies": { + "yaml": "^2.8.3" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", + "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.7.tgz", + "integrity": "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==", + "dependencies": { + "@babel/types": "^7.29.7" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.7.tgz", + "integrity": "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==", + "dependencies": { + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bruits/satteri-darwin-arm64": { + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/@bruits/satteri-darwin-arm64/-/satteri-darwin-arm64-0.9.5.tgz", + "integrity": "sha512-iw4nZgx9v30lWo/MTngQqi1pI78KI0DnkSm+lVJGYdmPLgAyDNJigVhpG42/Iq55A6c1Ll8q66ljyyRiQUxwow==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@bruits/satteri-darwin-x64": { + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/@bruits/satteri-darwin-x64/-/satteri-darwin-x64-0.9.5.tgz", + "integrity": "sha512-6T26Z5Kf3cFW2PSlk9p7zT7yVxvuBSiJvYyz9u8KjYwMTqZyIDOj2wDyNpxKV4+6yUVG7rddq2QwvG/8LJA2+Q==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@bruits/satteri-linux-arm64-gnu": { + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/@bruits/satteri-linux-arm64-gnu/-/satteri-linux-arm64-gnu-0.9.5.tgz", + "integrity": "sha512-u51id17uJwNEMK9nBlICsq6U31c+XVqQueVBkwRIzZG+gMpS8TOJctt5h5Wz33Z8xnMdTd+adtACVz0yHgGuOA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@bruits/satteri-linux-arm64-musl": { + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/@bruits/satteri-linux-arm64-musl/-/satteri-linux-arm64-musl-0.9.5.tgz", + "integrity": "sha512-v39HxiwGC5Rqm01HksP6+5Y+xKLPlsuVFgIgpEAo+SiQ22c+mJVhS3u7Z6ePAKdhL5NJoK1xq70kLz3L13AhpQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@bruits/satteri-linux-x64-gnu": { + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/@bruits/satteri-linux-x64-gnu/-/satteri-linux-x64-gnu-0.9.5.tgz", + "integrity": "sha512-F3uO8uFp3pAP5ZGXttwvh57GS7s0lL953tnNdyI2gRyP4kOOkp6pyGojNJzCjkDvWI2Cvb9iNrKok3aqQPauAw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@bruits/satteri-linux-x64-musl": { + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/@bruits/satteri-linux-x64-musl/-/satteri-linux-x64-musl-0.9.5.tgz", + "integrity": "sha512-bicEqglLlz++mWyADaZoP0JY20s4vDfLjaPYgQqC+NI4zZLTOOg1T4GB8aqtc822Pqji8SQBmSrTb7CrP8i08Q==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@bruits/satteri-wasm32-wasi": { + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/@bruits/satteri-wasm32-wasi/-/satteri-wasm32-wasi-0.9.5.tgz", + "integrity": "sha512-zauAuMwfPnKPUkd4AFixRFpXdgKwP2mKgxrIIo2gJzW0/ZneF9dbHnLkojSpaBnCCp7VUL1hIi5WWZvB1CqmAQ==", + "cpu": [ + "wasm32" + ], + "optional": true, + "dependencies": { + "@emnapi/core": "1.11.1", + "@emnapi/runtime": "1.11.1", + "@napi-rs/wasm-runtime": "^1.1.6" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@bruits/satteri-wasm32-wasi/node_modules/@emnapi/core": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.11.1.tgz", + "integrity": "sha512-RSvbQmHzdKzNsLYa/wHrbc3KN4sYLKAdPZxqiM2HATqv/SBk2/ENSHpvXGaLOMcsAyz0poEGqkmmKYG3OWiJEQ==", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.2.2", + "tslib": "^2.4.0" + } + }, + "node_modules/@bruits/satteri-wasm32-wasi/node_modules/@emnapi/runtime": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.1.tgz", + "integrity": "sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@bruits/satteri-wasm32-wasi/node_modules/@emnapi/wasi-threads": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.2.tgz", + "integrity": "sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@bruits/satteri-win32-arm64-msvc": { + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/@bruits/satteri-win32-arm64-msvc/-/satteri-win32-arm64-msvc-0.9.5.tgz", + "integrity": "sha512-SrfE7NEsgZjBvU3c+RR6oQRu0ToXY5uVJEbieXEF0YTctIV2zAVlbaMjWLts074QCgh3a+XHWkR/lWh2VH2LUg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@bruits/satteri-win32-x64-msvc": { + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/@bruits/satteri-win32-x64-msvc/-/satteri-win32-x64-msvc-0.9.5.tgz", + "integrity": "sha512-5Kw9ZAtTGS8WHizyn+CJhjjfIQrw+7jcZodpmpXJjefnO15M8UexIi6JR2E5thyvsmHyhL6ZDDMUNR4bKJPd4g==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@capsizecss/unpack": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@capsizecss/unpack/-/unpack-4.0.1.tgz", + "integrity": "sha512-CuNiSqg7+e1cO/GjffyMOm5Tt2jUF9CWHHnvQ/UkqvtkGfHdgwEC0wpmq7fkN3gxwpRnrAN0WzO3vREKmNolMQ==", + "dependencies": { + "fontkitten": "^1.0.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@clack/core": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/@clack/core/-/core-1.4.3.tgz", + "integrity": "sha512-/kr3UWNtdJfxZtPgDqUOmG2pvwlmcLGheex5yiZKdwbzZJxhV+HMNR9QNmyY5cGwTNV6LrR7Jtp+KjhUAP1qBQ==", + "dependencies": { + "fast-wrap-ansi": "^0.2.0", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 20.12.0" + } + }, + "node_modules/@clack/prompts": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@clack/prompts/-/prompts-1.7.0.tgz", + "integrity": "sha512-y7/yvZ2TPAnR9+jnc00klvNNLkJiXFFrQA/hlLCcxA9a2A4zQIOimyFQ9XfwYKiGD1fb5GY8vbKIIgO8d5Tb2A==", + "dependencies": { + "@clack/core": "1.4.3", + "fast-string-width": "^3.0.2", + "fast-wrap-ansi": "^0.2.0", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 20.12.0" + } + }, + "node_modules/@emmetio/abbreviation": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/@emmetio/abbreviation/-/abbreviation-2.3.3.tgz", + "integrity": "sha512-mgv58UrU3rh4YgbE/TzgLQwJ3pFsHHhCLqY20aJq+9comytTXUDNGG/SMtSeMJdkpxgXSXunBGLD8Boka3JyVA==", + "dev": true, + "dependencies": { + "@emmetio/scanner": "^1.0.4" + } + }, + "node_modules/@emmetio/css-abbreviation": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@emmetio/css-abbreviation/-/css-abbreviation-2.1.8.tgz", + "integrity": "sha512-s9yjhJ6saOO/uk1V74eifykk2CBYi01STTK3WlXWGOepyKa23ymJ053+DNQjpFcy1ingpaO7AxCcwLvHFY9tuw==", + "dev": true, + "dependencies": { + "@emmetio/scanner": "^1.0.4" + } + }, + "node_modules/@emmetio/css-parser": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@emmetio/css-parser/-/css-parser-0.4.1.tgz", + "integrity": "sha512-2bC6m0MV/voF4CTZiAbG5MWKbq5EBmDPKu9Sb7s7nVcEzNQlrZP6mFFFlIaISM8X6514H9shWMme1fCm8cWAfQ==", + "dev": true, + "dependencies": { + "@emmetio/stream-reader": "^2.2.0", + "@emmetio/stream-reader-utils": "^0.1.0" + } + }, + "node_modules/@emmetio/html-matcher": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@emmetio/html-matcher/-/html-matcher-1.3.0.tgz", + "integrity": "sha512-NTbsvppE5eVyBMuyGfVu2CRrLvo7J4YHb6t9sBFLyY03WYhXET37qA4zOYUjBWFCRHO7pS1B9khERtY0f5JXPQ==", + "dev": true, + "dependencies": { + "@emmetio/scanner": "^1.0.0" + } + }, + "node_modules/@emmetio/scanner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@emmetio/scanner/-/scanner-1.0.4.tgz", + "integrity": "sha512-IqRuJtQff7YHHBk4G8YZ45uB9BaAGcwQeVzgj/zj8/UdOhtQpEIupUhSk8dys6spFIWVZVeK20CzGEnqR5SbqA==", + "dev": true + }, + "node_modules/@emmetio/stream-reader": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@emmetio/stream-reader/-/stream-reader-2.2.0.tgz", + "integrity": "sha512-fXVXEyFA5Yv3M3n8sUGT7+fvecGrZP4k6FnWWMSZVQf69kAq0LLpaBQLGcPR30m3zMmKYhECP4k/ZkzvhEW5kw==", + "dev": true + }, + "node_modules/@emmetio/stream-reader-utils": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@emmetio/stream-reader-utils/-/stream-reader-utils-0.1.0.tgz", + "integrity": "sha512-ZsZ2I9Vzso3Ho/pjZFsmmZ++FWeEd/txqybHTm4OgaZzdS8V9V/YYWQwg5TC38Z7uLWUV1vavpLLbjJtKubR1A==", + "dev": true + }, + "node_modules/@emnapi/core": { + "version": "2.0.0-alpha.3", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-2.0.0-alpha.3.tgz", + "integrity": "sha512-AZypUeJ/yByuxyS7BlSNRDOMLMlROYtjYdIAuBmJssVz1UJDSeYxLrdizhXCFYhedC5bqd/ASy8EuNXbVVXp9g==", + "optional": true, + "peer": true, + "dependencies": { + "@emnapi/wasi-threads": "2.0.1", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "2.0.0-alpha.3", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-2.0.0-alpha.3.tgz", + "integrity": "sha512-hFPAhMUjJD9BSyCANEISPOogeXC9Zo9ZQl7L6vKnaVsMkCtzznaW/naYypeyl0Gv5rYfWYsZbpixTMpjDJzQeA==", + "optional": true, + "peer": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-2.0.1.tgz", + "integrity": "sha512-9DsSk+o5NBX0CCJT8s0EROGSGxjR/tKu6aBTaVyq+SjAEQH4XcdcRxPBRzsBLizTTJ49MJjF+jgu3qnO9GLQcQ==", + "optional": true, + "peer": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.1.tgz", + "integrity": "sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ==", + "cpu": [ + "ppc64" + ], + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.1.tgz", + "integrity": "sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.1.tgz", + "integrity": "sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.1.tgz", + "integrity": "sha512-dbwY7ltSMDWsRatcRpCnES4F+im88OCUgGZjy52shC7GqHRE/cYlxNbB4Z4UpJswpcc4Qxd2oE/ufM0p61IKng==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.1.tgz", + "integrity": "sha512-TZbWkQY7kvTAXbXUT7uVACR5cMHsDiSz9z7ZKAX/RTq/WJEk3QyRr0wZpNhBDX+/0CtdqUIJlOiodQcta6tY3Q==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.1.tgz", + "integrity": "sha512-zfdzgK9ACBNZLI/CyHTOx81SyNbM6YXn7rxSgX97VjyiPl9W1i4Ka4fgKECEoFCKGpvBj5qArWIGgQjOwkgskQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.1.tgz", + "integrity": "sha512-wG2EA8ENdEI0qhkSZMjfqrdY+ziCYCPMmtZjjIwOmXFjmyzEHn+UUxk5of+SYsjtfs3VpnlC7QLzSI5hY/rOAw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.1.tgz", + "integrity": "sha512-i7dZ9vQgnvSCzi/rYCXNgtF/U+eKZNJBzu3eTQbRgHnM7tNSizLOkRFAl3qzVc/Op/u5YkHHa4pf/3DOYHthLQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.1.tgz", + "integrity": "sha512-qVXBOHQS+d5Y722GwJzJUtOLlX7km3CraOaGormF1pDtPd2C/l1SHRPgjLunLGe51Sh5YYWKMFDyV4SxgMQYTQ==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.1.tgz", + "integrity": "sha512-yHs+0uc8+nvEAfAfxrWQKK5peSNzBc4PegcMO0EJ2hT71uA7vB8Ihg2e77R2P7SG5uYjPbHlLLmve4LLLRCf0g==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.1.tgz", + "integrity": "sha512-d1z4ZuP0ajrfz/FhGT4vv278rX8KnPPJx8i5+AtK7TYbx9Le9F1hyzurZpkEyjkGa9dUGhQow4C1NmeGvqxN2w==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.1.tgz", + "integrity": "sha512-M5sRjUVZrkm1OAPR3dlOYzNmN+loZKGVi1VUQGrwuqLcbR6qeAz+famMhjASeH3YVKvZz+zT1jlh/keC3Rj/lg==", + "cpu": [ + "loong64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.1.tgz", + "integrity": "sha512-mRObBZeHh2OxcBFPWE/FjylkRgZdYuiTR3vaTozquCGOH14iP9oN4x4Ge81CoIDYQrXmIxpFumJBu5MtZpnQJQ==", + "cpu": [ + "mips64el" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.1.tgz", + "integrity": "sha512-slScBsMAb3GFDcdrCgLwZtPYRoH2H/youv10QiZyRjmsP48fznoveWytSgCI/R0ZcUgpc0ZhIUEx6LHts8yrfQ==", + "cpu": [ + "ppc64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.1.tgz", + "integrity": "sha512-kw0owk1o0GFETUJyW0jc0G4Yzs0BHZn0JDZ8JRT088vjJYX777BAs1fDGxAC+q831qOs2DTC96mNsG2opdfyyQ==", + "cpu": [ + "riscv64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.1.tgz", + "integrity": "sha512-/lAIjX8aYFRByhh6L5rYtPEDRqa9de/4V/juOXcta5frjvzXO4/sqEtyytse0g3zZFuWu5cDN0MkLz2qRDD2Ag==", + "cpu": [ + "s390x" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.1.tgz", + "integrity": "sha512-u/anNYF2mmVOEDwLtnQ1wOr3EZ9sTNGLWrsYGYwHWzGA3Si84IOkHXlbWTD1NB+9/1lcnweYKO54uhxZydNzfA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.1.tgz", + "integrity": "sha512-oks0DYbLwWMmaakTsCb+zL4E+aHRVLom9IJZOAthMQEPiQmydXHkziYEsGYRx0uNV/IjEKGAV941JzH02pflqw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.1.tgz", + "integrity": "sha512-aeL6lAnN89Hz43Mlh1G8ARasbuoYvSITDEx0tHh5b7jJnHcssqgjy9Yx430GDpmCa6OyrKoS0aNRjKundRizGg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.1.tgz", + "integrity": "sha512-MEFJe5C3R8pwXdZ5Y21oo6m7ePiS0d9pWucn99O/wvyJZChoIQKrQDxKrGeW8F5+T0okTHesAmDeiHDTIq0V/Q==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.1.tgz", + "integrity": "sha512-i/ZLIOafE0Z8cI/XANJAixoJL/uRAoS2xOA3rb0xN+KK0K177cMAsQYkzHtBrtMXAKuAc7HGgcWiZ/sRC1Nxgw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.1.tgz", + "integrity": "sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.1.tgz", + "integrity": "sha512-BEjgtECkL3vY+SaSQ6nzVfiALUeFxpawyp8Jmf5PtYhf1Ug40N1h/hxlhts+f1FvSvarEigdxS3BlSMI2PJLcQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.1.tgz", + "integrity": "sha512-lCv9eK/H6ZJWbE7bh2nw54CZ9M2nupBxJcTsdk/QQnWkdSjKGuxmmH8/GWrlT1eMmZfn4dGcCjRte397WqfQXA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.1.tgz", + "integrity": "sha512-zvb/mB2bSCoJOpoCBgYKKpX6YM6mJBlBUVUtVj41DlZJVEB6/0CKlRYxP5wWl1C1ILiCoAU5wZZ4q1P3qeS6Eg==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.1.tgz", + "integrity": "sha512-bm4Mowrv+GXMlpWX++EcXw/iLyd1o3+bJkC2DkWXYVvgZCqD/bSj9ctZeAMC3cIxgjRVR2Dufaiu4YPxr5gW1A==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "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==", + "optional": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@img/sharp-darwin-arm64": { + "version": "0.35.3", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.35.3.tgz", + "integrity": "sha512-RMnFX7YQsMoh7lWfcM4NEHHymBX/rLuKNPVM84XE9ONPcaSCDgE7CHIHpSgPcO2xcRthgBy1HfNO319mwhIAkg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-arm64": "1.3.2" + } + }, + "node_modules/@img/sharp-darwin-x64": { + "version": "0.35.3", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.35.3.tgz", + "integrity": "sha512-Xo+5uFBtLN0BKqieTxiFzFPQAUlBbbH5iBKyRX/z1JrbnYsHTfKJnUfL8+p2TPXr1pXqao4eeL4Rl144uDpK9w==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-x64": "1.3.2" + } + }, + "node_modules/@img/sharp-freebsd-wasm32": { + "version": "0.35.3", + "resolved": "https://registry.npmjs.org/@img/sharp-freebsd-wasm32/-/sharp-freebsd-wasm32-0.35.3.tgz", + "integrity": "sha512-lUxcqWIj2wMQ9BrwNjngcr1gWUr5xgaGThBRqPPalIC2n67Cqj1uPh8NnA/ZhAg8hUbKl+kVHKwgUIwe6ZYPrg==", + "optional": true, + "os": [ + "freebsd" + ], + "dependencies": { + "@img/sharp-wasm32": "0.35.3" + }, + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-darwin-arm64": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.3.2.tgz", + "integrity": "sha512-9J6ypZFpQBj4YnePGoq/S38w6nz+vqg5WZLrLGY4YuSemdMq47GMLBPO42MzwdGwpg/agZ7xzZcFHa48xlywfg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-darwin-x64": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.3.2.tgz", + "integrity": "sha512-m2pW1n6cns9VaubNwsZ+c3CRYjxNQWgJ5gPlnL1nbBcpkBvFm6SCFN5o0psFHI8w9n11NKhFkeEDns98tiqbEw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.3.2.tgz", + "integrity": "sha512-1eMLzy92I4J6rmi4mAT8yC3HxOtniyGELlzGbNMLLeqe052ahFQ0h6LFq+lh5DsDIdYViIDst08abvSbcEdLXQ==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm64": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.3.2.tgz", + "integrity": "sha512-dqVSFynCox4C/J8kT16V7SIFAns0IjgLwkvYT7p8LQVmJ5OS5b6tI9IGflxTeuBS//zXeFIUbwt5dwxyZ17cnA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-ppc64": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.3.2.tgz", + "integrity": "sha512-3z0NHDxD6n5I9gc05U1eW1AyRm+Gznzq3naMrthPNqE6oYykcogW0l/jfpJdjYnuNl8R7yI9pNbE1XiUeyq0Aw==", + "cpu": [ + "ppc64" + ], + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-riscv64": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.3.2.tgz", + "integrity": "sha512-bsb4rI+NldGOsXuej2r8OdSS8+zXDVaCWxyWrcv6kneTOlgAHtZABRzBBCwdsPiD90J4myNJuHpg6kA20ImW/w==", + "cpu": [ + "riscv64" + ], + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-s390x": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.3.2.tgz", + "integrity": "sha512-/ABshyj8gCpyIrNXnHn4LorDJ0HHm1VhXPBlxZ8zAtfVPAaSafXPGn+sUSIRiwaSBy0mmFjSjiXI5mkcwdChKQ==", + "cpu": [ + "s390x" + ], + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-x64": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.3.2.tgz", + "integrity": "sha512-ITPEtgffGJ0S6G9dRyw/366tJQqFRcHWPHhC+Stpg3Z8AEMrDrTr2lhdz4f/Y/HMbRh//7Z5mBzEpVdi62Oc3w==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-arm64": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.3.2.tgz", + "integrity": "sha512-zE9EdiUzUmg5mDT5a1rk5fYJ6GWPloTwWBYDS14naqHsL+EaMpDj1AWnpLgh3u0YCORv2Tt50wrcrpYqkP97Kw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-x64": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.3.2.tgz", + "integrity": "sha512-m0lrLiUt+lBYnCFr8qV/65yMR4E/c7/wf78I5eKTdkEakFAlZ9QlzEM3QIhhAwVeUhLAHLcCq7a7Vszq/oFNZQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-linux-arm": { + "version": "0.35.3", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.35.3.tgz", + "integrity": "sha512-affVWCTLooy8TSxbDx2qkzuDeaWLNVBA+P//FNBirHsXpP2fuBhk5AuboYUnrDnzoXes8GFjpTx0SBFOCRg+FA==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm": "1.3.2" + } + }, + "node_modules/@img/sharp-linux-arm64": { + "version": "0.35.3", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.35.3.tgz", + "integrity": "sha512-QgKDspHPnrU+GQ55XPhGwyhC8acLVOOSyAvo1oVfFmrIXLkDNmGWzAfDZ4xK8oSA1qBQrALcHX0G5UZni/SuFQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm64": "1.3.2" + } + }, + "node_modules/@img/sharp-linux-ppc64": { + "version": "0.35.3", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.35.3.tgz", + "integrity": "sha512-sMd8rDxmpLOwv/7N44klFjOD5DUO7FLdjiXDI0hoxYaf7Ar262dQIEkosE98bps+5HPLtp/EvNqeqQtOycP/IA==", + "cpu": [ + "ppc64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-ppc64": "1.3.2" + } + }, + "node_modules/@img/sharp-linux-riscv64": { + "version": "0.35.3", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.35.3.tgz", + "integrity": "sha512-0Eob78yjlYPfL5vMNWAW55l3R9Y6BQS/gOfe0ZcP9mEz9ohhKSt4im1hayiknXgf8AWrFqMvJcKIdmLmEe7yeQ==", + "cpu": [ + "riscv64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-riscv64": "1.3.2" + } + }, + "node_modules/@img/sharp-linux-s390x": { + "version": "0.35.3", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.35.3.tgz", + "integrity": "sha512-KgAxQ0DxpNOq1rG2t5cgTgShJFGSuU7XO45cqC+1NVOuZnP6tlgZRuSYOfNupGkHID0o3cJOsw4DVeJpMovcGw==", + "cpu": [ + "s390x" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-s390x": "1.3.2" + } + }, + "node_modules/@img/sharp-linux-x64": { + "version": "0.35.3", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.35.3.tgz", + "integrity": "sha512-8pqvxubL2PGdhlPy6GLqzDYMUjyRmKAwKHYKixpdJYBUK7PJ0C029XdsnpFIdgRZG68fZiGdHVWcKPvtiPB4cA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-x64": "1.3.2" + } + }, + "node_modules/@img/sharp-linuxmusl-arm64": { + "version": "0.35.3", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.35.3.tgz", + "integrity": "sha512-Vz0iQjzzcSX3HCbfwFfCSG/9SCIqyO0mH2sXyiHaAYfBk0cRsCWXRyQYX0ovCK/PAQBbTzQ0dsPQHh5MAFL59w==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-arm64": "1.3.2" + } + }, + "node_modules/@img/sharp-linuxmusl-x64": { + "version": "0.35.3", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.35.3.tgz", + "integrity": "sha512-6O1NPKcDVj9QEdg7Hx549EX8U0rp6yXQERqru6yRN7fGBn32UvIRJUlWnk+8xDCiG76hXVBbX82NZ/ZKr0euIg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-x64": "1.3.2" + } + }, + "node_modules/@img/sharp-wasm32": { + "version": "0.35.3", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.35.3.tgz", + "integrity": "sha512-cZ0XkcYGpHZkqW6iCkqTcmUC0CD9DhD5d/qeZlZkfRBn6GnHniZXLUo5+9xw8Iv76YE6LQFN9YNBlKREcCG76w==", + "optional": true, + "dependencies": { + "@emnapi/runtime": "^1.11.1" + }, + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-wasm32/node_modules/@emnapi/runtime": { + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.3.tgz", + "integrity": "sha512-Xz4Tpyki7XyrpbUK1jR1AhdAdaXyhhY4lZ3neLodmhpuWfy2PAQN5B46sAiU4liOXGLkHypn/qU+jvfWSCYYLA==", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@img/sharp-webcontainers-wasm32": { + "version": "0.35.3", + "resolved": "https://registry.npmjs.org/@img/sharp-webcontainers-wasm32/-/sharp-webcontainers-wasm32-0.35.3.tgz", + "integrity": "sha512-2rnq7bX3NzeR2T4YWgz8qiG4h3TSdMe+vN1iQXpJleSJ3SM5zQ8Fy2SyyXAWlbxpEZ2Y+Z4u1BePgJEYbSy80Q==", + "cpu": [ + "wasm32" + ], + "optional": true, + "dependencies": { + "@img/sharp-wasm32": "0.35.3" + }, + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-arm64": { + "version": "0.35.3", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.35.3.tgz", + "integrity": "sha512-4bPwFdMbeC4JQ8L8LOyWp6nsHcboP5fxkp6iPOXz2Vg49R42TuMs2whkJ5OAP4/Ul035qOzy0AecOF9VOscn4w==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-ia32": { + "version": "0.35.3", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.35.3.tgz", + "integrity": "sha512-r53mXsBN6lFUDiST764SvgwUdHAqM4rPAiDzAmf4fLoB6X/rkfyTrLCg6+g17wJJiCmB3JYgHuUldCWUIRFSXw==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-x64": { + "version": "0.35.3", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.35.3.tgz", + "integrity": "sha512-D4y1vNeZrIIJCN+uHaWVtH86B+aCrdMYYjicy9pXHvbGZeGYLLSd3wdVuC37FxVXlU1ARsk84eKWfWMXGYEqvA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=20.9.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==" + }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.2.0.tgz", + "integrity": "sha512-kDoONqMa+VnZ4vvvu/ZUurpJ4gkZU57e7g69qpNgWhYcZFPUHZM2CEMKm+cG6ufDVALbjMvfmMjFVqaK7uEMnA==", + "optional": true, + "dependencies": { + "@tybys/wasm-util": "^0.10.3" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=23.5.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + }, + "peerDependencies": { + "@emnapi/core": "^2.0.0-alpha.3", + "@emnapi/runtime": "^2.0.0-alpha.3" + } + }, + "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==" + }, + "node_modules/@oxc-project/types": { + "version": "0.139.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.139.0.tgz", + "integrity": "sha512-r9gHphtCs+1M7J0pw6Sn/hh/Wpa/iQrOOkrNAlVLF/gHq+/CJmHIWKKUUhdWjcD6CIa8idarspCsASiXCXvFUw==", + "funding": { + "url": "https://github.com/sponsors/Boshen" + } + }, + "node_modules/@rolldown/binding-android-arm64": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.1.5.tgz", + "integrity": "sha512-lZg8fqIv2v7FF237bwMgzGZEJvGL79/s5knJ/i6FmsGF4XXlzccZ4jb+TrFIxtSSxFtIpdsgrPZeMk1I9AFcyQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-arm64": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.1.5.tgz", + "integrity": "sha512-51Bnx9pNiMRKSUNtBfySkNJ9vMU9Hh3I1ozDd6gyPPYzaXCfnptUcEZxXGYFn+ul2dtcMUiqGR1Yai2K10uoTw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-x64": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.1.5.tgz", + "integrity": "sha512-Tm+gbfC0aHu1tBA/JvKQh32S0K6YgCHkiAF4/W6xX0K0RmNuc94VeK419dJoE65R5aRxmo+noZQSWrAMF6yb6g==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-freebsd-x64": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.1.5.tgz", + "integrity": "sha512-JMzDKCCXq93YccG5gz3hvOs1oXRKAf0XYpfOS88e+wZrC8Iugj6j68867vrYZkvpDDpKn/KoKORThmchMpF6TA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm-gnueabihf": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.1.5.tgz", + "integrity": "sha512-uML21j2K5TfPGutKxub+M+nLjZIrWjXQ5Grx4lCe/nimTj9B4L63zHpjXLl4y0L3mcm2htEQIb06oCG/szerNw==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-gnu": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.1.5.tgz", + "integrity": "sha512-navSiuTMogvnQoZoM/v+l3ZWo50/NTwSHSzheABx/RCnmUPaKwq9qSo4Br2OYRs21+Fz8uFqITZM3H4opOB0/Q==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-musl": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.1.5.tgz", + "integrity": "sha512-lAryqH7IteztmCXQXk0etKj4wBQ7Gx5S6LjKhsgp9zb8I5bsuvU/2llH1hDQcjsFeqIsovMVN339/8pUDDBXxA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-ppc64-gnu": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.1.5.tgz", + "integrity": "sha512-fsK/sNBnxzBlL4O1JNrZakVQxPspqpED5dLtNsZS9oOKmtSpdNIzxH2kkol5HYTWJN47sE20ztMJPxfZ89qGOg==", + "cpu": [ + "ppc64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-s390x-gnu": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.1.5.tgz", + "integrity": "sha512-gLYb4BIadlfTOYT5gO503n8zQjXflgzpD0FcyKh0Mzx3rqCZKnHoJWV9xe1KXUJ5lx2JfcSHr/mhzS0PC/McAA==", + "cpu": [ + "s390x" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-gnu": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.1.5.tgz", + "integrity": "sha512-FjcpEKUyJygHgs1o50VYNvkt5+7Le/VEdYt0AkRpkL33MnyQfwr8l5mXwMmfmTbyMPr5vJLC+8/Gd9gXnwU1QQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-musl": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.1.5.tgz", + "integrity": "sha512-Me+PfPI2TMeOQk0gYWfLQZtTktrmzbr8cDboqX83XKc7UrgAi55gF+2dUkWdxd19n55Essp2yeca+O9N5rBxHg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-openharmony-arm64": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.1.5.tgz", + "integrity": "sha512-yc5WrLzXks6zCQfn9Oxr8pORKyl/pF+QjHmW/Qx3qu0oyrrNC+y2JLTU1E2rcWYAmzlnqngWXHQjy51VzW70Vw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-wasm32-wasi": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.1.5.tgz", + "integrity": "sha512-VbQGPX2b4r48TAMIM2cjgluIM1HYutm4pcTEJsle7iEP7sB1dFqtPLBVbdLAZCxy1txCcPxf4QFf4v8uvltPqA==", + "cpu": [ + "wasm32" + ], + "optional": true, + "dependencies": { + "@emnapi/core": "1.11.1", + "@emnapi/runtime": "1.11.1", + "@napi-rs/wasm-runtime": "^1.1.6" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-wasm32-wasi/node_modules/@emnapi/core": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.11.1.tgz", + "integrity": "sha512-RSvbQmHzdKzNsLYa/wHrbc3KN4sYLKAdPZxqiM2HATqv/SBk2/ENSHpvXGaLOMcsAyz0poEGqkmmKYG3OWiJEQ==", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.2.2", + "tslib": "^2.4.0" + } + }, + "node_modules/@rolldown/binding-wasm32-wasi/node_modules/@emnapi/runtime": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.1.tgz", + "integrity": "sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@rolldown/binding-wasm32-wasi/node_modules/@emnapi/wasi-threads": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.2.tgz", + "integrity": "sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@rolldown/binding-win32-arm64-msvc": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.1.5.tgz", + "integrity": "sha512-gHv82k63z4qpV5+Q1y/12KrK0ltWBukVDI8nZcbT7Tt/ZlOIVwppazneq0F93oDxTo3IgAMEDIoQh3E2n6mVsw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-x64-msvc": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.1.5.tgz", + "integrity": "sha512-tTZuDBPw85tEN5PQi1pnEBzDy0Z49HtScLAbD5t6hyeU92A95pRWaSMw1GZZi/RwgSgUIl0xrSlXIT/9QzvYSA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", + "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==" + }, + "node_modules/@rollup/pluginutils": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.4.0.tgz", + "integrity": "sha512-MfPp06CjRLfXQ3wY0R8vJDYBy/MvVcc9OulEfR0B8Iv9ko+GCNaRZ+EpJYFl27LhKsZK0o420sYCRHCjfCgeUg==", + "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/@shikijs/core": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-4.3.1.tgz", + "integrity": "sha512-ANMDxuaPsNMdDC1m4vfvhlDmJweMwkE5XitTwrq2rWHx5jM+dlm4MmHt2PP6t0uejfR77SuhrhJ0zEijIF/uhA==", + "dependencies": { + "@shikijs/primitive": "4.3.1", + "@shikijs/types": "4.3.1", + "@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.3.1", + "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-4.3.1.tgz", + "integrity": "sha512-JBItcnPuYq7jVJdZo/vMj94r+szT7XEjHFX+mvFDGSEIbVAXAGyHAHzhbWzpGOwYidCZrErJLLgn2PVeiokHnQ==", + "dependencies": { + "@shikijs/types": "4.3.1", + "@shikijs/vscode-textmate": "^10.0.2", + "oniguruma-to-es": "^4.3.6" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@shikijs/engine-oniguruma": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-4.3.1.tgz", + "integrity": "sha512-OXyNMzg0pews+msMj4cHeqT4xiYKKvbnn6VbdAXxfoFl3SSx4fJTc8FadECuc5/H9p3BzhNAoAUXKwAu9rWYhg==", + "dependencies": { + "@shikijs/types": "4.3.1", + "@shikijs/vscode-textmate": "^10.0.2" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@shikijs/langs": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-4.3.1.tgz", + "integrity": "sha512-m0l9nsDqgBHvbZbk7A0/kXz/impK3uB/c6rAn6Gpg/uPtdZRQ+alsN/17MU5thb68XTj/4DxkZAotrM0GGSpDQ==", + "dependencies": { + "@shikijs/types": "4.3.1" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@shikijs/primitive": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@shikijs/primitive/-/primitive-4.3.1.tgz", + "integrity": "sha512-CXQRQOYy1leqQ8ceTeJdmXv/bsUY++6QyLpXJ94LZAAYj5X2SKRdc5ipguv4NPyGVKItB2PPwUpRNe0Sjh5S1A==", + "dependencies": { + "@shikijs/types": "4.3.1", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@shikijs/themes": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-4.3.1.tgz", + "integrity": "sha512-dgpoJ4WqNi2yTmizQHBJ5zcX6j2lE6icN/0yt4l1kkf16jrY/pwPLoTb1ETsWMz0OBLf9ZNvwmxft+cH+N9qSA==", + "dependencies": { + "@shikijs/types": "4.3.1" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@shikijs/types": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-4.3.1.tgz", + "integrity": "sha512-CHFxE0jztBIZRHH6gxXE7DXUCFXjReEGxZ/j0rfSLGKZuwp2xBYycEP14875DSa9KLL/6700oxIq6oO6ef9K2g==", + "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==" + }, + "node_modules/@tybys/wasm-util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.3.tgz", + "integrity": "sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@types/estree": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==" + }, + "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==", + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/@types/hast": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.5.tgz", + "integrity": "sha512-rp/ezSWaD1m44dPKICGhiskI13nVr7qTloFwDa/IYkhhf5nzwP+zIQcIJh3WIFSBOy/H1PzB40jPjMDksN4F+g==", + "dependencies": { + "@types/unist": "*" + } + }, + "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==", + "dependencies": { + "@types/unist": "*" + } + }, + "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==", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/node": { + "version": "24.13.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.13.3.tgz", + "integrity": "sha512-Dh8vAsV36ig5wa9OX4pXvMc9D3Veibfw2wix0CUwYODLD8nkj9UsLjASr49nPg+2eKzxhBV+v7L8pXvT4e639Q==", + "dependencies": { + "undici-types": "~7.18.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==", + "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==" + }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.3.tgz", + "integrity": "sha512-60YRaenCQcVjYEKOcG824+DRGGIQ3VKErcBoAEDJZz5bKIs2ZG+X/H9Nk+Q6EVkwJk5QNApxbrc5QtBSwtrXAg==" + }, + "node_modules/@volar/kit": { + "version": "2.4.28", + "resolved": "https://registry.npmjs.org/@volar/kit/-/kit-2.4.28.tgz", + "integrity": "sha512-cKX4vK9dtZvDRaAzeoUdaAJEew6IdxHNCRrdp5Kvcl6zZOqb6jTOfk3kXkIkG3T7oTFXguEMt5+9ptyqYR84Pg==", + "dev": true, + "dependencies": { + "@volar/language-service": "2.4.28", + "@volar/typescript": "2.4.28", + "typesafe-path": "^0.2.2", + "vscode-languageserver-textdocument": "^1.0.11", + "vscode-uri": "^3.0.8" + }, + "peerDependencies": { + "typescript": "*" + } + }, + "node_modules/@volar/language-core": { + "version": "2.4.28", + "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.4.28.tgz", + "integrity": "sha512-w4qhIJ8ZSitgLAkVay6AbcnC7gP3glYM3fYwKV3srj8m494E3xtrCv6E+bWviiK/8hs6e6t1ij1s2Endql7vzQ==", + "dev": true, + "dependencies": { + "@volar/source-map": "2.4.28" + } + }, + "node_modules/@volar/language-server": { + "version": "2.4.28", + "resolved": "https://registry.npmjs.org/@volar/language-server/-/language-server-2.4.28.tgz", + "integrity": "sha512-NqcLnE5gERKuS4PUFwlhMxf6vqYo7hXtbMFbViXcbVkbZ905AIVWhnSo0ZNBC2V127H1/2zP7RvVOVnyITFfBw==", + "dev": true, + "dependencies": { + "@volar/language-core": "2.4.28", + "@volar/language-service": "2.4.28", + "@volar/typescript": "2.4.28", + "path-browserify": "^1.0.1", + "request-light": "^0.7.0", + "vscode-languageserver": "^9.0.1", + "vscode-languageserver-protocol": "^3.17.5", + "vscode-languageserver-textdocument": "^1.0.11", + "vscode-uri": "^3.0.8" + } + }, + "node_modules/@volar/language-service": { + "version": "2.4.28", + "resolved": "https://registry.npmjs.org/@volar/language-service/-/language-service-2.4.28.tgz", + "integrity": "sha512-Rh/wYCZJrI5vCwMk9xyw/Z+MsWxlJY1rmMZPsxUoJKfzIRjS/NF1NmnuEcrMbEVGja00aVpCsInJfixQTMdvLw==", + "dev": true, + "dependencies": { + "@volar/language-core": "2.4.28", + "vscode-languageserver-protocol": "^3.17.5", + "vscode-languageserver-textdocument": "^1.0.11", + "vscode-uri": "^3.0.8" + } + }, + "node_modules/@volar/source-map": { + "version": "2.4.28", + "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.4.28.tgz", + "integrity": "sha512-yX2BDBqJkRXfKw8my8VarTyjv48QwxdJtvRgUpNE5erCsgEUdI2DsLbpa+rOQVAJYshY99szEcRDmyHbF10ggQ==", + "dev": true + }, + "node_modules/@volar/typescript": { + "version": "2.4.28", + "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.4.28.tgz", + "integrity": "sha512-Ja6yvWrbis2QtN4ClAKreeUZPVYMARDYZl9LMEv1iQ1QdepB6wn0jTRxA9MftYmYa4DQ4k/DaSZpFPUfxl8giw==", + "dev": true, + "dependencies": { + "@volar/language-core": "2.4.28", + "path-browserify": "^1.0.1", + "vscode-uri": "^3.0.8" + } + }, + "node_modules/@vscode/emmet-helper": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@vscode/emmet-helper/-/emmet-helper-2.11.0.tgz", + "integrity": "sha512-QLxjQR3imPZPQltfbWRnHU6JecWTF1QSWhx3GAKQpslx7y3Dp6sIIXhKjiUJ/BR9FX8PVthjr9PD6pNwOJfAzw==", + "dev": true, + "dependencies": { + "emmet": "^2.4.3", + "jsonc-parser": "^2.3.0", + "vscode-languageserver-textdocument": "^1.0.1", + "vscode-languageserver-types": "^3.15.1", + "vscode-uri": "^3.0.8" + } + }, + "node_modules/@vscode/emmet-helper/node_modules/jsonc-parser": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-2.3.1.tgz", + "integrity": "sha512-H8jvkz1O50L3dMZCsLqiuB2tA7muqbSg1AtGEkN0leAqGjsUzDJir3Zwr02BhqdcITPg3ei3mZ+HjMocAknhhg==", + "dev": true + }, + "node_modules/@vscode/l10n": { + "version": "0.0.18", + "resolved": "https://registry.npmjs.org/@vscode/l10n/-/l10n-0.0.18.tgz", + "integrity": "sha512-KYSIHVmslkaCDyw013pphY+d7x1qV8IZupYfeIfzNA+nsaWHbn5uPuQRvdRFsa9zFzGeudPuoGoZ1Op4jrJXIQ==", + "dev": true + }, + "node_modules/ajv": { + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", + "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-draft-04": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ajv-draft-04/-/ajv-draft-04-1.0.0.tgz", + "integrity": "sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==", + "dev": true, + "peerDependencies": { + "ajv": "^8.5.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-i18n": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/ajv-i18n/-/ajv-i18n-4.2.0.tgz", + "integrity": "sha512-v/ei2UkCEeuKNXh8RToiFsUclmU+G57LO1Oo22OagNMENIw+Yb8eMwvHu7Vn9fmkjJyv6XclhJ8TbuigSglPkg==", + "dev": true, + "peerDependencies": { + "ajv": "^8.0.0-beta.0" + } + }, + "node_modules/am-i-vibing": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/am-i-vibing/-/am-i-vibing-0.4.0.tgz", + "integrity": "sha512-MxT4XZL7pzLHpuvhDKdMaQHMGGkJDLluKBLsbstn+8wv9sWcFT6h+0ve9qkml95amVTZtZV83gQe2hY+ojgHLg==", + "dependencies": { + "process-ancestry": "^0.1.0" + }, + "bin": { + "am-i-vibing": "dist/cli.mjs" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/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==", + "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==" + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "node_modules/aria-query": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", + "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/astro": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/astro/-/astro-7.1.4.tgz", + "integrity": "sha512-e0gkBReJECAZuuTgpEB5JMUc6J4mM6boD6wuVE1pBf/fMywG47f8qm9XQoA6kZB1RWHiHmUlLuQ2jd9Q5+72HQ==", + "dependencies": { + "@astrojs/compiler-rs": "^0.3.1", + "@astrojs/internal-helpers": "0.10.1", + "@astrojs/markdown-satteri": "0.3.4", + "@astrojs/telemetry": "3.3.3", + "@capsizecss/unpack": "^4.0.0", + "@clack/prompts": "^1.1.0", + "@oslojs/encoding": "^1.1.0", + "@rollup/pluginutils": "^5.3.0", + "am-i-vibing": "^0.4.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": "^2.0.1", + "devalue": "^5.8.1", + "diff": "^8.0.3", + "dset": "^3.1.4", + "es-module-lexer": "^2.0.0", + "esbuild": "^0.28.0", + "flattie": "^1.1.1", + "fontace": "~0.4.1", + "get-tsconfig": "5.0.0-beta.4", + "github-slugger": "^2.0.0", + "html-escaper": "3.0.3", + "http-cache-semantics": "^4.2.0", + "js-yaml": "^4.1.1", + "jsonc-parser": "^3.3.1", + "magic-string": "^1.0.0", + "magicast": "^0.5.2", + "mrmime": "^2.0.1", + "neotraverse": "^1.0.1", + "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", + "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", + "ultrahtml": "^1.6.0", + "unifont": "~0.7.4", + "unstorage": "^1.17.5", + "vite": "^8.0.13", + "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 || ^0.35.0" + }, + "peerDependencies": { + "@astrojs/markdown-remark": "7.2.1" + }, + "peerDependenciesMeta": { + "@astrojs/markdown-remark": { + "optional": true + } + } + }, + "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==", + "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==", + "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==" + }, + "node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-html4": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "dev": true, + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.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" + } + ], + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/commander": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", + "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", + "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==", + "engines": { + "node": ">= 18" + } + }, + "node_modules/cookie": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-2.0.1.tgz", + "integrity": "sha512-yuToqVvRrj6pfDXREyQAAv8SkAEk/8GS3jQRTiUMm66TVtBYmqQeoEjL2Lmq8Rpo6271vH76InTChTitEAm65w==", + "engines": { + "node": ">=22" + }, + "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==" + }, + "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==", + "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==", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-tree": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.2.1.tgz", + "integrity": "sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==", + "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==", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/csso": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", + "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", + "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==", + "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==" + }, + "node_modules/defu": { + "version": "6.1.7", + "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.7.tgz", + "integrity": "sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==" + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/destr": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/destr/-/destr-2.0.5.tgz", + "integrity": "sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==" + }, + "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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/devalue": { + "version": "5.8.2", + "resolved": "https://registry.npmjs.org/devalue/-/devalue-5.8.2.tgz", + "integrity": "sha512-DObPPAfdtFbXjxLqK8s2Xk9ZuWz5+ZoFEhC7J76es4GU/rEiXwHTmbImoCdyoCOcBH1UF3+Cz6Z2sYD4hyl5TA==" + }, + "node_modules/devlop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/diff": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/diff/-/diff-8.0.4.tgz", + "integrity": "sha512-DPi0FmjiSU5EvQV0++GFDOJ9ASQUVFh5kD+OzOnYdi7n3Wpm9hWWGfB/O2blfHcMVTL5WkQXSnRiK9makhrcnw==", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/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==", + "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" + } + ] + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", + "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", + "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==", + "engines": { + "node": ">=4" + } + }, + "node_modules/emmet": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/emmet/-/emmet-2.4.11.tgz", + "integrity": "sha512-23QPJB3moh/U9sT4rQzGgeyyGIrcM+GH5uVYg2C6wZIxAIJq7Ng3QLT79tl8FUwDXhyq9SusfknOrofAKqvgyQ==", + "dev": true, + "dependencies": { + "@emmetio/abbreviation": "^2.3.3", + "@emmetio/css-abbreviation": "^2.1.8" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/es-module-lexer": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.3.1.tgz", + "integrity": "sha512-shc1dbU90Yl/xq1QrC7QRtfcwURZuVRfPhZbDoldJ1cn1gzDvBaBWlv0eFolj5+0znnPJz5TXLxsN77X/12KTA==" + }, + "node_modules/esbuild": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.1.tgz", + "integrity": "sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw==", + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.28.1", + "@esbuild/android-arm": "0.28.1", + "@esbuild/android-arm64": "0.28.1", + "@esbuild/android-x64": "0.28.1", + "@esbuild/darwin-arm64": "0.28.1", + "@esbuild/darwin-x64": "0.28.1", + "@esbuild/freebsd-arm64": "0.28.1", + "@esbuild/freebsd-x64": "0.28.1", + "@esbuild/linux-arm": "0.28.1", + "@esbuild/linux-arm64": "0.28.1", + "@esbuild/linux-ia32": "0.28.1", + "@esbuild/linux-loong64": "0.28.1", + "@esbuild/linux-mips64el": "0.28.1", + "@esbuild/linux-ppc64": "0.28.1", + "@esbuild/linux-riscv64": "0.28.1", + "@esbuild/linux-s390x": "0.28.1", + "@esbuild/linux-x64": "0.28.1", + "@esbuild/netbsd-arm64": "0.28.1", + "@esbuild/netbsd-x64": "0.28.1", + "@esbuild/openbsd-arm64": "0.28.1", + "@esbuild/openbsd-x64": "0.28.1", + "@esbuild/openharmony-arm64": "0.28.1", + "@esbuild/sunos-x64": "0.28.1", + "@esbuild/win32-arm64": "0.28.1", + "@esbuild/win32-ia32": "0.28.1", + "@esbuild/win32-x64": "0.28.1" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "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==" + }, + "node_modules/eventemitter3": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz", + "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==" + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-string-truncated-width": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/fast-string-truncated-width/-/fast-string-truncated-width-3.0.3.tgz", + "integrity": "sha512-0jjjIEL6+0jag3l2XWWizO64/aZVtpiGE3t0Zgqxv0DPuxiMjvB3M24fCyhZUO4KomJQPj3LTSUnDP3GpdwC0g==" + }, + "node_modules/fast-string-width": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/fast-string-width/-/fast-string-width-3.0.2.tgz", + "integrity": "sha512-gX8LrtNEI5hq8DVUfRQMbr5lpaS4nMIWV+7XEbXk2b8kiQIizgnlr12B4dA3ZEx3308ze0O4Q1R+cHts8kyUJg==", + "dependencies": { + "fast-string-truncated-width": "^3.0.2" + } + }, + "node_modules/fast-uri": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.4.tgz", + "integrity": "sha512-8JnbkQ4juDyvYs4mgFGQqg4yCYtFDtUtmp2QIQq11ZZe5CFQ5wcqm1rqDgAh/QdMySuBnPzMUiJUNZG5N/AiQw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ] + }, + "node_modules/fast-wrap-ansi": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/fast-wrap-ansi/-/fast-wrap-ansi-0.2.2.tgz", + "integrity": "sha512-7F2Fl+TjRSenLqlU3UjSH0iyqopqoZIu7eZVpEirP2g1GtWa2G/ecEmBdgz31+Mxr+ELclgg6sokpSFIQiZ02Q==", + "dependencies": { + "fast-string-width": "^3.0.2" + } + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "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==", + "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==", + "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==", + "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, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-tsconfig": { + "version": "5.0.0-beta.4", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-5.0.0-beta.4.tgz", + "integrity": "sha512-7nF7C9fIPFEMHgEMEfgIlO9wDdZ8CyHw27rWciFZfHvHDReIiPhsYuzPRXsfvBCqFy1l8RRyyWV7QLM+ZhUJsQ==", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "engines": { + "node": ">=20.20.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "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==" + }, + "node_modules/h3": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/h3/-/h3-1.15.11.tgz", + "integrity": "sha512-L3THSe2MPeBwgIZVSH5zLdBBU90TOxarvhK9d04IDY2AmVS8j2Jz2LIWtwsGOU3lu2I5jCN7FNvVfY2+XyF+mg==", + "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-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==", + "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==", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "devlop": "^1.0.0", + "hastscript": "^9.0.0", + "property-information": "^7.0.0", + "vfile": "^6.0.0", + "vfile-location": "^5.0.0", + "web-namespaces": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-parse-selector": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz", + "integrity": "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-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==", + "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-whitespace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", + "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hastscript": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-9.0.1.tgz", + "integrity": "sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==", + "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==" + }, + "node_modules/html-void-elements": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", + "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/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==" + }, + "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==", + "funding": { + "url": "https://github.com/sponsors/brc-dd" + } + }, + "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==", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/js-yaml": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.0.tgz", + "integrity": "sha512-1td788aAnnZ5qs7V2QIRl1owjtYpbKt749Y3xauqQgwIIGF/xXWz1wMTEBx5O3LK3lXLVuqXPdPxj2BoFHaW9Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/jsonc-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", + "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==" + }, + "node_modules/kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/lightningcss": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.33.0.tgz", + "integrity": "sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.33.0", + "lightningcss-darwin-arm64": "1.33.0", + "lightningcss-darwin-x64": "1.33.0", + "lightningcss-freebsd-x64": "1.33.0", + "lightningcss-linux-arm-gnueabihf": "1.33.0", + "lightningcss-linux-arm64-gnu": "1.33.0", + "lightningcss-linux-arm64-musl": "1.33.0", + "lightningcss-linux-x64-gnu": "1.33.0", + "lightningcss-linux-x64-musl": "1.33.0", + "lightningcss-win32-arm64-msvc": "1.33.0", + "lightningcss-win32-x64-msvc": "1.33.0" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.33.0.tgz", + "integrity": "sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.33.0.tgz", + "integrity": "sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.33.0.tgz", + "integrity": "sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.33.0.tgz", + "integrity": "sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.33.0.tgz", + "integrity": "sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.33.0.tgz", + "integrity": "sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.33.0.tgz", + "integrity": "sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.33.0.tgz", + "integrity": "sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.33.0.tgz", + "integrity": "sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.33.0.tgz", + "integrity": "sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.33.0.tgz", + "integrity": "sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lru-cache": { + "version": "11.5.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.2.tgz", + "integrity": "sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/magic-string": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-1.1.0.tgz", + "integrity": "sha512-kS3VHe0nEPST2saQV4Rbkchcd3UBRkVTQHo1D3h/ZTwFDhai/mfKkmtPAtD129EOI7K3HlHIsFOt0WrI2/oU9g==", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/magicast": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.5.3.tgz", + "integrity": "sha512-pVKE4UdSQ7DvHzivsCIFx2BJn1mHG6KsyrFcaxFx6tONdneEuThrDx0Cj3AMg58KyN4pzYT+LHOotxDQDjNvkw==", + "dependencies": { + "@babel/parser": "^7.29.3", + "@babel/types": "^7.29.0", + "source-map-js": "^1.2.1" + } + }, + "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==", + "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/mdn-data": { + "version": "2.27.1", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.27.1.tgz", + "integrity": "sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==" + }, + "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" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^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" + } + ] + }, + "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" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^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" + } + ] + }, + "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" + } + ] + }, + "node_modules/mrmime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", + "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", + "engines": { + "node": ">=10" + } + }, + "node_modules/muggle-string": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.4.1.tgz", + "integrity": "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==", + "dev": true + }, + "node_modules/nanoid": { + "version": "3.3.16", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.16.tgz", + "integrity": "sha512-bzlKTyNJ7+LdGIIwy8ijFpIqEQIvafahV7eYykJ8Cvh42EdJeODoJ6gUJXpQJvej1BddH8OqTXZNE/KfbWAu8Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/neotraverse": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/neotraverse/-/neotraverse-1.0.1.tgz", + "integrity": "sha512-WmmLty1YWwJl9yZi77v2dVIV6X2kuYV8YYBI/G3LWGKdGHmHUvL1z7FW0iDvEvGAwNEoc5x1tOOOyDnf5jJw/w==", + "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==", + "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==" + }, + "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==" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/obug": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.4.tgz", + "integrity": "sha512-4a+OsYv9UktOJKE+l1A4OufDgdRF9PifWj+tJnHURo/P+WOxpG4GzUFL9qCalmWauao6ogiG+QvnCovwPoyAWA==", + "funding": [ + "https://github.com/sponsors/sxzz", + "https://opencollective.com/debug" + ], + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/ofetch": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/ofetch/-/ofetch-1.5.1.tgz", + "integrity": "sha512-2W4oUZlVaqAPAil6FUg/difl6YhqhUR7x2eZY4bQCko22UXg3hptq9KLQdqFClV+Wu85UX7hNtdGTngi/1BxcA==", + "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==" + }, + "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==" + }, + "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==", + "dependencies": { + "oniguruma-parser": "^0.12.2", + "regex": "^6.1.0", + "regex-recursion": "^6.0.2" + } + }, + "node_modules/p-limit": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-7.3.1.tgz", + "integrity": "sha512-0trZaiG7Y7kN/Egy9a8j47t9osC0Tch4PaIWd9yGF6bvmlk7muExRvGNYb8sXBwEKMoNKsbNN9P8EefuQekE4Q==", + "dependencies": { + "yocto-queue": "^1.2.1" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-queue": { + "version": "9.3.3", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-9.3.3.tgz", + "integrity": "sha512-NXAOdnEe5FsZJfT4oK84lE1Y5cFFdWlRuOo5tww8DyNMxyRXwn39fIkUtNLKppcPC+UYU/bXujNCUGDv01y7CA==", + "dependencies": { + "eventemitter3": "^5.0.4", + "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==", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/package-manager-detector": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-1.8.0.tgz", + "integrity": "sha512-yQA4H19AmPEoMUeavPMDIe1higySl/gH/yaQrkT/s07Qp+7pp2hYz30N3z2l5BkjVkF9Ow6o0wjJamm2y7Sn0A==" + }, + "node_modules/parse5": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", + "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", + "dependencies": { + "entities": "^6.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "dev": true + }, + "node_modules/piccolore": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/piccolore/-/piccolore-0.1.3.tgz", + "integrity": "sha512-o8bTeDWjE086iwKrROaDf31K0qC/BENdm15/uH9usSC/uZjJOKb2YGiVHfLY4GhwsERiPI1jmwI2XrA7ACOxVw==" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" + }, + "node_modules/picomatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", + "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.5.24", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.24.tgz", + "integrity": "sha512-8RyVklq0owXUTa4xlpzu4l9AaVKIdQvAcOHZWaMh98HgySsUtxRVf/chRe3dsSLqb6i40BzGRzEUddRaI+9TSw==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.16", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/prettier": { + "version": "3.9.6", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.9.6.tgz", + "integrity": "sha512-OpN0zzVdiaiAhxpuuj5efpIS4sY9j7bY6uR5mnj5yPzGkdkjNKSJeUThPb60Jw29QuAZgA4o+/iB49kFiaBX6g==", + "dev": true, + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prismjs": { + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz", + "integrity": "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/process-ancestry": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/process-ancestry/-/process-ancestry-0.1.0.tgz", + "integrity": "sha512-tGqJW/UnclpYASFcM6Xh8D8l/BMtaQ9+CSG0vlJSJTcdMM4lDRv4c6H0Pdcsfted+bVczdYSfk2fdukg2gQkZg==", + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/property-information": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.2.0.tgz", + "integrity": "sha512-IAtzIB6sUiWaJYrX9smp3V46pBGbBeLFRGdh25kg1334VcBlD8HzhPeNIWQH9zhGmo2itIe25EHt9dQP7G5hmg==", + "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==" + }, + "node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "dev": true, + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/regex/-/regex-6.1.0.tgz", + "integrity": "sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==", + "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==", + "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==" + }, + "node_modules/request-light": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/request-light/-/request-light-0.7.0.tgz", + "integrity": "sha512-lMbBMrDoxgsyO+yB3sDcrDuX85yYt7sS8BfQd11jtbW/z5ZWgLZRcEGLsLoYw7I0WSUGQBs8CC8ScIxkTX1+6Q==", + "dev": true + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "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==", + "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/rolldown": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.1.5.tgz", + "integrity": "sha512-t9z29cJjXf/vxQ8dyhCSpt6H6aSwHTk8cT5I3iy6SMXuFpk5mB6PL6XfC8PCwrPTx93udwKUm9HRteAlTGBLiA==", + "dependencies": { + "@oxc-project/types": "=0.139.0", + "@rolldown/pluginutils": "^1.0.0" + }, + "bin": { + "rolldown": "bin/cli.mjs" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "optionalDependencies": { + "@rolldown/binding-android-arm64": "1.1.5", + "@rolldown/binding-darwin-arm64": "1.1.5", + "@rolldown/binding-darwin-x64": "1.1.5", + "@rolldown/binding-freebsd-x64": "1.1.5", + "@rolldown/binding-linux-arm-gnueabihf": "1.1.5", + "@rolldown/binding-linux-arm64-gnu": "1.1.5", + "@rolldown/binding-linux-arm64-musl": "1.1.5", + "@rolldown/binding-linux-ppc64-gnu": "1.1.5", + "@rolldown/binding-linux-s390x-gnu": "1.1.5", + "@rolldown/binding-linux-x64-gnu": "1.1.5", + "@rolldown/binding-linux-x64-musl": "1.1.5", + "@rolldown/binding-openharmony-arm64": "1.1.5", + "@rolldown/binding-wasm32-wasi": "1.1.5", + "@rolldown/binding-win32-arm64-msvc": "1.1.5", + "@rolldown/binding-win32-x64-msvc": "1.1.5" + } + }, + "node_modules/satteri": { + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/satteri/-/satteri-0.9.5.tgz", + "integrity": "sha512-ZuWVl+vnM64y+/TtX8Kosv2c00W+hLQiiwnEL6H0UKVVrxFqMw4D2CJHHQaouVd89OAhtBBfjWLqhKi3TVUV4w==", + "dependencies": { + "@types/estree-jsx": "^1.0.5", + "@types/hast": "^3.0.4", + "@types/mdast": "^4.0.4", + "@types/unist": "^3.0.3" + }, + "optionalDependencies": { + "@bruits/satteri-darwin-arm64": "0.9.5", + "@bruits/satteri-darwin-x64": "0.9.5", + "@bruits/satteri-linux-arm64-gnu": "0.9.5", + "@bruits/satteri-linux-arm64-musl": "0.9.5", + "@bruits/satteri-linux-x64-gnu": "0.9.5", + "@bruits/satteri-linux-x64-musl": "0.9.5", + "@bruits/satteri-wasm32-wasi": "0.9.5", + "@bruits/satteri-win32-arm64-msvc": "0.9.5", + "@bruits/satteri-win32-x64-msvc": "0.9.5" + } + }, + "node_modules/sax": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.6.1.tgz", + "integrity": "sha512-42tBVwLWnaQvW5zc4HbZrTuWccECCZfBi92FDuwtqxasH+JbPB3/FOKb1m222K42R4WxuxzzMsTswfzgtSu64Q==", + "engines": { + "node": ">=11.0.0" + } + }, + "node_modules/semver": { + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/sharp": { + "version": "0.35.3", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.35.3.tgz", + "integrity": "sha512-ej0zVHuZGHCiABXcNxeYhpRnPNPAcvbG8RMdBAhDAxLKkCRVSpK3Iyu7qbqw3JMzoj0REeM6f3tJLtVwl0023Q==", + "optional": true, + "dependencies": { + "@img/colour": "^1.1.0", + "detect-libc": "^2.1.2", + "semver": "^7.8.5" + }, + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.35.3", + "@img/sharp-darwin-x64": "0.35.3", + "@img/sharp-freebsd-wasm32": "0.35.3", + "@img/sharp-libvips-darwin-arm64": "1.3.2", + "@img/sharp-libvips-darwin-x64": "1.3.2", + "@img/sharp-libvips-linux-arm": "1.3.2", + "@img/sharp-libvips-linux-arm64": "1.3.2", + "@img/sharp-libvips-linux-ppc64": "1.3.2", + "@img/sharp-libvips-linux-riscv64": "1.3.2", + "@img/sharp-libvips-linux-s390x": "1.3.2", + "@img/sharp-libvips-linux-x64": "1.3.2", + "@img/sharp-libvips-linuxmusl-arm64": "1.3.2", + "@img/sharp-libvips-linuxmusl-x64": "1.3.2", + "@img/sharp-linux-arm": "0.35.3", + "@img/sharp-linux-arm64": "0.35.3", + "@img/sharp-linux-ppc64": "0.35.3", + "@img/sharp-linux-riscv64": "0.35.3", + "@img/sharp-linux-s390x": "0.35.3", + "@img/sharp-linux-x64": "0.35.3", + "@img/sharp-linuxmusl-arm64": "0.35.3", + "@img/sharp-linuxmusl-x64": "0.35.3", + "@img/sharp-webcontainers-wasm32": "0.35.3", + "@img/sharp-win32-arm64": "0.35.3", + "@img/sharp-win32-ia32": "0.35.3", + "@img/sharp-win32-x64": "0.35.3" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/shiki": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-4.3.1.tgz", + "integrity": "sha512-oR+qDVi2OjX1tmDpyv+3KviX01KzO6Af+0NNnKnsp9491UEGz2YpxTuJboS/6VhYpTdqzmuJBuiTlrAWWJAssw==", + "dependencies": { + "@shikijs/core": "4.3.1", + "@shikijs/engine-javascript": "4.3.1", + "@shikijs/engine-oniguruma": "4.3.1", + "@shikijs/langs": "4.3.1", + "@shikijs/themes": "4.3.1", + "@shikijs/types": "4.3.1", + "@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==" + }, + "node_modules/sitemap": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/sitemap/-/sitemap-9.0.1.tgz", + "integrity": "sha512-S6hzjGJSG3d6if0YoF5kTyeRJvia6FSTBroE5fQ0bu1QNxyJqhhinfUsXi9fH3MgtXODWvwo2BDyQSnhPQ88uQ==", + "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.7.1", + "resolved": "https://registry.npmjs.org/smol-toml/-/smol-toml-1.7.1.tgz", + "integrity": "sha512-PPlsspAZ4jbMBu5DMFhfUGDQLu/vrL4SyBROVS37x8ynnVmFIs1VPBz1Co8Xks3TvpIaZXmU85y4DrQ+UyVFoQ==", + "engines": { + "node": ">= 18" + }, + "funding": { + "url": "https://github.com/sponsors/cyyynthia" + } + }, + "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==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/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==" + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "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==", + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/svgo": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-4.0.2.tgz", + "integrity": "sha512-ekx94z1rRc5LDi6oSUaeRnYhd0UOJxdtQCL2rF8xpWxD3TPAsISWOrxezqGovqS38GRZOdpDfvQe3ts6F7nsng==", + "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==" + }, + "node_modules/tinyclip": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/tinyclip/-/tinyclip-0.1.15.tgz", + "integrity": "sha512-uo33abH+Ays0xYaDysoBt494Hb3hsEczMpcC0MwFl773pazORx4fmvKhclhR1wonUbB6vvpRsvVMwnhfqeMc+A==", + "engines": { + "node": "^16.14.0 || >= 17.3.0" + } + }, + "node_modules/tinyexec": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.2.4.tgz", + "integrity": "sha512-SHf/r48b7vOrjve9PxJo3MN5v5yuyjHvdUcrQffT3WXMUfnGmHDVbC4k3sHJaJTgZCwpUplIaAo5ANtMyp3YHg==", + "engines": { + "node": ">=18" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", + "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==", + "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==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "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==", + "optional": true + }, + "node_modules/typesafe-path": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/typesafe-path/-/typesafe-path-0.2.2.tgz", + "integrity": "sha512-OJabfkAg1WLZSqJAJ0Z6Sdt3utnbzr/jh+NAHoyWHJe8CMSy79Gm085094M9nvTPy22KzTVn5Zq5mbapCI/hPA==", + "dev": true + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/typescript-auto-import-cache": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/typescript-auto-import-cache/-/typescript-auto-import-cache-0.3.6.tgz", + "integrity": "sha512-RpuHXrknHdVdK7wv/8ug3Fr0WNsNi5l5aB8MYYuXhq2UH5lnEB1htJ1smhtD5VeCsGr2p8mUDtd83LCQDFVgjQ==", + "dev": true, + "dependencies": { + "semver": "^7.3.8" + } + }, + "node_modules/ufo": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.4.tgz", + "integrity": "sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==" + }, + "node_modules/ultrahtml": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/ultrahtml/-/ultrahtml-1.7.0.tgz", + "integrity": "sha512-2xRd0VHoAQE4M+vF/DvFFB7pUV0ZxTW1TLi7lHQWnF/Sb5TPeEUV/l+hxcNnGO00ZXGnR0voCMmYRKQf+rvJ2g==" + }, + "node_modules/uncrypto": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/uncrypto/-/uncrypto-0.1.3.tgz", + "integrity": "sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==" + }, + "node_modules/undici-types": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz", + "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==" + }, + "node_modules/unified": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", + "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", + "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==", + "dependencies": { + "css-tree": "^3.1.0", + "ofetch": "^1.5.1", + "ohash": "^2.0.11" + } + }, + "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==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", + "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.1.0.tgz", + "integrity": "sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz", + "integrity": "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==", + "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==", + "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/unstorage/node_modules/chokidar": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", + "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", + "dependencies": { + "readdirp": "^5.0.0" + }, + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/unstorage/node_modules/readdirp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.0.0.tgz", + "integrity": "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==", + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "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==", + "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==", + "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==", + "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": "8.1.5", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.1.5.tgz", + "integrity": "sha512-7ULLwsCdYx/nRyrpiEwvqb5TFHrMVZyBt+rg/OAXT7rgj/z+DtTDyKFeLAdDkubDVDKD8jOsndmy7m55XcfUsw==", + "dependencies": { + "lightningcss": "^1.32.0", + "picomatch": "^4.0.5", + "postcss": "^8.5.17", + "rolldown": "~1.1.5", + "tinyglobby": "^0.2.17" + }, + "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", + "@vitejs/devtools": "^0.3.0", + "esbuild": "^0.27.0 || ^0.28.0", + "jiti": ">=1.21.0", + "less": "^4.0.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 + }, + "@vitejs/devtools": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "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==", + "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/volar-service-css": { + "version": "0.0.71", + "resolved": "https://registry.npmjs.org/volar-service-css/-/volar-service-css-0.0.71.tgz", + "integrity": "sha512-wRRFt9BpjMKCazcgOh67MSjUjiWUCAh99DyYSDIOTuxaRjEtDC7PpB0k1Y1wbJIW/pVtMUSVbpPo3UGSm0Byxw==", + "dev": true, + "dependencies": { + "vscode-css-languageservice": "^6.3.0", + "vscode-languageserver-textdocument": "^1.0.11", + "vscode-uri": "^3.0.8" + }, + "peerDependencies": { + "@volar/language-service": "~2.4.0" + }, + "peerDependenciesMeta": { + "@volar/language-service": { + "optional": true + } + } + }, + "node_modules/volar-service-emmet": { + "version": "0.0.71", + "resolved": "https://registry.npmjs.org/volar-service-emmet/-/volar-service-emmet-0.0.71.tgz", + "integrity": "sha512-zqjzt6bN95e3CUstBm0PBFAJnrfz0ZAARka87fart46/gNCLLuP3Vujy8V/J8HEziTFLnfkgIASLFYPUhonJcA==", + "dev": true, + "dependencies": { + "@emmetio/css-parser": "^0.4.1", + "@emmetio/html-matcher": "^1.3.0", + "@vscode/emmet-helper": "^2.9.3", + "vscode-uri": "^3.0.8" + }, + "peerDependencies": { + "@volar/language-service": "~2.4.0" + }, + "peerDependenciesMeta": { + "@volar/language-service": { + "optional": true + } + } + }, + "node_modules/volar-service-html": { + "version": "0.0.71", + "resolved": "https://registry.npmjs.org/volar-service-html/-/volar-service-html-0.0.71.tgz", + "integrity": "sha512-e8tHPhgQ7ooLfudAEIku+kgd9pWkq3SSz8RbnQDI1+Eb8wbenkLGHqoirLqz5ORLV6wIMr2Iv08RWBG5eOcgpw==", + "dev": true, + "dependencies": { + "vscode-html-languageservice": "^5.3.0", + "vscode-languageserver-textdocument": "^1.0.11", + "vscode-uri": "^3.0.8" + }, + "peerDependencies": { + "@volar/language-service": "~2.4.0" + }, + "peerDependenciesMeta": { + "@volar/language-service": { + "optional": true + } + } + }, + "node_modules/volar-service-prettier": { + "version": "0.0.71", + "resolved": "https://registry.npmjs.org/volar-service-prettier/-/volar-service-prettier-0.0.71.tgz", + "integrity": "sha512-Rz7JVH3qD108UCdmIEiZvOBNljMt2nLFdbN8AXcDfn7xD9F5I2aCIsDVqBbXw21PsnxG0b7MfwtNF+zPS/NKUg==", + "dev": true, + "dependencies": { + "vscode-uri": "^3.0.8" + }, + "peerDependencies": { + "@volar/language-service": "~2.4.0", + "prettier": "^2.2 || ^3.0" + }, + "peerDependenciesMeta": { + "@volar/language-service": { + "optional": true + }, + "prettier": { + "optional": true + } + } + }, + "node_modules/volar-service-typescript": { + "version": "0.0.71", + "resolved": "https://registry.npmjs.org/volar-service-typescript/-/volar-service-typescript-0.0.71.tgz", + "integrity": "sha512-yTtM/BVT6hoyEYnDtaCyAtNhdNeS/mhTTABlBOdw3NNiRBUin3IznFJpgfjer4c6RYopiPjjQjc9VFhxVl1mLw==", + "dev": true, + "dependencies": { + "path-browserify": "^1.0.1", + "semver": "^7.6.2", + "typescript-auto-import-cache": "^0.3.5", + "vscode-languageserver-textdocument": "^1.0.11", + "vscode-nls": "^5.2.0", + "vscode-uri": "^3.0.8" + }, + "peerDependencies": { + "@volar/language-service": "~2.4.0" + }, + "peerDependenciesMeta": { + "@volar/language-service": { + "optional": true + } + } + }, + "node_modules/volar-service-typescript-twoslash-queries": { + "version": "0.0.71", + "resolved": "https://registry.npmjs.org/volar-service-typescript-twoslash-queries/-/volar-service-typescript-twoslash-queries-0.0.71.tgz", + "integrity": "sha512-9K2k72s4n7rV9s4bX0MyjbX9iBribvKZbBJKuEmTCZfeWJXs6Yh7bGpY4eoc7UufAjvpheBqwyZCOIPBvxCv0A==", + "dev": true, + "dependencies": { + "vscode-uri": "^3.0.8" + }, + "peerDependencies": { + "@volar/language-service": "~2.4.0" + }, + "peerDependenciesMeta": { + "@volar/language-service": { + "optional": true + } + } + }, + "node_modules/volar-service-yaml": { + "version": "0.0.71", + "resolved": "https://registry.npmjs.org/volar-service-yaml/-/volar-service-yaml-0.0.71.tgz", + "integrity": "sha512-qYGWGuVpUTnZGu5P/CR4KLK4aIR8RrcVnmfZ2eRcj9q/I8VZCoC5yy9FtEvfNvnDp4MU17yhdJcvpQPIqhJS2Q==", + "dev": true, + "dependencies": { + "vscode-uri": "^3.0.8", + "yaml-language-server": "~1.23.0" + }, + "peerDependencies": { + "@volar/language-service": "~2.4.0" + }, + "peerDependenciesMeta": { + "@volar/language-service": { + "optional": true + } + } + }, + "node_modules/vscode-css-languageservice": { + "version": "6.3.10", + "resolved": "https://registry.npmjs.org/vscode-css-languageservice/-/vscode-css-languageservice-6.3.10.tgz", + "integrity": "sha512-eq5N9Er3fC4vA9zd9EFhyBG90wtCCuXgRSpAndaOgXMh1Wgep5lBgRIeDgjZBW9pa+332yC9+49cZMW8jcL3MA==", + "dev": true, + "dependencies": { + "@vscode/l10n": "^0.0.18", + "vscode-languageserver-textdocument": "^1.0.12", + "vscode-languageserver-types": "3.17.5", + "vscode-uri": "^3.1.0" + } + }, + "node_modules/vscode-css-languageservice/node_modules/vscode-languageserver-types": { + "version": "3.17.5", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.5.tgz", + "integrity": "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==", + "dev": true + }, + "node_modules/vscode-html-languageservice": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/vscode-html-languageservice/-/vscode-html-languageservice-5.6.2.tgz", + "integrity": "sha512-ulCrSnFnfQ16YzvwnYUgEbUEl/ZG7u2eV27YhvLObSHKkb8fw1Z9cgsnUwjTEeDIdJDoTDTDpxuhQwoenoLNMg==", + "dev": true, + "dependencies": { + "@vscode/l10n": "^0.0.18", + "vscode-languageserver-textdocument": "^1.0.12", + "vscode-languageserver-types": "^3.17.5", + "vscode-uri": "^3.1.0" + } + }, + "node_modules/vscode-json-languageservice": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/vscode-json-languageservice/-/vscode-json-languageservice-4.1.8.tgz", + "integrity": "sha512-0vSpg6Xd9hfV+eZAaYN63xVVMOTmJ4GgHxXnkLCh+9RsQBkWKIghzLhW2B9ebfG+LQQg8uLtsQ2aUKjTgE+QOg==", + "dev": true, + "dependencies": { + "jsonc-parser": "^3.0.0", + "vscode-languageserver-textdocument": "^1.0.1", + "vscode-languageserver-types": "^3.16.0", + "vscode-nls": "^5.0.0", + "vscode-uri": "^3.0.2" + }, + "engines": { + "npm": ">=7.0.0" + } + }, + "node_modules/vscode-jsonrpc": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-9.0.1.tgz", + "integrity": "sha512-rfuA6T75H6m5EkbhtEPzre9pT0HPcDI2MMy4+nPFIBks5J8JBAUHD4tRYSgaBOijIEC7SRkC1kKyXTLqbmh9jw==", + "dev": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/vscode-languageserver": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-9.0.1.tgz", + "integrity": "sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g==", + "dev": true, + "dependencies": { + "vscode-languageserver-protocol": "3.17.5" + }, + "bin": { + "installServerIntoExtension": "bin/installServerIntoExtension" + } + }, + "node_modules/vscode-languageserver-protocol": { + "version": "3.18.2", + "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.18.2.tgz", + "integrity": "sha512-XRyDbT0Pp3sSNti3JmxVEUMySWCSi1hhM+/KUlCy1hV1zmrqpM1OwO12EAki8blhmLuIMpaJrYbo0OzGVfK2Qg==", + "dev": true, + "dependencies": { + "vscode-jsonrpc": "9.0.1", + "vscode-languageserver-types": "3.18.0" + } + }, + "node_modules/vscode-languageserver-textdocument": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.12.tgz", + "integrity": "sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==", + "dev": true + }, + "node_modules/vscode-languageserver-types": { + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.18.0.tgz", + "integrity": "sha512-8TsGPNMIMiiBdkORgRSvLjuiEIiAFtO+KssmYWxQ+uSVvlf7RjK8YKCOjPzZ+YA04jXEV7+7LvkSmHkhpNS99g==", + "dev": true + }, + "node_modules/vscode-languageserver/node_modules/vscode-jsonrpc": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.2.0.tgz", + "integrity": "sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==", + "dev": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/vscode-languageserver/node_modules/vscode-languageserver-protocol": { + "version": "3.17.5", + "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.5.tgz", + "integrity": "sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==", + "dev": true, + "dependencies": { + "vscode-jsonrpc": "8.2.0", + "vscode-languageserver-types": "3.17.5" + } + }, + "node_modules/vscode-languageserver/node_modules/vscode-languageserver-types": { + "version": "3.17.5", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.5.tgz", + "integrity": "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==", + "dev": true + }, + "node_modules/vscode-nls": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/vscode-nls/-/vscode-nls-5.2.0.tgz", + "integrity": "sha512-RAaHx7B14ZU04EU31pT+rKz2/zSl7xMsfIZuo8pd+KZO6PXtQmpevpq3vxvWNcrGbdmhM/rr5Uw5Mz+NBfhVng==", + "dev": true + }, + "node_modules/vscode-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.1.0.tgz", + "integrity": "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==", + "dev": 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==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/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==" + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yaml": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.0.tgz", + "integrity": "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==", + "devOptional": true, + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" + } + }, + "node_modules/yaml-language-server": { + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/yaml-language-server/-/yaml-language-server-1.23.0.tgz", + "integrity": "sha512-3qVyCOexLCWw06PQa5kRPwvMWMZ/eZeCRWUvgD6a0OkqL/4iCnxy2WumbWifa937Uo5xhyWJ0uxlU39ljhNh7A==", + "dev": true, + "dependencies": { + "@vscode/l10n": "^0.0.18", + "ajv": "^8.17.1", + "ajv-draft-04": "^1.0.0", + "ajv-i18n": "^4.2.0", + "prettier": "^3.8.1", + "request-light": "^0.5.7", + "vscode-json-languageservice": "4.1.8", + "vscode-languageserver": "^9.0.0", + "vscode-languageserver-textdocument": "^1.0.1", + "vscode-languageserver-types": "^3.16.0", + "vscode-uri": "^3.0.2", + "yaml": "2.8.3" + }, + "bin": { + "yaml-language-server": "bin/yaml-language-server" + } + }, + "node_modules/yaml-language-server/node_modules/request-light": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/request-light/-/request-light-0.5.8.tgz", + "integrity": "sha512-3Zjgh+8b5fhRJBQZoy+zbVKpAQGLyka0MPgW3zruTF4dFFJ8Fqcfu9YsAvi/rvdcaTeWG3MkbZv4WKxAn/84Lg==", + "dev": true + }, + "node_modules/yaml-language-server/node_modules/yaml": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.3.tgz", + "integrity": "sha512-AvbaCLOO2Otw/lW5bmh9d/WEdcDFdQp2Z2ZUH3pX9U2ihyUY0nvLv7J6TrWowklRGPYbB/IuIMfYgxaCPg5Bpg==", + "dev": true, + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" + } + }, + "node_modules/yargs": { + "version": "17.7.3", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.3.tgz", + "integrity": "sha512-GZtjxm/J/4TSxuL3FNYjCmLktBTnIw/rVmKSIyKeYAZpmJB2ig9VauCC5xsa82GNKVKDAqpOn3KVzNt0zmrU0g==", + "dev": true, + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "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==", + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=23" + } + }, + "node_modules/yargs/node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "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==", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zod": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.4.3.tgz", + "integrity": "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==", + "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==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..767c119 --- /dev/null +++ b/package.json @@ -0,0 +1,21 @@ +{ + "name": "llm-atlas", + "version": "0.1.0", + "private": true, + "type": "module", + "description": "从语言模型基础到 Kimi K3 的中文技术脉络与可视化课程", + "scripts": { + "dev": "astro dev --host 0.0.0.0", + "build": "astro build", + "preview": "astro preview --host 0.0.0.0", + "check": "astro check" + }, + "dependencies": { + "@astrojs/sitemap": "3.7.3", + "astro": "7.1.4" + }, + "devDependencies": { + "@astrojs/check": "0.9.6", + "typescript": "5.9.3" + } +} diff --git a/public/favicon.svg b/public/favicon.svg new file mode 100644 index 0000000..3898517 --- /dev/null +++ b/public/favicon.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/public/robots.txt b/public/robots.txt new file mode 100644 index 0000000..5b64b26 --- /dev/null +++ b/public/robots.txt @@ -0,0 +1,4 @@ +User-agent: * +Allow: / + +Sitemap: https://llm-atlas.k1412.top/sitemap-index.xml diff --git a/research/GROK_RESEARCH_ROADMAP.md b/research/GROK_RESEARCH_ROADMAP.md new file mode 100644 index 0000000..be39dde --- /dev/null +++ b/research/GROK_RESEARCH_ROADMAP.md @@ -0,0 +1,535 @@ +# LLM Atlas — Grok 辅助检索路线(K3-Anchored) + +> 生成来源:本机 Grok CLI Headless 模式,2026-07-28。 +> 用途:扩展论文线索与检查遗漏,不直接作为正文证据。主代理需回到每篇一手来源核验后,才能把结论写入网站。 + +**Site:** Chinese educational site *LLM Atlas* +**Anchor primary source:** Kimi Team, *Kimi K3: Open Frontier Intelligence*, arXiv:[2607.24653](https://arxiv.org/abs/2607.24653) (2026-07) · DOI:[10.48550/arXiv.2607.24653](https://doi.org/10.48550/arXiv.2607.24653) +**Companion official sources:** [Kimi Linear](https://arxiv.org/abs/2510.26692) · [Attention Residuals](https://arxiv.org/abs/2603.15031) · [Kimi K2](https://arxiv.org/abs/2507.20534) · [Kimi K2.5](https://arxiv.org/abs/2602.02276) · [Kimi-VL / MoonViT](https://arxiv.org/abs/2504.07491) · [Muon is Scalable](https://arxiv.org/abs/2502.16982) + +**Scope rules** +- Landmark *primary* papers only; year | title | canonical arXiv/DOI | problem solved | bridge to next idea. +- ≥80 papers; DeepSeek lineage given dense coverage; post-V3.2 only if **official** DeepSeek release. +- Uncertain / underspecified claims marked **`[UNCERTAIN]`**. +- No chapter prose — notes + tables only. + +**Paper count (this doc):** ~95 listed entries (some multi-cited across modules). + +--- + +## 0. K3 Spec Snapshot (from official report) + +| Spec | Value (official abstract / Table 1) | +|---|---| +| Total / activated params | 2.8T MoE / **104B** activated | +| Context | **1M** tokens | +| Attention pattern | Hybrid **3 KDA : 1 Gated MLA** per block; final layer Gated MLA; **69 KDA + 24 MLA** | +| Depth connectivity | **Block Attention Residuals** (blocks of 12 layers) | +| FFN | **Stable LatentMoE**: **16 of 896** routed experts (+ shared experts) | +| Vision | **MoonViT-V2** (~401M), trained **from scratch** with NTP | +| Optimizer | **Per-Head Muon** (+ weight clipping) | +| Positional | **NoPE** on MLA; position via KDA decay/gating | +| Deploy quant (post-train QAT) | MoE expert weights **MXFP4**, activations **MXFP8** | +| Scaling claim | ~**2.5×** overall scaling efficiency vs Kimi K2 **`[claim from authors]`** | +| Post-train pillars | Multi-effort RL · Multi-Teacher On-Policy Distillation (MOPD) · agent environments · 1M agentic RL | + +--- + +## 1. K3 Ingredient → Research Ancestry Map + +| K3 ingredient | Direct primary | Immediate ancestry | Module | +|---|---|---|---| +| **KDA / Kimi Linear** | [2510.26692](https://arxiv.org/abs/2510.26692) | Gated DeltaNet → DeltaNet → GLA → Linear Transformer | M04–M05 | +| **Gated MLA** | K3 §2.1.2 + DeepSeek-V2 MLA [2405.04434](https://arxiv.org/abs/2405.04434) | MQA/GQA → KV compression → latent KV | M03, M05 | +| **Attention Residuals** | [2603.15031](https://arxiv.org/abs/2603.15031) | ResNet residuals → PreNorm dilution problem | M02, M06 | +| **Stable LatentMoE** | K3 §2.3 + LatentMoE [2601.18089](https://arxiv.org/abs/2601.18089) | Switch/GShard → DeepSeekMoE → aux-loss-free routing → QB | M07, M09 | +| **MoonViT-V2** | K3 §2.4; prior MoonViT in Kimi-VL [2504.07491](https://arxiv.org/abs/2504.07491) | ViT → native-res VL encoders; K3 drops SigLIP init | M14 | +| **Per-head Muon** | K3 §2.5; Muon scale-up [2502.16982](https://arxiv.org/abs/2502.16982); MuonClip in K2 [2507.20534](https://arxiv.org/abs/2507.20534) | AdamW → matrix orthogonalization optimizers | M08 | +| **Scaling / data** | K3 §3; Kaplan/Hoffmann; K2 data rephrase | Scaling laws + domain mix + rephrase | M08 | +| **Long context (1M)** | K3 §3 progressive extension + KDA CP | RoPE/YaRN → Ring/Ulysses → NoPE+KDA | M11 | +| **Multi-effort RL** | K3 §4 effort ∈ {low, high, max} | o1-style test-time compute; k1.5 | M13 | +| **Multi-teacher on-policy distillation (MOPD)** | K3 §4.1.3; Thinking Machines on-policy distill | R1 distillation; on-policy KD | M13 | +| **Agent environments** | K3 §4.2 (pluggable harness, AET, knowledge graph) | Tool-use / SWE / OSWorld lineage | M14 | +| **KDA systems** | K3 §5.1 FlashKDA, KDA Context Parallelism | FLA / DeltaNet CP | M11, M15 | +| **MoonEP** | K3 §5 (perfect balance EP; vs DeepEP) | DeepEP / expert parallel | M11, M15 | +| **1M agentic RL** | K3 §5 partial rollouts, external KV, resumable sandboxes | Long-horizon RL infra | M14–M15 | +| **MXFP4** | K3 QAT §4.1.4; OCP MX [2310.10537](https://arxiv.org/abs/2310.10537) | FP8 training → microscaling | M10 | + +--- + +## 2. Module Graph & Prerequisites + +``` +M01 Foundations ──► M02 Residual/Norm/Pos + │ │ + ▼ ▼ +M03 Softmax KV path M04 Linear/Delta/SSM path + │ │ + └────────┬───────────┘ + ▼ + M05 Hybrid Attention (KDA+Gated MLA, NoPE) + │ + ▼ + M06 Depth Connectivity (AttnRes) + │ + M07 Sparse MoE width (Stable LatentMoE) + │ + M08 Scale / Data / Muon + │ + M09 DeepSeek full stack (MLA→V3→R1→V3.2→V4) + │ + ┌───────────┼───────────┐ + ▼ ▼ ▼ + M10 Quant M11 Long-ctx M12 Alignment (PPO/DPO) + │ systems │ + └───────────┬───────────┘ + ▼ + M13 Reasoning RL + MOPD + multi-effort + │ + ▼ + M14 Agents + Vision (MoonViT-V2) + │ + ▼ + M15 K3 Capstone Systems (MoonEP, 1M RL, MXFP4 serve) +``` + +**Suggested learning order:** M01→M02→(M03∥M04)→M05→M06→M07→M08→M09→(M10∥M11∥M12)→M13→M14→M15. + +--- + +## M01 — Foundations: Sequence Models & Softmax Attention + +**Prerequisites:** undergrad ML, basic seq modeling +**Why for K3:** defines the quadratic attention baseline that KDA/MLA hybridize. + +| Year | Title | URL | Problem solved | Bridge to next | +|---|---|---|---|---| +| 2014 | Sequence to Sequence Learning with Neural Networks | https://arxiv.org/abs/1409.3215 | End-to-end neural transduction without alignments | Need better alignment / attention | +| 2015 | Neural Machine Translation by Jointly Learning to Align and Translate | https://arxiv.org/abs/1409.0473 | Soft attention over encoder states | Attention as differentiable lookup | +| 2017 | Attention Is All You Need | https://arxiv.org/abs/1706.03762 | Drop recurrence; multi-head self-attention + PE | Canonical Transformer stack | +| 2018 | BERT: Pre-training of Deep Bidirectional Transformers | https://arxiv.org/abs/1810.04805 | Bidirectional pretrain for understanding | Pretrain–finetune paradigm | +| 2018 | Improving Language Understanding by Generative Pre-Training (GPT) | https://cdn.openai.com/research-covers/language-unsupervised/language_understanding_paper.pdf | Decoder-only LM pretrain | GPT lineage | +| 2019 | Language Models are Unsupervised Multitask Learners (GPT-2) | https://cdn.openai.com/better-language-models/language_models_are_unsupervised_multitask_learners.pdf | Zero-shot transfer via scale | Scaling narrative | +| 2020 | Language Models are Few-Shot Learners (GPT-3) | https://arxiv.org/abs/2005.14165 | In-context learning at 175B | ICL as emergent interface | + +--- + +## M02 — Residual Stacks, Normalization, Position + +**Prerequisites:** M01 +**Why for K3:** PreNorm residual dilution motivates **AttnRes**; NoPE choice; RMSNorm in MoonViT-V2. + +| Year | Title | URL | Problem solved | Bridge to next | +|---|---|---|---|---| +| 2015 | Deep Residual Learning for Image Recognition | https://arxiv.org/abs/1512.03385 | Train very deep nets via identity skip | Residual highway becomes default | +| 2016 | Layer Normalization | https://arxiv.org/abs/1607.06450 | Stabilize RNN/Transformer activations | LN → PreNorm stacks | +| 2019 | Root Mean Square Layer Normalization | https://arxiv.org/abs/1910.07467 | Cheaper, stable norm without mean centering | Modern LLM default (incl. MoonViT-V2) | +| 2021 | RoFormer: Enhanced Transformer with Rotary Position Embedding | https://arxiv.org/abs/2104.09864 | Relative PE via rotations | Dominant PE until long-ctx hacks | +| 2023 | YaRN: Efficient Context Window Extension of LLMs | https://arxiv.org/abs/2309.00071 | Extend RoPE LMs beyond train length | Positional interpolation family | +| 2024 | The NoPE Hypothesis (and related NoPE studies) **`[select primary carefully; see also K3 NoPE practice]`** | https://arxiv.org/abs/2404.12224 | When explicit PE is unnecessary | K3: NoPE on MLA; position via KDA | + +**K3 note:** MLA layers use **NoPE**; positional signal comes from KDA’s channel-wise decay/gating (K3 §2.1, §3). + +--- + +## M03 — Softmax Attention Efficiency & KV Compression → MLA + +**Prerequisites:** M01–M02 +**Why for K3:** **Gated MLA** is the global-attention “anchor” layer in the 3:1 hybrid. + +| Year | Title | URL | Problem solved | Bridge to next | +|---|---|---|---|---| +| 2019 | Fast Transformer Decoding: One Write-Head is All You Need (MQA) | https://arxiv.org/abs/1911.02150 | Share KV across heads → smaller cache | Multi-query attention | +| 2023 | GQA: Training Generalized Multi-Query Transformer Models | https://arxiv.org/abs/2305.13245 | Interpolate MHA↔MQA | Production GQA default | +| 2022 | FlashAttention: Fast and Memory-Efficient Exact Attention | https://arxiv.org/abs/2205.14135 | IO-aware exact attention | Hardware-aware attention kernels | +| 2023 | FlashAttention-2 | https://arxiv.org/abs/2307.08691 | Higher occupancy / better parallelism | Training/prefill baseline | +| 2023 | LongNet: Scaling Transformers to 1B Tokens (dilated attn) | https://arxiv.org/abs/2307.02486 | Sparse patterns for extreme length | Sparse attention design space | +| 2024 | DeepSeek-V2: Strong Economical Efficient MoE LM (**MLA**) | https://arxiv.org/abs/2405.04434 | Compress KV into latent vector (MLA) | Latent cache for huge MoEs | +| 2024 | DeepSeek-V3 Technical Report (MLA at 671B) | https://arxiv.org/abs/2412.19437 | Scale MLA + DeepSeekMoE production-grade | Gated MLA inherits MLA | +| 2025 | DeepSeek-V3.2 (**DSA** on MLA) | https://arxiv.org/abs/2512.02556 | Fine-grained sparse attention + lightning indexer | Sparse selection over latent KV | + +**K3 Gated MLA (official):** ungated MLA output gated by full-rank \(W_g\); gate matches full-rank KDA output gate (K3 §2.1.2). + +--- + +## M04 — Linear Attention, Delta Rule, SSMs → KDA Ancestry + +**Prerequisites:** M01 +**Why for K3:** **KDA** = gated delta-rule recurrence with finer channel-wise forget + full-rank output gate. + +| Year | Title | URL | Problem solved | Bridge to next | +|---|---|---|---|---| +| 2020 | Transformers are RNNs: Fast Autoregressive Transformers with Linear Attention | https://arxiv.org/abs/2006.16236 | Kernelize attention → linear time / RNN form | Linear Transformer baseline | +| 2021 | Linear Transformers Are Secretly Fast Weight Programmers | https://arxiv.org/abs/2102.11174 | Delta-rule / fast weights view of linear attn | **Delta rule** update idea | +| 2023 | Mamba: Linear-Time Sequence Modeling with Selective SSMs | https://arxiv.org/abs/2312.00752 | Input-dependent SSM selection | Modern linear-time competitor | +| 2024 | Gated Linear Attention Transformers (GLA) | https://arxiv.org/abs/2312.06635 | Data-dependent gates + FlashLinearAttention | Hardware-efficient gated linear attn | +| 2024 | Parallelizing Linear Transformers with the Delta Rule (DeltaNet) | https://arxiv.org/abs/2406.06484 | Parallel train delta-rule linear transformers | Chunkwise delta training | +| 2024 | Transformers are SSMs / Mamba-2 (SSD) | https://arxiv.org/abs/2405.21060 | Unify Transformer & SSM via structured duality | State-space dual algorithms | +| 2025 | Gated Delta Networks: Improving Mamba2 with Delta Rule | https://arxiv.org/abs/2412.06464 | Combine **gating + delta rule** | Direct parent of **KDA** | +| 2025 | Kimi Linear: Expressive Efficient Attention (**KDA**) | https://arxiv.org/abs/2510.26692 | Channel-wise fine-grained KDA + hybrid with MLA | Productionized in K3 (with K3-specific gates) | + +**K3 KDA deltas vs Kimi Linear (official §2.1.1):** lower-bounded log-decay (tile-stable chunkwise form); **full-rank** output gate (vs low-rank in Linear). + +--- + +## M05 — Hybrid Attention Architectures (KDA + Gated MLA + NoPE) + +**Prerequisites:** M03, M04 +**Why for K3:** core sequence mixer: **3×KDA + 1×Gated MLA**, final Gated MLA. + +| Year | Title | URL | Problem solved | Bridge to next | +|---|---|---|---|---| +| 2023 | Retentive Network (RetNet) | https://arxiv.org/abs/2307.08621 | Multi-scale retention recurrence | Hybrid linear/global motivation | +| 2024 | Griffin: Mixing Gated Linear Recurrences with Local Attention | https://arxiv.org/abs/2402.19427 | Mix local attention + linear recurrence | Hybrid design pattern | +| 2024 | Jamba: Hybrid Transformer-Mamba | https://arxiv.org/abs/2403.19887 | Production hybrid MoE | Hybrid at scale | +| 2024 | DeltaNet hybrids (sliding / global layers) *in* DeltaNet paper | https://arxiv.org/abs/2406.06484 | Sparse global layers restore quality | 3:1-style interleaving idea | +| 2025 | Kimi Linear (3:1 KDA:MLA hybrid) | https://arxiv.org/abs/2510.26692 | Match/beat full MLA quality at lower KV | Direct K3 attention recipe | +| 2026 | Kimi K3 (Gated MLA + refined KDA) | https://arxiv.org/abs/2607.24653 | Scale hybrid to 2.8T / 1M ctx | Capstone hybrid | + +**Reading target:** derive why periodic full latent attention repairs linear-state information bottlenecks. + +--- + +## M06 — Depth-wise Connectivity: PreNorm Dilution → Attention Residuals + +**Prerequisites:** M02, M05 +**Why for K3:** **Block AttnRes** is the depth information-flow upgrade. + +| Year | Title | URL | Problem solved | Bridge to next | +|---|---|---|---|---| +| 2015 | Deep Residual Learning (again as residual baseline) | https://arxiv.org/abs/1512.03385 | Identity mapping depth | Fixed unit residual weights | +| 2016 | Highway Networks | https://arxiv.org/abs/1505.00387 | Learned gates on residual paths | Content-dependent depth flow | +| 2017 | DenseNet | https://arxiv.org/abs/1608.06993 | Concatenate all prior feature maps | Dense cross-layer reuse | +| 2021 | DeepNet: Stabilizing Extremely Deep Transformers | https://arxiv.org/abs/2203.00555 | Scale residuals for 1000-layer Transformers | Deep PreNorm issues | +| 2026 | Attention Residuals (AttnRes / Block AttnRes) | https://arxiv.org/abs/2603.15031 | Softmax over prior layer outputs; block variant for memory | **K3 uses Block AttnRes** (S≈12) | +| 2026 | DeepSeek-V4 mHC (manifold-constrained hyper-connections) *official later residual variant* | https://arxiv.org/abs/2606.19348 | Alternative residual upgrade at 1M-ctx MoE | Parallel residual research thread | + +**K3 detail:** pseudo-query \(q_l=w_l\); Block AttnRes reduces overhead \(O(Ld)\to O(Nd)\). + +--- + +## M07 — Sparse Width: MoE → DeepSeekMoE → LatentMoE → Stable LatentMoE + +**Prerequisites:** M01, M08 (scaling intuition helps) +**Why for K3:** **Stable LatentMoE** width path (16/896 + Quantile Balancing). + +| Year | Title | URL | Problem solved | Bridge to next | +|---|---|---|---|---| +| 2017 | Outrageously Large Neural Networks (Sparsely-Gated MoE) | https://arxiv.org/abs/1701.06538 | Conditional computation at scale | MoE modern start | +| 2020 | GShard: Scaling Giant Models with Conditional Computation | https://arxiv.org/abs/2006.16668 | Automatic sharding + MoE at TPU scale | Systems MoE | +| 2021 | Switch Transformers | https://arxiv.org/abs/2101.03961 | Simplify to top-1 routing; trillion-param | Load-balance auxiliaries | +| 2022 | ST-MoE | https://arxiv.org/abs/2202.08906 | Stable training recipes for sparse models | Stability folklore | +| 2024 | DeepSeekMoE: Towards Ultimate Expert Specialization | https://arxiv.org/abs/2401.06066 | Fine-grained experts + shared experts | DeepSeek MoE DNA | +| 2024 | Mixtral of Experts | https://arxiv.org/abs/2401.04088 | Strong open sparse LM | Sparse quality reference | +| 2024 | DeepSeek-V2 (DeepSeekMoE @ production) | https://arxiv.org/abs/2405.04434 | Economical training with sparse FFN | MLA+MoE combo | +| 2024 | DeepSeek-V3 (aux-loss-free routing) | https://arxiv.org/abs/2412.19437 | Bias-based load balance without aux loss | Aux-loss-free lineage | +| 2026 | LatentMoE: Optimal Accuracy per FLOP/Parameter | https://arxiv.org/abs/2601.18089 | Route in latent cheaper expert path | Namesake of **LatentMoE** | +| 2026 | Kimi K3 Stable LatentMoE + **Quantile Balancing** | https://arxiv.org/abs/2607.24653 | Stabilize extreme sparsity (896 experts, k=16) | Production K3 FFN | + +**K3 QB (official):** expert bias from margin quantiles via global histogram all-reduce (not token-side exact quantiles). +**Also cite:** Jianlin Su blog *Travels in MoE* (load balance via optimal assignment) — referenced by K3 as [111] (Chinese primary blog, not arXiv). + +--- + +## M08 — Scaling Laws, Data Recipes, Optimizers (→ Per-Head Muon) + +**Prerequisites:** M01 +**Why for K3:** 2.5× scaling-efficiency claim; Per-Head Muon; cosine > WSD in their search. + +| Year | Title | URL | Problem solved | Bridge to next | +|---|---|---|---|---| +| 2020 | Scaling Laws for Neural Language Models (Kaplan et al.) | https://arxiv.org/abs/2001.08361 | Power-law loss vs N, D, C | Classical scaling | +| 2022 | Training Compute-Optimal LLMs (Chinchilla / Hoffmann) | https://arxiv.org/abs/2203.15556 | Tokens–params balance | TPP retuning practice | +| 2014 | Adam: A Method for Stochastic Optimization | https://arxiv.org/abs/1412.6980 | Adaptive moments | Default baseline | +| 2017 | Decoupled Weight Decay Regularization (AdamW) | https://arxiv.org/abs/1711.05101 | Correct weight decay | Pre-Muon default | +| 2024 | Muon: An Optimizer for Hidden Layers (Keller Jordan et al.) | https://kellerjordan.github.io/posts/muon/ | Newton–Schulz orthogonalized momentum | Matrix-wise updates | +| 2025 | Muon is Scalable for LLM Training (Moonshot / Moonlight) | https://arxiv.org/abs/2502.16982 | Weight decay + update scale → Muon at LLM scale | Moonshot optimizer stack | +| 2025 | Kimi K2 (MuonClip / QK-Clip) | https://arxiv.org/abs/2507.20534 | Stabilize attention logits under Muon | Pretrain 15.5T zero spike claim | +| 2026 | Kimi K3 Per-Head Muon | https://arxiv.org/abs/2607.24653 | Orthogonalize QKV **per head** for balanced head scales | K3 default optimizer | + +**Data / schedule landmarks** + +| Year | Title | URL | Problem solved | Bridge to next | +|---|---|---|---|---| +| 2020 | Exploring the Limits of Transfer Learning (T5) | https://arxiv.org/abs/1910.10683 | Unified text-to-text + C4 data | Data quality culture | +| 2022 | Training Compute-Optimal… (data side of Chinchilla) | https://arxiv.org/abs/2203.15556 | More tokens for given compute | Overtrain regimes | +| 2024 | DeepSeek LLM: Scaling Open-Source LMs with Longtermism | https://arxiv.org/abs/2401.02954 | Open scaling-law study + 67B | DeepSeek program start | +| 2025 | MiniCPM / WSD schedule discussion | https://arxiv.org/abs/2404.06395 | Warmup–Stable–Decay alternative | K3 finds **cosine better** after independent HPO | +| 2025 | Kimi K2 data rephrasing recipe | https://arxiv.org/abs/2507.20534 | Knowledge/math rephrase + fidelity checks | Inherited by K3 §3.1 | + +--- + +## M09 — DeepSeek Lineage (Dense → MoE → MLA → V3 → R1 → V3.2 → V4) + +**Prerequisites:** M03, M07, M08, M12–M13 for post-train pieces +**Policy:** include only **official** DeepSeek papers/reports. + +### 9.1 Pretrain architecture stack + +| Year | Title | URL | Problem solved | Bridge to next | +|---|---|---|---|---| +| 2024 | DeepSeek LLM: Scaling Open-Source Language Models with Longtermism | https://arxiv.org/abs/2401.02954 | Open dense 7B/67B + scaling study | Foundation | +| 2024 | DeepSeekMoE: Ultimate Expert Specialization | https://arxiv.org/abs/2401.06066 | Fine-grained + shared experts | Sparse specialization | +| 2024 | DeepSeek-V2: MLA + DeepSeekMoE | https://arxiv.org/abs/2405.04434 | KV latent compression + economical MoE | **MLA birth** | +| 2024 | DeepSeek-V3 Technical Report | https://arxiv.org/abs/2412.19437 | 671B/37B act; **FP8**; **MTP**; **aux-loss-free routing**; **DualPipe** | Flagship pretrain stack | +| 2025 | DeepSeek-V3.2: DSA + scalable RL + agentic synthesis | https://arxiv.org/abs/2512.02556 | **DeepSeek Sparse Attention**; agent post-train scale | Long-ctx efficiency | +| 2026 | DeepSeek-V4: Million-Token Context Intelligence | https://arxiv.org/abs/2606.19348 | CSA+HCA hybrid attn; **mHC**; Muon; 1M ctx Pro/Flash | Official later 1M-ctx peer to K3 | + +### 9.2 Math, RL, reasoning distillation + +| Year | Title | URL | Problem solved | Bridge to next | +|---|---|---|---|---| +| 2024 | DeepSeekMath (+ **GRPO**) | https://arxiv.org/abs/2402.03300 | Math continual pretrain + critic-free group RL | **GRPO** algorithm | +| 2025 | DeepSeek-R1: Incentivizing Reasoning via RL | https://arxiv.org/abs/2501.12948 | **R1-Zero** pure RL; **R1** multi-stage; **distillation** to dense 1.5B–70B | Reasoning RL template | +| 2025 | DeepSeek-R1 Nature version (same line) | https://doi.org/10.1038/s41586-025-09422-z | Peer-reviewed presentation of R1 | Archival citation | + +### 9.3 V3 systems keywords → primary sections + +| Keyword | Where (primary) | Problem solved | Bridge | +|---|---|---|---| +| **FP8 mixed precision** | V3 report §3.3 | Low-precision train at 671B | → MX / QAT serving | +| **MTP** (multi-token prediction) | V3 report | Stronger pretrain objective / draft head | Speculative / denser signal | +| **Aux-loss-free routing** | V3 report | Balance without aux loss interference | → K3 QB different mechanism | +| **DualPipe** | V3 report §3.2.1 | Overlap PP bubbles + MoE dispatch/combine | → MoonEP alternative EP design | +| **DSA** | V3.2 report | Sparse token selection under MLA | Contrast with KDA hybrid | +| **DeepEP** | https://github.com/deepseek-ai/DeepEP | Expert-parallel comm library | K3 MoonEP builds on / contrasts | + +**Atlas teaching note:** treat DeepSeek as the *dense reference stack* for MLA/MoE/FP8/RL; treat K3 as the *hybrid linear + AttnRes + Stable LatentMoE* fork at larger sparsity and 1M agentic RL. + +--- + +## M10 — Low-Precision Training & Deployment (FP8 → MXFP4) + +**Prerequisites:** M08–M09 +**Why for K3:** post-train **QAT** with **MXFP4 weights / MXFP8 activations** on MoE experts. + +| Year | Title | URL | Problem solved | Bridge to next | +|---|---|---|---|---| +| 2018 | Quantization and Training of Neural Networks for Integer-Arithmetic-Only Inference | https://arxiv.org/abs/1712.05877 | QAT for int inference | QAT paradigm | +| 2020 | Training with Quantization Noise | https://arxiv.org/abs/2004.07320 | Noise injection for robust quant | QAT variants | +| 2022 | FP8 Formats for Deep Learning (Micikevicius et al.) | https://arxiv.org/abs/2209.05433 | FP8 train/infer formats | Hardware FP8 | +| 2023 | Microscaling Data Formats for Deep Learning (**MX / MXFP4**) | https://arxiv.org/abs/2310.10537 | Block scales + narrow element types | **OCP MX** family | +| 2024 | DeepSeek-V3 FP8 training framework | https://arxiv.org/abs/2412.19437 | Validate FP8 at extreme MoE scale | Pretrain low-prec | +| 2026 | Kimi K3 MXFP4 QAT from SFT onward | https://arxiv.org/abs/2607.24653 | Deploy-time memory for 2.8T experts | Serving recipe | + +**OCP primary (non-arXiv):** OCP Microscaling Formats (MX) Specification v1.0 — https://www.opencompute.org/documents/ocp-microscaling-formats-mx-v1-0-spec-final-pdf + +--- + +## M11 — Long Context: Algorithms & Parallelism (→ KDA CP, 1M) + +**Prerequisites:** M03–M05 +**Why for K3:** progressive 8K→64K→256K→**1M**; **KDA Context Parallelism**; state-aware prefix cache. + +| Year | Title | URL | Problem solved | Bridge to next | +|---|---|---|---|---| +| 2023 | ALiBi | https://arxiv.org/abs/2108.12409 | Length extrapolation via linear biases | PE-free-ish long ctx | +| 2023 | RoPE / YaRN (see M02) | https://arxiv.org/abs/2309.00071 | Extend rotary models | Common production path | +| 2023 | Ring Attention with Blockwise Transformers | https://arxiv.org/abs/2310.01889 | Sequence parallel for near-infinite context | Distributed long attn | +| 2023 | DeepSpeed Ulysses | https://arxiv.org/abs/2309.14509 | Sequence parallelism system opts | Cluster long-ctx train | +| 2024 | Linear Attention Sequence Parallelism (LASP) | https://arxiv.org/abs/2404.02882 | SP specialized for linear attn | Linear-SP ancestors | +| 2025 | LASP-2 / hybrid linear SP | https://arxiv.org/abs/2502.07864 **`[verify id if citing; K3 cites related]`** | Hybrid linear+softmax SP | Closer to KDA hybrids | +| 2025 | Context Parallelism for DeltaNet (Wang) | https://yywangcs.notion.site/DeltaNet-2a9fc9f5d8058013a498f34e0b25bd52 | CP for delta recurrence | Direct ancestor of **KCP** | +| 2026 | Kimi K3 KDA Context Parallelism + FlashKDA | https://arxiv.org/abs/2607.24653 · FlashKDA https://github.com/MoonshotAI/FlashKDA | Correct state transport under delta update \(M_t S_{t-1}\) | 1M train/prefill | + +**K3 progressive extension (official):** pretrain grows 8K→64K; cooldown 256K→1M; needle/synthetic scatter tasks force full-window use. + +--- + +## M12 — Alignment Foundations (RLHF / PPO / DPO) + +**Prerequisites:** M01 +**Why for K3:** base of modern post-train before GRPO / multi-effort / MOPD. + +| Year | Title | URL | Problem solved | Bridge to next | +|---|---|---|---|---| +| 2017 | Proximal Policy Optimization Algorithms | https://arxiv.org/abs/1707.06347 | Stable policy gradient updates | RL workhorse | +| 2022 | Training Language Models to Follow Instructions with Human Feedback (InstructGPT) | https://arxiv.org/abs/2203.02155 | RLHF pipeline for LLMs | Industry alignment template | +| 2022 | Constitutional AI | https://arxiv.org/abs/2212.08073 | Principle-based AI feedback | RLAIF direction | +| 2023 | Direct Preference Optimization (DPO) | https://arxiv.org/abs/2305.18290 | Preference learning without RL loop | Offline preference | +| 2023 | Llama 2: Open Foundation and Fine-Tuned Chat Models | https://arxiv.org/abs/2307.09288 | Open RLHF stack details | Open alignment recipes | +| 2024 | SimPO / ORPO family (optional shortlist) | https://arxiv.org/abs/2405.14734 | Simpler preference objectives | Alt to DPO | + +--- + +## M13 — Reasoning RL, Multi-Effort, On-Policy Distillation + +**Prerequisites:** M12, M09 +**Why for K3:** multi-domain RL × effort levels; **MOPD** consolidation. + +| Year | Title | URL | Problem solved | Bridge to next | +|---|---|---|---|---| +| 2022 | Chain-of-Thought Prompting | https://arxiv.org/abs/2201.11903 | Elicit intermediate reasoning | Test-time reasoning culture | +| 2023 | Let’s Verify Step by Step (process reward) | https://arxiv.org/abs/2305.20050 | Process vs outcome supervision | PRM path | +| 2024 | DeepSeekMath / **GRPO** | https://arxiv.org/abs/2402.03300 | Group-relative baseline, no critic | Memory-efficient RL | +| 2024 | OpenAI o1 announcement / “Learning to Reason with LLMs” | https://openai.com/index/learning-to-reason-with-llms/ | Scale RL + test-time compute | Multi-effort ancestor **`[blog primary; not full paper]`** | +| 2025 | Kimi k1.5: Scaling RL with LLMs | https://arxiv.org/abs/2501.12599 | Long-CoT RL scaling (Moonshot) | Kimi reasoning line | +| 2025 | DeepSeek-R1 / R1-Zero / distillation | https://arxiv.org/abs/2501.12948 | Pure RL emergence; then multi-stage + distill | Distill reasoning patterns | +| 2025 | On-policy distillation (Thinking Machines Lab) | https://thinkingmachines.ai/blog/on-policy-distillation/ **`[blog; K3 cites as Connectionism note]`** | Student on-policy w.r.t teacher | **MOPD** conceptual parent | +| 2026 | MiMo-V2-Flash Technical Report (multi-teacher mention lineage) | https://arxiv.org/abs/2601.02780 | Related multi-teacher post-train | Peer system cited by K3 | +| 2026 | Kimi K3 multi-effort RL + **MOPD** | https://arxiv.org/abs/2607.24653 | Domain experts {general, agentic, coding} × {low, high, max} → single policy | Capstone post-train | + +**K3 MOPD (official):** on-policy student samples; multi-teacher logits/rewards consolidate specialists; top-k distill ablations showed no clear gain. + +--- + +## M14 — Agents, Environments, Multimodal (MoonViT-V2) + +**Prerequisites:** M13, M05 +**Why for K3:** agent harness modularization; AET; native vision-in-the-loop; MoonViT-V2 from scratch. + +### 14.1 Agent / tool / coding environments + +| Year | Title | URL | Problem solved | Bridge to next | +|---|---|---|---|---| +| 2023 | Toolformer | https://arxiv.org/abs/2302.04761 | Self-supervised tool API calls | Tool-use pretrain | +| 2023 | ReAct | https://arxiv.org/abs/2210.03629 | Interleave reason + act | Agent loop pattern | +| 2024 | SWE-bench | https://arxiv.org/abs/2310.06770 | Real GitHub issue resolution | Coding agent benchmark | +| 2024 | OSWorld | https://arxiv.org/abs/2404.07972 | Computer-use agents | GUI agent env | +| 2025 | Terminal-Bench | https://arxiv.org/abs/2502.14045 **`[confirm version K3 cites]`** | Hard CLI agent tasks | Terminal agents | +| 2025 | BrowseComp | https://arxiv.org/abs/2504.12516 | Browsing agents | Web agents | +| 2025 | Kimi K2 agentic data synthesis + joint RL | https://arxiv.org/abs/2507.20534 | Large synthetic tool trajectories | Kimi agent stack | +| 2026 | Kimi K2.5 Visual Agentic Intelligence | https://arxiv.org/abs/2602.02276 | Multimodal agents / swarm **`[swarm details in K2.5]`** | Vision agents | +| 2026 | Kimi K3 agent envs (pluggable harness, AET, knowledge graph) | https://arxiv.org/abs/2607.24653 | Avoid harness overfitting; long-horizon verifiers | Production agent RL data | + +### 14.2 Vision encoders → MoonViT-V2 + +| Year | Title | URL | Problem solved | Bridge to next | +|---|---|---|---|---| +| 2020 | An Image is Worth 16x16 Words (ViT) | https://arxiv.org/abs/2010.11929 | Transformer vision backbone | ViT era | +| 2021 | Learning Transferable Visual Models From Natural Language Supervision (CLIP) | https://arxiv.org/abs/2103.00020 | Contrastive vision–language pretrain | SigLIP-style inits | +| 2023 | SigLIP | https://arxiv.org/abs/2303.15343 | Sigmoid contrastive VL | Prior MoonViT init | +| 2024 | LLaVA-OneVision | https://arxiv.org/abs/2408.03326 | Unified single/multi-image/video tasks | Native-res VL practice | +| 2025 | Kimi-VL Technical Report (**MoonViT**) | https://arxiv.org/abs/2504.07491 | Native-resolution MoonViT + MoE LM | Moonshot VL stack | +| 2026 | Kimi K3 **MoonViT-V2** from-scratch NTP | https://arxiv.org/abs/2607.24653 | Drop SigLIP init for stability; match quality | K3 vision path | + +**K3 vision claim (official):** MoonViT-V2 ≈0.4B, 27 layers, RMSNorm, bias-free; shared image/video; 2×2 pixel-shuffle; up to 3584² in 1M context. + +--- + +## M15 — Capstone Systems: KDA Kernels, MoonEP, 1M Agentic RL, Serve + +**Prerequisites:** M05–M07, M10–M11, M13–M14 +**Why for K3:** makes 2.8T hybrid + 1M agentic RL trainable and deployable. + +| Year | Title / artifact | URL | Problem solved | Bridge to next | +|---|---|---|---|---| +| 2019 | Triton: Intermediate Language for Tiled NN Kernels | https://www.eecs.harvard.edu/~htk/publication/2019-mapl-tillet-kung-cox.pdf | Productive GPU kernels | FLA / custom attn | +| 2021 | GPipe | https://arxiv.org/abs/1811.06965 | Pipeline parallel | PP lineage | +| 2021 | Megatron-LM / efficient large-scale training | https://arxiv.org/abs/2104.04473 | 3D parallelism | Pretrain systems baseline | +| 2020 | ZeRO | https://arxiv.org/abs/1910.02054 | Shard optimizer states | Memory for huge models | +| 2024 | FLA: Flash Linear Attention library | https://github.com/fla-org/flash-linear-attention | Kernel zoo for linear/delta | KDA ops host | +| 2025 | DeepEP | https://github.com/deepseek-ai/DeepEP | Expert-parallel communication | MoonEP contrast | +| 2025 | DualPipe (in V3 report) | https://arxiv.org/abs/2412.19437 | Overlap MoE+PP | Pipeline bubbles | +| 2026 | FlashKDA | https://github.com/MoonshotAI/FlashKDA | CUTLASS chunkwise KDA | Train/prefill speed | +| 2026 | Kimi K3 **MoonEP** | https://arxiv.org/abs/2607.24653 | Perfect balance EP, static shapes, zero-copy, bounded redundant experts | 2.8T MoE train | +| 2026 | Kimi K3 1M agentic RL co-located system | https://arxiv.org/abs/2607.24653 | Partial rollouts, external KV retention, resumable sandboxes | Long-horizon RL | +| 2026 | Kimi K3 state-aware KDA prefix caching + MXFP4 serve | https://arxiv.org/abs/2607.24653 | Decode across hybrid state + quant experts | Production deployment | + +--- + +## 3. Module → K3 Ingredient Checklist + +| Module | Delivers toward K3 | +|---|---| +| M01–M02 | Transformer residual + PE literacy | +| M03 | MLA / Gated MLA | +| M04–M05 | KDA + hybrid 3:1 | +| M06 | Attention Residuals | +| M07 | Stable LatentMoE + QB vs aux-loss-free | +| M08 | Scaling 2.5× story + Per-Head Muon | +| M09 | DeepSeek dense comparator (MLA, FP8, MTP, DualPipe, GRPO, R1, DSA, V4) | +| M10 | MXFP4/MXFP8 QAT | +| M11 | 1M context + KCP | +| M12–M13 | Multi-effort RL + MOPD | +| M14 | Agent envs + MoonViT-V2 | +| M15 | MoonEP + 1M agentic RL systems | + +--- + +## 4. DeepSeek Coverage Matrix (Atlas “strong track”) + +| Topic | Primary | Module | Must-read density | +|---|---|---|---| +| DeepSeek LLM | 2401.02954 | M08/M09 | high | +| DeepSeekMoE | 2401.06066 | M07/M09 | high | +| V2 / MLA | 2405.04434 | M03/M09 | **core** | +| Math / GRPO | 2402.03300 | M13/M09 | **core** | +| V3 FP8 / MTP / aux-free / DualPipe | 2412.19437 | M09/M10/M15 | **core** | +| R1 / R1-Zero / distill | 2501.12948 (+ Nature DOI) | M13/M09 | **core** | +| V3.2 / DSA | 2512.02556 | M03/M09 | high | +| V4 (official later) | 2606.19348 | M06/M09/M11 | high (1M peer) | +| DeepEP | GitHub deepseek-ai/DeepEP | M15 | systems | + +--- + +## 5. Uncertain / Careful Claims + +| Claim | Status | +|---|---| +| K3 **2.5×** scaling efficiency vs K2 | Author-reported fit on OOD val curves (Fig. 7); **not independent replication** | +| Benchmarks vs Claude Fable 5 / GPT-5.6 Sol | Author suite; **external harness variance** possible | +| “First open 3T-class” marketing phrasing | Product language; verify total-param definitions (shared vs routed, embeddings, vision) | +| Exact MoonEP algorithm vs DeepEP | Described in K3 §5; **no standalone MoonEP paper** at time of roadmap | +| FlashKDA paper | Primarily **code artifact** + K3 description; limited standalone theory paper | +| LASP-2 arXiv number if used in syllabus | Double-check id before publishing student links | +| On-policy distillation “Connectionism” note | Blog-level primary; treat as concept source, not peer-reviewed algorithm paper | +| DeepSeek-V4 CSA/HCA vs K3 KDA | Parallel 1M-ctx designs; **do not equate** without side-by-side study | +| MoonViT-V2 “matches SigLIP init quality” | Author ablation claim (Fig. 6 + text) | +| Multi-effort exact reward formulas | Partially specified (thinking-token thresholds); full reward suite may be incomplete in report | + +--- + +## 6. Compact Reading Paths (for site UX) + +### Path A — “Understand K3 architecture in 12 papers” +1. Attention Is All You Need +2. FlashAttention-2 +3. DeepSeek-V2 (MLA) +4. Gated DeltaNet +5. Kimi Linear (KDA) +6. Attention Residuals +7. DeepSeekMoE +8. LatentMoE +9. Muon is Scalable +10. Microscaling (MXFP4) +11. DeepSeek-V3 (systems) +12. **Kimi K3** + +### Path B — “DeepSeek full stack (official only)” +DeepSeek LLM → DeepSeekMoE → DeepSeekMath/GRPO → V2/MLA → V3 → R1 → V3.2/DSA → V4 + +### Path C — “Post-train / agents” +InstructGPT → DPO → GRPO → R1 → k1.5 → K2 → K2.5 → K3 (MOPD + multi-effort + 1M agentic RL) + +--- + +## 7. Suggested Atlas Module Metadata (CMS fields) + +```yaml +module_id: M05 +title_zh: 混合注意力:KDA 与 Gated MLA +prerequisites: [M03, M04] +k3_tags: [KDA, GatedMLA, NoPE, hybrid-3to1] +primary_papers: 6 +estimated_hours: 8 +``` + +--- + +## 8. Source Log (what this roadmap used) + +| Source | Role | +|---|---| +| arXiv:2607.24653 K3 PDF text extract | Architecture, post-train, systems, bibliography | +| arXiv abstracts for DeepSeek V2/V3/V3.2/V4, R1, Math, MoE, LLM | Official lineage | +| arXiv:2510.26692 Kimi Linear | KDA definition | +| arXiv:2603.15031 AttnRes | Depth residual redesign | +| arXiv:2502.16982 / 2507.20534 | Muon / K2 | +| arXiv:2504.07491 / 2602.02276 | MoonViT / K2.5 | +| arXiv:2310.10537 + OCP MX | MXFP4 | +| arXiv:2601.18089 LatentMoE | Latent MoE naming/ancestry | + +--- + +*End of structured research notes — LLM Atlas / K3-anchored roadmap.* diff --git a/research/METHODOLOGY.md b/research/METHODOLOGY.md new file mode 100644 index 0000000..241ef17 --- /dev/null +++ b/research/METHODOLOGY.md @@ -0,0 +1,46 @@ +# 研究、引用与写作规范 + +## 来源优先级 + +1. **P0 一手论文**:arXiv、会议论文、期刊论文、作者正式技术报告。 +2. **P1 一手实现**:作者官方仓库、模型卡、训练/评测代码。 +3. **P2 官方说明**:实验室技术博客、产品文档、系统卡。 +4. **P3 独立复现**:有方法、代码和数据的第三方复现或评测。 +5. **P4 二手解释**:只用于发现线索,不承载关键事实。 + +正文关键结论原则上至少有一个 P0/P1 来源。模型发布当日尚无论文时,可以临时使用 P2,并清楚标注。 + +## 三类句子 + +- **事实**:论文明确报告的架构、数据、实验或结论,可直接引用。 +- **解释**:为了教学而做的类比、拆解和重绘,标为“直觉解释”。 +- **推断**:跨论文比较或报告未直接说明的因果判断,标为“我们的推断”并写出依据。 + +## 论文卡字段 + +- 稳定 ID、标题、作者/机构、年份; +- canonical URL、arXiv/DOI、发表状态; +- 所属专题、先修概念、后继工作; +- 它解决的问题、核心机制、关键证据; +- 一句话直觉、关键公式、图表索引; +- 限制、复现状态、与 K3/DeepSeek 的关系; +- 核验状态、核验日期、核验人/工具。 + +## 图表规范 + +- 优先原创重绘 SVG/HTML,可缩放并支持键盘阅读。 +- 图题必须说明“原创示意”“依据某图改绘”或“原图引用”。 +- 简化图不能伪装成模型的逐算子精确实现。 +- 图中颜色始终保持语义一致:蓝色表示信息流,铜色表示稀疏选择,绿色表示训练/验证反馈,紫色表示系统状态。 + +## 质量闸门 + +章节从草稿到发布依次通过: + +1. 结构检查:问题链是否完整; +2. 事实检查:数字、版本、时间、公式; +3. 来源检查:链接可达、引用贴近结论; +4. 教学检查:术语首次出现有解释,图能独立读懂; +5. 对照检查:K3/DeepSeek 映射是否准确; +6. 可访问性检查:键盘、对比度、移动端、减少动画; +7. 构建与链接检查。 diff --git a/research/sources/README.md b/research/sources/README.md new file mode 100644 index 0000000..af13453 --- /dev/null +++ b/research/sources/README.md @@ -0,0 +1,12 @@ +# 本地来源缓存 + +这里用于研究期间缓存论文 PDF、网页快照与文本抽取。二进制和全文缓存默认被 `.gitignore` 排除;公开仓库只提交 canonical URL、校验信息、研究笔记和允许再分发的原创内容。 + +当前锚点: + +- Kimi K3 Technical Report + +- Kimi K3 official repository + +- arXiv:2607.24653 + diff --git a/src/components/ArchitectureExplorer.astro b/src/components/ArchitectureExplorer.astro new file mode 100644 index 0000000..7cbf662 --- /dev/null +++ b/src/components/ArchitectureExplorer.astro @@ -0,0 +1,412 @@ +--- +const axes = [ + { + id: "token", + label: "序列 / Token", + title: "KDA × Gated MLA:让一百万 Token 既高效流动,也保留全局精确交互", + plain: "三层 KDA 像持续更新的“工作记忆”,每四层插入一层全局 MLA,像定期把整本笔记摊开重看。", + points: ["3 个 KDA 层 + 1 个 Gated MLA 层为一组", "主干共 69 层 KDA、24 层 Gated MLA", "KDA 线性扩展;MLA 周期性补足全局两两交互"], + source: "K3 §2.1", + }, + { + id: "depth", + label: "深度 / Layer", + title: "Attention Residuals:每一层不只接住上一步,而是有选择地回看更早层", + plain: "普通残差像接力棒,只能拿到累加后的结果;AttnRes 更像档案索引,可以挑选哪一层的中间表示最有用。", + points: ["学习 pseudo-query,计算跨层注意力权重", "覆盖 embedding、当前 block 与先前 block", "目标是改善 93 层网络中的信息与梯度流"], + source: "K3 §2.2", + }, + { + id: "channel", + label: "宽度 / Expert", + title: "Stable LatentMoE:896 位专家里,每个 Token 只请 16 位", + plain: "模型把“知识容量”和“本次计算量”拆开:专家库很大,但每次只激活最匹配的一小组。", + points: ["2.8T 总参数,约 104B 激活参数", "896 个 routed experts,另有 2 个 shared experts", "Normalized LatentMoE、SiTU-GLU、Quantile Balancing 稳住极稀疏路由"], + source: "K3 §2.3", + }, + { + id: "vision", + label: "视觉 / Input", + title: "MoonViT-V2:图像不是外部 OCR 结果,而是进入同一主干的视觉 Token", + plain: "视觉编码器先把图像压成一串向量,再由轻量投影器把它们放进和文字相同的表示空间。", + points: ["401M 参数视觉编码器", "训练中联合文本、图像与视频数据", "支持视觉反馈闭环:看截图、改代码、再次验证"], + source: "K3 §2.4", + }, + { + id: "system", + label: "系统 / Scale", + title: "算法—系统协同:模型结构必须能在真实集群上被训练、强化学习和服务", + plain: "一个公式只有在 GPU 内核、跨卡通信、显存和调度上都跑得通,才真正成为 2.8T 模型的一部分。", + points: ["FlashKDA 与 KDA Context Parallelism", "MoonEP 的平衡专家并行与零拷贝通信", "长上下文 RL 的外置 KV Cache、可恢复 microVM 沙箱与部分 rollout"], + source: "K3 §5", + }, +]; +--- + +
+
+ + Kimi K3 三维信息流简化图 + 文字与图像进入模型后,依次通过由 KDA、Gated MLA 和 Stable LatentMoE 组成的模块;Attention Residuals 连接不同深度的表示。 + + + + + + + + + + + + + + + + + + + + + + MoonViT + + + + + Embedding + 共享表示空间 + + + + + + KDA + 线性工作记忆 + × 3 + + + + + Gated MLA + 压缩的全局注意力 + × 1 + + + + + 下一个 + Token + + + + + Stable LatentMoE + 896 → 16 experts + + + + + + Stable LatentMoE + 896 → 16 experts + + + + + + Attention Residuals · 跨层选择 + + + + + FlashKDA · MoonEP · 1M RL · Prefix Cache · Fleet Scheduling + + +

图 01 Kimi K3 架构的教学化简图。它强调 token、depth、channel 三个信息流维度,不代表逐算子实现;依据 K3 Technical Report Figure 2 与 §2 重绘。

+
+ +
+ {axes.map((axis, index) => ( + + ))} +
+ +
+ {axes.map((axis, index) => ( + + ))} +
+
+ + + + diff --git a/src/components/AttentionLab.astro b/src/components/AttentionLab.astro new file mode 100644 index 0000000..c35b001 --- /dev/null +++ b/src/components/AttentionLab.astro @@ -0,0 +1,227 @@ +--- +const tokens = ["小猫", "坐在", "柔软的", "垫子", "上"]; +const weights = [ + [0.44, 0.14, 0.08, 0.26, 0.08], + [0.31, 0.24, 0.08, 0.25, 0.12], + [0.07, 0.08, 0.26, 0.51, 0.08], + [0.25, 0.09, 0.32, 0.27, 0.07], + [0.07, 0.15, 0.05, 0.55, 0.18], +]; +--- + +
+
+
+ INTERACTIVE / SELF-ATTENTION +

点一个词,看它“回头看”谁

+
+

示意权重不是训练模型的真实输出;它只帮助理解一次注意力查询的流程。

+
+ +
+ {tokens.map((token, index) => ( + + ))} +
+ +
+
+ QUERY / 我正在理解 + +

Query 是当前词提出的问题:“为了更新我的表示,我应该从哪些词取信息?”

+
+
+ {tokens.map((token, index) => ( +
+ {token} +
+ {Math.round(weights[4][index] * 100)}% +
+ ))} +
+
+ +
图 02 单个注意力头的教学示意。真正的模型会在每一层、每个头上并行进行类似计算,权重由 QKᵀ 经缩放和 softmax 得到。
+
+ + + + diff --git a/src/components/DeepSeekLineage.astro b/src/components/DeepSeekLineage.astro new file mode 100644 index 0000000..2e6b84e --- /dev/null +++ b/src/components/DeepSeekLineage.astro @@ -0,0 +1,152 @@ +--- +const milestones = [ + { + year: "2024.01", + model: "DeepSeek LLM", + idea: "公开尺度规律与中英双语预训练,建立 7B / 67B dense 基线。", + bridge: "先弄清规模、数据与训练配方,再做稀疏化。", + url: "https://arxiv.org/abs/2401.02954", + }, + { + year: "2024.01", + model: "DeepSeekMoE", + idea: "细粒度专家分割 + shared experts,让专家更专、公共知识不必重复。", + bridge: "把容量扩张和每 Token 计算量分开。", + url: "https://arxiv.org/abs/2401.06066", + }, + { + year: "2024.05", + model: "DeepSeek-V2", + idea: "MLA 压缩 KV Cache;DeepSeekMoE 扩张稀疏容量。", + bridge: "训练经济性之外,开始直接优化推理内存与吞吐。", + url: "https://arxiv.org/abs/2405.04434", + }, + { + year: "2024.12", + model: "DeepSeek-V3", + idea: "671B-A37B、FP8 训练、无辅助损失负载均衡、MTP 与 DualPipe。", + bridge: "模型算法、数值格式与集群通信共同设计。", + url: "https://arxiv.org/abs/2412.19437", + }, + { + year: "2025.01", + model: "DeepSeek-R1", + idea: "R1-Zero 展示纯大规模 RL 可涌现推理;R1 用冷启动数据修复可读性与稳定性。", + bridge: "从“模仿答案”转向用可验证奖励塑造推理策略。", + url: "https://arxiv.org/abs/2501.12948", + }, + { + year: "2025.12", + model: "DeepSeek-V3.2", + idea: "DeepSeek Sparse Attention 降低长上下文成本,并统一 thinking 与 tool use。", + bridge: "把推理模型推进长上下文 Agent 场景。", + url: "https://arxiv.org/abs/2512.02556", + }, + { + year: "2026.06", + model: "DeepSeek-V4", + idea: "围绕百万 Token 上下文效率继续扩展,成为 K3 报告直接比较的开放前沿之一。", + bridge: "长上下文不再只是位置外推,而是注意力、训练与服务的全系统问题。", + url: "https://arxiv.org/abs/2606.19348", + }, +]; +--- + + + + diff --git a/src/components/SiteFooter.astro b/src/components/SiteFooter.astro new file mode 100644 index 0000000..dad26e7 --- /dev/null +++ b/src/components/SiteFooter.astro @@ -0,0 +1,13 @@ + diff --git a/src/components/SiteHeader.astro b/src/components/SiteHeader.astro new file mode 100644 index 0000000..261a704 --- /dev/null +++ b/src/components/SiteHeader.astro @@ -0,0 +1,50 @@ +--- +interface Props { + active?: string; +} + +const { active = "" } = Astro.props; +const items = [ + { id: "home", href: "/", label: "首页" }, + { id: "roadmap", href: "/roadmap/", label: "学习地图" }, + { id: "k3", href: "/k3/", label: "K3 解剖" }, + { id: "deepseek", href: "/deepseek/", label: "DeepSeek" }, + { id: "foundations", href: "/foundations/", label: "基础原理" }, + { id: "papers", href: "/papers/", label: "论文库" }, + { id: "progress", href: "/progress/", label: "进度" }, +]; +--- + + + + diff --git a/src/data/chapters.ts b/src/data/chapters.ts new file mode 100644 index 0000000..e3f7e5d --- /dev/null +++ b/src/data/chapters.ts @@ -0,0 +1,233 @@ +export type ChapterStatus = "published" | "drafting" | "researching" | "queued"; + +export interface Chapter { + number: string; + slug: string; + title: string; + kicker: string; + question: string; + summary: string; + status: ChapterStatus; + progress: number; + papers: number; + prerequisites: string[]; + highlights: string[]; +} + +export const chapters: Chapter[] = [ + { + number: "00", + slug: "roadmap", + title: "先看懂一张大模型地图", + kicker: "ORIENTATION", + question: "面对几百个术语,我们究竟先学什么?", + summary: "建立问题链、依赖关系、论文阅读方法和证据等级;把 K3 放回完整技术地图。", + status: "published", + progress: 72, + papers: 12, + prerequisites: [], + highlights: ["四层难度", "一张依赖图", "阅读路径"], + }, + { + number: "01", + slug: "foundations/language-models", + title: "语言模型从哪里来", + kicker: "LANGUAGE MODELING", + question: "预测下一个 Token,为什么能产生通用能力?", + summary: "从 N-gram、神经概率语言模型、词向量一路走到 Seq2Seq,理解 Transformer 出现前的瓶颈。", + status: "researching", + progress: 24, + papers: 10, + prerequisites: [], + highlights: ["概率分解", "分布式表示", "序列瓶颈"], + }, + { + number: "02", + slug: "foundations", + title: "注意力与 Transformer", + kicker: "TRANSFORMER", + question: "一句话里的每个词,怎样直接找到真正相关的词?", + summary: "用可操作的小例子拆开 Q、K、V、自注意力、多头、因果掩码、残差与前馈网络。", + status: "published", + progress: 45, + papers: 12, + prerequisites: ["01"], + highlights: ["Q / K / V", "交互实验", "张量形状"], + }, + { + number: "03", + slug: "architecture/representation", + title: "表示、位置与残差高速公路", + kicker: "REPRESENTATION", + question: "模型如何知道词序,又如何让信息穿过上百层?", + summary: "从分词、位置编码、归一化与激活函数,走到深层网络的信息流和 Attention Residuals。", + status: "researching", + progress: 18, + papers: 16, + prerequisites: ["02"], + highlights: ["RoPE", "RMSNorm", "AttnRes"], + }, + { + number: "04", + slug: "scaling", + title: "Scaling Laws:规模为什么有效", + kicker: "SCALING", + question: "多大模型、多少数据、多少计算才是划算的?", + summary: "区分参数量、激活参数、训练计算和推理预算;理解 Kaplan、Chinchilla 与 K3 的双轴扩展。", + status: "researching", + progress: 22, + papers: 11, + prerequisites: ["01", "02"], + highlights: ["幂律", "计算最优", "测试时扩展"], + }, + { + number: "05", + slug: "pretraining/data", + title: "数据工程与预训练配方", + kicker: "DATA", + question: "更多网页为什么不等于更好的模型?", + summary: "追踪采集、过滤、去重、混合、课程、合成数据与污染控制,并明确公开报告的知识边界。", + status: "queued", + progress: 8, + papers: 14, + prerequisites: ["01", "04"], + highlights: ["数据质量", "混合策略", "污染"], + }, + { + number: "06", + slug: "architecture/moe", + title: "稀疏计算与 MoE", + kicker: "SPARSE EXPERTS", + question: "怎样让模型装下更多知识,却不让每个 Token 都付全部算力?", + summary: "从条件计算到 DeepSeekMoE、LatentMoE 与 K3 Stable LatentMoE,解释路由、特化和负载均衡。", + status: "researching", + progress: 28, + papers: 17, + prerequisites: ["02", "04"], + highlights: ["专家路由", "细粒度专家", "896 选 16"], + }, + { + number: "07", + slug: "architecture/long-context", + title: "长上下文与高效注意力", + kicker: "LONG CONTEXT", + question: "从 8K 到 1M Token,真正昂贵的是什么?", + summary: "比较稀疏/线性注意力、FlashAttention、MLA、状态空间模型、Delta Rule、KDA 与混合注意力。", + status: "researching", + progress: 31, + papers: 24, + prerequisites: ["02", "03"], + highlights: ["KV Cache", "MLA", "KDA"], + }, + { + number: "08", + slug: "systems/training", + title: "大规模训练系统", + kicker: "DISTRIBUTED TRAINING", + question: "一个 2.8T 模型如何摊到成千上万张卡上?", + summary: "从 ZeRO、Megatron 和五类并行,走到 DeepSeek DualPipe/DeepEP 与 K3 MoonEP。", + status: "queued", + progress: 12, + papers: 18, + prerequisites: ["04", "06"], + highlights: ["并行维度", "通信重叠", "MoonEP"], + }, + { + number: "09", + slug: "systems/numerics", + title: "数值精度、优化器与稳定性", + kicker: "OPTIMIZATION", + question: "为什么少几个比特能省巨资,也可能让训练瞬间崩掉?", + summary: "解释 AdamW、μP、Muon、BF16/FP8/MXFP4 与量化感知训练的数值直觉。", + status: "queued", + progress: 13, + papers: 16, + prerequisites: ["02", "08"], + highlights: ["FP8", "Muon", "MXFP4"], + }, + { + number: "10", + slug: "post-training/alignment", + title: "指令微调与人类偏好", + kicker: "ALIGNMENT", + question: "会续写的 base model,怎样变成愿意协作的助手?", + summary: "从 instruction tuning、SFT、RLHF/PPO 到 DPO 与 RLAIF,区分能力学习和行为塑形。", + status: "queued", + progress: 10, + papers: 18, + prerequisites: ["01", "02"], + highlights: ["SFT", "奖励模型", "偏好优化"], + }, + { + number: "11", + slug: "reasoning", + title: "推理模型与测试时扩展", + kicker: "REASONING", + question: "模型如何学会多想一会儿,并检查自己的答案?", + summary: "从 CoT、搜索与验证器,到 GRPO、DeepSeek-R1、Kimi k1.5 和 multi-effort RL。", + status: "researching", + progress: 25, + papers: 21, + prerequisites: ["10"], + highlights: ["GRPO", "R1-Zero", "On-policy 蒸馏"], + }, + { + number: "12", + slug: "agents", + title: "工具使用与长程 Agent", + kicker: "AGENTS", + question: "生成一段文字,怎样变成持续数小时的可靠行动?", + summary: "讨论工具协议、行动—观察循环、环境奖励、沙箱、可验证任务与百万 Token 轨迹。", + status: "queued", + progress: 14, + papers: 22, + prerequisites: ["10", "11"], + highlights: ["ReAct", "沙箱", "长轨迹 RL"], + }, + { + number: "13", + slug: "multimodal", + title: "原生多模态", + kicker: "MULTIMODAL", + question: "图像是外接插件,还是和文字一样的第一类输入?", + summary: "从 ViT/CLIP、连接器式 VLM 走到 Kimi-VL、MoonViT-V2 与统一主干。", + status: "queued", + progress: 11, + papers: 19, + prerequisites: ["02"], + highlights: ["ViT", "视觉 Token", "MoonViT-V2"], + }, + { + number: "14", + slug: "systems/inference", + title: "推理服务与低成本部署", + kicker: "INFERENCE", + question: "模型训练完以后,怎样让千万人用得起?", + summary: "拆解 KV Cache、PagedAttention、批处理、推测解码、PD 解耦、前缀缓存与集群调度。", + status: "queued", + progress: 12, + papers: 20, + prerequisites: ["07", "08", "09"], + highlights: ["vLLM", "Mooncake", "KDA 缓存"], + }, + { + number: "15", + slug: "evaluation", + title: "评测、安全与“到底强不强”", + kicker: "EVALUATION", + question: "一个榜单分数,究竟测到了模型、脚手架还是预算?", + summary: "从语言建模指标走到知识、代码、Agent 和多模态评测,识别污染、harness 与选择性报告。", + status: "queued", + progress: 13, + papers: 24, + prerequisites: ["04", "10", "12"], + highlights: ["基准演化", "Harness", "安全边界"], + }, +]; + +export const statusLabel: Record = { + published: "首版可读", + drafting: "写作中", + researching: "研究中", + queued: "待展开", +}; diff --git a/src/data/papers.ts b/src/data/papers.ts new file mode 100644 index 0000000..05f8a0a --- /dev/null +++ b/src/data/papers.ts @@ -0,0 +1,1058 @@ +export type PaperTopic = + | "基础" + | "Transformer" + | "长上下文" + | "MoE" + | "Scaling" + | "训练系统" + | "低精度" + | "后训练" + | "推理" + | "Agent" + | "多模态" + | "评测"; + +export interface Paper { + year: number; + title: string; + url: string; + topics: PaperTopic[]; + contribution: string; + spotlight?: "Kimi" | "DeepSeek"; + verified: boolean; +} + +export const papers: Paper[] = [ + { + year: 1948, + title: "A Mathematical Theory of Communication", + url: "https://doi.org/10.1002/j.1538-7305.1948.tb01338.x", + topics: ["基础"], + contribution: "信息熵与序列概率的理论起点。", + verified: true, + }, + { + year: 2003, + title: "A Neural Probabilistic Language Model", + url: "https://www.jmlr.org/papers/v3/bengio03a.html", + topics: ["基础"], + contribution: "用分布式词表示和神经网络突破 N-gram 稀疏泛化。", + verified: true, + }, + { + year: 2013, + title: "Efficient Estimation of Word Representations in Vector Space", + url: "https://arxiv.org/abs/1301.3781", + topics: ["基础"], + contribution: "Word2Vec 把大规模词向量训练变得简单高效。", + verified: true, + }, + { + year: 2014, + title: "Sequence to Sequence Learning with Neural Networks", + url: "https://arxiv.org/abs/1409.3215", + topics: ["基础"], + contribution: "Encoder—decoder 统一可变长序列映射,也暴露固定向量瓶颈。", + verified: true, + }, + { + year: 2014, + title: "Neural Machine Translation by Jointly Learning to Align and Translate", + url: "https://arxiv.org/abs/1409.0473", + topics: ["基础", "Transformer"], + contribution: "用可微软对齐让 decoder 直接检索全部 encoder state。", + verified: true, + }, + { + year: 2015, + title: "Neural Machine Translation of Rare Words with Subword Units", + url: "https://arxiv.org/abs/1508.07909", + topics: ["基础"], + contribution: "把 BPE 引入神经机器翻译,形成现代子词分词主线。", + verified: true, + }, + { + year: 2017, + title: "Attention Is All You Need", + url: "https://arxiv.org/abs/1706.03762", + topics: ["Transformer"], + contribution: "用多头自注意力与 FFN 取代循环,开启高度并行预训练。", + verified: true, + }, + { + year: 2018, + title: "SentencePiece: A simple and language independent subword tokenizer", + url: "https://arxiv.org/abs/1808.06226", + topics: ["基础"], + contribution: "直接从原始句子训练语言无关子词模型。", + verified: true, + }, + { + year: 2018, + title: "Improving Language Understanding by Generative Pre-Training", + url: "https://cdn.openai.com/research-covers/language-unsupervised/language_understanding_paper.pdf", + topics: ["Transformer", "Scaling"], + contribution: "GPT-1 建立 decoder-only 生成式预训练再迁移的路线。", + verified: true, + }, + { + year: 2018, + title: "BERT: Pre-training of Deep Bidirectional Transformers", + url: "https://arxiv.org/abs/1810.04805", + topics: ["Transformer"], + contribution: "双向 masked language modeling 验证大规模预训练表示。", + verified: true, + }, + { + year: 2019, + title: "Language Models are Unsupervised Multitask Learners", + url: "https://cdn.openai.com/better-language-models/language_models_are_unsupervised_multitask_learners.pdf", + topics: ["Transformer", "Scaling"], + contribution: "GPT-2 展示规模扩大后的零样本任务迁移。", + verified: true, + }, + { + year: 2019, + title: "Exploring the Limits of Transfer Learning with a Unified Text-to-Text Transformer", + url: "https://arxiv.org/abs/1910.10683", + topics: ["Transformer", "Scaling"], + contribution: "T5 统一 text-to-text 接口并系统研究架构与数据。", + verified: true, + }, + { + year: 2019, + title: "Transformer-XL: Attentive Language Models Beyond a Fixed-Length Context", + url: "https://arxiv.org/abs/1901.02860", + topics: ["Transformer", "长上下文"], + contribution: "跨 segment recurrence 与相对位置,突破固定窗口。", + verified: true, + }, + { + year: 2019, + title: "Root Mean Square Layer Normalization", + url: "https://arxiv.org/abs/1910.07467", + topics: ["Transformer"], + contribution: "不做均值中心化的轻量归一化,成为现代 LLM 常用组件。", + verified: true, + }, + { + year: 2020, + title: "Language Models are Few-Shot Learners", + url: "https://arxiv.org/abs/2005.14165", + topics: ["Transformer", "Scaling"], + contribution: "GPT-3 展示规模扩大后 in-context learning 的通用接口。", + verified: true, + }, + { + year: 2020, + title: "GLU Variants Improve Transformer", + url: "https://arxiv.org/abs/2002.05202", + topics: ["Transformer"], + contribution: "系统比较 GLU 变体,SwiGLU 进入现代 FFN 配方。", + verified: true, + }, + { + year: 2020, + title: "Longformer: The Long-Document Transformer", + url: "https://arxiv.org/abs/2004.05150", + topics: ["长上下文"], + contribution: "局部滑窗加少量全局 Token,将长文档 attention 稀疏化。", + verified: true, + }, + { + year: 2020, + title: "Reformer: The Efficient Transformer", + url: "https://arxiv.org/abs/2001.04451", + topics: ["长上下文"], + contribution: "LSH attention 与可逆层降低长序列时间和内存。", + verified: true, + }, + { + year: 2020, + title: "Linformer: Self-Attention with Linear Complexity", + url: "https://arxiv.org/abs/2006.04768", + topics: ["长上下文"], + contribution: "用低秩投影压缩序列维,使 attention 近似线性。", + verified: true, + }, + { + year: 2020, + title: "Transformers are RNNs: Fast Autoregressive Transformers with Linear Attention", + url: "https://arxiv.org/abs/2006.16236", + topics: ["长上下文"], + contribution: "核化 attention 获得线性复杂度与递归推理形式。", + verified: true, + }, + { + year: 2020, + title: "Rethinking Attention with Performers", + url: "https://arxiv.org/abs/2009.14794", + topics: ["长上下文"], + contribution: "用随机特征近似 softmax attention,兼顾无偏与线性复杂度。", + verified: true, + }, + { + year: 2021, + title: "Linear Transformers Are Secretly Fast Weight Programmers", + url: "https://arxiv.org/abs/2102.11174", + topics: ["长上下文"], + contribution: "把线性 attention 解释为 fast weights,并引入 delta update 视角。", + verified: true, + }, + { + year: 2021, + title: "RoFormer: Enhanced Transformer with Rotary Position Embedding", + url: "https://arxiv.org/abs/2104.09864", + topics: ["Transformer", "长上下文"], + contribution: "用旋转把绝对位置注入点积并自然表达相对距离。", + verified: true, + }, + { + year: 2021, + title: "Train Short, Test Long: Attention with Linear Biases Enables Input Length Extrapolation", + url: "https://arxiv.org/abs/2108.12409", + topics: ["长上下文"], + contribution: "ALiBi 用线性距离偏置实现长度外推。", + verified: true, + }, + { + year: 2022, + title: "FlashAttention: Fast and Memory-Efficient Exact Attention", + url: "https://arxiv.org/abs/2205.14135", + topics: ["长上下文", "训练系统"], + contribution: "以 IO-aware tiling 实现精确 attention,不写出完整矩阵。", + verified: true, + }, + { + year: 2023, + title: "FlashAttention-2: Faster Attention with Better Parallelism and Work Partitioning", + url: "https://arxiv.org/abs/2307.08691", + topics: ["长上下文", "训练系统"], + contribution: "改进工作分割与并行度,提高训练和 prefill 吞吐。", + verified: true, + }, + { + year: 2019, + title: "Fast Transformer Decoding: One Write-Head is All You Need", + url: "https://arxiv.org/abs/1911.02150", + topics: ["长上下文", "训练系统"], + contribution: "MQA 让 Query heads 共享 K/V,大幅缩小解码缓存。", + verified: true, + }, + { + year: 2023, + title: "GQA: Training Generalized Multi-Query Transformer Models", + url: "https://arxiv.org/abs/2305.13245", + topics: ["长上下文", "训练系统"], + contribution: "在 MHA 表达力与 MQA 缓存效率之间分组折中。", + verified: true, + }, + { + year: 2023, + title: "Extending Context Window of Large Language Models via Positional Interpolation", + url: "https://arxiv.org/abs/2306.15595", + topics: ["长上下文"], + contribution: "压缩位置索引,让 RoPE 模型稳定微调到更长窗口。", + verified: true, + }, + { + year: 2023, + title: "YaRN: Efficient Context Window Extension of Large Language Models", + url: "https://arxiv.org/abs/2309.00071", + topics: ["长上下文"], + contribution: "结合频率分区与注意力温度扩展 RoPE 上下文。", + verified: true, + }, + { + year: 2023, + title: "Ring Attention with Blockwise Transformers for Near-Infinite Context", + url: "https://arxiv.org/abs/2310.01889", + topics: ["长上下文", "训练系统"], + contribution: "环形传递 KV block,让序列长度随设备数扩展。", + verified: true, + }, + { + year: 2023, + title: "Retentive Network: A Successor to Transformer for Large Language Models", + url: "https://arxiv.org/abs/2307.08621", + topics: ["长上下文"], + contribution: "统一并行、递归和 chunkwise retention 计算。", + verified: true, + }, + { + year: 2023, + title: "Mamba: Linear-Time Sequence Modeling with Selective State Spaces", + url: "https://arxiv.org/abs/2312.00752", + topics: ["长上下文"], + contribution: "让状态空间参数随输入变化,建立现代线性序列模型路线。", + verified: true, + }, + { + year: 2024, + title: "Transformers are SSMs: Generalized Models and Efficient Algorithms Through Structured State Space Duality", + url: "https://arxiv.org/abs/2405.21060", + topics: ["长上下文"], + contribution: "用结构化状态空间对偶统一 attention 与 SSM 算法。", + verified: true, + }, + { + year: 2024, + title: "Gated Linear Attention Transformers with Hardware-Efficient Training", + url: "https://arxiv.org/abs/2312.06635", + topics: ["长上下文", "训练系统"], + contribution: "数据依赖 gate 与硬件高效 chunkwise 线性 attention。", + verified: true, + }, + { + year: 2024, + title: "Parallelizing Linear Transformers with the Delta Rule over Sequence Length", + url: "https://arxiv.org/abs/2406.06484", + topics: ["长上下文", "训练系统"], + contribution: "让 DeltaNet 在序列维并行训练。", + verified: true, + }, + { + year: 2025, + title: "Gated Delta Networks: Improving Mamba2 with Delta Rule", + url: "https://arxiv.org/abs/2412.06464", + topics: ["长上下文"], + contribution: "把快速遗忘 gate 与定点纠错 delta rule 合并。", + verified: true, + }, + { + year: 2024, + title: "Griffin: Mixing Gated Linear Recurrences with Local Attention", + url: "https://arxiv.org/abs/2402.19427", + topics: ["长上下文"], + contribution: "证明线性递归与局部 attention 的混合架构可扩展。", + verified: true, + }, + { + year: 2024, + title: "Jamba: A Hybrid Transformer-Mamba Language Model", + url: "https://arxiv.org/abs/2403.19887", + topics: ["长上下文", "MoE"], + contribution: "把 Transformer、Mamba 与 MoE 组合到生产级开放模型。", + verified: true, + }, + { + year: 2025, + title: "Kimi Linear: An Expressive, Efficient Attention Architecture", + url: "https://arxiv.org/abs/2510.26692", + topics: ["长上下文"], + contribution: "提出 KDA 并用 3:1 KDA/MLA 混合补足线性状态瓶颈。", + spotlight: "Kimi", + verified: true, + }, + { + year: 2026, + title: "Attention Residuals", + url: "https://arxiv.org/abs/2603.15031", + topics: ["Transformer", "长上下文"], + contribution: "让每层以 softmax 选择先前深度表示,并给出 Block AttnRes。", + spotlight: "Kimi", + verified: true, + }, + { + year: 2017, + title: "Outrageously Large Neural Networks: The Sparsely-Gated Mixture-of-Experts Layer", + url: "https://arxiv.org/abs/1701.06538", + topics: ["MoE"], + contribution: "现代稀疏门控 MoE 的起点,以条件计算扩张容量。", + verified: true, + }, + { + year: 2020, + title: "GShard: Scaling Giant Models with Conditional Computation and Automatic Sharding", + url: "https://arxiv.org/abs/2006.16668", + topics: ["MoE", "训练系统"], + contribution: "把 MoE、自动切分与大规模 TPU 训练连接起来。", + verified: true, + }, + { + year: 2021, + title: "Switch Transformers: Scaling to Trillion Parameter Models with Simple and Efficient Sparsity", + url: "https://arxiv.org/abs/2101.03961", + topics: ["MoE"], + contribution: "用 top-1 路由简化稀疏模型并扩到万亿参数。", + verified: true, + }, + { + year: 2021, + title: "BASE Layers: Simplifying Training of Large, Sparse Models", + url: "https://arxiv.org/abs/2103.16716", + topics: ["MoE"], + contribution: "以线性分配求解专家负载平衡,减少辅助损失。", + verified: true, + }, + { + year: 2021, + title: "GLaM: Efficient Scaling of Language Models with Mixture-of-Experts", + url: "https://arxiv.org/abs/2112.06905", + topics: ["MoE", "Scaling"], + contribution: "展示 MoE 在能耗与推理计算上高效扩展语言模型。", + verified: true, + }, + { + year: 2022, + title: "ST-MoE: Designing Stable and Transferable Sparse Expert Models", + url: "https://arxiv.org/abs/2202.08906", + topics: ["MoE"], + contribution: "系统化稀疏专家的稳定训练与迁移配方。", + verified: true, + }, + { + year: 2024, + title: "Mixtral of Experts", + url: "https://arxiv.org/abs/2401.04088", + topics: ["MoE"], + contribution: "强开放稀疏模型,普及每层 top-2 experts 的工程实践。", + verified: true, + }, + { + year: 2024, + title: "DeepSeekMoE: Towards Ultimate Expert Specialization in Mixture-of-Experts Language Models", + url: "https://arxiv.org/abs/2401.06066", + topics: ["MoE"], + contribution: "细粒度专家分割与 shared expert isolation。", + spotlight: "DeepSeek", + verified: true, + }, + { + year: 2024, + title: "DeepSeek-V2: A Strong, Economical, and Efficient Mixture-of-Experts Language Model", + url: "https://arxiv.org/abs/2405.04434", + topics: ["MoE", "长上下文", "训练系统"], + contribution: "联合 DeepSeekMoE 与 MLA,直接压缩推理 KV Cache。", + spotlight: "DeepSeek", + verified: true, + }, + { + year: 2024, + title: "DeepSeek-V3 Technical Report", + url: "https://arxiv.org/abs/2412.19437", + topics: ["MoE", "Scaling", "训练系统", "低精度"], + contribution: "671B-A37B;FP8、MTP、无辅助损失平衡与 DualPipe。", + spotlight: "DeepSeek", + verified: true, + }, + { + year: 2026, + title: "LatentMoE: Toward Optimal Accuracy per FLOP and Parameter in Mixture of Experts", + url: "https://arxiv.org/abs/2601.18089", + topics: ["MoE"], + contribution: "将完整模型宽度与路由专家宽度分离。", + verified: true, + }, + { + year: 2020, + title: "Scaling Laws for Neural Language Models", + url: "https://arxiv.org/abs/2001.08361", + topics: ["Scaling"], + contribution: "建立 loss 与参数、数据、计算之间的幂律经验关系。", + verified: true, + }, + { + year: 2022, + title: "Training Compute-Optimal Large Language Models", + url: "https://arxiv.org/abs/2203.15556", + topics: ["Scaling"], + contribution: "Chinchilla 修正参数/Token 配比,强调给定计算下更多数据。", + verified: true, + }, + { + year: 2022, + title: "Emergent Abilities of Large Language Models", + url: "https://arxiv.org/abs/2206.07682", + topics: ["Scaling", "评测"], + contribution: "记录若干能力随规模出现非线性跃迁的评测现象。", + verified: true, + }, + { + year: 2023, + title: "Pythia: A Suite for Analyzing Large Language Models Across Training and Scaling", + url: "https://arxiv.org/abs/2304.01373", + topics: ["Scaling", "评测"], + contribution: "公开训练中间 checkpoint,支持研究能力怎样随训练形成。", + verified: true, + }, + { + year: 2023, + title: "LLaMA: Open and Efficient Foundation Language Models", + url: "https://arxiv.org/abs/2302.13971", + topics: ["Scaling"], + contribution: "用更多 Token 训练较小开放模型,推动 compute-efficient 推理。", + verified: true, + }, + { + year: 2023, + title: "Llama 2: Open Foundation and Fine-Tuned Chat Models", + url: "https://arxiv.org/abs/2307.09288", + topics: ["Scaling", "后训练"], + contribution: "公开预训练、SFT、RLHF 与安全评测细节。", + verified: true, + }, + { + year: 2024, + title: "The Llama 3 Herd of Models", + url: "https://arxiv.org/abs/2407.21783", + topics: ["Scaling", "后训练"], + contribution: "大规模数据、405B dense、长上下文与多阶段后训练。", + verified: true, + }, + { + year: 2024, + title: "DeepSeek LLM: Scaling Open-Source Language Models with Longtermism", + url: "https://arxiv.org/abs/2401.02954", + topics: ["Scaling"], + contribution: "中英 dense 基线与公开 scaling-law 研究。", + spotlight: "DeepSeek", + verified: true, + }, + { + year: 2021, + title: "The Pile: An 800GB Dataset of Diverse Text for Language Modeling", + url: "https://arxiv.org/abs/2101.00027", + topics: ["Scaling"], + contribution: "公开多域预训练语料与数据配比研究基础。", + verified: true, + }, + { + year: 2023, + title: "The RefinedWeb Dataset for Falcon LLM", + url: "https://arxiv.org/abs/2306.01116", + topics: ["Scaling"], + contribution: "证明高质量过滤与去重的 Web 数据可以支撑强模型。", + verified: true, + }, + { + year: 2024, + title: "Dolma: an Open Corpus of Three Trillion Tokens for Language Model Pretraining Research", + url: "https://arxiv.org/abs/2402.00159", + topics: ["Scaling"], + contribution: "开放 3T Token 语料与完整数据处理工具。", + verified: true, + }, + { + year: 2014, + title: "Adam: A Method for Stochastic Optimization", + url: "https://arxiv.org/abs/1412.6980", + topics: ["训练系统"], + contribution: "自适应一阶/二阶矩估计,成为 LLM 优化器基线。", + verified: true, + }, + { + year: 2017, + title: "Decoupled Weight Decay Regularization", + url: "https://arxiv.org/abs/1711.05101", + topics: ["训练系统"], + contribution: "AdamW 将权重衰减与梯度更新正确解耦。", + verified: true, + }, + { + year: 2019, + title: "GPipe: Efficient Training of Giant Neural Networks using Pipeline Parallelism", + url: "https://arxiv.org/abs/1811.06965", + topics: ["训练系统"], + contribution: "用 micro-batch pipeline 把巨型网络跨设备切层。", + verified: true, + }, + { + year: 2019, + title: "Megatron-LM: Training Multi-Billion Parameter Language Models Using Model Parallelism", + url: "https://arxiv.org/abs/1909.08053", + topics: ["训练系统"], + contribution: "建立 Transformer tensor parallel 的高效切分方式。", + verified: true, + }, + { + year: 2020, + title: "ZeRO: Memory Optimizations Toward Training Trillion Parameter Models", + url: "https://arxiv.org/abs/1910.02054", + topics: ["训练系统"], + contribution: "分片优化器、梯度与参数,消除数据并行状态冗余。", + verified: true, + }, + { + year: 2023, + title: "DeepSpeed Ulysses: System Optimizations for Enabling Training of Extreme Long Sequence Transformer Models", + url: "https://arxiv.org/abs/2309.14509", + topics: ["训练系统", "长上下文"], + contribution: "沿 attention head 做 sequence parallel,扩展极长序列训练。", + verified: true, + }, + { + year: 2024, + title: "Mooncake: A KVCache-centric Disaggregated Architecture for LLM Serving", + url: "https://arxiv.org/abs/2407.00079", + topics: ["训练系统", "长上下文"], + contribution: "以 KV Cache 为中心解耦 prefill/decode 资源。", + spotlight: "Kimi", + verified: true, + }, + { + year: 2025, + title: "Muon is Scalable for LLM Training", + url: "https://arxiv.org/abs/2502.16982", + topics: ["训练系统"], + contribution: "补足 Muon 在 LLM 规模的权重衰减与更新尺度配方。", + spotlight: "Kimi", + verified: true, + }, + { + year: 2022, + title: "FP8 Formats for Deep Learning", + url: "https://arxiv.org/abs/2209.05433", + topics: ["低精度", "训练系统"], + contribution: "定义适合训练/推理的 E4M3 与 E5M2 FP8 格式。", + verified: true, + }, + { + year: 2023, + title: "Microscaling Data Formats for Deep Learning", + url: "https://arxiv.org/abs/2310.10537", + topics: ["低精度"], + contribution: "以 block 共享 scale 支持 MXFP4/MXFP8 等 microscaling 格式。", + verified: true, + }, + { + year: 2022, + title: "LLM.int8(): 8-bit Matrix Multiplication for Transformers at Scale", + url: "https://arxiv.org/abs/2208.07339", + topics: ["低精度"], + contribution: "分离离群通道,在保持精度下做 8-bit 推理。", + verified: true, + }, + { + year: 2022, + title: "SmoothQuant: Accurate and Efficient Post-Training Quantization for Large Language Models", + url: "https://arxiv.org/abs/2211.10438", + topics: ["低精度"], + contribution: "把 activation 难量化程度离线迁移到权重。", + verified: true, + }, + { + year: 2022, + title: "GPTQ: Accurate Post-Training Quantization for Generative Pre-trained Transformers", + url: "https://arxiv.org/abs/2210.17323", + topics: ["低精度"], + contribution: "基于近似二阶信息逐层量化大模型权重。", + verified: true, + }, + { + year: 2023, + title: "AWQ: Activation-aware Weight Quantization for LLM Compression and Acceleration", + url: "https://arxiv.org/abs/2306.00978", + topics: ["低精度"], + contribution: "保护少量高影响权重通道的 activation-aware 量化。", + verified: true, + }, + { + year: 2017, + title: "Proximal Policy Optimization Algorithms", + url: "https://arxiv.org/abs/1707.06347", + topics: ["后训练"], + contribution: "用 clipped ratio 稳定 on-policy 策略更新。", + verified: true, + }, + { + year: 2020, + title: "Learning to Summarize with Human Feedback", + url: "https://arxiv.org/abs/2009.01325", + topics: ["后训练"], + contribution: "把人类偏好、奖励模型与策略优化应用到生成任务。", + verified: true, + }, + { + year: 2021, + title: "Finetuned Language Models Are Zero-Shot Learners", + url: "https://arxiv.org/abs/2109.01652", + topics: ["后训练"], + contribution: "FLAN 证明多任务指令微调可提升未见任务零样本表现。", + verified: true, + }, + { + year: 2021, + title: "Multitask Prompted Training Enables Zero-Shot Task Generalization", + url: "https://arxiv.org/abs/2110.08207", + topics: ["后训练"], + contribution: "T0 用大规模提示模板训练开放零样本模型。", + verified: true, + }, + { + year: 2022, + title: "Training Language Models to Follow Instructions with Human Feedback", + url: "https://arxiv.org/abs/2203.02155", + topics: ["后训练"], + contribution: "InstructGPT 建立 SFT → reward model → PPO 的 RLHF 标准管线。", + verified: true, + }, + { + year: 2022, + title: "Constitutional AI: Harmlessness from AI Feedback", + url: "https://arxiv.org/abs/2212.08073", + topics: ["后训练"], + contribution: "用原则、自我批评和 AI feedback 减少直接人工标签。", + verified: true, + }, + { + year: 2022, + title: "Self-Instruct: Aligning Language Models with Self-Generated Instructions", + url: "https://arxiv.org/abs/2212.10560", + topics: ["后训练"], + contribution: "从模型自生成、过滤指令数据扩展 instruction tuning。", + verified: true, + }, + { + year: 2023, + title: "Direct Preference Optimization: Your Language Model is Secretly a Reward Model", + url: "https://arxiv.org/abs/2305.18290", + topics: ["后训练"], + contribution: "把偏好优化改写为直接分类目标,省去在线 RL loop。", + verified: true, + }, + { + year: 2022, + title: "Chain-of-Thought Prompting Elicits Reasoning in Large Language Models", + url: "https://arxiv.org/abs/2201.11903", + topics: ["推理"], + contribution: "用中间推理示例显著提升大模型复杂任务表现。", + verified: true, + }, + { + year: 2022, + title: "Self-Consistency Improves Chain of Thought Reasoning in Language Models", + url: "https://arxiv.org/abs/2203.11171", + topics: ["推理"], + contribution: "采样多条推理路径并对最终答案聚合。", + verified: true, + }, + { + year: 2022, + title: "STaR: Bootstrapping Reasoning With Reasoning", + url: "https://arxiv.org/abs/2203.14465", + topics: ["推理"], + contribution: "迭代生成、筛选并训练成功 rationale。", + verified: true, + }, + { + year: 2023, + title: "Tree of Thoughts: Deliberate Problem Solving with Large Language Models", + url: "https://arxiv.org/abs/2305.10601", + topics: ["推理", "Agent"], + contribution: "显式搜索多个 thought 分支并评估中间状态。", + verified: true, + }, + { + year: 2023, + title: "Let's Verify Step by Step", + url: "https://arxiv.org/abs/2305.20050", + topics: ["推理", "后训练"], + contribution: "过程奖励模型在数学推理中优于只看最终答案。", + verified: true, + }, + { + year: 2024, + title: "Quiet-STaR: Language Models Can Teach Themselves to Think Before Speaking", + url: "https://arxiv.org/abs/2403.09629", + topics: ["推理"], + contribution: "在一般文本 Token 之间学习隐式 rationale。", + verified: true, + }, + { + year: 2024, + title: "DeepSeekMath: Pushing the Limits of Mathematical Reasoning in Open Language Models", + url: "https://arxiv.org/abs/2402.03300", + topics: ["推理", "后训练"], + contribution: "数学数据管线与无独立 critic 的 GRPO。", + spotlight: "DeepSeek", + verified: true, + }, + { + year: 2025, + title: "DeepSeek-R1: Incentivizing Reasoning Capability in LLMs via Reinforcement Learning", + url: "https://arxiv.org/abs/2501.12948", + topics: ["推理", "后训练"], + contribution: "R1-Zero 纯 RL 涌现推理;R1 加冷启动、多阶段训练与蒸馏。", + spotlight: "DeepSeek", + verified: true, + }, + { + year: 2025, + title: "Kimi k1.5: Scaling Reinforcement Learning with LLMs", + url: "https://arxiv.org/abs/2501.12599", + topics: ["推理", "后训练"], + contribution: "扩展长 CoT 强化学习和测试时计算。", + spotlight: "Kimi", + verified: true, + }, + { + year: 2021, + title: "WebGPT: Browser-assisted Question-Answering with Human Feedback", + url: "https://arxiv.org/abs/2112.09332", + topics: ["Agent", "后训练"], + contribution: "让模型操作浏览器检索、引用来源并用人类偏好训练。", + verified: true, + }, + { + year: 2022, + title: "ReAct: Synergizing Reasoning and Acting in Language Models", + url: "https://arxiv.org/abs/2210.03629", + topics: ["Agent", "推理"], + contribution: "交错 reasoning、action 与 observation,建立 Agent loop 范式。", + verified: true, + }, + { + year: 2023, + title: "Toolformer: Language Models Can Teach Themselves to Use Tools", + url: "https://arxiv.org/abs/2302.04761", + topics: ["Agent"], + contribution: "自监督筛选能降低语言建模损失的 API 调用。", + verified: true, + }, + { + year: 2023, + title: "Reflexion: Language Agents with Verbal Reinforcement Learning", + url: "https://arxiv.org/abs/2303.11366", + topics: ["Agent"], + contribution: "用语言反思和 episodic memory 改进后续尝试。", + verified: true, + }, + { + year: 2023, + title: "Gorilla: Large Language Model Connected with Massive APIs", + url: "https://arxiv.org/abs/2305.15334", + topics: ["Agent"], + contribution: "面向大量真实 API 的工具检索与可靠函数调用。", + verified: true, + }, + { + year: 2023, + title: "Voyager: An Open-Ended Embodied Agent with Large Language Models", + url: "https://arxiv.org/abs/2305.16291", + topics: ["Agent"], + contribution: "自动课程、技能库和迭代提示支持开放式长期探索。", + verified: true, + }, + { + year: 2023, + title: "AgentBench: Evaluating LLMs as Agents", + url: "https://arxiv.org/abs/2308.03688", + topics: ["Agent", "评测"], + contribution: "跨操作系统、数据库、游戏等环境统一评估 Agent。", + verified: true, + }, + { + year: 2023, + title: "SWE-bench: Can Language Models Resolve Real-World GitHub Issues?", + url: "https://arxiv.org/abs/2310.06770", + topics: ["Agent", "评测"], + contribution: "用真实仓库 issue 与测试补丁评测软件工程 Agent。", + verified: true, + }, + { + year: 2024, + title: "SWE-agent: Agent-Computer Interfaces Enable Automated Software Engineering", + url: "https://arxiv.org/abs/2405.15793", + topics: ["Agent"], + contribution: "证明专门设计的 Agent-Computer Interface 显著影响解题表现。", + verified: true, + }, + { + year: 2024, + title: "OSWorld: Benchmarking Multimodal Agents for Open-Ended Tasks in Real Computer Environments", + url: "https://arxiv.org/abs/2404.07972", + topics: ["Agent", "多模态", "评测"], + contribution: "在真实桌面操作系统中评测视觉 Computer Use Agent。", + verified: true, + }, + { + year: 2024, + title: "τ-bench: A Benchmark for Tool-Agent-User Interaction in Real-World Domains", + url: "https://arxiv.org/abs/2406.12045", + topics: ["Agent", "评测"], + contribution: "以数据库最终状态和策略约束评估真实工具交互。", + verified: true, + }, + { + year: 2025, + title: "BrowseComp: A Simple Yet Challenging Benchmark for Browsing Agents", + url: "https://arxiv.org/abs/2504.12516", + topics: ["Agent", "评测"], + contribution: "要求网页 Agent 多步寻找难以直接检索的事实。", + verified: true, + }, + { + year: 2025, + title: "Kimi K2: Open Agentic Intelligence", + url: "https://arxiv.org/abs/2507.20534", + topics: ["MoE", "Agent", "后训练"], + contribution: "开放 1T MoE Agent 模型,强调工具调用数据合成与 joint RL。", + spotlight: "Kimi", + verified: true, + }, + { + year: 2026, + title: "Kimi K2.5: Visual Agentic Intelligence", + url: "https://arxiv.org/abs/2602.02276", + topics: ["Agent", "多模态", "推理"], + contribution: "把视觉、工具使用和并行 Agent Swarm 纳入统一后训练。", + spotlight: "Kimi", + verified: true, + }, + { + year: 2020, + title: "An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale", + url: "https://arxiv.org/abs/2010.11929", + topics: ["多模态"], + contribution: "ViT 把图像 patch 视为 Token 输入 Transformer。", + verified: true, + }, + { + year: 2021, + title: "Learning Transferable Visual Models From Natural Language Supervision", + url: "https://arxiv.org/abs/2103.00020", + topics: ["多模态"], + contribution: "CLIP 以海量图文对比学习建立可迁移视觉语义空间。", + verified: true, + }, + { + year: 2022, + title: "Flamingo: a Visual Language Model for Few-Shot Learning", + url: "https://arxiv.org/abs/2204.14198", + topics: ["多模态"], + contribution: "用 Perceiver Resampler 与 cross-attention 连接冻结视觉/语言模型。", + verified: true, + }, + { + year: 2023, + title: "BLIP-2: Bootstrapping Language-Image Pre-training with Frozen Image Encoders and Large Language Models", + url: "https://arxiv.org/abs/2301.12597", + topics: ["多模态"], + contribution: "用轻量 Q-Former 桥接冻结视觉编码器与 LLM。", + verified: true, + }, + { + year: 2023, + title: "Visual Instruction Tuning", + url: "https://arxiv.org/abs/2304.08485", + topics: ["多模态", "后训练"], + contribution: "LLaVA 用合成视觉指令数据把 CLIP 接入语言模型。", + verified: true, + }, + { + year: 2023, + title: "Sigmoid Loss for Language Image Pre-Training", + url: "https://arxiv.org/abs/2303.15343", + topics: ["多模态"], + contribution: "SigLIP 以成对 sigmoid loss 简化大规模图文对比。", + verified: true, + }, + { + year: 2024, + title: "LLaVA-OneVision: Easy Visual Task Transfer", + url: "https://arxiv.org/abs/2408.03326", + topics: ["多模态"], + contribution: "统一单图、多图与视频的视觉指令迁移。", + verified: true, + }, + { + year: 2025, + title: "Kimi-VL Technical Report", + url: "https://arxiv.org/abs/2504.07491", + topics: ["多模态", "MoE"], + contribution: "MoonViT 原生分辨率视觉编码器与稀疏语言主干。", + spotlight: "Kimi", + verified: true, + }, + { + year: 2020, + title: "Measuring Massive Multitask Language Understanding", + url: "https://arxiv.org/abs/2009.03300", + topics: ["评测"], + contribution: "MMLU 用 57 学科统一衡量广泛知识与解题能力。", + verified: true, + }, + { + year: 2022, + title: "Beyond the Imitation Game: Quantifying and Extrapolating the Capabilities of Language Models", + url: "https://arxiv.org/abs/2206.04615", + topics: ["评测"], + contribution: "BIG-bench 汇集大量任务研究规模与能力边界。", + verified: true, + }, + { + year: 2022, + title: "Holistic Evaluation of Language Models", + url: "https://arxiv.org/abs/2211.09110", + topics: ["评测"], + contribution: "HELM 强调多场景、多指标、透明配置的整体评测。", + verified: true, + }, + { + year: 2023, + title: "LongBench: A Bilingual, Multitask Benchmark for Long Context Understanding", + url: "https://arxiv.org/abs/2308.14508", + topics: ["评测", "长上下文"], + contribution: "跨中英与多任务评估长上下文理解。", + verified: true, + }, + { + year: 2023, + title: "GPQA: A Graduate-Level Google-Proof Q&A Benchmark", + url: "https://arxiv.org/abs/2311.12022", + topics: ["评测", "推理"], + contribution: "由领域专家编写、难以搜索的研究生级科学问答。", + verified: true, + }, + { + year: 2025, + title: "Humanity's Last Exam", + url: "https://arxiv.org/abs/2501.14249", + topics: ["评测", "推理"], + contribution: "覆盖多学科的高难、抗饱和闭答与多模态题集。", + verified: true, + }, + { + year: 2025, + title: "DeepSeek-V3.2: Pushing the Frontier of Open Large Language Models", + url: "https://arxiv.org/abs/2512.02556", + topics: ["长上下文", "推理", "Agent"], + contribution: "DeepSeek Sparse Attention、规模化 RL 与 Agentic 任务合成。", + spotlight: "DeepSeek", + verified: true, + }, + { + year: 2026, + title: "DeepSeek-V4: Towards Highly Efficient Million-Token Context Intelligence", + url: "https://arxiv.org/abs/2606.19348", + topics: ["长上下文", "MoE", "训练系统", "推理"], + contribution: "CSA/HCA 混合注意力、mHC、Muon 与 1M 上下文双模型。", + spotlight: "DeepSeek", + verified: true, + }, + { + year: 2026, + title: "Kimi K3: Open Frontier Intelligence", + url: "https://arxiv.org/abs/2607.24653", + topics: ["长上下文", "MoE", "训练系统", "低精度", "推理", "Agent", "多模态", "评测"], + contribution: "2.8T-A104B、KDA/MLA、AttnRes、Stable LatentMoE 与 1M Agentic RL。", + spotlight: "Kimi", + verified: true, + }, +]; + +export const paperTopics: PaperTopic[] = [ + "基础", + "Transformer", + "长上下文", + "MoE", + "Scaling", + "训练系统", + "低精度", + "后训练", + "推理", + "Agent", + "多模态", + "评测", +]; diff --git a/src/layouts/BaseLayout.astro b/src/layouts/BaseLayout.astro new file mode 100644 index 0000000..792b4a5 --- /dev/null +++ b/src/layouts/BaseLayout.astro @@ -0,0 +1,55 @@ +--- +import SiteHeader from "@/components/SiteHeader.astro"; +import SiteFooter from "@/components/SiteFooter.astro"; +import "@/styles/global.css"; + +interface Props { + title: string; + description: string; + section?: string; +} + +const { + title, + description, + section = "", +} = Astro.props; + +const pageTitle = title === "LLM Atlas" ? title : `${title}|LLM Atlas`; +--- + + + + + + + + + + + + + + {pageTitle} + + + + +
+ +
+ + + + diff --git a/src/pages/deepseek/index.astro b/src/pages/deepseek/index.astro new file mode 100644 index 0000000..f9557dd --- /dev/null +++ b/src/pages/deepseek/index.astro @@ -0,0 +1,815 @@ +--- +import BaseLayout from "@/layouts/BaseLayout.astro"; +import DeepSeekLineage from "@/components/DeepSeekLineage.astro"; + +const toc = [ + ["00", "lineage", "先看完整论文谱系"], + ["01", "dense", "LLM:先建立 Dense 基线"], + ["02", "moe", "DeepSeekMoE:专家特化"], + ["03", "mla", "V2:MLA 压缩 KV Cache"], + ["04", "v3", "V3:算法—系统协同"], + ["05", "grpo", "DeepSeekMath:GRPO"], + ["06", "r1", "R1:RL 涌现推理"], + ["07", "v32", "V3.2:稀疏注意力与 Agent"], + ["08", "v4", "V4:百万上下文"], + ["09", "k3", "DeepSeek 怎样流入 K3"], + ["↳", "papers", "精读顺序与来源"], +]; +--- + + +
+
+
+

SPOTLIGHT / DEEPSEEK ALGORITHM × SYSTEM

+

一条少见的、环环相扣的
开放论文主线

+

+ DeepSeek 的价值不只在某个模型分数,而在持续公开“为什么这样设计”: + 容量贵,就做细粒度 MoE;KV Cache 贵,就做 MLA;训练贵,就做 FP8 与通信重叠; + 推理难,就把可验证奖励规模化。 +

+
+
+
SPAN
2024.01 → 2026.06
+
CORE
MoE · MLA · FP8 · GRPO
+
LINE
Dense → Sparse → Reasoning
+
K3 LINK
MLA · MoE · Muon · 1M
+
STATUS
重点专题 · 首版
+
+
+
+ +
+ + +
+
+

00 THE LINEAGE

+

每一代都在偿还上一代最昂贵的账单

+

+ 把 DeepSeek 看成模型名字序列会很乱;把它看成“容量、缓存、训练、推理、长上下文”五张账单, + 技术演进就清楚了。 +

+ +
+ 核心观察 +

+ DeepSeek 的强项是把模型结构和硬件约束写在同一张设计图里。MLA 不只是新 attention, + 它直接针对服务时 KV Cache;FP8 不只是少用几个比特,它要求累加精度、缩放和通信共同配合; + GRPO 不只是 PPO 变体,它直接移除同规模 critic 的显存负担。 +

+
+
+ +
+

01 DEEPSEEK LLM

+

先用 Dense 模型建立基线:规模、数据和双语能力

+

+ 2024 年初的 DeepSeek LLM 发布 7B 与 67B dense 模型, + 在约 2T 中英文 Token 上预训练。它的重要性不在今天看来并不夸张的参数量,而在于建立后续研究的可比基线: + tokenizer、数据配方、训练稳定性、中文评测和 scaling behavior 有了统一起点。 +

+

为什么先做 Dense 很重要

+

+ MoE 同时改变总参数、激活参数、路由、通信和数据分配。没有 dense 基线,很难判断收益来自“更多容量” + 还是来自别的训练差异。DeepSeek LLM 还训练小规模模型拟合 scaling laws, + 再用这些规律选择 67B 的超参数;这条“先小规模试验,再外推大模型”的方法后来在 V3/K3 都持续出现。 +

+
+ 把这一代当作实验坐标系 +

+ DeepSeek LLM 回答的是“如果我们先不引入稀疏专家和低秩缓存,一套扎实的中英 dense Transformer 能到哪里?” + 后面的论文才有明确的对照物。 +

+
+
+ +
+

02 DEEPSEEKMOE

+

专家越大不一定越专:把一个大专家拆成许多细粒度专家

+

+ 传统 MoE 往往把 FFN 分成少数大专家,每个 Token 选 1–2 个。问题是一个大专家仍可能同时处理许多无关知识, + 专家之间也会重复学习公共能力。DeepSeekMoE + 提出两项互补策略。 +

+
+
+ CONVENTIONAL MOE +

少数大专家

+
E1E2E3E4
+

每个专家覆盖面广,公共知识在多个专家中重复;可组合的专业分工有限。

+
+
+ DEEPSEEKMOE +

细粒度 routed + shared

+
Se1e2e3e4e5e6e7
+

shared expert 吸收公共知识;更多小 routed experts 可以按 Token 组合出细分能力。

+
+
+

Fine-Grained Expert Segmentation

+

+ 在保持单 Token 激活计算近似不变时,把专家 FFN 切得更小,同时选择更多个小专家。 + 组合数显著增加:同样的 Token 可以同时调用“代码语法”“Python 库”“矩阵计算”等几个子专长, + 不必把它们硬塞进一个笼统的“代码专家”。 +

+

Shared Expert Isolation

+

+ 某些变换几乎每个 Token 都需要。如果全部交给 routed experts,多个专家会重复学习。 + DeepSeekMoE 把 shared experts 始终激活,承担公共知识;路由专家获得更强动力去形成差异化专长。 + 这套组织直接进入 DeepSeek-V2/V3,也成为 Kimi K3 Stable LatentMoE 的结构祖先。 +

+
+ MoE 的代价从 FLOPs 转移到了通信 +

+ Token 必须被发送到拥有对应专家的设备。专家越细、选择越多,all-to-all、负载波动和权重读取越可能成为瓶颈。 + 因此模型侧路由与系统侧 Expert Parallel 从来不能分开看。 +

+
+
+ +
+

03 DEEPSEEK-V2 / MLA

+

训练只付一次参数成本,KV Cache 却在每个请求、每个 Token 上重复付费

+

+ DeepSeek-V2 是整条谱系的关键转折: + 236B 总参数、21B 激活参数、128K 上下文,把 DeepSeekMoE 用于训练经济性, + 再用 Multi-head Latent Attention(MLA)直接攻击推理服务的内存瓶颈。 +

+
+
−42.5%训练成本
+
−93.3%KV Cache
+
5.76×最大生成吞吐
+

均为 V2 报告相对 DeepSeek 67B 的特定配置结果,不应外推为任意硬件上的固定倍数。

+
+ +

标准 MHA 为什么会让 KV Cache 爆长

+

+ 自回归生成每一步都要查询历史 Token。历史的 K/V 不变,因此缓存起来避免重算。 + 但 MHA 为每层、每个 Token、每个 head 保存 K 和 V;batch、序列和层数一大,缓存会吃掉大量显存, + 直接限制并发和长上下文。 +

+ +
+ cₜᴷⱽ = Wᴰᴷⱽhₜ  kₜᶜ = Wᵁᴷcₜᴷⱽ  vₜᶜ = Wᵁⱽcₜᴷⱽ + + 省略 decoupled RoPE key、各 head 展开与权重吸收细节。核心是 K/V 先联合低秩压缩,缓存 latent 而非完整多头表示。 + +
+

为什么 MLA 比简单 MQA/GQA 更有野心

+

+ MQA 让所有 Query heads 共用一组 K/V,GQA 让一组 Query heads 共用 K/V,缓存更小但容量可能下降。 + MLA 用低秩 latent 保留可恢复的内容子空间,并把 RoPE 相关部分分离,追求接近 MHA 的表达力与更小缓存。 + 它后来被 Kimi K2/K2.5 采用,并在 K3 中作为周期性全局注意力保留。 +

+
+ +
+

04 DEEPSEEK-V3

+

V3 的亮点不是一个技巧,而是四层协同

+

+ DeepSeek-V3 扩到 671B 总参数、37B 激活参数, + 在 14.8T Token 上预训练。报告给出的完整训练用量约 2.788M H800 GPU hours,并称整个训练没有不可恢复的 loss spike 或回滚。 + 这组数字之所以引人注目,是因为它背后同时改动模型、目标、数值和系统。 +

+
+
MODEL

MLA + DeepSeekMoE

沿用 V2 验证过的低缓存 attention 与细粒度专家。

+
ROUTING

Aux-loss-free balance

用动态 expert bias 调整负载,减少辅助平衡损失对主目标的干扰。

+
OBJECTIVE

Multi-Token Prediction

训练时预测多个未来 Token,增加训练信号,并可转化为推测解码草稿能力。

+
SYSTEM

FP8 + DualPipe

低精度训练、计算通信重叠、跨节点专家并行共同压低成本。

+
+ +

无辅助损失负载均衡

+

+ MoE 必须避免少数专家过载。传统做法加入 load-balancing auxiliary loss, + 但它与语言建模主目标可能冲突:为了均匀而把 Token 送给次优专家。V3 为每个专家维护 bias, + 根据近期负载上调冷门专家、下调热门专家;bias 只影响路由选择,不直接进入最终门控权重, + 从而把“系统要均衡”和“模型要准确”更松地解耦。 +

+ +

FP8 训练真正难在哪

+

+ FP8 动态范围和有效精度有限,不能简单把所有 tensor 强转为 8 位。V3 使用细粒度量化、较高精度累加、 + 在线缩放和特定敏感模块的高精度保留;同时让低精度通信减少跨卡带宽。 + 论文最值得看的不是“首次大规模 FP8”宣传,而是哪些路径降精度、哪些路径绝不降,以及误差怎样被控制。 +

+ +

DualPipe:流水线的空泡是一笔真金白银

+

+ Pipeline Parallel 把层切到不同 stage;朴素调度会让设备在前向/反向依赖之间等待。 + DualPipe 从流水线两端同时喂入 micro-batch,并重叠前向、反向与专家通信,尽量把空泡藏在计算后面。 + 它与 DeepEP 的高吞吐/低延迟 all-to-all 一起,把 MoE 理论稀疏性变成真实集群效率。 +

+
+ +
+

05 DEEPSEEKMATH / GRPO

+

GRPO:不用再养一个和策略模型同样昂贵的 Critic

+

+ DeepSeekMath 不只是数学模型论文。 + 它在 7B 模型和 120B 数学相关 Token 上验证数据工程,同时提出 Group Relative Policy Optimization, + 为后来 DeepSeek-V2 对齐和 R1 大规模推理 RL 铺路。 +

+

PPO 的显存账单

+

+ 经典 RLHF/PPO 常同时保留 policy、reference、reward model 和 value/critic model。 + 对大模型而言,critic 往往与 policy 同量级。GRPO 对同一道题采样一组答案, + 用组内奖励的均值和标准差构造相对优势,省去单独 value model。 +

+
+
PROMPT证明 / 求解一道题
+ sample group +
+
y₁reward 0
+
y₂reward 1
+
y₃reward 0.7
+
y₄reward 0.2
+
+ normalize +
RELATIVE ADVANTAGE高于组均值的轨迹被鼓励
+
+
+ Âᵢ = (rᵢ − mean(r₁…rᴳ)) / (std(r₁…rᴳ) + ε) + GRPO 完整目标仍包含 clipped policy ratio 与 KL 约束;这里只展示“组相对优势”这一核心直觉。 +
+

组相对不是免费午餐

+

+ 一道题要采样多条答案,rollout 成本仍然很高;奖励若不可验证或存在偏差,组内比较也会放大奖励漏洞。 + 当一组奖励全相同,归一优势几乎不给学习信号。R1 的成功因此同时依赖可验证数学/代码奖励、足够多样的采样和大规模基础设施。 +

+
+ +
+

06 DEEPSEEK-R1

+

R1-Zero 最重要的实验:先不教推理格式,只给可验证结果奖励

+

+ DeepSeek-R1 的历史意义, + 是把“推理可以通过大规模 RL 从强 base model 中被激发”做成公开、可研究的系统证据。 +

+

R1-Zero 做了什么

+

+ 从 DeepSeek-V3 Base 出发,不先做推理 SFT,直接以 GRPO 进行大规模 RL。 + 奖励以答案正确性为主,并加入格式奖励。训练中出现更长推理、反思、回溯和自我验证等行为; + 论文把某些突然延长思考的轨迹称为 “aha moment”。 +

+

它也明确暴露了纯 RL 的问题

+

+ R1-Zero 会重复、可读性差、混合语言。奖励只关心最终正确时,模型没有充分动力照顾人类阅读体验。 + 正式 R1 因而先加入少量高质量 cold-start CoT 数据,再做 reasoning-oriented RL; + 随后用 rejection sampling 产生 SFT 数据,混入写作、事实问答等非推理任务,再进行第二阶段 RL 兼顾帮助性与安全。 +

+
+
BASEDeepSeek-V3 Base强预训练基础
+ +
COLD START少量可读 CoT稳定格式与语言
+ +
REASONING RL可验证奖励 + GRPO强化求解策略
+ +
SFT MIX拒绝采样 + 通用数据恢复广泛任务
+ +
FINAL RL帮助性与安全统一模型
+
+

Distillation 的关键发现

+

+ 团队用 R1 生成的推理样本微调 Qwen/Llama dense 模型,发布 1.5B–70B 蒸馏版本。 + 这说明小模型不一定要自己承担完整的探索式 RL 成本,可以模仿强 reasoning teacher 的轨迹; + 但蒸馏得到的是 teacher 数据分布上的能力,不等于小模型内部复现了同样的 RL 发现过程。 +

+
+ CoT 变长不等于推理一定更好 +

+ 长轨迹可能包含有效搜索,也可能是重复与绕路。R1 证明的是在可验证任务和适当训练下, + 增加推理计算可以转化为能力;不是“输出越长越聪明”。 +

+
+
+ +
+

07 DEEPSEEK-V3.2

+

从会推理到会在长上下文里使用工具

+

+ DeepSeek-V3.2 把三条线合并: + DeepSeek Sparse Attention(DSA)降低长上下文成本,更大规模的 RL 提升 reasoning, + Agentic task synthesis 则把 reasoning 放进工具交互轨迹。 +

+

DSA 的两阶段直觉

+

+ 完整注意力让每个 Query 和全部历史交互。DSA 先用轻量、可学习的 indexer 给历史 Token 评分, + 选出小部分候选,再让主 attention 只在候选上做高容量计算。 + 关键不只是 top-k,而是 indexer 也在训练中学习“什么值得看”;这比固定窗口更能适应内容相关的远距离依赖。 +

+
+
+ {Array.from({ length: 18 }, (_, index) => {index + 1})} +
+ learned indexer → top-k +
2671317
+ main attention + Query +
+

+ Agent 方面,V3.2 的任务合成管线系统地产生复杂、交互式工具任务,让思考与 tool use 交织。 + 这与 K3 的 white-box harness、知识图谱任务合成和可验证环境形成同期对照:前沿模型竞争正在从静态题库转向训练环境。 +

+
+ +
+

08 DEEPSEEK-V4

+

百万上下文从“支持”变成一套专门架构

+

+ 2026 年的 DeepSeek-V4 preview 包含 + 1.6T-A49B 的 Pro 与 284B-A13B 的 Flash,均支持 1M Token。 + 它使用 Compressed Sparse Attention(CSA)与 Heavily Compressed Attention(HCA)的混合注意力, + Manifold-Constrained Hyper-Connections(mHC)改善深度残差,并采用 Muon 优化器。 +

+
+
1.6T / 49BV4-Pro total / active
+
284B / 13BV4-Flash total / active
+
>32T预训练 Token
+

V4 官方报告摘要数据;模型是 preview 版本,后续版本需按研究截止日重新核验。

+
+

+ 报告称在 1M 上下文下,V4-Pro 的单 Token 推理 FLOPs 是 V3.2 的 27%,KV Cache 是 10%。 + 这说明长上下文竞争已从单一位置外推转向混合注意力、压缩缓存、残差、优化器和后训练的系统协同。 + 它也解释 K3 报告为何把 V4 列为同代开放基础模型对照。 +

+
+ V4 与 K3 不是同一条注意力路线 +

+ V4 用 CSA/HCA 混合压缩与稀疏注意力;K3 用 3:1 KDA/Gated MLA 混合线性递归与全局注意力。 + 两者目标相近——降低百万上下文成本并保留能力——但状态表示、检索方式和系统内核不同。 +

+
+
+ +
+

09 INTO KIMI K3

+

DeepSeek 的哪些思想直接流入 K3,哪些只是同期呼应

+
+
DeepSeek 线索K3 中的落点关系
+
DeepSeekMoE shared + routed expertsStable LatentMoE 保留 shared/routed 组织直接结构祖先
+
V2 Multi-head Latent Attention每四层一次 Gated MLA,全局注意力明确采用并改造
+
V3 Auxiliary-loss-free balancingQuantile Balancing 应对近千专家同一问题的新方案
+
V3 FP8 / 低精度协同专家 MXFP4 权重、MXFP8 激活与 QAT更低精度的延伸
+
DeepSeekMath / R1 的 GRPO 与 RL多 domain、多 effort RL + MOPD共享测试时扩展范式
+
V4 Muon 与深度残差创新Per-Head Muon + Attention Residuals同期不同设计
+
V3.2/V4 长上下文KDA + Gated MLA + KDA system co-design同目标、不同路线
+
+

+ 这正是为什么 DeepSeek 值得在 LLM Atlas 中作为贯穿案例:它不是 K3 的“对手名单”之一, + 而是 K3 架构里多条思想的公开祖先与同代参照。读懂 V2 的 MLA 和 DeepSeekMoE, + K3 的一半架构会突然变得熟悉。 +

+
+ +
+

READING ORDER

+

建议精读顺序:不要直接从 R1 开始

+ + +
+
+
+ + +
diff --git a/src/pages/foundations/index.astro b/src/pages/foundations/index.astro new file mode 100644 index 0000000..cfd95bf --- /dev/null +++ b/src/pages/foundations/index.astro @@ -0,0 +1,583 @@ +--- +import BaseLayout from "@/layouts/BaseLayout.astro"; +import AttentionLab from "@/components/AttentionLab.astro"; + +const toc = [ + ["00", "goal", "这一章要建立什么"], + ["01", "next-token", "预测下一个 Token"], + ["02", "vector", "词怎样变成向量"], + ["03", "bottleneck", "RNN 的顺序瓶颈"], + ["04", "attention", "注意力的出现"], + ["05", "qkv", "Q / K / V"], + ["06", "block", "Transformer Block"], + ["07", "training", "训练与生成"], + ["08", "myths", "常见误解"], + ["↳", "papers", "关键论文链"], +]; +--- + + +
+
+
+

FOUNDATIONS / 02 TRANSFORMER

+

注意力,不是让模型
“更专心”那么简单

+

+ 它把序列建模从“一步一步传话”改成“每个位置直接检索相关位置”。 + 这一变化解决了长距离依赖,也把训练变成高度并行的矩阵计算。 +

+
+
+
LEVEL
L0 直觉 → L2 公式
+
PREREQ
只需基础概率概念
+
CORE
Q · K · V · Softmax
+
TIME
约 55 分钟
+
STATUS
首版可读 · 继续补图
+
+
+
+ +
+ + +
+
+

00 MENTAL MODEL

+

读完以后,你应该能画出一个 Token 的完整旅程

+

+ 文本先被切成 Token,Token 变成向量;自注意力让每个位置从其他位置收集信息, + 前馈网络在每个位置内部加工;残差和归一化让几十上百层能够稳定堆叠。 +

+ +

+ K3 的复杂架构仍然没有离开这张图:KDA 与 MLA 替换“位置之间交流”的具体机制, + Stable LatentMoE 替换 FFN,Attention Residuals 改变层与层之间的传递,MoonViT 把图像也转成可进入主干的表示。 +

+
+ +
+

01 LANGUAGE MODELING

+

大模型最底层的训练题:根据前文猜下一个 Token

+

+ 一段文本的联合概率可以用链式法则拆开: + 第一个 Token 的概率 × 在第一个已知时第二个的概率 × 在前两个已知时第三个的概率……。 + 语言模型只要不断学会这些条件概率,就能给整段文本分配概率。 +

+
+ P(x₁, x₂, …, xₙ) = ∏ₜ P(xₜ | x₁, …, xₜ₋₁) + 这只是概率链式法则,本身不规定用 N-gram、RNN 还是 Transformer 计算条件概率。 +
+

+ 训练时,我们已知句子后面的正确 Token,因此可以把一段文本整体右移一位做标签,所有位置并行产生损失。 + 模型对正确 Token 给出的概率越低,负对数损失越大。 +

+
+ L = − Σₜ log Pθ(xₜ | x<ₜ) + 交叉熵训练不会直接写入“事实库”或“推理规则”;这些结构是模型为降低大量预测误差而在参数中形成的。 +
+

为什么这样简单的任务会学到很多东西

+

+ 要准确补全“牛顿在 1687 年出版了……”,模型需要吸收事实;要补全一段代码,需要跟踪变量和语法; + 要补全论证,需要建模前提与结论。下一个 Token 预测没有显式要求“理解”,但数据中的各种规律都会降低预测损失。 + 模型容量和数据足够大时,许多规律共享同一套内部表示,因此出现广泛迁移。 +

+
+ 但不要反过度解释 +

+ 预测目标能诱导知识与能力,不保证事实永远准确、推理过程忠实或目标与人类一致。 + 这正是检索、后训练、验证器和安全对齐仍然必要的原因。 +

+
+
+ +
+

02 DISTRIBUTED REPRESENTATION

+

Token ID 没有意义;Embedding 才是模型能计算的语义坐标

+

+ Tokenizer 把文本分成词、子词或字节片段,并映射为整数 ID。ID 只是目录编号: + 42 比 17 大,不代表第 42 个 Token 语义更强。Embedding table 根据 ID 查出一个可训练向量, + 后续网络只处理这些连续数值。 +

+
+
TOKEN小猫ID = 4821
+ lookup +
EMBEDDING[0.18, −0.42, 0.07, …, 0.31]d 个可学习维度
+
+

+ “分布式表示”的要点是:一个概念不放在单个神经元里,而分散在许多维度; + 一个维度也参与表示许多概念。相似用法的 Token 在训练中往往形成相近或具有稳定关系的向量。 + Bengio 2003 的神经概率语言模型和 2013 年 Word2Vec,是这条历史线的关键节点。 +

+

同一个词在不同句子里怎么办

+

+ 初始 embedding 对同一个 Token 固定不变,但经过 self-attention 后会变成 contextual representation。 + “苹果发布手机”和“吃一个苹果”里的“苹果”起点相同,周围 Token 通过注意力写入不同上下文后,深层表示会分开。 +

+
+ +
+

03 SEQUENTIAL BOTTLENECK

+

Transformer 之前:信息像传话游戏一样逐步穿过 RNN

+

+ RNN 每读一个 Token,就把旧隐藏状态和新输入合成新状态。理论上最后状态可以包含全部历史; + 实际上,遥远信息必须经过许多次变换,梯度也必须沿时间反向穿过这些步骤。 + LSTM/GRU 用门控缓解遗忘与梯度问题,但训练仍然按时间顺序,难以把序列位置全部摊到 GPU 上并行。 +

+
+
+ RNN / 顺序传递 +
x₁h₁h₂h₃h₄
+

x₁ 的信息要到 h₄,必须走过每一个中间状态。

+
+
+ SELF-ATTENTION / 直接检索 +
x₁x₂x₃x₄↘ ↓ ↙x₄′
+

x₄ 可以在一层内直接读取 x₁、x₂、x₃。

+
+
+

+ 2014 年 Seq2Seq 用 encoder 把源句压进固定向量,再由 decoder 生成目标句。长句表现受限时, + Bahdanau Attention 让 decoder 每一步不再只依赖最后一个 encoder state,而能对全部 encoder states 加权读取。 + 注意力最初是一座跨 encoder—decoder 的桥;Transformer 的突破是让桥本身成为主体。 +

+
+ +
+

04 ATTENTION

+

注意力本质上是一次可学习的“软检索”

+

+ 每个位置提出一个 Query;所有位置提供 Key 和 Value。Query 与 Key 的匹配度决定从相应 Value 读取多少信息。 + 因为权重是连续概率,而不是只选择一个位置,所以称为“软”检索。 +

+ +

为什么相似度之后要除以 √dₖ

+

+ 若 Q、K 的每个分量方差相近,维度越高,点积的典型幅值越大。softmax 输入过大时会接近 one-hot, + 梯度变得很小。除以 √dₖ 把数值尺度拉回较稳定范围,这就是 Scaled Dot-Product Attention 的“scaled”。 +

+
+ Attention(Q, K, V) = softmax(QKᵀ / √dₖ) · V + 先得到每个 Query 对所有 Key 的相似度,经 softmax 变成和为 1 的权重,再对 Value 做加权和。 +
+
+ +
+

05 QUERY · KEY · VALUE

+

Q、K、V 不是三份词义,而是三个可学习角色

+

+ 同一个输入向量 x 乘三个不同矩阵,得到 Q、K、V。模型可以让“用于匹配的特征”和“匹配后真正搬运的内容”分开。 + 例如代词位置的 Query 可以强调性别/单复数线索,名词位置的 Key 暴露这些线索, + Value 则携带更丰富的实体表示。 +

+
+
Q / QUERY

我在找什么?

当前位置为了更新自己,需要哪类上下文信号。

+
K / KEY

我能被怎样找到?

每个来源位置公开哪些匹配特征。

+
V / VALUE

找到后带走什么?

一旦获得权重,真正汇入目标位置的信息内容。

+
+

Multi-Head 的意义

+

+ 单个注意力分布必须把多种关系挤在一起。Multi-Head 将表示投影到多个较小子空间: + 不同 head 可以学习局部搭配、指代、结构边界、长距离依赖等不同模式,最后拼接并线性投影。 + “某个头一定是语法头”并没有保证;head 的功能是训练中形成的,常常混合且可替代。 +

+

Causal Mask 为什么不可少

+

+ 训练 decoder-only 模型时,位置 t 的输入序列里同时存在后续 Token。若不遮住未来位置, + 模型会直接偷看答案。Causal mask 把 QKᵀ 右上三角设为负无穷, + softmax 后未来权重变成 0;这样所有位置仍可并行训练,却遵守生成时只能看过去的约束。 +

+
+ +
+

06 TRANSFORMER BLOCK

+

Attention 只负责交流;FFN 才负责每个位置内部加工

+

+ 一个现代 decoder block 通常由两类子层组成:Attention 在位置之间混合信息; + FFN 对每个位置独立应用相同的非线性变换。残差让子层学习“在现有表示上改多少”, + Normalization 则控制数值尺度。 +

+ +

Pre-Norm 与 Post-Norm

+

+ 原始 Transformer 在残差相加后做 LayerNorm(Post-Norm)。更深模型常把 Norm 放到子层之前(Pre-Norm), + 让主残差路径更接近恒等映射,梯度传播更稳定。许多现代模型使用 RMSNorm,省去均值中心化, + 并用 SwiGLU 替代简单 ReLU FFN。K3 进一步把 FFN 替换为 Stable LatentMoE,并用 AttnRes 重做跨深度信息流。 +

+
+ +
+

07 TRAINING & GENERATION

+

训练能并行看完整答案;生成却必须一次走一步

+
+
+ TRAINING / TEACHER FORCING +

一段文本同时产生许多训练题

+

输入“今 天 天 气”,标签右移为“天 天 气 好”。因果 mask 阻止偷看,四个位置可并行算损失。

+
+
+ INFERENCE / AUTOREGRESSIVE +

新 Token 不存在,必须逐个生成

+

先产生第一个,再把它放回输入产生第二个。KV Cache 避免每一步重算全部旧 Token 的 K/V。

+
+
+

+ 这个差异解释了为什么训练吞吐和线上生成速度是两套系统问题,也解释了 K3 为什么同时关心 + KDA state、MLA KV Cache、推测解码 draft model 和 fleet scheduling。 +

+

Logits 怎样变成一个 Token

+

+ 最后一层表示经 LM head 投影到词表大小,得到每个 Token 的 logits。temperature 调整分布尖锐程度, + top-p/top-k 截断候选,再采样或取最大值。它们改变选择策略,不会给模型增加知识,也不能修复错误推理。 +

+
+ +
+

08 COMMON MISCONCEPTIONS

+

六个最容易带进后续论文的误解

+
+
误解 01

Attention 权重就是模型解释

权重只描述某层某头的 value 混合比例;它不必等价于最终预测的因果解释。

+
误解 02

上下文越长就记得越好

窗口是容量上限;检索、位置偏差、干扰和训练分布决定模型是否会用。

+
误解 03

参数越多,每次计算一定越贵

Dense 模型大致如此;MoE 可让总参数远大于激活参数,但引入路由和通信成本。

+
误解 04

Tokenizer 只影响输入长度

它还决定模型看到的基本单位,影响跨语言效率、数字/代码规律与词表输出。

+
误解 05

模型在数据库里查答案

预训练知识分布在参数计算中;显式检索需要外接索引、工具或上下文。

+
误解 06

CoT 是模型真实内心记录

生成的推理文本可用于求解和检查,但不保证完整、忠实地暴露内部因果过程。

+
+
+ +
+

LANDMARK PAPERS

+

从问题到 Transformer 的关键论文链

+ + +
+
+
+ + +
diff --git a/src/pages/index.astro b/src/pages/index.astro new file mode 100644 index 0000000..726eab9 --- /dev/null +++ b/src/pages/index.astro @@ -0,0 +1,298 @@ +--- +import BaseLayout from "@/layouts/BaseLayout.astro"; +import ArchitectureExplorer from "@/components/ArchitectureExplorer.astro"; +import DeepSeekLineage from "@/components/DeepSeekLineage.astro"; +import { chapters, statusLabel } from "@/data/chapters"; + +const routes: Record = { + roadmap: "/roadmap/", + foundations: "/foundations/", +}; + +const paths = [ + { + id: "beginner", + number: "01", + label: "零基础", + title: "从“下一个词”开始,不先背 Transformer 公式", + text: "先建立 Token、概率、向量和训练目标的直觉,再通过可操作的注意力实验进入架构。", + steps: ["01 语言模型从哪里来", "02 注意力与 Transformer", "03 表示、位置与残差", "04 Scaling Laws"], + time: "8–12 小时", + target: "能独立阅读主流 LLM 架构图", + }, + { + id: "k3", + number: "02", + label: "K3 反向拆解", + title: "先看全貌,再沿组件回到每条技术祖先", + text: "适合已经用过大模型、想迅速读懂 K3 报告的人。每个组件都能跳回其历史专题。", + steps: ["K3 三维信息流", "KDA 与 MLA", "Stable LatentMoE", "1M Agentic RL 与系统"], + time: "6–10 小时", + target: "能逐节解释 K3 技术报告", + }, + { + id: "deepseek", + number: "03", + label: "DeepSeek 主线", + title: "沿一家公司,看算法—系统协同如何一步步形成", + text: "从 DeepSeek LLM 的 dense 基线,到 MoE、MLA、FP8、GRPO、R1、稀疏注意力与百万上下文。", + steps: ["DeepSeekMoE", "V2 / MLA", "V3 / FP8 / DualPipe", "Math / GRPO / R1", "V3.2 / V4"], + time: "7–11 小时", + target: "理解 DeepSeek 论文间的因果关系", + }, + { + id: "systems", + number: "04", + label: "系统工程", + title: "跟着一个 Token 穿过 GPU、网络、缓存与服务集群", + text: "适合工程背景读者,从计算与内存账本出发理解并行、低精度、通信和推理服务。", + steps: ["08 大规模训练", "09 数值与优化", "14 推理服务", "K3 §5 Infrastructure"], + time: "10–16 小时", + target: "看懂大模型系统报告与性能数字", + }, +]; +--- + + +
+
+
+

OPEN COURSE / 2026 LARGE LANGUAGE MODELS

+

+ 大模型技术全景 + 从“预测下一个词”到 Kimi K3 的 2.8T 开放前沿 +

+

+ 这是一套按问题脉络组织的中文开放课程。我们从最小直觉出发,追踪每篇关键论文究竟解决了什么, + 再把注意力、MoE、规模化训练、多模态、推理强化学习与 Agent 系统重新汇入 Kimi K3。 +

+ +
+ +
+
+ 研究范围 +

表示学习 · Transformer · Scaling · MoE · 长上下文 · 训练系统 · 后训练 · 推理 · Agent · 多模态 · 服务与评测

+ 查看实时进度 → +
+
+ +
+
+
+

00 WHY THIS ATLAS

+

不是论文清单,而是一条能走通的理解路径

+
+

+ 大模型知识最难的地方不是资料少,而是资料之间的桥断了:初学解释省略公式,论文省略历史, + 系统报告又默认你已经理解模型。LLM Atlas 专门补这些桥。 +

+
+ +
+ 课程主张 +

+ 真正理解一项技术,需要同时回答:它解决什么瓶颈、核心机制如何工作、证据是否支持、 + 工程代价是什么,以及下一篇论文为什么自然会出现。 +

+
+ +
+
+ 01 / PROBLEM +

从问题开始

+

先看到旧方法撞上的墙,再引入新名词。KDA、MLA、MoE 都不再是凭空掉下来的缩写。

+
+
+ 02 / LAYERS +

四层解释

+

同一概念同时提供直觉、机制、论文和工程四层入口,允许读者在适合自己的深度停留。

+
+
+ 03 / VISUAL +

图必须能帮助推理

+

优先重绘可缩放、可交互的架构图;每种颜色固定含义,简化之处明确标出。

+
+
+ 04 / EVIDENCE +

事实、解释、推断分开

+

关键结论回到论文和官方实现。榜单写明 harness、工具预算与截止日期,未知就明确说未知。

+
+
+
+ +
+
+
+

01 LEARNING PATHS

+

你不必从第一页顺序读到最后

+
+

四条路径共享同一张知识图。点击路径切换,章节之间的先修关系始终可追踪。

+
+ +
+
+ {paths.map((path, index) => ( + + ))} +
+
+ {paths.map((path, index) => ( +
+
+ {path.label} +

{path.title}

+

{path.text}

+
    + {path.steps.map((step) =>
  1. {step}
  2. )} +
+
+ +
+ ))} +
+
+
+ +
+
+
+

02 CURRICULUM MAP

+

16 个专题,拼成一张完整技术地图

+
+

+ 进度条表示内容成熟度,不代表相关领域的重要性。首版先打通全站骨架,再逐章扩写到论文与工程层。 +

+
+ +
+ {chapters.map((chapter) => { + const href = routes[chapter.slug] ?? `/roadmap/#chapter-${chapter.number}`; + return ( + +
+ {chapter.number} + {statusLabel[chapter.status]} +
+

{chapter.title}

+

{chapter.question}

+
+
+ +
+
+ {chapter.papers} 篇核心论文 + {chapter.progress}% +
+
+
+ ); + })} +
+
+ +
+
+
+

03 KIMI K3 AS THE CONFLUENCE

+

K3 把三种信息流和一套庞大系统放进同一模型

+
+

+ K3 报告最好的阅读钥匙,是把架构看成 token、depth、channel 三个方向的信息流; + 视觉输入与训练/服务基础设施则包住这三条轴。 +

+
+ + 进入完整 K3 技术报告导读 → +
+ +
+
+
+

04 DEEPSEEK SPOTLIGHT

+

DeepSeek:一条极适合学习“算法—系统协同”的论文主线

+
+

+ 从细粒度 MoE、MLA 和 FP8,到 GRPO 与 R1,DeepSeek 的每篇报告都在解决上一代留下的明确约束。 + 这里会给予它比普通模型谱系更细的篇幅。 +

+
+ + 阅读 DeepSeek 专题 → +
+ +
+
+
+

05 OPEN RESEARCH

+

课程本身也是一项开放研究工程

+
+

+ 网站源码、路线、进度和研究规范全部公开。Grok 用来扩展检索线索,最终结论由一手论文和官方实现核验。 +

+
+
+
+ P0 +

一手论文

+

arXiv、会议、期刊与作者正式技术报告,承载核心机制和实验数字。

+
+
+ P1 +

官方实现

+

仓库、模型卡、训练与评测代码,用于确认论文描述如何落到真实系统。

+
+
+ P2 +

官方说明

+

实验室博客、系统卡和产品文档;尚无论文的新模型会临时使用并标明状态。

+
+
+ P3+ +

独立复现

+

第三方结果用于检验外部有效性;二手文章只发现线索,不承载关键事实。

+
+
+
+ + +
diff --git a/src/pages/k3/index.astro b/src/pages/k3/index.astro new file mode 100644 index 0000000..c2cb861 --- /dev/null +++ b/src/pages/k3/index.astro @@ -0,0 +1,710 @@ +--- +import BaseLayout from "@/layouts/BaseLayout.astro"; +import ArchitectureExplorer from "@/components/ArchitectureExplorer.astro"; + +const toc = [ + ["00", "orientation", "先建立阅读坐标"], + ["01", "architecture", "一张图看完整架构"], + ["02", "kda", "KDA:线性工作记忆"], + ["03", "mla", "Gated MLA:全局回看"], + ["04", "attnres", "Attention Residuals"], + ["05", "moe", "Stable LatentMoE"], + ["06", "vision", "原生视觉与优化器"], + ["07", "pretrain", "预训练与长上下文"], + ["08", "posttrain", "后训练与推理强度"], + ["09", "agents", "Agentic RL 环境"], + ["10", "infra", "2.8T / 1M 基础设施"], + ["11", "evaluation", "评测与局限"], + ["↳", "sources", "论文链与一手来源"], +]; +--- + + +
+
+
+

ANCHOR REPORT / 01 KIMI K3

+

把 47 页 K3 报告
读成一条因果链

+

+ 不从 2.8 万亿这个最大数字开始,而从模型同时面对的四个瓶颈开始: + 序列太长、网络太深、容量太大、Agent 轨迹太久。K3 的每个新组件都可以放回这四个问题。 +

+
+
+
REPORT
47 页 · 151 条参考来源
+
MODEL
2.8T total / 104B active
+
CONTEXT
1,048,576 tokens
+
ARCH
69 KDA + 24 Gated MLA
+
STATUS
首版导读 · 持续扩写
+
+
+
+ +
+ + +
+
+

00 READING ORIENTATION

+

先别急着记缩写:K3 在扩展三种信息流

+

+ K3 报告自己的组织方式非常漂亮:沿序列长度、网络深度和模型宽度扩展信息流。 + 这比“又加了哪些模块”更接近真正的设计逻辑。 +

+
+
+ SEQUENCE / TOKEN +

一句话内部怎样交流

+

KDA 负责低成本持续记忆,周期性的 Gated MLA 负责完整全局交互。

+
+
+ DEPTH / LAYER +

信息怎样穿过 93 层

+

Attention Residuals 让当前层有选择地读取早期层,而不只是接收统一累加结果。

+
+
+ WIDTH / EXPERT +

容量怎样远大于计算量

+

Stable LatentMoE 建立 896 个路由专家,每个 Token 只激活 16 个。

+
+
+

+ 第四个问题藏在模型外部:这些结构要在真实硬件上完成预训练、百万 Token 强化学习和线上服务。 + 所以报告第 5 章不是附录,而是 K3 设计的一半。没有 FlashKDA、专家并行、外置 KV Cache、 + 可恢复沙箱和集群调度,前面的架构只是一张昂贵的蓝图。 +

+
+ 一句话版本 +

+ K3 想让信息在“很长的时间、很深的网络、很宽的专家库”里都能流动,同时让整个系统仍然能被训练和部署。 +

+
+
+ +
+

01 ARCHITECTURE OVERVIEW

+

一张图看完 K3:先看流向,再看数字

+ + +

关键规格应该怎样读

+
+
总参数2.8T

表示模型装下的总容量,不等于每个 Token 都计算全部参数。

+
激活参数104B

单个 Token 前向时实际经过的参数规模,仍然非常大。

+
层数93

其中 1 层 dense;注意力由 69 KDA 与 24 Gated MLA 组成。

+
隐藏维度7168

主干表示宽度;LatentMoE 内部路由空间压到 3584。

+
专家896 → 16

另有 2 个 shared experts,给通用变换保留稳定路径。

+
上下文1,048,576

约一百万 Token;能放下不等于不需要上下文管理。

+
视觉编码器401M

MoonViT-V2 把图像和视频编码到共享表示空间。

+
部署精度MXFP4 / 8

专家权重 MXFP4、专家激活 MXFP8,非专家模块保留更高精度。

+
+
+ 常见误解:2.8T 不是“每次都算 2.8T” +

+ MoE 的核心正是把参数容量和每 Token 计算拆开。2.8T 描述可用参数总量;104B 才更接近一次前向的激活规模。 + 但 104B 依然远高于许多 dense 模型,所以“稀疏”不等于“能在普通显卡轻松运行”。 +

+
+
+ +
+

02 KIMI DELTA ATTENTION

+

KDA:不保存所有配对,而是维护一份会更新的工作记忆

+

+ 标准注意力会让每个新 Token 和许多旧 Token 直接比较。KDA 改成维护一个固定形状的状态: + 新信息到来时,先有选择地遗忘,再用“纠错式写入”更新这份状态。 +

+ +

从标准注意力的账单说起

+

+ 长度为 n 的序列,如果做完整 self-attention,需要形成近似 n × n 的交互。 + 在一百万 Token 处,哪怕使用 FlashAttention 避免把整张矩阵写回显存,计算量仍按平方增长。 + 线性注意力的基本想法是先把历史压进状态 S,读取时只让 Query 查询状态。 +

+ +
+ Sₜ = (I − βₜkₜkₜᵀ) · Diag(αₜ) · Sₜ₋₁ + βₜkₜvₜᵀ
+ õₜ = Sₜᵀqₜ + + 教学化书写,符号对应 K3 Report Eq. 1。α 控制各通道保留多少旧状态;β 控制本次写入强度; + delta rule 先擦除当前 key 已有的预测,再写入新的 value。 + +
+ +

为什么叫 Delta Rule

+

+ 如果直接做 S ← S + kvᵀ,同一个 key 反复出现会不断累加,状态容易被重复信息污染。 + Delta Rule 先问“现有状态对这个 key 已经会输出什么”,只写入真实 value 与旧预测之间的差值。 + 它像修改文档:不是每次把整篇内容追加到末尾,而是找到对应位置做差量更新。 +

+ +

K3 相比 Kimi Linear 改了什么

+
    +
  1. + 逐通道遗忘门。α 不是一个标量,而是 key channel 级别的保留率;不同维度可以拥有不同记忆时长。 +
  2. +
  3. + 把 log-decay 下界固定为 −5。Kimi Linear 的衰减映射下界无穷,会让 chunk 内累计衰减的倒数爆大; + K3 将其限制在可由 BF16 表示的范围,从而让对角 tile 也能直接使用 Tensor Core 的稠密矩阵乘。 +
  4. +
  5. + 全秩、输入相关的输出门。读取状态后,模型可以对每个输入动态决定哪些输出通道放行。 +
  6. +
  7. + 块内并行、块间递归。序列分成 chunk:chunk 之间传状态,chunk 内改写成并行矩阵计算,兼顾训练吞吐与线性推理。 +
  8. +
+ +
+ 论文证据怎样看 +

+ K3 报告把整体约 2.5× scaling efficiency 改善归因于 KDA、AttnRes、Stable LatentMoE 与训练/数据配方的组合, + 不能把 2.5× 单独归到 KDA。KDA 的独立机制与消融需要同时阅读 + Kimi Linear 和 K3 §2.1。 +

+
+
+ +
+

03 GATED MLA

+

周期性 MLA:工作记忆之外,仍要把全局摊开来看

+

+ 纯递归状态的优势是成本低,弱点是历史被压进固定大小状态后,精确回看某个遥远 Token 会更难。 + K3 没有把完整注意力全部删除,而是采用 3 层 KDA + 1 层 Gated MLA 的混合模式, + 并保证主干最后一层也是 Gated MLA。 +

+ +

MLA 在压缩什么

+

+ Multi-head Latent Attention 由 DeepSeek-V2 引入。 + 标准多头注意力会为每个历史 Token 缓存多头的 K 和 V;MLA 先把它们压到低维 latent cₜ, + 服务时缓存 cₜ,计算注意力时再通过投影恢复各头所需内容。它保留全局 token-to-token 交互, + 同时显著缩小 KV Cache。 +

+ +
+ cₜ = Wᶜxₜ → 缓存 cₜ → 按需上投影为各头的 K / V + 这是结构直觉,不是 MLA 完整公式。旋转位置编码的解耦与吸收技巧会在“长上下文”专题单独推导。 +
+ +

为什么 K3 的 MLA 不再使用位置编码

+

+ K3 在全部 MLA 层采用 NoPE:Query 和 Key 不显式加入位置编码。位置与近因信息主要由穿插的 KDA 提供, + MLA 专注于全局内容匹配。这样扩展上下文时,也不必重新调 RoPE base 或应用 YaRN。 + 这是混合架构的一个重要分工:KDA 提供位置敏感的持续混合,MLA 提供不受限的全局内容交互。 +

+

+ K3 还给 MLA 加入与 KDA 对齐的输入相关全秩输出门,并在训练时将 attention output 保持为 FP32, + 以纠正 FlashAttention 中有偏的舍入误差;代价是更大的片上存储,报告为此重新安排了 kernel 中的 tile 缓冲重叠。 +

+
+ +
+

04 ATTENTION RESIDUALS

+

把注意力从“时间方向”旋转到“深度方向”

+

+ Transformer 用注意力解决了 RNN 必须把全部历史压进一个时间状态的问题。 + K3 提问:普通 residual 是否又把所有早期层压进了一个深度状态? +

+

+ 标准残差不断做 hₗ₊₁ = hₗ + Fₗ(hₗ)。它很利于梯度传播,但越早的特征会在统一累加中混在一起。 + Full AttnRes 为每一层设置可学习 pseudo-query,对 embedding 和所有先前层输出计算权重,再按权重组合。 + 这里的“Query”不是当前 Token 内容,而是“第 l 层通常希望从哪些深度取信息”的可学习参数。 +

+ +
+ αᵢ→ₗ = exp(qₗᵀ · RMSNorm(kᵢ)) / Σⱼ exp(qₗᵀ · RMSNorm(kⱼ))
+ hₗ = Σᵢ αᵢ→ₗ · vᵢ + + 对应 K3 Report Eq. 8–9 的简化展示。RMSNorm 防止幅值大的层仅凭数值尺度垄断权重。 + +
+ +

为什么又要做 Block AttnRes

+

+ Full AttnRes 的层数平方计算在不足 100 层时并不离谱,真正麻烦是保留所有层输出带来的内存与流水线跨 stage 通信。 + K3 把层分成 block:block 内先求和,跨 block 才做完整深度注意力。报告称经验上约 8 个 block 可保留大部分收益; + K3 使用 12 层一个 block,加上 embedding 来源,总计形成 9 个深度来源组。 +

+
+ 当前证据边界 +

+ Kimi Team 已公开 Attention Residuals 独立预印本, + 在 48B-total / 3B-active 模型上用 1.4T Token 做了 scaling 与消融;K3 则证明它能进入 2.8T 系统。 + 但它仍是 2026 年的新方法,第三方复现和跨架构外部有效性需要持续积累。 +

+
+
+ +
+

05 STABLE LATENTMOE

+

896 选 16:极稀疏带来容量,也放大不稳定

+

+ 传统 MoE 让被选中的每个专家都处理完整 d 维 Token。选更多专家时,不只计算变多, + Token 跨设备发送的数据和专家权重读取也随 routing multiplicity 增长。 + LatentMoE 把通用的 full-width 路径留给 shared experts,把 routed experts 放进较窄 latent space: + K3 主干宽度 7168,路由 latent 维度 3584。 +

+ + + +

Stable 具体在稳定什么

+

报告指出极端稀疏度会放大两个失败模式:routed path 连续多次矩阵乘导致内部激活爆炸;近千专家的负载难以靠旧的无辅助损失 bias update 稳定平衡。K3 加入三项修复:

+
    +
  1. Normalized LatentMoE:在上投影之前加入 RMSNorm,阻止 routed aggregate 的尺度失控。
  2. +
  3. SiTU-GLU:用有界的 tanh 分支近似 SwiGLU 的近原点行为,同时限制大正输入的输出幅值。
  4. +
  5. Quantile Balancing:不只盯平均负载,而用路由分数的分位统计更新专家 bias,适应近千专家下更复杂的分布。
  6. +
+

+ 这条技术线与 DeepSeekMoE 紧密相连:shared experts 保存公共知识,细粒度 routed experts 促进专业化。 + K3 再借 LatentMoE 让“选 16 个专家”的通信和权重读取可承受,并为极端稀疏补上稳定性机制。 +

+
+ +
+

06 NATIVE VISION & MUON

+

视觉是第一类输入;优化器也按注意力头重新分组

+

MoonViT-V2 的角色

+

+ 401M 参数 MoonViT-V2 将图片与视频编码成视觉特征,轻量 projector 把它们映射到语言主干的 embedding space。 + “原生”最重要的含义不是“能看图”,而是视觉数据在预训练阶段就进入统一模型;后训练中的 Agent 还能把截图、 + 图表、裁剪/缩放后的新图片当作连续 observation,形成看—行动—再看的闭环。 +

+

+ 报告描述了渐进式多模态训练:先固定语言模型训练视觉组件,再逐步解冻主干;多模态编码器优化则涉及动态分辨率、 + packing 与避免视觉计算造成流水线 bubble。完整视觉谱系会从 ViT、CLIP、Flamingo、BLIP-2、LLaVA 讲到 Kimi-VL。 +

+ +

Per-Head Muon 为什么出现

+

+ Muon 在矩阵更新上做正交化,目标是比逐元素 Adam 更好地控制隐藏层更新。K3 采用 per-head 分组: + 对 Q/K/V 等多头投影,按 head 分开应用 Muon,而不是把整块矩阵当作一个整体。 + 直觉上,每个 head 是相对独立的子空间,按 head 归一更新可减少大矩阵不同部分相互干扰。 +

+
+ 不要把优化器效果和架构效果混为一谈 +

+ 报告把 Per-Head Muon 放进统一训练配方,但整体 2.5× scaling efficiency 并不是单项优化器消融结论。 + Muon 的通用可扩展性应另外阅读 Muon is Scalable for LLM Training。 +

+
+
+ +
+

07 PRE-TRAINING

+

预训练:扩展的不只是参数,还有数据、长度和数值配方

+

+ K3 报告将模型能力的提升明确归因于架构、数据和训练 recipe 的共同作用,但没有公开足以复现的完整语料配比。 + 这需要区分两件事:我们可以准确解释训练阶段和公开机制,却不能根据少量描述虚构完整数据集。 +

+ +

Scaling Law 在这里怎样用

+

+ 团队先在较小规模训练一系列模型,拟合 loss 与参数、数据和计算之间的关系,再用它比较架构候选与估计 2.8T 模型的预算。 + K3 所称约 2.5× overall scaling efficiency,是相对 K2 的经验缩放效率:在相同计算下取得更低 loss,或达到同等 loss 所需计算更少。 + 它不是“推理速度提高 2.5×”,也不是所有下游任务统一提升 2.5×。 +

+ +

长上下文不是把配置里的 32K 改成 1M

+

+ 上下文扩展需要长度 curriculum、长文档数据、并行策略和稳定训练。K3 的 NoPE MLA 避免 RoPE 外推参数; + KDA 的递归/块并行结构降低长序列成本;系统侧再用 KDA Context Parallelism 分摊状态与 chunk。 + 最后还要在 post-training 里真正让模型经历长轨迹,否则“窗口能装下”不等于“模型会有效使用”。 +

+
+ 窗口容量 vs. 使用能力 +

+ 能把一百万 Token 放进输入,像图书馆允许你搬进一百万字;能否跨文档找到证据、维持任务状态并避免遗忘, + 才是在考你是否真的读懂。K3 同时用架构、长程 RL 和上下文管理训练这件事。 +

+
+
+ +
+

08 POST-TRAINING

+

九位“专家老师”,最后蒸馏成一个可调思考强度的模型

+

+ K3 的 post-training 覆盖 SFT 与 RL,RL 按三类 domain 与三种 reasoning effort 组织: + general reasoning/knowledge、agentic、coding × low/high/max,形成九个专业策略。 + 然后用 Multi-Teacher On-Policy Distillation(MOPD)把它们整合进统一学生模型。 +

+ +
+
DOMAIN × EFFORT
+ LOWHIGHMAX + REASONINGRₗRₕRₘ + AGENTICAₗAₕAₘ + CODINGCₗCₕCₘ +
+ +

为什么要训练不同 reasoning effort

+

+ “更久思考”会提高部分难题表现,也会增加延迟、成本和过度思考。K3 通过预算控制参数训练 max/high/low 专家: + 先在较大预算下追求能力,再逐步退火得到更短策略。不同 domain 的预算调整由人工参与配置, + 因为一道数学题、一次网页研究和一个代码仓库任务的合理轨迹长度并不相同。 +

+ +

On-policy distillation 为什么比离线模仿更适合长轨迹

+

+ 普通蒸馏常让学生模仿教师已经生成的固定答案;学生一旦在真实生成中走到不同前缀,教师数据就失去覆盖。 + On-policy distillation 让学生自己生成当前前缀,再在这个前缀上比较教师和学生对下一个 Token 的概率, + 形成稠密 reward。这样训练分布更贴近学生真正会访问的状态,也能自然结合 partial rollout。 +

+ +

部署约束直接进入后训练

+

+ K3 从 SFT 开始对 MoE expert weights 使用 MXFP4 QAT,expert activations 使用 MXFP8; + RL rollout 和训练采用相同量化方案,减少训练—推理失配。预训练中的 MTP 层随后被微调为 EAGLE-3 风格 draft model, + 用低/中/高层 AttnRes 特征预测候选 Token,并直接优化与无损推测采样接受率相关的 LK loss。 +

+
+ +
+

09 AGENTIC RL

+

Agent 能力不是只靠“更聪明”,而是靠环境提供可学习的反馈

+

+ K3 报告最值得细读的部分之一,是它把 Agent 后训练写成环境工程:工具、system prompt、context management、 + skills、memory、subagents 和 harness 都成为可组合变量。训练时动态实例化 Kimi Code、Claude Code、Codex、 + OpenClaw、Hermes 等风格,避免模型过拟合一套固定工具 schema。 +

+ +

六类环境回答六种失败模式

+
+
01

可验证搜索与专业工作

多步检索、投行、数据分析、法律交付物;奖励落在证据和最终成果。

+
02

视觉推理

模型在隔离 Python 环境里裁剪、放大、计算并把新图片作为 observation。

+
03

GPU Kernel 优化

先过数值正确性,再比较专家实现与硬件 roofline,并检测缓存/降精度等作弊。

+
04

长期个人助理

用 Gmail、Notion、Slack 等 mock app 构造跨多日事件;单次可达数千工具调用。

+
05

Autonomous Execution

只给初始状态、目标、约束、工具和 verifier,不提供参考轨迹;奖励最终环境状态。

+
06

Web 开发

容器内构建网页、游戏、3D、可视化;功能测试、结构/像素相似与模型检查共同评分。

+
+ +

为什么 verifier 比“模型说完成了”更重要

+

+ 长任务最常见的失败之一,是 Agent 输出一段令人信服的总结,却没有真正改变目标状态。 + K3 的 AET 把 reward 绑定到独立 verifier 读取的环境结果;public verifier 提供诊断, + hidden verifier 检查保留场景,并限制提交预算以减少 reward hacking。 +

+
+ 这条主线会贯穿 Agent 专题 +

+ 可靠 Agent 的学习单位不是“一条漂亮回答”,而是状态明确、动作可执行、反馈可验证的一整段轨迹。 + Harness 多样化、持久环境和独立 verifier,分别处理接口过拟合、短视行为和自我宣告成功。 +

+
+
+ +
+

10 INFRASTRUCTURE

+

2.8T 参数与 1M 轨迹,迫使系统重新设计状态放在哪里

+

+ K3 基础设施可以按三类状态理解:模型状态(参数、优化器)、序列状态(KDA state、KV Cache)、 + 环境状态(代码仓库、应用、microVM)。三类状态的寿命和移动成本完全不同。 +

+ +
+
ONLINE SERVING

请求级状态

KDA-aware prefix cache、专用 kernel、cache/budget-aware fleet scheduling,把共享前缀和不同思考预算纳入调度。

+
1M AGENTIC RL

轨迹级状态

partial rollout、外置 KV retention、adaptive throttling 与可恢复 microVM,避免每次更新都丢掉漫长轨迹。

+
3T PRE-TRAIN

训练级状态

MoonEP 用静态计算形状、平衡专家执行与 zero-copy communication,配合内存优化和多模态 encoder 调度。

+
KDA CO-DESIGN

算子级状态

针对不同序列 regime 的 fused kernel、KDA Context Parallelism 与状态感知前缀缓存。

+
+ +

MoonEP 在解决什么

+

+ MoE 的理论 FLOPs 很漂亮,真实系统却可能被“这个专家突然收到太多 Token”拖垮。 + 跨卡 all-to-all 通信、专家权重读取和不规则 shape 都会制造等待。K3 报告称 MoonEP 追求 perfectly balanced expert execution, + 使用静态计算形状和零拷贝通信把路由后的 Token 送到对应专家。这里的“平衡”是系统执行层结果,不等于路由概率天然均匀; + 它和模型侧 Quantile Balancing 是互补层次。 +

+ +

为什么长程 RL 需要保留外部状态

+

+ 传统 RL rollout 常在模型更新后重新生成。若一条轨迹已经调用工具几百次、积累几十万 Token, + 重新生成会浪费巨大。K3 将 KV Cache 放到外部、允许 partial rollout 暂停并续接; + 同时把工具环境放进可恢复 microVM,使代码、文件和应用状态与语言上下文一起跨训练 step 存续。 +

+
+ +
+

11 EVALUATION & LIMITS

+

K3 很强,但报告也明确说它总体仍落后最强闭源模型

+

+ 官方报告的总体表述很克制:K3 在其评测套件中领先被比较的其他开放与部分闭源模型, + 但整体仍落后 Claude Fable 5 与 GPT-5.6 Sol。理解这句话,比挑一个 K3 第一名的榜单更重要。 +

+ +

评测数字至少要带四个脚注

+
    +
  1. 思考预算:K3 主结果使用 reasoning effort=max,其他模型也尽量用 max/xhigh;成本和延迟不是相同维度。
  2. +
  3. Harness:代码与 Agent 分数是“模型 + Codex/Kimi Code/Claude Code 等脚手架”的系统结果。
  4. +
  5. 工具增强:HLE、视觉数学等同时报告不用工具/用工具,不能把两列混为纯模型能力。
  6. +
  7. Fallback / Guard:某些闭源模型出现 fallback、拒答或 cyber guard,可能显著影响特定任务分数。
  8. +
+ +

+ 例如 BrowseComp 使用 300K Token 触发上下文压缩时 K3 报告 91.2;完整 1M 窗口、不做上下文管理时是 90.4。 + 这反而给出重要工程信号:更大的窗口不自动消灭 context management,适时压缩可能更有效。 +

+ +
+ 我们当前还不能知道的事 +

+ 报告没有给出足以独立复现的完整数据配比、总训练 token 数、全部集群规模与训练成本; + 新架构也缺少广泛第三方复现。网站会持续加入开放权重评测和独立复现,但不会用参数量或单榜第一替代综合判断。 +

+
+
+ +
+

PRIMARY SOURCES

+

读完本页以后,下一步回到这些一手材料

+ + +
+
+
+ + +
diff --git a/src/pages/papers/index.astro b/src/pages/papers/index.astro new file mode 100644 index 0000000..c14bae0 --- /dev/null +++ b/src/pages/papers/index.astro @@ -0,0 +1,636 @@ +--- +import BaseLayout from "@/layouts/BaseLayout.astro"; +import { papers, paperTopics } from "@/data/papers"; + +const sortedPapers = [...papers].sort((a, b) => b.year - a.year || a.title.localeCompare(b.title)); +const verifiedCount = papers.filter((paper) => paper.verified).length; +const spotlightCount = papers.filter((paper) => paper.spotlight).length; +const firstYear = Math.min(...papers.map((paper) => paper.year)); +const lastYear = Math.max(...papers.map((paper) => paper.year)); +const filters = [ + { id: "all", label: "全部" }, + ...paperTopics.map((topic) => ({ id: topic, label: topic })), + { id: "Kimi", label: "Kimi" }, + { id: "DeepSeek", label: "DeepSeek" }, +]; +--- + + +
+
+

LIBRARY / 01 PRIMARY SOURCES

+

不是论文坟场,
而是一张演化地图

+

+ 每一篇只回答两个问题:它解决了上一代路线的什么困难,又把什么新问题留给了后来者。 + 你可以按专题筛选,也可以沿 Kimi / DeepSeek 两条聚光主线回看技术汇流。 +

+
+
+
INDEXED
{papers.length} 篇
+
SPAN
{firstYear}—{lastYear}
+
LINK CHECKED
{verifiedCount} 篇
+
SPOTLIGHT
{spotlightCount} 篇
+
+
+ +
+
+
+

01 CURATED INDEX

+

从问题出发,再去读论文

+
+

+ “主链接已核验”只代表题名与权威入口经过检查,不代表我们复现了全部实验。 + 深度精读、公式推导与架构图会逐章进入专题正文;这里先负责帮你找到正确入口。 +

+
+ +
+ +
+ {filters.map((filter, index) => ( + + ))} +
+
+ {papers.length} + 篇论文可见 +
+
+ +
+ {sortedPapers.map((paper, index) => { + const searchable = [ + paper.year, + paper.title, + paper.contribution, + ...paper.topics, + paper.spotlight ?? "", + ].join(" ").toLocaleLowerCase("zh-CN"); + const filterTokens = [...paper.topics, paper.spotlight].filter(Boolean).join("|"); + + return ( +
+
{String(index + 1).padStart(3, "0")}
+ +
+
+

+ {paper.title} +

+ {paper.spotlight && {paper.spotlight}} +
+

{paper.contribution}

+
+ {paper.topics.map((topic) => {topic})} + {paper.verified && 主链接已核验} +
+
+ +
+ ); + })} +
+ + +
+ +
+

02 HOW TO READ

+

别从摘要一路硬啃到附录

+
+
01

先找旧瓶颈

作者认为上一代方法哪里太慢、太贵、不稳定或不够通用?

+
02

再看核心替换

是哪一个数据流、损失函数或系统边界被重新设计?先画图,再看公式。

+
03

盯住公平对照

参数量、激活量、训练 token、硬件和推理预算是否真的可比?

+
04

最后追后继者

真正重要的想法,会被下一篇论文复用、修正,或暴露新的代价。

+
+
+ + +
+ + diff --git a/src/pages/progress/index.astro b/src/pages/progress/index.astro new file mode 100644 index 0000000..31d8533 --- /dev/null +++ b/src/pages/progress/index.astro @@ -0,0 +1,372 @@ +--- +import BaseLayout from "@/layouts/BaseLayout.astro"; +import { chapters } from "@/data/chapters"; + +const average = Math.round(chapters.reduce((sum, chapter) => sum + chapter.progress, 0) / chapters.length); +const published = chapters.filter((chapter) => chapter.status === "published").length; +const researching = chapters.filter((chapter) => ["researching", "drafting"].includes(chapter.status)).length; + +const workstreams = [ + { label: "研究框架与规范", value: 72, next: "给 125 篇索引补充逐篇精读层级" }, + { label: "网站设计系统", value: 86, next: "打印样式与更多通用可视化组件" }, + { label: "Kimi K3 深读", value: 55, next: "扩写 scaling / infra 逐图笔记" }, + { label: "Transformer 基础", value: 52, next: "加入矩阵形状动画与手算练习" }, + { label: "DeepSeek 专题", value: 54, next: "MLA 与 GRPO 完整公式推导" }, + { label: "引用与事实检查", value: 48, next: "自动化外链复查与来源等级扩展" }, + { label: "开源与部署", value: 18, next: "首次提交、远端仓库与 HTTPS" }, +]; +--- + + +
+
+
+

PUBLIC LEDGER BUILD IN THE OPEN

+

庞大工作需要一份
公开、可检查的账本

+

+ 这里不把“正在研究”包装成“已经完成”。每个专题显示成熟度、下一检查点和证据边界; + 本地 PROGRESS.md 与网站同步维护。 +

+
+
+
OVERALL
专题平均 {average}%
+
READABLE
{published} 个首版可读专题
+
ACTIVE
{researching} 个研究/写作中
+
UPDATED
2026-07-28 21:55 CST
+
MODE
持续迭代,不锁死版本
+
+
+
+ +
+
+
+

01 WORKSTREAMS

+

七条工作流同时推进,但不混淆“有页面”和“已核验”

+
+

+ 内容首版优先打通全局脉络;随后每轮迭代选择一个专题推进到论文/工程层,并做独立事实复核。 +

+
+ +
+ {workstreams.map((stream, index) => ( +
+ {String(index + 1).padStart(2, "0")} +
+

{stream.label}

+

下一检查点:{stream.next}

+
+
+ {stream.value}% +
+
+
+ ))} +
+
+ +
+
+
+

02 COMPLETED THIS ITERATION

+

第一轮已经落地什么

+
+

下列项目都能在仓库或网站中直接检查,不是计划项。

+
+
+

研究目标已持久化

总体路线、完成标准、来源等级与进度账本已写入项目。

+

K3 报告已结构化拆解

47 页报告目录、151 条参考来源和架构/后训练/系统主线已经提取。

+

16 专题知识图

从语言模型基础到评测安全,包含先修依赖和三条贯穿案例。

+

编辑式网站系统

响应式导航、章节模板、侧栏、进度、论文链和证据提示组件。

+

三张原创交互图

K3 三轴架构、Self-Attention Query 实验与 DeepSeek 技术谱系。

+

三篇首版长文

K3 完整导读、Transformer 基础与 DeepSeek 论文谱系。

+

125 篇关键论文索引

覆盖 12 个专题,支持全文搜索、标签筛选与 Kimi/DeepSeek 聚光主线。

+
+
+ +
+
+
+

03 NEXT QUEUE

+

下一批按“能闭环的专题”推进

+
+

优先级由 K3 依赖度、初学者断点和论文可验证性共同决定。

+
+
+
优先级专题本轮交付完成闸门
+
P0长上下文与高效注意力

FlashAttention → MLA → Delta Rule → Kimi Linear/KDA

6 张图 + 20 篇论文
+
P0稀疏计算与 MoE

Switch → DeepSeekMoE → LatentMoE → Stable LatentMoE

路由模拟器 + 通信账本
+
P1推理模型与测试时扩展

CoT → verifier → GRPO → R1 → k1.5 → K3 MOPD

奖励/预算交互图
+
P1大规模训练系统

ZeRO/Megatron → Expert/Context Parallel → DualPipe/MoonEP

显存与通信计算器
+
P2原生多模态

ViT/CLIP → connector VLM → Kimi-VL/MoonViT-V2

视觉 Token 流程图
+
+
+ +
+
+
+

04 QUALITY CONTROL

+

每条结论怎样进入网站

+
+

+ Grok CLI 用于扩大检索覆盖和找遗漏;任何进入正文的机制、数字与时间仍回到原论文、官方仓库或正式文档。 +

+
+
+
01 / DISCOVER

发现线索

K3 references、引用网络、Grok/web 检索、作者仓库。

+ +
02 / VERIFY

打开一手来源

核对标题、版本、公式、表格、实验设置和限制。

+ +
03 / EXPLAIN

写四层解释

直觉、机制、论文证据、工程代价;简化处显式标注。

+ +
04 / REVIEW

交叉检查

链接、数字、先修、图文一致性、移动端与可访问性。

+
+
+ +
+
+
+

05 DECISION LEDGER

+

重要决策不会只留在对话里

+
+

更完整的机器可读进度和研究记录位于开源仓库的 ROADMAP.md、PROGRESS.md 与 research/。

+
+
+
命名为 LLM Atlas

K3 是锚点,范围覆盖完整 LLM 技术史。

+
按问题链组织

现象 → 旧瓶颈 → 关键论文 → 后继桥梁 → K3/DeepSeek 落点。

+
优先原创重绘

架构图做成可缩放 SVG/HTML,明确简化与来源。

+
双重开放许可

代码 MIT,原创文字与图 CC BY-SA 4.0。

+
自托管交付

源码公开到 git.k1412.top,网站部署到 k1412 私有基础设施。

+
+
+ + +
diff --git a/src/pages/roadmap/index.astro b/src/pages/roadmap/index.astro new file mode 100644 index 0000000..713cc5a --- /dev/null +++ b/src/pages/roadmap/index.astro @@ -0,0 +1,468 @@ +--- +import BaseLayout from "@/layouts/BaseLayout.astro"; +import { chapters, statusLabel } from "@/data/chapters"; + +const totalPapers = chapters.reduce((sum, chapter) => sum + chapter.papers, 0); +const averageProgress = Math.round(chapters.reduce((sum, chapter) => sum + chapter.progress, 0) / chapters.length); + +const stages = [ + { label: "A · 起点", items: ["00", "01"] }, + { label: "B · 核心架构", items: ["02", "03", "04", "05"] }, + { label: "C · 规模化", items: ["06", "07", "08", "09"] }, + { label: "D · 行为与能力", items: ["10", "11", "12", "13"] }, + { label: "E · 落地与判断", items: ["14", "15"] }, +]; +--- + + +
+
+
+

CURRICULUM / 00 LEARNING GRAPH

+

先知道自己在哪里,
再决定往哪里深入

+

+ 16 个专题不是一条必须顺序走完的直线。它们组成有依赖的图: + Transformer 是共同地基,MoE/长上下文/训练系统相互牵引,后训练再通向推理与 Agent。 +

+
+
+
MODULES
16 个专题
+
PAPER SLOTS
{totalPapers} 篇核心论文位
+
PATHS
4 条推荐路径
+
PROGRESS
首版平均 {averageProgress}%
+
DEPTH
L0 直觉 → L3 工程
+
+
+
+ +
+
+
+

01 DEPENDENCY GRAPH

+

从左到右,是知识依赖,不是历史年份

+
+

+ 一篇论文可能跨多个专题。例如 DeepSeek-V3 同时属于 MoE、训练系统、低精度和后训练; + K3 则是几乎全部主线的汇流点。 +

+
+ + + +
+
普通节点:专题章节
+
关键枢纽:被多条路径依赖
+
建议先修方向
+
+
+ +
+
+
+

02 FOUR ROUTES

+

四条路径,四种不同的“读懂”

+
+

路线可以交叉。每条路线的终点不是记住术语,而是具备一项可验证的阅读或设计能力。

+
+ +
+
+ ROUTE A · BEGINNER +

从零建立架构直觉

+

01 → 02 → 03 → 04 → 10

+
    +
  1. 解释 next-token objective
  2. +
  3. 手算一次 self-attention
  4. +
  5. 画出 decoder block
  6. +
  7. 区分 pretrain 与 post-train
  8. +
+
+
+ ROUTE B · K3 REVERSE +

从 K3 反向拆组件

+

K3 → 07 → 06 → 03 → 11 → 08/14

+
    +
  1. 解释三维信息流
  2. +
  3. 比较 KDA 与 MLA
  4. +
  5. 解释 2.8T / 104B
  6. +
  7. 读懂 1M Agentic RL 系统
  8. +
+
+
+ ROUTE C · DEEPSEEK +

沿论文看算法—系统协同

+

04 → 06 → 07 → 09 → 11 → 12

+
    +
  1. 推导 MLA 缓存压缩
  2. +
  3. 理解 FP8 scaling
  4. +
  5. 区分 PPO 与 GRPO
  6. +
  7. 对照 V4 与 K3 长上下文
  8. +
+
+
+ ROUTE D · SYSTEMS +

跟一个 Token 穿过真实集群

+

02 → 04 → 08 → 09 → 14 → 15

+
    +
  1. 做显存与 FLOPs 账本
  2. +
  3. 选择并行切分
  4. +
  5. 理解 KV Cache 与调度
  6. +
  7. 设计评测 harness
  8. +
+
+
+
+ +
+
+
+

03 ALL MODULES

+

每个专题都有问题、先修、论文和完成标准

+
+

+ “研究中”表示资料已建立但正文未完成;“首版可读”表示已有连贯解释,不代表内容已经停止迭代。 +

+
+ +
+ {chapters.map((chapter) => ( +
+
+ {chapter.number} + {chapter.kicker} +
+
+
+

{chapter.title}

+ {statusLabel[chapter.status]} +
+

{chapter.question}

+

{chapter.summary}

+
+ {chapter.highlights.map((item) => {item})} +
+
+ +
+ ))} +
+
+ +
+
+
+

04 DEFINITION OF DONE

+

什么时候一个专题才算真正完成

+
+

完成不是“字数够长”。每个专题必须通过结构、事实、来源、教学、对照和可访问性六道闸门。

+
+
+
01

问题链

旧方法为何失败、新方法改变什么、怎样通向下一篇论文。

+
02

一手证据

8–20 篇核心论文,数字与结论链接到原始来源。

+
03

视觉推导

至少两张可缩放图和一个交互实验或逐步动画。

+
04

贯穿对照

明确回答这项技术在 K3 与 DeepSeek 中怎样出现。

+
+
+ + +
diff --git a/src/styles/global.css b/src/styles/global.css new file mode 100644 index 0000000..e1e0140 --- /dev/null +++ b/src/styles/global.css @@ -0,0 +1,1356 @@ +@layer reset, base, components, utilities; + +@layer reset { + *, + *::before, + *::after { + box-sizing: border-box; + } + + html { + scroll-behavior: smooth; + } + + body, + h1, + h2, + h3, + h4, + p, + figure, + blockquote, + dl, + dd { + margin: 0; + } + + img, + svg { + display: block; + max-width: 100%; + } + + button, + input { + font: inherit; + } +} + +@layer base { + :root { + --paper: #f4f1ea; + --paper-raised: #faf8f3; + --paper-deep: #eae5db; + --ink: #27364a; + --ink-strong: #1c293b; + --muted: #687589; + --muted-light: #8d98a7; + --line: rgba(39, 54, 74, 0.17); + --line-strong: rgba(39, 54, 74, 0.34); + --copper: #ad6445; + --copper-pale: #ead8ce; + --sage: #557a72; + --sage-pale: #dce7e2; + --violet: #6d6687; + --violet-pale: #e3dfeb; + --sky: #627f99; + --sky-pale: #dfe7ec; + --display: "Inter", "SF Pro Display", "Noto Sans SC", "PingFang SC", "Microsoft YaHei", sans-serif; + --text: "Inter", "SF Pro Text", "Noto Sans SC", "PingFang SC", "Microsoft YaHei", sans-serif; + --serif: "Iowan Old Style", "Source Han Serif SC", "Songti SC", "STSong", serif; + --mono: "SFMono-Regular", "Cascadia Code", "JetBrains Mono", monospace; + --page: min(1380px, calc(100vw - 72px)); + --reading: 780px; + color-scheme: light; + } + + body { + min-width: 320px; + background: + radial-gradient(circle at 87% 8%, rgba(139, 160, 174, 0.11), transparent 22rem), + radial-gradient(circle at 62% 37%, rgba(183, 128, 99, 0.07), transparent 28rem), + var(--paper); + color: var(--ink); + font-family: var(--text); + font-size: 16px; + line-height: 1.78; + text-rendering: optimizeLegibility; + } + + ::selection { + background: var(--copper-pale); + color: var(--ink-strong); + } + + a { + color: inherit; + text-decoration-thickness: 1px; + text-underline-offset: 0.18em; + } + + a:focus-visible, + button:focus-visible { + outline: 2px solid var(--copper); + outline-offset: 4px; + } + + h1, + h2, + h3, + h4 { + color: var(--ink-strong); + font-family: var(--display); + font-weight: 650; + letter-spacing: -0.035em; + line-height: 1.13; + } + + h1 { + font-size: clamp(3.2rem, 7vw, 7.6rem); + } + + h2 { + font-size: clamp(2rem, 3.8vw, 4.25rem); + } + + h3 { + font-size: clamp(1.15rem, 1.5vw, 1.45rem); + letter-spacing: -0.02em; + } + + code, + kbd { + font-family: var(--mono); + } +} + +@layer components { + .reading-progress { + position: fixed; + z-index: 100; + inset: 0 0 auto; + height: 3px; + overflow: hidden; + } + + .reading-progress span { + display: block; + width: 100%; + height: 100%; + background: var(--copper); + transform: scaleX(0); + transform-origin: left; + } + + .site-header { + position: sticky; + z-index: 80; + top: 0; + display: grid; + grid-template-columns: 1fr auto 1fr; + align-items: center; + min-height: 72px; + padding: 0 max(28px, calc((100vw - 1380px) / 2)); + border-bottom: 1px solid var(--line); + background: color-mix(in srgb, var(--paper) 88%, transparent); + backdrop-filter: blur(18px); + } + + .wordmark { + display: inline-flex; + align-items: center; + justify-self: start; + gap: 13px; + text-decoration: none; + } + + .wordmark-mark, + .footer-mark { + display: grid; + place-items: center; + width: 42px; + aspect-ratio: 1; + border-radius: 8px; + background: var(--ink); + color: var(--paper-raised); + font: 700 0.73rem/1 var(--mono); + letter-spacing: -0.06em; + text-decoration: none; + } + + .wordmark-copy { + display: grid; + line-height: 1.1; + } + + .wordmark-copy b { + font-size: 0.74rem; + letter-spacing: 0.2em; + } + + .wordmark-copy small { + margin-top: 6px; + color: var(--muted); + font-family: var(--mono); + font-size: 0.48rem; + letter-spacing: 0.1em; + } + + .top-nav { + display: flex; + align-items: center; + gap: 34px; + } + + .top-nav a { + position: relative; + color: var(--muted); + font-size: 0.83rem; + text-decoration: none; + } + + .top-nav a:hover, + .top-nav a[aria-current="page"] { + color: var(--ink); + } + + .top-nav a[aria-current="page"]::after { + position: absolute; + right: 0; + bottom: -24px; + left: 0; + height: 2px; + background: var(--copper); + content: ""; + } + + .header-meta { + display: flex; + align-items: center; + justify-self: end; + gap: 18px; + color: var(--muted); + font: 0.62rem/1 var(--mono); + letter-spacing: 0.15em; + } + + .menu-toggle { + display: none; + padding: 9px 12px; + border: 1px solid var(--line-strong); + border-radius: 5px; + background: transparent; + color: var(--ink); + cursor: pointer; + } + + .mobile-nav { + display: none; + } + + .hero, + .page-hero { + position: relative; + overflow: hidden; + border-bottom: 1px solid var(--line); + } + + .hero::before, + .page-hero::before { + position: absolute; + top: -22rem; + right: -10rem; + width: 52rem; + height: 52rem; + border-radius: 44% 56% 62% 38%; + background: + radial-gradient(circle at 43% 47%, rgba(92, 127, 151, 0.16), transparent 31%), + radial-gradient(circle at 65% 38%, rgba(173, 100, 69, 0.12), transparent 24%); + filter: blur(24px); + content: ""; + transform: rotate(13deg); + } + + .hero-inner { + position: relative; + display: grid; + grid-template-columns: minmax(0, 1fr) 310px; + gap: 80px; + align-items: end; + width: var(--page); + min-height: min(780px, calc(100vh - 72px)); + margin-inline: auto; + padding: 100px 40px 80px; + } + + .hero-copy { + max-width: 950px; + } + + .eyebrow { + display: flex; + align-items: center; + gap: 13px; + margin-bottom: 22px; + color: var(--muted); + font: 700 0.68rem/1.4 var(--mono); + letter-spacing: 0.2em; + text-transform: uppercase; + } + + .eyebrow span { + color: var(--copper); + } + + .hero h1 { + max-width: 990px; + text-wrap: balance; + } + + .hero h1 em { + display: block; + margin-top: 12px; + color: var(--muted); + font-family: var(--serif); + font-size: 0.43em; + font-weight: 450; + letter-spacing: 0; + } + + .hero-deck { + max-width: 790px; + margin-top: 36px; + color: #4f6075; + font-size: clamp(1.05rem, 1.4vw, 1.25rem); + line-height: 1.9; + } + + .hero-actions { + display: flex; + flex-wrap: wrap; + gap: 12px; + margin-top: 34px; + } + + .button { + display: inline-flex; + align-items: center; + justify-content: center; + min-height: 46px; + padding: 0 19px; + border: 1px solid var(--line-strong); + border-radius: 6px; + background: transparent; + color: var(--ink); + font-size: 0.88rem; + text-decoration: none; + transition: transform 160ms ease, background-color 160ms ease; + } + + .button:hover { + transform: translateY(-2px); + } + + .button.primary { + border-color: var(--ink); + background: var(--ink); + color: var(--paper-raised); + } + + .hero-aside { + position: relative; + padding-left: 30px; + border-left: 1px solid var(--line); + } + + .hero-aside > span { + color: var(--muted); + font: 0.65rem/1 var(--mono); + letter-spacing: 0.18em; + } + + .hero-aside > strong { + display: block; + margin: 18px 0 8px; + color: var(--ink); + font: 700 1.55rem/1.2 var(--mono); + } + + .hero-aside > p { + color: var(--muted); + font-size: 0.82rem; + } + + .hero-stats { + display: grid; + margin-top: 28px; + border-top: 1px solid var(--line); + } + + .hero-stats div { + display: grid; + grid-template-columns: 52px 1fr; + align-items: center; + min-height: 46px; + border-bottom: 1px solid var(--line); + } + + .hero-stats b { + font: 700 0.95rem/1 var(--mono); + } + + .hero-stats span { + color: var(--muted); + font-size: 0.75rem; + } + + .scope-strip { + position: relative; + display: grid; + grid-template-columns: 105px 1fr auto; + gap: 28px; + align-items: center; + width: var(--page); + margin: 0 auto; + padding: 24px 40px; + border-top: 1px solid var(--line); + } + + .scope-strip > span { + color: var(--muted); + font-size: 0.75rem; + } + + .scope-strip p { + color: #526177; + font-size: 0.9rem; + } + + .scope-strip a { + color: var(--copper); + font: 0.72rem/1 var(--mono); + text-decoration: none; + } + + .section { + width: var(--page); + margin-inline: auto; + padding: 104px 40px; + border-bottom: 1px solid var(--line); + } + + .section.compact { + padding-block: 72px; + } + + .section-heading { + display: grid; + grid-template-columns: minmax(0, 1fr) minmax(300px, 0.55fr); + gap: 70px; + align-items: end; + margin-bottom: 52px; + } + + .section-heading .eyebrow { + margin-bottom: 18px; + } + + .section-heading h2 { + max-width: 850px; + } + + .section-lead { + color: #526177; + font-size: 1.05rem; + line-height: 1.9; + } + + .thesis { + display: grid; + grid-template-columns: 140px 1fr; + gap: 34px; + max-width: 1060px; + margin-bottom: 54px; + padding: 26px 0 26px 28px; + border-left: 3px solid var(--sky); + } + + .micro-label { + color: var(--muted); + font: 700 0.65rem/1.5 var(--mono); + letter-spacing: 0.14em; + text-transform: uppercase; + } + + .thesis p { + color: var(--ink); + font-size: 1.18rem; + line-height: 1.9; + } + + .feature-grid, + .method-grid, + .chapter-grid { + display: grid; + grid-template-columns: repeat(4, minmax(0, 1fr)); + border-top: 1px solid var(--line); + border-left: 1px solid var(--line); + } + + .feature-card, + .method-card, + .chapter-card { + min-height: 240px; + padding: 28px; + border-right: 1px solid var(--line); + border-bottom: 1px solid var(--line); + background: color-mix(in srgb, var(--paper-raised) 35%, transparent); + } + + .feature-card .card-number, + .method-card .card-number { + display: block; + margin-bottom: 42px; + color: var(--muted-light); + font: 0.75rem/1 var(--mono); + } + + .feature-card p, + .method-card p { + margin-top: 14px; + color: var(--muted); + font-size: 0.88rem; + } + + .pathways { + display: grid; + grid-template-columns: 220px 1fr; + gap: 46px; + } + + .path-tabs { + display: grid; + align-content: start; + border-top: 1px solid var(--line); + } + + .path-tabs button { + display: grid; + grid-template-columns: 34px 1fr; + gap: 12px; + align-items: center; + min-height: 62px; + padding: 0 12px; + border: 0; + border-bottom: 1px solid var(--line); + background: transparent; + color: var(--muted); + text-align: left; + cursor: pointer; + } + + .path-tabs button span { + color: var(--muted-light); + font: 0.68rem/1 var(--mono); + } + + .path-tabs button[aria-selected="true"] { + background: var(--ink); + color: var(--paper-raised); + } + + .path-tabs button[aria-selected="true"] span { + color: var(--copper-pale); + } + + .path-panel { + display: none; + } + + .path-panel[data-active] { + display: grid; + grid-template-columns: minmax(0, 1fr) 260px; + gap: 34px; + align-items: stretch; + } + + .path-copy { + padding: 34px; + border: 1px solid var(--line); + background: var(--paper-raised); + } + + .path-copy .micro-label { + color: var(--copper); + } + + .path-copy h3 { + margin: 14px 0 16px; + font-size: 1.8rem; + } + + .path-copy p { + color: #516077; + } + + .path-copy ol { + display: grid; + gap: 12px; + margin: 24px 0 0; + padding: 0; + list-style: none; + counter-reset: step; + } + + .path-copy li { + display: grid; + grid-template-columns: 30px 1fr; + gap: 12px; + counter-increment: step; + } + + .path-copy li::before { + display: grid; + place-items: center; + width: 25px; + height: 25px; + border: 1px solid var(--line-strong); + border-radius: 50%; + color: var(--muted); + content: counter(step); + font: 0.65rem/1 var(--mono); + } + + .path-meta { + display: grid; + align-content: start; + gap: 18px; + padding: 28px; + background: var(--paper-deep); + } + + .path-meta div { + padding-bottom: 18px; + border-bottom: 1px solid var(--line); + } + + .path-meta span { + display: block; + margin-bottom: 7px; + color: var(--muted); + font: 0.62rem/1.4 var(--mono); + letter-spacing: 0.12em; + } + + .path-meta b { + font-size: 0.88rem; + font-weight: 550; + } + + .chapter-grid { + grid-template-columns: repeat(3, minmax(0, 1fr)); + } + + .chapter-card { + position: relative; + display: flex; + min-height: 350px; + flex-direction: column; + color: inherit; + text-decoration: none; + transition: background-color 160ms ease, transform 160ms ease; + } + + .chapter-card:hover { + z-index: 1; + background: var(--paper-raised); + transform: translateY(-3px); + } + + .chapter-card .chapter-top { + display: flex; + align-items: center; + justify-content: space-between; + margin-bottom: 38px; + } + + .chapter-number { + color: var(--copper); + font: 700 0.75rem/1 var(--mono); + } + + .status { + padding: 5px 8px; + border: 1px solid var(--line); + border-radius: 999px; + color: var(--muted); + font: 0.61rem/1 var(--mono); + } + + .status.published { + border-color: rgba(85, 122, 114, 0.35); + background: var(--sage-pale); + color: #385f57; + } + + .status.researching, + .status.drafting { + background: var(--sky-pale); + color: #496a83; + } + + .chapter-card h3 { + font-size: 1.45rem; + } + + .chapter-card > p { + margin-top: 16px; + color: var(--muted); + font-size: 0.88rem; + } + + .chapter-card .chapter-bottom { + display: grid; + gap: 10px; + margin-top: auto; + padding-top: 24px; + } + + .progress-track { + height: 3px; + overflow: hidden; + background: var(--paper-deep); + } + + .progress-track span { + display: block; + height: 100%; + background: var(--copper); + } + + .chapter-meta { + display: flex; + justify-content: space-between; + color: var(--muted-light); + font: 0.61rem/1 var(--mono); + } + + .page-hero { + padding: 82px 0 68px; + } + + .page-hero-inner { + position: relative; + display: grid; + grid-template-columns: minmax(0, 1fr) 320px; + gap: 70px; + align-items: end; + width: var(--page); + margin-inline: auto; + padding-inline: 40px; + } + + .page-hero h1 { + max-width: 1000px; + font-size: clamp(2.9rem, 6vw, 6.4rem); + } + + .page-hero .lead { + max-width: 760px; + margin-top: 26px; + color: #506077; + font-size: 1.14rem; + line-height: 1.9; + } + + .page-facts { + display: grid; + border-top: 1px solid var(--line); + } + + .page-facts div { + display: grid; + grid-template-columns: 100px 1fr; + gap: 16px; + padding: 14px 0; + border-bottom: 1px solid var(--line); + } + + .page-facts dt { + color: var(--muted); + font: 0.62rem/1.5 var(--mono); + letter-spacing: 0.1em; + text-transform: uppercase; + } + + .page-facts dd { + font-size: 0.84rem; + } + + .report-shell { + display: grid; + grid-template-columns: 240px minmax(0, 1fr); + gap: 60px; + width: var(--page); + margin-inline: auto; + padding: 68px 40px 110px; + } + + .side-rail { + position: sticky; + top: 106px; + align-self: start; + max-height: calc(100vh - 130px); + overflow: auto; + padding-right: 24px; + } + + .side-rail > p { + margin-bottom: 18px; + color: var(--muted); + font: 0.65rem/1 var(--mono); + letter-spacing: 0.16em; + } + + .side-rail ol { + display: grid; + gap: 2px; + margin: 0; + padding: 0; + list-style: none; + } + + .side-rail a { + display: grid; + grid-template-columns: 30px 1fr; + gap: 9px; + padding: 8px 0; + color: var(--muted); + font-size: 0.77rem; + line-height: 1.5; + text-decoration: none; + } + + .side-rail a:hover { + color: var(--ink); + } + + .side-rail a span { + color: var(--muted-light); + font-family: var(--mono); + font-size: 0.62rem; + } + + .rail-note { + margin-top: 26px; + padding: 18px; + border: 1px solid var(--line); + color: var(--muted); + font-size: 0.74rem; + } + + .rail-note b { + display: block; + margin-bottom: 7px; + color: var(--ink); + font-size: 0.72rem; + } + + .article { + min-width: 0; + max-width: 960px; + } + + .article-section { + padding: 32px 0 78px; + border-bottom: 1px solid var(--line); + scroll-margin-top: 92px; + } + + .article-section + .article-section { + padding-top: 78px; + } + + .article-section > .eyebrow { + margin-bottom: 17px; + } + + .article-section h2 { + max-width: 840px; + margin-bottom: 30px; + font-size: clamp(2.1rem, 4vw, 3.9rem); + } + + .article-section h3 { + margin: 46px 0 18px; + font-size: 1.55rem; + } + + .article-section h4 { + margin: 32px 0 14px; + font-size: 1.07rem; + letter-spacing: -0.01em; + } + + .article-section > p, + .article-copy p { + max-width: var(--reading); + margin-top: 18px; + color: #405168; + font-size: 1.02rem; + line-height: 1.95; + } + + .article-section strong { + color: var(--ink-strong); + } + + .article-section a:not(.button) { + color: #3f6684; + } + + .article-section ul, + .article-section ol { + display: grid; + max-width: var(--reading); + gap: 10px; + margin: 20px 0; + padding-left: 1.35rem; + color: #405168; + } + + .lede { + max-width: 860px !important; + color: var(--ink) !important; + font-family: var(--serif); + font-size: clamp(1.25rem, 1.8vw, 1.55rem) !important; + line-height: 1.75 !important; + } + + .plain-language, + .evidence-note, + .warning-note { + max-width: 840px; + margin: 34px 0; + padding: 24px 28px; + border-left: 3px solid var(--sky); + background: color-mix(in srgb, var(--sky-pale) 55%, transparent); + } + + .evidence-note { + border-left-color: var(--sage); + background: color-mix(in srgb, var(--sage-pale) 55%, transparent); + } + + .warning-note { + border-left-color: var(--copper); + background: color-mix(in srgb, var(--copper-pale) 50%, transparent); + } + + .plain-language b, + .evidence-note b, + .warning-note b { + display: block; + margin-bottom: 8px; + font: 700 0.67rem/1 var(--mono); + letter-spacing: 0.12em; + text-transform: uppercase; + } + + .plain-language p, + .evidence-note p, + .warning-note p { + color: #45556a; + font-size: 0.94rem; + line-height: 1.85; + } + + .formula { + max-width: 840px; + margin: 28px 0; + padding: 28px; + overflow-x: auto; + border: 1px solid var(--line); + background: var(--paper-raised); + color: var(--ink-strong); + font: 1rem/1.7 var(--mono); + text-align: center; + } + + .formula small { + display: block; + margin-top: 12px; + color: var(--muted); + font: 0.72rem/1.6 var(--text); + text-align: left; + } + + .concept-grid { + display: grid; + grid-template-columns: repeat(3, minmax(0, 1fr)); + max-width: 900px; + margin: 34px 0; + border-top: 1px solid var(--line); + border-left: 1px solid var(--line); + } + + .concept-grid > article { + min-height: 190px; + padding: 24px; + border-right: 1px solid var(--line); + border-bottom: 1px solid var(--line); + } + + .concept-grid span { + color: var(--copper); + font: 0.68rem/1 var(--mono); + } + + .concept-grid h3 { + margin: 23px 0 12px; + font-size: 1.12rem; + } + + .concept-grid p { + color: var(--muted); + font-size: 0.82rem; + line-height: 1.75; + } + + .paper-chain { + display: grid; + max-width: 900px; + margin-top: 32px; + border-top: 1px solid var(--line); + } + + .paper-row { + display: grid; + grid-template-columns: 72px minmax(200px, 0.8fr) minmax(280px, 1.2fr); + gap: 22px; + padding: 22px 8px; + border-bottom: 1px solid var(--line); + text-decoration: none; + } + + .paper-row:hover { + background: color-mix(in srgb, var(--paper-raised) 65%, transparent); + } + + .paper-row time { + color: var(--copper); + font: 700 0.75rem/1.5 var(--mono); + } + + .paper-row b { + font-size: 0.93rem; + line-height: 1.5; + } + + .paper-row p { + color: var(--muted); + font-size: 0.8rem; + line-height: 1.65; + } + + .site-footer { + display: grid; + grid-template-columns: 1fr auto; + gap: 50px; + width: var(--page); + margin-inline: auto; + padding: 60px 40px 42px; + } + + .site-footer > div:first-child { + display: flex; + align-items: center; + gap: 18px; + } + + .site-footer > div:first-child p { + max-width: 480px; + color: var(--muted); + font-size: 0.8rem; + } + + .footer-links { + display: flex; + flex-wrap: wrap; + align-items: center; + justify-content: flex-end; + gap: 22px; + } + + .footer-links a { + color: var(--muted); + font-size: 0.75rem; + text-decoration: none; + } + + .footer-legal { + grid-column: 1 / -1; + padding-top: 24px; + border-top: 1px solid var(--line); + color: var(--muted-light); + font: 0.62rem/1.6 var(--mono); + } +} + +@layer utilities { + .visually-hidden { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + overflow: hidden; + clip: rect(0, 0, 0, 0); + white-space: nowrap; + border: 0; + } + + .mono { + font-family: var(--mono); + } + + .muted { + color: var(--muted); + } +} + +@media (max-width: 1080px) { + :root { + --page: calc(100vw - 36px); + } + + .site-header { + grid-template-columns: 1fr auto; + padding-inline: 24px; + } + + .top-nav { + display: none; + } + + .menu-toggle { + display: inline-flex; + } + + .mobile-nav { + position: absolute; + top: 72px; + right: 18px; + left: 18px; + display: none; + grid-template-columns: repeat(2, minmax(0, 1fr)); + padding: 12px; + border: 1px solid var(--line); + background: var(--paper-raised); + box-shadow: 0 24px 70px rgba(39, 54, 74, 0.16); + } + + .mobile-nav[data-open] { + display: grid; + } + + .mobile-nav a { + padding: 13px; + color: var(--muted); + text-decoration: none; + } + + .hero-inner, + .page-hero-inner { + grid-template-columns: 1fr; + } + + .hero-inner { + gap: 56px; + min-height: auto; + } + + .hero-aside { + display: grid; + grid-template-columns: 1fr 1.5fr; + column-gap: 28px; + } + + .hero-stats { + grid-column: 2; + grid-row: 1 / span 3; + margin-top: 0; + } + + .feature-grid, + .method-grid, + .chapter-grid { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } + + .section-heading { + grid-template-columns: 1fr; + gap: 24px; + } + + .report-shell { + grid-template-columns: 1fr; + } + + .side-rail { + position: static; + display: none; + } +} + +@media (max-width: 720px) { + :root { + --page: calc(100vw - 20px); + } + + body { + font-size: 15px; + } + + .site-header { + min-height: 64px; + padding-inline: 14px; + } + + .wordmark-copy small, + .header-meta > span { + display: none; + } + + .wordmark-mark { + width: 38px; + } + + .mobile-nav { + top: 64px; + } + + .hero-inner, + .page-hero-inner, + .section, + .scope-strip, + .report-shell, + .site-footer { + padding-right: 18px; + padding-left: 18px; + } + + .hero-inner { + padding-top: 70px; + padding-bottom: 54px; + } + + .hero h1 { + font-size: clamp(3rem, 16vw, 5.1rem); + } + + .hero h1 em { + font-size: 0.36em; + line-height: 1.5; + } + + .hero-aside { + display: block; + } + + .hero-stats { + margin-top: 24px; + } + + .scope-strip { + grid-template-columns: 1fr; + gap: 8px; + } + + .section { + padding-block: 76px; + } + + .section-heading { + margin-bottom: 38px; + } + + .feature-grid, + .method-grid, + .chapter-grid, + .concept-grid { + grid-template-columns: 1fr; + } + + .thesis { + grid-template-columns: 1fr; + gap: 12px; + } + + .pathways { + grid-template-columns: 1fr; + gap: 22px; + } + + .path-tabs { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } + + .path-tabs button { + border-right: 1px solid var(--line); + } + + .path-panel[data-active] { + grid-template-columns: 1fr; + } + + .page-hero { + padding-block: 60px 50px; + } + + .page-facts { + margin-top: 12px; + } + + .report-shell { + padding-block: 38px 80px; + } + + .article-section { + padding-bottom: 60px; + } + + .article-section + .article-section { + padding-top: 60px; + } + + .paper-row { + grid-template-columns: 52px 1fr; + } + + .paper-row p { + grid-column: 2; + } + + .site-footer { + grid-template-columns: 1fr; + } + + .footer-links { + justify-content: flex-start; + } +} + +@media (prefers-reduced-motion: reduce) { + html { + scroll-behavior: auto; + } + + *, + *::before, + *::after { + scroll-behavior: auto !important; + transition-duration: 0.01ms !important; + animation-duration: 0.01ms !important; + animation-iteration-count: 1 !important; + } +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..c5450d3 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "astro/tsconfigs/strict", + "compilerOptions": { + "baseUrl": ".", + "paths": { + "@/*": ["src/*"] + } + } +}