Cron Add 强化与 Schema 对齐

背景

最近的 Gateway 日志显示 cron.add 反复失败,原因是参数无效(缺少 sessionTargetwakeModepayload,以及 schedule 格式错误)。这表明至少有一个客户端(很可能是 Agent 工具调用路径)发送了包装过的或部分指定的任务 Payload。另外,TypeScript 中的 cron Provider 枚举、Gateway Schema、CLI 标志和 UI 表单类型之间存在不一致,而且 UI 对 cron.status 的处理也有问题(期望 jobCount 字段,但 Gateway 返回的是 jobs)。

目标

  • 通过规范化常见的包装 Payload 并推断缺失的 kind 字段,停止 cron.add 的 INVALID_REQUEST 错误刷屏。
  • 在 Gateway Schema、cron 类型、CLI 文档和 UI 表单之间对齐 cron Provider 列表。
  • 明确 Agent cron 工具的 Schema,让 LLM 生成正确的任务 Payload。
  • 修复控制 UI 中 cron 状态的任务计数显示。
  • 添加测试覆盖规范化和工具行为。

非目标

  • 不改变 cron 调度语义或任务执行行为。
  • 不添加新的调度类型或 cron 表达式解析。
  • 不全面改造 cron 的 UI/UX,只修复必要的字段问题。

发现的问题(当前差距)

  • Gateway 中的 CronPayloadSchema 排除了 signalimessage,但 TS 类型包含它们。
  • 控制 UI 的 CronStatus 期望 jobCount,但 Gateway 返回的是 jobs
  • Agent cron 工具 Schema 允许任意 job 对象,导致输入格式错误。
  • Gateway 严格验证 cron.add 且不做规范化,所以包装过的 Payload 会失败。

改动内容

  • cron.addcron.update 现在会规范化常见的包装结构,并推断缺失的 kind 字段。
  • Agent cron 工具 Schema 与 Gateway Schema 匹配,减少了无效 Payload。
  • Provider 枚举在 Gateway、CLI、UI 和 macOS 选择器之间保持一致。
  • 控制 UI 使用 Gateway 的 jobs 计数字段来显示状态。

当前行为

  • 规范化: 包装的 data/job Payload 会被解包;schedule.kindpayload.kind 在安全的情况下会被推断。
  • 默认值: 当缺少 wakeModesessionTarget 时,会应用安全的默认值。
  • Provider: Discord/Slack/Signal/iMessage 现在在 CLI/UI 中一致显示。

详见 Cron 任务 了解规范化后的结构和示例。

验证方式

  • 观察 Gateway 日志,确认 cron.add INVALID_REQUEST 错误减少。
  • 确认控制 UI 刷新后显示 cron 状态的任务计数。

可选后续工作

  • 手动控制 UI 冒烟测试:为每个 Provider 添加一个 cron 任务,并验证状态任务计数。

待解决问题

  • cron.add 是否应该接受客户端的显式 state(当前 Schema 不允许)?
  • 是否应该允许 webchat 作为显式的交付 Provider(当前在交付解析中被过滤)?