From 70152c61b1ece076de9ff6d18d23232b9e768164 Mon Sep 17 00:00:00 2001 From: ydy0615 Date: Fri, 1 May 2026 20:55:02 +0800 Subject: [PATCH] feat: enhance Milkdown editor and file system functionality - Normalize line endings in Markdown export for DOCX files. - Improve selection serialization to Markdown with better handling of empty documents. - Add a new `updateFile` function to the file system for updating file properties. - Introduce video transcoding capabilities using FFmpeg, supporting various video formats. - Update AGENTS.md for clearer plugin structure and responsibilities. - Add scoped styles for TreeNodeItem component to improve UI consistency. - Implement cross-origin isolation headers in Vite configuration for enhanced security. - Remove obsolete test_cross.py file. --- .cline/kanban/config.json | 9 - .coverage | Bin 0 -> 53248 bytes .gitignore | 2 + .kilo/plans/1775304798427-lucky-panda.md | 52 - .kilocode/rules/rules.md | 11 - AGENTS.md | 155 +- backend/AGENTS.md | 147 +- backend/api_performance_report.md | 196 --- backend/main.py | 9 +- backend/prompt.py | 11 +- backend/prompts/system_prompt.json | 2 +- backend/test_api_performance.py | 295 ---- backend/test_geoip.py | 80 - backend/tests/AGENTS.md | 87 +- backend/tests/play_audio.py | 37 - backend/tests/simulate_macos.py | 1 - backend/tests/test_audio.wav | Bin 287404 -> 0 bytes backend/tests/test_geoip.py | 1 - backend/tests/test_main_endpoints.py | 12 +- backend/tests/test_prompt.py | 7 + backend/tests/test_prompt_extended.py | 1 - backend/tests/test_tts_asr_integration.py | 2 - backend/tests/test_tts_asr_unit.py | 3 +- backend/tests/verify_cross.py | 56 - package-lock.json | 1780 ++++++++++++++++++++- package.json | 4 + sample-video.mp4 | Bin 0 -> 42548 bytes src/AGENTS.md | 162 +- src/components/DocumentBlock.vue | 216 --- src/components/FileContent.vue | 832 +++++++++- src/components/FileTree.vue | 81 +- src/components/ImageEditorComponent.vue | 317 ++++ src/components/MilkdownEditor.vue | 20 +- src/components/TreeNodeItem.vue | 161 ++ src/composables/useFileSystem.js | 60 +- src/plugins/AGENTS.md | 97 +- src/plugins/copilotPlugin.ts | 48 +- src/plugins/docBlockPlugin.ts | 5 +- src/utils/docBlock.js | 61 +- src/utils/ffmpeg.js | 230 +++ src/views/DocsView.vue | 5 +- test_cross.py | 20 - vite.config.js | 9 + 43 files changed, 3911 insertions(+), 1373 deletions(-) delete mode 100644 .cline/kanban/config.json create mode 100644 .coverage delete mode 100644 .kilo/plans/1775304798427-lucky-panda.md delete mode 100644 .kilocode/rules/rules.md delete mode 100644 backend/api_performance_report.md delete mode 100644 backend/test_api_performance.py delete mode 100644 backend/test_geoip.py delete mode 100644 backend/tests/play_audio.py delete mode 100644 backend/tests/test_audio.wav delete mode 100644 backend/tests/verify_cross.py create mode 100644 sample-video.mp4 delete mode 100644 src/components/DocumentBlock.vue create mode 100644 src/components/ImageEditorComponent.vue create mode 100644 src/utils/ffmpeg.js delete mode 100644 test_cross.py diff --git a/.cline/kanban/config.json b/.cline/kanban/config.json deleted file mode 100644 index 4fcd01e..0000000 --- a/.cline/kanban/config.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "shortcuts": [ - { - "label": "Run", - "command": "npm run dev", - "icon": "play" - } - ] -} \ No newline at end of file diff --git a/.coverage b/.coverage new file mode 100644 index 0000000000000000000000000000000000000000..1d9102e5ba1df83eb45975c35c7f416fee5cfc7c GIT binary patch literal 53248 zcmeI)%WoS+90%~-y7k76BL_v16>`X2kYm+xWmSmR0Rlv#q7oDW;)FZ4$M%AE*V#uN z2ZUTIl?(p?e`6&M91s_NznNXHoy1jdm6q=+cJ?tdJHOAo>~7m{pFDPBB}PH$$yhwJ zwk_MXJ`uvQtPOf?(JR{=+PRw@&~JNbf8Fke)%oL}t@`&?t^9*k|8eW>`cZ9M`)l*h z+WVF7HeIJ(>Cgpi5P$##AW#^A`IDN{*xR$8{SwRmRK=kjsL;G`efG`C@#%>;J^u9Z zi7@BHVO7v}bR>>N7+i>%3dP8sD&hJ=cOYZeAB%XRveZeWhP-CcIa;+iVMpiZy`DRy zT(KHc5wp^F&E68B8mUnE0~MKC9J<3+we{Pt zRj0ADW4};3CK(RsXLBVQI+2I+Xha1Kf^f*S?}ySKOjOhsauMMmpn6`$CfYFY9>jr| zy1ow6kKEV|e4#GYAc@uR)&Sd#mTiQ$91WHAlmmKda;EoM(#bR5k~2-7W*$-H{2*h^ zGxDt|v#ztBczq)ODe-39IF!TOI1bk3T$eWv(qLb^ZEk7HJl>V&%*eS#O|Hau&l0t0 z{IRrOx{S`I^wFs&lQ_`FJ!<@3m)>g6-`a2*2M6|x zGu=^`r`LDmXt7gS=`@SeYq}0!U*B(dl&p3V9!1ls2u6CyaBg85hkEn!n0b(4$dCt` z2-1X9(>L1NxUy6S(VqtW)xM^COr&Ul&|Huu8zugLhf2gT41#kN%CYLCSIxBWraKaK zoo=PvI5}9?brxNq*In#Z=X+(RvA=IWtLSc&wpRMfS?NMqOWrb#W|urAqa@5Gl2=WV zS&n>`%*IH1g~B;<%8ldwb>XDxdfjwqWA5B_8oRsp+>8jGm-uyWB?vx~4}oh7!RuFl zCgX{?S$9576>r`vH$K{3S8=XFugmY{=i7I5m47d3eUB!6ew9|L%xCf{f2ppH&gGP5 zlbLiw8nQG8n-xHC!l9(ZvL7U|?!SDfyC<(bd3{X*`Eh1XsaiTY4ezgmC~|38N;hM3s3W>H0ZMN zMLV7+{b9OZ@iJ^mrMaI6C*Q|RB9u`yX;4NqM6Z>Z6`Ee<87nKlGb0l&)ssUr+__Pf zO1zk;8^xK`=yMsX*!7g)B)T%XV_nEd3_?X0)3sDrjKn6_Yh{Z0g05t9sEMZ4EWN7l za1-~s{LbH!`P;KKKd_y~{rmPjNk_1moO%&`67XaeYkGKRrDt8cn0K?LI45~fB*y_ z009U<00Izz00i*-AAJA<5P$##AOHafKmY;|fB*y_P<#PA|1W+UBSHv300Izz00bZa M0SG_<0uX?}e_G5ST>t<8 literal 0 HcmV?d00001 diff --git a/.gitignore b/.gitignore index 48f8d93..98186f7 100644 --- a/.gitignore +++ b/.gitignore @@ -23,6 +23,8 @@ env/ .pytest_cache/ .mypy_cache/ .ruff_cache/ +htmlcov/ +api_performance_report.md # Env files .env diff --git a/.kilo/plans/1775304798427-lucky-panda.md b/.kilo/plans/1775304798427-lucky-panda.md deleted file mode 100644 index a86e7fe..0000000 --- a/.kilo/plans/1775304798427-lucky-panda.md +++ /dev/null @@ -1,52 +0,0 @@ -# 导出按钮缺失修复计划 - -## 问题分析 -当前 `action-buttons` 区域只有以下按钮可见: -- 上传文件 -- 导入 Markdown -- 导出 Markdown -- 上传图片 -- AI 切换按钮 - -**缺失功能**:DOCX 和 PDF 导出按钮 - -## 调查结果 -1. ✅ 翻译文件中已存在 `exportDocx` 和 `exportPdf` 键名(src/utils/i18n.js) -2. ❌ 模板中**完全缺失**这两个按钮的 HTML 代码 -3. ❓ 导出功能后端已实现,前端只需要添加调用接口的按钮 -4. ✅ 相关 CSS 样式已存在,按钮外观无需额外调整 - -## 实施计划 - -### 1. 添加 UI 按钮 -在 `src/components/MilkdownEditor.vue:79` 之后添加两个新按钮: -- DOCX 导出按钮 -- PDF 导出按钮 - -按钮位置: -``` -导出 Markdown → 导出 DOCX → 导出 PDF → 上传图片 -``` - -### 2. 实现前端导出功能 -使用已安装的依赖库: -- `docx` 库:用于 DOCX 导出 -- `html2pdf.js` 库:用于 PDF 导出 - -需要添加的函数: -```javascript -const exportDocx = async () => { - // 使用 docx 库实现导出 -} - -const exportPdf = async () => { - // 使用 html2pdf.js 实现导出 -} -``` - -### 3. 按钮图标 -- DOCX:使用文档图标 -- PDF:使用 PDF 专用图标 - -### 4. 状态管理 -添加加载状态和错误处理,与现有按钮保持一致风格 diff --git a/.kilocode/rules/rules.md b/.kilocode/rules/rules.md deleted file mode 100644 index 8c44fe2..0000000 --- a/.kilocode/rules/rules.md +++ /dev/null @@ -1,11 +0,0 @@ -# rules.md - -在构建这个LLM应用网页时,你需要基于VUE3开发。我需要前端只运行渲染和数据回传,后端负责llm api调用,类似copilet的auto inline suggustions实现和数据解析。 - -## 指导原则 - -- 不要擅自用npm或者yarn运行网页,你既看不到网页的内容,也无法阻止命令暂停。但是,你可以用npm run build检查代码。 -- 应该保证代码效率,不多定义变量,不写冗余注释,把降低延迟放在第一位。 -- 每次完成任务前都要反复阅读检查代码,确保代码准确无误。 -- 尽量不要搜索关键字,而是了解代码结构后查询整个问题代码明确问题所在。 -- @/milkdown-docs/ 代表milkdown的最新官方文档,不要修改,涉及到前端编辑器的指令时要核对官方文档。 diff --git a/AGENTS.md b/AGENTS.md index 4b65eba..feb9b85 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -1,90 +1,101 @@ -# LLM in Text 项目知识库 +# LLM in Text 仓库指引 -**生成时间:** 2025-04-10 -**Commit:** 2fdc996 -**Branch:** main +本文件适用于整个仓库。进入更深层目录后,子目录中的 AGENTS.md 优先于本文件。 -## 概述 +## 项目定位 -智能 Markdown 编辑器,集成 LLM 实时补全建议。前端 Vue3 + Vite + Milkdown,后端 FastAPI + Python + Ollama。核心功能:AI 补全、OCR 图片识别、文档转换、TTS/ASR 语音功能。 +- 这是一个智能 Markdown 编辑器,前端负责编辑器 UI、上传导出、补全交互和设置状态,后端负责 LLM、OCR、文件转换和 TTS 接口。 +- 前端技术栈:Vue 3 + Vite + Milkdown/Crepe + Pinia + Vue Router。 +- 后端技术栈:FastAPI + Python + Ollama。 +- 当前代码中可以确认的主功能是:AI 补全、OCR、文档转 Markdown、TTS、Markdown/DOCX/PDF 导入导出。 +- 历史文档中有一部分 TTS/ASR、Apple Silicon、Whisper、离线模式说明已经落后于当前代码;出现冲突时以实际代码和测试为准。 -## 结构 +## 先看哪里 -``` -llm-in-text/ -├── backend/ # FastAPI 后端 (Python) -│ ├── main.py # API 入口,路由定义 -│ ├── llm.py # Ollama 调用封装 -│ ├── prompt.py # Prompt 构建逻辑 -│ ├── prompts/ # JSON 格式的提示模板 -│ └── tests/ # pytest 测试套件 -├── src/ # 前端源码 (Vue3 + Vite) -│ ├── main.js # Vue 入口 -│ ├── App.vue # 根组件 -│ ├── components/ # Vue 组件 -│ ├── plugins/ # Milkdown/Copilot 插件 -│ ├── stores/ # Pinia 状态管理 -│ ├── views/ # 页面视图 -│ └── utils/ # 工具函数 -├── public/ # 静态资源 -├── milkdown-docs/ # Milkdown 官方文档(只读) -└── index.html # HTML 入口 -``` +- 项目概览和运行说明:README.md +- 前端入口:src/main.js +- 路由:src/router/index.js +- 编辑器主组件:src/components/MilkdownEditor.vue +- AI 补全核心:src/plugins/copilotPlugin.ts +- 前端请求层:src/utils/api.js +- 前端配置:src/utils/config.js +- 设置状态:src/stores/settings.js +- 后端入口和主路由:backend/main.py +- LLM 和 OCR 调用:backend/llm.py +- Prompt 组装:backend/prompt.py +- TTS 路由:backend/tts_asr.py +- 测试配置和入口:pytest.ini、backend/tests/run_tests.py -## 查找指南 +## 稳定事实 -| 任务 | 位置 | 说明 | -|------|------|------| -| 后端 API 入口 | `backend/main.py` | FastAPI 路由、CORS、启动逻辑 | -| LLM 调用 | `backend/llm.py` | Ollama 异步调用、超时控制 | -| Prompt 构建 | `backend/prompt.py` | 系统提示、上下文准备 | -| AI 补全核心 | `src/plugins/copilotPlugin.ts` | ProseMirror Mark、ghost text | -| 编辑器组件 | `src/components/MilkdownEditor.vue` | Milkdown 编辑器封装 | -| 状态管理 | `src/stores/settings.js` | 用户设置、主题、偏好 | -| API 调用 | `src/utils/api.js` | fetchSuggestion、TTS 接口 | -| 测试运行 | `pytest.ini` + `backend/tests/` | 测试配置与用例 | +- 补全接口当前不是 SSE;前端用普通 POST 请求拿 JSON 响应。 +- 前端会生成 X-Request-Id,并在请求被中止时额外调用 /v1/completions/cancel。 +- 文档超过 32 KB 时,AI 补全会在前端和插件层被禁用。 +- OCR 文本和文档块内容会被注入补全上下文,但这些内容属于隐藏上下文,不应被直接当作用户可见文本重复输出。 +- /v1/convert 当前支持 txt、docx、pptx、pdf,非 txt 文件通过 MarkItDown 转成 Markdown,之后会清理图片标记。 +- 前端存在 /v1/export/pdf 调用点,但当前后端主路由中看不到同名端点;排查 PDF 导出问题前先确认服务端是否真正提供该接口。 +- 当前 tts_asr.py 主要提供 TTS 相关能力。不要直接沿用 README 或历史修复文档里关于 ASR、Whisper、MPS/offline 的描述。 -## 约定(项目特定) +## 常用命令 -- **前端入口**:`src/main.js`(非 TypeScript),使用 Vue3 + Pinia + Vue Router -- **后端入口**:`backend/main.py`,端口 8001,uvicorn 启动 -- **代理配置**:开发时 `/v1` 代理到远程 API,生产需调整 -- **文件命名**:全小写+短横线(`my-module.py`、`my-component.vue`) -- **语言**:UI 默认中文,响应必须使用中文 +- 前端安装:npm install +- 前端开发:npm run dev +- 前端构建:npm run build +- 后端安装:pip install -r backend/requirements.txt +- 后端启动:python backend/main.py +- 可选启动方式:uvicorn backend.main:app --reload --port 8001 +- 全量测试:pytest +- 常用窄测试: + - pytest backend/tests/test_main_endpoints.py -v + - pytest backend/tests/test_main_cancel.py -v + - pytest backend/tests/test_prompt.py -v + - pytest backend/tests/test_llm.py -v -## 反模式(本项目禁止) +## 代码约定 -- ❌ 硬编码 API_KEY(必须从环境变量读取) -- ❌ 在前端暴露密钥(应通过后端代理) -- ❌ `npm run dev` 运行网页(无法看到内容) -- ❌ 修改 `milkdown-docs/` 目录 -- ❌ 类型错误使用 `as any` / `@ts-ignore` -- ❌ 空的 catch 块 +- 不要把整个仓库当成“全小写+短横线命名”项目。当前实际情况是: + - Vue 组件和视图多为 PascalCase + - 前端工具模块多为小写 .js + - 插件层使用 TypeScript + - Python 使用 snake_case +- 以就地风格为准,不要顺手做全仓格式统一。 +- UI 文案和代理回复默认使用中文。 +- 不要修改 milkdown-docs/,它是只读参考资料。 +- 不要新增硬编码密钥、空 catch/except、as any、@ts-ignore 之类的扩散式技术债。 +- 代理在这个仓库里应优先做局部、可验证的修改,不要做无关重构。 -## 命令 +## 调试路径 -```bash -# 前端开发 -npm install -npm run dev # 端口 5173 -npm run build # 构建到 dist/ +- 补全问题: + src/components/MilkdownEditor.vue + -> src/plugins/copilotPlugin.ts + -> src/utils/api.js + -> backend/main.py + -> backend/prompt.py / backend/llm.py -# 后端运行 -pip install -r backend/requirements.txt -python backend/main.py # 端口 8001 -# 或 -uvicorn backend.main:app --reload --port 8001 +- OCR 问题: + src/components/MilkdownEditor.vue + -> backend/main.py + -> backend/llm.py -# 测试 -pytest # 运行所有测试,覆盖率要求 90% -python backend/tests/run_tests.py unit # 单元测试 -python backend/tests/run_tests.py integration # 集成测试 -``` +- 文档转换问题: + src/utils/convert.js + -> backend/main.py -## 注意事项 +- TTS 问题: + src/components/TTSMenu.vue / src/components/TTSPlayer.vue / src/components/MilkdownEditor.vue + -> src/utils/api.js + -> backend/tts_asr.py -- **架构分离**:前端仅渲染和数据回传,后端负责 LLM API 调用和数据解析 -- **延迟优先**:代码效率优先,降低延迟放在第一位 -- **大小限制**:文档超过 32KB 自动禁用 AI 补全 -- **milkdown-docs/**:官方文档参考,不可修改,编辑器相关问题需核对此目录 +## 测试和产物 + +- pytest.ini 对 backend.main、backend.llm、backend.prompt、backend.geoip、backend.prompts、backend.tts_asr 设了覆盖率门槛,低于 90% 会失败。 +- 默认测试目录是 backend/tests。 +- 常见生成产物包括 dist、htmlcov、.pytest_cache、api_performance_report.md;它们不是源代码。 + +## 文档注意事项 + +- README.md 对产品功能有参考价值,但其中补全、TTS/ASR 和部分接口说明已经比代码旧。 +- backend/TTS_ASR_MACOS_FIX.md 和 backend/tests/TESTING_GUIDE.md 更适合作为历史背景,不应在与代码冲突时被当成事实来源。 +- 修改行为时,优先参考实现代码和对应测试,再决定是否同步普通文档。 diff --git a/backend/AGENTS.md b/backend/AGENTS.md index b2a111f..fe8d212 100644 --- a/backend/AGENTS.md +++ b/backend/AGENTS.md @@ -1,40 +1,121 @@ -# Backend 模块指南 +# Backend 后端指引 -## OVERVIEW -FastAPI 后端,处理 AI 补全、OCR、文档转换、TTS/ASR。 +本文件适用于 backend/ 下的后端实现。进入 backend/tests/ 后,以子目录 AGENTS.md 为准。 -## STRUCTURE -- main.py - API 入口、路由、CORS、启动逻辑 -- llm.py - Ollama 异步调用、超时控制、日志 -- prompt.py - Prompt 构建、上下文准备、语言处理 -- geoip.py - IP 地理位置查询 -- tts_asr.py - TTS/ASR 处理、Apple Silicon 优化 -- prompts/ - JSON 格式提示模板(PromptManager 单例) -- tests/ - pytest 测试套件(见子目录 AGENTS.md) +## 后端职责 -## WHERE TO LOOK +- 对外提供补全、取消补全、OCR、文档转换和 TTS 相关接口。 +- 组织 Prompt,上下文清洗,调用 Ollama 模型。 +- 负责 API Key 校验、日志记录和部分启动预热逻辑。 -| 任务 | 文件 | 说明 | -|------|------|------| -| API 路由定义 | main.py | /v1/completions、/v1/ocr、/v1/convert 等 | -| LLM 调用封装 | llm.py | call_ollama、call_vlm_ocr、超时控制 | -| Prompt 构建 | prompt.py | build_completion_prompts、语言处理 | -| 提示模板 | prompts/__init__.py | PromptManager、JSON 模板加载 | -| TTS/ASR | tts_asr.py | 模型预热、设备检测、音频处理 | -| 测试 | tests/ | pytest 测试套件 | +## 先看哪里 -## CONVENTIONS -- Python 4 空格缩进 -- 函数/变量:snake_case -- 类:PascalCase -- 文件名:全小写+短横线 +- API 入口和路由:main.py +- Ollama 调用封装:llm.py +- Prompt 清洗和拼装:prompt.py +- 数据模型:models.py +- 地理位置:geoip.py +- TTS 路由:tts_asr.py +- Prompt 模板:prompts/ +- 后端测试:tests/ -## ANTI-PATTERNS -- 硬编码 API_KEY(必须从环境变量读取) -- 空 catch 块 -- 类型错误使用 as any / @ts-ignore +## 当前接口面 -## 注意事项 -- 端口:8001 -- 启动:`python backend/main.py` 或 `uvicorn backend.main:app --reload` -- 依赖:`pip install -r backend/requirements.txt` +- POST /v1/completions +- POST /v1/completions/cancel +- POST /v1/ocr +- POST /v1/convert +- /v1/tts-asr/* 由 tts_asr.py 延迟注册 + +## 请求流转 + +### /v1/completions + +- 读取或生成 request_id。 +- privacy_mode 为 false 时,尝试根据客户端 IP 生成 location 文本。 +- 调用 prepare_prompt_context 清洗 prefix 和 suffix。 +- 调用 build_completion_prompts 生成 system_prompt 和 user_prompt。 +- 创建异步任务调用 call_ollama。 +- 用 request_id 把任务登记到 ACTIVE_COMPLETIONS。 +- 成功时返回 JSON:content 和 request_id。 +- finally 中清理当前 request_id 对应任务。 + +### /v1/completions/cancel + +- 通过 request_id 在 ACTIVE_COMPLETIONS 中查找任务。 +- 未找到返回 not_found。 +- 已完成返回 already_done。 +- 仍在执行则调用 task.cancel() 并返回 ok。 + +### /v1/ocr + +- 把 base64 图片解码成字节。 +- 调用 call_vlm_ocr。 +- 返回识别文本和原始文件名。 + +### /v1/convert + +- 接收 base64 文件内容和文件名。 +- 当前允许的扩展名只有 txt、docx、pptx、pdf。 +- txt 直接解码后清洗。 +- 其他格式写入临时文件,用 MarkItDown 转换,再做 Markdown 清洗。 +- 清洗逻辑会移除图片 Markdown 和 img HTML 标签,并压缩多余空行。 + +### /v1/tts-asr/* + +- 通过 _register_tts_asr_routes 延迟导入并挂到主应用。 +- 当前代码里的 tts_asr.py 主要是 TTS 能力,不要自行假设存在完整 ASR 实现。 + +## 开发命令 + +- 安装依赖:pip install -r backend/requirements.txt +- 启动:python backend/main.py +- 开发启动:uvicorn backend.main:app --reload --port 8001 +- 路由相关测试: + - pytest backend/tests/test_main_endpoints.py -v + - pytest backend/tests/test_main_cancel.py -v +- Prompt 测试: + - pytest backend/tests/test_prompt.py -v + - pytest backend/tests/test_prompt_extended.py -v +- LLM 测试: + - pytest backend/tests/test_llm.py -v + - pytest backend/tests/test_llm_extended.py -v + +## 编码约定 + +- Python 使用 4 空格缩进。 +- 函数、变量使用 snake_case,类使用 PascalCase。 +- 新逻辑优先保留显式类型和明确的输入输出。 +- 异步边界要清晰;阻塞操作优先放进 asyncio.to_thread,而不是直接阻塞事件循环。 +- 异常要么转成 HTTPException,要么转成结构化 JSONResponse;不要静默吞掉后端错误。 +- 日志尽量带 request_id 或短 tag,便于把前后端一次请求串起来。 + +## 容易误判的点 + +- 补全接口当前不是流式响应,不要按 SSE 方式改造周边代码。 +- ACTIVE_COMPLETIONS 在补全和取消路径里都被读写,任务生命周期要谨慎处理。 +- main.py 里虽然有 _convert_docx_to_pdf 辅助函数,但当前 /v1/convert 路径实际走的是 MarkItDown,不要误以为 DOCX 转 PDF 桥接脚本已接入主流程。 +- API_KEY 存在占位默认值,这更像本地开发兜底,不是推荐的安全模式。 +- 历史 TTS/ASR 文档和部分测试覆盖的是旧实现;代码与文档冲突时,先确认产品方向,再决定修代码还是修文档。 + +## 改动时的定位建议 + +- 如果问题是补全结果不对,先查 prompt.py,再查 llm.py,不要只盯着 main.py。 +- 如果问题是取消不生效,先查 main.py 里的 request_id 生命周期,再对照前端的 X-Request-Id 和 cancel 调用。 +- 如果问题是 OCR 识别为空,先看 main.py 的 base64 解码,再看 llm.py 的 call_vlm_ocr。 +- 如果问题是转换结果脏,重点看 main.py 里的 _sanitize_converted_markdown。 +- 如果问题是 TTS 行为和文档不一致,以 tts_asr.py 为准,不要以 README 为准。 + +## 测试映射 + +- 路由主行为:tests/test_main_endpoints.py +- 取消逻辑:tests/test_main_cancel.py +- Prompt 逻辑:tests/test_prompt.py、tests/test_prompt_extended.py +- LLM 包装层:tests/test_llm.py、tests/test_llm_extended.py +- GeoIP:tests/test_geoip.py +- TTS 相关:tests/test_tts_asr_*.py + +## 文档使用原则 + +- README.md、TTS_ASR_MACOS_FIX.md、tests/TESTING_GUIDE.md 可以作为背景材料。 +- 一旦这些文档和 main.py、llm.py、prompt.py、tts_asr.py 冲突,以代码为准。 diff --git a/backend/api_performance_report.md b/backend/api_performance_report.md deleted file mode 100644 index 006fe37..0000000 --- a/backend/api_performance_report.md +++ /dev/null @@ -1,196 +0,0 @@ -# API Benchmarking Report (2026-04-06 13:45:31) - -**Base URL:** `https://api.imageteach.tech:8002` - -## Executive Summary -| Task | Success Rate | Avg TTFB | Avg Latency | P95 Latency | TPS | RPS | -| :--- | :--- | :--- | :--- | :--- | :--- | :--- | -| Completion-Short | 90.0% | 9123.6ms | 9123.8ms | 20222.9ms | 7.9 | 0.08 | -| Completion-Normal | 10.0% | 10559.3ms | 10559.6ms | 10559.6ms | 66.4 | 0.66 | -| Completion-Long | 0.0% | 0.0ms | 0.0ms | 0.0ms | 0.0 | 8.97 | -| OCR-Concurrent | 0.0% | 0.0ms | 0.0ms | 0.0ms | 0.0 | 6.75 | -| TTS-Concurrent | 0.0% | 0.0ms | 0.0ms | 0.0ms | 0.0 | 10.17 | -| ASR-Concurrent | 0.0% | 0.0ms | 0.0ms | 0.0ms | 0.0 | 13.02 | -| Convert-Concurrent | 0.0% | 0.0ms | 0.0ms | 0.0ms | 0.0 | 5.98 | - -## Stability & Context Analysis -Detailed analysis of how context length affects TTFB and overall performance. - -### Completion-Short Details -- **Total Samples:** 10 -- **Duration:** 123.93s -- **Top Errors:** - - `[0]` - -### Completion-Normal Details -- **Total Samples:** 10 -- **Duration:** 15.21s -- **Top Errors:** - - `[502]` -502 Bad Gateway - -

502 Bad Gateway

-
openresty
- - - - - `[502]` -502 Bad Gateway - -

502 Bad Gateway

-
openresty
- - - - - `[502]` -502 Bad Gateway - -

502 Bad Gateway

-
openresty
- - - - -### Completion-Long Details -- **Total Samples:** 10 -- **Duration:** 1.11s -- **Top Errors:** - - `[502]` -502 Bad Gateway - -

502 Bad Gateway

-
openresty
- - - - - `[502]` -502 Bad Gateway - -

502 Bad Gateway

-
openresty
- - - - - `[502]` -502 Bad Gateway - -

502 Bad Gateway

-
openresty
- - - - -### OCR-Concurrent Details -- **Total Samples:** 10 -- **Duration:** 1.48s -- **Top Errors:** - - `[502]` -502 Bad Gateway - -

502 Bad Gateway

-
openresty
- - - - - `[502]` -502 Bad Gateway - -

502 Bad Gateway

-
openresty
- - - - - `[502]` -502 Bad Gateway - -

502 Bad Gateway

-
openresty
- - - - -### TTS-Concurrent Details -- **Total Samples:** 10 -- **Duration:** 0.98s -- **Top Errors:** - - `[502]` -502 Bad Gateway - -

502 Bad Gateway

-
openresty
- - - - - `[502]` -502 Bad Gateway - -

502 Bad Gateway

-
openresty
- - - - - `[502]` -502 Bad Gateway - -

502 Bad Gateway

-
openresty
- - - - -### ASR-Concurrent Details -- **Total Samples:** 10 -- **Duration:** 0.77s -- **Top Errors:** - - `[502]` -502 Bad Gateway - -

502 Bad Gateway

-
openresty
- - - - - `[502]` -502 Bad Gateway - -

502 Bad Gateway

-
openresty
- - - - - `[502]` -502 Bad Gateway - -

502 Bad Gateway

-
openresty
- - - - -### Convert-Concurrent Details -- **Total Samples:** 10 -- **Duration:** 1.67s -- **Top Errors:** - - `[502]` -502 Bad Gateway - -

502 Bad Gateway

-
openresty
- - - - - `[502]` -502 Bad Gateway - -

502 Bad Gateway

-
openresty
- - - - - `[502]` -502 Bad Gateway - -

502 Bad Gateway

-
openresty
- - diff --git a/backend/main.py b/backend/main.py index a0343d0..eedc60c 100644 --- a/backend/main.py +++ b/backend/main.py @@ -1,4 +1,4 @@ -import asyncio +import asyncio import base64 import logging import os @@ -9,9 +9,9 @@ import tempfile import uuid from typing import Optional -from fastapi import FastAPI, HTTPException, Request, Security, File, UploadFile +from fastapi import FastAPI, HTTPException, Request, Security from fastapi.middleware.cors import CORSMiddleware -from fastapi.responses import JSONResponse, Response +from fastapi.responses import JSONResponse from fastapi.security import APIKeyHeader from pydantic import BaseModel @@ -133,8 +133,7 @@ def _sanitize_converted_markdown(text: str) -> str: value = (text or "").replace("\r\n", "\n").replace("\r", "\n") value = IMAGE_MARKDOWN_RE.sub("", value) value = IMAGE_HTML_RE.sub("", value) - value = re.sub(r"\n{3,}", "\n\n", value) - return value.strip() + return value def get_client_ip(request: Request) -> str: diff --git a/backend/prompt.py b/backend/prompt.py index 3ff9ea3..8c90936 100644 --- a/backend/prompt.py +++ b/backend/prompt.py @@ -302,23 +302,24 @@ Requirements: - Non-empty and meaningful - Concise unless structure needs more - Follows markdown rules in system prompt +- Use real line breaks instead of spelled-out escape sequences unless PREFIX or SUFFIX clearly requires that text === BOUNDARY DECISION GUIDE === Step 1: Check PREFIX_ENDS_WITH_NEWLINE If false, ask: "Does output need to start on a new line?" - YES if PREFIX ends with: ":", "steps:", "items:", heading text, or complete sentence before heading - - If YES: start output with \\n + - If YES: make the first character of OUTPUT a real newline Step 2: Check SUFFIX_STARTS_WITH_NEWLINE If false, ask: "Does output need to end with a newline?" - YES if SUFFIX starts with: heading (##), new paragraph, or list marker - - If YES: end output with \\n + - If YES: make the last character of OUTPUT a real newline Step 3: Choose newline type - - Use \\n\\n for: new paragraphs, before headings, starting lists - - Use \\n for: continuing within blocks, list items, table cells - - Exception: inside code fences, use \\n freely + - Use a blank line for: new paragraphs, before headings, starting lists + - Use a single line break for: continuing within blocks, list items, table cells + - Exception: inside code fences, use real newline characters freely === CONTEXT NOTES === - OCR metadata (e.g., ) is hidden context, never copy to output diff --git a/backend/prompts/system_prompt.json b/backend/prompts/system_prompt.json index 6dfc908..87bf612 100644 --- a/backend/prompts/system_prompt.json +++ b/backend/prompts/system_prompt.json @@ -1,3 +1,3 @@ { - "template": "You are an inline completion engine for a {language_id} editor with ghost-text suggestions.\n\nReturn only the insertion text that should be placed between PREFIX and SUFFIX.\n\nCORE PRINCIPLE: Output insertion text only. No explanations, no meta labels, no wrapper quotes.\n\nPRIORITY 1: CONTEXT AWARENESS (Read these flags from user prompt)\n- CURSOR_IN_FENCED_CODE_BLOCK: Are you inside a code fence?\n- CURSOR_FENCE_LANGUAGE: What language is the current fence?\n- PREFIX_ENDS_WITH_NEWLINE: Does prefix end with newline?\n- SUFFIX_STARTS_WITH_NEWLINE: Does suffix start with newline?\n- MERMAID_CONTEXT: Is this a Mermaid diagram context?\n\nPRIORITY 2: SPECIALIZED CONTENT RULES\n\n2.1 Code Block Handling:\nIf CURSOR_IN_FENCED_CODE_BLOCK=true:\n- You are inside a code fence\n- Output code lines ONLY (no triple backticks)\n- Use single \\n for code line separation\n\nIf CURSOR_IN_FENCED_CODE_BLOCK=false and code needed:\n- Wrap code in fenced block with language tag:\n```{language}\ncode here\n```\n- Never use inline backticks for code snippets\n\n2.2 Math Formatting (KaTeX):\n- Inline math: wrap with $...$\n- Block math: wrap with $$...$$\n- Never output bare formulas\n- Exception: inside latex/tex/katex fence, output raw LaTeX\n\n2.3 Mermaid Diagrams:\nIf CURSOR_FENCE_LANGUAGE=mermaid:\n- Output Mermaid syntax ONLY\n- No backticks, no explanations\n\nIf MERMAID_CONTEXT=true and outside fence:\n- Output complete fenced block:\n```mermaid\ndiagram syntax\n```\n\nPRIORITY 3: MARKDOWN STRUCTURE\n\n3.1 Newline Semantics:\n- Single \\n: soft break (same paragraph, renders as space or
)\n- Double \\n\\n: hard break (new paragraph/block)\n- Use \\n\\n for: new paragraphs, before headings, starting lists/tables\n- Use \\n for: continuation within blocks (list items, table cells)\n- Exception: inside code blocks, use \\n freely for code lines\n\n3.2 Boundary Management:\nCheck PREFIX_ENDS_WITH_NEWLINE and SUFFIX_STARTS_WITH_NEWLINE:\n- If PREFIX lacks needed newline: start OUTPUT with \\n\n- If SUFFIX lacks needed newline: end OUTPUT with \\n\n- Common cases requiring leading \\n:\n* Starting a list after \"Steps:\"\n* Creating new paragraph after text\n* Adding heading after paragraph\n- Common cases requiring trailing \\n:\n* Before new heading\n* End of section\n\n3.3 Context Stitching:\n- Never repeat text from SUFFIX beginning\n- Match PREFIX tone, style, indentation\n- Continue structures: lists, tables, quotes, headings\n\nPRIORITY 4: HIDDEN CONTEXT\n- OCR metadata like is hidden context\n- Never copy OCR tags to output\n- Use OCR content as semantic hint only" + "template": "You are an inline completion engine for a {language_id} editor with ghost-text suggestions.\n\nReturn only the insertion text that should be placed between PREFIX and SUFFIX.\n\nCORE PRINCIPLE: Output insertion text only. No explanations, no meta labels, no wrapper quotes.\n\nPRIORITY 1: CONTEXT AWARENESS (Read these flags from user prompt)\n- CURSOR_IN_FENCED_CODE_BLOCK: Are you inside a code fence?\n- CURSOR_FENCE_LANGUAGE: What language is the current fence?\n- PREFIX_ENDS_WITH_NEWLINE: Does prefix end with newline?\n- SUFFIX_STARTS_WITH_NEWLINE: Does suffix start with newline?\n- MERMAID_CONTEXT: Is this a Mermaid diagram context?\n\nPRIORITY 2: SPECIALIZED CONTENT RULES\n\n2.1 Code Block Handling:\nIf CURSOR_IN_FENCED_CODE_BLOCK=true:\n- You are inside a code fence\n- Output code lines ONLY (no triple backticks)\n- Separate code lines with actual newline characters\n\nIf CURSOR_IN_FENCED_CODE_BLOCK=false and code needed:\n- Wrap code in fenced block with language tag:\n```{language}\ncode here\n```\n- Never use inline backticks for code snippets\n\n2.2 Math Formatting (KaTeX):\n- Inline math: wrap with $...$\n- Block math: wrap with $$...$$\n- Never output bare formulas\n- Exception: inside latex/tex/katex fence, output raw LaTeX\n\n2.3 Mermaid Diagrams:\nIf CURSOR_FENCE_LANGUAGE=mermaid:\n- Output Mermaid syntax ONLY\n- No backticks, no explanations\n\nIf MERMAID_CONTEXT=true and outside fence:\n- Output complete fenced block:\n```mermaid\ndiagram syntax\n```\n\nPRIORITY 3: MARKDOWN STRUCTURE\n\n3.1 Newline Semantics:\n- Use actual line breaks in output, not spelled-out escape sequences, unless the surrounding content explicitly needs that text\n- A single line break usually continues the current block\n- A blank line starts a new paragraph or block\n- Use blank lines for: new paragraphs, before headings, starting lists/tables\n- Use single line breaks for: continuation within blocks (list items, table cells)\n- Exception: inside code blocks, use actual newline characters freely for code lines\n\n3.2 Boundary Management:\nCheck PREFIX_ENDS_WITH_NEWLINE and SUFFIX_STARTS_WITH_NEWLINE:\n- If PREFIX lacks needed newline: start OUTPUT on a new line\n\n- If SUFFIX lacks needed newline: end OUTPUT with a trailing line break\n\n- Common cases requiring a leading line break:\n* Starting a list after \"Steps:\"\n* Creating new paragraph after text\n* Adding heading after paragraph\n- Common cases requiring a trailing line break:\n* Before new heading\n* End of section\n\n3.3 Context Stitching:\n- Never repeat text from SUFFIX beginning\n- Match PREFIX tone, style, indentation\n- Continue structures: lists, tables, quotes, headings\n\nPRIORITY 4: HIDDEN CONTEXT\n- OCR metadata like is hidden context\n- Never copy OCR tags to output\n- Use OCR content as semantic hint only" } diff --git a/backend/test_api_performance.py b/backend/test_api_performance.py deleted file mode 100644 index 6e5e8b0..0000000 --- a/backend/test_api_performance.py +++ /dev/null @@ -1,295 +0,0 @@ -import asyncio -import base64 -import json -import logging -import time -import argparse -import uuid -import sys -import statistics -import os -from datetime import datetime -from typing import List, Dict, Any, Optional, Tuple -import httpx -from pydantic import BaseModel - -# Configure logging -logging.basicConfig( - level=logging.INFO, - format="%(asctime)s [%(levelname)s] %(message)s", - handlers=[logging.StreamHandler(sys.stdout)] -) -logger = logging.getLogger("api_benchmarker") - -# Constants -DEFAULT_BASE_URL = "http://localhost:8001" -DEFAULT_API_KEY = "your-secret-key-here" -CHARS_PER_TOKEN = 4 - -# Data Generators -def get_dummy_base64_image(): - return "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=" - -def get_dummy_base64_audio(): - # A bit longer dummy audio to pass validation (44 bytes header + some data) - return "UklGRigAAABXQVZFZm10IBAAAAABAAEARKwAAIhYAQACABAAZGF0YQQAAAAAAA" + "A" * 100 + "==" - -def generate_context_text(tokens: int) -> str: - """Generate synthetic text of approximately 'tokens' tokens.""" - base_phrase = "The quick brown fox jumps over the lazy dog. " - repeat_count = (tokens * CHARS_PER_TOKEN) // len(base_phrase) + 1 - return (base_phrase * repeat_count)[:tokens * CHARS_PER_TOKEN] - -# Metric Models -class RequestMetric(BaseModel): - task_name: str - endpoint: str - status_code: int - ttfb_ms: float - total_ms: float - success: bool - tokens: int - error: Optional[str] = None - -class BenchStats: - def __init__(self, name: str): - self.name = name - self.metrics: List[RequestMetric] = [] - self.start_time = 0.0 - self.end_time = 0.0 - - def add(self, m: RequestMetric): - self.metrics.append(m) - - def get_summary(self) -> Dict[str, Any]: - if not self.metrics: - return {} - - total = len(self.metrics) - successes = [m for m in self.metrics if m.success] - success_count = len(successes) - fail_count = total - success_count - - total_latencies = [m.total_ms for m in successes] if successes else [0] - ttfb_latencies = [m.ttfb_ms for m in successes] if successes else [0] - - duration = self.end_time - self.start_time - total_tokens = sum(m.tokens for m in successes) - - return { - "name": self.name, - "total_requests": total, - "success_rate": (success_count / total) * 100 if total > 0 else 0, - "avg_latency": statistics.mean(total_latencies), - "p50_latency": statistics.median(total_latencies), - "p95_latency": sorted(total_latencies)[int(len(total_latencies)*0.95)] if total_latencies else 0, - "avg_ttfb": statistics.mean(ttfb_latencies), - "tps": total_tokens / duration if duration > 0 else 0, - "rps": total / duration if duration > 0 else 0, - "duration": duration - } - -# Benchmarking Engine -class ApiBenchmarker: - def __init__(self, base_url: str, api_key: str): - self.base_url = base_url - self.api_key = api_key - self.headers = {"X-API-Key": api_key} - self.semaphores = { - "completions": asyncio.Semaphore(5), - "ocr": asyncio.Semaphore(2), - "convert": asyncio.Semaphore(2), - "tts-asr": asyncio.Semaphore(3) - } - self.results: Dict[str, BenchStats] = {} - - async def _execute_request(self, client: httpx.AsyncClient, name: str, method: str, path: str, **kwargs) -> RequestMetric: - url = f"{self.base_url}{path}" - start = time.perf_counter() - ttfb = 0.0 - tokens_count = 0 - - # Estimate input + output tokens (mock for output) - if "json" in kwargs: - input_text = str(kwargs["json"].get("prefix", "")) + str(kwargs["json"].get("text", "")) - tokens_count += len(input_text) // CHARS_PER_TOKEN - - try: - async with client.stream(method, url, **kwargs) as response: - ttfb = (time.perf_counter() - start) * 1000 - - body = await response.aread() - total_ms = (time.perf_counter() - start) * 1000 - success = 200 <= response.status_code < 300 - - error_msg = None - if not success: - error_msg = body.decode(errors="ignore")[:200] - else: - # Estimate output tokens from response content - try: - resp_json = json.loads(body) - content = resp_json.get("content", "") or resp_json.get("text", "") or resp_json.get("markdown", "") - tokens_count += len(content) // CHARS_PER_TOKEN - except: - pass - - return RequestMetric( - task_name=name, - endpoint=path, - status_code=response.status_code, - ttfb_ms=ttfb, - total_ms=total_ms, - success=success, - tokens=tokens_count, - error=error_msg - ) - except Exception as e: - total_ms = (time.perf_counter() - start) * 1000 - return RequestMetric( - task_name=name, - endpoint=path, - status_code=0, - ttfb_ms=ttfb or total_ms, - total_ms=total_ms, - success=False, - tokens=tokens_count, - error=str(e) - ) - - async def run_task(self, client: httpx.AsyncClient, task_type: str, name: str, iterations: int): - if name not in self.results: - self.results[name] = BenchStats(name) - - stats = self.results[name] - stats.start_time = time.perf_counter() - - sem = self.semaphores.get(task_type, self.semaphores["completions"]) - - async def worker(): - async with sem: - if task_type == "completions": - # Stability Test Variation - prefix_len = 100 - if "Normal" in name: prefix_len = 1000 - if "Long" in name: prefix_len = 4000 - - metric = await self._execute_request(client, name, "POST", "/v1/completions", json={ - "prefix": generate_context_text(prefix_len), - "suffix": "End of document.", - "model_thinking": "low" - }) - elif task_type == "ocr": - metric = await self._execute_request(client, name, "POST", "/v1/ocr", json={ - "image": get_dummy_base64_image(), - "filename": "bench.png" - }) - elif task_type == "convert": - metric = await self._execute_request(client, name, "POST", "/v1/convert", json={ - "file": base64.b64encode(b"Performance test data").decode(), - "filename": "bench.txt" - }) - elif task_type == "tts": - metric = await self._execute_request(client, name, "POST", "/v1/tts-asr/tts", json={ - "text": "This is a performance benchmark for the text to speech engine.", - "voice": "v2/en_speaker_6", - "format": "wav" - }) - elif task_type == "asr": - metric = await self._execute_request(client, name, "POST", "/v1/tts-asr/asr", json={ - "audio_base64": get_dummy_base64_audio(), - "language": "en" - }) - else: - metric = await self._execute_request(client, name, "GET", "/v1/tts-asr/status") - - stats.add(metric) - - tasks = [worker() for _ in range(iterations)] - await asyncio.gather(*tasks) - stats.end_time = time.perf_counter() - - def generate_report(self, output_file: str): - report = [] - report.append(f"# API Benchmarking Report ({datetime.now().strftime('%Y-%m-%d %H:%M:%S')})") - report.append(f"\n**Base URL:** `{self.base_url}`") - - # Summary Table - report.append("\n## Executive Summary") - report.append("| Task | Success Rate | Avg TTFB | Avg Latency | P95 Latency | TPS | RPS |") - report.append("| :--- | :--- | :--- | :--- | :--- | :--- | :--- |") - - for name, stats in self.results.items(): - s = stats.get_summary() - if not s: continue - report.append(f"| {s['name']} | {s['success_rate']:.1f}% | {s['avg_ttfb']:.1f}ms | {s['avg_latency']:.1f}ms | {s['p95_latency']:.1f}ms | {s['tps']:.1f} | {s['rps']:.2f} |") - - # Stability Analysis - report.append("\n## Stability & Context Analysis") - report.append("Detailed analysis of how context length affects TTFB and overall performance.") - - # Details per category - for name, stats in self.results.items(): - s = stats.get_summary() - if not s: continue - report.append(f"\n### {name} Details") - report.append(f"- **Total Samples:** {s['total_requests']}") - report.append(f"- **Duration:** {s['duration']:.2f}s") - failures = [m for m in stats.metrics if not m.success] - if failures: - report.append(f"- **Top Errors:**") - for f in failures[:3]: - report.append(f" - `[{f.status_code}]` {f.error}") - - with open(output_file, "w", encoding="utf-8") as f: - f.write("\n".join(report)) - logger.info(f"Report generated: {output_file}") - -async def main(): - parser = argparse.ArgumentParser(description="Advanced LLM API Benchmarker") - parser.add_argument("--url", default=DEFAULT_BASE_URL, help="Base URL") - parser.add_argument("--key", default=DEFAULT_API_KEY, help="API Key") - parser.add_argument("--c-comp", type=int, default=5, help="Completion Concurrency") - parser.add_argument("--c-ocr", type=int, default=2, help="OCR Concurrency") - parser.add_argument("--c-audio", type=int, default=2, help="TTS/ASR Concurrency") - parser.add_argument("--iters", type=int, default=10, help="Iterations per test suite") - parser.add_argument("--output", default="api_performance_report.md", help="Output report file") - - args = parser.parse_args() - - bench = ApiBenchmarker(args.url, args.key) - bench.semaphores["completions"] = asyncio.Semaphore(args.c_comp) - bench.semaphores["ocr"] = asyncio.Semaphore(args.c_ocr) - bench.semaphores["tts-asr"] = asyncio.Semaphore(args.c_audio) - - async with httpx.AsyncClient(headers=bench.headers, timeout=120.0) as client: - logger.info("Starting Benchmark Suites...") - - # Suite 1: Stability - Completion Contexts - logger.info("Running Stability Suite (Short Context)...") - await bench.run_task(client, "completions", "Completion-Short", args.iters) - - logger.info("Running Stability Suite (Normal Context)...") - await bench.run_task(client, "completions", "Completion-Normal", args.iters) - - logger.info("Running Stability Suite (Long Context)...") - await bench.run_task(client, "completions", "Completion-Long", args.iters) - - # Suite 2: Functional Concurrency - logger.info("Running OCR Concurrency Suite...") - await bench.run_task(client, "ocr", "OCR-Concurrent", args.iters) - - logger.info("Running TTS Concurrency Suite...") - await bench.run_task(client, "tts", "TTS-Concurrent", args.iters) - - logger.info("Running ASR Concurrency Suite...") - await bench.run_task(client, "asr", "ASR-Concurrent", args.iters) - - logger.info("Running File Transformation Suite...") - await bench.run_task(client, "convert", "Convert-Concurrent", args.iters) - - bench.generate_report(args.output) - print(f"\nBenchmark Complete! View the report at: {args.output}") - -if __name__ == "__main__": - asyncio.run(main()) diff --git a/backend/test_geoip.py b/backend/test_geoip.py deleted file mode 100644 index 52ba305..0000000 --- a/backend/test_geoip.py +++ /dev/null @@ -1,80 +0,0 @@ -""" -GeoIP2 IP归属地查询测试脚本 - -使用方法: -1. 安装依赖:pip install geoip2 -2. 下载数据库:https://dev.maxmind.com/geoip/geoip2/geolite2/ -3. 运行测试:python test_geoip.py -""" - -import os -import sys - -try: - import geoip2.database -except ImportError: - print("请先安装 geoip2: pip install geoip2") - sys.exit(1) - -DB_PATH = os.path.join(os.path.dirname(__file__), "GeoLite2-City.mmdb") - -TEST_IPS = [ - "8.8.8.8", # Google DNS (美国) - "114.114.114.114", # 114 DNS (中国南京) - "223.5.5.5", # 阿里DNS (中国杭州) - "1.1.1.1", # Cloudflare DNS (澳大利亚) - "119.29.29.29", # 腾讯DNS (中国) -] - - -def get_location(reader, ip: str) -> dict: - try: - response = reader.city(ip) - return { - "ip": ip, - "country": response.country.name, - "country_code": response.country.iso_code, - "region": response.subdivisions.most_specific.name if response.subdivisions else None, - "city": response.city.name, - "latitude": response.location.latitude, - "longitude": response.location.longitude, - "timezone": response.location.time_zone, - } - except geoip2.errors.AddressNotFoundError: - return {"ip": ip, "error": "IP未在数据库中找到"} - except Exception as e: - return {"ip": ip, "error": str(e)} - - -def main(): - if not os.path.exists(DB_PATH): - print(f"数据库文件不存在: {DB_PATH}") - print("请从 https://dev.maxmind.com/geoip/geoip2/geolite2/ 下载 GeoLite2-City.mmdb") - return - - print(f"加载数据库: {DB_PATH}") - reader = geoip2.database.Reader(DB_PATH) - - print("\n" + "=" * 60) - print("IP归属地查询测试") - print("=" * 60) - - for ip in TEST_IPS: - result = get_location(reader, ip) - if "error" in result: - print(f"\n{ip}: {result['error']}") - else: - print(f"\n{ip}:") - print(f" 国家: {result['country']} ({result['country_code']})") - print(f" 地区: {result['region'] or '未知'}") - print(f" 城市: {result['city'] or '未知'}") - print(f" 坐标: {result['latitude']}, {result['longitude']}") - print(f" 时区: {result['timezone']}") - - reader.close() - print("\n" + "=" * 60) - print("测试完成") - - -if __name__ == "__main__": - main() diff --git a/backend/tests/AGENTS.md b/backend/tests/AGENTS.md index 871f0b6..47fa413 100644 --- a/backend/tests/AGENTS.md +++ b/backend/tests/AGENTS.md @@ -1,45 +1,62 @@ -OVERVIEW: pytest 测试套件,覆盖率要求 90% -STRUCTURE: -- test_*.py - 各模块测试 -- run_tests.py - 测试执行脚本(unit/integration/all) -- simulate_macos.py - macOS 环境模拟 -- TESTING_GUIDE.md - 测试指南文档 +# Backend Tests 测试指引 -WHERE TO LOOK -表格 +本文件适用于 backend/tests/ 下的测试和测试脚本。 -| Area | Path | -|---|---| -| 单元测试 | backend/tests/ | -| 集成测试 | backend/tests/ | -| 测试执行脚本 | backend/tests/run_tests.py | -| macOS 模拟 | backend/tests/simulate_macos.py | -| 测试指南 | backend/tests/TESTING_GUIDE.md | +## 测试入口 -运行命令: -- pytest - 运行所有测试 -- python backend/tests/run_tests.py unit - 单元测试 -- python backend/tests/run_tests.py integration - 集成测试 +- pytest.ini 指定默认测试目录为 backend/tests,并设置后端覆盖率门槛为 90%。 +- run_tests.py 提供 unit、integration、simulate、all 几种快捷入口。 +- 默认优先使用 pytest 跑窄测试;只有在需要脚本封装参数时再用 run_tests.py。 -测试命名约定:test_*.py、Test* 类、test_* 函数 +## 测试分布 -ANTI-PATTERNS:删除测试以通过覆盖率 +- test_main_endpoints.py:主 API 路由行为 +- test_main_cancel.py:补全取消和任务生命周期 +- test_prompt.py、test_prompt_extended.py:Prompt 上下文与规则 +- test_llm.py、test_llm_extended.py:LLM 包装层 +- test_geoip.py:GeoIP 逻辑 +- test_tts_asr_*.py:TTS 相关与历史 TTS/ASR 面 +- simulate_macos.py:历史模拟脚本 +- quick_verify.py、verify_cross.py、play_audio.py:人工验证或辅助脚本 -验证 -- 保证测试覆盖率≥90% 时,报告合格 -- 使用 CI 运行 pytest,确保通过率 +## 常用命令 -注意事项 -- 不要重复父目录内容 -- 不要超过 60 行 +- pytest +- pytest backend/tests/test_main_endpoints.py -v +- pytest backend/tests/test_main_cancel.py -v +- pytest backend/tests/test_prompt.py -v +- pytest backend/tests/test_llm.py -v +- python backend/tests/run_tests.py unit +- python backend/tests/run_tests.py integration --url http://localhost:8001 --key your-secret-key-here -测试应尽量独立,不要依赖全局状态 -- 运行单元测试时应使用 unit 标签 -- 运行集成测试时应使用 integration 标签 +## 测试原则 -区分环境 -- unit 测试应尽量快速、稳定 -- integration 测试应覆盖接口和数据库交互 +- 优先跑与改动直接对应的窄测试,不要动不动全量跑。 +- 单元测试尽量 mock 掉外部依赖,不要直连真实 Ollama。 +- 涉及 main.py 时,优先用 monkeypatch 或 fake 对象替代: + - call_ollama + - call_vlm_ocr + - MarkItDown + - GeoIP 查询 + - TTS 模型加载 +- 测试要保持确定性,不依赖全局状态、环境顺序或人工输入。 -维护 -- 如扩展新模块,优先增加 test_*.py 文件并在其中添加对应的测试类和方法 +## 容易误判的点 + +- 覆盖率门槛是针对多个 backend 模块一起算的,改核心文件时,即使单测通过也可能因为覆盖率不够失败。 +- htmlcov、.pytest_cache、api_performance_report.md 属于生成产物,不是需要维护的源码。 +- 这一目录里有一批 TTS/ASR 测试和说明明显继承自旧实现;当它们与当前 backend/tts_asr.py 冲突时,不要默认代码错了,先确认目标产品面。 +- integration 脚本通常假设本地服务在 http://localhost:8001,且默认 API Key 还是占位值。 + +## 改动定位建议 + +- 路由返回值不对:先看 test_main_endpoints.py 和 test_main_cancel.py +- Prompt 规则不对:先看 test_prompt.py 和 test_prompt_extended.py +- Ollama 调用包装不对:先看 test_llm.py 和 test_llm_extended.py +- TTS 面变化:先确认当前 backend/tts_asr.py 是不是仍然以旧文档描述为目标,再决定修测试还是修实现 + +## 维护原则 + +- 新增后端行为时,优先给对应模块补测试,不要只依赖全量回归。 +- 如果变更的是历史 TTS/ASR 面,先把“当前规范是什么”确定下来,再批量修测试。 +- 如果覆盖率策略变化,记得同步这个文件,而不是只改 pytest.ini。 diff --git a/backend/tests/play_audio.py b/backend/tests/play_audio.py deleted file mode 100644 index 4386470..0000000 --- a/backend/tests/play_audio.py +++ /dev/null @@ -1,37 +0,0 @@ -import asyncio -import base64 -import os -import sys - -sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '../..'))) -sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))) - -from backend.tts_asr import _tts_sync_with_retry - -async def play_audio(): - print("生成测试音频中,请稍候...") - test_text = "这是一段用以测试新语音模型音质的中文合成音频。" - - try: - audio_bytes, sr = await _tts_sync_with_retry(test_text, rate=1.0) - - # 保存到本地文件 - wav_path = os.path.join(os.path.dirname(__file__), "test_audio.wav") - with open(wav_path, "wb") as f: - f.write(audio_bytes) - - print(f"音频已生成并保存到: {wav_path}") - print("正在尝试在 macOS 上播放...") - - # Mac OS 的播放命令 - os.system(f"afplay '{wav_path}'") - - print("播放完成。") - - except Exception as e: - import traceback - traceback.print_exc() - print(f"音频生成失败: {str(e)}") - -if __name__ == "__main__": - asyncio.run(play_audio()) diff --git a/backend/tests/simulate_macos.py b/backend/tests/simulate_macos.py index ee1f599..5f2bb67 100644 --- a/backend/tests/simulate_macos.py +++ b/backend/tests/simulate_macos.py @@ -12,7 +12,6 @@ macOS环境模拟测试工具 """ import argparse -import importlib import os import platform import sys diff --git a/backend/tests/test_audio.wav b/backend/tests/test_audio.wav deleted file mode 100644 index 6c2c85b46bc475a39e437a9d6140c20e9f515d55..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 287404 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

