Skip to content

工作流自动化引擎 CLI(Phase 96) ​

chainlesschain automation(别名 auto)— 连接器目录、触发器配置与工作流治理。

12 个 SaaS 连接器 + 5 种触发器类型 + DAG 拓扑排序 + 条件分支执行。

历史版本记录(2026-08-14):原文记录 0.163.8 当时为 npm latest。下文相关版本说明保留为历史记录,不代表当前 latest,也不证明 SaaS 连接器已实现。

当前源码能力(2026-10-06,尚未随本次修改发布):默认 execute 返回 unsupported,不调用 SaaS;显式 execute --test 返回 simulated。连接器名称和动作是目录定义。持久调度、权限预算、去重、暂停/恢复与人工裁决已有实现,但不代表对应业务动作已执行。


概述 ​

Automation Engine 是面向非开发者的工作流自动化平台(区别于 workflow 的开发流水线)。 内置 12 个 SaaS 连接器目录项(Gmail/Slack/GitHub/Jira/Notion/Trello/Discord/Teams/ Airtable/Figma/Linear/Confluence)与触发器配置。当前执行器可显式模拟 DAG,尚未接入真实 SaaS 执行后端。


核心特性 ​

  • 12 个 SaaS 连接器目录项 — 用于定义流程与动作,目录存在不表示已连通或能够执行
  • 5 种触发器 — webhook(HTTP 回调)、schedule(cron)、email(邮件入站)、form(表单提交)、manual(手动)
  • DAG 模拟 — 拓扑排序与节点模拟输出;--test 不验证外部效果、真实并行或服务响应
  • 生命周期管理 — draft → active → paused → archived;activate/pause/archive/delete 状态机
  • 模板共享 — 导出/导入自定义模板,share --public 公开
  • 执行日志 — 每次执行记录步骤级详情、输入输出、错误堆栈
  • 持久定时执行 — automation run-scheduled 将 active+scheduled flow 绑定为 immutable snapshot,使用 logical occurrence 去重、owner/fence lease 与确定性 execution id;只恢复可验证成功证据,不自动重放 outcome-unknown 副作用
  • 执行前置检查与预算 — creator identity、automation:execute、连接器 RBAC、live revocation、flow run/action budget 与共享 scheduler policy revision 分层复验
  • Automation Center — CLI 生成 versioned projection 和 exact argv;VS Code 0.37.50 / JetBrains 0.4.86 通过 revision CAS 管理 flow 与 cron/once/webhook/GitHub Routine
  • V2 治理层 — -v2 后缀:4 态 automation maturity + 5 态 execution lifecycle,cap + auto-pause-idle + auto-fail-stuck

系统架构 ​

┌──────────────────────────────────────────────────────┐
│               chainlesschain automation               │
├──────────────────────────────────────────────────────┤
│  Triggers                 │  Orchestrator             │
│  webhook / schedule /     │  DAG topo-sort +          │
│  email / form / manual    │  conditional exec         │
├──────────────────────────────────────────────────────┤
│  Connectors (12)                                      │
│  Gmail │ Slack │ GitHub │ Jira │ Notion │ Trello ... │
├──────────────────────────────────────────────────────┤
│  Execution Log       │  Templates                    │
│  step-level, JSON    │  public share + import        │
├──────────────────────────────────────────────────────┤
│  SQLite (automation_flows / triggers / executions)    │
├──────────────────────────────────────────────────────┤
│  Scheduler Kernel (kernel-v1.sqlite)                  │
│  snapshot/CAS · occurrence dedup · lease · recovery   │
└──────────────────────────────────────────────────────┘

数据流:create flow → 配置触发器/权限 → 请求执行 → 记录 unsupported,或显式 --test 记录 simulated → logs。


配置参考 ​

配置项含义默认
maxConcurrentExecutions并发执行数10
executionTimeoutMs单次执行超时300000 ms
logRetentionDays日志保留天数30
maxStepsPerFlow单工作流最大步骤100
V2 perOwnerActiveAutomationCap每 owner 活跃工作流~20
V2 perAutomationRunningExecCap每工作流运行中执行~10
V2 autoPauseIdleAfterMs闲置自动暂停阈值86400000 ms

查看:chainlesschain auto config、auto trigger-types、auto statuses。


性能指标 ​

指标典型值
创建工作流< 20 ms
添加触发器< 15 ms
DAG 拓扑排序(20 节点)< 10 ms
手动 execute(真实 SaaS 调用)当前 unsupported,未测量
V2 createExecV2 dispatch< 50 ms
V2 cap (default)per-owner 20 active / per-auto 10 running

测试覆盖率 ​

核心覆盖位于 automation-engine.test.js,发布后恢复增量另由 automation-center-runtime.test.js、automation-center-incidents.test.js、 automation-execution-incident.test.js、scheduler-runtime-control-capabilities.test.js 与 scheduler-reliability-soak.test.js 覆盖。

覆盖范围包括 flow CRUD、trigger 创建/enable/disable/fire、节点模拟、 模板 import/export、activate/pause/archive 状态机、V2 cap/idle/stuck、 checkpoint pause/resume、stale fence/revision/capability 拒绝、incident 幂等 requeue、 manual incident retry 拒绝和敏感证据不越过 IDE 投影边界。本次新增模拟/未支持状态、历史模拟记录不得恢复为成功、确定执行与未知结果裁决的回归;这些本地测试不替代发布门禁或真实 SaaS 验证。


安全考虑 ​

  1. 连接器配置 — 真实执行后端尚未接入;配置中不要写入明文凭证
  2. Webhook 签名 — 入站 webhook 建议配置 HMAC 签名验证 payload 完整性
  3. cron 频率限制 — schedule 触发器后端强制最小间隔,防止滥用
  4. 失败处理 — unsupported/simulated 不结算为真实成功;未知副作用结果禁止自动重放
  5. 审计日志 — 所有 activate/pause/archive/delete 操作写入审计链
  6. 失败闭合的无人值守权限 — 缺少 creator、automation:execute、连接器权限、预算或共享 scheduler policy 时拒绝运行;重试复用原 reservation
  7. 作用域事件去重 — dispatch-channel-event 要求稳定 source event id,仅接受 webhook/Telegram origin,并在 durable scope check 后触发匹配 flow

故障排查 ​

Q: 触发器 fire 了但执行未启动?

  1. 确认 flow 已 activate(draft/paused 状态不会执行)
  2. 检查 auto show <flow-id> 的 DAG 是否有孤立节点
  3. 查看 auto logs <flow-id> 获取具体错误

Q: 定时任务未按计划触发?

  1. 验证 cron 表达式语法(auto schedule <id> --cron 传入后会解析)
  2. 检查已安装版本,再运行 chainlesschain auto run-scheduled --json 查看调度状态
  3. 确认 flow 状态为 active;draft/paused/archived 不会被 scheduler 入队
  4. V2 下检查是否被 auto-pause-idle 自动暂停

Q: 为什么返回 unsupported 或 simulated?

  1. 当前 SaaS 执行器未接入,默认请求返回 unsupported;更换凭证不会改变此能力边界
  2. 使用 execute <flow-id> --test 显式模拟,结果为 simulated,不代表邮件或消息已发送
  3. run-scheduled / channel event 的未支持执行进入非自动重试的 dead_letter;历史模拟输出也不能作为恢复成功证据

关键文件 ​

  • packages/cli/src/commands/automation.js — Commander 子命令(~924 行)
  • packages/cli/src/lib/automation-engine.js — DAG 引擎与连接器
  • packages/cli/src/lib/scheduler-kernel/automation-adapter.js — scheduled flow snapshot、occurrence 与恢复策略
  • packages/cli/src/lib/automation-execution-authority.js — creator / connector RBAC / flow budget 前置检查与结算
  • packages/cli/src/lib/automation-center.js、automation-center-routines.js — versioned projection、revision-CAS flow/Routine 控制面
  • packages/cli/src/lib/automation-center-runtime.js、automation-center-incidents.js — 发布后源码的 fenced runtime 控制、incident retry/cancel 与脱敏投影
  • packages/cli/src/lib/automation-execution-incident.js — revisioned incident 持久化与终态结算
  • packages/cli/src/lib/scheduler-kernel/runtime-control-capabilities.js — production adapter 的 checkpoint_v1 safe-point 声明
  • packages/cli/src/lib/scheduler-kernel/automation-event-adapter.js — channel event scope、去重与执行
  • packages/cli/src/lib/scheduler-kernel/runtime.js — 共享 claim/lease/heartbeat/settlement runtime
  • packages/cli/__tests__/unit/automation-engine.test.js — 单测(114 tests)
  • 数据表:automation_flows / automation_triggers / automation_executions
  • 设计文档:docs/design/modules/61_工作流自动化引擎.md

使用示例 ​

bash
# 1. 从模板创建 + 激活
tpl=$(chainlesschain auto templates --json | jq -r '.[0].id')
fid=$(chainlesschain auto import-template $tpl | grep flow-id)
chainlesschain auto activate $fid

# 2. 添加 webhook 触发器
chainlesschain auto add-trigger $fid --type webhook --config '{"path":"/hooks/foo"}'

# 3. 定时触发(工作日 9:00)
chainlesschain auto schedule $fid --cron "0 9 * * 1-5"

# npm 0.163.8:统一 Scheduler + migration/adjudication/recovery
chainlesschain auto run-scheduled
chainlesschain auto run-scheduled --json
chainlesschain auto run-scheduled --lease-ms 60000

# 4. 显式模拟(不调用 SaaS,状态 simulated)
chainlesschain auto execute $fid --test --input '{"subject":"test"}'
chainlesschain auto logs $fid --limit 5

# 5. 全局统计
chainlesschain auto stats --json

连接器与触发器目录 ​

bash
chainlesschain auto connectors      # 列出 12 个连接器目录项,不是连通性检查
chainlesschain auto trigger-types   # 列出触发器类型
chainlesschain auto statuses        # 列出工作流状态
chainlesschain auto config          # 查看配置常量

工作流 CRUD ​

bash
# 创建工作流
chainlesschain auto create --name "新 Issue 通知" --description "GitHub issue → Slack"

# 列出工作流
chainlesschain auto flows
chainlesschain auto flows --json

# 查看详情
chainlesschain auto show <flow-id>

# 生命周期管理
chainlesschain auto activate <flow-id>    # 激活
chainlesschain auto pause <flow-id>       # 暂停
chainlesschain auto archive <flow-id>     # 归档
chainlesschain auto delete <flow-id>      # 删除

# 定时调度
chainlesschain auto schedule <flow-id> --cron "0 9 * * 1-5"
# 运行所有当前到期的 active cron flow
chainlesschain auto run-scheduled [--json] [--lease-ms 60000]

# 分享与模板
chainlesschain auto share <flow-id> --public
chainlesschain auto templates                           # 列出模板
chainlesschain auto import-template <template-id>       # 导入模板

执行权限、预算与 channel event ​

无人值守执行前先为 flow 设置固定窗口预算,再查看 live RBAC 与剩余额度:

bash
chainlesschain auto set-execution-budget <flow-id> \
  --window-ms 3600000 --max-runs 20 --max-action-steps 200
chainlesschain auto execution-preflight <flow-id> --json

# Webhook / Telegram 接入层传入稳定事件 ID;相同 ID 会被持久去重
chainlesschain auto dispatch-channel-event \
  --event-id webhook-20260812-001 --origin webhook \
  --sender build-service --text "production build failed" \
  --meta '{"repository":"acme/app"}' --json

execution-preflight 同时展示 principal、每个连接器权限以及剩余 run/action-step 配额。它通过不代表未来永久可用;实际执行仍会再次读取 live revocation、flow budget 与共享 scheduler policy revision。

权限预检通过也不代表连接器执行能力可用。当前 schedule/event 默认执行仍为 unsupported;预算与治理检查不会把模拟结果转为真实成功。

Automation Center 与 IDE ​

IDE 只消费 center-projection,不直接编辑 Automation/Routine 的 SQLite 或 JSON 文件。每个 mutation 都必须携带投影展示的 exact revision;投影过期时失败闭合并要求刷新。

bash
# IDE/集成方读取版本化投影
chainlesschain auto center-projection --limit 100 --json

# Flow 动作:run_now | retry_failed | pause | resume | disable | delete
chainlesschain auto center-action <flow-id> pause \
  --expected-revision <revision> --json

# Routine 动作:run_now | retry_failed | pause | resume | disable | delete
chainlesschain auto center-routine-action <routine-id> run_now \
  --expected-revision <revision> --json

# PowerShell:定义由有界 JSON stdin 输入,禁止 shell 拼接
Get-Content routine.json | chainlesschain auto center-routine-create --expected-revision <catalog-revision> --json-stdin --json
Get-Content routine.json | chainlesschain auto center-routine-edit <routine-id> --expected-revision <item-revision> --json-stdin --json

VS Code 在 Activity Bar 打开 ChainlessChain Automation;JetBrains 在 View → Tool Windows → ChainlessChain Automation 打开。两端都显示 scope、preflight、运行历史与可用动作,最终权威仍由 CLI 持有。


0.163.8:运行中暂停/恢复与 incident 操作 ​

