Skip to content

MaaEnd:接入统一自动恢复,处理 MXU 安装事务与官方修复 - #1913

Merged
youngslin merged 29 commits into
AUTO-MAS-Project:devfrom
youngslin:fix/maaend-transaction-recovery
Nov 10, 2026
Merged

youngslin merged 29 commits into
AUTO-MAS-Project:devfrom
youngslin:fix/maaend-transaction-recovery

Conversation

@youngslin

@youngslin youngslin commented Nov 10, 2026 •

Copy link
Copy Markdown

方向:仅采用 #1916 公共恢复

整合旧 #1910 的可信 program-identity.json、官方完整包下载与校验;以及 #1913 的原生 transaction.json/previous/ready 安全性检查。删除所有恢复弹窗、专用 WS 及“用户确认跳过”。恢复由 auto_recover_script_install 接收健康检查、原生回滚和官方完整包修复回调,主流程保持安装锁及原生 MXU 清理机制。

只有确认原生进程停止、完整发行文件和回执一致、且没有尚可回滚的 previous/ready,才允许归档过期事务。不可读架构、缺少 MAS 自有身份时绝不猜测官方安装目标。关闭托管的自定义构建遵守既有 MXU 行为,不强行覆盖。自动恢复结果交公共队列末尾汇总。

本轮补充:安装器复制 ready 后、写入 transaction.json 前失败或取消时,在没有 journal/previous、确认停写和持有安装锁的条件下可清理未提交暂存。若原安装健康,核验收据后清理;若 EXE 损坏或因 MXU 独立升级导致旧收据失效,仅允许 AutoProxy + 开启托管 + MAS 可信 program-identity.json 的修复请求清理暂存,随后必须由 #1916 公共入口执行官方完整包重装与最终健康复核。身份缺失、previous 或 journal 存在时继续保留现场并阻断,不能把清理暂存当作恢复成功。回归测试包含真实安装器的 ready 阶段故障注入、两类受控自动修复,以及缺乏可信身份时拒绝清理。

本 PR 取代 #1910;未运行真实 MXU/Electron E2E,CI 以最新提交为准。

@github-actions github-actions Bot added 专项: MaaEnd 类型: 修复 按更新日志碎片自动设置 labels Nov 10, 2026
Comment thread app/task/MaaEnd/manager.py Outdated
Comment on lines +529 to +530
# 显式恢复操作本轮不再重复下载/覆盖新包。
self._program_update_prepared = True

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Bug: Recovery path sets self._program_update_prepared = True, bypassing discard_obsolete_mxu_packages and risking MXU overwriting the current install with a stale pending package.
Severity: LOW

Suggested Fix

On the recovery path, bypass only the download and apply steps rather than marking the entire update preparation complete, ensuring discard_obsolete_mxu_packages is still executed.

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/MaaEnd/manager.py#L529-L530

Potential issue: After recovering an install in `main_task`,
`self._program_update_prepared` is set to `True`, causing subsequent calls to
`_prepare_program_update` to return early. This skips `discard_obsolete_mxu_packages`,
which is required to run after install verification and before MXU launches. If an
interrupted update or manual repair leaves an obsolete package in the cache alongside a
stale pending record, MXU may overwrite the current installation upon launch.

Did we get this right? 👍 / 👎 to inform future reviews.

Comment on lines +151 to +157
receipt = script_install.record_path(root, "installed.json")
if receipt.exists() and not await script_install.run_worker(
script_install.verify_installed_files, root
):
raise script_install.InstallUnsafeError(
"MaaEnd 当前文件与 MAS 校验回执不符,不允许跳过;请手动修复"
)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Bug: skip_stale_transaction unconditionally validates installed.json without checking takeover_enabled, blocking skips when an install was manually repaired with takeover disabled.
Severity: MEDIUM

Suggested Fix

Pass takeover_enabled into skip_stale_transaction and only enforce receipt verification via verify_installed_files and confirm_current_install(verify_receipt=...) when takeover is enabled.

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/MaaEnd/tools/install_recovery.py#L151-L157

Potential issue: `skip_stale_transaction` unconditionally verifies the MAS receipt if
`installed.json` exists via `verify_installed_files` and `confirm_current_install(root,
verify_receipt=True)`. Unlike other paths such as retry and non-takeover flows, it does
not check `config.Update.TakeoverEnabled`. If a user repairs or upgrades an installation
using MXU or manual methods and disables takeover, the receipt check fails, rolling back
the archived marker and preventing the user from skipping the stale transaction.

