feihong-code 0.6.1 → 7.2.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 (247) hide show
  1. package/.github/workflows/release.yml +173 -0
  2. package/CHANGELOG.md +83 -454
  3. package/dist/agent/browser-agent.js +354 -0
  4. package/dist/agent/browser-agent.js.map +1 -0
  5. package/dist/agent/change-manager.js +433 -0
  6. package/dist/agent/change-manager.js.map +1 -0
  7. package/dist/agent/code-rag.js +293 -0
  8. package/dist/agent/code-rag.js.map +1 -0
  9. package/dist/agent/code-writer.js +13 -1
  10. package/dist/agent/code-writer.js.map +1 -1
  11. package/dist/agent/completion-engine.js +522 -0
  12. package/dist/agent/completion-engine.js.map +1 -0
  13. package/dist/agent/context-compactor.js +188 -10
  14. package/dist/agent/context-compactor.js.map +1 -1
  15. package/dist/agent/custom-agent.js +368 -0
  16. package/dist/agent/custom-agent.js.map +1 -0
  17. package/dist/agent/design-to-code.js +218 -0
  18. package/dist/agent/design-to-code.js.map +1 -0
  19. package/dist/agent/event-driven-agent.js +359 -0
  20. package/dist/agent/event-driven-agent.js.map +1 -0
  21. package/dist/agent/git-integration.js +324 -0
  22. package/dist/agent/git-integration.js.map +1 -0
  23. package/dist/agent/layered-memory.js +329 -0
  24. package/dist/agent/layered-memory.js.map +1 -0
  25. package/dist/agent/multi-agent.js +359 -0
  26. package/dist/agent/multi-agent.js.map +1 -0
  27. package/dist/agent/orchestrator.js +160 -22
  28. package/dist/agent/orchestrator.js.map +1 -1
  29. package/dist/agent/prompts.js +20 -0
  30. package/dist/agent/prompts.js.map +1 -1
  31. package/dist/agent/quality-gate.js +139 -0
  32. package/dist/agent/quality-gate.js.map +1 -1
  33. package/dist/agent/self-correction.js +274 -0
  34. package/dist/agent/self-correction.js.map +1 -0
  35. package/dist/agent/self-heal.js +42 -12
  36. package/dist/agent/self-heal.js.map +1 -1
  37. package/dist/agent/solo-agent.js +321 -0
  38. package/dist/agent/solo-agent.js.map +1 -0
  39. package/dist/agent/symbol-index.js +258 -28
  40. package/dist/agent/symbol-index.js.map +1 -1
  41. package/dist/agent/team-collaboration.js +252 -0
  42. package/dist/agent/team-collaboration.js.map +1 -0
  43. package/dist/agent/type-checker.js +229 -0
  44. package/dist/agent/type-checker.js.map +1 -0
  45. package/dist/cli/run.js +1 -0
  46. package/dist/cli/run.js.map +1 -1
  47. package/dist/cli/version.js +1 -1
  48. package/dist/integrations/collaboration.js +219 -0
  49. package/dist/integrations/collaboration.js.map +1 -0
  50. package/dist/integrations/figma.js +307 -0
  51. package/dist/integrations/figma.js.map +1 -0
  52. package/dist/integrations/sso.js +327 -0
  53. package/dist/integrations/sso.js.map +1 -0
  54. package/dist/knowledge/library.js +301 -0
  55. package/dist/knowledge/library.js.map +1 -0
  56. package/dist/plugins/manager.js +332 -0
  57. package/dist/plugins/manager.js.map +1 -0
  58. package/dist/runtime/event-log.js.map +1 -1
  59. package/dist/tools/browser/browser.tool.js +217 -0
  60. package/dist/tools/browser/browser.tool.js.map +1 -0
  61. package/dist/tools/index.js +2 -0
  62. package/dist/tools/index.js.map +1 -1
  63. package/dist/tools/shell/exec.js +50 -10
  64. package/dist/tools/shell/exec.js.map +1 -1
  65. package/dist/tools/shell/run-shell.tool.js +8 -2
  66. package/dist/tools/shell/run-shell.tool.js.map +1 -1
  67. package/dist/training/completion-evaluator.js +213 -0
  68. package/dist/training/completion-evaluator.js.map +1 -0
  69. package/dist/training/fim-data.js +248 -0
  70. package/dist/training/fim-data.js.map +1 -0
  71. package/dist/voice/voice-programming.js +223 -0
  72. package/dist/voice/voice-programming.js.map +1 -0
  73. package/dist/web/public/css/style.css +190 -7
  74. package/dist/web/public/index.html +403 -9
  75. package/dist/web/public/js/api.js +191 -4
  76. package/dist/web/public/js/app.js +850 -123
  77. package/dist/web/public/js/mock-api.js +234 -0
  78. package/dist/web/public/js/monaco-editor.js +203 -0
  79. package/dist/web/public/js/ui.js +1271 -54
  80. package/dist/web/public/manifest.json +59 -0
  81. package/dist/web/public/service-worker.js +173 -0
  82. package/dist/web/public/vendor/monaco/vs/abap-D-t0cyap.js +1 -0
  83. package/dist/web/public/vendor/monaco/vs/apex-CcIm7xu6.js +1 -0
  84. package/dist/web/public/vendor/monaco/vs/assets/css.worker-URu8fCFR.js +97 -0
  85. package/dist/web/public/vendor/monaco/vs/assets/editor.worker-lj3bdIIn.js +30 -0
  86. package/dist/web/public/vendor/monaco/vs/assets/editorWebWorkerMain-CA_vMoUU.js +30 -0
  87. package/dist/web/public/vendor/monaco/vs/assets/html.worker-D1SL3iM8.js +474 -0
  88. package/dist/web/public/vendor/monaco/vs/assets/json.worker-CoJx_OPf.js +62 -0
  89. package/dist/web/public/vendor/monaco/vs/assets/ts.worker-BWKtMYOk.js +67722 -0
  90. package/dist/web/public/vendor/monaco/vs/azcli-BA0tQDCg.js +1 -0
  91. package/dist/web/public/vendor/monaco/vs/basic-languages/monaco.contribution.js +1 -0
  92. package/dist/web/public/vendor/monaco/vs/bat-C397hTD6.js +1 -0
  93. package/dist/web/public/vendor/monaco/vs/bicep-DF5aW17k.js +2 -0
  94. package/dist/web/public/vendor/monaco/vs/cameligo-plsz8qhj.js +1 -0
  95. package/dist/web/public/vendor/monaco/vs/clojure-Y2auQMzK.js +1 -0
  96. package/dist/web/public/vendor/monaco/vs/coffee-Bu45yuWE.js +1 -0
  97. package/dist/web/public/vendor/monaco/vs/cpp-CkKPQIni.js +1 -0
  98. package/dist/web/public/vendor/monaco/vs/csharp-CX28MZyh.js +1 -0
  99. package/dist/web/public/vendor/monaco/vs/csp-D8uWnyxW.js +1 -0
  100. package/dist/web/public/vendor/monaco/vs/css-CaeNmE3S.js +3 -0
  101. package/dist/web/public/vendor/monaco/vs/css.worker-CyhWkhHo.js +1 -0
  102. package/dist/web/public/vendor/monaco/vs/cssMode-CV6Ay48H.js +1 -0
  103. package/dist/web/public/vendor/monaco/vs/cypher-DVThT8BS.js +1 -0
  104. package/dist/web/public/vendor/monaco/vs/dart-CmGfCvrO.js +1 -0
  105. package/dist/web/public/vendor/monaco/vs/dockerfile-CZqqYdch.js +1 -0
  106. package/dist/web/public/vendor/monaco/vs/ecl-30fUercY.js +1 -0
  107. package/dist/web/public/vendor/monaco/vs/editor/editor.main.css +1 -0
  108. package/dist/web/public/vendor/monaco/vs/editor/editor.main.js +1 -0
  109. package/dist/web/public/vendor/monaco/vs/editor/editor.worker.js +1 -0
  110. package/dist/web/public/vendor/monaco/vs/editor-KLE6jdfb.js +831 -0
  111. package/dist/web/public/vendor/monaco/vs/editor.js +1 -0
  112. package/dist/web/public/vendor/monaco/vs/editorWorkerHost-fVE1cjcC.js +35 -0
  113. package/dist/web/public/vendor/monaco/vs/elixir-xjPaIfzF.js +1 -0
  114. package/dist/web/public/vendor/monaco/vs/flow9-DqtmStfK.js +1 -0
  115. package/dist/web/public/vendor/monaco/vs/freemarker2-FWreY7v7.js +3 -0
  116. package/dist/web/public/vendor/monaco/vs/fsharp-BOMdg4U1.js +1 -0
  117. package/dist/web/public/vendor/monaco/vs/go-D_hbi-Jt.js +1 -0
  118. package/dist/web/public/vendor/monaco/vs/graphql-CKUU4kLG.js +1 -0
  119. package/dist/web/public/vendor/monaco/vs/handlebars-CZi4pHCH.js +1 -0
  120. package/dist/web/public/vendor/monaco/vs/hcl-DTaboeZW.js +1 -0
  121. package/dist/web/public/vendor/monaco/vs/html-j_7ZTNRU.js +1 -0
  122. package/dist/web/public/vendor/monaco/vs/html.worker-CA3iAimZ.js +1 -0
  123. package/dist/web/public/vendor/monaco/vs/htmlMode-27by_KM4.js +1 -0
  124. package/dist/web/public/vendor/monaco/vs/index-049xrXrp.js +1 -0
  125. package/dist/web/public/vendor/monaco/vs/index-CBVt3dzv.js +5 -0
  126. package/dist/web/public/vendor/monaco/vs/index.js +1 -0
  127. package/dist/web/public/vendor/monaco/vs/ini-CsNwO04R.js +1 -0
  128. package/dist/web/public/vendor/monaco/vs/initialize-DL0l1TGY.js +1 -0
  129. package/dist/web/public/vendor/monaco/vs/java-CI4ZMsH9.js +1 -0
  130. package/dist/web/public/vendor/monaco/vs/javascript-DTJl4Jn1.js +1 -0
  131. package/dist/web/public/vendor/monaco/vs/json.worker-BizpAl9O.js +1 -0
  132. package/dist/web/public/vendor/monaco/vs/jsonMode-DLUiMUrI.js +1 -0
  133. package/dist/web/public/vendor/monaco/vs/julia-BwzEvaQw.js +1 -0
  134. package/dist/web/public/vendor/monaco/vs/kotlin-IUYPiTV8.js +1 -0
  135. package/dist/web/public/vendor/monaco/vs/language/css/css.worker.js +66 -0
  136. package/dist/web/public/vendor/monaco/vs/language/css/monaco.contribution.js +1 -0
  137. package/dist/web/public/vendor/monaco/vs/language/html/html.worker.js +443 -0
  138. package/dist/web/public/vendor/monaco/vs/language/html/monaco.contribution.js +1 -0
  139. package/dist/web/public/vendor/monaco/vs/language/json/json.worker.js +17 -0
  140. package/dist/web/public/vendor/monaco/vs/language/json/monaco.contribution.js +1 -0
  141. package/dist/web/public/vendor/monaco/vs/language/typescript/monaco.contribution.js +1 -0
  142. package/dist/web/public/vendor/monaco/vs/language/typescript/ts.worker.js +67693 -0
  143. package/dist/web/public/vendor/monaco/vs/less-C0eDYdqa.js +2 -0
  144. package/dist/web/public/vendor/monaco/vs/lexon-iON-Kj97.js +1 -0
  145. package/dist/web/public/vendor/monaco/vs/liquid-CLJYelW6.js +1 -0
  146. package/dist/web/public/vendor/monaco/vs/loader.js +1368 -0
  147. package/dist/web/public/vendor/monaco/vs/lspLanguageFeatures-BIkJOWLw.js +2 -0
  148. package/dist/web/public/vendor/monaco/vs/lua-DtygF91M.js +1 -0
  149. package/dist/web/public/vendor/monaco/vs/m3-CsR4AuFi.js +1 -0
  150. package/dist/web/public/vendor/monaco/vs/main-BEx-Fmlo.js +15 -0
  151. package/dist/web/public/vendor/monaco/vs/main-DsK8pnKg.js +3 -0
  152. package/dist/web/public/vendor/monaco/vs/markdown-C_rD0bIw.js +1 -0
  153. package/dist/web/public/vendor/monaco/vs/mdx-CpzZIPHF.js +1 -0
  154. package/dist/web/public/vendor/monaco/vs/mips-CiYP61RB.js +1 -0
  155. package/dist/web/public/vendor/monaco/vs/monaco.contribution-9cKT3C7t.js +1 -0
  156. package/dist/web/public/vendor/monaco/vs/monaco.contribution-BE88ZNGY.js +1 -0
  157. package/dist/web/public/vendor/monaco/vs/monaco.contribution-BPhsneLd.js +1 -0
  158. package/dist/web/public/vendor/monaco/vs/monaco.contribution-BgRy6xDf.js +1 -0
  159. package/dist/web/public/vendor/monaco/vs/msdax-C38-sJlp.js +1 -0
  160. package/dist/web/public/vendor/monaco/vs/mysql-CdtbpvbG.js +1 -0
  161. package/dist/web/public/vendor/monaco/vs/nls/lang/cs.d.ts +1 -0
  162. package/dist/web/public/vendor/monaco/vs/nls/lang/cs.js +9 -0
  163. package/dist/web/public/vendor/monaco/vs/nls/lang/de.d.ts +1 -0
  164. package/dist/web/public/vendor/monaco/vs/nls/lang/de.js +9 -0
  165. package/dist/web/public/vendor/monaco/vs/nls/lang/es.d.ts +1 -0
  166. package/dist/web/public/vendor/monaco/vs/nls/lang/es.js +9 -0
  167. package/dist/web/public/vendor/monaco/vs/nls/lang/fr.d.ts +1 -0
  168. package/dist/web/public/vendor/monaco/vs/nls/lang/fr.js +9 -0
  169. package/dist/web/public/vendor/monaco/vs/nls/lang/it.d.ts +1 -0
  170. package/dist/web/public/vendor/monaco/vs/nls/lang/it.js +9 -0
  171. package/dist/web/public/vendor/monaco/vs/nls/lang/ja.d.ts +1 -0
  172. package/dist/web/public/vendor/monaco/vs/nls/lang/ja.js +9 -0
  173. package/dist/web/public/vendor/monaco/vs/nls/lang/ko.d.ts +1 -0
  174. package/dist/web/public/vendor/monaco/vs/nls/lang/ko.js +9 -0
  175. package/dist/web/public/vendor/monaco/vs/nls/lang/pl.d.ts +1 -0
  176. package/dist/web/public/vendor/monaco/vs/nls/lang/pl.js +9 -0
  177. package/dist/web/public/vendor/monaco/vs/nls/lang/pt-br.d.ts +1 -0
  178. package/dist/web/public/vendor/monaco/vs/nls/lang/pt-br.js +9 -0
  179. package/dist/web/public/vendor/monaco/vs/nls/lang/ru.d.ts +1 -0
  180. package/dist/web/public/vendor/monaco/vs/nls/lang/ru.js +9 -0
  181. package/dist/web/public/vendor/monaco/vs/nls/lang/tr.d.ts +1 -0
  182. package/dist/web/public/vendor/monaco/vs/nls/lang/tr.js +9 -0
  183. package/dist/web/public/vendor/monaco/vs/nls/lang/zh-cn.d.ts +1 -0
  184. package/dist/web/public/vendor/monaco/vs/nls/lang/zh-cn.js +9 -0
  185. package/dist/web/public/vendor/monaco/vs/nls/lang/zh-tw.d.ts +1 -0
  186. package/dist/web/public/vendor/monaco/vs/nls/lang/zh-tw.js +9 -0
  187. package/dist/web/public/vendor/monaco/vs/nls.messages-loader.js +1 -0
  188. package/dist/web/public/vendor/monaco/vs/objective-c-CntZFaHX.js +1 -0
  189. package/dist/web/public/vendor/monaco/vs/pascal-r6kuqfl_.js +1 -0
  190. package/dist/web/public/vendor/monaco/vs/pascaligo-BiXoTmXh.js +1 -0
  191. package/dist/web/public/vendor/monaco/vs/perl-DABw_TcH.js +1 -0
  192. package/dist/web/public/vendor/monaco/vs/pgsql-me_jFXeX.js +1 -0
  193. package/dist/web/public/vendor/monaco/vs/php-D_kh-9LK.js +1 -0
  194. package/dist/web/public/vendor/monaco/vs/pla-VfZjczW0.js +1 -0
  195. package/dist/web/public/vendor/monaco/vs/postiats-BBSzz8Pk.js +1 -0
  196. package/dist/web/public/vendor/monaco/vs/powerquery-Dt-g_2cc.js +1 -0
  197. package/dist/web/public/vendor/monaco/vs/powershell-B-7ap1zc.js +1 -0
  198. package/dist/web/public/vendor/monaco/vs/protobuf-BmtuEB1A.js +2 -0
  199. package/dist/web/public/vendor/monaco/vs/pug-BRpRNeEb.js +1 -0
  200. package/dist/web/public/vendor/monaco/vs/python-CqWUUgfu.js +1 -0
  201. package/dist/web/public/vendor/monaco/vs/qsharp-BzsFaUU9.js +1 -0
  202. package/dist/web/public/vendor/monaco/vs/r-f8dDdrp4.js +1 -0
  203. package/dist/web/public/vendor/monaco/vs/razor-hok5y9Km.js +1 -0
  204. package/dist/web/public/vendor/monaco/vs/redis-fvZQY4PI.js +1 -0
  205. package/dist/web/public/vendor/monaco/vs/redshift-45Et0LQi.js +1 -0
  206. package/dist/web/public/vendor/monaco/vs/restructuredtext-C7UUFKFD.js +1 -0
  207. package/dist/web/public/vendor/monaco/vs/ruby-CZO8zYTz.js +1 -0
  208. package/dist/web/public/vendor/monaco/vs/rust-Bfetafyc.js +1 -0
  209. package/dist/web/public/vendor/monaco/vs/sb-3GYllVck.js +1 -0
  210. package/dist/web/public/vendor/monaco/vs/scala-foMgrKo1.js +1 -0
  211. package/dist/web/public/vendor/monaco/vs/scheme-CHdMtr7p.js +1 -0
  212. package/dist/web/public/vendor/monaco/vs/scss-C1cmLt9V.js +3 -0
  213. package/dist/web/public/vendor/monaco/vs/shell-ClXCKCEW.js +1 -0
  214. package/dist/web/public/vendor/monaco/vs/solidity-MZ6ExpPy.js +1 -0
  215. package/dist/web/public/vendor/monaco/vs/sophia-DWkuSsPQ.js +1 -0
  216. package/dist/web/public/vendor/monaco/vs/sparql-AUGFYSyk.js +1 -0
  217. package/dist/web/public/vendor/monaco/vs/sql-32GpJSV2.js +1 -0
  218. package/dist/web/public/vendor/monaco/vs/st-CuDFIVZ_.js +1 -0
  219. package/dist/web/public/vendor/monaco/vs/swift-t-PfMj7W.js +1 -0
  220. package/dist/web/public/vendor/monaco/vs/systemverilog-Ch4vA8Yt.js +1 -0
  221. package/dist/web/public/vendor/monaco/vs/tcl-D74tq1nH.js +1 -0
  222. package/dist/web/public/vendor/monaco/vs/toggleHighContrast-qGX7E9o7.js +61 -0
  223. package/dist/web/public/vendor/monaco/vs/ts.worker-2QLmBukE.js +1 -0
  224. package/dist/web/public/vendor/monaco/vs/tsMode-B0S_kp2q.js +11 -0
  225. package/dist/web/public/vendor/monaco/vs/twig-C6taOxMV.js +1 -0
  226. package/dist/web/public/vendor/monaco/vs/typescript-_2t_511t.js +1 -0
  227. package/dist/web/public/vendor/monaco/vs/typespec-8OfoLt6R.js +1 -0
  228. package/dist/web/public/vendor/monaco/vs/vb-Dyb2648j.js +1 -0
  229. package/dist/web/public/vendor/monaco/vs/wgsl-BhLXMOR0.js +298 -0
  230. package/dist/web/public/vendor/monaco/vs/workers-BBttULjf.js +1 -0
  231. package/dist/web/public/vendor/monaco/vs/xml-cZjNDqDT.js +1 -0
  232. package/dist/web/public/vendor/monaco/vs/yaml-A1fOIdH6.js +1 -0
  233. package/dist/web/server.js +2073 -210
  234. package/dist/web/server.js.map +1 -1
  235. package/dist/web/task-queue.js +25 -5
  236. package/dist/web/task-queue.js.map +1 -1
  237. package/docs/BENCHMARK_REPORT_en.md +329 -0
  238. package/docs/BENCHMARK_REPORT_zh.md +329 -0
  239. package/docs/DEPLOYMENT.md +382 -0
  240. package/docs/MODEL_FINETUNING.md +405 -0
  241. package/docs/TECHNICAL_SPEC_en.md +292 -0
  242. package/docs/TECHNICAL_SPEC_zh.md +292 -0
  243. package/docs/UPDATE_NOTES_en.md +159 -0
  244. package/docs/UPDATE_NOTES_zh.md +159 -0
  245. package/electron/main.js +602 -0
  246. package/package.json +67 -3
  247. package/tool-schema.json +1 -1
