Skip to content

feat(scheduledTask): 新增自定义 Cron 调度类型及表单 UX 优化#1519

Closed
swuzjb wants to merge 3 commits into
netease-youdao:mainfrom
swuzjb:feat/scheduled-task-cron
Closed

feat(scheduledTask): 新增自定义 Cron 调度类型及表单 UX 优化#1519
swuzjb wants to merge 3 commits into
netease-youdao:mainfrom
swuzjb:feat/scheduled-task-cron

Conversation

@swuzjb
Copy link
Copy Markdown
Contributor

@swuzjb swuzjb commented Apr 7, 2026

背景

本 PR 源自 feat/scheduled-task-cron-and-agent 分支,提取其中的 Cron 调度表单 UX 优化 部分,移除多 Agent 支持相关变更,形成独立可合并的功能分支。


本次修改内容

1. 新增自定义 Cron 调度类型

在定时任务的调度方式下拉框中新增「自定义(Cron)」选项,支持通过标准 5 段 Cron 表达式(分 时 日 月 周)配置任意复杂的执行周期。

可视化构建器(Builder 模式)

  • 5 个独立下拉框分别对应分钟、小时、日期、月份、星期字段
  • 每个字段提供常用值和步进值(如 */5*/15)作为选项
  • 实时生成并展示当前 Cron 表达式

