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
|
@@ -0,0 +1,554 @@
|
|
|
1
|
+
# 飞虹 Code App 技术说明书(移动控制台)
|
|
2
|
+
|
|
3
|
+
**产品**:飞虹 Code 移动控制台(Android App + 移动版 H5)
|
|
4
|
+
**版本**:v1.0.0(APK)· 移动版 H5
|
|
5
|
+
**日期**:2026-08-23
|
|
6
|
+
**署名**:晋江市飞虹智科技企业管理有限公司 · 飞扬企源研发中心 · 负责人:吴赐虹
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## 目录
|
|
11
|
+
|
|
12
|
+
1. [系统架构总览](#一系统架构总览)
|
|
13
|
+
2. [技术栈](#二技术栈)
|
|
14
|
+
3. [服务器部署架构](#三服务器部署架构)
|
|
15
|
+
4. [安全模型](#四安全模型)
|
|
16
|
+
5. [移动版 H5 前端架构](#五移动版-h5-前端架构)
|
|
17
|
+
6. [Android 工程详解](#六android-工程详解)
|
|
18
|
+
7. [构建指南](#七构建指南)
|
|
19
|
+
8. [API 参考](#八api-参考)
|
|
20
|
+
9. [部署与运维指南](#九部署与运维指南)
|
|
21
|
+
10. [故障排查](#十故障排查)
|
|
22
|
+
11. [安全建议](#十一安全建议)
|
|
23
|
+
12. [版本记录](#十二版本记录)
|
|
24
|
+
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
## 一、系统架构总览
|
|
28
|
+
|
|
29
|
+
```
|
|
30
|
+
┌─────────────────────────────────────────────────────────┐
|
|
31
|
+
│ 手机端 │
|
|
32
|
+
│ ┌──────────────────┐ ┌───────────────────────────┐ │
|
|
33
|
+
│ │ Android App │ │ 手机浏览器 │ │
|
|
34
|
+
│ │ (WebView 套壳) │ │ https://www.jb.klai.top/m/│ │
|
|
35
|
+
│ └────────┬─────────┘ └─────────────┬─────────────┘ │
|
|
36
|
+
│ └──────────────┬─────────────┘ │
|
|
37
|
+
└──────────────────────────┼──────────────────────────────┘
|
|
38
|
+
│ HTTPS
|
|
39
|
+
┌──────────────────────────▼──────────────────────────────┐
|
|
40
|
+
│ 腾讯云服务器 111.229.190.132 │
|
|
41
|
+
│ ┌───────────────────────────────────────────────────┐ │
|
|
42
|
+
│ │ Nginx 1.28(宝塔面板) │ │
|
|
43
|
+
│ │ ├─ / 页面入口 → Basic Auth │ │
|
|
44
|
+
│ │ ├─ /m/ 移动版静态 → 无 Basic(无敏感数据)│ │
|
|
45
|
+
│ │ ├─ /api/auth/login → Basic Auth(防绕过) │ │
|
|
46
|
+
│ │ └─ /api/* 其余 API → Bearer fail-closed │ │
|
|
47
|
+
│ └───────────────┬───────────────────────────────────┘ │
|
|
48
|
+
│ │ 反代 127.0.0.1:18080 │
|
|
49
|
+
│ ┌───────────────▼───────────────────────────────────┐ │
|
|
50
|
+
│ │ Node.js v24 · PM2 进程 fhcode │ │
|
|
51
|
+
│ │ ├─ Express Web 服务(端口 18080) │ │
|
|
52
|
+
│ │ ├─ 任务队列(并发 2,持久化) │ │
|
|
53
|
+
│ │ ├─ Agent 执行器(模型推理/工具调用/自愈) │ │
|
|
54
|
+
│ │ └─ 数据目录 FH_HOME=/www/dk_project/fhcode/data │ │
|
|
55
|
+
│ └───────────────────────────────────────────────────┘ │
|
|
56
|
+
└─────────────────────────────────────────────────────────┘
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
**关键设计**:
|
|
60
|
+
|
|
61
|
+
- **单后端多端**:手机 App、移动版 H5、电脑 Web 控制台共享同一个后端服务与数据(任务/自动化/模板/模型配置实时互通)
|
|
62
|
+
- **移动版为静态壳**:`/m/` 是纯静态 HTML(无服务端渲染),业务全部通过同源 API 完成
|
|
63
|
+
- **同源免 CORS**:移动版页面与 API 同域(www.jb.klai.top),无跨域问题
|
|
64
|
+
|
|
65
|
+
---
|
|
66
|
+
|
|
67
|
+
## 二、技术栈
|
|
68
|
+
|
|
69
|
+
| 层 | 技术 | 版本 |
|
|
70
|
+
|----|------|------|
|
|
71
|
+
| 移动端 | Android WebView + Java | minSdk 26 / target 34 |
|
|
72
|
+
| 移动端构建 | Gradle + AGP | Gradle 8.7 / AGP 8.2.2 |
|
|
73
|
+
| 前端(移动版 H5) | 原生 HTML/CSS/JS 单文件 | - |
|
|
74
|
+
| 后端 | Node.js + Express | Node v24 / Express 4 |
|
|
75
|
+
| 后端语言 | TypeScript(编译为 CommonJS) | TS 5.9 |
|
|
76
|
+
| 进程管理 | PM2 | 6.x |
|
|
77
|
+
| 反向代理 | Nginx(宝塔面板) | 1.28 |
|
|
78
|
+
| 操作系统 | OpenCloudOS | 9.6 |
|
|
79
|
+
| 依赖 | express、zod | - |
|
|
80
|
+
|
|
81
|
+
---
|
|
82
|
+
|
|
83
|
+
## 三、服务器部署架构
|
|
84
|
+
|
|
85
|
+
### 3.1 目录结构
|
|
86
|
+
|
|
87
|
+
```
|
|
88
|
+
/www/dk_project/
|
|
89
|
+
├── fhcode/ # 后端服务(Node)
|
|
90
|
+
│ ├── cli/ # CLI 入口(serve 命令)
|
|
91
|
+
│ ├── web/ # Web 服务 + 静态资源(电脑 Web 控制台)
|
|
92
|
+
│ ├── enterprise/ # 企业级模块(审计/RBAC)
|
|
93
|
+
│ ├── node_modules/ # 生产依赖(express/zod)
|
|
94
|
+
│ ├── data/ # FH_HOME 数据目录
|
|
95
|
+
│ │ ├── models.json # 大模型配置
|
|
96
|
+
│ │ ├── automations.json # 快捷指令
|
|
97
|
+
│ │ ├── templates.json # 用户模板
|
|
98
|
+
│ │ ├── tasks/ # 任务持久化
|
|
99
|
+
│ │ ├── tenants/ # 多租户审计
|
|
100
|
+
│ │ └── skills/ # 已安装技能
|
|
101
|
+
│ ├── .htpasswd # Basic Auth 凭据文件(www:www 640)
|
|
102
|
+
│ ├── .ba_cred # Basic Auth 明文凭据备份(root 600)
|
|
103
|
+
│ └── .fh_token # FH_WEB_TOKEN(root 600)
|
|
104
|
+
├── fhcode-mobile/ # 移动版 H5 静态目录
|
|
105
|
+
│ ├── index.html # 移动控制台单页
|
|
106
|
+
│ └── fhcode-v1.0.0.apk # Android 安装包
|
|
107
|
+
└── (其他既有站点)
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
### 3.2 Nginx 配置要点
|
|
111
|
+
|
|
112
|
+
站点配置文件:`/www/server/panel/vhost/nginx/www.jb.klai.top.conf`
|
|
113
|
+
|
|
114
|
+
```nginx
|
|
115
|
+
# HTTP → HTTPS 跳转
|
|
116
|
+
server {
|
|
117
|
+
listen 80;
|
|
118
|
+
server_name www.jb.klai.top;
|
|
119
|
+
return 301 https://$host$request_uri;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
server {
|
|
123
|
+
listen 443 ssl;
|
|
124
|
+
server_name www.jb.klai.top;
|
|
125
|
+
ssl_certificate /www/server/panel/vhost/cert/www.jb.klai.top/fullchain.pem;
|
|
126
|
+
ssl_certificate_key /www/server/panel/vhost/cert/www.jb.klai.top/privkey.pem;
|
|
127
|
+
|
|
128
|
+
# 移动版静态入口(无 Basic Auth,页面无敏感数据)
|
|
129
|
+
location /m/ {
|
|
130
|
+
alias /www/dk_project/fhcode-mobile/;
|
|
131
|
+
index index.html;
|
|
132
|
+
add_header Cache-Control "no-cache";
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
# 登录接口:Basic Auth 防绕过
|
|
136
|
+
location = /api/auth/login {
|
|
137
|
+
auth_basic "fhcode Web Console";
|
|
138
|
+
auth_basic_user_file /www/dk_project/fhcode/.htpasswd;
|
|
139
|
+
proxy_pass http://127.0.0.1:18080;
|
|
140
|
+
proxy_set_header Host $host;
|
|
141
|
+
proxy_set_header X-Real-IP $remote_addr;
|
|
142
|
+
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
|
143
|
+
proxy_set_header X-Forwarded-Proto $scheme;
|
|
144
|
+
client_max_body_size 20m;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
# 其余 API:Bearer 校验(fhcode fail-closed)
|
|
148
|
+
location /api/ {
|
|
149
|
+
proxy_pass http://127.0.0.1:18080;
|
|
150
|
+
proxy_http_version 1.1;
|
|
151
|
+
proxy_set_header Host $host;
|
|
152
|
+
proxy_set_header Upgrade $http_upgrade;
|
|
153
|
+
proxy_set_header Connection "upgrade";
|
|
154
|
+
proxy_read_timeout 600s;
|
|
155
|
+
proxy_buffering off;
|
|
156
|
+
client_max_body_size 20m;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
# 页面入口:Basic Auth
|
|
160
|
+
location / {
|
|
161
|
+
auth_basic "fhcode Web Console";
|
|
162
|
+
auth_basic_user_file /www/dk_project/fhcode/.htpasswd;
|
|
163
|
+
proxy_pass http://127.0.0.1:18080;
|
|
164
|
+
...(同上 proxy 配置)...
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
### 3.3 PM2 进程
|
|
170
|
+
|
|
171
|
+
```
|
|
172
|
+
PM2 name: fhcode
|
|
173
|
+
命令: FH_WEB_PORT=18080 FH_HOME=/www/dk_project/fhcode/data FH_WEB_TOKEN=<token> \
|
|
174
|
+
pm2 start cli/index.js -- serve --node-args="--max-old-space-size=256"
|
|
175
|
+
端口: 18080(内网监听,Nginx 反代)
|
|
176
|
+
内存: 限制堆 256MB(服务器总内存 1.9G,需控制)
|
|
177
|
+
开机自启: pm2 startup + pm2 save 已配置(systemd)
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
---
|
|
181
|
+
|
|
182
|
+
## 四、安全模型
|
|
183
|
+
|
|
184
|
+
### 4.1 三层鉴权设计
|
|
185
|
+
|
|
186
|
+
```
|
|
187
|
+
请求 → Nginx 路由
|
|
188
|
+
├─ /m/ 静态页面 → 直接放行(仅 UI,无敏感数据)
|
|
189
|
+
├─ /api/auth/login → Basic Auth(Nginx 校验 .htpasswd)→ 后端签发会话 token
|
|
190
|
+
├─ /api/* → 无 Basic,由后端 Bearer 校验(未授权 401)
|
|
191
|
+
└─ / → Basic Auth(电脑 Web 控制台页面)
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
### 4.2 鉴权流程(移动端)
|
|
195
|
+
|
|
196
|
+
```
|
|
197
|
+
1. App 打开 https://www.jb.klai.top/m/(静态页面,无鉴权要求)
|
|
198
|
+
2. 用户输入手机号 → 前端 fetch POST /api/auth/login
|
|
199
|
+
携带内置 Basic 凭据头:Authorization: Basic <base64(fhcode:密码)>
|
|
200
|
+
→ Nginx 校验通过 → 后端返回 { token: <会话令牌> }
|
|
201
|
+
3. 前端将 token 存 localStorage(键 fh.m.token)
|
|
202
|
+
4. 后续所有 API 请求携带:Authorization: Bearer <会话令牌>
|
|
203
|
+
→ Nginx 放行(/api/ 无 Basic 要求)→ 后端校验 Bearer(fail-closed)
|
|
204
|
+
5. 会话过期(401 unauthorized)→ 清 token → 回登录页
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
### 4.3 为什么这么设计
|
|
208
|
+
|
|
209
|
+
- **浏览器双 Authorization 头冲突**:浏览器登录后 fetch 显式携带 `Authorization: Bearer` 会覆盖浏览器自动附加的 Basic 头;若 /api/ 也要求 Basic,会因双头或覆盖导致 400/401。因此**业务 API 不依赖 Basic**,只依赖 Bearer。
|
|
210
|
+
- **登录接口单独保护**:若 /api/auth/login 无 Basic,攻击者可任意调用换取会话 token 绕过保护,故单独加 Basic Auth。
|
|
211
|
+
- **移动版页面不设 Basic**:/m/ 页面仅 UI 空壳(登录页),无业务数据,不设保护;真正的数据访问全部经 Bearer 校验。
|
|
212
|
+
|
|
213
|
+
### 4.4 凭据清单
|
|
214
|
+
|
|
215
|
+
| 凭据 | 位置 | 用途 |
|
|
216
|
+
|------|------|------|
|
|
217
|
+
| Basic Auth 账号密码 | /www/dk_project/fhcode/.htpasswd(.ba_cred 备份) | Nginx 层页面/登录保护;App 内置 |
|
|
218
|
+
| FH_WEB_TOKEN(主令牌) | /www/dk_project/fhcode/.fh_token | API Bearer 主令牌(服务端启动注入) |
|
|
219
|
+
| 会话 token | 后端内存 SessionStore + web-sessions.json | 登录后签发,API 调用鉴权 |
|
|
220
|
+
|
|
221
|
+
---
|
|
222
|
+
|
|
223
|
+
## 五、移动版 H5 前端架构
|
|
224
|
+
|
|
225
|
+
### 5.1 文件
|
|
226
|
+
|
|
227
|
+
```
|
|
228
|
+
app-mobile/index.html # 单文件应用(HTML + CSS + JS 内联,约 50KB)
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
### 5.2 结构
|
|
232
|
+
|
|
233
|
+
- **页面**(.page 容器,通过 .active 切换):登录页、对话页、任务页、自动化页、模板页、我的页
|
|
234
|
+
- **底部 Tab**:5 个导航(对话/任务/自动化/模板/我的)
|
|
235
|
+
- **弹层**(.sheet-mask):用户菜单、新建任务、自动化表单、模型配置、权限设置、任务详情
|
|
236
|
+
- **全局组件**:Toast 提示、状态徽章、开关组件
|
|
237
|
+
|
|
238
|
+
### 5.3 状态管理
|
|
239
|
+
|
|
240
|
+
```javascript
|
|
241
|
+
var state = {
|
|
242
|
+
token: '', // 会话令牌(localStorage: fh.m.token)
|
|
243
|
+
tasks: [], // 任务列表
|
|
244
|
+
currentTaskId: null, // 当前选中任务
|
|
245
|
+
automations: [], // 快捷指令
|
|
246
|
+
models: [], // 模型配置
|
|
247
|
+
permissions: {...}, // 权限(localStorage: fh.m.perm)
|
|
248
|
+
...
|
|
249
|
+
};
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
所有状态存于内存 + 关键项持久化 localStorage(token/phone/model/perm/theme)。
|
|
253
|
+
|
|
254
|
+
### 5.4 API 封装
|
|
255
|
+
|
|
256
|
+
```javascript
|
|
257
|
+
function api(path, method, body, extra) {
|
|
258
|
+
var headers = { 'Content-Type': 'application/json' };
|
|
259
|
+
if (extra && extra.basic) headers['Authorization'] = 'Basic ' + BASIC_AUTH;
|
|
260
|
+
else if (state.token) headers['Authorization'] = 'Bearer ' + state.token;
|
|
261
|
+
...
|
|
262
|
+
}
|
|
263
|
+
```
|
|
264
|
+
|
|
265
|
+
- 登录请求带 `{ basic: true }` → 附加内置 Basic 头
|
|
266
|
+
- 其余请求自动带 Bearer
|
|
267
|
+
- 401 统一处理:清 token → 回登录页
|
|
268
|
+
|
|
269
|
+
### 5.5 轮询机制
|
|
270
|
+
|
|
271
|
+
登录后每 5 秒轮询 `/api/tasks`,自动刷新任务状态与思维链路(简单可靠,无需 WebSocket)。
|
|
272
|
+
|
|
273
|
+
---
|
|
274
|
+
|
|
275
|
+
## 六、Android 工程详解
|
|
276
|
+
|
|
277
|
+
### 6.1 目录结构
|
|
278
|
+
|
|
279
|
+
```
|
|
280
|
+
fhcode-android/
|
|
281
|
+
├── build.gradle # 根构建(AGP 8.2.2 + 阿里云镜像)
|
|
282
|
+
├── settings.gradle # 工程设置(include ':app')
|
|
283
|
+
├── gradle.properties # JVM 参数 + android.overridePathCheck=true
|
|
284
|
+
├── local.properties # sdk.dir(本地,不入库)
|
|
285
|
+
└── app/
|
|
286
|
+
├── build.gradle # app 模块(compileSdk 34 / minSdk 26)
|
|
287
|
+
└── src/main/
|
|
288
|
+
├── AndroidManifest.xml
|
|
289
|
+
├── java/com/fhcode/app/MainActivity.java
|
|
290
|
+
└── res/
|
|
291
|
+
├── values/ # strings/themes/colors
|
|
292
|
+
├── drawable/ # ic_launcher_foreground.xml(矢量图标前景)
|
|
293
|
+
└── mipmap-anydpi-v26/ # ic_launcher.xml(自适应图标)
|
|
294
|
+
```
|
|
295
|
+
|
|
296
|
+
### 6.2 MainActivity 核心逻辑
|
|
297
|
+
|
|
298
|
+
```java
|
|
299
|
+
public class MainActivity extends Activity {
|
|
300
|
+
private static final String START_URL = "https://www.jb.klai.top/m/";
|
|
301
|
+
|
|
302
|
+
onCreate():
|
|
303
|
+
1. 构建根布局:WebView + 顶部水平进度条
|
|
304
|
+
2. WebSettings 配置:
|
|
305
|
+
- setJavaScriptEnabled(true)
|
|
306
|
+
- setDomStorageEnabled(true) // localStorage 存 token
|
|
307
|
+
- setMixedContentMode(NEVER_ALLOW)
|
|
308
|
+
- setUserAgentString(... + " fhcode-app/1.0.0")
|
|
309
|
+
3. WebViewClient:
|
|
310
|
+
- shouldOverrideUrlLoading:站内链接保留;外部链接(非 jb.klai.top/github)
|
|
311
|
+
交给系统浏览器 Intent
|
|
312
|
+
- onPageStarted/Finished:控制进度条
|
|
313
|
+
4. 加载 START_URL
|
|
314
|
+
|
|
315
|
+
onKeyDown(): 返回键优先 WebView 后退
|
|
316
|
+
onPause/onResume/onDestroy(): WebView 生命周期同步
|
|
317
|
+
}
|
|
318
|
+
```
|
|
319
|
+
|
|
320
|
+
### 6.3 关键设计决策
|
|
321
|
+
|
|
322
|
+
- **WebView 加载远程页面而非本地打包**:页面与 API 同源,无 CORS;页面更新无需重新发版 APK
|
|
323
|
+
- **无需处理 Basic Auth 弹窗**:`/m/` 页面不要求 Basic;登录 API 的 Basic 由页面 JS 内置处理(`onReceivedHttpAuthRequest` 无需实现)
|
|
324
|
+
- **自适应图标**:minSdk 26 起用 adaptive icon(矢量前景 + 纯色背景),免 PNG 资源
|
|
325
|
+
- **外链跳系统浏览器**:避免 App 内 WebView 打开第三方页面
|
|
326
|
+
|
|
327
|
+
---
|
|
328
|
+
|
|
329
|
+
## 七、构建指南
|
|
330
|
+
|
|
331
|
+
### 7.1 环境要求
|
|
332
|
+
|
|
333
|
+
| 组件 | 版本 | 备注 |
|
|
334
|
+
|------|------|------|
|
|
335
|
+
| JDK | 17(Microsoft Build) | JAVA_HOME 指向 |
|
|
336
|
+
| Android SDK | platform 34 + build-tools 34 | ANDROID_HOME 指向 |
|
|
337
|
+
| Gradle | 8.7 | 已解压至 C:/Users/Administrator/.workbuddy/tools/gradle-8.7 |
|
|
338
|
+
|
|
339
|
+
### 7.2 构建命令
|
|
340
|
+
|
|
341
|
+
```bash
|
|
342
|
+
cd fhcode-android
|
|
343
|
+
export JAVA_HOME="C:/Program Files/Microsoft/jdk-17.0.12.7-hotspot"
|
|
344
|
+
export ANDROID_HOME="C:/Users/Administrator/AppData/Local/Android/Sdk"
|
|
345
|
+
"C:/Users/Administrator/.workbuddy/tools/gradle-8.7/bin/gradle.bat" assembleDebug --no-daemon
|
|
346
|
+
```
|
|
347
|
+
|
|
348
|
+
产物:`app/build/outputs/apk/debug/app-debug.apk`
|
|
349
|
+
|
|
350
|
+
Release 构建:`gradle assembleRelease`(当前 release 也使用 debug 签名,正式发布需配置独立 keystore)。
|
|
351
|
+
|
|
352
|
+
### 7.3 镜像配置(国内构建必需)
|
|
353
|
+
|
|
354
|
+
- **Gradle 发行版**:腾讯云镜像 `https://mirrors.cloud.tencent.com/gradle/gradle-8.7-bin.zip`(官方源 178B/s 不可用)
|
|
355
|
+
- **Maven 依赖**:build.gradle repositories 已配置阿里云镜像(google/central/gradle-plugin),官方 repo.maven.apache.org 不可达
|
|
356
|
+
|
|
357
|
+
### 7.4 踩坑记录
|
|
358
|
+
|
|
359
|
+
| 问题 | 原因 | 解决 |
|
|
360
|
+
|------|------|------|
|
|
361
|
+
| 依赖解析失败 | repo.maven.apache.org 国内不可达 | 阿里云镜像 |
|
|
362
|
+
| 项目路径含中文报错 | AGP 拒绝非 ASCII 路径 | gradle.properties 加 `android.overridePathCheck=true` |
|
|
363
|
+
| 官方 Gradle 下载极慢 | 国外 CDN | 腾讯云镜像 |
|
|
364
|
+
|
|
365
|
+
---
|
|
366
|
+
|
|
367
|
+
## 八、API 参考
|
|
368
|
+
|
|
369
|
+
> 基础路径:`https://www.jb.klai.top/api`(移动版与 Web 版共用)
|
|
370
|
+
> 鉴权:除标注外均需 `Authorization: Bearer <token>`;登录接口需 Basic Auth
|
|
371
|
+
|
|
372
|
+
### 8.1 认证
|
|
373
|
+
|
|
374
|
+
| 方法 | 路径 | 鉴权 | 说明 |
|
|
375
|
+
|------|------|------|------|
|
|
376
|
+
| POST | /api/auth/login | Basic Auth | 手机号登录,body: `{phone}`,返回 `{token, phone}` |
|
|
377
|
+
| GET | /api/auth/me | Bearer | 当前会话用户 |
|
|
378
|
+
|
|
379
|
+
### 8.2 任务
|
|
380
|
+
|
|
381
|
+
| 方法 | 路径 | 说明 |
|
|
382
|
+
|------|------|------|
|
|
383
|
+
| POST | /api/tasks | 创建任务,body: `{goal, agentType?, permissions?, workspaceDir?, modelId?}` |
|
|
384
|
+
| GET | /api/tasks | 任务列表(不含 steps/conversation) |
|
|
385
|
+
| GET | /api/tasks/:id | 任务详情(含思维链路 steps + 对话 conversation) |
|
|
386
|
+
| POST | /api/tasks/:id/messages | 多轮续接,body: `{message}`(执行中返回 409) |
|
|
387
|
+
| DELETE | /api/tasks/:id | 删除任务(运行中返回 400) |
|
|
388
|
+
|
|
389
|
+
### 8.3 自动化
|
|
390
|
+
|
|
391
|
+
| 方法 | 路径 | 说明 |
|
|
392
|
+
|------|------|------|
|
|
393
|
+
| GET | /api/automations | 快捷指令列表 |
|
|
394
|
+
| POST | /api/automations | 新建,body: `{name, goal}` |
|
|
395
|
+
| POST | /api/automations/:id/run | 一键运行 |
|
|
396
|
+
| DELETE | /api/automations/:id | 删除 |
|
|
397
|
+
|
|
398
|
+
### 8.4 模板
|
|
399
|
+
|
|
400
|
+
| 方法 | 路径 | 说明 |
|
|
401
|
+
|------|------|------|
|
|
402
|
+
| GET | /api/templates | 返回 `{builtin[], user[]}` |
|
|
403
|
+
| POST | /api/templates | 新建,body: `{title, goal, category?}` |
|
|
404
|
+
| DELETE | /api/templates/:id | 删除用户模板 |
|
|
405
|
+
|
|
406
|
+
### 8.5 大模型
|
|
407
|
+
|
|
408
|
+
| 方法 | 路径 | 说明 |
|
|
409
|
+
|------|------|------|
|
|
410
|
+
| GET | /api/models | 模型列表 + defaultId |
|
|
411
|
+
| POST | /api/models | 保存/更新,body: `{id?, name, apiBase?, apiKey?, reasoning?}` |
|
|
412
|
+
| POST | /api/models/:id/default | 设为默认 |
|
|
413
|
+
| DELETE | /api/models/:id | 删除 |
|
|
414
|
+
|
|
415
|
+
### 8.6 其他
|
|
416
|
+
|
|
417
|
+
| 方法 | 路径 | 说明 |
|
|
418
|
+
|------|------|------|
|
|
419
|
+
| GET | /api/drives | 服务器磁盘驱动器列表 |
|
|
420
|
+
| GET | /api/workspace | 当前工作区 |
|
|
421
|
+
| POST | /api/workspace | 切换工作区,body: `{cwd}` |
|
|
422
|
+
| GET | /api/workspace/list?path= | 目录浏览 |
|
|
423
|
+
| POST | /api/files/read | 读文件,body: `{path}`(≤2MB) |
|
|
424
|
+
| POST | /api/upload | 上传,body: `{name, mime, dataBase64}` |
|
|
425
|
+
| GET | /api/skills/market?source=&q= | 插件市场 |
|
|
426
|
+
| GET | /api/skills/installed | 已安装技能 |
|
|
427
|
+
| POST | /api/skills/install | 安装技能 |
|
|
428
|
+
| GET | /api/office/capabilities | 办公助理能力 |
|
|
429
|
+
| GET | /api/memory/stats / short / long / history | 记忆系统 |
|
|
430
|
+
| POST | /api/memory/summarize | 触发记忆总结 |
|
|
431
|
+
| GET | /api/health | 健康检查(公开) |
|
|
432
|
+
|
|
433
|
+
### 8.7 任务状态机
|
|
434
|
+
|
|
435
|
+
```
|
|
436
|
+
queued(排队中)→ running(执行中)→ done(已完成)
|
|
437
|
+
↘ failed(失败)
|
|
438
|
+
```
|
|
439
|
+
|
|
440
|
+
---
|
|
441
|
+
|
|
442
|
+
## 九、部署与运维指南
|
|
443
|
+
|
|
444
|
+
### 9.1 服务管理(PM2)
|
|
445
|
+
|
|
446
|
+
```bash
|
|
447
|
+
pm2 status fhcode # 查看状态
|
|
448
|
+
pm2 logs fhcode # 查看日志(--lines 50 --nostream)
|
|
449
|
+
pm2 restart fhcode # 重启
|
|
450
|
+
pm2 stop fhcode # 停止
|
|
451
|
+
pm2 delete fhcode # 删除进程
|
|
452
|
+
pm2 save # 保存进程列表(开机自启)
|
|
453
|
+
```
|
|
454
|
+
|
|
455
|
+
### 9.2 更新后端(代码部署)
|
|
456
|
+
|
|
457
|
+
```bash
|
|
458
|
+
# 本地
|
|
459
|
+
tsc -p tsconfig.json --outDir dist_tmp # 编译(dist 被锁时用临时目录)
|
|
460
|
+
# 同步 dist_tmp → dist(被锁文件跳过)
|
|
461
|
+
# 打包并上传
|
|
462
|
+
tar -czf fhcode-deploy.tar.gz -C deploy_pkg .
|
|
463
|
+
scp fhcode-deploy.tar.gz root@111.229.190.132:/tmp/
|
|
464
|
+
# 服务器
|
|
465
|
+
cd /www/dk_project/fhcode && tar -xzf /tmp/fhcode-deploy.tar.gz
|
|
466
|
+
npm install --omit=dev --no-audit --no-fund
|
|
467
|
+
pm2 restart fhcode
|
|
468
|
+
```
|
|
469
|
+
|
|
470
|
+
### 9.3 更新移动版 H5 / APK
|
|
471
|
+
|
|
472
|
+
```bash
|
|
473
|
+
scp app-mobile/index.html root@111.229.190.132:/www/dk_project/fhcode-mobile/
|
|
474
|
+
scp fhcode-v1.0.0.apk root@111.229.190.132:/www/dk_project/fhcode-mobile/
|
|
475
|
+
```
|
|
476
|
+
|
|
477
|
+
### 9.4 数据备份
|
|
478
|
+
|
|
479
|
+
```bash
|
|
480
|
+
# 备份数据目录(模型配置/任务/审计等)
|
|
481
|
+
tar -czf /backup/fhcode-data-$(date +%Y%m%d).tar.gz /www/dk_project/fhcode/data
|
|
482
|
+
# 备份 Nginx 配置
|
|
483
|
+
cp /www/server/panel/vhost/nginx/www.jb.klai.top.conf /backup/
|
|
484
|
+
```
|
|
485
|
+
|
|
486
|
+
### 9.5 资源监控
|
|
487
|
+
|
|
488
|
+
```bash
|
|
489
|
+
pm2 monit fhcode # 实时资源监控
|
|
490
|
+
free -h # 服务器内存(1.9G 总量,注意余量)
|
|
491
|
+
df -h / # 磁盘
|
|
492
|
+
```
|
|
493
|
+
|
|
494
|
+
---
|
|
495
|
+
|
|
496
|
+
## 十、故障排查
|
|
497
|
+
|
|
498
|
+
### 10.1 服务 500 / 无响应
|
|
499
|
+
|
|
500
|
+
```bash
|
|
501
|
+
curl -s http://127.0.0.1:18080/api/health # 后端直连
|
|
502
|
+
pm2 logs fhcode --lines 50 --nostream # 查看错误
|
|
503
|
+
```
|
|
504
|
+
|
|
505
|
+
若 PM2 进程崩溃:检查内存(`free -h`),确认 `--max-old-space-size=256` 生效;重启 `pm2 restart fhcode`。
|
|
506
|
+
|
|
507
|
+
### 10.2 任务执行失败
|
|
508
|
+
|
|
509
|
+
1. 服务器**未配置大模型** → Web 界面「大模型设置」添加(最常见)
|
|
510
|
+
2. 查看任务详情中的 error 字段
|
|
511
|
+
3. 检查 PM2 日志中的 `task failed` 记录
|
|
512
|
+
|
|
513
|
+
### 10.3 登录失败 / 401
|
|
514
|
+
|
|
515
|
+
- 页面 401:Basic Auth 凭据错误 → 检查 .htpasswd 与 Nginx 配置
|
|
516
|
+
- API 401:token 过期 → 重新登录
|
|
517
|
+
- Nginx 500:.htpasswd 权限不足 → `chown www:www` + 640
|
|
518
|
+
|
|
519
|
+
### 10.4 Nginx 配置修改后
|
|
520
|
+
|
|
521
|
+
```bash
|
|
522
|
+
nginx -t && nginx -s reload
|
|
523
|
+
```
|
|
524
|
+
|
|
525
|
+
### 10.5 Windows 本机文件锁(开发期)
|
|
526
|
+
|
|
527
|
+
- dist/ 编译产物被 IDE/Defender 锁 → `tsc --outDir dist_tmp` 绕行
|
|
528
|
+
- 残留 280MB+ node 进程(tsc)→ `tasklist | grep node` 后逐个 kill
|
|
529
|
+
|
|
530
|
+
---
|
|
531
|
+
|
|
532
|
+
## 十一、安全建议
|
|
533
|
+
|
|
534
|
+
1. **更换默认凭据**:正式启用后建议重新生成 Basic Auth 密码(htpasswd -cb 覆盖 .htpasswd,同步更新 App 内 `BASIC_AUTH` 常量后重新打包 APK)
|
|
535
|
+
2. **Release 签名**:正式分发前生成独立 keystore 并配置 signingConfigs.release
|
|
536
|
+
3. **App 内置凭据说明**:APK 内嵌 Basic 凭据可被逆向提取(`Zmhjb2RlOnZyVktTQm1IUkVCZQ==` = base64(fhcode:密码));如需更高安全,可改为独立 App 专用账号或加设备校验
|
|
537
|
+
4. **最小权限**:建议保持默认权限(写入/命令关闭),按需开启
|
|
538
|
+
5. **HTTPS**:已全站 HTTPS(宝塔证书),无明文传输
|
|
539
|
+
6. **服务器安全组**:18080 为内网端口,仅 Nginx(80/443) 对外;无需开放其他端口
|
|
540
|
+
7. **密钥轮换**:FH_WEB_TOKEN 在 .fh_token,更换后重启服务生效
|
|
541
|
+
|
|
542
|
+
---
|
|
543
|
+
|
|
544
|
+
## 十二、版本记录
|
|
545
|
+
|
|
546
|
+
| 版本 | 变更 | 日期 |
|
|
547
|
+
|------|------|------|
|
|
548
|
+
| v1.0.0 | 移动控制台首发:Android APK + 移动版 H5 + 服务器 /m/ 入口 | 2026-08-23 |
|
|
549
|
+
|
|
550
|
+
---
|
|
551
|
+
|
|
552
|
+
**维护**:晋江市飞虹智科技企业管理有限公司 · 飞扬企源研发中心 · 负责人:吴赐虹
|
|
553
|
+
|
|
554
|
+
*© 2026 晋江市飞虹智科技企业管理有限公司 · 飞扬企源研发中心 · 保留所有权利*
|