Did we get this right? 👍 / 👎 to inform future reviews.

Copy link
Copy Markdown
Contributor

总体结论:修改后合并

AUTO-MAS-Project/AUTO-MAS #1913

宝宝,关闭托管时不再拿旧回执卡住人工修复,恢复后也保留了原有资源刷新,这两处处理得很实在喵。不过还有两处会让用户走不到恢复按钮:正常事务文件可能超过新上限,原生配置会话的遮罩也会挡住弹窗。先补好这两条入口再合。

管理器继续先尝试通用事务恢复;专项模块只负责询问、核验和归档旧记录,目录切换仍由原安装器承担,没有读取 MXU 私有 pending 数据。下面两项是静态调用链确认的问题,并非真实安装复现。

规格

[逻辑 · P2,阻断] 正常安装器生成的事务文件会被 64 KiB 上限拒绝

install_recovery.py:58–60在发送提示前直接拒绝较大的事务文件,确认时第 40 行又拒绝一次。但现有 script_install.py:602–608记录的是三套文件路径与 SHA256,且完整目录快照包含保留的配置、日志。这不是一个只有几项字段的小标记。MaaEnd v3.0.0 固定源码树内有 2375 个资源图片文件,官方发行构建器会把 assets 复制进安装包;仅一套图片哈希字符已达 152000 字节,还没算路径和另外两套清单。这是源码与打包流程核算,未下载或运行发行包。

例如安装器已写回执、删完 previous,但尚未删 journal时中断,用户随后从原生程序运行或修复,日志、配置发生变化;下次全目录快照不匹配,便需要本 PR 的人工确认。即使程序和分发文件仍完好,且没有 previous/ready,过大的原始 journal 也会在弹窗前被拒绝,重试和跳过都用不了。

请让新增恢复模块兼容现有 事务写入器 的真实输出,移除没有对应写入约束的 64 KiB 限制,或使用能覆盖正常大小的流式摘要与快照身份核验,保留原有防替换和备份检查。测试请用现有 事务写入器 生成包含正常资源、日志规模的大记录,别只用几字节的假标记啦。

[兼容 · P2,阻断] 原生配置会话的等待遮罩盖住恢复选择

新 MaaEndInstallRecoveryModal.vue:38使用 z-index 900。账号配置入口拿到任务 ID 后,既有会话工具马上显示传送到 body、z-index 1000 的 GuiSessionMask。脚本级配置页也有直接传送到 body 的 z-index 9999 遮罩,同样在受理后就打开。与此同时,manager.py:500–514对 ScriptConfig 也先等恢复选择,尚未启动原生窗口。

因此安装事务恢复失败时,用户看到的是配置会话遮罩,下面的重试、风险勾选和取消都点不到,只能结束会话或等 120 秒超时。自动代理入口没有这个遮罩,不能据此认定配置入口也可用。请协调恢复询问与原生会话遮罩的显示时机或层级,兼顾这两个配置入口,而非只改到 1001;保留窗口标题栏可用,并补一个从配置入口触发事务失败的交互验证。

规范

[规范 · P3,非阻断] install_recovery.py:70把读取失败的版本写成非空中文“未知”,英文、日文弹窗的兜底翻译不会生效。这里返回空值,交给前端现有词条就好喵。

没有确认新增职责或黑箱边界违规;主动重连会清掉旧询问,取消、超时和无主连接保留事务。已有任务终态观察可以继续复用,无需为辅助询问再做一套统计。

验证情况

已读取现有 CI:8 项检查通过,Windows pytest 1812 passed、2 skipped,Ubuntu 1773 passed、40 skipped,前端 57 个测试文件、307 个测试通过,Windows 验证包构建通过。这些结果没有覆盖上述大事务文件与配置遮罩场景,不能替代对应验证。

dot酱没有运行项目代码、测试或真实 Windows MaaEnd/Electron 流程。规格侧 2 个必须修复的 P2,规范侧 1 个非阻断 P3;把用户真正能选到恢复动作这一步补齐,就离目标更近啦。

—— dot酱替恢复按钮留条路敬上 🐾

