Repository navigation
奇想盒:使用统一自动恢复取代安装失败弹窗 - #1905
奇想盒:使用统一自动恢复取代安装失败弹窗#1905youngslin merged 52 commits into
Conversation
总体结论:修改后合并AUTO-MAS-Project/AUTO-MAS #1905 宝宝,奇想盒这次按 wheel/pip 的安装方式处理恢复,没有把 BetterGI 的安装逻辑硬套过来。重试、跳过、取消和目标标识都接上了,但把同一门槛放到原生配置入口前,会挡住原本用来修环境的官方 GUI。这处产品边界需要先处理喵。 规范[规范与行为 · P2] 未完成后端安装不应堵住原生 GUI 修复出口 位置:manager.py:186–198,影响后面的 ScriptConfig 分支:216–224。 项目的奇想盒专项约定明确保留了一个区别:配置会话只要求 whimbox_app.exe,后端未初始化也应能打开官方 app 修环境。现有 check() 和 ScriptConfigTask 也确实这样实现,配置会话只是启动官方壳,不是启动一条龙。 现在只要有 .mas-update-pending,配置会话也必须先完成恢复。安装中断后依赖损坏、自动重试又因下载失败等原因无法完成时,“跳过”会被健康检查拒绝,“取消”直接结束任务,官方 GUI 始终打不开。用户只能离开 MAS 另找程序启动,原有修复出口被收窄了。 PR 正文确实写了“打开界面之前统一检测”,所以这不是实现漏按正文做,而是新行为与已有专项规范冲突。请为配置会话保留明确的“打开官方 app 修复”路径,继续持有必要的进程和安装互斥,不清除失败标记,也不启动自动任务;或者先由维护者明确调整这项产品约定。恢复流程不能要求用户先修好,才让他打开修复工具呀。 其他规范未确认新增阻断项:App.vue 为 256→259 行,新弹窗 133 行;沿用 Ant Design Vue、共享标题栏避让和三语言词条。遥测复用现有任务终态,名称与目录没有加入埋点。 规格按本 PR 正文核对,未确认其他新增 P1/P2:
有一个表述边界请顺手说准确:find_spec 只证明模块入口可定位,pip check 检查已安装发行包的依赖关系,不等于真正导入主模块或验证所有文件。界面已提示这项完整性风险,dot酱没有将它重复记作缺陷。 验证当前提交的 Windows pytest、Ubuntu pytest、前端格式/typecheck/测试和 Windows 验证包构建均通过,已读取相关日志。新增用例覆盖 skip、失败保留标记、关闭接管重试及提示目标,但没有覆盖上述 ScriptConfig 修复出口。 本轮仅静态审查与读取既有 CI,未运行项目、测试、真实安装器或 Electron 界面。CI 不能代替真实 Windows 安装恢复、弹窗排队和断线交互验证。规范轴 1 项 P2,规格轴未确认其他阻断项。 —— dot酱给修复入口留条路敬上 🐾 |
总体结论:可以合并AUTO-MAS-Project/AUTO-MAS #1905 · 修复复审 宝宝,官方 app 的修复入口这次留住啦,而且没有顺手清掉安装保护。审查中补到的主动重连清理也已纳入最新代码,dot酱核对后没有确认的必须修改项喵。这个结论是代码审查建议,最新提交的 CI 尚未跑完,合并前仍需确认门禁结果。 规范前次 P2 已修复。manager.py L191–233 只在 ScriptConfig 提供“打开官方 app 修复”,选择后保留标记、沿用安装锁并进入真实 ScriptConfigTask,随后直接返回,不落入自动任务。后端接收动作时和 manager 都会核对模式,原生 GUI 修环境的出口与安装保护可以同时保留啦。 恢复服务 L54–59 现在也在 onConnected 清空旧询问与 pending,退出时成对注销。已沿真实 connection.onopen 核对:清理回调同步执行,之后才处理新连接的消息,覆盖了主动换连接不触发 disconnected、关闭帧又丢失的情况。 App.vue 为 256→259 行,恢复弹窗从 133 增至 140 行,未超限;新按钮有中英日词条,继续沿用官方启动入口,没有另做一套修复器。 规格未确认剩余阻断项。重试、跳过仍受安装状态检查约束;repair_gui 只允许配置会话打开官方 app,不会把“打开界面”记成安装已修复。后续自动任务仍须处理保留的标记,这处界限没有放松喵。 验证情况仅静态审查并读取已有 CI,没有运行项目、官方 app 或真实 UI。前一版已有日志显示 Windows pytest 1815 通过、Ubuntu 1776 通过,前端 56 个文件共 299 项测试通过,格式、类型与验证包构建通过。之后新增了重连回归测试并调整格式,不能把前一版结果当作最新版通过,还需等本次 CI 完成;真实 Windows GUI/UAC 修复流程仍未取得 E2E 证据。 新增测试调用真实恢复服务、仅替换传输边界,覆盖旧请求被清理及新请求仍能操作;GUI 分支测试替换了 spawn,只证明派发和标记保留,不证明真实程序已启动。 规范轴 0 项确认问题,规格轴 0 项确认问题。这轮把修复出口和旧弹窗都处理清楚了,拍拍爪喵。 —— dot酱核过修复出口敬上 🐾 |
…r and resume interrupted directory rename
… and health checks centrally
…zed incident reporting
…en when rollback succeeds
… timeout retry, repeated download errors and fail-closed guards
总体结论:修改后合并AUTO-MAS-Project/AUTO-MAS #1905 · 自动恢复改版复审 宝宝,这版已把人工弹窗换成公共自动恢复,官方 app 的修复入口也保留了。可是实际入口多拿了一次同一把锁,任务还没走到恢复逻辑就会退出。dot酱先把这处拦下来喵,另外还有准备失败和下载缓存清理的两处回归要一起补上。 Whimbox manager 负责安排更新与账号任务,适配器提供 pip 安装、进程和版本检查,公共层负责快照、重试、回滚与队列末尾汇总。当前 PR 包含叠加的公共实现,已核对它与 #1916 已审代码一致;以下问题来自 Whimbox 接入部分。 规格与功能1. [逻辑 · P1] 实际入口重复取得非重入安装锁,自动任务和配置会话都无法启动 位置:manager.py:187–189、update.py:125–129。 main_task 先进入 Whimbox 的 installation_access(root),它内部已经取得公共 script_install.installation_access(root);同一行又单独进入一次公共锁。公共实现每次打开新句柄,以非阻塞方式取得同一目录的排他锁,没有重入机制,因此第二次会立即抛出 InstallUnsafeError。任何通过 check/prepare 的 AutoProxy、ScriptConfig 都到不了 _run_prepared,连打开官方 app 修环境也受影响。 这里不需要增加锁管理啦,去掉 manager 多出来的那次公共取锁,保留原包装器及其完整生命周期即可。请用真实 main_task 入口守护这一点;现有新增测试直接调用 _run_prepared,绕开了出错位置。 2. [兼容 · P2] 更新准备失败会中断健康旧版任务,原有安全回退被删掉 修好上面的锁后,无旧事务、无 pending 标记且开启运行前更新时,release 查询、下载或只读依赖准备一旦因网络失败,prepare_update 的异常直接传出。此时还没进入后面的公共安装事务,run_script_update 也只负责调用,不会替它恢复旧版,整批账号因此停止。 目标分支原本会先排除取消和未确认停写等不安全情况,再调用 confirm_usable_installation;确认旧安装健康后告警继续。本次同时删掉了这段逻辑和 test_preparation_failure_warns_and_continues。自动恢复想减少人工操作,别让一次下载故障反而挡住还能用的旧版呀。 请在“尚未开始安装写盘”的准备边界恢复这项能力。可复用已经引入的公共安全回退入口,明确区分可回退的下载失败,验证旧安装并加入任务末尾汇总。取消、后台停写未确认、有残留标记或健康检查失败仍须阻断,不能把安装阶段异常也一概吞掉。 3. [逻辑 · P2] 建立备份失败或取消时,已下载的 wheel 与依赖缓存无人清理 manager 先把 _update_candidate 清空,再调用公共安装入口,但 discard_update(candidate) 写在 await 成功返回之后。公共层会先检查安装并建立完整备份,随后才调用适配器安装。例如备份磁盘空间不足,或用户在备份期间取消,异常会直接跳过第 271 行;安装回调尚未执行,apply_update 的 finally 也帮不上忙。后续会话清理只能看到 None,已经下载到 download-* 的 wheel 和依赖包就留在磁盘上,反复重试会继续累积。 这里把候选包的使用围在 try/finally 里就好,finally 仍调用既有 discard_update。这个函数已有“写入进程未确认停止时保留缓存”的保护,不必另造一套清理机制。请补“包准备完成、备份失败”和“备份期间取消”的清理断言,别让下载缓存悄悄占满磁盘喵。 规范与验证专项仍通过官方 app/pip 入口工作,未新增游戏行为推断;恢复决策交给公共层,没有确认需要另做抽象的架构问题。原先 GUI 修复出口的健康门槛已移除,旧 marker 成功测试也已正确模拟清标记,这些不再重复列问题。规范轴未确认新增阻断项,规格轴有以上 1 项 P1、2 项 P2。 本轮仅静态审查并读取既有 CI,没有运行项目、测试或安装器。当前提交的格式、类型检查、前端 57 个文件共 307 项测试及 Windows 验证包构建已通过,Windows/Ubuntu pytest 尚在运行。绿色测试也不能证明绕过 main_task 的用例覆盖了入口锁,建议先补这三条真实失败路径,再确认最终 CI。实际 Windows pip 恢复与官方 GUI 的端到端行为仍无独立执行证据。 —— dot酱看住入口与收尾敬上 🐾 |
…ous version on preflight failures and finalize download cache
…ached wheel cleanup
总体结论:可以合并AUTO-MAS-Project/AUTO-MAS #1905 · 修复复审 宝宝,入口和收尾这次都补到了实际调用路径,前次 1 项 P1、2 项 P2 已修复。dot酱核对后,没有剩余的运行时阻断项喵。最新提交的 CI 仍在执行,这个结论是代码审查建议,合并前还需确认本轮门禁完成。 manager.py现在只进入一次既有安装锁;准备失败交给公共安全回退,确认没有旧备份事务且原安装健康后才继续;已下载包的清理放进 finally,备份失败和取消也能执行。取消、未确认停写和不安全安装异常仍会上抛,没有为了继续任务而抹掉这些保护。公共自动恢复实现已进入 dev,也已核对本分支叠加的公共代码与它一致。 新增测试这回真正经过 main_task 的文件锁,并检查退出后能再次取锁;准备失败用例经过公共 fallback;备份失败和取消用例检查真实下载缓存已删除。后两类仍替换了健康探针或公共安装回调,只证明相应编排和收尾,不能当作真实 pip 安装验证,边界要说清楚呀。 有一项非阻断类型建议:准备函数返回 PreparedUpdate | str,而公共 run_script_update_with_safe_fallback 的注解仍限定只返回 str。运行时可以透传安装包对象,但签名没有表达这个实际用法。可沿用公共模块已有的 T,让 operation 返回 T、helper 返回 T | str,不必另加封装,也不要用强制类型转换藏掉差异。 规范轴未确认新增阻断项,规格轴的三项旧缺陷均已解除。较早提交的 Ruff 失败已对应调整,不能继续算在当前提交上;最新格式检查已通过,pytest 和验证包任务仍在运行。dot酱仅做静态审查并读取 CI 状态,没有运行项目、测试或真实 Windows GUI/pip 流程,待本轮结果齐了再确认最终绿灯喵。 —— dot酱核过入口与清理敬上 🐾 |
…ion coverage (#1923) ## 摘要 - 修复 #1916 在 release 旧调度器中的会话接线:旧基类直接执行 `_run_main_task`,原来放在 `main_task` 的绑定不会生效。改在真实执行入口绑定并覆盖子任务收尾,正常完成和手动停止均只通过既有 TASK_NOTICE 汇总一次。 - 保留 BetterGI 正式版公告、灰度和资源就绪门槛;对有效 MAS 残留目标记录,允许主程序缺失、损坏或版本资源不可读后重新执行经校验的官方完整安装器。拒绝目标降级、记录损坏或变化,以及下载期间原生升级后的覆盖;安装后复核版本和 PE 架构再清除标记。下载准备失败仍沿用既有健康检查后继续任务的 release 行为。 - 修复 HSR 恢复状态未初始化,以及本轮原生回滚或公共恢复成功后再次更新同一引擎的问题;保留旧调度、路径锁和原生回滚,不引入新调度器。 - 逐项补回 #1905、#1906、#1908、#1909、#1913、#1915 缺失的恢复回归,适配 release 的日志与锁接口;专用验证工作流增加本目标分支的 PR 触发及三平台接口类型检查。整个 PR 只有一个更新日志碎片,不修改前端或版本号。 ## 验证 提交:`fc68ce88035fc206deeabe59851286d1459dba7b`;基线:`606c7ebd9231888519b0decad085c249b17c554a`。Windows、Python 3.12.13、uv.lock 锁定依赖。 - `uv run --no-sync python -m pytest tests -q --tb=short`:**1614 passed、2 skipped、15 subtests passed**,174.47 秒;保留现有 Pydantic 弃用提示。基线全量为 1554 passed、2 skipped。 - 同一故障场景修复前后对照:BetterGI 损坏/缺失程序、非法或变化的安装记录、目标降级与下载期间原生升级;HSR 公共恢复后的 AttributeError 和重复更新;真实旧任务正常结束/停止时的恢复汇总。修复前均复现,修复后对应检查通过。 - 变更 Python 文件 Ruff 检查、全仓 Ruff 格式、compileall、Windows/Linux/macOS 平台接口 mypy、`uv lock --check`、更新日志规则和 `git diff --check` 均通过。外部 CI action/container 引用均固定到提交或摘要。 - 本 PR 的远端 Windows/Ubuntu 全量、格式、依赖与构建检查以 Checks 最新结果为准。 | 已合并 PR | 本轮保留或补回的关键恢复覆盖 | | --- | --- | | #1905 奇想盒 | 遗留标记走公共入口,健康复核,备份失败/取消清理候选 | | #1906 SRC | Git 目标不能替代原生依赖安装完成证据,完成记录跨适配器重建 | | #1908 BAAH | 损坏/缺失程序可信修复、回执变化拒绝、旧事务验证、取消保留目录锁 | | #1909 MAA | 本体失败不伪造重试,资源半更新恢复,原始包与失败现场保留 | | #1913 MaaEnd | 原生事务、ready 阶段故障注入、可信身份修复、精确版本恢复与配置保护 | | #1915 HSR | 损坏程序、未知进程路径、真实 journal 恢复要求、恢复后不重复更新 | ## 排除与验证边界 - 不迁移 #1845 新四级调度/运行树,也不迁移 #1862 依赖新调度和前端的进度展示;保留 release 原有预下载架构。 - 不新增 dev 的 `current.recovery_summary` 历史字段或前端消费,恢复结果仍使用 release 现有任务提示和后端日志。 - BetterGI 未接入通用快照自动回滚;有效残留事务通过官方完整安装器重试,缺少可信记录、资源未就绪或仍有写入者时继续阻断,不仅凭 EXE 版本清除失败记录。 - MAA 官方本体更新失败的无人值守重试继续排除:现有上游启动流程会清空待安装包登记,仍需官方界面完成原生修复;MAS 自有资源半更新可自动重试。 - 未运行真实游戏、账号、模拟器或上游官方安装器 E2E。自动化使用真实文件/事务与 MAS 入口,并在网络、原生进程和安装器边界隔离;不能据此声称实机安装已验收。 - 后续实机验收可在已配置脚本和账号的作者环境运行 `cd frontend; yarn e2e:real:all --only BetterGIConfig,HSRConfig,MaaConfig,MaaEndConfig,BAAHConfig,SrcConfig,WhimboxConfig`,产出各场景报告和 `real-e2e-summary.json`。 目标仅为 `release-v5.8.0-backport-verify`;不直接修改或合并该分支及 `release/v5.8.0`。
## Release v5.9.0-beta.1 由「准备发版」工作流生成。这是唯一允许修改 `CHANGELOG.md` 与版本号的 PR,合并后请手动运行「构建并发布应用程序」。 合并前请在本 PR 里完成: - [ ] 「本次亮点」够不够:合并前给碎片加 `highlight: true` 就会自动进这一类,现在也可以直接在 `CHANGELOG.md` 新版本段里把条目挪过去 - [ ] 有 3 个提交改了用户可见代码但没带碎片(清单见[运行摘要](https://github.com/AUTO-MAS-Project/AUTO-MAS/actions/runs/43347223103)),若用户可见就在新版本段里补一条 - [ ] 改完运行 `python scripts/changelog.py sync` 并提交 ### 体积 - 首行 JSON 2371 / 18000 字符,带 1 个版本段 - 本版 40 条,最长的几条: - 78 字(变更)【设置】自启与静默启动可独立设置,静默时直接进入托盘,关闭可选退出或托盘,最小化保留任务栏。 (#1928) by @he0119 by @1w1w11w1 - 76 字(修复)【MAA】MAA 更新失败时统一检查安装健康;资源半更新自动重装,官方本体失败保留标记并提示使用官方修复入口 (#1909) by @youngslin - 75 字(变更)【模拟器】ModAVD 全部改由 modavd 命令行控制,移除自带的直控和更新器,不再支持无命令行的旧根目录 (#1918) by @qiyinxi - 64 字(修复)【主页】调整任务台版本主线的 UI,并让版本更新倒计时更清楚 (#1926) by @TyrannosaurusGodofWar - 64 字(破坏性变更)【调度】重构任务调度与范围选择,完善日志恢复、独立触发、队列附加动作及电源收尾。 (#1845) by @DLmaster361 自 `v5.8.0` 以来的改动: ###⚠️ 破坏性变更 - 【调度】重构任务调度与范围选择,完善日志恢复、独立触发、队列附加动作及电源收尾。 (#1845) by @DLmaster361 ### ✨ 新增 - 【M9A】新增 MAS 登录 B 服:处理隐私协议并选择已保存账号后交给 M9A 运行 (#1882) by @Douya36 - 【ok-ww】支持脚本逐账号或批量切号、显示失败原因并补跑未完成账号 (#1890) by @AthenaHibou - 【ok-nte】支持按日配置日常计划,并可在详细配置中调整当天任务。 (#1921) by @AthenaHibou - 【调度】在日志末尾显示预下载方式和进度,支持独立配色与连续渐变(仅公测) by @youngslin - 【设置】支持调整自定义光标的显示大小。 (#1904) by @Douya36 ### 🔧 变更 - 【调度】统一各脚本账号编辑页的页头和基本信息布局 by @Craun718 - 【模拟器】魔改 AVD 改名为 ModAVD,界面、提示和日志统一用新名称 (#1898) by @qiyinxi - 【模拟器】ModAVD 全部改由 modavd 命令行控制,移除自带的直控和更新器,不再支持无命令行的旧根目录 (#1918) by @qiyinxi - 【设置】统一主要页面的标题、间距、卡片层次和日志按钮外观 (#1893) by @1w1w11w1 - 【设置】浅色主题改为中浅灰画布配纯白卡片,补回分隔线与卡片边缘层次 (#1855) by @beichen24a1 - 【设置】自启与静默启动可独立设置,静默时直接进入托盘,关闭可选退出或托盘,最小化保留任务栏。 (#1928) by @he0119 by @1w1w11w1 - 【Runtime】加快运行环境健康时的启动准备 (#1907) by @jinghero ### 🐛 修复 - 【MAA】MAA 更新失败时统一检查安装健康;资源半更新自动重装,官方本体失败保留标记并提示使用官方修复入口 (#1909) by @youngslin - 【MAA】修复保存配置时修改被误判未保存并丢弃的问题 (#1930) by @jinghero - 【end】MaaEnd 安装异常时统一恢复事务,并安全修复可信身份的损坏本体 (#1913) by @youngslin - 【HSR】为 M7A 与 SRA 更新中断后的未完成回滚添加用户确认恢复入口 (#1915) by @youngslin - 【HSR】修复 SRA 使用自建下载站时无法下载安装更新的问题。 (#1945) by @youngslin - 【bgi】修复正式版安装资源尚未就绪时自动更新失败的问题 (#1901) by @youngslin - 【ok-ww】修复直接启动游戏时无法覆盖默认资源档位的问题 (#1925) by @AthenaHibou - 【ok-ww】修复新版脚本启动后不执行每日任务的问题 (#1940) by @AthenaHibou - 【ok-ww】修复新版启动器不触发游戏更新及停服维护时反复重试的问题 (#1934) by @1w1w11w1 - 【ok-ww】修复鸣潮和异环更新重启后自动切号失败的问题。 (#1933) by @AthenaHibou - 【ok-nte】修复仅开启任务后关闭时无法关闭游戏及启动器的问题。 (#1920) by @AthenaHibou - 【BAAH】损坏的托管安装须由用户明确选择官方完整包修复,禁止绕过校验运行 (#1908) by @youngslin - 【奇想盒】修复后端安装中断后无法自主确认恢复的问题 (#1905) by @youngslin - 【SRC】修复原生安装中断后无法自主选择安全恢复的问题 (#1906) by @youngslin - 【主页】调整任务台版本主线的 UI,并让版本更新倒计时更清楚(仅公测) (#1926) by @TyrannosaurusGodofWar - 【调度】修复停止任务后脚本及更新子进程残留、项目持续占用和结果未保存的问题 (#1892) by @youngslin - 【调度】统一配置表单、卡片间距与状态颜色,优化队列列宽和配置说明 (#1927) by @AthenaHibou - 【模拟器】修复启动模拟器时 adb 命令执行不了却只提示超时、看不到原因的问题 (#1894) by @miaojiuqing - 【模拟器】手动停止任务时不再把 ModAVD 模拟器连同任务一起强制结束 (#1919) by @qiyinxi - 【工具】修复 MCP 查询全部托管失败及可空参数被错误拒绝的问题 (#1895) by @HarcoChen - 【设置】修复模拟器管理和调度中心卡片外侧阴影显示不一致 (#1897) by @1w1w11w1 - 【设置】FluxDown 自动识别强制优先选择 MAS 内的文件夹。 (#1948) by @youngslin - 【更新】统一脚本安装恢复入口及队列结束时的下载异常汇总 (#1916) by @youngslin - 【Runtime】修复回退旧版后再次升级时无法启动的问题 (#1889) by @jinghero - 【Runtime】修复后端启动异常退出却被误判为正常结束的问题 (#1929) by @jinghero - 【Runtime】修复临时启动失败后反复停留在失败页的问题 (#1938) by @jinghero - 【Runtime】修复初始化时依赖安装已成功却被误报为失败的问题。 by @ClozyA Co-authored-by: ClozyA <133191303+ClozyA@users.noreply.github.com>
方向调整:改为 #1916 公共自动恢复
此 PR 原来基于 #1900 的弹窗方案。现已移除奇想盒专有 WebSocket 弹窗、前端常驻订阅和用户选择,改由 #1916 的统一后端入口执行健康性检查、备份、自动重试及可验证回滚。原生 GUI 配置/修复入口仍可打开,但不会因此绕过自动任务的安装保护。
具体实现
run_managed_script_install创建旧版快照并运行官方 pip wheel 安装;安装结果由公共层汇总。.mas-update-pending:无可信更新前快照,只能走公共auto_recover_script_install的健康核验或强制重装,不能虚构可回滚旧版。skip_pending_installation的依赖完整性检查作为公共 acknowledge 所用的专项安全操作。必须注意的合并顺序
本分支已通过双父提交显式叠加 #1916 的实现,因此合并顺序必须为 #1916 先进入 dev,本 PR 后合并。在公共 PR 合并前,这个 PR 的差异会暂时显示公共文件;不能单独将本 PR 作为独立功能合并,也不能因为公共回归测试存在就认定真实 pip 安装端到端通过。
最新 CI 以 PR 最新提交为准。