feihong-code 7.2.0 → 7.5.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 (249) hide show
  1. package/.github/workflows/ci.yml +180 -140
  2. package/.github/workflows/release.yml +200 -173
  3. package/CHANGELOG.md +94 -115
  4. package/README.md +609 -586
  5. package/dist/agent/completion-engine.js +76 -45
  6. package/dist/agent/completion-engine.js.map +1 -1
  7. package/dist/agent/completion-postprocess.js +109 -0
  8. package/dist/agent/completion-postprocess.js.map +1 -0
  9. package/dist/agent/context-budget.js +121 -0
  10. package/dist/agent/context-budget.js.map +1 -0
  11. package/dist/agent/context-compactor.js +47 -0
  12. package/dist/agent/context-compactor.js.map +1 -1
  13. package/dist/agent/custom-agent.js +52 -52
  14. package/dist/agent/design-to-code.js +40 -40
  15. package/dist/agent/lint.js +121 -0
  16. package/dist/agent/lint.js.map +1 -0
  17. package/dist/agent/multi-agent.js +44 -44
  18. package/dist/agent/orchestrator.js +20 -20
  19. package/dist/agent/prompts.js +54 -54
  20. package/dist/agent/self-correction.js +24 -24
  21. package/dist/agent/self-heal.js +27 -27
  22. package/dist/cli/commands.js +9 -0
  23. package/dist/cli/commands.js.map +1 -1
  24. package/dist/cli/index.js +9 -0
  25. package/dist/cli/index.js.map +1 -1
  26. package/dist/cli/multi-pane-tui.js +217 -0
  27. package/dist/cli/multi-pane-tui.js.map +1 -0
  28. package/dist/cli/run.js +129 -40
  29. package/dist/cli/run.js.map +1 -1
  30. package/dist/cli/tui-run.js +79 -0
  31. package/dist/cli/tui-run.js.map +1 -0
  32. package/dist/cli/tui.js.map +1 -1
  33. package/dist/cli/version.js +1 -1
  34. package/dist/lsp/lsp-client.js +183 -0
  35. package/dist/lsp/lsp-client.js.map +1 -0
  36. package/dist/lsp/lsp-service.js +159 -0
  37. package/dist/lsp/lsp-service.js.map +1 -0
  38. package/dist/plugins/manager.js +50 -2
  39. package/dist/plugins/manager.js.map +1 -1
  40. package/dist/shared/i18n.js +108 -100
  41. package/dist/shared/i18n.js.map +1 -1
  42. package/dist/tools/generator/code-generator.js +40 -40
  43. package/dist/tools/generator/test-generator.js +9 -9
  44. package/dist/tools/shell/exec.js +23 -1
  45. package/dist/tools/shell/exec.js.map +1 -1
  46. package/dist/web/extra-apis.js +440 -0
  47. package/dist/web/extra-apis.js.map +1 -0
  48. package/dist/web/public/css/style.css +1715 -1715
  49. package/dist/web/public/index.html +1242 -1200
  50. package/dist/web/public/js/api.js +555 -496
  51. package/dist/web/public/js/app.js +2210 -2210
  52. package/dist/web/public/js/mock-api.js +234 -234
  53. package/dist/web/public/js/monaco-editor.js +363 -203
  54. package/dist/web/public/js/ui.js +2251 -1981
  55. package/dist/web/public/js/utils.js +214 -214
  56. package/dist/web/public/manifest.json +59 -59
  57. package/dist/web/public/service-worker.js +173 -173
  58. package/dist/web/server.js +97 -45
  59. package/dist/web/server.js.map +1 -1
  60. package/docs/BENCHMARK_REPORT_en.md +386 -329
  61. package/docs/BENCHMARK_REPORT_zh.md +386 -329
  62. package/docs/DPA.md +63 -0
  63. package/docs/DPA/346/225/260/346/215/256/345/244/204/347/220/206/345/215/217/350/256/256/346/250/241/346/235/277_v1.0.md +67 -0
  64. package/docs/SECURITY_WHITEPAPER.md +74 -0
  65. package/docs/SWE_BENCH_REPORT.md +55 -0
  66. package/docs/TECHNICAL_SPEC_en.md +292 -292
  67. package/docs/TECHNICAL_SPEC_zh.md +292 -292
  68. package/docs/UPDATE_NOTES_en.md +159 -159
  69. package/docs/UPDATE_NOTES_zh.md +159 -159
  70. package/docs/UPGRADE_7.2.0.md +309 -0
  71. package/docs/UPGRADE_GUIDE_7_5.md +86 -0
  72. package/docs/geo-feihong-code.html +391 -0
  73. package/docs//345/205/250/351/235/242/345/244/215/347/233/230_50/350/275/256/346/267/261/345/272/246/345/256/241/350/256/241_v7.2.0.md +208 -0
  74. package/docs//345/205/250/351/235/242/345/244/215/347/233/230_6/351/241/271/351/207/215/347/202/271/346/240/270/346/237/245_v7.2.0.md +152 -0
  75. package/docs//345/205/250/351/235/242/345/244/215/347/233/230_/350/277/220/350/241/214/346/227/266/345/256/236/346/265/213/347/211/210_v7.2.0.md +271 -0
  76. package/docs//345/220/210/350/247/204/350/256/244/350/257/201/345/207/206/345/244/207/346/270/205/345/215/225_v7.2.0.md +59 -0
  77. package/docs//345/256/211/345/205/250/347/231/275/347/232/256/344/271/246_v7.2.0.md +82 -0
  78. package/electron/main.js +404 -602
  79. package/package.json +175 -172
  80. package/templates/skills/api-design/SKILL.md +27 -0
  81. package/templates/skills/code-review/SKILL.md +35 -0
  82. package/templates/skills/dependency-upgrade/SKILL.md +29 -0
  83. package/templates/skills/doc-gen/SKILL.md +29 -0
  84. package/templates/skills/git-flow/SKILL.md +26 -0
  85. package/templates/skills/onboarding/SKILL.md +27 -0
  86. package/templates/skills/performance/SKILL.md +29 -0
  87. package/templates/skills/refactor/SKILL.md +28 -0
  88. package/templates/skills/security-audit/SKILL.md +28 -0
  89. package/templates/skills/test-gen/SKILL.md +30 -0
  90. package/tool-schema.json +197 -197
  91. package/dist/hello.js +0 -14
  92. package/dist/hello.js.map +0 -1
  93. package/dist/self-evolve/hook.ts +0 -80
  94. package/dist/self-evolve/manager.d.ts +0 -8
  95. package/dist/web/public/vendor/monaco/vs/abap-D-t0cyap.js +0 -1
  96. package/dist/web/public/vendor/monaco/vs/apex-CcIm7xu6.js +0 -1
  97. package/dist/web/public/vendor/monaco/vs/assets/css.worker-URu8fCFR.js +0 -97
  98. package/dist/web/public/vendor/monaco/vs/assets/editor.worker-lj3bdIIn.js +0 -30
  99. package/dist/web/public/vendor/monaco/vs/assets/editorWebWorkerMain-CA_vMoUU.js +0 -30
  100. package/dist/web/public/vendor/monaco/vs/assets/html.worker-D1SL3iM8.js +0 -474
  101. package/dist/web/public/vendor/monaco/vs/assets/json.worker-CoJx_OPf.js +0 -62
  102. package/dist/web/public/vendor/monaco/vs/assets/ts.worker-BWKtMYOk.js +0 -67722
  103. package/dist/web/public/vendor/monaco/vs/azcli-BA0tQDCg.js +0 -1
  104. package/dist/web/public/vendor/monaco/vs/basic-languages/monaco.contribution.js +0 -1
  105. package/dist/web/public/vendor/monaco/vs/bat-C397hTD6.js +0 -1
  106. package/dist/web/public/vendor/monaco/vs/bicep-DF5aW17k.js +0 -2
  107. package/dist/web/public/vendor/monaco/vs/cameligo-plsz8qhj.js +0 -1
  108. package/dist/web/public/vendor/monaco/vs/clojure-Y2auQMzK.js +0 -1
  109. package/dist/web/public/vendor/monaco/vs/coffee-Bu45yuWE.js +0 -1
  110. package/dist/web/public/vendor/monaco/vs/cpp-CkKPQIni.js +0 -1
  111. package/dist/web/public/vendor/monaco/vs/csharp-CX28MZyh.js +0 -1
  112. package/dist/web/public/vendor/monaco/vs/csp-D8uWnyxW.js +0 -1
  113. package/dist/web/public/vendor/monaco/vs/css-CaeNmE3S.js +0 -3
  114. package/dist/web/public/vendor/monaco/vs/css.worker-CyhWkhHo.js +0 -1
  115. package/dist/web/public/vendor/monaco/vs/cssMode-CV6Ay48H.js +0 -1
  116. package/dist/web/public/vendor/monaco/vs/cypher-DVThT8BS.js +0 -1
  117. package/dist/web/public/vendor/monaco/vs/dart-CmGfCvrO.js +0 -1
  118. package/dist/web/public/vendor/monaco/vs/dockerfile-CZqqYdch.js +0 -1
  119. package/dist/web/public/vendor/monaco/vs/ecl-30fUercY.js +0 -1
  120. package/dist/web/public/vendor/monaco/vs/editor/editor.main.css +0 -1
  121. package/dist/web/public/vendor/monaco/vs/editor/editor.main.js +0 -1
  122. package/dist/web/public/vendor/monaco/vs/editor/editor.worker.js +0 -1
  123. package/dist/web/public/vendor/monaco/vs/editor-KLE6jdfb.js +0 -831
  124. package/dist/web/public/vendor/monaco/vs/editor.js +0 -1
  125. package/dist/web/public/vendor/monaco/vs/editorWorkerHost-fVE1cjcC.js +0 -35
  126. package/dist/web/public/vendor/monaco/vs/elixir-xjPaIfzF.js +0 -1
  127. package/dist/web/public/vendor/monaco/vs/flow9-DqtmStfK.js +0 -1
  128. package/dist/web/public/vendor/monaco/vs/freemarker2-FWreY7v7.js +0 -3
  129. package/dist/web/public/vendor/monaco/vs/fsharp-BOMdg4U1.js +0 -1
  130. package/dist/web/public/vendor/monaco/vs/go-D_hbi-Jt.js +0 -1
  131. package/dist/web/public/vendor/monaco/vs/graphql-CKUU4kLG.js +0 -1
  132. package/dist/web/public/vendor/monaco/vs/handlebars-CZi4pHCH.js +0 -1
  133. package/dist/web/public/vendor/monaco/vs/hcl-DTaboeZW.js +0 -1
  134. package/dist/web/public/vendor/monaco/vs/html-j_7ZTNRU.js +0 -1
  135. package/dist/web/public/vendor/monaco/vs/html.worker-CA3iAimZ.js +0 -1
  136. package/dist/web/public/vendor/monaco/vs/htmlMode-27by_KM4.js +0 -1
  137. package/dist/web/public/vendor/monaco/vs/index-049xrXrp.js +0 -1
  138. package/dist/web/public/vendor/monaco/vs/index-CBVt3dzv.js +0 -5
  139. package/dist/web/public/vendor/monaco/vs/index.js +0 -1
  140. package/dist/web/public/vendor/monaco/vs/ini-CsNwO04R.js +0 -1
  141. package/dist/web/public/vendor/monaco/vs/initialize-DL0l1TGY.js +0 -1
  142. package/dist/web/public/vendor/monaco/vs/java-CI4ZMsH9.js +0 -1
  143. package/dist/web/public/vendor/monaco/vs/javascript-DTJl4Jn1.js +0 -1
  144. package/dist/web/public/vendor/monaco/vs/json.worker-BizpAl9O.js +0 -1
  145. package/dist/web/public/vendor/monaco/vs/jsonMode-DLUiMUrI.js +0 -1
  146. package/dist/web/public/vendor/monaco/vs/julia-BwzEvaQw.js +0 -1
  147. package/dist/web/public/vendor/monaco/vs/kotlin-IUYPiTV8.js +0 -1
  148. package/dist/web/public/vendor/monaco/vs/language/css/css.worker.js +0 -66
  149. package/dist/web/public/vendor/monaco/vs/language/css/monaco.contribution.js +0 -1
  150. package/dist/web/public/vendor/monaco/vs/language/html/html.worker.js +0 -443
  151. package/dist/web/public/vendor/monaco/vs/language/html/monaco.contribution.js +0 -1
  152. package/dist/web/public/vendor/monaco/vs/language/json/json.worker.js +0 -17
  153. package/dist/web/public/vendor/monaco/vs/language/json/monaco.contribution.js +0 -1
  154. package/dist/web/public/vendor/monaco/vs/language/typescript/monaco.contribution.js +0 -1
  155. package/dist/web/public/vendor/monaco/vs/language/typescript/ts.worker.js +0 -67693
  156. package/dist/web/public/vendor/monaco/vs/less-C0eDYdqa.js +0 -2
  157. package/dist/web/public/vendor/monaco/vs/lexon-iON-Kj97.js +0 -1
  158. package/dist/web/public/vendor/monaco/vs/liquid-CLJYelW6.js +0 -1
  159. package/dist/web/public/vendor/monaco/vs/loader.js +0 -1368
  160. package/dist/web/public/vendor/monaco/vs/lspLanguageFeatures-BIkJOWLw.js +0 -2
  161. package/dist/web/public/vendor/monaco/vs/lua-DtygF91M.js +0 -1
  162. package/dist/web/public/vendor/monaco/vs/m3-CsR4AuFi.js +0 -1
  163. package/dist/web/public/vendor/monaco/vs/main-BEx-Fmlo.js +0 -15
  164. package/dist/web/public/vendor/monaco/vs/main-DsK8pnKg.js +0 -3
  165. package/dist/web/public/vendor/monaco/vs/markdown-C_rD0bIw.js +0 -1
  166. package/dist/web/public/vendor/monaco/vs/mdx-CpzZIPHF.js +0 -1
  167. package/dist/web/public/vendor/monaco/vs/mips-CiYP61RB.js +0 -1
  168. package/dist/web/public/vendor/monaco/vs/monaco.contribution-9cKT3C7t.js +0 -1
  169. package/dist/web/public/vendor/monaco/vs/monaco.contribution-BE88ZNGY.js +0 -1
  170. package/dist/web/public/vendor/monaco/vs/monaco.contribution-BPhsneLd.js +0 -1
  171. package/dist/web/public/vendor/monaco/vs/monaco.contribution-BgRy6xDf.js +0 -1
  172. package/dist/web/public/vendor/monaco/vs/msdax-C38-sJlp.js +0 -1
  173. package/dist/web/public/vendor/monaco/vs/mysql-CdtbpvbG.js +0 -1
  174. package/dist/web/public/vendor/monaco/vs/nls/lang/cs.d.ts +0 -1
  175. package/dist/web/public/vendor/monaco/vs/nls/lang/cs.js +0 -9
  176. package/dist/web/public/vendor/monaco/vs/nls/lang/de.d.ts +0 -1
  177. package/dist/web/public/vendor/monaco/vs/nls/lang/de.js +0 -9
  178. package/dist/web/public/vendor/monaco/vs/nls/lang/es.d.ts +0 -1
  179. package/dist/web/public/vendor/monaco/vs/nls/lang/es.js +0 -9
  180. package/dist/web/public/vendor/monaco/vs/nls/lang/fr.d.ts +0 -1
  181. package/dist/web/public/vendor/monaco/vs/nls/lang/fr.js +0 -9
  182. package/dist/web/public/vendor/monaco/vs/nls/lang/it.d.ts +0 -1
  183. package/dist/web/public/vendor/monaco/vs/nls/lang/it.js +0 -9
  184. package/dist/web/public/vendor/monaco/vs/nls/lang/ja.d.ts +0 -1
  185. package/dist/web/public/vendor/monaco/vs/nls/lang/ja.js +0 -9
  186. package/dist/web/public/vendor/monaco/vs/nls/lang/ko.d.ts +0 -1
  187. package/dist/web/public/vendor/monaco/vs/nls/lang/ko.js +0 -9
  188. package/dist/web/public/vendor/monaco/vs/nls/lang/pl.d.ts +0 -1
  189. package/dist/web/public/vendor/monaco/vs/nls/lang/pl.js +0 -9
  190. package/dist/web/public/vendor/monaco/vs/nls/lang/pt-br.d.ts +0 -1
  191. package/dist/web/public/vendor/monaco/vs/nls/lang/pt-br.js +0 -9
  192. package/dist/web/public/vendor/monaco/vs/nls/lang/ru.d.ts +0 -1
  193. package/dist/web/public/vendor/monaco/vs/nls/lang/ru.js +0 -9
  194. package/dist/web/public/vendor/monaco/vs/nls/lang/tr.d.ts +0 -1
  195. package/dist/web/public/vendor/monaco/vs/nls/lang/tr.js +0 -9
  196. package/dist/web/public/vendor/monaco/vs/nls/lang/zh-cn.d.ts +0 -1
  197. package/dist/web/public/vendor/monaco/vs/nls/lang/zh-cn.js +0 -9
  198. package/dist/web/public/vendor/monaco/vs/nls/lang/zh-tw.d.ts +0 -1
  199. package/dist/web/public/vendor/monaco/vs/nls/lang/zh-tw.js +0 -9
  200. package/dist/web/public/vendor/monaco/vs/nls.messages-loader.js +0 -1
  201. package/dist/web/public/vendor/monaco/vs/objective-c-CntZFaHX.js +0 -1
  202. package/dist/web/public/vendor/monaco/vs/pascal-r6kuqfl_.js +0 -1
  203. package/dist/web/public/vendor/monaco/vs/pascaligo-BiXoTmXh.js +0 -1
  204. package/dist/web/public/vendor/monaco/vs/perl-DABw_TcH.js +0 -1
  205. package/dist/web/public/vendor/monaco/vs/pgsql-me_jFXeX.js +0 -1
  206. package/dist/web/public/vendor/monaco/vs/php-D_kh-9LK.js +0 -1
  207. package/dist/web/public/vendor/monaco/vs/pla-VfZjczW0.js +0 -1
  208. package/dist/web/public/vendor/monaco/vs/postiats-BBSzz8Pk.js +0 -1
  209. package/dist/web/public/vendor/monaco/vs/powerquery-Dt-g_2cc.js +0 -1
  210. package/dist/web/public/vendor/monaco/vs/powershell-B-7ap1zc.js +0 -1
  211. package/dist/web/public/vendor/monaco/vs/protobuf-BmtuEB1A.js +0 -2
  212. package/dist/web/public/vendor/monaco/vs/pug-BRpRNeEb.js +0 -1
  213. package/dist/web/public/vendor/monaco/vs/python-CqWUUgfu.js +0 -1
  214. package/dist/web/public/vendor/monaco/vs/qsharp-BzsFaUU9.js +0 -1
  215. package/dist/web/public/vendor/monaco/vs/r-f8dDdrp4.js +0 -1
  216. package/dist/web/public/vendor/monaco/vs/razor-hok5y9Km.js +0 -1
  217. package/dist/web/public/vendor/monaco/vs/redis-fvZQY4PI.js +0 -1
  218. package/dist/web/public/vendor/monaco/vs/redshift-45Et0LQi.js +0 -1
  219. package/dist/web/public/vendor/monaco/vs/restructuredtext-C7UUFKFD.js +0 -1
  220. package/dist/web/public/vendor/monaco/vs/ruby-CZO8zYTz.js +0 -1
  221. package/dist/web/public/vendor/monaco/vs/rust-Bfetafyc.js +0 -1
  222. package/dist/web/public/vendor/monaco/vs/sb-3GYllVck.js +0 -1
  223. package/dist/web/public/vendor/monaco/vs/scala-foMgrKo1.js +0 -1
  224. package/dist/web/public/vendor/monaco/vs/scheme-CHdMtr7p.js +0 -1
  225. package/dist/web/public/vendor/monaco/vs/scss-C1cmLt9V.js +0 -3
  226. package/dist/web/public/vendor/monaco/vs/shell-ClXCKCEW.js +0 -1
  227. package/dist/web/public/vendor/monaco/vs/solidity-MZ6ExpPy.js +0 -1
  228. package/dist/web/public/vendor/monaco/vs/sophia-DWkuSsPQ.js +0 -1
  229. package/dist/web/public/vendor/monaco/vs/sparql-AUGFYSyk.js +0 -1
  230. package/dist/web/public/vendor/monaco/vs/sql-32GpJSV2.js +0 -1
  231. package/dist/web/public/vendor/monaco/vs/st-CuDFIVZ_.js +0 -1
  232. package/dist/web/public/vendor/monaco/vs/swift-t-PfMj7W.js +0 -1
  233. package/dist/web/public/vendor/monaco/vs/systemverilog-Ch4vA8Yt.js +0 -1
  234. package/dist/web/public/vendor/monaco/vs/tcl-D74tq1nH.js +0 -1
  235. package/dist/web/public/vendor/monaco/vs/toggleHighContrast-qGX7E9o7.js +0 -61
  236. package/dist/web/public/vendor/monaco/vs/ts.worker-2QLmBukE.js +0 -1
  237. package/dist/web/public/vendor/monaco/vs/tsMode-B0S_kp2q.js +0 -11
  238. package/dist/web/public/vendor/monaco/vs/twig-C6taOxMV.js +0 -1
  239. package/dist/web/public/vendor/monaco/vs/typescript-_2t_511t.js +0 -1
  240. package/dist/web/public/vendor/monaco/vs/typespec-8OfoLt6R.js +0 -1
  241. package/dist/web/public/vendor/monaco/vs/vb-Dyb2648j.js +0 -1
  242. package/dist/web/public/vendor/monaco/vs/wgsl-BhLXMOR0.js +0 -298
  243. package/dist/web/public/vendor/monaco/vs/workers-BBttULjf.js +0 -1
  244. package/dist/web/public/vendor/monaco/vs/xml-cZjNDqDT.js +0 -1
  245. package/dist/web/public/vendor/monaco/vs/yaml-A1fOIdH6.js +0 -1
  246. package/dist/web/web-config.js +0 -143
  247. package/dist/web/web-config.js.map +0 -1
  248. package/docs/DEPLOYMENT.md +0 -382
  249. package/docs/MODEL_FINETUNING.md +0 -405
