@hmj-ai/cflow 1.3.4 → 1.3.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +163 -57
- package/dist/public/assets/index-DYk-A-3h.js +16 -0
- package/dist/public/index.html +1 -1
- package/dist/src/proposal.js +1 -0
- package/package.json +1 -1
- package/dist/public/assets/index-DzsWw3GO.js +0 -16
package/README.md
CHANGED
|
@@ -1,88 +1,144 @@
|
|
|
1
1
|
# CFlow
|
|
2
2
|
|
|
3
|
-
CFlow 是一个以
|
|
3
|
+
CFlow 是一个以 Flow 为核心的本机多 Agent 编排工作台。用户用自然语言描述目标,系统生成可审阅的流程草案;用户可以在桌面 DAG 画布中调整、检查、测试、发布、运行流程,并通过运行日志或助手继续处理问题。
|
|
4
4
|
|
|
5
|
-
##
|
|
5
|
+
## 产品模型
|
|
6
6
|
|
|
7
|
-
CFlow
|
|
7
|
+
CFlow 面向 HR、财务、运营等不需要学习 DSL 的工作人员。产品表面使用业务语言,内部标识、版本号、hash 和运行时协议只在“技术细节”中展示。
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
工作区由启动 CFlow 时所在的目录决定。一个工作区可以拥有多个 Flow,但 Flow 不会跨工作区读取或写入数据。完整使用路径如下:
|
|
10
10
|
|
|
11
11
|
```text
|
|
12
|
-
在目标目录启动
|
|
13
|
-
|
|
12
|
+
在目标目录启动 CFlow
|
|
13
|
+
-> 用自然语言描述目标
|
|
14
|
+
-> 生成或编辑 Flow 草案
|
|
15
|
+
-> 检查图和契约
|
|
16
|
+
-> 使用临时快照测试
|
|
17
|
+
-> 发布不可变 Flow 版本
|
|
18
|
+
-> 运行并查看 Run Ledger
|
|
19
|
+
-> 必要时通过助手分析或修改草案
|
|
14
20
|
```
|
|
15
21
|
|
|
16
|
-
|
|
22
|
+
产品刻意保持为桌面工作台:支持最小宽度 1280px 的桌面浏览器,左右面板可以收起为窄轨;不实现移动端、触控端或移动抽屉布局。
|
|
23
|
+
|
|
24
|
+
## 核心设计
|
|
25
|
+
|
|
26
|
+
### 两级自然语言编程
|
|
27
|
+
|
|
28
|
+
CFlow 将“单个 Agent 能力”和“能力之间的编排”分成两个层次:
|
|
17
29
|
|
|
18
30
|
```text
|
|
19
|
-
CFDraft
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
FlowDraft
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
31
|
+
CFDraft(单个能力的自然语言描述)
|
|
32
|
+
-> compileCF
|
|
33
|
+
-> CFProgram / CFVersion
|
|
34
|
+
|
|
35
|
+
FlowDraft(已发布能力的组合)
|
|
36
|
+
-> compileFlow
|
|
37
|
+
-> FlowPlan
|
|
38
|
+
-> Flow Engine
|
|
39
|
+
-> Runtime 执行每个 CF
|
|
28
40
|
```
|
|
29
41
|
|
|
30
|
-
|
|
42
|
+
- **CF** 是一个有明确输入、输出、过程约束和 effects 的 Agent 能力。CF 内部没有可供 Engine 解释的控制流。
|
|
43
|
+
- **Flow** 是由 `cf-call`、`branch`、`join`、`approval`、`output` 节点组成的 DAG。条件、并发、汇合、审批、重试和取消都属于 Flow 层。
|
|
44
|
+
- 数据沿边传递完整的 Flow 输入以及已完成上游节点的输出,不维护字段级 Binding。
|
|
45
|
+
- 助手只能根据本轮传入的工作台快照回答问题,或返回线性的 CF 步骤草案。助手不能直接写入边、hash、审批结果、已发布版本或运行事实;服务端会重新编译并校验结果。
|
|
31
46
|
|
|
32
|
-
|
|
33
|
-
- Agent 可以提出或修订草稿,但不能改变已发布图、审批结果、权限或运行事实。
|
|
34
|
-
- 检查、测试、发布、运行是独立阶段;测试使用临时编译快照,发布会固定 CF、Runtime Profile、资源和当前工作区。
|
|
35
|
-
- 数据沿连线传递完整 Flow 输入与已激活的上游输出,不维护字段级 Binding。
|
|
36
|
-
- Run Ledger、Job Lease 与 SSE 事件记录执行事实,支持条件分支、共享汇合、审批、重试和取消。
|
|
47
|
+
### 草案、检查、测试与发布分离
|
|
37
48
|
|
|
38
|
-
|
|
49
|
+
草案是可编辑状态,发布版本是不可变事实。检查和测试使用编译快照,不会把临时结果误当成正式版本;正式运行只能引用已保存的 Flow 版本。发布时会固定:
|
|
39
50
|
|
|
40
|
-
|
|
51
|
+
- FlowPlan 及其 `planHash`;
|
|
52
|
+
- 每个 CF 的精确 `cfId@version` 和 `programHash`;
|
|
53
|
+
- 每个节点使用的 Runtime Profile 版本;
|
|
54
|
+
- 当前工作区根目录和资源绑定。
|
|
41
55
|
|
|
42
|
-
|
|
56
|
+
因此,之后修改草案、Runtime 设置或 Agent manifest,不会改变已经发布版本的执行含义。
|
|
43
57
|
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
直接从 npm 启动:
|
|
58
|
+
## 架构
|
|
47
59
|
|
|
48
|
-
```
|
|
49
|
-
|
|
60
|
+
```text
|
|
61
|
+
┌──────────────────────────────────────────────────────────┐
|
|
62
|
+
│ React 工作台 │
|
|
63
|
+
│ FlowSwitcher / GoalComposer / FlowCanvas / Check / Log │
|
|
64
|
+
│ FlowAgentChat / Settings │
|
|
65
|
+
└───────────────────────┬──────────────────────────────────┘
|
|
66
|
+
│ HTTP JSON + SSE
|
|
67
|
+
┌───────────────────────▼──────────────────────────────────┐
|
|
68
|
+
│ Fastify Server │
|
|
69
|
+
│ 工作区边界、API、草稿保存、编译发布、运行控制、错误处理 │
|
|
70
|
+
└───────┬──────────────────┬───────────────────┬────────────┘
|
|
71
|
+
│ │ │
|
|
72
|
+
┌───────▼──────┐ ┌────────▼────────┐ ┌───────▼──────────┐
|
|
73
|
+
│ Compiler │ │ Engine │ │ RuntimeManager │
|
|
74
|
+
│ CF / Flow │ │ DAG 调度与恢复 │ │ ACP / CLI 适配 │
|
|
75
|
+
│ 契约 / hash │ │ lease / ledger │ │ 发现 / 健康检查 │
|
|
76
|
+
└───────┬──────┘ └────────┬────────┘ └───────┬──────────┘
|
|
77
|
+
└──────────────────▼───────────────────┘
|
|
78
|
+
SQLite (.cflow)
|
|
79
|
+
│
|
|
80
|
+
本机 Agent 子进程
|
|
50
81
|
```
|
|
51
82
|
|
|
52
|
-
|
|
83
|
+
### 模块职责
|
|
53
84
|
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
85
|
+
| 模块 | 位置 | 职责 |
|
|
86
|
+
| --- | --- | --- |
|
|
87
|
+
| 类型与领域模型 | `src/types.ts` | 定义 CF、Flow、Plan、Runtime、Run 和资源的边界 |
|
|
88
|
+
| CF/Flow 编译器 | `src/compiler.ts` | 校验契约和图结构,生成确定性的版本与 hash |
|
|
89
|
+
| 持久化 | `src/db.ts` | 保存草稿、版本、编译快照、运行、事件、job、审批和设置 |
|
|
90
|
+
| 执行引擎 | `src/engine.ts` | 管理节点状态、并发、分支、join、审批、重试、取消和恢复 |
|
|
91
|
+
| Runtime 管理 | `src/runtime.ts` | 管理 Profile,执行 ACP 握手、CLI 探测、权限分析和输出校验 |
|
|
92
|
+
| 进程边界 | `src/runtime-process.ts` | 解析可执行文件、使用 argv 启动进程、限制环境和 cwd、处理终止 |
|
|
93
|
+
| Agent manifest | `src/runtime-manifest.ts` | 合并内置、PATH ACP、npm、用户级和项目级 Runtime 配置 |
|
|
94
|
+
| HTTP 服务 | `src/server.ts` | 组装依赖、提供 API、固定版本、启动恢复循环和 SSE |
|
|
95
|
+
| React 工作台 | `web/src/` | 提供流程切换、目标输入、画布、检查、日志、设置和助手界面 |
|
|
59
96
|
|
|
60
|
-
|
|
97
|
+
### 运行时序
|
|
61
98
|
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
99
|
+
1. `/api/flow-tests` 或发布接口接收 FlowDraft,并把必要的临时 CFDraft 编译成 CFVersion。
|
|
100
|
+
2. `compileFlow` 检查入口、可达性、环、终点、分支和审批边,计算 `programHash` 与 `planHash`。
|
|
101
|
+
3. 服务端解析资源绑定并 pin 当前 Runtime Profile 版本,保存编译快照或 FlowVersion。
|
|
102
|
+
4. 创建 Run 和 Job。恢复循环通过 lease 领取 Job,避免进程重启后丢失排队任务。
|
|
103
|
+
5. Engine 校验 `planHash`,从 Run Ledger 恢复状态;发现副作用可能已发生但事实不完整的节点时,Run 进入 `needs-reconciliation`,不会盲目重放。
|
|
104
|
+
6. 就绪节点按 `maxConcurrency` 调度。节点完成、失败、阻塞、分支选择、审批和 Run 状态变化都写入有序 Ledger Event。
|
|
105
|
+
7. Engine 调用 Executor;Runtime 将 task、输入、资源和 effects 交给 Agent,要求返回符合 output contract 的 JSON,无法满足契约时 fail closed。
|
|
106
|
+
8. 前端通过 `/api/runs/:id/events` 的 SSE 读取事件,运行结束或连接关闭后停止推送。
|
|
107
|
+
|
|
108
|
+
## 数据与持久化
|
|
109
|
+
|
|
110
|
+
启动目录下的 `.cflow/` 是唯一数据作用域:
|
|
111
|
+
|
|
112
|
+
```text
|
|
113
|
+
<workspace>/.cflow/
|
|
114
|
+
├── cflow.sqlite # 业务数据、版本、运行记录和事件
|
|
115
|
+
├── flows/ # 流程附件
|
|
116
|
+
├── agents.d/ # 项目级 Agent manifest,可提交到 Git
|
|
117
|
+
└── .gitignore # 自动忽略数据库、WAL 文件和 flows/
|
|
66
118
|
```
|
|
67
119
|
|
|
68
|
-
|
|
120
|
+
SQLite 使用 WAL 和 busy timeout。主要数据表及用途:
|
|
69
121
|
|
|
70
|
-
|
|
122
|
+
| 表 | 内容 |
|
|
123
|
+
| --- | --- |
|
|
124
|
+
| `cf_drafts` / `cf_versions` | CF 草稿与不可变 CF 版本 |
|
|
125
|
+
| `flow_drafts` / `flow_versions` | Flow 草稿与不可变 FlowPlan |
|
|
126
|
+
| `flow_compilations` | preview/test 编译快照 |
|
|
127
|
+
| `runs` / `ledger_events` | Run 当前状态与追加式执行事实 |
|
|
128
|
+
| `jobs` | 带 lease 的待执行任务 |
|
|
129
|
+
| `approvals` | 人工审批决定 |
|
|
130
|
+
| `runtime_profiles` / `runtime_current` | Runtime Profile 历史与当前指针 |
|
|
131
|
+
| `resource_profiles` / `workspace_settings` | 资源绑定和工作区设置 |
|
|
71
132
|
|
|
72
|
-
|
|
133
|
+
`CF_DB` 已不再支持。设置该变量会在监听端口前退出,以保证启动目录始终是唯一数据作用域;旧版 `data/cf.sqlite` 不会自动读取、迁移或删除。
|
|
73
134
|
|
|
74
|
-
|
|
135
|
+
## Runtime 与安全边界
|
|
75
136
|
|
|
76
|
-
|
|
77
|
-
- Codex 与 Claude Code 通过内置 ACP Adapter 执行;Grok Build 与 Pi 是普通项目 manifest。所有命令均使用 argv 数组启动,不拼接 shell 命令字符串。
|
|
78
|
-
- ACP 必须完成真实 `initialize` 握手才标记为可用;CLI 必须通过无副作用的版本探测。认证状态不会用可能计费的模型请求猜测。
|
|
79
|
-
- Runtime 配置每次保存都会生成不可变 Profile 版本;发布 Flow 时会 pin 精确 Profile 版本,Run Ledger 记录实际执行版本。
|
|
80
|
-
- 设置页只读展示当前工作区,并提供默认 Agent 和测试最长等待时间;资源绑定按需放在折叠的高级区域。
|
|
81
|
-
- Runtime 必须返回符合 CF output contract 的 JSON,否则 Flow fail closed。
|
|
82
|
-
- Runtime 工具请求默认按 CF 的 effects 自动授权:已声明且位于工作区内的读写和命令操作无需逐次确认;未声明能力或工作区外路径会被拒绝。Flow 中显式的人工审批节点仍需单独批准。
|
|
83
|
-
- Flow/CF 草稿会保存到 SQLite;Resource Profile 可在设置中创建、编辑与删除。
|
|
137
|
+
CFlow 内置 Codex 和 Claude Code,也支持通过 manifest 接入其他 ACP 或普通 CLI Agent。Runtime Profile 是不可变配置快照;更新设置会创建新版本,发布的 Flow 只引用发布时 pin 的版本。
|
|
84
138
|
|
|
85
|
-
|
|
139
|
+
Runtime 发现包括:内置 adapter、PATH 中的 ACP、npm 包 `cflowAgent` 字段、用户 manifest 和项目 manifest。后出现的同 ID 配置覆盖先前配置,项目级配置可以覆盖用户级配置;无效 manifest 会跳过并在设置页显示警告。
|
|
140
|
+
|
|
141
|
+
项目级 manifest 路径为 `<workspace>/.cflow/agents.d/*.json`,用户级路径为 `~/.config/cflow/agents.d/*.json`。最小配置:
|
|
86
142
|
|
|
87
143
|
```json
|
|
88
144
|
{
|
|
@@ -97,9 +153,57 @@ npm start
|
|
|
97
153
|
}
|
|
98
154
|
```
|
|
99
155
|
|
|
100
|
-
`backend` 支持 `acp` 和 `cli
|
|
156
|
+
`backend` 支持 `acp` 和 `cli`。所有进程都使用 argv 数组启动,不经过 shell 拼接。Process Runtime 提供独立子进程、工作区内限定 cwd、环境变量白名单、参数化启动、超时、取消和输出大小限制;除非具体 adapter 声明,否则不承诺网络隔离或主机级文件系统沙箱。
|
|
157
|
+
|
|
158
|
+
权限以 CF 的 effects 为依据:已声明且位于工作区内的读写和命令操作可以自动授权;未声明能力或工作区外路径会被拒绝。Flow 中的人工审批节点仍需明确批准。密钥值不写入 CFlow 数据库,只按允许的变量名从服务端环境继承。
|
|
159
|
+
|
|
160
|
+
## 安装与运行
|
|
161
|
+
|
|
162
|
+
需要 Node.js 22 或更高版本。
|
|
163
|
+
|
|
164
|
+
从 npm 启动:
|
|
165
|
+
|
|
166
|
+
```bash
|
|
167
|
+
npx @hmj-ai/cflow
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
或全局安装后在目标工作区启动:
|
|
171
|
+
|
|
172
|
+
```bash
|
|
173
|
+
npm install -g @hmj-ai/cflow
|
|
174
|
+
cd /path/to/your/workspace
|
|
175
|
+
cflow
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
从源码运行:
|
|
101
179
|
|
|
102
|
-
|
|
180
|
+
```bash
|
|
181
|
+
pnpm install
|
|
182
|
+
pnpm run build
|
|
183
|
+
pnpm start
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
默认访问 `http://127.0.0.1:3000`。服务默认只监听回环地址,因为 Runtime 可以启动本机受控进程。只有配置好外部认证和网络访问控制后,才应通过 `HOST` 改为其他监听地址。
|
|
187
|
+
|
|
188
|
+
开发模式:
|
|
189
|
+
|
|
190
|
+
```bash
|
|
191
|
+
pnpm run dev # Fastify + tsx
|
|
192
|
+
pnpm run dev:web # Vite,默认 127.0.0.1:5173,/api 代理到 3000
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
## API 能力概览
|
|
196
|
+
|
|
197
|
+
后端 API 按领域分组:
|
|
198
|
+
|
|
199
|
+
- `/api/workspace`:当前工作区;
|
|
200
|
+
- `/api/settings`、`/api/runtimes/*`:设置、Runtime 发现、健康检查和 Profile;
|
|
201
|
+
- `/api/cfs`、`/api/cf-drafts/*`:CF 草稿与版本;
|
|
202
|
+
- `/api/flows`、`/api/flow-drafts/*`、`/api/flow-compilations`:Flow 草稿、版本和编译快照;
|
|
203
|
+
- `/api/flow-tests`:使用临时版本执行测试;
|
|
204
|
+
- `/api/runs`:启动、取消、审批、查看运行详情和 SSE 事件;
|
|
205
|
+
- `/api/flow-agent/chat`:基于工作台快照进行回答或草案修订;
|
|
206
|
+
- `/api/resource-profiles/*`:资源 Profile 的管理和绑定。
|
|
103
207
|
|
|
104
208
|
## 开发与验证
|
|
105
209
|
|
|
@@ -110,4 +214,6 @@ pnpm run format:check
|
|
|
110
214
|
pnpm run build
|
|
111
215
|
```
|
|
112
216
|
|
|
113
|
-
|
|
217
|
+
技术栈:TypeScript、Fastify、React、XYFlow、better-sqlite3、Vite 和 Agent Client Protocol。生产构建输出到 `dist/`;npm 包包含 `dist`、`README.md` 和 `DESIGN.md`。
|
|
218
|
+
|
|
219
|
+
视觉令牌、组件规则和交互原则见 [`DESIGN.md`](./DESIGN.md)。产品目标和用户边界见 [`PRODUCT.md`](./PRODUCT.md)。
|