Repository navigation
SRC:接入公共自动恢复,核验原生安装器状态 - #1906
Conversation
|
|
||
| async def _recover_unconfirmed_install(self) -> bool: | ||
| """SRC 安装锁由 _recover_previous_run 持有;所有模式均可恢复旧标记。""" | ||
| root = self.src_root_path | ||
| marker = script_install.workspace(root) / "src-install.json" | ||
| if not marker.exists() and not marker.is_symlink(): | ||
| return False | ||
| program_update.recover_deploy(root) | ||
| await asyncio.to_thread( | ||
| program_update.assert_idle, root, allow_background_adb=True | ||
| ) |
There was a problem hiding this comment.
Bug: Calling assert_idle in _recover_unconfirmed_install before _cleanup_current_src_root raises InstallUnsafeError if stray SRC processes are running, preventing the recovery prompt from being shown.
Severity: MEDIUM
Suggested Fix
Terminate or manage running SRC processes before calling assert_idle in _recover_unconfirmed_install, or reorder _cleanup_current_src_root() so processes in the install root are cleaned up prior to recovery verification.
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/SRC/manager.py#L748-L760
Potential issue: In `main_task`, `_recover_unconfirmed_install()` is invoked immediately
after `check()`, prior to `_cleanup_current_src_root()`. Within
`_recover_unconfirmed_install`, `assert_idle(root)` is called before prompting the user
via `ask_install_recovery`. If a user manually launched `src.exe` or its subprocesses
without a pre-existing MAS process state snapshot, `assert_idle` detects the active
processes and raises an `InstallUnsafeError`. This aborts the task before the recovery
prompt can be displayed, preventing the user from choosing recovery options.
Also affects:
app/task/SRC/manager.py:832~847
Did we get this right? 👍 / 👎 to inform future reviews.
总体结论:修改后合并AUTO-MAS-Project/AUTO-MAS #1906 宝宝,同一提交重跑原生安装器、跳过前核对 Git 与标记,这两条恢复路径都接上了喵。不过系统唤醒时还有一个弹窗退不出去的问题,先把这处补好再合。 SRC manager 负责安排恢复时机,program_update 保留 Git、原生安装器和安装目录的安全检查;前端常驻服务负责保存询问,弹窗只提交用户选择。这次问题出在询问状态与主连接换代之间。 规范[规范 · P2] 主动重连后,失效的恢复弹窗可能一直无法关闭 位置:srcInstallRecovery.ts L45–68。 按源码静态推演:恢复弹窗打开时系统睡眠并恢复,useAppLifecycle.ts L798–827 会主动调用 reconnectNow。这个入口先清空旧 socket,旧连接的 close/message 回调随后被过滤,并不会触发这里注册的 onDisconnected 清理,见 connection.ts L480–501 和该文件 L405–422。 如果后端的 120 秒询问在这次换连接期间超时,或任务此时取消,install_recovery.py L98–107 注销处理器后只发送一次关闭帧。这一帧没送达新连接,旧询问就会留在前端。重连后再点任一按钮,发送成功只会设置 pending,后端已没有对应处理器;弹窗没有超时清理,取消、重试和跳过都无法继续操作,遮罩和关闭键也被禁用了。普通断线的清理覆盖不到这条主动重连路径,猫爪子就是在这里被卡住啦。 请让恢复服务在主动换连接时也使旧请求失效,或在重连后与后端核对哪些请求仍有效。补一个“弹窗打开 → 主动重连 → 后端关闭帧丢失 → 新连接成功”的验证,确认旧弹窗能退出且不会永久 pending。这样才符合 mas-frontend-ui 的 Page States 对重连、超时和失败反馈的要求,也不用放宽后端安装保护喵。 规格未确认另一个必须修改项。按 PR 描述核对了 AutoProxy / ScriptConfig 入口、同提交重试不额外 fetch、标记授权与字节核对、跳过检查以及部署配置恢复。运行进程仍须满足停写条件;没有把严格拒绝未知进程认定成需要自动杀进程的缺陷。 验证情况以上是静态源码和已有 CI 的核查,dot酱没有运行项目、原生安装器或真实 UI。最新提交的格式检查仍失败,日志明确指向新增 src/services/srcInstallRecovery.ts 的格式,Ruff、前端 lint 和类型检查已过;请一并修好这一门禁。发布时 Windows / Ubuntu pytest 和 Windows 验证包仍在运行,不把它们记成通过。真实 SRC 安装器 E2E 仍未取得执行证据。组件尺寸已核对:App.vue 从 256 行增至 259 行,新弹窗 133 行,均未超限。 规范轴 1 项 P2;规格轴 0 项确认问题。把重连后的旧选择清掉,就不会让用户对着失效弹窗干着急啦。 —— dot酱盯着重连弹窗敬上 🐾 |
总体结论:修改后合并AUTO-MAS-Project/AUTO-MAS #1906 · 重连修复复审 宝宝,前一轮卡住恢复弹窗的 P2 已修复喵。现在剩下的明确阻塞是新增后端测试初始化错误,Ubuntu pytest 已红,先修好夹具再确认最新 CI。 规范恢复服务 L48–85 新增 onConnected 清空旧询问和 pending,并在 dispose 成对注销。已核对真实 WebSocket 顺序:onopen 同步调用连接成功监听,清理结束后才处理新连接 message,所以不会拿旧选择继续发送,也不会删掉随后到达的新询问。原 P2 撤下,不再重复记问题啦。 规格未确认新的功能阻断项。此次生产变更只处理恢复询问的生命周期,没有修改 SRC 安装、Git 校验或标记清理条件。重连回归测试调用真实服务、替换传输边界,覆盖失效请求不再可发送以及新请求仍可操作。 尚需修复的验证阻塞新增测试 L512 给 instance.execution_mode 直接赋值,但它是 legacy.py L347–353 的只读 property,实际从 maintenance 和 task_info.mode 计算。Ubuntu CI 日志 确认抛出 AttributeError,测试还没走到恢复询问断言就结束了:1 失败、1773 通过、40 跳过。 请按真实任务上下文初始化 maintenance 与 task_info.mode,不要给这个只读属性补 setter。修复后重跑两平台 pytest,才能证明新增用例真正检查到了预期行为。这是测试夹具错误,dot酱没有据此把生产恢复路径判成崩溃喵。 同一最新提交的格式、类型检查和 Windows 验证包构建已通过;前端 CI 为 57 个文件、300 项测试通过,包含新增重连用例。Windows pytest 也已完成,同一个新增用例在只读属性赋值处失败:1 失败、1812 通过、2 跳过。未自行运行项目、原生安装器或真实 UI,实机 E2E 仍无执行证据。 规范轴原 P2 已修,规格轴没有新增确认功能问题;剩余这一个测试初始化阻塞修好后再合。 —— dot酱把测试夹具也核一遍敬上 🐾 |
总体结论:修改后合并AUTO-MAS-Project/AUTO-MAS #1906 · 测试修复与配置入口复核 宝宝,只读属性的测试夹具这次修对了,Windows 和 Ubuntu pytest 都已通过,之前那项验证阻塞可以撤下啦。继续核对真实配置入口时,dot酱发现了前两轮没覆盖到的遮罩问题:恢复弹窗已经弹出,却被配置页面挡在后面,仍需要补一处喵。 [兼容 · P2,阻断] 配置/查看会话的遮罩挡住恢复按钮 位置:SrcInstallRecoveryModal.vue:31–40;SRCUserEdit.vue:578–616;GuiSessionMask.vue:51–59。 静态路径:用户在 SRC 账号页打开原生配置或查看会话,启动请求一返回任务 ID,页面就把 两个会话遮罩实际都使用挂到 body、层级 1000 的 请在前端协调恢复询问与配置会话遮罩,保证等待选择期间恢复按钮可操作,同时保留标题栏避让。针对“账号配置/查看入口 → 已有安装标记 → 收到恢复询问”验证按钮可点击,不要只测恢复服务的消息队列。自动运行入口没有这个页面遮罩,因此按局部功能阻断记 P2,不扩大为整个恢复功能不可用。 本轮验证 测试夹具现在设置真实的 此次提交只改测试初始化,生产恢复逻辑未变化。目标分支新增的 Runtime 启动能力变更已做静态集成核对,与 SRC 恢复路径无直接交叉;上述 CI 运行早于该目标分支更新,不能当成新组合的执行证明。dot酱没有运行项目代码、安装器或真实 UI。 规范侧原重连问题和测试初始化阻塞已解除;配置入口的这一个规格/集成问题尚待处理。把遮罩的先后关系理顺,这次修好的按钮才真的点得到呀。 —— dot酱认真检查按钮敬上 🐾 |
总体结论:修改后合并AUTO-MAS-Project/AUTO-MAS #1906 · 自动恢复改版复审 宝宝,恢复询问和专用 WS 已一起撤掉,前次“按钮被配置遮罩挡住”的问题不再适用啦。现在复用已合并的公共恢复流程,省去了用户在失败现场手动选路;不过 dot酱核对实际回调后,发现一处把没装完当作装好了,另一处又把真正装好的回退了,先把这两处判断理顺喵。 SRC manager 负责进入恢复流程,SRCInstallAdapter 提供安装状态和原生 installer 调用,公共层决定备份、重试、确认及回滚。原有安装锁仍由 manager 持有,下面两项都是新接入的代码契约问题,均为 P2、阻断合并。 1. [逻辑 · P2] 旧标记恢复会把尚未完成的依赖安装自动确认为成功限定场景是只有旧的 src-install.json、还没有公共安装备份。旧更新已经把 Git 快进到目标提交,但在原生 installer 安装依赖前中断,或依赖下载失败。此时 src.exe、installer.py 和 Python 仍在,旧环境里已安装的包也可以彼此兼容,因此 这个检查不会核对仓库 requirements.txt 所要求的新版本。上游确实有过这样的升级,例如 uiautomator2cache 从 0.3.0.1 升到 0.3.1;原生安装器会比较并安装 requirements.txt,不是仅执行 pip check。 当前 inspect 却据此设置 updated_confirmed=True。manager 走 auto_recover_script_install,公共层调用 acknowledge;后者的 skip_unconfirmed_install 仍只检查 Git、文件存在和 pip check,随后删掉旧标记。再次检查 healthy/pending 也会通过,于是没有完成依赖更新的新代码可以继续启动。上版还要求用户明确确认已经手工修复,这版把该前提撤掉后,原来的检查不足以支持自动确认。 最小修改: 对无法证明原生安装已完成的旧标记,返回“尚未确认”,让公共入口调用已有的同提交 installer 重试路径;以原生安装成功结果完成恢复,不必在 MAS 再实现一套依赖解析。补“Git 已到目标、旧环境 pip check 成功、新 requirements 尚未安装”的回归场景,确保先运行 installer,再清标。自动恢复可以少让用户操心,但不能把检查包之间是否冲突当作安装完成呀。 2. [逻辑 · P2] 跨任务恢复丢失目标提交,成功确认或重试也会回滚位置:managed_recovery.py:43–57、80。 有公共备份时,manager 创建的是没有 prepared 的 adapter。这种实例的 expected 只从仍存在的 src-install.json 读取;acknowledge 或重试安装成功后,标记都会删除。下一次 inspect 就失去目标提交,updated_confirmed 必为 False。 公共层在确认清标后和安装重试后都会再次核验 updated_confirmed。因此,上次超时但实际已完成的安装,或这次真正重试成功的安装,都会被判为未确认并回滚旧版。若上次已进入 installed 阶段、只剩备份清理失败,下次又无法确认新版,而该阶段也不能直接回滚,恢复会持续受阻。 最小修改: 让经验证的目标提交在清标、重装及后续复核之间保持稳定,并覆盖“标记已删除、公共备份尚未结算时重启”的恢复身份。复用 MAS 自有恢复记录保存所需信息,不要直接放宽公共层的完整性条件。正常首次更新有 prepared,不触发这条缺陷;验收要重建 adapter 后走真实公共恢复入口,不能只测同一实例的正常安装。已经修好的安装,就别再被自己的复核退回去了喵。 验证与旧意见上述两项均为源码静态推演,未执行项目、上游 installer 或真实 SRC 流程。新增末尾两项恢复测试把整个公共恢复入口替换成 AsyncMock,只证明 manager 发起了调用,没有覆盖“检查 → 清标/重装 → 再检查”的实际链路。 当前 8 项 CI 全部成功:Windows 1840 passed、2 skipped,Ubuntu 1801 passed、40 skipped;前端 57 个文件、307 项测试通过,格式、类型检查及 Windows 验证包构建通过。旧重连、测试初始化和遮罩意见均不再阻断;没有要求恢复已删除的弹窗,也没有另报安装锁或遥测问题。 正文和更新日志还在描述手动“重试/跳过/选择”,请顺手同步成这版的自动恢复行为,免得读者照着已经移除的按钮找入口。公共流程已经接上,补准这两处证据交接就好啦。 —— dot酱替恢复流程再核一遍敬上 🐾 |
…installer and Git HEAD verification
…rget across restart and refuse pip-check-only shortcuts
… transaction settles
…et across adapter restart
总体结论:修改后合并AUTO-MAS-Project/AUTO-MAS #1906 · 安装完成记录复审 宝宝,这次两处生产判断修到点上啦:旧标记不再靠 Git HEAD 和 pip check 自动放行,真正跑完原生 installer 后才留下完成记录;重建 adapter 后也能找回目标提交,公共恢复结算前不会提前删掉证据。前轮两项 P2 可以撤下喵。现在剩下的是新增回归测试在 Windows 上失败,需要把测试的外部环境边界隔离好。 [规范 · P2,阻断] 完成记录测试依赖运行器自己的 Python 包环境 位置:test_src_program_update.py:40–59、500–519;健康检查位于 managed_recovery.py:79–107。 夹具把测试运行器的 Windows CI 已在新增用例第 517 行失败: 请在现有命令边界只隔离外部 pip 健康检查,给这个场景明确的健康结果,同时保留真实的本地 Git、安装器夹具、文件记录和 adapter 判断。另一条“Git 已到目标但 installer 未完成”的用例也应确保 pip check 成功,才不会因无关健康失败而偶然通过。不要 mock 整个 inspect 或公共恢复流程来换绿灯,猫爪子要抓的是目标缺陷呀。修好后确认两平台用例和 CI 通过,不需要新增测试框架或放宽生产保护。 本轮核对 已静态追踪旧标记重装、正常 A→B 更新、备份未清理时重启、失败回滚及完成记录清理。完成记录来自原生安装器退出成功和 Git 目标核验,恢复决策仍由现有公共层负责,没有发现新的生产阻断项。 Ubuntu CI 为 1803 passed、40 skipped;前端 57 个文件、307 项测试通过,格式、类型检查和 Windows 验证包构建通过。dot酱未运行项目、原生安装器或真实 SRC 流程。把这处测试边界补稳,就能让这次修复得到它该有的验证啦。 —— dot酱帮完成记录守好证据 🐾 |
…ed runner pip environment
总体结论:可以合并AUTO-MAS-Project/AUTO-MAS #1906 · 测试环境隔离复审 宝宝,这次只在命令边界给 pip check 提供明确的健康结果,真实的本地 Git、安装器夹具、完成记录和 adapter 重建都保留了,没有把要验证的业务判断一起 mock 掉。前轮测试环境 P2 可以撤下啦,dot酱这轮没有发现新的必须修改项。 新增隔离只匹配 已读本次 CI 日志:Windows 1842 项通过、2 项跳过,Ubuntu 1803 项通过、40 项跳过;前端 307 项通过,当前 8 项检查全部成功。前轮 Windows 的完成记录用例不再失败。 还有一个非阻断的覆盖细节:相邻“Git 已到目标但 installer 未完成”用例尚未显式固定 pip 健康结果,之后可以复用同一命令边界,避免反例因无关环境失败而偶然通过。本次审查没有把它算成新的生产问题。 上述运行结果来自已有 CI,dot酱没有自行运行项目或真实 SRC 安装流程。按已核对的代码与测试范围,这版可以合啦。 —— 摇着尾巴的 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 公共自动恢复
旧人工询问、弹窗和 SRC 专用 WS 恢复协议已删除。manager 持有安装互斥锁,使用
auto_recover_script_install/run_managed_script_install;SRC 专项适配器提供 Git HEAD、原生 installer、Python 依赖与进程停写证据。旧 src-install.json 只有 Git 完成不能自动放行:
pip check不足以证明 requirements 已安装,需执行原生 installer;只有安装器成功后写入的完成记录才能证明本次安装完成。公共备份支持跨任务恢复;更新失败且旧版经健康检查才继续运行,异常由公共队列在任务结束时报告。不保留旧版确认 UI。无可信安装证据、后台进程未停写或取消时 fail-closed。最新代码和 CI 以本 PR 最新 SHA 为准;未宣称真实 Windows 上游安装器 E2E 已完成。