添加 AGC 客户端更新检查与下载能力 #230
Reference in New Issue
Block a user
Delete Branch "codex/agc-update-check"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
实现 AGC 启动版本检测与 OSS 安装包下载。
Closes #224
3540d11ac7toda76cb9056fea7a72246to9ecc4eeae8审查 head sha:
5c58c4380f发现一个错误处理问题:
downloadAppUpdate()在 Tauri 命令失败(例如下载地址不被原生白名单接受、网络失败、大小或 SHA-256 校验失败、保存失败)时会 reject,而handleDownload()只有finally,没有catch/错误状态。结果是点击“下载更新”后按钮恢复,但用户没有任何失败反馈,浏览器还可能产生未处理 Promise rejection,无法判断是否需要重试。建议捕获异常并显示可访问的错误提示(必要时提供重试),同时覆盖该路径的组件测试。downloadAppUpdate的 rejection 在这里没有被捕获;下载失败时用户无反馈,并可能产生未处理 Promise rejection。请增加错误状态/提示和重试行为。PR 230 review head
fea7a72246: 阻塞问题:append_jsonl_line_unlocked 已移除 no-follow 与打开后身份校验,普通 OpenOptions::open(path) 会跟随 .agent 下被替换的符号链接,导致 JSONL 追加或尾部修复写入项目外文件。请恢复原有 symlink/hardlink/父目录替换防护。全量 Rust 测试实际 885 passed / 1501 failed。阻塞安全回归:普通 OpenOptions::open(path) 会跟随符号链接;请恢复 O_NOFOLLOW、普通文件/单硬链接校验和打开后 inode/句柄复核,或使用已验证目录句柄的 openat 等价实现。
审查 head sha:
bccc969855发现 2 个明确问题,详见行内评论。
明确问题:downloadAppUpdate 失败时会 reject,但这里没有 catch 或错误状态。网络、白名单、完整性校验或保存失败后按钮恢复却无用户反馈,并可能产生未处理 Promise rejection。建议捕获异常并显示可访问的错误/重试提示,补充失败路径测试。
安全问题:StrictHostKeyChecking=no 禁用了 SSH 主机身份校验。构建节点无法确认 192.168.35.82 是受信任的 Git 服务器,中间人可提供恶意源码并在 Jenkins 构建/上传阶段执行。建议使用受管控的 known_hosts 或 Jenkins host-key verification strategy 校验固定指纹。
审查 head sha:
b913aa9ed3发现 2 个明确问题:
中等:下载失败没有用户可见反馈(
apps/ai-game-creator-shell/src/components/AppUpdateNotice.tsx:30)downloadAppUpdate()的 reject 没有被 catch;handleDownload只有finally。网络失败、原生下载命令拒绝、大小/SHA-256 校验失败或保存失败时,界面不会显示错误,且会产生未处理的 Promise rejection。建议增加错误状态,在 catch 中展示可访问的失败提示/重试入口,并补充组件测试。高:响应体在大小限制检查前被一次性读入内存(
apps/ai-game-creator-shell/src-tauri/src/main.rs:84)response.bytes()会先缓冲完整响应,只有之后才检查 512 MiB 上限。服务端省略 Content-Length 并发送超大 chunked 响应时,可绕过这段保护并造成客户端内存耗尽。建议使用bytes_stream()分块读取,累计超过上限立即中止,并在写临时文件时计算 SHA-256/size。本次未提交 REQUEST_CHANGES:Gitea 拒绝 PR 作者 kdletters 审查自己的 PR(HTTP 422)。
审查 head sha:
de3dbd330e发现 1 个明确的高风险问题:
apps/ai-game-creator-shell/scripts/release-upload.mjs:23)。runOssutil()将AGC_OSS_ACCESS_KEY_SECRET放入spawnSync的 argv;Jenkins/同机用户/进程审计可能读取完整命令行,从而泄露 OSS Secret。这也与发布文档所述“不能写入命令行参数”矛盾。建议改用 ossutil 配置文件、标准输入或其他不会出现在 argv 的认证方式,并增加 CI 检查确认进程命令行不包含密钥。尝试提交行内 REQUEST_CHANGES 评审,但 Gitea 拒绝作者 kdletters 审查自己的 PR(HTTP 422),因此本次通过总评论回写。
审查 head sha:
51f19f3b72结论:未发现明确问题。按 base
80f34d062d审查了当前 head 的差异。实际验证:Node release 脚本测试 4/4 通过;head 工作树 cargo check 通过(仅有既有 warnings)。前端 Vitest/typecheck 在独立 head 工作树无法运行,原因是该工作树未安装 node_modules,报错为找不到 vitest/vite client 类型;未将其作为代码问题。