Copy link
Copy Markdown
Contributor

总体结论:修改后合并

AUTO-MAS-Project/AUTO-MAS #1913 · 容量修复复审

宝宝,事务文件的两处限制已一起放宽到 128 MiB,前次正常资源清单超过 64 KiB 就被拒绝的 P2 已修复啦。不过配置会话仍会把恢复弹窗盖住,这一项还不能放行喵。

[兼容 · P2,阻断] 原生配置会话遮罩仍挡住恢复按钮。 当前 恢复弹窗仍为 z-index 900;账号配置的 GuiSessionMask 传送到 body 后为 1000,脚本配置页传送到 body 的遮罩为 9999。本次只改了后端容量常量,两个配置入口等待恢复选择时的层级关系没有变化。

请协调这两个配置会话遮罩与恢复询问的显示时机或层级,并保留窗口标题栏可用。仅改到 1001 还不足以覆盖脚本配置页。完整触发链见前次评论的第二项,dot酱就不把整段再贴一遍啦。

规格轴现剩 1 项阻断 P2;规范轴“未知”未本地化的 P3 仍是非阻断项。容量调整未改变标记一致性、备份存在、停写与安装回执保护,没有确认其他新增问题。

当前 CI 8 项成功,已读日志:Windows 1812 passed、2 skipped,Ubuntu 1773 passed、40 skipped,前端 57 个文件、307 项测试通过。此次仍是静态审查与读取既有 CI,未运行项目或真实 UI;现有通过结果没有覆盖配置遮罩场景。容量这关过了,再让用户真正点得到恢复按钮就好喵。

—— dot酱继续看着恢复按钮敬上 🐾

@youngslin youngslin changed the title fix(maaend): recover unfinished installation transactions with verified user choice fix(maaend): #1916 centralized MXU native transaction and official repair Nov 10, 2026

Copy link
Copy Markdown
Contributor

总体结论:修改后合并

AUTO-MAS-Project/AUTO-MAS #1913

宝宝,旧恢复弹窗已经删除,遮罩和未知版本词条的问题随之不再适用;大事务记录的容量保护也保留了。恢复后继续刷新资源、清理过期 MXU 包这条线没有漏掉喵。不过新接入把“安装必须健康”的检查放到了修复之前,原本能靠更新接管修好的目录,现在反而到不了修复入口。

manager 负责持锁和安排恢复,adapter 提供原生事务检查及官方包修复回调,真正的下载、校验和目录切换仍复用原实现。公共层决定是否调用这些回调,下面两道检查必须一起对齐。

[逻辑 · P2,阻断] 无残留 journal 的损坏安装会提前退出,新的完整包修复回调也不会被公共层调用

位置:manager.py L505–533、managed_recovery.py L88–96。

静态可核对的场景:开启更新接管的 AutoProxy,之前已成功安装并留下 MAS 身份与安装收据,没有未完成的 transaction.json,后来 MaaEnd.exe 或发行资源损坏。main_task 先无条件调用 retry_native。它恢复原生事务之后,马上调用严格的 confirm_current_install;损坏 EXE 或收据哈希不匹配都会抛 InstallUnsafeError。manager 发现没有 journal,就直接重新抛出,后面的可信身份修复和 _prepare_program_update 都执行不到,已经预下载的修复包也用不上。

这也是对原有行为的回归。原入口只先恢复事务,再让更新准备按已有 program-identity 修复;现有测试 L511–521也明确支持按记录架构重装损坏 EXE。MXU 独立升级后旧收据失效时,同一道提前检查还会挡住原有的精确版本官方包重新校验流程。

还不能只把这道检查往后挪呀。新身份修复分支明确要求 not state.healthy and not state.pending,但当前目标分支的 reconcile_installation L110–111 对 pending=False 立即返回 no_pending,不会调用 reinstall。按当前 adapter 状态,repair_program 仍然不会执行,却会被 manager 记录成“自动修复”。

最小修改是把“恢复原生事务”和“修复完成后的健康确认”分开,让有可信身份的损坏安装能进入既有修复链;同时按公共入口实际支持的状态契约表达这种无 journal 的待修复状态,成功后再确认安装健康。保留停写、架构身份、回执和下载期间身份变化检查,不要靠放宽最终校验让它通过。

