Repository navigation
BAAH:统一自动修复损坏安装并恢复安装事务 - #1908
Conversation
| import { | ||
| WS_BETTERGI_INSTALL_DECISION, | ||
| WS_BETTERGI_INSTALL_PROMPT, | ||
| WS_BETTERGI_INSTALL_PROMPT_CLOSED, | ||
| WS_ID_TASK_MANAGER, | ||
| type WSBAAHInstallPromptData, | ||
| } from '@/services/websocket/types' |
There was a problem hiding this comment.
Bug: Incorrect constant names imported in baahInstallRecovery.ts prevent recovery dialog websocket events from being received or handled.
Severity: HIGH
Suggested Fix
Update the imports and usage in frontend/src/services/baahInstallRecovery.ts to use WS_BAAH_INSTALL_PROMPT, WS_BAAH_INSTALL_PROMPT_CLOSED, and WS_BAAH_INSTALL_DECISION as defined in types.ts.
Prompt for AI Agent
Review the code at the location below. A potential bug has been identified by an AI
agent. Verify if this is a real issue. If it is, propose a fix; if not, explain why it's
not valid.
Location: frontend/src/services/baahInstallRecovery.ts#L7-L13
Potential issue: In `baahInstallRecovery.ts`, non-existent constants
`WS_BETTERGI_INSTALL_PROMPT`, `WS_BETTERGI_INSTALL_PROMPT_CLOSED`, and
`WS_BETTERGI_INSTALL_DECISION` are imported from `@/services/websocket/types`. Because
`types.ts` defines these constants as `WS_BAAH_INSTALL_PROMPT`,
`WS_BAAH_INSTALL_PROMPT_CLOSED`, and `WS_BAAH_INSTALL_DECISION`, the imported values
will be undefined at runtime. This causes websocket listeners to register on `undefined`
event types, preventing the frontend from ever receiving recovery prompt notifications
and leaving the backend to time out after 120 seconds.
Also affects:
frontend/src/services/baahInstallRecovery.ts:35~35frontend/src/services/baahInstallRecovery.ts:46~46frontend/src/services/baahInstallRecovery.ts:65~65
Did we get this right? 👍 / 👎 to inform future reviews.
| ) | ||
| await program_update.confirm_current_install(root) | ||
| await self.script_info.set_log(f"BAAH 手动修复安装成功:{result}") | ||
| self.check_result = "Pass" | ||
| return | ||
| raise script_install.InstallUnsafeError( | ||
| "用户取消 BAAH 安装修复;仍保留原校验记录" | ||
| ) | ||
| if self.script_config.Update.TakeoverEnabled: | ||
|
|
||
| async def progress(downloaded: int, total: int, speed: float) -> None: |
There was a problem hiding this comment.
Bug: manager.py treats process busy or access errors as installation corruption, prompting unneeded recovery that subsequently fails.
Severity: MEDIUM
Suggested Fix
Distinguish InstallUnsafeError resulting from running processes or permission failures from actual corruption errors. Allow busy errors to propagate or handle them separately rather than invoking ask_install_recovery.
Prompt for AI Agent
Review the code at the location below. A potential bug has been identified by an AI
agent. Verify if this is a real issue. If it is, propose a fix; if not, explain why it's
not valid.
Location: app/task/BAAH/manager.py#L140-L181
Potential issue: `confirm_current_install` calls `assert_idle`, which raises
`InstallUnsafeError` if BAAH or its updater is running or if process inspection yields
`AccessDenied`. The exception handler in `manager.py` catches `InstallUnsafeError`
alongside corruption errors and directly triggers `ask_install_recovery`. Users are
presented with a false report that the installation is corrupted and offered a repair,
which will immediately fail again during update execution because the process is still
running.
Did we get this right? 👍 / 👎 to inform future reviews.
总体结论:可以合并AUTO-MAS-Project/AUTO-MAS #1908 宝宝,这版把修复入口放在原有安装事务恢复之后,损坏本体可以经确认重新安装,也没有给未知事务开“跳过”通道。dot酱核对了停写、取消和再次检查的链路,没有确认的合并阻断项喵;有一处低影响的翻译遗漏,顺手补上会更完整。 BAAH manager 持有安装锁并决定是否询问,恢复模块收集当前请求的选择,program_update 继续调用公共包校验与目录切换。弹窗只负责展示和发送选择,没有替后端决定安装是否安全。 规范[规范 · P3,非阻断] 英语和日语界面的修复来源仍显示中文 install_recovery.py L31–34 和 L64–65 把“未知”“官方通道最新完整包”作为非空展示值发送,弹窗 L55–59 直接显示。切到英语或日语后,修复来源仍是中文;版本读取失败时,也用不到已经翻译好的 Unknown 词条。 这里让未知版本传空值、修复来源在前端用词条展示就够了,不必增加一套翻译协议。按钮和风险说明已经翻译,操作与安全校验不受影响,因此不阻止合并。 其余已核对的边界没有新增阻断问题。App.vue 为 256 → 258 行,新弹窗 120 行;订阅在主连接前注册,断线与主动重连都会清掉旧请求。安装结果沿用现有逐脚本终态统计,没有把点击“修复”当作安装成功,也没有上报安装路径。 规格未确认新增缺陷。事务恢复失败会直接停止,不会进入人工放行;关闭接管仍检查安装,明确选择修复才会下载。缺失 EXE 的修复保留回执与目录身份复核、官方包大小和 SHA256 校验、原目录备份及配置保护,已知版本也不会被自动降级。 现有两条机器人意见已对照最新代码核实:前端使用的是正确的 BAAH 事件常量;进程占用检查已经移到损坏恢复的捕获块之外,不再将通常的占用失败当成损坏询问。 验证情况读取了当前提交的 CI 日志:Windows pytest 1808 通过、2 跳过,Ubuntu 1769 通过、40 跳过;前端 57 个文件、300 项测试通过,包含重连用例。格式、类型检查和 Windows 验证包构建通过。lint 退出成功,但仍报告 QueueDeleteButton.vue 的 1 条警告,不称作零告警。 新增后端测试实际经过完整包修复和回执变化拒绝,前端测试调用真实恢复服务、替换传输边界。目标分支随后合入的 Runtime 初始化改动已做静态兼容检查,上述 CI 并未重新验证这一组合。dot酱没有自行运行项目,也没有做真实 Windows BAAH 安装、弹窗交互或深浅色验收。 规范轴 1 项非阻断 P3,规格轴 0 项确认问题。修复主线可以合,翻译这只小尾巴记得补好啦。 —— dot酱核过安装保护敬上 🐾 |
…er adapter without prompt
…inal receipt bytes match
…native recovery, snapshot updates and central fallback
…e transactions through public entry
…1916 and preserve incomplete backups
…-Project#1916 repair and trusted journal checks
…frontend subscriptions
总体结论:修改后合并AUTO-MAS-Project/AUTO-MAS #1908 宝宝,这版已经改走公共自动恢复入口,原先弹窗的翻译意见也随删除而不再适用啦。dot酱沿着“更新、取消、下次重试、回滚”查了一圈,仍有两处会把本来能运行的安装挡住,先补好再合喵。 manager 负责持有安装锁和选择恢复入口,BAAH adapter 提供状态检查及安装回调,公共层决定重试或恢复目录。完整包校验和原生目录切换仍由 script_install 执行;问题出在这几层对“旧安装已经恢复”的判断没有完全对齐。 安装恢复[逻辑 · P2,阻断] 回滚旧目录时没有一同还原 MAS 外置安装收据 位置:managed_recovery.py L106–109、program_update.py L287–300。 这条是静态追踪确认的可达路径,不是实机复现:
底层证据见 外置记录位置、取消后仍完成切换确认,以及目标分支的 目录备份 和 回滚检查。 这里请让 BAAH 的事务备份同时保存自己的安装、版本收据及原先不存在的状态,恢复旧目录时经身份检查一同还原,再做完整性确认。别靠跳过收据检查放行呀。补一条经过真实公共层与 adapter 的“切换后取消 → 下次离线 → 旧版恢复”用例,才能守住这个闭环。 [兼容 · P2,阻断] 健康安装的只读启动检查也拒绝内置 ADB server 位置:manager.py L188;同类检查还出现在 adapter.inspect L32–36。 只要 tools/adb/adb.exe 的 server 仍在运行,即使没有未完成事务、没有公共备份、安装健康且关闭更新接管,这里也会先调用严格 assert_idle,抛出“BAAH 或其更新器仍在运行”,后续账号任务无法开始。此前只读确认允许这个后台 server;当前 confirm_current_install 和 现有测试 L267–283 也保留了这一区别。 请让不写安装目录的健康确认继续使用 allow_background_adb=True,把严格停写要求留在真正的备份、安装和回滚边界。下载失败时检查能否沿用旧版,也不要被同一个只读检查误挡住。补 manager 层“接管关闭 + 已有内置 ADB server”的用例即可,不需要放宽真实目录切换的保护喵。 验证与复审发布前的新提交已经补上残留 journal 测试的工作目录创建。dot酱读过上一轮 Windows、Ubuntu 日志,两边原先都在该测试写 marker 时失败,还未走到断言;这处夹具问题不再列作待修项。新提交的 Ubuntu pytest、格式检查和 Windows 验证包已通过,Windows pytest 尚在运行,不能宣称全部通过。 已核对完整改动、当前规范、原生事务、公共备份与恢复、相关调用者和测试。结果报告及统计沿用公共更新入口,没有再增加一套采集。未自行执行项目代码,也没有真实 Windows BAAH 安装验收。上面两项生产问题是新增接入路径带来的回归,补好后再看新 CI,恢复流程才算走完整啦。 —— dot酱守着回滚出口敬上 🐾 |
…ngside AUTO-MAS-Project#1916 rollback; keep read-only ADB whitelist
…ttle only when managed snapshot is complete; allow read-only adb
总体结论:修改后合并AUTO-MAS-Project/AUTO-MAS #1908 · 外置收据恢复复审 宝宝,目录回滚时把 installed.json 和 baah-version.json 一起恢复,这次补上了前轮的身份不匹配;只读检查也重新允许内置 ADB 常驻,原两项问题可以撤下啦。不过新加的文件线程还没有接入取消收尾保护,旧任务结束后仍可能删掉下一次更新的恢复资料,这里再补一处喵。 [逻辑 · P2,阻断] 收据线程在取消后继续运行,旧清理可能删除新事务的备份 位置:manager.py:207、215、269–285、managed_recovery.py:113–117、265–271。 新增的收据快照、恢复和清理都直接 await asyncio.to_thread。取消这个等待不会停止已经运行的文件线程;而 final_task:392–399 随后会关闭安装访问并释放目录锁。现有安装锁只会为已登记的 worker 延迟释放,这些新线程没有登记。 一个可按源码核对的时序是:
这是取消与线程交错的静态推演,未执行故障注入。ensure_idle 检查的是外部程序是否停写,无法证明 Python 文件线程已经结束;写文件的原子替换也不能保证旧 cleanup 删除的仍是自己的事务。不是让每个 helper 都再加一把锁呀,仓库已经有对应能力。 最小修改: 让这些收据磁盘操作复用 script_install.run_worker 的登记与取消收尾,适配其取消参数,使安装访问在真实线程结束前持续保留。补一个受控阻塞收据操作、取消任务、再尝试进入同一安装的用例,确认旧线程不能在下一笔事务开始后继续写入或删除资料;保留真实公共事务和收据逻辑,别把整段恢复替换成 mock 啦。 本轮验证 正常回滚的收据恢复顺序、成功结算后的清理,以及“只读检查可留 ADB、真正换目录仍须空闲”的区分已核对。当前 8 项 CI 全绿:Windows 1838 passed、2 skipped,Ubuntu 1799 passed、40 skipped;前端 57 个文件、307 项测试通过。最新这两次提交没有增加收据线程取消场景的覆盖。 目标分支新增的 ModAVD 改动及 Runtime 版本调整已静态检查,与这条收据生命周期无直接交叉;上述 CI 早于目标分支更新,不当作新组合的运行证明。dot酱未运行项目或真实官方安装流程。把线程真正结束与锁释放的先后关系守住,刚补好的回滚资料才不会被旧任务碰掉喵。 —— dot酱替回滚资料看好门 🐾 |
…tallation lock across cancellation
…after cancellation
…s while receipt cleanup thread is alive
总体结论:修改后合并AUTO-MAS-Project/AUTO-MAS #1908 · 收据线程取消复审 宝宝,这次把收据快照、恢复和清理的五处调用都接到了 run_worker,原先“任务已结束,旧线程还会碰下一轮收据”的 P2 可以撤下啦。dot酱核对了实际安装访问链:普通取消会等待线程;即使任务清理期限已到、调用协程先返回,安装锁也会保留到真实 worker 结束。恢复两份收据时不在中途响应取消,这个处理也保住了恢复顺序喵。 [规范 · P3,阻断] 新测试文件未通过仓库格式检查 位置:test_baah_program_update.py:396–418。 本次格式 CI 日志已明确报错:测试函数前少一行空行,创建 pending 的表达式应由固定版本 ruff 收成一行,最终以退出码 1 结束。这不是运行逻辑缺陷,不过必需检查还没过,先把这一小处整理好。 按仓库锁定环境运行 新增测试保留了真实收据函数和安装访问机制,能检查线程存活时拒绝重入、取消后保留收据、线程结束后再次清理。它直接调用 worker,尚未覆盖 manager 的五处接线;同进程重入断言也不等于实测跨进程锁,这些是覆盖范围,不再另列阻断项。 已读 Ubuntu CI 日志:1800 项通过、40 项跳过;发布前 Windows 测试仍在运行,不能把本轮说成全绿。其余已完成检查通过。没有确认新的生产缺陷,本次未运行项目代码、测试或真实安装流程。把格式门槛补齐,再等 Windows 结果,收据取消这条问题就可以收尾啦。 —— dot酱收好爪印敬上 🐾 |
总体结论:可以合并AUTO-MAS-Project/AUTO-MAS #1908 · 格式修复复审 宝宝,刚才卡住 CI 的两处格式已经按 ruff 的输出改好了,最新 CI 的“检查 Python 格式”步骤也已通过。原 P3 可以撤下,dot酱没有新的必须修改项啦。 这次仅调整测试空行和表达式换行,没有修改生产代码或测试行为。前轮确认的收据 worker 登记、取消等待及安装锁延迟释放都保持有效,不需要再改恢复逻辑喵。目标分支新合入的其他专项恢复没有改动这条公共安装保护链。 最新一轮完整格式任务、Python 测试和构建发布前仍在进行,不能拿已通过的一个步骤代替整轮结果。上一版相同运行逻辑的 CI 为 Windows 1839 项通过、2 项跳过,Ubuntu 1800 项通过、40 项跳过;这些数字不是新提交的运行结果。按已核对的改动可以合并,仍需等仓库要求的当前 CI 完成。 本轮只做静态差异与现有 CI 核对,没有自行运行项目或真实安装流程。 —— 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 公共自动恢复,去掉人工弹窗
把 #1911 合法大事务校验与旧版本回执复核收进本 PR;关闭旧弹窗、前端订阅和专用 WS。BAAH 以原生完整包作为修复手段,由
auto_recover_script_install、run_managed_script_install和公共下载安全回退决定重试、备份、健康核验、回滚与队列末尾报告。进程未停写、目录尚存 previous/ready、损坏原生事务、身份回执不可信时禁止错误放行;只允许完成经过 PE、版本与原始文件回执确认的旧事务归档。首次新安装由公共快照保留旧版。没有可靠身份时不猜测架构、不强制下载安装。
本 PR 替代 #1911 与旧 #1900 弹窗,所有最终结论以最新 CI 和审查为准;真实 Windows 官方安装器待 E2E。