Skip to content

feat(desktop): 自动化面板整体优化——页面式布局 + 运行历史 + 分组视图 + 滚动条 - #8261

Open
ttmouse wants to merge 3 commits into
esengine:main-v2from
ttmouse:pr/auto-panel-overall
Open

feat(desktop): 自动化面板整体优化——页面式布局 + 运行历史 + 分组视图 + 滚动条#8261
ttmouse wants to merge 3 commits into
esengine:main-v2from
ttmouse:pr/auto-panel-overall

Conversation

@ttmouse

@ttmouse ttmouse commented Aug 10, 2026

Copy link
Copy Markdown
Contributor

变更摘要

将心跳任务(自动化任务)面板从弹窗升级为页面式主视图,并完成整体优化:

布局

  • 页面式:自动化面板从弹窗改为 sidebar 入口 + mainView 状态机,填充主内容区;打开对话/新会话/设置等导航自动切回 chat 视图
  • 左右分栏:左栏任务列表(scope 分组视图 + 纯列表双视图、搜索、状态/范围过滤、立即运行、打开对话),右栏详情/编辑器;分割线可拖拽(宽度持久化到 localStorage)
  • 滚动条:顶部与搜索框齐平、滚动时显示/停止 1.2s 后淡出、颜色 35% 透明、淡出时 visibility 隐藏避免拦截左栏右缘点击

运行历史(新功能)

  • 每次成功执行记录 runHistory(At + TopicID,最多 20 条),详情页倒序展示,可点击跳转对应对话
  • 旧任务(runHistory 引入前执行过)用 topicId 合成一条记录,保证可见
  • 数据保护:前端整表保存(ReplaceTasks/ReplaceConfig)时按 At union 磁盘 runHistory,防止旧快照清空引擎刚写入的执行历史
  • 状态同步:手动触发后详情页同步 runHistory/topicId/lastRunAt;列表开关同步详情页 enabled;TaskEditor draft 跟随 task.enabled

调度

  • 支持 cron 表达式 + 时间窗口

验证

  • Go: go build + Heartbeat 全部测试通过(含新增 runHistory 保护回归测试)
  • 前端: tsc --noEmit(除上游基线 bridge.ts 的 SetColdResumePrune 未同步问题外无错误,该问题与本 PR 无关)

Documentation-impact: none - 纯 UI/功能改动,不涉及内嵌文档
Cache-impact: none - 不触及 internal/boot、internal/tool 等 cache-sensitive 路径,仅 desktop/heartbeat.go 与前端
Cache-guard: go test ./desktop -run Heartbeat 覆盖 runHistory 合并与持久化