请补经过真实 manager、adapter 和公共恢复层的用例:无 journal、有可信身份、损坏 EXE/资源时确实调用完整包修复并恢复健康;再覆盖 MXU 原生升级造成旧收据失效的情况。当前新增测试主要直接检查 adapter 的残留 journal,已有重装测试又直接调用更新函数,都绕开了出问题的入口顺序。

现有 CI 全部成功,日志为 Windows 1837 passed、2 skipped,Ubuntu 1798 passed、40 skipped,前端 57 个文件、307 项测试通过,格式、类型和 Windows 验证包也通过。dot酱未运行项目或真实 MXU/Electron 流程,以上结论来自固定源码、真实公共接口和调用顺序核对。取消收尾与安装锁仍沿用底层保护,关闭接管时容忍原生修复后的旧收据也按既定设计保留,不要求它改回强制覆盖。

最后顺手把更新日志中的“人工确认恢复入口”换成当前自动恢复行为,别让使用者还去找旧按钮啦。先把这条修复入口真正接通,再合就稳妥了喵。

—— dot酱检查修复入口敬上 🐾

@youngslin youngslin changed the title fix(maaend): #1916 centralized MXU native transaction and official repair MaaEnd:接入统一自动恢复,处理 MXU 安装事务与官方修复 Nov 10, 2026

Copy link
Copy Markdown
Contributor

总体结论:修改后合并

AUTO-MAS-Project/AUTO-MAS #1913

宝宝,上次挡住修复的两道门这回接通啦:先恢复原生事务,再把可信损坏安装交给公共恢复入口;可识别的 MXU 新版本也保留了精确官方包校验,没有拿旧收据强行降级。新增测试还走到了真实 manager、adapter 和公共层,这点补得好喵。不过新的 pending 判断又挡住了另一种正常恢复场景,另有一处格式检查需要修好。

[逻辑 · P2,阻断] 更新在目录切换前取消后,遗留 ready 会让之后的任务一直无法启动

位置:manager.py L537–542、managed_recovery.py L28–36。

静态可核对的场景:用户曾成功托管安装,已有 program-identity,随后更新到更高版本。安装器 L566先创建 ready 暂存目录,到 L608 才写 transaction.json;中间复制或资源处理失败、响应取消,都会留下 ready,此时原安装还没有被替换。

下一轮 recover_native 调用的 recover_install L454–458发现没有 journal、也没有 previous,正常返回。可 adapter 只要看见 ready 就报告 pending=True、healthy=False,新 manager 随即抛出“尚有未完成原生事务”。于是,即使原安装完好,也进不了正常更新,更到不了安装器 L555–558已有的暂存清理与重试。重启也不会移除磁盘上的 ready。上一版仍会进入正常更新,这次新增的拒绝分支才把这条路封住了。

请区分“没有 journal/previous 的未提交暂存”和真正已经开始切换的事务,让前者在持锁、停写和当前安装核验下复用安装层的安全清理或重试,别把 previous/journal 的保护一起放松呀。验收可在真实安装器创建 ready 后、写 journal 前注入取消或失败,再走一次 manager,确认能继续恢复。现有重试测试在 verify_archive 就失败,新增两条 manager 测试也没有暂存残留,尚未覆盖这一步。

[规范 · P3,阻断] 新增测试未通过仓库格式检查

格式 CI执行 ruff format --check 后以 exit 1 结束,定位到 tests/task/test_maaend_program_update.py 的长断言和末尾空行。按仓库格式化规则处理该文件,再让此项通过就好,不用改断言语义喵。

本轮是固定源码复核与读取已有 CI,dot酱没有运行项目代码或真实 MXU/Electron 流程。发布前 Ubuntu pytest 已通过,Windows pytest 仍在运行,Windows 验证包及其余已完成检查成功;绿色结果也不能代替上面的暂存残留场景。先给取消后的重试留条路,这次修复才不会修着修着又把用户挡在门外啦。

—— dot酱替重试留路敬上 🐾

Copy link
Copy Markdown
Contributor

总体结论:修改后合并

AUTO-MAS-Project/AUTO-MAS #1913 · 暂存清理复审

宝宝,健康旧安装留下 ready 的那条路已经打通了,真实安装器故障注入也补上了,格式检查这次通过啦。不过还差“本来就在修复坏安装”的情况:新清理要求原安装先健康,结果修复中断一次,下一轮又进不了修复。dot酱把剩下这个场景单独说明,不重复上一条的完整调用链喵。

