Raft Connected App:给 AI agent 用的可靠定时任务调度。
Raft agent 通过 clocker 创建和管理定时任务;准点由 cron-job.org(免费可靠的定时服务)触发,clocker 再通过 Raft 的 Agent Inbound 机制把事件送达指定 agent,agent 醒来后执行实际工作。
Raft Agent ──(manifest actions)──▶ clocker Worker ──▶ cron-job.org(定时器)
▲ │ 到点 HTTP 触发
└──── /trigger ────┘
│
▼
Raft Agent Inbound event ──▶ 目标 Agent 醒来干活
为什么需要它:Raft 内置的 reminder 不保证定时精度;clocker 把"可靠的钟"外置给专业定时服务,agent 只关心"到点了要做什么"。
clocker 已安装到某个 Raft server 后,该 server 的任何 agent 都可直接使用,无需逐个批准。
给 agent 的复制粘贴 prompt:
使用 clocker(本 server 已安装的 Raft Connected App):
1. 先登录一次:raft integration login --service clocker --scope openid
(注意:必须带 --scope openid,裸跑会报 INVALID_SCOPE)
2. 查看全部能力:raft integration invoke --service clocker --list-actions
3. 创建定时任务示例(每个工作日 9 点提醒你站会):
raft integration invoke --service clocker --action create-job \
--param cron="0 9 * * 1-5" \
--param title="站会提醒" \
--param targetAgent=<你的agent名>
4. 任务到点触发后,你会收到一条 kind=event 的 inbound 事件,
内含 jobId / title / cron / firedAt 和建任务时 payload 里的全部自定义数据。
8 个 action 一览:create-job(创建)/ list-jobs(列表,可按 status、targetAgent 过滤)/ get-job(详情,remote=true 附远端实时状态)/ update-job(改 cron/标题/目标/payload)/ pause-job(暂停)/ resume-job(恢复)/ delete-job(删除)/ get-job-history(执行历史)/ audit-jobs(本地库与 cron-job.org 双向对账)。
cron 写法:标准 5 段(分 时 日 月 周),支持 *、*/n、列表 1,2,3、范围 1-5、月/周英文名;周日写 0 或 7 都行。不支持同时限制「日」和「周」(两种 cron 方言语义不同,clocker 会直接 400 报错而不是静默错跑)。时区默认 Asia/Shanghai,可用 timezone 参数覆盖。
前提:你有 ①一个 Cloudflare 账号(Free 即可)②本机已登录 wrangler(npx wrangler whoami)③一个 cron-job.org 账号和它的 API key(Console → Settings 生成)④一个 Raft server 的 owner/admin 能批一次注册卡片。
把下面这段整段贴给你的 AI coding agent(Claude Code / Kimi Code / Codex 等):
请帮我把 https://github.com/deadjoe/clocker 部署成我自己的 clocker 实例:
1. git clone 到本地,npm install
2. npx wrangler kv namespace create CLOCKER_KV,把返回的 id 填进 wrangler.jsonc
的 kv_namespaces[0].id
3. 修改 wrangler.jsonc 的 vars:
- APP_ORIGIN 改成 https://clocker.<我的workers.dev子域>.workers.dev
(子域用 npx wrangler whoami / CF dashboard 查)
- RAFT_SERVER_SLUG 改成我的 Raft server slug
4. 配 5 个 secret(wrangler secret put):
- CRONJOB_API_KEY:我提供(cron-job.org Console→Settings 生成)
- TRIGGER_SECRET 和 SESSION_SECRET:你用 openssl rand -hex 32 生成
- RAFT_CLIENT_ID / RAFT_CLIENT_SECRET:来自第 5 步注册
5. 注册 Raft Connected App:运行
raft integration app prepare register \
--client-key clocker --name clocker \
--redirect-url "<APP_ORIGIN>/login/raft/callback" \
--app-url "<APP_ORIGIN>" \
--category "Developer Tools" \
--agent-manifest-url "<APP_ORIGIN>/.well-known/raft-agent-manifest.json" \
--scope openid --scope profile \
--scope agent:event:write --scope agent:notification:write \
--target "<我所在的频道>"
然后提醒我批准卡片;批准后你会收到一次性的 client secret,
用 wrangler secret put 配好 RAFT_CLIENT_ID/RAFT_CLIENT_SECRET。
6. npx wrangler deploy
7. 端到端自测:
raft integration login --service clocker --scope openid
raft integration invoke --service clocker --action create-job \
--param cron="* * * * *" --param title="部署自测" --param targetAgent=<你的agent名>
等 1-2 分钟确认收到 inbound event 后,delete-job 删除该测试任务。
全程不要动我 Cloudflare 账号里任何已有服务;每步遇到错误先停下来问我。
手动逐步执行的等价命令在 docs/DEPLOY.md(可选)。
src/index.ts — 全部路由:manifest、OAuth 回调、8+1 个管理端点、/trigger/:id、对账端点src/cronjob.ts — cron-job.org API 客户端 + 5 段 cron → JobSchedule 转换器src/store.ts — KV 存储层(job:<id> 记录 / idx:jobs 索引 / log:<id> 每任务最近 20 条触发日志 / idem:<key> 创建幂等 / histcache:<id> 历史 60s 缓存)src/raft.ts — Login with Raft 交换、HMAC 签名会话、Agent Inbound 三步流(requests/agent → 资源绑定 token → agent-events)已实现:create(PUT /jobs)、update(PATCH /jobs/:id,含 enabled 暂停/恢复)、delete、get 详情(remote=true 时含 nextExecution)、history(60s 缓存护配额)、list(GET /jobs,用于 audit-jobs 对账)。
有意不实现:
clocker: 标题前缀命名空间化,够用saveResponses=false,详情体恒为 null,无意义APP_ORIGIN 改了必须同步重新注册(raft integration app update --redirect-url),否则登录即报 returnUrl does not matchX-Trigger-Key 强共享密钥(与 cron-job.org 侧任务一一绑定).dev.vars 已 gitignore)npm run typecheck # tsc --noEmit
npm test # vitest:cron 转换器 14 例
npm run dev # 本地起服务(cp .dev.vars.example .dev.vars 先)
冒烟清单:health 200 / manifest 200 / 无会话 401 / 坏 cron 400 / trigger 无钥 401 / 合法创建打到 cron-job.org。