Y~0$EvmUe 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

    j(QU9A$H%sfjf?FV*Droo{;v63=ZlTK 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 H)OP$o<8bd# diff --git a/backend/tests/test_geoip.py b/backend/tests/test_geoip.py index e7b0cd1..03130c5 100644 --- a/backend/tests/test_geoip.py +++ b/backend/tests/test_geoip.py @@ -1,5 +1,4 @@ import sys -import os import types import pathlib import pytest diff --git a/backend/tests/test_main_endpoints.py b/backend/tests/test_main_endpoints.py index 568d7f8..98210bd 100644 --- a/backend/tests/test_main_endpoints.py +++ b/backend/tests/test_main_endpoints.py @@ -1,7 +1,7 @@ import os import sys import base64 -import asyncio +import types import pytest from unittest.mock import MagicMock from fastapi.testclient import TestClient @@ -11,6 +11,10 @@ BACKEND_DIR = os.path.abspath(os.path.join(CURRENT_DIR, "..")) if BACKEND_DIR not in sys.path: sys.path.insert(0, BACKEND_DIR) +fake_tts_asr = types.ModuleType("tts_asr") +fake_tts_asr.register_tts_asr_routes = lambda app: None +sys.modules.setdefault("tts_asr", fake_tts_asr) + import main # type: ignore API_KEY = main.API_KEY @@ -61,13 +65,13 @@ def test_sanitize_markdown_strips_img_tag(): assert "") -def test_sanitize_markdown_collapse_newlines(): - assert main._sanitize_converted_markdown("a\n\n\nb\n\n\n\nc") == "a\n\nb\n\nc" +def test_sanitize_markdown_preserves_extra_newlines(): + assert main._sanitize_converted_markdown("a\n\n\nb\n\n\n\nc") == "a\n\n\nb\n\n\n\nc" def test_sanitize_markdown_normalize_crlf(): result = main._sanitize_converted_markdown("line1\r\nline2\r\n") - assert "line1\nline2" in result + assert result == "line1\nline2\n" assert "\r" not in result diff --git a/backend/tests/test_prompt.py b/backend/tests/test_prompt.py index 7e765e5..061f3f6 100644 --- a/backend/tests/test_prompt.py +++ b/backend/tests/test_prompt.py @@ -28,6 +28,13 @@ def test_prompt_builds_system_and_user(): assert "MERMAID_CONTEXT" in user_prompt assert "PREFIX_ENDS_WITH_NEWLINE" in user_prompt assert "SUFFIX_STARTS_WITH_NEWLINE" in user_prompt + assert "actual line breaks" in system_prompt + assert "start OUTPUT on a new line" in system_prompt + assert "Use real line breaks instead of spelled-out escape sequences" in user_prompt + assert "make the first character of OUTPUT a real newline" in user_prompt + assert "make the last character of OUTPUT a real newline" in user_prompt + assert "start output with \\n" not in user_prompt + assert "Use single \\n" not in system_prompt def test_cursor_in_fence_detection(): diff --git a/backend/tests/test_prompt_extended.py b/backend/tests/test_prompt_extended.py index d1fff4b..41bffe7 100644 --- a/backend/tests/test_prompt_extended.py +++ b/backend/tests/test_prompt_extended.py @@ -1,5 +1,4 @@ import sys -import os import re from pathlib import Path diff --git a/backend/tests/test_tts_asr_integration.py b/backend/tests/test_tts_asr_integration.py index 1222e75..8c2023d 100644 --- a/backend/tests/test_tts_asr_integration.py +++ b/backend/tests/test_tts_asr_integration.py @@ -15,9 +15,7 @@ TTS/ASR模块集成测试 python backend/tests/test_tts_asr_integration.py --test config """ -import asyncio import base64 -import json import os import sys import time diff --git a/backend/tests/test_tts_asr_unit.py b/backend/tests/test_tts_asr_unit.py index 7f3f847..e2c9c56 100644 --- a/backend/tests/test_tts_asr_unit.py +++ b/backend/tests/test_tts_asr_unit.py @@ -12,8 +12,7 @@ TTS/ASR模块单元测试 import os import sys import unittest -from unittest.mock import Mock, MagicMock, patch -import tempfile +from unittest.mock import patch import numpy as np # 确保可以导入backend和tts_asr模块 diff --git a/backend/tests/verify_cross.py b/backend/tests/verify_cross.py deleted file mode 100644 index 6e109e2..0000000 --- a/backend/tests/verify_cross.py +++ /dev/null @@ -1,56 +0,0 @@ -import asyncio -import base64 -import os -import sys - -# 确保能找到backend模块 -sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '../..'))) - -from backend.tts_asr import _tts_sync_with_retry, _load_asr_pipeline_with_retry, _get_asr_pipeline - -async def verify_tts_asr_cross(): - print("====================================") - print(" 开始严格交叉验证: TTS 生成 -> ASR 解析") - print("====================================") - - test_text = "苹果设备支持离线大模型运算" - print(f"\n[1] 正在调用 TTS 引擎 (suno/bark-small)...") - print(f"目标文本: '{test_text}'") - - try: - # TTS生成 - audio_bytes, sr = await _tts_sync_with_retry(test_text, rate=1.0) - print(f"-> TTS 成功生成音频数据,大小: {len(audio_bytes)} Bytes, 采样率: {sr}Hz") - except Exception as e: - print(f"-> TTS 失败: {str(e)}") - sys.exit(1) - - print("\n[2] 正在调用 ASR 引擎 (Whisper)...") - try: - loaded = await _load_asr_pipeline_with_retry() - if not loaded: - print("-> ASR 核心加载失败!") - sys.exit(1) - - print("-> ASR 加载成功,开始解析音频...") - - # 将生成的wav bytes传递给ASR进行语音识别 - asr_pipeline = _get_asr_pipeline() - result = asr_pipeline(audio_bytes, generate_kwargs={"task": "transcribe"}) - recognized_text = result.get('text', '') - print(f"-> ASR 识别结果: '{recognized_text.strip()}'") - - if len(recognized_text.strip()) > 0: - print("\n结论: ✅ 验证成功!TTS和ASR模块功能链路闭环完成。") - else: - print("\n结论: ❌ ASR输出为空字符,闭环失败。") - sys.exit(1) - - except Exception as e: - import traceback - traceback.print_exc() - print(f"-> ASR 分析阶段失败: {str(e)}") - sys.exit(1) - -if __name__ == "__main__": - asyncio.run(verify_tts_asr_cross()) diff --git a/package-lock.json b/package-lock.json index 36302ae..9f0622f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,6 +9,10 @@ "version": "0.0.0", "dependencies": { "@blocknote/xl-docx-exporter": "^0.47.3", + "@ffmpeg/core": "^0.12.10", + "@ffmpeg/core-mt": "^0.12.10", + "@ffmpeg/ffmpeg": "^0.12.15", + "@ffmpeg/util": "^0.12.2", "@milkdown/core": "^7.18.0", "@milkdown/crepe": "^7.18.0", "@milkdown/kit": "^7.18.0", @@ -30,6 +34,7 @@ "mermaid": "^11.12.3", "pinia": "^2.3.1", "prismjs": "^1.29.0", + "tui-image-editor": "^3.15.3", "vue": "^3.5.24", "vue-router": "^4.6.4" }, @@ -1207,6 +1212,54 @@ "node": ">=18" } }, + "node_modules/@ffmpeg/core": { + "version": "0.12.10", + "resolved": "https://registry.npmjs.org/@ffmpeg/core/-/core-0.12.10.tgz", + "integrity": "sha512-dzNplnn2Nxle2c2i2rrDhqcB19q9cglCkWnoMTDN9Q9l3PvdjZWd1HfSPjCNWc/p8Q3CT+Es9fWOR0UhAeYQZA==", + "license": "GPL-2.0-or-later", + "engines": { + "node": ">=16.x" + } + }, + "node_modules/@ffmpeg/core-mt": { + "version": "0.12.10", + "resolved": "https://registry.npmjs.org/@ffmpeg/core-mt/-/core-mt-0.12.10.tgz", + "integrity": "sha512-atyRTOpa58bLCIgd6GXBZAXWyWD3AUoQyzxqjvGhp9MuSzdILtOTI62ffLswBsCnLq15lQ8IETHUpm1oe4V9FQ==", + "license": "GPL-2.0-or-later", + "engines": { + "node": ">=16.x" + } + }, + "node_modules/@ffmpeg/ffmpeg": { + "version": "0.12.15", + "resolved": "https://registry.npmjs.org/@ffmpeg/ffmpeg/-/ffmpeg-0.12.15.tgz", + "integrity": "sha512-1C8Obr4GsN3xw+/1Ww6PFM84wSQAGsdoTuTWPOj2OizsRDLT4CXTaVjPhkw6ARyDus1B9X/L2LiXHqYYsGnRFw==", + "license": "MIT", + "dependencies": { + "@ffmpeg/types": "^0.12.4" + }, + "engines": { + "node": ">=18.x" + } + }, + "node_modules/@ffmpeg/types": { + "version": "0.12.4", + "resolved": "https://registry.npmjs.org/@ffmpeg/types/-/types-0.12.4.tgz", + "integrity": "sha512-k9vJQNBGTxE5AhYDtOYR5rO5fKsspbg51gbcwtbkw2lCdoIILzklulcjJfIDwrtn7XhDeF2M+THwJ2FGrLeV6A==", + "license": "MIT", + "engines": { + "node": ">=16.x" + } + }, + "node_modules/@ffmpeg/util": { + "version": "0.12.2", + "resolved": "https://registry.npmjs.org/@ffmpeg/util/-/util-0.12.2.tgz", + "integrity": "sha512-ouyoW+4JB7WxjeZ2y6KpRvB+dLp7Cp4ro8z0HIVpZVCM7AwFlHa0c4R8Y/a4M3wMqATpYKhC7lSFHQ0T11MEDw==", + "license": "MIT", + "engines": { + "node": ">=18.x" + } + }, "node_modules/@flatten-js/interval-tree": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/@flatten-js/interval-tree/-/interval-tree-1.1.3.tgz", @@ -1489,6 +1542,27 @@ "@lezer/lr": "^1.4.0" } }, + "node_modules/@mapbox/node-pre-gyp": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz", + "integrity": "sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==", + "license": "BSD-3-Clause", + "optional": true, + "dependencies": { + "detect-libc": "^2.0.0", + "https-proxy-agent": "^5.0.0", + "make-dir": "^3.1.0", + "node-fetch": "^2.6.7", + "nopt": "^5.0.0", + "npmlog": "^5.0.1", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.11" + }, + "bin": { + "node-pre-gyp": "bin/node-pre-gyp" + } + }, "node_modules/@marijn/find-cluster-break": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/@marijn/find-cluster-break/-/find-cluster-break-1.0.2.tgz", @@ -6201,6 +6275,21 @@ } } }, + "node_modules/abab": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", + "deprecated": "Use your platform's native atob() and btoa() methods instead", + "license": "BSD-3-Clause", + "optional": true + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "license": "ISC", + "optional": true + }, "node_modules/acorn": { "version": "8.16.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", @@ -6213,6 +6302,40 @@ "node": ">=0.4.0" } }, + "node_modules/acorn-globals": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.4.tgz", + "integrity": "sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A==", + "license": "MIT", + "optional": true, + "dependencies": { + "acorn": "^6.0.1", + "acorn-walk": "^6.0.1" + } + }, + "node_modules/acorn-globals/node_modules/acorn": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", + "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", + "license": "MIT", + "optional": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.2.0.tgz", + "integrity": "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/adm-zip": { "version": "0.5.17", "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.17.tgz", @@ -6222,6 +6345,61 @@ "node": ">=12.0" } }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/agent-base/node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "optional": true, + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/agent-base/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT", + "optional": true + }, + "node_modules/ajv": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", + "license": "MIT", + "optional": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, "node_modules/alien-signals": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/alien-signals/-/alien-signals-3.1.2.tgz", @@ -6295,6 +6473,43 @@ "normalize-path": "^2.0.0" } }, + "node_modules/aproba": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.1.0.tgz", + "integrity": "sha512-tLIEcj5GuR2RSTnxNKdkK0dJ/GrC7P38sUkiDmDuHfsHmbagTFAxDVIBltoklXEVIQ/f14IL8IMJ5pn9Hez1Ew==", + "license": "ISC", + "optional": true + }, + "node_modules/are-we-there-yet": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", + "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", + "deprecated": "This package is no longer supported.", + "license": "ISC", + "optional": true, + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/are-we-there-yet/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", + "optional": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -6346,6 +6561,16 @@ "node": ">=0.10.0" } }, + "node_modules/array-equal": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.2.tgz", + "integrity": "sha512-gUHx76KtnhEgB3HOuFYiCm3FIdEs6ocM2asHvNTkfu/Y09qQVrrVVaOKENmS2KkSaGoxgXNqC+ZVtR/n0MOkSA==", + "license": "MIT", + "optional": true, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/array-unique": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", @@ -6370,6 +6595,26 @@ "ascii2mathml": "bin/index.js" } }, + "node_modules/asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "safer-buffer": "~2.1.0" + } + }, + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.8" + } + }, "node_modules/assign-symbols": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", @@ -6416,6 +6661,13 @@ "integrity": "sha512-Az2ZTpuytrtqENulXwO3GGv1Bztugx6TT37NIo7imr/Qo0gsYiGtSdBa2B6fsXhTpVZDNfu1Qn3pk531e3q+nQ==", "license": "MIT" }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT", + "optional": true + }, "node_modules/atob": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", @@ -6429,6 +6681,23 @@ "node": ">= 4.5.0" } }, + "node_modules/aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", + "license": "Apache-2.0", + "optional": true, + "engines": { + "node": "*" + } + }, + "node_modules/aws4": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.13.2.tgz", + "integrity": "sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==", + "license": "MIT", + "optional": true + }, "node_modules/babel": { "version": "5.8.38", "resolved": "https://registry.npmjs.org/babel/-/babel-5.8.38.tgz", @@ -6746,6 +7015,16 @@ ], "license": "MIT" }, + "node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", + "license": "BSD-3-Clause", + "optional": true, + "dependencies": { + "tweetnacl": "^0.14.3" + } + }, "node_modules/binary-extensions": { "version": "1.13.1", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", @@ -6806,6 +7085,13 @@ "license": "MIT", "optional": true }, + "node_modules/browser-process-hrtime": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", + "license": "BSD-2-Clause", + "optional": true + }, "node_modules/buffer": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", @@ -6922,6 +7208,13 @@ "node": ">=10.0.0" } }, + "node_modules/caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", + "license": "Apache-2.0", + "optional": true + }, "node_modules/ccount": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", @@ -7055,6 +7348,16 @@ "fsevents": "^1.0.0" } }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "license": "ISC", + "optional": true, + "engines": { + "node": ">=10" + } + }, "node_modules/cjk-regex": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/cjk-regex/-/cjk-regex-3.4.0.tgz", @@ -7193,6 +7496,29 @@ "node": ">=0.10.0" } }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "license": "ISC", + "optional": true, + "bin": { + "color-support": "bin.js" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", + "optional": true, + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/comma-separated-tokens": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", @@ -7319,6 +7645,13 @@ "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", "license": "MIT" }, + "node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", + "license": "ISC", + "optional": true + }, "node_modules/convert-source-map": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", @@ -7384,6 +7717,33 @@ "utrie": "^1.0.2" } }, + "node_modules/cssom": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", + "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", + "license": "MIT", + "optional": true + }, + "node_modules/cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "license": "MIT", + "optional": true, + "dependencies": { + "cssom": "~0.3.6" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cssstyle/node_modules/cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "license": "MIT", + "optional": true + }, "node_modules/csstype": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", @@ -7900,6 +8260,31 @@ "lodash-es": "^4.17.21" } }, + "node_modules/dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", + "license": "MIT", + "optional": true, + "dependencies": { + "assert-plus": "^1.0.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/data-urls": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.1.0.tgz", + "integrity": "sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "abab": "^2.0.0", + "whatwg-mimetype": "^2.2.0", + "whatwg-url": "^7.0.0" + } + }, "node_modules/dayjs": { "version": "1.11.20", "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.20.tgz", @@ -7955,6 +8340,26 @@ "node": ">=0.10" } }, + "node_modules/decompress-response": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", + "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==", + "license": "MIT", + "optional": true, + "dependencies": { + "mimic-response": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "license": "MIT", + "optional": true + }, "node_modules/define-property": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", @@ -8020,6 +8425,23 @@ "robust-predicates": "^3.0.2" } }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", + "license": "MIT", + "optional": true + }, "node_modules/dequal": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", @@ -8047,6 +8469,16 @@ "node": ">=0.10.0" } }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "license": "Apache-2.0", + "optional": true, + "engines": { + "node": ">=8" + } + }, "node_modules/detect-node-es": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", @@ -8135,6 +8567,17 @@ "csstype": "^3.0.2" } }, + "node_modules/domexception": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", + "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==", + "deprecated": "Use your platform's native DOMException instead", + "license": "MIT", + "optional": true, + "dependencies": { + "webidl-conversions": "^4.0.2" + } + }, "node_modules/dompurify": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.3.3.tgz", @@ -8159,6 +8602,17 @@ "node": ">= 0.4" } }, + "node_modules/ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", + "license": "MIT", + "optional": true, + "dependencies": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, "node_modules/emmet": { "version": "2.4.11", "resolved": "https://registry.npmjs.org/emmet/-/emmet-2.4.11.tgz", @@ -8182,6 +8636,13 @@ "integrity": "sha512-eJp3QRe79pjwa+duv+n7+5YsNhRcMl812EcFVwrnRvYKoNPoQb5qxU8DG6Bgwji0akHdp6D4Ln6tYLG58MFSow==", "license": "MIT" }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT", + "optional": true + }, "node_modules/entities": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz", @@ -8279,6 +8740,53 @@ "node": ">=0.8.0" } }, + "node_modules/escodegen": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", + "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "license": "BSD-2-Clause", + "optional": true, + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=4.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/escodegen/node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "license": "BSD-2-Clause", + "optional": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/escodegen/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/esprima": { "version": "2.7.3", "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", @@ -8306,6 +8814,16 @@ "node": ">=0.4.0" } }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "license": "BSD-2-Clause", + "optional": true, + "engines": { + "node": ">=4.0" + } + }, "node_modules/estree-walker": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", @@ -8394,6 +8912,29 @@ "node": ">=0.10.0" } }, + "node_modules/extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", + "engines": [ + "node >=0.6.0" + ], + "license": "MIT", + "optional": true + }, + "node_modules/fabric": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/fabric/-/fabric-4.6.0.tgz", + "integrity": "sha512-MhJXCD/ZugOGV5aPHIG0MY1q2EfrlzC2sasrAHj0HHXN50JTe1bHFrlRdkXBijCJ0dG81fGu/A/Pct9DyuwCzQ==", + "license": "MIT", + "engines": { + "node": ">=8.0.0" + }, + "optionalDependencies": { + "canvas": "^2.6.1", + "jsdom": "^15.2.1" + } + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -8415,6 +8956,20 @@ "node": ">=6.0.0" } }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "license": "MIT", + "optional": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "license": "MIT", + "optional": true + }, "node_modules/fast-png": { "version": "6.4.0", "resolved": "https://registry.npmjs.org/fast-png/-/fast-png-6.4.0.tgz", @@ -8507,6 +9062,31 @@ "node": ">=0.10.0" } }, + "node_modules/forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", + "license": "Apache-2.0", + "optional": true, + "engines": { + "node": "*" + } + }, + "node_modules/form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, "node_modules/fragment-cache": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", @@ -8533,6 +9113,32 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "license": "ISC", + "optional": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "license": "ISC", + "optional": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/fs-readdir-recursive": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-0.1.2.tgz", @@ -8540,6 +9146,13 @@ "license": "MIT", "optional": true }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "license": "ISC", + "optional": true + }, "node_modules/fsevents": { "version": "1.2.13", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", @@ -8569,6 +9182,51 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/gauge": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", + "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", + "deprecated": "This package is no longer supported.", + "license": "ISC", + "optional": true, + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.2", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.1", + "object-assign": "^4.1.1", + "signal-exit": "^3.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/gauge/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/gauge/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "optional": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/get-intrinsic": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", @@ -8637,6 +9295,16 @@ "node": ">=0.10.0" } }, + "node_modules/getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", + "license": "MIT", + "optional": true, + "dependencies": { + "assert-plus": "^1.0.0" + } + }, "node_modules/glob": { "version": "5.0.15", "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", @@ -8715,6 +9383,31 @@ "integrity": "sha512-3GKBOn+m2LX9iq+JC1064cSFprJY4jL1jCXTcpnfER5HYE2l/4EfWSGzkPa/ZDBmYI0ZOEj5VHV/eKnPGkHuOg==", "license": "MIT" }, + "node_modules/har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", + "license": "ISC", + "optional": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "deprecated": "this library is no longer supported", + "license": "MIT", + "optional": true, + "dependencies": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/has-ansi": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", @@ -8757,6 +9450,13 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", + "license": "ISC", + "optional": true + }, "node_modules/has-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", @@ -9139,6 +9839,16 @@ "node": ">=0.10.0" } }, + "node_modules/html-encoding-sniffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", + "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", + "license": "MIT", + "optional": true, + "dependencies": { + "whatwg-encoding": "^1.0.1" + } + }, "node_modules/html-void-elements": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", @@ -9183,6 +9893,61 @@ "jspdf": "^4.0.0" } }, + "node_modules/http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + }, + "engines": { + "node": ">=0.8", + "npm": ">=1.3.7" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "license": "MIT", + "optional": true, + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/https-proxy-agent/node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "optional": true, + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/https-proxy-agent/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT", + "optional": true + }, "node_modules/iconv-lite": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", @@ -9270,6 +10035,16 @@ "integrity": "sha512-DRebOWuqDvxunfkNJAlc3IzWIPD5xVxwUNbHr7xKB8E6aLJxIPfNX3CoMJghcFjpv6RWQsrcJbghtEwSPoJqMA==", "license": "MIT" }, + "node_modules/ip-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", + "integrity": "sha512-58yWmlHpp7VYfcdTwMTvwMmqx/Elfxjd9RXTDyMsbL7lLWmhMylLEqiYVLKuLzOZqVgiWXD9MfR62Vv89VRxkw==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=4" + } + }, "node_modules/is-accessor-descriptor": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.1.tgz", @@ -9426,6 +10201,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=8" + } + }, "node_modules/is-glob": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", @@ -9536,6 +10321,13 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "license": "MIT", + "optional": true + }, "node_modules/is-windows": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", @@ -9575,6 +10367,13 @@ "url": "https://github.com/sponsors/dmonad" } }, + "node_modules/isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", + "license": "MIT", + "optional": true + }, "node_modules/js-tokens": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-1.0.1.tgz", @@ -9582,6 +10381,79 @@ "license": "MIT", "optional": true }, + "node_modules/jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", + "license": "MIT", + "optional": true + }, + "node_modules/jsdom": { + "version": "15.2.1", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-15.2.1.tgz", + "integrity": "sha512-fAl1W0/7T2G5vURSyxBzrJ1LSdQn6Tr5UX/xD4PXDx/PDgwygedfW6El/KIj3xJ7FU61TTYnc/l/B7P49Eqt6g==", + "license": "MIT", + "optional": true, + "dependencies": { + "abab": "^2.0.0", + "acorn": "^7.1.0", + "acorn-globals": "^4.3.2", + "array-equal": "^1.0.0", + "cssom": "^0.4.1", + "cssstyle": "^2.0.0", + "data-urls": "^1.1.0", + "domexception": "^1.0.1", + "escodegen": "^1.11.1", + "html-encoding-sniffer": "^1.0.2", + "nwsapi": "^2.2.0", + "parse5": "5.1.0", + "pn": "^1.1.0", + "request": "^2.88.0", + "request-promise-native": "^1.0.7", + "saxes": "^3.1.9", + "symbol-tree": "^3.2.2", + "tough-cookie": "^3.0.1", + "w3c-hr-time": "^1.0.1", + "w3c-xmlserializer": "^1.1.2", + "webidl-conversions": "^4.0.2", + "whatwg-encoding": "^1.0.5", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^7.0.0", + "ws": "^7.0.0", + "xml-name-validator": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jsdom/node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "license": "MIT", + "optional": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/jsdom/node_modules/parse5": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.0.tgz", + "integrity": "sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ==", + "license": "MIT", + "optional": true + }, "node_modules/jsesc": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", @@ -9591,6 +10463,27 @@ "jsesc": "bin/jsesc" } }, + "node_modules/json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", + "license": "(AFL-2.1 OR BSD-3-Clause)", + "optional": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "license": "MIT", + "optional": true + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "license": "ISC", + "optional": true + }, "node_modules/json5": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/json5/-/json5-0.4.0.tgz", @@ -9625,6 +10518,22 @@ "html2canvas": "^1.0.0-rc.5" } }, + "node_modules/jsprim": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", + "license": "MIT", + "optional": true, + "dependencies": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.10.0" + }, + "engines": { + "node": ">=0.6.0" + } + }, "node_modules/jszip": { "version": "3.10.1", "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", @@ -9742,6 +10651,20 @@ "node": ">=0.10.0" } }, + "node_modules/levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "license": "MIT", + "optional": true, + "dependencies": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/lib0": { "version": "0.2.117", "resolved": "https://registry.npmjs.org/lib0/-/lib0-0.2.117.tgz", @@ -9824,6 +10747,13 @@ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "license": "MIT" }, + "node_modules/lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==", + "license": "MIT", + "optional": true + }, "node_modules/longest": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", @@ -9871,6 +10801,32 @@ "@jridgewell/sourcemap-codec": "^1.5.5" } }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "license": "MIT", + "optional": true, + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "optional": true, + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/map-cache": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", @@ -10879,6 +11835,42 @@ "node": ">=0.10.0" } }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "optional": true, + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-response": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", + "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/minimalistic-assert": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", @@ -10909,6 +11901,43 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "license": "ISC", + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "license": "MIT", + "optional": true, + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "license": "ISC", + "optional": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/mixin-deep": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", @@ -11063,6 +12092,68 @@ "node": ">=0.10.0" } }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "license": "MIT", + "optional": true, + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-fetch/node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "license": "MIT", + "optional": true + }, + "node_modules/node-fetch/node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "license": "BSD-2-Clause", + "optional": true + }, + "node_modules/node-fetch/node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "license": "MIT", + "optional": true, + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "license": "ISC", + "optional": true, + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/normalize-path": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", @@ -11076,12 +12167,43 @@ "node": ">=0.10.0" } }, + "node_modules/npmlog": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", + "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", + "deprecated": "This package is no longer supported.", + "license": "ISC", + "optional": true, + "dependencies": { + "are-we-there-yet": "^2.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^3.0.0", + "set-blocking": "^2.0.0" + } + }, "node_modules/numfmt": { "version": "3.2.6", "resolved": "https://registry.npmjs.org/numfmt/-/numfmt-3.2.6.tgz", "integrity": "sha512-MXc2KP3j+2usdHTY5/ENUc2S+3BRF/cJqnR6RHeq6LBqKoIZOAQ62DQw974nnaZOencbfkmkTPyTmMnlkCpjzg==", "license": "MIT" }, + "node_modules/nwsapi": { + "version": "2.2.23", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.23.tgz", + "integrity": "sha512-7wfH4sLbt4M0gCDzGE6vzQBo0bfTKjU7Sfpqy/7gs1qBfYz2vEJH6vXcBKpO3+6Yu1telwd0t9HpyOoLEQQbIQ==", + "license": "MIT", + "optional": true + }, + "node_modules/oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "license": "Apache-2.0", + "optional": true, + "engines": { + "node": "*" + } + }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -11219,6 +12341,24 @@ "node": ">= 8.0.0" } }, + "node_modules/optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "license": "MIT", + "optional": true, + "dependencies": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/orderedmap": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/orderedmap/-/orderedmap-2.1.1.tgz", @@ -11405,7 +12545,6 @@ "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -11446,6 +12585,13 @@ "pathe": "^2.0.1" } }, + "node_modules/pn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz", + "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==", + "license": "MIT", + "optional": true + }, "node_modules/points-on-curve": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/points-on-curve/-/points-on-curve-0.2.0.tgz", @@ -11518,6 +12664,15 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, + "node_modules/prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", + "optional": true, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/preserve": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", @@ -11940,6 +13095,19 @@ } } }, + "node_modules/psl": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.15.0.tgz", + "integrity": "sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==", + "license": "MIT", + "optional": true, + "dependencies": { + "punycode": "^2.3.1" + }, + "funding": { + "url": "https://github.com/sponsors/lupomontero" + } + }, "node_modules/pug-error": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/pug-error/-/pug-error-2.1.0.tgz", @@ -11970,6 +13138,16 @@ "token-stream": "1.0.0" } }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=6" + } + }, "node_modules/punycode.js": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", @@ -11991,6 +13169,16 @@ "teleport": ">=0.2.0" } }, + "node_modules/qs": { + "version": "6.5.5", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.5.tgz", + "integrity": "sha512-mzR4sElr1bfCaPJe7m8ilJ6ZXdDaGoObcYR0ZHSsktM/Lt21MVHj5De30GQH2eiZ1qGRTO7LCAzQsUeXTNexWQ==", + "license": "BSD-3-Clause", + "optional": true, + "engines": { + "node": ">=0.6" + } + }, "node_modules/quickselect": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/quickselect/-/quickselect-3.0.0.tgz", @@ -12819,6 +14007,39 @@ "node": ">=0.10.0" } }, + "node_modules/request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/request-light": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/request-light/-/request-light-0.7.0.tgz", @@ -12826,6 +14047,87 @@ "dev": true, "license": "MIT" }, + "node_modules/request-promise-core": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz", + "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==", + "license": "ISC", + "optional": true, + "dependencies": { + "lodash": "^4.17.19" + }, + "engines": { + "node": ">=0.10.0" + }, + "peerDependencies": { + "request": "^2.34" + } + }, + "node_modules/request-promise-core/node_modules/lodash": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", + "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", + "license": "MIT", + "optional": true + }, + "node_modules/request-promise-native": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz", + "integrity": "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==", + "deprecated": "request-promise-native has been deprecated because it extends the now deprecated request package, see https://github.com/request/request/issues/3142", + "license": "ISC", + "optional": true, + "dependencies": { + "request-promise-core": "1.1.4", + "stealthy-require": "^1.1.1", + "tough-cookie": "^2.3.3" + }, + "engines": { + "node": ">=0.12.0" + }, + "peerDependencies": { + "request": "^2.34" + } + }, + "node_modules/request-promise-native/node_modules/tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "license": "BSD-3-Clause", + "optional": true, + "dependencies": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/request/node_modules/tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "license": "BSD-3-Clause", + "optional": true, + "dependencies": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/request/node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).", + "license": "MIT", + "optional": true, + "bin": { + "uuid": "bin/uuid" + } + }, "node_modules/resolve": { "version": "1.22.11", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", @@ -12888,6 +14190,58 @@ "node": ">=0.10.0" } }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "license": "ISC", + "optional": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "license": "ISC", + "optional": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "license": "ISC", + "optional": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/robust-predicates": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.3.tgz", @@ -13019,6 +14373,19 @@ "node": ">=11.0.0" } }, + "node_modules/saxes": { + "version": "3.1.11", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-3.1.11.tgz", + "integrity": "sha512-Ydydq3zC+WYDJK1+gRxRapLIED9PWeSuuS41wqyoRmzvhhh9nc+QQrVMKJYzJFULazeGhzSV0QleN2wD3boh2g==", + "license": "ISC", + "optional": true, + "dependencies": { + "xmlchars": "^2.1.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/scheduler": { "version": "0.27.0", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", @@ -13029,7 +14396,7 @@ "version": "7.7.4", "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", - "dev": true, + "devOptional": true, "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -13038,6 +14405,13 @@ "node": ">=10" } }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "license": "ISC", + "optional": true + }, "node_modules/set-value": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", @@ -13083,6 +14457,34 @@ "node": ">=0.10.0" } }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "license": "ISC", + "optional": true + }, + "node_modules/simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "optional": true + }, "node_modules/simple-fmt": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/simple-fmt/-/simple-fmt-0.1.0.tgz", @@ -13090,6 +14492,18 @@ "license": "MIT", "optional": true }, + "node_modules/simple-get": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.1.tgz", + "integrity": "sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA==", + "license": "MIT", + "optional": true, + "dependencies": { + "decompress-response": "^4.2.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, "node_modules/simple-is": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/simple-is/-/simple-is-0.2.0.tgz", @@ -13314,6 +14728,32 @@ "node": ">=0.10.0" } }, + "node_modules/sshpk": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz", + "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + }, + "bin": { + "sshpk-conv": "bin/sshpk-conv", + "sshpk-sign": "bin/sshpk-sign", + "sshpk-verify": "bin/sshpk-verify" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/stable": { "version": "0.1.8", "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", @@ -13373,6 +14813,16 @@ "node": ">= 0.4" } }, + "node_modules/stealthy-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", + "integrity": "sha512-ZnWpYnYugiOVEY5GkcuJK1io5V8QmNYChG62gSit9pQVGErXtrKuPC55ITaVSukmMta5qpMU7vqLt2Lnni4f/g==", + "license": "ISC", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -13382,6 +14832,44 @@ "safe-buffer": "~5.1.0" } }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "optional": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "optional": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/string.prototype.codepointat": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/string.prototype.codepointat/-/string.prototype.codepointat-0.2.1.tgz", @@ -13474,6 +14962,13 @@ "node": ">=12.0.0" } }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "license": "MIT", + "optional": true + }, "node_modules/tabbable": { "version": "6.4.0", "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.4.0.tgz", @@ -13490,6 +14985,38 @@ "url": "https://github.com/sponsors/dcastil" } }, + "node_modules/tar": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", + "deprecated": "Old versions of tar are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "license": "ISC", + "optional": true, + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "license": "MIT", + "optional": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/text-segmentation": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/text-segmentation/-/text-segmentation-1.0.3.tgz", @@ -13611,6 +15138,31 @@ "dev": true, "license": "MIT" }, + "node_modules/tough-cookie": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz", + "integrity": "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==", + "license": "BSD-3-Clause", + "optional": true, + "dependencies": { + "ip-regex": "^2.1.0", + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", + "license": "MIT", + "optional": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, "node_modules/trigram-utils": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/trigram-utils/-/trigram-utils-2.0.1.tgz", @@ -13695,6 +15247,62 @@ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "license": "0BSD" }, + "node_modules/tui-code-snippet": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/tui-code-snippet/-/tui-code-snippet-2.3.3.tgz", + "integrity": "sha512-5NEHTDFKillDNPy6MCgpXDNBTB7SZkHBFOF6vXfCDIFZcBdFYFXTd2xvAVvIeM3UYFRWu27xUf/Kxl5f9+RooQ==", + "license": "MIT" + }, + "node_modules/tui-color-picker": { + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/tui-color-picker/-/tui-color-picker-2.2.8.tgz", + "integrity": "sha512-q5sE9NQ5NR9lYpilYjcI7Sdv0KCogo+W8fZY+AYTj/HYg+9fscYy3UuJ6UQiV1bF+ARCLwFRWC8UcOt9kuUctQ==", + "license": "MIT" + }, + "node_modules/tui-image-editor": { + "version": "3.15.3", + "resolved": "https://registry.npmjs.org/tui-image-editor/-/tui-image-editor-3.15.3.tgz", + "integrity": "sha512-7B5YUxe2eSSh+8YrlREmjqkgeFFKrVkdy0D/G0dWCJIQ2WLPQ/Bkm02WXQeWJiFPzgvargZjn7eAe80p3qBHPQ==", + "license": "MIT", + "dependencies": { + "fabric": "^4.2.0", + "tui-code-snippet": "^2.3.3", + "tui-color-picker": "^2.2.6" + } + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", + "license": "Unlicense", + "optional": true + }, + "node_modules/type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", + "license": "MIT", + "optional": true, + "dependencies": { + "prelude-ls": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/typescript": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.2.tgz", @@ -13949,6 +15557,16 @@ "node": ">=0.10.0" } }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "license": "BSD-2-Clause", + "optional": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, "node_modules/urix": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", @@ -14060,6 +15678,28 @@ "uuid": "dist/esm/bin/uuid" } }, + "node_modules/verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", + "engines": [ + "node >=0.6.0" + ], + "license": "MIT", + "optional": true, + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "node_modules/verror/node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", + "license": "MIT", + "optional": true + }, "node_modules/vfile": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", @@ -14514,12 +16154,35 @@ "vue": "^3.5.0" } }, + "node_modules/w3c-hr-time": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", + "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", + "deprecated": "Use your platform's native performance.now() and performance.timeOrigin.", + "license": "MIT", + "optional": true, + "dependencies": { + "browser-process-hrtime": "^1.0.0" + } + }, "node_modules/w3c-keyname": { "version": "2.2.8", "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.8.tgz", "integrity": "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==", "license": "MIT" }, + "node_modules/w3c-xmlserializer": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-1.1.2.tgz", + "integrity": "sha512-p10l/ayESzrBMYWRID6xbuCKh2Fp77+sA0doRuGn4tTIMrrZVeqfpKjXHY+oDh3K4nLdPgNwMTVP6Vp4pvqbNg==", + "license": "MIT", + "optional": true, + "dependencies": { + "domexception": "^1.0.1", + "webidl-conversions": "^4.0.2", + "xml-name-validator": "^3.0.0" + } + }, "node_modules/web-namespaces": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz", @@ -14530,6 +16193,66 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/webidl-conversions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", + "license": "BSD-2-Clause", + "optional": true + }, + "node_modules/whatwg-encoding": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", + "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", + "deprecated": "Use @exodus/bytes instead for a more spec-conformant and faster implementation", + "license": "MIT", + "optional": true, + "dependencies": { + "iconv-lite": "0.4.24" + } + }, + "node_modules/whatwg-encoding/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", + "optional": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/whatwg-mimetype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", + "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", + "license": "MIT", + "optional": true + }, + "node_modules/whatwg-url": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", + "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + "license": "MIT", + "optional": true, + "dependencies": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + }, + "node_modules/wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "license": "ISC", + "optional": true, + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, "node_modules/window-size": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.4.tgz", @@ -14543,6 +16266,16 @@ "node": ">= 0.10.0" } }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/wordwrap": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", @@ -14560,6 +16293,28 @@ "license": "ISC", "optional": true }, + "node_modules/ws": { + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, "node_modules/xml": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz", @@ -14578,6 +16333,20 @@ "xml-js": "bin/cli.js" } }, + "node_modules/xml-name-validator": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", + "license": "Apache-2.0", + "optional": true + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "license": "MIT", + "optional": true + }, "node_modules/y-prosemirror": { "version": "1.3.7", "resolved": "https://registry.npmjs.org/y-prosemirror/-/y-prosemirror-1.3.7.tgz", @@ -14630,6 +16399,13 @@ "license": "ISC", "optional": true }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "license": "ISC", + "optional": true + }, "node_modules/yargs": { "version": "3.27.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.27.0.tgz", diff --git a/package.json b/package.json index c2ee650..606d08d 100644 --- a/package.json +++ b/package.json @@ -12,6 +12,10 @@ }, "dependencies": { "@blocknote/xl-docx-exporter": "^0.47.3", + "@ffmpeg/core": "^0.12.10", + "@ffmpeg/core-mt": "^0.12.10", + "@ffmpeg/ffmpeg": "^0.12.15", + "@ffmpeg/util": "^0.12.2", "@milkdown/core": "^7.18.0", "@milkdown/crepe": "^7.18.0", "@milkdown/kit": "^7.18.0", diff --git a/sample-video.mp4 b/sample-video.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..cb424d9a58b14043f0d310f9322e1e8c1943062a GIT binary patch literal 42548 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 literal 0 HcmV?d00001 diff --git a/src/AGENTS.md b/src/AGENTS.md index 6a8cf6d..c3b83c2 100644 --- a/src/AGENTS.md +++ b/src/AGENTS.md @@ -1,42 +1,134 @@ -# Src 前端模块指南 +# Src 前端指引 -## OVERVIEW -Vue3 前端核心,Milkdown 编辑器,AI 补全插件。 +本文件适用于 src/ 下的前端代码。进入 src/plugins/ 后,以子目录 AGENTS.md 为准。 -## STRUCTURE -- main.js - Vue 入口,Pinia + Router 挂载 -- App.vue - 根组件,主题/背景控制 -- plugins/ - Milkdown/Copilot 插件(见子目录 AGENTS.md) -- components/ - Vue 组件(MilkdownEditor、SettingsPanel 等) -- stores/ - Pinia 状态管理(settings.js) -- views/ - 页面视图(EditorView、DocsView) -- utils/ - 工具函数(api.js、config.js) -- router/ - 路由定义 +## 前端职责 -## WHERE TO LOOK +- 启动 Vue 应用并挂载路由和 Pinia。 +- 提供编辑器界面、上传导出、OCR 触发、TTS 菜单、设置面板和多语言 UI。 +- 把编辑器状态、设置和网络请求接到后端接口。 -| 任务 | 文件 | 说明 | -|------|------|------| -| Vue 入口 | main.js | createApp、Pinia、Router 挂载 | -| 根组件 | App.vue | 主题切换、背景设置 | -| 编辑器组件 | components/MilkdownEditor.vue | Milkdown 编辑器封装 | -| AI 补全核心 | plugins/copilotPlugin.ts | ghost text、防抖、交互 | -| 状态管理 | stores/settings.js | 用户设置、主题、偏好 | -| API 调用 | utils/api.js | fetchSuggestion、TTS 接口 | +## 先看哪里 -## CONVENTIONS -- JS/TS 2 空格缩进 -- 变量/函数:camelCase -- Vue 组件:PascalCase -- 文件名:全小写+短横线 +- 应用入口:main.js +- 根组件:App.vue +- 路由:router/index.js +- 编辑页:views/EditorView.vue +- 文档页:views/DocsView.vue +- Univer 页:views/UniverView.vue +- 编辑器主组件:components/MilkdownEditor.vue +- 设置面板:components/SettingsPanel.vue +- TTS 组件:components/TTSMenu.vue、components/TTSPlayer.vue +- 插件层:plugins/ +- 设置状态:stores/settings.js +- 请求层:utils/api.js +- 环境配置:utils/config.js +- 文件转换:utils/convert.js +- OCR 缓存:utils/ocrCache.js +- 文档块工具:utils/docBlock.js -## ANTI-PATTERNS -- 在前端暴露密钥 -- 空 catch 块 -- 类型错误使用 as any +## 路由事实 -## 注意事项 -- 端口:5173 -- 启动:`npm run dev` -- 构建:`npm run build` -- UI 默认中文 +- / -> EditorView +- /docs -> DocsView +- /univer -> UniverView + +## 核心行为 + +### 编辑器主控 + +- MilkdownEditor.vue 是前端最重要的控制点。 +- 它负责: + - 创建 Crepe 编辑器 + - 注册 copilot、docBlock、mermaid 插件 + - 上传图片和文档 + - 触发 OCR + - 导入导出 Markdown + - 导出 DOCX 和 PDF + - AI 开关 + - 32 KB 大小限制 + - TTS 菜单和播放器 + - 把 Markdown 更新回父组件 + +### 设置状态 + +- settings.js 负责持久化用户设置到 localStorage。 +- 当前重要字段包括: + - theme + - modelThinking + - debounceMs + - privacyMode + - language + - currency + - backgroundType + - backgroundImage + - backgroundOpacity + - ttsInstruct +- initialMarkdown 也是由 store 推导出来的,编辑器初始化会消费它。 + +### 请求层 + +- utils/config.js 负责从 VITE_* 环境变量拼接接口地址。 +- utils/api.js 负责补全请求、取消补全、TTS 请求和状态请求。 +- fetchSuggestion 会: + - 生成 request_id + - 绑定 AbortSignal + - 触发中止时的 cancel 请求 + - 读取 settings store 中的 thinking、privacy、language、currency、timezone 信息 + - 向后端发 POST 并读取 JSON + +## 当前真实约定 + +- 这个目录不是纯 JS,也不是纯 TS,而是 Vue SFC + JS + TS 混合。 +- 组件、视图文件多为 PascalCase。 +- 工具和配置模块多为小写 .js。 +- 不要根据旧文档把前端文件统一改成另一种命名风格。 +- 代码风格存在历史混合,优先跟随当前文件周围风格,不要做无关格式化。 + +## 容易踩坑的点 + +- 文档超过 32 KB 时,AI 补全会被禁用。 +- 在文档块、Mermaid、LaTeX 等特定上下文中,部分 AI 行为和上传行为会被禁用或改道。 +- OCR 文本和文档块摘录会被注入补全上下文,但这些内容不应直接作为用户可见输出回写到文档。 +- 前端存在 /v1/export/pdf 调用,但调试前先确认后端是否真的实现了这个端点。 +- 当前前端多处仍保留占位 API Key 或默认值;不要把这种写法继续扩散到新代码。 +- 需要多语言 UI 时,优先走现有 i18n 结构,而不是在组件里新增硬编码文案。 + +## 调试路径 + +- 补全问题: + components/MilkdownEditor.vue + -> plugins/copilotPlugin.ts + -> utils/api.js + -> backend + +- OCR 问题: + components/MilkdownEditor.vue + -> OCR 请求 + -> backend/main.py + +- 文档导入转换问题: + components/MilkdownEditor.vue + -> utils/convert.js + -> backend/main.py + +- TTS 问题: + components/TTSMenu.vue / components/TTSPlayer.vue / components/MilkdownEditor.vue + -> utils/api.js + -> backend/tts_asr.py + +## 改动建议 + +- 编辑器相关问题优先从 MilkdownEditor.vue 入手,不要先到处搜。 +- 插件逻辑问题优先看 plugins/,尤其是 copilotPlugin.ts。 +- 状态问题优先看 stores/settings.js。 +- 网络问题优先看 utils/config.js 和 utils/api.js。 +- 改前端时尽量避免同时改样式、文案、结构和网络逻辑,多做局部可验证修改。 + +## 不要做的事 + +- 不要修改 milkdown-docs/。 +- 不要在组件里继续新增硬编码密钥。 +- 不要绕开现有 store 直接分散持久化设置。 +- 不要把隐藏上下文数据直接渲染进用户文档。 +- 不要因为某个文件风格不统一就顺手改整个 src/。 diff --git a/src/components/DocumentBlock.vue b/src/components/DocumentBlock.vue deleted file mode 100644 index d8caf3e..0000000 --- a/src/components/DocumentBlock.vue +++ /dev/null @@ -1,216 +0,0 @@ - - - - - diff --git a/src/components/FileContent.vue b/src/components/FileContent.vue index c8dc3af..5716a3a 100644 --- a/src/components/FileContent.vue +++ b/src/components/FileContent.vue @@ -2,6 +2,8 @@ import { computed, onBeforeUnmount, ref, watch } from 'vue' import MarkdownIt from 'markdown-it' import { isOfficeFile, getOfficeFormat } from '../services/officeDetection' +import { canPlayVideoNatively, editVideoBlob, isVideoFile, transcodeVideoToMp4 } from '../utils/ffmpeg' +import ImageEditorComponent from './ImageEditorComponent.vue' import UniverPreview from './UniverPreview.vue' const props = defineProps({ @@ -9,10 +11,12 @@ const props = defineProps({ breadcrumb: { type: Array, default: () => [] }, rootNodes: { type: Array, default: () => [] }, getFileIcon: { type: Function, default: () => 'file' }, - getFileBlob: { type: Function, default: () => null } + getFileBlob: { type: Function, default: () => null }, + updateFile: { type: Function, default: null }, + showSidebarToggle: { type: Boolean, default: false } }) -const emit = defineEmits(['navigate']) +const emit = defineEmits(['navigate', 'toggle-sidebar']) const md = new MarkdownIt({ html: false, @@ -20,7 +24,27 @@ const md = new MarkdownIt({ linkify: true }) -const objectUrl = ref('') +const basePreviewUrl = ref('') +const editedVideoUrl = ref('') +const editedVideoBlob = ref(null) +const imageEditorRef = ref(null) +const imageEditorError = ref('') +const isEditingImage = ref(false) +const isSavingImage = ref(false) +const isTranscodingVideo = ref(false) +const transcodeProgress = ref(0) +const videoPreviewError = ref('') +const isUsingTranscodedVideo = ref(false) +const isApplyingVideoEdit = ref(false) +const videoEditProgress = ref(0) +const videoEditError = ref('') +const videoElement = ref(null) +const videoDurationSeconds = ref(0) +const videoCurrentTime = ref(0) +const clipStartSeconds = ref(0) +const clipEndSeconds = ref(0) +const muteVideoAudio = ref(false) +let previewTaskId = 0 const isRoot = computed(() => !props.node) const isFolder = computed(() => props.node?.type === 'folder') @@ -38,6 +62,7 @@ const isPdf = computed(() => { const mime = String(props.node?.mimeType || '') return mime === 'application/pdf' || fileExt.value === 'pdf' }) +const isVideo = computed(() => isVideoFile(props.node)) const isText = computed(() => { const mime = String(props.node?.mimeType || '') return Boolean(props.node?.content || props.node?.previewText) || mime.startsWith('text/') || mime.includes('json') || ['txt', 'json', 'js', 'jsx', 'ts', 'tsx', 'css', 'html', 'htm', 'py', 'vue', 'xml', 'yaml', 'yml', 'csv', 'log', 'sql', 'toml', 'ini', 'cfg', 'conf', 'sh', 'bat', 'ps1', 'java', 'c', 'cpp', 'h', 'hpp', 'go', 'rs'].includes(fileExt.value) @@ -68,18 +93,161 @@ const locLabel = computed(() => { const count = lineCount.value return count ? `${count} 行` : '二进制文件' }) +const objectUrl = computed(() => editedVideoUrl.value || basePreviewUrl.value) +const canEditImage = computed(() => isImage.value && typeof props.updateFile === 'function') +const hasEditedVideo = computed(() => editedVideoBlob.value instanceof Blob) +const normalizedClipStart = computed(() => clampNumber(clipStartSeconds.value, 0, videoDurationSeconds.value || 0)) +const normalizedClipEnd = computed(() => resolveClipEnd(clipEndSeconds.value, normalizedClipStart.value, videoDurationSeconds.value || 0)) +const selectedClipDuration = computed(() => Math.max(0, normalizedClipEnd.value - normalizedClipStart.value)) +const hasPendingVideoEdit = computed(() => { + if (!isVideo.value || !videoDurationSeconds.value) return false + const duration = videoDurationSeconds.value + return normalizedClipStart.value > 0.05 || Math.abs(normalizedClipEnd.value - duration) > 0.05 || muteVideoAudio.value +}) + +function clampNumber(value, min, max) { + const numeric = Number(value) + if (!Number.isFinite(numeric)) return min + return Math.min(Math.max(numeric, min), max) +} + +function roundSeconds(value = 0) { + return Math.round((Number(value) || 0) * 10) / 10 +} + +function resolveClipEnd(value, start, duration) { + if (!duration) return 0 + const numeric = Number(value) + if (!Number.isFinite(numeric) || numeric <= 0) return duration + return clampNumber(numeric, start, duration) +} + +function stripExtension(name = '') { + return String(name).replace(/\.[^.]+$/, '') +} + +function buildEditedVideoName(name = 'video.mp4') { + return `${stripExtension(name)}-edited.mp4` +} + +function revokeUrl(url = '') { + if (!url) return + URL.revokeObjectURL(url) +} + +function clearEditedVideoResult() { + revokeUrl(editedVideoUrl.value) + editedVideoUrl.value = '' + editedVideoBlob.value = null +} + +function clearBasePreview() { + revokeUrl(basePreviewUrl.value) + basePreviewUrl.value = '' +} + +function resetVideoPreviewState() { + isTranscodingVideo.value = false + transcodeProgress.value = 0 + videoPreviewError.value = '' + isUsingTranscodedVideo.value = false +} + +function resetVideoEditState() { + isApplyingVideoEdit.value = false + videoEditProgress.value = 0 + videoEditError.value = '' + videoDurationSeconds.value = 0 + videoCurrentTime.value = 0 + clipStartSeconds.value = 0 + clipEndSeconds.value = 0 + muteVideoAudio.value = false + clearEditedVideoResult() +} + +function normalizeVideoEditRange() { + if (!videoDurationSeconds.value) { + clipStartSeconds.value = 0 + clipEndSeconds.value = 0 + return + } + + clipStartSeconds.value = roundSeconds(normalizedClipStart.value) + clipEndSeconds.value = roundSeconds(normalizedClipEnd.value) +} + +function assignBasePreviewUrl(url = '') { + clearBasePreview() + basePreviewUrl.value = url +} + +function setVideoRangeFromDuration(duration = 0) { + videoDurationSeconds.value = duration + videoCurrentTime.value = 0 + clipStartSeconds.value = 0 + clipEndSeconds.value = roundSeconds(duration) +} watch( - fileBlob, - (blob) => { - if (objectUrl.value) URL.revokeObjectURL(objectUrl.value) - objectUrl.value = blob instanceof Blob ? URL.createObjectURL(blob) : '' + [fileBlob, () => props.node?.id], + async ([blob]) => { + const currentTaskId = ++previewTaskId + clearBasePreview() + resetVideoPreviewState() + resetVideoEditState() + + if (!(blob instanceof Blob)) return + + if (!isVideo.value) { + assignBasePreviewUrl(URL.createObjectURL(blob)) + return + } + + if (canPlayVideoNatively(props.node)) { + assignBasePreviewUrl(URL.createObjectURL(blob)) + return + } + + isTranscodingVideo.value = true + try { + const transcodedBlob = await transcodeVideoToMp4(blob, props.node?.name || 'video', { + onProgress(progress) { + if (currentTaskId !== previewTaskId) return + transcodeProgress.value = Math.max(transcodeProgress.value, Math.round(progress * 100)) + } + }) + + if (currentTaskId !== previewTaskId) return + + assignBasePreviewUrl(URL.createObjectURL(transcodedBlob)) + isUsingTranscodedVideo.value = true + } catch (error) { + if (currentTaskId !== previewTaskId) return + videoPreviewError.value = error instanceof Error && error.message + ? error.message + : '当前视频暂时无法在浏览器内转换预览' + } finally { + if (currentTaskId === previewTaskId) { + isTranscodingVideo.value = false + } + } }, { immediate: true } ) +watch( + () => props.node?.id, + () => { + isEditingImage.value = false + isSavingImage.value = false + imageEditorError.value = '' + } +) + onBeforeUnmount(() => { - if (objectUrl.value) URL.revokeObjectURL(objectUrl.value) + previewTaskId += 1 + clearBasePreview() + clearEditedVideoResult() }) function formatBytes(bytes = 0) { @@ -103,6 +271,166 @@ function navigateTo(id) { emit('navigate', id) } +function toggleSidebar() { + emit('toggle-sidebar') +} + +function getImageExportFormat() { + if (fileExt.value === 'jpg' || fileExt.value === 'jpeg') return 'jpeg' + if (fileExt.value === 'webp') return 'webp' + return 'png' +} + +function startImageEditing() { + if (!canEditImage.value || !objectUrl.value || isSavingImage.value) return + imageEditorError.value = '' + isEditingImage.value = true +} + +function cancelImageEditing() { + if (isSavingImage.value) return + imageEditorError.value = '' + isEditingImage.value = false +} + +function handleImageEditorError(message) { + imageEditorError.value = String(message || '图片编辑器加载失败') +} + +async function saveImageEdits() { + if (!props.node?.id || typeof props.updateFile !== 'function' || !imageEditorRef.value) return + + isSavingImage.value = true + imageEditorError.value = '' + + try { + const editedBlob = await imageEditorRef.value.exportImageBlob({ + format: getImageExportFormat(), + quality: 0.92 + }) + + const updated = await props.updateFile(props.node.id, editedBlob, { + mimeType: editedBlob.type || props.node?.mimeType || '', + storageKind: 'blob', + previewText: '', + isTruncatedPreview: false + }) + + if (updated === false) { + throw new Error('保存图片失败') + } + + isEditingImage.value = false + } catch (error) { + imageEditorError.value = error instanceof Error && error.message + ? error.message + : '保存图片失败' + } finally { + isSavingImage.value = false + } +} + +function formatDuration(seconds = 0) { + const total = Math.max(0, Number(seconds) || 0) + const hours = Math.floor(total / 3600) + const minutes = Math.floor((total % 3600) / 60) + const secs = total % 60 + const paddedSeconds = secs >= 10 ? secs.toFixed(1).padStart(4, '0') : secs.toFixed(1).padStart(3, '0') + + if (hours > 0) { + return `${String(hours).padStart(2, '0')}:${String(minutes).padStart(2, '0')}:${paddedSeconds.padStart(4, '0')}` + } + + return `${String(minutes).padStart(2, '0')}:${paddedSeconds.padStart(4, '0')}` +} + +function downloadBlob(blob, fileName) { + if (!(blob instanceof Blob)) return + const url = URL.createObjectURL(blob) + const anchor = document.createElement('a') + anchor.href = url + anchor.download = fileName + document.body.appendChild(anchor) + anchor.click() + anchor.remove() + setTimeout(() => URL.revokeObjectURL(url), 0) +} + +function handleVideoLoadedMetadata(event) { + const duration = Number(event.target?.duration || 0) + if (!Number.isFinite(duration)) return + setVideoRangeFromDuration(duration) +} + +function handleVideoTimeUpdate(event) { + const currentTime = Number(event.target?.currentTime || 0) + if (!Number.isFinite(currentTime)) return + videoCurrentTime.value = currentTime +} + +function setClipStartFromCurrentTime() { + if (!videoElement.value) return + clipStartSeconds.value = roundSeconds(videoElement.value.currentTime || 0) + if (clipEndSeconds.value < clipStartSeconds.value) { + clipEndSeconds.value = roundSeconds(videoDurationSeconds.value || clipStartSeconds.value) + } + normalizeVideoEditRange() +} + +function setClipEndFromCurrentTime() { + if (!videoElement.value) return + clipEndSeconds.value = roundSeconds(videoElement.value.currentTime || 0) + if (clipEndSeconds.value < clipStartSeconds.value) { + clipStartSeconds.value = roundSeconds(Math.max(0, clipEndSeconds.value - 0.1)) + } + normalizeVideoEditRange() +} + +async function applyVideoEdits() { + if (!isVideo.value) return + normalizeVideoEditRange() + + const sourceBlob = hasEditedVideo.value ? editedVideoBlob.value : fileBlob.value + if (!(sourceBlob instanceof Blob) || !videoDurationSeconds.value || !hasPendingVideoEdit.value) return + + isApplyingVideoEdit.value = true + videoEditProgress.value = 0 + videoEditError.value = '' + + try { + const editedBlob = await editVideoBlob(sourceBlob, hasEditedVideo.value ? buildEditedVideoName(props.node?.name || 'video.mp4') : props.node?.name || 'video.mp4', { + startTime: normalizedClipStart.value, + endTime: normalizedClipEnd.value, + muteAudio: muteVideoAudio.value, + onProgress(progress) { + videoEditProgress.value = Math.max(videoEditProgress.value, Math.round(progress * 100)) + } + }) + + clearEditedVideoResult() + editedVideoBlob.value = editedBlob + editedVideoUrl.value = URL.createObjectURL(editedBlob) + } catch (error) { + videoEditError.value = error instanceof Error && error.message + ? error.message + : '视频编辑失败' + } finally { + isApplyingVideoEdit.value = false + } +} + +function restoreOriginalVideo() { + clearEditedVideoResult() + videoEditError.value = '' + videoEditProgress.value = 0 + muteVideoAudio.value = false +} + +function downloadEditedVideo() { + if (!(editedVideoBlob.value instanceof Blob)) return + downloadBlob(editedVideoBlob.value, buildEditedVideoName(props.node?.name || 'video.mp4')) +} + async function copyText() { if (!previewText.value) return try { @@ -120,13 +448,7 @@ function openRaw() { function downloadFile() { const blob = fileBlob.value if (!blob) return - const url = objectUrl.value || URL.createObjectURL(blob) - const anchor = document.createElement('a') - anchor.href = url - anchor.download = props.node?.name || 'download' - document.body.appendChild(anchor) - anchor.click() - anchor.remove() + downloadBlob(blob, props.node?.name || 'download') } @@ -182,35 +504,58 @@ function downloadFile() { + + diff --git a/src/composables/useFileSystem.js b/src/composables/useFileSystem.js index 9c763ab..1cd6138 100644 --- a/src/composables/useFileSystem.js +++ b/src/composables/useFileSystem.js @@ -98,8 +98,12 @@ function isBinaryExtension(ext) { function inferMimeType(name, fallback = '') { const ext = getExtension(name) const map = { + avi: 'video/x-msvideo', md: 'text/markdown', markdown: 'text/markdown', + mkv: 'video/x-matroska', + mov: 'video/quicktime', + mp4: 'video/mp4', txt: 'text/plain', json: 'application/json', js: 'text/javascript', @@ -126,11 +130,17 @@ function inferMimeType(name, fallback = '') { ps1: 'text/plain', jpg: 'image/jpeg', jpeg: 'image/jpeg', + flv: 'video/x-flv', + m4v: 'video/x-m4v', png: 'image/png', gif: 'image/gif', webp: 'image/webp', svg: 'image/svg+xml', - pdf: 'application/pdf' + pdf: 'application/pdf', + ogg: 'video/ogg', + ogv: 'video/ogg', + webm: 'video/webm', + wmv: 'video/x-ms-wmv' } return fallback || map[ext] || 'application/octet-stream' } @@ -398,6 +408,43 @@ export function useFileSystem() { return true } + function updateFile(id, nextValue, options = {}) { + const file = records.value.find((item) => item.id === id && item.type === 'file') + if (!file) return false + + const nextName = options.name || file.name + const isBlobValue = nextValue instanceof Blob + const nextContent = isBlobValue ? (options.content ?? '') : String(options.content ?? nextValue ?? '') + const nextSize = typeof options.size === 'number' + ? options.size + : isBlobValue + ? nextValue.size + : new Blob([nextContent]).size + + if (nextSize > MAX_FILE_SIZE) { + error.value = '单个文件不能超过 1GB' + return false + } + + file.name = nextName + file.updatedAt = Date.now() + file.mimeType = inferMimeType(nextName, options.mimeType || (isBlobValue ? nextValue.type : file.mimeType)) + file.size = nextSize + file.storageKind = options.storageKind || (isBlobValue ? 'blob' : 'text') + file.content = nextContent + file.previewText = options.previewText ?? (file.storageKind === 'text' ? nextContent : '') + file.isTruncatedPreview = Boolean(options.isTruncatedPreview) + file.blob = isBlobValue ? nextValue : null + records.value = [...records.value] + error.value = null + + persistRecord(file).catch(() => { + error.value = '保存文件失败,可能是浏览器存储空间不足' + }) + touchParent(file.parentId) + return true + } + function createFolder(parentId, name) { if (records.value.length >= MAX_NODES) { error.value = `目录项数量不能超过 ${MAX_NODES} 个` @@ -594,8 +641,12 @@ export function useFileSystem() { function getFileIcon(name) { const ext = getExtension(name) const iconMap = { + avi: 'video', md: 'markdown', markdown: 'markdown', + mkv: 'video', + mov: 'video', + mp4: 'video', txt: 'text', json: 'json', js: 'javascript', @@ -617,13 +668,19 @@ export function useFileSystem() { jpeg: 'image', png: 'image', gif: 'image', + flv: 'video', + m4v: 'video', webp: 'image', svg: 'image', + ogg: 'video', + ogv: 'video', pdf: 'pdf', doc: 'word', docx: 'word', ppt: 'ppt', pptx: 'ppt', + webm: 'video', + wmv: 'video', xls: 'excel', xlsx: 'excel', zip: 'zip' @@ -681,6 +738,7 @@ export function useFileSystem() { stats, load, createFile, + updateFile, createFolder, rename, remove, diff --git a/src/plugins/AGENTS.md b/src/plugins/AGENTS.md index c4ce5cc..a1e987f 100644 --- a/src/plugins/AGENTS.md +++ b/src/plugins/AGENTS.md @@ -1,42 +1,71 @@ -# Plugins 模块指南 +# Plugins 插件层指引 -## OVERVIEW -Milkdown/ProseMirror 插件,AI 补全核心逻辑。 +本文件适用于 src/plugins/ 下的插件代码。 -## STRUCTURE -- copilotPlugin.ts - ProseMirror Mark 系统、ghost text、防抖请求 -- docBlockPlugin.ts - 文档块插件 -- mermaidPlugin.ts - Mermaid 图表渲染 -- index.ts - 插件导出 -- types.ts - 类型定义 +## 插件层职责 -## WHERE TO LOOK +- 承接 Milkdown/ProseMirror 与业务逻辑之间的粘合层。 +- 负责 AI 补全 ghost text、文档块节点、Mermaid 预览等编辑器级行为。 +- 这里的代码状态性很强,误改后通常会出现“看起来还能编译,但交互细节坏掉”的问题。 -| 任务 | 文件 | 说明 | -|------|------|------| -| AI 补全核心 | copilotPlugin.ts | ProseMirror Mark、ghost text | -| 文档块处理 | docBlockPlugin.ts | 文档块解析与渲染 | -| Mermaid 图表 | mermaidPlugin.ts | 图表渲染集成 | -| 插件导出 | index.ts | 统一导出入口 | -| 类型定义 | types.ts | 公共类型 | +## 文件分工 -## 关键函数 -- scheduleFetch - 防抖触发补全请求 -- insertGhostText - 插入 ghost text -- acceptSuggestion - Tab 接受建议 -- rejectSuggestion - Esc 取消建议 +- copilotPlugin.ts:AI 补全主逻辑,包含 ghost text、请求调度、取消、语言识别、隐藏上下文注入和大小限制。 +- docBlockPlugin.ts:文档块节点、remark 适配和视图逻辑。 +- mermaidPlugin.ts:Mermaid 代码块预览和渲染。 +- index.ts:导出入口。 +- types.ts:公共类型。 -## CONVENTIONS -- TypeScript 2 空格缩进 -- 函数:camelCase -- 接口/类型:PascalCase +## copilotPlugin 的真实职责 -## ANTI-PATTERNS -- 空 catch 块 -- 类型错误使用 as any -- 硬编码超时值 +- 维护 ghost suggestion 的 plugin state。 +- 用 mark + decoration 表示 ghost text,而不是简单的纯字符串缓存。 +- 为每个 EditorView 维护 runtime: + - enabled + - debounceTimer + - abortController + - ctx + - requestSeq + - docVersion +- 推断当前光标语言,处理 fenced code、latex、mermaid 等上下文。 +- 提取 OCR 缓存和文档块内容,拼到隐藏上下文里。 +- 控制请求失效和中止,避免旧请求把新文档状态覆盖掉。 +- 在结果插入后恢复合理的光标位置和选择状态。 -## 注意事项 -- 防抖时间:1000ms(可配置) -- 文档大小限制:32KB 自动禁用 -- Tab/Esc 快捷键交互 +## 先看哪些函数 + +- getCursorLanguageId:判断当前上下文语言 +- extractDocBlocksFromMarkdown:从文档块生成隐藏上下文 +- doFetchSuggestion:真正发起补全请求 +- clearRuntimeRequests:中止定时器和请求 +- insertGhostText / insertPlainText:把建议插回编辑器 + +## 编辑规则 + +- 不要把隐藏 OCR 上下文或文档块上下文直接变成最终可见文本,除非需求明确要求。 +- 不要破坏 requestSeq 和 AbortController 这套旧请求失效机制。 +- 不要随意改 ghost text 的 mark/decorations 表示方式;这会影响显示、接受、拒绝和同步。 +- parserCtx 和 serializerCtx 是和 Milkdown 集成的关键上下文,改解析插入逻辑时要一起考虑。 +- 插件行为并不完全自洽,很多配置和启停逻辑是在 components/MilkdownEditor.vue 里接上的;不要只在插件内部脑补整体行为。 + +## 容易踩坑的点 + +- 大小限制既有插件常量,也有编辑器 UI 层联动。 +- 图片节点类型不止一种名字,代码已经兼容 image、image-block、imageBlock。 +- 上下文语言识别会影响 Prompt 行为,改错以后通常不是“报错”,而是补全质量或补全边界变差。 +- Mermaid、LaTeX、文档块这几类上下文都和“是否允许补全、是否允许上传”相关。 +- 这是状态机式代码;局部改动后要优先验证交互,而不是只看类型通过。 + +## 调试顺序 + +- 如果是“为什么没有发请求”,先查 enabled、size limit、cursor context、debounce 和 abort。 +- 如果是“为什么结果插错位置”,先查 ghost range、mapping、selection 恢复。 +- 如果是“为什么上下文不对”,先查 OCR 缓存、文档块摘录和语言识别。 +- 如果是“为什么改了插件没生效”,再回看 MilkdownEditor.vue 里的 use/config/watch 是否也要一起改。 + +## 改动建议 + +- 先做最小改动。 +- 先验证单个交互问题,不要一口气同时改 ghost 插入、语言识别和请求时机。 +- 当改动影响请求 payload 时,再考虑是否需要同步后端 Prompt 测试。 +- 只有在确认插件本身是控制点时,才在这里改;很多行为实际上是在上层组件里决定的。 diff --git a/src/plugins/copilotPlugin.ts b/src/plugins/copilotPlugin.ts index 8cad7bf..abd6d76 100644 --- a/src/plugins/copilotPlugin.ts +++ b/src/plugins/copilotPlugin.ts @@ -4,6 +4,7 @@ import { parserCtx, serializerCtx } from '@milkdown/kit/core' import { Node as ProseNode, Slice } from '@milkdown/prose/model' import type { Ctx } from '@milkdown/kit/core' import { Decoration, DecorationSet, type EditorView } from '@milkdown/prose/view' +import { extractDocBlockContextFromMarkdown } from '../utils/docBlock.js' import { getOcrCache, OCR_SIZE_LIMIT, extractTextFromOCR } from '../utils/ocrCache' const COPILOT_PLUGIN_KEY = new PluginKey('milkdown-copilot') @@ -11,6 +12,8 @@ const DEBOUNCE_MS = 1000 const SIZE_LIMIT = OCR_SIZE_LIMIT const DOC_SIZE_LIMIT = 32 * 1024 // 文档块32KB限制 const IMAGE_NODE_TYPES = new Set(['image', 'image-block', 'imageBlock']) +const FALLBACK_BLOCK_SEPARATOR = '\n\n' +const FALLBACK_LEAF_TEXT = '\n' interface CopilotState { from: number @@ -181,10 +184,6 @@ function normalizeSuggestionText(raw: string): string { } } - if (!text.includes('\n') && text.includes('\\n')) { - text = text.replace(/\\n/g, '\n') - } - return text } @@ -307,7 +306,7 @@ function serializeRangeToMarkdown( const slice = doc.slice(from, to) if (slice.content.size <= 0) return '' const sliceDoc = schema.topNodeType.createAndFill(undefined, slice.content) - return sliceDoc ? serializer(sliceDoc) : doc.textBetween(from, to, '\n', '\n') + return sliceDoc ? serializer(sliceDoc) : doc.textBetween(from, to, FALLBACK_BLOCK_SEPARATOR, FALLBACK_LEAF_TEXT) } function buildOcrContextForRequest(doc: ProseNode, cursorPos: number): string { @@ -328,32 +327,7 @@ function buildOcrContextForRequest(doc: ProseNode, cursorPos: number): string { }) if (lines.length === 0) return '' - return `\n\n${lines.join('\n')}` -} - -// 从markdown中提取文档块内容用于AI补全上下文 -function extractDocBlocksFromMarkdown(markdown: string): string { - const lines: string[] = [] - - // 使用正则表达式匹配文档块 - // content - const docBlockRegex = /([\s\S]*?)<\/doc_end>/g - - let match - while ((match = docBlockRegex.exec(markdown)) !== null) { - const docType = match[1] - const docName = match[2] - const content = match[4].trim() - - if (content) { - // 将文档内容格式化为上下文,限制长度 - const truncatedContent = content.length > 500 ? content.substring(0, 500) + '...' : content - lines.push(`\n${truncatedContent}\n`) - } - } - - if (lines.length === 0) return '' - return `\n\n-- 已上传文档内容 --\n${lines.join('\n\n')}` + return lines.join('\n') } function doFetchSuggestion( @@ -413,26 +387,26 @@ function scheduleFetch(view: EditorView, runtime: CopilotRuntime, pos: number) { try { prefixMarkdown = serializeRangeToMarkdown(doc, 0, pos, schema, serializer) if (!prefixMarkdown) { - prefixMarkdown = doc.textBetween(0, pos, '\n', '\n') + prefixMarkdown = doc.textBetween(0, pos, FALLBACK_BLOCK_SEPARATOR, FALLBACK_LEAF_TEXT) } suffixMarkdown = serializeRangeToMarkdown(doc, pos, doc.content.size, schema, serializer) if (!suffixMarkdown) { - suffixMarkdown = doc.textBetween(pos, doc.content.size, '\n', '\n') + suffixMarkdown = doc.textBetween(pos, doc.content.size, FALLBACK_BLOCK_SEPARATOR, FALLBACK_LEAF_TEXT) } } catch { - prefixMarkdown = doc.textBetween(0, pos, '\n', '\n') - suffixMarkdown = doc.textBetween(pos, doc.content.size, '\n', '\n') + prefixMarkdown = doc.textBetween(0, pos, FALLBACK_BLOCK_SEPARATOR, FALLBACK_LEAF_TEXT) + suffixMarkdown = doc.textBetween(pos, doc.content.size, FALLBACK_BLOCK_SEPARATOR, FALLBACK_LEAF_TEXT) } // 构建上下文:OCR内容 + 上传文档内容 const ocrContext = buildOcrContextForRequest(doc, pos) // 从markdown中提取文档块内容用于AI补全上下文 - const docContext = extractDocBlocksFromMarkdown(prefixMarkdown + suffixMarkdown) + const docContext = extractDocBlockContextFromMarkdown(prefixMarkdown + suffixMarkdown, 500) // 组合所有上下文到prefix前面 - const fullPrefixWithContext = `${ocrContext}${docContext}\n\n${prefixMarkdown}` + const fullPrefixWithContext = [ocrContext, docContext, prefixMarkdown].filter(Boolean).join('\n\n') const totalTextLen = (prefixMarkdown + suffixMarkdown).length const contextLen = fullPrefixWithContext.length - prefixMarkdown.length diff --git a/src/plugins/docBlockPlugin.ts b/src/plugins/docBlockPlugin.ts index 2ee28d8..c4b150e 100644 --- a/src/plugins/docBlockPlugin.ts +++ b/src/plugins/docBlockPlugin.ts @@ -16,6 +16,9 @@ import { stripDocBlockMarkdown, } from '../utils/docBlock.js' +const FALLBACK_BLOCK_SEPARATOR = '\n\n' +const FALLBACK_LEAF_TEXT = '\n' + function serializeRangeToMarkdown( doc: ProseNode, from: number, @@ -27,7 +30,7 @@ function serializeRangeToMarkdown( const slice = doc.slice(from, to) if (slice.content.size <= 0) return '' const sliceDoc = schema.topNodeType.createAndFill(undefined, slice.content) - return sliceDoc ? serializer(sliceDoc) : doc.textBetween(from, to, '\n', '\n') + return sliceDoc ? serializer(sliceDoc) : doc.textBetween(from, to, FALLBACK_BLOCK_SEPARATOR, FALLBACK_LEAF_TEXT) } function buildDocContext(doc: ProseNode, excludePos?: number) { diff --git a/src/utils/docBlock.js b/src/utils/docBlock.js index df4c2c5..93ea2ae 100644 --- a/src/utils/docBlock.js +++ b/src/utils/docBlock.js @@ -5,6 +5,17 @@ export const DOC_CONTEXT_LIMIT = 32 * 1024 const IMAGE_MD_RE = /!\[[^\]]*]\([^)]+\)/g const IMAGE_HTML_RE = /]*>/gi const HEADER_SEPARATOR = '\n---\n' +const FENCED_DOC_BLOCK_RE = /(^|\n)(`{3,})llm-file[^\n]*\n([\s\S]*?)\n\2(?=\n|$)/g +const LEGACY_DOC_BLOCK_RE = /[\s\S]*?<\/doc_end>/g + +function normalizeMarkdownText(markdown = '') { + return String(markdown || '').replace(/\r\n?/g, '\n') +} + +function clipDocContext(content = '', limit = 0) { + if (!limit || content.length <= limit) return content + return `${content.slice(0, limit)}...` +} export function normalizeDocType(value = '') { const lower = String(value || '').trim().toLowerCase() @@ -54,12 +65,9 @@ export function isSupportedDocFile(file) { } export function sanitizeDocContent(markdown = '') { - return String(markdown || '') - .replace(/\r\n?/g, '\n') + return normalizeMarkdownText(markdown) .replace(IMAGE_MD_RE, '') .replace(IMAGE_HTML_RE, '') - .replace(/\n{3,}/g, '\n\n') - .trim() } function quoteMeta(value = '') { @@ -102,7 +110,7 @@ export function buildDocBlockValue(attrs = {}) { } export function parseDocBlockValue(raw = '') { - const normalized = String(raw || '').replace(/\r\n?/g, '\n') + const normalized = normalizeMarkdownText(raw) const separatorIndex = normalized.indexOf(HEADER_SEPARATOR) const headerText = separatorIndex >= 0 ? normalized.slice(0, separatorIndex) : '' const bodyText = separatorIndex >= 0 ? normalized.slice(separatorIndex + HEADER_SEPARATOR.length) : normalized @@ -150,7 +158,8 @@ export function buildLegacyDocBlock(attrs = {}) { } export function parseLegacyDocBlock(raw = '') { - const match = String(raw || '').match(/^\n?([\s\S]*?)\n?<\/doc_end>$/) + const normalized = normalizeMarkdownText(raw) + const match = normalized.match(/^\n?([\s\S]*?)\n?<\/doc_end>$/) if (!match) return null return { docType: normalizeDocType(match[1]), @@ -161,33 +170,57 @@ export function parseLegacyDocBlock(raw = '') { } } +export function extractDocBlockContextFromMarkdown(markdown = '', contentLimit = 0) { + const normalized = normalizeMarkdownText(markdown) + const contexts = [] + const appendContext = (attrs) => { + if (!attrs) return + const rawContent = String(attrs.content || '') + if (!rawContent.trim()) return + contexts.push(buildDocContextFence({ + docType: attrs.docType, + content: clipDocContext(rawContent, contentLimit), + })) + } + + normalized.replace(FENCED_DOC_BLOCK_RE, (_full, _prefix, _fence, value) => { + appendContext(parseDocBlockValue(value)) + return _full + }) + + normalized.replace(LEGACY_DOC_BLOCK_RE, (full) => { + appendContext(parseLegacyDocBlock(full)) + return full + }) + + return contexts.join('\n\n') +} + export function transformDocBlockMarkdownForClipboard(markdown = '') { - const pattern = /(^|\n)(`{3,})llm-file[^\n]*\n([\s\S]*?)\n\2(?=\n|$)/g - const replacedFence = String(markdown || '').replace(pattern, (full, prefix, _fence, value) => { + const normalized = normalizeMarkdownText(markdown) + const replacedFence = normalized.replace(FENCED_DOC_BLOCK_RE, (full, prefix, _fence, value) => { const attrs = parseDocBlockValue(value) return `${prefix}${buildDocContextFence(attrs)}` }) - return replacedFence.replace(/[\s\S]*?<\/doc_end>/g, (full) => { + return replacedFence.replace(LEGACY_DOC_BLOCK_RE, (full) => { const attrs = parseLegacyDocBlock(full) return attrs ? buildDocContextFence(attrs) : full }) } export function stripDocBlockMarkdown(markdown = '') { - const pattern = /(^|\n)(`{3,})llm-file[^\n]*\n[\s\S]*?\n\2(?=\n|$)/g - return String(markdown || '').replace(pattern, '$1').replace(/\n{3,}/g, '\n\n').trim() + return normalizeMarkdownText(markdown).replace(FENCED_DOC_BLOCK_RE, '$1') } export function transformLegacyDocBlocksForExport(markdown = '') { - return String(markdown || '').replace(/[\s\S]*?<\/doc_end>/g, (full) => { + return normalizeMarkdownText(markdown).replace(LEGACY_DOC_BLOCK_RE, (full) => { const attrs = parseLegacyDocBlock(full) return attrs ? buildDocBlockMarkdown(attrs) : full }) } export function transformSpecialDocBlocksToLegacy(markdown = '') { - const pattern = /(^|\n)(`{3,})llm-file[^\n]*\n([\s\S]*?)\n\2(?=\n|$)/g - return String(markdown || '').replace(pattern, (full, prefix, _fence, value) => { + return normalizeMarkdownText(markdown).replace(FENCED_DOC_BLOCK_RE, (full, prefix, _fence, value) => { const attrs = parseDocBlockValue(value) return `${prefix}${buildLegacyDocBlock(attrs)}` }) diff --git a/src/utils/ffmpeg.js b/src/utils/ffmpeg.js new file mode 100644 index 0000000..61171ab --- /dev/null +++ b/src/utils/ffmpeg.js @@ -0,0 +1,230 @@ +import coreURL from '@ffmpeg/core?url' +import wasmURL from '@ffmpeg/core/wasm?url' +import classWorkerURL from '@ffmpeg/ffmpeg/worker?url' + +const VIDEO_EXTENSIONS = new Set([ + 'mp4', + 'webm', + 'ogv', + 'ogg', + 'mov', + 'm4v', + 'avi', + 'mkv', + 'flv', + 'wmv', + '3gp', + 'm2ts', + 'mts', + 'ts' +]) + +const FORCED_TRANSCODE_EXTENSIONS = new Set([ + '3gp', + 'avi', + 'flv', + 'm2ts', + 'mkv', + 'mts', + 'ts', + 'wmv' +]) + +const VIDEO_MIME_BY_EXTENSION = { + m4v: 'video/x-m4v', + mov: 'video/quicktime', + mp4: 'video/mp4', + ogg: 'video/ogg', + ogv: 'video/ogg', + webm: 'video/webm' +} + +let ffmpegInstancePromise = null +let progressHandler = null +let transcodeQueue = Promise.resolve() + +function getFileExtension(name = '') { + const parts = String(name).split('.') + return parts.length > 1 ? parts.pop().toLowerCase() : '' +} + +function getNodeMimeType(node) { + return String(node?.mimeType || '').toLowerCase() +} + +function formatFfmpegTime(seconds = 0) { + const totalSeconds = Math.max(0, Number(seconds) || 0) + return totalSeconds.toFixed(3) +} + +function createVideoProbe() { + if (typeof document === 'undefined') return null + return document.createElement('video') +} + +function toAbsoluteURL(url) { + if (!url || typeof location === 'undefined') { + return url + } + + return new URL(url, location.href).href +} + +function getLoadConfigs() { + return [{ + classWorkerURL: toAbsoluteURL(classWorkerURL), + coreURL: toAbsoluteURL(coreURL), + wasmURL: toAbsoluteURL(wasmURL) + }] +} + +async function loadFFmpegRuntime(FFmpeg, fetchFile) { + let lastError = null + + for (const loadConfig of getLoadConfigs()) { + const ffmpeg = new FFmpeg() + ffmpeg.on('progress', ({ progress }) => { + if (typeof progressHandler === 'function') { + progressHandler(Math.max(0, Math.min(1, progress || 0))) + } + }) + + try { + await ffmpeg.load(loadConfig) + return { ffmpeg, fetchFile } + } catch (error) { + lastError = error + } + } + + throw lastError || new Error('FFmpeg 初始化失败') +} + +async function getFFmpegInstance() { + if (!ffmpegInstancePromise) { + ffmpegInstancePromise = Promise.all([ + import('@ffmpeg/ffmpeg'), + import('@ffmpeg/util') + ]).then(([{ FFmpeg }, { fetchFile }]) => loadFFmpegRuntime(FFmpeg, fetchFile)) + } + + return ffmpegInstancePromise +} + +function buildMp4Command(inputName, outputName, options = {}) { + const startTime = Math.max(0, Number(options.startTime) || 0) + const endTime = Number.isFinite(options.endTime) ? Number(options.endTime) : null + const duration = endTime === null ? null : Math.max(0.05, endTime - startTime) + const args = [] + + if (startTime > 0) { + args.push('-ss', formatFfmpegTime(startTime)) + } + + args.push('-i', inputName) + + if (duration !== null) { + args.push('-t', formatFfmpegTime(duration)) + } + + if (options.preferEncoding !== false) { + args.push('-c:v', 'libx264', '-preset', 'ultrafast', '-pix_fmt', 'yuv420p') + if (options.muteAudio) { + args.push('-an') + } else { + args.push('-c:a', 'aac') + } + } else if (options.muteAudio) { + args.push('-an') + } + + args.push('-movflags', '+faststart', '-y', outputName) + return args +} + +async function executePreferredMp4Command(ffmpeg, inputName, outputName, options = {}) { + try { + await ffmpeg.exec(buildMp4Command(inputName, outputName, { + ...options, + preferEncoding: true + })) + } catch { + await ffmpeg.exec(buildMp4Command(inputName, outputName, { + ...options, + preferEncoding: false + })) + } +} + +async function runMp4Job(blob, fileName, options = {}) { + const { ffmpeg, fetchFile } = await getFFmpegInstance() + const ext = getFileExtension(fileName) || 'bin' + const inputName = `input-${Date.now()}.${ext}` + const outputName = `output-${Date.now()}.mp4` + progressHandler = typeof options.onProgress === 'function' ? options.onProgress : null + + try { + await ffmpeg.writeFile(inputName, await fetchFile(blob)) + await executePreferredMp4Command(ffmpeg, inputName, outputName, options) + const data = await ffmpeg.readFile(outputName) + return new Blob([data.buffer], { type: 'video/mp4' }) + } finally { + progressHandler = null + await ffmpeg.deleteFile?.(inputName) + await ffmpeg.deleteFile?.(outputName) + } +} + +export function isVideoFile(node) { + const ext = getFileExtension(node?.name) + const mime = getNodeMimeType(node) + return mime.startsWith('video/') || VIDEO_EXTENSIONS.has(ext) +} + +export function canPlayVideoNatively(node) { + if (!isVideoFile(node)) return false + + const ext = getFileExtension(node?.name) + if (FORCED_TRANSCODE_EXTENSIONS.has(ext)) return false + + const mime = getNodeMimeType(node) || VIDEO_MIME_BY_EXTENSION[ext] || '' + if (!mime) return ['mp4', 'ogv', 'ogg', 'webm'].includes(ext) + + const video = createVideoProbe() + if (!video) return ['mp4', 'ogv', 'ogg', 'webm'].includes(ext) + return video.canPlayType(mime) !== '' +} + +export async function transcodeVideoToMp4(blob, fileName, options = {}) { + const run = async () => { + try { + return await runMp4Job(blob, fileName, options) + } catch (error) { + const message = error instanceof Error && error.message + ? error.message + : '浏览器内视频转换失败' + throw new Error(message) + } + } + + const result = transcodeQueue.then(run, run) + transcodeQueue = result.then(() => undefined, () => undefined) + return result +} + +export async function editVideoBlob(blob, fileName, options = {}) { + const run = async () => { + try { + return await runMp4Job(blob, fileName, options) + } catch (error) { + const message = error instanceof Error && error.message + ? error.message + : '浏览器内视频编辑失败' + throw new Error(message) + } + } + + const result = transcodeQueue.then(run, run) + transcodeQueue = result.then(() => undefined, () => undefined) + return result +} \ No newline at end of file diff --git a/src/views/DocsView.vue b/src/views/DocsView.vue index 97e0c78..8cbe936 100644 --- a/src/views/DocsView.vue +++ b/src/views/DocsView.vue @@ -120,7 +120,7 @@ function closeConfirm() {
    -
    +
    diff --git a/test_cross.py b/test_cross.py deleted file mode 100644 index 02af682..0000000 --- a/test_cross.py +++ /dev/null @@ -1,20 +0,0 @@ -import asyncio -from backend.tts_asr import _tts_sync_with_retry, _load_asr_pipeline_with_retry, _asr_pipeline -import base64 - -async def main(): - text = "早上好" - print(f"Testing TTS with text: {text}") - audio_bytes, sr = await _tts_sync_with_retry(text, rate=1.0) - print(f"TTS generated {len(audio_bytes)} bytes of audio.") - - print("Testing ASR...") - await _load_asr_pipeline_with_retry() - asr = _asr_pipeline - - # Needs to process audio_bytes. ASR expects float32 numpy array or bytes? - # the pipeline takes bytes or dict with raw array - result = asr(audio_bytes) - print("ASR output:", result) - -asyncio.run(main()) diff --git a/vite.config.js b/vite.config.js index 0bdd7e4..656e2ef 100644 --- a/vite.config.js +++ b/vite.config.js @@ -1,11 +1,17 @@ import { defineConfig } from 'vite' import vue from '@vitejs/plugin-vue' +const crossOriginIsolationHeaders = { + 'Cross-Origin-Embedder-Policy': 'require-corp', + 'Cross-Origin-Opener-Policy': 'same-origin' +} + export default defineConfig({ plugins: [vue()], server: { host: true, port: 5173, + headers: crossOriginIsolationHeaders, proxy: { '/v1': { target: 'https://api.imageteach.tech:8002', @@ -13,6 +19,9 @@ export default defineConfig({ } } }, + preview: { + headers: crossOriginIsolationHeaders + }, build: { rollupOptions: { output: {