0.163.8 的 center-projection 会投影可控 scheduler occurrence、 exact fence、control revision、checkpoint_v1 capability/safe point,以及脱敏 incident。 集成方必须执行投影生成的 exact argv;旧投影会因 fence/revision/capability 变化而失败闭合。

bash
# 合作式 pause/resume;pause 只在声明的 checkpoint safe point 生效,不是强杀
chainlesschain auto center-runtime-action <occurrence-id> pause \
  --expected-fence <fence> \
  --expected-control-revision <control-revision> --json
chainlesschain auto center-runtime-action <occurrence-id> resume \
  --expected-fence <fence> \
  --expected-control-revision <control-revision> --json

# 只对 scheduler-backed schedule/event dead letter 开放 retry
chainlesschain auto center-incident-action <incident-id> retry \
  --expected-revision <incident-revision> --json
chainlesschain auto center-incident-action <incident-id> cancel \
  --expected-revision <incident-revision> --json

retry 会重新匹配 incident 与 occurrence 的 flow/job/run/trigger/fence/error code, 重复点击使用确定性 request id 去重;原 incident 在重试产生权威 success evidence 前保持 open。 manual incident 因无法证明外部效果未发生而禁止 retry,只能 cancel。IDE 不接收持久化的 authority、boundary 或 detail evidence,也不直接修改 Automation/Scheduler 存储。

这些命令已经通过 0.163.8 的 exact-SHA 三平台门禁、发布与公网回读;操作时仍必须使用刚获取的投影,旧 fence/revision 不得复用。


0.163.7:outcome-unknown 人工裁决 ​

当外部连接器可能已产生副作用、但本地终态无法证明时,scheduler 会写入 *_OUTCOME_UNKNOWN 死信并拒绝自动重放。稳定版提供统一操作入口:

bash
cc daemon scheduler adjudication list
cc daemon scheduler adjudication show <occurrence-id>

cc daemon scheduler adjudication decide <occurrence-id> \
  --decision confirmed_applied \
  --expected-evidence-digest sha256:<digest> \
  --expected-attempt <attempt> \
  --expected-fence <fence>

运行 decide 前必须停止每一个 scheduler host、排空已分发任务,并在目标 SaaS/外部系统核验真实结果。命令只接受交互式 TTY 和逐字 typed challenge;理由与操作员身份只保存摘要。选择 confirmed_applied 会从证据结算且绝不重放,选择 confirmed_not_applied 只授权一次有界执行。任何旧 digest、attempt/fence 变化、重复裁决或非 outcome-unknown 状态都会失败闭合。决策写入后再重启一个 scheduler host 应用。

这不是全局 exactly-once,也不是机器范围锁。chainlesschain@0.163.8 继续包含这些子命令,但生产操作仍必须保持死信、完成外部核验并使用 exact evidence;不要绕过存储直接改状态。

触发器管理 ​

bash
chainlesschain auto add-trigger <flow-id> --type webhook --config '{"url":"..."}'
chainlesschain auto triggers <flow-id>
chainlesschain auto enable-trigger <trigger-id>
chainlesschain auto disable-trigger <trigger-id>
chainlesschain auto fire-trigger <trigger-id> --payload '{"key":"value"}'

执行与日志 ​

run-scheduled 使用 occurrence 派生的确定性 execution id。若同一 occurrence 已有成功 execution evidence,只补齐 scheduler settlement;若只有 running、非成功终态或副作用后持久化结果未知,则失败闭合,不自动重跑连接器。该约束不等于外部 SaaS 的全局 exactly-once。

bash
# 请求真实执行:当前返回 unsupported,CLI 非零退出
chainlesschain auto execute <flow-id> --input '{"data":"test"}'

# 显式模拟:返回 simulated,不产生外部效果
chainlesschain auto execute <flow-id> --test --input '{"data":"test"}'

# 查看执行详情
chainlesschain auto exec-show <execution-id>

# 执行日志
chainlesschain auto logs <flow-id>
chainlesschain auto logs <flow-id> --limit 50 --json

simulated 与 unsupported 分别记录在执行历史中。旧记录如果携带模拟输出,即使原始状态为 success,当前源码也按 simulated 展示和处理。只有可验证的非模拟成功证据或人工 confirmed_applied 裁决才能完成成功结算。


统计 ​

bash
chainlesschain auto stats          # 自动化引擎统计
chainlesschain auto stats --json

相关文档 ​

基于 MIT 许可发布