feihong-code 0.2.3 → 0.6.0
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/.github/FUNDING.yml +4 -0
- package/.github/ISSUE_TEMPLATE/bug_report.md +37 -37
- package/.github/ISSUE_TEMPLATE/config.yml +14 -14
- package/.github/ISSUE_TEMPLATE/feature_request.md +28 -28
- package/.github/PULL_REQUEST_TEMPLATE.md +46 -46
- package/.github/SECURITY.md +67 -67
- package/.github/dependabot.yml +16 -0
- package/.github/workflows/ci.yml +1 -1
- package/AGENT-GUIDE.md +382 -237
- package/CHANGELOG.md +392 -0
- package/CODE_OF_CONDUCT.md +56 -56
- package/CONTRIBUTING.md +68 -68
- package/LICENSE +22 -22
- package/README.md +586 -522
- package/README.self-evolve.md +274 -0
- package/dist/agent/code-review.js +2 -0
- package/dist/agent/code-review.js.map +1 -1
- package/dist/agent/code-writer.js +74 -18
- package/dist/agent/code-writer.js.map +1 -1
- package/dist/agent/context-compactor.js +13 -4
- package/dist/agent/context-compactor.js.map +1 -1
- package/dist/agent/experience.js +319 -84
- package/dist/agent/experience.js.map +1 -1
- package/dist/agent/orchestrator.js +233 -71
- package/dist/agent/orchestrator.js.map +1 -1
- package/dist/agent/planner.js +30 -7
- package/dist/agent/planner.js.map +1 -1
- package/dist/agent/prompts.js +9 -0
- package/dist/agent/prompts.js.map +1 -1
- package/dist/agent/quality-gate.js +10 -4
- package/dist/agent/quality-gate.js.map +1 -1
- package/dist/agent/repo-context.js +181 -0
- package/dist/agent/repo-context.js.map +1 -0
- package/dist/agent/repo-reader.js +92 -99
- package/dist/agent/repo-reader.js.map +1 -1
- package/dist/agent/self-heal.js +80 -60
- package/dist/agent/self-heal.js.map +1 -1
- package/dist/agent/self-improver.js +65 -61
- package/dist/agent/self-improver.js.map +1 -1
- package/dist/agent/subagent-summary.js +31 -0
- package/dist/agent/subagent-summary.js.map +1 -0
- package/dist/agent/subagent.js +52 -2
- package/dist/agent/subagent.js.map +1 -1
- package/dist/agent/symbol-index.js +160 -0
- package/dist/agent/symbol-index.js.map +1 -0
- package/dist/agent/team.js +193 -0
- package/dist/agent/team.js.map +1 -0
- package/dist/cli/commands.js +124 -143
- package/dist/cli/commands.js.map +1 -1
- package/dist/cli/index.js +113 -106
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/repl.js +82 -7
- package/dist/cli/repl.js.map +1 -1
- package/dist/cli/run.js +600 -95
- package/dist/cli/run.js.map +1 -1
- package/dist/cli/tui.js +145 -0
- package/dist/cli/tui.js.map +1 -0
- package/dist/cli/version.js +1 -1
- package/dist/enterprise/audit.js +145 -23
- package/dist/enterprise/audit.js.map +1 -1
- package/dist/enterprise/index.js +14 -11
- package/dist/enterprise/index.js.map +1 -1
- package/dist/enterprise/policy.js +22 -10
- package/dist/enterprise/policy.js.map +1 -1
- package/dist/harness/executor.js +127 -0
- package/dist/harness/executor.js.map +1 -0
- package/dist/harness/harness.js +87 -0
- package/dist/harness/harness.js.map +1 -0
- package/dist/harness/index.js +31 -0
- package/dist/harness/index.js.map +1 -0
- package/dist/harness/loader.js +138 -0
- package/dist/harness/loader.js.map +1 -0
- package/dist/harness/reporter.js +34 -0
- package/dist/harness/reporter.js.map +1 -0
- package/dist/harness/types.js +10 -0
- package/dist/harness/types.js.map +1 -0
- package/dist/harness/verifier.js +48 -0
- package/dist/harness/verifier.js.map +1 -0
- package/dist/hello.js +14 -0
- package/dist/hello.js.map +1 -0
- package/dist/memory/auto-summarize.js +208 -0
- package/dist/memory/auto-summarize.js.map +1 -0
- package/dist/memory/index.js +228 -0
- package/dist/memory/index.js.map +1 -0
- package/dist/models/model-router.js +100 -27
- package/dist/models/model-router.js.map +1 -1
- package/dist/models/model.dto.js +25 -3
- package/dist/models/model.dto.js.map +1 -1
- package/dist/models/providers/ollama.provider.js +12 -0
- package/dist/models/providers/ollama.provider.js.map +1 -1
- package/dist/models/providers/openai-compatible.provider.js +14 -1
- package/dist/models/providers/openai-compatible.provider.js.map +1 -1
- package/dist/plugins/plugin-loader.js +179 -0
- package/dist/plugins/plugin-loader.js.map +1 -0
- package/dist/runtime/event-log.js.map +1 -1
- package/dist/runtime/hooks.js +80 -0
- package/dist/runtime/hooks.js.map +1 -0
- package/dist/self-evolve/hook.js +60 -0
- package/dist/self-evolve/hook.js.map +1 -0
- package/dist/self-evolve/hook.ts +80 -0
- package/dist/self-evolve/manager.d.ts +8 -0
- package/dist/self-evolve/manager.js +401 -0
- package/dist/shared/config.js +35 -3
- package/dist/shared/config.js.map +1 -1
- package/dist/shared/errors.js +6 -2
- package/dist/shared/errors.js.map +1 -1
- package/dist/shared/i18n.js +535 -0
- package/dist/shared/i18n.js.map +1 -0
- package/dist/shared/secure-store.js +117 -0
- package/dist/shared/secure-store.js.map +1 -0
- package/dist/skills/grill.js +2 -1
- package/dist/skills/grill.js.map +1 -1
- package/dist/skills/self-heal.js +73 -0
- package/dist/skills/self-heal.js.map +1 -0
- package/dist/skills/skill-loader.js +131 -0
- package/dist/skills/skill-loader.js.map +1 -0
- package/dist/skills/skill-market.js +195 -0
- package/dist/skills/skill-market.js.map +1 -0
- package/dist/tools/analysis/code-analyzer.js +45 -18
- package/dist/tools/analysis/code-analyzer.js.map +1 -1
- package/dist/tools/index.js +5 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/mcp/index.js +84 -0
- package/dist/tools/mcp/index.js.map +1 -0
- package/dist/tools/mcp/mcp-client.js +194 -0
- package/dist/tools/mcp/mcp-client.js.map +1 -0
- package/dist/tools/sandbox.js +126 -0
- package/dist/tools/sandbox.js.map +1 -0
- package/dist/tools/shell/exec.js +72 -3
- package/dist/tools/shell/exec.js.map +1 -1
- package/dist/tools/shell/run-shell.tool.js +37 -7
- package/dist/tools/shell/run-shell.tool.js.map +1 -1
- package/dist/tools/skills/load-skill.tool.js +36 -0
- package/dist/tools/skills/load-skill.tool.js.map +1 -0
- package/dist/tools/tool.interface.js.map +1 -1
- package/dist/tools/tool.registry.js +69 -1
- package/dist/tools/tool.registry.js.map +1 -1
- package/dist/tools/web/web.tool.js +139 -0
- package/dist/tools/web/web.tool.js.map +1 -0
- package/dist/web/auth.js +178 -3
- package/dist/web/auth.js.map +1 -1
- package/dist/web/channels.js +171 -0
- package/dist/web/channels.js.map +1 -0
- package/dist/web/public/css/style.css +1546 -0
- package/dist/web/public/index.html +804 -37
- package/dist/web/public/js/api.js +309 -0
- package/dist/web/public/js/app.js +1472 -0
- package/dist/web/public/js/ui.js +832 -0
- package/dist/web/public/js/utils.js +170 -0
- package/dist/web/server.js +937 -11
- package/dist/web/server.js.map +1 -1
- package/dist/web/task-queue.js +470 -0
- package/dist/web/task-queue.js.map +1 -0
- package/dist/web/web-config.js +143 -0
- package/dist/web/web-config.js.map +1 -0
- package/docs/App/344/275/277/347/224/250/350/257/264/346/230/216/344/271/246.md +299 -0
- package/docs/App/346/212/200/346/234/257/350/257/264/346/230/216/344/271/246.md +554 -0
- package/docs/Deployment_Guide_EN.md +288 -0
- package/docs/SELF-EVOLVE-GUIDE.md +313 -0
- package/docs/Technical_Manual_EN.md +216 -0
- package/docs/User_Manual_EN.md +314 -0
- package/docs/error-codes.md +198 -0
- package/docs/screenshots/cli-demo.png +0 -0
- package/docs/screenshots/feature-comparison.png +0 -0
- package/docs/screenshots/web-console.png +0 -0
- package/docs/self-evolve-implementation.md +165 -0
- package/docs/self-evolve.md +166 -0
- package/docs//344/272/247/345/223/201/345/274/200/345/217/221/346/226/207/346/241/243.md +614 -614
- package/docs//344/274/201/344/270/232/351/203/250/347/275/262/344/270/216/345/220/210/350/247/204.md +267 -267
- package/docs//344/275/277/347/224/250/350/257/264/346/230/216/344/271/246.md +318 -358
- package/docs//345/270/270/350/247/201/351/227/256/351/242/230/344/270/216/346/225/205/351/232/234/346/216/222/346/237/245.md +130 -130
- package/docs//346/212/200/346/234/257/350/257/264/346/230/216/344/271/246.md +216 -303
- package/docs//346/236/266/346/236/204/344/270/216API.md +238 -238
- package/docs//347/224/250/346/210/267/346/211/213/345/206/214.md +196 -196
- package/docs//351/203/250/347/275/262/346/214/207/345/215/227.md +165 -165
- package/docs//351/203/250/347/275/262/350/257/264/346/230/216/344/271/246.md +288 -0
- package/docs//351/205/215/347/275/256/345/217/202/350/200/203.md +127 -127
- package/docs//351/241/265/351/235/242/345/212/237/350/203/275/345/244/215/347/233/230/344/270/216/345/206/222/347/203/237/346/265/213/350/257/225/346/212/245/345/221/212.html +117 -0
- package/package.json +108 -109
- package/tool-schema.json +117 -46
|
@@ -1,303 +1,216 @@
|
|
|
1
|
-
# 飞虹 Code(fhcode)技术说明书
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
`
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
-
|
|
100
|
-
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
-
|
|
112
|
-
|
|
113
|
-
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
{
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
|
192
|
-
|
|
193
|
-
|
|
|
194
|
-
|
|
|
195
|
-
|
|
|
196
|
-
|
|
|
197
|
-
|
|
|
198
|
-
|
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
**接入校验脚本** `scripts/verify-m9-real.mjs`:用本地 mock HTTP 服务(兼容 OpenAI / Ollama 协议)驱动 `swe` 走完整的"真实 HTTP provider → 编排器工具循环 → 验证器"链路,无需任何外部模型即可验证接入正确性(11 项断言)。
|
|
218
|
-
|
|
219
|
-
### 5.2 Web REST API(M5 BETA,仅观测、不执行)
|
|
220
|
-
|
|
221
|
-
所有端点需 `Authorization: Bearer <FH_WEB_TOKEN>`(未设令牌则全 401,fail-closed)。
|
|
222
|
-
|
|
223
|
-
| 方法 | 路径 | 返回 |
|
|
224
|
-
|------|------|------|
|
|
225
|
-
| GET | `/api/health` | `{ product, version, signature, enterprise, time }` |
|
|
226
|
-
| GET | `/api/tenants` | 全部租户与用量 |
|
|
227
|
-
| GET | `/api/whoami` | 当前租户身份与配额 |
|
|
228
|
-
| GET | `/api/policy` | 角色矩阵 + 黑名单 |
|
|
229
|
-
| GET | `/api/audit?limit=N` | 脱敏审计记录(倒序) |
|
|
230
|
-
| GET | `/api/audit/verify` | `{ ok, brokenAt? }` |
|
|
231
|
-
| GET | `/api/sessions` | 会话检查点列表 |
|
|
232
|
-
| GET | `/api/quota` | 配额状态(已用/上限) |
|
|
233
|
-
|
|
234
|
-
静态仪表盘由 `dist/web/public/index.html` 提供(同源访问)。
|
|
235
|
-
|
|
236
|
-
---
|
|
237
|
-
|
|
238
|
-
## 6. 部署架构
|
|
239
|
-
|
|
240
|
-
### 6.1 CI 四流水线(`.github/workflows/ci.yml`,零 Secrets 全离线)
|
|
241
|
-
|
|
242
|
-
1. **build**:Node 18/20/22 矩阵 + 类型检查 + 编译 + 离线端到端闭环 + `/plan` `/grill` 只读技能。
|
|
243
|
-
2. **enterprise**:`verify-m4.mjs`(41 项全离线断言:RBAC/审计链/多租户/配额)+ CLI 企业命令冒烟 + **租户隔离断言**(beta 不得读到其他租户会话)。
|
|
244
|
-
3. **security**:`npm pack --dry-run` 白名单校验(禁 `.env`/`src`/`.workbuddy`/`policy.json`/`id_rsa`)+ 仓库明文密钥扫描 + `npm audit`。
|
|
245
|
-
4. **docker**:构建镜像(不推送)+ 容器内 `whoami` 冒烟 + Web 控制台 `/api/health` 健康检查(HTTP 200)。
|
|
246
|
-
|
|
247
|
-
### 6.2 Docker 部署(稳定部署推荐)
|
|
248
|
-
|
|
249
|
-
- **镜像**:多阶段 `Dockerfile`,构建阶段编译 `dist`,运行阶段仅 `express`+`zod` 生产依赖。
|
|
250
|
-
- **数据卷**:`FH_HOME=/data/fhcode` 挂载命名卷,持久化会话/审计/租户。
|
|
251
|
-
- **端口**:默认 `8080`(Web 控制台)。
|
|
252
|
-
- **编排**:`docker-compose.yml` 提供一键 `docker compose up -d`,令牌经 `FH_WEB_TOKEN` 环境变量注入。
|
|
253
|
-
- **反向代理建议**:前置 Nginx/Caddy 做 TLS 终止与限流;`FH_WEB_TOKEN` 务必为强随机值,勿用默认值。
|
|
254
|
-
|
|
255
|
-
### 6.3 安装方式
|
|
256
|
-
|
|
257
|
-
- npm 全局:`npm install -g feihong-code`(bin=`fhcode`)。
|
|
258
|
-
- 源码:`git clone` → `npm install` → `npm run build` → `node dist/cli/index.js`。
|
|
259
|
-
- Docker:`docker build -t feihong-code .` → `docker run -p 8080:8080 feihong-code serve`。
|
|
260
|
-
- 安装脚本:`./install.sh`(封装 npm 全局安装)。
|
|
261
|
-
|
|
262
|
-
---
|
|
263
|
-
|
|
264
|
-
## 7. 安全模型
|
|
265
|
-
|
|
266
|
-
- **密钥**:仅存 gitignored `.env`;CLI 不回显完整 key;日志脱敏(`redact`)。
|
|
267
|
-
- **最小权限**:`guard` 为唯一权威闸门,deny 优先;Web 仅观测不执行,保持 guard 权威。
|
|
268
|
-
- **fail-closed**:Web 无令牌/错令牌 → 401;审批通道缺失 → 拒绝;审计写入失败 → 拒绝。
|
|
269
|
-
- **发布包白名单**:`package.json` 的 `files`(仅 `dist`+元数据+`docs`)+ `.npmignore`(排除 `.env`/`src`/`.workbuddy`/脚本/日志)双重保障,`.env` 等绝不随 `npm publish` 泄露。
|
|
270
|
-
|
|
271
|
-
---
|
|
272
|
-
|
|
273
|
-
## 8. 构建与验证
|
|
274
|
-
|
|
275
|
-
| 脚本 | 作用 |
|
|
276
|
-
|------|------|
|
|
277
|
-
| `npm run typecheck` | `tsc --noEmit` 类型检查 |
|
|
278
|
-
| `npm run build` | `tsc` 编译 + 拷贝 Web 静态资源到 `dist/web/public` |
|
|
279
|
-
| `npm run verify:m4` | 41 项企业能力离线断言 |
|
|
280
|
-
| `npm run verify` | typecheck + build + verify:m4 串联 |
|
|
281
|
-
|
|
282
|
-
> **本地构建注意**:Windows 本地 `tsc` 编译可能被 Windows Defender 实时扫描短暂锁文件(表现为 emit 退出 1 或后台挂起),属环境限制非代码缺陷;GitHub Actions(windows/ubuntu runner)无此问题。CI 是权威构建来源。
|
|
283
|
-
|
|
284
|
-
**verify-m4 断言覆盖(41/41)**:RBAC 矩阵(5) / deny 优先(4) / 策略覆盖加严(4) / 审计哈希链(7) / 守卫链路(11) / 多租户(7) / 配额(3)。
|
|
285
|
-
|
|
286
|
-
---
|
|
287
|
-
|
|
288
|
-
## 9. 里程碑与路线图
|
|
289
|
-
|
|
290
|
-
- **M0+M1**:CLI 骨架 + 单代理闭环 ✅
|
|
291
|
-
- **M2**:多子代理并行编排 ✅
|
|
292
|
-
- **M3**:恢复与审计(sessions/resume/diff/rollback + 交互式审批)✅
|
|
293
|
-
- **M4**:企业级权限/审计/多租户/CI ✅(本稳定版)
|
|
294
|
-
- **M5**:Web 管理控制台 —— S1 服务骨架+`serve` 已完成并验证(BETA);S2 观测 API / S3 前端仪表盘 / S4 安全加固 / S5 文档与 verify-m5 待推进。
|
|
295
|
-
- **M6**:自我进化核心 —— 自愈循环(self-heal)、上下文压缩(context-compactor)、经验学习(experience)、模型性能追踪(model-router stat)✅
|
|
296
|
-
- **M7**:编程能力增强 —— 代码分析器(code-analyzer)、代码生成器(code-generator)、AI 代码审查器(code-review)、仓库理解器(repo-underwriter)、测试生成器(test-generator)✅
|
|
297
|
-
- **M8**:自主编程迭代优化 —— CodeWriter 自主编写器(规划→编写→测试→审查→修复闭环)、QualityGate 质量门禁(安全+质量+测试覆盖)、SelfImprover 自我改进(反思→模式提取→经验融合)、CLI 命令(`code-write`/`quality-gate`/`self-improve`)✅
|
|
298
|
-
- **M9**:全自动软件工程 Agent —— 读取整个(大型)代码仓库(repo-reader,限流+忽略规则)→ 任务拆解规划(swe-planner,有序可验证子任务)→ 逐任务(实现+构建/测试验证+自愈重试,swe-agent 主编排)→ 产出结构化报告;CLI 命令 `fhcode swe "<目标>"`(支持 `--repo`/`--plan-only`/`--verify-only`/`--max-tasks`/`--max-retries`/`--max-iterations`)✅
|
|
299
|
-
- **M9.1 真实模型接入与实测调优** —— `loadConfig` 新增三级供应商解析(FH_PROVIDERS / `fhcode.config.json` / 单环境变量 `FH_MODEL_*`);`swe` 新增 `--max-iterations` 控制每子任务推理轮数;针对真实模型强化执行纪律(强制工具落地、必须真跑验证、禁谎报、只改相关文件)与自愈注入(注入真实命令输出);`scripts/verify-m9-real.mjs` 以 mock HTTP 服务实测"真实 provider 全链路"(11/11 通过)✅
|
|
300
|
-
|
|
301
|
-
---
|
|
302
|
-
|
|
303
|
-
*晋江市飞虹智科技企业管理有限公司 · 飞扬企源研发中心 · 负责人:吴赐虹*
|
|
1
|
+
# 飞虹 Code(fhcode)技术说明书
|
|
2
|
+
|
|
3
|
+
**版本**:v0.5.0-b
|
|
4
|
+
**日期**:2026-08-16
|
|
5
|
+
**产品**:飞虹 Code(feihong-code)— 终端 AI 编程智能体(Muse Code 参照复刻)
|
|
6
|
+
**署名**:晋江市飞虹智科技企业管理有限公司 · 飞扬企源研发中心 · 负责人:吴赐虹
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## 一、产品概述
|
|
11
|
+
|
|
12
|
+
飞虹 Code(fhcode)是一款运行在终端/Web/IDE 三端的 AI 编程智能体,以「自然语言 → 代码闭环」为核心,支持多模型路由、企业级安全、全自动软件工程与自我迭代。零第三方运行时依赖(仅 express + zod),离线可用,可私有化部署。
|
|
13
|
+
|
|
14
|
+
**核心能力矩阵(v0.5.0)**:
|
|
15
|
+
|
|
16
|
+
| 领域 | 能力 |
|
|
17
|
+
|------|------|
|
|
18
|
+
| 编排 | ReAct 循环、规划器、上下文压缩、检查点续跑、成本熔断、自愈循环 |
|
|
19
|
+
| 模型 | 多模型路由(成本/能力/延迟策略 + fallback + 统计择优)、OpenAI 兼容 / Ollama / Mock |
|
|
20
|
+
| 工具 | 文件读写编辑、搜索、受管 shell、构建检查、测试运行、web 检索、技能加载 |
|
|
21
|
+
| 自我迭代 | 经验库(强化学习式 upsert/召回)、反思器回流、自愈闭环、eval 跑分、SWE-bench 基准 |
|
|
22
|
+
| 安全 | 沙箱四档、网络域名规则、hooks 确定性控制、RBAC、审计哈希链、配额熔断、脱敏、入站签名校验 |
|
|
23
|
+
| 生态 | SKILL.md 技能标准、Skills 市场(agentskills.io)、MCP、插件分发、Agent teams |
|
|
24
|
+
| 交付 | CLI/TUI、Web 控制台(任务面板)、VSCode 扩展、跨进程任务队列、消息渠道 |
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
## 二、系统架构
|
|
29
|
+
|
|
30
|
+
```
|
|
31
|
+
┌─────────────────────────────────────────────────────────────┐
|
|
32
|
+
│ 接入层 │
|
|
33
|
+
│ CLI (index/run/repl/TUI) · Web (server/task-queue) · IDE 扩展 │
|
|
34
|
+
└──────────────────────────────┬──────────────────────────────┘
|
|
35
|
+
│
|
|
36
|
+
┌──────────────────────────────▼──────────────────────────────┐
|
|
37
|
+
│ 编排层 agent/ │
|
|
38
|
+
│ Orchestrator(ReAct) · planner · repo-reader · swe-agent │
|
|
39
|
+
│ subagent(嵌套) · team(消息总线) · self-heal · experience │
|
|
40
|
+
│ quality-gate · code-writer · repo-context · symbol-index │
|
|
41
|
+
└──────────────┬───────────────────────────────┬──────────────┘
|
|
42
|
+
│ │
|
|
43
|
+
┌──────────────▼──────────────┐ ┌─────────────▼──────────────┐
|
|
44
|
+
│ 模型层 models/ │ │ 工具层 tools/ │
|
|
45
|
+
│ ModelRouter(策略+统计) │ │ file/search/shell/verify │
|
|
46
|
+
│ OpenAICompatible/Ollama/Mock│ │ web(MCP) / skills(load) │
|
|
47
|
+
│ sandbox(四档+网络规则) │ │ tool.registry(zod+守卫) │
|
|
48
|
+
└──────────────┬──────────────┘ └─────────────┬──────────────┘
|
|
49
|
+
│ │
|
|
50
|
+
┌──────────────▼───────────────────────────────▼──────────────┐
|
|
51
|
+
│ 安全层 enterprise/ + runtime/hooks │
|
|
52
|
+
│ tenant(多租户) · policy(RBAC) · audit(哈希链) · quota │
|
|
53
|
+
│ guard(守卫) · hooks(PreToolUse/PostEdit) · channels(渠道) │
|
|
54
|
+
└──────────────────────────────┬──────────────────────────────┘
|
|
55
|
+
│
|
|
56
|
+
┌──────────────────────────────▼──────────────────────────────┐
|
|
57
|
+
│ 基础设施 shared/ + runtime/ │
|
|
58
|
+
│ config(env 优先) · i18n(中英) · logger(脱敏JSON) · errors │
|
|
59
|
+
│ event-log(JSONL) · session-persist(检查点) · git · worktree │
|
|
60
|
+
└─────────────────────────────────────────────────────────────┘
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
**模块目录**(`src/`):
|
|
64
|
+
|
|
65
|
+
| 目录 | 职责 |
|
|
66
|
+
|------|------|
|
|
67
|
+
| `cli/` | 参数解析、命令分发、运行装配、REPL/TUI、版本 |
|
|
68
|
+
| `agent/` | 编排器、规划器、SWE、子代理、团队、自愈、经验、符号索引、仓库上下文 |
|
|
69
|
+
| `models/` | 模型路由、供应商(OpenAI 兼容/Ollama/Mock)、成本估算、DTO 校验 |
|
|
70
|
+
| `tools/` | 工具系统:文件/搜索/shell/验证/web/MCP/技能加载/沙箱 |
|
|
71
|
+
| `enterprise/` | 多租户、RBAC 策略、审计链、配额、守卫 |
|
|
72
|
+
| `runtime/` | 事件日志、会话持久化、git 辅助、worktree、hooks |
|
|
73
|
+
| `shared/` | 配置、i18n、日志(脱敏)、错误层级、类型 |
|
|
74
|
+
| `skills/` | 技能标准(SKILL.md 加载)、技能市场(agentskills.io)、/plan /grill /goal |
|
|
75
|
+
| `plugins/` | 插件分发(plugin.json 打包 skills+hooks+MCP) |
|
|
76
|
+
| `web/` | Web 控制台、任务队列、消息渠道、入站签名校验 |
|
|
77
|
+
|
|
78
|
+
---
|
|
79
|
+
|
|
80
|
+
## 三、核心模块详解
|
|
81
|
+
|
|
82
|
+
### 3.1 编排器(agent/orchestrator.ts)
|
|
83
|
+
|
|
84
|
+
ReAct 主循环 `run(goal, resume?)`,单次迭代:
|
|
85
|
+
1. `router.chat()` 调用模型(带能力标签路由)
|
|
86
|
+
2. 无工具调用 → 任务完成;有 → `executeToolRound()` 执行工具并回填 tool 消息
|
|
87
|
+
3. 错误检测:`roundErrors > 0` → `handleRecovery()`(分类 → 注入反思 → 重试,上限 `maxRetryErrors`)
|
|
88
|
+
4. 上下文压缩:`shouldCompact()` 触发时保留 system 指令(H4 修复)
|
|
89
|
+
5. 检查点落盘(`persist` 回调)+ 事件流(`onEvent`,P0-1 流式输出)
|
|
90
|
+
|
|
91
|
+
**事件流(P0-1)**:`OrchestratorEvent` 判别联合——model.response / tool.call / tool.result / self-heal / context.compact / session.end,CLI 流式渲染、TUI header 驱动、eval 计数复用同一事件源。
|
|
92
|
+
|
|
93
|
+
**成本熔断(M4)**:`cost >= maxCostUsd` 立即中止并提示 `resume` 续跑;`maxCostUsd=0` 不限。
|
|
94
|
+
|
|
95
|
+
**经验回流(M6)**:会话结束 `extractExperience()`(表驱动 EXTRACTORS)→ `upsertExperience`(稳定 id 合并、sessionCount 累积、成功率加权平均);自愈成功额外固化 `extractFixPattern`。
|
|
96
|
+
|
|
97
|
+
### 3.2 模型路由(models/model-router.ts)
|
|
98
|
+
|
|
99
|
+
- 策略:`cost`(按 costPer1k)/ `latency`(本地优先)/ `capability`(标签加权)
|
|
100
|
+
- 择优:`rank(tags)` 能力过滤 + 历史成功率加权(≥3 次调用,最多 +0.3)
|
|
101
|
+
- fallback:按序尝试,失败记 `p.model`(修复:不产生空模型名条目),全部失败抛最后错误
|
|
102
|
+
- 统计:`updateStat()` 自动落盘(`statsHomeDir`,P5 闭环修复),`model-stats` 命令可查
|
|
103
|
+
- 子任务分工(P1-1):`tags: ['code-gen','cheap']` 让低成本模型承担子任务
|
|
104
|
+
|
|
105
|
+
### 3.3 工具系统(tools/)
|
|
106
|
+
|
|
107
|
+
- `ToolRegistry`:注册/查找/执行,zod 校验入参,错误归一为 `ToolResult`
|
|
108
|
+
- 执行链顺序(纵深防御):**沙箱 → PreToolUse hook → RBAC 守卫 → 工具 → PostToolUse/PostEdit hook**
|
|
109
|
+
- 沙箱四档(P0-2/P5-4):`read-only` / `workspace-write` / `danger-full-access` / `container`(Docker 挂载工作区执行 shell)
|
|
110
|
+
- 网络域名规则:`FH_NETWORK_ALLOW/DENY` 对 run_shell 命令 URL 与 web 工具 URL 均生效
|
|
111
|
+
- hooks(P2-1):`FH_HOOKS` JSON 数组,PreToolUse 非零退出拦截、PostEdit 编辑后触发,占位符 `{cwd}{tool}{path}{runId}{ok}`
|
|
112
|
+
|
|
113
|
+
### 3.4 SWE Agent(agent/swe-agent.ts + swe-planner + swe-verifier)
|
|
114
|
+
|
|
115
|
+
仓库读取(`repo-reader`,限流/忽略规则)→ 任务拆解(`planSweTask`)→ 逐任务「实现(runSubTask)+ 验证(构建/测试)+ 自愈重试」→ 报告。支持 `--plan-only` / `--verify-only` / `--max-tasks` / `--max-retries`。
|
|
116
|
+
|
|
117
|
+
**子代理(P3-4)**:`runSubAgent` 深度控制(默认 3 层),目标可拆解且未达上限时递归派生子代理(子目录隔离),逐层摘要回传(`summarizeSubTaskAnswer`,P2-2)。
|
|
118
|
+
|
|
119
|
+
### 3.5 Agent teams(agent/team.ts,P4-2)
|
|
120
|
+
|
|
121
|
+
- `TeamBus`:消息总线(send/receive/broadcast 定向与广播)
|
|
122
|
+
- `TaskBoard`:共享任务清单(claim 原子认领防重复,状态+owner 双校验)
|
|
123
|
+
- `runTeam`:多 agent 并发认领执行,`ok=false` 记 failed(修复),产出团队报告
|
|
124
|
+
|
|
125
|
+
### 3.6 企业安全(enterprise/)
|
|
126
|
+
|
|
127
|
+
| 模块 | 机制 |
|
|
128
|
+
|------|------|
|
|
129
|
+
| tenant | 租户隔离目录(`tenants/<id>/{sessions,audit,goals}`) |
|
|
130
|
+
| policy | RBAC:角色-工具矩阵(viewer/developer/operator/admin)+ denyShell 黑名单 + denyPaths 敏感路径,deny 优先 |
|
|
131
|
+
| audit | 哈希链(SHA-256,seq/prevHash 衔接),跨进程文件锁 + 指数退避,写入前脱敏,`audit verify` 校验 |
|
|
132
|
+
| quota | 租户日成本预算(`FH_TENANT_BUDGET_USD`),启动前 fail-fast 实时复核(M14 修复) |
|
|
133
|
+
| guard | 「策略→审批→审计」工具前置钩子,审计失败=拒绝 |
|
|
134
|
+
|
|
135
|
+
### 3.7 技能与市场(skills/)
|
|
136
|
+
|
|
137
|
+
- **SKILL.md 标准(P1-2)**:frontmatter(name/description)+ 正文;渐进式披露——索引(≤8KB)常驻 system prompt,正文由 `load_skill` 工具按需加载(Tier-2)
|
|
138
|
+
- 发现位置:仓库 `.agents/skills` / `.claude/skills` 逐级回溯 + 打包 `skills/` + 用户级 `~/.feihong-code/skills` + 插件技能目录
|
|
139
|
+
- **技能市场(P6)**:agentskills.io discovery 规范(`/.well-known/agent-skills/index.json`),`skill-market search/install/list`;RFC 3986 URL 解析、sha256 digest 校验、tar.gz 归档解包(零依赖手写,路径穿越防护)
|
|
140
|
+
- **插件(P3-3)**:`plugin.json` 打包 skills+hooks+MCP,用户级/项目级双级发现,`plugin install`(本地目录/git clone)
|
|
141
|
+
|
|
142
|
+
### 3.8 Web 与云执行(web/)
|
|
143
|
+
|
|
144
|
+
| 端点 | 说明 |
|
|
145
|
+
|------|------|
|
|
146
|
+
| `GET /api/health` | 公开健康检查(免鉴权) |
|
|
147
|
+
| `POST/GET /api/tasks`、`GET /api/tasks/:id` | 任务队列(Bearer 鉴权,P4-1) |
|
|
148
|
+
| `POST/GET /api/webhook` | webhook 调度入口注册/查询(P5-2) |
|
|
149
|
+
| `/api/...` 其它 | 需 `FH_WEB_TOKEN` Bearer(fail-closed,计时安全比较) |
|
|
150
|
+
|
|
151
|
+
**任务队列(P4-1/P6-4)**:状态机 queued→running→done|failed;并发上限(`FH_TASK_CONCURRENCY`);跨进程持久化(`FH_TASK_PERSIST_DIR`,每任务一文件原子写,重启恢复:queued 重新入队、running 僵尸标记 failed);webhook 状态回调(携带状态快照,修复 queued 丢失时序缺陷)。
|
|
152
|
+
|
|
153
|
+
**消息渠道(P5-6/O6)**:Telegram(`FH_CHANNEL_TELEGRAM_BOT_TOKEN`+`CHAT_ID`)与企业微信(`FH_CHANNEL_WECOM_KEY` 多 key)出站推送;出站白名单 `FH_CHANNEL_ALLOW`;入站签名校验工具 `verifyHmacSignature`(HMAC-SHA256 计时安全)/ `verifyWecomSignature`(企微 SHA1 排序)。
|
|
154
|
+
|
|
155
|
+
### 3.9 IDE 扩展(vscode-extension/)
|
|
156
|
+
|
|
157
|
+
薄壳设计(逻辑全在 CLI):`fhcode.run`(选区上下文注入 `<selection>`)、`fhcode.review`(`review --json` → 编辑器内联诊断 DiagnosticCollection + CodeAction 建议)、`fhcode.diff`(原生 diff 编辑器 HEAD↔工作区,`fhcode-head` scheme)、`fhcode.output`;配置 `binaryPath` / `offline` / `reviewOnSave`。
|
|
158
|
+
|
|
159
|
+
---
|
|
160
|
+
|
|
161
|
+
## 四、协议与规范
|
|
162
|
+
|
|
163
|
+
| 协议 | 说明 |
|
|
164
|
+
|------|------|
|
|
165
|
+
| 工具调用契约 | OpenAI 风格 `tool_calls`(name/arguments JSON),结果以 role=tool 回填(toolCallId 对应) |
|
|
166
|
+
| MCP | stdio 传输(NDJSON JSON-RPC 2.0):initialize → notifications/initialized → tools/list → tools/call;工具以 `<server>_<tool>` 前缀注册 |
|
|
167
|
+
| SKILL.md | open agent skills 兼容(frontmatter name/description + 正文,渐进式披露) |
|
|
168
|
+
| agentskills.io | discovery index 0.2.0:`$schema` 校验、skill-md/archive、digest `sha256:<hex>` |
|
|
169
|
+
| webhook | `POST {url}` JSON:`{event:'task.status', task:{...}, ts}`(状态快照) |
|
|
170
|
+
| 入站签名 | HMAC-SHA256(`sha256=<hex>` 头)或企微 SHA1 排序 |
|
|
171
|
+
| 检查点 | `<runId>.session.json`(完整对话/迭代/成本/touchedFiles),resume 续跑 |
|
|
172
|
+
|
|
173
|
+
---
|
|
174
|
+
|
|
175
|
+
## 五、安全设计
|
|
176
|
+
|
|
177
|
+
1. **纵深防御**:沙箱(技术边界)→ hooks(确定性控制)→ RBAC 策略(权限)→ 审计(留痕)→ 配额(成本)
|
|
178
|
+
2. **沙箱**:四档 + 网络域名规则(deny 全模式生效、allow 未命中即拦截);`container` 档 Docker 隔离
|
|
179
|
+
3. **命令防护**:run_shell 注入元字符拦截(`[;&|`$(){}<>!]` 等);受管命令(run_tests/build_check)仅允许包管理器脚本
|
|
180
|
+
4. **路径安全**:`safeJoin`(词法 + realpath 符号链接校验);策略 denyPaths 敏感路径黑名单(.env/.git/config/密钥等)
|
|
181
|
+
5. **审计**:哈希链不可篡改(verifyAudit 检 seq/prevHash/hash 自洽);写入前脱敏(SECRET_RE/Bearer/JWT/sk-)
|
|
182
|
+
6. **日志脱敏**:敏感 key 整值遮蔽 + 值形态(sk-/JWT/长令牌)遮蔽
|
|
183
|
+
7. **Web 鉴权**:Bearer token 计时安全比较(timingSafeEqual),fail-closed;body 限制 1MB
|
|
184
|
+
8. **入站安全**:webhook 签名校验(HMAC/企微),渠道白名单
|
|
185
|
+
9. **技能安全**:市场技能 digest 校验防投毒,tar.gz 路径穿越防护,SKILL.md 强制 name frontmatter
|
|
186
|
+
|
|
187
|
+
---
|
|
188
|
+
|
|
189
|
+
## 六、性能与质量基线(v0.5.0-b 实测)
|
|
190
|
+
|
|
191
|
+
| 指标 | 值 |
|
|
192
|
+
|------|----|
|
|
193
|
+
| 单元测试 | 164/164 全绿(16 模块 + 10 特性域) |
|
|
194
|
+
| 里程碑断言 | M4 41 · M6 29 · M7 12 · M8 27 · M9 25 = 134 全绿 |
|
|
195
|
+
| eval 跑分 | 10/10(场景 5 + 验收 5,真实产物验证,整体通过率 100%) |
|
|
196
|
+
| SWE-bench 加载器 | HF datasets-server / 镜像 / 缓存,mock 执行 + 报告 |
|
|
197
|
+
| 复杂度 | 676 函数,cc≥10 热点 52 个(核心决策函数保持,规则类已表驱动化) |
|
|
198
|
+
| 依赖 | 运行时仅 express + zod(零其它运行时依赖,离线可用) |
|
|
199
|
+
|
|
200
|
+
---
|
|
201
|
+
|
|
202
|
+
## 七、配置模型(铁律:一切配置来自环境变量,启动时校验,fail-fast)
|
|
203
|
+
|
|
204
|
+
优先级:`FH_PROVIDERS`(JSON)> `fhcode.config.json` > 单环境变量 `FH_MODEL_*`;安全类(deny 黑名单)为并集只能加严。完整清单见《配置参考》《部署说明书》。
|
|
205
|
+
|
|
206
|
+
---
|
|
207
|
+
|
|
208
|
+
## 八、版本与演进
|
|
209
|
+
|
|
210
|
+
- v0.4.0:P0-P5 全能力(流式/沙箱/MCP/Skills/插件/云队列/渠道/语义索引)
|
|
211
|
+
- v0.5.0(2026-08-17 正式发布):整合 IDE 深度集成首轮(review --json + 内联评审 + 上下文入参)、SWE-bench 基准接入(数据集加载 + mock 执行 + 报告)、eval 回归门禁、O6 入站签名校验与安全前置
|
|
212
|
+
- 规划 v0.5.0-c/d:容器化 SWE 执行 + 真实模型跑分、消息渠道入站调度(详见《规划_v0.5.0.md》)
|
|
213
|
+
|
|
214
|
+
---
|
|
215
|
+
|
|
216
|
+
*本说明书随版本持续更新,能力以源码与 `fhcode --help` 为准。*
|