From e75f01b26b60c0d3ca56fb99df02757c48894995 Mon Sep 17 00:00:00 2001 From: Monster <389264167@qq.com> Date: Fri, 20 Mar 2026 17:28:30 +0800 Subject: [PATCH 01/11] =?UTF-8?q?docs:=20=E7=B2=BE=E7=AE=80=20README?= =?UTF-8?q?=EF=BC=9B=E8=B0=83=E6=95=B4=E4=BB=BB=E5=8A=A1=E8=AF=A6=E6=83=85?= =?UTF-8?q?=E8=81=8A=E5=A4=A9=E5=8C=BA=E5=A4=96=E8=BE=B9=E8=B7=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - README: 去掉横幅与截图、社区与许可证长段,收敛为简介与文档入口 - task-detail: 移除聊天区域容器的 px-2 pb-2,与布局对齐 Made-with: Cursor --- README.md | 72 +++---------------- .../pages/console/user/task/task-detail.tsx | 2 +- 2 files changed, 12 insertions(+), 62 deletions(-) diff --git a/README.md b/README.md index 23adfd1a..e67fb1a5 100644 --- a/README.md +++ b/README.md @@ -1,35 +1,21 @@ # MonkeyCode -

- MonkeyCode -

+> 由长亭科技推出的企业级 AI 开发平台,覆盖需求 → 设计 → 开发 → 代码审查全流程 -

- ⚡ 在线使用   |   - 📖 帮助文档   |   - 🐙 GitHub -