原始表达式模式(Raw 模式)

  • 直接输入 Cron 表达式文本框
  • 提供格式提示(格式:分 时 日 月 周,共 5 段
  • 支持在两种模式间切换,切换时保留已有值

实时预览

  • 无论哪种模式,均展示当前表达式对应的人类可读描述(例如「工作日 09:00」)
  • 表达式非法时显示红色错误提示

快捷预设

  • 提供 4 个常用示例芯片(每天 9:00 / 工作日 9:00 / 每小时 / 每 15 分钟),点击即填入
  • 芯片高亮显示当前已激活的预设

时区字段(可选)

  • 提供可选的时区输入框(如 Asia/Shanghai),留空则使用系统默认时区

高级调度兼容

  • 已有的「高级」调度类型(任意 Cron 表达式)展示时新增「转为可编辑 Cron」按钮,允许用户直接切换到可编辑的 Cron 模式

2. 任务列表:展示下次执行相对时间

在任务列表的调度列下方,对已启用且有下次执行时间的任务,以灰色小字显示相对时间(如「5 分钟后」/「2 小时后」/「3 天后」),方便快速感知。

  • 新增 formatNextRunRelative() 工具函数(utils.ts),支持中英文自适应
  • 仅在任务启用且 nextRunAtMs 有值时展示

3. 表单 UX 优化

Prompt 区域

  • 右上角新增字符计数器(N 字符 / N characters
  • 当 Prompt 文本为空时,展示 3 个场景模板快速填入按钮(每日总结 / 数据巡检 / 代码审查)
  • 输入框下方新增引导文案提示(「描述你希望 AI 执行的任务,越详细效果越好」)

表单布局

  • 将表单主体改为可滚动区域(overflow-y-auto),底部操作按钮固定在视图底部,解决长表单内容被截断的问题
  • 修复 ScheduledTasksView 中创建/编辑视图的容器布局,改为 flex flex-col overflow-hidden 以正确撑满高度

样式统一

  • 将输入框、标签、颜色等样式从旧的 dark:border-claude-darkBorder 体系迁移到设计 token(border-borderbg-surfacetext-foreground 等)
  • 星期选择按钮尺寸从 w-9 h-9 调整为 w-8 h-8,激活色从 bg-claude-text 改为 bg-primary

创建后自动跳转

  • 创建任务成功后,自动导航至该任务的详情页,而非返回任务列表
  • onSaved 回调签名更新为 (newTaskId?: string) => voidscheduledTaskService.createTask() 返回类型改为 Promise<string | null>

Tab 按钮 CSS 修复

  • 修复历史 Tab 按钮中 hover:hover:text-foreground 重复 hover: 的冗余写法

4. 类型系统更新(utils.ts

  • PlanType 联合类型新增 'cron'
  • PlanInfo 接口新增 cronExpr?: stringcronTz?: string 可选字段
  • scheduleToPlanInfo() 对复杂 Cron 表达式(不匹配内置快捷模式的)返回 planType: 'cron' 并携带原始表达式,而非回退为 'advanced'

5. 国际化(i18n)

同时为中文(zh)和英文(en)新增以下翻译键:

Key 中文 English
scheduledTasksFormScheduleModeCronCustom 自定义(Cron) Custom (Cron)
scheduledTasksFormCronModeBuilder 可视化 Visual
scheduledTasksFormCronModeRaw 表达式 Expression
scheduledTasksFormCronField_minute/hour/dom/month/dow 分钟/小时/日期/月份/星期 Min/Hour/Day/Month/Weekday
scheduledTasksFormCronInputHint 格式:分 时 日 月 周,共 5 段 Format: min hour day month weekday (5 fields)
scheduledTasksFormCronPreview 解析为 Parsed as
scheduledTasksFormCronPreviewInvalid 无效的 Cron 表达式 Invalid Cron expression
scheduledTasksFormCronQuickTitle 常用示例 Quick examples
scheduledTasksFormCronQuick* 每天 9:00 / 工作日 9:00 等 Every day at 9:00 / Weekdays at 9:00 等
scheduledTasksFormCronTimezone Cron 时区 Cron Timezone
scheduledTasksFormAdvancedEditAsCron 转为可编辑 Cron Edit as Cron
scheduledTasksFormPromptTemplate* 快速模板相关 Quick templates
scheduledTasksFormPayloadTextAgentHint AI 任务描述提示 Describe what you want AI to do
scheduledTasksFormCharCount {count} 字符 {count} characters

与原分支的差异

相较于 feat/scheduled-task-cron-and-agent,本 PR 移除了以下多 Agent 相关变更:

  • TaskForm 中的 Agent 选择下拉框(renderAgentRow()agentId 表单字段)
  • TaskList 中的 Agent 列(useAgentName Hook、额外表格列)
  • TaskDetail 中的 Agent 名称展示
  • openclawChannelSessionSync.ts 中根据 session key 提取 agentId 的逻辑
  • i18n 中的 Agent 相关翻译键(scheduledTasksFormAgentscheduledTasksFormAgentDefaultscheduledTasksDetailAgent

测试建议

  • 创建任务时选择「自定义(Cron)」,验证可视化构建器和原始表达式模式均正常工作
  • 切换两种 Cron 模式,确认表达式值保留正确
  • 点击快捷预设芯片,确认表达式填入且芯片高亮
  • 输入非法 Cron 表达式(字段数不为 5),确认提交被拦截并提示错误
  • 已有复杂 Cron 任务点击「转为可编辑 Cron」,确认正确切换
  • 创建任务后确认自动跳转到任务详情页
  • 任务列表中验证已启用任务显示下次执行相对时间
  • Prompt 为空时确认模板按钮出现,点击后正确填入

swuzjb added 2 commits April 7, 2026 17:12
…ude multi-agent support

- Add custom Cron schedule type with visual builder and raw expression modes
- Add cron quick-pick examples (every day, weekdays, hourly, every 15 min)
- Add live cron expression preview with human-readable description
- Add optional timezone field for cron schedules
- Show next run relative time in task list (e.g. 'in 5 min')
- Add prompt template quick-picks when prompt field is empty
- Add character counter for prompt field
- Improve form layout: scrollable body with fixed footer
- Navigate to task detail after creating a new task
- Fix double hover: CSS selector in tab buttons
- Fix content area flex layout for create/edit views
- Add all required i18n keys for zh and en
Merge origin/main into feat/scheduled-task-cron, resolving conflicts in:
- ScheduledTasksView.tsx: combine cron navigation logic with onDirtyChange
- TaskForm.tsx: keep cron features (CronBuilder, WEEKDAY_KEYS, previewCron) and integrate onDirtyChange; remove redundant inline toOpenClawModelRef
- i18n.ts: retain plan translation keys and add unsaved-changes i18n entries from main
Merge origin/main into feat/scheduled-task-cron, resolving 13 conflict
regions across 4 files:

- TaskForm.tsx: adopt main's filterAccountId param, channelOptions dep,
  dirty-state tracking, and conversationOptionMatchesValue matcher
- TaskList.tsx: keep formatNextRunRelative import from feature branch
- i18n.ts: keep cron i18n keys from feature branch, adopt main's
  embedding provider, sqlite backup, and email channel keys
- scheduledTask.ts: adopt main's filterAccountId parameter
@btc69m979y-dotcom
Copy link
Copy Markdown
Collaborator

原 PR #1519 的改动已通过 #1917 合入 release/2026.05.08 分支(解决了 i18n.ts 中 1 处轻微冲突)。原始提交归属已通过 Co-Authored-By 保留。感谢贡献!

btc69m979y-dotcom added a commit that referenced this pull request May 8, 2026
…dule

feat(scheduledTask): add cron schedule type and UX improvements from #1519
pull Bot pushed a commit to soitun/LobsterAI that referenced this pull request May 9, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants