From d0cbed1086381b512956954e3912be83c1fcbba6 Mon Sep 17 00:00:00 2001 From: yiweinanzi <2268867257@qq.com> Date: Sun, 22 Feb 2026 12:33:11 +0800 Subject: [PATCH] =?UTF-8?q?=E9=9B=86=E6=88=90=20AI=20=E7=A7=91=E7=A0=94?= =?UTF-8?q?=E6=8C=87=E5=8D=97=20(ai-research-ebook)=20=E5=88=B0=E5=AD=90?= =?UTF-8?q?=E8=B7=AF=E5=BE=84=20/research/?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 添加 external/ai-research-ebook/ 源码目录 - 添加 research/ 构建产物目录(BASE_PATH=/AgentGuide/research) - 更新 deploy-pages.yml 支持自动构建 - 在首页 footer 添加 AI 科研指南入口链接 访问地址: - 主站: https://adongwanai.github.io/AgentGuide/ - 科研指南: https://adongwanai.github.io/AgentGuide/research/ Co-Authored-By: Claude Opus 4.6 (1M context) --- .github/workflows/deploy-pages.yml | 40 +- .gitignore | 5 + .../ai-research-ebook/.vscode/extensions.json | 4 + .../ai-research-ebook/.vscode/launch.json | 11 + external/ai-research-ebook/README.md | 92 + external/ai-research-ebook/astro.config.mjs | 106 + external/ai-research-ebook/package-lock.json | 6400 +++++++++++++++++ external/ai-research-ebook/package.json | 17 + external/ai-research-ebook/public/favicon.svg | 1 + external/ai-research-ebook/public/logo.svg | 15 + .../public/scripts/mermaid-init.js | 248 + .../ai-research-ebook/src/assets/houston.webp | Bin 0 -> 98506 bytes .../ai-research-ebook/src/assets/logo.svg | 15 + .../ai-research-ebook/src/content.config.ts | 7 + .../src/content/docs/code/agents.mdx | 609 ++ .../src/content/docs/code/claude.mdx | 684 ++ .../src/content/docs/code/gpt.mdx | 388 + .../src/content/docs/figures/comparison.mdx | 142 + .../src/content/docs/figures/design.mdx | 160 + .../src/content/docs/figures/tools.mdx | 426 ++ .../src/content/docs/idea/projects.mdx | 192 + .../src/content/docs/idea/research.mdx | 160 + .../src/content/docs/index.mdx | 138 + .../src/content/docs/library/root-assets.mdx | 591 ++ .../src/content/docs/review/structured.mdx | 241 + .../src/content/docs/review/templates.mdx | 134 + .../src/content/docs/tools/overview.mdx | 205 + .../src/content/docs/tools/workflow.mdx | 528 ++ .../content/docs/writing/collaboration.mdx | 217 + .../src/content/docs/writing/methods.mdx | 154 + .../src/content/docs/writing/prism.mdx | 210 + .../src/content/docs/writing/rebuttal.mdx | 186 + .../ai-research-ebook/src/styles/custom.css | 794 ++ external/ai-research-ebook/tsconfig.json | 5 + index.html | 1 + research/404.html | 48 + ...astro_type_script_index_0_lang.hwBsy0Mo.js | 1 + ...astro_type_script_index_0_lang.Cz5g7KHI.js | 1 + ...astro_type_script_index_0_lang.FuRcXuRY.js | 1 + research/_astro/ec.0vx5m.js | 3 + research/_astro/ec.v4551.css | 1 + research/_astro/index.D_81y6nM.css | 1 + research/_astro/logo.BVvN9BrG.svg | 15 + research/_astro/page.B1D-nYk3.js | 1 + research/_astro/print.DNXP8c50.css | 1 + research/_astro/ui-core.D-Ts1u3d.js | 2 + research/code/agents/index.html | 635 ++ research/code/claude/index.html | 907 +++ research/code/gpt/index.html | 478 ++ research/favicon.svg | 1 + research/figures/comparison/index.html | 188 + research/figures/design/index.html | 332 + research/figures/tools/index.html | 437 ++ research/idea/projects/index.html | 392 + research/idea/research/index.html | 345 + research/index.html | 172 + research/library/root-assets/index.html | 843 +++ research/logo.svg | 15 + .../pagefind/fragment/en_2d35397.pf_fragment | Bin 0 -> 2933 bytes .../pagefind/fragment/en_32ee28c.pf_fragment | Bin 0 -> 1948 bytes .../pagefind/fragment/en_43d5b5d.pf_fragment | Bin 0 -> 5389 bytes .../pagefind/fragment/en_44a61d7.pf_fragment | Bin 0 -> 2077 bytes .../pagefind/fragment/en_462e48d.pf_fragment | Bin 0 -> 3514 bytes .../pagefind/fragment/en_589d2bb.pf_fragment | Bin 0 -> 1971 bytes .../pagefind/fragment/en_761099d.pf_fragment | Bin 0 -> 2300 bytes .../pagefind/fragment/en_7ba920c.pf_fragment | Bin 0 -> 1890 bytes .../pagefind/fragment/en_8bc0ffc.pf_fragment | Bin 0 -> 9698 bytes .../pagefind/fragment/en_98b1d02.pf_fragment | Bin 0 -> 6364 bytes .../pagefind/fragment/en_a42dc2d.pf_fragment | Bin 0 -> 13845 bytes .../pagefind/fragment/en_b7643b5.pf_fragment | Bin 0 -> 1607 bytes .../pagefind/fragment/en_bd81467.pf_fragment | Bin 0 -> 10949 bytes .../pagefind/fragment/en_c59a1b7.pf_fragment | Bin 0 -> 2267 bytes .../pagefind/fragment/en_cc96801.pf_fragment | Bin 0 -> 1616 bytes .../pagefind/fragment/en_e651b38.pf_fragment | Bin 0 -> 3923 bytes .../pagefind/fragment/en_f421be3.pf_fragment | Bin 0 -> 3563 bytes .../pagefind/fragment/en_f889715.pf_fragment | Bin 0 -> 7363 bytes research/pagefind/index/en_91f4993.pf_index | Bin 0 -> 67326 bytes research/pagefind/index/en_a9d8666.pf_index | Bin 0 -> 43248 bytes research/pagefind/pagefind-entry.json | 1 + research/pagefind/pagefind-highlight.js | 1064 +++ research/pagefind/pagefind-modular-ui.css | 214 + research/pagefind/pagefind-modular-ui.js | 8 + research/pagefind/pagefind-ui.css | 1 + research/pagefind/pagefind-ui.js | 2 + .../pagefind/pagefind.en_5a30282648.pf_meta | Bin 0 -> 255 bytes research/pagefind/pagefind.js | 6 + research/pagefind/wasm.en.pagefind | Bin 0 -> 55619 bytes research/pagefind/wasm.unknown.pagefind | Bin 0 -> 52427 bytes research/review/structured/index.html | 247 + research/review/templates/index.html | 275 + research/scripts/mermaid-init.js | 248 + research/sitemap-0.xml | 1 + research/sitemap-index.xml | 1 + research/tools/overview/index.html | 400 ++ research/tools/workflow/index.html | 630 ++ research/writing/collaboration/index.html | 229 + research/writing/methods/index.html | 207 + research/writing/prism/index.html | 256 + research/writing/rebuttal/index.html | 158 + 99 files changed, 21892 insertions(+), 2 deletions(-) create mode 100644 external/ai-research-ebook/.vscode/extensions.json create mode 100644 external/ai-research-ebook/.vscode/launch.json create mode 100644 external/ai-research-ebook/README.md create mode 100644 external/ai-research-ebook/astro.config.mjs create mode 100644 external/ai-research-ebook/package-lock.json create mode 100644 external/ai-research-ebook/package.json create mode 100644 external/ai-research-ebook/public/favicon.svg create mode 100644 external/ai-research-ebook/public/logo.svg create mode 100644 external/ai-research-ebook/public/scripts/mermaid-init.js create mode 100644 external/ai-research-ebook/src/assets/houston.webp create mode 100644 external/ai-research-ebook/src/assets/logo.svg create mode 100644 external/ai-research-ebook/src/content.config.ts create mode 100644 external/ai-research-ebook/src/content/docs/code/agents.mdx create mode 100644 external/ai-research-ebook/src/content/docs/code/claude.mdx create mode 100644 external/ai-research-ebook/src/content/docs/code/gpt.mdx create mode 100644 external/ai-research-ebook/src/content/docs/figures/comparison.mdx create mode 100644 external/ai-research-ebook/src/content/docs/figures/design.mdx create mode 100644 external/ai-research-ebook/src/content/docs/figures/tools.mdx create mode 100644 external/ai-research-ebook/src/content/docs/idea/projects.mdx create mode 100644 external/ai-research-ebook/src/content/docs/idea/research.mdx create mode 100644 external/ai-research-ebook/src/content/docs/index.mdx create mode 100644 external/ai-research-ebook/src/content/docs/library/root-assets.mdx create mode 100644 external/ai-research-ebook/src/content/docs/review/structured.mdx create mode 100644 external/ai-research-ebook/src/content/docs/review/templates.mdx create mode 100644 external/ai-research-ebook/src/content/docs/tools/overview.mdx create mode 100644 external/ai-research-ebook/src/content/docs/tools/workflow.mdx create mode 100644 external/ai-research-ebook/src/content/docs/writing/collaboration.mdx create mode 100644 external/ai-research-ebook/src/content/docs/writing/methods.mdx create mode 100644 external/ai-research-ebook/src/content/docs/writing/prism.mdx create mode 100644 external/ai-research-ebook/src/content/docs/writing/rebuttal.mdx create mode 100644 external/ai-research-ebook/src/styles/custom.css create mode 100644 external/ai-research-ebook/tsconfig.json create mode 100644 research/404.html create mode 100644 research/_astro/MobileTableOfContents.astro_astro_type_script_index_0_lang.hwBsy0Mo.js create mode 100644 research/_astro/Search.astro_astro_type_script_index_0_lang.Cz5g7KHI.js create mode 100644 research/_astro/TableOfContents.astro_astro_type_script_index_0_lang.FuRcXuRY.js create mode 100644 research/_astro/ec.0vx5m.js create mode 100644 research/_astro/ec.v4551.css create mode 100644 research/_astro/index.D_81y6nM.css create mode 100644 research/_astro/logo.BVvN9BrG.svg create mode 100644 research/_astro/page.B1D-nYk3.js create mode 100644 research/_astro/print.DNXP8c50.css create mode 100644 research/_astro/ui-core.D-Ts1u3d.js create mode 100644 research/code/agents/index.html create mode 100644 research/code/claude/index.html create mode 100644 research/code/gpt/index.html create mode 100644 research/favicon.svg create mode 100644 research/figures/comparison/index.html create mode 100644 research/figures/design/index.html create mode 100644 research/figures/tools/index.html create mode 100644 research/idea/projects/index.html create mode 100644 research/idea/research/index.html create mode 100644 research/index.html create mode 100644 research/library/root-assets/index.html create mode 100644 research/logo.svg create mode 100644 research/pagefind/fragment/en_2d35397.pf_fragment create mode 100644 research/pagefind/fragment/en_32ee28c.pf_fragment create mode 100644 research/pagefind/fragment/en_43d5b5d.pf_fragment create mode 100644 research/pagefind/fragment/en_44a61d7.pf_fragment create mode 100644 research/pagefind/fragment/en_462e48d.pf_fragment create mode 100644 research/pagefind/fragment/en_589d2bb.pf_fragment create mode 100644 research/pagefind/fragment/en_761099d.pf_fragment create mode 100644 research/pagefind/fragment/en_7ba920c.pf_fragment create mode 100644 research/pagefind/fragment/en_8bc0ffc.pf_fragment create mode 100644 research/pagefind/fragment/en_98b1d02.pf_fragment create mode 100644 research/pagefind/fragment/en_a42dc2d.pf_fragment create mode 100644 research/pagefind/fragment/en_b7643b5.pf_fragment create mode 100644 research/pagefind/fragment/en_bd81467.pf_fragment create mode 100644 research/pagefind/fragment/en_c59a1b7.pf_fragment create mode 100644 research/pagefind/fragment/en_cc96801.pf_fragment create mode 100644 research/pagefind/fragment/en_e651b38.pf_fragment create mode 100644 research/pagefind/fragment/en_f421be3.pf_fragment create mode 100644 research/pagefind/fragment/en_f889715.pf_fragment create mode 100644 research/pagefind/index/en_91f4993.pf_index create mode 100644 research/pagefind/index/en_a9d8666.pf_index create mode 100644 research/pagefind/pagefind-entry.json create mode 100644 research/pagefind/pagefind-highlight.js create mode 100644 research/pagefind/pagefind-modular-ui.css create mode 100644 research/pagefind/pagefind-modular-ui.js create mode 100644 research/pagefind/pagefind-ui.css create mode 100644 research/pagefind/pagefind-ui.js create mode 100644 research/pagefind/pagefind.en_5a30282648.pf_meta create mode 100644 research/pagefind/pagefind.js create mode 100644 research/pagefind/wasm.en.pagefind create mode 100644 research/pagefind/wasm.unknown.pagefind create mode 100644 research/review/structured/index.html create mode 100644 research/review/templates/index.html create mode 100644 research/scripts/mermaid-init.js create mode 100644 research/sitemap-0.xml create mode 100644 research/sitemap-index.xml create mode 100644 research/tools/overview/index.html create mode 100644 research/tools/workflow/index.html create mode 100644 research/writing/collaboration/index.html create mode 100644 research/writing/methods/index.html create mode 100644 research/writing/prism/index.html create mode 100644 research/writing/rebuttal/index.html diff --git a/.github/workflows/deploy-pages.yml b/.github/workflows/deploy-pages.yml index 5a9bb43..8147b40 100644 --- a/.github/workflows/deploy-pages.yml +++ b/.github/workflows/deploy-pages.yml @@ -6,7 +6,7 @@ on: workflow_dispatch: permissions: - contents: read + contents: write pages: write id-token: write @@ -19,6 +19,42 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: '20' + cache: 'npm' + cache-dependency-path: external/ai-research-ebook/package-lock.json + + - name: Install dependencies for research ebook + working-directory: external/ai-research-ebook + run: npm ci + + - name: Build research ebook with custom base path + working-directory: external/ai-research-ebook + env: + SITE_URL: https://adongwanai.github.io + BASE_PATH: /AgentGuide/research + GITHUB_USERNAME: adongwanai + GITHUB_REPO: AgentGuide + GITHUB_REPOSITORY_URL: https://github.com/adongwanai/AgentGuide + run: npm run build + + - name: Copy to research directory + run: | + rm -rf research + mkdir -p research + cp -r external/ai-research-ebook/dist/* research/ + + - name: Commit research directory if changed + run: | + git config user.name "github-actions[bot]" + git config user.email "github-actions[bot]@users.noreply.github.com" + git add research/ + git diff --quiet && git diff --staged --quiet || git commit -m "Auto-update research ebook" + git push || echo "No changes to push" + - uses: actions/upload-pages-artifact@v3 with: path: . @@ -31,4 +67,4 @@ jobs: needs: build steps: - id: deployment - uses: actions/deploy-pages@v4 \ No newline at end of file + uses: actions/deploy-pages@v4 diff --git a/.gitignore b/.gitignore index 4e3ffbc..22c0dc9 100644 --- a/.gitignore +++ b/.gitignore @@ -12,3 +12,8 @@ LICENSE CHANGELOG.md READY_TO_LAUNCH.md +# ai-research-ebook 构建产物和依赖 +external/ai-research-ebook/dist/ +external/ai-research-ebook/node_modules/ +external/ai-research-ebook/.astro/ + diff --git a/external/ai-research-ebook/.vscode/extensions.json b/external/ai-research-ebook/.vscode/extensions.json new file mode 100644 index 0000000..22a1505 --- /dev/null +++ b/external/ai-research-ebook/.vscode/extensions.json @@ -0,0 +1,4 @@ +{ + "recommendations": ["astro-build.astro-vscode"], + "unwantedRecommendations": [] +} diff --git a/external/ai-research-ebook/.vscode/launch.json b/external/ai-research-ebook/.vscode/launch.json new file mode 100644 index 0000000..d642209 --- /dev/null +++ b/external/ai-research-ebook/.vscode/launch.json @@ -0,0 +1,11 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "command": "./node_modules/.bin/astro dev", + "name": "Development server", + "request": "launch", + "type": "node-terminal" + } + ] +} diff --git a/external/ai-research-ebook/README.md b/external/ai-research-ebook/README.md new file mode 100644 index 0000000..d5071be --- /dev/null +++ b/external/ai-research-ebook/README.md @@ -0,0 +1,92 @@ +# Vibe Research - AI 科研指南 + +> 从 Idea 到论文发表的完整 AI 科研工作流指南 + +[![Built with Starlight](https://astro.badg.es/v2/built-with-starlight/tiny.svg)](https://starlight.astro.build) +[![Deploy to GitHub Pages](https://github.com/yiweinanzi/ai-research-ebook/workflows/Deploy%20to%20GitHub%20Pages/badge.svg)](https://github.com/yiweinanzi/ai-research-ebook/actions) + +## 简介 + +本书是一份面向 AI 研究者的实用指南,使用 **Astro + Starlight** 构建,涵盖了从 idea 生成到论文发表的完整工作流程。 + +## 在线阅读 + +📖 **默认地址:`https://yiweinanzi.github.io/ai-research-ebook`** + +你也可以通过环境变量覆盖站点地址(无需改代码): + +```bash +GITHUB_USERNAME=<你的用户名> npm run build +``` + +## 本地开发 + +```bash +# 安装依赖 +npm install + +# 启动开发服务器 +npm run dev + +# 构建生产版本 +npm run build + +# 预览构建结果 +npm run preview +``` + +## 部署前配置 + +`astro.config.mjs` 已支持环境变量配置: + +- `GITHUB_USERNAME`:GitHub 用户名(默认 `yiweinanzi`) +- `GITHUB_REPO`:仓库名(默认 `ai-research-ebook`) +- `SITE_URL`:站点域名(默认 `https://.github.io`) +- `BASE_PATH`:子路径(默认 `/`) +- `GITHUB_REPOSITORY_URL`:仓库完整 URL + +示例: + +```bash +GITHUB_USERNAME=<你的用户名> GITHUB_REPO=ai-research-ebook npm run build +``` + +## 内容大纲 + +- **1. Idea 生成**: 系统化的文献调研方法,使用多模型交叉验证 +- **2. 代码实现**: Claude Code、GPT-5.2、多Agent框架的最佳实践 +- **3. 论文图表**: 自动化绘图工具推荐,专业图表设计规范 +- **4. 论文写作**: 论证链构建方法,多模型协作写作 +- **5. 审稿与 Rebuttal**: 结构化审稿流水线,Rebuttal 写作策略 +- **6. 工具生态**: Elicit、Zotero-MCP 等最新工具,构建完整科研工具链 + +## 技术栈 + +- [Astro](https://astro.build) - 现代静态站点生成器 +- [Starlight](https://starlight.astro.build) - Astro 的文档主题 +- [GitHub Pages](https://pages.github.com) - 免费静态托管 +- [GitHub Actions](https://github.com/features/actions) - 自动部署 + +## 项目结构 + +``` +. +├── public/ +│ └── logo.svg +├── src/ +│ ├── content/ +│ │ └── docs/ # Markdown 内容文件 +│ ├── styles/ +│ │ └── custom.css # 自定义样式 +│ └── content.config.ts +├── astro.config.mjs +└── package.json +``` + +## 许可证 + +MIT License + +--- + +最后更新: 2026年2月9日 diff --git a/external/ai-research-ebook/astro.config.mjs b/external/ai-research-ebook/astro.config.mjs new file mode 100644 index 0000000..74bf0ec --- /dev/null +++ b/external/ai-research-ebook/astro.config.mjs @@ -0,0 +1,106 @@ +// @ts-check +import { defineConfig } from 'astro/config'; +import starlight from '@astrojs/starlight'; + +const repoName = process.env.GITHUB_REPO ?? 'ai-research-ebook'; +const githubUsername = process.env.GITHUB_USERNAME ?? 'yiweinanzi'; +const siteUrl = process.env.SITE_URL ?? `https://${githubUsername}.github.io`; +const basePath = process.env.BASE_PATH ?? `/${repoName}`; +const normalizedBasePath = basePath === '/' ? '' : basePath; +const mermaidScriptVersion = process.env.MERMAID_SCRIPT_VERSION ?? '20260209e'; +const repositoryUrl = + process.env.GITHUB_REPOSITORY_URL ?? `https://github.com/${githubUsername}/${repoName}`; + +// https://astro.build/config +export default defineConfig({ + site: siteUrl, + base: basePath, + integrations: [ + starlight({ + title: 'Vibe Research - AI 科研指南', + description: 'AI研究电子书 - 从idea到论文的完整指南', + head: [ + { + tag: 'script', + content: + "(() => { try { const key = 'starlight-theme'; localStorage.setItem(key, 'light'); document.documentElement.dataset.theme = 'light'; } catch { document.documentElement.dataset.theme = 'light'; } })();", + }, + { + tag: 'script', + attrs: { + type: 'module', + src: `${normalizedBasePath}/scripts/mermaid-init.js?v=${mermaidScriptVersion}`, + }, + }, + ], + logo: { + src: './src/assets/logo.svg', + alt: 'Vibe Research', + }, + social: [{ icon: 'github', label: 'GitHub', href: repositoryUrl }], + sidebar: [ + { + label: '首页', + items: [{ label: '关于本书', slug: 'index' }], + }, + { + label: '1. Idea 生成', + items: [ + { label: '1.1 调研方法', slug: 'idea/research' }, + { label: '1.2 调研项目', slug: 'idea/projects' }, + ], + }, + { + label: '2. 代码实现', + items: [ + { label: '2.1 Claude Code', slug: 'code/claude' }, + { label: '2.2 GPT-5.2 系列', slug: 'code/gpt' }, + { label: '2.3 多Agent框架', slug: 'code/agents' }, + ], + }, + { + label: '3. 论文图表', + items: [ + { label: '3.1 自动化绘图工具', slug: 'figures/tools' }, + { label: '3.2 专业绘图对比', slug: 'figures/comparison' }, + { label: '3.3 图表设计规范', slug: 'figures/design' }, + ], + }, + { + label: '4. 论文写作', + items: [ + { label: '4.1 写作方法', slug: 'writing/methods' }, + { label: '4.2 Prism 编辑器', slug: 'writing/prism' }, + { label: '4.3 多模型协作', slug: 'writing/collaboration' }, + ], + }, + { + label: '5. 审稿与Rebuttal', + items: [ + { label: '5.1 结构化审稿', slug: 'review/structured' }, + { label: '5.2 会议审稿模板', slug: 'review/templates' }, + { label: '5.3 Rebuttal策略', slug: 'writing/rebuttal' }, + ], + }, + { + label: '6. 工具生态', + items: [ + { label: '6.1 工具总览', slug: 'tools/overview' }, + { label: '6.2 完整工作流', slug: 'tools/workflow' }, + ], + }, + { + label: '7. 资料库', + items: [ + { label: '7.1 科研圣经', slug: 'library/root-assets' }, + ], + }, + ], + customCss: ['./src/styles/custom.css'], + }), + ], + output: 'static', + build: { + format: 'directory', + }, +}); diff --git a/external/ai-research-ebook/package-lock.json b/external/ai-research-ebook/package-lock.json new file mode 100644 index 0000000..eef5036 --- /dev/null +++ b/external/ai-research-ebook/package-lock.json @@ -0,0 +1,6400 @@ +{ + "name": "ai-research-ebook", + "version": "0.0.1", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "ai-research-ebook", + "version": "0.0.1", + "dependencies": { + "@astrojs/starlight": "^0.37.6", + "astro": "^5.6.1", + "sharp": "^0.34.2" + } + }, + "node_modules/@astrojs/compiler": { + "version": "2.13.1", + "resolved": "https://registry.npmmirror.com/@astrojs/compiler/-/compiler-2.13.1.tgz", + "integrity": "sha512-f3FN83d2G/v32ipNClRKgYv30onQlMZX1vCeZMjPsMMPl1mDpmbl0+N5BYo4S/ofzqJyS5hvwacEo0CCVDn/Qg==", + "license": "MIT" + }, + "node_modules/@astrojs/internal-helpers": { + "version": "0.7.5", + "resolved": "https://registry.npmmirror.com/@astrojs/internal-helpers/-/internal-helpers-0.7.5.tgz", + "integrity": "sha512-vreGnYSSKhAjFJCWAwe/CNhONvoc5lokxtRoZims+0wa3KbHBdPHSSthJsKxPd8d/aic6lWKpRTYGY/hsgK6EA==", + "license": "MIT" + }, + "node_modules/@astrojs/markdown-remark": { + "version": "6.3.10", + "resolved": "https://registry.npmmirror.com/@astrojs/markdown-remark/-/markdown-remark-6.3.10.tgz", + "integrity": "sha512-kk4HeYR6AcnzC4QV8iSlOfh+N8TZ3MEStxPyenyCtemqn8IpEATBFMTJcfrNW32dgpt6MY3oCkMM/Tv3/I4G3A==", + "license": "MIT", + "dependencies": { + "@astrojs/internal-helpers": "0.7.5", + "@astrojs/prism": "3.3.0", + "github-slugger": "^2.0.0", + "hast-util-from-html": "^2.0.3", + "hast-util-to-text": "^4.0.2", + "import-meta-resolve": "^4.2.0", + "js-yaml": "^4.1.1", + "mdast-util-definitions": "^6.0.0", + "rehype-raw": "^7.0.0", + "rehype-stringify": "^10.0.1", + "remark-gfm": "^4.0.1", + "remark-parse": "^11.0.0", + "remark-rehype": "^11.1.2", + "remark-smartypants": "^3.0.2", + "shiki": "^3.19.0", + "smol-toml": "^1.5.2", + "unified": "^11.0.5", + "unist-util-remove-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "unist-util-visit-parents": "^6.0.2", + "vfile": "^6.0.3" + } + }, + "node_modules/@astrojs/mdx": { + "version": "4.3.13", + "resolved": "https://registry.npmmirror.com/@astrojs/mdx/-/mdx-4.3.13.tgz", + "integrity": "sha512-IHDHVKz0JfKBy3//52JSiyWv089b7GVSChIXLrlUOoTLWowG3wr2/8hkaEgEyd/vysvNQvGk+QhysXpJW5ve6Q==", + "license": "MIT", + "dependencies": { + "@astrojs/markdown-remark": "6.3.10", + "@mdx-js/mdx": "^3.1.1", + "acorn": "^8.15.0", + "es-module-lexer": "^1.7.0", + "estree-util-visit": "^2.0.0", + "hast-util-to-html": "^9.0.5", + "piccolore": "^0.1.3", + "rehype-raw": "^7.0.0", + "remark-gfm": "^4.0.1", + "remark-smartypants": "^3.0.2", + "source-map": "^0.7.6", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.3" + }, + "engines": { + "node": "18.20.8 || ^20.3.0 || >=22.0.0" + }, + "peerDependencies": { + "astro": "^5.0.0" + } + }, + "node_modules/@astrojs/prism": { + "version": "3.3.0", + "resolved": "https://registry.npmmirror.com/@astrojs/prism/-/prism-3.3.0.tgz", + "integrity": "sha512-q8VwfU/fDZNoDOf+r7jUnMC2//H2l0TuQ6FkGJL8vD8nw/q5KiL3DS1KKBI3QhI9UQhpJ5dc7AtqfbXWuOgLCQ==", + "license": "MIT", + "dependencies": { + "prismjs": "^1.30.0" + }, + "engines": { + "node": "18.20.8 || ^20.3.0 || >=22.0.0" + } + }, + "node_modules/@astrojs/sitemap": { + "version": "3.7.0", + "resolved": "https://registry.npmmirror.com/@astrojs/sitemap/-/sitemap-3.7.0.tgz", + "integrity": "sha512-+qxjUrz6Jcgh+D5VE1gKUJTA3pSthuPHe6Ao5JCxok794Lewx8hBFaWHtOnN0ntb2lfOf7gvOi9TefUswQ/ZVA==", + "license": "MIT", + "dependencies": { + "sitemap": "^8.0.2", + "stream-replace-string": "^2.0.0", + "zod": "^3.25.76" + } + }, + "node_modules/@astrojs/starlight": { + "version": "0.37.6", + "resolved": "https://registry.npmmirror.com/@astrojs/starlight/-/starlight-0.37.6.tgz", + "integrity": "sha512-wQrKwH431q+8FsLBnNQeG+R36TMtEGxTQ2AuiVpcx9APcazvL3n7wVW8mMmYyxX0POjTnxlcWPkdMGR3Yj1L+w==", + "license": "MIT", + "dependencies": { + "@astrojs/markdown-remark": "^6.3.1", + "@astrojs/mdx": "^4.2.3", + "@astrojs/sitemap": "^3.3.0", + "@pagefind/default-ui": "^1.3.0", + "@types/hast": "^3.0.4", + "@types/js-yaml": "^4.0.9", + "@types/mdast": "^4.0.4", + "astro-expressive-code": "^0.41.1", + "bcp-47": "^2.1.0", + "hast-util-from-html": "^2.0.1", + "hast-util-select": "^6.0.2", + "hast-util-to-string": "^3.0.0", + "hastscript": "^9.0.0", + "i18next": "^23.11.5", + "js-yaml": "^4.1.0", + "klona": "^2.0.6", + "magic-string": "^0.30.17", + "mdast-util-directive": "^3.0.0", + "mdast-util-to-markdown": "^2.1.0", + "mdast-util-to-string": "^4.0.0", + "pagefind": "^1.3.0", + "rehype": "^13.0.1", + "rehype-format": "^5.0.0", + "remark-directive": "^3.0.0", + "ultrahtml": "^1.6.0", + "unified": "^11.0.5", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.2" + }, + "peerDependencies": { + "astro": "^5.5.0" + } + }, + "node_modules/@astrojs/telemetry": { + "version": "3.3.0", + "resolved": "https://registry.npmmirror.com/@astrojs/telemetry/-/telemetry-3.3.0.tgz", + "integrity": "sha512-UFBgfeldP06qu6khs/yY+q1cDAaArM2/7AEIqQ9Cuvf7B1hNLq0xDrZkct+QoIGyjq56y8IaE2I3CTvG99mlhQ==", + "license": "MIT", + "dependencies": { + "ci-info": "^4.2.0", + "debug": "^4.4.0", + "dlv": "^1.1.3", + "dset": "^3.1.4", + "is-docker": "^3.0.0", + "is-wsl": "^3.1.0", + "which-pm-runs": "^1.1.0" + }, + "engines": { + "node": "18.20.8 || ^20.3.0 || >=22.0.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.0", + "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.29.0.tgz", + "integrity": "sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.28.6", + "resolved": "https://registry.npmmirror.com/@babel/runtime/-/runtime-7.28.6.tgz", + "integrity": "sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.0", + "resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@capsizecss/unpack": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/@capsizecss/unpack/-/unpack-4.0.0.tgz", + "integrity": "sha512-VERIM64vtTP1C4mxQ5thVT9fK0apjPFobqybMtA1UdUujWka24ERHbRHFGmpbbhp73MhV+KSsHQH9C6uOTdEQA==", + "license": "MIT", + "dependencies": { + "fontkitten": "^1.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@ctrl/tinycolor": { + "version": "4.2.0", + "resolved": "https://registry.npmmirror.com/@ctrl/tinycolor/-/tinycolor-4.2.0.tgz", + "integrity": "sha512-kzyuwOAQnXJNLS9PSyrk0CWk35nWJW/zl/6KvnTBMFK65gm7U1/Z5BqjxeapjZCIhQcM/DsrEmcbRwDyXyXK4A==", + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.8.1", + "resolved": "https://registry.npmmirror.com/@emnapi/runtime/-/runtime-1.8.1.tgz", + "integrity": "sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", + "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.25.12.tgz", + "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", + "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/android-x64/-/android-x64-0.25.12.tgz", + "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", + "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", + "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", + "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", + "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", + "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", + "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", + "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", + "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", + "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", + "cpu": [ + "mips64el" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", + "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", + "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", + "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", + "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", + "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", + "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", + "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", + "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", + "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", + "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", + "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", + "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", + "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@expressive-code/core": { + "version": "0.41.6", + "resolved": "https://registry.npmmirror.com/@expressive-code/core/-/core-0.41.6.tgz", + "integrity": "sha512-FvJQP+hG0jWi/FLBSmvHInDqWR7jNANp9PUDjdMqSshHb0y7sxx3vHuoOr6SgXjWw+MGLqorZyPQ0aAlHEok6g==", + "license": "MIT", + "dependencies": { + "@ctrl/tinycolor": "^4.0.4", + "hast-util-select": "^6.0.2", + "hast-util-to-html": "^9.0.1", + "hast-util-to-text": "^4.0.1", + "hastscript": "^9.0.0", + "postcss": "^8.4.38", + "postcss-nested": "^6.0.1", + "unist-util-visit": "^5.0.0", + "unist-util-visit-parents": "^6.0.1" + } + }, + "node_modules/@expressive-code/plugin-frames": { + "version": "0.41.6", + "resolved": "https://registry.npmmirror.com/@expressive-code/plugin-frames/-/plugin-frames-0.41.6.tgz", + "integrity": "sha512-d+hkSYXIQot6fmYnOmWAM+7TNWRv/dhfjMsNq+mIZz8Tb4mPHOcgcfZeEM5dV9TDL0ioQNvtcqQNuzA1sRPjxg==", + "license": "MIT", + "dependencies": { + "@expressive-code/core": "^0.41.6" + } + }, + "node_modules/@expressive-code/plugin-shiki": { + "version": "0.41.6", + "resolved": "https://registry.npmmirror.com/@expressive-code/plugin-shiki/-/plugin-shiki-0.41.6.tgz", + "integrity": "sha512-Y6zmKBmsIUtWTzdefqlzm/h9Zz0Rc4gNdt2GTIH7fhHH2I9+lDYCa27BDwuBhjqcos6uK81Aca9dLUC4wzN+ng==", + "license": "MIT", + "dependencies": { + "@expressive-code/core": "^0.41.6", + "shiki": "^3.2.2" + } + }, + "node_modules/@expressive-code/plugin-text-markers": { + "version": "0.41.6", + "resolved": "https://registry.npmmirror.com/@expressive-code/plugin-text-markers/-/plugin-text-markers-0.41.6.tgz", + "integrity": "sha512-PBFa1wGyYzRExMDzBmAWC6/kdfG1oLn4pLpBeTfIRrALPjcGA/59HP3e7q9J0Smk4pC7U+lWkA2LHR8FYV8U7Q==", + "license": "MIT", + "dependencies": { + "@expressive-code/core": "^0.41.6" + } + }, + "node_modules/@img/colour": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/@img/colour/-/colour-1.0.0.tgz", + "integrity": "sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@img/sharp-darwin-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmmirror.com/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.5.tgz", + "integrity": "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-darwin-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmmirror.com/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.5.tgz", + "integrity": "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-libvips-darwin-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmmirror.com/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.4.tgz", + "integrity": "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-darwin-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmmirror.com/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.4.tgz", + "integrity": "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm": { + "version": "1.2.4", + "resolved": "https://registry.npmmirror.com/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.4.tgz", + "integrity": "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==", + "cpu": [ + "arm" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmmirror.com/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.4.tgz", + "integrity": "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-ppc64": { + "version": "1.2.4", + "resolved": "https://registry.npmmirror.com/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.4.tgz", + "integrity": "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==", + "cpu": [ + "ppc64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-riscv64": { + "version": "1.2.4", + "resolved": "https://registry.npmmirror.com/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.2.4.tgz", + "integrity": "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==", + "cpu": [ + "riscv64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-s390x": { + "version": "1.2.4", + "resolved": "https://registry.npmmirror.com/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.4.tgz", + "integrity": "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==", + "cpu": [ + "s390x" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmmirror.com/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.4.tgz", + "integrity": "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmmirror.com/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.4.tgz", + "integrity": "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmmirror.com/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.4.tgz", + "integrity": "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-linux-arm": { + "version": "0.34.5", + "resolved": "https://registry.npmmirror.com/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.5.tgz", + "integrity": "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==", + "cpu": [ + "arm" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmmirror.com/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.5.tgz", + "integrity": "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-ppc64": { + "version": "0.34.5", + "resolved": "https://registry.npmmirror.com/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.5.tgz", + "integrity": "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==", + "cpu": [ + "ppc64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-ppc64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-riscv64": { + "version": "0.34.5", + "resolved": "https://registry.npmmirror.com/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.34.5.tgz", + "integrity": "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==", + "cpu": [ + "riscv64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-riscv64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-s390x": { + "version": "0.34.5", + "resolved": "https://registry.npmmirror.com/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.5.tgz", + "integrity": "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==", + "cpu": [ + "s390x" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-s390x": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmmirror.com/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz", + "integrity": "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-linuxmusl-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmmirror.com/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.5.tgz", + "integrity": "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-linuxmusl-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmmirror.com/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.5.tgz", + "integrity": "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-wasm32": { + "version": "0.34.5", + "resolved": "https://registry.npmmirror.com/@img/sharp-wasm32/-/sharp-wasm32-0.34.5.tgz", + "integrity": "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==", + "cpu": [ + "wasm32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", + "optional": true, + "dependencies": { + "@emnapi/runtime": "^1.7.0" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmmirror.com/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.5.tgz", + "integrity": "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-ia32": { + "version": "0.34.5", + "resolved": "https://registry.npmmirror.com/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.5.tgz", + "integrity": "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==", + "cpu": [ + "ia32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmmirror.com/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.5.tgz", + "integrity": "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "license": "MIT" + }, + "node_modules/@mdx-js/mdx": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/@mdx-js/mdx/-/mdx-3.1.1.tgz", + "integrity": "sha512-f6ZO2ifpwAQIpzGWaBQT2TXxPv6z3RBzQKpVftEWN78Vl/YweF1uwussDx8ECAXVtr3Rs89fKyG9YlzUs9DyGQ==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdx": "^2.0.0", + "acorn": "^8.0.0", + "collapse-white-space": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "estree-util-scope": "^1.0.0", + "estree-walker": "^3.0.0", + "hast-util-to-jsx-runtime": "^2.0.0", + "markdown-extensions": "^2.0.0", + "recma-build-jsx": "^1.0.0", + "recma-jsx": "^1.0.0", + "recma-stringify": "^1.0.0", + "rehype-recma": "^1.0.0", + "remark-mdx": "^3.0.0", + "remark-parse": "^11.0.0", + "remark-rehype": "^11.0.0", + "source-map": "^0.7.0", + "unified": "^11.0.0", + "unist-util-position-from-estree": "^2.0.0", + "unist-util-stringify-position": "^4.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@oslojs/encoding": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/@oslojs/encoding/-/encoding-1.1.0.tgz", + "integrity": "sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ==", + "license": "MIT" + }, + "node_modules/@pagefind/darwin-arm64": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/@pagefind/darwin-arm64/-/darwin-arm64-1.4.0.tgz", + "integrity": "sha512-2vMqkbv3lbx1Awea90gTaBsvpzgRs7MuSgKDxW0m9oV1GPZCZbZBJg/qL83GIUEN2BFlY46dtUZi54pwH+/pTQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@pagefind/darwin-x64": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/@pagefind/darwin-x64/-/darwin-x64-1.4.0.tgz", + "integrity": "sha512-e7JPIS6L9/cJfow+/IAqknsGqEPjJnVXGjpGm25bnq+NPdoD3c/7fAwr1OXkG4Ocjx6ZGSCijXEV4ryMcH2E3A==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@pagefind/default-ui": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/@pagefind/default-ui/-/default-ui-1.4.0.tgz", + "integrity": "sha512-wie82VWn3cnGEdIjh4YwNESyS1G6vRHwL6cNjy9CFgNnWW/PGRjsLq300xjVH5sfPFK3iK36UxvIBymtQIEiSQ==", + "license": "MIT" + }, + "node_modules/@pagefind/freebsd-x64": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/@pagefind/freebsd-x64/-/freebsd-x64-1.4.0.tgz", + "integrity": "sha512-WcJVypXSZ+9HpiqZjFXMUobfFfZZ6NzIYtkhQ9eOhZrQpeY5uQFqNWLCk7w9RkMUwBv1HAMDW3YJQl/8OqsV0Q==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@pagefind/linux-arm64": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/@pagefind/linux-arm64/-/linux-arm64-1.4.0.tgz", + "integrity": "sha512-PIt8dkqt4W06KGmQjONw7EZbhDF+uXI7i0XtRLN1vjCUxM9vGPdtJc2mUyVPevjomrGz5M86M8bqTr6cgDp1Uw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@pagefind/linux-x64": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/@pagefind/linux-x64/-/linux-x64-1.4.0.tgz", + "integrity": "sha512-z4oddcWwQ0UHrTHR8psLnVlz6USGJ/eOlDPTDYZ4cI8TK8PgwRUPQZp9D2iJPNIPcS6Qx/E4TebjuGJOyK8Mmg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@pagefind/windows-x64": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/@pagefind/windows-x64/-/windows-x64-1.4.0.tgz", + "integrity": "sha512-NkT+YAdgS2FPCn8mIA9bQhiBs+xmniMGq1LFPDhcFn0+2yIUEiIG06t7bsZlhdjknEQRTSdT7YitP6fC5qwP0g==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/pluginutils": { + "version": "5.3.0", + "resolved": "https://registry.npmmirror.com/@rollup/pluginutils/-/pluginutils-5.3.0.tgz", + "integrity": "sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/pluginutils/node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "license": "MIT" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.57.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.57.1.tgz", + "integrity": "sha512-A6ehUVSiSaaliTxai040ZpZ2zTevHYbvu/lDoeAteHI8QnaosIzm4qwtezfRg1jOYaUmnzLX1AOD6Z+UJjtifg==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.57.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.57.1.tgz", + "integrity": "sha512-dQaAddCY9YgkFHZcFNS/606Exo8vcLHwArFZ7vxXq4rigo2bb494/xKMMwRRQW6ug7Js6yXmBZhSBRuBvCCQ3w==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.57.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.57.1.tgz", + "integrity": "sha512-crNPrwJOrRxagUYeMn/DZwqN88SDmwaJ8Cvi/TN1HnWBU7GwknckyosC2gd0IqYRsHDEnXf328o9/HC6OkPgOg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.57.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.57.1.tgz", + "integrity": "sha512-Ji8g8ChVbKrhFtig5QBV7iMaJrGtpHelkB3lsaKzadFBe58gmjfGXAOfI5FV0lYMH8wiqsxKQ1C9B0YTRXVy4w==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.57.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.57.1.tgz", + "integrity": "sha512-R+/WwhsjmwodAcz65guCGFRkMb4gKWTcIeLy60JJQbXrJ97BOXHxnkPFrP+YwFlaS0m+uWJTstrUA9o+UchFug==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.57.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.57.1.tgz", + "integrity": "sha512-IEQTCHeiTOnAUC3IDQdzRAGj3jOAYNr9kBguI7MQAAZK3caezRrg0GxAb6Hchg4lxdZEI5Oq3iov/w/hnFWY9Q==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.57.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.57.1.tgz", + "integrity": "sha512-F8sWbhZ7tyuEfsmOxwc2giKDQzN3+kuBLPwwZGyVkLlKGdV1nvnNwYD0fKQ8+XS6hp9nY7B+ZeK01EBUE7aHaw==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.57.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.57.1.tgz", + "integrity": "sha512-rGfNUfn0GIeXtBP1wL5MnzSj98+PZe/AXaGBCRmT0ts80lU5CATYGxXukeTX39XBKsxzFpEeK+Mrp9faXOlmrw==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.57.1.tgz", + "integrity": "sha512-MMtej3YHWeg/0klK2Qodf3yrNzz6CGjo2UntLvk2RSPlhzgLvYEB3frRvbEF2wRKh1Z2fDIg9KRPe1fawv7C+g==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.57.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.57.1.tgz", + "integrity": "sha512-1a/qhaaOXhqXGpMFMET9VqwZakkljWHLmZOX48R0I/YLbhdxr1m4gtG1Hq7++VhVUmf+L3sTAf9op4JlhQ5u1Q==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.57.1.tgz", + "integrity": "sha512-QWO6RQTZ/cqYtJMtxhkRkidoNGXc7ERPbZN7dVW5SdURuLeVU7lwKMpo18XdcmpWYd0qsP1bwKPf7DNSUinhvA==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.57.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.57.1.tgz", + "integrity": "sha512-xpObYIf+8gprgWaPP32xiN5RVTi/s5FCR+XMXSKmhfoJjrpRAjCuuqQXyxUa/eJTdAE6eJ+KDKaoEqjZQxh3Gw==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.57.1.tgz", + "integrity": "sha512-4BrCgrpZo4hvzMDKRqEaW1zeecScDCR+2nZ86ATLhAoJ5FQ+lbHVD3ttKe74/c7tNT9c6F2viwB3ufwp01Oh2w==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.57.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.57.1.tgz", + "integrity": "sha512-NOlUuzesGauESAyEYFSe3QTUguL+lvrN1HtwEEsU2rOwdUDeTMJdO5dUYl/2hKf9jWydJrO9OL/XSSf65R5+Xw==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.57.1.tgz", + "integrity": "sha512-ptA88htVp0AwUUqhVghwDIKlvJMD/fmL/wrQj99PRHFRAG6Z5nbWoWG4o81Nt9FT+IuqUQi+L31ZKAFeJ5Is+A==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.57.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.57.1.tgz", + "integrity": "sha512-S51t7aMMTNdmAMPpBg7OOsTdn4tySRQvklmL3RpDRyknk87+Sp3xaumlatU+ppQ+5raY7sSTcC2beGgvhENfuw==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.57.1.tgz", + "integrity": "sha512-Bl00OFnVFkL82FHbEqy3k5CUCKH6OEJL54KCyx2oqsmZnFTR8IoNqBF+mjQVcRCT5sB6yOvK8A37LNm/kPJiZg==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.57.1.tgz", + "integrity": "sha512-ABca4ceT4N+Tv/GtotnWAeXZUZuM/9AQyCyKYyKnpk4yoA7QIAuBt6Hkgpw8kActYlew2mvckXkvx0FfoInnLg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.57.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.57.1.tgz", + "integrity": "sha512-HFps0JeGtuOR2convgRRkHCekD7j+gdAuXM+/i6kGzQtFhlCtQkpwtNzkNj6QhCDp7DRJ7+qC/1Vg2jt5iSOFw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.57.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.57.1.tgz", + "integrity": "sha512-H+hXEv9gdVQuDTgnqD+SQffoWoc0Of59AStSzTEj/feWTBAnSfSD3+Dql1ZruJQxmykT/JVY0dE8Ka7z0DH1hw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.57.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.57.1.tgz", + "integrity": "sha512-4wYoDpNg6o/oPximyc/NG+mYUejZrCU2q+2w6YZqrAs2UcNUChIZXjtafAiiZSUc7On8v5NyNj34Kzj/Ltk6dQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.57.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.57.1.tgz", + "integrity": "sha512-O54mtsV/6LW3P8qdTcamQmuC990HDfR71lo44oZMZlXU4tzLrbvTii87Ni9opq60ds0YzuAlEr/GNwuNluZyMQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.57.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.57.1.tgz", + "integrity": "sha512-P3dLS+IerxCT/7D2q2FYcRdWRl22dNbrbBEtxdWhXrfIMPP9lQhb5h4Du04mdl5Woq05jVCDPCMF7Ub0NAjIew==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.57.1.tgz", + "integrity": "sha512-VMBH2eOOaKGtIJYleXsi2B8CPVADrh+TyNxJ4mWPnKfLB/DBUmzW+5m1xUrcwWoMfSLagIRpjUFeW5CO5hyciQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.57.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.57.1.tgz", + "integrity": "sha512-mxRFDdHIWRxg3UfIIAwCm6NzvxG0jDX/wBN6KsQFTvKFqqg9vTrWUE68qEjHt19A5wwx5X5aUi2zuZT7YR0jrA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@shikijs/core": { + "version": "3.22.0", + "resolved": "https://registry.npmmirror.com/@shikijs/core/-/core-3.22.0.tgz", + "integrity": "sha512-iAlTtSDDbJiRpvgL5ugKEATDtHdUVkqgHDm/gbD2ZS9c88mx7G1zSYjjOxp5Qa0eaW0MAQosFRmJSk354PRoQA==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "3.22.0", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4", + "hast-util-to-html": "^9.0.5" + } + }, + "node_modules/@shikijs/engine-javascript": { + "version": "3.22.0", + "resolved": "https://registry.npmmirror.com/@shikijs/engine-javascript/-/engine-javascript-3.22.0.tgz", + "integrity": "sha512-jdKhfgW9CRtj3Tor0L7+yPwdG3CgP7W+ZEqSsojrMzCjD1e0IxIbwUMDDpYlVBlC08TACg4puwFGkZfLS+56Tw==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "3.22.0", + "@shikijs/vscode-textmate": "^10.0.2", + "oniguruma-to-es": "^4.3.4" + } + }, + "node_modules/@shikijs/engine-oniguruma": { + "version": "3.22.0", + "resolved": "https://registry.npmmirror.com/@shikijs/engine-oniguruma/-/engine-oniguruma-3.22.0.tgz", + "integrity": "sha512-DyXsOG0vGtNtl7ygvabHd7Mt5EY8gCNqR9Y7Lpbbd/PbJvgWrqaKzH1JW6H6qFkuUa8aCxoiYVv8/YfFljiQxA==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "3.22.0", + "@shikijs/vscode-textmate": "^10.0.2" + } + }, + "node_modules/@shikijs/langs": { + "version": "3.22.0", + "resolved": "https://registry.npmmirror.com/@shikijs/langs/-/langs-3.22.0.tgz", + "integrity": "sha512-x/42TfhWmp6H00T6uwVrdTJGKgNdFbrEdhaDwSR5fd5zhQ1Q46bHq9EO61SCEWJR0HY7z2HNDMaBZp8JRmKiIA==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "3.22.0" + } + }, + "node_modules/@shikijs/themes": { + "version": "3.22.0", + "resolved": "https://registry.npmmirror.com/@shikijs/themes/-/themes-3.22.0.tgz", + "integrity": "sha512-o+tlOKqsr6FE4+mYJG08tfCFDS+3CG20HbldXeVoyP+cYSUxDhrFf3GPjE60U55iOkkjbpY2uC3It/eeja35/g==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "3.22.0" + } + }, + "node_modules/@shikijs/types": { + "version": "3.22.0", + "resolved": "https://registry.npmmirror.com/@shikijs/types/-/types-3.22.0.tgz", + "integrity": "sha512-491iAekgKDBFE67z70Ok5a8KBMsQ2IJwOWw3us/7ffQkIBCyOQfm/aNwVMBUriP02QshIfgHCBSIYAl3u2eWjg==", + "license": "MIT", + "dependencies": { + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4" + } + }, + "node_modules/@shikijs/vscode-textmate": { + "version": "10.0.2", + "resolved": "https://registry.npmmirror.com/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz", + "integrity": "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==", + "license": "MIT" + }, + "node_modules/@types/debug": { + "version": "4.1.12", + "resolved": "https://registry.npmmirror.com/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "license": "MIT", + "dependencies": { + "@types/ms": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmmirror.com/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "license": "MIT" + }, + "node_modules/@types/estree-jsx": { + "version": "1.0.5", + "resolved": "https://registry.npmmirror.com/@types/estree-jsx/-/estree-jsx-1.0.5.tgz", + "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==", + "license": "MIT", + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmmirror.com/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/js-yaml": { + "version": "4.0.9", + "resolved": "https://registry.npmmirror.com/@types/js-yaml/-/js-yaml-4.0.9.tgz", + "integrity": "sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==", + "license": "MIT" + }, + "node_modules/@types/mdast": { + "version": "4.0.4", + "resolved": "https://registry.npmmirror.com/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/mdx": { + "version": "2.0.13", + "resolved": "https://registry.npmmirror.com/@types/mdx/-/mdx-2.0.13.tgz", + "integrity": "sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==", + "license": "MIT" + }, + "node_modules/@types/ms": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", + "license": "MIT" + }, + "node_modules/@types/nlcst": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/@types/nlcst/-/nlcst-2.0.3.tgz", + "integrity": "sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/node": { + "version": "25.2.2", + "resolved": "https://registry.npmmirror.com/@types/node/-/node-25.2.2.tgz", + "integrity": "sha512-BkmoP5/FhRYek5izySdkOneRyXYN35I860MFAGupTdebyE66uZaR+bXLHq8k4DirE5DwQi3NuhvRU1jqTVwUrQ==", + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/@types/sax": { + "version": "1.2.7", + "resolved": "https://registry.npmmirror.com/@types/sax/-/sax-1.2.7.tgz", + "integrity": "sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmmirror.com/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "license": "MIT" + }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", + "license": "ISC" + }, + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmmirror.com/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "license": "MIT", + "peer": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmmirror.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ansi-align": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/ansi-align/-/ansi-align-3.0.1.tgz", + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", + "license": "ISC", + "dependencies": { + "string-width": "^4.1.0" + } + }, + "node_modules/ansi-align/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-align/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/ansi-align/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-align/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmmirror.com/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/anymatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmmirror.com/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "license": "MIT" + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" + }, + "node_modules/aria-query": { + "version": "5.3.2", + "resolved": "https://registry.npmmirror.com/aria-query/-/aria-query-5.3.2.tgz", + "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/array-iterate": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/array-iterate/-/array-iterate-2.0.1.tgz", + "integrity": "sha512-I1jXZMjAgCMmxT4qxXfPXa6SthSoE8h6gkSI9BGGNv8mP8G/v0blc+qFnZu6K42vTOiuME596QaLO0TP3Lk0xg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/astring": { + "version": "1.9.0", + "resolved": "https://registry.npmmirror.com/astring/-/astring-1.9.0.tgz", + "integrity": "sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==", + "license": "MIT", + "bin": { + "astring": "bin/astring" + } + }, + "node_modules/astro": { + "version": "5.17.1", + "resolved": "https://registry.npmmirror.com/astro/-/astro-5.17.1.tgz", + "integrity": "sha512-oD3tlxTaVWGq/Wfbqk6gxzVRz98xa/rYlpe+gU2jXJMSD01k6sEDL01ZlT8mVSYB/rMgnvIOfiQQ3BbLdN237A==", + "license": "MIT", + "peer": true, + "dependencies": { + "@astrojs/compiler": "^2.13.0", + "@astrojs/internal-helpers": "0.7.5", + "@astrojs/markdown-remark": "6.3.10", + "@astrojs/telemetry": "3.3.0", + "@capsizecss/unpack": "^4.0.0", + "@oslojs/encoding": "^1.1.0", + "@rollup/pluginutils": "^5.3.0", + "acorn": "^8.15.0", + "aria-query": "^5.3.2", + "axobject-query": "^4.1.0", + "boxen": "8.0.1", + "ci-info": "^4.3.1", + "clsx": "^2.1.1", + "common-ancestor-path": "^1.0.1", + "cookie": "^1.1.1", + "cssesc": "^3.0.0", + "debug": "^4.4.3", + "deterministic-object-hash": "^2.0.2", + "devalue": "^5.6.2", + "diff": "^8.0.3", + "dlv": "^1.1.3", + "dset": "^3.1.4", + "es-module-lexer": "^1.7.0", + "esbuild": "^0.25.0", + "estree-walker": "^3.0.3", + "flattie": "^1.1.1", + "fontace": "~0.4.0", + "github-slugger": "^2.0.0", + "html-escaper": "3.0.3", + "http-cache-semantics": "^4.2.0", + "import-meta-resolve": "^4.2.0", + "js-yaml": "^4.1.1", + "magic-string": "^0.30.21", + "magicast": "^0.5.1", + "mrmime": "^2.0.1", + "neotraverse": "^0.6.18", + "p-limit": "^6.2.0", + "p-queue": "^8.1.1", + "package-manager-detector": "^1.6.0", + "piccolore": "^0.1.3", + "picomatch": "^4.0.3", + "prompts": "^2.4.2", + "rehype": "^13.0.2", + "semver": "^7.7.3", + "shiki": "^3.21.0", + "smol-toml": "^1.6.0", + "svgo": "^4.0.0", + "tinyexec": "^1.0.2", + "tinyglobby": "^0.2.15", + "tsconfck": "^3.1.6", + "ultrahtml": "^1.6.0", + "unifont": "~0.7.3", + "unist-util-visit": "^5.0.0", + "unstorage": "^1.17.4", + "vfile": "^6.0.3", + "vite": "^6.4.1", + "vitefu": "^1.1.1", + "xxhash-wasm": "^1.1.0", + "yargs-parser": "^21.1.1", + "yocto-spinner": "^0.2.3", + "zod": "^3.25.76", + "zod-to-json-schema": "^3.25.1", + "zod-to-ts": "^1.2.0" + }, + "bin": { + "astro": "astro.js" + }, + "engines": { + "node": "18.20.8 || ^20.3.0 || >=22.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/astrodotbuild" + }, + "optionalDependencies": { + "sharp": "^0.34.0" + } + }, + "node_modules/astro-expressive-code": { + "version": "0.41.6", + "resolved": "https://registry.npmmirror.com/astro-expressive-code/-/astro-expressive-code-0.41.6.tgz", + "integrity": "sha512-l47tb1uhmVIebHUkw+HEPtU/av0G4O8Q34g2cbkPvC7/e9ZhANcjUUciKt9Hp6gSVDdIuXBBLwJQn2LkeGMOAw==", + "license": "MIT", + "dependencies": { + "rehype-expressive-code": "^0.41.6" + }, + "peerDependencies": { + "astro": "^4.0.0-beta || ^5.0.0-beta || ^3.3.0 || ^6.0.0-beta" + } + }, + "node_modules/axobject-query": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/axobject-query/-/axobject-query-4.1.0.tgz", + "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/bail": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/base-64": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/base-64/-/base-64-1.0.0.tgz", + "integrity": "sha512-kwDPIFCGx0NZHog36dj+tHiwP4QMzsZ3AgMViUBKI0+V5n4U0ufTCUMhnQ04diaRI8EX/QcPfql7zlhZ7j4zgg==", + "license": "MIT" + }, + "node_modules/bcp-47": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/bcp-47/-/bcp-47-2.1.0.tgz", + "integrity": "sha512-9IIS3UPrvIa1Ej+lVDdDwO7zLehjqsaByECw0bu2RRGP73jALm6FYbzI5gWbgHLvNdkvfXB5YrSbocZdOS0c0w==", + "license": "MIT", + "dependencies": { + "is-alphabetical": "^2.0.0", + "is-alphanumerical": "^2.0.0", + "is-decimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/bcp-47-match": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/bcp-47-match/-/bcp-47-match-2.0.3.tgz", + "integrity": "sha512-JtTezzbAibu8G0R9op9zb3vcWZd9JF6M0xOYGPn0fNCd7wOpRB1mU2mH9T8gaBGbAAyIIVgB2G7xG0GP98zMAQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "license": "ISC" + }, + "node_modules/boxen": { + "version": "8.0.1", + "resolved": "https://registry.npmmirror.com/boxen/-/boxen-8.0.1.tgz", + "integrity": "sha512-F3PH5k5juxom4xktynS7MoFY+NUWH5LC4CnH11YB8NPew+HLpmBLCybSAEyb2F+4pRXhuhWqFesoQd6DAyc2hw==", + "license": "MIT", + "dependencies": { + "ansi-align": "^3.0.1", + "camelcase": "^8.0.0", + "chalk": "^5.3.0", + "cli-boxes": "^3.0.0", + "string-width": "^7.2.0", + "type-fest": "^4.21.0", + "widest-line": "^5.0.0", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/camelcase": { + "version": "8.0.0", + "resolved": "https://registry.npmmirror.com/camelcase/-/camelcase-8.0.0.tgz", + "integrity": "sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA==", + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmmirror.com/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/character-entities": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-html4": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-reference-invalid": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", + "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chokidar": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/chokidar/-/chokidar-5.0.0.tgz", + "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", + "license": "MIT", + "dependencies": { + "readdirp": "^5.0.0" + }, + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/ci-info": { + "version": "4.4.0", + "resolved": "https://registry.npmmirror.com/ci-info/-/ci-info-4.4.0.tgz", + "integrity": "sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-boxes": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/cli-boxes/-/cli-boxes-3.0.0.tgz", + "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/collapse-white-space": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/collapse-white-space/-/collapse-white-space-2.1.0.tgz", + "integrity": "sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/commander": { + "version": "11.1.0", + "resolved": "https://registry.npmmirror.com/commander/-/commander-11.1.0.tgz", + "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", + "license": "MIT", + "engines": { + "node": ">=16" + } + }, + "node_modules/common-ancestor-path": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/common-ancestor-path/-/common-ancestor-path-1.0.1.tgz", + "integrity": "sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==", + "license": "ISC" + }, + "node_modules/cookie": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/cookie/-/cookie-1.1.1.tgz", + "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/cookie-es": { + "version": "1.2.2", + "resolved": "https://registry.npmmirror.com/cookie-es/-/cookie-es-1.2.2.tgz", + "integrity": "sha512-+W7VmiVINB+ywl1HGXJXmrqkOhpKrIiVZV6tQuV54ZyQC7MMuBt81Vc336GMLoHBq5hV/F9eXgt5Mnx0Rha5Fg==", + "license": "MIT" + }, + "node_modules/crossws": { + "version": "0.3.5", + "resolved": "https://registry.npmmirror.com/crossws/-/crossws-0.3.5.tgz", + "integrity": "sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA==", + "license": "MIT", + "dependencies": { + "uncrypto": "^0.1.3" + } + }, + "node_modules/css-select": { + "version": "5.2.2", + "resolved": "https://registry.npmmirror.com/css-select/-/css-select-5.2.2.tgz", + "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-selector-parser": { + "version": "3.3.0", + "resolved": "https://registry.npmmirror.com/css-selector-parser/-/css-selector-parser-3.3.0.tgz", + "integrity": "sha512-Y2asgMGFqJKF4fq4xHDSlFYIkeVfRsm69lQC1q9kbEsH5XtnINTMrweLkjYMeaUgiXBy/uvKeO/a1JHTNnmB2g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/mdevils" + }, + { + "type": "patreon", + "url": "https://patreon.com/mdevils" + } + ], + "license": "MIT" + }, + "node_modules/css-tree": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/css-tree/-/css-tree-3.1.0.tgz", + "integrity": "sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==", + "license": "MIT", + "dependencies": { + "mdn-data": "2.12.2", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/css-what": { + "version": "6.2.2", + "resolved": "https://registry.npmmirror.com/css-what/-/css-what-6.2.2.tgz", + "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/csso": { + "version": "5.0.5", + "resolved": "https://registry.npmmirror.com/csso/-/csso-5.0.5.tgz", + "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", + "license": "MIT", + "dependencies": { + "css-tree": "~2.2.0" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/css-tree": { + "version": "2.2.1", + "resolved": "https://registry.npmmirror.com/css-tree/-/css-tree-2.2.1.tgz", + "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.28", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/mdn-data": { + "version": "2.0.28", + "resolved": "https://registry.npmmirror.com/mdn-data/-/mdn-data-2.0.28.tgz", + "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==", + "license": "CC0-1.0" + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmmirror.com/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decode-named-character-reference": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/decode-named-character-reference/-/decode-named-character-reference-1.3.0.tgz", + "integrity": "sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==", + "license": "MIT", + "dependencies": { + "character-entities": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/defu": { + "version": "6.1.4", + "resolved": "https://registry.npmmirror.com/defu/-/defu-6.1.4.tgz", + "integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==", + "license": "MIT" + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/destr": { + "version": "2.0.5", + "resolved": "https://registry.npmmirror.com/destr/-/destr-2.0.5.tgz", + "integrity": "sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==", + "license": "MIT" + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/deterministic-object-hash": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/deterministic-object-hash/-/deterministic-object-hash-2.0.2.tgz", + "integrity": "sha512-KxektNH63SrbfUyDiwXqRb1rLwKt33AmMv+5Nhsw1kqZ13SJBRTgZHtGbE+hH3a1mVW1cz+4pqSWVPAtLVXTzQ==", + "license": "MIT", + "dependencies": { + "base-64": "^1.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/devalue": { + "version": "5.6.2", + "resolved": "https://registry.npmmirror.com/devalue/-/devalue-5.6.2.tgz", + "integrity": "sha512-nPRkjWzzDQlsejL1WVifk5rvcFi/y1onBRxjaFMjZeR9mFpqu2gmAZ9xUB9/IEanEP/vBtGeGganC/GO1fmufg==", + "license": "MIT" + }, + "node_modules/devlop": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "license": "MIT", + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/diff": { + "version": "8.0.3", + "resolved": "https://registry.npmmirror.com/diff/-/diff-8.0.3.tgz", + "integrity": "sha512-qejHi7bcSD4hQAZE0tNAawRK1ZtafHDmMTMkrrIGgSLl7hTnQHmKCeB45xAcbfTqK2zowkM3j3bHt/4b/ARbYQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/direction": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/direction/-/direction-2.0.1.tgz", + "integrity": "sha512-9S6m9Sukh1cZNknO1CWAr2QAWsbKLafQiyM5gZ7VgXHeuaoUwffKN4q6NC4A/Mf9iiPlOXQEKW/Mv/mh9/3YFA==", + "license": "MIT", + "bin": { + "direction": "cli.js" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmmirror.com/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "license": "MIT" + }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/dom-serializer/node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmmirror.com/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmmirror.com/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.2.2", + "resolved": "https://registry.npmmirror.com/domutils/-/domutils-3.2.2.tgz", + "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dset": { + "version": "3.1.4", + "resolved": "https://registry.npmmirror.com/dset/-/dset-3.1.4.tgz", + "integrity": "sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/emoji-regex": { + "version": "10.6.0", + "resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", + "license": "MIT" + }, + "node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/es-module-lexer": { + "version": "1.7.0", + "resolved": "https://registry.npmmirror.com/es-module-lexer/-/es-module-lexer-1.7.0.tgz", + "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", + "license": "MIT" + }, + "node_modules/esast-util-from-estree": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/esast-util-from-estree/-/esast-util-from-estree-2.0.0.tgz", + "integrity": "sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "devlop": "^1.0.0", + "estree-util-visit": "^2.0.0", + "unist-util-position-from-estree": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/esast-util-from-js": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/esast-util-from-js/-/esast-util-from-js-2.0.1.tgz", + "integrity": "sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "acorn": "^8.0.0", + "esast-util-from-estree": "^2.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/esbuild": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/esbuild/-/esbuild-0.25.12.tgz", + "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.12", + "@esbuild/android-arm": "0.25.12", + "@esbuild/android-arm64": "0.25.12", + "@esbuild/android-x64": "0.25.12", + "@esbuild/darwin-arm64": "0.25.12", + "@esbuild/darwin-x64": "0.25.12", + "@esbuild/freebsd-arm64": "0.25.12", + "@esbuild/freebsd-x64": "0.25.12", + "@esbuild/linux-arm": "0.25.12", + "@esbuild/linux-arm64": "0.25.12", + "@esbuild/linux-ia32": "0.25.12", + "@esbuild/linux-loong64": "0.25.12", + "@esbuild/linux-mips64el": "0.25.12", + "@esbuild/linux-ppc64": "0.25.12", + "@esbuild/linux-riscv64": "0.25.12", + "@esbuild/linux-s390x": "0.25.12", + "@esbuild/linux-x64": "0.25.12", + "@esbuild/netbsd-arm64": "0.25.12", + "@esbuild/netbsd-x64": "0.25.12", + "@esbuild/openbsd-arm64": "0.25.12", + "@esbuild/openbsd-x64": "0.25.12", + "@esbuild/openharmony-arm64": "0.25.12", + "@esbuild/sunos-x64": "0.25.12", + "@esbuild/win32-arm64": "0.25.12", + "@esbuild/win32-ia32": "0.25.12", + "@esbuild/win32-x64": "0.25.12" + } + }, + "node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/estree-util-attach-comments": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/estree-util-attach-comments/-/estree-util-attach-comments-3.0.0.tgz", + "integrity": "sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-build-jsx": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/estree-util-build-jsx/-/estree-util-build-jsx-3.0.1.tgz", + "integrity": "sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "estree-walker": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-is-identifier-name": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz", + "integrity": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-scope": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/estree-util-scope/-/estree-util-scope-1.0.0.tgz", + "integrity": "sha512-2CAASclonf+JFWBNJPndcOpA8EMJwa0Q8LUFJEKqXLW6+qBvbFZuF5gItbQOs/umBUkjviCSDCbBwU2cXbmrhQ==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-to-js": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/estree-util-to-js/-/estree-util-to-js-2.0.0.tgz", + "integrity": "sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "astring": "^1.8.0", + "source-map": "^0.7.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-visit": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/estree-util-visit/-/estree-util-visit-2.0.0.tgz", + "integrity": "sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/eventemitter3": { + "version": "5.0.4", + "resolved": "https://registry.npmmirror.com/eventemitter3/-/eventemitter3-5.0.4.tgz", + "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==", + "license": "MIT" + }, + "node_modules/expressive-code": { + "version": "0.41.6", + "resolved": "https://registry.npmmirror.com/expressive-code/-/expressive-code-0.41.6.tgz", + "integrity": "sha512-W/5+IQbrpCIM5KGLjO35wlp1NCwDOOVQb+PAvzEoGkW1xjGM807ZGfBKptNWH6UECvt6qgmLyWolCMYKh7eQmA==", + "license": "MIT", + "dependencies": { + "@expressive-code/core": "^0.41.6", + "@expressive-code/plugin-frames": "^0.41.6", + "@expressive-code/plugin-shiki": "^0.41.6", + "@expressive-code/plugin-text-markers": "^0.41.6" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "license": "MIT" + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmmirror.com/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/flattie": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/flattie/-/flattie-1.1.1.tgz", + "integrity": "sha512-9UbaD6XdAL97+k/n+N7JwX46K/M6Zc6KcFYskrYL8wbBV/Uyk0CTAMY0VT+qiK5PM7AIc9aTWYtq65U7T+aCNQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/fontace": { + "version": "0.4.1", + "resolved": "https://registry.npmmirror.com/fontace/-/fontace-0.4.1.tgz", + "integrity": "sha512-lDMvbAzSnHmbYMTEld5qdtvNH2/pWpICOqpean9IgC7vUbUJc3k+k5Dokp85CegamqQpFbXf0rAVkbzpyTA8aw==", + "license": "MIT", + "dependencies": { + "fontkitten": "^1.0.2" + } + }, + "node_modules/fontkitten": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/fontkitten/-/fontkitten-1.0.2.tgz", + "integrity": "sha512-piJxbLnkD9Xcyi7dWJRnqszEURixe7CrF/efBfbffe2DPyabmuIuqraruY8cXTs19QoM8VJzx47BDRVNXETM7Q==", + "license": "MIT", + "dependencies": { + "tiny-inflate": "^1.0.3" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/get-east-asian-width": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/get-east-asian-width/-/get-east-asian-width-1.4.0.tgz", + "integrity": "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/github-slugger": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/github-slugger/-/github-slugger-2.0.0.tgz", + "integrity": "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==", + "license": "ISC" + }, + "node_modules/h3": { + "version": "1.15.5", + "resolved": "https://registry.npmmirror.com/h3/-/h3-1.15.5.tgz", + "integrity": "sha512-xEyq3rSl+dhGX2Lm0+eFQIAzlDN6Fs0EcC4f7BNUmzaRX/PTzeuM+Tr2lHB8FoXggsQIeXLj8EDVgs5ywxyxmg==", + "license": "MIT", + "dependencies": { + "cookie-es": "^1.2.2", + "crossws": "^0.3.5", + "defu": "^6.1.4", + "destr": "^2.0.5", + "iron-webcrypto": "^1.2.1", + "node-mock-http": "^1.0.4", + "radix3": "^1.1.2", + "ufo": "^1.6.3", + "uncrypto": "^0.1.3" + } + }, + "node_modules/hast-util-embedded": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/hast-util-embedded/-/hast-util-embedded-3.0.0.tgz", + "integrity": "sha512-naH8sld4Pe2ep03qqULEtvYr7EjrLK2QHY8KJR6RJkTUjPGObe1vnx585uzem2hGra+s1q08DZZpfgDVYRbaXA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-is-element": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-format": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/hast-util-format/-/hast-util-format-1.1.0.tgz", + "integrity": "sha512-yY1UDz6bC9rDvCWHpx12aIBGRG7krurX0p0Fm6pT547LwDIZZiNr8a+IHDogorAdreULSEzP82Nlv5SZkHZcjA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-embedded": "^3.0.0", + "hast-util-minify-whitespace": "^1.0.0", + "hast-util-phrasing": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "html-whitespace-sensitive-tag-names": "^3.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-from-html": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/hast-util-from-html/-/hast-util-from-html-2.0.3.tgz", + "integrity": "sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "devlop": "^1.1.0", + "hast-util-from-parse5": "^8.0.0", + "parse5": "^7.0.0", + "vfile": "^6.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-from-parse5": { + "version": "8.0.3", + "resolved": "https://registry.npmmirror.com/hast-util-from-parse5/-/hast-util-from-parse5-8.0.3.tgz", + "integrity": "sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "devlop": "^1.0.0", + "hastscript": "^9.0.0", + "property-information": "^7.0.0", + "vfile": "^6.0.0", + "vfile-location": "^5.0.0", + "web-namespaces": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-has-property": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/hast-util-has-property/-/hast-util-has-property-3.0.0.tgz", + "integrity": "sha512-MNilsvEKLFpV604hwfhVStK0usFY/QmM5zX16bo7EjnAEGofr5YyI37kzopBlZJkHD4t887i+q/C8/tr5Q94cA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-is-body-ok-link": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/hast-util-is-body-ok-link/-/hast-util-is-body-ok-link-3.0.1.tgz", + "integrity": "sha512-0qpnzOBLztXHbHQenVB8uNuxTnm/QBFUOmdOSsEn7GnBtyY07+ENTWVFBAnXd/zEgd9/SUG3lRY7hSIBWRgGpQ==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-is-element": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/hast-util-is-element/-/hast-util-is-element-3.0.0.tgz", + "integrity": "sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-minify-whitespace": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/hast-util-minify-whitespace/-/hast-util-minify-whitespace-1.0.1.tgz", + "integrity": "sha512-L96fPOVpnclQE0xzdWb/D12VT5FabA7SnZOUMtL1DbXmYiHJMXZvFkIZfiMmTCNJHUeO2K9UYNXoVyfz+QHuOw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-embedded": "^3.0.0", + "hast-util-is-element": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-parse-selector": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz", + "integrity": "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-phrasing": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/hast-util-phrasing/-/hast-util-phrasing-3.0.1.tgz", + "integrity": "sha512-6h60VfI3uBQUxHqTyMymMZnEbNl1XmEGtOxxKYL7stY2o601COo62AWAYBQR9lZbYXYSBoxag8UpPRXK+9fqSQ==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-embedded": "^3.0.0", + "hast-util-has-property": "^3.0.0", + "hast-util-is-body-ok-link": "^3.0.0", + "hast-util-is-element": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-raw": { + "version": "9.1.0", + "resolved": "https://registry.npmmirror.com/hast-util-raw/-/hast-util-raw-9.1.0.tgz", + "integrity": "sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "@ungap/structured-clone": "^1.0.0", + "hast-util-from-parse5": "^8.0.0", + "hast-util-to-parse5": "^8.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "parse5": "^7.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-select": { + "version": "6.0.4", + "resolved": "https://registry.npmmirror.com/hast-util-select/-/hast-util-select-6.0.4.tgz", + "integrity": "sha512-RqGS1ZgI0MwxLaKLDxjprynNzINEkRHY2i8ln4DDjgv9ZhcYVIHN9rlpiYsqtFwrgpYU361SyWDQcGNIBVu3lw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "bcp-47-match": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "css-selector-parser": "^3.0.0", + "devlop": "^1.0.0", + "direction": "^2.0.0", + "hast-util-has-property": "^3.0.0", + "hast-util-to-string": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "nth-check": "^2.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "unist-util-visit": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-estree": { + "version": "3.1.3", + "resolved": "https://registry.npmmirror.com/hast-util-to-estree/-/hast-util-to-estree-3.1.3.tgz", + "integrity": "sha512-48+B/rJWAp0jamNbAAf9M7Uf//UVqAoMmgXhBdxTDJLGKY+LRnZ99qcG+Qjl5HfMpYNzS5v4EAwVEF34LeAj7w==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-attach-comments": "^3.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-js": "^1.0.0", + "unist-util-position": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-html": { + "version": "9.0.5", + "resolved": "https://registry.npmmirror.com/hast-util-to-html/-/hast-util-to-html-9.0.5.tgz", + "integrity": "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-whitespace": "^3.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "stringify-entities": "^4.0.0", + "zwitch": "^2.0.4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-jsx-runtime": { + "version": "2.3.6", + "resolved": "https://registry.npmmirror.com/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.6.tgz", + "integrity": "sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-js": "^1.0.0", + "unist-util-position": "^5.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-parse5": { + "version": "8.0.1", + "resolved": "https://registry.npmmirror.com/hast-util-to-parse5/-/hast-util-to-parse5-8.0.1.tgz", + "integrity": "sha512-MlWT6Pjt4CG9lFCjiz4BH7l9wmrMkfkJYCxFwKQic8+RTZgWPuWxwAfjJElsXkex7DJjfSJsQIt931ilUgmwdA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-string": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/hast-util-to-string/-/hast-util-to-string-3.0.1.tgz", + "integrity": "sha512-XelQVTDWvqcl3axRfI0xSeoVKzyIFPwsAGSLIsKdJKQMXDYJS4WYrBNF/8J7RdhIcFI2BOHgAifggsvsxp/3+A==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-text": { + "version": "4.0.2", + "resolved": "https://registry.npmmirror.com/hast-util-to-text/-/hast-util-to-text-4.0.2.tgz", + "integrity": "sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "hast-util-is-element": "^3.0.0", + "unist-util-find-after": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-whitespace": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", + "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hastscript": { + "version": "9.0.1", + "resolved": "https://registry.npmmirror.com/hastscript/-/hastscript-9.0.1.tgz", + "integrity": "sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-parse-selector": "^4.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/html-escaper": { + "version": "3.0.3", + "resolved": "https://registry.npmmirror.com/html-escaper/-/html-escaper-3.0.3.tgz", + "integrity": "sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==", + "license": "MIT" + }, + "node_modules/html-void-elements": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/html-void-elements/-/html-void-elements-3.0.0.tgz", + "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/html-whitespace-sensitive-tag-names": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/html-whitespace-sensitive-tag-names/-/html-whitespace-sensitive-tag-names-3.0.1.tgz", + "integrity": "sha512-q+310vW8zmymYHALr1da4HyXUQ0zgiIwIicEfotYPWGN0OJVEN/58IJ3A4GBYcEq3LGAZqKb+ugvP0GNB9CEAA==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.2.0", + "resolved": "https://registry.npmmirror.com/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", + "license": "BSD-2-Clause" + }, + "node_modules/i18next": { + "version": "23.16.8", + "resolved": "https://registry.npmmirror.com/i18next/-/i18next-23.16.8.tgz", + "integrity": "sha512-06r/TitrM88Mg5FdUXAKL96dJMzgqLE5dv3ryBAra4KCwD9mJ4ndOTS95ZuymIGoE+2hzfdaMak2X11/es7ZWg==", + "funding": [ + { + "type": "individual", + "url": "https://locize.com" + }, + { + "type": "individual", + "url": "https://locize.com/i18next.html" + }, + { + "type": "individual", + "url": "https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project" + } + ], + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.23.2" + } + }, + "node_modules/import-meta-resolve": { + "version": "4.2.0", + "resolved": "https://registry.npmmirror.com/import-meta-resolve/-/import-meta-resolve-4.2.0.tgz", + "integrity": "sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/inline-style-parser": { + "version": "0.2.7", + "resolved": "https://registry.npmmirror.com/inline-style-parser/-/inline-style-parser-0.2.7.tgz", + "integrity": "sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==", + "license": "MIT" + }, + "node_modules/iron-webcrypto": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/iron-webcrypto/-/iron-webcrypto-1.2.1.tgz", + "integrity": "sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/brc-dd" + } + }, + "node_modules/is-alphabetical": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/is-alphabetical/-/is-alphabetical-2.0.1.tgz", + "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-alphanumerical": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", + "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", + "license": "MIT", + "dependencies": { + "is-alphabetical": "^2.0.0", + "is-decimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-decimal": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/is-decimal/-/is-decimal-2.0.1.tgz", + "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-hexadecimal": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", + "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "license": "MIT", + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-wsl": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/is-wsl/-/is-wsl-3.1.0.tgz", + "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", + "license": "MIT", + "dependencies": { + "is-inside-container": "^1.0.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmmirror.com/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmmirror.com/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/klona": { + "version": "2.0.6", + "resolved": "https://registry.npmmirror.com/klona/-/klona-2.0.6.tgz", + "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/longest-streak": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/longest-streak/-/longest-streak-3.1.0.tgz", + "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/lru-cache": { + "version": "11.2.5", + "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-11.2.5.tgz", + "integrity": "sha512-vFrFJkWtJvJnD5hg+hJvVE8Lh/TcMzKnTgCWmtBipwI5yLX/iX+5UB2tfuyODF5E7k9xEzMdYgGqaSb1c0c5Yw==", + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/magicast": { + "version": "0.5.2", + "resolved": "https://registry.npmmirror.com/magicast/-/magicast-0.5.2.tgz", + "integrity": "sha512-E3ZJh4J3S9KfwdjZhe2afj6R9lGIN5Pher1pF39UGrXRqq/VDaGVIGN13BjHd2u8B61hArAGOnso7nBOouW3TQ==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.0", + "@babel/types": "^7.29.0", + "source-map-js": "^1.2.1" + } + }, + "node_modules/markdown-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/markdown-extensions/-/markdown-extensions-2.0.0.tgz", + "integrity": "sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==", + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/markdown-table": { + "version": "3.0.4", + "resolved": "https://registry.npmmirror.com/markdown-table/-/markdown-table-3.0.4.tgz", + "integrity": "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/mdast-util-definitions": { + "version": "6.0.0", + "resolved": "https://registry.npmmirror.com/mdast-util-definitions/-/mdast-util-definitions-6.0.0.tgz", + "integrity": "sha512-scTllyX6pnYNZH/AIp/0ePz6s4cZtARxImwoPJ7kS42n+MnVsI4XbnG6d4ibehRIldYMWM2LD7ImQblVhUejVQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "unist-util-visit": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-directive": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/mdast-util-directive/-/mdast-util-directive-3.1.0.tgz", + "integrity": "sha512-I3fNFt+DHmpWCYAT7quoM6lHf9wuqtI+oCOfvILnoicNIqjh5E3dEJWiXuYME2gNe8vl1iMQwyUHa7bgFmak6Q==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "parse-entities": "^4.0.0", + "stringify-entities": "^4.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-find-and-replace": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.2.tgz", + "integrity": "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "escape-string-regexp": "^5.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-from-markdown": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.2.tgz", + "integrity": "sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark": "^4.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/mdast-util-gfm/-/mdast-util-gfm-3.1.0.tgz", + "integrity": "sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==", + "license": "MIT", + "dependencies": { + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-gfm-autolink-literal": "^2.0.0", + "mdast-util-gfm-footnote": "^2.0.0", + "mdast-util-gfm-strikethrough": "^2.0.0", + "mdast-util-gfm-table": "^2.0.0", + "mdast-util-gfm-task-list-item": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-autolink-literal": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.1.tgz", + "integrity": "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "ccount": "^2.0.0", + "devlop": "^1.0.0", + "mdast-util-find-and-replace": "^3.0.0", + "micromark-util-character": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-footnote": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-strikethrough": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz", + "integrity": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-table": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz", + "integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "markdown-table": "^3.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-task-list-item": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz", + "integrity": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/mdast-util-mdx/-/mdast-util-mdx-3.0.0.tgz", + "integrity": "sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==", + "license": "MIT", + "dependencies": { + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-expression": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.1.tgz", + "integrity": "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-jsx": { + "version": "3.2.0", + "resolved": "https://registry.npmmirror.com/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.2.0.tgz", + "integrity": "sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "parse-entities": "^4.0.0", + "stringify-entities": "^4.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdxjs-esm": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz", + "integrity": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-phrasing": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", + "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-hast": { + "version": "13.2.1", + "resolved": "https://registry.npmmirror.com/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz", + "integrity": "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz", + "integrity": "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "longest-streak": "^3.0.0", + "mdast-util-phrasing": "^4.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "unist-util-visit": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", + "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdn-data": { + "version": "2.12.2", + "resolved": "https://registry.npmmirror.com/mdn-data/-/mdn-data-2.12.2.tgz", + "integrity": "sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==", + "license": "CC0-1.0" + }, + "node_modules/micromark": { + "version": "4.0.2", + "resolved": "https://registry.npmmirror.com/micromark/-/micromark-4.0.2.tgz", + "integrity": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz", + "integrity": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-destination": "^2.0.0", + "micromark-factory-label": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-title": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-html-tag-name": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-directive": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/micromark-extension-directive/-/micromark-extension-directive-3.0.2.tgz", + "integrity": "sha512-wjcXHgk+PPdmvR58Le9d7zQYWy+vKEU9Se44p2CrCDPiLr2FMyiT4Fyb5UFKFC66wGB3kPlgD7q3TnoqPS7SZA==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "parse-entities": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz", + "integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==", + "license": "MIT", + "dependencies": { + "micromark-extension-gfm-autolink-literal": "^2.0.0", + "micromark-extension-gfm-footnote": "^2.0.0", + "micromark-extension-gfm-strikethrough": "^2.0.0", + "micromark-extension-gfm-table": "^2.0.0", + "micromark-extension-gfm-tagfilter": "^2.0.0", + "micromark-extension-gfm-task-list-item": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-autolink-literal": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz", + "integrity": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==", + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-footnote": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-strikethrough": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz", + "integrity": "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-table": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.1.tgz", + "integrity": "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-tagfilter": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz", + "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==", + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-task-list-item": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz", + "integrity": "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdx-expression": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/micromark-extension-mdx-expression/-/micromark-extension-mdx-expression-3.0.1.tgz", + "integrity": "sha512-dD/ADLJ1AeMvSAKBwO22zG22N4ybhe7kFIZ3LsDI0GlsNr2A3KYxb0LdC1u5rj4Nw+CHKY0RVdnHX8vj8ejm4Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-mdx-expression": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-mdx-jsx": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-3.0.2.tgz", + "integrity": "sha512-e5+q1DjMh62LZAJOnDraSSbDMvGJ8x3cbjygy2qFEi7HCeUT4BDKCvMozPozcD6WmOt6sVvYDNBKhFSz3kjOVQ==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "micromark-factory-mdx-expression": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdx-md": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/micromark-extension-mdx-md/-/micromark-extension-mdx-md-2.0.0.tgz", + "integrity": "sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==", + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdxjs": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/micromark-extension-mdxjs/-/micromark-extension-mdxjs-3.0.0.tgz", + "integrity": "sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==", + "license": "MIT", + "dependencies": { + "acorn": "^8.0.0", + "acorn-jsx": "^5.0.0", + "micromark-extension-mdx-expression": "^3.0.0", + "micromark-extension-mdx-jsx": "^3.0.0", + "micromark-extension-mdx-md": "^2.0.0", + "micromark-extension-mdxjs-esm": "^3.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdxjs-esm": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/micromark-extension-mdxjs-esm/-/micromark-extension-mdxjs-esm-3.0.0.tgz", + "integrity": "sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-position-from-estree": "^2.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-factory-destination": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", + "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-label": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz", + "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-mdx-expression": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/micromark-factory-mdx-expression/-/micromark-factory-mdx-expression-2.0.3.tgz", + "integrity": "sha512-kQnEtA3vzucU2BkrIa8/VaSAsP+EJ3CKOvhMuJgOEGg9KDC6OAY6nSnNDVRiVNRqj7Y4SlSzcStaH/5jge8JdQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-position-from-estree": "^2.0.0", + "vfile-message": "^4.0.0" + } + }, + "node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-title": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz", + "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-whitespace": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz", + "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-chunked": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz", + "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-classify-character": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz", + "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-combine-extensions": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz", + "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz", + "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-string": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz", + "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-encode": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", + "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-events-to-acorn": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/micromark-util-events-to-acorn/-/micromark-util-events-to-acorn-2.0.3.tgz", + "integrity": "sha512-jmsiEIiZ1n7X1Rr5k8wVExBQCg5jy4UXVADItHmNk1zkwEVhBuIUKRu3fqv+hs4nxLISi2DQGlqIOGiFxgbfHg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/unist": "^3.0.0", + "devlop": "^1.0.0", + "estree-util-visit": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "vfile-message": "^4.0.0" + } + }, + "node_modules/micromark-util-html-tag-name": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", + "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-normalize-identifier": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz", + "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-resolve-all": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz", + "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", + "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-subtokenize": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz", + "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-types": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/mrmime": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/mrmime/-/mrmime-2.0.1.tgz", + "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/neotraverse": { + "version": "0.6.18", + "resolved": "https://registry.npmmirror.com/neotraverse/-/neotraverse-0.6.18.tgz", + "integrity": "sha512-Z4SmBUweYa09+o6pG+eASabEpP6QkQ70yHj351pQoEXIs8uHbaU2DWVmzBANKgflPa47A50PtB2+NgRpQvr7vA==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/nlcst-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/nlcst-to-string/-/nlcst-to-string-4.0.0.tgz", + "integrity": "sha512-YKLBCcUYKAg0FNlOBT6aI91qFmSiFKiluk655WzPF+DDMA02qIyy8uiRqI8QXtcFpEvll12LpL5MXqEmAZ+dcA==", + "license": "MIT", + "dependencies": { + "@types/nlcst": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/node-fetch-native": { + "version": "1.6.7", + "resolved": "https://registry.npmmirror.com/node-fetch-native/-/node-fetch-native-1.6.7.tgz", + "integrity": "sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==", + "license": "MIT" + }, + "node_modules/node-mock-http": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/node-mock-http/-/node-mock-http-1.0.4.tgz", + "integrity": "sha512-8DY+kFsDkNXy1sJglUfuODx1/opAGJGyrTuFqEoN90oRc2Vk0ZbD4K2qmKXBBEhZQzdKHIVfEJpDU8Ak2NJEvQ==", + "license": "MIT" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/ofetch": { + "version": "1.5.1", + "resolved": "https://registry.npmmirror.com/ofetch/-/ofetch-1.5.1.tgz", + "integrity": "sha512-2W4oUZlVaqAPAil6FUg/difl6YhqhUR7x2eZY4bQCko22UXg3hptq9KLQdqFClV+Wu85UX7hNtdGTngi/1BxcA==", + "license": "MIT", + "dependencies": { + "destr": "^2.0.5", + "node-fetch-native": "^1.6.7", + "ufo": "^1.6.1" + } + }, + "node_modules/ohash": { + "version": "2.0.11", + "resolved": "https://registry.npmmirror.com/ohash/-/ohash-2.0.11.tgz", + "integrity": "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==", + "license": "MIT" + }, + "node_modules/oniguruma-parser": { + "version": "0.12.1", + "resolved": "https://registry.npmmirror.com/oniguruma-parser/-/oniguruma-parser-0.12.1.tgz", + "integrity": "sha512-8Unqkvk1RYc6yq2WBYRj4hdnsAxVze8i7iPfQr8e4uSP3tRv0rpZcbGUDvxfQQcdwHt/e9PrMvGCsa8OqG9X3w==", + "license": "MIT" + }, + "node_modules/oniguruma-to-es": { + "version": "4.3.4", + "resolved": "https://registry.npmmirror.com/oniguruma-to-es/-/oniguruma-to-es-4.3.4.tgz", + "integrity": "sha512-3VhUGN3w2eYxnTzHn+ikMI+fp/96KoRSVK9/kMTcFqj1NRDh2IhQCKvYxDnWePKRXY/AqH+Fuiyb7VHSzBjHfA==", + "license": "MIT", + "dependencies": { + "oniguruma-parser": "^0.12.1", + "regex": "^6.0.1", + "regex-recursion": "^6.0.2" + } + }, + "node_modules/p-limit": { + "version": "6.2.0", + "resolved": "https://registry.npmmirror.com/p-limit/-/p-limit-6.2.0.tgz", + "integrity": "sha512-kuUqqHNUqoIWp/c467RI4X6mmyuojY5jGutNU0wVTmEOOfcuwLqyMVoAi9MKi2Ak+5i9+nhmrK4ufZE8069kHA==", + "license": "MIT", + "dependencies": { + "yocto-queue": "^1.1.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-queue": { + "version": "8.1.1", + "resolved": "https://registry.npmmirror.com/p-queue/-/p-queue-8.1.1.tgz", + "integrity": "sha512-aNZ+VfjobsWryoiPnEApGGmf5WmNsCo9xu8dfaYamG5qaLP7ClhLN6NgsFe6SwJ2UbLEBK5dv9x8Mn5+RVhMWQ==", + "license": "MIT", + "dependencies": { + "eventemitter3": "^5.0.1", + "p-timeout": "^6.1.2" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-timeout": { + "version": "6.1.4", + "resolved": "https://registry.npmmirror.com/p-timeout/-/p-timeout-6.1.4.tgz", + "integrity": "sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg==", + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/package-manager-detector": { + "version": "1.6.0", + "resolved": "https://registry.npmmirror.com/package-manager-detector/-/package-manager-detector-1.6.0.tgz", + "integrity": "sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA==", + "license": "MIT" + }, + "node_modules/pagefind": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/pagefind/-/pagefind-1.4.0.tgz", + "integrity": "sha512-z2kY1mQlL4J8q5EIsQkLzQjilovKzfNVhX8De6oyE6uHpfFtyBaqUpcl/XzJC/4fjD8vBDyh1zolimIcVrCn9g==", + "license": "MIT", + "bin": { + "pagefind": "lib/runner/bin.cjs" + }, + "optionalDependencies": { + "@pagefind/darwin-arm64": "1.4.0", + "@pagefind/darwin-x64": "1.4.0", + "@pagefind/freebsd-x64": "1.4.0", + "@pagefind/linux-arm64": "1.4.0", + "@pagefind/linux-x64": "1.4.0", + "@pagefind/windows-x64": "1.4.0" + } + }, + "node_modules/parse-entities": { + "version": "4.0.2", + "resolved": "https://registry.npmmirror.com/parse-entities/-/parse-entities-4.0.2.tgz", + "integrity": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "character-entities-legacy": "^3.0.0", + "character-reference-invalid": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "is-alphanumerical": "^2.0.0", + "is-decimal": "^2.0.0", + "is-hexadecimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/parse-entities/node_modules/@types/unist": { + "version": "2.0.11", + "resolved": "https://registry.npmmirror.com/@types/unist/-/unist-2.0.11.tgz", + "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", + "license": "MIT" + }, + "node_modules/parse-latin": { + "version": "7.0.0", + "resolved": "https://registry.npmmirror.com/parse-latin/-/parse-latin-7.0.0.tgz", + "integrity": "sha512-mhHgobPPua5kZ98EF4HWiH167JWBfl4pvAIXXdbaVohtK7a6YBOy56kvhCqduqyo/f3yrHFWmqmiMg/BkBkYYQ==", + "license": "MIT", + "dependencies": { + "@types/nlcst": "^2.0.0", + "@types/unist": "^3.0.0", + "nlcst-to-string": "^4.0.0", + "unist-util-modify-children": "^4.0.0", + "unist-util-visit-children": "^3.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/parse5": { + "version": "7.3.0", + "resolved": "https://registry.npmmirror.com/parse5/-/parse5-7.3.0.tgz", + "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", + "license": "MIT", + "dependencies": { + "entities": "^6.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/piccolore": { + "version": "0.1.3", + "resolved": "https://registry.npmmirror.com/piccolore/-/piccolore-0.1.3.tgz", + "integrity": "sha512-o8bTeDWjE086iwKrROaDf31K0qC/BENdm15/uH9usSC/uZjJOKb2YGiVHfLY4GhwsERiPI1jmwI2XrA7ACOxVw==", + "license": "ISC" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-nested": { + "version": "6.2.0", + "resolved": "https://registry.npmmirror.com/postcss-nested/-/postcss-nested-6.2.0.tgz", + "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.1.1" + }, + "engines": { + "node": ">=12.0" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmmirror.com/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/prismjs": { + "version": "1.30.0", + "resolved": "https://registry.npmmirror.com/prismjs/-/prismjs-1.30.0.tgz", + "integrity": "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmmirror.com/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "license": "MIT", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/property-information": { + "version": "7.1.0", + "resolved": "https://registry.npmmirror.com/property-information/-/property-information-7.1.0.tgz", + "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/radix3": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/radix3/-/radix3-1.1.2.tgz", + "integrity": "sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==", + "license": "MIT" + }, + "node_modules/readdirp": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/readdirp/-/readdirp-5.0.0.tgz", + "integrity": "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==", + "license": "MIT", + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/recma-build-jsx": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/recma-build-jsx/-/recma-build-jsx-1.0.0.tgz", + "integrity": "sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-util-build-jsx": "^3.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/recma-jsx": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/recma-jsx/-/recma-jsx-1.0.1.tgz", + "integrity": "sha512-huSIy7VU2Z5OLv6oFLosQGGDqPqdO1iq6bWNAdhzMxSJP7RAso4fCZ1cKu8j9YHCZf3TPrq4dw3okhrylgcd7w==", + "license": "MIT", + "dependencies": { + "acorn-jsx": "^5.0.0", + "estree-util-to-js": "^2.0.0", + "recma-parse": "^1.0.0", + "recma-stringify": "^1.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/recma-parse": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/recma-parse/-/recma-parse-1.0.0.tgz", + "integrity": "sha512-OYLsIGBB5Y5wjnSnQW6t3Xg7q3fQ7FWbw/vcXtORTnyaSFscOtABg+7Pnz6YZ6c27fG1/aN8CjfwoUEUIdwqWQ==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "esast-util-from-js": "^2.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/recma-stringify": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/recma-stringify/-/recma-stringify-1.0.0.tgz", + "integrity": "sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-util-to-js": "^2.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/regex": { + "version": "6.1.0", + "resolved": "https://registry.npmmirror.com/regex/-/regex-6.1.0.tgz", + "integrity": "sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==", + "license": "MIT", + "dependencies": { + "regex-utilities": "^2.3.0" + } + }, + "node_modules/regex-recursion": { + "version": "6.0.2", + "resolved": "https://registry.npmmirror.com/regex-recursion/-/regex-recursion-6.0.2.tgz", + "integrity": "sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==", + "license": "MIT", + "dependencies": { + "regex-utilities": "^2.3.0" + } + }, + "node_modules/regex-utilities": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/regex-utilities/-/regex-utilities-2.3.0.tgz", + "integrity": "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==", + "license": "MIT" + }, + "node_modules/rehype": { + "version": "13.0.2", + "resolved": "https://registry.npmmirror.com/rehype/-/rehype-13.0.2.tgz", + "integrity": "sha512-j31mdaRFrwFRUIlxGeuPXXKWQxet52RBQRvCmzl5eCefn/KGbomK5GMHNMsOJf55fgo3qw5tST5neDuarDYR2A==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "rehype-parse": "^9.0.0", + "rehype-stringify": "^10.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-expressive-code": { + "version": "0.41.6", + "resolved": "https://registry.npmmirror.com/rehype-expressive-code/-/rehype-expressive-code-0.41.6.tgz", + "integrity": "sha512-aBMX8kxPtjmDSFUdZlAWJkMvsQ4ZMASfee90JWIAV8tweltXLzkWC3q++43ToTelI8ac5iC0B3/S/Cl4Ql1y2g==", + "license": "MIT", + "dependencies": { + "expressive-code": "^0.41.6" + } + }, + "node_modules/rehype-format": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/rehype-format/-/rehype-format-5.0.1.tgz", + "integrity": "sha512-zvmVru9uB0josBVpr946OR8ui7nJEdzZobwLOOqHb/OOD88W0Vk2SqLwoVOj0fM6IPCCO6TaV9CvQvJMWwukFQ==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-format": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-parse": { + "version": "9.0.1", + "resolved": "https://registry.npmmirror.com/rehype-parse/-/rehype-parse-9.0.1.tgz", + "integrity": "sha512-ksCzCD0Fgfh7trPDxr2rSylbwq9iYDkSn8TCDmEJ49ljEUBxDVCzCHv7QNzZOfODanX4+bWQ4WZqLCRWYLfhag==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-from-html": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-raw": { + "version": "7.0.0", + "resolved": "https://registry.npmmirror.com/rehype-raw/-/rehype-raw-7.0.0.tgz", + "integrity": "sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-raw": "^9.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-recma": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/rehype-recma/-/rehype-recma-1.0.0.tgz", + "integrity": "sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/hast": "^3.0.0", + "hast-util-to-estree": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-stringify": { + "version": "10.0.1", + "resolved": "https://registry.npmmirror.com/rehype-stringify/-/rehype-stringify-10.0.1.tgz", + "integrity": "sha512-k9ecfXHmIPuFVI61B9DeLPN0qFHfawM6RsuX48hoqlaKSF61RskNjSm1lI8PhBEM0MRdLxVVm4WmTqJQccH9mA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-to-html": "^9.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-directive": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/remark-directive/-/remark-directive-3.0.1.tgz", + "integrity": "sha512-gwglrEQEZcZYgVyG1tQuA+h58EZfq5CSULw7J90AFuCTyib1thgHPoqQ+h9iFvU6R+vnZ5oNFQR5QKgGpk741A==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-directive": "^3.0.0", + "micromark-extension-directive": "^3.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-gfm": { + "version": "4.0.1", + "resolved": "https://registry.npmmirror.com/remark-gfm/-/remark-gfm-4.0.1.tgz", + "integrity": "sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-gfm": "^3.0.0", + "micromark-extension-gfm": "^3.0.0", + "remark-parse": "^11.0.0", + "remark-stringify": "^11.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-mdx": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/remark-mdx/-/remark-mdx-3.1.1.tgz", + "integrity": "sha512-Pjj2IYlUY3+D8x00UJsIOg5BEvfMyeI+2uLPn9VO9Wg4MEtN/VTIq2NEJQfde9PnX15KgtHyl9S0BcTnWrIuWg==", + "license": "MIT", + "dependencies": { + "mdast-util-mdx": "^3.0.0", + "micromark-extension-mdxjs": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-parse": { + "version": "11.0.0", + "resolved": "https://registry.npmmirror.com/remark-parse/-/remark-parse-11.0.0.tgz", + "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-rehype": { + "version": "11.1.2", + "resolved": "https://registry.npmmirror.com/remark-rehype/-/remark-rehype-11.1.2.tgz", + "integrity": "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "mdast-util-to-hast": "^13.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-smartypants": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/remark-smartypants/-/remark-smartypants-3.0.2.tgz", + "integrity": "sha512-ILTWeOriIluwEvPjv67v7Blgrcx+LZOkAUVtKI3putuhlZm84FnqDORNXPPm+HY3NdZOMhyDwZ1E+eZB/Df5dA==", + "license": "MIT", + "dependencies": { + "retext": "^9.0.0", + "retext-smartypants": "^6.0.0", + "unified": "^11.0.4", + "unist-util-visit": "^5.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/remark-stringify": { + "version": "11.0.0", + "resolved": "https://registry.npmmirror.com/remark-stringify/-/remark-stringify-11.0.0.tgz", + "integrity": "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-to-markdown": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/retext": { + "version": "9.0.0", + "resolved": "https://registry.npmmirror.com/retext/-/retext-9.0.0.tgz", + "integrity": "sha512-sbMDcpHCNjvlheSgMfEcVrZko3cDzdbe1x/e7G66dFp0Ff7Mldvi2uv6JkJQzdRcvLYE8CA8Oe8siQx8ZOgTcA==", + "license": "MIT", + "dependencies": { + "@types/nlcst": "^2.0.0", + "retext-latin": "^4.0.0", + "retext-stringify": "^4.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/retext-latin": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/retext-latin/-/retext-latin-4.0.0.tgz", + "integrity": "sha512-hv9woG7Fy0M9IlRQloq/N6atV82NxLGveq+3H2WOi79dtIYWN8OaxogDm77f8YnVXJL2VD3bbqowu5E3EMhBYA==", + "license": "MIT", + "dependencies": { + "@types/nlcst": "^2.0.0", + "parse-latin": "^7.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/retext-smartypants": { + "version": "6.2.0", + "resolved": "https://registry.npmmirror.com/retext-smartypants/-/retext-smartypants-6.2.0.tgz", + "integrity": "sha512-kk0jOU7+zGv//kfjXEBjdIryL1Acl4i9XNkHxtM7Tm5lFiCog576fjNC9hjoR7LTKQ0DsPWy09JummSsH1uqfQ==", + "license": "MIT", + "dependencies": { + "@types/nlcst": "^2.0.0", + "nlcst-to-string": "^4.0.0", + "unist-util-visit": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/retext-stringify": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/retext-stringify/-/retext-stringify-4.0.0.tgz", + "integrity": "sha512-rtfN/0o8kL1e+78+uxPTqu1Klt0yPzKuQ2BfWwwfgIUSayyzxpM1PJzkKt4V8803uB9qSy32MvI7Xep9khTpiA==", + "license": "MIT", + "dependencies": { + "@types/nlcst": "^2.0.0", + "nlcst-to-string": "^4.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rollup": { + "version": "4.57.1", + "resolved": "https://registry.npmmirror.com/rollup/-/rollup-4.57.1.tgz", + "integrity": "sha512-oQL6lgK3e2QZeQ7gcgIkS2YZPg5slw37hYufJ3edKlfQSGGm8ICoxswK15ntSzF/a8+h7ekRy7k7oWc3BQ7y8A==", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.57.1", + "@rollup/rollup-android-arm64": "4.57.1", + "@rollup/rollup-darwin-arm64": "4.57.1", + "@rollup/rollup-darwin-x64": "4.57.1", + "@rollup/rollup-freebsd-arm64": "4.57.1", + "@rollup/rollup-freebsd-x64": "4.57.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.57.1", + "@rollup/rollup-linux-arm-musleabihf": "4.57.1", + "@rollup/rollup-linux-arm64-gnu": "4.57.1", + "@rollup/rollup-linux-arm64-musl": "4.57.1", + "@rollup/rollup-linux-loong64-gnu": "4.57.1", + "@rollup/rollup-linux-loong64-musl": "4.57.1", + "@rollup/rollup-linux-ppc64-gnu": "4.57.1", + "@rollup/rollup-linux-ppc64-musl": "4.57.1", + "@rollup/rollup-linux-riscv64-gnu": "4.57.1", + "@rollup/rollup-linux-riscv64-musl": "4.57.1", + "@rollup/rollup-linux-s390x-gnu": "4.57.1", + "@rollup/rollup-linux-x64-gnu": "4.57.1", + "@rollup/rollup-linux-x64-musl": "4.57.1", + "@rollup/rollup-openbsd-x64": "4.57.1", + "@rollup/rollup-openharmony-arm64": "4.57.1", + "@rollup/rollup-win32-arm64-msvc": "4.57.1", + "@rollup/rollup-win32-ia32-msvc": "4.57.1", + "@rollup/rollup-win32-x64-gnu": "4.57.1", + "@rollup/rollup-win32-x64-msvc": "4.57.1", + "fsevents": "~2.3.2" + } + }, + "node_modules/sax": { + "version": "1.4.4", + "resolved": "https://registry.npmmirror.com/sax/-/sax-1.4.4.tgz", + "integrity": "sha512-1n3r/tGXO6b6VXMdFT54SHzT9ytu9yr7TaELowdYpMqY/Ao7EnlQGmAQ1+RatX7Tkkdm6hONI2owqNx2aZj5Sw==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=11.0.0" + } + }, + "node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmmirror.com/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/sharp": { + "version": "0.34.5", + "resolved": "https://registry.npmmirror.com/sharp/-/sharp-0.34.5.tgz", + "integrity": "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==", + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "@img/colour": "^1.0.0", + "detect-libc": "^2.1.2", + "semver": "^7.7.3" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.34.5", + "@img/sharp-darwin-x64": "0.34.5", + "@img/sharp-libvips-darwin-arm64": "1.2.4", + "@img/sharp-libvips-darwin-x64": "1.2.4", + "@img/sharp-libvips-linux-arm": "1.2.4", + "@img/sharp-libvips-linux-arm64": "1.2.4", + "@img/sharp-libvips-linux-ppc64": "1.2.4", + "@img/sharp-libvips-linux-riscv64": "1.2.4", + "@img/sharp-libvips-linux-s390x": "1.2.4", + "@img/sharp-libvips-linux-x64": "1.2.4", + "@img/sharp-libvips-linuxmusl-arm64": "1.2.4", + "@img/sharp-libvips-linuxmusl-x64": "1.2.4", + "@img/sharp-linux-arm": "0.34.5", + "@img/sharp-linux-arm64": "0.34.5", + "@img/sharp-linux-ppc64": "0.34.5", + "@img/sharp-linux-riscv64": "0.34.5", + "@img/sharp-linux-s390x": "0.34.5", + "@img/sharp-linux-x64": "0.34.5", + "@img/sharp-linuxmusl-arm64": "0.34.5", + "@img/sharp-linuxmusl-x64": "0.34.5", + "@img/sharp-wasm32": "0.34.5", + "@img/sharp-win32-arm64": "0.34.5", + "@img/sharp-win32-ia32": "0.34.5", + "@img/sharp-win32-x64": "0.34.5" + } + }, + "node_modules/shiki": { + "version": "3.22.0", + "resolved": "https://registry.npmmirror.com/shiki/-/shiki-3.22.0.tgz", + "integrity": "sha512-LBnhsoYEe0Eou4e1VgJACes+O6S6QC0w71fCSp5Oya79inkwkm15gQ1UF6VtQ8j/taMDh79hAB49WUk8ALQW3g==", + "license": "MIT", + "dependencies": { + "@shikijs/core": "3.22.0", + "@shikijs/engine-javascript": "3.22.0", + "@shikijs/engine-oniguruma": "3.22.0", + "@shikijs/langs": "3.22.0", + "@shikijs/themes": "3.22.0", + "@shikijs/types": "3.22.0", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4" + } + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmmirror.com/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "license": "MIT" + }, + "node_modules/sitemap": { + "version": "8.0.2", + "resolved": "https://registry.npmmirror.com/sitemap/-/sitemap-8.0.2.tgz", + "integrity": "sha512-LwktpJcyZDoa0IL6KT++lQ53pbSrx2c9ge41/SeLTyqy2XUNA6uR4+P9u5IVo5lPeL2arAcOKn1aZAxoYbCKlQ==", + "license": "MIT", + "dependencies": { + "@types/node": "^17.0.5", + "@types/sax": "^1.2.1", + "arg": "^5.0.0", + "sax": "^1.4.1" + }, + "bin": { + "sitemap": "dist/cli.js" + }, + "engines": { + "node": ">=14.0.0", + "npm": ">=6.0.0" + } + }, + "node_modules/sitemap/node_modules/@types/node": { + "version": "17.0.45", + "resolved": "https://registry.npmmirror.com/@types/node/-/node-17.0.45.tgz", + "integrity": "sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==", + "license": "MIT" + }, + "node_modules/smol-toml": { + "version": "1.6.0", + "resolved": "https://registry.npmmirror.com/smol-toml/-/smol-toml-1.6.0.tgz", + "integrity": "sha512-4zemZi0HvTnYwLfrpk/CF9LOd9Lt87kAt50GnqhMpyF9U3poDAP2+iukq2bZsO/ufegbYehBkqINbsWxj4l4cw==", + "license": "BSD-3-Clause", + "engines": { + "node": ">= 18" + }, + "funding": { + "url": "https://github.com/sponsors/cyyynthia" + } + }, + "node_modules/source-map": { + "version": "0.7.6", + "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.7.6.tgz", + "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">= 12" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/stream-replace-string": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/stream-replace-string/-/stream-replace-string-2.0.0.tgz", + "integrity": "sha512-TlnjJ1C0QrmxRNrON00JvaFFlNh5TTG00APw23j74ET7gkQpTASi6/L2fuiav8pzK715HXtUeClpBTw2NPSn6w==", + "license": "MIT" + }, + "node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmmirror.com/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/stringify-entities": { + "version": "4.0.4", + "resolved": "https://registry.npmmirror.com/stringify-entities/-/stringify-entities-4.0.4.tgz", + "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", + "license": "MIT", + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/style-to-js": { + "version": "1.1.21", + "resolved": "https://registry.npmmirror.com/style-to-js/-/style-to-js-1.1.21.tgz", + "integrity": "sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ==", + "license": "MIT", + "dependencies": { + "style-to-object": "1.0.14" + } + }, + "node_modules/style-to-object": { + "version": "1.0.14", + "resolved": "https://registry.npmmirror.com/style-to-object/-/style-to-object-1.0.14.tgz", + "integrity": "sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw==", + "license": "MIT", + "dependencies": { + "inline-style-parser": "0.2.7" + } + }, + "node_modules/svgo": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/svgo/-/svgo-4.0.0.tgz", + "integrity": "sha512-VvrHQ+9uniE+Mvx3+C9IEe/lWasXCU0nXMY2kZeLrHNICuRiC8uMPyM14UEaMOFA5mhyQqEkB02VoQ16n3DLaw==", + "license": "MIT", + "dependencies": { + "commander": "^11.1.0", + "css-select": "^5.1.0", + "css-tree": "^3.0.1", + "css-what": "^6.1.0", + "csso": "^5.0.5", + "picocolors": "^1.1.1", + "sax": "^1.4.1" + }, + "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.npmmirror.com/tiny-inflate/-/tiny-inflate-1.0.3.tgz", + "integrity": "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==", + "license": "MIT" + }, + "node_modules/tinyexec": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/tinyexec/-/tinyexec-1.0.2.tgz", + "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmmirror.com/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/trim-lines": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/trim-lines/-/trim-lines-3.0.1.tgz", + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/trough": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/trough/-/trough-2.2.0.tgz", + "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/tsconfck": { + "version": "3.1.6", + "resolved": "https://registry.npmmirror.com/tsconfck/-/tsconfck-3.1.6.tgz", + "integrity": "sha512-ks6Vjr/jEw0P1gmOVwutM3B7fWxoWBL2KRDb1JfqGVawBmO5UsvmWOQFGHBPl5yxYz4eERr19E6L7NMv+Fej4w==", + "license": "MIT", + "bin": { + "tsconfck": "bin/tsconfck.js" + }, + "engines": { + "node": "^18 || >=20" + }, + "peerDependencies": { + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD", + "optional": true + }, + "node_modules/type-fest": { + "version": "4.41.0", + "resolved": "https://registry.npmmirror.com/type-fest/-/type-fest-4.41.0.tgz", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmmirror.com/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "license": "Apache-2.0", + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/ufo": { + "version": "1.6.3", + "resolved": "https://registry.npmmirror.com/ufo/-/ufo-1.6.3.tgz", + "integrity": "sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==", + "license": "MIT" + }, + "node_modules/ultrahtml": { + "version": "1.6.0", + "resolved": "https://registry.npmmirror.com/ultrahtml/-/ultrahtml-1.6.0.tgz", + "integrity": "sha512-R9fBn90VTJrqqLDwyMph+HGne8eqY1iPfYhPzZrvKpIfwkWZbcYlfpsb8B9dTvBfpy1/hqAD7Wi8EKfP9e8zdw==", + "license": "MIT" + }, + "node_modules/uncrypto": { + "version": "0.1.3", + "resolved": "https://registry.npmmirror.com/uncrypto/-/uncrypto-0.1.3.tgz", + "integrity": "sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==", + "license": "MIT" + }, + "node_modules/undici-types": { + "version": "7.16.0", + "resolved": "https://registry.npmmirror.com/undici-types/-/undici-types-7.16.0.tgz", + "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", + "license": "MIT" + }, + "node_modules/unified": { + "version": "11.0.5", + "resolved": "https://registry.npmmirror.com/unified/-/unified-11.0.5.tgz", + "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "bail": "^2.0.0", + "devlop": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unifont": { + "version": "0.7.3", + "resolved": "https://registry.npmmirror.com/unifont/-/unifont-0.7.3.tgz", + "integrity": "sha512-b0GtQzKCyuSHGsfj5vyN8st7muZ6VCI4XD4vFlr7Uy1rlWVYxC3npnfk8MyreHxJYrz1ooLDqDzFe9XqQTlAhA==", + "license": "MIT", + "dependencies": { + "css-tree": "^3.1.0", + "ofetch": "^1.5.1", + "ohash": "^2.0.11" + } + }, + "node_modules/unist-util-find-after": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/unist-util-find-after/-/unist-util-find-after-5.0.0.tgz", + "integrity": "sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-is": { + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/unist-util-is/-/unist-util-is-6.0.1.tgz", + "integrity": "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-modify-children": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/unist-util-modify-children/-/unist-util-modify-children-4.0.0.tgz", + "integrity": "sha512-+tdN5fGNddvsQdIzUF3Xx82CU9sMM+fA0dLgR9vOmT0oPT2jH+P1nd5lSqfCfXAw+93NhcXNY2qqvTUtE4cQkw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "array-iterate": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/unist-util-position/-/unist-util-position-5.0.0.tgz", + "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position-from-estree": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/unist-util-position-from-estree/-/unist-util-position-from-estree-2.0.0.tgz", + "integrity": "sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-remove-position": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/unist-util-remove-position/-/unist-util-remove-position-5.0.0.tgz", + "integrity": "sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-visit": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "5.1.0", + "resolved": "https://registry.npmmirror.com/unist-util-visit/-/unist-util-visit-5.1.0.tgz", + "integrity": "sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-children": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/unist-util-visit-children/-/unist-util-visit-children-3.0.0.tgz", + "integrity": "sha512-RgmdTfSBOg04sdPcpTSD1jzoNBjt9a80/ZCzp5cI9n1qPzLZWF9YdvWGN2zmTumP1HWhXKdUWexjy/Wy/lJ7tA==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "6.0.2", + "resolved": "https://registry.npmmirror.com/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz", + "integrity": "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unstorage": { + "version": "1.17.4", + "resolved": "https://registry.npmmirror.com/unstorage/-/unstorage-1.17.4.tgz", + "integrity": "sha512-fHK0yNg38tBiJKp/Vgsq4j0JEsCmgqH58HAn707S7zGkArbZsVr/CwINoi+nh3h98BRCwKvx1K3Xg9u3VV83sw==", + "license": "MIT", + "dependencies": { + "anymatch": "^3.1.3", + "chokidar": "^5.0.0", + "destr": "^2.0.5", + "h3": "^1.15.5", + "lru-cache": "^11.2.0", + "node-fetch-native": "^1.6.7", + "ofetch": "^1.5.1", + "ufo": "^1.6.3" + }, + "peerDependencies": { + "@azure/app-configuration": "^1.8.0", + "@azure/cosmos": "^4.2.0", + "@azure/data-tables": "^13.3.0", + "@azure/identity": "^4.6.0", + "@azure/keyvault-secrets": "^4.9.0", + "@azure/storage-blob": "^12.26.0", + "@capacitor/preferences": "^6 || ^7 || ^8", + "@deno/kv": ">=0.9.0", + "@netlify/blobs": "^6.5.0 || ^7.0.0 || ^8.1.0 || ^9.0.0 || ^10.0.0", + "@planetscale/database": "^1.19.0", + "@upstash/redis": "^1.34.3", + "@vercel/blob": ">=0.27.1", + "@vercel/functions": "^2.2.12 || ^3.0.0", + "@vercel/kv": "^1 || ^2 || ^3", + "aws4fetch": "^1.0.20", + "db0": ">=0.2.1", + "idb-keyval": "^6.2.1", + "ioredis": "^5.4.2", + "uploadthing": "^7.4.4" + }, + "peerDependenciesMeta": { + "@azure/app-configuration": { + "optional": true + }, + "@azure/cosmos": { + "optional": true + }, + "@azure/data-tables": { + "optional": true + }, + "@azure/identity": { + "optional": true + }, + "@azure/keyvault-secrets": { + "optional": true + }, + "@azure/storage-blob": { + "optional": true + }, + "@capacitor/preferences": { + "optional": true + }, + "@deno/kv": { + "optional": true + }, + "@netlify/blobs": { + "optional": true + }, + "@planetscale/database": { + "optional": true + }, + "@upstash/redis": { + "optional": true + }, + "@vercel/blob": { + "optional": true + }, + "@vercel/functions": { + "optional": true + }, + "@vercel/kv": { + "optional": true + }, + "aws4fetch": { + "optional": true + }, + "db0": { + "optional": true + }, + "idb-keyval": { + "optional": true + }, + "ioredis": { + "optional": true + }, + "uploadthing": { + "optional": true + } + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" + }, + "node_modules/vfile": { + "version": "6.0.3", + "resolved": "https://registry.npmmirror.com/vfile/-/vfile-6.0.3.tgz", + "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-location": { + "version": "5.0.3", + "resolved": "https://registry.npmmirror.com/vfile-location/-/vfile-location-5.0.3.tgz", + "integrity": "sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "4.0.3", + "resolved": "https://registry.npmmirror.com/vfile-message/-/vfile-message-4.0.3.tgz", + "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vite": { + "version": "6.4.1", + "resolved": "https://registry.npmmirror.com/vite/-/vite-6.4.1.tgz", + "integrity": "sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==", + "license": "MIT", + "peer": true, + "dependencies": { + "esbuild": "^0.25.0", + "fdir": "^6.4.4", + "picomatch": "^4.0.2", + "postcss": "^8.5.3", + "rollup": "^4.34.9", + "tinyglobby": "^0.2.13" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vitefu": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/vitefu/-/vitefu-1.1.1.tgz", + "integrity": "sha512-B/Fegf3i8zh0yFbpzZ21amWzHmuNlLlmJT6n7bu5e+pCHUKQIfXSYokrqOBGEMMe9UG2sostKQF9mml/vYaWJQ==", + "license": "MIT", + "workspaces": [ + "tests/deps/*", + "tests/projects/*", + "tests/projects/workspace/packages/*" + ], + "peerDependencies": { + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0" + }, + "peerDependenciesMeta": { + "vite": { + "optional": true + } + } + }, + "node_modules/web-namespaces": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/web-namespaces/-/web-namespaces-2.0.1.tgz", + "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/which-pm-runs": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/which-pm-runs/-/which-pm-runs-1.1.0.tgz", + "integrity": "sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/widest-line": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/widest-line/-/widest-line-5.0.0.tgz", + "integrity": "sha512-c9bZp7b5YtRj2wOe6dlj32MK+Bx/M/d+9VB2SHM1OtsUHR0aV0tdP6DWh/iMt0kWi1t5g1Iudu6hQRNd1A4PVA==", + "license": "MIT", + "dependencies": { + "string-width": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/wrap-ansi": { + "version": "9.0.2", + "resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-9.0.2.tgz", + "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/xxhash-wasm": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/xxhash-wasm/-/xxhash-wasm-1.1.0.tgz", + "integrity": "sha512-147y/6YNh+tlp6nd/2pWq38i9h6mz/EuQ6njIrmW8D1BS5nCqs0P6DG+m6zTGnNz5I+uhZ0SHxBs9BsPrwcKDA==", + "license": "MIT" + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmmirror.com/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yocto-queue": { + "version": "1.2.2", + "resolved": "https://registry.npmmirror.com/yocto-queue/-/yocto-queue-1.2.2.tgz", + "integrity": "sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==", + "license": "MIT", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yocto-spinner": { + "version": "0.2.3", + "resolved": "https://registry.npmmirror.com/yocto-spinner/-/yocto-spinner-0.2.3.tgz", + "integrity": "sha512-sqBChb33loEnkoXte1bLg45bEBsOP9N1kzQh5JZNKj/0rik4zAPTNSAVPj3uQAdc6slYJ0Ksc403G2XgxsJQFQ==", + "license": "MIT", + "dependencies": { + "yoctocolors": "^2.1.1" + }, + "engines": { + "node": ">=18.19" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yoctocolors": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/yoctocolors/-/yoctocolors-2.1.2.tgz", + "integrity": "sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zod": { + "version": "3.25.76", + "resolved": "https://registry.npmmirror.com/zod/-/zod-3.25.76.tgz", + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", + "license": "MIT", + "peer": true, + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-to-json-schema": { + "version": "3.25.1", + "resolved": "https://registry.npmmirror.com/zod-to-json-schema/-/zod-to-json-schema-3.25.1.tgz", + "integrity": "sha512-pM/SU9d3YAggzi6MtR4h7ruuQlqKtad8e9S0fmxcMi+ueAK5Korys/aWcV9LIIHTVbj01NdzxcnXSN+O74ZIVA==", + "license": "ISC", + "peerDependencies": { + "zod": "^3.25 || ^4" + } + }, + "node_modules/zod-to-ts": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/zod-to-ts/-/zod-to-ts-1.2.0.tgz", + "integrity": "sha512-x30XE43V+InwGpvTySRNz9kB7qFU8DlyEy7BsSTCHPH1R0QasMmHWZDCzYm6bVXtj/9NNJAZF3jW8rzFvH5OFA==", + "peerDependencies": { + "typescript": "^4.9.4 || ^5.0.2", + "zod": "^3" + } + }, + "node_modules/zwitch": { + "version": "2.0.4", + "resolved": "https://registry.npmmirror.com/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + } + } +} diff --git a/external/ai-research-ebook/package.json b/external/ai-research-ebook/package.json new file mode 100644 index 0000000..cef56b2 --- /dev/null +++ b/external/ai-research-ebook/package.json @@ -0,0 +1,17 @@ +{ + "name": "ai-research-ebook", + "type": "module", + "version": "0.0.1", + "scripts": { + "dev": "astro dev", + "start": "astro dev", + "build": "astro build", + "preview": "astro preview", + "astro": "astro" + }, + "dependencies": { + "@astrojs/starlight": "^0.37.6", + "astro": "^5.6.1", + "sharp": "^0.34.2" + } +} \ No newline at end of file diff --git a/external/ai-research-ebook/public/favicon.svg b/external/ai-research-ebook/public/favicon.svg new file mode 100644 index 0000000..cba5ac1 --- /dev/null +++ b/external/ai-research-ebook/public/favicon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/external/ai-research-ebook/public/logo.svg b/external/ai-research-ebook/public/logo.svg new file mode 100644 index 0000000..802ca61 --- /dev/null +++ b/external/ai-research-ebook/public/logo.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/external/ai-research-ebook/public/scripts/mermaid-init.js b/external/ai-research-ebook/public/scripts/mermaid-init.js new file mode 100644 index 0000000..c6cbf3c --- /dev/null +++ b/external/ai-research-ebook/public/scripts/mermaid-init.js @@ -0,0 +1,248 @@ +// Mermaid initialization for Starlight + Expressive Code +(function () { + 'use strict'; + + const SCRIPT_VERSION = '20260209e'; + const SOURCE_SELECTOR = '.sl-markdown-content pre[data-language="mermaid"]'; + const RENDER_CLASS = 'mermaid-diagram'; + const HIDDEN_CLASS = 'mermaid-source-hidden'; + const THEME_OBSERVER_FLAG = '__vrMermaidThemeObserver'; + let mermaidModule = null; + let isRendering = false; + let needsRerender = false; + + function isDarkTheme() { + return document.documentElement.dataset.theme === 'dark'; + } + + function getSourceRoot(block) { + return block.closest('.expressive-code') || block; + } + + function normalizeMermaidCode(rawText) { + return String(rawText || '') + .replace(/\u007f/g, '\n') + .replace(/\u001f/g, '\n') + .replace(/[\u2028\u2029]/g, '\n') + .replace(/\u00a0/g, ' ') + .replace(/\r\n?/g, '\n') + .replace(/[\u200B-\u200D\uFEFF]/g, '') + .replace(/[\x00-\x08\x0B\x0C\x0E-\x1E]/g, '') + .split('\n') + .map((line) => line.replace(/\s+$/g, '')) + .join('\n') + .trim(); + } + + function fixLegacySubgraphSyntax(code) { + let autoSubgraphId = 0; + const lines = code.split('\n').map((line) => { + const legacyParen = line.match(/^(\s*)subgraph\s+([A-Za-z_][\w-]*)\s+\((.+)\)\s*$/); + if (legacyParen) { + const [, indent, id, title] = legacyParen; + return `${indent}subgraph ${id}["${String(title).replace(/"/g, '\\"')}"]`; + } + + const bracketOnly = line.match(/^(\s*)subgraph\s+\[(.+)\]\s*$/); + if (bracketOnly) { + autoSubgraphId += 1; + const [, indent, rawTitle] = bracketOnly; + const trimmed = String(rawTitle).trim(); + const title = /^".*"$/.test(trimmed) ? trimmed : `"${trimmed.replace(/"/g, '\\"')}"`; + return `${indent}subgraph SG_AUTO_${autoSubgraphId}[${title}]`; + } + + const quoteOnly = line.match(/^(\s*)subgraph\s+"(.+)"\s*$/); + if (quoteOnly) { + autoSubgraphId += 1; + const [, indent, title] = quoteOnly; + return `${indent}subgraph SG_AUTO_${autoSubgraphId}["${String(title).replace(/"/g, '\\"')}"]`; + } + + return line; + }); + + return lines + .join('\n') + .replace(/subgraph\s+([A-Za-z_][\w-]*)\s+\(([^\n\)]*)\)/g, (_, id, title) => { + return `subgraph ${id}["${String(title).replace(/"/g, '\\"')}"]`; + }); + } + + function finalizeMermaidCode(rawText) { + const normalized = normalizeMermaidCode(rawText); + return fixLegacySubgraphSyntax(normalized); + } + + function getCodeFromEcLines(block) { + const lineNodes = block.querySelectorAll('.ec-line .code'); + if (!lineNodes.length) return ''; + return Array.from(lineNodes) + .map((node) => node.textContent || '') + .join('\n'); + } + + function getCodeFromCopyButton(block) { + const button = block.closest('.expressive-code')?.querySelector('.copy button[data-code]'); + return button?.dataset.code || ''; + } + + function extractMermaidSource(block) { + const fromEcLines = getCodeFromEcLines(block); + if (fromEcLines.trim()) return finalizeMermaidCode(fromEcLines); + + const fromCopy = getCodeFromCopyButton(block); + if (fromCopy.trim()) return finalizeMermaidCode(fromCopy); + + const codeNode = block.querySelector('code'); + const fallback = codeNode ? codeNode.textContent || codeNode.innerText || '' : ''; + return finalizeMermaidCode(fallback); + } + + function cleanupRenderedDiagrams() { + document.querySelectorAll(`.${RENDER_CLASS}[data-vr-mermaid="true"]`).forEach((node) => node.remove()); + document.querySelectorAll(SOURCE_SELECTOR).forEach((block) => { + const root = getSourceRoot(block); + root.classList.remove(HIDDEN_CLASS); + root.style.display = ''; + block.removeAttribute('data-vr-mermaid-rendered'); + }); + } + + function buildErrorFallback(message, source) { + const wrapper = document.createElement('div'); + wrapper.className = RENDER_CLASS; + wrapper.dataset.vrMermaid = 'true'; + wrapper.style.borderColor = 'rgba(239, 68, 68, 0.45)'; + + const title = document.createElement('div'); + title.textContent = `[mermaid] render failed: ${message}`; + title.style.cssText = 'color:#b91c1c;font-weight:600;margin-bottom:8px;'; + wrapper.appendChild(title); + + const pre = document.createElement('pre'); + pre.textContent = source; + pre.style.cssText = 'white-space:pre-wrap;word-break:break-word;max-height:320px;overflow:auto;margin:0;'; + wrapper.appendChild(pre); + + return wrapper; + } + + async function ensureMermaid() { + if (mermaidModule) return mermaidModule; + const mod = await import('https://cdn.jsdelivr.net/npm/mermaid@10.9.1/dist/mermaid.esm.min.mjs'); + mermaidModule = mod.default || mod; + return mermaidModule; + } + + async function doRender() { + console.log('[mermaid] init script', SCRIPT_VERSION); + const mermaid = await ensureMermaid(); + mermaid.initialize({ + startOnLoad: false, + securityLevel: 'loose', + theme: isDarkTheme() ? 'dark' : 'base', + }); + + cleanupRenderedDiagrams(); + const blocks = Array.from(document.querySelectorAll(SOURCE_SELECTOR)); + if (!blocks.length) return; + + console.log('[mermaid] Found', blocks.length, 'diagrams'); + + let ok = 0; + let failed = 0; + for (let index = 0; index < blocks.length; index += 1) { + const block = blocks[index]; + const sourceRoot = getSourceRoot(block); + const source = extractMermaidSource(block); + if (!source) continue; + + const wrapper = document.createElement('div'); + wrapper.className = RENDER_CLASS; + wrapper.dataset.vrMermaid = 'true'; + + const host = document.createElement('div'); + host.className = 'mermaid'; + host.textContent = source; + wrapper.appendChild(host); + sourceRoot.insertAdjacentElement('afterend', wrapper); + + try { + await mermaid.run({ nodes: [host] }); + sourceRoot.classList.add(HIDDEN_CLASS); + sourceRoot.style.display = 'none'; + block.dataset.vrMermaidRendered = 'true'; + ok += 1; + } catch (error) { + wrapper.remove(); + sourceRoot.classList.remove(HIDDEN_CLASS); + sourceRoot.style.display = ''; + const fallback = buildErrorFallback(error?.message || String(error), source); + sourceRoot.insertAdjacentElement('afterend', fallback); + console.warn(`[mermaid] Diagram ${index + 1} render failed:`, error?.message || error); + failed += 1; + } + } + + console.log('[mermaid] render done:', { ok, failed, total: blocks.length }); + } + + async function renderAllDiagrams() { + if (isRendering) { + needsRerender = true; + return; + } + + isRendering = true; + try { + do { + needsRerender = false; + await doRender(); + } while (needsRerender); + } catch (error) { + console.error('[mermaid] Load failed:', error); + } finally { + isRendering = false; + } + } + + function observeThemeChanges() { + if (window[THEME_OBSERVER_FLAG]) return; + + let themeTimer = null; + const observer = new MutationObserver((mutations) => { + for (const mutation of mutations) { + if (mutation.type === 'attributes' && mutation.attributeName === 'data-theme') { + if (themeTimer) clearTimeout(themeTimer); + themeTimer = setTimeout(() => { + renderAllDiagrams(); + }, 80); + break; + } + } + }); + + observer.observe(document.documentElement, { + attributes: true, + attributeFilter: ['data-theme'], + }); + + window[THEME_OBSERVER_FLAG] = observer; + } + + function bootMermaid() { + renderAllDiagrams(); + observeThemeChanges(); + } + + document.addEventListener('astro:after-swap', bootMermaid); + + if (document.readyState === 'loading') { + document.addEventListener('DOMContentLoaded', bootMermaid, { once: true }); + } else { + bootMermaid(); + } + + window.renderMermaidDiagrams = renderAllDiagrams; +})(); diff --git a/external/ai-research-ebook/src/assets/houston.webp b/external/ai-research-ebook/src/assets/houston.webp new file mode 100644 index 0000000000000000000000000000000000000000..930c164974ad8eb528878f15a98016249b8cf546 GIT binary patch literal 98506 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 b6~t;_wBcJ3AWgga7~Sz~izoKbpAY~5r|m$8 literal 0 HcmV?d00001 diff --git a/external/ai-research-ebook/src/assets/logo.svg b/external/ai-research-ebook/src/assets/logo.svg new file mode 100644 index 0000000..802ca61 --- /dev/null +++ b/external/ai-research-ebook/src/assets/logo.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/external/ai-research-ebook/src/content.config.ts b/external/ai-research-ebook/src/content.config.ts new file mode 100644 index 0000000..d9ee8c9 --- /dev/null +++ b/external/ai-research-ebook/src/content.config.ts @@ -0,0 +1,7 @@ +import { defineCollection } from 'astro:content'; +import { docsLoader } from '@astrojs/starlight/loaders'; +import { docsSchema } from '@astrojs/starlight/schema'; + +export const collections = { + docs: defineCollection({ loader: docsLoader(), schema: docsSchema() }), +}; diff --git a/external/ai-research-ebook/src/content/docs/code/agents.mdx b/external/ai-research-ebook/src/content/docs/code/agents.mdx new file mode 100644 index 0000000..fd20acc --- /dev/null +++ b/external/ai-research-ebook/src/content/docs/code/agents.mdx @@ -0,0 +1,609 @@ +--- +title: 多Agent框架 +description: LangChain、LlamaIndex、CrewAI、AutoGen 等多Agent框架对比 +sidebar: + order: 3 +--- + +import { Card, CardGrid } from '@astrojs/starlight/components'; + +## 1. 框架对比概览 + +当研究任务需要多个Agent协作时,选择合适的框架: + +| 框架 | 核心优势 | 研究用途 | GitHub | +|------|---------|---------|--------| +| **LangChain/LangGraph** | 复杂推理工作流,状态管理 | 多步骤文献分析、实验设计 | [langchain-ai](https://github.com/langchain-ai) | +| **LlamaIndex** | 知识库集成,RAG 优化 | 文档密集型研究、论文库查询 | [run-llama](https://github.com/run-llama) | +| **CrewAI** | 角色定义清晰,企业级 | 协作研究项目、团队模拟 | [crewAIInc](https://github.com/crewAIInc) | +| **Microsoft AutoGen** | 对话优先框架 | 讨论式研究、辩论式分析 | [microsoft/autogen](https://github.com/microsoft/autogen) | + +--- + +## 2. 选择决策树 + +```mermaid +flowchart TD + A(任务类型) --> B{需要复杂工作流?} + A --> C{需要知识库/RAG?} + A --> D{需要角色扮演?} + A --> E{需要并行协作?} + + B -->|是| F[LangGraph] + B -->|否| G[简单顺序执行] + + C -->|是| H[LlamaIndex] + D -->|是| I[CrewAI] + E -->|是| J[Agent Teams] +``` + +--- + +## 3. Claude Agent Teams + +### 3.1 核心能力 + +Agent Teams 让多个 Claude Code 会话并行协作: + +| 特性 | 说明 | +|------|------| +| **Team lead** | 负责拆解任务、分派、汇总 | +| **Teammates** | 独立执行,各自有上下文窗口 | +| **Delegate mode** | 队长只调度不实现,队友执行 | + +### 3.2 两种展示方式 + +| 模式 | 说明 | +|------|------| +| **In-process** | 都在同一个终端里跑(无需额外配置) | +| **Split panes** | 每个队友一个 pane(需要 tmux 或 iTerm2) | + +### 3.3 Agent Teams 四步法 + +1. **队长会话(Lead)先进入 Plan/Delegate**:先拆任务,不急着写代码 +2. 把任务拆成:可并行、低耦合、验收明确的子任务 +3. 每个子任务指定:输入、输出、验收(DoD) +4. 队友完成后,Lead 做集成、跑全套测试、开 PR + +### 3.4 Claude Code SDK 实战 + +```python +from claude_code import ClaudeAgent, TaskResult + +# 创建并行任务 +agents = [ + ClaudeAgent(name="Architect", role="架构设计"), + ClaudeAgent(name="Implementer", role="核心实现"), + ClaudeAgent(name="Tester", role="测试验证"), +] + +# 并行执行 +results = agent_team.run_parallel(agents, task="实现特征提取模块") +``` + +--- + +## 4. LangGraph 实战:科研状态机 + +```python +from typing import TypedDict, List, Optional +from langgraph.graph import StateGraph, END + +class ResearchState(TypedDict): + """研究流水线状态""" + topic: str # 研究主题 + papers: List[dict] # 论文列表 + analysis: str # 当前分析 + gaps: List[str] # 识别到的空白 + claims: List[str] # 候选主张 + evaluation: str # 评估结果 + +def search_papers(state: ResearchState) -> ResearchState: + """搜索相关论文""" + papers = elicit_search(state["topic"]) + return {"papers": papers} + +def analyze_papers(state: ResearchState) -> ResearchState: + """分析论文,提取关键信息""" + analysis = claude_analyze(state["papers"]) + return {"analysis": analysis} + +def extract_gaps(state: ResearchState) -> ResearchState: + """从分析中提取研究空白""" + gaps = identify_gaps(state["analysis"]) + return {"gaps": gaps} + +def generate_claims(state: ResearchState) -> ResearchState: + """基于空白生成可验证主张""" + claims = [] + for gap in state["gaps"]: + claim = formulate_claim(gap) + claims.append(claim) + return {"claims": claims} + +def evaluate_claims(state: ResearchState) -> ResearchState: + """评估主张质量""" + evaluation = gpt5_evaluate(state["claims"]) + return {"evaluation": evaluation} + +# 构建工作流 +workflow = StateGraph(ResearchState) +workflow.add_node("search", search_papers) +workflow.add_node("analyze", analyze_papers) +workflow.add_node("extract_gaps", extract_gaps) +workflow.add_node("generate_claims", generate_claims) +workflow.add_node("evaluate", evaluate_claims) + +# 定义边 +workflow.add_edge("search", "analyze") +workflow.add_edge("analyze", "extract_gaps") +workflow.add_edge("extract_gaps", "generate_claims") +workflow.add_edge("generate_claims", "evaluate") +workflow.add_edge("evaluate", END) + +app = workflow.compile() +``` + +--- + +## 5. CrewAI 研究团队配置 + +```python +from crewai import Agent, Task, Crew, Process + +# 1. 定义专业角色 +literature_reviewer = Agent( + role="文献综述专家", + goal="全面梳理指定领域的研究现状", + backstory="你是一位经验丰富的研究员,拥有10年AI领域研究经验。", + tools=[elicit_tool, semantic_scholar_tool], + verbose=True +) + +gap_analyst = Agent( + role="研究空白分析师", + goal="从现有研究中识别可探索的空白", + backstory="你擅长发现被忽视的研究方向。", + tools=[claude_tool], + verbose=True +) + +claim_validator = Agent( + role="主张验证专家", + goal="评估研究主张的可验证性和创新性", + backstory="你严格审查每一个科学主张。", + tools=[gpt_tool], + verbose=True +) + +# 2. 定义任务 +task_review = Task( + description="调研 {topic} 领域近3年的顶会论文,产出:1)研究地图;2)主流方法对比表;3)潜在空白清单", + expected_output="结构化的研究综述文档", + agent=literature_reviewer +) + +task_gap = Task( + description="基于文献综述,识别 {topic} 领域最值得探索的5个研究方向", + expected_output="研究空白分析报告", + agent=gap_analyst +) + +task_claim = Task( + description="将每个研究空白转化为可验证的科研主张", + expected_output="主张清单及详细说明", + agent=claim_validator +) + +# 3. 组建团队 +research_crew = Crew( + agents=[literature_reviewer, gap_analyst, claim_validator], + tasks=[task_review, task_gap, task_claim], + process=Process.sequential, + verbose=True, + memory=True +) + +result = research_crew.kickoff(inputs={"topic": "多模态学习"}) +``` + +--- + +## 6. AutoGen 对话式研究 + +```python +import autogen + +# 定义对话Agent +critic = autogen.AssistantAgent( + name="Critic", + system_message="""你是审稿人Agent,负责批判性分析。 + 质疑假设、找出漏洞、提出改进建议。 + 每次发言必须提出至少一个建设性批评。""" +) + +author = autogen.AssistantAgent( + name="Author", + system_message="""你是作者Agent,负责辩护和解释你的研究。 + 回应批评,补充论据,完善论点。""" +) + +# 启动对话 +critic.initiate_chat( + author, + message="请简要介绍你的研究主张,然后我会提出质疑。" +) +``` + +--- + +## 7. Ralph 循环:简单而强大的自治模式 + +### 7.1 核心原理 + +Ralph 循环通过简单的 bash 循环重复执行操作,直到任务成功: + +```bash +#!/usr/bin/env bash +set -euo pipefail + +MAX_ITERS="${MAX_ITERS:-25}" + +for i in $(seq 1 "$MAX_ITERS"); do + echo "=== Iteration $i/$MAX_ITERS ===" + cat PROMPT.md | claude -p "按PROMPT.md完成任务。必须跑 tests;失败要修到通过。" + ./scripts/test-fast.sh && ./scripts/lint.sh +done + +echo "Reached MAX_ITERS=$MAX_ITERS without passing. Stop." +exit 1 +``` + +### 7.2 关键技巧 + +| 技巧 | 说明 | +|------|------| +| **明确完成标准** | 定义可验证的完成条件(测试通过、无错误) | +| **小迭代原则** | 每轮迭代只处理少量任务 | +| **反馈循环** | 集成自动化检查确保每轮结果有效 | +| **安全限制** | 设置迭代次数上限(20-50次) | + +### 7.3 适用场景 + +| 适合 | 不适合 | +|------|--------| +| 可量化、可验证的任务 | 探索性任务 | +| 重构、写测试、文档化 | 主观设计 | +| 补测试、修复 Bug | 安全敏感代码 | + +--- + +## 8. 实战案例:16 个 Claude 写 C 编译器 + +### 8.1 实验概览 + +- **目标**:让 16 个 Claude 并行开发一个能编译 Linux 内核的 C 编译器 +- **成果**:两周内,近 2000 次会话,$2 万成本,10 万行代码 +- **支持架构**:x86、ARM、RISC-V + +### 8.2 成功的关键 + +1. **极高质量的测试体系**:引入成熟测试集,CI 强制要求新提交不破坏功能 +2. **站在 AI 视角设计系统**: + - 简化测试输出,结构化日志便于 AI 检索 + - 提供 `--fast` 模式只运行 1%-10% 测试子集 +3. **确保任务可拆分**:让每个智能体修复独立测试用例 +4. **利用并行实现角色分工**:性能优化、代码重构、文档维护 + +--- + +## 9. Everything Claude Code 项目 + +### 9.1 项目概览 + +| 项目 | 说明 | +|------|------| +| **创建者** | Anthropic 黑客松冠军 Affaan Mustafa | +| **定位** | 完整配置集合,将 Claude 升级为"虚拟开发团队" | +| **GitHub** | [affaan-m/everything-claude-code](https://github.com/affaan-m/everything-claude-code) | + +### 9.2 核心组件 + +| 组件 | 功能 | +|------|------| +| **Agents** | 规划、代码审查、安全检测、TDD 指导 | +| **Skills** | 工作流和领域经验封装 | +| **Commands** | 快速执行预定义流程 | +| **Rules** | 开发规范、测试覆盖率要求 | +| **Hooks** | 提交前检查、console.log 检测 | +| **MCP** | 外部工具连接 | + +### 9.3 实战效果 + +| 指标 | 提升 | +|------|------| +| 功能实现速度 | 65% | +| 代码问题减少 | 75% | +| 测试覆盖率 | 82% | +| 会话切换减少 | 70% | + +--- + +## 10. 多终端并行配置 + +### 10.1 tmux 工作流 + +```bash +# 安装 tmux (macOS) +brew install tmux + +# 配置文件 ~/.tmux.conf +set -g mouse on +bind-key C-d set -g mouse on + +# 一键启动多 AI 模型 +./start-ai-agents.sh +``` + +### 10.2 多模型同步控制 + +| 快捷键 | 功能 | +|--------|------| +| `Ctrl+b D` | 切换同步模式 | +| `Ctrl+b X` | 退出多窗口模式 | + +### 10.3 适用场景 + +- **同时对比**:Claude、Codex、Gemini、OpenCode +- **并行实现**:多个 worktree 同时推进 +- **多视角评审**:一个实现、一个审查、一个测试 + +--- + +## 11. 使用建议 + + + + + +不要过度设计,Claude Code 单实例足够处理大多数代码任务。 + + + + + +需要复杂分支时使用 LangGraph 或 Agent Teams。 + + + + + +论文库查询优先考虑 LlamaIndex。 + + + + + +需要角色扮演时使用 CrewAI。 + + + + + +--- + +## 12. Execution-Grounded Agent 实战要点 + +为了让多 Agent 真正用于科研而不只是"写建议",建议采用 execution-grounded 架构: + +1. **Idea Agent**:提出可执行改动(不是抽象口号) +2. **Patch Agent**:输出可应用的代码 diff +3. **Executor Agent**:在标准环境中自动训练/评测(含 GPU 资源调度) +4. **Feedback Agent**:回收 Wandb/日志结果,驱动下一轮搜索 + +### 12.1 两类标准化环境 + +| 环境 | 典型配置 | +|------|---------| +| **Post-training** | GRPO + MATH | +| **Pre-training** | nanoGPT + FineWeb | + +这种环境化设计的价值: +- 可以批量并行比较 idea,不依赖主观判断 +- 可以把"创新性"转化为"可执行且可复验"的工程流程 +- 可以把失败样本积累为后续搜索的先验约束 + +--- + +## 13. AI Scientist 系列脉络(补充) + +为避免把自动化科研理解成“单一框架”,这里补一条系列演进视角(来自 `AI research.md`): + +| 路线 | 核心特点 | 对工程落地的启发 | +|------|---------|------------------| +| **AI Scientist (早期)** | 自动生成 idea 与初步实验 | 适合快速探索,但执行闭环较弱 | +| **Execution-Grounded 路线** | 强调 patch/run/feedback 闭环 | 更适合做真实迭代与可复现实验 | +| **Narrative 路线(Idea2Story)** | 从想法到完整论文叙事 | 适合写作联动与产出打磨 | + +实操建议:把三条路线合成“探索 → 执行 → 叙事”的分层流程,而不是把某一个框架当万能解。 + +--- + +## 14. Book 实战增补(逐篇并入) + +> 本节并入 3 篇与多 Agent 协作强相关的文章,统一为"何时用团队协作、如何控成本、如何防跑偏"的实操框架。 + +### 14.1 1) Agent Swarm(蜂群)实战:从单助手到数字团队 + +#### 14.1.1 核心机制(可落地) + +1. **共享任务列表**:统一看板,便于并行认领和状态同步。 +2. **消息邮箱系统**:队员间可直接通信,减少 Lead 中转瓶颈。 +3. **独立上下文**:每个 Agent 独立窗口,避免大任务互相污染。 + +#### 14.1.2 六种典型玩法(按成熟度) + +- 新手:提示词里显式要求“尽可能拆分并行 + 尽可能调用 skill”。 +- 进阶:主模型统筹,便宜模型执行(文档/测试等)做成本分层。 +- 复用:优先搜索社区 skill,找不到再降级到本地或通用流程。 +- 降返工:先计划、后评审、再执行,卡住就回到计划阶段。 +- 大项目:Lead-Member 架构,分角色并行交付。 +- 深水区:Hooks/动态路由/Subagent Fork 等做质量与成本精调。 + +#### 14.1.3 详细步骤(从 0 开始跑 Swarm) + +1. 先写任务卡:目标、范围、交付物、验收标准(四项缺一不可)。 +2. 指定 Lead 只做拆解与验收,不直接写核心实现代码。 +3. 把任务拆成并行子任务(每个子任务都要有独立输入输出)。 +4. 要求每个成员用统一汇报模板:完成项 / 风险 / 下一步。 +5. Lead 在每个里程碑做一次冲突检查(文件冲突、接口冲突、依赖冲突)。 +6. 最后统一跑集成验证,再回到主分支合并。 + +#### 14.1.4 文章细节补充(Swarm 六玩法模板) + +##### 玩法1:新手并行提示模板 + +```text +调用 Agent Swarm 执行任务:<任务描述> +要求: +1) 尽可能拆分并行子任务 +2) 优先使用已安装 skills +3) 每个子任务输出“结果+风险+下一步” +``` + +##### 玩法2:跨模型协作(成本分层) + +- 复杂架构/核心逻辑:强模型; +- 文档/测试/样板代码:低成本模型; +- 最终合并与验收:回到主模型统一把关。 + +##### 玩法3:社区 Skill 复用 + +1. 先搜索可用 skill; +2. 匹配则直接调用; +3. 无匹配再降级到通用流程。 + +##### 玩法4:计划+评审循环 + +1. 先产 Todo 与依赖; +2. 评审 agent 指出遗漏与风险; +3. 评审通过后才并行执行。 + +##### 玩法5:Lead-Member 组织结构 + +- Lead:任务拆解、里程碑验收; +- Members:按角色并行实现; +- 里程碑结束统一集成。 + +##### 玩法6:高级功能组合 + +- Hooks 做质量门禁; +- 动态模型路由控成本; +- Subagent Fork 隔离上下文污染。 + +#### 14.1.5 实战摘录 + +> Swarm 不是"更会聊天",而是"可协作的生产组织"。核心收益来自任务拆解质量,而不是 agent 数量。 + +### 14.2 2) Agent Teams 团战模式:并行收益与协调成本 + +#### 14.2.1 适用/不适用边界 + +| 任务类型 | 建议 | +|---|---| +| 研究审查、多假设调试、跨层联动 | 优先 Agent Teams | +| 顺序任务、同文件高冲突、强依赖链 | 优先单会话或 Subagent | + +#### 14.2.2 启用与操作要点 + +```json +{ + "env": { + "CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS": "1" + } +} +``` + +- 启用后先定义:Lead 职责、队员分工、里程碑验收。 +- 明确要求:`Wait for teammates before proceeding`,避免 Lead 抢做。 +- 文件级分工防冲突:每个队员拥有独立文件集。 +- 控 token:团队规模与任务收益匹配,避免“并行过度”。 + +#### 14.2.3 详细步骤(Agent Teams 落地) + +1. 在 `settings.json` 打开 `CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1`。 +2. 重启会话,确认团队模式已可用(可看到 team/teammates 指令反馈)。 +3. 创建团队时先给角色定义:Lead、Frontend、Backend、Test、Docs。 +4. 给每个角色分配**不重叠文件域**,防止写冲突。 +5. 执行中每 20~30 分钟做一次状态同步:完成/阻塞/待协作。 +6. 收尾时执行“等待队员完成”策略,再统一集成测试。 + +#### 14.2.4 文章细节补充(Teams 全流程) + +1. 升级到支持 Teams 的版本(必要时先执行更新命令)。 +2. 在 `settings.json` 注入实验开关并重启会话。 +3. 选择显示模式(同进程或分屏),确认可观察到每个成员状态。 +4. 指定成员角色与模型,给每个成员写明 DoD(Definition of Done)。 +5. 启用委托模式,Lead 不直接写实现。 +6. 执行阶段每轮只推进一个里程碑,防止团队漂移。 +7. 全部成员完成后再统一回归测试与文档收口。 + +#### 14.2.5 限制说明(实操前必读) + +- 每会话仅一个团队; +- 不支持嵌套团队; +- 进程内成员恢复能力有限; +- 分屏依赖终端能力(tmux/iTerm2 等)。 + +### 14.3 3) 进阶实战(Skills/Subagents/MCP 组合) + +#### 14.3.1 组合原则 + +- **Skill**:固化团队规则与复用流程(先描述触发条件,后写具体动作)。 +- **Subagent**:把高噪声探索外包,主上下文只保留摘要结论。 +- **MCP**:把外部系统接入同一会话,减少标签页切换与复制粘贴。 + +#### 14.3.2 Subagent 设计建议 + +- 明确 `description` 与输出格式,避免“回传整段上下文”。 +- 只给必要工具权限(只读审查与可写实现分离)。 +- 推荐链路:Explore → Implementer → Tester,主代理只做整合与决策。 + +#### 14.3.3 详细步骤(Subagents + MCP 组合) + +1. 先定义 Explore 输出格式:只返回“文件路径 + 关键结论 + 风险点”。 +2. Implementer 仅接收结构化输入,不接收原始长对话。 +3. Tester 固定执行同一套测试清单,结果以表格返回。 +4. 主代理整合三者输出后,再调用 MCP 写回 issue/文档系统。 +5. 若发现信息漂移,回滚到 Explore 结果重建链路,不在末端硬修。 + +#### 14.3.4 文章细节补充(命令级落地) + +```bash +# 查看可用 subagents +/agents + +# 查看 MCP 连接 +/mcp + +# 示例:添加 HTTP MCP(按实际服务替换) +claude mcp add --transport http notion https://mcp.notion.com/mcp +``` + +1. 先建只读 `security-reviewer`,限制到 Read/Grep/Glob。 +2. 再建可写 implementer,明确只改指定目录。 +3. 所有 subagent 返回统一格式:`summary / changed_files / risks`。 +4. MCP 只接入本任务必要服务,避免权限过大。 + +#### 14.3.5 MCP 使用建议 + +- 优先接入:GitHub、Slack、DB、文档系统。 +- 第三方连接器先做安全评估(权限、日志、凭证范围)。 +- 通过 `/mcp` 定期盘点已加载连接,避免“隐式工具漂移”。 + +#### 14.3.6 常见坑与处理 + +- **坑1:并行太多导致 token 爆涨** → 限制活跃队员数量,优先高价值并行。 +- **坑2:成员写同一文件互相覆盖** → 启动前做文件分区。 +- **坑3:Lead 抢做实现导致协作失效** → 明确 Lead 只做调度与验收。 +- **坑4:总结过长污染主上下文** → 强制摘要长度与格式。 diff --git a/external/ai-research-ebook/src/content/docs/code/claude.mdx b/external/ai-research-ebook/src/content/docs/code/claude.mdx new file mode 100644 index 0000000..3b1d546 --- /dev/null +++ b/external/ai-research-ebook/src/content/docs/code/claude.mdx @@ -0,0 +1,684 @@ +--- +title: Claude Code +description: Claude Code 4.5/4.6 最佳实践,用于项目构建阶段 +sidebar: + order: 1 +--- + +## 1. Claude Opus 4.5/4.6 (2025年11月发布) + +### 1.1 核心能力 + +| 能力 | 数据 | 说明 | +|------|------|------| +| **SWE-bench Verified** | 80.9% | 领先业界的代码生成基准 | +| **上下文窗口** | 200K tokens | 64K token 输出限制 | +| **成本降低** | 67% | $5/$25 per million tokens | +| **tau2-bench-lite** | 88.9% | Agent 工具使用评估 | + +### 1.2 适用场景 + +Claude Code 适合项目的**构建阶段**,可以开两三个(甚至更多)并行推进。 + +目标:让执行文档里的任何**被真实跑通**,直到代码结构、实验入口、评测脚本都稳定。 + +--- + +## 2. 安装与快速上手 + +### 2.1 安装方式 + +```bash +# macOS / Linux / WSL +curl -fsSL https://claude.ai/install.sh | bash + +# Windows PowerShell +irm https://claude.ai/install.ps1 | iex + +# Windows CMD +curl -fsSL https://claude.ai/install.cmd -o install.cmd && install.cmd && del install.cmd +``` + +### 2.2 启动方式 + +```bash +cd your-project +claude +``` + +首次会提示登录。([Claude Code](https://code.claude.com/docs/en/overview)) + +--- + +## 3. 交互模式与快捷键 + +### 3.1 核心快捷键 + +| 快捷键 | 功能 | +|--------|------| +| `?` | 显示当前环境可用快捷键 | +| `Esc Esc` | 回退/总结(rewind / summarize) | +| `Shift+Tab` | 切换模式(普通 ↔ Plan ↔ Auto-accept ↔ Delegate) | +| `Ctrl+B` | 把运行中的任务后台化 | +| `Ctrl+T` | 显示/隐藏任务列表 | +| `Option/Alt + P` | 切换模型 | +| `Shift+Enter` | 多行输入 | + +### 3.2 内置斜杠命令 + +| 命令 | 功能 | +|------|------| +| `/clear` | 清空对话 | +| `/context` | 看上下文占用 | +| `/export [filename]` | 导出对话 | +| `/resume [session]` | 恢复历史会话 | +| `/rename ` | 重命名会话 | +| `/plan` | 进入 plan mode | +| `/rewind` | 回退代码/对话或总结 | +| `/doctor` | 安装健康检查 | +| `/debug [desc]` | 读 debug log 排查 | +| `/config` | 打开设置界面 | +| `/status` | 状态页 | +| `/permissions` | 权限规则 | +| `/model` | 选模型 | +| `/mcp` | 管 MCP 连接 | +| `/tasks` | 背景任务管理 | + +--- + +## 4. 权限模式与安全边界 + +### 4.1 四种模式 + +| 模式 | 能力 | 适用场景 | +|------|------|---------| +| **default** | 先问再做 | 日常稳妥开发 | +| **acceptEdits** | 自动允许文件编辑 | 你在旁边盯着、改动明确 | +| **plan** | 只读分析+出计划 | 需求澄清、方案评审、审计 | +| **delegate** | 只做 team 管理 | Agent Teams 并行协作时 | + +按 `Shift+Tab` 循环切换。 + +### 4.2 权限配置建议 + +在 `.claude/settings.json` 中配置: + +```json +{ + "permissions": { + "allow": ["npm run test *", "Bash(git status)"], + "deny": [".env", "secrets/**", "Bash(curl *)"] + } +} +``` + +--- + +## 5. 上下文管理 + +### 5.1 核心原则 + +**上下文再大也会被填满,可控上下文 = 可控质量。** + +### 5.2 工具对比 + +| 命令 | 功能 | 何时用 | +|------|------|--------| +| `/context` | 看上下文占用 | 判断是否该清理了 | +| `/clear` | 清掉对话但保留项目状态 | 任务切换、对话混乱 | +| `/export` | 导出关键对话 | 交接、复盘、团队沉淀 | +| `Esc Esc` / `/rewind` | 回退到之前状态 | 跑偏时回到正确轨道 | + +### 5.3 /catchup Skill 模板 + +```markdown +--- +name: catchup +description: Rebuild context after /clear by reading repo state +--- + +1) 运行并总结: +- git status +- git diff --stat +- git diff +- git log -n 20 --oneline + +2) 优先阅读: +- CLAUDE.md +- README / docs/ +- TODO.md / PLAN.md(如存在) + +3) 输出三段: +A. 当前仓库状态 +B. 当前目标与待办(按优先级) +C. 风险点与建议的下一步命令 +``` + +--- + +## 6. 项目记忆:CLAUDE.md + +### 6.1 必须包含的内容 + +> **CLAUDE.md 是智能体的"宪法",应保持简洁、聚焦高频使用场景和关键约束。** + +| 类别 | 内容示例 | +|------|---------| +| **项目启动** | `npm run dev` / `python main.py` | +| **测试运行** | `pytest tests/` / `npm test` | +| **代码风格** | `ruff check .` / `prettier --write` | +| **代码约束** | 禁止读取 secrets、单测必写 | +| **常见坑** | 数据路径用 pathlib、随机种子固定 | + +### 6.2 模板示例 + +```markdown +# 项目约定 + +## 启动命令 +- 开发: `npm run dev` +- 测试: `npm test` +- 构建: `npm run build` + +## 代码风格 +- Python: ruff format + ruff check +- 命名: snake_case 函数, PascalCase 类 + +## 常见坑 +- 数据路径必须用 pathlib +- 随机种子固定为 42 +- batch_size 先从 32 开始 + +## Debug 流程 +1. 复现 bug +2. 最小化用例 +3. 定位问题 +4. 修复 +5. 加测试 +``` + +--- + +## 7. Plan Mode 优先闭环 + +### 7.1 何时必须先 Plan + +- 影响架构、鉴权、支付、数据结构、跨模块重构 +- 需要写/改测试策略 +- 希望"一次性正确实现" + +### 7.2 标准三段式提示 + +```text +你先进入 /plan。 +1) 用要点列出:目标、非目标、约束(性能/兼容/安全)、验收标准。 +2) 给出分步实现计划(每步产出什么、改哪些文件)。 +3) 列出风险与回滚方案。 +等我确认后再开始编码实现。 +``` + +--- + +## 8. 权限与沙箱 + +### 8.1 沙箱模式 + +运行 `/sandbox` 打开菜单选择沙箱模式。 + +**WSL2 依赖安装:** +```bash +# Ubuntu/Debian +sudo apt-get install bubblewrap socat + +# Fedora +sudo dnf install bubblewrap socat +``` + +### 8.2 企业护栏策略 + +- **轻量提醒**:发现 `console.log` / debug flag → 提醒但不阻断 +- **强拦截**:提交时如果 tests 未过 → 阻止并要求修复 + +--- + +## 9. Skills:可复用工作流 + +### 9.1 Skills 是什么 + +Skills 把最佳实践固化成可调用、可共享、可组合的流程,解决"重复指导困境"。 + +### 9.2 存放位置 + +| 位置 | 说明 | +|------|------| +| 项目内 `.claude/skills/` | 团队共享 | +| `~/.claude/skills/` | 个人全局 | +| 插件内 `/skills/` | 插件分发 | + +### 9.3 推荐技能模板 + +#### 9.3.1 `/plan` - 强制计划 + +```markdown +--- +name: plan +description: Create an implementation plan with acceptance criteria +--- + +输出必须包含: +1) Goals / Non-goals / Constraints +2) Acceptance criteria(给出可运行命令) +3) Step-by-step plan +4) Risks + rollback +除非用户明确批准,否则不要写代码。 +``` + +#### 9.3.2 `/code-review` - 代码审查 + +```markdown +--- +name: code-review +description: Review current changes with a production checklist +--- + +执行: +- git diff +- git diff --stat + +按以下结构输出: +1) Correctness(边界/错误处理) +2) Security(输入校验/鉴权) +3) Tests(覆盖、缺失用例) +4) Performance(热点、N+1) +5) Maintainability(复杂度、命名) +最后给出"必须改/建议改/可不改"三类结论。 +``` + +#### 9.3.3 `/tdd` - 测试驱动 + +```markdown +--- +name: tdd +description: Apply a TDD workflow +--- + +1) 先写失败测试(说明为什么失败) +2) 再最小实现让测试通过 +3) 再重构(保持测试通过) +每一步都给出运行的测试命令与结果摘要。 +``` + +#### 9.3.4 `/pr` - PR 准备 + +```markdown +--- +name: pr +description: Prepare a PR: summarize changes, run checks +--- + +执行并总结: +- git status +- git diff --stat +- lint/test/build 命令 + +输出: +1) PR Title(50字内) +2) Summary(要点) +3) Testing(跑了什么) +4) Risk/rollback +``` + +--- + +## 10. Hooks:事件驱动自动化 + +### 10.1 Hooks 能做什么 + +Hooks 在关键节点自动执行或拦截操作: + +- 在 Claude 调用工具前/后 +- 在提交 prompt 时 +- 在会话开始/结束 +- 在 compact/子任务结束 + +### 10.2 推荐落地类型 + +| Hook 类型 | 功能 | 优先级 | +|----------|------|--------| +| **格式化** | 改完文件后自动跑 formatter | 高 | +| **测试** | 关键模块改动后自动跑测试 | 高 | +| **危险拦截** | 检测到 `curl | bash` 阻止 | 中 | +| **PR 质量** | 提交前检查 TODO/敏感信息 | 中 | +| **SessionStart** | 启动时加载项目环境 | 中 | + +### 10.3 Hooks vs Skills 对比 + +- **Skills**:告诉它"按步骤做事"(流程化) +- **Hooks**:保证"在关键节点一定发生"(自动化 + 强制) + +--- + +## 11. MCP:外部工具接入 + +### 11.1 推荐场景 + +| 场景 | 推荐程度 | +|------|---------| +| 访问外部系统数据(Notion/Jira/GitHub/DB) | ✅ 强推荐 | +| 有状态工具(Playwright) | ⚠️ 谨慎 | +| 所有内部 API 包进 MCP | ❌ 避免 | + +### 11.2 添加 MCP Server + +```bash +# HTTP 方式(推荐) +claude mcp add --transport http notion https://mcp.notion.com/mcp + +# SSE 方式(已废弃) +claude mcp add --transport sse asana https://mcp.asana.com/sse + +# 查看列表 +claude mcp list +``` + +### 11.3 核心 MCP 工具 + +| 工具 | 功能 | 适用场景 | +|------|------|---------| +| **Zotero-MCP** | 直接访问本地 Zotero 文献库 | 文献管理、引用分析 | +| **Perplexity MCP** | Deep Research 模式 | 技术调研、综述写作 | +| **ClickHouse MCP** | 数据库集成 | 大数据分析 | +| **GitHub MCP** | 仓库操作 | 版本控制自动化 | + +--- + +## 12. 最佳实践:团队协作模式 + +### 12.1 角色分工 + +| 角色 | 职责 | Claude 实例数 | +|------|------|--------------| +| Architect | 总体结构与接口设计 | 1-2 | +| Implementer | 核心模块实现 | 2-3 | +| Tester | 测试用例与评测 | 1-2 | +| Reviewer | Code review 与边界检查 | 1-2 | + +### 12.2 7天落地路线 + +| 天数 | 任务 | +|------|------| +| Day 1 | 编写简洁的 `CLAUDE.md` | +| Day 2 | 添加底线 `rules`(安全、测试) | +| Day 3 | 落地核心命令 `/plan` | +| Day 4 | 落地命令 `/code-review` | +| Day 5 | 添加提醒型 Hooks | +| Day 6 | 添加一致性 Hooks | +| Day 7 | 引入 Subagents | + +--- + +## 13. 下一步行动 + +1. 在项目里跑一次 `/init`,生成并精简 `CLAUDE.md` +2. 新建 `.claude/skills/`,把常用 Skills 复制进去 +3. 开始复杂任务前:先 `/plan`,确认后再实现 +4. 跑偏就 `Esc Esc` → rewind +5. 想减少弹窗就 `/sandbox` +6. 需要并行就用 Agent Teams + +--- + +## 14. Vibe 实战并集补充(融合版) + +> 本节把 `vibe/Vibe.md`、`vibe/Vibe Working.md`、`vibe/VIbe2.md` 的重合观点去重后并入当前章节,只保留与工程落地直接相关的增量。 + +### 14.1 高频共识(去重后) + +1. **Plan 先行**:复杂任务默认 `/plan`,先给验收标准再改代码。 +2. **上下文治理**:高频使用 `/context` + `/clear` + `/rewind`,避免会话污染。 +3. **流程资产化**:把重复动作沉淀为 skills / hooks / agents,而不是靠临场提示词。 +4. **结果导向**:以“可运行 + 可测试 + 可评审(PR)”作为完成标准。 + +### 14.2 团队落地的最小闭环 + +- **Day 1-2**:整理 `CLAUDE.md` + `settings.json`(定义底线约束) +- **Day 3-4**:落地 `/plan`、`/code-review` 两个核心 skill +- **Day 5-7**:接入提醒型 hooks,再逐步升级到一致性/阻断型 hooks + +这条路线的目标是先稳定质量,再追求并行规模。 + +--- + +## 15. Book 实战增补(逐篇并入) + +> 本节将 `book/` 中 5 篇与 Claude Code 直接相关的文章,按"教程正文 + 实战摘录"方式并入本章,重点保留可执行方法与避坑经验。 + +### 15.1 1) 470万阅读实战心得:先思考,再动手 + +#### 15.1.1 教程化整合 + +- 复杂任务默认先进入 Plan Mode(双击 `Shift + Tab`),先定架构与验收标准再写代码。 +- `CLAUDE.md` 要短、具体、可执行:优先写项目特有约束,而非常识性说明。 +- 指令要同时包含"做什么 + 为什么":让模型在边界场景做出更稳判断。 +- 上下文不要用满才清理:20%~40% 已可能出现质量退化,建议任务级会话拆分。 +- 使用外部记忆文件(如 `plan.md`、`SCRATCHPAD.md`)承接跨会话进度。 + +#### 15.1.2 可执行清单 + +1. 每次复杂需求先写 5~10 行目标与非目标。 +2. 运行一次 `/plan` 或 Plan Mode 输出分步方案。 +3. 将重复纠错项沉淀到 `CLAUDE.md`(按 `#` 快捷更新)。 +4. 对话跑偏时使用 `/compact` → `/clear` → 粘贴关键上下文重启。 + +#### 15.1.3 详细步骤(避免"云里雾里") + +1. 新建 `plan.md`,固定写 4 行:目标 / 非目标 / 输入 / 验收。 +2. 进入 Plan Mode 后要求输出:文件列表 + 变更顺序 + 测试命令。 +3. 若计划中有"可选增强",先全部标记为不做,只保留 MVP。 +4. 执行中每完成一个子任务,在 `plan.md` 写"已完成 + 证据链接"。 +5. 出现循环修复两次以上,立即停下执行 `/clear`,重开会话重述任务。 + +#### 15.1.4 实战摘录 + +> 如果同一问题解释三次仍跑偏,优先换会话或换问题建模方式,而不是继续加长提示词。 + +#### 15.1.5 文章细节补充(保留原文有效动作) + +- **CLAUDE.md 四原则**:短、具体、解释原因、持续更新。 +- **上下文治理动作**:限定单任务会话、外部记忆文件、`/compact` 摘要、`/clear` 重启。 +- **Prompt 质量三要素**:具体目标、明确禁做项、业务原因说明。 +- **卡住时四步修复**:清会话 → 拆小任务 → 给最小示例 → 换建模角度(如状态机)。 + +#### 15.1.6 可复制提示词模板 + +```text +请先进入规划模式,不要立即编码。 +目标:<目标> +约束:<技术栈/目录/边界> +禁止事项:<不允许新增抽象/不允许改动模块> +验收标准:<测试命令 + 通过条件> +输出:按步骤计划(每步含输入、输出、风险) +``` + +### 15.2 2) 资深工程师完全指南:把 Claude 变成系统组件 + +#### 15.2.1 教程化整合 + +- 把 Claude Code 从"问答工具"升级为"工程系统部件":支持脚本化、日志化、可审计。 +- 模型协作建议:架构与关键决策用强模型,日常实现用高性价比模型。 +- 推荐在常见任务上沉淀 Slash Commands,减少重复 prompt 编写成本。 +- 借助 Hooks/MCP 做前后置检查,把质量控制前移到流程节点。 + +#### 15.2.2 可执行清单 + +- 对高风险模块启用强制检查:安全、权限、数据一致性。 +- 复用无头执行:`claude -p "任务描述"` 集成到脚本或 CI。 +- 每周回顾一次“失败任务日志”,更新 `CLAUDE.md` 与命令模板。 + +#### 15.2.3 详细步骤(系统化落地) + +1. 把高频任务抽成命令:`/commands/review.md`、`/commands/debug.md`。 +2. 在 CI 中增加 `claude -p` 的只读审查任务(不直接写仓库)。 +3. 每次失败记录三件事:触发条件、错误表现、修复动作。 +4. 每周挑 3 条重复问题,更新 `CLAUDE.md` 的"禁止/必须"规则。 + +#### 15.2.4 文章细节补充(系统化飞轮) + +- **飞轮机制**:错误发生 → 查看日志 → 改 CLAUDE.md/命令模板 → 下次更稳。 +- **模型分工建议**:复杂架构和疑难排查用强模型,常规实现用高性价比模型。 +- **会话切换信号**:当问题定义已变,优先新会话,不在旧上下文强行续写。 + +#### 15.2.5 推荐命令清单 + +```bash +# 无头运行(脚本/CI) +claude -p "审查当前改动的安全风险,给出按严重级别排序结果" + +# 继续历史会话 +claude --continue + +# 选择历史会话 +claude --resume +``` + +### 15.3 3) 31个效率技巧:从快捷键到自动化分层使用 + +#### 15.3.1 教程化整合 + +将 31 个技巧收敛为 5 层能力: + +| 层级 | 代表能力 | 关键命令/动作 | +|---|---|---| +| 启动层 | 建立项目记忆 | `/init`、Memory Updates | +| 交互层 | 快速上下文与命令执行 | `@文件`、`! bash`、`Esc Esc` | +| 会话层 | 恢复、命名、导出 | `claude --continue`、`/export` | +| 安全层 | 权限控制与审计 | `/sandbox`、Hooks | +| 自动化层 | 流水线复用 | `claude -p`、Commands、Skills、Subagents | + +#### 15.3.2 可执行清单 + +- 把高频动作固化成 `/commands`; +- 复杂任务统一走 Plan + Review; +- 批处理任务优先转为 `-p` 无头流程。 + +#### 15.3.3 详细步骤(31 技巧落地顺序) + +1. 第一周只上手 6 个:`/init`、`@`、`!`、`Esc Esc`、`/context`、`/sandbox`。 +2. 第二周新增 5 个:`/export`、`/stats`、`/usage`、`/statusline`、`/commands`。 +3. 第三周再启用自动化能力:Hooks、Subagents、Headless。 +4. 每新增一个能力,记录"触发条件 + 不适用场景",避免误用。 + +#### 15.3.4 文章细节补充(关键技巧分组) + +| 目标 | 技巧组合 | 典型收益 | +|---|---|---| +| 快速拿上下文 | `@文件/目录` + `!命令` | 减少切终端/复制粘贴 | +| 快速回滚 | `Esc Esc` + 会话恢复 | 降低试错成本 | +| 长任务续航 | 命名会话 + `/export` | 可追踪、可交接 | +| 自动质检 | Hooks + `/sandbox` | 提前阻断风险变更 | +| 流水线复用 | Commands + Headless | 把经验固化为资产 | + +#### 15.3.5 新手执行顺序(详细) + +1. 先学「上下文与回滚」(`@`、`!`、`Esc Esc`)。 +2. 再学「计划与安全」(Plan Mode、`/sandbox`、Hooks)。 +3. 最后学「规模化」(Subagents、Headless、插件体系)。 + +### 15.4 4) Code Simplifier:把"能跑"整理成"可维护" + +#### 15.4.1 教程化整合 + +- `code-simplifier` 定位是"语义不变的结构优化":改写法,不改行为。 +- 与 `ESLint/Prettier` 互补:后者做格式,前者做可读性与结构简化。 +- 特别适合 AI 快速生成后的清理阶段:先生成,再简化,再测试。 + +#### 15.4.2 可执行清单 + +```bash +claude plugin install code-simplifier +# 或会话内 +/plugin marketplace update claude-plugins-official +/plugin install code-simplifier +``` + +- 在 `CLAUDE.md` 明确导入、命名、类型、函数风格,供 simplifier 遵循。 +- 建议在 PR 前固定跑一次,结合 `git diff` 做人工复核。 + +#### 15.4.3 详细步骤(PR 前整理标准流程) + +1. 功能实现完成后先跑测试,确保"当前代码可用"。 +2. 执行 `code-simplifier` 做结构整理。 +3. 立刻跑同一套测试,确认整理后行为不变。 +4. 打开 `git diff`,重点审查:边界判断、异常路径、公共接口。 +5. 通过后再进入 Code Review,避免把"脏代码"交给审查环节。 + +#### 15.4.4 文章细节补充(工具对比与定位) + +| 工具 | 擅长 | 不擅长 | +|---|---|---| +| ESLint/Prettier | 语法与格式统一 | 语义级简化 | +| Code Simplifier | 可读性、结构化重写 | 规则化格式细节 | +| 人工 Review | 业务语义与架构判断 | 高重复清理劳动 | + +#### 15.4.5 使用场景建议 + +- 长时间编码后清理; +- 大重构后整理; +- AI 生成代码后做第一轮“去噪”; +- 提交 PR 前统一风格并减少理解负担。 + +### 15.5 5) 非技术用户落地指南:安装、配置与工作流心法 + +#### 15.5.1 教程化整合 + +- 非技术用户最容易卡在 API 配置,而不是功能使用。 +- 推荐"先可用,再优化"路径:先连上一个稳定模型,再逐步引入 Skills/MCP。 +- 将复杂配置 GUI 化(如 API 切换器),可显著降低误配置概率。 +- 工具使用的核心不是"会命令",而是"能给清晰输入并持续迭代"。 + +#### 15.5.2 可执行清单 + +1. 安装 Claude Code(Mac/Windows)后先跑一个最小任务验证闭环。 +2. 选定一个主模型通道(国产直连或第三方中转)并完成健康检查。 +3. 使用四步法:定义问题 → 方案探索 → 计划确认 → 执行迭代。 +4. 每完成一个阶段,把关键结论写入文档,防止上下文丢失。 + +#### 15.5.3 详细步骤(从 0 到可用) + +```bash +# macOS / Linux +curl -fsSL https://claude.ai/install.sh | bash + +# Windows PowerShell +irm https://claude.ai/install.ps1 | iex +``` + +1. 安装后执行 `claude`,完成登录与首轮环境检查。 +2. 先做一个最小任务:例如"读取当前目录并总结项目结构"。 +3. 配置 API 通道后做健康检查:固定 3 个测试 prompt(速度/格式/稳定)。 +4. 用四步工作流跑一个小任务(如批量重命名)验证完整闭环。 +5. 将成功流程写入 `CLAUDE.md`,后续直接复用。 + +#### 15.5.4 文章细节补充(安装与配置路线) + +##### 15.5.4.1 A. 安装路线 + +- macOS/Linux:脚本安装; +- Windows:PowerShell 安装; +- 若脚本受限,再退回 `npm` 安装方案。 + +##### 15.5.4.2 B. API 路线 + +1. **国产模型直连**:稳定、低成本、上手快; +2. **第三方中转**:接近原模型体验,需关注服务稳定性; +3. **多源备份**:至少准备 2 个可切换通道,防止单点中断。 + +##### 15.5.4.3 C. 常见卡点排查 + +- 安装成功但命令不可用:重开终端并检查 PATH。 +- 模型无响应:先跑最小 prompt 验证网络与 key。 +- 会话表现忽好忽坏:检查上下文是否过载,必要时重启会话。 + +#### 15.5.5 实战摘录 + +> 普通用户的门槛不是编程语法,而是把模糊需求转成可执行目标与验收条件。 diff --git a/external/ai-research-ebook/src/content/docs/code/gpt.mdx b/external/ai-research-ebook/src/content/docs/code/gpt.mdx new file mode 100644 index 0000000..c0791b7 --- /dev/null +++ b/external/ai-research-ebook/src/content/docs/code/gpt.mdx @@ -0,0 +1,388 @@ +--- +title: GPT-5.2 系列 +description: GPT-5.2 系列(Instant/Thinking/Pro)在科研中的使用 +sidebar: + order: 2 +--- + +import { Card, CardGrid } from '@astrojs/starlight/components'; + +## 1. GPT-5.2 系列概览 + +GPT-5.2 系列(2025年12月发布)适合做**细节 review**和**深度分析**。 + +### 1.1 模型选择矩阵 + +| 模型 | 特点 | 适用场景 | 定价 | +|------|------|---------|------| +| **GPT-5.2 Instant** | 快速响应,延迟低 | 日常代码辅助、快速问答 | 低 | +| **GPT-5.2 Thinking** | 深度推理,复杂分析 | 复杂问题分析、算法设计 | 中 | +| **GPT-5.2 Pro** | 最强专业版 | 关键代码审查、论文评审 | 高 | + +--- + +## 2. 核心能力 + +### 2.1 基准测试 + +| 能力 | 数据 | 说明 | +|------|------|------| +| **ARC-AGI-1** | 90%+ | 首次突破 90% 通用推理基准 | +| **知识截止** | 2025年8月 | 支持最新研究成果 | +| **长上下文** | 1M+ tokens | 支持大型文档分析 | + +--- + +## 3. GPT-5.3-Codex 核心升级 + +### 3.1 核心特性 + +| 特性 | 数据 | 说明 | +|------|------|------| +| **自我参与开发** | - | 早期版本加速自身开发 | +| **速度提升** | 25%+ | 比前代快 25% | +| **Token 减半** | 50% | 相同任务所需 token 减半 | +| **训练速度** | 4x | 训练速度提升 4 倍 | + +### 3.2 性能优势 + +| 基准 | 得分 | 说明 | +|------|------|------| +| **Terminal-Bench 2.0** | 77.3% | 智能体编码领先 | +| **OSWorld** | 64.7% | 桌面自动化领先 | +| **网络安全** | High 级别 | OpenAI 首个获评 | + +--- + +## 4. Claude Opus 4.6 vs GPT-5.3-Codex + +### 4.1 核心对比 + +| 维度 | Claude Opus 4.6 | GPT-5.3-Codex | +|------|-----------------|---------------| +| **上下文窗口** | 100万 tokens (Beta) | 400K tokens | +| **复杂知识工作** | 更强 | 稍弱 | +| **自主编码任务** | 稍弱 | 更强 | +| **发展方向** | 广度(多智能体、Office) | 深度(效率、交互性) | + +### 4.2 适用场景选择 + + + + + +- 需要处理大型代码库 +- 多智能体协作任务 +- 需要 Office 集成 +- 复杂知识工作 + + + + + +- 追求极致的编码效率 +- 需要快速迭代 +- 交互式引导需求 +- 自主编码和自动化任务 + + + + + +--- + +## 5. 科研使用场景 + +

+ + + +验证代码接口设计是否一致,避免隐藏的 API 变更。 + + + + + + +检查实验设置是否公平,baseline 对比是否合理。 + + + + + + +发现数据泄漏、指标计算错误等隐蔽问题。 + + + + + + +代码审查,发现潜在边界条件和异常情况。 + + + + + + +确保评测脚本正确实现,无实现偏差。 + + + + + + +独立复现核心实验,验证结果可复现性。 + + + + +
+ +--- + +## 6. 与 Claude 的配合策略 + +```mermaid +flowchart TD + subgraph 研究流程 + A(Idea 生成) --> B(项目设计) + B --> C(代码实现) + C --> D(实验验证) + D --> E(论文写作) + end + + subgraph 工具分工 + F(Claude Opus 4.6) --> A + G(Claude Code 2.0) --> C + H(GPT-5.2 Pro) --> D + I(GPT-5.2 Instant) --> F + end +``` + +| 任务 | 推荐工具 | 理由 | +|------|---------|------| +| 项目架构设计 | Claude Opus 4.6 | 长上下文,200K tokens | +| 代码实现 | Claude Code 2.0 | SWE-bench 80.9% | +| 细节审查 | GPT-5.2 Pro | ARC-AGI 90%+,深度推理 | +| 快速问答 | GPT-5.2 Instant | 响应速度快 | +| 漏洞检测 | GPT-5.2 Thinking | 深度推理能力 | +| 文献调研 | Claude + Elicit | 自动化综述能力 | + +--- + +## 7. 项目文档生成流程 + +### 7.1 步骤 1: 生成项目基准文档 + +将 idea 交给 GPT Pro/Thinking,让其生成可用的项目文档: + +```markdown +# 项目基准文档模板 + +## 0. 一页速览(30秒读懂) +[核心问题 + 核心贡献] + +## 1. 研究问题与动机(Problem Statement) +- 解决什么问题? +- 为什么这个问题重要? + +## 2. 相关工作地图(Related Work Map) +- 领域分类 +- 主要方法 +- 你的定位 + +## 3. 核心研究假设与可验证主张(Claims) +- Claim 1: [必须对应实验] +- Claim 2: [必须对应实验] + +## 4. 形式化(Problem Formulation) +[数学形式化] + +## 5. 系统设计(System Architecture) +[架构图 + 模块说明] + +## 6. 学习目标(Learning Objective) +[损失函数 + 优化目标] + +## 7. 实验与评测(Experiments) +- 主实验 +- 消融实验 +- 压力测试 + +## 8. 预期贡献(Expected Outcome) +- 论文贡献点 +- 潜在影响 + +## 9. 风险与备选(Risks & Alternatives) +- 最大风险 +- Plan B +``` + +### 7.2 步骤 2: 人工 Review + +- 主要看"claim-实验对齐" +- baseline 是否足够强 +- 是否有致命假设 + +**关键问题**: +- 哪些段落最容易被审稿人抓住? +- 哪些实验设计不够严谨? +- 哪些 claim 缺证据? + +### 7.3 步骤 3: 生成执行文档 + +再次交给 GPT Pro/Thinking,生成专门给 Claude Code 用的**执行文档**(更偏工程步骤与任务拆分)。 + +### 7.4 步骤 4: 迭代到稳定 + +用这种方式迭代到文档稳定为止。 + +--- + +## 8. Scitex:自动化科研平台 + +### 8.1 核心功能 + +| 功能 | 说明 | +|------|------| +| **合成数据生成** | 根据假设自动生成符合统计规律的合成数据 | +| **统计分析** | 自动完成 ANOVA、效应量计算 | +| **可视化** | 生成出版级图表(箱线图、散点图) | +| **论文撰写** | LaTeX 模板自动填充 | +| **同行评审** | AI 模拟审稿人,自动生成 Rebuttal | + +### 8.2 工作流程 + +```mermaid +flowchart LR + A(研究假设) --> B(合成数据) + B --> C(统计分析) + C --> D(可视化) + D --> E(论文撰写) + E --> F(AI 评审) + F --> G(自动修订) +``` + +### 8.3 适用场景 + +- 快速原型验证(合成数据验证假设) +- 人机协作科研 +- 教育与实践培训 + +--- + +## 最佳实践 + +
+ + + +**GPT-5.2 核心优势**:深度推理能力,特别适合发现隐藏假设和逻辑漏洞。 + + + + +
+ +### 9.1 使用建议 + +1. **不要用它写代码**:Claude Code 在代码任务上更强 +2. **用它做审查**:让它找 bug、提质疑 +3. **用它做分析**:让它分析论文、发现逻辑问题 +4. **多用它的 Thinking 模式**:深度推理输出更可靠 + +--- + +## 10. Book 实战增补(逐篇并入) + +### 10.1 Kimi-K2.5 免费通道:作为 GPT/Claude 之外的成本缓冲层 + +这部分整合自 `book/土豪英伟达_Kimi_K2_5_免费用_API_支持OpenCode.md`,核心价值不是“替代一切”,而是给工作流增加一条**低成本可切换通道**。 + +#### 10.1.1 实操配置要点 + +- 平台:NVIDIA Build(注册后获取 API Key)。 +- Base URL:`https://integrate.api.nvidia.com/v1` +- Model ID:`moonshotai/kimi-k2.5` + +#### 10.1.2 推荐使用策略 + +| 任务类型 | 建议模型层 | +|---|---| +| 快速草稿、批量改写、低风险总结 | Kimi-K2.5(成本优先) | +| 高风险技术决策、关键代码审查 | GPT/Claude 强模型(质量优先) | +| 大批量流水任务 | Kimi 先跑,再用强模型抽检 | + +#### 10.1.3 接入清单 + +1. 在平台获取 `API Key` 并保存。 +2. 在客户端填入 `base-url + model-id + key`。 +3. 用 3 个固定测试 prompt 做烟雾测试(速度、稳定性、格式)。 +4. 把它加入模型路由规则,作为“降本 fallback”。 + +#### 10.1.4 详细步骤(可直接执行) + +1. 进入 NVIDIA Build 平台创建 key,并记录创建时间与配额说明。 +2. 在工具侧新增供应商: + - `base_url`: `https://integrate.api.nvidia.com/v1` + - `model`: `moonshotai/kimi-k2.5` + - `api_key`: `<你的key>` +3. 运行三条基准提示词: + - 摘要任务(看压缩质量) + - 结构化输出(看 JSON 稳定性) + - 长文本改写(看一致性) +4. 记录延迟、失败率、输出格式稳定性,写入模型路由文档。 +5. 配置“降级策略”:主模型失败时自动回退到 Kimi。 + +#### 最小验证脚本(示意) + +```bash +curl -sS https://integrate.api.nvidia.com/v1/chat/completions \ + -H "Authorization: Bearer $NVIDIA_API_KEY" \ + -H "Content-Type: application/json" \ + -d '{ + "model": "moonshotai/kimi-k2.5", + "messages": [{"role":"user","content":"用三点总结RAG评测重点"}], + "temperature": 0.2 + }' +``` + +#### 10.1.5 文章细节补充(按原文落地) + +##### 10.1.5.1 A. 账号与密钥准备 + +1. 访问 NVIDIA Build 开发者平台并完成注册。 +2. 在控制台创建 API Key,创建后立即复制保存。 +3. 记录模型标识与基座 URL,后续统一写入配置中心。 + +##### 10.1.5.2 B. 在多工具中的统一接入 + +- **OpenCode/Coding CLI**:新增一个可切换模型配置项; +- **笔记或写作工具(如 Copilot 类)**:复用同一套 key/base/model; +- **脚本任务**:通过环境变量统一注入,减少散落配置。 + +建议新增一个 `models.md`(或等价配置文件)记录: + +- 供应商名称 +- base URL +- model ID +- 适用任务 +- 失败回退路径 + +##### 10.1.5.3 C. 三段式验证(避免上线即翻车) + +1. **连通性验证**:确认接口可通、响应码正常; +2. **能力验证**:固定三组任务评估质量(摘要、结构化、长改写); +3. **稳定性验证**:连续跑 20~50 次,观察超时与格式漂移。 + +##### 10.1.5.4 D. 故障回退策略(建议默认开启) + +- 主模型失败(超时/限流)→ 自动切 Kimi; +- Kimi 输出不满足格式约束 → 再交给主模型做最终规范化; +- 两者都失败 → 返回可重试错误而不是静默空结果。 + +#### 10.1.6 风险提示 + +- 免费额度/策略可能变化,生产任务需保留备选供应商。 +- 同一任务跨模型切换时,需明确输出格式与验收标准,避免结果漂移。 diff --git a/external/ai-research-ebook/src/content/docs/figures/comparison.mdx b/external/ai-research-ebook/src/content/docs/figures/comparison.mdx new file mode 100644 index 0000000..6c96326 --- /dev/null +++ b/external/ai-research-ebook/src/content/docs/figures/comparison.mdx @@ -0,0 +1,142 @@ +--- +title: 专业绘图对比 +description: 主流专业绘图工具对比分析 +sidebar: + order: 2 +--- + +## 1. 论文图表类型清单 + +从几千篇论文里提取"表达强"的图,按类型建一个参考库: + +### 1.1 方法结构图 (Architecture) + +- 整体系统架构 +- 模块关系 +- 数据流向 + +### 1.2 流程图 (Pipeline) + +- 训练流程 +- 推理流程 +- 数据处理流程 + +### 1.3 训练/推理示意图 + +- 算法步骤可视化 +- 时序关系 + +### 1.4 主结果表 + 消融图 + +- 对比实验表格 +- 消融研究图表 + +### 1.5 失败案例可视化 + +- 边界情况 +- 错误分析 + +--- + +## 2. 工具详细对比 + +### 2.1 Mermaid.js + +**优点**: +- 纯文本语法,易于版本控制 +- 支持多种图表类型 +- GitHub/GitLab 原生支持 + +**缺点**: +- 定制能力有限 +- 复杂图表难以实现 + +**代码示例**: + +```mermaid +graph TD + A(输入数据) --> B(特征提取) + B --> C{决策} + C -->|条件1| D(路径1) + C -->|条件2| E(路径2) + D --> F(输出) + E --> F + + +``` + +--- + +### 2.2 PlantUML + +**优点**: +- UML 标准化 +- 支持时序图、用例图等 +- 文本驱动,易于维护 + +**缺点**: +- 学习曲线较陡 +- 主要针对 UML 场景 + +--- + +### 2.3 D3.js + +**优点**: +- 高度可定制 +- 支持复杂交互 +- 强大的数据绑定能力 + +**缺点**: +- 学习成本高 +- 开发时间长 + +**适用场景**: 创新性的数据可视化,需要展示论文的独特洞见 + +--- + +### 2.4 draw.io + +**优点**: +- 完全免费 +- 支持 Git 集成 +- 丰富的图形库 + +**缺点**: +- 大型项目性能下降 +- 协作功能不如 Figma + +--- + +### 2.5 Figma + +**优点**: +- 专业级设计工具 +- 实时协作 +- 强大的组件系统 + +**缺点**: +- 需要学习成本 +- 免费版有功能限制 + +**适用场景**: 高质量插图,特别是需要多人协作时 + +--- + +## 3. 推荐工作流 + +### 3.1 阶段1: 快速原型 + +使用 **draw.io** 或 **Mermaid.js** 快速搭建图表框架 + +### 3.2 阶段2: 精细化 + +对于关键图表,使用 **Figma** 进行精细化设计 + +### 3.3 阶段3: 代码生成 + +对于数据可视化,使用 **D3.js** 或 **Python (matplotlib/plotly)** + +### 3.4 阶段4: 整合 + +使用 **PPT** 或 **Figma** 进行最终整合 diff --git a/external/ai-research-ebook/src/content/docs/figures/design.mdx b/external/ai-research-ebook/src/content/docs/figures/design.mdx new file mode 100644 index 0000000..546421f --- /dev/null +++ b/external/ai-research-ebook/src/content/docs/figures/design.mdx @@ -0,0 +1,160 @@ +--- +title: 图表设计规范 +description: 学术论文图表的视觉语言和设计规范 +sidebar: + order: 3 +--- + +## 1. 图表设计规范 + +选定视觉语言后要定规范(否则全篇风格会散) + +--- + +## 2. 配色方案 + +### 2.1 原则 + +**颜色尽量少**(论文更稳),强调用粗细/虚实区分 + +### 2.2 推荐配色 + +| 用途 | 颜色 | HEX | +|------|------|-----| +| 主色 | 蓝色 | #3B82F6 | +| 强调色 | 橙色 | #F97316 | +| 辅助色 | 绿色 | #10B981 | +| 中性色 | 灰色 | #6B7280 | + +### 2.3 顶会配色参考 + +| 会议 | 主色调 | 特点 | +|------|--------|------| +| NeurIPS | 蓝色系 | 专业、冷静 | +| ICML | 紫色系 | 学术、严谨 | +| ICLR | 橙色系 | 活力、创新 | +| CVPR | 蓝绿色系 | 视觉、科技 | + +--- + +## 3. 字体选择 + +### 3.1 英文字体 + +| 字体 | 适用场景 | 特点 | +|------|---------|------| +| Arial | 通用 | 安全、清晰 | +| Helvetica | 标题 | 专业、现代 | +| Times New Roman | 正文 | 传统、学术 | + +### 3.2 中文字体 + +| 字体 | 适用场景 | 特点 | +|------|---------|------| +| 宋体 | 正文 | 传统、正式 | +| 黑体 | 标题 | 现代、清晰 | + +### 3.3 统一原则 + +- 全篇使用**同一字体族** +- 图表字体与正文保持一致 +- 避免超过3种字体 + +--- + +## 4. 线条规范 + +### 4.1 线宽规范 + +| 用途 | 线宽 | 样式 | +|------|------|------| +| 主要边界 | 2px | 实线 | +| 次要边界 | 1px | 实线 | +| 辅助线 | 0.5px | 虚线 | +| 数据流 | 1.5px | 箭头线 | + +### 4.2 箭头样式 + +- 实心箭头:主要数据流 +- 空心箭头:辅助关系 +- 无箭头:包含关系 + +--- + +## 5. 标注规范 + +### 5.1 图例 + +- 放置位置:右上角或底部 +- 字体:比正文小1-2号 +- 边框:可选,保持简洁 + +### 5.2 说明文字 + +- 字体大小:不小于8pt(确保印刷可读) +- 颜色:与主色调一致 +- 对齐:左对齐,便于阅读 + +--- + +## 6. 尺寸规范 + +### 6.1 期刊/会议要求 + +| 类型 | 单栏 | 双栏 | +|------|------|------| +| 宽度 | 3.5英寸 | 7英寸 | +| 分辨率 | 300 DPI | 300 DPI | +| 格式 | PDF/EPS | PDF/EPS | + +### 6.2 保持可读性 + +- 文字不小于8pt +- 线条不小于0.5pt +- 标注与元素留足够间距 + +--- + +## 7. 常见错误 + +### 7.1 ❌ 错误示范 + +- 颜色过多(超过5种) +- 字体不一致 +- 线条粗细不统一 +- 箭头样式混乱 +- 标注过小难以阅读 + +### 7.2 ✅ 正确示范 + +- 使用2-3种主色 +- 统一字体和字号 +- 线条规范统一 +- 箭头清晰一致 +- 标注清晰易读 + +--- + +## 8. GPT 辅助流程 + +1. GPT 根据论文 + 参考图生成: + - "图的元素清单"(模块/箭头/标注) + - "布局草案"(从左到右还是从上到下) + - "提示词"(给绘图工具出初版草图) + +2. 最后用 PPT/Figma 统一绘制与整合 + +### 8.1 提示词模板 + +``` +请为以下论文内容设计一张架构图,遵循学术规范: + +[论文内容] + +要求: +1. 元素清单:列出所有模块、箭头、标注 +2. 布局:从左到右的数据流 +3. 配色:使用2-3种颜色,符合学术规范 +4. 线条:主要边界2px实线,辅助线1px虚线 +5. 标注:清晰易读,字体不小于10pt +``` diff --git a/external/ai-research-ebook/src/content/docs/figures/tools.mdx b/external/ai-research-ebook/src/content/docs/figures/tools.mdx new file mode 100644 index 0000000..4255633 --- /dev/null +++ b/external/ai-research-ebook/src/content/docs/figures/tools.mdx @@ -0,0 +1,426 @@ +--- +title: 自动化绘图工具 +description: PaperBanana 等自动化学术插图工具介绍 +sidebar: + order: 1 +--- + + + +## 1. PaperBanana (arXiv:2601.23265, 2026) + +### 1.1 核心价值 + +**PaperBanana** 是首个专门为 AI 科学家设计的自动化学术插图生成系统。 + +**论文**: [arXiv:2601.23265](https://arxiv.org/abs/2601.23265) + +### 1.2 核心功能 + +| 功能 | 说明 | +|------|------| +| 自动插图需求识别 | 从论文文本自动识别需要可视化的部分 | +| 顶会风格生成 | 生成符合 NeurIPS/ICML/ICLR 审美的初版 | +| 智能图表推荐 | 根据内容推荐最适合的图表类型 | + +--- + +## 2. 工具生态全景 + +```mermaid +flowchart TD + subgraph ["原型阶段"] + A[Mermaid.js] --> B(快速原型) + C[draw.io] --> B + end + + subgraph ["专业阶段"] + B --> D[Figma] + D --> E(专业插图) + end + + subgraph ["自动化阶段"] + F[PaperBanana] --> G(自动生成) + G --> E + end + + subgraph ["整合阶段"] + E --> H(PPT 整合) + H --> I(最终发布) + end + + + +``` + +--- + +## 3. 工具对比 + +| 工具 | 类型 | 优势 | 适用场景 | 学习曲线 | +|------|------|------|---------|---------| +| **Mermaid.js** | 文本驱动 | 代码驱动、版本友好 | 流程图、时序图 | 低 | +| **PlantUML** | UML | 标准化 | 系统架构图 | 中 | +| **D3.js** | 自定义 | 高度可定制 | 创新可视化 | 高 | +| **draw.io** | 在线绘图 | 免费、协作 | 快速原型 | 低 | +| **Figma** | 协作设计 | 专业级 | 高质量插图 | 中 | +| **PPT** | 整合工具 | 方便整合 | 最终发布 | 低 | + +--- + +## 4. 工具选择决策树 + +```mermaid +flowchart TD + A(图表类型) --> B{是流程图/时序图?} + A --> C{需要高度定制?} + A --> D{团队协作?} + A --> E{快速原型?} + + B -->|是| F[Mermaid.js] + C -->|是| G[D3.js] + D -->|是| H[Figma] + E -->|是| I[draw.io] + F --> J(初版) + G --> K(精细化) + H --> L(协作) + I --> M(快速迭代) + + M --> N(PPT 整合) + + + +``` + +--- + +## 5. GPT 辅助绘图流程 + +### 5.1 阶段 1: 需求分析 + +``` +你是一位专业的学术插图设计师。请分析以下论文内容: + +["粘贴论文的方法部分"] + +输出: +1. 需要可视化的核心概念 +2. 概念之间的关系 +3. 适合的图表类型建议 +``` + +### 5.2 阶段 2: 元素清单 + +``` +基于以下论文内容, 生成架构图的元素清单: + +["论文内容"] + +请输出: +1. 所有模块及其功能描述 +2. 模块间的数据流向 +3. 需要标注的关键信息 +4. 建议的颜色方案 +``` + +### 5.3 阶段 3: 布局建议 + +``` +请为以下内容设计布局方案: + +["元素清单"] + +考虑: +- 从左到右还是从上到下? +- 中心辐射还是层次结构? +- 留白和平衡 +``` + +### 5.4 阶段 4: Mermaid 代码生成 + +```mermaid +flowchart LR + subgraph ["输入处理"] + A(原始数据) --> B(预处理) + end + + subgraph ["核心模型"] + B --> C(特征提取) + C --> D(注意力模块) + D --> E(输出生成) + end + + subgraph ["损失函数"] + F(主损失) --> G(多任务Loss) + H(正则项) --> G + end + + E --> I(最终输出) + + + +``` + +--- + +## 6. 配色方案示例 + +### 6.1 AI 顶会风格 + +| 颜色 | 用途 | HEX | +|------|------|-----| +| 背景 | 图表背景 | #FFFFFF | +| 主模块 | 核心方法 | #10A37F | +| 辅助模块 | 对比方法 | #007AFF | +| 数据流 | 箭头连接 | #6B7280 | +| 高亮 | 关键部分 | #AB68FF | + +### 6.2 暗色主题 + +| 颜色 | 用途 | HEX | +|------|------|-----| +| 背景 | 图表背景 | #212121 | +| 主模块 | 核心方法 | #10A37F | +| 辅助模块 | 对比方法 | #007AFF | +| 数据流 | 箭头连接 | #9CA3AF | +| 高亮 | 关键部分 | #AB68FF | + +--- + +## 7. 最佳实践 + +
+ + +整个论文使用统一的配色和字体方案 + + + +避免过多颜色, 每个颜色有明确含义 + + + +确保在黑白打印时也能清晰区分 + + + +每个图都有清晰的图例和说明 + + +
+ +--- + +## 8. PaperBanana 论文要点补充(2601.23265) + +为响应“把论文内容并入现有章节”的要求, 这里补充 PaperBanana 原文中的关键信息(不上传 PDF 文件): + +### 8.1 研究动机 + +论文明确指出:自动科研系统已能生成方法与实验, 但**发表级插图**仍是人工瓶颈。PaperBanana 的目标是把“论文图”从手工绘制转为可迭代自动流程。 + +### 8.2 方法框架 + +PaperBanana 采用 agentic pipeline, 将插图生成拆为可控阶段: + +1. 检索参考图与风格约束 +2. 规划图的语义内容与视觉结构 +3. 图像渲染与矢量生成 +4. 自我批评与迭代修正 + +### 8.3 评测设置 + +论文引入 **PaperBananaBench(292 个测试样例)**, 覆盖方法图等常见学术插图场景, 用于评估自动生成质量与可用性。 + +### 8.4 工程启发(对本书工作流) + +- 图表要与方法叙事同源:由 method text 驱动, 而不是事后美化。 +- 优先保证“信息正确 + 可复现”, 再追求视觉高级感。 +- 生成后必须保留可编辑中间产物(SVG/分层素材), 便于审稿期快速改图。 + +### 8.5 AutoFigure-edit 项目补充(根目录项目) + +来自 `AutoFigure-Edit-main.zip` 的 README 还提供了一条很实用的“方法图工程化”路线: + +- 从 method text 先生成草图 `figure.png` +- 用 SAM3 做区域检测与框选(产出 `samed.png` + `boxlib.json`) +- 对图元做去背景(RMBG-2.0)得到可复用 icon +- 生成占位模板 `template.svg` 并可迭代优化 +- 最终组装成可编辑的 `final.svg` + +这条链路和 PaperBanana 的共同点是:都强调中间产物可追溯, 便于审稿期快速改图。 + +--- + +## 9. Book 实战增补(逐篇并入) + +> 本节并入 3 篇与"图表/视觉产物自动化"直接相关的文章,重点补齐从论文 Figure 到 PPT/视频转场的可执行流程。 + +### 9.1 1) PaperBanana:论文级 Figure 生成与润色 + +来源:`book/谷歌做了个论文专用版nano_banana_顶会级Figure直出.md` + +#### 9.1.1 关键增量 + +- Figure 目标从“好看”升级为“语义正确 + 学术审美一致”。 +- 支持两类核心产物:方法结构图(Methodology)与统计图(Statistical Plots)。 +- 支持从草图/初版图自动润色:重排层级、统一配色、强化箭头逻辑。 + +#### 9.1.2 多 Agent 生产线(可复用) + +1. 检索参考图与领域范式; +2. 规划结构化图描述(模块、关系、层级); +3. 按审美约束生成初稿; +4. 评论代理迭代纠错(语义一致性检查); +5. 输出论文可用版与可编辑资产。 + +#### 9.1.3 实操结论 + +- 统计图场景下,优先“AI 生成绘图代码再出图”,通常比直接生图更可控。 +- 生成完成后必须保留中间素材,避免审稿期改图返工。 + +#### 9.1.4 详细步骤(PaperBanana 风格流程) + +1. 准备输入:方法段落、关键模块列表、模块关系表(A→B)。 +2. 先产出“结构草稿”而不是终稿,确认语义无误后再美化。 +3. 进入风格增强阶段:统一配色、字体、间距、箭头方向。 +4. 对照正文逐项核验:术语一致、关系一致、无缺漏模块。 +5. 导出两份:投稿图 + 可编辑源文件(SVG/分层)。 + +#### 9.1.5 文章细节补充(质量核验表) + +- 语义一致:图中术语与正文完全一致; +- 逻辑一致:箭头方向与流程关系无冲突; +- 审美一致:配色、字号、间距统一; +- 投稿可用:分辨率与版式满足会议模板要求。 + +### 9.2 2) PPT Skills:从静态页面到转场视频 + +来源:`book/学会了PPTSkills_豆包Kimi都感觉不香了_但90_的人卡在第一步_Gemini_NanoBananaPro_API国内用不了_这篇帮你全解决(8个坑_国内可用).md` + +#### 9.2.1 可执行流程 + +1. 输入主题与约束(页数、风格、分辨率); +2. 批量生成每页视觉稿; +3. 两两页面分析视觉差异; +4. 自动生成转场提示词; +5. 调用视频模型生成过渡片段; +6. 用 `ffmpeg` 合成完整演示视频。 + +#### 9.2.2 工程化建议 + +- 优先“二次开发已有 skill”,避免从零造轮子。 +- 配置分层:官方 API 与第三方 API 兼容两套路径。 +- 对“连通性、鉴权、路径、依赖版本”做启动前自检,减少运行中断。 + +#### 9.2.3 详细步骤(PPT Skills 国内可用改造) + +1. 复制原项目到新目录,避免直接污染上游版本。 +2. 创建虚拟环境并安装依赖: + +```bash +python3 -m venv venv +source venv/bin/activate +pip install google-genai pillow python-dotenv -i https://pypi.org/simple +``` + +3. 复制配置模板并填写: + +```bash +cp .env.example .env +``` + +4. 先做 API 连接测试(返回 200 再继续主流程)。 +5. 官方 SDK 不稳定时切 HTTP 直调,便于定位原始请求/响应。 +6. 生成完成后再执行转场视频流水线,避免前置失败放大损失。 + +#### 9.2.4 文章细节补充(可复制命令顺序) + +```bash +# 初始化 +cd +python3 -m venv venv +source venv/bin/activate +pip install -r requirements.txt + +# 生成静态页 +python generate_ppt.py --plan plans/demo.md --style styles/vector-illustration.md --resolution 2K + +# 生成转场视频(按项目脚本) +python generate_transition.py --input outputs//images --output outputs//videos +ffmpeg -f concat -safe 0 -i outputs//videos/list.txt -c copy outputs//full_ppt_video.mp4 +``` + +#### 9.2.5 常见问题排查(细化) + +1. **API 连通失败**:先用独立脚本验证请求,再跑主流程。 +2. **模型返回空结果**:检查模型名是否与供应商兼容。 +3. **转场合成失败**:检查 ffmpeg 是否安装、输入列表是否存在。 +4. **分辨率不一致**:统一生成参数,避免混用 2K/4K 导致拼接失败。 + +#### 9.2.6 高频坑位清单 + +- Base URL 误配(多拼路径导致 404); +- 运行环境不一致(系统 Python 与虚拟环境混用); +- 官方 SDK 报错不透明(必要时改 HTTP 直调便于排错)。 + +### 9.3 3) 图文一体化 Skill:文章生成 + 配图落地 + +来源:`book/Claude_Code_Skill_自动生成文章内容与配图.md` + +#### 9.3.1 双 Skill 架构 + +- `article-generator`:负责文章结构、SEO 信息与图片占位符。 +- `image-generator`:负责读取占位符上下文、生成 prompt、调用图像流水线。 + +#### 9.3.2 8 步流水线(建议模板) + +1. 生成文章与占位图; +2. 提取占位符上下文; +3. 生成每图 prompt; +4. 批量生图; +5. 转 `webp` 压缩; +6. 上传对象存储(如 R2); +7. 回填 CDN 链接; +8. 输出可发布版本。 + +#### 9.3.3 关键命令示例 + +```bash +npm run generate-images +npm run compress-images +npm run upload-images +npm run replace-images +``` + +#### 9.3.4 详细步骤(图文流水线) + +1. 用 `article-generator` 产出文章与占位图。 +2. 运行 `image-generator` 读取占位并生成 prompt。 +3. 依次执行四个命令:生图 → 压缩 → 上传 → 链接替换。 +4. 每一步检查输出目录是否存在且非空。 +5. 替换完成后抽查 3 处图片链接,确认 CDN 可访问。 + +#### 9.3.5 文章细节补充(目录规范建议) + +```text +articles/.md +prompts//*.md +images//*.png +images//*.webp +``` + +建议每一步都写入一个 `status.json`,用于中断后恢复: + +- `step` +- `ok` +- `updated_at` +- `error` + +#### 9.3.6 章节衔接说明 + +这套方案与本章已有的 `PaperBanana + AutoFigure-edit` 形成互补: + +- 论文 Figure 偏“科研表达规范化”; +- 图文流水线偏“内容生产自动化”; +- 两者都强调中间产物与可追溯性。 diff --git a/external/ai-research-ebook/src/content/docs/idea/projects.mdx b/external/ai-research-ebook/src/content/docs/idea/projects.mdx new file mode 100644 index 0000000..2bd6a4e --- /dev/null +++ b/external/ai-research-ebook/src/content/docs/idea/projects.mdx @@ -0,0 +1,192 @@ +--- +title: 调研项目 +description: 重要调研项目分析, 包括 Sci-Reasoning、AI Research、Idea2Story 等 +sidebar: + order: 2 +--- + +import { Card, CardGrid } from '@astrojs/starlight/components'; + +## 1. Sci-Reasoning 数据集 + +### 1.1 核心价值 + +**Sci-Reasoning** 通过 LLM+Human Review的方法, 对 2023–2025 年 NeurIPS、ICML、ICLR 的 **3819 篇 Oral/Spotlight 论文**进行"学术谱系"建模。 + +**资源链接**: +- 代码: [Sci-Reasoning GitHub](https://github.com/AmberLJC/Sci-Reasoning) +- 数据集: [HuggingFace Dataset](https://huggingface.co/datasets/AmberLJC/Sci-Reasoning) + +```mermaid +flowchart TD + A[3819 Papers] --> B[LLM Annotation] + B --> C[Human Review] + C --> D[15 Patterns] + C --> E[Innovation Recipes] + D --> F(科研创新规律) + E --> F + + + +``` + +--- + +## 2. 15 种科研思维模式详解 + +
+ + +**诊断+重构**:识别当前方法的局限性, 将限制转化为设计约束。 + + + +**跨域融合**:从相邻领域引入解决方案, 激活创新可能。 + + + +**表示转化**:替换问题的基本表示单元, 开辟新视角。 + + +
+ +### 2.1 完整模式列表 + +| 编号 | 模式 | 比例 | 核心价值 | +|------|------|------|---------| +| P01 | Gap-Driven Reframing | 24.2% | 转化限制为设计约束 | +| P02 | Cross-Domain Synthesis | 18.0% | 跨领域融合 | +| P03 | Representation Shift | 10.5% | 表示转化 | +| P04 | Modular Pipeline Composition | 4.2% | 模块化组合 | +| P05 | Data & Evaluation Engineering | 5.4% | 数据与评测工程 | +| P06 | Principled Probabilistic Modeling | 5.4% | 概率建模 | +| P07 | Formal-Experimental Tightening | 6.7% | 理论实验紧密结合 | +| P08 | Approximation Engineering | 4.9% | 可扩展性近似 | +| P09 | Inference-Time Control | 2.4% | 推理时控制 | +| P10 | Structural Inductive Bias | 5.1% | 结构归纳偏置 | +| P11 | Multiscale Modeling | 1.4% | 多尺度建模 | +| P12 | Mechanistic Decomposition | 1.9% | 机制分解 | +| P13 | Adversary Modeling | 1.5% | 对手建模 | +| P14 | Numerics & Systems Co-design | 1.4% | 数值与系统协同 | +| P15 | Data-Centric Optimization | 2.1% | 以数据为中心 | + +--- + +## 3. Innovation Recipes(Innovation Recipes) + +### 3.1 高价值组合 + +```mermaid +flowchart LR + A[Gap-Driven] -->|诊断+重构| B[Representation Shift] + C[Cross-Domain] -->|导入+适配| D[Representation Shift] + E[Gap-Driven] -->|诊断+借用| F[Cross-Domain] + + B --> G("318次") + D --> H("233次") + F --> I("204次") + + + +``` + +| 组合模式 | 出现次数 | 策略 | +|---------|---------|------| +| Gap-Driven + Representation Shift | 318 | "诊断+重构" | +| Cross-Domain + Representation Shift | 233 | "导入+适配" | +| Gap-Driven + Cross-Domain | 204 | "诊断+借用" | + +--- + +## 4. 会议偏好分析 + +| 会议 | 偏好模式 | 写作建议 | +|------|---------|---------| +| **ICML** | 形式化方法 (8.3%), 概率建模 (7.5%) | 增加理论分析和证明 | +| **ICLR** | 表示创新 (11.8%), 基准测试 (8.5%) | 侧重表示分析和可视化 | +| **NeurIPS** | 平衡跨学科覆盖 | 强调方法的生物学合理性 | + +--- + +## 5. LLM 评估基准 (Hit@10) + +这个评估衡量:给定前人工作, LLM 能否预测出研究方向的准确度。 + +| 模型 | Hit@10 得分 | +|------|-------------| +| **Gemini 2.5 Pro** | 49.35% | +| Claude Opus 4 | 42.86% | +| GPT-5.2 | 38.89% | +| Claude Sonnet 4 | 29.87% | + +--- + +## 6. AI Scientist 系列 + +### 6.1 完整对比 + +| 项目 | 时间 | 核心特点 | 代码 | +|------|------|---------|------| +| **The AI Scientist** | 2024.08 | 完整研究自动化 | [SakanaAI](https://github.com/SakanaAI/AI-Scientist) | +| **The AI Scientist-v2** | 2025 | 无代码模板自动化 | - | +| **ChemCrow** | 2024 | 化学研究 Agent (728+ 引用) | - | +| **Virtual-Scientists** | ACL 2025 | 端到端科研协作 | [InternScience](https://github.com/InternScience/Virtual-Scientists) | +| **Kosmos** | 2025 | 自主数据驱动发现 | - | +| **AI-Researcher** | 2025 | 完全自主研究系统 | - | + +--- + +## 7. 实践建议 + +### 7.1 如何借鉴 Sci-Reasoning + +1. **构建调研库时做标签化** + - 每篇论文标注其"创新类型" + - 便于后续 pattern mining + +2. **关注Innovation Recipes** + - 高频组合往往意味着"成熟赛道" + - 低频组合可能有更大的创新空间 + +3. **结合会议偏好** + - ICML 侧重理论 + - ICLR 侧重表示 + - NeurIPS 平衡跨学科 + +
+ +**核心启示**:创新不是玄学, 是可以被系统化分析和复制的模式。 + +
+ +--- + +## 8. 根目录论文内容整合(不上传 PDF 本体) + +### 8.1 论文一:Towards Execution-Grounded Automated AI Research (2601.14525) + +根据原文摘要与项目环境说明, 这项工作提出了一个 **execution-grounded** 的自动科研框架, 核心不是只生成“看起来合理”的 idea, 而是把 idea 真实落地执行并用反馈反哺下一轮搜索。 + +**关键点:** +- 构建自动执行器:自动打补丁、提交代码、分配 GPU、回收训练日志。 +- 设定两个可执行研究环境: + - post-training:GRPO + MATH(Qwen2.5-Math-1.5B) + - pre-training:nanoGPT + FineWeb +- 研究目标从“语言 plausibility”转为“执行后有效性”。 +- 强调 execution feedback 对后续 idea 迭代的价值。 + +### 8.2 论文二:Idea2Story (2601.20833) + +该工作把"research idea → 可写论文叙事"的过程做成了结构化流水线, 核心贡献是 **pre-computation-driven** 思路:尽量把文献理解和结构化表征前置, 降低在线大上下文推理成本与幻觉风险。 + +**关键点:** +- 用知识图谱组织 Idea / Pattern / Domain / Paper 节点。 +- 通过模式选择、故事生成、反思修正, 产出完整 scientific narrative skeleton。 +- 引入 anchored multi-agent review, 使打分更可审计、更可复现。 +- 输出可直接进入写作阶段的结构化结果(title/abstract/problem/method/contrib/experiments)。 + +### 8.3 并入现有工作流的建议 + +1. 在 `1.1 调研` 阶段优先落地“可执行环境”, 避免只停留在概念验证。 +2. 在 `1.2 项目` 阶段增加“叙事骨架检查”, 确保 idea 到论文表达不断层。 +3. 让“执行反馈”与“叙事反馈”双闭环并行:一个校验有效性, 一个校验可写性。 diff --git a/external/ai-research-ebook/src/content/docs/idea/research.mdx b/external/ai-research-ebook/src/content/docs/idea/research.mdx new file mode 100644 index 0000000..9f4ce9d --- /dev/null +++ b/external/ai-research-ebook/src/content/docs/idea/research.mdx @@ -0,0 +1,160 @@ +--- +title: 调研方法 +description: 系统化的文献调研方法,从"看论文"到"产出空白"的完整流程 +sidebar: + order: 1 +--- + +## 1. 调研目标 + +调研的目标不是"看了很多论文",而是要产出**能直接导向可写论文的结果**: + +1. 该方向到底在解决什么问题 +2. 大家默认的设定/评测是什么 +3. 现在的瓶颈在哪里 +4. 哪些空白值得写 +5. 你的 idea 能否形成可验证的 claim + +## 2. 工具选择与分工 + +### 2.1 主力调研工具 + +| 工具 | 适用场景 | +|------|---------| +| **ChatGPT 5.2 Pro** | 体系化综述、把一堆材料整理成"研究地图"、提炼问题定义与评价体系 | +| **Manus / GPT 5.2 Thinking** | 抓漏洞(这篇论文到底新在哪里?有没有偷换设定?) | +| **Gemini 3 Pro Deep Research** | 补全资料、扩展相关工作、找被忽略的假设 | + +### 2.2 推荐分工 + +- **Pro**: 搭主框架(问题→方法→实验→结论)+ 产出"标准化笔记" +- **Thinking**: 抓漏洞(创新点、评价公平性、潜在问题) +- **Deep Research**: 补引用与证据(相关工作漏了谁?还有哪些强 baseline?) + +## 3. 调研的产物清单 + +建议把调研结果固定成 6 份输出: + +1. **Related Work Map(研究地图)** + - 按"问题子类/数据模态/方法范式/训练范式/评测范式"分层 + +2. **Benchmark & Metric Sheet(评测与指标表)** + - 主流数据集/指标/协议/常见坑 + +3. **Assumption Matrix(隐含假设矩阵)** + - 每篇论文默认假设是什么?(资源、标注、算力、可访问信息等) + +4. **Failure Taxonomy(失败模式分类)** + - 方法为什么失败?失败发生在什么条件下? + +5. **Gap List(研究空白清单)** + - 空白不是"没人做",而是"没人把它做成可验证主张 + 可复现实验" + +6. **Claim Candidate Pool(候选主张池)** + - 每个 claim 必须能写成一句话,并且对应至少一个主实验 + 一个消融 + +## 4. 调研流程 + +### 4.1 定义边界 (Scope) + +- 你要解决的"核心问题"一句话是什么? +- 哪些工作算"同类问题",哪些只是"相关但不同问题"? + +### 4.2 建语料库 (Corpus) + +- 每篇至少记录:任务定义、输入输出、数据集、指标、训练资源、关键 novelty、关键 baseline + +### 4.3 标准化阅读 + +不要自由笔记,要"字段化": + +- **Problem**: 解决什么,设定是什么? +- **Key Idea**: 一句话新意是什么? +- **Mechanism**: 为什么有效(作者的因果叙事)? +- **Evidence**: 哪些实验真正在支撑 claim? +- **Baselines**: 对比是否公平? +- **Weakness**: 最大漏洞是什么? +- **Reproduce**: 复现难点在哪里? + +### 4.4 对齐与冲突检测 + +多模型调研结果可能冲突,冲突往往就是"机会点": + +- 该方向究竟默认设定是什么? +- 某些工作是不是在换设定? +- 指标是不是被 hack 了? +- 某些强 baseline 是否被刻意忽略? + +### 4.5 产出 gap → 变成可写 idea + +每个 gap 最终要落到**可写论文的形式**: + +- Claim(主张) +- Setup(设定) +- Method(方法) +- Experiment(实验) +- Expected Outcome(预期) +- Risk(最大风险与备选方案) + +## 5. 文献检索工具 (2025最新) + +| 工具 | 核心功能 | 适用场景 | 链接 | +|------|---------|---------|------| +| **Elicit** | 1.25亿+论文库,自动化系统综述 | 系统性文献调研 | elicit.com | +| **Consensus AI** | AI驱动搜索,快速找证据 | 快速验证假设 | consensus.app | +| **Semantic Scholar** | AI提取论文含义,深度覆盖 | 探索研究脉络 | semanticscholar.org | +| **Scite** | 智能引用追踪(支持/反驳/提及) | 评估论文影响力 | scite.ai | +| **Connected Papers** | 可视化论文关系图 | 发现相关论文 | connectedpapers.com | +| **ResearchRabbit** | 论文推荐类似 Spotify | 持续追踪新工作 | researchrabbit.ai | + +### 5.1 工作流建议 + +1. **初步探索**: Semantic Scholar + Connected Papers +2. **深度调研**: Elicit (自动化筛选和数据提取) +3. **证据验证**: Consensus AI + Scite +4. **持续追踪**: ResearchRabbit (新论文推送) + +## 6. 多模型协作调研 + +使用多个 LLM 并行可以交叉验证,避免单一模型的偏见。 + +### 6.1 推荐配置 + +| 模型 | 角色 | 优势 | +|------|------|------| +| **Claude Opus 4.6** | 主力分析师 | 深度推理,长上下文 (200K) | +| **GPT-5.2 Thinking** | 漏洞检测者 | 捕捉被忽略的假设 | +| **Gemini 2.5 Pro** | 资料补充员 | 强大的检索和整合能力 | + +### 6.2 协作模式 + +1. **分工阅读**: 不同模型负责不同子领域 +2. **交叉验证**: 同一篇论文由多个模型独立分析 +3. **冲突解决**: 冲突点往往是研究空白 +4. **综合汇总**: 由最强模型整合所有发现 + +--- + +## 7. 个人高通量选题法(补充) + +> 这部分来自 `AI research.md` 的个人实践段落,已融合为可执行版本,用于把"读很多论文"变成"筛出能发的 claim"。 + +### 7.1 三层过滤流程 + +1. **候选池层(广覆盖)** + - 先建立 2000+ 论文级别的候选池,按任务、数据模态、评测协议分桶。 +2. **可验证层(可落地)** + - 对每个候选方向补齐:主实验、消融、压力测试、失败预案。 +3. **可投稿层(可叙事)** + - 只保留能形成完整论证链的方向:问题价值 → 方法机制 → 实验证据 → 反质疑预案。 + +### 7.2 快速打分模板(避免主观拍脑袋) + +| 维度 | 问题 | 评分标准(1-5) | +|------|------|----------------| +| **Novelty** | 是否只是已有方法换壳? | 5 = 明确新设定或新机制 | +| **Executability** | 两周内能否跑通主实验? | 5 = 依赖清晰、实现成本可控 | +| **Evaluability** | 是否有公认基准和强 baseline? | 5 = 可直接复现实验协议 | +| **Narrative Fit** | 能否写成完整论文故事? | 5 = 贡献/证据/风险闭环完整 | + +建议只推进总分最高的 Top 1-3 个方向,降低“多线开坑”风险。 diff --git a/external/ai-research-ebook/src/content/docs/index.mdx b/external/ai-research-ebook/src/content/docs/index.mdx new file mode 100644 index 0000000..21e2d05 --- /dev/null +++ b/external/ai-research-ebook/src/content/docs/index.mdx @@ -0,0 +1,138 @@ +--- +title: Vibe Research +description: AI研究电子书 - 从idea到论文发表的完整指南 +template: splash +hero: + title: Vibe Research + tagline: 从 Idea 到顶会投稿的完整 AI 科研操作系统 + actions: + - text: 开始阅读 + link: idea/research + icon: right-arrow + - text: 工具总览 + link: tools/overview + icon: star + variant: minimal + - text: 完整工作流 + link: tools/workflow + variant: secondary +--- + +## 研究工作流概览 + +```mermaid +flowchart LR + subgraph Phase1["Phase 1: Idea"] + A(文献调研) --> B(创新模式分析) + B --> C(Gap 识别) + C --> D(Claim 产出) + end + + subgraph Phase2["Phase2:代码"] + D --> E(项目设计) + E --> F(Claude Code 构建) + F --> G(实验验证) + end + + subgraph Phase3["Phase3:写作"] + G --> H(结构化写作) + H --> I(图表制作) + I --> J(审稿迭代) + end + + Phase1 --> Phase2 + Phase2 --> Phase3 + + classDef phase fill:#f8fafc,stroke:#10a37f,stroke-width:1.6px,color:#111827 + class Phase1,Phase2,Phase3 phase + + +``` + +## 快速价值 + +
    +
  • 🚀 用 14 周路线,把科研任务拆成可执行流水线。
  • +
  • 🧠 用多模型交叉审查,减少方向性失误和实验返工。
  • +
  • 🧪 用结构化实验与审稿闭环,提升投稿成功率。
  • +
  • 📊 用流程图与模板化文档,让团队协作更稳定。
  • +
+ +## 核心功能 + +### Idea 生成 +系统化的文献调研方法,使用多模型交叉验证,从2000+论文中发现可写的研究空白。 + +**核心方法:** +- Related Work Map 构建 +- Assumption Matrix 分析 +- Gap List 产出 +- Claim Candidate Pool + +### 代码实现 +Claude Code、GPT-5.2系列、多Agent框架的最佳实践,高效构建实验系统。 + +**核心能力:** +- 并行协作架构 +- CLAUDE.md 团队记忆 +- Sub-agents 交叉验证 +- 自动化验证闭环 + +### 论文图表 +自动化绘图工具推荐,专业图表设计规范,让论文插图更具说服力。 + +**工具生态:** +- PaperBanana 自动生成 +- Mermaid 流程图 +- D3.js 自定义可视化 +- Figma 专业设计 + +### 论文写作 +论证链构建方法,多模型协作写作,Prism等新一代写作工具使用指南。 + +**写作方法:** +- Claim → Evidence 论证链 +- 多模型协作 tmux 配置 +- 会议特定写作模板 + +### 审稿迭代 +结构化审稿流水线,会议特定审稿模板,Rebuttal写作策略。 + +**审稿流水线:** +- 10+ 轮自动审稿 +- TODO 驱动修改 +- 分类回应策略 + +### 工具生态 +Elicit、Zotero-MCP、Sci-Reasoning等最新工具,构建完整科研工具链。 + +--- + +## 14 周完整时间线 + +| 周次 | 阶段 | 核心任务 | 输出 | +|------|------|---------|------| +| Week 1-2 | 调研 | Elicit 扫描 + Sci-Reasoning 分析 | Gap 清单 | +| Week 3 | 设计 | Claude Code 生成文档 | 项目设计 | +| Week 4-7 | 实现 | Sub-agents 并行开发 | 代码 + 实验 | +| Week 8-9 | 写作 | Prism + 图表生成 | 初稿 | +| Week 10 | 审稿 | 10+ 轮自动审稿 | 修改版 | +| Week 11 | 投稿 | 格式检查 | 最终版 | +| Week 12+ | Rebuttal | 如有需要 | 录用 | + +--- + +## 适用场景 + +- **研究生/博士生**: 系统学习 AI 研究方法,提升论文产出质量 +- **工业界研究员**: 快速掌握最新工具,提高研发效率 +- **独立研究者**: 建立完整的科研工作流,从零开始发表顶会论文 + +## 从这里开始 + +- 新手建议先读:[`idea/research`](idea/research) → [`idea/projects`](idea/projects) +- 需要快速落地:[`tools/workflow`](tools/workflow) + [`review/structured`](review/structured) +- 关注工程效率:[`code/claude`](code/claude) + [`code/agents`](code/agents) + +--- +

本书持续更新中 · 视觉系统升级:2026-02-09 · 默认主题:浅色

diff --git a/external/ai-research-ebook/src/content/docs/library/root-assets.mdx b/external/ai-research-ebook/src/content/docs/library/root-assets.mdx new file mode 100644 index 0000000..0e64d0a --- /dev/null +++ b/external/ai-research-ebook/src/content/docs/library/root-assets.mdx @@ -0,0 +1,591 @@ +--- +title: 科研圣经 +description: 零基础入门科研全指南 - 从顶会对比到Idea生成,从论文阅读到速成写作 +sidebar: + order: 1 +--- + +# 科研圣经 + +本章节汇集零基础入门科研的核心知识,涵盖顶会顶刊对比、Idea生成方法、论文阅读流程与速成写作技巧。 + +--- + +## 一、顶会顶刊投稿对比 + +### 1. 审稿人意见分类 + +- Reject(拒稿) +- Major Revision(大修) +- Minor Revision(小修) +- Accept(接收) + +**会议**:一般只有 Reject(拒稿)和 Accept(接收)两种 + +**期刊**:四种都有 + +> 意见及应对方法见:[知乎文章](https://blog.csdn.net/qq_39856931/article/details/106751954) + +### 2. 审稿人提意见的意图 + +| 类型 | 意图 | +|------|------| +| **会议** | 提意见为了拒绝文章 | +| **期刊** | 审稿人提意见是为了改正文章,意见精确(跟哪些baseline进行对比、补充哪些评价指标、新增哪些数据集实验) | + +### 3. 审稿人细致及专业程度 + +| 类型 | 特点 | +|------|------| +| **会议** | 很少有细节性的意见,质量参差不齐,不懂这个领域也可能是你的审稿人 | +| **期刊** | 认真细致,专业 | + +### 4. 期刊和会议的优缺点 + +#### 会议 + +**时间较短**(顶会可能2-3月左右) + +##### CVPR-2026 时间线 + +| 重要时间节点 | 阶段 | +|-------------|------| +| 2025年10月 | OpenReview投稿网站开放**作者注册** [OpenReview](https://openreview.net/) | +| 2025年10月 | OpenReview投稿网站开放**论文提交** | +| 2025年11月 | **摘要**提交截止(晚上11:59 UTC-12) | +| 2025年11月 | **完整论文**提交截止(晚上11:59 UTC-12) | +| 2025年12月 | **补充材料**提交截止(晚上11:59 UTC-12) | +| 2026年1月 | **第一阶段拒稿**通知 | +| 2026年2月 | 作者**反馈**窗口期 | +| 2026年3月 | **最终录用或拒稿**通知(主要技术轨道) | +| 2026年3月 | **最终版**(Camera-ready)文件提交(主要技术轨道) | +| 2026年6月 | CVPR-2026正式举办 | + +##### AAAI-2026 时间线 + +| 重要时间节点 | 阶段 | +|-------------|------| +| 2025年6月16日 | OpenReview投稿网站开放**作者注册** | +| 2025年6月25日 | OpenReview投稿网站开放**论文提交** | +| 2025年7月25日 | **摘要**提交截止 | +| 2025年8月1日 | **完整论文**提交截止 | +| 2025年8月4日 | **代码/附录材料**截止 | +| 2026年9月8日 | **第一轮结果出炉**(首轮拒稿无rebuttal) | +| 2025年10月2-8日 | rebuttal阶段 | +| 2025年11月3日 | **最终录用通知** | +| 2025年11月13日 | **最终版**(Camera-ready)文件提交 | +| 2026年1月20-27日 | AAAI-2026正式举办 | + +#### 期刊 + +**周期较长**(顶刊可能8月到1年左右不等) + +LetPub 中科院一区 - 人工智能领域期刊查询结果 + +### 5. 顶刊顶会目录 + +**(1)2025年中科院新分区 1区 共53本期刊** + +**(2)CCF会议分类** + +[中国计算机学会推荐国际学术会议和期刊目录(2022更名版,2025年使用).pdf](https://kyc.lsu.edu.cn/_upload/article/files/df/ed/9257ff9c401dabebfe7428c8a9ce/cc033863-6b2b-4616-8bab-ae183ed7a04b.pdf) + +### 6. 计算机可投期刊信息查询及会议截止时间 + +#### (1)期刊 + +**LetPub** 是一个提供最新SCI期刊影响因子查询及投稿分析系统的网站,可按照期刊名、研究方向、影响因子、收录情况等条件筛选和排序 + +[网站地址](https://www.letpub.com.cn/index.php?page=./journalapp) + +#### (2)会议 + +**CCF会议分类及截稿倒计时网站** + +- 网站1:[ccfddl.cn](https://ccfddl.cn/) - 右上角可扫码关注小程序 +- 网站2:[ccfddl.com](https://ccfddl.com/) + +--- + +## 二、零基础入门科研如何想Idea + +### 1. 一篇论文诞生的整体流程图 + +``` +寻找领域内当前效果最好的论文(最好开源) + ↓ +看论文里展示的SOTA结果比较了哪些baseline + ↓ +顺着 baseline 与引用一路往前读 + ↓ +在理论层面进行分析,找改进点 +(哪些工作上不work,能否扩展) + ↓ +复现代码 + ↓ +在代码层面进行分析,找缺陷 +(运行速度慢、内存占用大等) + ↓ +改出自己的Idea +``` + +**举例**:寻找领域内当前效果最好的那篇论文,最好**开源**→看论文里面展示的**SOTA结果比较了哪些baseline**,顺着 baseline 与引用一路往前读→在**理论层面**进行分析,找改进点,例如在哪些工作上是不work的,能否在这个领域进行一些扩展→复现代码→在**代码层面**进行分析,找缺陷,例如虽然某方法性能有提升,但是运行速度很慢、内存占用大,能否进行加速和优化→改出自己的点子。 + +### 2. 寻找论文的渠道 + +#### (1)看最新出顶会中新中的论文 + +**官网** +- NAACL2025接收文章列表:https://2025.naacl.org/program/accepted_papers/ +- CVPR2025接收文章列表:https://cvpr.thecvf.com/Conferences/2025/AcceptedPapers + +**GitHub科研总结** +- CVPR-2025-带代码的阅读论文:https://github.com/Paper2Chinese/CVPR-2025-reading-papers-with-code + +#### (2)大机构数据库 + +- **arxiv平台**新出论文/预印本idea:https://arxiv.org/ +- **谷歌学术**:https://scholar.google.com.hk/ +- **dblp**:https://dblp.org/ +- **Aminer**:https://www.aminer.cn/ +- **huggingface**新出论文:https://huggingface.co/blog/zh?tag=research + +#### (3)Paper with Code上面SOTA结果 + +网址:https://paperswithcode.com/ + +### 3. 建议部分 + +#### (1)阶段划分 + +1. **资格达成期** + - **目标**:满足学位授予的硬性成果指标(篇数、等级) + - **策略**:锁定 1–2 个垂直子领域,开展深度研究,尽量避免进入高曝光热门赛道,降低idea被抢占风险 + +2. **影响拓展期** + - **目标**:在完成资格后,利用已积累的模型、工具链与领域认知,向相邻学科或跨模态任务延伸,追求更高学术影响力 + +#### (2)日常科研习惯 + +1. **输入端** + - **文献精读**:每周 2 篇,输出结构化摘要(问题-方法-缺陷-可改进点) + - **审稿意见逆向阅读**:收集公开评审意见,**提前预判可能被审稿人质疑点** + + **例如**:在 VLPose 这篇论文中,作者引入新模块的同时不可避免地引入了额外参数。为回应可能关于"性能提升是否仅源于参数增长"的质疑,作者在发表前通过对比实验设计,**在参数量可控的前提下**展示了其方法在性能上的显著优势,体现出结构设计本身的有效性。 + + [论文链接](https://arxiv.org/pdf/2402.14456) + + **Table3(b)表**反映的是**在不同模型尺寸下,各微调方法需要训练的参数量**,单位为 MB。 + + ##### 1. Visual Prompt Tuning(视觉提示微调) + + - **核心思想**:不改动模型本体,仅在图像输入的"前面"加上可学习的"提示 embedding" + - 就像在 Transformer 里加了一个"引导标签",帮助模型适应新任务 + - **只训练这部分新加的 prompt**,其余所有模型参数都 **被冻结(frozen)** + - 这叫做**参数高效的微调方法**,很轻量,不会破坏原模型 + + ##### 2. Last Layer Tuning(最后一层微调) + + - **传统做法**:固定前面的模型结构,只微调最后一层(通常是预测层) + - 相比全参数微调,它已经是"轻量"了,但仍然要训练模型的一部分原始参数 + + ##### 两种训练方式的不同点 + + | 项目 | Visual Prompt Tuning | Last Layer Tuning | + |------|---------------------|-------------------| + | 是否改动原模型 | 否 不改,只加东西 | 是 改动最后一层 | + | 可训练参数来源 | 全是新加的 prompts | 原模型中的部分参数 | + | 参数量 | 通常更少 | 较多 | + | 泛化能力保留 | 更强(原模型没动) | 中等(最后一层被改) | + | 结构可逆性 | 可随时删除 prompts 恢复原模型 | 改过原模型不可逆 | + + **结论**是 VLPose 虽然只用了一点点额外的 prompt 参数(比 Visual Prompt 多,但远少于 Last Layer),但性能最好,结构还可逆,泛化也好。以高效的结构设计**消解了对"参数堆砌"的潜在质疑**。 + +2. **输出端** + - **即时记录**:手机备忘录等 + - **定期研讨**:组会、会议、在线论坛等 + +### 4. 科研实操 + +#### 4.1 入门大模型怎么选方向 + +**目标**:先搞清楚"能做多大的实验" + +按**资源**情况划分: + +| 手里的卡 | 推荐任务 | 为什么要这样做 | 真实例子 | +|---------|---------|---------------|---------| +| **资源多** ≥100 张 A100 | 基于开源模型做大规模预训练、指令微调、强化学习 | 卡多=数据吞吐大,能把基线刷高 | LLaMA-65B 原版就是 2048 张 A100 训的 | +| **资源中等** 8 张 V100 | 小领域微调 | 卡不多不少,可以训"窄场景"专用模型 | **纯语言领域**:MoTCoder论文没有在humaneval或者mbpp这样的数据集上做验证,而是使用的Code Contest/apps:在专门做竞赛难度的编程数据集实验,数据量小但难度高。**多模态领域**:Lyra论文训练了一个视觉、语音、语言的多模态大模型,之前的多模态大模型在长音频和长视频上的效果不好,Lyra对应长视频音频的大海捞针任务做了提升 | +| **资源少** 4 张 3090 | 免训练(training-free) | 训练一次要一周,迭代慢;免训可直接推理,每轮迭代速度都很快,无需大量资源 | **纯语言领域**:Quick LLaMa:只做"长文本推理加速",不改权重。**视觉领域**:VisionZIP:对图像的token做压缩 | + +**MoTCoder论文链接**:https://arxiv.org/pdf/2312.15960 + +**Lyra论文链接**:https://arxiv.org/pdf/2412.09501 + +**QuickLLaMA论文链接**:https://arxiv.org/abs/2406.07528 + +**VisionZIP论文链接**:https://arxiv.org/pdf/2412.04467 + +#### 4.2 如何判断一篇论文是否值得精读 + +**值得精读 = 效果好 + 可复现** + +##### (1)效果好 + +**情况1**:在某个Benchmark上面是SOTA + +> **Benchmark**(基准测试)是指一套标准化的测试任务、数据集和评估指标,用于公平、可重复地比较不同方法或系统的性能。 + +**情况2**:不是SOTA,但是现有SOTA是在它的基础上进行改进 + +可能出现这样的情况,假设某论文A提出一个基础模型,后续论文B在A的基础上加了一个"花哨的模块"成为SOTA,但这个模块在数据量小或任务简单时反而拖后腿。所以可能基于论文A的baseline去改进效果会更好。 + +**情况3**:某工作是现有SOTA的基础或它启发了现有SOTA + +如果不知道某论文是否和现有SOTA有关,可从以下4个方面来判断该篇论文的质量: + +**方面1**:大机构 > 小机构 + +###### 常见的大机构类型 + +1. **顶尖高校及实验室** + - 例如:MIT、Stanford、Tsinghua University等 + - 这些学校下的研究实验室(如MIT CSAIL、Stanford AI Lab)在学术圈具有很强影响力 + +2. **知名科研院所** + - 例如:中国科学院、Max Planck Institute、Allen Institute for AI (AI2) 等 + +3. **科技巨头的研究部门** + - 例如:Google Research(Gemini)、DeepMind、Microsoft Research(DeBERTa)、Meta AI(PyTorch、LLaMA)、OpenAI(GPT、CLIP)、NVIDIA Research(Diffusion Models) + - 这些公司投入巨资,且产出大量SOTA研究成果 + +4. **开源社区与合作研究组织** + - Hugging Face、OpenMMLab [香港中文大学多媒体实验室网址](https://openmmlab.com/codebase) + +**方面2**:简单 > 复杂 + +复杂论文可能只是某个模块在起作用,作者为了使这篇论文工作更丰富创新,可能会融合很多模块,导致论文难以理解。 + +**方面3**:清晰 > 繁琐 + +优先论文有公式推导、伪代码和图示。 + +**方面4**:开源可复现 + +(2)可复现 + +优先有公开源码的论文,训练数据和训练参数齐全,近期公开/维护 + +#### Benchmark 是什么? + +**基本定义** + +- 在学术研究中,Benchmark 通常是: + - 一个公开可用的 **标准数据集**(比如 COCO、ImageNet、HumanArt) + - 配有 **明确的评价指标**(如 AP、Accuracy、F1-score) + - 用于对不同模型/方法进行 **公平比较** + +##### 举例 + +| 领域 | Benchmark 示例 | 作用 | +|------|---------------|------| +| 图像分类 | ImageNet | 比谁分类准 | +| 人体姿态估计 | MS COCO / HumanArt | 比谁关键点预测准 | +| 自然语言处理 | GLUE / SuperGLUE | 比谁语言理解好 | +| 大模型能力 | MMLU / GSM8K | 比谁多任务泛化能力强 | + +一个完整的 Benchmark 往往包括: + +| 组件 | 说明 | +|------|------| +| 数据集 | 统一的数据输入(比如图片、文本) | +| 标注 | 统一的"正确答案"或ground truth | +| 评价指标 | 用来打分,比如AP、Recall等 | +| 测试协议 | 比如是否允许使用额外数据、是否使用ground truth框等 | + +#### 4.3 看论文的流程 + +##### (1)标题:大致知道是做什么方面的工作 + +译为:QuickLLaMa:用于大型语言模型的查询感知推理加速 + +通过QuickLLaMa:知道大致在做一件加速的事情 + +##### (2)摘要&示意图:大致知道这篇论文在做什么事情 + +用户询问了关于哈利波特中很细节的问题,普通的Llama3无法给出回答,但是QuickLlama可以在30s内阅读完一本100k token的哈利波特并给出准确回答。 + +如果对这篇文章不感兴趣的话,可以去看下一篇文章了。 + +##### (3)深入看方法/架构示意图:知道这篇论文大致是在用什么框架/方式来实现这件事情 + +###### 图示关键词解释 + +| 名称 | 含义 | 用途 | 举例 | +|------|------|------|------| +| Global Tokens (G) | 模型运行时始终存在的全局信息,如系统提示、任务说明等 | 作为整个推理过程中每一步都可访问的公共信息;增强模型对任务和角色的理解 | 系统提示:"你是一个图书问答助手" | +| Query Tokens (Q) | 用户输入的问题或查询句 | 用来指导模型重点关注哪些记忆块(Memory Blocks) | "哈利第一年结束时金妮指向了谁?" | +| Context Tokens (C) | 模型历史接收过的长文本内容,被拆分成很多 memory blocks 存入"记忆"中 | 构成"记忆仓库";供后续从中查找与 Query 或当前生成位置相关的上下文信息使用 | 整本《哈利·波特》的文本内容被切分成块 | +| Memory Blocks (B) | 上述 Context Tokens 划分后的一块块"笔记段落" | 用来支持查询感知(query-aware)的查找:哪些内容是现在需要调出来使用的 | Block 1 是"火车站送别",Block 2 是"魔法课" 等 | +| Query-related Blocks (R) | 与 Query 或 Current Token 高度相关的 memory blocks | 是从 Memory Blocks 中"筛选"出的重要内容,用于当前推理窗口 | 当前提问与"火车站"段落相关,系统只加载这几段 | +| Local Tokens (L) | 当前生成位置前的短距离上下文 token(相对于 Current Token) | 让模型知道"现在在哪",并为相关性打分提供"当前位置的上下文" | "昨天张三来了,他…" 是生成"是"之前的 L | +| Current Token (H) | 当前要生成/预测的 token 的隐藏向量表示(注意力机制中的 query 向量) | 用于决定当前哪些 memory block 有用(用于 s(B, H) 打分) | 当前正要生成当前准备生成/预测的那个 token"他是___"的"是"这个词 | +| Current Key-Value Cache (M) | 当前这一步模型使用的 key/value 信息组合,包含 G, Q, R, L 四部分 | 作为 Attention 层的输入;也是每一步模型做决策时真正"看到"的全部上下文 | 当前模型输入 = 全局说明 + 问题 + 相关段落 + 上下文 | + +**疑惑**:先有的RAG和QuickLLaMa谁出现时间较早?它们有什么区别? + +——>使用AI工具,用kimi k2查询得到以下对比表格: + +| 维度 | RAG(2020年) | QuickLLaMA(2024年) | +|------|-------------|---------------------| +| 核心机制 | 在生成前,**先检索外部文档**,再让 LLM 结合检索结果生成答案 | **在生成过程中**,动态从长上下文中**查找与查询相关的片段** | +| 数据来源 | 通常是**外部知识库**(如 Wikipedia、向量数据库) | 是**当前输入的长文本本身**(如一本书、一篇长文) | +| 是否需要训练 | 需要训练检索器和生成器 | **无需训练**,可直接插入现有 LLM | +| 使用场景 | 回答**知识密集型问题**(如"2024 年奥运会举办城市") | 回答**长文本内部问题**(如"哈利·波特中谁最后拿到魔杖?") | +| 检索粒度 | 以**文档或段落**为单位 | 以**token 或记忆块**为单位,更细粒度 | + +##### (4)看实验表格结果:看这篇论文的方法比较的baseline有哪些,明确这论文的**优势和提升**是什么 + +图一第一列展示了,不同 benchmark 中的任务(多项选择问答、阅读理解题、对话摘要...) + +第一行:方法对比;第二行:上下文窗口大小(Context Window) + +该方法可以在长文本输入的Benchmark(基准测试)上取得很好的效果。 + +| 方法名称 | 是否需要重新训练 | 是否 Query-aware(查问题重点) | 推理速度 | 显存占用 | 记忆能力 | 综合表现 | +|---------|----------------|------------------------------|---------|---------|---------|---------| +| LLaMA3-8B-1048K | 需要 | 否 | 慢 | 极高 | 很强(靠训练) | 精度高但代价大 | +| StreamingLLM (Stream) | 不需要 | 否 | 快 | 中等 | 差(会忘) | 快但记不住长文本 | +| InfLLM | 不需要 | 否 | 快 | 低 | 一定记忆力 | 比 Stream 更强,但不够聪明 | +| QLLM (QuickLLaMA) | 不需要 | 是 | 最快 | 最低 | 最强(精准查找) | 表现最全面优秀 | + +图二展示了该方法在显存占用和时间上面和baseline的对比,Llama3都显存占用会随着token数量增加呈现指数增长,很快就会OOM超显存,但本文方法最多只使用了20b左右的显存,且时间增长是线性的。故有此结论,该方法相比于之前的baseline在性能、显存占用、速度都有提升。 + +如果对这篇文章不感兴趣的话,认为某个步骤写的不好,可以去看下一篇文章了 + +##### (5)进一步看表格内部的baseline:找baseline对应论文,用上面的流程再读一遍 + +比如这里比较了英伟达的Stream LLM,去找这篇baseline对应的论文,用上面的流程再读一遍,把表格里面所有的baseline都搞懂,就差不多理解当前这篇论文了 + +##### (6)正文/代码:想有哪些地方可以改进,基于当前文章产生一个idea + +#### 4.4 代码跑通流程 + +(1)去 Papers with Code /github等搜索任务关键词。 + +(2)选有官方代码+有训练脚本+最近一年有更新的论文代码(有readme文件、环境版本号具体、参数详细、训练验证等使用教程清晰)。 + +(3)复现 = 配环境 → 下载数据 → 跑脚本 → 得到和作者差不多的分数。 + +**详细流程**:配置好代码环境和数据 → 理解代码运行逻辑(从主函数开始,哪些部分是数据处理,哪些是核心算法) → 基于哪些部分进行改进 → 对核心部分插入断点 + +##### 阶段1 代码理解 + +例如:MoTCoder这篇论文中的模型,通过拆分子模块的方式来对代码问题进行求解,那么你可以输入给他一个例子,观察它是如何对输入问题进行子模块的拆分,从而理解这个模型的运行逻辑。 + +如果代码库提供可视化,可以基于可视化来帮助理解。 + +##### 阶段2 在代码理解之上改进 + +基于现有代码进行改进,比如观察到论文中的attention热力图对某些局部信息没有体现,你就可以新增一个模块来重点关注这些局部细节信息。经过你的新增模块之后,再次绘制热力图,发现之前没有被标注的细节信息被highlight,那么可以证明你新增的模块是有效的。 + +**例子**:论文TagCLIP新增了一个Trusty Learner模块,作者在论文中配了对应的可视化示意图,来展示该模块的作用,用以验证该模块的有效性。 + +**论文研究问题**:现有的基于对比语言-图像预训练(CLIP)的零样本语义分割方法在处理未见类别时存在显著的误分类问题,尤其是容易将未见类别与语义相似的已知类别混淆。 + +**对于阶段2例子的详细解释** + +1. **研究问题:模型会把"没见过的东西"当成"见过的"** + +研究的核心问题是:在图像分割中,模型需要给每个像素打上正确的类别标签。但**很多模型只见过训练集里的"已知类别"**(比如飞机、汽车、牛),一旦遇到"没见过的类别"(比如盆栽、电视、沙发),它**常常会误认为这些新东西也是已知类别**。比如,它可能会把"盆栽"误认为是"瓶子",因为两者颜色或形状有点像。 + +2. **解决方法:让模型学会"这是不是我认识的东西"** + +TagCLIP 的方法是增加了一个 **"Trusty Token"**,它的工作就像一个"可信度检测器"——**先判断这个像素是不是已知类别**。如果它觉得"不像是我认识的东西",就会**抑制**模型给它贴上已知类别的标签。 + +3. **为什么要放 Fig.4?** + +**Fig.4 就是用来证明这个"可信度检测器"真的好用。** + +- 图里左两列显示,检测器对"已知类别"的反应很明显(像飞机、汽车这些它认识的东西被高亮) +- 右一列显示,它对"未知类别"几乎不亮,说明它能**有效忽略没见过的东西** + +简单说,**这张图是"证据"**,让读者一眼就能看出: + +> "看!我们的新方法确实能分清什么是它见过的,什么是它没见过的。" + +#### 4.5 怎么读代码 + +**目标**:搞清楚"哪一段代码是我未来要改的地方" + +**流程**: + +##### 情况1:普通github代码 + +整体框架粗读,重点部分代码亲自跑一遍(插断点),一行行去看其中的变量是如何变化的、变量的形状是什么。 + +##### 情况2:代码库 + +比如在**大模型训练**中常见的**代码库LLaMA-Factory** + +或者在视觉检测中常见的**MMDetection**,但这个代码库的封装很厉害,找变量入口和变化方式都很麻烦。因此这种类型的库不必层层debug,无需完全理解它的代码运作流程,**会用即可**。在使用说明里面看,如何添加一个新的模型、数据集等。 + +**(1)粗读**: + +打开github仓库,先看 `README.md`,找到入口脚本(通常叫 `main.py` 或 `train.py`)。 + +**(2)细读**: + +在核心函数里打断点。 + +1. **IDE**:用 VS Code 打开代码,`F9` 打断点,`F5` 启动调试 +2. **断点**:让程序跑到这行就暂停,方便查看变量值 +3. **变量形状**:`print(x.shape)`,例如 `[32, 128, 768]` 表示 batch=32、序列长 128、特征维度 768 + +**具体例子**:在QuickLLaMA这篇文章中,它的核心框架是attention部分的实现,在代码中嵌套了方程来代替原本模型attention中的forward函数。除了论文中实现的QLLM之外,代码库还包含了这个方向的一系列论文,比如StreamLLM、LM-Infinite、InfLLM这些代码都是用同样的框架实现的,因此可以很容易比较他们之间的不同。 + +[StreamLLM论文](https://arxiv.org/pdf/2309.17453) + +[LM-Infinite论文](https://arxiv.org/pdf/2308.16137) + +#### 4.6 改进现有SOTA + +##### 从论文方法角度进行分析 + +效果好的论文,分成三类: + +**(1)效果好,方法创新——顶级论文** + +能否把这个方法用在新领域,比如Transformer出了之后——>做vision Transformer、Mamba出了之后——>做vision Mamba、Sam出了之后——>做3D Sam。 + +- **优点**:如果是第一个把这个方法用在新领域的人,会受到很多关注 +- **缺点**:竞争大,各大机构都在同台竞技 + +**(2)效果好,方法简单** + +- **缺点**:方法简单但改进有难度 + +**法1**:可以把一项工作尝试用在新领域 + +MOOD的这篇CVPR论文就是把掩码图像建模用在了异常检测方面。掩码图像建模方法在很多领域都证明了其有效性,但未在异常检测领域进行应用,可以实验证明该方法在异常检测的各个方向上是有效的。 + +**法2**:把这篇论文和其他论文的方法相结合(不只是ABC模块组合,也可以是A模块+B方法+C评价指标) + +比如MOODv2就是把**MOOD结合**上**新的预训练策略BEiTv2**再**结合新的异常检测指标ViM** + +**(3)效果好,方法复杂** + +因为方法复杂,尝试把方法进行拆解,把某些**模块替换**成你觉得更好的模块或把某些**模块简化** + +##### 两种通用的方法 + +**法1**:找到现有方法在某些场景不work的缺陷,去掉现有方法成立的一些必要条件 + +现有方法缺陷:比如QuickLLaMa这篇,核心框架是:利用问题在长文本中进行关键信息的查找,有一种情况是,如果用户先输入的是长文本但是却不输入问题,在这种情况下可以改进这一点来形成新的文章。 + +**核心思路就是:去掉现有方法成立的一些必要条件。** + +在新的场景下,这些现有方法就不work了,你就可以针对这种新场景来完成一篇论文。 + +**法2**:关注新出的Benchmark + +比如HumanArt数据集是第一个在艺术领域上的姿态检测数据集,之前的人体姿态估计方法在这个数据集上的效果不好,于是出现了VLPose这个方法,在艺术检测这个数据集上和通用数据集上都做出了改进,形成一篇新论文。 + +**法3**:添加新的Benchmark、消融实验、Task + +当idea已经证明可行,但性能不是SOTA时: + +- **前提建议**:选题阶段即对标SOTA + +- **已验证有效但非SOTA性能:改进与发表策略** + +**(1)尝试和现有SOTA相结合** + +**(2)无法结合SOTA时考虑:是否必须对比?** + +可能**无需比较**的情况: + +- 情况1:是arxiv的预印本,还没有中稿 +- 情况2:是同期工作 + +**必须比较**的情况(想尽办法去证明你的工作是有价值的): + +**方法1**:添加新的 Benchmark(覆盖更多任务维度,提升普适性说服力) + +- 某单一任务性能不如SOTA,但在其他10个任务上表现领先 +- 在多跳推理上优于SOTA,虽然单跳问题上稍逊 + +**方法2**:加新的消融实验(精细化对比同一设置下的表现) + +**原则**: + +- 比较对象限定为同等规模模型/方法 +- 若你贡献在于训练策略,仅需对比其他训练策略 +- 开源只和开源比,小贡献但有价值 + +**方法3**:添加新的task(做别人做不到或未做之事,强调独特性) + +- 多模态模型实现视觉+语音+语言,领先仅支持视觉+语言的方法 +- 能处理2小时视频而非其他方法仅支持2秒视频 +- 引入新语言/场景/规模等独特任务设定 + +**总结** + +若以上方法均尝试后性能仍无竞争力,该idea或许尚不成熟。 + +**科研初期优先级建议**: + +- **效果优于创新**:方法普通但效果好,也值得发表 +- **工程贡献也是贡献**:通过数据工程、训练技巧取得SOTA,也会获得关注 + +> 例如:无需新颖方法,仅凭高质量数据 + 大参数量 + 微调策略也能发表高水平成果(如许多大模型训练类论文)。 + +#### 4.8 怎么把论文的故事讲好 + +**目标**:让审稿人快速相信"你的工作合理且有效" + +##### 解释为什么A+B是有效的 + +**(1)理论上** + +验证A+B > A,用公式推导进行证明(最有说服力,但很多情况下无法用理论求解) + +**(2)现象上** + +观察到了A中的一些现象,B这一模块可以弥补这一缺陷,为什么能够弥补,可以搭配一些可视化,与**4.4 代码跑通流程阶段2 在代码理解之上改进**这部分的原理是相同的 + +**(3)工程上** + +把系统中的每个模块都相对应的**比较同期模块**,验证你的系统所采用的模块是最有效的。 + +**例如** MOOD这篇论文比较了不同的预训练策略、不同的模型架构、不同的OOD检测指标,证明在这个系统中所使用的每一个模块都是最优的。 + +**什么是OOD检测?** + +在现实世界中,很多AI系统面临这样的问题:它们在训练时只见过一部分"已知的数据"(称为**In-Distribution(ID)数据**),但测试或应用时可能会遇到"陌生的数据"(即**Out-of-Distribution(OOD)数据**)。OOD检测的任务就是要让AI系统学会识别出这些陌生的、没见过的数据,并避免错误地对它们做出判断。 + +**(4)总结** + +把论文的**形成过程**讲清楚,包括整个**系统的脉络**、以及**每个模块的作用**、每个模块都要配合对应的**消融实验**来验证模块的有效性 + +--- + +## 三、怎么3天速成一篇论文 + +### 工具 + +- **GPT-4o**(英文) + **DeepSeek**(中文) +- **LaTeX格式论文在线编译网站**:[Overleaf](https://www.overleaf.com/login) + +[Overleaf知乎简介](https://zhuanlan.zhihu.com/p/694594439) + +### 应用举例 + +**(1)给图片写标题**:向GPT输入:图片+提示词(例如:给图片写英文latex格式的caption) + +**(2)写相关工作**:相关工作的每篇论文摘要粘贴下来,输入给GPT可生成一个相关工作初稿 + +**(3)介绍数据集**:将数据集相关介绍输入给GPT生成data部分的段落 + +**(4)组会汇报**:做PPT可以使用DeepSeek:把一周工作内容输入给DeepSeek做PPT,将生成的表格直接粘贴到PPT中,提高工作效率 diff --git a/external/ai-research-ebook/src/content/docs/review/structured.mdx b/external/ai-research-ebook/src/content/docs/review/structured.mdx new file mode 100644 index 0000000..34e4b6d --- /dev/null +++ b/external/ai-research-ebook/src/content/docs/review/structured.mdx @@ -0,0 +1,241 @@ +--- +title: 结构化审稿 +description: 从让它挑刺到迭代闭环的审稿流水线 +sidebar: + order: 1 +--- + + + +## 1. 审稿流水线概览 + +```mermaid +flowchart TD + A(初稿完成) --> B(多模型并行审稿) + B --> C(交叉验证意见) + C --> D(按优先级排序) + D --> E(批量修复) + E --> F(验证修复) + F --> G{通过?} + G -->|否| B + G -->|是| H(定稿) + + classDef key fill:#f8fafc,stroke:#10a37f,stroke-width:1.5px,color:#111827 + class A,H key + + +``` + +--- + +## 2. 审稿输出要结构化 + +审稿必须回答以下关键问题: + +| 问题 | 重要性 | +|------|-------| +| 哪条 claim 缺证据? | 🔴 高 | +| 哪个实验最关键但没做? | 🔴 高 | +| 哪个 baseline 必须补? | 🔴 高 | +| 哪段叙事最像空话? | 🟡 中 | +| 哪个地方最容易被说不新? | 🔴 高 | + +--- + +## 3. 审稿输出模板 + +```markdown +# 审稿意见 + +## 1. 缺证据的 Claim + +| Claim | 问题 | 需要补充 | +|-------|------|---------| +| XXX机制是关键创新 | 没有消融实验 | 去掉XXX后的性能对比 | +| 显著优于SOTA | 评价指标不公平 | 统一指标后重新对比 | + +## 2. 缺失的实验 + +| 实验类型 | 现状 | 需要补充 | +|---------|------|---------| +| 压力测试 | 无 | 低资源/噪声/分布外测试 | +| 消融实验 | 不完整 | 每个模块的独立贡献 | + +## 3. 缺失的 Baseline + +| 方法 | 年份 | 问题 | 需要 | +|------|------|------|------| +| YYY方法 | 2024 | 最新强baseline | 补充对比 | + +## 4. 空话段落 + +| 位置 | 问题 | 建议 | +|------|------|------| +| 3.2节第二段 | 显著提升无数据 | 补充具体数字或删除 | + +## 5. 创新性质疑预案 + +| 可能的质疑 | 应对策略 | +|-----------|---------| +| 只是简单组合 | 强调发现的XXX insight | +| 不公平对比 | 补充公平对比实验 | +``` + +--- + +## 4. TODO 转化模板 + +每条意见对应一个改动 + 验收标准: + +```markdown +# TODO List + +## 紧急(提交前必须完成) + +- [ ] 补消融实验 + - 内容: 去掉模块 X + - 验收: 指标下降 ≥ 5% + +- [ ] 补公平对比 + - 内容: 训练步数对齐 + 算力对齐 + - 验收: 与 YYY 方法公平对比 + +- [ ] 补压力测试 + - 内容: 低资源/噪声/分布外测试 + - 验收: 每个场景至少 1 组实验 + +## 重要(提升质量) + +- [ ] 重写3.2节 + - 内容: 添加具体数据或删除空洞表述 + - 验收: 每段有具体数字支撑 + +- [ ] 增加与ZZZ的对比讨论 + - 内容: 强调我们的 XXX insight + - 验收: 明确说明区别和优势 + +## 可选(锦上添花) + +- [ ] 补充人类评估实验 +- [ ] 增加可视化分析 +``` + +--- + +## 5. 多模型审稿配置 + +### 5.1 模型分工 + +| 模型 | 侧重点 | Prompt 重点 | +|------|-------|-----------| +| Claude Opus 4.6 | 整体逻辑 | 叙事连贯性、创新性 | +| GPT-5.2 Pro | 技术细节 | 方法正确性、实验设计 | +| Gemini Pro | 可复现性 | 代码完整性、数据可用性 | + +### 5.2 审稿 Prompt + +```python + +你是一位 ["会议"] 的资深审稿人。请严格审查以下论文: + +["粘贴论文内容"] + +请从以下角度审查: + +1. **创新性 (Novelty)** + - 主要贡献是什么? + - 与之前工作有何不同? + +2. **技术正确性 (Technical Soundness)** + - 方法是否正确? + - 理论是否成立? + +3. **实验完整性 (Experiments)** + - Baseline 是否足够? + - 消融实验是否完整? + +4. **写作质量 (Writing)** + - 逻辑是否清晰? + - 表述是否准确? + +请用以下格式输出: + +--- +## Overall Score: (1-5) + +## Strengths: +- ... + +## Weaknesses: +1. ["严重"] ... +2. ["中等"] ... +3. ["轻微"] ... + +## Detailed Comments: +... +--- + +``` + +--- + +## 6. 迭代循环 + +### 6.1 10+ 轮迭代流程 + +```mermaid +flowchart TD + A(第1轮审稿) --> B(整理意见) + B --> C(按优先级排序) + C --> D(选择 Top 3-5 问题) + D --> E(批量修复) + E --> F(验证修复) + F --> G{满意?} + G -->|否| A + G -->|是| H(进入下一轮) + + +``` + +### 6.2 迭代原则 + +1. **不要贪多**:每轮只修复 3-5 条 +2. **优先级排序**:先解决最致命的 +3. **验证修复**:修复后重新审稿确认 +4. **记录进度**:保留修改历史 + +### 6.3 审稿闭环增强(补充) + +来自 `AI research.md` 与 `vibe` 并集经验的补充做法: + +- 每轮审稿输出后先做 **Issue 聚类**(证据不足 / 实验缺口 / 叙事问题 / 格式问题) +- 每类只挑 Top 1-2 个高影响问题进入当轮修复,避免“全面开花但都不深” +- 对每个修复项明确“验证证据”字段(新增实验、修改段落、补引用) +- 保留一份 **审稿→修复映射表**,方便 Rebuttal 时直接引用 + +--- + +## 7. 常见问题与应对 + +| 问题 | 应对策略 | +|------|---------| +| 审稿意见冲突 | 以技术细节为准 | +| 无法复现的实验 | 补充复现步骤 | +| 创新性被质疑 | 增加对比实验 | +| 实验设计被质疑 | 解释设计理由 | +| 写作被吐槽 | 精修语言表达 | + +--- + +## 8. 审稿检查清单 + +### 8.1 提交前检查 + +- [ ] 所有 claim 都有实验支撑 +- [ ] 强 baseline 都已对比 +- [ ] 消融实验完整 +- [ ] 压力测试覆盖边界情况 +- [ ] 引用格式正确 +- [ ] 语言表达清晰 +- [ ] 图表清晰可读 +- [ ] 补充材料完整 diff --git a/external/ai-research-ebook/src/content/docs/review/templates.mdx b/external/ai-research-ebook/src/content/docs/review/templates.mdx new file mode 100644 index 0000000..fcd5012 --- /dev/null +++ b/external/ai-research-ebook/src/content/docs/review/templates.mdx @@ -0,0 +1,134 @@ +--- +title: 会议审稿模板 +description: 不同会议的特定审稿标准和模板 +sidebar: + order: 2 +--- + +## 1. 会议特定审稿模板 + +不同会议有不同的审稿标准,以下是定制化模板要点: + +--- + +## 2. 审稿标准对比 + +| 会议 | 审稿重点 | 常见质疑 | +|------|---------|---------| +| **NeurIPS** | 理论创新 + 实验验证 | "神经科学合理性?""SOTA 对比?" | +| **ICML** | 数学严谨 + 理论分析 | "证明是否完整?""设定是否合理?" | +| **ICLR** | 表示理解 + 可视化 | "真正学到了什么?""可视化?" | +| **CVPR** | 实验完整性 | "消融是否充分?""数据集是否公平?" | +| **IROS** | 系统实现 + 真实场景 | "硬件实现?""真实机器人验证?" | +| **ACL/EMNLP** | 语言学洞察 + 评估 | "人类评估?""定性分析?" | + +--- + +## 3. NeurIPS 审稿模板 + +### 3.1 评分标准 + +- **Originality**: 问题/方法/设定的创新性 +- **Significance**: 对领域的影响 +- **Quality**: 技术正确性和实验完整性 +- **Clarity**: 写作和展示质量 + +### 3.2 常见质疑 + +1. "神经科学合理性在哪里?" + - 回应:引用相关神经科学文献 + +2. "与现有方法X的区别是什么?" + - 回应:创建对比表格 + +3. "为什么只在这些数据集上测试?" + - 回应:解释数据集选择的合理性 + +--- + +## 4. ICML 审稿模板 + +### 4.1 评分标准 + +- **Relevance**: 是否符合会议主题 +- **Technical Correctness**: 数学是否正确 +- **Novelty**: 方法或理论的创新性 +- **Clarity**: 表述是否清晰 + +### 4.2 常见质疑 + +1. "理论分析不够完整" + - 回应:补充定理和证明 + +2. "设定是否合理?" + - 回应:论证假设的合理性 + +3. "理论结果与实验的关系不清晰" + - 回应:明确解释理论如何指导实验设计 + +--- + +## 5. ICLR 审稿模板 + +### 5.1 评分标准 + +- **Technical Quality**: 方法的正确性 +- **Novelty**: 创新性 +- **Reproducibility**: 可复现性 +- **Presentation**: 展示质量 +- **Insightfulness**: 洞察深度 + +### 5.2 常见质疑 + +1. "真正学到了什么表示?" + - 回应:添加表示可视化分析 + +2. "可视化不够" + - 回应:添加更多图表 + +3. "为什么这个表示有效?" + - 回应:添加理论或实验分析 + +--- + +## 6. CVPR 审稿模板 + +### 6.1 评分标准 + +- **Originality**: 创新性 +- **Quality**: 技术质量 +- **Clarity**: 清晰度 +- **Significance**: 重要性 + +### 6.2 常见质疑 + +1. "消融是否充分?" + - 回应:添加每个模块的消融 + +2. "数据集是否公平?" + - 回应:确保训练/测试分离 + +3. "SOTA 对比是否完整?" + - 回应:补充最新方法的对比 + +--- + +## 7. IROS 审稿模板 + +### 7.1 评分标准 + +- **Originality**: 创新性 +- **Technical Quality**: 技术质量 +- **Presentation**: 展示质量 +- **Hardware/Real-world**: 硬件实现或真实场景验证 + +### 7.2 常见质疑 + +1. "硬件实现了吗?" + - 回应:描述硬件设置 + +2. "真实机器人验证了吗?" + - 回应:添加真实实验结果 + +3. "仿真到实际的差距?" + - 回应:讨论 sim-to-real 问题 diff --git a/external/ai-research-ebook/src/content/docs/tools/overview.mdx b/external/ai-research-ebook/src/content/docs/tools/overview.mdx new file mode 100644 index 0000000..f9145f5 --- /dev/null +++ b/external/ai-research-ebook/src/content/docs/tools/overview.mdx @@ -0,0 +1,205 @@ +--- +title: 工具总览 +description: AI 研究全流程工具选择矩阵 +sidebar: + order: 1 +--- + + + +## 1. 工具选择矩阵 + +```mermaid +flowchart TD + subgraph ["调研"] + A[Elicit] --> B(文献检索) + C[Sci-Reasoning] --> D(创新分析) + end + + subgraph ["实现"] + E[Claude Code] --> F(代码生成) + G[LangGraph] --> H(工作流编排) + end + + subgraph ["写作"] + I[Prism] --> J(论文写作) + K[PaperBanana] --> L(图表生成) + end + + subgraph ["审稿"] + M[Claude + GPT-5.2] --> N(多模型审稿) + end + + + +``` + +| 任务阶段 | 推荐工具 | 备选方案 | 选择理由 | +|---------|---------|---------|---------| +| **文献检索** | Elicit | Consensus, Semantic Scholar | 1.25亿+论文, 自动化综述 | +| **文献管理** | Zotero-MCP | Mendeley, Papers | Claude 集成, 语义搜索 | +| **代码生成** | Claude Code | GPT-5.2, Codex | 200K上下文, 80.9% SWE-bench | +| **Agent编排** | LangChain/LangGraph | CrewAI, AutoGen | 灵活工作流, 强大社区 | +| **论文写作** | Prism | Overleaf | GPT-5.2 集成, LaTeX 原生 | +| **审稿模拟** | Claude + GPT-5.2 | Gemini Pro | 多模型交叉验证 | +| **画图** | PaperBanana + Mermaid | D3.js, Figma | 自动化 + 版本控制 | + +--- + +## 2. 工具能力对比 + +### 2.1 LLM 能力对比 + +| 模型 | 上下文 | SWE-bench | ARC-AGI | 适用场景 | +|------|--------|-----------|---------|---------| +| **Claude Opus 4.6** | 200K | 80.9% | - | 长文档、代码 | +| **GPT-5.2 Pro** | - | - | 90%+ | 复杂推理 | +| **GPT-5.2 Thinking** | - | - | - | 深度分析 | +| **Gemini 2.5 Pro** | 1M+ | - | 49.35% | 超长文档 | + +### 2.2 文献检索工具对比 + +| 工具 | 论文数 | 特色 | 价格 | +|------|--------|------|------| +| **Elicit** | 1.25亿+ | 自动化综述 | 免费+付费 | +| **Semantic Scholar** | 2亿+ | AI驱动 | 免费 | +| **Consensus** | - | 证据搜索 | 免费+付费 | +| **Scite** | - | 引用质量 | 付费 | + +--- + +## 3. 快速参考 + +### 3.1 常用命令速查 + +```bash +# Claude Code +npm run dev # 启动开发服务器 +astro build # 构建项目 +astro preview # 预览构建结果 + +# MCP +mcp list # 列出已安装的 MCP 服务器 +mcp install zotero # 安装 Zotero-MCP + +# 文献检索 +elicit search "topic" # Elicit 搜索 +``` + +### 3.2 关键链接汇总 + +| 资源 | 链接 | +|------|------| +| **Sci-Reasoning** | https://github.com/AmberLJC/Sci-Reasoning | +| **The AI Scientist** | https://github.com/SakanaAI/AI-Scientist | +| **Elicit** | https://elicit.com | +| **Prism** | https://openai.com/prism/ | +| **claude-scientific-skills** | https://github.com/K-Dense-AI/claude-scientific-skills | +| **LangChain** | https://github.com/langchain-ai | +| **LlamaIndex** | https://github.com/run-llama | + +--- + +## 4. 根目录项目/论文内容并入说明 + +以下内容来自你根目录的项目与论文文件, 已并入现有章节(未上传 PDF 文件本体): + +| 来源 | 并入内容 | 已落地章节 | +|---|---|---| +| 2601.14525 + Automated-AI-Researcher | execution-grounded 自动科研执行闭环(idea→patch→run→feedback) | `idea/projects`, `code/agents` | +| 2601.20833 + Idea2Paper | pre-computation + KG + anchored review 的叙事生成路线 | `idea/projects` | +| 2601.23265 + PaperBanana | 自动学术插图框架、基准与工程策略 | `figures/tools` | +| AutoFigure-edit README | 方法图到可编辑 SVG 的工程流水线实践 | `figures/tools` | + +### 4.1 额外说明 + +- `AI research.md` 的增量内容已融合到现有章节正文(idea / code / figures / writing / review / tools),未新增独立来源页。 +- `vibe` 三文档已先做并集去重,再融合到现有 `2. 代码实现` 及相关工作流章节。 +- 严格来源映射表见 [`library/root-assets`](../library/root-assets) 的“严格映射清单(来源 → 现有章节)”。 + +--- + +## 5. Book 实战增补(逐篇并入) + +### 5.1 1) VSCode Agent Skills:从启用到复用 + +来源:`book/在_VScode_中玩转_Agent_Skills(科研工作者必备skill推荐_一定要收藏).md` + +#### 5.1.1 详细步骤(VSCode 路线) + +1. 打开设置并启用 `chat.useAgentSkills`。 +2. 在项目内创建目录:`.github/skills//`。 +3. 创建 `SKILL.md`,写清触发条件、输入输出、执行步骤。 +4. 按需添加资源文件(示例、脚本、模板)。 +5. 在会话中通过任务描述触发,验证 skill 是否被自动加载。 + +#### 5.1.2 复用策略 + +- 优先复用社区技能库,再做本地改造; +- 改造时优先替换路径、命名、验证命令; +- 先用小样本测试,再扩展到完整任务。 + +#### 5.1.3 文章细节补充(VSCode 实操顺序) + +1. 先创建一个最小 skill(仅 1 个步骤),验证可触发。 +2. 再添加 `workflow-example` 与脚本资源,验证可读取。 +3. 最后引入社区 skill 并本地改造,避免一次导入过大难排错。 + +#### 5.1.4 推荐社区资源(与原文一致) + +- `awesome-copilot`(社区技能集合) +- `anthropics/skills`(官方参考) +- `K-Dense-AI/claude-scientific-skills`(科研场景) + +### 5.2 2) 三 CLI 联动:Claude + Codex + Gemini + +来源:`book/老金开源_Claude4_5_Codex5_1_Gemini3_3大顶级CLI终极联动整合技巧_省钱_高质量_快_.md` + +#### 5.2.1 详细步骤(最小可跑版) + +1. 安装三个 CLI:Claude Code、Codex CLI、Gemini CLI。 +2. 配置 API 与认证(优先图形化管理,避免手工环境变量错误)。 +3. 先从 `Command` 模式启动:分析 → 生成 → 审查。 +4. 任务稳定后升级到 `Skill` 模式(保存中间结果与重试机制)。 +5. 长周期协作用 `MCP` 打通上下文,再按需引入 Subagent 与 Hooks。 + +#### 5.2.2 五种编排方式对照 + +| 方式 | 适用 | 风险 | +|---|---|---| +| Command | 快速、一次性任务 | 复用差、可观测性弱 | +| Skill | 多步骤稳定流程 | 初期配置成本较高 | +| MCP | 长会话与系统互联 | 服务器与权限管理复杂 | +| Subagent | 并行提速 | token 成本上升 | +| Hooks | 自动质检 | 误触发与调试复杂 | + +#### 5.2.3 常见坑提醒 + +- CLI 订阅/授权失效; +- 代理/网络导致认证失败; +- sandbox 权限不足导致写入失败; +- 多模型切换后输出格式漂移。 + +#### 5.2.4 文章细节补充(三CLI联动最小命令) + +```bash +# 1) 安装 +npm i -g @anthropic-ai/claude-code +npm i -g @openai/codex +npm i -g @google/gemini-cli + +# 2) 鉴权(示意,按各自官方流程) +gemini auth login +codex auth login + +# 3) 在 Claude 内先跑 Command 模式 +/ai-team "实现一个最小登录接口并附测试" +``` + +#### 5.2.5 五编排方式的选型建议(更细) + +- 30 分钟内一次性任务:`Command` +- 反复执行的标准流程:`Skill` +- 需要跨系统持久上下文:`MCP` +- 模块可并行且预算允许:`Subagent` +- 固定时机自动质检:`Hooks` diff --git a/external/ai-research-ebook/src/content/docs/tools/workflow.mdx b/external/ai-research-ebook/src/content/docs/tools/workflow.mdx new file mode 100644 index 0000000..ff11b10 --- /dev/null +++ b/external/ai-research-ebook/src/content/docs/tools/workflow.mdx @@ -0,0 +1,528 @@ +--- +title: 完整工作流 +description: 从 idea 到论文发表的完整时间线和步骤 +sidebar: + order: 2 +--- + +import { Card, CardGrid } from '@astrojs/starlight/components'; + +## 1. 完整研究时间线 + +```mermaid +gantt + title 14周顶会论文发表时间线 + dateFormat YYYY-MM-DD + section 调研 + Elicit扫描 :a1, 2026-02-10, 5d + Sci-Reasoning :a2, after a1, 5d + Gap清单产出 :a3, after a2, 4d + section 设计 + 项目文档 :b1, after a3, 5d + 实验计划 :b2, after b1, 3d + section 实现 + 核心代码 :c1, after b2, 14d + 主实验 :c2, after c1, 7d + 消融实验 :c3, after c2, 5d + section 写作 + 初稿 :d1, after c3, 10d + 图表 :d2, after d1, 5d + section 审稿 + 自动审稿 :e1, after d2, 5d + 迭代修改 :e2, after e1, 5d + section 投稿 + 最终版 :f1, after e2, 3d + 提交 :f2, 2026-05-20, 1d + + +``` + +--- + +## 2. Week 1-2: 调研阶段 + +### 2.1 目标 +产出结构化的研究地图和空白清单 + +### 2.2 详细工作流 + +```mermaid +flowchart LR + A(Elicit 扫描) --> B[Semantic Scholar] + B --> C[Sci-Reasoning] + C --> D(整理研究地图) + D --> E(产出 Gap 清单) + + classDef key fill:#f8fafc,stroke:#10a37f,stroke-width:1.5px,color:#111827 + class A,C,E key + + +``` + +### 2.3 具体任务 + +1. **使用 Elicit** 扫描领域关键词(1-2天) +2. **使用 Semantic Scholar** 探索研究脉络(1-2天) +3. **使用 Sci-Reasoning** 分析创新模式(2-3天) +4. **整理研究地图**(2-3天): + - 问题子类分类 + - 方法范式分类 + - 评测基准整理 + +### 2.4 产出 + +| 产出物 | 说明 | +|-------|------| +| Research Gap 清单 | 10-20个候选方向 | +| Benchmark & Metric Sheet | 主流数据集和指标 | +| Assumption Matrix | 隐含假设分析 | + +--- + +## 3. Week 3: 项目设计 + +### 3.1 目标 +确定研究问题和实验计划 + +### 3.2 详细工作流 + +```mermaid +flowchart TD + A(Claude Code 生成文档) --> B(GPT-5.2 审查) + B --> C(人工Review) + C --> D(确定实验计划) + + classDef review fill:#f8fafc,stroke:#10a37f,stroke-width:1.5px,color:#111827 + classDef audit fill:#eff6ff,stroke:#2563eb,stroke-width:1.5px,color:#1e3a8a + class A review + class B,C audit + + +``` + +### 3.3 具体任务 + +1. **生成项目文档**(使用 Claude Code, 2-3天) +2. **审查文档**(使用 GPT-5.2 Pro, 1天): + - claim-实验是否对齐? + - baseline 是否足够强? + - 是否有致命假设? +3. **确定实验计划**(1天): + - 主实验设计 + - 消融实验清单 + - 压力测试场景 + +### 3.4 产出 + +| 产出物 | 说明 | +|-------|------| +| 项目文档 | 20-30页详细文档 | +| 实验计划 | 主实验+消融+压力测试 | +| 里程碑时间表 | 每周任务分解 | + +--- + +## 4. Week 4-7: 代码实现 + 实验 + +### 4.1 目标 +完成实现和主要实验 + +### 4.2 团队配置 + +```mermaid +flowchart TD + subgraph ["开发团队"] + A[Architect x1] --> E(核心模块) + B[Implementer x2] --> E + C[Tester x1] --> F(测试评测) + end + + subgraph ["质量保障"] + F --> G(自动汇总) + end + + classDef role fill:#ecfeff,stroke:#0ea5e9,stroke-width:1.5px,color:#0f172a + class A,B,C role + + +``` + +### 4.3 具体任务 + +1. **并行开发**(Claude Code, 2-3周) +2. **实验执行**(1周): + - 主实验:与 baseline 对比 + - 消融实验:每个模块贡献 + - 压力测试:边界条件 +3. **结果汇总**(2-3天) + +### 4.4 产出 + +| 产出物 | 说明 | +|-------|------| +| 可复现代码库 | 完整的实验代码 | +| 实验结果 | 主表+消融+分析 | +| 复现指南 | 便于他人复现 | + +--- + +## 5. Week 8-9: 论文写作 + +### 5.1 目标 +完成论文初稿 + +### 5.2 写作流程 + +```mermaid +flowchart LR + A(Claude Opus 大纲) --> B(多实例并行写作) + B --> C(PaperBanana 图表) + C --> D(多模型协作完善) + + classDef writing fill:#f8fafc,stroke:#10a37f,stroke-width:1.5px,color:#111827 + class A,B,C writing + + +``` + +### 5.3 具体任务 + +1. **生成大纲**(Claude Opus 4.6, 1天) +2. **并行写作**(多实例, 5-7天) +3. **图表制作**(2-3天) + +### 5.4 产出 + +| 产出物 | 说明 | +|-------|------| +| 论文初稿 | 8-10页正文 | +| 所有图表 | 方法图、结果图 | +| 补充材料 | 额外实验、细节 | + +--- + +## 6. Week 10: 审稿迭代 + +### 6.1 目标 +通过多轮审稿迭代提升论文质量 + +### 6.2 审稿配置 + +| 轮次 | 模型 | 侧重点 | +|------|------|-------| +| 第1轮 | Claude Opus 4.6 | 整体逻辑 | +| 第2轮 | GPT-5.2 Pro | 技术细节 | +| 第3轮 | Gemini Pro | 可复现性 | + +### 6.3 具体任务 + +1. **多模型并行审稿**(2天) +2. **交叉验证意见**(1天) +3. **批量修改**(2天) + +### 6.4 产出 + +| 产出物 | 说明 | +|-------|------| +| 稳定投稿版本 | 准备提交 | +| 审稿意见记录 | 历史迭代 | +| 修改说明 | 响应记录 | + +--- + +## 7. Week 11: 投稿 + +### 检查清单 + +- [ ] 格式符合会议要求 +- [ ] 页数在限制内 +- [ ] 补充材料完整 +- [ ] 作者信息正确 +- [ ] 代码/数据链接有效 + +--- + +## 8. Week 12+: Rebuttal + +### Rebuttal 策略 + +| 意见类型 | 应对策略 | +|---------|---------| +| 可修复的 | 承诺修改, 补充说明 | +| 误解的 | 礼貌澄清, 补充证据 | +| 不同意但合理 | 讨论, 引用支持文献 | +| 不同意的 | 坚定反驳, 有理有据 | + +--- + +## 9. 时间线总览 + +``` +Week 1-2: ██████████████ 调研 +Week 3: ██████ 项目设计 +Week 4-7: █████████████████████████ 代码+实验 +Week 8-9: ██████████████ 写作 +Week 10: ██████████████ 审稿迭代 +Week 11: ████ 投稿 +Week 12+: ██████████████ Rebuttal(如需要) +``` + +### 执行闭环强化(补充) + +在 Week 4-10 阶段建议显式加入 execution-grounded 子循环: + +```mermaid +flowchart LR + A(Idea) --> B(Patch) + B --> C(Run) + C --> D(Feedback) + D --> A +``` + +- **Idea**:提出可验证改动(必须绑定指标) +- **Patch**:最小可执行改动(便于回滚) +- **Run**:在固定环境里跑通训练/评测 +- **Feedback**:记录收益/失败模式并更新下一轮计划 + +这样做可以把“灵感驱动”转换为“证据驱动”,减少无效迭代。 + +--- + +## 10. 每日任务模板 + +### 工作日(周一至周五) + +| 时间 | 任务 | 时长 | +|------|------|------| +| 09:00-10:00 | 计划与回顾 | 1h | +| 10:00-12:00 | 核心工作 | 2h | +| 14:00-17:00 | 深度工作 | 3h | +| 19:00-20:00 | 总结整理 | 1h | + +### 周末 + +| 时间 | 任务 | 时长 | +|------|------|------| +| 10:00-12:00 | 论文写作 | 2h | +| 14:00-17:00 | 审稿迭代 | 3h | +| 19:00-20:00 | 周总结 | 1h | + +--- + +
+ +**核心原则**:工具是辅助, 核心是你的研究洞察力。让 AI 帮你处理重复性工作, 把时间留给真正的思考。 + +
+ +--- + +## 11. Book 实战增补(逐篇并入) + +> 本节整合 6 篇工作流与 Skill 工程化文章,形成“规范定义 → 任务拆解 → 执行闭环 → 验证交付”的统一流程。 + +### 1) Skill 开发完全指南:从可用到可复用 + +来源:`book/Claude_Code_Skill_开发完全指南_从入门到精通.md` + +#### 结构化实践 + +- Skill 本质是标准作业流程(SOP),核心目标是稳定复现而非一次性发挥。 +- 目录按复杂度递进:最小可用 `SKILL.md` → 标准工作流(`workflow/` + `scripts/` + `config/`)。 +- 执行者分工:可确定任务交脚本,不确定任务交 Agent,协调任务交主会话。 + +#### 关键约束 + +- 能脚本化就脚本化,减少 token 消耗; +- Subagent 并行控制节奏(分轮执行 + `/compact`); +- 每一步都有验证点与可恢复状态(`progress.json`)。 + +#### 详细步骤(Skill 从 0 到 1) + +1. 先做最小版:只建 `SKILL.md`,跑通单步骤任务。 +2. 任务稳定后再拆 `workflow/stepNN-*.md`。 +3. 把可确定操作下沉到 `scripts/`,并统一 JSON 返回。 +4. 为每步定义检查点(文件存在、格式正确、字段完整、业务通过)。 +5. 增加断点恢复文件,确保中断后可继续执行。 + +#### 文章细节补充(执行者决策树) + +| 任务类型 | 推荐执行者 | 原因 | +|---|---|---| +| API 调用、文件转换、批处理 | 脚本 | 快、稳、低 token | +| 需要判断/生成/归纳 | Subagent | 语义处理更强 | +| 轻协调与流程推进 | 主 Agent | 全局可控 | + +建议:默认先脚本,只有脚本无法覆盖时再交 Agent。 + +### 2) Skill 最佳实践:文档驱动与需求模板 + +来源:`book/Claude_Code_Skill_最佳实践与创建规范.md` + +#### 三件必做 + +1. 全局约束写入 `CLAUDE.md`; +2. 输出样例放入参考资产(结果参照); +3. 需求清单模板化(输入、输出、约束、验收)。 + +#### 工程建议 + +- Skill 粒度控制在“单一职责 + 可组合”; +- 强制 Plan → Execute → Review 循环; +- `assets/` 作为素材库直取直用,减少上下文消耗。 + +#### 详细步骤(需求模板实装) + +1. 新建 `requirements.md`,固定十项:目标、输入、输出、约束、验收等。 +2. 缺失信息先问清,不允许“边做边猜”。 +3. 先用模板生成首版 Skill,再做两轮真实任务回测。 +4. 将回测问题反写到模板,持续迭代。 + +#### 文章细节补充(十项模板最小集合) + +1. Skill 名称与触发条件; +2. 场景与边界; +3. 必填输入与可选输入; +4. 输出类型与文件结构; +5. 主流程与分支流程; +6. 资源依赖(脚本/参考/资产); +7. 技术与业务约束; +8. 自动/手动验证方式; +9. 参考实现与链接; +10. 优先级与扩展计划。 + +### 3) Skill Creator MVP:先约束行为,再让 AI 写代码 + +来源:`book/我是如何用_Skill_Creator_把一个真实项目拆成一整套_Agent_Skills_的(MVP_实战).md` + +#### MVP 六件套(按项目按需启用) + +- `product-design.skill` +- `frontend-dev.skill` +- `backend-dev.skill` +- `api-contract.skill` +- `testing.skill` +- `deployment.skill` + +核心思想:Skill 要服从项目现实,不存在的模块不生成对应技能。 + +#### 详细步骤(MVP 六件套落地) + +1. 扫描仓库判断是否存在前后端/测试/部署。 +2. 仅为存在模块创建 Skill,其他跳过。 +3. `api-contract` 先行,前后端执行都以接口契约为准。 +4. `testing` 明确“什么算完成”,避免功能完成但不可验收。 + +#### 文章细节补充(各 Skill 的禁止项) + +- `product-design`:不写实现代码; +- `frontend-dev`:不擅自引新库/改工程配置; +- `backend-dev`:不改架构与数据库主结构; +- `api-contract`:只定义契约,不写实现; +- `testing`:不跳过失败用例; +- `deployment`:只记录当前真实发布方式。 + +### 4) Superpowers + Planning-with-Files:流程与记忆分层 + +来源:`book/大佬的Claude_Code是神器你的像玩具_Superpowers___Planning_with_Files的Skills组合拳让_Coding_Agent效率翻倍.md` + +#### 组合策略 + +- Superpowers:负责“流程纪律”(brainstorm → plan → execute → verify)。 +- Planning-with-Files:负责“外部记忆”(`task_plan.md`、`progress.md`、`knowledge.md`)。 + +#### 推荐闭环 + +1. 先澄清目标、受众、约束; +2. 写入结构化计划与验收; +3. 执行时持续记录进度; +4. 结束前跑验证并补齐证据。 + +#### 详细步骤(Superpowers + Planning Files) + +1. 触发 brainstorm 收集关键约束(目标、对象、时间、边界)。 +2. 产出计划并写入 `task_plan.md`。 +3. 每完成子任务更新 `progress.md`(含失败记录)。 +4. 关键决策沉淀到 `knowledge.md`,便于新会话接续。 +5. 交付前执行 verification,保存验证证据。 + +#### 文章细节补充(命令顺序) + +```text +/superpowers:brainstorm +/superpowers:write-plan +/superpowers:execute-plan +# 收尾执行 verification-before-completion +``` + +建议每次执行后同步三文件: + +- `task_plan.md`(目标与步骤) +- `progress.md`(过程与阻塞) +- `knowledge.md`(决策与约束) + +### 5) 规范驱动开发:拒绝“直接开写” + +来源:`book/拒绝屎山代码_让你的_Claude_code_具备类似高级架构师的全局规划与规范执行能力_附实操_.md` + +#### 章节增补要点 + +- AI 本质执行规格,不是自动理解业务语境。 +- 需前置限定:技术栈、目录结构、实现边界、阶段目标。 +- 将“计划文档、执行记录、验证命令”纳入硬门槛,避免伪完成。 + +#### 详细步骤(规范先行) + +1. 在 `CLAUDE.md` 固定四类限制:技术栈、目录、边界、验收。 +2. 任务开始先生成 PLAN,不允许直接进入编码。 +3. 每完成一个任务强制跑测试与审查。 +4. 未通过验证禁止标记完成。 + +#### 文章细节补充(强约束检查项) + +- 是否存在“先写后想”的越序行为; +- 是否缺少测试与验证命令; +- 是否改动了禁止目录或越界模块; +- 是否提供可复验结果(日志/测试报告)。 + +### 6) feature-dev + ralph-loop:规划引擎与长循环执行 + +来源:`book/用_Claude_Code_搭建_从需求到交付_的自动化工作流.md` + +#### 双引擎分工 + +- `feature-dev`:跑 7 阶段(Discovery → Review → Summary)。 +- `ralph-loop`:针对单任务持续迭代,直到达到 completion promise。 + +#### 实战模板 + +```text +feature-dev 负责:方向、架构、验收标准 +ralph-loop 负责:持续执行、测试打磨、问题收敛 +``` + +#### 适用场景 + +- 大特性拆解:先 `feature-dev`,再 `ralph-loop` 跑实现细节。 +- 测试补齐:让 `ralph-loop` 专注覆盖率与边界用例收敛。 + +#### 详细步骤(双引擎协作) + +1. 先用 `feature-dev` 产出设计与实施计划。 +2. 把计划转成 `ralph-loop` 的阶段任务与完成短语。 +3. 设置 `--max-iterations`,避免无限循环。 +4. 循环结束后回到 `feature-dev` 做最终 Review + Summary。 + +#### 文章细节补充(组合使用模板) + +1. `feature-dev` 产出:`DESIGN.md` + `IMPLEMENTATION_PLAN.md` + `QUALITY_CRITERIA.md`。 +2. `ralph-loop` 读取上述文档并分阶段执行。 +3. 每轮循环必须输出:完成内容、失败原因、下一轮计划。 +4. 达到 `completion-promise` 才允许结束循环。 + +### 本章统一检查清单(新增) + +- 是否先完成需求澄清与计划文档? +- 是否为关键步骤定义了验证标准? +- 是否记录了执行进度与中断恢复点? +- 是否把复用能力沉淀为 Skill/命令,而非临时对话? diff --git a/external/ai-research-ebook/src/content/docs/writing/collaboration.mdx b/external/ai-research-ebook/src/content/docs/writing/collaboration.mdx new file mode 100644 index 0000000..7b42201 --- /dev/null +++ b/external/ai-research-ebook/src/content/docs/writing/collaboration.mdx @@ -0,0 +1,217 @@ +--- +title: 多模型协作写作 +description: 使用多个 AI 模型协作进行论文写作 +sidebar: + order: 3 +--- + +import { Card, CardGrid } from '@astrojs/starlight/components'; + +## 1. 多模型协作概览 + +```mermaid +flowchart TD + subgraph ["写作流程"] + A(大纲生成) --> B(分段写作) + B --> C(一致性检查) + C --> D(整合优化) + end + + subgraph ["模型分工"] + E[Claude Opus 4.6] --> A + F[Claude Code] --> B + G[GPT-5.2 Pro] --> C + H[Gemini Pro] --> C + end + + + +``` + +--- + +## 2. AI-research-SKILLs + +"20-ml-paper-writing"模块制定了严格规则:**绝不凭记忆生成引用**, 强制 5 步: + +```mermaid +flowchart LR + A(检索) --> B(双源验证) + B --> C(获取官方 BibTeX) + C --> D(核对摘要) + D --> E(写入) + + + +``` + +覆盖 AI 科研全流程的 **77 项技能**(20 个技术板块)。 + +--- + +## 3. tmux 工作流配置 + +让 Claude / GPT-5.2 / Gemini Pro 分工协作: + +| tmux 实例 | 负责内容 | 模型选择 | 协作方式 | +|---------|---------|---------|---------| +| Instance 1 | Related Work | Claude Code | 文献梳理与对比 | +| Instance 2 | Method 写作 | Claude Code | 方法描述与形式化 | +| Instance 3 | 实验描述 | GPT-5.2 Pro | 实验设计和结果 | +| Instance 4 | 一致性校对 | Gemini Pro | 术语、符号统一 | + +--- + +## 4. 协作写作流程 + +### 4.1 阶段 1: 大纲生成 + +使用 Claude Opus 4.6 生成长大纲(200K 上下文) + +```markdown +# 论文大纲模板 + +## 1. Introduction (1.5页) +- 研究问题 +- 核心挑战 +- 你的贡献(3-4点) + +## 2. Related Work (2页) +- 领域分类 +- 主要方法 +- 你的定位 + +## 3. Method (4页) +- 问题形式化 +- 核心方法 +- 技术细节 + +## 4. Experiments (3页) +- 实验设置 +- 主结果 +- 消融实验 + +## 5. Conclusion (0.5页) +- 总结 +- 局限 +- 未来方向 +``` + +### 4.2 阶段 2: 分段写作 + +各实例并行处理不同章节: + +```bash +# tmux 窗口布局 +# ================= +# 窗口 1: Related Work +# 窗口 2: Method +# 窗口 3: Experiments +# 窗口 4: Introduction/Conclusion +# 窗口 5: 整合校对 +``` + +### 4.3 阶段 3: 一致性检查 + +使用专门实例校对一致性: + +| 检查项 | 工具 | 说明 | +|-------|------|------| +| 术语一致性 | Claude Code | 统一术语使用 | +| 符号一致性 | GPT-5.2 Pro | 数学符号检查 | +| 引用格式 | Gemini Pro | BibTeX 格式 | + +### 4.4 阶段 4: 整合优化 + +由最强模型整合所有内容, 确保叙事流畅。 + +--- + +## 5. 术语表管理 + +### 5.1 术语表示例 + +```markdown +# 术语表 (GLOSSARY.md) + +| 中文 | 英文 | 缩写 | 定义 | +|------|------|------|------| +| 注意力机制 | Attention Mechanism | Attn | ... | +| 多头注意力 | Multi-Head Attention | MHA | ... | +| 自注意力 | Self-Attention | SA | ... | +``` + +### 5.2 共享术语表工作流 + +```mermaid +flowchart TD + A(创建术语表) --> B(推送到共享仓库) + B --> C(各实例拉取最新) + C --> D(写作时引用) + D --> E(发现新术语) + E --> B + + + +``` + +### 5.3 使用建议 + +
+ + +单一文件管理所有术语, 避免分散 + + + +使用 Git 追踪变更, 可回滚 + + + +各实例定期更新术语表 + + + +建立术语决策流程 + + +
+ +--- + +## 6. 会议特定建议 + +| 会议 | 偏好 | 写作建议 | +|------|------|---------| +| **NeurIPS** | 神经科学结合 | 强调方法的生物学合理性 | +| **ICML** | 理论基础 | 增加理论分析和证明 | +| **ICLR** | 表示学习 | 侧重表示分析和可视化 | +| **CVPR** | 实验完整性 | 充分的消融和对比实验 | +| **ACL/EMNLP** | 语言学洞察 | 增加定性分析和案例分析 | + +--- + +## 7. 常见写作误区 + +
+ +❌ **"像论文但没信息"** - 缺乏实质贡献 + +❌ **过度声明** - claim 超出实验支持 + +❌ **忽略关键 baseline** - 对比不充分 + +❌ **叙事不清** - 逻辑跳跃 + +
+ +--- + +## 8. 协作检查清单 + +- [ ] 术语表已创建并同步 +- [ ] 各章节使用统一格式 +- [ ] 引用已验证 +- [ ] 符号系统一致 +- [ ] 叙事逻辑连贯 +- [ ] 实验claim对齐 diff --git a/external/ai-research-ebook/src/content/docs/writing/methods.mdx b/external/ai-research-ebook/src/content/docs/writing/methods.mdx new file mode 100644 index 0000000..7f88378 --- /dev/null +++ b/external/ai-research-ebook/src/content/docs/writing/methods.mdx @@ -0,0 +1,154 @@ +--- +title: 写作方法 +description: 论文写作的核心方法和论证链构建 +sidebar: + order: 1 +--- + + + +## 1. 写作核心原则 + +写作最核心的是:**让审稿人相信你的 claim**。 + +
+ +**核心流程**:论证链 → Outline → 文字生成 + +
+ +--- + +## 2. 构建论证链(不写正文) + +先把论文的"论证链"写出来: + +```mermaid +flowchart TD + A[Claim 1] --> B(需要哪些证据?) + A --> C(哪些是必要的?) + A --> D(哪些是锦上添花?) + + B --> E(主实验) + B --> F(消融实验) + B --> G(压力测试) + + +``` + +### 2.1 论证链示例 + +``` +Claim 1: 我们的方法在低资源场景下优于baseline +├── 主实验: 在3个数据集上对比, 指标提升X% +├── 消融: 验证每个模块的贡献 +└── 压力测试: 资源减少10%/50%/90%时的表现 + +Claim 2: 方法的关键创新是XXX机制 +├── 消融: 去掉XXX后性能下降Y% +├── 可视化: 展示XXX激活模式 +└── 理论分析: XXX为什么有效 +``` + +--- + +## 3. 写 Outline(只写要点) + +每小节回答一个问题: + +| 问题 | 含义 | +|------|------| +| 这节要说服审稿人什么? | 核心主张 | +| 审稿人可能质疑什么? | 潜在反驳 | +| 我用什么证据挡住? | 实验支撑 | + +### 3.1 Outline 模板 + +```markdown +# 1. Introduction + +## 要回答的问题 +- 这个问题为什么重要? +- 现有方法有什么问题? +- 我们的核心贡献是什么? + +## 可能的质疑 +- "这个问题真的重要吗?" + → 回答:用具体应用场景和数据说明 +- "你们只是简单的组合吧?" + → 回答:强调我们发现的XXX insight + +## 关键证据 +- 实验1: 在3个标准数据集上提升X% +- 实验2: 验证了XXX机制的必要性 +``` + +--- + +## 4. 生成具体文字 + +最后再让模型生成具体文字: + +**好处**: +- 不会空谈 +- 每个观点都有支撑 +- 逻辑清晰 + +--- + +## 5. MCP 工具与 Skills + +### 5.1 MCP工具(文献搜索与访问) + +| 工具 | 功能 | 适用场景 | +|------|------|---------| +| **Zotero-MCP** | 直接访问本地文献库 | 文献管理、引用分析 | +| **Perplexity MCP** | Deep Research 模式 | 技术调研、综述写作 | +| **ClickHouse MCP** | 数据库集成 | 大数据分析 | +| **Zen MCP** | 研究工作流 | 流程自动化 | +| **Paper Search MCP** | 多数据库搜索 | 快速获取新论文 | + +### 5.2 Skills工具(科研分析与写作) + +| 工具 | 技能数量 | 特色 | +|------|---------|------| +| **claude-scientific-skills** | 140+ | 即用型技能, 多领域覆盖 | +| **claude-scientific-writer** | - | 专注科研写作 | +| **Content-Research-Writer** | - | 长文协作写作 | +| **20-ml-paper-writing** | 77项 | 完整 ML 论文写作流程 | + +### 5.3 GitHub 资源 + +- [claude-scientific-skills](https://github.com/K-Dense-AI/claude-scientific-skills) + +--- + +## 6. 写作检查清单 + +
+ + +每个 claim 都有对应的实验支撑 + + + +对比了所有强 baseline + + + +叙事流畅, 无逻辑跳跃 + + + +全文使用统一的术语 + + + +引用格式正确, 来源可靠 + + + +图表有清晰的图例和说明 + + +
diff --git a/external/ai-research-ebook/src/content/docs/writing/prism.mdx b/external/ai-research-ebook/src/content/docs/writing/prism.mdx new file mode 100644 index 0000000..abc5245 --- /dev/null +++ b/external/ai-research-ebook/src/content/docs/writing/prism.mdx @@ -0,0 +1,210 @@ +--- +title: Prism 编辑器 +description: OpenAI Prism LaTeX 原生科研写作工作区 +sidebar: + order: 2 +--- + + + +## 1. Prism 概述 + +**Prism** 是 OpenAI 推出的 **LaTeX 原生科研写作工作区**, 发布于 2026年1月27日。 + +
+ +**核心优势**:GPT-5.2 原生集成, 无需插件即可获得最强 AI 写作辅助。 + +
+ +--- + +## 2. 核心特性 + +```mermaid +flowchart TD + subgraph ["核心能力"] + A(LaTeX 原生) --> B(无缝迁移) + C(GPT-5.2 集成) --> D(智能辅助) + E(实时协作) --> F(多人编辑) + end + + subgraph ["写作支持"] + G(中英文支持) --> H(双语写作) + I(公式图表) --> J(可视化) + K(引用管理) --> L(智能引用) + end + + + +``` + +| 特性 | 说明 | +|------|------| +| **LaTeX 原生** | 无缝迁移现有 Overleaf 项目 | +| **GPT-5.2 集成** | 最强 AI 写作辅助 | +| **实时协作** | 多人同时编辑 | +| **中英文支持** | 双语写作无障碍 | +| **公式图表** | 内置可视化工具 | +| **引用管理** | 智能文献引用 | + +--- + +## 3. Prism vs Overleaf + +| 维度 | Prism | Overleaf | +|------|--------|----------| +| **AI 集成** | GPT-5.2 原生 | 需外部插件 | +| **实时协作** | ✓ | ✓ | +| **中文支持** | 原生 | 需配置 | +| **定价** | 免费(个人) | 有限制 | +| **模板库** | 基础模板 | 丰富模板 | +| **编译速度** | 快 | 快 | + +--- + +## 4. 写作工作流 + +### 4.1 阶段 1: 项目设置 + +```bash +# 创建新项目 +1. 访问 openai.com/prism/ +2. 点击 "New Project" +3. 选择论文模板 (NeurIPS/ICML/ICLR) +4. 配置基础设置 +``` + +### 4.2 阶段 2: AI 辅助写作 + +```latex +% 使用 AI 辅助生成内容 +% 在 Prism 中, 选中文本并点击 "Ask AI" + +\section{Method} +我们的方法基于 Transformer 架构, +引入了一种新颖的 XXX 机制。 + +% AI 建议扩展: +% 基于 Transformer 架构, 我们提出了一种 +% 自适应注意力机制 (Adaptive Attention), +% 能够根据输入动态调整注意力分布。 +``` + +### 4.3 阶段 3: 协作编辑 + +| 功能 | 操作 | +|------|------| +| 实时同步 | 自动保存到云端 | +| 评论讨论 | Cmd+Click 添加评论 | +| 版本历史 | 查看历史版本 | +| 任务分配 | @mention 协作者 | + +--- + +## 5. 中英文写作支持 + +### 5.1 混合写作 + +```latex +% 中文摘要 + 英文正文 + +\begin{abstract} +本文提出了一种新颖的 XXX 方法, +在多个基准数据集上取得了显著的性能提升。 +\end{abstract} + +\section{Introduction} +Deep learning has achieved remarkable success... +% 可随时切换语言 +``` + +### 5.2 翻译辅助 + +``` +Prism 内置翻译功能: +1. 选中中文段落 +2. 点击 "Translate to English" +3. AI 生成学术英文版本 +4. 可选择保留/修改 +``` + +--- + +## 6. 引用管理 + +### 6.1 智能引用 + +```latex +% Prism 会自动推荐相关引用 + +我们的方法与 XXX[1] 有显著不同。 + +% AI 建议: +% 相比之前的工作[2,3], 我们的方法... +``` + +### 6.2 引用格式 + +| 会议 | 格式 | +|------|------| +| NeurIPS | \cite{} | +| ICML | \citep{} | +| ICLR | \cite{} | + +--- + +## 7. 使用场景 + +
+ + +AI 辅助生成大纲、扩展段落、优化表达 + + + +快速定位、修改、验证修改内容 + + + +多人实时编辑, 版本管理 + + + +中英文互译, 保持学术表达 + + + +自动格式化, 符合会议要求 + + + +自动验证引用完整性 + + +
+ +--- + +## 8. 快速开始 + +1. **访问官网**: [openai.com/prism](https://openai.com/prism/) +2. **创建账户**: 使用 OpenAI 账户登录 +3. **新建项目**: 选择论文模板 +4. **开始写作**: 使用 GPT-5.2 辅助 + +--- + +## 9. 最佳实践 + +
+ +**建议**:先用 AI 生成初稿, 再人工精修, 确保内容的准确性和创新性。 + +
+ +1. **大纲先行**:让 AI 生成结构化大纲 +2. **分段写作**:逐章节完善, 避免大段重写 +3. **及时保存**:利用版本历史回溯 +4. **引用验证**:提交前检查引用完整性 +5. **格式检查**:确认符合会议模板 diff --git a/external/ai-research-ebook/src/content/docs/writing/rebuttal.mdx b/external/ai-research-ebook/src/content/docs/writing/rebuttal.mdx new file mode 100644 index 0000000..463bd07 --- /dev/null +++ b/external/ai-research-ebook/src/content/docs/writing/rebuttal.mdx @@ -0,0 +1,186 @@ +--- +title: Rebuttal 策略 +description: 如何有效撰写 Rebuttal 回应审稿意见 +sidebar: + order: 3 +--- + +## 1. Rebuttal 策略 + +--- + +## 2. 分类回应 + +### 2.1 可修复的 + +**策略**: 明确承诺修改,给出具体方案 + +**模板**: + +``` +感谢审稿人的建议。我们将按以下方式修改: + +1. 补充消融实验(详见附件图X) +2. 增加与方法Y的对比 +3. 重写第3节以更清晰地表达... + +我们已将这些修改在附件中标注。 +``` + +### 2.2 误解的 + +**策略**: 礼貌澄清,补充说明 + +**模板**: + +``` +感谢审稿人的关注。我们想澄清以下几点: + +1. 关于XXX:我们的方法确实做了... +2. 关于YYY:这可能是一个误解,实际上是... + +我们在文中已添加更清晰的说明。 +``` + +### 2.3 不同意但合理的 + +**策略**: 讨论并引用支持文献 + +**模板**: + +``` +审稿人提出了一个很好的观点。我们同意..., + +但我们选择这种方法的原因是... + +相关文献[1,2]也支持这种做法。 + +我们会在文中增加相关讨论。 +``` + +### 2.4 不同意的 + +**策略**: 坚定但有理有据地反驳 + +**模板**: + +``` +我们尊重审稿人的观点,但不同意... + +原因是...(实验证据/理论分析/文献支持) + +我们的方法在这一方面确实有优势... +``` + +--- + +## 3. 常见意见应对模板 + +### 3.1 缺少消融实验 + +``` +感谢审稿人的建议。我们已在补充材料中添加了消融实验[表X], +显示去掉模块A后性能下降Y%,证实了其必要性。 +``` + +### 3.2 对比不公平 + +``` +我们已确保所有方法使用相同的训练设置(学习率、batch size等), +详见补充材料[实验设置]。 + +我们注意到方法Y的原始设置与我们的有所不同, +为了公平对比,我们也用他们的设置重新运行了实验。 +``` + +### 3.3 创新性不足 + +``` +与[ABC方法]不同,我们关注的是X场景下的Y问题, +这在之前工作中未被探索。 + +我们的贡献在于: +1. 发现了Z现象 +2. 提出了W方法 +3. 在N个数据集上验证了有效性 + +相关工作[附表]详细列出了区别。 +``` + +### 3.4 缺少某篇文献 + +``` +感谢审稿人指出这篇重要文献。我们已将其加入相关工作并讨论: + +- 该方法与我们的相似之处:... +- 关键区别:... +- 我们的方法如何扩展了它:... +``` + +### 3.5 结果不够显著 + +``` +我们认为结果的显著性在于: + +1. 在X场景下(之前未被探索),我们的方法优于baseline +2. 消融显示每个模块都有贡献 +3. 在Y个数据集上一致有效 + +虽然绝对提升不大,但在...场景下很有价值。 +``` + +--- + +## 4. Rebuttal 成功要素 + +1. **感谢审稿人**(即使意见尖锐) + +2. **具体修改措施**(不是泛泛而谈) + +3. **实验数据支持**(新增结果) + +4. **保持专业和礼貌** + +--- + +## 5. Rebuttal 结构模板 + +```markdown +# Rebuttal + +## 概述 + +感谢所有审稿人的宝贵意见。我们已认真考虑每条意见, +并准备了相应的修改和补充实验。 + +## 对审稿人A的回应 + +### 意见1: ... +感谢审稿人的建议。[具体回应] + +### 意见2: ... +[回应...] + +## 对审稿人B的回应 + +### 意见1: ... +[回应...] + +## 对审稿人C的回应 + +### 意见1: ... +[回应...] + +## 主要修改总结 + +1. 补充了X个消融实验 +2. 增加了与方法Y的对比 +3. 重写了第Z节以更清晰 + +修改后的全文已附后/已在附件中标注。 + +## 附件 + +- 补充实验结果 +- 修改后的全文(标注版) +``` diff --git a/external/ai-research-ebook/src/styles/custom.css b/external/ai-research-ebook/src/styles/custom.css new file mode 100644 index 0000000..b87b2f2 --- /dev/null +++ b/external/ai-research-ebook/src/styles/custom.css @@ -0,0 +1,794 @@ +:root, +[data-theme='light'] { + --chat-bg-primary: #f7f7f8; + --chat-bg-secondary: #ffffff; + --chat-bg-tertiary: #f0f1f3; + --chat-sidebar-bg: #f9f9fb; + --chat-border: #e3e5e9; + --chat-border-strong: #d1d5db; + --chat-text-primary: #171717; + --chat-text-secondary: #374151; + --chat-text-tertiary: #6b7280; + --chat-link: #2563eb; + --chat-link-hover: #1d4ed8; + --chat-accent: #10a37f; + --chat-accent-hover: #0d8e6f; + --chat-selection: #bfdbfe; + --chat-shadow-sm: 0 1px 2px rgba(15, 23, 42, 0.06); + --chat-shadow-md: 0 10px 24px rgba(15, 23, 42, 0.08); + --chat-radius-sm: 0.375rem; + --chat-radius-md: 0.625rem; + --chat-radius-lg: 0.875rem; + --chat-radius-xl: 1.125rem; + --chat-transition-fast: 0.15s ease; + --chat-transition-normal: 0.25s ease; + --sl-color-accent: var(--chat-accent); + --sl-color-accent-high: var(--chat-accent-hover); + --sl-color-bg: var(--chat-bg-primary); + --sl-color-bg-nav: var(--chat-sidebar-bg); + --sl-color-bg-sidebar: var(--chat-sidebar-bg); + --sl-color-hairline: var(--chat-border); + --sl-color-hairline-light: var(--chat-border); + --sl-color-text: var(--chat-text-primary); + --sl-color-text-accent: var(--chat-accent); + --sl-color-text-muted: var(--chat-text-tertiary); +} + +[data-theme='dark'] { + --chat-bg-primary: #212121; + --chat-bg-secondary: #2f2f2f; + --chat-bg-tertiary: #424242; + --chat-sidebar-bg: #171717; + --chat-border: hsla(0, 0%, 100%, 0.1); + --chat-border-strong: hsla(0, 0%, 100%, 0.2); + --chat-text-primary: #ececec; + --chat-text-secondary: #d1d5db; + --chat-text-tertiary: #9ca3af; + --chat-link: #7ab7ff; + --chat-link-hover: #9cc9ff; + --chat-accent: #19c37d; + --chat-accent-hover: #10a37f; + --chat-selection: #1d4ed8; + --chat-shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.28); + --chat-shadow-md: 0 10px 24px rgba(0, 0, 0, 0.32); + --sl-color-accent: var(--chat-accent); + --sl-color-accent-high: var(--chat-accent-hover); + --sl-color-bg: var(--chat-bg-primary); + --sl-color-bg-nav: var(--chat-sidebar-bg); + --sl-color-bg-sidebar: var(--chat-sidebar-bg); + --sl-color-hairline: var(--chat-border); + --sl-color-hairline-light: var(--chat-border); + --sl-color-text: var(--chat-text-primary); + --sl-color-text-accent: var(--chat-accent); + --sl-color-text-muted: var(--chat-text-tertiary); +} + +html, +body { + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif; + background: var(--chat-bg-primary); + color: var(--chat-text-primary); + line-height: 1.7; +} + +::selection { + background: var(--chat-selection); + color: #ffffff; +} + +:focus-visible { + outline: 2px solid var(--chat-accent); + outline-offset: 2px; +} + +.header { + background: color-mix(in srgb, var(--chat-bg-primary) 92%, transparent); + backdrop-filter: blur(10px); + border-bottom: 1px solid var(--chat-border); +} + +.site-title { + font-weight: 600; + letter-spacing: -0.01em; + color: var(--chat-text-primary); +} + +.sidebar-pane { + background: var(--chat-sidebar-bg) !important; + border-inline-end: 1px solid var(--chat-border) !important; +} + +.sidebar-content a { + color: var(--chat-text-secondary); + padding: 0.5rem 0.875rem; + margin: 0.125rem 0.375rem; + border-radius: var(--chat-radius-md); + transition: background-color var(--chat-transition-fast), color var(--chat-transition-fast); +} + +.sidebar-content a:hover, +.sidebar-content a:focus-visible { + background: var(--chat-bg-tertiary); + color: var(--chat-text-primary); +} + +.sidebar-content [aria-current='page'], +.sidebar-content [aria-current='page']:hover { + background: color-mix(in srgb, var(--chat-accent) 16%, var(--chat-bg-secondary)); + color: var(--chat-accent); + font-weight: 600; +} + +.main-pane { + background: var(--chat-bg-primary); +} + +.main-frame { + background: + radial-gradient(circle at 86% 4%, color-mix(in srgb, var(--chat-accent) 7%, transparent), transparent 32%), + radial-gradient(circle at 8% 12%, color-mix(in srgb, var(--chat-link) 7%, transparent), transparent 28%), + var(--chat-bg-primary); +} + +.content-panel { + background: transparent !important; + border: 0 !important; + box-shadow: none !important; + padding-block: 0.25rem !important; +} + +.sl-container { + max-width: min(76rem, 96vw); +} + +html:not([data-has-hero]) .content-panel .sl-container { + background: var(--chat-bg-secondary); + border: 1px solid var(--chat-border); + border-radius: var(--chat-radius-xl); + box-shadow: var(--chat-shadow-sm); + padding-inline: clamp(1rem, 2vw, 1.35rem); + padding-block: 0.35rem; + margin-bottom: 0.75rem; +} + +html:not([data-has-hero]) .content-panel:first-of-type .sl-container { + padding-top: 0.6rem; + padding-bottom: 0.3rem; +} + +html:not([data-has-hero]) .content-panel:first-of-type h1 { + margin-bottom: 0.2rem; +} + +.sidebar .group-label, +.sidebar .title { + color: var(--chat-text-tertiary); + font-weight: 600; + letter-spacing: 0.01em; +} + +.open-menu, +.close-menu, +.mobile-preferences { + background: var(--chat-bg-secondary); + border: 1px solid var(--chat-border); + border-radius: var(--chat-radius-md); + color: var(--chat-text-secondary); +} + +.mobile-preferences { + padding: 0.4rem 0.6rem; + gap: 0.5rem; +} + +.right-sidebar-container { + background: color-mix(in srgb, var(--chat-bg-secondary) 76%, transparent); + border-inline-start: 1px solid var(--chat-border); +} + +.right-sidebar-panel .sl-container { + padding-top: 0.5rem; +} + +@keyframes hero-fade-in { + 0% { + opacity: 0; + transform: translateY(14px) scale(0.995); + } + 100% { + opacity: 1; + transform: translateY(0) scale(1); + } +} + +@keyframes hero-float-left { + 0%, + 100% { + transform: translate3d(0, 0, 0); + } + 50% { + transform: translate3d(8px, -10px, 0); + } +} + +@keyframes hero-float-right { + 0%, + 100% { + transform: translate3d(0, 0, 0); + } + 50% { + transform: translate3d(-10px, 9px, 0); + } +} + +@keyframes hero-content-rise { + 0% { + opacity: 0; + transform: translateY(12px); + } + 100% { + opacity: 1; + transform: translateY(0); + } +} + +.hero { + position: relative; + isolation: isolate; + overflow: hidden; + background: + linear-gradient(122deg, color-mix(in srgb, var(--chat-accent) 9%, transparent), transparent 38%), + linear-gradient(0deg, var(--chat-bg-secondary), var(--chat-bg-secondary)); + border: 1px solid var(--chat-border); + border-radius: var(--chat-radius-xl); + box-shadow: var(--chat-shadow-sm); + padding: 2.75rem 3rem; + margin-bottom: 2rem; + opacity: 0; + transform-origin: center; + animation: hero-fade-in 0.7s cubic-bezier(0.2, 0.8, 0.2, 1) 0.1s forwards; +} + +.hero::before { + content: ''; + position: absolute; + inset: -5rem auto auto -5rem; + width: 13rem; + height: 13rem; + border-radius: 999px; + background: radial-gradient(circle, color-mix(in srgb, var(--chat-link) 20%, transparent), transparent 72%); + filter: blur(1px); + pointer-events: none; + z-index: -1; + animation: hero-float-left 8.8s ease-in-out infinite; +} + +.hero::after { + content: ''; + position: absolute; + inset: auto -4rem -5rem auto; + width: 14rem; + height: 14rem; + border-radius: 999px; + background: radial-gradient(circle, color-mix(in srgb, var(--chat-accent) 20%, transparent), transparent 70%); + filter: blur(1px); + pointer-events: none; + z-index: -1; + animation: hero-float-right 10.4s ease-in-out infinite; +} + +.hero .copy, +.hero .actions { + opacity: 0; + transform: translateY(10px); + animation: hero-content-rise 0.6s cubic-bezier(0.22, 0.83, 0.19, 0.99) forwards; +} + +.hero .copy { + animation-delay: 0.24s; +} + +.hero .actions { + animation-delay: 0.36s; +} + +.hero h1 { + font-size: clamp(2rem, 3.4vw, 2.8rem); + font-weight: 700; + letter-spacing: -0.02em; + color: var(--chat-text-primary); +} + +.hero .tagline { + color: var(--chat-text-secondary); + font-size: 1.08rem; + max-width: 58ch; +} + +.hero .actions .sl-link-button { + border-radius: 999px; + padding: 0.7rem 1.25rem; + font-weight: 600; + transition: transform var(--chat-transition-fast), box-shadow var(--chat-transition-fast), background-color var(--chat-transition-fast); +} + +.hero .actions .sl-link-button.primary { + background: var(--chat-accent); + border-color: var(--chat-accent); + color: #ffffff; + box-shadow: 0 8px 16px color-mix(in srgb, var(--chat-accent) 34%, transparent); +} + +.hero .actions .sl-link-button.primary:hover { + background: var(--chat-accent-hover); + border-color: var(--chat-accent-hover); + transform: translateY(-1px); +} + +.hero .actions .sl-link-button.minimal, +.hero .actions .sl-link-button.secondary { + border-color: var(--chat-border-strong); + color: var(--chat-text-primary); + background: transparent; +} + +.hero .actions .sl-link-button.minimal:hover, +.hero .actions .sl-link-button.secondary:hover { + background: var(--chat-bg-tertiary); + transform: translateY(-1px); +} + +.sl-markdown-content { + max-width: 74ch; + color: var(--chat-text-primary); +} + +.sl-markdown-content :is(h1, h2, h3, h4, h5, h6) { + color: var(--chat-text-primary); + font-weight: 650; + letter-spacing: -0.01em; + scroll-margin-top: 6rem; +} + +.sl-markdown-content h2 { + border-bottom: 1px solid var(--chat-border); + padding-bottom: 0.5rem; + margin-top: 2rem; + margin-bottom: 1rem; +} + +.sl-heading-wrapper { + gap: 0.35rem; +} + +.sl-anchor-link { + opacity: 0; + transform: translateX(-2px); + transition: opacity var(--chat-transition-fast), transform var(--chat-transition-fast); +} + +.sl-heading-wrapper:hover .sl-anchor-link, +.sl-heading-wrapper:focus-within .sl-anchor-link { + opacity: 1; + transform: translateX(0); +} + +.sl-markdown-content p, +.sl-markdown-content li, +.sl-markdown-content td { + color: var(--chat-text-secondary); +} + +.sl-markdown-content ul, +.sl-markdown-content ol { + padding-inline-start: 1.2rem; + margin-block: 0.7rem; +} + +.sl-markdown-content li + li { + margin-top: 0.2rem; +} + +.sl-markdown-content strong { + color: var(--chat-text-primary); + font-weight: 650; +} + +.sl-markdown-content a { + color: var(--chat-link); + text-decoration: none; + transition: color var(--chat-transition-fast); +} + +.sl-markdown-content a:hover { + color: var(--chat-link-hover); + text-decoration: underline; +} + +.sl-markdown-content hr { + border: none; + border-top: 1px solid var(--chat-border); + margin-block: 2rem; +} + +.sl-markdown-content blockquote { + border-inline-start: 3px solid var(--chat-accent); + background: color-mix(in srgb, var(--chat-accent) 10%, var(--chat-bg-secondary)); + padding: 0.8rem 1rem; + border-radius: 0 var(--chat-radius-md) var(--chat-radius-md) 0; + color: var(--chat-text-secondary); +} + +.sl-markdown-content details { + background: var(--chat-bg-secondary); + border: 1px solid var(--chat-border); + border-radius: var(--chat-radius-md); + padding: 0.75rem 0.9rem; + margin-block: 1rem; +} + +.sl-markdown-content .tip, +.sl-markdown-content .warning { + border-radius: var(--chat-radius-md); + border: 1px solid var(--chat-border); + padding: 0.75rem 0.95rem; + margin: 1rem 0; + box-shadow: var(--chat-shadow-sm); +} + +.sl-markdown-content .tip { + background: color-mix(in srgb, var(--chat-accent) 9%, var(--chat-bg-secondary)); + border-inline-start: 3px solid var(--chat-accent); +} + +.sl-markdown-content .warning { + background: color-mix(in srgb, #f59e0b 10%, var(--chat-bg-secondary)); + border-inline-start: 3px solid #f59e0b; +} + +.sl-markdown-content .contains-task-list { + list-style: none; + padding-inline-start: 0; +} + +.sl-markdown-content .task-list-item { + display: flex; + align-items: flex-start; + gap: 0.55rem; + padding: 0.15rem 0; +} + +.sl-markdown-content .task-list-item input[type='checkbox'] { + accent-color: var(--chat-accent); + margin-top: 0.2rem; +} + +.sl-markdown-content table { + border: 1px solid var(--chat-border); + border-radius: var(--chat-radius-md); + overflow: hidden; + background: var(--chat-bg-secondary); + box-shadow: var(--chat-shadow-sm); +} + +.sl-markdown-content th { + background: var(--chat-bg-tertiary); + border-bottom: 1px solid var(--chat-border); + color: var(--chat-text-primary); + font-weight: 600; + padding: 0.8rem 1rem; +} + +.sl-markdown-content td { + border-bottom: 1px solid var(--chat-border); + padding: 0.8rem 1rem; +} + +.sl-markdown-content tbody tr:hover td { + background: color-mix(in srgb, var(--chat-bg-tertiary) 55%, transparent); +} + +.sl-markdown-content code:not(pre code) { + background: var(--chat-bg-tertiary); + border: 1px solid var(--chat-border); + padding: 0.12rem 0.4rem; + border-radius: var(--chat-radius-sm); + font-size: 0.9em; + color: var(--chat-accent); +} + +.expressive-code, +.sl-markdown-content pre { + border: 1px solid var(--chat-border) !important; + border-radius: var(--chat-radius-md) !important; + background: var(--chat-bg-secondary) !important; + box-shadow: var(--chat-shadow-sm) !important; +} + +.expressive-code .copy button { + background: var(--chat-bg-tertiary) !important; + border: 1px solid var(--chat-border) !important; + border-radius: var(--chat-radius-sm) !important; + color: var(--chat-text-secondary) !important; +} + +.expressive-code .copy button:hover { + color: var(--chat-text-primary) !important; + border-color: var(--chat-border-strong) !important; +} + +.card-grid { + gap: 0.9rem; + margin-block: 1.4rem; +} + +.card-grid > * { + background: var(--chat-bg-secondary); + border: 1px solid var(--chat-border); + border-radius: var(--chat-radius-lg); + padding: 1rem; + box-shadow: var(--chat-shadow-sm); + transition: transform var(--chat-transition-fast), border-color var(--chat-transition-fast), box-shadow var(--chat-transition-fast); +} + +.card-grid > *:hover { + transform: translateY(-2px); + border-color: var(--chat-border-strong); + box-shadow: var(--chat-shadow-md); +} + +.right-sidebar-panel { + border-inline-start: 1px solid var(--chat-border); + background: transparent; +} + +starlight-toc nav h2 { + color: var(--chat-text-tertiary); + font-weight: 600; + letter-spacing: 0; +} + +starlight-toc a { + color: var(--chat-text-tertiary); + border-radius: var(--chat-radius-sm); + transition: color var(--chat-transition-fast), background-color var(--chat-transition-fast); +} + +starlight-toc a:hover { + color: var(--chat-text-primary); + background: var(--chat-bg-tertiary); +} + +starlight-toc a[aria-current='true'] { + color: var(--chat-accent); + font-weight: 600; +} + +.right-sidebar-panel starlight-toc nav { + background: var(--chat-bg-secondary); + border: 1px solid var(--chat-border); + border-radius: var(--chat-radius-lg); + padding: 0.8rem; + box-shadow: var(--chat-shadow-sm); +} + +button[data-open-modal], +.search-button { + background: var(--chat-bg-secondary) !important; + border: 1px solid var(--chat-border) !important; + color: var(--chat-text-secondary) !important; + border-radius: var(--chat-radius-md) !important; + transition: all var(--chat-transition-fast); +} + +button[data-open-modal]:hover, +.search-button:hover { + background: var(--chat-bg-tertiary) !important; + border-color: var(--chat-border-strong) !important; + color: var(--chat-text-primary) !important; +} + +.pagination-links a { + background: var(--chat-bg-secondary); + border: 1px solid var(--chat-border); + border-radius: var(--chat-radius-lg); + box-shadow: var(--chat-shadow-sm); + transition: transform var(--chat-transition-fast), border-color var(--chat-transition-fast), box-shadow var(--chat-transition-fast); +} + +.pagination-links a:hover { + transform: translateY(-2px); + border-color: var(--chat-border-strong); + box-shadow: var(--chat-shadow-md); +} + +.pagination-links .link-title { + color: var(--chat-text-primary); +} + +starlight-theme-select { + --theme-button-border: var(--chat-border); + --theme-button-bg: var(--chat-bg-secondary); + --theme-button-text: var(--chat-text-secondary); + --theme-button-hover-bg: var(--chat-bg-tertiary); + --theme-button-hover-text: var(--chat-text-primary); +} + +footer { + border-top: 1px solid var(--chat-border); + padding-top: 1.75rem; + margin-top: 2.25rem; + color: var(--chat-text-tertiary); +} + +.index-highlights { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(14rem, 1fr)); + gap: 0.75rem; + margin: 1.2rem 0 1.8rem; + padding: 0; +} + +.index-highlights > li { + list-style: none; + padding: 0.85rem 1rem; + border: 1px solid var(--chat-border); + border-radius: var(--chat-radius-lg); + background: var(--chat-bg-secondary); + color: var(--chat-text-secondary); + box-shadow: var(--chat-shadow-sm); +} + +.index-footnote { + margin-top: 2.4rem; + padding-top: 1rem; + border-top: 1px solid var(--chat-border); + text-align: center; + font-size: 0.9rem; + color: var(--chat-text-tertiary); +} + +.mermaid-source-hidden { + display: none !important; +} + +.mermaid-diagram { + margin: 1rem 0 1.5rem; + padding: 1rem; + border: 1px solid var(--chat-border); + border-radius: var(--chat-radius-lg); + background: var(--chat-bg-secondary); + overflow-x: auto; + box-shadow: var(--chat-shadow-sm); +} + +.mermaid-diagram .mermaid { + min-width: max-content; + text-align: center; +} + +.mermaid-diagram svg { + max-width: none; + height: auto; + display: block; + margin-inline: auto; +} + +@media (max-width: 72rem) { + html:not([data-has-hero]) .content-panel .sl-container { + border-radius: var(--chat-radius-lg); + padding-inline: 0.85rem; + } + + .right-sidebar-container { + border-inline-start: 0; + background: transparent; + } + + .hero { + padding: 1.35rem; + border-radius: var(--chat-radius-lg); + } + + .hero h1 { + font-size: clamp(1.7rem, 7vw, 2.1rem); + } + + .hero .tagline { + font-size: 0.98rem; + } + + .hero .actions { + display: grid; + grid-template-columns: 1fr; + gap: 0.6rem; + } + + .hero .actions .sl-link-button { + width: 100%; + justify-content: center; + } + + .sl-markdown-content { + max-width: 100%; + } + + .sl-markdown-content table { + display: block; + overflow-x: auto; + white-space: nowrap; + } + + .sl-markdown-content th, + .sl-markdown-content td { + padding: 0.68rem 0.8rem; + } + + .index-highlights { + grid-template-columns: 1fr; + margin: 1rem 0 1.35rem; + } + + .mermaid-diagram { + margin: 0.85rem 0 1.2rem; + padding: 0.75rem; + } + + .pagination-links a { + padding-block: 0.72rem; + } + + .open-menu, + .close-menu { + min-height: 2.35rem; + min-width: 2.35rem; + } + + .right-sidebar-panel { + border-inline-start: 0; + } +} + +@media (max-width: 50rem) { + html { + font-size: 15px; + } + + .content-panel { + padding-block: 0.1rem !important; + } + + .sl-markdown-content h2 { + font-size: 1.26rem; + } + + .sl-markdown-content h3 { + font-size: 1.08rem; + } + + button[data-open-modal] { + min-height: 2.35rem; + } + + .sidebar-pane { + padding-bottom: 0.45rem; + } +} + +@media (prefers-reduced-motion: reduce) { + .hero, + .hero::before, + .hero::after, + .hero .copy, + .hero .actions { + animation: none !important; + opacity: 1 !important; + transform: none !important; + } + + .card-grid > *, + .pagination-links a, + .hero .actions .sl-link-button { + transition: none !important; + } +} diff --git a/external/ai-research-ebook/tsconfig.json b/external/ai-research-ebook/tsconfig.json new file mode 100644 index 0000000..8bf91d3 --- /dev/null +++ b/external/ai-research-ebook/tsconfig.json @@ -0,0 +1,5 @@ +{ + "extends": "astro/tsconfigs/strict", + "include": [".astro/types.d.ts", "**/*"], + "exclude": ["dist"] +} diff --git a/index.html b/index.html index b0b91d7..799f8f3 100644 --- a/index.html +++ b/index.html @@ -1016,6 +1016,7 @@

📚 核心内容

技术栈与框架 系统设计与实战 面试指南 + 🔬 AI科研指南 (Vibe Research)