Skip to content

fix(updater): 避免任务运行时直接重启应用 - #434

Merged
su-fen merged 3 commits into
Stack-Cairn:mainfrom
Skitre:codex/fix-update-running-task-guard
Aug 12, 2026
Merged

fix(updater): 避免任务运行时直接重启应用#434
su-fen merged 3 commits into
Stack-Cairn:mainfrom
Skitre:codex/fix-update-running-task-guard

Conversation

@Skitre

@Skitre Skitre commented Aug 12, 2026

Copy link
Copy Markdown
Contributor

Linked issue

Closes #260

Summary

  • 在应用重启前统计仍在执行的会话;有任务运行时先显示确认弹窗,避免更新完成后直接终止回复和工具调用。
  • 用户选择“稍后重启”后保留已安装状态,并在侧边栏与“关于”页继续提供重启入口。
  • controller 根部保护已安装和忙碌状态,避免手动或托盘检查与安装流程互相覆盖;重复检查时在状态卡提示先重启应用。
  • 将“稍后重启”设为默认焦点和有底色的主操作,“仍然重启”降级为无框红字,降低误触风险。
  • 对中英文提示、重启守卫、重复重启请求、检查/安装竞态和更新按钮状态补充回归覆盖。

Change scope

  • Modules: agent-gui, agent-ui
  • Key paths:
    • crates/agent-gui/src/App.tsx
    • crates/agent-gui/src/lib/appUpdates.ts
    • crates/agent-gui/src/components/AppUpdateButton.tsx
    • crates/agent-gui/src/pages/settings/AboutSection.tsx
    • crates/agent-ui/src/components/ui/confirm-dialog.tsx
    • crates/agent-gui/test/settings/app-updates.test.mjs

Screenshots / preview

有任务运行时的重启保护

有任务运行时的重启保护弹窗

安装完成后的侧边栏入口

默认图标 悬停文案
更新安装完成后的重启图标 更新安装完成后的重启文案

“关于”页保留已安装状态和重启入口

关于页的更新已安装状态

Verification

  • pnpm --filter liveagent exec node --test test/settings/app-updates.test.mjs - 11 passed
  • pnpm --filter liveagent test - 1575 passed, 0 failed
  • pnpm --filter liveagent exec tsc --noEmit
  • pnpm --filter liveagent exec biome check src/lib/appUpdates.ts src/pages/settings/AboutSection.tsx src/i18n/config.ts test/settings/app-updates.test.mjs
  • pnpm --filter liveagent build
  • 真实 Tauri .app 中验证已安装状态、侧边栏重启入口、关于页重启入口和运行任务确认弹窗

Pre-submit checklist

  • A requirement issue is linked.
  • Synced with the target branch; no merge conflicts.
  • The change is focused, with no unrelated modifications.
  • No secrets, tokens, or personal data included.
  • No documentation update is required; deployment and configuration behavior are unchanged.

在应用重启前检查仍在运行的会话,并提供稍后重启或确认重启的选择。保留已安装更新的重启入口,同时让安全操作获得默认焦点和更高视觉优先级。
@su-fen

su-fen commented Aug 12, 2026

Copy link
Copy Markdown
Member

我去,我前天刚想做但鸽掉的功能!

@su-fen

su-fen commented Aug 12, 2026

Copy link
Copy Markdown
Member

建议暂缓合入,目前有一个会破坏“稍后重启”语义的状态机问题:

  1. 更新安装完成且有任务运行时,用户选择“稍后重启”,controller 会保留 installed 状态;
  2. 但此时“关于”页的“检查更新”按钮仍可点击,托盘的“检查更新”也会直接调用 runCheck()
  3. runCheck() 会无条件把状态从 installed 改为 checking,请求完成后再改为 ready。此时已安装更新通常会返回 available: false,侧边栏重启入口会消失,“关于”页的重启按钮也会变为不可用。

相关位置:

  • crates/agent-gui/src/lib/appUpdates.tsrunCheck()installed -> checking -> ready 状态转换
  • crates/agent-gui/src/pages/settings/AboutSection.tsxinstalled 状态下仍允许手动检查
  • crates/agent-gui/src/App.tsx:托盘 check-updates 动作仍直接触发检查

建议在 controller 根部保护 installed 状态(手动与托盘入口都不能覆盖它),并补一条“installed 状态下调用 runCheck 仍保留待重启状态”的回归测试。除此之外,本 PR 的专项测试和 GitHub CI 均已通过。

@Skitre

Skitre commented Aug 12, 2026

Copy link
Copy Markdown
Contributor Author

我去,这种情况我竟然没有注意到!

更新已安装后忽略手动和托盘检查请求,避免覆盖 installed 状态并隐藏重启入口;补充 controller 级回归测试。
@Skitre

Skitre commented Aug 12, 2026

Copy link
Copy Markdown
Contributor Author

实现得不是很优雅,不小心推上来了(汗

在已安装状态重复检查时保留待重启状态并显示重启提示,同时阻止检查与安装流程互相打断。补充 controller 级竞态和提示生命周期回归测试。
@Skitre

Skitre commented Aug 12, 2026

Copy link
Copy Markdown
Contributor Author

已在 11fe7af4 修复并补充覆盖:

  • runCheck()installed 状态下保留原结果,不再触发后端检查;“关于”页会在原状态卡中提示先重启应用。
  • controller 同时保护 checkinginstallingrestarting,避免托盘检查打断安装;installOnly() 也不会打断正在进行的检查。
  • 提示只在 installed 状态可见,进入重启或错误状态时立即清除,不会遮住真实状态。
  • 新增 installed 保留、检查/安装双向竞态和提示生命周期回归测试。专项 11/11、全量 1575/1575,生产构建通过。

@su-fen
su-fen merged commit 3de3d32 into Stack-Cairn:main Aug 12, 2026
9 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

更新的时候如果还有任务会话在跑不应该强制关闭软件进行更新

2 participants