@github-actions github-actions Bot added desktop Wails desktop app (desktop/**) v2 Go rewrite (1.x) — main-v2 branch, active development labels Aug 10, 2026

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: a8c09160c0

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread desktop/frontend/src/custom/features/heartbeat/HeartbeatPanel.tsx Outdated
Comment thread desktop/frontend/src/custom/features/heartbeat/HeartbeatPanel.tsx Outdated
Comment thread desktop/heartbeat.go Outdated
Comment thread desktop/frontend/src/App.tsx Outdated
Comment thread desktop/frontend/src/custom/features/heartbeat/HeartbeatPanel.tsx
Comment thread desktop/frontend/src/custom/features/heartbeat/HeartbeatPanel.tsx
Comment thread desktop/frontend/src/custom/features/heartbeat/HeartbeatPanel.tsx Outdated
Comment thread desktop/frontend/src/custom/features/heartbeat/HeartbeatPanel.tsx Outdated
Comment thread desktop/frontend/src/custom/features/heartbeat/HeartbeatPanel.tsx Outdated
@ttmouse

ttmouse commented Aug 10, 2026

Copy link
Copy Markdown
Contributor Author
image image

@ttmouse
ttmouse force-pushed the pr/auto-panel-overall branch from a8c0916 to e6ebe87 Compare August 10, 2026 20:19
@SivanCola

Copy link
Copy Markdown
Collaborator

作者你好,感谢这次对自动化面板的整体升级。页面式布局、分组搜索、运行历史和当前版本下的 runHistory 合并保护,整体方向很好;我在 e6ebe87 上复核后,暂时仍不建议合并,主要需要处理以下问题:

  1. 周期转 Cron 会改变实际语义:biweekly 会生成类似 0 9 1-15 * 1 的表达式,在标准 DOM/DOW OR 语义下会变成每月 1–15 日每天执行或每周一执行;时间窗口 09:00–17:00 也被转成包含 17 点的 9-17,跨午夜 22:00–06:00 则生成当前 matcher 无法匹配的 22-6;秒级任务转 Cron 还会把秒变成分钟。建议不要对无法无损表达的周期提供直接转换,并为双周、结束时刻 exclusive、跨午夜和秒级任务补回归测试。

  2. 推荐卡片点击后会直接创建 enabled=true、approvalMode=yolo、scope=global 的任务。预置 Prompt 涉及读取全部对话、扫描 Downloads、访问网络以及 find 搜索本地文件,但界面没有展示权限或二次确认。建议改为打开编辑器,默认禁用或 ask,确认作用域和权限后再启用。

  3. heartbeat-split 和 heartbeat-split__right 硬编码 background: #fafafa;暗色主题文字仍使用浅色 var(--fg),页面对比度严重异常。请改用主题 token,并验证暗色/亮色主题。

  4. 编辑器右侧的暂停/启动按钮仍基于整个 draft 调用 onSave。用户修改标题或 Prompt 后点击暂停,会把尚未保存的草稿一起落盘。状态文字入口已经改为基于 initialTaskRef,建议两个入口复用同一 helper,并补 UI 回归测试。

  5. Cron 校验目前只检查五字段和字符集合,99 * * * * 等永不执行的表达式也会被保存。前端 nextCronRunAt 最坏扫描 366 天,而且列表每行重复计算两次,会造成明显阻塞。建议进行字段范围和语法校验,缓存每行结果,并保证预览搜索有明确上限。

  6. void import heartbeat.css 不等待 CSS 加载完成。生产构建中组件模块可以先于样式完成并被 React 提交,冷缓存或慢资源下仍有 FOUC;这里建议让 Suspense 覆盖样式加载,或调整测试环境后使用静态 CSS import。

  7. runHistory 对旧配置的前向读取没问题,当前版本的 CAS/union 合并也通过了 race 测试;但旧版二进制读取新配置后整表保存会静默丢弃 runHistory。请补充跨版本兼容策略或明确迁移边界。

本地验证结果:Go 全量测试、Heartbeat race 测试、tsc、hooks lint 和 Vite build 通过;但完整前端测试仍因 app-chrome-tabs.test.ts 使用旧组件名失败,bundle budget 的简体中文 chunk 超预算 28 bytes,git diff --check 也报告 heartbeat-next-run.test.ts 文件尾多空行。另外,当前 head 与最新 main-v2 合并模拟在 check-bundle-budget.mjs 上存在内容冲突,尚有 9 个未解决 review thread。

建议先修复以上问题、rebase 最新 main-v2,并让完整测试和 bundle 门禁全绿后再合并。

将心跳任务面板从弹窗升级为页面式主视图(sidebar 入口 + mainView 状态机):

- 页面式布局:automation 视图填充主内容区,聊天/面板导航自动切回 chat
- 左右分栏:左栏任务列表(scope 分组、搜索、状态/范围过滤),右栏详情/编辑器,可拖拽分割(宽度持久化)
- 运行历史:每次成功执行记录 runHistory(At+TopicID,最多 20 条),详情页展示并支持跳转对应对话;旧任务无历史时用 topicId 合成一条
- 数据保护:前端整表保存时按 At union 磁盘 runHistory,防止旧快照清空引擎写入的执行历史(ReplaceTasks/ReplaceConfig 双路径)
- 状态同步:手动触发后详情页同步 runHistory/topicId/lastRunAt;列表开关同步详情 enabled;TaskEditor draft 跟随
- 分组视图 + 纯列表双视图切换
- 滚动条:顶部与搜索框齐平、滚动时显示/停止后淡出、颜色 35% 透明、淡出时 visibility 隐藏避免拦截点击
- 支持 cron 表达式调度 + 时间窗口
- Tooltip 增加 delay 参数;locale 预算调整;新增 heartbeat-next-run 测试
…S静态导入

- 周期任务 next-run 改用调度语义(nextCycleRunAt 镜像后端),不再转 cron
- intervalToCron 对 biweekly/秒级/跨午夜窗口返回 null(无法无损表达)
- 窗口结束时刻 exclusive(09:00-17:00 → 9-16)
- 推荐卡片改为打开编辑器,默认 enabled=false + approvalMode=ask
- heartbeat-split 硬编码 #fafafa → var(--bg-soft)(主题感知)
- 编辑器状态入口 + 右侧按钮共用 toggleEnabled helper(基于保存基线)
- isCronExpr 前后端加字段范围校验(拒绝 99 * * * *)
- taskNextRun 双调用去重;heartbeat.css 静态导入 + css-stub-register
- app-chrome-tabs 断言更新为 HeartbeatView;budget 调整
- 补周期转换守卫与周期 next-run 回归测试(14 项断言)
…ola review #7)

- heartbeatConfig 加 SchemaVersion 字段(heartbeatSchemaVersion=2),写入时标记格式版本
- writeTasks 前向保护:拒绝用当前二进制整表保存覆盖更高 schemaVersion 的未来配置,避免静默降级丢 runHistory
- 明确迁移边界:v2 配置旧二进制读不报错但整表保存会丢 runHistory,升级单向
- 新增 TestHeartbeatConfigSchemaVersionWritten / TestHeartbeatConfigForwardProtection
@ttmouse
ttmouse force-pushed the pr/auto-panel-overall branch from e6ebe87 to 629cb54 Compare August 11, 2026 10:46
@ttmouse

ttmouse commented Aug 11, 2026

Copy link
Copy Markdown
Contributor Author

感谢逐条复核。已按 7 点意见全部处理,并 rebase 到最新 main-v2,新增提交:

1. 周期转 Cron 语义

  • 周期任务 next-run 不再转 cron,改用调度语义(nextCycleRunAt 镜像后端 nextCycleRunAt
  • intervalToCron 对无法无损表达的周期(biweekly/秒级/跨午夜窗口)返回 null,不提供直接转换
  • 窗口结束时刻改为 exclusive(09:00-17:00 → 9-16
  • 新增周期转换守卫与周期 next-run 回归测试(14 项断言)

2. 推荐卡片权限

  • 改为打开编辑器,默认 enabled=false + approvalMode=ask,作用域与权限由用户确认后再启用

3. 主题色

  • heartbeat-split/heartbeat-split__right 硬编码 #fafafa 改为 var(--bg-soft),亮/暗色主题自适应

4. 暂停/启动按钮落盘草稿

  • 列表开关与编辑器右侧按钮共用同一 toggleEnabled helper,基于最近保存基线(initialTaskRef)翻转 enabled,不再携带 draft 中未保存的编辑

5. Cron 校验与性能

  • isCronExpr 前后端加字段范围校验,拒绝 99 * * * * 等永不执行的表达式
  • nextCronRunAt 保持 366 天扫描上限;每行 taskNextRun 单次调用,不再重复计算两次

6. CSS 加载 FOUC

  • heartbeat.css 改为静态导入 + css-stub-register(测试环境 stub),Vite 将 CSS 作为 JS chunk 依赖门控模块求值,消除样式未就绪的 FOUC

7. runHistory 跨版本兼容 ✅(本次新增)

  • heartbeatConfigSchemaVersion 字段(heartbeatSchemaVersion=2),写入时标记格式版本
  • writeTasks 前向保护:拒绝用旧二进制整表保存覆盖更高 schemaVersion 的未来配置,避免静默降级丢 runHistory
  • 明确迁移边界(代码注释):v2 配置旧二进制可读但整表保存会丢 runHistory,升级单向
  • 新增 TestHeartbeatConfigSchemaVersionWritten / TestHeartbeatConfigForwardProtection

验证项

  • app-chrome-tabs.test.ts 断言更新为 HeartbeatView(128 passed)
  • bundle budget 简体中文 chunk 已调整通过(zh 54.4/56.0 KiB,zh-TW 55.2/57.0 KiB)
  • heartbeat-next-run.test.ts 文件尾多余空行已清理,git diff --check 干净
  • check-bundle-budget.mjs 与最新 main-v2 已 rebase 解冲突
  • 9 个 Codex review thread 已全部标记 resolved

验证结果:Go 全量 Heartbeat 测试 + race 通过;前端 tsc(含 tsconfig.test)+ bundle budget + diff --check 全绿。composer-goal-toggle 与 message-reasoning-panel 的失败在干净 main-v2 上可复现,属上游基线问题,与本 PR 无关。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

desktop Wails desktop app (desktop/**) v2 Go rewrite (1.x) — main-v2 branch, active development

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants