From 5c33fac1bc8a01dbbd911d4a9f463e8239daf509 Mon Sep 17 00:00:00 2001 From: Zack <43022758+bahamutww@users.noreply.github.com> Date: Fri, 2 Oct 2026 13:41:16 +0800 Subject: [PATCH] =?UTF-8?q?feat(admin):=20=E7=A7=BB=E9=99=A4=E8=B0=83?= =?UTF-8?q?=E8=AF=95=E6=A8=A1=E5=9D=97=EF=BC=8C=E7=BB=9F=E4=B8=80=20Agent?= =?UTF-8?q?=20=E5=B8=83=E5=B1=80=E5=B9=B6=E5=8D=87=E7=BA=A7=E7=94=BB?= =?UTF-8?q?=E5=B8=83=E8=A7=84=E5=88=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 管理端 Agent 创建/编辑页采用统一双列布局,移除调试对话模块 - 新增画布一键整理工具,实现节点去重叠和瀑布流重排 - 画布连线规则矩阵扩展至7×7,纳管 TTS 节点支持 - AI 助手跨轮工具上下文实现持久化传递,增强多轮推理能力 - 数据库种子模型全面刷新至2026年最新版,按类型分类标注 - 后端服务移除 admin_debug 路由及相关前端依赖 react-markdown、remark-gfm - 修复画布节点渲染坐标与数据库漂移,实现本地后端数据对账 - 新增 AiOrb 小球形象设计器演示页,支持 CSS 变量参数化预览 - 更新视频模型能力条目,引入 grok-imagine-video-1.5 版本 - 移除多个已下线和过时的模型 ID,优化数据一致性与性能 --- CHANGELOG.md | 96 + backend/admin/package-lock.json | 1593 +---------------- backend/admin/package.json | 10 +- .../admin/src/app/admin/agents/[id]/page.tsx | 57 +- .../AgentForm/Tools/ToolCapabilities.tsx | 25 +- .../admin/agents/AgentForm/index.tsx | 5 +- .../admin/agents/AgentForm/schema.ts | 4 +- .../components/admin/agents/ChatInterface.tsx | 712 -------- .../admin/agents/MultiAgentSteps.tsx | 119 -- backend/admin/src/i18n/locales/en-US.json | 62 +- backend/admin/src/i18n/locales/zh-CN.json | 62 +- backend/admin/tsconfig.tsbuildinfo | 2 +- backend/config.py | 2 +- backend/main.py | 2 - backend/routers/admin_debug.py | 638 ------- backend/schemas.py | 46 +- backend/scripts/seed_db.py | 147 +- backend/services/chat_generation.py | 69 +- backend/services/chat_tool_dispatch.py | 4 +- backend/services/chat_utils.py | 2 +- backend/services/tool_manager/context.py | 2 +- backend/services/tool_manager/manager.py | 4 +- .../providers/_canvas_edge_rules.py | 25 +- .../services/tool_manager/providers/canvas.py | 107 +- .../video_providers/model_capabilities.py | 35 + .../active_skills/canvas_tools/SKILL.md | 29 +- .../builtin_skills/canvas_tools/SKILL.md | 29 +- backend/tests/services/test_canvas_arrange.py | 210 +++ frontend/package-lock.json | 4 +- frontend/package.json | 2 +- .../app/demo/orbs-demo/orb-designer/page.tsx | 896 +++++++++ frontend/src/app/demo/orbs-demo/page.tsx | 19 +- .../ai-assistant/hooks/useSSEHandler.ts | 33 +- .../lib/canvas/__tests__/edgeRules.test.ts | 62 +- frontend/src/lib/canvas/edgeRules.ts | 26 +- frontend/src/store/useCanvasStore.ts | 115 +- 36 files changed, 1982 insertions(+), 3273 deletions(-) delete mode 100644 backend/admin/src/components/admin/agents/ChatInterface.tsx delete mode 100644 backend/admin/src/components/admin/agents/MultiAgentSteps.tsx delete mode 100644 backend/routers/admin_debug.py create mode 100644 backend/tests/services/test_canvas_arrange.py create mode 100644 frontend/src/app/demo/orbs-demo/orb-designer/page.tsx diff --git a/CHANGELOG.md b/CHANGELOG.md index 0748b5d3..d5a4e839 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,102 @@ --- +## [v0.1.7] - 2026-10-02 + +**主题:管理端移除调试对话模块并统一 Agent 创建/编辑布局、画布连线规则矩阵纳管 TTS 节点(6×6→7×7)与一键整理画布、AI 助手跨轮工具上下文持久化、数据库种子模型全面刷新至 2026 在役型号并按类型分类** + +上一版本:`v0.1.6`。本版本无数据库迁移(管理端调试模块的 DB 模型/表按既定决策保留,不做 DROP);管理端移除 2 个前端依赖(`react-markdown`、`remark-gfm`);前端无依赖清单变更(AiOrb 设计器演示页复用既有 `@paper-design/shaders-react` / `thinking-orbs` / `framer-motion`)。 + +### ✨ 新增 + +#### 一键整理画布工具 arrange_canvas_nodes + +- 新增画布工具 `arrange_canvas_nodes`:一次调用对整块画布去重叠 + 瀑布流重排全部节点。已登记进 `CANVAS_TOOL_NAMES_SET` / `_EXECUTORS` / 工具定义 / `chat_tool_dispatch` 顺序执行集 / 前端 `CANVAS_SYNC_TOOL_NAMES`,并同步 active + builtin 两份 `canvas_tools/SKILL.md`;因会改动节点位置,**未**纳入 `READ_ONLY_TOOLS`(EXPLORE 模式下被正确拦截)。SSE 侧为全部真实节点加 `updating` 描边效果并触发 `syncTheater`。附 `test_canvas_arrange.py` 单元测试。 + +#### 画布连线规则新增 TTS 节点行列 + +- 连线规则矩阵由 6×6 扩展为 **7×7**,正式纳管 `tts` 节点类型(前端 `edgeRules.ts` 与后端 `_canvas_edge_rules.py` 同步、逐格比对一致),补齐 `edgePayload.ts` 既有的 `buildPayload.tts` / `injectToTts` 缺口。 + +#### AiOrb 小球形象设计器演示页 + +- 新增 `/demo/orbs-demo/orb-designer`:基于 `--orbx-*` CSS 变量参数化实时预览 ThinkingOrb 小球形象,复用既有依赖,纯开发演示不影响主链路。 + +### 🔧 改进 + +- **管理端 Agent 页布局统一**:创建/编辑共用单栏双列布局(`AgentForm twoColumn`),移除预览(调试)对话模块(`ChatInterface` / `MultiAgentSteps`);`handleSave` 走 `document.querySelector('form').requestSubmit()`,清理 `dynamic` / `ScrollArea` / `formInstance` 等废弃引用。 +- **数据库种子模型全面刷新**:`DEFAULT_PROVIDERS` 严格对齐《各平台最新模型型号汇总-2026-10-02》,新增 OpenAI 供应商,Gemini / xAI / MiniMax / DeepSeek / 火山方舟 / Kimi 更新至最新在役型号(如 `gpt-6.1-sol`、`gemini-3.8-flash`、`grok-4.7`、`kimi-k3`、`deepseek-flash`、`doubao-seed-2-1-pro-260628`);每个模型按后端 `model_type` 字段(`language` / `multimodal` / `image` / `video` / `audio` / `tts`)逐一分类标注 `model_metadata`,与 admin `MODEL_TYPE_OPTIONS` 取值域一致。 +- **xAI 视频模型更新**:`grok-imagine-video` → `grok-imagine-video-1.5` / `grok-imagine-video-1.5-lite`(能力沿用同族,`model_capabilities.py` 补两条目、保留旧条目向后兼容)。 +- **AI 助手跨轮工具上下文**:`chat_generation.py` 以紧凑 `` 段追加进 assistant 消息文本,让 LLM 感知往轮工具返回;合并保全多轮 reasoning,历史消息向后兼容。 + +### 🐛 修复 + +- **画布节点渲染坐标与 DB 漂移**:新增 `reconcileLocalNodeWithBackend`(`useCanvasStore`)+ `reconcileCreatedNode`(`useSSEHandler`,单/多智能体双路径),从 `create_canvas_node` 的 `tool_result` 采纳后端落库的权威 id/坐标/尺寸对账本地乐观 `local-*` 节点;`nodeToApi` 剥离 `_reconciled` / `_pendingBackendId` 内部字段,`calcAutoPosition` 改为仅统计已落库节点,与后端 `_calculate_auto_position` 口径对齐。 +- **移除已下线种子模型 ID**:OpenAI Sora 全系、Google `imagen-*` 全系、MiniMax 音乐全系、`deepseek-v4-flash`、`grok-4.20-0309-*` 日期快照、`grok-imagine-image-pro`、`MiniMax-M2.5` 等一律剔除。 +- **图像模型此前不可见**:原 seed 中 Gemini / Grok 图像模型缺 `model_metadata`,因图像路由严格按 `model_type=='image'` 过滤而从不出现在图像供应商列表;补全分类后修复。 +- **连线矩阵漏类型静默不治理**:`tts` 缺格会走 `allow` 兜底掩盖,补齐 7×7 规则后消除。 + +### 🔒 依赖与安全 + +- 管理端移除 `react-markdown`(^10.1.0)、`remark-gfm`(^4.0.1)——调试对话模块删除后 `admin/src` 零引用;`admin/package-lock.json` 相应精简(连带清理孤立传递依赖)。移除后全仓检索 `admin_debug` / `AdminDebug` 无活引用(仅 `models.py` 保留表/模型、迁移脚本与若干注释)。 + +### ✅ 测试与验证 + +- 后端 9 个改动/新增文件 `py_compile` 全部通过;新增 `test_canvas_arrange.py`、`edgeRules.test.ts` 覆盖新工具与连线规则。 +- `seed_db.py` 结构校验:9 供应商 / 64 模型,每模型 `model_type` 合法、`model_metadata` 与 `models` 双向对齐、无重复;10 个视频模型均在 `model_capabilities.py` 有能力条目(不触发能力查询 404)。 +- 前后端连线矩阵 7×7 逐格比对一致;移除项全仓零残留引用;两份 locale JSON 与 `package.json` 解析合法。 +- CodeReview 子代理审查本批未提交改动:无阻断级 / 确定性缺陷(仅 1 项 Gemini 多轮工具「双 `` 块」可选显示优化,非回归)。 + +### 📌 升级说明 + +1. **无需数据库迁移**(调试模块表/模型保留);**管理端需 `npm install`**(移除 `react-markdown` / `remark-gfm`,lock 已更新),前端无依赖清单变更。 +2. 后端 Python 改动(`chat_generation.py` / `canvas.py` / `seed_db.py` 等)需**重启服务**生效。 +3. **种子供应商数据「仅创建缺失、不更新既有行」**:存量库需在管理后台 `/admin/llm` 手动更新各供应商模型列表与分类,全新初始化自动生效。 +4. 纯前端改动热更即可;`/demo/orbs-demo/orb-designer` 仅用于开发预览。 + +### 📁 主要变更文件 + +**后端** + +``` +backend/config.py 版本号 0.1.7(单一来源) +backend/scripts/seed_db.py DEFAULT_PROVIDERS 刷新至 2026 在役模型 + model_type 分类 +backend/services/video_providers/model_capabilities.py 新增 grok-imagine-video-1.5 / -lite 能力条目 +backend/services/tool_manager/providers/canvas.py 新增 arrange_canvas_nodes 工具 +backend/services/tool_manager/providers/_canvas_edge_rules.py 连线矩阵 6×6→7×7(纳管 tts) +backend/services/chat_generation.py 跨轮工具上下文 + 多轮 reasoning 合并 +backend/routers/admin_debug.py 删除:调试对话 API(DB 模型/表保留) +backend/main.py · backend/schemas.py 去 admin_debug 路由注册与 AdminDebug* schema +backend/tests/services/test_canvas_arrange.py 新增:整理画布工具测试 +``` + +**前端** + +``` +frontend/package.json · package-lock.json 版本号 0.1.7 +frontend/src/lib/canvas/edgeRules.ts (+ __tests__) 连线矩阵 7×7 +frontend/src/store/useCanvasStore.ts reconcileLocalNodeWithBackend 对账 + calcAutoPosition 对齐 +frontend/src/components/ai-assistant/hooks/useSSEHandler.ts reconcileCreatedNode + arrange 节点效果/同步 +frontend/src/app/demo/orbs-demo/orb-designer/page.tsx 新增:AiOrb 形象设计器演示页 +``` + +**管理端** + +``` +backend/admin/package.json · package-lock.json 版本号 0.1.7 + 移除 react-markdown / remark-gfm +backend/admin/src/app/admin/agents/[id]/page.tsx 创建/编辑统一双列布局 +backend/admin/src/components/admin/agents/ChatInterface.tsx 删除 +backend/admin/src/components/admin/agents/MultiAgentSteps.tsx 删除 +backend/admin/src/i18n/locales/{zh-CN,en-US}.json 去 agents.chat.* / agents.multiAgent.* 键 +``` + +**文档** + +``` +CHANGELOG.md 本文件 +``` + +--- + ## [v0.1.6] - 2026-09-30 **主题:AI 助手媒体任务卡单色重设计(共享极简播放器 + 拖拽把手)、刷新后思考面板与媒体任务卡持久化恢复、画布拖拽事件类型规范化与触屏兼容** diff --git a/backend/admin/package-lock.json b/backend/admin/package-lock.json index 4cc3338b..8be9f396 100644 --- a/backend/admin/package-lock.json +++ b/backend/admin/package-lock.json @@ -1,12 +1,12 @@ { "name": "admin-dashboard", - "version": "0.1.6", + "version": "0.1.7", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "admin-dashboard", - "version": "0.1.6", + "version": "0.1.7", "dependencies": { "@hookform/resolvers": "^5.4.0", "@monaco-editor/react": "^4.7.0", @@ -42,9 +42,7 @@ "react-hook-form": "^7.76.0", "react-i18next": "^17.0.8", "react-is": "^19.2.0", - "react-markdown": "^10.1.0", "recharts": "^3.7.0", - "remark-gfm": "^4.0.1", "swr": "^2.4.0", "tailwind-merge": "^3.5.0", "tailwindcss-animate": "^1.0.7", @@ -4020,15 +4018,6 @@ "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==", "license": "MIT" }, - "node_modules/@types/debug": { - "version": "4.1.13", - "resolved": "https://registry.npmmirror.com/@types/debug/-/debug-4.1.13.tgz", - "integrity": "sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==", - "license": "MIT", - "dependencies": { - "@types/ms": "*" - } - }, "node_modules/@types/deep-eql": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", @@ -4047,26 +4036,9 @@ "version": "1.0.9", "resolved": "https://registry.npmmirror.com/@types/estree/-/estree-1.0.9.tgz", "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "dev": true, "license": "MIT" }, - "node_modules/@types/estree-jsx": { - "version": "1.0.5", - "resolved": "https://registry.npmmirror.com/@types/estree-jsx/-/estree-jsx-1.0.5.tgz", - "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==", - "license": "MIT", - "dependencies": { - "@types/estree": "*" - } - }, - "node_modules/@types/hast": { - "version": "3.0.4", - "resolved": "https://registry.npmmirror.com/@types/hast/-/hast-3.0.4.tgz", - "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", - "license": "MIT", - "dependencies": { - "@types/unist": "*" - } - }, "node_modules/@types/json-schema": { "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", @@ -4081,21 +4053,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@types/mdast": { - "version": "4.0.4", - "resolved": "https://registry.npmmirror.com/@types/mdast/-/mdast-4.0.4.tgz", - "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", - "license": "MIT", - "dependencies": { - "@types/unist": "*" - } - }, - "node_modules/@types/ms": { - "version": "2.1.0", - "resolved": "https://registry.npmmirror.com/@types/ms/-/ms-2.1.0.tgz", - "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", - "license": "MIT" - }, "node_modules/@types/node": { "version": "25.6.2", "resolved": "https://registry.npmmirror.com/@types/node/-/node-25.6.2.tgz", @@ -4110,6 +4067,7 @@ "version": "19.2.14", "resolved": "https://registry.npmmirror.com/@types/react/-/react-19.2.14.tgz", "integrity": "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==", + "devOptional": true, "license": "MIT", "dependencies": { "csstype": "^3.2.2" @@ -4133,12 +4091,6 @@ "optional": true, "peer": true }, - "node_modules/@types/unist": { - "version": "3.0.3", - "resolved": "https://registry.npmmirror.com/@types/unist/-/unist-3.0.3.tgz", - "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", - "license": "MIT" - }, "node_modules/@types/use-sync-external-store": { "version": "0.0.6", "resolved": "https://registry.npmmirror.com/@types/use-sync-external-store/-/use-sync-external-store-0.0.6.tgz", @@ -4405,12 +4357,6 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/@ungap/structured-clone": { - "version": "1.3.1", - "resolved": "https://registry.npmmirror.com/@ungap/structured-clone/-/structured-clone-1.3.1.tgz", - "integrity": "sha512-mUFwbeTqrVgDQxFveS+df2yfap6iuP20NAKAsBt5jDEoOTDew+zwLAOilHCeQJOVSvmgCX4ogqIrA0mnyr08yQ==", - "license": "ISC" - }, "node_modules/@unrs/resolver-binding-android-arm-eabi": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.11.1.tgz", @@ -5200,16 +5146,6 @@ "node": ">= 0.4" } }, - "node_modules/bail": { - "version": "2.0.2", - "resolved": "https://registry.npmmirror.com/bail/-/bail-2.0.2.tgz", - "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz", @@ -5365,16 +5301,6 @@ ], "license": "CC-BY-4.0" }, - "node_modules/ccount": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/ccount/-/ccount-2.0.1.tgz", - "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/chai": { "version": "6.2.2", "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", @@ -5385,46 +5311,6 @@ "node": ">=18" } }, - "node_modules/character-entities": { - "version": "2.0.2", - "resolved": "https://registry.npmmirror.com/character-entities/-/character-entities-2.0.2.tgz", - "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/character-entities-html4": { - "version": "2.1.0", - "resolved": "https://registry.npmmirror.com/character-entities-html4/-/character-entities-html4-2.1.0.tgz", - "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/character-entities-legacy": { - "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", - "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/character-reference-invalid": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", - "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/class-variance-authority": { "version": "0.7.1", "resolved": "https://registry.npmmirror.com/class-variance-authority/-/class-variance-authority-0.7.1.tgz", @@ -5480,16 +5366,6 @@ "node": ">= 0.8" } }, - "node_modules/comma-separated-tokens": { - "version": "2.0.3", - "resolved": "https://registry.npmmirror.com/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", - "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/convert-source-map": { "version": "2.0.0", "resolved": "https://registry.npmmirror.com/convert-source-map/-/convert-source-map-2.0.0.tgz", @@ -5536,6 +5412,7 @@ "version": "3.2.3", "resolved": "https://registry.npmmirror.com/csstype/-/csstype-3.2.3.tgz", "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "devOptional": true, "license": "MIT" }, "node_modules/d3-array": { @@ -5734,6 +5611,7 @@ "version": "4.4.3", "resolved": "https://registry.npmmirror.com/debug/-/debug-4.4.3.tgz", "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -5753,19 +5631,6 @@ "integrity": "sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==", "license": "MIT" }, - "node_modules/decode-named-character-reference": { - "version": "1.3.0", - "resolved": "https://registry.npmmirror.com/decode-named-character-reference/-/decode-named-character-reference-1.3.0.tgz", - "integrity": "sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==", - "license": "MIT", - "dependencies": { - "character-entities": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmmirror.com/deep-is/-/deep-is-0.1.4.tgz", @@ -5843,19 +5708,6 @@ "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==", "license": "MIT" }, - "node_modules/devlop": { - "version": "1.1.0", - "resolved": "https://registry.npmmirror.com/devlop/-/devlop-1.1.0.tgz", - "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", - "license": "MIT", - "dependencies": { - "dequal": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/doctrine": { "version": "2.1.0", "resolved": "https://registry.npmmirror.com/doctrine/-/doctrine-2.1.0.tgz", @@ -6613,16 +6465,6 @@ "node": ">=4.0" } }, - "node_modules/estree-util-is-identifier-name": { - "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz", - "integrity": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/estree-walker": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", @@ -6659,12 +6501,6 @@ "node": ">=12.0.0" } }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmmirror.com/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "license": "MIT" - }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmmirror.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -7187,46 +7023,6 @@ "node": ">= 0.4" } }, - "node_modules/hast-util-to-jsx-runtime": { - "version": "2.3.6", - "resolved": "https://registry.npmmirror.com/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.6.tgz", - "integrity": "sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==", - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0", - "@types/hast": "^3.0.0", - "@types/unist": "^3.0.0", - "comma-separated-tokens": "^2.0.0", - "devlop": "^1.0.0", - "estree-util-is-identifier-name": "^3.0.0", - "hast-util-whitespace": "^3.0.0", - "mdast-util-mdx-expression": "^2.0.0", - "mdast-util-mdx-jsx": "^3.0.0", - "mdast-util-mdxjs-esm": "^2.0.0", - "property-information": "^7.0.0", - "space-separated-tokens": "^2.0.0", - "style-to-js": "^1.0.0", - "unist-util-position": "^5.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-whitespace": { - "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", - "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/hermes-estree": { "version": "0.25.1", "resolved": "https://registry.npmmirror.com/hermes-estree/-/hermes-estree-0.25.1.tgz", @@ -7253,16 +7049,6 @@ "void-elements": "3.1.0" } }, - "node_modules/html-url-attributes": { - "version": "3.0.1", - "resolved": "https://registry.npmmirror.com/html-url-attributes/-/html-url-attributes-3.0.1.tgz", - "integrity": "sha512-ol6UPyBWqsrO6EJySPz2O7ZSr856WDrEzM5zMqp+FJJLGMW35cLYmmZnl0vztAZxRUoNZJFTCohfjuIJ8I4QBQ==", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/i18next": { "version": "26.2.0", "resolved": "https://registry.npmjs.org/i18next/-/i18next-26.2.0.tgz", @@ -7348,12 +7134,6 @@ "node": ">=8" } }, - "node_modules/inline-style-parser": { - "version": "0.2.7", - "resolved": "https://registry.npmmirror.com/inline-style-parser/-/inline-style-parser-0.2.7.tgz", - "integrity": "sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==", - "license": "MIT" - }, "node_modules/internal-slot": { "version": "1.1.0", "resolved": "https://registry.npmmirror.com/internal-slot/-/internal-slot-1.1.0.tgz", @@ -7378,30 +7158,6 @@ "node": ">=12" } }, - "node_modules/is-alphabetical": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/is-alphabetical/-/is-alphabetical-2.0.1.tgz", - "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-alphanumerical": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", - "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", - "license": "MIT", - "dependencies": { - "is-alphabetical": "^2.0.0", - "is-decimal": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/is-array-buffer": { "version": "3.0.5", "resolved": "https://registry.npmmirror.com/is-array-buffer/-/is-array-buffer-3.0.5.tgz", @@ -7547,16 +7303,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-decimal": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/is-decimal/-/is-decimal-2.0.1.tgz", - "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmmirror.com/is-extglob/-/is-extglob-2.1.1.tgz", @@ -7616,16 +7362,6 @@ "node": ">=0.10.0" } }, - "node_modules/is-hexadecimal": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", - "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/is-map": { "version": "2.0.3", "resolved": "https://registry.npmmirror.com/is-map/-/is-map-2.0.3.tgz", @@ -7679,18 +7415,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-plain-obj": { - "version": "4.1.0", - "resolved": "https://registry.npmmirror.com/is-plain-obj/-/is-plain-obj-4.1.0.tgz", - "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/is-regex": { "version": "1.2.1", "resolved": "https://registry.npmmirror.com/is-regex/-/is-regex-1.2.1.tgz", @@ -8278,16 +8002,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/longest-streak": { - "version": "3.1.0", - "resolved": "https://registry.npmmirror.com/longest-streak/-/longest-streak-3.1.0.tgz", - "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", @@ -8341,16 +8055,6 @@ "@jridgewell/sourcemap-codec": "^1.5.5" } }, - "node_modules/markdown-table": { - "version": "3.0.4", - "resolved": "https://registry.npmmirror.com/markdown-table/-/markdown-table-3.0.4.tgz", - "integrity": "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/marked": { "version": "14.0.0", "resolved": "https://registry.npmjs.org/marked/-/marked-14.0.0.tgz", @@ -8373,947 +8077,103 @@ "node": ">= 0.4" } }, - "node_modules/mdast-util-find-and-replace": { - "version": "3.0.2", - "resolved": "https://registry.npmmirror.com/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.2.tgz", - "integrity": "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==", + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmmirror.com/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmmirror.com/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, "license": "MIT", "dependencies": { - "@types/mdast": "^4.0.0", - "escape-string-regexp": "^5.0.0", - "unist-util-is": "^6.0.0", - "unist-util-visit-parents": "^6.0.0" + "braces": "^3.0.3", + "picomatch": "^2.3.1" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "engines": { + "node": ">=8.6" } }, - "node_modules/mdast-util-find-and-replace/node_modules/escape-string-regexp": { - "version": "5.0.0", - "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "license": "MIT", "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 0.6" } }, - "node_modules/mdast-util-from-markdown": { - "version": "2.0.3", - "resolved": "https://registry.npmmirror.com/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.3.tgz", - "integrity": "sha512-W4mAWTvSlKvf8L6J+VN9yLSqQ9AOAAvHuoDAmPkz4dHf553m5gVj2ejadHJhoJmcmxEnOv6Pa8XJhpxE93kb8Q==", + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "license": "MIT", "dependencies": { - "@types/mdast": "^4.0.0", - "@types/unist": "^3.0.0", - "decode-named-character-reference": "^1.0.0", - "devlop": "^1.0.0", - "mdast-util-to-string": "^4.0.0", - "micromark": "^4.0.0", - "micromark-util-decode-numeric-character-reference": "^2.0.0", - "micromark-util-decode-string": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0", - "unist-util-stringify-position": "^4.0.0" + "mime-db": "1.52.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "engines": { + "node": ">= 0.6" } }, - "node_modules/mdast-util-gfm": { - "version": "3.1.0", - "resolved": "https://registry.npmmirror.com/mdast-util-gfm/-/mdast-util-gfm-3.1.0.tgz", - "integrity": "sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==", + "node_modules/min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true, "license": "MIT", - "dependencies": { - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-gfm-autolink-literal": "^2.0.0", - "mdast-util-gfm-footnote": "^2.0.0", - "mdast-util-gfm-strikethrough": "^2.0.0", - "mdast-util-gfm-table": "^2.0.0", - "mdast-util-gfm-task-list-item": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "engines": { + "node": ">=4" } }, - "node_modules/mdast-util-gfm-autolink-literal": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.1.tgz", - "integrity": "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==", - "license": "MIT", + "node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "dev": true, + "license": "ISC", "dependencies": { - "@types/mdast": "^4.0.0", - "ccount": "^2.0.0", - "devlop": "^1.0.0", - "mdast-util-find-and-replace": "^3.0.0", - "micromark-util-character": "^2.0.0" + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/mdast-util-gfm-footnote": { - "version": "2.1.0", - "resolved": "https://registry.npmmirror.com/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.1.0.tgz", - "integrity": "sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==", + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "devlop": "^1.1.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0" - }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/mdast-util-gfm-strikethrough": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz", - "integrity": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==", + "node_modules/monaco-editor": { + "version": "0.55.1", + "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.55.1.tgz", + "integrity": "sha512-jz4x+TJNFHwHtwuV9vA9rMujcZRb0CEilTEwG2rRSpe/A7Jdkuj8xPKttCgOh+v/lkHy7HsZ64oj+q3xoAFl9A==", "license": "MIT", + "peer": true, "dependencies": { - "@types/mdast": "^4.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm-table": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz", - "integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "devlop": "^1.0.0", - "markdown-table": "^3.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm-task-list-item": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz", - "integrity": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "devlop": "^1.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-mdx-expression": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.1.tgz", - "integrity": "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==", - "license": "MIT", - "dependencies": { - "@types/estree-jsx": "^1.0.0", - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "devlop": "^1.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-mdx-jsx": { - "version": "3.2.0", - "resolved": "https://registry.npmmirror.com/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.2.0.tgz", - "integrity": "sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==", - "license": "MIT", - "dependencies": { - "@types/estree-jsx": "^1.0.0", - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "@types/unist": "^3.0.0", - "ccount": "^2.0.0", - "devlop": "^1.1.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0", - "parse-entities": "^4.0.0", - "stringify-entities": "^4.0.0", - "unist-util-stringify-position": "^4.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-mdxjs-esm": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz", - "integrity": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==", - "license": "MIT", - "dependencies": { - "@types/estree-jsx": "^1.0.0", - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "devlop": "^1.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-phrasing": { - "version": "4.1.0", - "resolved": "https://registry.npmmirror.com/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", - "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "unist-util-is": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-to-hast": { - "version": "13.2.1", - "resolved": "https://registry.npmmirror.com/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz", - "integrity": "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "@ungap/structured-clone": "^1.0.0", - "devlop": "^1.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "trim-lines": "^3.0.0", - "unist-util-position": "^5.0.0", - "unist-util-visit": "^5.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-to-markdown": { - "version": "2.1.2", - "resolved": "https://registry.npmmirror.com/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz", - "integrity": "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "@types/unist": "^3.0.0", - "longest-streak": "^3.0.0", - "mdast-util-phrasing": "^4.0.0", - "mdast-util-to-string": "^4.0.0", - "micromark-util-classify-character": "^2.0.0", - "micromark-util-decode-string": "^2.0.0", - "unist-util-visit": "^5.0.0", - "zwitch": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-to-string": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", - "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmmirror.com/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromark": { - "version": "4.0.2", - "resolved": "https://registry.npmmirror.com/micromark/-/micromark-4.0.2.tgz", - "integrity": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "@types/debug": "^4.0.0", - "debug": "^4.0.0", - "decode-named-character-reference": "^1.0.0", - "devlop": "^1.0.0", - "micromark-core-commonmark": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-combine-extensions": "^2.0.0", - "micromark-util-decode-numeric-character-reference": "^2.0.0", - "micromark-util-encode": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-resolve-all": "^2.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "micromark-util-subtokenize": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-core-commonmark": { - "version": "2.0.3", - "resolved": "https://registry.npmmirror.com/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz", - "integrity": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "decode-named-character-reference": "^1.0.0", - "devlop": "^1.0.0", - "micromark-factory-destination": "^2.0.0", - "micromark-factory-label": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-factory-title": "^2.0.0", - "micromark-factory-whitespace": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-classify-character": "^2.0.0", - "micromark-util-html-tag-name": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-resolve-all": "^2.0.0", - "micromark-util-subtokenize": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-extension-gfm": { - "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz", - "integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==", - "license": "MIT", - "dependencies": { - "micromark-extension-gfm-autolink-literal": "^2.0.0", - "micromark-extension-gfm-footnote": "^2.0.0", - "micromark-extension-gfm-strikethrough": "^2.0.0", - "micromark-extension-gfm-table": "^2.0.0", - "micromark-extension-gfm-tagfilter": "^2.0.0", - "micromark-extension-gfm-task-list-item": "^2.0.0", - "micromark-util-combine-extensions": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-autolink-literal": { - "version": "2.1.0", - "resolved": "https://registry.npmmirror.com/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz", - "integrity": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==", - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-footnote": { - "version": "2.1.0", - "resolved": "https://registry.npmmirror.com/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz", - "integrity": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==", - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-core-commonmark": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-strikethrough": { - "version": "2.1.0", - "resolved": "https://registry.npmmirror.com/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz", - "integrity": "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==", - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-classify-character": "^2.0.0", - "micromark-util-resolve-all": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-table": { - "version": "2.1.1", - "resolved": "https://registry.npmmirror.com/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.1.tgz", - "integrity": "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==", - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-tagfilter": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz", - "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==", - "license": "MIT", - "dependencies": { - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-task-list-item": { - "version": "2.1.0", - "resolved": "https://registry.npmmirror.com/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz", - "integrity": "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==", - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-factory-destination": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", - "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-label": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz", - "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-space": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", - "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-title": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz", - "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-whitespace": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz", - "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-character": { - "version": "2.1.1", - "resolved": "https://registry.npmmirror.com/micromark-util-character/-/micromark-util-character-2.1.1.tgz", - "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-chunked": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz", - "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-classify-character": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz", - "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-combine-extensions": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz", - "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-chunked": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-decode-numeric-character-reference": { - "version": "2.0.2", - "resolved": "https://registry.npmmirror.com/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz", - "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-decode-string": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz", - "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "decode-named-character-reference": "^1.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-decode-numeric-character-reference": "^2.0.0", - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-encode": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", - "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-util-html-tag-name": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", - "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-util-normalize-identifier": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz", - "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-resolve-all": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz", - "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-sanitize-uri": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", - "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-encode": "^2.0.0", - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-subtokenize": { - "version": "2.1.0", - "resolved": "https://registry.npmmirror.com/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz", - "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-symbol": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-util-types": { - "version": "2.0.2", - "resolved": "https://registry.npmmirror.com/micromark-util-types/-/micromark-util-types-2.0.2.tgz", - "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmmirror.com/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "dev": true, - "license": "MIT", - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/min-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmmirror.com/min-indent/-/min-indent-1.0.1.tgz", - "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/minimatch": { - "version": "9.0.9", - "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-9.0.9.tgz", - "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.2" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/monaco-editor": { - "version": "0.55.1", - "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.55.1.tgz", - "integrity": "sha512-jz4x+TJNFHwHtwuV9vA9rMujcZRb0CEilTEwG2rRSpe/A7Jdkuj8xPKttCgOh+v/lkHy7HsZ64oj+q3xoAFl9A==", - "license": "MIT", - "peer": true, - "dependencies": { - "dompurify": "3.2.7", - "marked": "14.0.0" + "dompurify": "3.2.7", + "marked": "14.0.0" } }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, "license": "MIT" }, "node_modules/nanoid": { @@ -9661,31 +8521,6 @@ "node": ">=6" } }, - "node_modules/parse-entities": { - "version": "4.0.2", - "resolved": "https://registry.npmmirror.com/parse-entities/-/parse-entities-4.0.2.tgz", - "integrity": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==", - "license": "MIT", - "dependencies": { - "@types/unist": "^2.0.0", - "character-entities-legacy": "^3.0.0", - "character-reference-invalid": "^2.0.0", - "decode-named-character-reference": "^1.0.0", - "is-alphanumerical": "^2.0.0", - "is-decimal": "^2.0.0", - "is-hexadecimal": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/parse-entities/node_modules/@types/unist": { - "version": "2.0.11", - "resolved": "https://registry.npmmirror.com/@types/unist/-/unist-2.0.11.tgz", - "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", - "license": "MIT" - }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmmirror.com/path-exists/-/path-exists-4.0.0.tgz", @@ -9851,16 +8686,6 @@ "dev": true, "license": "MIT" }, - "node_modules/property-information": { - "version": "7.1.0", - "resolved": "https://registry.npmmirror.com/property-information/-/property-information-7.1.0.tgz", - "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/proxy-from-env": { "version": "2.1.0", "resolved": "https://registry.npmmirror.com/proxy-from-env/-/proxy-from-env-2.1.0.tgz", @@ -9991,33 +8816,6 @@ "integrity": "sha512-XjBR15BhXuylgWGuslhDKqlSayuqvqBX91BP8pauG8kd1zY8kotkNWbXksTCNRarse4kuGbe2kIY05ARtwNIvw==", "license": "MIT" }, - "node_modules/react-markdown": { - "version": "10.1.0", - "resolved": "https://registry.npmmirror.com/react-markdown/-/react-markdown-10.1.0.tgz", - "integrity": "sha512-qKxVopLT/TyA6BX3Ue5NwabOsAzm0Q7kAPwq6L+wWDwisYs7R8vZ0nRXqq6rkueboxpkjvLGU9fWifiX/ZZFxQ==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "devlop": "^1.0.0", - "hast-util-to-jsx-runtime": "^2.0.0", - "html-url-attributes": "^3.0.0", - "mdast-util-to-hast": "^13.0.0", - "remark-parse": "^11.0.0", - "remark-rehype": "^11.0.0", - "unified": "^11.0.0", - "unist-util-visit": "^5.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - }, - "peerDependencies": { - "@types/react": ">=18", - "react": ">=18" - } - }, "node_modules/react-redux": { "version": "9.2.0", "resolved": "https://registry.npmmirror.com/react-redux/-/react-redux-9.2.0.tgz", @@ -10213,72 +9011,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/remark-gfm": { - "version": "4.0.1", - "resolved": "https://registry.npmmirror.com/remark-gfm/-/remark-gfm-4.0.1.tgz", - "integrity": "sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "mdast-util-gfm": "^3.0.0", - "micromark-extension-gfm": "^3.0.0", - "remark-parse": "^11.0.0", - "remark-stringify": "^11.0.0", - "unified": "^11.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-parse": { - "version": "11.0.0", - "resolved": "https://registry.npmmirror.com/remark-parse/-/remark-parse-11.0.0.tgz", - "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "mdast-util-from-markdown": "^2.0.0", - "micromark-util-types": "^2.0.0", - "unified": "^11.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-rehype": { - "version": "11.1.2", - "resolved": "https://registry.npmmirror.com/remark-rehype/-/remark-rehype-11.1.2.tgz", - "integrity": "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "mdast-util-to-hast": "^13.0.0", - "unified": "^11.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-stringify": { - "version": "11.0.0", - "resolved": "https://registry.npmmirror.com/remark-stringify/-/remark-stringify-11.0.0.tgz", - "integrity": "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "mdast-util-to-markdown": "^2.0.0", - "unified": "^11.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/reselect": { "version": "5.1.1", "resolved": "https://registry.npmmirror.com/reselect/-/reselect-5.1.1.tgz", @@ -10688,16 +9420,6 @@ "node": ">=0.10.0" } }, - "node_modules/space-separated-tokens": { - "version": "2.0.2", - "resolved": "https://registry.npmmirror.com/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", - "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/stable-hash": { "version": "0.0.5", "resolved": "https://registry.npmjs.org/stable-hash/-/stable-hash-0.0.5.tgz", @@ -10852,20 +9574,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/stringify-entities": { - "version": "4.0.4", - "resolved": "https://registry.npmmirror.com/stringify-entities/-/stringify-entities-4.0.4.tgz", - "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", - "license": "MIT", - "dependencies": { - "character-entities-html4": "^2.0.0", - "character-entities-legacy": "^3.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", @@ -10902,24 +9610,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/style-to-js": { - "version": "1.1.21", - "resolved": "https://registry.npmmirror.com/style-to-js/-/style-to-js-1.1.21.tgz", - "integrity": "sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ==", - "license": "MIT", - "dependencies": { - "style-to-object": "1.0.14" - } - }, - "node_modules/style-to-object": { - "version": "1.0.14", - "resolved": "https://registry.npmmirror.com/style-to-object/-/style-to-object-1.0.14.tgz", - "integrity": "sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw==", - "license": "MIT", - "dependencies": { - "inline-style-parser": "0.2.7" - } - }, "node_modules/styled-jsx": { "version": "5.1.6", "resolved": "https://registry.npmmirror.com/styled-jsx/-/styled-jsx-5.1.6.tgz", @@ -11071,26 +9761,6 @@ "node": ">=8.0" } }, - "node_modules/trim-lines": { - "version": "3.0.1", - "resolved": "https://registry.npmmirror.com/trim-lines/-/trim-lines-3.0.1.tgz", - "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/trough": { - "version": "2.2.0", - "resolved": "https://registry.npmmirror.com/trough/-/trough-2.2.0.tgz", - "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/ts-api-utils": { "version": "2.5.0", "resolved": "https://registry.npmmirror.com/ts-api-utils/-/ts-api-utils-2.5.0.tgz", @@ -11291,93 +9961,6 @@ "dev": true, "license": "MIT" }, - "node_modules/unified": { - "version": "11.0.5", - "resolved": "https://registry.npmmirror.com/unified/-/unified-11.0.5.tgz", - "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "bail": "^2.0.0", - "devlop": "^1.0.0", - "extend": "^3.0.0", - "is-plain-obj": "^4.0.0", - "trough": "^2.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-is": { - "version": "6.0.1", - "resolved": "https://registry.npmmirror.com/unist-util-is/-/unist-util-is-6.0.1.tgz", - "integrity": "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-position": { - "version": "5.0.0", - "resolved": "https://registry.npmmirror.com/unist-util-position/-/unist-util-position-5.0.0.tgz", - "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-stringify-position": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", - "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-visit": { - "version": "5.1.0", - "resolved": "https://registry.npmmirror.com/unist-util-visit/-/unist-util-visit-5.1.0.tgz", - "integrity": "sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-is": "^6.0.0", - "unist-util-visit-parents": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-visit-parents": { - "version": "6.0.2", - "resolved": "https://registry.npmmirror.com/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz", - "integrity": "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-is": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/unrs-resolver": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.11.1.tgz", @@ -11526,34 +10109,6 @@ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc" } }, - "node_modules/vfile": { - "version": "6.0.3", - "resolved": "https://registry.npmmirror.com/vfile/-/vfile-6.0.3.tgz", - "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/vfile-message": { - "version": "4.0.3", - "resolved": "https://registry.npmmirror.com/vfile-message/-/vfile-message-4.0.3.tgz", - "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-stringify-position": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/victory-vendor": { "version": "37.3.6", "resolved": "https://registry.npmmirror.com/victory-vendor/-/victory-vendor-37.3.6.tgz", @@ -11958,16 +10513,6 @@ "peerDependencies": { "zod": "^3.25.0 || ^4.0.0" } - }, - "node_modules/zwitch": { - "version": "2.0.4", - "resolved": "https://registry.npmmirror.com/zwitch/-/zwitch-2.0.4.tgz", - "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } } } } diff --git a/backend/admin/package.json b/backend/admin/package.json index b42ed02e..802cd2e3 100644 --- a/backend/admin/package.json +++ b/backend/admin/package.json @@ -1,6 +1,6 @@ { "name": "admin-dashboard", - "version": "0.1.6", + "version": "0.1.7", "private": true, "scripts": { "dev": "next dev -p 3888", @@ -43,9 +43,7 @@ "react-hook-form": "^7.76.0", "react-i18next": "^17.0.8", "react-is": "^19.2.0", - "react-markdown": "^10.1.0", "recharts": "^3.7.0", - "remark-gfm": "^4.0.1", "swr": "^2.4.0", "tailwind-merge": "^3.5.0", "tailwindcss-animate": "^1.0.7", @@ -87,9 +85,9 @@ "prismjs": "^1.30.0" }, "optionalDependencies": { - "lightningcss-linux-x64-musl": "^1.30.1", - "lightningcss-linux-x64-gnu": "^1.30.1", + "lightningcss-linux-arm64-gnu": "^1.30.1", "lightningcss-linux-arm64-musl": "^1.30.1", - "lightningcss-linux-arm64-gnu": "^1.30.1" + "lightningcss-linux-x64-gnu": "^1.30.1", + "lightningcss-linux-x64-musl": "^1.30.1" } } diff --git a/backend/admin/src/app/admin/agents/[id]/page.tsx b/backend/admin/src/app/admin/agents/[id]/page.tsx index 711f2e05..6aa3948b 100644 --- a/backend/admin/src/app/admin/agents/[id]/page.tsx +++ b/backend/admin/src/app/admin/agents/[id]/page.tsx @@ -8,15 +8,8 @@ import AgentForm from '@/components/admin/agents/AgentForm'; import { useAgent, useCreateAgent, useUpdateAgent } from '@/hooks/useAgents'; import { Agent } from '@/types'; import { formatApiError } from '@/lib/api-utils'; -import dynamic from 'next/dynamic'; import { Button } from '@/components/ui/button'; import { useToast } from '@/components/ui/use-toast'; -import { ScrollArea } from '@/components/ui/scroll-area'; - -const ChatInterface = dynamic(() => import('@/components/admin/agents/ChatInterface'), { - loading: () =>
Loading...
, - ssr: false -}); export default function AgentDetailPage() { const router = useRouter(); @@ -29,8 +22,7 @@ export default function AgentDetailPage() { const { createAgent } = useCreateAgent(); const { updateAgent } = useUpdateAgent(); const { toast } = useToast(); - - const [formInstance, setFormInstance] = useState(null); + const [saving, setSaving] = useState(false); const handleSubmit = async (values: Partial) => { @@ -72,39 +64,24 @@ export default function AgentDetailPage() { ); } - // New agent layout - if (isNew) { - return ( -
-
router.push('/admin/agents')} /> -
-
-
- -
-
-
-
- ); - } - - // Edit agent layout + // 创建 / 编辑共用同一套布局(编辑页与创建页对齐:单栏居中 + 双列表单) return (
-
router.push('/admin/agents')} /> -
- {/* Left: Configuration */} -
- -
- -
-
-
- {/* Right: Chat Preview */} -
-
- +
router.push('/admin/agents')} + /> +
+
+
+
diff --git a/backend/admin/src/components/admin/agents/AgentForm/Tools/ToolCapabilities.tsx b/backend/admin/src/components/admin/agents/AgentForm/Tools/ToolCapabilities.tsx index 6839bc14..36fe6913 100644 --- a/backend/admin/src/components/admin/agents/AgentForm/Tools/ToolCapabilities.tsx +++ b/backend/admin/src/components/admin/agents/AgentForm/Tools/ToolCapabilities.tsx @@ -9,19 +9,28 @@ import { } from '@/components/ui/form'; import { Switch } from '@/components/ui/switch'; import { Badge } from '@/components/ui/badge'; -import { FileText, Image, Video, Table2, Paintbrush, LayoutGrid, AlertCircle, Film } from 'lucide-react'; +import { FileText, Image, Video, Table2, Paintbrush, LayoutGrid, AlertCircle, Film, Headphones, Mic, Globe } from 'lucide-react'; import { useToolConfig } from '@/hooks/useToolRegistry'; -// 画布节点类型选项 +// 画布节点类型选项(与后端 NODE_TYPE_SCHEMA / 前端 Sidebar 的 7 种规范类型对齐) const NODE_TYPE_OPTIONS = [ - { value: 'script', labelKey: 'agents.form.tools.capabilities.nodeTypes.script', descKey: 'agents.form.tools.capabilities.nodeTypes.scriptDesc', icon: FileText }, - { value: 'character', labelKey: 'agents.form.tools.capabilities.nodeTypes.character', descKey: 'agents.form.tools.capabilities.nodeTypes.characterDesc', icon: Image }, + { value: 'text', labelKey: 'agents.form.tools.capabilities.nodeTypes.text', descKey: 'agents.form.tools.capabilities.nodeTypes.textDesc', icon: FileText }, + { value: 'image', labelKey: 'agents.form.tools.capabilities.nodeTypes.image', descKey: 'agents.form.tools.capabilities.nodeTypes.imageDesc', icon: Image }, { value: 'video', labelKey: 'agents.form.tools.capabilities.nodeTypes.video', descKey: 'agents.form.tools.capabilities.nodeTypes.videoDesc', icon: Video }, + { value: 'audio', labelKey: 'agents.form.tools.capabilities.nodeTypes.audio', descKey: 'agents.form.tools.capabilities.nodeTypes.audioDesc', icon: Headphones }, + { value: 'tts', labelKey: 'agents.form.tools.capabilities.nodeTypes.tts', descKey: 'agents.form.tools.capabilities.nodeTypes.ttsDesc', icon: Mic }, { value: 'storyboard', labelKey: 'agents.form.tools.capabilities.nodeTypes.storyboard', descKey: 'agents.form.tools.capabilities.nodeTypes.storyboardDesc', icon: Table2 }, + { value: 'panorama', labelKey: 'agents.form.tools.capabilities.nodeTypes.panorama', descKey: 'agents.form.tools.capabilities.nodeTypes.panoramaDesc', icon: Globe }, ] as const; const ALL_NODE_TYPES = NODE_TYPE_OPTIONS.map(o => o.value); +// 兼容存量智能体配置里的 legacy 节点类型名(与后端 _migrate_node_type 一致): +// 读取/展示时归一为规范名,交互后回写的也是规范名。 +const LEGACY_NODE_TYPE_ALIAS: Record = { script: 'text', character: 'image' }; +const canonicalNodeTypes = (types: string[] | undefined): string[] => + (types || []).map((v) => LEGACY_NODE_TYPE_ALIAS[v] ?? v); + interface ToolCapabilitiesProps { disabled?: boolean; } @@ -179,15 +188,15 @@ const ToolCapabilities: React.FC = ({ disabled }) => {
{NODE_TYPE_OPTIONS.map((option) => { const Icon = option.icon; - const isSelected = field.value?.includes(option.value); + const selected = canonicalNodeTypes(field.value); + const isSelected = selected.includes(option.value); return (
{ - const current: string[] = field.value || []; const updated = isSelected - ? current.filter((v) => v !== option.value) - : [...current, option.value]; + ? selected.filter((v) => v !== option.value) + : [...selected, option.value]; field.onChange(updated); }} className={`flex items-center gap-2 p-2.5 rounded-md border cursor-pointer transition-all ${ diff --git a/backend/admin/src/components/admin/agents/AgentForm/index.tsx b/backend/admin/src/components/admin/agents/AgentForm/index.tsx index aeedf437..9e6136ba 100644 --- a/backend/admin/src/components/admin/agents/AgentForm/index.tsx +++ b/backend/admin/src/components/admin/agents/AgentForm/index.tsx @@ -175,7 +175,10 @@ export default function AgentForm({ thinking_mode: Boolean(initialValues.thinking_mode), tools_enabled: hasTools || hasImageGen || hasVideoGen || hasCanvas, tools: initialValues.tools || [], - target_node_types: (initialValues.target_node_types || []) as ("script" | "character" | "storyboard" | "video")[], + // legacy 节点类型名归一为规范名(script→text、character→image),使表单从干净数据起步 + target_node_types: (initialValues.target_node_types || []).map((v) => + v === 'script' ? 'text' : v === 'character' ? 'image' : v + ) as ("text" | "image" | "video" | "audio" | "tts" | "storyboard" | "panorama")[], is_leader: Boolean(initialValues.is_leader), coordination_modes: initialValues.coordination_modes || [], member_agent_ids: initialValues.member_agent_ids || [], diff --git a/backend/admin/src/components/admin/agents/AgentForm/schema.ts b/backend/admin/src/components/admin/agents/AgentForm/schema.ts index eb065455..571cc6ca 100644 --- a/backend/admin/src/components/admin/agents/AgentForm/schema.ts +++ b/backend/admin/src/components/admin/agents/AgentForm/schema.ts @@ -67,9 +67,9 @@ export const createAgentFormSchema = (t: TFunction) => z.object({ thinking_mode: z.boolean().optional(), tools_enabled: z.boolean().optional(), tools: z.array(z.string()).optional(), - // 画布节点控制 + // 画布节点控制:7 种规范类型 + 兼容存量 legacy 名(script/character,后端 _migrate_node_type 会归一) target_node_types: z.array( - z.enum(["script", "character", "storyboard", "video"]) + z.enum(["text", "image", "video", "audio", "tts", "storyboard", "panorama", "script", "character"]) ).default([]), // Leader configuration is_leader: z.boolean().optional().default(false), diff --git a/backend/admin/src/components/admin/agents/ChatInterface.tsx b/backend/admin/src/components/admin/agents/ChatInterface.tsx deleted file mode 100644 index 257716dc..00000000 --- a/backend/admin/src/components/admin/agents/ChatInterface.tsx +++ /dev/null @@ -1,712 +0,0 @@ - 'use client'; - -import React, { useState, useEffect, useRef, useCallback } from 'react'; -import { useTranslation } from 'react-i18next'; -import { Send, Plus, Trash2, Bot, User, MoreHorizontal, Loader2, MessageSquare, ChevronDown, ImagePlus, X, Zap, Terminal } from 'lucide-react'; -import useSWR, { mutate } from 'swr'; -import api, { tokenRefresher } from '@/lib/axios'; -import { ADMIN_TOKEN_KEY } from '@/lib/authStorage'; -import { fetcher } from '@/lib/api-utils'; -import ReactMarkdown from 'react-markdown'; -import remarkGfm from 'remark-gfm'; -import { Button } from '@/components/ui/button'; -import { Textarea } from '@/components/ui/textarea'; -import { ScrollArea } from '@/components/ui/scroll-area'; -import { Avatar, AvatarFallback } from '@/components/ui/avatar'; -import { useToast } from '@/components/ui/use-toast'; -import { - DropdownMenu, - DropdownMenuContent, - DropdownMenuItem, - DropdownMenuTrigger, -} from "@/components/ui/dropdown-menu"; -import { cn } from '@/lib/utils'; -import MultiAgentSteps, { type AgentStep, type MultiAgentData } from './MultiAgentSteps'; - -interface ChatInterfaceProps { - agentId: string; -} - -interface ChatSession { - id: string; - title: string; - agent_id: string; - created_at: string; - updated_at: string; -} - -interface SkillCall { - skill_name: string; - status: 'loading' | 'loaded'; -} - -interface ToolCall { - tool_name: string; - arguments?: Record; - status: 'executing' | 'completed'; -} - -interface ChatMessage { - id?: string; - role: 'user' | 'assistant' | 'system'; - content: string | Array<{type: string; text?: string; image_url?: {url: string}}>; - created_at?: string; - skill_calls?: SkillCall[]; - tool_calls?: ToolCall[]; - multi_agent?: MultiAgentData; -} - -// 图片附件类型 -interface ImageAttachment { - id: string; - dataUrl: string; - name: string; -} - -// 提取助手消息中的图片URL -function extractImageUrl(content: string): string | null { - const match = content.match(/!\[image\]\((\/api\/media\/[^)]+)\)/); - return match ? match[1] : null; -} - -export default function ChatInterface({ agentId }: ChatInterfaceProps) { - const { t } = useTranslation(); - const [selectedSessionId, setSelectedSessionId] = useState(null); - const [messages, setMessages] = useState([]); - const [inputValue, setInputValue] = useState(''); - const [isStreaming, setIsStreaming] = useState(false); - const [images, setImages] = useState([]); - const [editImageUrl, setEditImageUrl] = useState(null); - const messagesEndRef = useRef(null); - const fileInputRef = useRef(null); - const textareaRef = useRef(null); - const { toast } = useToast(); - - // 使用新的管理员调试API,与普通用户会话隔离 - const { data: sessions, isLoading: sessionsLoading } = useSWR( - agentId ? `/admin/debug/sessions?agent_id=${agentId}` : null, - fetcher - ); - - // Auto select first session - useEffect(() => { - if (sessions && sessions.length > 0 && !selectedSessionId) { - setSelectedSessionId(sessions[0].id); - } - }, [sessions]); - - // Fetch messages from admin debug API - useEffect(() => { - if (selectedSessionId) { - setMessages([]); - api.get(`/admin/debug/sessions/${selectedSessionId}/messages`) - .then(res => setMessages(res.data)) - .catch(err => toast({ variant: "destructive", title: t('agents.chat.loadFailed') })); - } - }, [selectedSessionId]); - - // Scroll to bottom - useEffect(() => { - messagesEndRef.current?.scrollIntoView({ behavior: "smooth" }); - }, [messages, isStreaming]); - - // Auto-resize textarea - useEffect(() => { - const textarea = textareaRef.current; - if (textarea) { - textarea.style.height = 'auto'; - const newHeight = Math.min(textarea.scrollHeight, 280); - textarea.style.height = `${newHeight}px`; - - if (textarea.scrollHeight > 280) { - textarea.style.overflowY = 'auto'; - } else { - textarea.style.overflowY = 'hidden'; - } - } - }, [inputValue]); - - const handleCreateSession = async () => { - if (!agentId) return; - try { - const res = await api.post('/admin/debug/sessions', { - title: `Debug ${new Date().toLocaleTimeString([], {hour: '2-digit', minute:'2-digit'})}`, - agent_id: agentId - }); - mutate(`/admin/debug/sessions?agent_id=${agentId}`); - setSelectedSessionId(res.data.id); - } catch (err) { - toast({ variant: "destructive", title: t('agents.chat.createFailed') }); - } - }; - - const handleDeleteSession = async (e: React.MouseEvent, id: string) => { - e.stopPropagation(); - try { - await api.delete(`/admin/debug/sessions/${id}`); - mutate(`/admin/debug/sessions?agent_id=${agentId}`); - if (selectedSessionId === id) { - setSelectedSessionId(null); - setMessages([]); - } - } catch (err) { - toast({ variant: "destructive", title: t('agents.chat.deleteFailed') }); - } - }; - - // 图片上传处理 - const handleImageUpload = (e: React.ChangeEvent) => { - const files = e.target.files; - if (!files) return; - - Array.from(files).forEach(file => { - const reader = new FileReader(); - reader.onload = (ev) => { - const dataUrl = ev.target?.result as string; - dataUrl && setImages(prev => [...prev, { - id: `${Date.now()}-${Math.random().toString(36).slice(2)}`, - dataUrl, - name: file.name - }]); - }; - reader.readAsDataURL(file); - }); - - // 清空 input 以便重复选择同一文件 - e.target.value = ''; - }; - - const removeImage = (id: string) => setImages(prev => prev.filter(img => img.id !== id)); - - const handleSendMessage = async () => { - if ((!inputValue.trim() && images.length === 0) || !selectedSessionId || isStreaming) return; - - // 构建消息内容:纯文本或多模态 - let content: string | Array<{type: string; text?: string; image_url?: {url: string}}>; - - if (editImageUrl) { - // 编辑模式:注入指定图片 + 用户文本 - content = [ - { type: 'image_url' as const, image_url: { url: editImageUrl } }, - ...(inputValue.trim() ? [{ type: 'text' as const, text: inputValue }] : []) - ]; - } else if (images.length > 0) { - // 上传图片模式 - content = [ - ...images.map(img => ({ type: 'image_url' as const, image_url: { url: img.dataUrl } })), - ...(inputValue.trim() ? [{ type: 'text' as const, text: inputValue }] : []) - ]; - } else { - // 纯文本模式 - content = inputValue; - } - - const userMsg: ChatMessage = { role: 'user', content }; - setMessages(prev => [...prev, userMsg]); - setInputValue(''); - setImages([]); - setEditImageUrl(null); - setIsStreaming(true); - - try { - const baseURL = api.defaults.baseURL || '/api'; - - // 使用管理员调试API发送消息 - const doFetch = (authToken: string | null) => fetch(`${baseURL}/admin/debug/sessions/${selectedSessionId}/messages`, { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - 'Authorization': authToken ? `Bearer ${authToken}` : '', - }, - body: JSON.stringify({ - role: 'user', - content: userMsg.content, - edit_last_image: false // 前端已直接注入图片,后端无需再处理 - }) - }); - - let response = await doFetch(localStorage.getItem(ADMIN_TOKEN_KEY)); - - // Token expired → 通过跨页签协调器刷新,避免并发拉黑 - if (response.status === 401) { - const result = await tokenRefresher.refresh(); - response = result.ok ? await doFetch(result.accessToken) : response; - } - - if (!response.ok) throw new Error(response.statusText); - if (!response.body) return; - - const reader = response.body.getReader(); - const decoder = new TextDecoder(); - let assistantMsg: ChatMessage = { role: 'assistant', content: '' }; - const isSSE = response.headers.get('content-type')?.includes('text/event-stream'); - - setMessages(prev => [...prev, assistantMsg]); - - // SSE state - const stepMap = new Map(); - const steps: AgentStep[] = []; - const skillCalls: SkillCall[] = []; - const toolCalls: ToolCall[] = []; - let multiAgent: MultiAgentData | null = null; - let sseBuffer = ''; - - while (true) { - const { done, value } = await reader.read(); - if (done) break; - - const chunk = decoder.decode(value, { stream: true }); - - // Unified SSE parsing - if (isSSE) { - sseBuffer += chunk; - const blocks = sseBuffer.split('\n\n'); - sseBuffer = blocks.pop() || ''; - - for (const block of blocks) { - const lines = block.split('\n'); - let eventType = ''; - let dataStr = ''; - for (const line of lines) { - const eventMatch = line.match(/^event:\s*(.+)/); - const dataMatch = line.match(/^data:\s*(.+)/); - eventType = eventMatch ? eventMatch[1] : eventType; - dataStr = dataMatch ? dataMatch[1] : dataStr; - } - try { - const data = JSON.parse(dataStr); - const handlers: Record void> = { - // Single agent events - text: () => { - assistantMsg.content = (assistantMsg.content as string) + (data.chunk || ''); - }, - skill_call: () => { - skillCalls.push({ skill_name: data.skill_name, status: 'loading' }); - assistantMsg.skill_calls = [...skillCalls]; - }, - skill_loaded: () => { - const sc = skillCalls.find(s => s.skill_name === data.skill_name); - sc && (sc.status = 'loaded'); - assistantMsg.skill_calls = [...skillCalls]; - }, - tool_call: () => { - toolCalls.push({ tool_name: data.tool_name, arguments: data.arguments, status: 'executing' }); - assistantMsg.tool_calls = [...toolCalls]; - }, - tool_result: () => { - const tc = toolCalls.find(t => t.tool_name === data.tool_name && t.status === 'executing'); - tc && (tc.status = 'completed'); - assistantMsg.tool_calls = [...toolCalls]; - }, - done: () => {}, - error: () => { - assistantMsg.content = (assistantMsg.content as string) + `\n\nError: ${data.message}`; - }, - // Multi agent events - task_analyzed: () => { - // No-op: simple tasks flow into text events; complex tasks flow into subtask_created - }, - subtask_created: () => { - multiAgent = multiAgent || { steps, finalResult: '', totalTokens: { input: 0, output: 0 }, creditCost: 0 }; - const step: AgentStep = { - subtask_id: data.subtask_id, - agent_name: data.agent || '', - description: data.description || '', - status: 'pending', - }; - stepMap.set(data.subtask_id, step); - steps.push(step); - assistantMsg.content = t('agents.chat.collaboratingWithAgents', { count: steps.length }); - }, - subtask_started: () => { - const step = stepMap.get(data.subtask_id); - step && (step.status = 'running', step.result = ''); - assistantMsg.content = t('agents.chat.collaboratingAgentGenerating', { name: data.agent_name || '' }); - }, - subtask_chunk: () => { - const step = stepMap.get(data.subtask_id); - step && (step.result = (step.result || '') + (data.chunk || '')); - }, - subtask_completed: () => { - const step = stepMap.get(data.subtask_id); - const target: AgentStep = step || { subtask_id: data.subtask_id, agent_name: data.agent_name || '', description: data.description || '', status: 'completed' }; - target.status = 'completed'; - target.result = data.result; - target.tokens = data.tokens; - target.agent_name = data.agent_name || target.agent_name; - target.description = data.description || target.description; - const completed = steps.filter(s => s.status === 'completed').length; - assistantMsg.content = t('agents.chat.collaboratingProgress', { completed, total: steps.length }); - }, - subtask_failed: () => { - const step = stepMap.get(data.subtask_id); - step && (step.status = 'failed', step.error = data.error); - }, - task_completed: () => { - multiAgent && ( - multiAgent.finalResult = data.result || '', - multiAgent.totalTokens = { input: data.total_input_tokens || 0, output: data.total_output_tokens || 0 }, - multiAgent.creditCost = data.total_credit_cost || 0, - assistantMsg.multi_agent = { ...multiAgent, steps: [...steps] } - ); - assistantMsg.content = data.result || assistantMsg.content; - }, - task_failed: () => { - assistantMsg.content = `[Error] ${data.error}`; - }, - }; - handlers[eventType]?.(); - } catch {} - } - } else { - // Fallback: plain text mode (non-SSE response) - assistantMsg.content = (assistantMsg.content as string) + chunk; - } - - setMessages(prev => { - const updated = { ...assistantMsg }; - multiAgent && (updated.multi_agent = { ...multiAgent, steps: steps.map(s => ({ ...s })) }); - skillCalls.length && (updated.skill_calls = skillCalls.map(s => ({ ...s }))); - toolCalls.length && (updated.tool_calls = toolCalls.map(t => ({ ...t }))); - const newMsgs = [...prev]; - newMsgs[newMsgs.length - 1] = updated; - return newMsgs; - }); - } - - mutate(`/chats/?agent_id=${agentId}`); - - } catch (err) { - console.error(err); - setMessages(prev => [...prev, { role: 'system', content: 'Error: Failed to get response.' }]); - } finally { - setIsStreaming(false); - } - }; - - const handleKeyDown = (e: React.KeyboardEvent) => { - if (e.key === 'Enter' && !e.shiftKey) { - e.preventDefault(); - handleSendMessage(); - } - }; - - return ( -
- {/* Header */} -
-
- - {t('agents.chat.preview')} -
-
- - - - - - {sessionsLoading &&
{t('agents.header.loading')}
} - {sessions?.map((item: ChatSession) => ( - setSelectedSessionId(item.id)} - className="justify-between text-xs cursor-pointer group" - > - {item.title} -
{ - e.stopPropagation(); - handleDeleteSession(e, item.id); - }} - > - -
-
- ))} - {(!sessions || sessions.length === 0) && ( -
{t('agents.chat.noHistory')}
- )} -
-
- - -
-
- - {/* Main Content */} -
- {selectedSessionId ? ( - <> - -
- {messages.length === 0 && ( -
- -

{t('agents.chat.startNew')}

-
- )} - {messages.map((msg, index) => ( -
- {msg.role === 'assistant' && ( - - - - )} - -
- {msg.role === 'assistant' ? ( - msg.multi_agent ? ( - - ) : (() => { - const text = typeof msg.content === 'string' ? msg.content : ''; - return ( -
- {/* Skill call indicators */} - {msg.skill_calls?.map((sc, i) => ( -
- {sc.status === 'loading' - ? - : } - - {sc.status === 'loading' ? t('agents.chat.skill.loading', { name: sc.skill_name }) : t('agents.chat.skill.loaded', { name: sc.skill_name })} - -
- ))} - {/* Tool call indicators */} - {msg.tool_calls?.map((tc, i) => ( -
- {tc.status === 'executing' - ? - : } - - {tc.status === 'executing' ? t('agents.chat.tool.executing', { name: tc.tool_name }) : t('agents.chat.tool.completed', { name: tc.tool_name })} - -
- ))} - {/* Markdown content */} -
- { - const imgUrl = typeof src === 'string' ? src : ''; - return ( - - {alt} - {imgUrl.startsWith('/api/media/') && ( - - - - )} - - ); - } - }} - > - {text} - -
-
- ); - })() - ) : ( -
- {/* 渲染用户消息:支持纯文本和多模态 */} - {typeof msg.content === 'string' ? ( -
{msg.content}
- ) : ( - <> - {/* 图片 */} - {msg.content.filter(p => p.type === 'image_url').length > 0 && ( -
- {msg.content.filter(p => p.type === 'image_url').map((p, i) => ( - uploaded - ))} -
- )} - {/* 文本 */} - {msg.content.filter(p => p.type === 'text').map((p, i) => ( -
{p.text}
- ))} - - )} -
- )} -
- - {msg.role === 'user' && ( - - - - )} -
- ))} -
-
- - - {/* Input Area */} -
-
- {/* 编辑模式提示 */} - {editImageUrl && ( -
- - {t('agents.chat.edit.mode')} - -
- )} - - {/* 图片预览区 */} - {images.length > 0 && ( -
- {images.map(img => ( -
- {img.name} - -
- ))} -
- )} - - {/* 隐藏的文件输入 */} - - -