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.
Files changed (180) hide show
  1. package/.github/FUNDING.yml +4 -0
  2. package/.github/ISSUE_TEMPLATE/bug_report.md +37 -37
  3. package/.github/ISSUE_TEMPLATE/config.yml +14 -14
  4. package/.github/ISSUE_TEMPLATE/feature_request.md +28 -28
  5. package/.github/PULL_REQUEST_TEMPLATE.md +46 -46
  6. package/.github/SECURITY.md +67 -67
  7. package/.github/dependabot.yml +16 -0
  8. package/.github/workflows/ci.yml +1 -1
  9. package/AGENT-GUIDE.md +382 -237
  10. package/CHANGELOG.md +392 -0
  11. package/CODE_OF_CONDUCT.md +56 -56
  12. package/CONTRIBUTING.md +68 -68
  13. package/LICENSE +22 -22
  14. package/README.md +586 -522
  15. package/README.self-evolve.md +274 -0
  16. package/dist/agent/code-review.js +2 -0
  17. package/dist/agent/code-review.js.map +1 -1
  18. package/dist/agent/code-writer.js +74 -18
  19. package/dist/agent/code-writer.js.map +1 -1
  20. package/dist/agent/context-compactor.js +13 -4
  21. package/dist/agent/context-compactor.js.map +1 -1
  22. package/dist/agent/experience.js +319 -84
  23. package/dist/agent/experience.js.map +1 -1
  24. package/dist/agent/orchestrator.js +233 -71
  25. package/dist/agent/orchestrator.js.map +1 -1
  26. package/dist/agent/planner.js +30 -7
  27. package/dist/agent/planner.js.map +1 -1
  28. package/dist/agent/prompts.js +9 -0
  29. package/dist/agent/prompts.js.map +1 -1
  30. package/dist/agent/quality-gate.js +10 -4
  31. package/dist/agent/quality-gate.js.map +1 -1
  32. package/dist/agent/repo-context.js +181 -0
  33. package/dist/agent/repo-context.js.map +1 -0
  34. package/dist/agent/repo-reader.js +92 -99
  35. package/dist/agent/repo-reader.js.map +1 -1
  36. package/dist/agent/self-heal.js +80 -60
  37. package/dist/agent/self-heal.js.map +1 -1
  38. package/dist/agent/self-improver.js +65 -61
  39. package/dist/agent/self-improver.js.map +1 -1
  40. package/dist/agent/subagent-summary.js +31 -0
  41. package/dist/agent/subagent-summary.js.map +1 -0
  42. package/dist/agent/subagent.js +52 -2
  43. package/dist/agent/subagent.js.map +1 -1
  44. package/dist/agent/symbol-index.js +160 -0
  45. package/dist/agent/symbol-index.js.map +1 -0
  46. package/dist/agent/team.js +193 -0
  47. package/dist/agent/team.js.map +1 -0
  48. package/dist/cli/commands.js +124 -143
  49. package/dist/cli/commands.js.map +1 -1
  50. package/dist/cli/index.js +113 -106
  51. package/dist/cli/index.js.map +1 -1
  52. package/dist/cli/repl.js +82 -7
  53. package/dist/cli/repl.js.map +1 -1
  54. package/dist/cli/run.js +600 -95
  55. package/dist/cli/run.js.map +1 -1
  56. package/dist/cli/tui.js +145 -0
  57. package/dist/cli/tui.js.map +1 -0
  58. package/dist/cli/version.js +1 -1
  59. package/dist/enterprise/audit.js +145 -23
  60. package/dist/enterprise/audit.js.map +1 -1
  61. package/dist/enterprise/index.js +14 -11
  62. package/dist/enterprise/index.js.map +1 -1
  63. package/dist/enterprise/policy.js +22 -10
  64. package/dist/enterprise/policy.js.map +1 -1
  65. package/dist/harness/executor.js +127 -0
  66. package/dist/harness/executor.js.map +1 -0
  67. package/dist/harness/harness.js +87 -0
  68. package/dist/harness/harness.js.map +1 -0
  69. package/dist/harness/index.js +31 -0
  70. package/dist/harness/index.js.map +1 -0
  71. package/dist/harness/loader.js +138 -0
  72. package/dist/harness/loader.js.map +1 -0
  73. package/dist/harness/reporter.js +34 -0
  74. package/dist/harness/reporter.js.map +1 -0
  75. package/dist/harness/types.js +10 -0
  76. package/dist/harness/types.js.map +1 -0
  77. package/dist/harness/verifier.js +48 -0
  78. package/dist/harness/verifier.js.map +1 -0
  79. package/dist/hello.js +14 -0
  80. package/dist/hello.js.map +1 -0
  81. package/dist/memory/auto-summarize.js +208 -0
  82. package/dist/memory/auto-summarize.js.map +1 -0
  83. package/dist/memory/index.js +228 -0
  84. package/dist/memory/index.js.map +1 -0
  85. package/dist/models/model-router.js +100 -27
  86. package/dist/models/model-router.js.map +1 -1
  87. package/dist/models/model.dto.js +25 -3
  88. package/dist/models/model.dto.js.map +1 -1
  89. package/dist/models/providers/ollama.provider.js +12 -0
  90. package/dist/models/providers/ollama.provider.js.map +1 -1
  91. package/dist/models/providers/openai-compatible.provider.js +14 -1
  92. package/dist/models/providers/openai-compatible.provider.js.map +1 -1
  93. package/dist/plugins/plugin-loader.js +179 -0
  94. package/dist/plugins/plugin-loader.js.map +1 -0
  95. package/dist/runtime/event-log.js.map +1 -1
  96. package/dist/runtime/hooks.js +80 -0
  97. package/dist/runtime/hooks.js.map +1 -0
  98. package/dist/self-evolve/hook.js +60 -0
  99. package/dist/self-evolve/hook.js.map +1 -0
  100. package/dist/self-evolve/hook.ts +80 -0
  101. package/dist/self-evolve/manager.d.ts +8 -0
  102. package/dist/self-evolve/manager.js +401 -0
  103. package/dist/shared/config.js +35 -3
  104. package/dist/shared/config.js.map +1 -1
  105. package/dist/shared/errors.js +6 -2
  106. package/dist/shared/errors.js.map +1 -1
  107. package/dist/shared/i18n.js +535 -0
  108. package/dist/shared/i18n.js.map +1 -0
  109. package/dist/shared/secure-store.js +117 -0
  110. package/dist/shared/secure-store.js.map +1 -0
  111. package/dist/skills/grill.js +2 -1
  112. package/dist/skills/grill.js.map +1 -1
  113. package/dist/skills/self-heal.js +73 -0
  114. package/dist/skills/self-heal.js.map +1 -0
  115. package/dist/skills/skill-loader.js +131 -0
  116. package/dist/skills/skill-loader.js.map +1 -0
  117. package/dist/skills/skill-market.js +195 -0
  118. package/dist/skills/skill-market.js.map +1 -0
  119. package/dist/tools/analysis/code-analyzer.js +45 -18
  120. package/dist/tools/analysis/code-analyzer.js.map +1 -1
  121. package/dist/tools/index.js +5 -0
  122. package/dist/tools/index.js.map +1 -1
  123. package/dist/tools/mcp/index.js +84 -0
  124. package/dist/tools/mcp/index.js.map +1 -0
  125. package/dist/tools/mcp/mcp-client.js +194 -0
  126. package/dist/tools/mcp/mcp-client.js.map +1 -0
  127. package/dist/tools/sandbox.js +126 -0
  128. package/dist/tools/sandbox.js.map +1 -0
  129. package/dist/tools/shell/exec.js +72 -3
  130. package/dist/tools/shell/exec.js.map +1 -1
  131. package/dist/tools/shell/run-shell.tool.js +37 -7
  132. package/dist/tools/shell/run-shell.tool.js.map +1 -1
  133. package/dist/tools/skills/load-skill.tool.js +36 -0
  134. package/dist/tools/skills/load-skill.tool.js.map +1 -0
  135. package/dist/tools/tool.interface.js.map +1 -1
  136. package/dist/tools/tool.registry.js +69 -1
  137. package/dist/tools/tool.registry.js.map +1 -1
  138. package/dist/tools/web/web.tool.js +139 -0
  139. package/dist/tools/web/web.tool.js.map +1 -0
  140. package/dist/web/auth.js +178 -3
  141. package/dist/web/auth.js.map +1 -1
  142. package/dist/web/channels.js +171 -0
  143. package/dist/web/channels.js.map +1 -0
  144. package/dist/web/public/css/style.css +1546 -0
  145. package/dist/web/public/index.html +804 -37
  146. package/dist/web/public/js/api.js +309 -0
  147. package/dist/web/public/js/app.js +1472 -0
  148. package/dist/web/public/js/ui.js +832 -0
  149. package/dist/web/public/js/utils.js +170 -0
  150. package/dist/web/server.js +937 -11
  151. package/dist/web/server.js.map +1 -1
  152. package/dist/web/task-queue.js +470 -0
  153. package/dist/web/task-queue.js.map +1 -0
  154. package/dist/web/web-config.js +143 -0
  155. package/dist/web/web-config.js.map +1 -0
  156. package/docs/App/344/275/277/347/224/250/350/257/264/346/230/216/344/271/246.md +299 -0
  157. package/docs/App/346/212/200/346/234/257/350/257/264/346/230/216/344/271/246.md +554 -0
  158. package/docs/Deployment_Guide_EN.md +288 -0
  159. package/docs/SELF-EVOLVE-GUIDE.md +313 -0
  160. package/docs/Technical_Manual_EN.md +216 -0
  161. package/docs/User_Manual_EN.md +314 -0
  162. package/docs/error-codes.md +198 -0
  163. package/docs/screenshots/cli-demo.png +0 -0
  164. package/docs/screenshots/feature-comparison.png +0 -0
  165. package/docs/screenshots/web-console.png +0 -0
  166. package/docs/self-evolve-implementation.md +165 -0
  167. package/docs/self-evolve.md +166 -0
  168. package/docs//344/272/247/345/223/201/345/274/200/345/217/221/346/226/207/346/241/243.md +614 -614
  169. 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
  170. package/docs//344/275/277/347/224/250/350/257/264/346/230/216/344/271/246.md +318 -358
  171. 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
  172. package/docs//346/212/200/346/234/257/350/257/264/346/230/216/344/271/246.md +216 -303
  173. package/docs//346/236/266/346/236/204/344/270/216API.md +238 -238
  174. package/docs//347/224/250/346/210/267/346/211/213/345/206/214.md +196 -196
  175. package/docs//351/203/250/347/275/262/346/214/207/345/215/227.md +165 -165
  176. package/docs//351/203/250/347/275/262/350/257/264/346/230/216/344/271/246.md +288 -0
  177. package/docs//351/205/215/347/275/256/345/217/202/350/200/203.md +127 -127
  178. 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
  179. package/package.json +108 -109
  180. 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 晋江市飞虹智科技企业管理有限公司 · 飞扬企源研发中心 · 保留所有权利*