名称: let-me-know
描述: 在执行任何长时间运行的任务前通知用户,并保持进度更新。适用于任务耗时较长(>2-3 分钟)的场景。发送开始消息,安排 5 分钟一次的心跳更新,并在任务完成后立即发送完成消息。
确保用户在长时间运行的任务开始前即被通知,在可配置的时间间隔(默认 5 分钟)内收到定期更新,并在任务完成或失败时立即收到通知。心跳消息必须反映实时进度,而非重复的模板信息。
当任务需要较长时间(>2-3 分钟)或涉及长时间运行的安装、构建、测试等操作时,请使用此技能。
1) 开始前消息(任务开始前):
- 发送简短消息:说明将执行的任务、预计耗时,并明确告知:
- “完成或失败都会立刻通知你;期间我每 X 分钟 发一次进度心跳,您也可以修改心跳时间间隔。”
2) 启动心跳(可配置间隔,需预检查)
- 默认间隔 = 5 分钟 (everyMs=300000)。如果用户指定了其他间隔,则使用用户指定的值。
- 在任务运行期间安排重复的进度更新。
- 在发送每条心跳消息前,读取最新的进度(状态文件/日志),并发送当前进度(避免重复模板):
- 运行中 → 包含最新步骤、进度指标和下一步计划。
- 失败 → 发送失败通知并停止心跳。
- 优先推荐:在同一条 agentTurn 内进行“原地心跳”(不创建额外的 cron 任务):
- 在长任务执行期间,使用循环 sleep <间隔> → 读取进度 → message send 发送一次动态进度。
- 任务结束后自然停止,不会遗留心跳任务。
- 只有在必须脱离当前执行流时才使用 cron 心跳,并且必须满足以下条件:
- 通过 cron add 创建心跳任务时,设置 payload.deliver=false(避免“收到/启动”等消息被转发给用户)。
- 心跳任务内部使用 message send 主动推送进度。
- 创建后将返回的 heartbeatJobId 写入状态文件(例如 <task>-state.json),供后续清理使用。
- 创建前先执行 cron list,若已存在同名心跳任务,则先移除(去重)。
- 内容模板(动态):
- 运行中:进度:<最新步骤/阶段>(<关键指标>)。下一步:<next>。完成/失败会立刻通知你。
- 失败:失败:<task> 发生错误(简述原因)。已停止心跳提醒。
3) 执行任务
- 执行长时间运行的命令。
4) 完成消息(任务结束后立即发送)
- 发送结果摘要(成功/失败 + 关键输出)。
5) 停止心跳(必须执行)
- 如果使用了“原地心跳”(推荐):任务结束即可,不会遗留任何 cron 任务。
- 如果使用了 cron 心跳:
- 在任务成功/失败的 finally 块中调用 cron remove <heartbeatJobId>。
- 若移除失败(网关超时):至少重试 2 次(指数退避 2s/8s)。
- 若仍失败:创建一个 2 分钟后的一次性清理 cron 任务再次尝试移除(避免永远刷屏)。
优先使用外发的普通聊天消息:
- 使用 message send 并指定正确的目标格式。
- 例如,对于 Discord 私信:user:<id>。
commands.restart: true)并重试。开始消息:
- 即将开始:安装依赖并运行测试(预计 5–10 分钟)。完成或失败都会立刻通知你;期间我每 5 分钟发一次进度心跳,你也可以修改心跳时间间隔。
心跳(每 5 分钟,示例):
- 进度:已完成安装依赖(1/2),测试运行中(已用时 4 分钟)。下一步:汇总测试结果。完成/失败会立刻通知你。
完成消息:
- 完成:安装成功,测试通过。