Workflow 定时运行
定时任务用于按固定规则直接运行某个 Workflow entrypoint。Conversation 和 Kanban 不能作为调度目标;任一 fire 只创建所选入口的独立 run,不会先运行默认入口。
触发规则
计划使用 IANA 时区,并支持两种触发方式:
window-interval:选择星期、一个或多个时间窗口,以及每 N 分钟。窗口包含起止时刻,例如09:30-11:30 / 5 分钟会包含09:30和11:30。cron:五字段 Cron 表达式,按计划时区计算。秒字段不受支持。
type WorkflowScheduleTrigger =
| {
kind: "window-interval";
weekdays: number[]; // 1-7,周一到周日
windows: Array<{ start: string; end: string }>;
intervalMinutes: number;
}
| {
kind: "cron";
expression: string;
};
保存计划时,宿主会校验时区、窗口、Cron、目标入口和参数,并展示未来 5 次触发时间。参数只接受入口现有的静态参数值,不支持日期占位模板;需要“当天”等动态日期时,应在 Workflow 内按业务时区读取当前时间。
声明建议计划
Workflow 可以在 package.json.workflowCode.schedulePresets 中提供建议配置:
{
"workflowCode": {
"schedulePresets": [
{
"id": "market-hours",
"title": "盘中行情同步",
"description": "工作日交易时段每 5 分钟同步一次。",
"entrypointId": "sync-minute",
"timezone": "Asia/Shanghai",
"trigger": {
"kind": "window-interval",
"weekdays": [1, 2, 3, 4, 5],
"windows": [
{ "start": "09:30", "end": "11:30" },
{ "start": "13:00", "end": "15:10" }
],
"intervalMinutes": 5
},
"paramValues": {
"symbols": "000725.SZ,002594.SZ"
}
}
]
}
}
预设 ID 必须匹配 /^[a-z][a-z0-9_-]{0,63}$/,项目内唯一,并引用当前 Workflow 已声明的 entrypoint。预设只是建议:Desktop 和 Server Web 会展示它,但必须由用户确认后才创建,导入或发布项目不会静默开启计划。
Desktop 与 Server
| 宿主 | 目标 | 持续运行条件 | 错过触发 |
|---|---|---|---|
| Desktop | 当前本地项目的 dev 源码;每次触发前重新校验入口 | 关闭窗口后驻留系统托盘;明确退出、关机或休眠时停止 | 恢复后只记录汇总的 skipped_missed,不补跑 |
| Server | 精确已发布版本和 entrypoint;不接受 latest 或 draft | Server 进程运行期间持续调度 | 重启后推进到未来首个触发点,只记录汇总的 skipped_missed |
Desktop 的“开机后台启动”默认关闭。启用后,Desktop 可在登录系统时以后台模式启动,并继续执行本地计划,不自动打开主窗口。Server 使用计划创建者的身份和额度;每次 fire 都会重新检查账号仍为 active、拥有 runs.create、具备项目访问权,并确认固定版本和入口仍可运行。
Server 收到正常停止信号后会先停止领取新 fire,并在进程允许的退出时间内等待已经领取的 fire 完成。进程被强制终止时,未完成 fire 会在 lease 过期后由其它实例或重启后的实例恢复;不会为停机期间本应发生的其它时间点补跑。
重叠、等待与历史
同一计划的上一次 run 尚未结束时,本次触发记录为 skipped_overlap,不会排队或重试。等待用户输入的 run 仍属于未结束状态,因此后续触发同样跳过;用户可以从原 run 继续提交输入。
每个定时 run 会在运行记录、摘要和 report 中保存:
{
source: "schedule";
scheduleId: string;
scheduleName: string;
fireId: string;
scheduledFor: string;
triggerKind: "window-interval" | "cron";
}
计划页会显示启用状态、规则、时区、版本、入口、下次触发、最近结果、跳过原因,并可立即触发一次和查看 fire 历史。手动立即触发仍遵循同一计划的重叠规则。
存在 pending、running 或 waiting_for_input fire 时不能编辑或删除计划,避免恢复中的 fire 改用新版本、入口或参数,也避免运行仍在继续但对应的计划和 fire 历史已经消失。先等待 run 结束或完成等待输入,再修改计划。
与 Kanban 联动
项目 KV 每次成功提交写事务后都会更新项目 revision。与该项目建立已确认直接关系且具备读权限的 Kanban 可以按 alias 订阅 revision,并在同一宿主后端中重新读取数据;回滚事务不会发出变化,撤销关系或读权限会关闭订阅。
Desktop 监听关联项目自己的本地 KV,Server Web 预览和 Embed 通过鉴权 SSE 接收 revision。SSE 初始快照已包含的 revision 不会再重复推送;同一项目短时间内连续写入时只推送该批次的最新 revision。两者数据库相互独立:Desktop 本地运行只更新 Desktop 本地 Kanban,Server 的定时、手动、Webhook 或 External API 运行只更新连接同一 Server 的 Kanban,不会在 Desktop 与 Server 之间自动同步行情或其它 KV 数据。