[逻辑 · P2,阻断] 损坏安装或失效旧收据的修复中断后,仍无法再次进入官方重装

位置:managed_recovery.py L43–49、manager.py L505–511。

静态可核对的输入是已有可信 program-identity、开启接管,EXE 已损坏;或者 MXU 正常升级后,旧 MAS 收据已经不匹配。这两条正是本 PR 已支持、也新增了真实 manager 测试的修复入口。

首次修复走到安装器,复制 ready 后、写 transaction.json 前异常或取消,原目录仍保留修复前的不健康状态。下一轮 recover_native 先执行新增清理:坏 EXE 在 read_install 处抛错,失效旧收据在 verify_installed_files 处被拒绝。没有 journal,manager 直接退出,后面的 inspect_repair → repair_program 根本到不了;反复运行仍会卡住。

请让有可信身份、允许接管的这类安装继续走既有官方重装。保留 journal/previous、路径安全、停写和持锁保护,最终健康仍由重装后的检查确认,不能放行损坏程序。已有安装器暂存清理可以复用;若选择保留暂存,也要给这类状态安排可达的重装路径,只吞掉清理异常还不够,后面的 ready/pending 判断仍会拦截呀。

新正向测试从健康安装出发,只证明该场景能重试;invalid-original 测试则只断言拒绝清理,没有证明还能修复。把已有损坏 EXE/原生升级旧收据的 manager 测试与这次 ready 后故障注入组合起来,再启动下一轮,检查最终健康和原配置保留,就能直接守住这个缺口,不用扩大成真实游戏测试啦。

dot酱未运行项目或上游程序。已读取当前格式 CI,Python 格式及前端 307 项测试通过;发布前 Windows 验证包已通过,双平台 pytest 仍在运行。上一轮的 P2 现在只剩上述修复中断场景,健康旧版清理的改进是有效的。

—— dot酱继续替修复留路敬上 🐾

Copy link
Copy Markdown
Contributor

总体结论:可以合并

AUTO-MAS-Project/AUTO-MAS #1913 · 修复中断复审

宝宝,这次损坏安装的重试终于走通啦。上轮 P2 已修复:未提交的暂存可以先清理,原安装仍须经过官方重装和最终健康检查,不能靠删掉 ready 就算成功。dot酱核对了这两步之间的调用链,这轮没有确认必须修改的新问题喵。

manager 的入口只给 AutoProxy 且开启接管的任务开放损坏修复;清理函数还要求可信 MAS 安装身份,并保留 journal、previous、链接、停写和取消检查。清理后重新检查安装,再由公共恢复入口调用官方包修复。缺少身份时仍保留现场,配置会话和非接管模式也没有被顺带放宽,这条边界守住了。

新增回归这次抓到了出问题的时机:真实安装器完成 ready 复制后注入失败,再从真实 manager、adapter 和公共层重跑。损坏 EXE 用例检查恢复后的版本、回执和用户配置;MXU 高版本旧收据用例检查精确版本重装,没有退回旧版本。健康旧版的暂存清理及缺少身份时拒绝清理也继续覆盖,不用再为这个场景加一套恢复框架啦。

dot酱做的是静态复审与读取已有 CI,没有运行项目或真实 MXU/Electron 流程。当前 Ubuntu 为 1835 passed、40 skipped;格式检查通过,前端 57 个文件、307 项测试通过,Windows 验证包通过。Windows pytest 尚在运行,最终合并仍需等它完成。资源刷新、过期 MXU 包清理、安装线程与锁的收尾继续沿用既有链路;本轮可以撤掉上次的 P2 阻断喵。

—— dot酱给重试拍拍爪敬上 🐾

@youngslin
youngslin merged commit 7e2e966 into AUTO-MAS-Project:dev Nov 10, 2026
9 checks passed
youngslin added a commit that referenced this pull request Nov 10, 2026
…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`。
@github-actions github-actions Bot mentioned this pull request Nov 13, 2026
3 tasks
ClozyA added a commit that referenced this pull request Nov 13, 2026
## 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>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

专项: MaaEnd 类型: 修复 按更新日志碎片自动设置

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants