开发文档

环境自检与安全修复

本地运行环境、诊断证据与受限修复

本地工作区完成身份初始化后运行一次环境检查,不阻塞打开画布。有需处理的问题时显示提示;设置的“问题诊断”可重新检查。导出诊断包时重新采集本机结果,写入 context/environment.json,浏览器能力写入 context/runtime.json。启动时的修复与异常保留在前端诊断事件中。

在导入画布、数据存储和后端自举模块之前,还会检查安全随机数、结构化复制和 IndexedDB 接口。缺失必要能力时显示更新/权限提示和固定布尔排查信息;工作区初始化异常时提供重新加载入口,不显示原始异常、路径或凭据,不清空用户数据。

已接入的检查

检查证据与处理
数据目录只使用当前工作区的已确定目录。目录不可访问时报告错误,不创建空工作区替代原项目
存储写入写入独立临时文件、同步、关闭并删除;不读用户素材或数据库正文
剩余空间可用空间低于 1 GB 提醒,读取失败保留未确认。阈值不代表大型项目所需容量
临时与下载目录检查 tmp、downloads;只有缺失时自动创建,并复检。已有文件、符号链接、权限和内容均不替换
视频处理工具沿用媒体工具解析器,检查普通文件与执行权限;不执行未知二进制,不声称所有编码均可解码
深度模型未安装视作可选,已有文件检查可读性与预期大小;完整哈希和受信清单仍由实际使用时的组件安装器校验
代理配置区分明确环境变量、系统静态代理和仅 PAC/WPAD;不导出地址、凭据和绕过列表,不改变用户配置
浏览器能力检查安全随机数、结构化复制、IndexedDB 实际写读清理、图形接口及视频支持声明;不主动创建 GPU 上下文,避免干扰远程桌面或虚拟屏驱动

生成、重试、工作流测试、素材导入和助手附件的客户端编号统一使用已有 Nano ID 实现,避免部分内网 HTTP 环境缺少 crypto.randomUUID() 导致调用失败。仍使用安全随机数,不降级为时间戳或 Math.random() 创建业务标识。诊断用独立数据库的临时名字不参与任何业务身份。

案例库如何参与

backend/internal/environment/cases.json 是从 Desktop Environment Cases 固定版本摘取的 13 条已确认案例元数据。诊断结果携带来源、提交和相关案例编号;检查与修复由产品内固定代码实现。启动不下载案例、不执行案例文字或命令。

案例产品接入
ENV-0001缺失 API 的能力检测;继续保留现有 toSorted 修复与缺失 API 回归
ENV-0006、0007、0009当前工作区、临时目录、实际写入与空间检查
ENV-0010、0011父/子进程代理配置说明、PAC 未覆盖提醒和模型文件检查
ENV-0014、0015、0016、0029浏览器编码支持声明与原生媒体工具文件检测
ENV-0022空间提醒;不在自检里重新实现已完成更新的清理流程
ENV-0046组件下载目录检查;并发安装仍由既有安装器串行化
ENV-0051图形接口检测;硬件加速保持未确认,不把设备慢直接认定为驱动故障

其余案例继续保留在案例库:安装器/发布机问题在构建与原生安装测试中验证;已修复的迁移、续传、数据库和 MCP 生命周期不另造修复器;未知根因报告不据症状自动分派修复。运行时未知、可选组件未装、接口存在和已实际验证是不同状态。

操作合同

POST /api/diagnostics/environment 接收 { "repair": false } 或 { "repair": true }。它使用与其他诊断接口相同的工作区身份与桌面信任校验,不接受路径、命令或下载地址。非本地工作区跳过本机文件检查。返回标准业务信封,结果不缓存。

自动修复仅创建缺失的两个固定目录。每次运行都可重复执行;不删缓存、原件、模型或项目,不改权限、代理、证书、系统安全设置,不重发模型请求。文件系统访问使用 Go os.Root,拒绝越出工作区的符号链接。依赖安装、系统修改和无法确认的问题提供诊断建议,不作为自动动作执行。

参考:MDN randomUUID 的安全上下文限制、getRandomValues、Go 的目录访问保护。

本页内容