定时任务
wesgine 的 Cron 系统为 Cell 提供定时执行 Agent Run 的能力。
基本概念
定时任务模型
每个定时任务绑定一个 Agent,按 cron 表达式定时触发:
CronJob
├── schedule: "0 9 * * 1" (每周一 9:00)
├── agent_id: "reporter"
├── prompt: "生成本周报告"
├── actor: "alice"
└── enabled: true
Per-Cell 隔离
定时任务属于 Cell,不跨 Cell 可见。
声明与播种
CellSpec 声明
定时任务可以在 CellSpec 中声明初始配置:
CellSpec{
Cron: []CronJobSpec{
{
Name: "weekly-report",
Schedule: "0 9 * * 1",
AgentID: "reporter",
Prompt: "生成本周报告",
},
},
}
INV-SEED-01
CellSpec.Cron 是出生声明,不是常驻状态:
| 阶段 | 行为 |
|---|---|
| 首次 boot | 播种进 wes_cron_jobs |
| 后续 boot | 不再读取声明 |
| 运行时 | 存储是唯一权威 |
用户在运行时删掉的任务不会在重启时复活。
管理 API
列出任务
GET /cells/{id}/cron
返回任务列表含状态信息。
添加任务
POST /cells/{id}/cron
{
"name": "daily-summary",
"schedule": "0 18 * * *",
"agent_id": "summarizer",
"prompt": "总结今日工作"
}
删除任务
DELETE /cells/{id}/cron/{jobId}
更新任务
PATCH /cells/{id}/cron/{jobId}
{
"schedule": "0 9 * * *"
}
启用/禁用
POST /cells/{id}/cron/{jobId}/enable
POST /cells/{id}/cron/{jobId}/disable
立即触发
POST /cells/{id}/cron/{jobId}/trigger
运行记录
GET /cells/{id}/cron/{jobId}/runs
调度器统计
GET /cells/{id}/cron/stats
Actor 边界
INV-CRON-10
Cron 是 Actor 边界的第四个面——泄漏的不是数据而是执行身份:
| 风险 | 说明 |
|---|---|
| 不查主的 Trigger | 以别人的身份跑代码 |
| 不查主的 Update | 修改别人的任务配置 |
可见性
每个 Manager 方法都收 actor 参数:
| Actor | 行为 |
|---|---|
| 普通用户 | 只看自己的任务 |
| 空(admin) | 全 Cell 视图 |
无主任务
无主任务仅 admin 可见(与 INV-OBS-10 无主 Run 同治)。
认领无主任务
manager.ClaimOwnerless(ctx, actor)
只给单 actor 部署使用(桌面三端 boot 各调一次)。
配额限制
INV-QUOTA-05
MaxCronJobs 在唯一增长点判定:
| 增长点 | 判据 |
|---|---|
cron.Scheduler.Add | QuotaFn(current, delta) |
覆盖已有名字 delta=0(upsert 是编辑手势)。
温度管理
Cron 与 Cell 温度
有活跃 Cron 任务的 Cell 需要保持 Warm 态:
| Cell 状态 | Cron 行为 |
|---|---|
| Hot | 正常执行 |
| Warm | 正常执行 |
| Cool | Cell 无法 Cool |
| Cold | 任务暂停 |
在各产品中的使用
wesclaw
个人定时提醒与报告:
- 每日工作总结
- 定时信息推送
企业版
部门级定时任务:
- 每周合规报告
- 每日数据汇总
- 定时系统巡检
注意事项
- CellSpec.Cron 仅首次 boot 播种
- 运行时存储是唯一权威
- Actor 边界防止跨用户执行
- 无主任务仅 admin 可见
- 配额在增长点判定
- Cron 任务要求 Cell 保持 Warm