@@ -0,0 +1,405 @@
1
+ # 飞虹 Code - 专用补全模型微调指南 (P3-1)
2
+
3
+ > 晋江市飞虹智科技企业管理有限公司 · 飞扬企源研发中心 · 负责人:吴赐虹
4
+
5
+ ## 目录
6
+
7
+ 1. [概述](#1-概述)
8
+ 2. [环境准备](#2-环境准备)
9
+ 3. [数据准备](#3-数据准备)
10
+ 4. [模型训练](#4-模型训练)
11
+ 5. [模型评估](#5-模型评估)
12
+ 6. [模型导出与部署](#6-模型导出与部署)
13
+ 7. [集成到飞虹 Code](#7-集成到飞虹-code)
14
+
15
+ ---
16
+
17
+ ## 1. 概述
18
+
19
+ 飞虹 Code 支持使用专用微调的代码补全模型,通过 FIM (Fill-In-the-Middle) 格式训练,提升代码补全的准确率和上下文理解能力。
20
+
21
+ ### 1.1 技术方案
22
+
23
+ | 组件 | 说明 |
24
+ |---|---|
25
+ | **基础模型** | bigcode/starcoderbase-1b(或其他代码生成模型) |
26
+ | **微调方法** | LoRA (Low-Rank Adaptation),仅训练少量参数 |
27
+ | **训练格式** | FIM (Fill-In-the-Middle),prefix/suffix/middle 三部分 |
28
+ | **评估指标** | 精确匹配率、编辑相似度、前缀匹配率、延迟 |
29
+ | **部署格式** | 合并模型 / GGUF / ONNX |
30
+
31
+ ### 1.2 硬件要求
32
+
33
+ | 配置 | 最低 | 推荐 |
34
+ |---|---|---|
35
+ | GPU 显存 | 8GB (RTX 3060/4060) | 16GB+ (RTX 3090/4090/A10) |
36
+ | 内存 | 16GB | 32GB+ |
37
+ | 磁盘空间 | 20GB | 50GB+ |
38
+ | 训练时间 | 4-8 小时 (1B 模型) | 1-2 小时 |
39
+
40
+ ---
41
+
42
+ ## 2. 环境准备
43
+
44
+ ### 2.1 安装 Python 依赖
45
+
46
+ ```bash
47
+ # 创建虚拟环境
48
+ python -m venv .venv
49
+ source .venv/bin/activate # Linux/Mac
50
+ # .venv\Scripts\activate # Windows
51
+
52
+ # 安装 PyTorch(根据 CUDA 版本选择)
53
+ pip install torch torchvision --index-url https://download.pytorch.org/whl/cu118
54
+
55
+ # 安装训练依赖
56
+ pip install transformers peft datasets accelerate evaluate sentencepiece
57
+ pip install tensorboard wandb # 可选:可视化工具
58
+
59
+ # 安装导出依赖(可选)
60
+ pip install optimum onnxruntime # ONNX 导出
61
+ pip install llama-cpp-python # GGUF 导出
62
+ ```
63
+
64
+ ### 2.2 验证环境
65
+
66
+ ```bash
67
+ python -c "import torch; print(f'PyTorch: {torch.__version__}'); print(f'CUDA: {torch.cuda.is_available()}')"
68
+ python -c "import transformers; print(f'Transformers: {transformers.__version__}')"
69
+ python -c "import peft; print(f'PEFT: {peft.__version__}')"
70
+ ```
71
+
72
+ ---
73
+
74
+ ## 3. 数据准备
75
+
76
+ ### 3.1 使用飞虹 Code 内置数据准备工具
77
+
78
+ 飞虹 Code 提供了 TypeScript 版本的 FIM 数据准备工具,可以直接从代码库生成训练数据。
79
+
80
+ ```bash
81
+ # 编译项目
82
+ npm run build
83
+
84
+ # 准备 FIM 训练数据
85
+ node dist/cli/index.js fim-prepare \
86
+ --source-dir ./your-codebase \
87
+ --output ./data/fim/dataset.jsonl \
88
+ --samples-per-file 10 \
89
+ --languages typescript,javascript,python
90
+ ```
91
+
92
+ ### 3.2 数据格式
93
+
94
+ 输出为 JSONL 格式,每行一个样本:
95
+
96
+ ```json
97
+ {
98
+ "prefix": "function calculateSum(a: number, b: number): number {\n return ",
99
+ "suffix": "\n}\n\n// 其他代码...",
100
+ "middle": "a + b",
101
+ "file_path": "src/math.ts",
102
+ "language": "typescript",
103
+ "cursor_offset": 1234,
104
+ "middle_length": 5
105
+ }
106
+ ```
107
+
108
+ ### 3.3 数据划分
109
+
110
+ 工具会自动生成三个文件:
111
+ - `dataset.train.jsonl` - 训练集(90%)
112
+ - `dataset.val.jsonl` - 验证集(10%)
113
+ - `dataset.meta.json` - 元数据(统计信息、配置)
114
+
115
+ ### 3.4 数据质量建议
116
+
117
+ 1. **代码质量**:使用高质量的代码库作为数据源
118
+ 2. **语言覆盖**:确保覆盖目标编程语言
119
+ 3. **数据量**:建议至少 10,000+ 样本
120
+ 4. **去重**:避免重复或高度相似的样本
121
+ 5. **过滤**:排除自动生成的代码、minified 文件、测试快照
122
+
123
+ ---
124
+
125
+ ## 4. 模型训练
126
+
127
+ ### 4.1 配置训练参数
128
+
129
+ 编辑 `training/lora-config.json`:
130
+
131
+ ```json
132
+ {
133
+ "base_model": "bigcode/starcoderbase-1b",
134
+ "output_dir": "./models/feihong-code-completion",
135
+ "num_train_epochs": 3,
136
+ "per_device_train_batch_size": 4,
137
+ "gradient_accumulation_steps": 4,
138
+ "learning_rate": 2e-4,
139
+ "max_seq_length": 2048,
140
+ "lora": {
141
+ "r": 16,
142
+ "lora_alpha": 32,
143
+ "lora_dropout": 0.05,
144
+ "target_modules": ["q_proj", "v_proj", "k_proj", "o_proj"]
145
+ }
146
+ }
147
+ ```
148
+
149
+ ### 4.2 关键参数说明
150
+
151
+ | 参数 | 说明 | 推荐值 |
152
+ |---|---|---|
153
+ | `num_train_epochs` | 训练轮数 | 2-5 |
154
+ | `learning_rate` | 学习率 | 1e-4 ~ 3e-4 |
155
+ | `per_device_train_batch_size` | 每设备批大小 | 2-8(根据显存) |
156
+ | `gradient_accumulation_steps` | 梯度累积步数 | 2-8 |
157
+ | `max_seq_length` | 最大序列长度 | 1024-4096 |
158
+ | `lora.r` | LoRA 秩 | 8-32 |
159
+ | `lora.lora_alpha` | LoRA alpha | 16-64(通常为 r 的 2 倍) |
160
+ | `lora.lora_dropout` | LoRA dropout | 0.05-0.1 |
161
+
162
+ ### 4.3 开始训练
163
+
164
+ ```bash
165
+ cd training
166
+
167
+ # 使用默认配置训练
168
+ python train.py --config lora-config.json
169
+
170
+ # 指定基础模型
171
+ python train.py --config lora-config.json --base_model bigcode/starcoderbase-3b
172
+
173
+ # 从检查点恢复
174
+ python train.py --config lora-config.json --resume ./models/feihong-code-completion/checkpoint-1000
175
+ ```
176
+
177
+ ### 4.4 监控训练
178
+
179
+ ```bash
180
+ # TensorBoard
181
+ tensorboard --logdir ./models/feihong-code-completion/runs
182
+
183
+ # 查看训练日志
184
+ tail -f ./models/feihong-code-complement/train_log.txt
185
+ ```
186
+
187
+ ### 4.5 训练技巧
188
+
189
+ 1. **梯度检查点**:启用 `gradient_checkpointing: true` 节省显存
190
+ 2. **混合精度**:启用 `bf16: true`(Ampere 及以上 GPU)或 `fp16: true`
191
+ 3. **学习率调度**:使用 cosine 调度器,warmup 比例 3%
192
+ 4. **早停**:监控验证损失,3 轮无提升则停止
193
+ 5. **保存最佳模型**:`load_best_model_at_end: true`
194
+
195
+ ---
196
+
197
+ ## 5. 模型评估
198
+
199
+ ### 5.1 使用飞虹 Code 评估工具
200
+
201
+ 飞虹 Code 提供了 TypeScript 版本的补全模型评估工具。
202
+
203
+ ```bash
204
+ # 编译项目
205
+ npm run build
206
+
207
+ # 运行评估
208
+ node dist/cli/index.js fim-evaluate \
209
+ --samples ./data/fim/dataset.val.jsonl \
210
+ --model ./models/feihong-code-completion \
211
+ --output ./evaluation/result.json \
212
+ --max-samples 500
213
+ ```
214
+
215
+ ### 5.2 评估指标
216
+
217
+ | 指标 | 说明 | 目标值 |
218
+ |---|---|---|
219
+ | **精确匹配率** | 预测与期望完全一致的比例 | > 30% |
220
+ | **编辑相似度** | 1 - 编辑距离/最大长度 | > 70% |
221
+ | **前缀匹配率** | 预测前缀与期望前缀的匹配度 | > 60% |
222
+ | **首 Token 匹配率** | 第一个 token 是否匹配 | > 50% |
223
+ | **平均延迟** | 单次补全的平均耗时 | < 500ms |
224
+
225
+ ### 5.3 评估结果示例
226
+
227
+ ```
228
+ === 补全模型评估结果 ===
229
+ 样本数: 500
230
+ 精确匹配率: 32.40%
231
+ 编辑相似度: 74.56%
232
+ 前缀匹配率: 62.30%
233
+ 首Token匹配率: 54.80%
234
+ 平均延迟: 320.50ms
235
+
236
+ --- 按语言统计 ---
237
+ typescript: 200 样本, 精确匹配 35.0%, 编辑相似度 76.2%
238
+ javascript: 150 样本, 精确匹配 30.7%, 编辑相似度 73.1%
239
+ python: 100 样本, 精确匹配 28.0%, 编辑相似度 71.5%
240
+ 其他: 50 样本, 精确匹配 24.0%, 编辑相似度 68.3%
241
+ ```
242
+
243
+ ### 5.4 与基线模型对比
244
+
245
+ 建议在相同数据集上评估基线模型(未微调),对比提升效果:
246
+
247
+ ```bash
248
+ # 评估基线模型
249
+ node dist/cli/index.js fim-evaluate \
250
+ --samples ./data/fim/dataset.val.jsonl \
251
+ --model bigcode/starcoderbase-1b \
252
+ --output ./evaluation/baseline.json
253
+
254
+ # 对比结果
255
+ node dist/cli/index.js fim-compare \
256
+ --baseline ./evaluation/baseline.json \
257
+ --finetuned ./evaluation/result.json
258
+ ```
259
+
260
+ ---
261
+
262
+ ## 6. 模型导出与部署
263
+
264
+ ### 6.1 合并 LoRA 权重
265
+
266
+ 训练完成后,需要将 LoRA 权重合并到基础模型:
267
+
268
+ ```bash
269
+ cd training
270
+
271
+ # 合并 LoRA 并导出
272
+ python export.py \
273
+ --model_path ./models/feihong-code-completion \
274
+ --output ./models/exported \
275
+ --format merged
276
+ ```
277
+
278
+ ### 6.2 导出格式
279
+
280
+ | 格式 | 用途 | 命令 |
281
+ |---|---|---|
282
+ | **merged** | 通用部署(Transformers) | `--format merged` |
283
+ | **GGUF** | llama.cpp 本地推理 | `--format gguf` |
284
+ | **ONNX** | Web / 跨平台部署 | `--format onnx` |
285
+ | **all** | 导出所有格式 | `--format all` |
286
+
287
+ ### 6.3 导出产物
288
+
289
+ ```
290
+ models/exported/
291
+ ├── merged/ # 合并后的模型
292
+ │ ├── config.json
293
+ │ ├── model.safetensors
294
+ │ ├── tokenizer.json
295
+ │ └── training_config.json
296
+ ├── gguf/ # GGUF 格式(可选)
297
+ │ └── model.gguf
298
+ ├── onnx/ # ONNX 格式(可选)
299
+ │ ├── model.onnx
300
+ │ └── tokenizer.json
301
+ └── feihong-model-config.json # 飞虹 Code 模型配置
302
+ ```
303
+
304
+ ---
305
+
306
+ ## 7. 集成到飞虹 Code
307
+
308
+ ### 7.1 配置本地模型
309
+
310
+ 编辑飞虹 Code 配置文件(`~/.feihong-code/config.json`):
311
+
312
+ ```json
313
+ {
314
+ "completion": {
315
+ "provider": "local",
316
+ "model_path": "./models/exported/merged",
317
+ "model_config": "./models/exported/feihong-model-config.json",
318
+ "max_tokens": 100,
319
+ "temperature": 0.2,
320
+ "top_p": 0.95,
321
+ "context_window": 2048
322
+ }
323
+ }
324
+ ```
325
+
326
+ ### 7.2 启动本地推理服务
327
+
328
+ ```bash
329
+ # 使用飞虹 Code 内置的本地模型服务
330
+ node dist/cli/index.js serve-local-model \
331
+ --model ./models/exported/merged \
332
+ --port 8081
333
+
334
+ # 或使用 vLLM(推荐,性能更好)
335
+ pip install vllm
336
+ vllm serve ./models/exported/merged --port 8081 --dtype bfloat16
337
+ ```
338
+
339
+ ### 7.3 配置飞虹 Code 使用本地服务
340
+
341
+ ```json
342
+ {
343
+ "completion": {
344
+ "provider": "openai-compatible",
345
+ "base_url": "http://localhost:8081/v1",
346
+ "model": "feihong-code-completion",
347
+ "api_key": "not-needed"
348
+ }
349
+ }
350
+ ```
351
+
352
+ ### 7.4 验证集成
353
+
354
+ ```bash
355
+ # 启动飞虹 Code Web 控制台
356
+ node dist/cli/index.js serve --port 8080
357
+
358
+ # 测试补全
359
+ curl -X POST http://localhost:8080/api/completion \
360
+ -H "Content-Type: application/json" \
361
+ -d '{
362
+ "filePath": "test.ts",
363
+ "fileContent": "function sum(a: number, b: number): number { return ",
364
+ "cursorOffset": 50,
365
+ "language": "typescript"
366
+ }'
367
+ ```
368
+
369
+ ---
370
+
371
+ ## 附录:常见问题
372
+
373
+ ### Q1: 训练时 OOM (Out of Memory) 怎么办?
374
+
375
+ A:
376
+ 1. 减小 `per_device_train_batch_size`(如 1 或 2)
377
+ 2. 增大 `gradient_accumulation_steps` 保持有效批大小
378
+ 3. 减小 `max_seq_length`(如 1024)
379
+ 4. 启用 `gradient_checkpointing: true`
380
+ 5. 使用更小的基础模型(如 350M 或 1B)
381
+
382
+ ### Q2: 训练后模型效果不好怎么办?
383
+
384
+ A:
385
+ 1. 检查数据质量,确保样本多样化且高质量
386
+ 2. 增加训练轮数(如 5-10 轮)
387
+ 3. 调整学习率(如 1e-4 或 5e-5)
388
+ 4. 增大 LoRA rank(如 32 或 64)
389
+ 5. 增加 target_modules(包含更多层)
390
+ 6. 对比基线模型,确认确实有提升
391
+
392
+ ### Q3: 如何支持更多编程语言?
393
+
394
+ A:
395
+ 1. 在数据准备时指定 `--languages` 参数
396
+ 2. 确保训练数据包含目标语言的代码
397
+ 3. 使用支持多语言的基础模型(如 StarCoder、CodeLlama)
398
+ 4. 评估时按语言分别统计,针对性优化
399
+
400
+ ### Q4: 可以在 CPU 上训练吗?
401
+
402
+ A: 可以,但非常慢。建议:
403
+ 1. 使用 Google Colab (免费 T4 GPU)
404
+ 2. 使用云 GPU 服务(如 AutoDL、RunPod、Vast.ai)
405
+ 3. 使用更小的模型和数据集进行验证
@@ -0,0 +1,292 @@
1
+ # Feihong Code v7.0.0 Technical Specification
2
+
3
+ **Version**: 7.0.0
4
+ **Date**: August 24, 2026
5
+ **R&D Team**: Feihongzhi Technology Enterprise Management Co., Ltd. · Feiyang Qiyuan R&D Center
6
+
7
+ ---
8
+
9
+ ## 1. Product Overview
10
+
11
+ Feihong Code (feihong-code) is a terminal AI coding agent, benchmarked against Muse Code / Cursor CLI, supporting multi-model routing, enterprise-grade RBAC auditing, fully automated SWE Agent, and offline private deployment.
12
+
13
+ ### 1.1 Core Capabilities
14
+
15
+ - Natural Language to Code Changes: Transform user requirements into real, verifiable code repository changes
16
+ - Multi-model Routing: Support DeepSeek, Tongyi Qianwen, Ollama, OpenAI, and other models
17
+ - Fully Automated SWE Agent: Autonomous planning, execution, verification, and fixing
18
+ - Enterprise-grade Security: RBAC permissions, audit logs, workspace isolation
19
+ - Full Platform Support: Web console, Electron desktop, CLI command line
20
+
21
+ ### 1.2 Tech Stack
22
+
23
+ | Layer | Technology | Version |
24
+ |-------|-----------|---------|
25
+ | Runtime | Node.js | 18+ |
26
+ | Language | TypeScript | 5.x |
27
+ | Web Framework | Express | 4.x |
28
+ | Data Validation | Zod | 3.x |
29
+ | Frontend | Native HTML/CSS/JS | - |
30
+ | Desktop | Electron | 41.x |
31
+ | Packaging | electron-builder | 26.x |
32
+ | Build | tsc | 5.x |
33
+
34
+ ---
35
+
36
+ ## 2. System Architecture
37
+
38
+ ### 2.1 Overall Architecture
39
+
40
+ ```
41
+ ┌─────────────────────────────────────────────────┐
42
+ │ User Interface Layer │
43
+ │ ┌──────────┐ ┌──────────┐ ┌──────────────┐ │
44
+ │ │Web Console│ │ Desktop │ │ CLI │ │
45
+ │ └────┬─────┘ └────┬─────┘ └──────┬───────┘ │
46
+ └───────┼─────────────┼───────────────┼──────────┘
47
+ │ │ │
48
+ └─────────────┼───────────────┘
49
+
50
+ ┌───────▼───────┐
51
+ │ Express API │
52
+ │ Service Layer│
53
+ └───────┬───────┘
54
+
55
+ ┌─────────────┼─────────────┐
56
+ │ │ │
57
+ ┌─────▼─────┐ ┌─────▼─────┐ ┌─────▼─────┐
58
+ │Task Queue │ │Model Router│ │Audit │
59
+ │TaskQueue │ │Router │ │Security │
60
+ └─────┬─────┘ └─────┬─────┘ └───────────┘
61
+ │ │
62
+ ┌─────▼─────────────▼─────┐
63
+ │ SWE Agent Layer │
64
+ │ Orchestrator │
65
+ └─────┬───────────────────┘
66
+
67
+ ┌─────▼───────────────────┐
68
+ │ Tool Execution Layer │
69
+ │ File Ops / Shell / Browser│
70
+ └─────────────────────────┘
71
+ ```
72
+
73
+ ### 2.2 Core Modules
74
+
75
+ #### 2.2.1 Agent Layer (src/agent/)
76
+
77
+ - **orchestrator.ts**: Core orchestrator, manages conversation loop, tool calls, error recovery
78
+ - **prompts.ts**: System prompts, defines AI behavior boundaries and capability requirements
79
+ - **self-heal.ts**: Self-healing module, error classification, fix suggestion generation
80
+ - **code-writer.ts**: Code generation module
81
+ - **swe-agent.ts**: SWE Agent implementation
82
+ - **experience.ts**: Experience retrieval and reuse
83
+
84
+ #### 2.2.2 Web Service Layer (src/web/)
85
+
86
+ - **server.ts**: Express service, API routes, static file serving
87
+ - **task-queue.ts**: Task queue, concurrency control, task persistence, state management
88
+ - **public/**: Frontend static assets (HTML/CSS/JS)
89
+
90
+ #### 2.2.3 CLI Layer (src/cli/)
91
+
92
+ - **index.ts**: CLI entry, command parsing
93
+ - **commands.ts**: Command implementation (serve/run/init etc.)
94
+ - **version.ts**: Centralized version definition
95
+ - **repl.ts**: Interactive REPL
96
+
97
+ #### 2.2.4 Desktop (electron/)
98
+
99
+ - **main.js**: Electron main process, window management, server startup, IPC communication
100
+ - **preload.js**: Preload script, safely exposes API to renderer process
101
+
102
+ #### 2.2.5 Local Speech Recognition (funasr-server/)
103
+
104
+ - **app.py**: FastAPI service, based on faster-whisper
105
+ - **requirements.txt**: Python dependencies
106
+ - **启动语音识别服务.bat**: Windows one-click startup
107
+
108
+ ---
109
+
110
+ ## 3. Core Mechanisms
111
+
112
+ ### 3.1 Task Execution Flow
113
+
114
+ 1. **Task Submission**: User submits task via Web/Desktop/CLI
115
+ 2. **Task Enqueue**: TaskQueue receives task, sets status to queued
116
+ 3. **Task Execution**: Picks up task under concurrency control, calls Orchestrator
117
+ 4. **Orchestration Loop**: Orchestrator manages model calls, tool execution, result verification
118
+ 5. **Error Recovery**: Continuous errors trigger self-heal, generate fix suggestions and retry
119
+ 6. **Task Completion**: Result persisted, triggers webhook/notification
120
+
121
+ ### 3.2 Conversation Flow Rendering
122
+
123
+ - **conversation**: Complete conversation history, limit 300 messages
124
+ - **steps**: Thinking chain steps, limit 500
125
+ - **Real-time Polling**: Frontend polls task status every 1 second
126
+ - **Pure Text Output**: Frontend stripMarkdown hard defense, strips all formatting symbols
127
+ - **Thinking Process Display**: Extract model.response content from steps for real-time display
128
+
129
+ ### 3.3 Self-healing Mechanism
130
+
131
+ - **Error Classification**: 11 categories including compile-error / runtime-error / build-error / timeout
132
+ - **Continuous Error Detection**: Traverse all continuous error messages for classification recording
133
+ - **Fix Suggestion Generation**: Generate specific troubleshooting steps based on error type
134
+ - **Max Retries**: Default 3, configurable
135
+ - **Structured Report**: Error type + last error + fix suggestion + next step
136
+
137
+ ### 3.4 Permissions and Security
138
+
139
+ - **RBAC Permissions**: Read scope, write permission, Shell permission, network permission, browser permission
140
+ - **Workspace Isolation**: File operations limited to workspace scope
141
+ - **Audit Logs**: All operations recorded to event-log
142
+ - **Security Approval**: Dangerous operations require user confirmation
143
+
144
+ ---
145
+
146
+ ## 4. API Interfaces
147
+
148
+ ### 4.1 Core APIs
149
+
150
+ | Method | Path | Description |
151
+ |--------|------|-------------|
152
+ | GET | /api/health | Health check |
153
+ | POST | /api/auth/login | Login |
154
+ | GET | /api/tasks | Task list |
155
+ | POST | /api/tasks | Create task |
156
+ | GET | /api/tasks/:id | Task detail |
157
+ | POST | /api/tasks/:id/cancel | Cancel task |
158
+ | DELETE | /api/tasks/:id | Delete task |
159
+ | POST | /api/tasks/:id/continue | Continue task |
160
+ | GET | /api/models | Available model list |
161
+ | POST | /api/computer/screenshot | Computer screenshot |
162
+ | POST | /api/computer/mouse/move | Mouse move |
163
+ | POST | /api/computer/mouse/click | Mouse click |
164
+ | POST | /api/computer/keyboard/type | Keyboard type |
165
+ | POST | /api/computer/keyboard/press | Key press |
166
+
167
+ ### 4.2 Local Speech Recognition API
168
+
169
+ | Method | Path | Description |
170
+ |--------|------|-------------|
171
+ | GET | /health | Health check |
172
+ | POST | /api/recognize | Speech recognition (file upload) |
173
+ | POST | /api/recognize-bytes | Speech recognition (byte stream) |
174
+
175
+ ---
176
+
177
+ ## 5. Deployment
178
+
179
+ ### 5.1 npm Global Install
180
+
181
+ ```bash
182
+ npm install -g feihong-code
183
+ fhcode serve
184
+ ```
185
+
186
+ ### 5.2 Source Deployment
187
+
188
+ ```bash
189
+ git clone https://github.com/wch887292/feihong-code.git
190
+ cd feihong-code
191
+ npm install
192
+ npm run build
193
+ node dist/cli/index.js serve
194
+ ```
195
+
196
+ ### 5.3 Desktop Version
197
+
198
+ ```bash
199
+ # One-click startup
200
+ Double-click 一键启动桌面版.bat
201
+
202
+ # Or manual
203
+ npm run build
204
+ npm run electron
205
+ ```
206
+
207
+ ### 5.4 Local Speech Recognition Service
208
+
209
+ ```bash
210
+ cd funasr-server
211
+ Double-click 启动语音识别服务.bat
212
+ # Service URL: http://localhost:8082
213
+ ```
214
+
215
+ ---
216
+
217
+ ## 6. Configuration
218
+
219
+ ### 6.1 Environment Variables
220
+
221
+ | Variable | Description | Default |
222
+ |----------|-------------|---------|
223
+ | FH_WEB_PORT | Web service port | 8080 |
224
+ | FH_WEB_TOKEN | Access token | Auto-generated |
225
+ | FH_HOME | Data directory | ~/.feihong-code |
226
+ | FH_TASK_CONCURRENCY | Task concurrency | 2 |
227
+ | FH_TASK_PERSIST_DIR | Task persistence dir | FH_HOME/tasks |
228
+ | FH_TASK_WEBHOOK_URL | Task webhook | - |
229
+
230
+ ### 6.2 Model Configuration
231
+
232
+ Supports multi-model routing, configurable in Web console:
233
+ - DeepSeek (deepseek-chat / deepseek-coder)
234
+ - Tongyi Qianwen (qwen-turbo / qwen-max)
235
+ - Ollama (local models)
236
+ - OpenAI compatible interfaces
237
+
238
+ ---
239
+
240
+ ## 7. Extension Development
241
+
242
+ ### 7.1 Add New Tool
243
+
244
+ Add tool definition under `src/agent/tools/`, following Zod schema specification.
245
+
246
+ ### 7.2 Add New Skill
247
+
248
+ Create skill directory under workspace `.feihong/skills/`, containing SKILL.md and scripts.
249
+
250
+ ### 7.3 Plugin System
251
+
252
+ Template library supports custom sources, connects to external plugin systems through nodes.
253
+
254
+ ---
255
+
256
+ ## 8. Performance Metrics
257
+
258
+ | Metric | Value |
259
+ |--------|-------|
260
+ | Startup Time | < 3 seconds |
261
+ | Task Concurrency | Default 2, configurable |
262
+ | Conversation History | 300 messages |
263
+ | Thinking Steps | 500 |
264
+ | Frontend Poll Interval | 1 second |
265
+ | Build Time | < 10 seconds |
266
+ | Desktop Memory | ~200MB |
267
+
268
+ ---
269
+
270
+ ## 9. Directory Structure
271
+
272
+ ```
273
+ feihong-code/
274
+ ├── src/ # Source code
275
+ │ ├── agent/ # Agent core
276
+ │ ├── cli/ # CLI
277
+ │ ├── models/ # Model abstraction
278
+ │ ├── runtime/ # Runtime
279
+ │ ├── shared/ # Shared utilities
280
+ │ └── web/ # Web service
281
+ ├── electron/ # Electron desktop
282
+ ├── funasr-server/ # Local speech recognition
283
+ ├── docs/ # Documentation
284
+ ├── dist/ # Build output
285
+ ├── package.json
286
+ ├── tool-schema.json
287
+ └── README.md
288
+ ```
289
+
290
+ ---
291
+
292
+ *Feihongzhi Technology Enterprise Management Co., Ltd. · Feiyang Qiyuan R&D Center*