+## 简介 -## 👋 简介 +MonkeyCode 是面向研发团队的企业级 AI 开发平台,通过自然语言交互,让 AI 帮你完成从需求分析、技术设计、代码开发到代码审查的完整开发流程。平台支持多种 AI 模型,集成 GitHub/GitLab/Gitee 等主流 Git 平台,提供在线 IDE、终端、文件管理等功能,大幅提升团队开发效率。 -**MonkeyCode** 是由长亭科技推出的企业级 AI 开发平台,覆盖 **需求 → 设计 → 开发 → 代码审查** 全流程。 - -MonkeyCode 不是简单的 AI 编程工具,而是对传统研发模式的变革,带来全新的 AI 编程体验,让研发团队效率 Max。你可以用自然语言描述需求,让 AI 帮你完成从需求分析、技术设计、代码开发到代码审查的完整开发流程。 - -## 💡 核心功能 +## 核心功能 ### 智能任务 - 用自然语言描述需求,AI 自动完成开发、设计或代码审查。支持从 Git 仓库或 ZIP 文件导入代码,可选择开发工具和 AI 模型。 ### 项目管理 - 关联 Git 仓库,管理项目需求和任务。可创建需求文档、启动设计任务和开发任务,实现需求驱动的开发流程。 ### 在线开发环境 - 提供完整的在线开发环境,包括: - - **在线 IDE**:支持多语言高亮的代码编辑器 - **终端**:支持多会话的 Web 终端 - **文件管理**:在线浏览、编辑、上传下载文件 @@ -37,23 +23,16 @@ MonkeyCode 不是简单的 AI 编程工具,而是对传统研发模式的变 - **远程协助**:支持与他人共享终端 ### 代码审查 - 配置 Git 机器人,自动审查 GitHub/GitLab/Gitee 的 PR/MR,提供智能代码改进建议。 ### 团队协作 - 企业管理员可以管理团队成员、分配资源(宿主机、镜像、AI 模型),实现权限控制和资源统一管理。 -## 🚀 快速开始 - -本项目为 MonkeyCode **在线版** 前端,需配合后端服务使用。 +## 快速开始 ```bash -# 进入前端目录 -cd frontend - # 安装依赖 -pnpm install +cd frontend && pnpm install # 启动开发服务器 pnpm dev @@ -64,40 +43,11 @@ pnpm build 访问 http://localhost:5173 查看应用。 -## 📖 使用文档 - -- **在线使用**:访问 [monkeycode-ai.com](https://monkeycode-ai.com/) 直接体验 -- **帮助文档**:查看 [MonkeyCode 文档](https://monkeycode.docs.baizhi.cloud/) 了解团队版、点数说明、配置等 -- **使用指南**:项目内详细操作说明见 [frontend/doc.md](./frontend/doc.md) - -## ⚡ 界面展示 - -| | | -| --------------------------------------------------- | --------------------------------------------------- | -| | | - -## 🔗 相关链接 - -- [MonkeyCode 官网](https://monkeycode-ai.com/) -- [MonkeyCode 文档](https://monkeycode.docs.baizhi.cloud/) -- [长亭科技](https://chaitin.cn/) -- [长亭百智云](https://baizhi.cloud/) - -## 💬 社区交流 - -欢迎加入我们的微信群进行交流。 - -微信交流群 - -## 🙋‍♂️ 贡献 - -欢迎提交 [Pull Request](https://github.com/chaitin/MonkeyCode/pulls) 或创建 [Issue](https://github.com/chaitin/MonkeyCode/issues) 来帮助改进项目。 +## 使用文档 -## 📝 许可证 +详细的使用指南请参考 [frontend/doc.md](./frontend/doc.md)。 -本项目采用 GNU Affero General Public License v3.0 (AGPL-3.0) 许可证。这意味着: +## 联系我们 -- 你可以自由使用、修改和分发本软件 -- 你必须以相同的许可证开源你的修改 -- 如果你通过网络提供服务,也必须开源你的代码 -- 商业使用需要遵守相同的开源要求 +- 官网:https://monkeycode-ai.com +- 帮助文档:https://monkeycode-ai.com/docs diff --git a/frontend/src/pages/console/user/task/task-detail.tsx b/frontend/src/pages/console/user/task/task-detail.tsx index 51c229f3..a69185a5 100644 --- a/frontend/src/pages/console/user/task/task-detail.tsx +++ b/frontend/src/pages/console/user/task/task-detail.tsx @@ -261,7 +261,7 @@ export default function TaskDetailPage() { const [renewDialogOpen, setRenewDialogOpen] = React.useState(false) const chatSection = ( -
+
Date: Fri, 20 Mar 2026 18:01:02 +0800 Subject: [PATCH 02/11] =?UTF-8?q?feat(nav):=20=E7=A7=BB=E9=99=A4=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E4=BE=A7=E6=A0=8F=E3=80=8C=E4=BB=A3=E7=A0=81=E5=AE=A1?= =?UTF-8?q?=E6=9F=A5=E3=80=8D=E5=85=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 从 user-sidebar 移除 NavMain - 删除仅含 Git 机器人链接的 nav-main 组件 Made-with: Cursor --- .../src/components/console/nav/nav-main.tsx | 31 ------------------- .../components/console/nav/user-sidebar.tsx | 2 -- 2 files changed, 33 deletions(-) delete mode 100644 frontend/src/components/console/nav/nav-main.tsx diff --git a/frontend/src/components/console/nav/nav-main.tsx b/frontend/src/components/console/nav/nav-main.tsx deleted file mode 100644 index 2064f9c3..00000000 --- a/frontend/src/components/console/nav/nav-main.tsx +++ /dev/null @@ -1,31 +0,0 @@ -import { Github } from "lucide-react" -import { Link, useLocation } from "react-router-dom" - -import { - SidebarGroup, - SidebarMenu, - SidebarMenuButton, - SidebarMenuItem, -} from "@/components/ui/sidebar" - -export default function NavMain() { - const location = useLocation() - - return ( - - - - - - - 代码审查 - - - - - - ) -} diff --git a/frontend/src/components/console/nav/user-sidebar.tsx b/frontend/src/components/console/nav/user-sidebar.tsx index bd4b8830..40c6681e 100644 --- a/frontend/src/components/console/nav/user-sidebar.tsx +++ b/frontend/src/components/console/nav/user-sidebar.tsx @@ -10,7 +10,6 @@ import { SidebarMenuButton, SidebarMenuItem, } from "@/components/ui/sidebar" -import NavMain from "./nav-main" import { useSettingsDialog } from "@/pages/console/user/page" import { Settings } from "lucide-react" @@ -36,7 +35,6 @@ export default function UserSidebar({ - From 31fe743a421fee2a565862a177ef278bd74a2f21 Mon Sep 17 00:00:00 2001 From: Monster <389264167@qq.com> Date: Mon, 23 Mar 2026 12:30:49 +0800 Subject: [PATCH 03/11] =?UTF-8?q?feat(frontend):=20=E6=A8=A1=E5=9E=8B?= =?UTF-8?q?=E5=88=97=E8=A1=A8=E6=8B=89=E5=8F=96=E5=A4=B1=E8=B4=A5=E6=88=96?= =?UTF-8?q?=E4=B8=BA=E7=A9=BA=E6=97=B6=E6=94=AF=E6=8C=81=E6=89=8B=E5=8A=A8?= =?UTF-8?q?=E5=A1=AB=E5=86=99=E6=A8=A1=E5=9E=8B=E5=90=8D=E7=A7=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 在控制台与团队管理的绑定/修改模型对话框中,当 getProviderModelList 失败或返回空列表时,将模型名称由仅下拉改为可输入;修改 API 地址或 Token 时重置列表状态。绑定弹窗在每次打开时重置列表尝试状态。 Made-with: Cursor --- .../components/console/settings/add-model.tsx | 147 ++++++++++++------ .../console/settings/edit-model.tsx | 146 ++++++++++------- frontend/src/components/manager/add-model.tsx | 140 +++++++++++------ .../src/components/manager/edit-model.tsx | 147 +++++++++++------- 4 files changed, 377 insertions(+), 203 deletions(-) diff --git a/frontend/src/components/console/settings/add-model.tsx b/frontend/src/components/console/settings/add-model.tsx index 4eb61225..dbf55903 100644 --- a/frontend/src/components/console/settings/add-model.tsx +++ b/frontend/src/components/console/settings/add-model.tsx @@ -1,4 +1,4 @@ -import { useState } from "react" +import { useState, useEffect } from "react" import { Button } from "@/components/ui/button" import { Dialog, @@ -45,6 +45,28 @@ export default function AddModel({ const [modelList, setModelList] = useState([]) const [loadingModels, setLoadingModels] = useState(false) const [saving, setSaving] = useState(false) + const [modelListFetchFailed, setModelListFetchFailed] = useState(false) + const [modelListAttempted, setModelListAttempted] = useState(false) + + useEffect(() => { + if (open) { + setModelList([]) + setModelListAttempted(false) + setModelListFetchFailed(false) + } + }, [open]) + + const resetModelListState = () => { + setModelList([]) + setModelListAttempted(false) + setModelListFetchFailed(false) + } + + const showManualModelInput = + apiToken.trim() && + !loadingModels && + modelListAttempted && + (modelListFetchFailed || modelList.length === 0) const fetchModelList = async () => { if (!apiToken.trim()) { @@ -52,6 +74,9 @@ export default function AddModel({ return } + setModelListAttempted(true) + setModelListFetchFailed(false) + if (modelProviderList[baseUrl.trim()]) { setModelList(modelProviderList[baseUrl.trim()]) return @@ -66,13 +91,16 @@ export default function AddModel({ if (resp.code === 0) { const models = resp.data?.models || [] setModelList(models) + setModelListFetchFailed(false) if (models.length === 0) { - toast.warning("未获取到可用模型") + toast.warning("未获取到可用模型,可手动填写模型名称") } else { toast.success(`获取到 ${models.length} 个可用模型`) } } else { - toast.error("获取模型列表失败: " + resp.message) + setModelList([]) + setModelListFetchFailed(true) + toast.error("获取模型列表失败: " + resp.message + ",可手动填写模型名称") } }) setLoadingModels(false) @@ -122,7 +150,7 @@ export default function AddModel({ setApiToken("") setBaseUrl("https://model-square.app.baizhi.cloud/v1") setInterfaceType(ConstsInterfaceType.InterfaceTypeOpenAIChat) - setModelList([]) + resetModelListState() onOpenChange(false) onRefresh?.() } else { @@ -143,7 +171,7 @@ export default function AddModel({ setApiToken("") setBaseUrl("https://model-square.app.baizhi.cloud/v1") setInterfaceType(ConstsInterfaceType.InterfaceTypeOpenAIChat) - setModelList([]) + resetModelListState() onOpenChange(false) } @@ -218,7 +246,10 @@ export default function AddModel({ setBaseUrl(e.target.value)} + onChange={(e) => { + setBaseUrl(e.target.value) + resetModelListState() + }} /> {getModelUrlDescription(baseUrl, interfaceType)} @@ -242,55 +273,73 @@ export default function AddModel({ setApiToken(e.target.value)} + onChange={(e) => { + setApiToken(e.target.value) + resetModelListState() + }} /> 模型名称 - + {showManualModelInput ? ( + <> + setModel(e.target.value)} + /> + + {modelListFetchFailed + ? "无法拉取模型列表,请按服务商文档填写模型 ID。" + : "当前未返回可用模型,请手动填写模型名称。"} + + + ) : ( + + )}
diff --git a/frontend/src/components/console/settings/edit-model.tsx b/frontend/src/components/console/settings/edit-model.tsx index bca4aa6d..df6a95bb 100644 --- a/frontend/src/components/console/settings/edit-model.tsx +++ b/frontend/src/components/console/settings/edit-model.tsx @@ -46,6 +46,20 @@ export default function EditModel({ const [modelList, setModelList] = useState([]) const [loadingModels, setLoadingModels] = useState(false) const [saving, setSaving] = useState(false) + const [modelListFetchFailed, setModelListFetchFailed] = useState(false) + const [modelListAttempted, setModelListAttempted] = useState(false) + + const resetModelListState = () => { + setModelList([]) + setModelListAttempted(false) + setModelListFetchFailed(false) + } + + const showManualModelInput = + apiToken.trim() && + !loadingModels && + modelListAttempted && + (modelListFetchFailed || modelList.length === 0) useEffect(() => { if (model && open) { @@ -53,7 +67,7 @@ export default function EditModel({ setBaseUrl(model.base_url || "https://model-square.app.baizhi.cloud/v1") setSelectedModel(model.model || "") setInterfaceType(model.interface_type || ConstsInterfaceType.InterfaceTypeOpenAIChat) - setModelList([]) + resetModelListState() } }, [model, open]) @@ -63,6 +77,9 @@ export default function EditModel({ return } + setModelListAttempted(true) + setModelListFetchFailed(false) + if (modelProviderList[baseUrl.trim()]) { setModelList(modelProviderList[baseUrl.trim()]) return @@ -77,14 +94,16 @@ export default function EditModel({ if (resp.code === 0) { const models = resp.data?.models || [] setModelList(models) + setModelListFetchFailed(false) if (models.length === 0) { - toast.warning("未获取到可用模型") + toast.warning("未获取到可用模型,可手动填写模型名称") } else { toast.success(`获取到 ${models.length} 个可用模型`) } } else { - toast.error("获取模型列表失败: " + resp.message) + toast.error("获取模型列表失败: " + resp.message + ",可手动填写模型名称") setModelList([]) + setModelListFetchFailed(true) } }) setLoadingModels(false) @@ -144,7 +163,7 @@ export default function EditModel({ setBaseUrl("") setSelectedModel("") setInterfaceType(ConstsInterfaceType.InterfaceTypeOpenAIChat) - setModelList([]) + resetModelListState() onOpenChange(false) onRefresh?.() } @@ -163,7 +182,7 @@ export default function EditModel({ setBaseUrl("") setSelectedModel("") setInterfaceType(ConstsInterfaceType.InterfaceTypeOpenAIChat) - setModelList([]) + resetModelListState() onOpenChange(false) } @@ -234,7 +253,10 @@ export default function EditModel({ setBaseUrl(e.target.value)} + onChange={(e) => { + setBaseUrl(e.target.value) + resetModelListState() + }} /> @@ -247,59 +269,77 @@ export default function EditModel({ setApiToken(e.target.value)} + onChange={(e) => { + setApiToken(e.target.value) + resetModelListState() + }} /> 模型名称 - + {showManualModelInput ? ( + <> + setSelectedModel(e.target.value)} + /> + + {modelListFetchFailed + ? "无法拉取模型列表,请按服务商文档填写模型 ID。" + : "当前未返回可用模型,请手动填写模型名称。"} + + + ) : ( + + )}
diff --git a/frontend/src/components/manager/add-model.tsx b/frontend/src/components/manager/add-model.tsx index 1b2673ab..de14648b 100644 --- a/frontend/src/components/manager/add-model.tsx +++ b/frontend/src/components/manager/add-model.tsx @@ -48,14 +48,31 @@ export default function AddModel({ const [modelList, setModelList] = useState([]) const [loadingModels, setLoadingModels] = useState(false) const [saving, setSaving] = useState(false) + const [modelListFetchFailed, setModelListFetchFailed] = useState(false) + const [modelListAttempted, setModelListAttempted] = useState(false) const [selectedGroupIds, setSelectedGroupIds] = useState([]) const [groups, setGroups] = useState([]) const [selectOpen, setSelectOpen] = useState(false) const selectRef = useRef(null) + const resetModelListState = () => { + setModelList([]) + setModelListAttempted(false) + setModelListFetchFailed(false) + } + + const showManualModelInput = + apiToken.trim() && + !loadingModels && + modelListAttempted && + (modelListFetchFailed || modelList.length === 0) + useEffect(() => { if (open) { fetchGroups() + setModelList([]) + setModelListAttempted(false) + setModelListFetchFailed(false) } }, [open]) @@ -99,6 +116,9 @@ export default function AddModel({ return } + setModelListAttempted(true) + setModelListFetchFailed(false) + if (modelProviderList[baseUrl.trim()]) { setModelList(modelProviderList[baseUrl.trim()]) return @@ -113,13 +133,16 @@ export default function AddModel({ if (resp.code === 0) { const models = resp.data?.models || [] setModelList(models) + setModelListFetchFailed(false) if (models.length === 0) { - toast.warning("未获取到可用模型") + toast.warning("未获取到可用模型,可手动填写模型名称") } else { toast.success(`获取到 ${models.length} 个可用模型`) } } else { - toast.error("获取模型列表失败: " + resp.message); + setModelList([]) + setModelListFetchFailed(true) + toast.error("获取模型列表失败: " + resp.message + ",可手动填写模型名称") } }) setLoadingModels(false) @@ -170,7 +193,7 @@ export default function AddModel({ setApiToken("") setBaseUrl("https://model-square.app.baizhi.cloud/v1") setInterfaceType(ConstsInterfaceType.InterfaceTypeOpenAIChat) - setModelList([]) + resetModelListState() setSelectedGroupIds([]) setSelectOpen(false) onOpenChange(false) @@ -193,7 +216,7 @@ export default function AddModel({ setApiToken("") setBaseUrl("https://model-square.app.baizhi.cloud/v1") setInterfaceType(ConstsInterfaceType.InterfaceTypeOpenAIChat) - setModelList([]) + resetModelListState() setSelectedGroupIds([]) setSelectOpen(false) onOpenChange(false) @@ -269,7 +292,10 @@ export default function AddModel({ setBaseUrl(e.target.value)} + onChange={(e) => { + setBaseUrl(e.target.value) + resetModelListState() + }} /> {getModelUrlDescription(baseUrl, interfaceType)} @@ -293,55 +319,73 @@ export default function AddModel({ setApiToken(e.target.value)} + onChange={(e) => { + setApiToken(e.target.value) + resetModelListState() + }} /> 模型名称 - + {showManualModelInput ? ( + <> + setModel(e.target.value)} + /> + + {modelListFetchFailed + ? "无法拉取模型列表,请按服务商文档填写模型 ID。" + : "当前未返回可用模型,请手动填写模型名称。"} + + + ) : ( + + )} diff --git a/frontend/src/components/manager/edit-model.tsx b/frontend/src/components/manager/edit-model.tsx index b679b28f..e9f734a5 100644 --- a/frontend/src/components/manager/edit-model.tsx +++ b/frontend/src/components/manager/edit-model.tsx @@ -48,6 +48,8 @@ export default function EditModel({ const [modelList, setModelList] = useState([]) const [loadingModels, setLoadingModels] = useState(false) const [saving, setSaving] = useState(false) + const [modelListFetchFailed, setModelListFetchFailed] = useState(false) + const [modelListAttempted, setModelListAttempted] = useState(false) const [selectedGroupIds, setSelectedGroupIds] = useState([]) const [groups, setGroups] = useState([]) const [selectOpen, setSelectOpen] = useState(false) @@ -59,13 +61,25 @@ export default function EditModel({ } }, [open]) + const resetModelListState = () => { + setModelList([]) + setModelListAttempted(false) + setModelListFetchFailed(false) + } + + const showManualModelInput = + apiToken.trim() && + !loadingModels && + modelListAttempted && + (modelListFetchFailed || modelList.length === 0) + useEffect(() => { if (model && open) { setApiToken(model.api_key || "") setBaseUrl(model.base_url || "https://model-square.app.baizhi.cloud/v1") setSelectedModel(model.model || "") setInterfaceType(model.interface_type || ConstsInterfaceType.InterfaceTypeOpenAIChat) - setModelList([]) + resetModelListState() // 初始化已选中的分组 setSelectedGroupIds(model.groups?.map(g => g.id || "").filter(id => id) || []) } @@ -111,6 +125,9 @@ export default function EditModel({ return } + setModelListAttempted(true) + setModelListFetchFailed(false) + if (modelProviderList[baseUrl.trim()]) { setModelList(modelProviderList[baseUrl.trim()]) return @@ -125,13 +142,16 @@ export default function EditModel({ if (resp.code === 0) { const models = resp.data?.models || [] setModelList(models) + setModelListFetchFailed(false) if (models.length === 0) { - toast.warning("未获取到可用模型") + toast.warning("未获取到可用模型,可手动填写模型名称") } else { toast.success(`获取到 ${models.length} 个可用模型`) } } else { - toast.error("获取模型列表失败: " + resp.message); + setModelList([]) + setModelListFetchFailed(true) + toast.error("获取模型列表失败: " + resp.message + ",可手动填写模型名称") } }) setLoadingModels(false) @@ -192,7 +212,7 @@ export default function EditModel({ setBaseUrl("") setSelectedModel("") setInterfaceType(ConstsInterfaceType.InterfaceTypeOpenAIChat) - setModelList([]) + resetModelListState() setSelectedGroupIds([]) setSelectOpen(false) onOpenChange(false) @@ -215,7 +235,7 @@ export default function EditModel({ setBaseUrl("") setSelectedModel("") setInterfaceType(ConstsInterfaceType.InterfaceTypeOpenAIChat) - setModelList([]) + resetModelListState() setSelectedGroupIds([]) setSelectOpen(false) onOpenChange(false) @@ -288,7 +308,10 @@ export default function EditModel({ setBaseUrl(e.target.value)} + onChange={(e) => { + setBaseUrl(e.target.value) + resetModelListState() + }} /> @@ -301,59 +324,77 @@ export default function EditModel({ setApiToken(e.target.value)} + onChange={(e) => { + setApiToken(e.target.value) + resetModelListState() + }} /> 模型名称 - + {showManualModelInput ? ( + <> + setSelectedModel(e.target.value)} + /> + + {modelListFetchFailed + ? "无法拉取模型列表,请按服务商文档填写模型 ID。" + : "当前未返回可用模型,请手动填写模型名称。"} + + + ) : ( + + )} From 76cda6b5e5fa86c2619419e82c1ff3f2f286e065 Mon Sep 17 00:00:00 2001 From: Monster <389264167@qq.com> Date: Mon, 23 Mar 2026 18:20:21 +0800 Subject: [PATCH 04/11] =?UTF-8?q?feat(welcome):=20=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E7=89=88=E6=9C=AC=E6=96=B9=E6=A1=88=E5=B1=95=E7=A4=BA=EF=BC=88?= =?UTF-8?q?=E5=9F=BA=E7=A1=80=E7=89=88/=E4=B8=93=E4=B8=9A=E7=89=88/?= =?UTF-8?q?=E5=9B=A2=E9=98=9F/=E7=A6=BB=E7=BA=BF=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 定价区改为四档:基础版、专业版、团队版、离线版,补充积分与权益说明 - Banner 与 Highlights 文案与模型、版本策略对齐 - 离线版仅保留开源仓库入口,链接至 chaitin/MonkeyCode Made-with: Cursor --- frontend/src/components/welcome/banner.tsx | 2 +- .../src/components/welcome/highlights.tsx | 9 +- frontend/src/components/welcome/pricing.tsx | 161 +++++++++++------- 3 files changed, 107 insertions(+), 65 deletions(-) diff --git a/frontend/src/components/welcome/banner.tsx b/frontend/src/components/welcome/banner.tsx index 135310b9..e7a3460c 100644 --- a/frontend/src/components/welcome/banner.tsx +++ b/frontend/src/components/welcome/banner.tsx @@ -8,7 +8,7 @@ const Banner = () => { MonkeyCode — 免费的 AI 编程平台

- 说需求,AI 写代码、做设计、做 Review。云开发环境开箱即用,多模型不限量。 + 说需求,AI 写代码、做设计、做 Review。云开发环境开箱即用,基础版免费起步,专业版支持多模型自选与多任务并行。

diff --git a/frontend/src/components/welcome/highlights.tsx b/frontend/src/components/welcome/highlights.tsx index 0decbffb..104d9975 100644 --- a/frontend/src/components/welcome/highlights.tsx +++ b/frontend/src/components/welcome/highlights.tsx @@ -9,8 +9,8 @@ const Highlights = () => { const items = [ { icon: IconGift, - title: "完全免费", - description: "零成本使用,无需订阅费用,节省开发环境和大模型费用。", + title: "基础版免费", + description: "注册即可使用云开发环境与大模型,零订阅门槛。", }, { icon: IconCloud, @@ -24,8 +24,9 @@ const Highlights = () => { }, { icon: IconBrandOpenai, - title: "多模型不限量", - description: "内置 GLM、MiniMax、Kimi、Deepseek 等大模型,不限额度,无限畅用。", + title: "大模型能力", + description: + "基础版使用平台指定模型免费畅用;专业版可从多种内置模型中自主选择,并支持多任务并行。", }, ]; diff --git a/frontend/src/components/welcome/pricing.tsx b/frontend/src/components/welcome/pricing.tsx index 35405301..de5df29a 100644 --- a/frontend/src/components/welcome/pricing.tsx +++ b/frontend/src/components/welcome/pricing.tsx @@ -9,68 +9,97 @@ import { } from "@/components/ui/card"; import { cn } from "@/lib/utils"; -const Pricing = () => { - const plans = [ - { - name: "个人版", - description: "适合个人开发者", - price: "免费", - priceUnit: "", - features: [ - "完全免费,零成本使用", - "云开发环境(2 核 8GB)", - "多模型不限额度", - "智能任务 + Git 机器人", - ], - buttonText: "立即开始", - buttonLink: "/console", - buttonVariant: "default" as const, - popular: true, - }, - { - name: "团队版", - description: "适合中小型研发团队", - price: "限时免费", - priceUnit: "", - features: [ - "智能任务模式", - "在线 Git 机器人", - "IDE 辅助插件", - "团队配置管理", - "团队数据统计", - ], - buttonText: "在线申请", - buttonLink: "https://baizhi.cloud/consult", - buttonVariant: "outline" as const, - popular: false, - }, - { - name: "离线版", - description: "本地部署,数据完全私有", - price: "敬请期待", - priceUnit: "", - features: [ - "智能任务模式", - "在线 Git 机器人", - "IDE 辅助插件", - "团队配置管理", - "团队数据统计", - "本地部署" - ], - buttonText: "提前预定", - buttonLink: "https://baizhi.cloud/consult", - buttonVariant: "outline" as const, - popular: false, - }, - ]; +type Plan = { + eyebrow?: string; + name: string; + description: string; + price: string; + priceUnit?: string; + features: string[]; + buttonText: string; + buttonLink: string; + buttonVariant: "default" | "outline"; + popular?: boolean; + external?: boolean; +}; +const plans: Plan[] = [ + { + eyebrow: "在线版 · 个人", + name: "基础版", + description: "注册即可使用,云开发环境与大模型在平台规则内免费使用。", + price: "免费", + features: [ + "使用平台指定的免费模型", + "同时仅可并行 1 个任务", + "云开发环境(2 核 8GB)", + "智能任务 + Git 机器人", + ], + buttonText: "立即开始", + buttonLink: "/console", + buttonVariant: "default", + popular: true, + }, + { + eyebrow: "在线版 · 个人", + name: "专业版", + description: "使用积分兑换,解锁多模型自选与多任务并行。", + price: "10,000", + priceUnit: "积分 / 月", + features: [ + "可从多种内置模型中自主选择", + "支持多个任务并行执行", + "含基础版全部能力", + "积分来源:注册赠送 5,000、每邀请新用户 5,000、支持充值", + ], + buttonText: "立即开始", + buttonLink: "/console", + buttonVariant: "outline", + }, + { + eyebrow: "在线版 · 团队", + name: "团队版", + description: "在个人版能力基础上,提供团队协作与团队管理。", + price: "限时免费", + features: [ + "团队协作开发", + "团队管理面板", + "智能任务、Git 机器人、IDE 辅助等个人版能力", + ], + buttonText: "在线申请", + buttonLink: "https://baizhi.cloud/consult", + buttonVariant: "outline", + external: true, + }, + { + eyebrow: "离线部署", + name: "离线版", + description: "由开源版本打包,支持本地离线部署,数据完全私有。", + price: "敬请期待", + features: [ + "GitHub 开源,可自行克隆部署(见下方仓库链接)", + "本地或内网部署", + "核心研发能力离线可用", + "适合安全与合规要求高的场景", + ], + buttonText: "开源仓库", + buttonLink: "https://github.com/chaitin/MonkeyCode", + buttonVariant: "default", + external: true, + }, +]; + +const Pricing = () => { return (
-

- 价格方案 +

+ 版本与方案

-
+

+ 在线版在云端使用,分为个人与团队;离线版可本地部署。个人用户默认为基础版,可使用积分兑换专业版。 +

+
{plans.map((plan, index) => ( {
)} + {plan.eyebrow && ( +

+ {plan.eyebrow} +

+ )} {plan.name} {plan.description}
-
+
{plan.price} {plan.priceUnit && ( @@ -131,7 +165,14 @@ const Pricing = () => { size="lg" asChild > - {plan.buttonText} + + {plan.buttonText} + @@ -142,4 +183,4 @@ const Pricing = () => { ); }; -export default Pricing; \ No newline at end of file +export default Pricing; From 66d449231b879e03ae04a0cb0c96789ce115ecd8 Mon Sep 17 00:00:00 2001 From: Monster <389264167@qq.com> Date: Mon, 23 Mar 2026 18:57:00 +0800 Subject: [PATCH 05/11] =?UTF-8?q?docs(frontend):=20=E5=AF=B9=E9=BD=90?= =?UTF-8?q?=E4=BD=BF=E7=94=A8=E6=8C=87=E5=8D=97=E6=96=87=E6=A1=A3=E5=B9=B6?= =?UTF-8?q?=E9=87=8D=E5=86=99=E5=AE=A3=E4=BC=A0=E5=90=91=20PPT?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - doc.md:按当前前端路由与交互更新说明,修正侧栏/顶栏、配置弹窗、Git 机器人入口等过时描述,补充项目自动 Review、任务列表分页等细节。 - public/ppt/index.html:改为理念与产品特色导向的宣讲稿,移除手册式路径与操作步骤。 Made-with: Cursor --- frontend/doc.md | 90 ++++-- frontend/public/ppt/index.html | 566 ++++++++++----------------------- 2 files changed, 215 insertions(+), 441 deletions(-) diff --git a/frontend/doc.md b/frontend/doc.md index 31c8aae4..bbaced0a 100644 --- a/frontend/doc.md +++ b/frontend/doc.md @@ -8,7 +8,7 @@ MonkeyCode 是面向研发团队的企业级 AI 开发平台,覆盖 **需求 → 设计 → 开发 → 代码审查** 全流程。你可以用自然语言描述需求,让 AI 帮你写代码、做设计、做 Review。 -**入口说明**:首页(`/`)提供「开始使用」进入控制台;开发者广场(`/playground`)、公开任务(`/tasks/public`)可从首页或直接访问对应路径。 +**入口说明**:首页(`/`)顶部导航含「控制台」(已登录时)、「广场」(`/playground`)、「使用文档」等;开发者广场(`/playground`)、发布内容(`/playground/create`)、公开任务(`/tasks/public`)可直接访问对应路径。登录后个人控制台默认进入 **新任务页**(`/console/tasks`,顶栏面包屑显示为「新任务」)。 --- @@ -16,31 +16,43 @@ MonkeyCode 是面向研发团队的企业级 AI 开发平台,覆盖 **需求 ### 登录 -1. 打开登录页,选择 **用户登录** 或 **团队管理登录** +1. 打开登录页(`/login`),在 **普通用户** 与 **团队管理员** 两个标签之间切换 2. 输入邮箱和密码 3. 完成验证码验证 4. 点击登录 -- **用户登录**:进入个人控制台,使用智能任务、项目管理等功能 -- **团队管理登录**:进入企业管理后台,管理团队资源 +- **普通用户**:进入个人控制台(`/console/…`),使用智能任务、项目管理等功能。同一区域还提供 **百智云账号登录**、**注册**(跳转 OAuth 流程)入口。 +- **团队管理员**:进入企业管理后台(`/manager/…`),管理团队资源(该标签下暂无「找回密码」入口,密码问题需按团队流程处理)。 ### 找回密码 -在登录页点击「找回密码」,输入注册邮箱,系统会发送重置链接到你的邮箱。点击邮件中的链接,按提示设置新密码即可。 +在 **普通用户** 登录表单中点击「找回密码」,将打开找回密码页(`/findpassword`)。输入注册邮箱并完成验证后,系统会发送重置链接到你的邮箱;点击邮件中的链接,按提示设置新密码即可。 --- ## 三、控制台导航 -登录后进入控制台,左侧是导航栏: +登录后进入个人控制台,布局为 **左侧边栏 + 顶栏 + 主内容区**。 -- **代码审查**:进入 Git 机器人页面,配置和管理代码审查机器人 -- **开发项目**:展示项目列表。点击「+」可**创建项目**,点击刷新图标可刷新列表。每个项目可展开子菜单显示其下的任务。另有 **默认** 分组,用于展示未关联到项目的任务 - - 点击「默认」进入新任务页(`/console/tasks`),可创建任务;默认分组旁的「+」为创建任务 - - 点击某个项目进入项目概览页;项目旁的「+」为**启动任务**(基于该项目仓库创建 AI 任务) -- **配置**:点击底部「配置」打开设置弹窗,可管理 Git 身份、AI 大模型、系统镜像、宿主机、开发环境、通知等 +**左侧边栏** -底部可查看账户余额和点数,点击头像可退出登录。 +- **开发项目**:展示 **默认** 分组与各项目。点击刷新图标可刷新列表;标签右侧「+」为 **创建项目**。 + - **默认**:点击进入新任务页(`/console/tasks`);旁的「+」为 **创建任务**(与进入同一页后创建任务等价)。展开后列出未归属项目的任务;每条任务悬停可出现 **更多** 菜单,支持 **删除任务**。 + - **具体项目**:点击进入该项目概览(`/console/project/:projectId`);项目行右侧「+」为 **启动任务**(基于该项目仓库创建 AI 任务,未绑定仓库时该按钮不可用)。展开后列出该项目下任务,同样支持 **删除任务**。 +- **配置**:侧栏底部点击「配置」打开设置弹窗,可管理 Git 身份、AI 大模型、系统镜像、宿主机、开发环境、通知等。 +- **用户区**:侧栏最底部为当前账号信息。点击展开菜单可 **修改昵称**、**修改密码**、**登出**;点击头像区域可 **修改头像**(图片 ≤5MB)。 + +**顶栏(个人控制台)** + +- 面包屑导航(例如任务详情中会显示任务名称)。 +- **技术交流群**:悬停展示微信、飞书、钉钉群二维码。 +- **钱包**:查看点数余额(充值/赠送)、兑换码兑换、交易记录、邀请链接等(大屏下显示;小屏可能收纳)。 +- **帮助**:跳转官方文档站点。 + +**未在侧栏列出的页面(需直接访问 URL 或自行收藏)** + +- **Git 机器人 / 代码审查**:`/console/gitbot`(审查任务与审查机器人配置)。 +- **IDE 辅助工具**:`/console/ide`(当前为占位页,含开源与文档链接,见下文「IDE 辅助工具」一节)。 --- @@ -59,7 +71,7 @@ MonkeyCode 是面向研发团队的企业级 AI 开发平台,覆盖 **需求 3. **选择代码来源** 点击「代码」按钮: - - **我的仓库**:展开后按已绑定的 Git 身份(GitHub、Gitee、GitLab、Gitea 等)分组,选择身份后显示该身份下授权的仓库列表(支持搜索);若未绑定,会提示「去绑定」并跳转到配置页 + - **我的仓库**:展开后按已绑定的 Git 身份分组,选择身份后显示该身份下授权的仓库列表(支持搜索)。其中 GitHub 需使用 **GitHub App 安装** 方式绑定的身份才会出现可选仓库;Gitee、Gitea、GitLab 等为 OAuth 类绑定。若未绑定,会提示「去绑定」并跳转到配置页 - **其他仓库**:输入完整的 Git 仓库地址,按回车确认;下方会显示历史使用过的仓库供快速选择 - **ZIP 文件**:选择本地的 .zip 压缩包上传(最大 10MB),上传成功后该文件会作为代码来源 @@ -92,42 +104,44 @@ MonkeyCode 是面向研发团队的企业级 AI 开发平台,覆盖 **需求 - Token 用量(若有) - 创建时间 -点击任务卡片进入任务详情页。列表支持无限滚动,向下滚动可加载更多任务。 +点击任务卡片进入任务详情页。列表支持无限滚动,接近底部时自动加载下一页(每页 24 条,与接口分页一致)。 --- ## 五、任务开发页面 -任务执行时,会进入任务详情页(`/console/task/:taskId`),你可以在这里与 AI 协作。 +任务创建后或从列表进入,会打开任务详情页(`/console/task/:taskId`),你可以在这里与 AI 协作。 ### 页面布局 -- **主区域**:与 AI 的对话区域,包含执行步骤、消息列表、输入框 -- **底部按钮**:文件、终端、修改、预览、续期。点击任一按钮可展开右侧面板,再次点击可收起 +- **主区域**:与 AI 的对话与交互区。上方为可滚动的 **消息列表**;其下依次为 **执行步骤**(有规划时显示)、**文件变更提示条**(有待提交改动且 AI 等待你输入时可能出现)、**输入框**。展开右侧面板时,中间会出现 **可拖动的竖向分割线**,用于调整左右区域宽度。 +- **底部工具条**:**文件**、**终端**、**修改**(若有未提交改动会显示数量)、**预览**(已开放端口时显示数量)、**续期**。点击前四项可在右侧展开对应面板,再次点击可收起。**续期**为打开续期弹窗,而非右侧面板。 - **文件**:项目文件树,可浏览、打开、编辑文件 - **终端**:终端输出,展示 AI 执行的命令,也可手动输入 - **修改**:查看 AI 修改过的文件及 Diff - **预览**:端口转发与在线预览 - - **续期**:延长开发环境使用时间 + - **续期**:延长开发环境使用时间;当剩余可用时间不足约 1 小时时,「续期」文字会闪烁提醒 -开发环境准备中时,主区域会显示准备状态(如「正在创建虚拟机」等)。 +任务已结束(非执行中状态)时,文件/终端/修改/预览按钮会禁用,悬停提示「任务已结束,无法查看」。**续期**仅在虚拟机仍在线时可用。 + +开发环境准备中时,主区域会显示准备状态(如「正在创建虚拟机」等)。若当前开发环境不可用,原输入框位置会显示「开发环境不可用」。 ### 与 AI 对话 - 当 AI 执行完毕、等待你的反馈时,底部输入框会变为可输入状态 - 输入补充说明或新指令,点击发送,AI 会继续执行 - 支持 **Shift+Enter** 换行,**Enter** 发送 -- 输入框旁有菜单按钮,可进行: - - **重置上下文**:清空当前对话上下文,后续操作基于新上下文 +- 输入框左侧有 **菜单(≡)** 按钮,可进行: + - **重置上下文**:清空当前对话上下文,后续操作基于新上下文(会二次确认) - **重新加载开发工具**:重新加载 OpenCode 等开发工具 - 支持**语音输入**:点击麦克风按钮,用语音描述需求,系统会自动转为文字 -- 支持**斜杠命令**:点击终端图标可查看可用命令(如 `/command`),选择后插入到输入框 +- 支持**斜杠命令**:点击 **终端样式** 的按钮可展开服务端下发的可用命令列表(如 `/command`),选择后会将对应内容插入输入框 ### 查看 AI 的执行进度 -- 对话区域顶部会展示「执行步骤」区块,显示 AI 的 TODO 计划及每个步骤的完成状态 -- 执行中会显示耗时,可点击停止按钮中断执行 -- 任务完成后会显示 Token 用量(输入/输出 tokens) +- **执行步骤**区块位于 **消息列表下方、输入框上方**,展示 AI 的计划步骤及完成进度;可通过右侧按钮 **展开/折叠** 全部步骤(执行中且折叠时可能仅显示当前进行中的步骤) +- 执行中可点击 **停止** 中断当前执行 +- 页面底部工具条右侧会展示 Token 用量(宽屏为输入/输出分项,窄屏可为合计展示) ### 提交代码变更 @@ -168,11 +182,11 @@ MonkeyCode 是面向研发团队的企业级 AI 开发平台,覆盖 **需求 ## 六、代码审查(Git 机器人) -在「代码审查」页面(`/console/gitbot`),可以配置 Git 机器人,让 AI 自动审查你的合并请求(PR/MR)。 +在 **Git 机器人** 页面(`/console/gitbot`,个人控制台侧栏无固定入口时需手动输入地址访问),可以配置 Git 机器人,让 AI 自动审查你的合并请求(PR/MR)。页面默认展示 **审查任务** 标签。 ### 审查任务 -切换到「审查任务」标签: +「审查任务」标签下: - 以列表形式展示所有由机器人触发的审查任务 - 每个任务显示关联的 PR/MR、状态、平台等,点击可跳转到对应 Git 平台的 PR 页面 @@ -219,7 +233,9 @@ MonkeyCode 是面向研发团队的企业级 AI 开发平台,覆盖 **需求 ### 项目页面 -进入项目后,顶部有三个 Tab:**信息**、**需求**、**任务**。 +若项目 **未绑定仓库**,进入项目页后会显示「项目异常」提示,无法使用启动 AI、自动 Review 等依赖仓库的能力;需先在创建/编辑流程中完成仓库绑定。 + +进入正常项目后,顶部有三个 Tab:**信息**、**需求**、**任务**。 **信息** Tab: @@ -238,6 +254,10 @@ MonkeyCode 是面向研发团队的企业级 AI 开发平台,覆盖 **需求 - 弹出「启动 AI 任务」对话框,选择分支后点击「开始对话」 - 系统会基于当前项目仓库创建开发任务,并跳转到任务详情页与 AI 对话 +### 自动 Review + +项目信息区还提供 **自动 Review** 入口(与「启动 AI」并列):用于为该项目配置是否开启自动代码审查(需已绑定仓库)。开启后状态会显示为「已开启自动 Review」,未开启为「未开启自动 Review」,点击可进入配置。 + ### 项目设置 点击项目信息区域的「更多」菜单: @@ -276,7 +296,7 @@ MonkeyCode 是面向研发团队的企业级 AI 开发平台,覆盖 **需求 ## 八、配置 -在「配置」页面,可以管理各类基础设置。 +点击侧栏底部的「配置」会打开 **设置弹窗**(非独立路由页面),可在其中管理各类基础设置。 ### Git 平台身份凭证 @@ -415,13 +435,13 @@ MonkeyCode 是面向研发团队的企业级 AI 开发平台,覆盖 **需求 ## 十一、IDE 辅助工具 -IDE 辅助工具(`/console/ide`)目前为「敬请期待」状态,后续将提供与 IDE 集成的辅助能力。可通过控制台内直接访问该路径进入。 +IDE 辅助工具(`/console/ide`)当前为占位页:提示功能「敬请期待」,并说明相关能力已开源。页面提供 **开源仓库**(跳转 GitHub `chaitin/MonkeyCode`)与 **阅读文档** 按钮。侧栏无入口时需直接在地址栏访问 `/console/ide`。 --- ## 十二、开发者广场 -开发者广场(`/playground`)可浏览和分享内容,可从首页进入或直接访问。未登录时可浏览,发布需先登录。 +开发者广场(`/playground`)可浏览和分享内容,可从首页进入或直接访问。未登录时可浏览,发布需先登录;**发布**流程对应路由 **`/playground/create`**(从广场点击发布会进入该页)。 ### 浏览 @@ -467,7 +487,7 @@ IDE 辅助工具(`/console/ide`)目前为「敬请期待」状态,后续 ## 十五、企业管理后台 -使用团队管理员账号登录后,可进入企业管理后台(`/manager`)。左侧导航包含:仪表盘、成员管理、开发环境(宿主机)、AI 大模型、系统镜像、管理员、操作记录、其他配置。下面分别说明每个页面的功能和操作方式。 +使用团队管理员账号登录后,可进入企业管理后台(`/manager`,默认重定向到 `/manager/dashboard`)。左侧 **企业管理** 分组下的菜单为:**仪表盘**、**成员管理**、**开发环境**(管理团队接入的宿主机)、**AI 大模型**、**系统镜像**、**管理员**、**操作记录**、**其他配置**(界面文案与路由 `/manager/images` 等一一对应)。下面分别说明每个页面的功能和操作方式。 ### 仪表盘 @@ -561,9 +581,9 @@ IDE 辅助工具(`/console/ide`)目前为「敬请期待」状态,后续 --- -### 镜像管理 +### 系统镜像(管理后台) -管理团队可用的系统镜像,用于构建开发环境。 +管理团队可用的 Docker 系统镜像,用于构建开发环境(与侧栏菜单名称「系统镜像」一致)。 **绑定镜像** @@ -677,4 +697,4 @@ A:子账号在创建任务时可以选择宿主机和系统镜像;主账号 --- -如有更多问题,可点击页面顶部的「帮助文档」查看官方文档,或扫码加入微信交流群。 +如有更多问题,可在个人控制台顶栏点击 **帮助** 打开官方文档站点;顶栏 **技术交流群** 内提供微信、飞书、钉钉群二维码。企业管理后台顶栏同样有 **帮助** 入口。 diff --git a/frontend/public/ppt/index.html b/frontend/public/ppt/index.html index a9efa8fb..7d063e85 100644 --- a/frontend/public/ppt/index.html +++ b/frontend/public/ppt/index.html @@ -3,7 +3,7 @@ - MonkeyCode - 企业级 AI 开发平台 + MonkeyCode AI — 产品介绍 @@ -25,82 +25,56 @@ --orange-glow: #fb923c; } - .reveal { - font-weight: 400; - } - - .reveal .slides { - text-align: left; - } - + .reveal { font-weight: 400; } + .reveal .slides { text-align: left; } .reveal .slides section { - padding: 50px 60px; + padding: 48px 56px; box-sizing: border-box; height: 100%; } - .reveal h1, .reveal h2, .reveal h3 { text-transform: none; font-weight: 700; letter-spacing: -0.02em; } - .reveal h1 { - font-size: 2.5em; + font-size: 2.4em; background: var(--accent-gradient); -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text; } - .reveal h2 { - font-size: 1.8em; + font-size: 1.7em; color: var(--cyan-glow); - margin-bottom: 0.6em; + margin-bottom: 0.45em; } - .reveal h3 { - font-size: 1.15em; + font-size: 1.05em; color: var(--purple-glow); + margin-top: 0.65em; } - .reveal p, .reveal li { - font-size: 0.95em; + font-size: 0.92em; line-height: 1.7; color: #b8c0cc; } - .reveal ul { list-style: none; padding-left: 0; - margin-top: 20px; + margin-top: 14px; } - .reveal ul li { position: relative; - padding-left: 1.8em; - margin-bottom: 0.7em; + padding-left: 1.55em; + margin-bottom: 0.55em; } - .reveal ul li::before { content: "▹"; position: absolute; left: 0; color: var(--cyan-glow); - font-size: 1em; } - - .reveal code { - font-family: var(--r-code-font); - background: rgba(100, 255, 218, 0.1); - border: 1px solid rgba(100, 255, 218, 0.2); - border-radius: 4px; - padding: 0.1em 0.4em; - color: var(--cyan-glow); - font-size: 0.9em; - } - - /* Title slide styling */ .title-slide { text-align: center !important; display: flex !important; @@ -108,169 +82,120 @@ justify-content: center; align-items: center; } - - .title-slide h1 { - font-size: 3.5em; - margin-bottom: 0.2em; - } - + .title-slide h1 { font-size: 3.2em; margin-bottom: 0.12em; } .title-slide .subtitle { - font-size: 1.2em; - color: #8892a6; - font-weight: 300; + font-size: 1.25em; + color: #c4cad4; + font-weight: 400; + max-width: 28em; + line-height: 1.5; } - - .title-slide .company { - font-size: 0.9em; - color: var(--orange-glow); - margin-top: 30px; + .title-slide .hint { + font-size: 0.8em; + color: #8892a6; + margin-top: 36px; } - - /* Flow diagram */ .flow-box { display: inline-flex; align-items: center; - gap: 12px; + gap: 10px; + flex-wrap: wrap; background: rgba(100, 255, 218, 0.08); border: 1px solid rgba(100, 255, 218, 0.2); border-radius: 8px; padding: 12px 20px; - margin: 20px 0; + margin: 22px 0; } - .flow-box .step { background: linear-gradient(135deg, #667eea, #764ba2); color: white; padding: 8px 16px; border-radius: 6px; - font-size: 0.85em; + font-size: 0.82em; font-weight: 500; } - - .flow-box .arrow { - color: var(--cyan-glow); - font-size: 1.2em; - } - - /* Feature cards */ + .flow-box .arrow { color: var(--cyan-glow); font-size: 1.1em; } .feature-grid { display: grid; grid-template-columns: repeat(2, 1fr); - gap: 24px; - margin-top: 30px; - } - - .feature-grid.three-col { - grid-template-columns: repeat(3, 1fr); + gap: 20px; + margin-top: 22px; } - + .feature-grid.three-col { grid-template-columns: repeat(3, 1fr); } .feature-card { background: linear-gradient(145deg, rgba(30, 41, 59, 0.8), rgba(15, 23, 42, 0.9)); border: 1px solid rgba(100, 255, 218, 0.15); border-radius: 14px; - padding: 24px; - transition: all 0.3s ease; + padding: 22px; + transition: border-color 0.25s ease; } - .feature-card:hover { - border-color: rgba(100, 255, 218, 0.4); - transform: translateY(-3px); - box-shadow: 0 15px 30px rgba(100, 255, 218, 0.08); + border-color: rgba(100, 255, 218, 0.35); } - - .feature-card h3 { - margin-top: 0; - font-size: 1.05em; - } - - .feature-card p { - font-size: 0.85em; - margin-bottom: 0; + .feature-card h3 { margin-top: 0; font-size: 1.02em; } + .feature-card p { font-size: 0.82em; margin-bottom: 0; line-height: 1.65; } + .icon { font-size: 1.6em; margin-bottom: 10px; display: block; } + .pull-quote { + font-size: 1.15em; + font-weight: 400; + color: #e8eaed; + line-height: 1.65; + border-left: 4px solid var(--cyan-glow); + padding: 8px 0 8px 26px; + margin: 28px 0; } - - /* Icon styling */ - .icon { - font-size: 1.8em; - margin-bottom: 12px; - display: block; + .pull-quote footer { + margin-top: 16px; + font-size: 0.75em; + color: #8892a6; + font-style: normal; } - - /* Highlight box */ .highlight-box { - background: linear-gradient(135deg, rgba(102, 126, 234, 0.15), rgba(118, 75, 162, 0.1)); + background: linear-gradient(135deg, rgba(102, 126, 234, 0.12), rgba(118, 75, 162, 0.08)); border-left: 3px solid var(--purple-glow); padding: 16px 24px; - border-radius: 0 10px 10px 0; + border-radius: 0 12px 12px 0; margin: 20px 0; } - - .highlight-box p { - margin: 0; - font-size: 0.9em; - } - - /* Two column layout */ + .highlight-box p { margin: 0; font-size: 0.88em; } .two-col { display: grid; grid-template-columns: 1fr 1fr; - gap: 40px; + gap: 36px; align-items: start; } - - /* Tag list */ - .tag-list { - display: flex; - flex-wrap: wrap; - gap: 10px; - margin-top: 16px; - } - + .tag-list { display: flex; flex-wrap: wrap; gap: 10px; margin-top: 18px; } .tag { - background: rgba(167, 139, 250, 0.15); - border: 1px solid rgba(167, 139, 250, 0.3); + background: rgba(167, 139, 250, 0.12); + border: 1px solid rgba(167, 139, 250, 0.28); color: var(--purple-glow); padding: 6px 14px; - border-radius: 20px; - font-size: 0.8em; + border-radius: 999px; + font-size: 0.76em; } - - /* Animated background */ .reveal .slides::before { content: ""; position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - background: + inset: 0; + background: radial-gradient(ellipse at 20% 80%, rgba(102, 126, 234, 0.15) 0%, transparent 50%), radial-gradient(ellipse at 80% 20%, rgba(167, 139, 250, 0.1) 0%, transparent 50%), radial-gradient(ellipse at 50% 50%, rgba(240, 147, 251, 0.05) 0%, transparent 70%); pointer-events: none; z-index: -1; } - - /* CTA button */ .cta-button { display: inline-block; - padding: 14px 36px; + padding: 14px 38px; background: var(--accent-gradient); - color: white; + color: white !important; text-decoration: none; border-radius: 50px; font-weight: 600; font-size: 1em; - margin-top: 30px; - transition: all 0.3s ease; - box-shadow: 0 8px 30px rgba(102, 126, 234, 0.3); + margin-top: 28px; + box-shadow: 0 8px 30px rgba(102, 126, 234, 0.35); } - - .cta-button:hover { - transform: scale(1.05); - box-shadow: 0 12px 40px rgba(102, 126, 234, 0.5); - } - - /* Center helper */ .centered { text-align: center !important; display: flex !important; @@ -278,318 +203,154 @@ justify-content: center; align-items: center; } - - /* Slide number */ - .reveal .slide-number { - font-family: var(--r-code-font); - font-size: 0.8em; - color: #8892a6; - background: transparent; - } - - /* Progress bar */ - .reveal .progress { - height: 3px; - background: rgba(100, 255, 218, 0.1); - } - - .reveal .progress span { - background: var(--accent-gradient); - } - - /* Role cards */ - .role-grid { - display: grid; - grid-template-columns: repeat(3, 1fr); - gap: 20px; - margin-top: 24px; - } - - .role-card { - background: rgba(30, 41, 59, 0.6); - border: 1px solid rgba(100, 255, 218, 0.1); - border-radius: 10px; - padding: 20px; - text-align: center; - } - - .role-card .role-icon { - font-size: 2em; - margin-bottom: 10px; - } - - .role-card h4 { - color: var(--cyan-glow); - font-size: 0.95em; - margin: 0 0 8px 0; - } - - .role-card p { - font-size: 0.8em; - margin: 0; - } - - /* Git platforms */ - .platform-list { - display: flex; - gap: 16px; - margin: 20px 0; - flex-wrap: wrap; - } - - .platform { - background: rgba(100, 255, 218, 0.08); - border: 1px solid rgba(100, 255, 218, 0.2); - padding: 10px 20px; - border-radius: 8px; - font-size: 0.9em; - color: var(--cyan-glow); - } - - /* Quote */ - .quote { - font-size: 1.1em; - font-style: italic; - color: #e8eaed; - border-left: 3px solid var(--cyan-glow); - padding-left: 24px; - margin: 24px 0; - } - - /* Compact list */ - .compact-list li { - margin-bottom: 0.5em; - font-size: 0.88em; + .reveal .progress span { background: var(--accent-gradient); } + .lede { + font-size: 1.02em; + color: #d1d5db; + margin-bottom: 8px; }
-
-

MonkeyCode

-

企业级 AI 开发平台

-

长亭科技 出品

-

- 按 Space 键继续 -

+

MonkeyCode AI

+

让 AI 走进真实研发流程——从想法到合并请求,可治理、可协作、可落地。

+

按 Space 或 → 翻页

-
-

什么是 MonkeyCode?

-

- MonkeyCode 不只是一个 AI 编程工具,而是一个面向专业团队的 AI 研发基础设施 -

- +

我们相信

+
+ 优秀的 AI 编程,不该停留在「单次补全」或「一次性对话」,而应嵌入需求、设计、实现与审查的闭环,并运行在团队信得过的边界里。 +
—— 产品哲学
+
+

MonkeyCode 面向专业研发团队:把自然语言变成可执行、可回顾、可审计的工程活动,而不是孤立的代码片段。

+
+ +
+

一条链路,拉通研发

+

同一套产品叙事,覆盖从意图到质量门禁的完整路径:

- 需求 + 需求与意图 - 设计 + 方案与设计 - 开发 + 编码与验证 - Review + 审查与合并
- -

覆盖研发全流程,提供安全、隔离、可并行的开发环境

-
-

📢 当前提供 SaaS 版,后续计划推出 离线部署版开源版

+

目标很简单:少换工具、少丢上下文、少踩安全雷——让人与 AI 在同一条流水线上协作。

+
+
+ +
+

三大差异化

+
+
+ 🧭 +

流程,而不是插件

+

智能任务、项目与需求相互承接;开发、设计、审查可按场景切换,沉淀在工程资产里,而不是散落在聊天记录中。

+
+
+ 🛡️ +

边界清晰的执行环境

+

任务在隔离环境中运行,与本地和线上资产解耦;支持并行、失败重来与资源治理,让企业敢把真仓库交进来。

+
+
+ ⚙️ +

可运营、可扩展

+

模型与镜像、宿主机与通知可配置;团队侧支持分组、配额与审计——AI 能力可按组织方式落地,而非个人英雄主义。

+
-
-

✨ 产品定位

+

自然语言,驱动工程

+

用描述替代繁琐编排:想做什么、对哪份代码做、希望产出什么形态,交给统一体验。

    -
  • 企业级 AI Coding 平台
  • -
  • 面向专业开发者与研发团队
  • -
  • 支持真实工程场景,支持复杂项目与多人协作
  • -
  • 不只是写代码,而是参与完整研发流程
  • +
  • 开发:在真实仓库语境下迭代实现,对话、终端、文件与预览同一屏协作。
  • +
  • 设计:把模糊需求推成可讨论、可落地的技术叙述与设计产出。
  • +
  • 审查:以评审视角审视改动,提前消化风险与债务。
- -
- 需求 - - 设计 - - 开发 - - Review -
-
-

🚀 AI 智能任务

-

核心能力:通过自然语言驱动 AI 执行任务

- -
+

项目,即协作的「锚点」

+
-

底层能力

-

由业内顶尖工具驱动:

-
- OpenAI Codex - Claude Code -
-

已使用 Codex 或 Claude Code?
可无缝迁移至 MonkeyCode

+

仓库、需求文档、任务历史被组织在项目这一层:团队对「我们在做什么」有共同画面,AI 的每次介入都可追溯到业务上下文。

-

国产模型适配

-

完整支持国内主流模型:

-
- DeepSeek - Qwen - Kimi - GLM - Doubao -
+
    +
  • 需求可演进:从原始描述到方案,再到实现任务。
  • +
  • 可选的自动化审查策略,让质量意识长在仓库上,而不是依赖个人习惯。
  • +
-
-

🚀 SDD 项目开发

-

基于 SDD(规范驱动开发) 的项目开发模式

-

相比 "Vibe coding",更强调可控性、可追溯性与工程质量

- -
- 原始需求 - - 产品设计 - - 技术设计 - - 任务列表 -
- -
-
-
👔
-

产品经理

-

需求拆解与产品设计

-
-
-
📋
-

项目管理

-

流程与进度管理

-
-
-
💻
-

研发工程师

-

技术设计与实现

-
-
+

审查,回到流水线中央

+

代码审查不应是「另一个网站里的附加功能」,而应紧贴 PR / MR 与团队习惯。

+
    +
  • 对接主流 Git 平台,Webhook 驱动,审查任务与合并请求天然关联。
  • +
  • 机器人可配置、可共享权限,适合多仓库、多团队协作。
  • +
  • 把 AI Review 从「尝鲜」推进为「流程默认项」。
  • +
-
-

🚀 Git Review Bot

-

深度集成主流 Git 平台,支持 AI 驱动的代码审查

- -
- GitHub - GitLab - Gitea - Gitee +

开放栈,保持选择权

+

不在模型与基础设施上绑架用户:

+
+ 多模型接入 + 自建或托管 API + 多平台 Git + 自有宿主机 + 自定义镜像 + 消息通知打通
- -

使用场景

-
    -
  • 在 PR / MR 中 @MonkeyCode,自动进行代码 Review
  • -
  • 接入 DevOps 流程,代码提交时自动触发 AI Review
  • -
  • 支持独立部署的私有化 GitLab 集成
  • -
+

在「能用」与「可控」之间取平衡:团队按合规与成本选择栈,MonkeyCode 负责把能力接到同一条产品链路上。

-
-

🚀 在线开发环境

-

灵活、安全的开发环境:本地开发机 + 云端控制

- -
-
- 🔒 -

环境隔离

-

每次任务自动创建虚拟机,AI 操作仅在虚拟机内执行,不影响真实环境

-
-
- -

并行运行

-

多个 AI 任务并行,每个任务独立虚拟环境,互不影响

-
-
- 🔄 -

失败重试

-

任务失败可直接重试,系统自动创建新虚拟机

+

面向组织,也面向社区

+
+
+

企业侧

+

成员与分组、宿主与镜像、模型与操作审计——为规模化使用预留管理平面,让 AI 研发可授权、可追责、可优化

-
- 📱 -

多端访问

-

支持 PC 与移动端,随时随地驱动 AI 执行研发任务

+
+

开放与分享

+

开发者广场与任务分享,让实践可被看见、被复用;核心方向持续开源,与社区共同演进工具链。

-
-

✨ 核心特色

-
-
- 🔧 -

工具无关性

-

支持 Codex、Claude Code 等,无缝切换

-
-
- 🤖 -

模型无关性

-

兼容 GPT、Claude、DeepSeek、Kimi 等

-
-
- 📐 -

SDD 驱动

-

严格管理技术设计,解决 AI 放飞自我问题

-
-
- 🌐 -

多入口触发

-

IDE / Web / Git / API 多种方式发起任务

-
-
- 🛡️ -

环境隔离

-

任务启动创建全新 OS,安全可控

-
-
- 🏢 -

企业级配置

-

支持离线大模型,支持企业内网使用

-
-
+

路线图愿景

+
    +
  • 更深的 IDE 与本地工具集成,减少上下文切换。
  • +
  • 更丰富的团队洞察与治理视图,服务技术管理者。
  • +
  • 持续强化安全与隔离叙事,成为企业愿意标准化的 AI 研发底座。
  • +
-
-

开始使用 MonkeyCode

-

- 让 AI 成为你的研发基础设施 -

- 立即体验 -

- monkeycode-ai.com +

一起重塑研发流水线

+

+ 官网体验产品 · 文档了解细节 · 欢迎交流场景与合作

+ 访问 MonkeyCode +

长亭科技 · MonkeyCode

-
-

感谢观看

-

Q & A

-

- 长亭科技 · MonkeyCode 团队 -

+

谢谢

+

欢迎提问与交流

@@ -608,22 +369,15 @@

感谢观看

transitionSpeed: 'default', backgroundTransition: 'fade', plugins: [RevealHighlight, RevealNotes, RevealMarkdown], - // 16:9 宽高比 width: 1920, height: 1080, - // 自适应缩放 margin: 0.04, minScale: 0.2, maxScale: 2.0, - // 键盘控制 keyboard: true, - // 触摸滑动 touch: true, - // 循环播放 loop: false, - // 右下角控制按钮 controls: true, - // 显示幻灯片编号 showSlideNumber: 'all', }); From 0b24f6504ca39772b01c908f7819f7a85576f01b Mon Sep 17 00:00:00 2001 From: Monster <389264167@qq.com> Date: Mon, 23 Mar 2026 22:30:28 +0800 Subject: [PATCH 06/11] =?UTF-8?q?chore(desktop):=20Electron=20=E6=A1=8C?= =?UTF-8?q?=E9=9D=A2=E7=AB=AF=E4=B8=8E=20GitHub=20Release=20CI=EF=BC=88Win?= =?UTF-8?q?dows=20/=20macOS=20arm64+x64=EF=BC=89=EF=BC=8C=E7=89=88?= =?UTF-8?q?=E6=9C=AC=20260323.1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Made-with: Cursor --- .github/workflows/electron-release.yml | 148 ++ .gitignore | 3 + frontend/electron-builder.full.json | 6 + frontend/electron/main.cjs | 101 + frontend/electron/preload.cjs | 2 + frontend/package.json | 66 +- frontend/pnpm-lock.yaml | 2195 ++++++++++++++++++++- frontend/scripts/electron-postinstall.cjs | 15 + frontend/scripts/pack-win.mjs | 41 + frontend/vite.config.ts | 2 + 10 files changed, 2549 insertions(+), 30 deletions(-) create mode 100644 .github/workflows/electron-release.yml create mode 100644 frontend/electron-builder.full.json create mode 100644 frontend/electron/main.cjs create mode 100644 frontend/electron/preload.cjs create mode 100644 frontend/scripts/electron-postinstall.cjs create mode 100644 frontend/scripts/pack-win.mjs diff --git a/.github/workflows/electron-release.yml b/.github/workflows/electron-release.yml new file mode 100644 index 00000000..6d77396f --- /dev/null +++ b/.github/workflows/electron-release.yml @@ -0,0 +1,148 @@ +# 打 tag(如 v1.2.3)后自动构建 Windows / macOS(Intel+Apple Silicon) 桌面包并发布到 GitHub Release。 +# 手动运行 workflow 仅上传 Actions Artifact,不创建 Release(便于试打)。 + +name: Electron Release + +on: + push: + tags: + - "v*" + workflow_dispatch: + +permissions: + contents: write + +concurrency: + group: electron-release-${{ github.ref }} + cancel-in-progress: true + +env: + NODE_VERSION: "20" + CSC_IDENTITY_AUTO_DISCOVERY: false + +jobs: + electron-windows: + runs-on: windows-latest + defaults: + run: + working-directory: frontend + steps: + - uses: actions/checkout@v4 + + - uses: pnpm/action-setup@v4 + with: + version: 9 + + - uses: actions/setup-node@v4 + with: + node-version: ${{ env.NODE_VERSION }} + cache: pnpm + cache-dependency-path: frontend/pnpm-lock.yaml + + - name: Set package.json version + shell: bash + run: | + if [[ "${{ github.ref }}" == refs/tags/v* ]]; then + V="${GITHUB_REF_NAME#v}" + else + V="0.0.0-ci.${{ github.run_number }}" + fi + node -e "const fs=require('fs');const p='package.json';const j=JSON.parse(fs.readFileSync(p,'utf8'));j.version=process.argv[1];fs.writeFileSync(p,JSON.stringify(j,null,2)+'\n');" "$V" + + - name: Install dependencies + run: pnpm install --frozen-lockfile + + - name: Build Windows (portable + NSIS) + run: pnpm run electron:ci:win + + - name: Collect artifacts + shell: bash + run: | + mkdir -p ../_electron_upload + shopt -s nullglob + cp release/*.exe ../_electron_upload/ || true + cp release/*.yml ../_electron_upload/ || true + ls -la ../_electron_upload/ + + - uses: actions/upload-artifact@v4 + with: + name: electron-windows-x64 + path: _electron_upload/ + + electron-macos: + runs-on: macos-latest + defaults: + run: + working-directory: frontend + steps: + - uses: actions/checkout@v4 + + - uses: pnpm/action-setup@v4 + with: + version: 9 + + - uses: actions/setup-node@v4 + with: + node-version: ${{ env.NODE_VERSION }} + cache: pnpm + cache-dependency-path: frontend/pnpm-lock.yaml + + - name: Set package.json version + run: | + if [[ "${{ github.ref }}" == refs/tags/v* ]]; then + V="${GITHUB_REF_NAME#v}" + else + V="0.0.0-ci.${{ github.run_number }}" + fi + node -e "const fs=require('fs');const p='package.json';const j=JSON.parse(fs.readFileSync(p,'utf8'));j.version=process.argv[1];fs.writeFileSync(p,JSON.stringify(j,null,2)+'\n');" "$V" + + - name: Install dependencies + run: pnpm install --frozen-lockfile + + # 目标格式(dmg / zip)取自 package.json 的 build.mac.target + - name: Build macOS (arm64 + x64) + run: pnpm run electron:ci:mac + + - name: Collect artifacts + run: | + mkdir -p ../_electron_upload + shopt -s nullglob + cp release/*.dmg ../_electron_upload/ || true + cp release/*.zip ../_electron_upload/ || true + cp release/*.yml ../_electron_upload/ || true + ls -la ../_electron_upload/ + + - uses: actions/upload-artifact@v4 + with: + name: electron-macos-universal + path: _electron_upload/ + + publish-release: + needs: [electron-windows, electron-macos] + if: startsWith(github.ref, 'refs/tags/v') + runs-on: ubuntu-latest + steps: + - uses: actions/download-artifact@v4 + with: + name: electron-windows-x64 + path: release-assets/windows + + - uses: actions/download-artifact@v4 + with: + name: electron-macos-universal + path: release-assets/macos + + - name: List release files + run: find release-assets -type f -exec ls -lh {} \; + + - uses: softprops/action-gh-release@v2 + with: + tag_name: ${{ github.ref_name }} + name: MonkeyCode Desktop ${{ github.ref_name }} + generate_release_notes: true + fail_on_unmatched_files: false + files: | + release-assets/windows/* + release-assets/macos/* + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.gitignore b/.gitignore index 0eb97202..eda91cd7 100644 --- a/.gitignore +++ b/.gitignore @@ -9,3 +9,6 @@ logs # Local build artifacts monkeycode-ai/ .pnpm-store/ + +# Electron (electron-builder) +frontend/release/ diff --git a/frontend/electron-builder.full.json b/frontend/electron-builder.full.json new file mode 100644 index 00000000..8dd429d5 --- /dev/null +++ b/frontend/electron-builder.full.json @@ -0,0 +1,6 @@ +{ + "directories": { + "output": "release-full" + }, + "files": ["dist/**/*", "electron/**/*", "package.json"] +} diff --git a/frontend/electron/main.cjs b/frontend/electron/main.cjs new file mode 100644 index 00000000..afee10af --- /dev/null +++ b/frontend/electron/main.cjs @@ -0,0 +1,101 @@ +const { app, BrowserWindow, shell, dialog, Menu } = require("electron") +const fs = require("fs") +const path = require("path") + +const isDev = !app.isPackaged +const DEFAULT_PROD_URL = "https://monkeycode-ai.com" + +/** 避免 ready-to-show 迟迟不触发时窗口永远隐藏(用户以为程序没启动) */ +function ensureWindowVisible(win, ms = 2000) { + const show = () => { + if (!win.isDestroyed() && !win.isVisible()) win.show() + } + win.once("ready-to-show", show) + win.webContents.once("did-finish-load", () => { + if (!win.isDestroyed() && !win.isVisible()) show() + }) + setTimeout(show, ms) +} + +function createWindow() { + const win = new BrowserWindow({ + width: 1280, + height: 800, + minWidth: 900, + minHeight: 640, + show: false, + autoHideMenuBar: true, + webPreferences: { + preload: path.join(__dirname, "preload.cjs"), + contextIsolation: true, + nodeIntegration: false, + // 加载完整 Web 应用时 sandbox 可能导致部分站点行为异常,桌面壳使用非沙箱更稳妥 + sandbox: false, + }, + }) + + ensureWindowVisible(win, 2000) + + win.webContents.on("did-fail-load", (_event, code, desc, url, isMainFrame) => { + if (!isMainFrame) return + if (!win.isDestroyed() && !win.isVisible()) win.show() + if (isDev) return + dialog.showErrorBox( + "MonkeyCode", + `页面加载失败(${code})\n${desc}\n\n${url}\n\n请检查网络或代理;也可设置环境变量 MONKEYCODE_DESKTOP_URL 指向可访问的地址。` + ) + }) + + win.webContents.setWindowOpenHandler(({ url }) => { + shell.openExternal(url) + return { action: "deny" } + }) + + if (isDev) { + const devUrl = process.env.VITE_DEV_SERVER_URL || "http://localhost:5173" + win.loadURL(devUrl) + win.webContents.openDevTools({ mode: "detach" }) + } else if (process.env.MONKEYCODE_LOAD_LOCAL_DIST === "1") { + const indexHtml = path.join(__dirname, "..", "dist", "index.html") + if (!fs.existsSync(indexHtml)) { + dialog.showErrorBox( + "MonkeyCode", + "未找到 dist/index.html。请先执行 ELECTRON=true pnpm build,或不要使用 MONKEYCODE_LOAD_LOCAL_DIST。" + ) + app.quit() + return + } + win.loadFile(indexHtml) + } else { + win.loadURL(process.env.MONKEYCODE_DESKTOP_URL || DEFAULT_PROD_URL) + } +} + +const gotLock = app.requestSingleInstanceLock() +if (!gotLock) { + app.quit() +} else { + app.on("second-instance", () => { + const w = BrowserWindow.getAllWindows()[0] + if (w) { + if (w.isMinimized()) w.restore() + w.focus() + } + }) + + app.whenReady().then(() => { + // Windows / Linux:去掉顶部「文件、编辑…」应用菜单栏 + if (process.platform !== "darwin") { + Menu.setApplicationMenu(null) + } + createWindow() + }) +} + +app.on("window-all-closed", () => { + if (process.platform !== "darwin") app.quit() +}) + +app.on("activate", () => { + if (BrowserWindow.getAllWindows().length === 0) createWindow() +}) diff --git a/frontend/electron/preload.cjs b/frontend/electron/preload.cjs new file mode 100644 index 00000000..cec9af7e --- /dev/null +++ b/frontend/electron/preload.cjs @@ -0,0 +1,2 @@ +"use strict" +// Preload:若需向页面暴露安全 API,请使用 contextBridge.exposeInMainWorld。 diff --git a/frontend/package.json b/frontend/package.json index b050e6cc..1662a6ef 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,14 +1,29 @@ { "name": "monkeycode-ai", "private": true, - "version": "0.0.0", + "version": "260323.1", + "description": "MonkeyCode 桌面客户端", + "author": "MonkeyCode", "type": "module", + "main": "electron/main.cjs", "scripts": { "dev": "vite", "build": "tsc -b && vite build", "lint": "eslint .", "preview": "vite preview", - "api": "sta --path ${SWAGGER} --output src/api" + "api": "sta --path ${SWAGGER} --output src/api", + "electron:dev": "concurrently -k \"vite\" \"wait-on http://localhost:5173 && electron .\"", + "electron:build:dist": "ELECTRON=true pnpm build", + "electron:pack": "electron-builder --mac --publish never", + "electron:pack:dir": "electron-builder --mac dir --publish never", + "electron:pack:with-dist": "pnpm electron:build:dist && electron-builder --mac -c electron-builder.full.json --publish never", + "electron:pack:win": "node scripts/pack-win.mjs", + "electron:pack:win:portable": "node scripts/pack-win.mjs -- --win portable --x64 --publish never", + "electron:pack:win:nsis": "node scripts/pack-win.mjs -- --win nsis --x64 --publish never", + "electron:pack:win:dir": "node scripts/pack-win.mjs -- --win dir --x64 --publish never", + "electron:ci:win": "electron-builder --win portable nsis --x64 --publish never", + "electron:ci:mac": "electron-builder --mac --arm64 --x64 --publish never", + "postinstall": "node scripts/electron-postinstall.cjs" }, "dependencies": { "@cap.js/widget": "^0.1.32", @@ -95,6 +110,51 @@ "typescript": "~5.9.3", "typescript-eslint": "^8.46.3", "vite": "^7.2.2", - "vite-plugin-node-polyfills": "^0.23.0" + "vite-plugin-node-polyfills": "^0.23.0", + "concurrently": "^9.2.1", + "electron": "^35.1.5", + "electron-builder": "^26.0.12", + "wait-on": "^8.0.3" + }, + "build": { + "appId": "com.monkeycode.desktop", + "productName": "MonkeyCode", + "directories": { + "output": "release" + }, + "npmRebuild": false, + "files": [ + "electron/**/*", + "package.json" + ], + "mac": { + "category": "public.app-category.developer-tools", + "target": [ + "dmg", + "zip" + ] + }, + "win": { + "signAndEditExecutable": false, + "target": [ + { + "target": "portable", + "arch": [ + "x64" + ] + }, + { + "target": "nsis", + "arch": [ + "x64" + ] + } + ] + }, + "nsis": { + "oneClick": false, + "allowToChangeInstallationDirectory": true + }, + "asar": true } } diff --git a/frontend/pnpm-lock.yaml b/frontend/pnpm-lock.yaml index 8c913789..88fbdb2c 100644 --- a/frontend/pnpm-lock.yaml +++ b/frontend/pnpm-lock.yaml @@ -228,6 +228,15 @@ importers: baseline-browser-mapping: specifier: ^2.9.19 version: 2.9.19 + concurrently: + specifier: ^9.2.1 + version: 9.2.1 + electron: + specifier: ^35.1.5 + version: 35.7.5 + electron-builder: + specifier: ^26.0.12 + version: 26.8.1(electron-builder-squirrel-windows@26.8.1) eslint: specifier: ^9.39.1 version: 9.39.1(jiti@2.6.1) @@ -242,7 +251,7 @@ importers: version: 16.5.0 swagger-typescript-api: specifier: ^12.0.4 - version: 12.0.4 + version: 12.0.4(encoding@0.1.13) tw-animate-css: specifier: ^1.4.0 version: 1.4.0 @@ -258,9 +267,15 @@ importers: vite-plugin-node-polyfills: specifier: ^0.23.0 version: 0.23.1(rollup@4.53.2)(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(yaml@2.8.2)) + wait-on: + specifier: ^8.0.3 + version: 8.0.5 packages: + 7zip-bin@5.2.0: + resolution: {integrity: sha512-ukTPVhqG4jNzMro2qA9HSCSSVJN3aN7tlb+hfqYCt3ER0yWroeA2VR38MNrOHLQ/cVj+DaIMad0kFCtWWowh/A==} + '@antfu/install-pkg@1.1.0': resolution: {integrity: sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ==} @@ -477,6 +492,50 @@ packages: react: ^16.8.0 || ^17 || ^18 || ^19 react-dom: ^16.8.0 || ^17 || ^18 || ^19 + '@develar/schema-utils@2.6.5': + resolution: {integrity: sha512-0cp4PsWQ/9avqTVMCtZ+GirikIA36ikvjtHweU4/j8yLtgObI0+JUPhYFScgwlteveGB1rt3Cm8UhN04XayDig==} + engines: {node: '>= 8.9.0'} + + '@electron/asar@3.4.1': + resolution: {integrity: sha512-i4/rNPRS84t0vSRa2HorerGRXWyF4vThfHesw0dmcWHp+cspK743UanA0suA5Q5y8kzY2y6YKrvbIUn69BCAiA==} + engines: {node: '>=10.12.0'} + hasBin: true + + '@electron/fuses@1.8.0': + resolution: {integrity: sha512-zx0EIq78WlY/lBb1uXlziZmDZI4ubcCXIMJ4uGjXzZW0nS19TjSPeXPAjzzTmKQlJUZm0SbmZhPKP7tuQ1SsEw==} + hasBin: true + + '@electron/get@2.0.3': + resolution: {integrity: sha512-Qkzpg2s9GnVV2I2BjRksUi43U5e6+zaQMcjoJy0C+C5oxaKl+fmckGDQFtRpZpZV0NQekuZZ+tGz7EA9TVnQtQ==} + engines: {node: '>=12'} + + '@electron/get@3.1.0': + resolution: {integrity: sha512-F+nKc0xW+kVbBRhFzaMgPy3KwmuNTYX1fx6+FxxoSnNgwYX6LD7AKBTWkU0MQ6IBoe7dz069CNkR673sPAgkCQ==} + engines: {node: '>=14'} + + '@electron/notarize@2.5.0': + resolution: {integrity: sha512-jNT8nwH1f9X5GEITXaQ8IF/KdskvIkOFfB2CvwumsveVidzpSc+mvhhTMdAGSYF3O+Nq49lJ7y+ssODRXu06+A==} + engines: {node: '>= 10.0.0'} + + '@electron/osx-sign@1.3.3': + resolution: {integrity: sha512-KZ8mhXvWv2rIEgMbWZ4y33bDHyUKMXnx4M0sTyPNK/vcB81ImdeY9Ggdqy0SWbMDgmbqyQ+phgejh6V3R2QuSg==} + engines: {node: '>=12.0.0'} + hasBin: true + + '@electron/rebuild@4.0.3': + resolution: {integrity: sha512-u9vpTHRMkOYCs/1FLiSVAFZ7FbjsXK+bQuzviJZa+lG7BHZl1nz52/IcGvwa3sk80/fc3llutBkbCq10Vh8WQA==} + engines: {node: '>=22.12.0'} + hasBin: true + + '@electron/universal@2.0.3': + resolution: {integrity: sha512-Wn9sPYIVFRFl5HmwMJkARCCf7rqK/EurkfQ/rJZ14mHP3iYTjZSIOSVonEAnhWeAXwtw7zOekGRlc6yTtZ0t+g==} + engines: {node: '>=16.4'} + + '@electron/windows-sign@1.2.2': + resolution: {integrity: sha512-dfZeox66AvdPtb2lD8OsIIQh12Tp0GNCRUDfBHIKGpbmopZto2/A8nSpYYLoedPIHpqkeblZ/k8OV0Gy7PYuyQ==} + engines: {node: '>=14.14'} + hasBin: true + '@esbuild/aix-ppc64@0.25.12': resolution: {integrity: sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==} engines: {node: '>=18'} @@ -695,6 +754,26 @@ packages: '@floating-ui/utils@0.2.10': resolution: {integrity: sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==} + '@hapi/address@5.1.1': + resolution: {integrity: sha512-A+po2d/dVoY7cYajycYI43ZbYMXukuopIsqCjh5QzsBCipDtdofHntljDlpccMjIfTy6UOkg+5KPriwYch2bXA==} + engines: {node: '>=14.0.0'} + + '@hapi/formula@3.0.2': + resolution: {integrity: sha512-hY5YPNXzw1He7s0iqkRQi+uMGh383CGdyyIGYtB+W5N3KHPXoqychklvHhKCC9M3Xtv0OCs/IHw+r4dcHtBYWw==} + + '@hapi/hoek@11.0.7': + resolution: {integrity: sha512-HV5undWkKzcB4RZUusqOpcgxOaq6VOAH7zhhIr2g3G8NF/MlFO75SjOr2NfuSx0Mh40+1FqCkagKLJRykUWoFQ==} + + '@hapi/pinpoint@2.0.1': + resolution: {integrity: sha512-EKQmr16tM8s16vTT3cA5L0kZZcTMU5DUOZTuvpnY738m+jyP3JIUj+Mm1xc1rsLkGBQ/gVnfKYPwOmPg1tUR4Q==} + + '@hapi/tlds@1.1.6': + resolution: {integrity: sha512-xdi7A/4NZokvV0ewovme3aUO5kQhW9pQ2YD1hRqZGhhSi5rBv4usHYidVocXSi9eihYsznZxLtAiEYYUL6VBGw==} + engines: {node: '>=14.0.0'} + + '@hapi/topo@6.0.2': + resolution: {integrity: sha512-KR3rD5inZbGMrHmgPxsJ9dbi6zEK+C3ZwUwTa+eMwWLz7oijWUTWD2pMSNNYJAU6Qq+65NkxXjqHr/7LM2Xkqg==} + '@humanfs/core@0.19.1': resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} engines: {node: '>=18.18.0'} @@ -717,6 +796,14 @@ packages: '@iconify/utils@3.1.0': resolution: {integrity: sha512-Zlzem1ZXhI1iHeeERabLNzBHdOa4VhQbqAcOQaMKuTuyZCpwKbC2R4Dd0Zo3g9EAc+Y4fiarO8HIHRAth7+skw==} + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + + '@isaacs/fs-minipass@4.0.1': + resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==} + engines: {node: '>=18.0.0'} + '@jridgewell/gen-mapping@0.3.13': resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} @@ -855,6 +942,14 @@ packages: '@lezer/yaml@1.0.3': resolution: {integrity: sha512-GuBLekbw9jDBDhGur82nuwkxKQ+a3W5H0GfaAthDXcAu+XdpS43VlnxA9E9hllkpSP5ellRDKjLLj7Lu9Wr6xA==} + '@malept/cross-spawn-promise@2.0.0': + resolution: {integrity: sha512-1DpKU0Z5ThltBwjNySMC14g0CkbyhCaz9FkhxqNsZI6uAPJXFS8cMXlBKo26FJ8ZuW6S9GCMcR9IO5k2X5/9Fg==} + engines: {node: '>= 12.13.0'} + + '@malept/flatpak-bundler@0.4.0': + resolution: {integrity: sha512-9QOtNffcOF/c1seMCDnjckb3R9WHcG34tky+FHpNKKCW0wc/scYLwMtO+ptyGUfMW0/b/n4qRiALlaFHc9Oj7Q==} + engines: {node: '>= 10.0.0'} + '@marijn/find-cluster-break@1.0.2': resolution: {integrity: sha512-l0h88YhZFyKdXIFNfSWpyjStDjGHwZ/U7iobcK1cQQD8sejsONdQtTVU+1wVN1PBw40PiiHB1vA5S7VTfQiP9g==} @@ -887,9 +982,21 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} + '@npmcli/agent@3.0.0': + resolution: {integrity: sha512-S79NdEgDQd/NGCay6TCoVzXSj74skRZIKJcpJjC5lOq34SZzyI6MqtiiWoiVWoVrTcGjNeC4ipbh1VIHlpfF5Q==} + engines: {node: ^18.17.0 || >=20.5.0} + + '@npmcli/fs@4.0.0': + resolution: {integrity: sha512-/xGlezI6xfGO9NwuJlnwz/K14qD1kCSAGtacBHnGzeAIuJGazcp45KP5NuyARXoKb7cwulAGWVsbeSxdG/cb0Q==} + engines: {node: ^18.17.0 || >=20.5.0} + '@open-draft/deferred-promise@2.2.0': resolution: {integrity: sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==} + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + '@radix-ui/colors@3.0.0': resolution: {integrity: sha512-FUOsGBkHrYJwCSEtWRCIfQbZG7q1e6DgxCIOe1SUQzDe/7rXXeA47s8yCn6fuTNQAj1Zq4oTFi9Yjp3wzElcxg==} @@ -1554,67 +1661,56 @@ packages: resolution: {integrity: sha512-EPlb95nUsz6Dd9Qy13fI5kUPXNSljaG9FiJ4YUGU1O/Q77i5DYFW5KR8g1OzTcdZUqQQ1KdDqsTohdFVwCwjqg==} cpu: [arm] os: [linux] - libc: [glibc] '@rollup/rollup-linux-arm-musleabihf@4.53.2': resolution: {integrity: sha512-BOmnVW+khAUX+YZvNfa0tGTEMVVEerOxN0pDk2E6N6DsEIa2Ctj48FOMfNDdrwinocKaC7YXUZ1pHlKpnkja/Q==} cpu: [arm] os: [linux] - libc: [musl] '@rollup/rollup-linux-arm64-gnu@4.53.2': resolution: {integrity: sha512-Xt2byDZ+6OVNuREgBXr4+CZDJtrVso5woFtpKdGPhpTPHcNG7D8YXeQzpNbFRxzTVqJf7kvPMCub/pcGUWgBjA==} cpu: [arm64] os: [linux] - libc: [glibc] '@rollup/rollup-linux-arm64-musl@4.53.2': resolution: {integrity: sha512-+LdZSldy/I9N8+klim/Y1HsKbJ3BbInHav5qE9Iy77dtHC/pibw1SR/fXlWyAk0ThnpRKoODwnAuSjqxFRDHUQ==} cpu: [arm64] os: [linux] - libc: [musl] '@rollup/rollup-linux-loong64-gnu@4.53.2': resolution: {integrity: sha512-8ms8sjmyc1jWJS6WdNSA23rEfdjWB30LH8Wqj0Cqvv7qSHnvw6kgMMXRdop6hkmGPlyYBdRPkjJnj3KCUHV/uQ==} cpu: [loong64] os: [linux] - libc: [glibc] '@rollup/rollup-linux-ppc64-gnu@4.53.2': resolution: {integrity: sha512-3HRQLUQbpBDMmzoxPJYd3W6vrVHOo2cVW8RUo87Xz0JPJcBLBr5kZ1pGcQAhdZgX9VV7NbGNipah1omKKe23/g==} cpu: [ppc64] os: [linux] - libc: [glibc] '@rollup/rollup-linux-riscv64-gnu@4.53.2': resolution: {integrity: sha512-fMjKi+ojnmIvhk34gZP94vjogXNNUKMEYs+EDaB/5TG/wUkoeua7p7VCHnE6T2Tx+iaghAqQX8teQzcvrYpaQA==} cpu: [riscv64] os: [linux] - libc: [glibc] '@rollup/rollup-linux-riscv64-musl@4.53.2': resolution: {integrity: sha512-XuGFGU+VwUUV5kLvoAdi0Wz5Xbh2SrjIxCtZj6Wq8MDp4bflb/+ThZsVxokM7n0pcbkEr2h5/pzqzDYI7cCgLQ==} cpu: [riscv64] os: [linux] - libc: [musl] '@rollup/rollup-linux-s390x-gnu@4.53.2': resolution: {integrity: sha512-w6yjZF0P+NGzWR3AXWX9zc0DNEGdtvykB03uhonSHMRa+oWA6novflo2WaJr6JZakG2ucsyb+rvhrKac6NIy+w==} cpu: [s390x] os: [linux] - libc: [glibc] '@rollup/rollup-linux-x64-gnu@4.53.2': resolution: {integrity: sha512-yo8d6tdfdeBArzC7T/PnHd7OypfI9cbuZzPnzLJIyKYFhAQ8SvlkKtKBMbXDxe1h03Rcr7u++nFS7tqXz87Gtw==} cpu: [x64] os: [linux] - libc: [glibc] '@rollup/rollup-linux-x64-musl@4.53.2': resolution: {integrity: sha512-ah59c1YkCxKExPP8O9PwOvs+XRLKwh/mV+3YdKqQ5AMQ0r4M4ZDuOrpWkUaqO7fzAHdINzV9tEVu8vNw48z0lA==} cpu: [x64] os: [linux] - libc: [musl] '@rollup/rollup-openharmony-arm64@4.53.2': resolution: {integrity: sha512-4VEd19Wmhr+Zy7hbUsFZ6YXEiP48hE//KPLCSVNY5RMGX2/7HZ+QkN55a3atM1C/BZCGIgqN+xrVgtdak2S9+A==} @@ -1641,9 +1737,20 @@ packages: cpu: [x64] os: [win32] + '@sindresorhus/is@4.6.0': + resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} + engines: {node: '>=10'} + + '@standard-schema/spec@1.1.0': + resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} + '@stitches/core@1.2.8': resolution: {integrity: sha512-Gfkvwk9o9kE9r9XNBmJRfV8zONvXThnm1tcuojL04Uy5uRyqg93DC83lDebl0rocZCfKSjUv+fWYtMQmEDJldg==} + '@szmarczak/http-timer@4.0.6': + resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==} + engines: {node: '>=10'} + '@tabler/icons-react@3.35.0': resolution: {integrity: sha512-XG7t2DYf3DyHT5jxFNp5xyLVbL4hMJYJhiSdHADzAjLRYfL7AnjlRfiHDHeXxkb2N103rEIvTsBRazxXtAUz2g==} peerDependencies: @@ -1690,28 +1797,24 @@ packages: engines: {node: '>= 10'} cpu: [arm64] os: [linux] - libc: [glibc] '@tailwindcss/oxide-linux-arm64-musl@4.1.17': resolution: {integrity: sha512-HvZLfGr42i5anKtIeQzxdkw/wPqIbpeZqe7vd3V9vI3RQxe3xU1fLjss0TjyhxWcBaipk7NYwSrwTwK1hJARMg==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - libc: [musl] '@tailwindcss/oxide-linux-x64-gnu@4.1.17': resolution: {integrity: sha512-M3XZuORCGB7VPOEDH+nzpJ21XPvK5PyjlkSFkFziNHGLc5d6g3di2McAAblmaSUNl8IOmzYwLx9NsE7bplNkwQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - libc: [glibc] '@tailwindcss/oxide-linux-x64-musl@4.1.17': resolution: {integrity: sha512-k7f+pf9eXLEey4pBlw+8dgfJHY4PZ5qOUFDyNf7SI6lHjQ9Zt7+NcscjpwdCEbYi6FI5c2KDTDWyf2iHcCSyyQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - libc: [musl] '@tailwindcss/oxide-wasm32-wasi@4.1.17': resolution: {integrity: sha512-cEytGqSSoy7zK4JRWiTCx43FsKP/zGr0CsuMawhH67ONlH+T79VteQeJQRO/X7L0juEUA8ZyuYikcRBf0vsxhg==} @@ -1767,6 +1870,9 @@ packages: '@types/babel__traverse@7.28.0': resolution: {integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==} + '@types/cacheable-request@6.0.3': + resolution: {integrity: sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==} + '@types/d3-array@3.2.2': resolution: {integrity: sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw==} @@ -1869,27 +1975,42 @@ packages: '@types/estree@1.0.8': resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + '@types/fs-extra@9.0.13': + resolution: {integrity: sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==} + '@types/geojson@7946.0.16': resolution: {integrity: sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==} '@types/hast@3.0.4': resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} + '@types/http-cache-semantics@4.2.0': + resolution: {integrity: sha512-L3LgimLHXtGkWikKnsPg0/VFx9OGZaC+eN1u4r+OB1XRqH3meBIAVC2zr1WdMH+RHmnRkqliQAOHNJ/E0j/e0Q==} + '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + '@types/keyv@3.1.4': + resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} + '@types/mdast@4.0.4': resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} '@types/ms@2.1.0': resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} + '@types/node@22.19.15': + resolution: {integrity: sha512-F0R/h2+dsy5wJAUe3tAU6oqa2qbWY5TpNfL/RGmo1y38hiyO1w3x2jPtt76wmuaJI4DQnOBu21cNXQ2STIUUWg==} + '@types/node@24.10.1': resolution: {integrity: sha512-GNWcUTRBgIRJD5zj+Tq0fKOJ5XZajIiBroOF0yvj2bSU1WvNdYS/dn9UxwsujGW4JX06dnHyjV2y9rRaybH0iQ==} '@types/parse-json@4.0.2': resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} + '@types/plist@3.0.5': + resolution: {integrity: sha512-E6OCaRmAe4WDmWNsL/9RMqdkkzDCY1etutkflWk4c+AcjDU07Pcz1fQwTX0TQz+Pxqn9i4L1TU3UFpjnrcDgxA==} + '@types/prismjs@1.26.5': resolution: {integrity: sha512-AUZTa7hQ2KY5L7AmtSiqxlhWxb4ina0yd8hNbl4TWuqnv/pFP0nDMb3YrfSBf4hJVGLh2YEIBfKaBW/9UEl6IQ==} @@ -1904,6 +2025,9 @@ packages: '@types/react@19.2.4': resolution: {integrity: sha512-tBFxBp9Nfyy5rsmefN+WXc1JeW/j2BpBHFdLZbEVfs9wn3E3NRFxwV0pJg8M1qQAexFpvz73hJXFofV0ZAu92A==} + '@types/responselike@1.0.3': + resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==} + '@types/streamsaver@2.0.5': resolution: {integrity: sha512-93o0zjV8swEhR2YI57h/2ytbJF8bJh7sI9GNB02TLJHdM4fWDxZuChwfWhyD8vt2ub4kw4rsfZ0C0yAUX+3gcg==} @@ -1919,6 +2043,12 @@ packages: '@types/unist@3.0.3': resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} + '@types/verror@1.10.11': + resolution: {integrity: sha512-RlDm9K7+o5stv0Co8i8ZRGxDbrTxhJtgjqjFyVh/tXQyl/rYtTKlnTvZ88oSTeYREWurwx20Js4kTuKCsFkUtg==} + + '@types/yauzl@2.10.3': + resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} + '@typescript-eslint/eslint-plugin@8.46.4': resolution: {integrity: sha512-R48VhmTJqplNyDxCyqqVkFSZIx1qX6PzwqgcXn1olLrzxcSBDlOsbtcnQuQhNtnNiJ4Xe5gREI1foajYaYU2Vg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -1994,6 +2124,10 @@ packages: peerDependencies: vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 + '@xmldom/xmldom@0.8.11': + resolution: {integrity: sha512-cQzWCtO6C8TQiYl1ruKNn2U6Ao4o4WBBcbL61yJl84x+j5sOWWFU9X7DpND8XZG3daDppSsigMdfAIl2upQBRw==} + engines: {node: '>=10.0.0'} + '@xterm/addon-fit@0.10.0': resolution: {integrity: sha512-UFYkDm4HUahf2lnEyHvio51TNGiLK66mqP2JoATy7hRZeXaGMRDr00JiSF7m63vR5WKATF605yEggJKsw0JpMQ==} peerDependencies: @@ -2017,6 +2151,10 @@ packages: '@xterm/xterm@5.5.0': resolution: {integrity: sha512-hqJHYaQb5OptNunnyAnkHyM8aCjZ1MEIDTQu1iIbbTD/xops91NB5yq1ZK/dC2JDbVWtF23zUtl9JE2NqwT87A==} + abbrev@3.0.1: + resolution: {integrity: sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg==} + engines: {node: ^18.17.0 || >=20.5.0} + ace-builds@1.43.4: resolution: {integrity: sha512-8hAxVfo2ImICd69BWlZwZlxe9rxDGDjuUhh+WeWgGDvfBCE+r3lkynkQvIovDz4jcMi8O7bsEaFygaDT+h9sBA==} @@ -2030,6 +2168,15 @@ packages: engines: {node: '>=0.4.0'} hasBin: true + agent-base@7.1.4: + resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} + engines: {node: '>= 14'} + + ajv-keywords@3.5.2: + resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} + peerDependencies: + ajv: ^6.9.1 + ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} @@ -2040,10 +2187,28 @@ packages: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} + ansi-regex@6.2.2: + resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} + engines: {node: '>=12'} + ansi-styles@4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} + ansi-styles@6.2.3: + resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} + engines: {node: '>=12'} + + app-builder-bin@5.0.0-alpha.12: + resolution: {integrity: sha512-j87o0j6LqPL3QRr8yid6c+Tt5gC7xNfYo6uQIQkorAC6MpeayVMZrEDzKmJJ/Hlv7EnOQpaRm53k6ktDYZyB6w==} + + app-builder-lib@26.8.1: + resolution: {integrity: sha512-p0Im/Dx5C4tmz8QEE1Yn4MkuPC8PrnlRneMhWJj7BBXQfNTJUshM/bp3lusdEsDbvvfJZpXWnYesgSLvwtM2Zw==} + engines: {node: '>=14.0.0'} + peerDependencies: + dmg-builder: 26.8.1 + electron-builder-squirrel-windows: 26.8.1 + argparse@1.0.10: resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} @@ -2057,19 +2222,48 @@ packages: asn1.js@4.10.1: resolution: {integrity: sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==} + assert-plus@1.0.0: + resolution: {integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==} + engines: {node: '>=0.8'} + assert@2.1.0: resolution: {integrity: sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==} + astral-regex@2.0.0: + resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} + engines: {node: '>=8'} + + async-exit-hook@2.0.1: + resolution: {integrity: sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw==} + engines: {node: '>=0.12.0'} + + async@3.2.6: + resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} + + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + at-least-node@1.0.0: + resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} + engines: {node: '>= 4.0.0'} + available-typed-arrays@1.0.7: resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} engines: {node: '>= 0.4'} + axios@1.13.6: + resolution: {integrity: sha512-ChTCHMouEe2kn713WHbQGcuYrr6fXTBiu460OTwWrWob16g1bXn4vtz07Ope7ewMozJAnEquLk5lWQWtBig9DQ==} + bail@2.0.2: resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + balanced-match@4.0.4: + resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} + engines: {node: 18 || 20 || >=22} + base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} @@ -2080,18 +2274,29 @@ packages: bindings@1.5.0: resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} + bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + bn.js@4.12.2: resolution: {integrity: sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==} bn.js@5.2.2: resolution: {integrity: sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw==} + boolean@3.2.0: + resolution: {integrity: sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + brace-expansion@1.1.12: resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} brace-expansion@2.0.2: resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} + brace-expansion@5.0.4: + resolution: {integrity: sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==} + engines: {node: 18 || 20 || >=22} + braces@3.0.3: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} @@ -2127,6 +2332,12 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true + buffer-crc32@0.2.13: + resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} + + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + buffer-xor@1.0.3: resolution: {integrity: sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==} @@ -2136,9 +2347,28 @@ packages: buffer@6.0.3: resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + builder-util-runtime@9.5.1: + resolution: {integrity: sha512-qt41tMfgHTllhResqM5DcnHyDIWNgzHvuY2jDcYP9iaGpkWxTUzV6GQjDeLnlR1/DtdlcsWQbA7sByMpmJFTLQ==} + engines: {node: '>=12.0.0'} + + builder-util@26.8.1: + resolution: {integrity: sha512-pm1lTYbGyc90DHgCDO7eo8Rl4EqKLciayNbZqGziqnH9jrlKe8ZANGdityLZU+pJh16dfzjAx2xQq9McuIPEtw==} + builtin-status-codes@3.0.0: resolution: {integrity: sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==} + cacache@19.0.1: + resolution: {integrity: sha512-hdsUxulXCi5STId78vRVYEtDAjq99ICAUktLTeTYsLoTE6Z8dS0c8pWNCxwdrk9YfJeobDZc2Y186hD/5ZQgFQ==} + engines: {node: ^18.17.0 || >=20.5.0} + + cacheable-lookup@5.0.4: + resolution: {integrity: sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==} + engines: {node: '>=10.6.0'} + + cacheable-request@7.0.4: + resolution: {integrity: sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==} + engines: {node: '>=8'} + call-bind-apply-helpers@1.0.2: resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} engines: {node: '>= 0.4'} @@ -2188,6 +2418,21 @@ packages: chevrotain@11.0.3: resolution: {integrity: sha512-ci2iJH6LeIkvP9eJW6gpueU8cnZhv85ELY8w8WiFtNjMHA5ad6pQLaJo9mEly/9qUyCpvqX8/POVUTf18/HFdw==} + chownr@3.0.0: + resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} + engines: {node: '>=18'} + + chromium-pickle-js@0.2.0: + resolution: {integrity: sha512-1R5Fho+jBq0DDydt+/vHWj5KJNJCKdARKOCwZUen84I5BreWoLqRLANH1U87eJy1tiASPtMnGqJJq0ZsLoRPOw==} + + ci-info@4.3.1: + resolution: {integrity: sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA==} + engines: {node: '>=8'} + + ci-info@4.4.0: + resolution: {integrity: sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==} + engines: {node: '>=8'} + cipher-base@1.0.7: resolution: {integrity: sha512-Mz9QMT5fJe7bKI7MH31UilT5cEK5EHHRCccw/YRFsRY47AuNgaV6HY3rscp0/I4Q+tTW/5zoqpSeRRI54TkDWA==} engines: {node: '>= 0.10'} @@ -2201,10 +2446,29 @@ packages: clean-set@1.1.2: resolution: {integrity: sha512-cA8uCj0qSoG9e0kevyOWXwPaELRPVg5Pxp6WskLMwerx257Zfnh8Nl0JBH59d7wQzij2CK7qEfJQK3RjuKKIug==} + cli-cursor@3.1.0: + resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} + engines: {node: '>=8'} + + cli-spinners@2.9.2: + resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} + engines: {node: '>=6'} + + cli-truncate@2.1.0: + resolution: {integrity: sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==} + engines: {node: '>=8'} + cliui@8.0.1: resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} engines: {node: '>=12'} + clone-response@1.0.3: + resolution: {integrity: sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==} + + clone@1.0.4: + resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} + engines: {node: '>=0.8'} + clsx@2.1.1: resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} engines: {node: '>=6'} @@ -2233,9 +2497,17 @@ packages: color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + comma-separated-tokens@2.0.3: resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + commander@5.1.0: + resolution: {integrity: sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==} + engines: {node: '>= 6'} + commander@7.2.0: resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} engines: {node: '>= 10'} @@ -2244,12 +2516,25 @@ packages: resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} engines: {node: '>= 12'} + commander@9.5.0: + resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} + engines: {node: ^12.20.0 || >=14} + + compare-version@0.1.2: + resolution: {integrity: sha512-pJDh5/4wrEnXX/VWRZvruAGHkzKdr46z11OlTPN+VrATlWWhSKewNCJ1futCO5C7eJB3nPMFZA1LeYtcFboZ2A==} + engines: {node: '>=0.10.0'} + compute-scroll-into-view@2.0.4: resolution: {integrity: sha512-y/ZA3BGnxoM/QHHQ2Uy49CLtnWPbt4tTPpEEZiEmmiWBFKjej7nEyH8Ryz54jH0MLXflUYA3Er2zUxPSJu5R+g==} concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + concurrently@9.2.1: + resolution: {integrity: sha512-fsfrO0MxV64Znoy8/l1vVIjjHa29SZyyqPgQBwhiDcaW8wJc2W3XWVOGx4M3oJBnv/zdUZIIp1gDeS98GzP8Ng==} + engines: {node: '>=18'} + hasBin: true + confbox@0.1.8: resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} @@ -2266,6 +2551,9 @@ packages: resolution: {integrity: sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==} engines: {node: '>=18'} + core-util-is@1.0.2: + resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==} + core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} @@ -2279,6 +2567,9 @@ packages: resolution: {integrity: sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==} engines: {node: '>=10'} + crc@3.8.0: + resolution: {integrity: sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==} + create-ecdh@4.0.4: resolution: {integrity: sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==} @@ -2294,6 +2585,9 @@ packages: crelt@1.0.6: resolution: {integrity: sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==} + cross-dirname@0.1.0: + resolution: {integrity: sha512-+R08/oI0nl3vfPcqftZRpytksBXDzOUveBq/NBVx0sUp1axwzPQrKinNx5yd5sxPu8j1wIy8AfnVQ+5eFdha6Q==} + cross-spawn@7.0.6: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} @@ -2484,9 +2778,20 @@ packages: decode-named-character-reference@1.2.0: resolution: {integrity: sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q==} + decompress-response@6.0.0: + resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} + engines: {node: '>=10'} + deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + defaults@1.0.4: + resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} + + defer-to-connect@2.0.1: + resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} + engines: {node: '>=10'} + define-data-property@1.1.4: resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} engines: {node: '>= 0.4'} @@ -2498,6 +2803,10 @@ packages: delaunator@5.0.1: resolution: {integrity: sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==} + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + dequal@2.0.3: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} @@ -2512,6 +2821,9 @@ packages: detect-node-es@1.1.0: resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} + detect-node@2.1.0: + resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} + dev@0.1.3: resolution: {integrity: sha512-flCHQwAkXk3+1up/wo93Ms9E5Wf9K28ZGA7Oz55nBZ8OTdPPhyvZrwsT+twtySTFHIwv0w9CUNtagZgu1MgzXQ==} hasBin: true @@ -2536,6 +2848,18 @@ packages: diffie-hellman@5.0.3: resolution: {integrity: sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==} + dir-compare@4.2.0: + resolution: {integrity: sha512-2xMCmOoMrdQIPHdsTawECdNPwlVFB9zGcz3kuhmBO6U3oU+UQjsue0i8ayLKpgBcm+hcXPMVSGUN9d+pvJ6+VQ==} + + dmg-builder@26.8.1: + resolution: {integrity: sha512-glMJgnTreo8CFINujtAhCgN96QAqApDMZ8Vl1r8f0QT8QprvC1UCltV4CcWj20YoIyLZx6IUskaJZ0NV8fokcg==} + + dmg-license@1.0.11: + resolution: {integrity: sha512-ZdzmqwKmECOWJpqefloC5OJy1+WZBBse5+MR88z9g9Zn4VY+WYUkAyojmhzJckH5YbbZGcYIuGAkY5/Ys5OM2Q==} + engines: {node: '>=8'} + os: [darwin] + hasBin: true + domain-browser@4.22.0: resolution: {integrity: sha512-IGBwjF7tNk3cwypFNH/7bfzBcgSCbaMOD3GsaY1AU/JRrnHnYgEM0+9kQt52iZxjNsjBtJYtao146V+f8jFZNw==} engines: {node: '>=10'} @@ -2543,6 +2867,10 @@ packages: dompurify@3.3.1: resolution: {integrity: sha512-qkdCKzLNtrgPFP1Vo+98FRzJnBRGe4ffyCea9IwHB1fyxPOeNTHpLKYGd4Uk9xvNoH0ZoOjwZxNptyMwqrId1Q==} + dotenv-expand@11.0.7: + resolution: {integrity: sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA==} + engines: {node: '>=12'} + dotenv@16.6.1: resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==} engines: {node: '>=12'} @@ -2556,15 +2884,52 @@ packages: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + ejs@3.1.10: + resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==} + engines: {node: '>=0.10.0'} + hasBin: true + + electron-builder-squirrel-windows@26.8.1: + resolution: {integrity: sha512-o288fIdgPLHA76eDrFADHPoo7VyGkDCYbLV1GzndaMSAVBoZrGvM9m2IehdcVMzdAZJ2eV9bgyissQXHv5tGzA==} + + electron-builder@26.8.1: + resolution: {integrity: sha512-uWhx1r74NGpCagG0ULs/P9Nqv2nsoo+7eo4fLUOB8L8MdWltq9odW/uuLXMFCDGnPafknYLZgjNX0ZIFRzOQAw==} + engines: {node: '>=14.0.0'} + hasBin: true + + electron-publish@26.8.1: + resolution: {integrity: sha512-q+jrSTIh/Cv4eGZa7oVR+grEJo/FoLMYBAnSL5GCtqwUpr1T+VgKB/dn1pnzxIxqD8S/jP1yilT9VrwCqINR4w==} + electron-to-chromium@1.5.250: resolution: {integrity: sha512-/5UMj9IiGDMOFBnN4i7/Ry5onJrAGSbOGo3s9FEKmwobGq6xw832ccET0CE3CkkMBZ8GJSlUIesZofpyurqDXw==} + electron-winstaller@5.4.0: + resolution: {integrity: sha512-bO3y10YikuUwUuDUQRM4KfwNkKhnpVO7IPdbsrejwN9/AABJzzTQ4GeHwyzNSrVO+tEH3/Np255a3sVZpZDjvg==} + engines: {node: '>=8.0.0'} + + electron@35.7.5: + resolution: {integrity: sha512-dnL+JvLraKZl7iusXTVTGYs10TKfzUi30uEDTqsmTm0guN9V2tbOjTzyIZbh9n3ygUjgEYyo+igAwMRXIi3IPw==} + engines: {node: '>= 12.20.55'} + hasBin: true + elliptic@6.6.1: resolution: {integrity: sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==} emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + encoding@0.1.13: + resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==} + + end-of-stream@1.4.5: + resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} + enhanced-resolve@5.18.3: resolution: {integrity: sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==} engines: {node: '>=10.13.0'} @@ -2573,6 +2938,13 @@ packages: resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} engines: {node: '>=0.12'} + env-paths@2.2.1: + resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} + engines: {node: '>=6'} + + err-code@2.0.3: + resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==} + error-ex@1.3.4: resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==} @@ -2588,10 +2960,17 @@ packages: resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} engines: {node: '>= 0.4'} + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} + es5-ext@0.10.64: resolution: {integrity: sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==} engines: {node: '>=0.10'} + es6-error@4.1.1: + resolution: {integrity: sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==} + es6-iterator@2.0.3: resolution: {integrity: sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==} @@ -2707,6 +3086,9 @@ packages: evp_bytestokey@1.0.3: resolution: {integrity: sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==} + exponential-backoff@3.1.3: + resolution: {integrity: sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==} + ext@1.7.0: resolution: {integrity: sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==} @@ -2717,6 +3099,15 @@ packages: extend@3.0.2: resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + extract-zip@2.0.1: + resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==} + engines: {node: '>= 10.17.0'} + hasBin: true + + extsprintf@1.4.1: + resolution: {integrity: sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA==} + engines: {'0': node >=0.6.0} + fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} @@ -2742,6 +3133,9 @@ packages: fault@2.0.1: resolution: {integrity: sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==} + fd-slicer@1.1.0: + resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} + fdir@6.5.0: resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} engines: {node: '>=12.0.0'} @@ -2762,6 +3156,9 @@ packages: file-uri-to-path@1.0.0: resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} + filelist@1.0.6: + resolution: {integrity: sha512-5giy2PkLYY1cP39p17Ech+2xlpTRL9HLspOfEgm0L6CwBXBTgsK5ou0JtzYuepxkaQ/tvhCFIJ5uXo0OrM2DxA==} + fill-range@7.1.1: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} @@ -2777,10 +3174,27 @@ packages: flatted@3.3.3: resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} + follow-redirects@1.15.11: + resolution: {integrity: sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + for-each@0.3.5: resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} engines: {node: '>= 0.4'} + foreground-child@3.3.1: + resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} + engines: {node: '>=14'} + + form-data@4.0.5: + resolution: {integrity: sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==} + engines: {node: '>= 6'} + format@0.2.2: resolution: {integrity: sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==} engines: {node: '>=0.4.x'} @@ -2789,6 +3203,33 @@ packages: resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} engines: {node: '>=12.20.0'} + fs-extra@10.1.0: + resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} + engines: {node: '>=12'} + + fs-extra@11.3.4: + resolution: {integrity: sha512-CTXd6rk/M3/ULNQj8FBqBWHYBVYybQ3VPBw0xGKFe3tuH7ytT6ACnvzpIQ3UZtB8yvUKC2cXn1a+x+5EVQLovA==} + engines: {node: '>=14.14'} + + fs-extra@7.0.1: + resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} + engines: {node: '>=6 <7 || >=8'} + + fs-extra@8.1.0: + resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} + engines: {node: '>=6 <7 || >=8'} + + fs-extra@9.1.0: + resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} + engines: {node: '>=10'} + + fs-minipass@3.0.3: + resolution: {integrity: sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} @@ -2821,6 +3262,10 @@ packages: resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} engines: {node: '>= 0.4'} + get-stream@5.2.0: + resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} + engines: {node: '>=8'} + gitdiff-parser@0.3.1: resolution: {integrity: sha512-YQJnY8aew65id8okGxKCksH3efDCJ9HzV7M9rsvd65habf39Pkh4cgYJ27AaoDMqo1X98pgNJhNMrm/kpV7UVQ==} @@ -2832,6 +3277,18 @@ packages: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} engines: {node: '>=10.13.0'} + glob@10.5.0: + resolution: {integrity: sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==} + hasBin: true + + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported + + global-agent@3.0.0: + resolution: {integrity: sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==} + engines: {node: '>=10.0'} + globals@14.0.0: resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} engines: {node: '>=18'} @@ -2840,10 +3297,18 @@ packages: resolution: {integrity: sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==} engines: {node: '>=18'} + globalthis@1.0.4: + resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} + engines: {node: '>= 0.4'} + gopd@1.2.0: resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} engines: {node: '>= 0.4'} + got@11.8.6: + resolution: {integrity: sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==} + engines: {node: '>=10.19.0'} + graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} @@ -2920,18 +3385,42 @@ packages: hmac-drbg@1.0.1: resolution: {integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==} + hosted-git-info@4.1.0: + resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} + engines: {node: '>=10'} + html-url-attributes@3.0.1: resolution: {integrity: sha512-ol6UPyBWqsrO6EJySPz2O7ZSr856WDrEzM5zMqp+FJJLGMW35cLYmmZnl0vztAZxRUoNZJFTCohfjuIJ8I4QBQ==} html-void-elements@3.0.0: resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} + http-cache-semantics@4.2.0: + resolution: {integrity: sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==} + + http-proxy-agent@7.0.2: + resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} + engines: {node: '>= 14'} + http2-client@1.3.5: resolution: {integrity: sha512-EC2utToWl4RKfs5zd36Mxq7nzHHBuomZboI0yYL6Y0RmBgT7Sgkq4rQ0ezFTYoIsSs7Tm9SJe+o2FcAg6GBhGA==} + http2-wrapper@1.0.3: + resolution: {integrity: sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==} + engines: {node: '>=10.19.0'} + https-browserify@1.0.0: resolution: {integrity: sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==} + https-proxy-agent@7.0.6: + resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} + engines: {node: '>= 14'} + + iconv-corefoundation@1.1.7: + resolution: {integrity: sha512-T10qvkw0zz4wnm560lOEg0PovVqUXuOFhhHAkixw8/sycy7TJt7v/RrkEKEQnAw2viPSJu6iAkErxnzR0g8PpQ==} + engines: {node: ^8.11.2 || >=10} + os: [darwin] + iconv-lite@0.6.3: resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} engines: {node: '>=0.10.0'} @@ -2958,6 +3447,10 @@ packages: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} @@ -2980,6 +3473,10 @@ packages: resolution: {integrity: sha512-fn4bQ0Xq8FTej09YC/jqKZwtijpvARlRp6wxL5WTA6yPe2YWSJ5RJh7Nm79rK2qB0wr6iDQzH60XGq5V/7u8YQ==} deprecated: The Intersection Observer polyfill is no longer needed and can safely be removed. Intersection Observer has been Baseline since 2019. + ip-address@10.1.0: + resolution: {integrity: sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==} + engines: {node: '>= 12'} + is-alphabetical@2.0.1: resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} @@ -3027,6 +3524,10 @@ packages: is-hexadecimal@2.0.1: resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} + is-interactive@1.0.0: + resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} + engines: {node: '>=8'} + is-nan@1.3.2: resolution: {integrity: sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==} engines: {node: '>= 0.4'} @@ -3047,15 +3548,31 @@ packages: resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} engines: {node: '>= 0.4'} + is-unicode-supported@0.1.0: + resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} + engines: {node: '>=10'} + isarray@1.0.0: resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} isarray@2.0.5: resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + isbinaryfile@4.0.10: + resolution: {integrity: sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==} + engines: {node: '>= 8.0.0'} + + isbinaryfile@5.0.7: + resolution: {integrity: sha512-gnWD14Jh3FzS3CPhF0AxNOJ8CxqeblPTADzI38r0wt8ZyQl5edpy75myt08EG2oKvpyiqSqsx+Wkz9vtkbTqYQ==} + engines: {node: '>= 18.0.0'} + isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + isexe@3.1.5: + resolution: {integrity: sha512-6B3tLtFqtQS4ekarvLVMZ+X+VlvQekbe4taUkf/rhVO3d/h0M2rfARm/pXLcPEsjjMsFgrFgSrhQIxcSVrBz8w==} + engines: {node: '>=18'} + isomorphic-timers-promises@1.0.1: resolution: {integrity: sha512-u4sej9B1LPSxTGKB/HiuzvEQnXH0ECYkSVQU39koSwmFAxhlEAFl9RdTvLv4TOTQUgBS5O3O5fwUxk6byBZ+IQ==} engines: {node: '>=10'} @@ -3063,10 +3580,22 @@ packages: isomorphic.js@0.2.5: resolution: {integrity: sha512-PIeMbHqMt4DnUP3MA/Flc0HElYjMXArsw1qwJZcm9sqR8mq3l8NYizFMty0pWwE/tzIGH3EKK5+jes5mAr85yw==} + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + + jake@10.9.4: + resolution: {integrity: sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA==} + engines: {node: '>=10'} + hasBin: true + jiti@2.6.1: resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} hasBin: true + joi@18.0.2: + resolution: {integrity: sha512-RuCOQMIt78LWnktPoeBL0GErkNaJPTBGcYuyaBvUOQSpcpcLfWrHPPihYdOGbV5pam9VTWbeoF7TsGiHugcjGA==} + engines: {node: '>= 20'} + js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} @@ -3099,11 +3628,20 @@ packages: json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + json-stringify-safe@5.0.1: + resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} + json5@2.2.3: resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} engines: {node: '>=6'} hasBin: true + jsonfile@4.0.0: + resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + + jsonfile@6.2.0: + resolution: {integrity: sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==} + jszip@3.10.1: resolution: {integrity: sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==} @@ -3135,6 +3673,9 @@ packages: layout-base@2.0.1: resolution: {integrity: sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg==} + lazy-val@1.0.5: + resolution: {integrity: sha512-0/BnGCCfyUMkBpeDgWihanIAF9JmZhHBgUhEqzvf+adhNGLoP6TaiI5oF8oyb3I45P+PcnrqihSf01M0l0G5+Q==} + levn@0.4.1: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} @@ -3185,28 +3726,24 @@ packages: engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] - libc: [glibc] lightningcss-linux-arm64-musl@1.30.2: resolution: {integrity: sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] - libc: [musl] lightningcss-linux-x64-gnu@1.30.2: resolution: {integrity: sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] - libc: [glibc] lightningcss-linux-x64-musl@1.30.2: resolution: {integrity: sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] - libc: [musl] lightningcss-win32-arm64-msvc@1.30.2: resolution: {integrity: sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==} @@ -3251,6 +3788,10 @@ packages: lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + log-symbols@4.1.0: + resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} + engines: {node: '>=10'} + longest-streak@3.1.0: resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} @@ -3258,12 +3799,23 @@ packages: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true + lowercase-keys@2.0.0: + resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==} + engines: {node: '>=8'} + lowlight@1.20.0: resolution: {integrity: sha512-8Ktj+prEb1RoCPkEOrPMYUN/nCggB7qAWe3a7OpMjWQkh3l2RD5wKRQ+o8Q8YuI9RG/xs95waaI/E6ym/7NsTw==} + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + lucide-react@0.553.0: resolution: {integrity: sha512-BRgX5zrWmNy/lkVAe0dXBgd7XQdZ3HTf+Hwe3c9WK6dqgnj9h+hxV+MDncM88xDWlCq27+TKvHGE70ViODNILw==} peerDependencies: @@ -3280,6 +3832,10 @@ packages: resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} engines: {node: '>=8'} + make-fetch-happen@14.0.3: + resolution: {integrity: sha512-QMjGbFTP0blj97EeidG5hk/QhKQ3T4ICckQGLgz38QF7Vgbk6e6FTARN8KhKxyBbWn8R0HU+bnw8aSoFPD4qtQ==} + engines: {node: ^18.17.0 || >=20.5.0} + markdown-table@3.0.4: resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} @@ -3288,6 +3844,10 @@ packages: engines: {node: '>= 20'} hasBin: true + matcher@3.0.0: + resolution: {integrity: sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==} + engines: {node: '>=10'} + math-intrinsics@1.1.0: resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} engines: {node: '>= 0.4'} @@ -3481,23 +4041,95 @@ packages: resolution: {integrity: sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==} hasBin: true + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + mime-db@1.54.0: resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==} engines: {node: '>= 0.6'} + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + mime@2.6.0: + resolution: {integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==} + engines: {node: '>=4.0.0'} + hasBin: true + + mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + + mimic-response@1.0.1: + resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==} + engines: {node: '>=4'} + + mimic-response@3.1.0: + resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} + engines: {node: '>=10'} + minimalistic-assert@1.0.1: resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} minimalistic-crypto-utils@1.0.1: resolution: {integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==} + minimatch@10.2.4: + resolution: {integrity: sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==} + engines: {node: 18 || 20 || >=22} + minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + minimatch@5.1.9: + resolution: {integrity: sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==} + engines: {node: '>=10'} + minimatch@9.0.5: resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} engines: {node: '>=16 || 14 >=14.17'} + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + minipass-collect@2.0.1: + resolution: {integrity: sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==} + engines: {node: '>=16 || 14 >=14.17'} + + minipass-fetch@4.0.1: + resolution: {integrity: sha512-j7U11C5HXigVuutxebFadoYBbd7VSdZWggSe64NVdvWNBqGAiXPL2QVCehjmw7lY1oF9gOllYbORh+hiNgfPgQ==} + engines: {node: ^18.17.0 || >=20.5.0} + + minipass-flush@1.0.5: + resolution: {integrity: sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==} + engines: {node: '>= 8'} + + minipass-pipeline@1.2.4: + resolution: {integrity: sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==} + engines: {node: '>=8'} + + minipass-sized@1.0.3: + resolution: {integrity: sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==} + engines: {node: '>=8'} + + minipass@3.3.6: + resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} + engines: {node: '>=8'} + + minipass@7.1.3: + resolution: {integrity: sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==} + engines: {node: '>=16 || 14 >=14.17'} + + minizlib@3.1.0: + resolution: {integrity: sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==} + engines: {node: '>= 18'} + + mkdirp@0.5.6: + resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} + hasBin: true + mlly@1.8.0: resolution: {integrity: sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==} @@ -3524,7 +4156,11 @@ packages: natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - next-themes@0.4.6: + negotiator@1.0.0: + resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==} + engines: {node: '>= 0.6'} + + next-themes@0.4.6: resolution: {integrity: sha512-pZvgD5L0IEvX5/9GWyHMf3m8BKiVQwsCMHfoFosXtXBMnaS0ZnIJ9ST4b4NqLVKDEm8QBxoNNGNaBv2JNF6XNA==} peerDependencies: react: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc @@ -3533,6 +4169,16 @@ packages: next-tick@1.1.0: resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==} + node-abi@4.28.0: + resolution: {integrity: sha512-Qfp5XZL1cJDOabOT8H5gnqMTmM4NjvYzHp4I/Kt/Sl76OVkOBBHRFlPspGV0hYvMoqQsypFjT/Yp7Km0beXW9g==} + engines: {node: '>=22.12.0'} + + node-addon-api@1.7.2: + resolution: {integrity: sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg==} + + node-api-version@0.2.1: + resolution: {integrity: sha512-2xP/IGGMmmSQpI1+O/k72jF/ykvZ89JeuKX3TLJAYPDVLUalrshrLHkeVcCCZqG/eEa635cr8IBYzgnDvM2O8Q==} + node-domexception@1.0.0: resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} engines: {node: '>=10.5.0'} @@ -3558,6 +4204,11 @@ packages: resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + node-gyp@11.5.0: + resolution: {integrity: sha512-ra7Kvlhxn5V9Slyus0ygMa2h+UqExPqUIkfk7Pc8QTLT956JLSy51uWFwHtIYy0vI8cB4BDhc/S03+880My/LQ==} + engines: {node: ^18.17.0 || >=20.5.0} + hasBin: true + node-readfiles@0.2.0: resolution: {integrity: sha512-SU00ZarexNlE4Rjdm83vglt5Y9yiQ+XI1XpflWlb7q7UTN1JUItm69xMeiQCTxtTfnzt+83T8Cx+vI2ED++VDA==} @@ -3568,6 +4219,15 @@ packages: resolution: {integrity: sha512-X75ZN8DCLftGM5iKwoYLA3rjnrAEs97MkzvSd4q2746Tgpg8b8XWiBGiBG4ZpgcAqBgtgPHTiAc8ZMCvZuikDw==} engines: {node: '>=10'} + nopt@8.1.0: + resolution: {integrity: sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A==} + engines: {node: ^18.17.0 || >=20.5.0} + hasBin: true + + normalize-url@6.1.0: + resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==} + engines: {node: '>=10'} + oas-kit-common@1.0.8: resolution: {integrity: sha512-pJTS2+T0oGIwgjGpw7sIRU8RQMcUoKCDWFLdBqKB2BNmGpbBMH2sdqAaOXUg8OzonZHU0L7vfJu1mJFEiYDWOQ==} @@ -3604,16 +4264,31 @@ packages: resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} engines: {node: '>= 0.4'} + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + optionator@0.9.4: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} + ora@5.4.1: + resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} + engines: {node: '>=10'} + os-browserify@0.3.0: resolution: {integrity: sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==} outvariant@1.4.0: resolution: {integrity: sha512-AlWY719RF02ujitly7Kk/0QlV+pXGFDHrHf9O2OKqyqgBieaPOIeuSkL8sRK6j2WK+/ZAURq2kZsY0d8JapUiw==} + p-cancelable@2.1.1: + resolution: {integrity: sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==} + engines: {node: '>=8'} + p-limit@3.1.0: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} @@ -3622,6 +4297,13 @@ packages: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} engines: {node: '>=10'} + p-map@7.0.4: + resolution: {integrity: sha512-tkAQEw8ysMzmkhgw8k+1U/iPhWNhykKnSk4Rd5zLoPJCuJaGRPo6YposrZgaxHKzDHdDWWZvE/Sk7hsL2X/CpQ==} + engines: {node: '>=18'} + + package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + package-manager-detector@1.6.0: resolution: {integrity: sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA==} @@ -3656,6 +4338,10 @@ packages: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + path-key@3.1.1: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} @@ -3663,6 +4349,10 @@ packages: path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} @@ -3674,6 +4364,13 @@ packages: resolution: {integrity: sha512-Q3CG/cYvCO1ye4QKkuH7EXxs3VC/rI1/trd+qX2+PolbaKG0H+bgcZzrTt96mMyRtejk+JMCiLUn3y29W8qmFQ==} engines: {node: '>= 0.10'} + pe-library@0.4.1: + resolution: {integrity: sha512-eRWB5LBz7PpDu4PUlwT0PhnQfTQJlDDdPa35urV4Osrm0t0AqQFGn+UIkU3klZvwJ8KPO3VbBFsXquA6p6kqZw==} + engines: {node: '>=12', npm: '>=6'} + + pend@1.2.0: + resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} + picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} @@ -3692,6 +4389,10 @@ packages: pkg-types@1.3.1: resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} + plist@3.1.0: + resolution: {integrity: sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==} + engines: {node: '>=10.4.0'} + points-on-curve@0.2.0: resolution: {integrity: sha512-0mYKnYYe9ZcqMCWhUjItv/oHjvgEsfKvnUTg8sAtnHr3GVy7rGkXCb6d5cSyqrWqL4k81b9CPg3urd+T7aop3A==} @@ -3706,6 +4407,11 @@ packages: resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} engines: {node: ^10 || ^12 || >=14} + postject@1.0.0-alpha.6: + resolution: {integrity: sha512-b9Eb8h2eVqNE8edvKdwqkrY6O7kAwmI8kcnBv1NScolYJbo59XUF0noFq+lxbC1yN20bmC0WBEbDC5H/7ASb0A==} + engines: {node: '>=14.0.0'} + hasBin: true + prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} @@ -3719,6 +4425,10 @@ packages: resolution: {integrity: sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==} engines: {node: '>=6'} + proc-log@5.0.0: + resolution: {integrity: sha512-Azwzvl90HaF0aCz1JrDdXQykFakSSNPaPoiZ9fm5qJIMHioDZEi7OAdRwSm6rSoPtY3Qutnm3L7ogmg3dc+wbQ==} + engines: {node: ^18.17.0 || >=20.5.0} + process-nextick-args@2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} @@ -3726,15 +4436,32 @@ packages: resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} engines: {node: '>= 0.6.0'} + progress@2.0.3: + resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} + engines: {node: '>=0.4.0'} + + promise-retry@2.0.1: + resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==} + engines: {node: '>=10'} + prop-types@15.8.1: resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + proper-lockfile@4.1.2: + resolution: {integrity: sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==} + property-information@7.1.0: resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==} + proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + public-encrypt@4.0.3: resolution: {integrity: sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==} + pump@3.0.4: + resolution: {integrity: sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==} + punycode@1.4.1: resolution: {integrity: sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==} @@ -3753,6 +4480,10 @@ packages: queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + quick-lru@5.1.1: + resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} + engines: {node: '>=10'} + randombytes@2.1.0: resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} @@ -3869,6 +4600,10 @@ packages: resolution: {integrity: sha512-tmbWg6W31tQLeB5cdIBOicJDJRR2KzXsV7uSK9iNfLWQ5bIZfxuPEHp7M8wiHyHnn0DD1i7w3Zmin0FtkrwoCQ==} engines: {node: '>=0.10.0'} + read-binary-file-arch@1.0.6: + resolution: {integrity: sha512-BNg9EN3DD3GsDXX7Aa8O4p92sryjkmzYYgmgTAc6CA4uGLEDzFfxOxugu21akOxpcXHiEgsYkC6nPsQvLLLmEg==} + hasBin: true + readable-stream@2.3.8: resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} @@ -3910,6 +4645,13 @@ packages: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} + resedit@1.7.2: + resolution: {integrity: sha512-vHjcY2MlAITJhC0eRD/Vv8Vlgmu9Sd3LX9zZvtGzU5ZImdTN3+d6e/4mnTyV8vEbyf1sgNIrWxhWlrys52OkEA==} + engines: {node: '>=12', npm: '>=6'} + + resolve-alpn@1.2.1: + resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} + resolve-from@4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} @@ -3919,14 +4661,34 @@ packages: engines: {node: '>= 0.4'} hasBin: true + responselike@2.0.1: + resolution: {integrity: sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==} + + restore-cursor@3.1.0: + resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} + engines: {node: '>=8'} + + retry@0.12.0: + resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} + engines: {node: '>= 4'} + reusify@1.1.0: resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + rimraf@2.6.3: + resolution: {integrity: sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==} + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + ripemd160@2.0.3: resolution: {integrity: sha512-5Di9UC0+8h1L6ZD2d7awM7E/T4uA1fJRlx6zk/NvdCCVEoAnFqvHmCuNeIKoCeIixBX/q8uM+6ycDvF8woqosA==} engines: {node: '>= 0.8'} + roarr@2.15.4: + resolution: {integrity: sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==} + engines: {node: '>=8.0'} + robust-predicates@3.0.2: resolution: {integrity: sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==} @@ -3944,6 +4706,9 @@ packages: rw@1.3.3: resolution: {integrity: sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==} + rxjs@7.8.2: + resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==} + sade@1.8.1: resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} engines: {node: '>=6'} @@ -3961,6 +4726,13 @@ packages: safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + sanitize-filename@1.6.4: + resolution: {integrity: sha512-9ZyI08PsvdQl2r/bBIGubpVdR3RR9sY6RDiWFPreA21C/EFlQhmgo20UZlNjZMMZNubusLhAQozkA0Od5J21Eg==} + + sax@1.6.0: + resolution: {integrity: sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==} + engines: {node: '>=11.0.0'} + scheduler@0.27.0: resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==} @@ -3968,6 +4740,13 @@ packages: resolution: {integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==} engines: {node: '>=4'} + semver-compare@1.0.0: + resolution: {integrity: sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==} + + semver@5.7.2: + resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} + hasBin: true + semver@6.3.1: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true @@ -3977,6 +4756,10 @@ packages: engines: {node: '>=10'} hasBin: true + serialize-error@7.0.1: + resolution: {integrity: sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==} + engines: {node: '>=10'} + set-cookie-parser@2.7.2: resolution: {integrity: sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==} @@ -4003,6 +4786,10 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} + shell-quote@1.8.3: + resolution: {integrity: sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==} + engines: {node: '>= 0.4'} + should-equal@2.0.0: resolution: {integrity: sha512-ZP36TMrK9euEuWQYBig9W55WPC7uo37qzAEmbjHz4gfyuXrEUgF8cUvQVO+w+d3OMfPvSRQJ22lSm8MQJ43LTA==} @@ -4037,6 +4824,33 @@ packages: resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} engines: {node: '>= 0.4'} + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + simple-update-notifier@2.0.0: + resolution: {integrity: sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==} + engines: {node: '>=10'} + + slice-ansi@3.0.0: + resolution: {integrity: sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==} + engines: {node: '>=8'} + + smart-buffer@4.2.0: + resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} + engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} + + socks-proxy-agent@8.0.5: + resolution: {integrity: sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==} + engines: {node: '>= 14'} + + socks@2.8.7: + resolution: {integrity: sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==} + engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} + sonner@2.0.7: resolution: {integrity: sha512-W6ZN4p58k8aDKA4XPcx2hpIQXBRAgyiWVkYhT7CvK6D3iAu7xjvVyhQHg2/iaKJZ1XVJ4r7XuwGL+WGEK37i9w==} peerDependencies: @@ -4047,12 +4861,30 @@ packages: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} + source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + space-separated-tokens@2.0.2: resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + sprintf-js@1.1.3: + resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} + + ssri@12.0.0: + resolution: {integrity: sha512-S7iGNosepx9RadX82oimUkvr0Ct7IjJbEbs4mJcTxst8um95J3sDYU1RBEOvdu6oL1Wek2ODI5i4MAw+dZ6cAQ==} + engines: {node: ^18.17.0 || >=20.5.0} + + stat-mode@1.0.0: + resolution: {integrity: sha512-jH9EhtKIjuXZ2cWxmXS8ZP80XyC3iasQxMDV8jzhNJpfDb7VbQLVW4Wvsxz9QZvzV+G4YoSfBUVKDOyxLzi/sg==} + engines: {node: '>= 6'} + static-browser-server@1.0.3: resolution: {integrity: sha512-ZUyfgGDdFRbZGGJQ1YhiM930Yczz5VlbJObrQLlk24+qNHVQx4OlLcYswEUo3bIyNAbQUIUR9Yr5/Hqjzqb4zA==} @@ -4072,6 +4904,10 @@ packages: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + string_decoder@1.1.1: resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} @@ -4082,6 +4918,10 @@ packages: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} + strip-ansi@7.2.0: + resolution: {integrity: sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==} + engines: {node: '>=12'} + strip-bom-string@1.0.0: resolution: {integrity: sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==} engines: {node: '>=0.10.0'} @@ -4105,10 +4945,18 @@ packages: stylis@4.3.6: resolution: {integrity: sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==} + sumchecker@3.0.1: + resolution: {integrity: sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==} + engines: {node: '>= 8.0'} + supports-color@7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} + supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + supports-preserve-symlinks-flag@1.0.0: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} @@ -4137,10 +4985,24 @@ packages: resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==} engines: {node: '>=6'} + tar@7.5.12: + resolution: {integrity: sha512-9TsuLcdhOn4XztcQqhNyq1KOwOOED/3k58JAvtULiYqbO8B/0IBAAIE1hj0Svmm58k27TmcigyDI0deMlgG3uw==} + engines: {node: '>=18'} + + temp-file@3.4.0: + resolution: {integrity: sha512-C5tjlC/HCtVUOi3KWVokd4vHVViOmGjtLwIh4MuzPo/nMYTV/p1urt3RnMz2IWXDdKEGJH3k5+KPxtqRsUYGtg==} + + temp@0.9.4: + resolution: {integrity: sha512-yYrrsWnrXMcdsnu/7YMYAofM1ktpL5By7vZhf15CrXijWWrEYZks5AXBudalfSWJLlnen/QUJUB5aoB0kqZUGA==} + engines: {node: '>=6.0.0'} + timers-browserify@2.0.12: resolution: {integrity: sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==} engines: {node: '>=0.6.0'} + tiny-async-pool@1.3.0: + resolution: {integrity: sha512-01EAw5EDrcVrdgyCLgoSPvqznC0sVxDSVeiOz09FUpjh71G79VCqneOr+xvt7T1r76CF6ZZfPjHorN2+d+3mqA==} + tinyexec@1.0.2: resolution: {integrity: sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==} engines: {node: '>=18'} @@ -4149,6 +5011,13 @@ packages: resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} engines: {node: '>=12.0.0'} + tmp-promise@3.0.3: + resolution: {integrity: sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==} + + tmp@0.2.5: + resolution: {integrity: sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==} + engines: {node: '>=14.14'} + to-buffer@1.2.2: resolution: {integrity: sha512-db0E3UJjcFhpDhAF4tLo03oli3pwl3dbnzXOUIlRKrp+ldk/VUxzpWYZENsw2SZiuBjHAk7DfB0VU7NKdpb6sw==} engines: {node: '>= 0.4'} @@ -4160,12 +5029,19 @@ packages: tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + tree-kill@1.2.2: + resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} + hasBin: true + trim-lines@3.0.1: resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} trough@2.2.0: resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} + truncate-utf8-bytes@1.0.2: + resolution: {integrity: sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==} + ts-api-utils@2.1.0: resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==} engines: {node: '>=18.12'} @@ -4189,6 +5065,10 @@ packages: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} + type-fest@0.13.1: + resolution: {integrity: sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==} + engines: {node: '>=10'} + type@2.7.3: resolution: {integrity: sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ==} @@ -4216,6 +5096,9 @@ packages: ufo@1.6.2: resolution: {integrity: sha512-heMioaxBcG9+Znsda5Q8sQbWnLJSl98AFDXTO80wELWEzX3hordXsTdxrIfMQoO9IY1MEnoGoPjpoKpMj+Yx0Q==} + undici-types@6.21.0: + resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + undici-types@7.16.0: resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} @@ -4225,6 +5108,14 @@ packages: unified@11.0.5: resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} + unique-filename@4.0.0: + resolution: {integrity: sha512-XSnEewXmQ+veP7xX2dS5Q4yZAvO40cBN2MWkJ7D/6sW4Dg6wYBNwM1Vrnz1FhH5AdeLIlUXRI9e28z1YZi71NQ==} + engines: {node: ^18.17.0 || >=20.5.0} + + unique-slug@5.0.0: + resolution: {integrity: sha512-9OdaqO5kwqR+1kVgHAhsp5vPNU0hnxRa26rBFNfNgM7M6pNtgzeBn3s/xbyCQL3dcjzOatcef6UUHpB/6MaETg==} + engines: {node: ^18.17.0 || >=20.5.0} + unist-util-is@6.0.1: resolution: {integrity: sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==} @@ -4243,6 +5134,14 @@ packages: unist-util-visit@5.0.0: resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} + universalify@0.1.2: + resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} + engines: {node: '>= 4.0.0'} + + universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + update-browserslist-db@1.1.4: resolution: {integrity: sha512-q0SPT4xyU84saUX+tomz1WLkxUbuaJnR1xWt17M7fJtEJigJeWUNGUqrauFXsHnqev9y9JTRGwk13tFBuKby4A==} hasBin: true @@ -4281,6 +5180,9 @@ packages: peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + utf8-byte-length@1.0.5: + resolution: {integrity: sha512-Xn0w3MtiQ6zoz2vFyUVruaCL53O/DwUvkEeOvj+uulMm0BkUGYWmBYVyElqZaSLhY6ZD0ulfU3aBra2aVT4xfA==} + util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} @@ -4306,6 +5208,10 @@ packages: react: ^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc + verror@1.10.1: + resolution: {integrity: sha512-veufcmxri4e3XSrT0xwfUR7kguIkaxBeosDg00yDWhk49wdwkSUrvvsm7nc75e1PUyvIeZj6nS8VQRYz2/S4Xg==} + engines: {node: '>=0.6.0'} + vfile-location@5.0.3: resolution: {integrity: sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==} @@ -4387,9 +5293,17 @@ packages: w3c-keyname@2.2.8: resolution: {integrity: sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==} + wait-on@8.0.5: + resolution: {integrity: sha512-J3WlS0txVHkhLRb2FsmRg3dkMTCV1+M6Xra3Ho7HzZDHpE7DCOnoSoCJsZotrmW3uRMhvIJGSKUKrh/MeF4iag==} + engines: {node: '>=12.0.0'} + hasBin: true + warning@4.0.3: resolution: {integrity: sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==} + wcwidth@1.0.1: + resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + web-namespaces@2.0.1: resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} @@ -4412,6 +5326,11 @@ packages: engines: {node: '>= 8'} hasBin: true + which@5.0.0: + resolution: {integrity: sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==} + engines: {node: ^18.17.0 || >=20.5.0} + hasBin: true + word-wrap@1.2.5: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} @@ -4420,6 +5339,17 @@ packages: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + xmlbuilder@15.1.1: + resolution: {integrity: sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==} + engines: {node: '>=8.0'} + xtend@4.0.2: resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} engines: {node: '>=0.4'} @@ -4431,6 +5361,13 @@ packages: yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + + yallist@5.0.0: + resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==} + engines: {node: '>=18'} + yaml@1.10.2: resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} engines: {node: '>= 6'} @@ -4448,6 +5385,9 @@ packages: resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} engines: {node: '>=12'} + yauzl@2.10.0: + resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} + yjs@13.6.27: resolution: {integrity: sha512-OIDwaflOaq4wC6YlPBy2L6ceKeKuF7DeTxx+jPzv1FHn9tCZ0ZwSRnUBxD05E3yed46fv/FWJbvR+Ud7x0L7zw==} engines: {node: '>=16.0.0', npm: '>=8.0.0'} @@ -4461,6 +5401,8 @@ packages: snapshots: + 7zip-bin@5.2.0: {} + '@antfu/install-pkg@1.1.0': dependencies: package-manager-detector: 1.6.0 @@ -4895,6 +5837,111 @@ snapshots: react-dom: 19.2.0(react@19.2.0) react-is: 17.0.2 + '@develar/schema-utils@2.6.5': + dependencies: + ajv: 6.12.6 + ajv-keywords: 3.5.2(ajv@6.12.6) + + '@electron/asar@3.4.1': + dependencies: + commander: 5.1.0 + glob: 7.2.3 + minimatch: 3.1.2 + + '@electron/fuses@1.8.0': + dependencies: + chalk: 4.1.2 + fs-extra: 9.1.0 + minimist: 1.2.8 + + '@electron/get@2.0.3': + dependencies: + debug: 4.4.3 + env-paths: 2.2.1 + fs-extra: 8.1.0 + got: 11.8.6 + progress: 2.0.3 + semver: 6.3.1 + sumchecker: 3.0.1 + optionalDependencies: + global-agent: 3.0.0 + transitivePeerDependencies: + - supports-color + + '@electron/get@3.1.0': + dependencies: + debug: 4.4.3 + env-paths: 2.2.1 + fs-extra: 8.1.0 + got: 11.8.6 + progress: 2.0.3 + semver: 6.3.1 + sumchecker: 3.0.1 + optionalDependencies: + global-agent: 3.0.0 + transitivePeerDependencies: + - supports-color + + '@electron/notarize@2.5.0': + dependencies: + debug: 4.4.3 + fs-extra: 9.1.0 + promise-retry: 2.0.1 + transitivePeerDependencies: + - supports-color + + '@electron/osx-sign@1.3.3': + dependencies: + compare-version: 0.1.2 + debug: 4.4.3 + fs-extra: 10.1.0 + isbinaryfile: 4.0.10 + minimist: 1.2.8 + plist: 3.1.0 + transitivePeerDependencies: + - supports-color + + '@electron/rebuild@4.0.3': + dependencies: + '@malept/cross-spawn-promise': 2.0.0 + debug: 4.4.3 + detect-libc: 2.1.2 + got: 11.8.6 + graceful-fs: 4.2.11 + node-abi: 4.28.0 + node-api-version: 0.2.1 + node-gyp: 11.5.0 + ora: 5.4.1 + read-binary-file-arch: 1.0.6 + semver: 7.7.3 + tar: 7.5.12 + yargs: 17.7.2 + transitivePeerDependencies: + - supports-color + + '@electron/universal@2.0.3': + dependencies: + '@electron/asar': 3.4.1 + '@malept/cross-spawn-promise': 2.0.0 + debug: 4.4.3 + dir-compare: 4.2.0 + fs-extra: 11.3.4 + minimatch: 9.0.5 + plist: 3.1.0 + transitivePeerDependencies: + - supports-color + + '@electron/windows-sign@1.2.2': + dependencies: + cross-dirname: 0.1.0 + debug: 4.4.3 + fs-extra: 11.3.4 + minimist: 1.2.8 + postject: 1.0.0-alpha.6 + transitivePeerDependencies: + - supports-color + optional: true + '@esbuild/aix-ppc64@0.25.12': optional: true @@ -5046,6 +6093,22 @@ snapshots: '@floating-ui/utils@0.2.10': {} + '@hapi/address@5.1.1': + dependencies: + '@hapi/hoek': 11.0.7 + + '@hapi/formula@3.0.2': {} + + '@hapi/hoek@11.0.7': {} + + '@hapi/pinpoint@2.0.1': {} + + '@hapi/tlds@1.1.6': {} + + '@hapi/topo@6.0.2': + dependencies: + '@hapi/hoek': 11.0.7 + '@humanfs/core@0.19.1': {} '@humanfs/node@0.16.7': @@ -5065,6 +6128,19 @@ snapshots: '@iconify/types': 2.0.0 mlly: 1.8.0 + '@isaacs/cliui@8.0.2': + dependencies: + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.2.0 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 + + '@isaacs/fs-minipass@4.0.1': + dependencies: + minipass: 7.1.3 + '@jridgewell/gen-mapping@0.3.13': dependencies: '@jridgewell/sourcemap-codec': 1.5.5 @@ -5323,6 +6399,19 @@ snapshots: '@lezer/highlight': 1.2.3 '@lezer/lr': 1.4.5 + '@malept/cross-spawn-promise@2.0.0': + dependencies: + cross-spawn: 7.0.6 + + '@malept/flatpak-bundler@0.4.0': + dependencies: + debug: 4.4.3 + fs-extra: 9.1.0 + lodash: 4.17.21 + tmp-promise: 3.0.3 + transitivePeerDependencies: + - supports-color + '@marijn/find-cluster-break@1.0.2': {} '@mdxeditor/editor@3.52.1(@codemirror/language@6.11.3)(@lezer/highlight@1.2.3)(@types/react-dom@19.2.3(@types/react@19.2.4))(@types/react@19.2.4)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(yjs@13.6.27)': @@ -5414,8 +6503,25 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.19.1 + '@npmcli/agent@3.0.0': + dependencies: + agent-base: 7.1.4 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.6 + lru-cache: 10.4.3 + socks-proxy-agent: 8.0.5 + transitivePeerDependencies: + - supports-color + + '@npmcli/fs@4.0.0': + dependencies: + semver: 7.7.3 + '@open-draft/deferred-promise@2.2.0': {} + '@pkgjs/parseargs@0.11.0': + optional: true + '@radix-ui/colors@3.0.0': {} '@radix-ui/number@1.1.1': {} @@ -6109,8 +7215,16 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.53.2': optional: true + '@sindresorhus/is@4.6.0': {} + + '@standard-schema/spec@1.1.0': {} + '@stitches/core@1.2.8': {} + '@szmarczak/http-timer@4.0.6': + dependencies: + defer-to-connect: 2.0.1 + '@tabler/icons-react@3.35.0(react@19.2.0)': dependencies: '@tabler/icons': 3.35.0 @@ -6215,6 +7329,13 @@ snapshots: dependencies: '@babel/types': 7.28.5 + '@types/cacheable-request@6.0.3': + dependencies: + '@types/http-cache-semantics': 4.2.0 + '@types/keyv': 3.1.4 + '@types/node': 24.10.1 + '@types/responselike': 1.0.3 + '@types/d3-array@3.2.2': {} '@types/d3-axis@3.0.6': @@ -6342,26 +7463,46 @@ snapshots: '@types/estree@1.0.8': {} + '@types/fs-extra@9.0.13': + dependencies: + '@types/node': 24.10.1 + '@types/geojson@7946.0.16': {} '@types/hast@3.0.4': dependencies: '@types/unist': 3.0.3 + '@types/http-cache-semantics@4.2.0': {} + '@types/json-schema@7.0.15': {} + '@types/keyv@3.1.4': + dependencies: + '@types/node': 24.10.1 + '@types/mdast@4.0.4': dependencies: '@types/unist': 3.0.3 '@types/ms@2.1.0': {} + '@types/node@22.19.15': + dependencies: + undici-types: 6.21.0 + '@types/node@24.10.1': dependencies: undici-types: 7.16.0 '@types/parse-json@4.0.2': {} + '@types/plist@3.0.5': + dependencies: + '@types/node': 24.10.1 + xmlbuilder: 15.1.1 + optional: true + '@types/prismjs@1.26.5': {} '@types/react-dom@19.2.3(@types/react@19.2.4)': @@ -6376,6 +7517,10 @@ snapshots: dependencies: csstype: 3.1.3 + '@types/responselike@1.0.3': + dependencies: + '@types/node': 24.10.1 + '@types/streamsaver@2.0.5': {} '@types/swagger-schema-official@2.0.22': {} @@ -6387,6 +7532,14 @@ snapshots: '@types/unist@3.0.3': {} + '@types/verror@1.10.11': + optional: true + + '@types/yauzl@2.10.3': + dependencies: + '@types/node': 24.10.1 + optional: true + '@typescript-eslint/eslint-plugin@8.46.4(@typescript-eslint/parser@8.46.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)': dependencies: '@eslint-community/regexpp': 4.12.2 @@ -6500,6 +7653,8 @@ snapshots: transitivePeerDependencies: - supports-color + '@xmldom/xmldom@0.8.11': {} + '@xterm/addon-fit@0.10.0(@xterm/xterm@5.5.0)': dependencies: '@xterm/xterm': 5.5.0 @@ -6518,6 +7673,8 @@ snapshots: '@xterm/xterm@5.5.0': {} + abbrev@3.0.1: {} + ace-builds@1.43.4: {} acorn-jsx@5.3.2(acorn@8.15.0): @@ -6526,6 +7683,12 @@ snapshots: acorn@8.15.0: {} + agent-base@7.1.4: {} + + ajv-keywords@3.5.2(ajv@6.12.6): + dependencies: + ajv: 6.12.6 + ajv@6.12.6: dependencies: fast-deep-equal: 3.1.3 @@ -6537,10 +7700,59 @@ snapshots: ansi-regex@5.0.1: {} + ansi-regex@6.2.2: {} + ansi-styles@4.3.0: dependencies: color-convert: 2.0.1 + ansi-styles@6.2.3: {} + + app-builder-bin@5.0.0-alpha.12: {} + + app-builder-lib@26.8.1(dmg-builder@26.8.1)(electron-builder-squirrel-windows@26.8.1): + dependencies: + '@develar/schema-utils': 2.6.5 + '@electron/asar': 3.4.1 + '@electron/fuses': 1.8.0 + '@electron/get': 3.1.0 + '@electron/notarize': 2.5.0 + '@electron/osx-sign': 1.3.3 + '@electron/rebuild': 4.0.3 + '@electron/universal': 2.0.3 + '@malept/flatpak-bundler': 0.4.0 + '@types/fs-extra': 9.0.13 + async-exit-hook: 2.0.1 + builder-util: 26.8.1 + builder-util-runtime: 9.5.1 + chromium-pickle-js: 0.2.0 + ci-info: 4.3.1 + debug: 4.4.3 + dmg-builder: 26.8.1(electron-builder-squirrel-windows@26.8.1) + dotenv: 16.6.1 + dotenv-expand: 11.0.7 + ejs: 3.1.10 + electron-builder-squirrel-windows: 26.8.1(dmg-builder@26.8.1) + electron-publish: 26.8.1 + fs-extra: 10.1.0 + hosted-git-info: 4.1.0 + isbinaryfile: 5.0.7 + jiti: 2.6.1 + js-yaml: 4.1.1 + json5: 2.2.3 + lazy-val: 1.0.5 + minimatch: 10.2.4 + plist: 3.1.0 + proper-lockfile: 4.1.2 + resedit: 1.7.2 + semver: 7.7.3 + tar: 7.5.12 + temp-file: 3.4.0 + tiny-async-pool: 1.3.0 + which: 5.0.0 + transitivePeerDependencies: + - supports-color + argparse@1.0.10: dependencies: sprintf-js: 1.0.3 @@ -6557,6 +7769,9 @@ snapshots: inherits: 2.0.4 minimalistic-assert: 1.0.1 + assert-plus@1.0.0: + optional: true + assert@2.1.0: dependencies: call-bind: 1.0.8 @@ -6565,14 +7780,35 @@ snapshots: object.assign: 4.1.7 util: 0.12.5 - available-typed-arrays@1.0.7: + astral-regex@2.0.0: + optional: true + + async-exit-hook@2.0.1: {} + + async@3.2.6: {} + + asynckit@0.4.0: {} + + at-least-node@1.0.0: {} + + available-typed-arrays@1.0.7: dependencies: possible-typed-array-names: 1.1.0 + axios@1.13.6: + dependencies: + follow-redirects: 1.15.11 + form-data: 4.0.5 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + bail@2.0.2: {} balanced-match@1.0.2: {} + balanced-match@4.0.4: {} + base64-js@1.5.1: {} baseline-browser-mapping@2.9.19: {} @@ -6581,10 +7817,19 @@ snapshots: dependencies: file-uri-to-path: 1.0.0 + bl@4.1.0: + dependencies: + buffer: 5.7.1 + inherits: 2.0.4 + readable-stream: 3.6.2 + bn.js@4.12.2: {} bn.js@5.2.2: {} + boolean@3.2.0: + optional: true + brace-expansion@1.1.12: dependencies: balanced-match: 1.0.2 @@ -6594,6 +7839,10 @@ snapshots: dependencies: balanced-match: 1.0.2 + brace-expansion@5.0.4: + dependencies: + balanced-match: 4.0.4 + braces@3.0.3: dependencies: fill-range: 7.1.1 @@ -6656,6 +7905,10 @@ snapshots: node-releases: 2.0.27 update-browserslist-db: 1.1.4(browserslist@4.28.0) + buffer-crc32@0.2.13: {} + + buffer-from@1.1.2: {} + buffer-xor@1.0.3: {} buffer@5.7.1: @@ -6668,8 +7921,63 @@ snapshots: base64-js: 1.5.1 ieee754: 1.2.1 + builder-util-runtime@9.5.1: + dependencies: + debug: 4.4.3 + sax: 1.6.0 + transitivePeerDependencies: + - supports-color + + builder-util@26.8.1: + dependencies: + 7zip-bin: 5.2.0 + '@types/debug': 4.1.12 + app-builder-bin: 5.0.0-alpha.12 + builder-util-runtime: 9.5.1 + chalk: 4.1.2 + cross-spawn: 7.0.6 + debug: 4.4.3 + fs-extra: 10.1.0 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.6 + js-yaml: 4.1.1 + sanitize-filename: 1.6.4 + source-map-support: 0.5.21 + stat-mode: 1.0.0 + temp-file: 3.4.0 + tiny-async-pool: 1.3.0 + transitivePeerDependencies: + - supports-color + builtin-status-codes@3.0.0: {} + cacache@19.0.1: + dependencies: + '@npmcli/fs': 4.0.0 + fs-minipass: 3.0.3 + glob: 10.5.0 + lru-cache: 10.4.3 + minipass: 7.1.3 + minipass-collect: 2.0.1 + minipass-flush: 1.0.5 + minipass-pipeline: 1.2.4 + p-map: 7.0.4 + ssri: 12.0.0 + tar: 7.5.12 + unique-filename: 4.0.0 + + cacheable-lookup@5.0.4: {} + + cacheable-request@7.0.4: + dependencies: + clone-response: 1.0.3 + get-stream: 5.2.0 + http-cache-semantics: 4.2.0 + keyv: 4.5.4 + lowercase-keys: 2.0.0 + normalize-url: 6.1.0 + responselike: 2.0.1 + call-bind-apply-helpers@1.0.2: dependencies: es-errors: 1.3.0 @@ -6722,6 +8030,14 @@ snapshots: '@chevrotain/utils': 11.0.3 lodash-es: 4.17.21 + chownr@3.0.0: {} + + chromium-pickle-js@0.2.0: {} + + ci-info@4.3.1: {} + + ci-info@4.4.0: {} + cipher-base@1.0.7: dependencies: inherits: 2.0.4 @@ -6736,12 +8052,30 @@ snapshots: clean-set@1.1.2: {} + cli-cursor@3.1.0: + dependencies: + restore-cursor: 3.1.0 + + cli-spinners@2.9.2: {} + + cli-truncate@2.1.0: + dependencies: + slice-ansi: 3.0.0 + string-width: 4.2.3 + optional: true + cliui@8.0.1: dependencies: string-width: 4.2.3 strip-ansi: 6.0.1 wrap-ansi: 7.0.0 + clone-response@1.0.3: + dependencies: + mimic-response: 1.0.1 + + clone@1.0.4: {} + clsx@2.1.1: {} cm6-theme-basic-light@0.2.0(@codemirror/language@6.11.3)(@codemirror/state@6.5.2)(@codemirror/view@6.39.4)(@lezer/highlight@1.2.3): @@ -6779,16 +8113,36 @@ snapshots: color-name@1.1.4: {} + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + comma-separated-tokens@2.0.3: {} + commander@5.1.0: {} + commander@7.2.0: {} commander@8.3.0: {} + commander@9.5.0: + optional: true + + compare-version@0.1.2: {} + compute-scroll-into-view@2.0.4: {} concat-map@0.0.1: {} + concurrently@9.2.1: + dependencies: + chalk: 4.1.2 + rxjs: 7.8.2 + shell-quote: 1.8.3 + supports-color: 8.1.1 + tree-kill: 1.2.2 + yargs: 17.7.2 + confbox@0.1.8: {} console-browserify@1.2.0: {} @@ -6799,6 +8153,9 @@ snapshots: cookie@1.0.2: {} + core-util-is@1.0.2: + optional: true + core-util-is@1.0.3: {} cose-base@1.0.3: @@ -6817,6 +8174,11 @@ snapshots: path-type: 4.0.0 yaml: 1.10.2 + crc@3.8.0: + dependencies: + buffer: 5.7.1 + optional: true + create-ecdh@4.0.4: dependencies: bn.js: 4.12.2 @@ -6843,6 +8205,9 @@ snapshots: crelt@1.0.6: {} + cross-dirname@0.1.0: + optional: true + cross-spawn@7.0.6: dependencies: path-key: 3.1.1 @@ -7067,8 +8432,18 @@ snapshots: dependencies: character-entities: 2.0.2 + decompress-response@6.0.0: + dependencies: + mimic-response: 3.1.0 + deep-is@0.1.4: {} + defaults@1.0.4: + dependencies: + clone: 1.0.4 + + defer-to-connect@2.0.1: {} + define-data-property@1.1.4: dependencies: es-define-property: 1.0.1 @@ -7085,6 +8460,8 @@ snapshots: dependencies: robust-predicates: 3.0.2 + delayed-stream@1.0.0: {} + dequal@2.0.3: {} des.js@1.1.0: @@ -7096,6 +8473,9 @@ snapshots: detect-node-es@1.1.0: {} + detect-node@2.1.0: + optional: true + dev@0.1.3: dependencies: inotify: 1.4.6 @@ -7118,12 +8498,46 @@ snapshots: miller-rabin: 4.0.1 randombytes: 2.1.0 + dir-compare@4.2.0: + dependencies: + minimatch: 3.1.2 + p-limit: 3.1.0 + + dmg-builder@26.8.1(electron-builder-squirrel-windows@26.8.1): + dependencies: + app-builder-lib: 26.8.1(dmg-builder@26.8.1)(electron-builder-squirrel-windows@26.8.1) + builder-util: 26.8.1 + fs-extra: 10.1.0 + iconv-lite: 0.6.3 + js-yaml: 4.1.1 + optionalDependencies: + dmg-license: 1.0.11 + transitivePeerDependencies: + - electron-builder-squirrel-windows + - supports-color + + dmg-license@1.0.11: + dependencies: + '@types/plist': 3.0.5 + '@types/verror': 1.10.11 + ajv: 6.12.6 + crc: 3.8.0 + iconv-corefoundation: 1.1.7 + plist: 3.1.0 + smart-buffer: 4.2.0 + verror: 1.10.1 + optional: true + domain-browser@4.22.0: {} dompurify@3.3.1: optionalDependencies: '@types/trusted-types': 2.0.7 + dotenv-expand@11.0.7: + dependencies: + dotenv: 16.6.1 + dotenv@16.6.1: {} downshift@7.6.2(react@19.2.0): @@ -7141,8 +8555,72 @@ snapshots: es-errors: 1.3.0 gopd: 1.2.0 + eastasianwidth@0.2.0: {} + + ejs@3.1.10: + dependencies: + jake: 10.9.4 + + electron-builder-squirrel-windows@26.8.1(dmg-builder@26.8.1): + dependencies: + app-builder-lib: 26.8.1(dmg-builder@26.8.1)(electron-builder-squirrel-windows@26.8.1) + builder-util: 26.8.1 + electron-winstaller: 5.4.0 + transitivePeerDependencies: + - dmg-builder + - supports-color + + electron-builder@26.8.1(electron-builder-squirrel-windows@26.8.1): + dependencies: + app-builder-lib: 26.8.1(dmg-builder@26.8.1)(electron-builder-squirrel-windows@26.8.1) + builder-util: 26.8.1 + builder-util-runtime: 9.5.1 + chalk: 4.1.2 + ci-info: 4.4.0 + dmg-builder: 26.8.1(electron-builder-squirrel-windows@26.8.1) + fs-extra: 10.1.0 + lazy-val: 1.0.5 + simple-update-notifier: 2.0.0 + yargs: 17.7.2 + transitivePeerDependencies: + - electron-builder-squirrel-windows + - supports-color + + electron-publish@26.8.1: + dependencies: + '@types/fs-extra': 9.0.13 + builder-util: 26.8.1 + builder-util-runtime: 9.5.1 + chalk: 4.1.2 + form-data: 4.0.5 + fs-extra: 10.1.0 + lazy-val: 1.0.5 + mime: 2.6.0 + transitivePeerDependencies: + - supports-color + electron-to-chromium@1.5.250: {} + electron-winstaller@5.4.0: + dependencies: + '@electron/asar': 3.4.1 + debug: 4.4.3 + fs-extra: 7.0.1 + lodash: 4.17.21 + temp: 0.9.4 + optionalDependencies: + '@electron/windows-sign': 1.2.2 + transitivePeerDependencies: + - supports-color + + electron@35.7.5: + dependencies: + '@electron/get': 2.0.3 + '@types/node': 22.19.15 + extract-zip: 2.0.1 + transitivePeerDependencies: + - supports-color + elliptic@6.6.1: dependencies: bn.js: 4.12.2 @@ -7155,6 +8633,17 @@ snapshots: emoji-regex@8.0.0: {} + emoji-regex@9.2.2: {} + + encoding@0.1.13: + dependencies: + iconv-lite: 0.6.3 + optional: true + + end-of-stream@1.4.5: + dependencies: + once: 1.4.0 + enhanced-resolve@5.18.3: dependencies: graceful-fs: 4.2.11 @@ -7162,6 +8651,10 @@ snapshots: entities@6.0.1: {} + env-paths@2.2.1: {} + + err-code@2.0.3: {} + error-ex@1.3.4: dependencies: is-arrayish: 0.2.1 @@ -7174,6 +8667,13 @@ snapshots: dependencies: es-errors: 1.3.0 + es-set-tostringtag@2.1.0: + dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + es5-ext@0.10.64: dependencies: es6-iterator: 2.0.3 @@ -7181,6 +8681,9 @@ snapshots: esniff: 2.0.1 next-tick: 1.1.0 + es6-error@4.1.1: + optional: true + es6-iterator@2.0.3: dependencies: d: 1.0.2 @@ -7339,6 +8842,8 @@ snapshots: md5.js: 1.3.5 safe-buffer: 5.1.2 + exponential-backoff@3.1.3: {} + ext@1.7.0: dependencies: type: 2.7.3 @@ -7349,6 +8854,19 @@ snapshots: extend@3.0.2: {} + extract-zip@2.0.1: + dependencies: + debug: 4.4.3 + get-stream: 5.2.0 + yauzl: 2.10.0 + optionalDependencies: + '@types/yauzl': 2.10.3 + transitivePeerDependencies: + - supports-color + + extsprintf@1.4.1: + optional: true + fast-deep-equal@3.1.3: {} fast-glob@3.3.3: @@ -7377,6 +8895,10 @@ snapshots: dependencies: format: 0.2.2 + fd-slicer@1.1.0: + dependencies: + pend: 1.2.0 + fdir@6.5.0(picomatch@4.0.3): optionalDependencies: picomatch: 4.0.3 @@ -7392,6 +8914,10 @@ snapshots: file-uri-to-path@1.0.0: {} + filelist@1.0.6: + dependencies: + minimatch: 5.1.9 + fill-range@7.1.1: dependencies: to-regex-range: 5.0.1 @@ -7408,16 +8934,68 @@ snapshots: flatted@3.3.3: {} + follow-redirects@1.15.11: {} + for-each@0.3.5: dependencies: is-callable: 1.2.7 + foreground-child@3.3.1: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + + form-data@4.0.5: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + es-set-tostringtag: 2.1.0 + hasown: 2.0.2 + mime-types: 2.1.35 + format@0.2.2: {} formdata-polyfill@4.0.10: dependencies: fetch-blob: 3.2.0 + fs-extra@10.1.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.2.0 + universalify: 2.0.1 + + fs-extra@11.3.4: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.2.0 + universalify: 2.0.1 + + fs-extra@7.0.1: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + + fs-extra@8.1.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + + fs-extra@9.1.0: + dependencies: + at-least-node: 1.0.0 + graceful-fs: 4.2.11 + jsonfile: 6.2.0 + universalify: 2.0.1 + + fs-minipass@3.0.3: + dependencies: + minipass: 7.1.3 + + fs.realpath@1.0.0: {} + fsevents@2.3.3: optional: true @@ -7449,6 +9027,10 @@ snapshots: dunder-proto: 1.0.1 es-object-atoms: 1.1.1 + get-stream@5.2.0: + dependencies: + pump: 3.0.4 + gitdiff-parser@0.3.1: {} glob-parent@5.1.2: @@ -7459,12 +9041,60 @@ snapshots: dependencies: is-glob: 4.0.3 + glob@10.5.0: + dependencies: + foreground-child: 3.3.1 + jackspeak: 3.4.3 + minimatch: 9.0.5 + minipass: 7.1.3 + package-json-from-dist: 1.0.1 + path-scurry: 1.11.1 + + glob@7.2.3: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + global-agent@3.0.0: + dependencies: + boolean: 3.2.0 + es6-error: 4.1.1 + matcher: 3.0.0 + roarr: 2.15.4 + semver: 7.7.3 + serialize-error: 7.0.1 + optional: true + globals@14.0.0: {} globals@16.5.0: {} + globalthis@1.0.4: + dependencies: + define-properties: 1.2.1 + gopd: 1.2.0 + optional: true + gopd@1.2.0: {} + got@11.8.6: + dependencies: + '@sindresorhus/is': 4.6.0 + '@szmarczak/http-timer': 4.0.6 + '@types/cacheable-request': 6.0.3 + '@types/responselike': 1.0.3 + cacheable-lookup: 5.0.4 + cacheable-request: 7.0.4 + decompress-response: 6.0.0 + http2-wrapper: 1.0.3 + lowercase-keys: 2.0.0 + p-cancelable: 2.1.1 + responselike: 2.0.1 + graceful-fs@4.2.11: {} graphemer@1.4.0: {} @@ -7600,14 +9230,45 @@ snapshots: minimalistic-assert: 1.0.1 minimalistic-crypto-utils: 1.0.1 + hosted-git-info@4.1.0: + dependencies: + lru-cache: 6.0.0 + html-url-attributes@3.0.1: {} html-void-elements@3.0.0: {} + http-cache-semantics@4.2.0: {} + + http-proxy-agent@7.0.2: + dependencies: + agent-base: 7.1.4 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + http2-client@1.3.5: {} + http2-wrapper@1.0.3: + dependencies: + quick-lru: 5.1.1 + resolve-alpn: 1.2.1 + https-browserify@1.0.0: {} + https-proxy-agent@7.0.6: + dependencies: + agent-base: 7.1.4 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + iconv-corefoundation@1.1.7: + dependencies: + cli-truncate: 2.1.0 + node-addon-api: 1.7.2 + optional: true + iconv-lite@0.6.3: dependencies: safer-buffer: 2.1.2 @@ -7627,6 +9288,11 @@ snapshots: imurmurhash@0.1.4: {} + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + inherits@2.0.4: {} inline-style-parser@0.2.7: {} @@ -7642,6 +9308,8 @@ snapshots: intersection-observer@0.10.0: {} + ip-address@10.1.0: {} + is-alphabetical@2.0.1: {} is-alphanumerical@2.0.1: @@ -7684,6 +9352,8 @@ snapshots: is-hexadecimal@2.0.1: {} + is-interactive@1.0.0: {} + is-nan@1.3.2: dependencies: call-bind: 1.0.8 @@ -7704,18 +9374,48 @@ snapshots: dependencies: which-typed-array: 1.1.20 + is-unicode-supported@0.1.0: {} + isarray@1.0.0: {} isarray@2.0.5: {} + isbinaryfile@4.0.10: {} + + isbinaryfile@5.0.7: {} + isexe@2.0.0: {} + isexe@3.1.5: {} + isomorphic-timers-promises@1.0.1: {} isomorphic.js@0.2.5: {} + jackspeak@3.4.3: + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + + jake@10.9.4: + dependencies: + async: 3.2.6 + filelist: 1.0.6 + picocolors: 1.1.1 + jiti@2.6.1: {} + joi@18.0.2: + dependencies: + '@hapi/address': 5.1.1 + '@hapi/formula': 3.0.2 + '@hapi/hoek': 11.0.7 + '@hapi/pinpoint': 2.0.1 + '@hapi/tlds': 1.1.6 + '@hapi/topo': 6.0.2 + '@standard-schema/spec': 1.1.0 + js-tokens@4.0.0: {} js-yaml@3.14.2: @@ -7741,8 +9441,21 @@ snapshots: json-stable-stringify-without-jsonify@1.0.1: {} + json-stringify-safe@5.0.1: + optional: true + json5@2.2.3: {} + jsonfile@4.0.0: + optionalDependencies: + graceful-fs: 4.2.11 + + jsonfile@6.2.0: + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + jszip@3.10.1: dependencies: lie: 3.3.0 @@ -7776,6 +9489,8 @@ snapshots: layout-base@2.0.1: {} + lazy-val@1.0.5: {} + levn@0.4.1: dependencies: prelude-ls: 1.2.1 @@ -7858,21 +9573,34 @@ snapshots: lodash@4.17.21: {} + log-symbols@4.1.0: + dependencies: + chalk: 4.1.2 + is-unicode-supported: 0.1.0 + longest-streak@3.1.0: {} loose-envify@1.4.0: dependencies: js-tokens: 4.0.0 + lowercase-keys@2.0.0: {} + lowlight@1.20.0: dependencies: fault: 1.0.4 highlight.js: 10.7.3 + lru-cache@10.4.3: {} + lru-cache@5.1.1: dependencies: yallist: 3.1.1 + lru-cache@6.0.0: + dependencies: + yallist: 4.0.0 + lucide-react@0.553.0(react@19.2.0): dependencies: react: 19.2.0 @@ -7887,10 +9615,31 @@ snapshots: dependencies: semver: 6.3.1 + make-fetch-happen@14.0.3: + dependencies: + '@npmcli/agent': 3.0.0 + cacache: 19.0.1 + http-cache-semantics: 4.2.0 + minipass: 7.1.3 + minipass-fetch: 4.0.1 + minipass-flush: 1.0.5 + minipass-pipeline: 1.2.4 + negotiator: 1.0.0 + proc-log: 5.0.0 + promise-retry: 2.0.1 + ssri: 12.0.0 + transitivePeerDependencies: + - supports-color + markdown-table@3.0.4: {} marked@16.4.2: {} + matcher@3.0.0: + dependencies: + escape-string-regexp: 4.0.0 + optional: true + math-intrinsics@1.1.0: {} md5.js@1.3.5: @@ -8416,20 +10165,82 @@ snapshots: bn.js: 4.12.2 brorand: 1.1.0 + mime-db@1.52.0: {} + mime-db@1.54.0: {} + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + mime@2.6.0: {} + + mimic-fn@2.1.0: {} + + mimic-response@1.0.1: {} + + mimic-response@3.1.0: {} + minimalistic-assert@1.0.1: {} minimalistic-crypto-utils@1.0.1: {} + minimatch@10.2.4: + dependencies: + brace-expansion: 5.0.4 + minimatch@3.1.2: dependencies: brace-expansion: 1.1.12 + minimatch@5.1.9: + dependencies: + brace-expansion: 2.0.2 + minimatch@9.0.5: dependencies: brace-expansion: 2.0.2 + minimist@1.2.8: {} + + minipass-collect@2.0.1: + dependencies: + minipass: 7.1.3 + + minipass-fetch@4.0.1: + dependencies: + minipass: 7.1.3 + minipass-sized: 1.0.3 + minizlib: 3.1.0 + optionalDependencies: + encoding: 0.1.13 + + minipass-flush@1.0.5: + dependencies: + minipass: 3.3.6 + + minipass-pipeline@1.2.4: + dependencies: + minipass: 3.3.6 + + minipass-sized@1.0.3: + dependencies: + minipass: 3.3.6 + + minipass@3.3.6: + dependencies: + yallist: 4.0.0 + + minipass@7.1.3: {} + + minizlib@3.1.0: + dependencies: + minipass: 7.1.3 + + mkdirp@0.5.6: + dependencies: + minimist: 1.2.8 + mlly@1.8.0: dependencies: acorn: 8.15.0 @@ -8449,6 +10260,8 @@ snapshots: natural-compare@1.4.0: {} + negotiator@1.0.0: {} + next-themes@0.4.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0): dependencies: react: 19.2.0 @@ -8456,6 +10269,17 @@ snapshots: next-tick@1.1.0: {} + node-abi@4.28.0: + dependencies: + semver: 7.7.3 + + node-addon-api@1.7.2: + optional: true + + node-api-version@0.2.1: + dependencies: + semver: 7.7.3 + node-domexception@1.0.0: {} node-emoji@1.11.0: @@ -8466,9 +10290,11 @@ snapshots: dependencies: http2-client: 1.3.5 - node-fetch@2.7.0: + node-fetch@2.7.0(encoding@0.1.13): dependencies: whatwg-url: 5.0.0 + optionalDependencies: + encoding: 0.1.13 node-fetch@3.3.2: dependencies: @@ -8476,6 +10302,21 @@ snapshots: fetch-blob: 3.2.0 formdata-polyfill: 4.0.10 + node-gyp@11.5.0: + dependencies: + env-paths: 2.2.1 + exponential-backoff: 3.1.3 + graceful-fs: 4.2.11 + make-fetch-happen: 14.0.3 + nopt: 8.1.0 + proc-log: 5.0.0 + semver: 7.7.3 + tar: 7.5.12 + tinyglobby: 0.2.15 + which: 5.0.0 + transitivePeerDependencies: + - supports-color + node-readfiles@0.2.0: dependencies: es6-promise: 3.3.1 @@ -8512,6 +10353,12 @@ snapshots: util: 0.12.5 vm-browserify: 1.1.2 + nopt@8.1.0: + dependencies: + abbrev: 3.0.1 + + normalize-url@6.1.0: {} + oas-kit-common@1.0.8: dependencies: fast-safe-stringify: 2.1.1 @@ -8563,6 +10410,14 @@ snapshots: has-symbols: 1.1.0 object-keys: 1.1.1 + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + onetime@5.1.2: + dependencies: + mimic-fn: 2.1.0 + optionator@0.9.4: dependencies: deep-is: 0.1.4 @@ -8572,10 +10427,24 @@ snapshots: type-check: 0.4.0 word-wrap: 1.2.5 + ora@5.4.1: + dependencies: + bl: 4.1.0 + chalk: 4.1.2 + cli-cursor: 3.1.0 + cli-spinners: 2.9.2 + is-interactive: 1.0.0 + is-unicode-supported: 0.1.0 + log-symbols: 4.1.0 + strip-ansi: 6.0.1 + wcwidth: 1.0.1 + os-browserify@0.3.0: {} outvariant@1.4.0: {} + p-cancelable@2.1.1: {} + p-limit@3.1.0: dependencies: yocto-queue: 0.1.0 @@ -8584,6 +10453,10 @@ snapshots: dependencies: p-limit: 3.1.0 + p-map@7.0.4: {} + + package-json-from-dist@1.0.1: {} + package-manager-detector@1.6.0: {} pako@1.0.11: {} @@ -8627,10 +10500,17 @@ snapshots: path-exists@4.0.0: {} + path-is-absolute@1.0.1: {} + path-key@3.1.1: {} path-parse@1.0.7: {} + path-scurry@1.11.1: + dependencies: + lru-cache: 10.4.3 + minipass: 7.1.3 + path-type@4.0.0: {} pathe@2.0.3: {} @@ -8644,6 +10524,10 @@ snapshots: sha.js: 2.4.12 to-buffer: 1.2.2 + pe-library@0.4.1: {} + + pend@1.2.0: {} + picocolors@1.1.1: {} picomatch@2.3.1: {} @@ -8660,6 +10544,12 @@ snapshots: mlly: 1.8.0 pathe: 2.0.3 + plist@3.1.0: + dependencies: + '@xmldom/xmldom': 0.8.11 + base64-js: 1.5.1 + xmlbuilder: 15.1.1 + points-on-curve@0.2.0: {} points-on-path@0.2.1: @@ -8675,24 +10565,46 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 + postject@1.0.0-alpha.6: + dependencies: + commander: 9.5.0 + optional: true + prelude-ls@1.2.1: {} prettier@2.7.1: {} prismjs@1.30.0: {} + proc-log@5.0.0: {} + process-nextick-args@2.0.1: {} process@0.11.10: {} + progress@2.0.3: {} + + promise-retry@2.0.1: + dependencies: + err-code: 2.0.3 + retry: 0.12.0 + prop-types@15.8.1: dependencies: loose-envify: 1.4.0 object-assign: 4.1.1 react-is: 16.13.1 + proper-lockfile@4.1.2: + dependencies: + graceful-fs: 4.2.11 + retry: 0.12.0 + signal-exit: 3.0.7 + property-information@7.1.0: {} + proxy-from-env@1.1.0: {} + public-encrypt@4.0.3: dependencies: bn.js: 4.12.2 @@ -8702,6 +10614,11 @@ snapshots: randombytes: 2.1.0 safe-buffer: 5.1.2 + pump@3.0.4: + dependencies: + end-of-stream: 1.4.5 + once: 1.4.0 + punycode@1.4.1: {} punycode@2.3.1: {} @@ -8714,6 +10631,8 @@ snapshots: queue-microtask@1.2.3: {} + quick-lru@5.1.1: {} + randombytes@2.1.0: dependencies: safe-buffer: 5.1.2 @@ -8843,6 +10762,12 @@ snapshots: react@19.2.0: {} + read-binary-file-arch@1.0.6: + dependencies: + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + readable-stream@2.3.8: dependencies: core-util-is: 1.0.3 @@ -8933,6 +10858,12 @@ snapshots: require-directory@2.1.1: {} + resedit@1.7.2: + dependencies: + pe-library: 0.4.1 + + resolve-alpn@1.2.1: {} + resolve-from@4.0.0: {} resolve@1.22.11: @@ -8941,13 +10872,38 @@ snapshots: path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 + responselike@2.0.1: + dependencies: + lowercase-keys: 2.0.0 + + restore-cursor@3.1.0: + dependencies: + onetime: 5.1.2 + signal-exit: 3.0.7 + + retry@0.12.0: {} + reusify@1.1.0: {} + rimraf@2.6.3: + dependencies: + glob: 7.2.3 + ripemd160@2.0.3: dependencies: hash-base: 3.1.2 inherits: 2.0.4 + roarr@2.15.4: + dependencies: + boolean: 3.2.0 + detect-node: 2.1.0 + globalthis: 1.0.4 + json-stringify-safe: 5.0.1 + semver-compare: 1.0.0 + sprintf-js: 1.1.3 + optional: true + robust-predicates@3.0.2: {} rollup@4.53.2: @@ -8991,6 +10947,10 @@ snapshots: rw@1.3.3: {} + rxjs@7.8.2: + dependencies: + tslib: 2.8.1 + sade@1.8.1: dependencies: mri: 1.2.0 @@ -9007,6 +10967,12 @@ snapshots: safer-buffer@2.1.2: {} + sanitize-filename@1.6.4: + dependencies: + truncate-utf8-bytes: 1.0.2 + + sax@1.6.0: {} + scheduler@0.27.0: {} section-matter@1.0.0: @@ -9014,10 +10980,20 @@ snapshots: extend-shallow: 2.0.1 kind-of: 6.0.3 + semver-compare@1.0.0: + optional: true + + semver@5.7.2: {} + semver@6.3.1: {} semver@7.7.3: {} + serialize-error@7.0.1: + dependencies: + type-fest: 0.13.1 + optional: true + set-cookie-parser@2.7.2: {} set-function-length@1.2.2: @@ -9045,6 +11021,8 @@ snapshots: shebang-regex@3.0.0: {} + shell-quote@1.8.3: {} + should-equal@2.0.0: dependencies: should-type: 1.4.0 @@ -9099,6 +11077,36 @@ snapshots: side-channel-map: 1.0.1 side-channel-weakmap: 1.0.2 + signal-exit@3.0.7: {} + + signal-exit@4.1.0: {} + + simple-update-notifier@2.0.0: + dependencies: + semver: 7.7.3 + + slice-ansi@3.0.0: + dependencies: + ansi-styles: 4.3.0 + astral-regex: 2.0.0 + is-fullwidth-code-point: 3.0.0 + optional: true + + smart-buffer@4.2.0: {} + + socks-proxy-agent@8.0.5: + dependencies: + agent-base: 7.1.4 + debug: 4.4.3 + socks: 2.8.7 + transitivePeerDependencies: + - supports-color + + socks@2.8.7: + dependencies: + ip-address: 10.1.0 + smart-buffer: 4.2.0 + sonner@2.0.7(react-dom@19.2.0(react@19.2.0))(react@19.2.0): dependencies: react: 19.2.0 @@ -9106,10 +11114,26 @@ snapshots: source-map-js@1.2.1: {} + source-map-support@0.5.21: + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + + source-map@0.6.1: {} + space-separated-tokens@2.0.2: {} sprintf-js@1.0.3: {} + sprintf-js@1.1.3: + optional: true + + ssri@12.0.0: + dependencies: + minipass: 7.1.3 + + stat-mode@1.0.0: {} + static-browser-server@1.0.3: dependencies: '@open-draft/deferred-promise': 2.2.0 @@ -9139,6 +11163,12 @@ snapshots: is-fullwidth-code-point: 3.0.0 strip-ansi: 6.0.1 + string-width@5.1.2: + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.2.0 + string_decoder@1.1.1: dependencies: safe-buffer: 5.1.2 @@ -9152,6 +11182,10 @@ snapshots: dependencies: ansi-regex: 5.0.1 + strip-ansi@7.2.0: + dependencies: + ansi-regex: 6.2.2 + strip-bom-string@1.0.0: {} strip-json-comments@3.1.1: {} @@ -9172,15 +11206,25 @@ snapshots: stylis@4.3.6: {} + sumchecker@3.0.1: + dependencies: + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + supports-color@7.2.0: dependencies: has-flag: 4.0.0 + supports-color@8.1.1: + dependencies: + has-flag: 4.0.0 + supports-preserve-symlinks-flag@1.0.0: {} swagger-schema-official@2.0.0-bab6bed: {} - swagger-typescript-api@12.0.4: + swagger-typescript-api@12.0.4(encoding@0.1.13): dependencies: '@types/swagger-schema-official': 2.0.22 cosmiconfig: 7.0.1 @@ -9194,15 +11238,15 @@ snapshots: node-fetch: 3.3.2 prettier: 2.7.1 swagger-schema-official: 2.0.0-bab6bed - swagger2openapi: 7.0.8 + swagger2openapi: 7.0.8(encoding@0.1.13) typescript: 4.8.4 transitivePeerDependencies: - encoding - swagger2openapi@7.0.8: + swagger2openapi@7.0.8(encoding@0.1.13): dependencies: call-me-maybe: 1.0.2 - node-fetch: 2.7.0 + node-fetch: 2.7.0(encoding@0.1.13) node-fetch-h2: 2.3.0 node-readfiles: 0.2.0 oas-kit-common: 1.0.8 @@ -9223,10 +11267,32 @@ snapshots: tapable@2.3.0: {} + tar@7.5.12: + dependencies: + '@isaacs/fs-minipass': 4.0.1 + chownr: 3.0.0 + minipass: 7.1.3 + minizlib: 3.1.0 + yallist: 5.0.0 + + temp-file@3.4.0: + dependencies: + async-exit-hook: 2.0.1 + fs-extra: 10.1.0 + + temp@0.9.4: + dependencies: + mkdirp: 0.5.6 + rimraf: 2.6.3 + timers-browserify@2.0.12: dependencies: setimmediate: 1.0.5 + tiny-async-pool@1.3.0: + dependencies: + semver: 5.7.2 + tinyexec@1.0.2: {} tinyglobby@0.2.15: @@ -9234,6 +11300,12 @@ snapshots: fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 + tmp-promise@3.0.3: + dependencies: + tmp: 0.2.5 + + tmp@0.2.5: {} + to-buffer@1.2.2: dependencies: isarray: 2.0.5 @@ -9246,10 +11318,16 @@ snapshots: tr46@0.0.3: {} + tree-kill@1.2.2: {} + trim-lines@3.0.1: {} trough@2.2.0: {} + truncate-utf8-bytes@1.0.2: + dependencies: + utf8-byte-length: 1.0.5 + ts-api-utils@2.1.0(typescript@5.9.3): dependencies: typescript: 5.9.3 @@ -9266,6 +11344,9 @@ snapshots: dependencies: prelude-ls: 1.2.1 + type-fest@0.13.1: + optional: true + type@2.7.3: {} typed-array-buffer@1.0.3: @@ -9291,6 +11372,8 @@ snapshots: ufo@1.6.2: {} + undici-types@6.21.0: {} + undici-types@7.16.0: {} unidiff@1.0.4: @@ -9307,6 +11390,14 @@ snapshots: trough: 2.2.0 vfile: 6.0.3 + unique-filename@4.0.0: + dependencies: + unique-slug: 5.0.0 + + unique-slug@5.0.0: + dependencies: + imurmurhash: 0.1.4 + unist-util-is@6.0.1: dependencies: '@types/unist': 3.0.3 @@ -9334,6 +11425,10 @@ snapshots: unist-util-is: 6.0.1 unist-util-visit-parents: 6.0.2 + universalify@0.1.2: {} + + universalify@2.0.1: {} + update-browserslist-db@1.1.4(browserslist@4.28.0): dependencies: browserslist: 4.28.0 @@ -9368,6 +11463,8 @@ snapshots: dependencies: react: 19.2.0 + utf8-byte-length@1.0.5: {} + util-deprecate@1.0.2: {} util@0.12.5: @@ -9398,6 +11495,13 @@ snapshots: - '@types/react' - '@types/react-dom' + verror@1.10.1: + dependencies: + assert-plus: 1.0.0 + core-util-is: 1.0.2 + extsprintf: 1.4.1 + optional: true + vfile-location@5.0.3: dependencies: '@types/unist': 3.0.3 @@ -9457,10 +11561,24 @@ snapshots: w3c-keyname@2.2.8: {} + wait-on@8.0.5: + dependencies: + axios: 1.13.6 + joi: 18.0.2 + lodash: 4.17.21 + minimist: 1.2.8 + rxjs: 7.8.2 + transitivePeerDependencies: + - debug + warning@4.0.3: dependencies: loose-envify: 1.4.0 + wcwidth@1.0.1: + dependencies: + defaults: 1.0.4 + web-namespaces@2.0.1: {} web-streams-polyfill@3.3.3: {} @@ -9486,6 +11604,10 @@ snapshots: dependencies: isexe: 2.0.0 + which@5.0.0: + dependencies: + isexe: 3.1.5 + word-wrap@1.2.5: {} wrap-ansi@7.0.0: @@ -9494,12 +11616,26 @@ snapshots: string-width: 4.2.3 strip-ansi: 6.0.1 + wrap-ansi@8.1.0: + dependencies: + ansi-styles: 6.2.3 + string-width: 5.1.2 + strip-ansi: 7.2.0 + + wrappy@1.0.2: {} + + xmlbuilder@15.1.1: {} + xtend@4.0.2: {} y18n@5.0.8: {} yallist@3.1.1: {} + yallist@4.0.0: {} + + yallist@5.0.0: {} + yaml@1.10.2: {} yaml@2.8.2: {} @@ -9516,6 +11652,11 @@ snapshots: y18n: 5.0.8 yargs-parser: 21.1.1 + yauzl@2.10.0: + dependencies: + buffer-crc32: 0.2.13 + fd-slicer: 1.1.0 + yjs@13.6.27: dependencies: lib0: 0.2.115 diff --git a/frontend/scripts/electron-postinstall.cjs b/frontend/scripts/electron-postinstall.cjs new file mode 100644 index 00000000..1cdde4a7 --- /dev/null +++ b/frontend/scripts/electron-postinstall.cjs @@ -0,0 +1,15 @@ +"use strict" + +/** CI / 无桌面需求时设为 1,可跳过 Chromium 下载 */ +if (process.env.ELECTRON_SKIP_BINARY_DOWNLOAD === "1") { + process.exit(0) +} + +const { execSync } = require("child_process") +const fs = require("fs") +const path = require("path") + +const installScript = path.join(__dirname, "..", "node_modules", "electron", "install.js") +if (fs.existsSync(installScript)) { + execSync(`node "${installScript}"`, { stdio: "inherit" }) +} diff --git a/frontend/scripts/pack-win.mjs b/frontend/scripts/pack-win.mjs new file mode 100644 index 00000000..fa6648e3 --- /dev/null +++ b/frontend/scripts/pack-win.mjs @@ -0,0 +1,41 @@ +#!/usr/bin/env node +/** + * Windows 打包:默认使用 dir(免 NSIS 下载,适合 WSL/弱 GitHub 网络)。 + * 可选参数会原样传给 electron-builder,例如: + * node scripts/pack-win.mjs -- --win portable --x64 --publish never + */ +import { spawnSync } from "node:child_process" +import { readFileSync } from "node:fs" +import path from "node:path" +import { fileURLToPath } from "node:url" + +const root = path.join(path.dirname(fileURLToPath(import.meta.url)), "..") + +process.env.ELECTRON_MIRROR ||= "https://npmmirror.com/mirrors/electron/" +process.env.ELECTRON_BUILDER_BINARIES_MIRROR ||= "https://npmmirror.com/mirrors/electron-builder-binaries/" +process.env.CSC_IDENTITY_AUTO_DISCOVERY = "false" + +const eb = path.join(root, "node_modules", ".bin", "electron-builder") +let extra = process.argv.slice(2) +if (extra[0] === "--") extra = extra.slice(1) +const useDefaultDir = extra.length === 0 +const args = useDefaultDir ? ["--win", "dir", "--x64", "--publish", "never"] : extra + +const r = spawnSync(eb, args, { stdio: "inherit", cwd: root, shell: false }) +if ((r.status ?? 1) !== 0) process.exit(r.status ?? 1) + +if (useDefaultDir) { + const pkg = JSON.parse(readFileSync(path.join(root, "package.json"), "utf8")) + const ver = pkg.version || "0.0.0" + const zipName = `MonkeyCode-${ver}-win-x64.zip` + const releaseDir = path.join(root, "release") + const z = spawnSync("zip", ["-rq", zipName, "win-unpacked"], { + stdio: "inherit", + cwd: releaseDir, + }) + if ((z.status ?? 1) !== 0) { + console.error("[pack-win] zip 失败,请手动压缩 release/win-unpacked") + process.exit(z.status ?? 1) + } + console.log(`[pack-win] 已生成 ${path.join(releaseDir, zipName)}`) +} diff --git a/frontend/vite.config.ts b/frontend/vite.config.ts index 98ca8a2f..e173b0ce 100644 --- a/frontend/vite.config.ts +++ b/frontend/vite.config.ts @@ -6,8 +6,10 @@ import { defineConfig, loadEnv } from "vite" // https://vite.dev/config/ export default defineConfig(({ mode }) => { const env = loadEnv(mode, process.cwd(), '') + const electronBuild = process.env.ELECTRON === 'true' return { + base: electronBuild ? './' : '/', plugins: [react(), tailwindcss()], resolve: { alias: { From be72cebcf6b19f67295664edaaf5f1f3e26c0e23 Mon Sep 17 00:00:00 2001 From: Monster <389264167@qq.com> Date: Mon, 23 Mar 2026 22:36:18 +0800 Subject: [PATCH 07/11] =?UTF-8?q?fix(deps):=20=E7=A7=BB=E9=99=A4=E8=AF=AF?= =?UTF-8?q?=E5=8A=A0=E7=9A=84=20dev=20=E5=8C=85=EF=BC=8C=E9=81=BF=E5=85=8D?= =?UTF-8?q?=20macOS=20CI=20=E7=BC=96=E8=AF=91=20inotify=20=E5=A4=B1?= =?UTF-8?q?=E8=B4=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Made-with: Cursor --- frontend/package.json | 1 - frontend/pnpm-lock.yaml | 38 -------------------------------------- 2 files changed, 39 deletions(-) diff --git a/frontend/package.json b/frontend/package.json index 1662a6ef..1dc828b1 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -64,7 +64,6 @@ "clsx": "^2.1.1", "cmdk": "^1.1.1", "dayjs": "^1.11.19", - "dev": "^0.1.3", "diff": "^8.0.3", "gray-matter": "^4.0.3", "jszip": "^3.10.1", diff --git a/frontend/pnpm-lock.yaml b/frontend/pnpm-lock.yaml index 88fbdb2c..2b667a46 100644 --- a/frontend/pnpm-lock.yaml +++ b/frontend/pnpm-lock.yaml @@ -122,9 +122,6 @@ importers: dayjs: specifier: ^1.11.19 version: 1.11.19 - dev: - specifier: ^0.1.3 - version: 0.1.3 diff: specifier: ^8.0.3 version: 8.0.3 @@ -2271,9 +2268,6 @@ packages: resolution: {integrity: sha512-ipDqC8FrAl/76p2SSWKSI+H9tFwm7vYqXQrItCuiVPt26Km0jS+NzSsBWAaBusvSbQcfJG+JitdMm+wZAgTYqg==} hasBin: true - bindings@1.5.0: - resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} - bl@4.1.0: resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} @@ -2824,10 +2818,6 @@ packages: detect-node@2.1.0: resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} - dev@0.1.3: - resolution: {integrity: sha512-flCHQwAkXk3+1up/wo93Ms9E5Wf9K28ZGA7Oz55nBZ8OTdPPhyvZrwsT+twtySTFHIwv0w9CUNtagZgu1MgzXQ==} - hasBin: true - devlop@1.1.0: resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} @@ -3153,9 +3143,6 @@ packages: resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} engines: {node: '>=16.0.0'} - file-uri-to-path@1.0.0: - resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} - filelist@1.0.6: resolution: {integrity: sha512-5giy2PkLYY1cP39p17Ech+2xlpTRL9HLspOfEgm0L6CwBXBTgsK5ou0JtzYuepxkaQ/tvhCFIJ5uXo0OrM2DxA==} @@ -3457,11 +3444,6 @@ packages: inline-style-parser@0.2.7: resolution: {integrity: sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==} - inotify@1.4.6: - resolution: {integrity: sha512-WW8/uqIA04O3AePQVe/Ms3ZLR0yGamaz8YOEpaXc4WBAGOPZfzu58wWErEPSUYaPyDrJRIeCn6PEIQgC1ZyQ5w==} - engines: {node: '>=0.8'} - os: [linux] - internmap@1.0.1: resolution: {integrity: sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==} @@ -4140,9 +4122,6 @@ packages: ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - nan@2.25.0: - resolution: {integrity: sha512-0M90Ag7Xn5KMLLZ7zliPWP3rT90P6PN+IzVFS0VqmnPktBk3700xUVv8Ikm9EUaUE5SDWdp/BIxdENzVznpm1g==} - nanoid@3.3.11: resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} @@ -7813,10 +7792,6 @@ snapshots: baseline-browser-mapping@2.9.19: {} - bindings@1.5.0: - dependencies: - file-uri-to-path: 1.0.0 - bl@4.1.0: dependencies: buffer: 5.7.1 @@ -8476,10 +8451,6 @@ snapshots: detect-node@2.1.0: optional: true - dev@0.1.3: - dependencies: - inotify: 1.4.6 - devlop@1.1.0: dependencies: dequal: 2.0.3 @@ -8912,8 +8883,6 @@ snapshots: dependencies: flat-cache: 4.0.1 - file-uri-to-path@1.0.0: {} - filelist@1.0.6: dependencies: minimatch: 5.1.9 @@ -9297,11 +9266,6 @@ snapshots: inline-style-parser@0.2.7: {} - inotify@1.4.6: - dependencies: - bindings: 1.5.0 - nan: 2.25.0 - internmap@1.0.1: {} internmap@2.0.3: {} @@ -10252,8 +10216,6 @@ snapshots: ms@2.1.3: {} - nan@2.25.0: {} - nanoid@3.3.11: {} nanoid@3.3.4: {} From 1e03e4d1c313c42dc13e6b6ec30f63e3cf811b45 Mon Sep 17 00:00:00 2001 From: Monster <389264167@qq.com> Date: Mon, 23 Mar 2026 22:37:32 +0800 Subject: [PATCH 08/11] chore(release): bump version to 260323.2 Made-with: Cursor --- frontend/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/package.json b/frontend/package.json index 1dc828b1..02c3b01b 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,7 +1,7 @@ { "name": "monkeycode-ai", "private": true, - "version": "260323.1", + "version": "260323.2", "description": "MonkeyCode 桌面客户端", "author": "MonkeyCode", "type": "module", From 7b50ce6e494500bdaa4b11dc0093e98a8ef974d8 Mon Sep 17 00:00:00 2001 From: Monster <389264167@qq.com> Date: Mon, 23 Mar 2026 22:40:47 +0800 Subject: [PATCH 09/11] =?UTF-8?q?fix(electron):=20=E4=BD=BF=E7=94=A8?= =?UTF-8?q?=E4=B8=89=E6=AE=B5=20semver=20=E7=89=88=E6=9C=AC=E5=8F=B7?= =?UTF-8?q?=EF=BC=8C=E5=85=BC=E5=AE=B9=20electron-builder?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Made-with: Cursor --- .github/workflows/electron-release.yml | 7 +++++++ frontend/package.json | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/.github/workflows/electron-release.yml b/.github/workflows/electron-release.yml index 6d77396f..dce88917 100644 --- a/.github/workflows/electron-release.yml +++ b/.github/workflows/electron-release.yml @@ -47,6 +47,10 @@ jobs: else V="0.0.0-ci.${{ github.run_number }}" fi + # electron-builder 要求严格 semver(至少 major.minor.patch 三段) + if [[ "$V" =~ ^[0-9]+\.[0-9]+$ ]]; then + V="${V}.0" + fi node -e "const fs=require('fs');const p='package.json';const j=JSON.parse(fs.readFileSync(p,'utf8'));j.version=process.argv[1];fs.writeFileSync(p,JSON.stringify(j,null,2)+'\n');" "$V" - name: Install dependencies @@ -94,6 +98,9 @@ jobs: else V="0.0.0-ci.${{ github.run_number }}" fi + if [[ "$V" =~ ^[0-9]+\.[0-9]+$ ]]; then + V="${V}.0" + fi node -e "const fs=require('fs');const p='package.json';const j=JSON.parse(fs.readFileSync(p,'utf8'));j.version=process.argv[1];fs.writeFileSync(p,JSON.stringify(j,null,2)+'\n');" "$V" - name: Install dependencies diff --git a/frontend/package.json b/frontend/package.json index 02c3b01b..7e8c88b5 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,7 +1,7 @@ { "name": "monkeycode-ai", "private": true, - "version": "260323.2", + "version": "260323.2.0", "description": "MonkeyCode 桌面客户端", "author": "MonkeyCode", "type": "module", From 1d6aec9fe8978455fce569c5a8d690c8f16cac05 Mon Sep 17 00:00:00 2001 From: Monster <389264167@qq.com> Date: Mon, 23 Mar 2026 22:42:10 +0800 Subject: [PATCH 10/11] chore(release): bump version to 260323.0.0 Made-with: Cursor --- frontend/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/package.json b/frontend/package.json index 7e8c88b5..4a788e8b 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,7 +1,7 @@ { "name": "monkeycode-ai", "private": true, - "version": "260323.2.0", + "version": "260323.0.0", "description": "MonkeyCode 桌面客户端", "author": "MonkeyCode", "type": "module", From fd431e8f21dcefb4328f70099103ba4781105e31 Mon Sep 17 00:00:00 2001 From: Monster <389264167@qq.com> Date: Mon, 23 Mar 2026 23:27:01 +0800 Subject: [PATCH 11/11] =?UTF-8?q?fix(electron):=20=E7=99=BB=E5=BD=95?= =?UTF-8?q?=E5=85=A5=E5=8F=A3=E3=80=81=E5=9B=BE=E6=A0=87=E4=B8=8E=20asarUn?= =?UTF-8?q?pack=EF=BC=9BWSL=20=E5=85=B3=20rcedit=EF=BC=8CCI=20Windows=20?= =?UTF-8?q?=E7=94=A8=20native=20=E6=89=93=E5=8C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Made-with: Cursor --- .github/workflows/electron-release.yml | 3 ++- frontend/electron-builder.ci-win.json | 5 +++++ frontend/electron-builder.full.json | 4 +++- frontend/electron/icon.png | Bin 0 -> 83835 bytes frontend/electron/main.cjs | 29 ++++++++++++++++++++++--- frontend/package.json | 8 ++++++- 6 files changed, 43 insertions(+), 6 deletions(-) create mode 100644 frontend/electron-builder.ci-win.json create mode 100644 frontend/electron/icon.png diff --git a/.github/workflows/electron-release.yml b/.github/workflows/electron-release.yml index dce88917..352969bf 100644 --- a/.github/workflows/electron-release.yml +++ b/.github/workflows/electron-release.yml @@ -56,8 +56,9 @@ jobs: - name: Install dependencies run: pnpm install --frozen-lockfile + # 仅在 Windows Runner 上开启 signAndEditExecutable(写入 exe 图标等);Linux/WSL 需 false,否则会要求 wine - name: Build Windows (portable + NSIS) - run: pnpm run electron:ci:win + run: pnpm run electron:ci:win:native - name: Collect artifacts shell: bash diff --git a/frontend/electron-builder.ci-win.json b/frontend/electron-builder.ci-win.json new file mode 100644 index 00000000..ee5a06b5 --- /dev/null +++ b/frontend/electron-builder.ci-win.json @@ -0,0 +1,5 @@ +{ + "win": { + "signAndEditExecutable": true + } +} diff --git a/frontend/electron-builder.full.json b/frontend/electron-builder.full.json index 8dd429d5..94b8f612 100644 --- a/frontend/electron-builder.full.json +++ b/frontend/electron-builder.full.json @@ -2,5 +2,7 @@ "directories": { "output": "release-full" }, - "files": ["dist/**/*", "electron/**/*", "package.json"] + "icon": "electron/icon.png", + "files": ["dist/**/*", "electron/**/*", "package.json"], + "asarUnpack": ["electron/icon.png"] } diff --git a/frontend/electron/icon.png b/frontend/electron/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..693908863ab481ae36656f3cbb08d7253e122510 GIT binary patch literal 83835 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%0Ao$X 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 literal 0 HcmV?d00001 diff --git a/frontend/electron/main.cjs b/frontend/electron/main.cjs index afee10af..75ee93cf 100644 --- a/frontend/electron/main.cjs +++ b/frontend/electron/main.cjs @@ -4,6 +4,23 @@ const path = require("path") const isDev = !app.isPackaged const DEFAULT_PROD_URL = "https://monkeycode-ai.com" +/** 桌面端启动路径(相对站点根),可用 MONKEYCODE_DESKTOP_START_PATH 覆盖 */ +const START_PATH = (process.env.MONKEYCODE_DESKTOP_START_PATH || "/login").replace(/\/$/, "") || "/login" + +function desktopEntryUrl(base) { + const href = (base || "").trim() || DEFAULT_PROD_URL + return new URL(`${START_PATH.startsWith("/") ? START_PATH : `/${START_PATH}`}`, href).href +} + +/** Windows 任务栏/窗口图标不能从 app.asar 内读,需配合 package.json 的 asarUnpack */ +function windowIconPath() { + if (app.isPackaged) { + const unpacked = path.join(process.resourcesPath, "app.asar.unpacked", "electron", "icon.png") + if (fs.existsSync(unpacked)) return unpacked + } + const local = path.join(__dirname, "icon.png") + return fs.existsSync(local) ? local : undefined +} /** 避免 ready-to-show 迟迟不触发时窗口永远隐藏(用户以为程序没启动) */ function ensureWindowVisible(win, ms = 2000) { @@ -25,6 +42,7 @@ function createWindow() { minHeight: 640, show: false, autoHideMenuBar: true, + icon: windowIconPath(), webPreferences: { preload: path.join(__dirname, "preload.cjs"), contextIsolation: true, @@ -52,8 +70,8 @@ function createWindow() { }) if (isDev) { - const devUrl = process.env.VITE_DEV_SERVER_URL || "http://localhost:5173" - win.loadURL(devUrl) + const devBase = process.env.VITE_DEV_SERVER_URL || "http://localhost:5173" + win.loadURL(desktopEntryUrl(devBase)) win.webContents.openDevTools({ mode: "detach" }) } else if (process.env.MONKEYCODE_LOAD_LOCAL_DIST === "1") { const indexHtml = path.join(__dirname, "..", "dist", "index.html") @@ -65,9 +83,11 @@ function createWindow() { app.quit() return } + // 本地 file:// + BrowserRouter 无法可靠使用 /login,仍打开入口页 win.loadFile(indexHtml) } else { - win.loadURL(process.env.MONKEYCODE_DESKTOP_URL || DEFAULT_PROD_URL) + const base = process.env.MONKEYCODE_DESKTOP_URL || DEFAULT_PROD_URL + win.loadURL(desktopEntryUrl(base)) } } @@ -87,6 +107,9 @@ if (!gotLock) { // Windows / Linux:去掉顶部「文件、编辑…」应用菜单栏 if (process.platform !== "darwin") { Menu.setApplicationMenu(null) + } else { + const icon = windowIconPath() + if (icon) app.dock.setIcon(icon) } createWindow() }) diff --git a/frontend/package.json b/frontend/package.json index 4a788e8b..4d7227a2 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,7 +1,7 @@ { "name": "monkeycode-ai", "private": true, - "version": "260323.0.0", + "version": "260323.0.1", "description": "MonkeyCode 桌面客户端", "author": "MonkeyCode", "type": "module", @@ -21,7 +21,9 @@ "electron:pack:win:portable": "node scripts/pack-win.mjs -- --win portable --x64 --publish never", "electron:pack:win:nsis": "node scripts/pack-win.mjs -- --win nsis --x64 --publish never", "electron:pack:win:dir": "node scripts/pack-win.mjs -- --win dir --x64 --publish never", + "electron:sync-icon": "node -e \"require('fs').copyFileSync('public/logo-colored.png','electron/icon.png')\"", "electron:ci:win": "electron-builder --win portable nsis --x64 --publish never", + "electron:ci:win:native": "electron-builder --win portable nsis --x64 --publish never -c electron-builder.ci-win.json", "electron:ci:mac": "electron-builder --mac --arm64 --x64 --publish never", "postinstall": "node scripts/electron-postinstall.cjs" }, @@ -122,6 +124,10 @@ "output": "release" }, "npmRebuild": false, + "icon": "electron/icon.png", + "asarUnpack": [ + "electron/icon.png" + ], "files": [ "electron/**/*", "package.json"