@@ -1,234 +1,234 @@
1
- /**
2
- * 飞虹 Code - 安卓版 Mock API 层 (mock-api.js)
3
- *
4
- * 在 Android WebView 中无本地 Node.js 后端时提供离线演示数据。
5
- * 通过拦截 window.fetch 对 /api/ 请求返回本地模拟数据,保证 UI 完整可用。
6
- *
7
- * 模式:
8
- * - 默认:本地 Mock 模式(离线演示)
9
- * - 可在设置中填写服务器地址切换为远程模式(真实调用后端)
10
- *
11
- * 此文件在 api.js 之前加载,必须在最顶部定义,保证 window.fetch 被优先拦截。
12
- */
13
- (function () {
14
- if (window.__feihongMockInstalled) return;
15
- window.__feihongMockInstalled = true;
16
-
17
- // ========== 远程服务器配置 ==========
18
- var REMOTE_KEY = 'fhcode.remote.base';
19
- function getRemoteBase() {
20
- try { return localStorage.getItem(REMOTE_KEY) || ''; } catch (e) { return ''; }
21
- }
22
-
23
- // ========== Mock 数据 ==========
24
- var MODELS = [
25
- { id: 'deepseek-chat', name: 'DeepSeek Chat', provider: 'deepseek', reasoning: false, enabled: true },
26
- { id: 'deepseek-reasoner', name: 'DeepSeek Reasoner', provider: 'deepseek', reasoning: true, enabled: true },
27
- { id: 'qwen-max', name: '通义千问 Max', provider: 'qwen', reasoning: false, enabled: true },
28
- { id: 'gpt-4o', name: 'GPT-4o', provider: 'openai', reasoning: false, enabled: true }
29
- ];
30
-
31
- var SKILLS = [
32
- { id: 'code-review', name: '代码审查', desc: '自动审查代码质量与安全', enabled: true },
33
- { id: 'test-gen', name: '测试生成', desc: '自动生成单元测试用例', enabled: true },
34
- { id: 'doc-gen', name: '文档生成', desc: '自动生成 API 文档', enabled: true },
35
- { id: 'refactor', name: '重构专家', desc: '代码重构与优化', enabled: true },
36
- { id: 'bug-hunt', name: 'Bug 猎手', desc: '自动定位与修复 Bug', enabled: true }
37
- ];
38
-
39
- var OFFICE_CAPS = [
40
- { title: '生成周报', icon: '📊', prompt: '帮我生成一份本周工作周报', desc: '自动生成结构化周报' },
41
- { title: '写邮件', icon: '✉️', prompt: '帮我写一封商务邮件', desc: '专业邮件撰写' },
42
- { title: 'PPT 大纲', icon: '📑', prompt: '帮我生成一份 PPT 大纲', desc: '结构化演示大纲' },
43
- { title: '会议纪要', icon: '📝', prompt: '帮我整理会议纪要', desc: '智能会议纪要' },
44
- { title: '数据分析', icon: '📈', prompt: '帮我分析这份数据', desc: '数据洞察分析' },
45
- { title: '翻译文档', icon: '🌐', prompt: '帮我翻译这段内容', desc: '中英互译' }
46
- ];
47
-
48
- var ROLES = [
49
- { id: 'architect', name: '架构师', icon: '🏛️', desc: '系统设计、技术选型' },
50
- { id: 'developer', name: '开发者', icon: '💻', desc: '代码实现' },
51
- { id: 'tester', name: '测试工程师', icon: '🧪', desc: '测试用例设计' },
52
- { id: 'reviewer', name: '评审员', icon: '🔍', desc: '代码审查' }
53
- ];
54
-
55
- var CUSTOM_AGENTS = [
56
- { id: 'builtin-代码审查员', name: '代码审查员', category: 'review', desc: '专业代码审查,安全漏洞/性能/最佳实践', useCount: 12 },
57
- { id: 'builtin-测试工程师', name: '测试工程师', category: 'testing', desc: '自动生成测试用例', useCount: 8 },
58
- { id: 'builtin-文档生成器', name: '文档生成器', category: 'documentation', desc: '自动生成代码文档', useCount: 6 },
59
- { id: 'builtin-重构专家', name: '重构专家', category: 'refactoring', desc: '代码重构优化', useCount: 9 },
60
- { id: 'builtin-Bug猎手', name: 'Bug 猎手', category: 'debugging', desc: 'Bug 分析和修复', useCount: 15 }
61
- ];
62
-
63
- // ========== Mock 路由处理 ==========
64
- function handleMock(path, method, body) {
65
- var p = path.split('?')[0];
66
- var lower = p.toLowerCase();
67
-
68
- // 健康检查
69
- if (lower === '/api/health') {
70
- return ok({ product: '飞虹 Code', version: '7.0.0', enterprise: true, signature: '安卓版 · 离线演示模式', mode: 'mock', time: new Date().toISOString() });
71
- }
72
-
73
- // 模型
74
- if (lower === '/api/models' && method === 'GET') return ok({ models: MODELS });
75
- if (lower === '/api/models' && method === 'POST') {
76
- var m = body || {};
77
- MODELS.push({ id: 'custom-' + Date.now(), name: m.name || '自定义模型', provider: 'custom', reasoning: !!m.reasoning, enabled: true });
78
- return ok({ model: MODELS[MODELS.length - 1] });
79
- }
80
-
81
- // 技能
82
- if (lower === '/api/skills/installed') return ok({ skills: SKILLS });
83
- if (lower === '/api/skills' ) return ok({ skills: SKILLS });
84
-
85
- // 办公能力
86
- if (lower === '/api/office/capabilities') return ok({ capabilities: OFFICE_CAPS });
87
-
88
- // 多智能体角色
89
- if (lower === '/api/multi-agent/roles') return ok({ roles: ROLES });
90
- if (lower === '/api/multi-agent/run') {
91
- var goal = (body && body.goal) || '完成任务';
92
- return ok({
93
- goal: goal,
94
- rounds: [
95
- { role: '架构师', output: '设计方案:采用模块化架构,定义清晰接口边界。\n- 技术选型:TypeScript + 分层设计\n- 接口定义:RESTful API\n- 错误处理:统一异常捕获', score: 85 },
96
- { role: '开发者', output: '代码实现:完成核心模块开发。\n- 实现业务逻辑\n- 编写单元测试\n- 补充类型定义', score: 88 }
97
- ],
98
- finalVerdict: '通过',
99
- qualityScore: 86,
100
- issues: []
101
- });
102
- }
103
-
104
- // 自定义 Agent
105
- if (lower === '/api/custom-agents') return ok({ agents: CUSTOM_AGENTS });
106
- if (lower.indexOf('/api/custom-agents/match') === 0) {
107
- var inp = (body && body.input) || '';
108
- var matched = CUSTOM_AGENTS.filter(function (a) {
109
- return !inp || a.name.indexOf(inp) !== -1 || a.desc.indexOf(inp) !== -1;
110
- }).slice(0, 3);
111
- return ok({ agents: matched });
112
- }
113
- if (lower.indexOf('/api/custom-agents/') === 0 && method === 'GET') {
114
- var id = p.split('/').pop();
115
- var agent = CUSTOM_AGENTS.find(function (a) { return a.id === id; });
116
- return ok({ agent: agent || CUSTOM_AGENTS[0] });
117
- }
118
-
119
- // 事件驱动
120
- if (lower === '/api/event-driven/config') return ok({ config: { enabled: true, tasks: [] } });
121
- if (lower === '/api/event-driven/events') return ok({ events: [] });
122
- if (lower === '/api/event-driven/cron') return ok({ tasks: [] });
123
-
124
- // 记忆
125
- if (lower === '/api/memory/history') return ok({ history: [] });
126
- if (lower === '/api/memory/long') return ok({ content: '这是长期记忆区域。在安卓离线演示模式下,长期记忆功能暂未启用。\n\n连接远程服务器后,将自动同步您的记忆数据。' });
127
- if (lower === '/api/memory/short') return ok({ content: '当天暂无记录' });
128
- if (lower === '/api/memory/stats') return ok({ shortTermFiles: 0, longTermNotes: 0, lastSummarize: '暂无' });
129
-
130
- // 补全
131
- if (lower.indexOf('/api/completion') === 0) {
132
- return ok({
133
- completions: [
134
- { text: 'async function handleRequest(req, res) {\n try {\n const data = await fetchData(req.params.id);\n res.json({ ok: true, data });\n } catch (e) {\n res.status(500).json({ ok: false, error: e.message });\n }\n}', score: 0.95 },
135
- { text: 'function validate(input) {\n if (!input) throw new Error("input is required");\n return input.trim();\n}', score: 0.88 }
136
- ]
137
- });
138
- }
139
-
140
- // 会话 / 统计
141
- if (lower === '/api/sessions') return ok({ sessions: [] });
142
- if (lower.indexOf('/api/team') === 0) {
143
- if (method === 'GET') return ok({ members: [], tasks: [] });
144
- return ok({ ok: true });
145
- }
146
- if (lower.indexOf('/api/git') === 0) {
147
- if (method === 'GET') return ok({ branches: [], status: { clean: true }, commits: [] });
148
- return ok({ ok: true });
149
- }
150
- if (lower.indexOf('/api/design-to-code') === 0) {
151
- return ok({ ok: true, html: '<!-- 安卓演示模式:设计稿转代码需连接远程服务器 -->' });
152
- }
153
- if (lower.indexOf('/api/solo') === 0) {
154
- return ok({ ok: true, status: 'idle' });
155
- }
156
- if (lower.indexOf('/api/mcp') === 0) {
157
- return ok({ servers: [] });
158
- }
159
-
160
- // 登录/认证
161
- if (lower === '/api/auth/login' || lower === '/api/login') {
162
- return ok({ token: 'mock-token-' + Date.now(), user: { name: '演示用户', role: 'admin' } });
163
- }
164
-
165
- // 对话 / Agent 执行
166
- if (lower.indexOf('/api/chat') === 0 || lower.indexOf('/api/agent') === 0 || lower.indexOf('/api/task') === 0) {
167
- var prompt = (body && (body.prompt || body.message || body.goal || body.input)) || '任务';
168
- return ok({
169
- id: 'mock-' + Date.now(),
170
- answer: '【安卓离线演示】\n\n已收到任务:' + prompt + '\n\n当前处于离线演示模式,AI 生成能力需要连接远程飞虹 Code 服务器。\n\n在「设置」中填写服务器地址后,即可使用完整 AI 能力(多模型路由、Agent 执行、代码补全等)。',
171
- done: true
172
- });
173
- }
174
-
175
- // 配置
176
- if (lower === '/api/config' || lower === '/api/settings') {
177
- return ok({ config: { mode: 'mock', remoteBase: getRemoteBase(), version: '7.0.0' } });
178
- }
179
-
180
- // 兜底:GET 返回空结构,其他返回 ok
181
- if (method === 'GET') return ok({ ok: true, data: [] });
182
- return ok({ ok: true, data: [] });
183
- }
184
-
185
- function ok(data) {
186
- return {
187
- ok: true,
188
- status: 200,
189
- json: function () { return Promise.resolve(data); },
190
- text: function () { return Promise.resolve(JSON.stringify(data)); }
191
- };
192
- }
193
-
194
- // ========== 拦截 fetch ==========
195
- var originalFetch = window.fetch;
196
- window.fetch = function (input, init) {
197
- var url = typeof input === 'string' ? input : input.url;
198
- var method = ((init && init.method) || (input && input.method) || 'GET').toUpperCase();
199
-
200
- // 远程模式:配置了服务器地址且请求的是 /api/ 相对路径时,转发到远程
201
- var remoteBase = getRemoteBase();
202
- if (remoteBase && url.indexOf('/api/') === 0) {
203
- var remoteUrl = remoteBase.replace(/\/$/, '') + url;
204
- return originalFetch.call(window, remoteUrl, init).catch(function (e) {
205
- // 远程失败时降级到 Mock
206
- return Promise.resolve(handleMock(url, method, parseBody(init)));
207
- });
208
- }
209
-
210
- // Mock 模式:拦截 /api/ 请求
211
- if (url.indexOf('/api/') === 0) {
212
- return Promise.resolve(handleMock(url, method, parseBody(init)));
213
- }
214
-
215
- // 其他请求(静态资源等)正常处理
216
- return originalFetch.apply(window, arguments);
217
- };
218
-
219
- function parseBody(init) {
220
- if (!init || !init.body) return null;
221
- try { return JSON.parse(init.body); } catch (e) { return null; }
222
- }
223
-
224
- // ========== 暴露远程模式切换接口 ==========
225
- window.FeiHongApp = window.FeiHongApp || {};
226
- window.FeiHongApp.setRemote = function (base) {
227
- try { localStorage.setItem(REMOTE_KEY, base || ''); } catch (e) {}
228
- return base;
229
- };
230
- window.FeiHongApp.getRemote = function () { return getRemoteBase(); };
231
- window.FeiHongApp.isMock = function () { return !getRemoteBase(); };
232
-
233
- console.log('[MockAPI] 飞虹 Code 安卓离线 Mock 层已加载 (mode=' + (getRemoteBase() ? 'remote' : 'mock') + ')');
234
- })();
1
+ /**
2
+ * 飞虹 Code - 安卓版 Mock API 层 (mock-api.js)
3
+ *
4
+ * 在 Android WebView 中无本地 Node.js 后端时提供离线演示数据。
5
+ * 通过拦截 window.fetch 对 /api/ 请求返回本地模拟数据,保证 UI 完整可用。
6
+ *
7
+ * 模式:
8
+ * - 默认:本地 Mock 模式(离线演示)
9
+ * - 可在设置中填写服务器地址切换为远程模式(真实调用后端)
10
+ *
11
+ * 此文件在 api.js 之前加载,必须在最顶部定义,保证 window.fetch 被优先拦截。
12
+ */
13
+ (function () {
14
+ if (window.__feihongMockInstalled) return;
15
+ window.__feihongMockInstalled = true;
16
+
17
+ // ========== 远程服务器配置 ==========
18
+ var REMOTE_KEY = 'fhcode.remote.base';
19
+ function getRemoteBase() {
20
+ try { return localStorage.getItem(REMOTE_KEY) || ''; } catch (e) { return ''; }
21
+ }
22
+
23
+ // ========== Mock 数据 ==========
24
+ var MODELS = [
25
+ { id: 'deepseek-chat', name: 'DeepSeek Chat', provider: 'deepseek', reasoning: false, enabled: true },
26
+ { id: 'deepseek-reasoner', name: 'DeepSeek Reasoner', provider: 'deepseek', reasoning: true, enabled: true },
27
+ { id: 'qwen-max', name: '通义千问 Max', provider: 'qwen', reasoning: false, enabled: true },
28
+ { id: 'gpt-4o', name: 'GPT-4o', provider: 'openai', reasoning: false, enabled: true }
29
+ ];
30
+
31
+ var SKILLS = [
32
+ { id: 'code-review', name: '代码审查', desc: '自动审查代码质量与安全', enabled: true },
33
+ { id: 'test-gen', name: '测试生成', desc: '自动生成单元测试用例', enabled: true },
34
+ { id: 'doc-gen', name: '文档生成', desc: '自动生成 API 文档', enabled: true },
35
+ { id: 'refactor', name: '重构专家', desc: '代码重构与优化', enabled: true },
36
+ { id: 'bug-hunt', name: 'Bug 猎手', desc: '自动定位与修复 Bug', enabled: true }
37
+ ];
38
+
39
+ var OFFICE_CAPS = [
40
+ { title: '生成周报', icon: '📊', prompt: '帮我生成一份本周工作周报', desc: '自动生成结构化周报' },
41
+ { title: '写邮件', icon: '✉️', prompt: '帮我写一封商务邮件', desc: '专业邮件撰写' },
42
+ { title: 'PPT 大纲', icon: '📑', prompt: '帮我生成一份 PPT 大纲', desc: '结构化演示大纲' },
43
+ { title: '会议纪要', icon: '📝', prompt: '帮我整理会议纪要', desc: '智能会议纪要' },
44
+ { title: '数据分析', icon: '📈', prompt: '帮我分析这份数据', desc: '数据洞察分析' },
45
+ { title: '翻译文档', icon: '🌐', prompt: '帮我翻译这段内容', desc: '中英互译' }
46
+ ];
47
+
48
+ var ROLES = [
49
+ { id: 'architect', name: '架构师', icon: '🏛️', desc: '系统设计、技术选型' },
50
+ { id: 'developer', name: '开发者', icon: '💻', desc: '代码实现' },
51
+ { id: 'tester', name: '测试工程师', icon: '🧪', desc: '测试用例设计' },
52
+ { id: 'reviewer', name: '评审员', icon: '🔍', desc: '代码审查' }
53
+ ];
54
+
55
+ var CUSTOM_AGENTS = [
56
+ { id: 'builtin-代码审查员', name: '代码审查员', category: 'review', desc: '专业代码审查,安全漏洞/性能/最佳实践', useCount: 12 },
57
+ { id: 'builtin-测试工程师', name: '测试工程师', category: 'testing', desc: '自动生成测试用例', useCount: 8 },
58
+ { id: 'builtin-文档生成器', name: '文档生成器', category: 'documentation', desc: '自动生成代码文档', useCount: 6 },
59
+ { id: 'builtin-重构专家', name: '重构专家', category: 'refactoring', desc: '代码重构优化', useCount: 9 },
60
+ { id: 'builtin-Bug猎手', name: 'Bug 猎手', category: 'debugging', desc: 'Bug 分析和修复', useCount: 15 }
61
+ ];
62
+
63
+ // ========== Mock 路由处理 ==========
64
+ function handleMock(path, method, body) {
65
+ var p = path.split('?')[0];
66
+ var lower = p.toLowerCase();
67
+
68
+ // 健康检查
69
+ if (lower === '/api/health') {
70
+ return ok({ product: '飞虹 Code', version: '7.0.0', enterprise: true, signature: '安卓版 · 离线演示模式', mode: 'mock', time: new Date().toISOString() });
71
+ }
72
+
73
+ // 模型
74
+ if (lower === '/api/models' && method === 'GET') return ok({ models: MODELS });
75
+ if (lower === '/api/models' && method === 'POST') {
76
+ var m = body || {};
77
+ MODELS.push({ id: 'custom-' + Date.now(), name: m.name || '自定义模型', provider: 'custom', reasoning: !!m.reasoning, enabled: true });
78
+ return ok({ model: MODELS[MODELS.length - 1] });
79
+ }
80
+
81
+ // 技能
82
+ if (lower === '/api/skills/installed') return ok({ skills: SKILLS });
83
+ if (lower === '/api/skills' ) return ok({ skills: SKILLS });
84
+
85
+ // 办公能力
86
+ if (lower === '/api/office/capabilities') return ok({ capabilities: OFFICE_CAPS });
87
+
88
+ // 多智能体角色
89
+ if (lower === '/api/multi-agent/roles') return ok({ roles: ROLES });
90
+ if (lower === '/api/multi-agent/run') {
91
+ var goal = (body && body.goal) || '完成任务';
92
+ return ok({
93
+ goal: goal,
94
+ rounds: [
95
+ { role: '架构师', output: '设计方案:采用模块化架构,定义清晰接口边界。\n- 技术选型:TypeScript + 分层设计\n- 接口定义:RESTful API\n- 错误处理:统一异常捕获', score: 85 },
96
+ { role: '开发者', output: '代码实现:完成核心模块开发。\n- 实现业务逻辑\n- 编写单元测试\n- 补充类型定义', score: 88 }
97
+ ],
98
+ finalVerdict: '通过',
99
+ qualityScore: 86,
100
+ issues: []
101
+ });
102
+ }
103
+
104
+ // 自定义 Agent
105
+ if (lower === '/api/custom-agents') return ok({ agents: CUSTOM_AGENTS });
106
+ if (lower.indexOf('/api/custom-agents/match') === 0) {
107
+ var inp = (body && body.input) || '';
108
+ var matched = CUSTOM_AGENTS.filter(function (a) {
109
+ return !inp || a.name.indexOf(inp) !== -1 || a.desc.indexOf(inp) !== -1;
110
+ }).slice(0, 3);
111
+ return ok({ agents: matched });
112
+ }
113
+ if (lower.indexOf('/api/custom-agents/') === 0 && method === 'GET') {
114
+ var id = p.split('/').pop();
115
+ var agent = CUSTOM_AGENTS.find(function (a) { return a.id === id; });
116
+ return ok({ agent: agent || CUSTOM_AGENTS[0] });
117
+ }
118
+
119
+ // 事件驱动
120
+ if (lower === '/api/event-driven/config') return ok({ config: { enabled: true, tasks: [] } });
121
+ if (lower === '/api/event-driven/events') return ok({ events: [] });
122
+ if (lower === '/api/event-driven/cron') return ok({ tasks: [] });
123
+
124
+ // 记忆
125
+ if (lower === '/api/memory/history') return ok({ history: [] });
126
+ if (lower === '/api/memory/long') return ok({ content: '这是长期记忆区域。在安卓离线演示模式下,长期记忆功能暂未启用。\n\n连接远程服务器后,将自动同步您的记忆数据。' });
127
+ if (lower === '/api/memory/short') return ok({ content: '当天暂无记录' });
128
+ if (lower === '/api/memory/stats') return ok({ shortTermFiles: 0, longTermNotes: 0, lastSummarize: '暂无' });
129
+
130
+ // 补全
131
+ if (lower.indexOf('/api/completion') === 0) {
132
+ return ok({
133
+ completions: [
134
+ { text: 'async function handleRequest(req, res) {\n try {\n const data = await fetchData(req.params.id);\n res.json({ ok: true, data });\n } catch (e) {\n res.status(500).json({ ok: false, error: e.message });\n }\n}', score: 0.95 },
135
+ { text: 'function validate(input) {\n if (!input) throw new Error("input is required");\n return input.trim();\n}', score: 0.88 }
136
+ ]
137
+ });
138
+ }
139
+
140
+ // 会话 / 统计
141
+ if (lower === '/api/sessions') return ok({ sessions: [] });
142
+ if (lower.indexOf('/api/team') === 0) {
143
+ if (method === 'GET') return ok({ members: [], tasks: [] });
144
+ return ok({ ok: true });
145
+ }
146
+ if (lower.indexOf('/api/git') === 0) {
147
+ if (method === 'GET') return ok({ branches: [], status: { clean: true }, commits: [] });
148
+ return ok({ ok: true });
149
+ }
150
+ if (lower.indexOf('/api/design-to-code') === 0) {
151
+ return ok({ ok: true, html: '<!-- 安卓演示模式:设计稿转代码需连接远程服务器 -->' });
152
+ }
153
+ if (lower.indexOf('/api/solo') === 0) {
154
+ return ok({ ok: true, status: 'idle' });
155
+ }
156
+ if (lower.indexOf('/api/mcp') === 0) {
157
+ return ok({ servers: [] });
158
+ }
159
+
160
+ // 登录/认证
161
+ if (lower === '/api/auth/login' || lower === '/api/login') {
162
+ return ok({ token: 'mock-token-' + Date.now(), user: { name: '演示用户', role: 'admin' } });
163
+ }
164
+
165
+ // 对话 / Agent 执行
166
+ if (lower.indexOf('/api/chat') === 0 || lower.indexOf('/api/agent') === 0 || lower.indexOf('/api/task') === 0) {
167
+ var prompt = (body && (body.prompt || body.message || body.goal || body.input)) || '任务';
168
+ return ok({
169
+ id: 'mock-' + Date.now(),
170
+ answer: '【安卓离线演示】\n\n已收到任务:' + prompt + '\n\n当前处于离线演示模式,AI 生成能力需要连接远程飞虹 Code 服务器。\n\n在「设置」中填写服务器地址后,即可使用完整 AI 能力(多模型路由、Agent 执行、代码补全等)。',
171
+ done: true
172
+ });
173
+ }
174
+
175
+ // 配置
176
+ if (lower === '/api/config' || lower === '/api/settings') {
177
+ return ok({ config: { mode: 'mock', remoteBase: getRemoteBase(), version: '7.0.0' } });
178
+ }
179
+
180
+ // 兜底:GET 返回空结构,其他返回 ok
181
+ if (method === 'GET') return ok({ ok: true, data: [] });
182
+ return ok({ ok: true, data: [] });
183
+ }
184
+
185
+ function ok(data) {
186
+ return {
187
+ ok: true,
188
+ status: 200,
189
+ json: function () { return Promise.resolve(data); },
190
+ text: function () { return Promise.resolve(JSON.stringify(data)); }
191
+ };
192
+ }
193
+
194
+ // ========== 拦截 fetch ==========
195
+ var originalFetch = window.fetch;
196
+ window.fetch = function (input, init) {
197
+ var url = typeof input === 'string' ? input : input.url;
198
+ var method = ((init && init.method) || (input && input.method) || 'GET').toUpperCase();
199
+
200
+ // 远程模式:配置了服务器地址且请求的是 /api/ 相对路径时,转发到远程
201
+ var remoteBase = getRemoteBase();
202
+ if (remoteBase && url.indexOf('/api/') === 0) {
203
+ var remoteUrl = remoteBase.replace(/\/$/, '') + url;
204
+ return originalFetch.call(window, remoteUrl, init).catch(function (e) {
205
+ // 远程失败时降级到 Mock
206
+ return Promise.resolve(handleMock(url, method, parseBody(init)));
207
+ });
208
+ }
209
+
210
+ // Mock 模式:拦截 /api/ 请求
211
+ if (url.indexOf('/api/') === 0) {
212
+ return Promise.resolve(handleMock(url, method, parseBody(init)));
213
+ }
214
+
215
+ // 其他请求(静态资源等)正常处理
216
+ return originalFetch.apply(window, arguments);
217
+ };
218
+
219
+ function parseBody(init) {
220
+ if (!init || !init.body) return null;
221
+ try { return JSON.parse(init.body); } catch (e) { return null; }
222
+ }
223
+
224
+ // ========== 暴露远程模式切换接口 ==========
225
+ window.FeiHongApp = window.FeiHongApp || {};
226
+ window.FeiHongApp.setRemote = function (base) {
227
+ try { localStorage.setItem(REMOTE_KEY, base || ''); } catch (e) {}
228
+ return base;
229
+ };
230
+ window.FeiHongApp.getRemote = function () { return getRemoteBase(); };
231
+ window.FeiHongApp.isMock = function () { return !getRemoteBase(); };
232
+
233
+ console.log('[MockAPI] 飞虹 Code 安卓离线 Mock 层已加载 (mode=' + (getRemoteBase() ? 'remote' : 'mock') + ')');
234
+ })();