fix(m161): 收更新键/按钮/矮窗口/启动错误/导入结果五笔债

① update.auto_check / update.channel 登记进 core setting schema(1.6.0)
   - 新增 setting/keys/update.rs(两键 + UPDATE_CHANNELS,只允许 stable);
     SettingSchema 加 with_all 供域键表批量登记。
   - 新增 setting/update_prefs.rs:cache/update/prefs.json → launcher.json 的一次性迁移。
     四条硬约束:源指纹闸门(幂等)、不丢 false、新值胜出、旧文件改名 .migrated 后不再被读;
     主配置不可写时不动旧文件。收据 config/update-prefs-migration.json。
   - presenter Runtime 建会话时迁一次并把结局留在 migration();prefs 字段换成
     auto_check + 每次派发从主配置读 channel(不再硬编码 Channel::Stable)。
     保留旧字段 auto_check 的真实来源(原有测试 cases 会断言)。
   - CLI config get/set/dump 先跑同一次迁移(幂等),输出里给 migration 段与收据路径。

② presenter/dto/events.rs 的「本次会话不再弹提示条」注释改成真实语义
   (记的是版本号:同版本压住、更高版本照弹、手动检查清掉)。

③ 检查/下载进行中按钮禁用:pages/update/busy.rs 的 busy/can_check/can_apply;
   设置页两颗按钮改画禁用(不是消失),app 层 on_update_action 再挡一道
   (忙碌时 CheckNow/Apply 不派发);新增两条用例(含「忙完恢回可点」)。

④ 内容库低高度:content_layout::MIN_BODY_HEIGHT=460 + BodyMode(按固定件+三整行算出来,
   用例守着算式);frame::body_height 从 Ui::metrics 算正文可用高,pages::Model 带 window_height。
   ≥460 列表自己滚;<460 主列整列一个滚动条、列表按自然高度铺开。

⑤ 启动错误文案本地化:presenter 删掉 launch_summary / 「启动失败:」前缀 / 五条中文阶段前缀,
   改发 LaunchFailureView{stage,detail};LaunchFinished 改带 exit_code/uptime_ms/failure,
   Toast 由 app 层按 i18n key 现求(与 install_cancelled 同构)。InstancesFailed 拆成
   InstancesFailedStage(列表单行)+ LaunchStageFailed(详情/Toast 全文)。

⑥ 导入结果块:ImportReportView 加 failure_stage(NotStarted/RolledBack/RollbackIncomplete,
   由 core 的 rollback 机器位推出);标题、图标、底色三处分档,预检失败不再说「已回滚」。

顺带:六处注释/文档漂移(update.rs 的分工表与偏好落点、pack 的「已整包回滚」、
build_request 的 Errors、settings/update 的按钮禁用说明等),
以及为守 400 行把 update/cli-config/core-keys/presenter-dto/presenter-launch/i18n-golden
里贴线或越线的文件按模块拆开(纯搬移,行为不变)。
This commit is contained in:
AskaEth committed 2026-11-07 15:02:13 +08:00
1 parent b2d9f3927f
commit 03741ecd2d
69 files changed
+2653 -707

No files matched your search

+23 -4
View File
@@ -26,6 +26,7 @@ use crate::dto::{
InstanceSummary,
JavaPageView,
LaunchArgsPatch,
LaunchFailureView,
LoaderKind,
LogLine,
LogOutcome,
@@ -54,6 +55,11 @@ pub struct LiveLogBatch {
}
/// 一次启动收尾(磁贴状态回写 + 日志页会话列表刷新)。
///
/// **不带人读散文**(M161):早先这里有一个 `summary: String`,内容是 presenter 拼的中文
/// (`正常退出` / `崩溃(exit 1)` / `启动失败:找不到 Java`)。于是英文界面上弹出的是中文 Toast,
/// 磁贴那行还叠成「Launch failed · 启动失败:…」。现在只给**结构**,文案由 app 层按 key 现求
/// (与 `InstallCancelled` 同一条纪律:presenter 不依赖 `unlucky-i18n`)。
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct LaunchFinished {
/// 实例 id
@@ -62,8 +68,13 @@ pub struct LaunchFinished {
pub session: SessionId,
/// 结局
pub outcome: LogOutcome,
/// 一句人读结论(`正常退出` / `崩溃(exit 1)` / `启动失败:…`)
pub summary: String,
/// 进程退出码(`None` = 进程没起来 / 平台没给)
pub exit_code: Option<i32>,
/// 从 spawn 到收尾的毫秒数(没起来时是 0)
pub uptime_ms: u64,
/// 失败发生在哪一步(`None` = 这一场没有装配/启动阶段的失败;
/// 「跑起来又崩了」看 `outcome`)
pub failure: Option<LaunchFailureView>,
}
/// core 侧事件(不可变快照发布 + 事件流,01c §5 的三条通道之二)。
@@ -248,9 +259,17 @@ pub enum AppCommand {
CheckUpdate,
/// 把当前候选下载下来、校验、替换本程序(结果经 [`CoreEvent::Update`] 回来)
ApplyUpdate,
/// 忽略这个版本(本次会话不再弹提示条;候选仍留在快照里,设置页可手动装)
/// 忽略**这一个候选版本**(记的是版本号,不是「别再问我」)。
///
/// 语义三条(`UpdateView::skipped` 的契约,`dto::update` 的模块文档与用例守着):
/// 同一次运行里同一个版本不再弹提示条;**更高的版本照弹**(0.2.3 被忽略不影响 0.2.4);
/// 设置页的「立即检查」会清掉它。候选本身仍留在快照里,设置页可手动装。
DismissUpdate,
/// 开关「启动时静默检查」(写进更新域自己的偏好文件)
/// 开关「启动时静默检查」。
///
/// 落点是主配置 `config/launcher.json` 的 `update.auto_check`(M161 从更新域自己的
/// `cache/update/prefs.json` 迁过来的 schema 键)——`ull config get update.auto_check`
/// 读到的是同一个值。
SetUpdateAutoCheck(bool),
}