Cron Add 强化与 Schema 对齐
背景
最近的 Gateway 日志显示 cron.add 反复失败,原因是参数无效(缺少 sessionTarget、wakeMode、payload,以及 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排除了signal和imessage,但 TS 类型包含它们。 - 控制 UI 的 CronStatus 期望
jobCount,但 Gateway 返回的是jobs。 - Agent cron 工具 Schema 允许任意
job对象,导致输入格式错误。 - Gateway 严格验证
cron.add且不做规范化,所以包装过的 Payload 会失败。
改动内容
cron.add和cron.update现在会规范化常见的包装结构,并推断缺失的kind字段。- Agent cron 工具 Schema 与 Gateway Schema 匹配,减少了无效 Payload。
- Provider 枚举在 Gateway、CLI、UI 和 macOS 选择器之间保持一致。
- 控制 UI 使用 Gateway 的
jobs计数字段来显示状态。
当前行为
- 规范化: 包装的
data/jobPayload 会被解包;schedule.kind和payload.kind在安全的情况下会被推断。 - 默认值: 当缺少
wakeMode和sessionTarget时,会应用安全的默认值。 - Provider: Discord/Slack/Signal/iMessage 现在在 CLI/UI 中一致显示。
详见 Cron 任务 了解规范化后的结构和示例。
验证方式
- 观察 Gateway 日志,确认
cron.addINVALID_REQUEST 错误减少。 - 确认控制 UI 刷新后显示 cron 状态的任务计数。
可选后续工作
- 手动控制 UI 冒烟测试:为每个 Provider 添加一个 cron 任务,并验证状态任务计数。
待解决问题
cron.add是否应该接受客户端的显式state(当前 Schema 不允许)?- 是否应该允许
webchat作为显式的交付 Provider(当前在交付解析中被过滤)?