feihong-code 7.5.0 → 7.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 (347) hide show
  1. package/.github/workflows/ci.yml +193 -180
  2. package/.github/workflows/release.yml +203 -200
  3. package/.github/workflows/swebench-real.yml +84 -0
  4. package/CHANGELOG.md +117 -94
  5. package/CONTRIBUTING.md +9 -2
  6. package/README.md +636 -609
  7. package/README.self-evolve.md +279 -274
  8. package/dist/agent/change-manager.js +1 -1
  9. package/dist/agent/code-rag.js +1 -1
  10. package/dist/agent/code-review.js +1 -1
  11. package/dist/agent/code-writer.js +1 -1
  12. package/dist/agent/completion-postprocess.js +1 -1
  13. package/dist/agent/context-compactor.js +11 -0
  14. package/dist/agent/context-compactor.js.map +1 -1
  15. package/dist/agent/custom-agent.js +52 -52
  16. package/dist/agent/design-to-code.js +40 -40
  17. package/dist/agent/experience.js +1 -1
  18. package/dist/agent/layered-memory.js +1 -1
  19. package/dist/agent/lint.js +1 -1
  20. package/dist/agent/multi-agent.js +44 -44
  21. package/dist/agent/orchestrator.js +93 -18
  22. package/dist/agent/orchestrator.js.map +1 -1
  23. package/dist/agent/parallel-orchestrator.js +1 -1
  24. package/dist/agent/planner.js +8 -3
  25. package/dist/agent/planner.js.map +1 -1
  26. package/dist/agent/prompts.js +2 -2
  27. package/dist/agent/quality-gate.js +1 -1
  28. package/dist/agent/repo-context.js +1 -1
  29. package/dist/agent/repo-reader.js +1 -1
  30. package/dist/agent/repo-underwriter.js +1 -1
  31. package/dist/agent/self-correction.js +1 -1
  32. package/dist/agent/self-heal.js +5 -0
  33. package/dist/agent/self-heal.js.map +1 -1
  34. package/dist/agent/self-improver.js +1 -1
  35. package/dist/agent/subagent-summary.js +1 -1
  36. package/dist/agent/subagent.js +1 -1
  37. package/dist/agent/swe-agent.js +1 -1
  38. package/dist/agent/swe-verifier.js +1 -1
  39. package/dist/agent/symbol-index.js +1 -1
  40. package/dist/agent/team.js +1 -1
  41. package/dist/agent/type-checker.js +1 -1
  42. package/dist/cli/commands.js +7 -0
  43. package/dist/cli/commands.js.map +1 -1
  44. package/dist/cli/index.js +57 -2
  45. package/dist/cli/index.js.map +1 -1
  46. package/dist/cli/repl.js +1 -1
  47. package/dist/cli/run.js +40 -3
  48. package/dist/cli/run.js.map +1 -1
  49. package/dist/cli/self-evolve-cli.js +168 -0
  50. package/dist/cli/tui-run.js +1 -1
  51. package/dist/cli/tui.js +1 -1
  52. package/dist/cli/version.js +3 -3
  53. package/dist/cli/version.js.map +1 -1
  54. package/dist/enterprise/audit.js +1 -1
  55. package/dist/enterprise/index.js +1 -1
  56. package/dist/enterprise/policy.js +1 -1
  57. package/dist/enterprise/quota.js +1 -1
  58. package/dist/enterprise/tenant.js +1 -1
  59. package/dist/harness/executor.js +1 -1
  60. package/dist/harness/index.js +1 -1
  61. package/dist/harness/loader.js +1 -1
  62. package/dist/harness/types.js +1 -1
  63. package/dist/harness/verifier.js +52 -12
  64. package/dist/harness/verifier.js.map +1 -1
  65. package/dist/hello.js +14 -0
  66. package/dist/hello.js.map +1 -0
  67. package/dist/integrations/feishu-bridge.js +348 -0
  68. package/dist/integrations/feishu-bridge.js.map +1 -0
  69. package/dist/integrations/github-mcp.js +137 -0
  70. package/dist/integrations/github-mcp.js.map +1 -0
  71. package/dist/integrations/wechat-bridge.js +499 -0
  72. package/dist/integrations/wechat-bridge.js.map +1 -0
  73. package/dist/integrations/yuanbao-bridge.js +326 -0
  74. package/dist/integrations/yuanbao-bridge.js.map +1 -0
  75. package/dist/lsp/lsp-client.js +1 -1
  76. package/dist/models/model-router.js +1 -1
  77. package/dist/models/model.dto.js +1 -1
  78. package/dist/models/providers/ollama.provider.js +1 -1
  79. package/dist/models/providers/openai-compatible.provider.js +1 -1
  80. package/dist/plugins/plugin-loader.js +1 -1
  81. package/dist/runtime/event-log.js +1 -1
  82. package/dist/runtime/git.js +1 -1
  83. package/dist/runtime/hooks.js +71 -4
  84. package/dist/runtime/hooks.js.map +1 -1
  85. package/dist/runtime/session-persist.js +1 -1
  86. package/dist/runtime/worktree.js +1 -1
  87. package/dist/self-evolve/hook.ts +80 -0
  88. package/dist/self-evolve/manager.d.ts +8 -0
  89. package/dist/self-evolve/manager.js +517 -401
  90. package/dist/self-evolve/self-heal-scheduler.js +160 -0
  91. package/dist/self-evolve/self-heal-scheduler.js.map +1 -0
  92. package/dist/shared/concurrency.js +1 -1
  93. package/dist/shared/config.js +4 -2
  94. package/dist/shared/config.js.map +1 -1
  95. package/dist/shared/errors.js +1 -1
  96. package/dist/shared/i18n.js +1 -1
  97. package/dist/shared/i18n.js.map +1 -1
  98. package/dist/shared/secure-store.js +12 -5
  99. package/dist/shared/secure-store.js.map +1 -1
  100. package/dist/shared/types.js +1 -1
  101. package/dist/skills/goal.js +1 -1
  102. package/dist/skills/grill.js +1 -1
  103. package/dist/skills/plan.js +1 -1
  104. package/dist/skills/pua-hooks.js +273 -0
  105. package/dist/skills/pua-hooks.js.map +1 -0
  106. package/dist/skills/self-heal.js +9 -3
  107. package/dist/skills/self-heal.js.map +1 -1
  108. package/dist/skills/skill-loader.js +1 -1
  109. package/dist/skills/skill-market.js +84 -8
  110. package/dist/skills/skill-market.js.map +1 -1
  111. package/dist/tools/analysis/code-analyzer.js +1 -1
  112. package/dist/tools/file/edit.tool.js +18 -3
  113. package/dist/tools/file/edit.tool.js.map +1 -1
  114. package/dist/tools/file/list.tool.js +1 -1
  115. package/dist/tools/file/read.tool.js +1 -1
  116. package/dist/tools/file/write.tool.js +1 -1
  117. package/dist/tools/generator/code-generator.js +1 -1
  118. package/dist/tools/generator/test-generator.js +1 -1
  119. package/dist/tools/index.js +1 -1
  120. package/dist/tools/mcp/index.js +1 -1
  121. package/dist/tools/mcp/mcp-client.js +1 -1
  122. package/dist/tools/safe-path.js +1 -1
  123. package/dist/tools/search/grep.tool.js +1 -1
  124. package/dist/tools/shell/exec.js +1 -1
  125. package/dist/tools/shell/run-shell.tool.js +1 -1
  126. package/dist/tools/skills/load-skill.tool.js +1 -1
  127. package/dist/tools/tool.registry.js +10 -1
  128. package/dist/tools/tool.registry.js.map +1 -1
  129. package/dist/tools/verify/build-check.tool.js +1 -1
  130. package/dist/tools/verify/test-run.tool.js +1 -1
  131. package/dist/tools/web/web.tool.js +1 -1
  132. package/dist/voice/voice-programming.js +32 -6
  133. package/dist/voice/voice-programming.js.map +1 -1
  134. package/dist/web/auth.js +34 -2
  135. package/dist/web/auth.js.map +1 -1
  136. package/dist/web/channels.js +1 -1
  137. package/dist/web/public/css/style.css +1751 -1724
  138. package/dist/web/public/index.html +1243 -1242
  139. package/dist/web/public/js/api.js +558 -555
  140. package/dist/web/public/js/app.js +2233 -2210
  141. package/dist/web/public/js/mock-api.js +259 -234
  142. package/dist/web/public/js/monaco-editor.js +363 -363
  143. package/dist/web/public/js/ui.js +2217 -2251
  144. package/dist/web/public/js/utils.js +214 -214
  145. package/dist/web/public/manifest.json +59 -59
  146. package/dist/web/public/service-worker.js +149 -173
  147. package/dist/web/public/vendor/monaco/vs/abap-D-t0cyap.js +1 -0
  148. package/dist/web/public/vendor/monaco/vs/apex-CcIm7xu6.js +1 -0
  149. package/dist/web/public/vendor/monaco/vs/assets/css.worker-URu8fCFR.js +97 -0
  150. package/dist/web/public/vendor/monaco/vs/assets/editor.worker-lj3bdIIn.js +30 -0
  151. package/dist/web/public/vendor/monaco/vs/assets/editorWebWorkerMain-CA_vMoUU.js +30 -0
  152. package/dist/web/public/vendor/monaco/vs/assets/html.worker-D1SL3iM8.js +474 -0
  153. package/dist/web/public/vendor/monaco/vs/assets/json.worker-CoJx_OPf.js +62 -0
  154. package/dist/web/public/vendor/monaco/vs/assets/ts.worker-BWKtMYOk.js +67722 -0
  155. package/dist/web/public/vendor/monaco/vs/azcli-BA0tQDCg.js +1 -0
  156. package/dist/web/public/vendor/monaco/vs/basic-languages/monaco.contribution.js +1 -0
  157. package/dist/web/public/vendor/monaco/vs/bat-C397hTD6.js +1 -0
  158. package/dist/web/public/vendor/monaco/vs/bicep-DF5aW17k.js +2 -0
  159. package/dist/web/public/vendor/monaco/vs/cameligo-plsz8qhj.js +1 -0
  160. package/dist/web/public/vendor/monaco/vs/clojure-Y2auQMzK.js +1 -0
  161. package/dist/web/public/vendor/monaco/vs/coffee-Bu45yuWE.js +1 -0
  162. package/dist/web/public/vendor/monaco/vs/cpp-CkKPQIni.js +1 -0
  163. package/dist/web/public/vendor/monaco/vs/csharp-CX28MZyh.js +1 -0
  164. package/dist/web/public/vendor/monaco/vs/csp-D8uWnyxW.js +1 -0
  165. package/dist/web/public/vendor/monaco/vs/css-CaeNmE3S.js +3 -0
  166. package/dist/web/public/vendor/monaco/vs/css.worker-CyhWkhHo.js +1 -0
  167. package/dist/web/public/vendor/monaco/vs/cssMode-CV6Ay48H.js +1 -0
  168. package/dist/web/public/vendor/monaco/vs/cypher-DVThT8BS.js +1 -0
  169. package/dist/web/public/vendor/monaco/vs/dart-CmGfCvrO.js +1 -0
  170. package/dist/web/public/vendor/monaco/vs/dockerfile-CZqqYdch.js +1 -0
  171. package/dist/web/public/vendor/monaco/vs/ecl-30fUercY.js +1 -0
  172. package/dist/web/public/vendor/monaco/vs/editor/editor.main.css +1 -0
  173. package/dist/web/public/vendor/monaco/vs/editor/editor.main.js +1 -0
  174. package/dist/web/public/vendor/monaco/vs/editor/editor.worker.js +1 -0
  175. package/dist/web/public/vendor/monaco/vs/editor-KLE6jdfb.js +831 -0
  176. package/dist/web/public/vendor/monaco/vs/editor.js +1 -0
  177. package/dist/web/public/vendor/monaco/vs/editorWorkerHost-fVE1cjcC.js +35 -0
  178. package/dist/web/public/vendor/monaco/vs/elixir-xjPaIfzF.js +1 -0
  179. package/dist/web/public/vendor/monaco/vs/flow9-DqtmStfK.js +1 -0
  180. package/dist/web/public/vendor/monaco/vs/freemarker2-FWreY7v7.js +3 -0
  181. package/dist/web/public/vendor/monaco/vs/fsharp-BOMdg4U1.js +1 -0
  182. package/dist/web/public/vendor/monaco/vs/go-D_hbi-Jt.js +1 -0
  183. package/dist/web/public/vendor/monaco/vs/graphql-CKUU4kLG.js +1 -0
  184. package/dist/web/public/vendor/monaco/vs/handlebars-CZi4pHCH.js +1 -0
  185. package/dist/web/public/vendor/monaco/vs/hcl-DTaboeZW.js +1 -0
  186. package/dist/web/public/vendor/monaco/vs/html-j_7ZTNRU.js +1 -0
  187. package/dist/web/public/vendor/monaco/vs/html.worker-CA3iAimZ.js +1 -0
  188. package/dist/web/public/vendor/monaco/vs/htmlMode-27by_KM4.js +1 -0
  189. package/dist/web/public/vendor/monaco/vs/index-049xrXrp.js +1 -0
  190. package/dist/web/public/vendor/monaco/vs/index-CBVt3dzv.js +5 -0
  191. package/dist/web/public/vendor/monaco/vs/index.js +1 -0
  192. package/dist/web/public/vendor/monaco/vs/ini-CsNwO04R.js +1 -0
  193. package/dist/web/public/vendor/monaco/vs/initialize-DL0l1TGY.js +1 -0
  194. package/dist/web/public/vendor/monaco/vs/java-CI4ZMsH9.js +1 -0
  195. package/dist/web/public/vendor/monaco/vs/javascript-DTJl4Jn1.js +1 -0
  196. package/dist/web/public/vendor/monaco/vs/json.worker-BizpAl9O.js +1 -0
  197. package/dist/web/public/vendor/monaco/vs/jsonMode-DLUiMUrI.js +1 -0
  198. package/dist/web/public/vendor/monaco/vs/julia-BwzEvaQw.js +1 -0
  199. package/dist/web/public/vendor/monaco/vs/kotlin-IUYPiTV8.js +1 -0
  200. package/dist/web/public/vendor/monaco/vs/language/css/css.worker.js +66 -0
  201. package/dist/web/public/vendor/monaco/vs/language/css/monaco.contribution.js +1 -0
  202. package/dist/web/public/vendor/monaco/vs/language/html/html.worker.js +443 -0
  203. package/dist/web/public/vendor/monaco/vs/language/html/monaco.contribution.js +1 -0
  204. package/dist/web/public/vendor/monaco/vs/language/json/json.worker.js +17 -0
  205. package/dist/web/public/vendor/monaco/vs/language/json/monaco.contribution.js +1 -0
  206. package/dist/web/public/vendor/monaco/vs/language/typescript/monaco.contribution.js +1 -0
  207. package/dist/web/public/vendor/monaco/vs/language/typescript/ts.worker.js +67693 -0
  208. package/dist/web/public/vendor/monaco/vs/less-C0eDYdqa.js +2 -0
  209. package/dist/web/public/vendor/monaco/vs/lexon-iON-Kj97.js +1 -0
  210. package/dist/web/public/vendor/monaco/vs/liquid-CLJYelW6.js +1 -0
  211. package/dist/web/public/vendor/monaco/vs/loader.js +1368 -0
  212. package/dist/web/public/vendor/monaco/vs/lspLanguageFeatures-BIkJOWLw.js +2 -0
  213. package/dist/web/public/vendor/monaco/vs/lua-DtygF91M.js +1 -0
  214. package/dist/web/public/vendor/monaco/vs/m3-CsR4AuFi.js +1 -0
  215. package/dist/web/public/vendor/monaco/vs/main-BEx-Fmlo.js +15 -0
  216. package/dist/web/public/vendor/monaco/vs/main-DsK8pnKg.js +3 -0
  217. package/dist/web/public/vendor/monaco/vs/markdown-C_rD0bIw.js +1 -0
  218. package/dist/web/public/vendor/monaco/vs/mdx-CpzZIPHF.js +1 -0
  219. package/dist/web/public/vendor/monaco/vs/mips-CiYP61RB.js +1 -0
  220. package/dist/web/public/vendor/monaco/vs/monaco.contribution-9cKT3C7t.js +1 -0
  221. package/dist/web/public/vendor/monaco/vs/monaco.contribution-BE88ZNGY.js +1 -0
  222. package/dist/web/public/vendor/monaco/vs/monaco.contribution-BPhsneLd.js +1 -0
  223. package/dist/web/public/vendor/monaco/vs/monaco.contribution-BgRy6xDf.js +1 -0
  224. package/dist/web/public/vendor/monaco/vs/msdax-C38-sJlp.js +1 -0
  225. package/dist/web/public/vendor/monaco/vs/mysql-CdtbpvbG.js +1 -0
  226. package/dist/web/public/vendor/monaco/vs/nls/lang/cs.d.ts +1 -0
  227. package/dist/web/public/vendor/monaco/vs/nls/lang/cs.js +9 -0
  228. package/dist/web/public/vendor/monaco/vs/nls/lang/de.d.ts +1 -0
  229. package/dist/web/public/vendor/monaco/vs/nls/lang/de.js +9 -0
  230. package/dist/web/public/vendor/monaco/vs/nls/lang/es.d.ts +1 -0
  231. package/dist/web/public/vendor/monaco/vs/nls/lang/es.js +9 -0
  232. package/dist/web/public/vendor/monaco/vs/nls/lang/fr.d.ts +1 -0
  233. package/dist/web/public/vendor/monaco/vs/nls/lang/fr.js +9 -0
  234. package/dist/web/public/vendor/monaco/vs/nls/lang/it.d.ts +1 -0
  235. package/dist/web/public/vendor/monaco/vs/nls/lang/it.js +9 -0
  236. package/dist/web/public/vendor/monaco/vs/nls/lang/ja.d.ts +1 -0
  237. package/dist/web/public/vendor/monaco/vs/nls/lang/ja.js +9 -0
  238. package/dist/web/public/vendor/monaco/vs/nls/lang/ko.d.ts +1 -0
  239. package/dist/web/public/vendor/monaco/vs/nls/lang/ko.js +9 -0
  240. package/dist/web/public/vendor/monaco/vs/nls/lang/pl.d.ts +1 -0
  241. package/dist/web/public/vendor/monaco/vs/nls/lang/pl.js +9 -0
  242. package/dist/web/public/vendor/monaco/vs/nls/lang/pt-br.d.ts +1 -0
  243. package/dist/web/public/vendor/monaco/vs/nls/lang/pt-br.js +9 -0
  244. package/dist/web/public/vendor/monaco/vs/nls/lang/ru.d.ts +1 -0
  245. package/dist/web/public/vendor/monaco/vs/nls/lang/ru.js +9 -0
  246. package/dist/web/public/vendor/monaco/vs/nls/lang/tr.d.ts +1 -0
  247. package/dist/web/public/vendor/monaco/vs/nls/lang/tr.js +9 -0
  248. package/dist/web/public/vendor/monaco/vs/nls/lang/zh-cn.d.ts +1 -0
  249. package/dist/web/public/vendor/monaco/vs/nls/lang/zh-cn.js +9 -0
  250. package/dist/web/public/vendor/monaco/vs/nls/lang/zh-tw.d.ts +1 -0
  251. package/dist/web/public/vendor/monaco/vs/nls/lang/zh-tw.js +9 -0
  252. package/dist/web/public/vendor/monaco/vs/nls.messages-loader.js +1 -0
  253. package/dist/web/public/vendor/monaco/vs/objective-c-CntZFaHX.js +1 -0
  254. package/dist/web/public/vendor/monaco/vs/pascal-r6kuqfl_.js +1 -0
  255. package/dist/web/public/vendor/monaco/vs/pascaligo-BiXoTmXh.js +1 -0
  256. package/dist/web/public/vendor/monaco/vs/perl-DABw_TcH.js +1 -0
  257. package/dist/web/public/vendor/monaco/vs/pgsql-me_jFXeX.js +1 -0
  258. package/dist/web/public/vendor/monaco/vs/php-D_kh-9LK.js +1 -0
  259. package/dist/web/public/vendor/monaco/vs/pla-VfZjczW0.js +1 -0
  260. package/dist/web/public/vendor/monaco/vs/postiats-BBSzz8Pk.js +1 -0
  261. package/dist/web/public/vendor/monaco/vs/powerquery-Dt-g_2cc.js +1 -0
  262. package/dist/web/public/vendor/monaco/vs/powershell-B-7ap1zc.js +1 -0
  263. package/dist/web/public/vendor/monaco/vs/protobuf-BmtuEB1A.js +2 -0
  264. package/dist/web/public/vendor/monaco/vs/pug-BRpRNeEb.js +1 -0
  265. package/dist/web/public/vendor/monaco/vs/python-CqWUUgfu.js +1 -0
  266. package/dist/web/public/vendor/monaco/vs/qsharp-BzsFaUU9.js +1 -0
  267. package/dist/web/public/vendor/monaco/vs/r-f8dDdrp4.js +1 -0
  268. package/dist/web/public/vendor/monaco/vs/razor-hok5y9Km.js +1 -0
  269. package/dist/web/public/vendor/monaco/vs/redis-fvZQY4PI.js +1 -0
  270. package/dist/web/public/vendor/monaco/vs/redshift-45Et0LQi.js +1 -0
  271. package/dist/web/public/vendor/monaco/vs/restructuredtext-C7UUFKFD.js +1 -0
  272. package/dist/web/public/vendor/monaco/vs/ruby-CZO8zYTz.js +1 -0
  273. package/dist/web/public/vendor/monaco/vs/rust-Bfetafyc.js +1 -0
  274. package/dist/web/public/vendor/monaco/vs/sb-3GYllVck.js +1 -0
  275. package/dist/web/public/vendor/monaco/vs/scala-foMgrKo1.js +1 -0
  276. package/dist/web/public/vendor/monaco/vs/scheme-CHdMtr7p.js +1 -0
  277. package/dist/web/public/vendor/monaco/vs/scss-C1cmLt9V.js +3 -0
  278. package/dist/web/public/vendor/monaco/vs/shell-ClXCKCEW.js +1 -0
  279. package/dist/web/public/vendor/monaco/vs/solidity-MZ6ExpPy.js +1 -0
  280. package/dist/web/public/vendor/monaco/vs/sophia-DWkuSsPQ.js +1 -0
  281. package/dist/web/public/vendor/monaco/vs/sparql-AUGFYSyk.js +1 -0
  282. package/dist/web/public/vendor/monaco/vs/sql-32GpJSV2.js +1 -0
  283. package/dist/web/public/vendor/monaco/vs/st-CuDFIVZ_.js +1 -0
  284. package/dist/web/public/vendor/monaco/vs/swift-t-PfMj7W.js +1 -0
  285. package/dist/web/public/vendor/monaco/vs/systemverilog-Ch4vA8Yt.js +1 -0
  286. package/dist/web/public/vendor/monaco/vs/tcl-D74tq1nH.js +1 -0
  287. package/dist/web/public/vendor/monaco/vs/toggleHighContrast-qGX7E9o7.js +61 -0
  288. package/dist/web/public/vendor/monaco/vs/ts.worker-2QLmBukE.js +1 -0
  289. package/dist/web/public/vendor/monaco/vs/tsMode-B0S_kp2q.js +11 -0
  290. package/dist/web/public/vendor/monaco/vs/twig-C6taOxMV.js +1 -0
  291. package/dist/web/public/vendor/monaco/vs/typescript-_2t_511t.js +1 -0
  292. package/dist/web/public/vendor/monaco/vs/typespec-8OfoLt6R.js +1 -0
  293. package/dist/web/public/vendor/monaco/vs/vb-Dyb2648j.js +1 -0
  294. package/dist/web/public/vendor/monaco/vs/wgsl-BhLXMOR0.js +298 -0
  295. package/dist/web/public/vendor/monaco/vs/workers-BBttULjf.js +1 -0
  296. package/dist/web/public/vendor/monaco/vs/xml-cZjNDqDT.js +1 -0
  297. package/dist/web/public/vendor/monaco/vs/yaml-A1fOIdH6.js +1 -0
  298. package/dist/web/server.js +81 -16
  299. package/dist/web/server.js.map +1 -1
  300. package/dist/web/task-queue.js +6 -21
  301. package/dist/web/task-queue.js.map +1 -1
  302. package/dist/web/web-config.js +143 -0
  303. package/dist/web/web-config.js.map +1 -0
  304. package/docs/App/344/275/277/347/224/250/350/257/264/346/230/216/344/271/246.md +1 -1
  305. package/docs/App/346/212/200/346/234/257/350/257/264/346/230/216/344/271/246.md +1 -1
  306. package/docs/BENCHMARK_REPORT_en.md +386 -386
  307. package/docs/BENCHMARK_REPORT_zh.md +386 -386
  308. package/docs/DPA.md +65 -63
  309. 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 +69 -67
  310. package/docs/Deployment_Guide_EN.md +1 -1
  311. package/docs/SECURITY_WHITEPAPER.md +2 -2
  312. package/docs/SELF-EVOLVE-GUIDE.md +1 -1
  313. package/docs/SWE_BENCH_REPORT.md +73 -55
  314. package/docs/TECHNICAL_SPEC_en.md +292 -292
  315. package/docs/TECHNICAL_SPEC_zh.md +292 -292
  316. package/docs/Technical_Manual_EN.md +1 -1
  317. package/docs/UPDATE_NOTES_en.md +159 -159
  318. package/docs/UPDATE_NOTES_zh.md +159 -159
  319. package/docs/UPGRADE_7.2.0.md +309 -309
  320. package/docs/UPGRADE_GUIDE_7_5.md +86 -86
  321. package/docs/UPGRADE_GUIDE_7_6.md +153 -0
  322. package/docs/User_Manual_EN.md +1 -1
  323. package/docs/VOLTAGENT_SKILLS_CATALOG.md +95 -0
  324. package/docs/error-codes.md +1 -1
  325. package/docs/geo-feihong-code.html +391 -391
  326. package/docs//344/272/247/345/223/201/345/274/200/345/217/221/346/226/207/346/241/243.md +5 -3
  327. package/docs//344/275/277/347/224/250/350/257/264/346/230/216/344/271/246.md +140 -231
  328. 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 -208
  329. 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 -152
  330. 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 -271
  331. 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 -59
  332. package/docs//345/256/211/345/205/250/347/231/275/347/232/256/344/271/246_v7.2.0.md +84 -82
  333. package/docs//346/212/200/346/234/257/350/257/264/346/230/216/344/271/246.md +240 -149
  334. package/docs//351/203/250/347/275/262/350/257/264/346/230/216/344/271/246.md +2 -2
  335. package/electron/main.js +404 -404
  336. package/package.json +12 -5
  337. package/templates/skills/api-design/SKILL.md +1 -1
  338. package/templates/skills/code-review/SKILL.md +1 -1
  339. package/templates/skills/dependency-upgrade/SKILL.md +1 -1
  340. package/templates/skills/doc-gen/SKILL.md +1 -1
  341. package/templates/skills/git-flow/SKILL.md +1 -1
  342. package/templates/skills/onboarding/SKILL.md +1 -1
  343. package/templates/skills/performance/SKILL.md +1 -1
  344. package/templates/skills/refactor/SKILL.md +1 -1
  345. package/templates/skills/security-audit/SKILL.md +1 -1
  346. package/templates/skills/test-gen/SKILL.md +1 -1
  347. package/tool-schema.json +197 -197
@@ -1,214 +1,214 @@
1
- /**
2
- * 工具函数模块:纯函数,无状态依赖,可被任意模块调用
3
- */
4
-
5
- function formatMarkdown(text) {
6
- // 简单 Markdown 转换
7
- return text
8
- .replace(/&/g, '&')
9
- .replace(/</g, '&lt;')
10
- .replace(/>/g, '&gt;')
11
- .replace(/^### (.*$)/gm, '<h3>$1</h3>')
12
- .replace(/^## (.*$)/gm, '<h2>$1</h2>')
13
- .replace(/^# (.*$)/gm, '<h1>$1</h1>')
14
- .replace(/\*\*(.*?)\*\*/g, '<strong>$1</strong>')
15
- .replace(/\*(.*?)\*/g, '<em>$1</em>')
16
- .replace(/`(.*?)`/g, '<code>$1</code>')
17
- .replace(/\n/g, '<br>');
18
- }
19
-
20
- function getDirectoryName(path) {
21
- if (!path || path === '' || path === '/') return '/';
22
- if (/^[A-Za-z]:$/.test(path)) return path + '\\';
23
- if (/^[A-Za-z]:\\$/.test(path)) return path;
24
- const parts = path.split(/[/\\]/).filter(Boolean);
25
- if (parts.length <= 1) {
26
- const driveMatch = parts[0].match(/^([A-Za-z]):$/);
27
- if (driveMatch) return driveMatch[1] + ':\\';
28
- return parts[0] || '/';
29
- }
30
- const parentParts = parts.slice(0, -1);
31
- if (/^[A-Za-z]:$/.test(parentParts[0])) {
32
- return parentParts[0] + '\\' + parentParts.slice(1).join('\\');
33
- }
34
- return parentParts.join('\\');
35
- }
36
-
37
- /** 渲染空状态提示,减少重复的 innerHTML 赋值代码 */
38
- function renderEmpty(el, text) {
39
- if (el) el.innerHTML = '<div class="empty">' + (text || '') + '</div>';
40
- }
41
-
42
- function extractUrl(text) {
43
- if (!text) return '';
44
- const m = text.match(/(https?:\/\/[^\s]+)/);
45
- return m ? m[1] : '';
46
- }
47
-
48
- function linkifyArtifacts(text) {
49
- let html = escapeHtml(text);
50
- // 占位符保护:先提取已识别的片段,避免后续正则把已插入的 <span> 标签二次包裹
51
- const tokens = [];
52
- const protect = (s) => { const k = '\u0000TOK' + tokens.length + '\u0000'; tokens.push(s); return k; };
53
- // 1) URL:排除结尾标点与 HTML 实体
54
- html = html.replace(/(https?:\/\/[^\s<>"'()]+)/g, (m) => protect('<span class="artifact" data-kind="url" data-path="' + m + '">' + m + '</span>'));
55
- // 2) Windows 绝对路径(支持正/反斜杠、中文、空格,排除结尾标点)
56
- html = html.replace(/([A-Za-z]:[\\\/][^\s<>"'()]+?)(?=[\s<>"',。;:、))]|$)/g, (m) => protect('<span class="artifact" data-kind="file" data-path="' + m + '">' + m + '</span>'));
57
- // 3) Unix 风格绝对路径(至少两级目录,避免误匹配 "2023/2024"、"a/b" 等相对写法)
58
- html = html.replace(/(\/(?:[A-Za-z0-9_\-.]+\/){1,}[A-Za-z0-9_\-.]*)/g, (m) => protect('<span class="artifact" data-kind="file" data-path="' + m + '">' + m + '</span>'));
59
- tokens.forEach((s, i) => { html = html.split('\u0000TOK' + i + '\u0000').join(s); });
60
- return html;
61
- }
62
-
63
- function formatSize(n) {
64
- if (!Number.isFinite(n)) return '';
65
- if (n < 1024) return n + ' B';
66
- if (n < 1024 * 1024) return (n / 1024).toFixed(1) + ' KB';
67
- return (n / 1024 / 1024).toFixed(2) + ' MB';
68
- }
69
-
70
- function estimateDataUrlSize(dataUrl) {
71
- // base64 长度 × 0.75 估算字节
72
- const b64 = (dataUrl || '').split(',')[1] || '';
73
- return Math.round(b64.length * 0.75);
74
- }
75
-
76
- function formatToolArgs(args) {
77
- if (!args || typeof args !== 'object') return '';
78
- const keys = Object.keys(args);
79
- if (!keys.length) return '';
80
- const rows = keys.map(function (k) {
81
- let v = args[k];
82
- if (v == null) v = '';
83
- else if (typeof v === 'object') v = JSON.stringify(v);
84
- return '<div><span style="color:var(--ink-2,#6b7280);">' + escapeHtml(k) + ':</span> ' + escapeHtml(String(v)) + '</div>';
85
- });
86
- return '<div class="tc-args">' + rows.join('') + '</div>';
87
- }
88
-
89
- function renderMarkdown(text) {
90
- let html = escapeHtml(text == null ? '' : text);
91
- const codeBlocks = [];
92
- html = html.replace(/```(\w*)\n?([\s\S]*?)```/g, function (_, lang, code) {
93
- const idx = codeBlocks.length;
94
- codeBlocks.push('<pre style="background:var(--bg,#f5f6fa);padding:10px;border-radius:8px;overflow-x:auto;font-size:12px;margin:6px 0;white-space:pre-wrap;word-break:break-word;"><code>' + code + '</code></pre>');
95
- return '\x00CB' + idx + '\x00';
96
- });
97
- html = html.replace(/`([^`]+)`/g, '<code style="background:var(--bg,#f5f6fa);padding:1px 5px;border-radius:4px;font-size:12px;">$1</code>');
98
- html = html.replace(/\*\*([^*]+)\*\*/g, '<b>$1</b>');
99
- html = html.replace(/^### (.*)$/gm, '<div style="font-weight:700;margin:8px 0 4px;">$1</div>');
100
- html = html.replace(/^## (.*)$/gm, '<div style="font-weight:700;font-size:15px;margin:10px 0 4px;">$1</div>');
101
- html = html.replace(/^# (.*)$/gm, '<div style="font-weight:700;font-size:16px;margin:10px 0 4px;">$1</div>');
102
- html = html.replace(/^[-*] (.*)$/gm, '<div style="padding-left:14px;">• $1</div>');
103
- html = html.replace(/^(\d+)\. (.*)$/gm, '<div style="padding-left:20px;">$1. $2</div>');
104
- html = html.replace(/(https?:\/\/[^\s<>"'()]+)/g, '<a href="$1" style="color:var(--brand,#4f6ef7);text-decoration:underline;" target="_blank">$1</a>');
105
- html = html.replace(/\n/g, '<br>');
106
- html = html.replace(/\x00CB(\d+)\x00/g, function (_, idx) { return codeBlocks[parseInt(idx)]; });
107
- return html;
108
- }
109
-
110
- // 纯文本渲染:只转义HTML、换行和链接,不转标题/列表/加粗/代码块等格式
111
- // 用于对话流展示,让输出像普通人聊天一样清爽
112
- function renderPlainText(text) {
113
- let html = escapeHtml(stripMarkdown(text == null ? '' : text));
114
- html = html.replace(/(https?:\/\/[^\s<>"'()]+)/g, '<a href="$1" style="color:var(--brand,#4f6ef7);text-decoration:underline;" target="_blank">$1</a>');
115
- html = html.replace(/\n/g, '<br>');
116
- return html;
117
- }
118
-
119
- // 把 Markdown 格式符号全部去掉,只保留纯文本内容
120
- function stripMarkdown(text) {
121
- let s = String(text);
122
- // 去掉代码块 ```...``` 里的标记,保留内容
123
- s = s.replace(/```[\w]*\n?([\s\S]*?)```/g, '$1');
124
- // 去掉行内代码 `code` 的反引号,保留内容
125
- s = s.replace(/`([^`]+)`/g, '$1');
126
- // 去掉加粗 **text** 和 __text__
127
- s = s.replace(/\*\*([^*]+)\*\*/g, '$1');
128
- s = s.replace(/__([^_]+)__/g, '$1');
129
- // 去掉斜体 *text* 和 _text_(注意不要和列表冲突)
130
- s = s.replace(/\*([^*\n]+)\*/g, '$1');
131
- s = s.replace(/_([^_\n]+)_/g, '$1');
132
- // 去掉标题 # ## ### 等,保留标题文字
133
- s = s.replace(/^#{1,6}\s+/gm, '');
134
- // 去掉无序列表符号 * - + (行首)
135
- s = s.replace(/^[\s]*[-*+]\s+/gm, '');
136
- // 去掉有序列表符号 1. 2. 等(行首)
137
- s = s.replace(/^[\s]*\d+\.\s+/gm, '');
138
- // 去掉引用符号 > (行首)
139
- s = s.replace(/^[\s]*>\s?/gm, '');
140
- // 去掉链接 [text](url) 只保留 text
141
- s = s.replace(/\[([^\]]+)\]\([^)]+\)/g, '$1');
142
- // 去掉图片 ![alt](url) 只保留 alt
143
- s = s.replace(/!\[([^\]]*)\]\([^)]+\)/g, '$1');
144
- // 去掉分割线 --- *** ___
145
- s = s.replace(/^[-*_]{3,}\s*$/gm, '');
146
- // 去掉行号引用 L123、ln 456、第789行这种
147
- s = s.replace(/\b[Ll][nN]?\s*\d+(-\d+)?/g, '');
148
- s = s.replace(/第\d+行/g, '');
149
- // 去掉多余的空行(连续3个以上换行变成2个)
150
- s = s.replace(/\n{3,}/g, '\n\n');
151
- return s.trim();
152
- }
153
-
154
- function statusBadge(s) { return '<span class="badge ' + s + '">' + s + '</span>'; }
155
-
156
- function closeModal(id) { document.getElementById(id).classList.remove('show'); }
157
-
158
- function openModal(id) { document.getElementById(id).classList.add('show'); }
159
-
160
- function toast(msg) {
161
- const el = document.getElementById('toast');
162
- el.textContent = msg; el.classList.add('show');
163
- clearTimeout(el._t); el._t = setTimeout(() => el.classList.remove('show'), 2200);
164
- }
165
-
166
- function fmtTime(iso) { try { return new Date(iso).toLocaleString(); } catch { return iso || ''; } }
167
-
168
- function escapeHtml(s) { return String(s ?? '').replace(/[&<>"']/g, (c) => ({ '&': '&amp;', '<': '&lt;', '>': '&gt;', '"': '&quot;', "'": '&#39;' }[c])); }
169
-
170
- function applyI18nToEl(el) {
171
- const key = el.getAttribute('data-i18n');
172
- if (!key) return;
173
- const dict = I18N[currentLang] || I18N.zh;
174
- const tag = el.tagName;
175
-
176
- // 1) 输入类控件:只处理 placeholder,用 ph.<id> 专用键;缺失则保留中文原文
177
- if (tag === 'INPUT' || tag === 'TEXTAREA') {
178
- if (el._i18nPhZh === undefined) el._i18nPhZh = el.getAttribute('placeholder') || '';
179
- const phKey = 'ph.' + (el.id || '');
180
- if (dict[phKey] != null) el.placeholder = dict[phKey];
181
- else el.placeholder = el._i18nPhZh;
182
- return;
183
- }
184
-
185
- // 2) <select>:只翻 title,内容交给 renderModelSelect 等渲染函数管理
186
- if (tag === 'SELECT') {
187
- if (el._i18nTitleZh === undefined) el._i18nTitleZh = el.getAttribute('title') || '';
188
- const tiKey = 'title.' + (el.id || '');
189
- if (dict[tiKey] != null) el.title = dict[tiKey];
190
- else el.title = el._i18nTitleZh;
191
- return;
192
- }
193
-
194
- // 3) 含元素子节点:保留子元素,只替换 title 与直接文本节点
195
- if (el.firstElementChild) {
196
- if (el.hasAttribute('title')) el.title = t(key);
197
- let done = false;
198
- el.childNodes.forEach((node) => {
199
- if (node.nodeType === 3 && node.nodeValue.trim()) {
200
- node.nodeValue = done ? '' : t(key);
201
- done = true;
202
- }
203
- });
204
- return;
205
- }
206
-
207
- // 4) 纯文本元素:直接覆盖
208
- el.textContent = t(key);
209
- }
210
-
211
- function t(key) {
212
- const dict = I18N[currentLang] || I18N.zh;
213
- return dict[key] || key;
214
- }
1
+ /**
2
+ * 工具函数模块:纯函数,无状态依赖,可被任意模块调用
3
+ */
4
+
5
+ function formatMarkdown(text) {
6
+ // 简单 Markdown 转换
7
+ return text
8
+ .replace(/&/g, '&amp;')
9
+ .replace(/</g, '&lt;')
10
+ .replace(/>/g, '&gt;')
11
+ .replace(/^### (.*$)/gm, '<h3>$1</h3>')
12
+ .replace(/^## (.*$)/gm, '<h2>$1</h2>')
13
+ .replace(/^# (.*$)/gm, '<h1>$1</h1>')
14
+ .replace(/\*\*(.*?)\*\*/g, '<strong>$1</strong>')
15
+ .replace(/\*(.*?)\*/g, '<em>$1</em>')
16
+ .replace(/`(.*?)`/g, '<code>$1</code>')
17
+ .replace(/\n/g, '<br>');
18
+ }
19
+
20
+ function getDirectoryName(path) {
21
+ if (!path || path === '' || path === '/') return '/';
22
+ if (/^[A-Za-z]:$/.test(path)) return path + '\\';
23
+ if (/^[A-Za-z]:\\$/.test(path)) return path;
24
+ const parts = path.split(/[/\\]/).filter(Boolean);
25
+ if (parts.length <= 1) {
26
+ const driveMatch = parts[0].match(/^([A-Za-z]):$/);
27
+ if (driveMatch) return driveMatch[1] + ':\\';
28
+ return parts[0] || '/';
29
+ }
30
+ const parentParts = parts.slice(0, -1);
31
+ if (/^[A-Za-z]:$/.test(parentParts[0])) {
32
+ return parentParts[0] + '\\' + parentParts.slice(1).join('\\');
33
+ }
34
+ return parentParts.join('\\');
35
+ }
36
+
37
+ /** 渲染空状态提示,减少重复的 innerHTML 赋值代码 */
38
+ function renderEmpty(el, text) {
39
+ if (el) el.innerHTML = '<div class="empty">' + (text || '') + '</div>';
40
+ }
41
+
42
+ function extractUrl(text) {
43
+ if (!text) return '';
44
+ const m = text.match(/(https?:\/\/[^\s]+)/);
45
+ return m ? m[1] : '';
46
+ }
47
+
48
+ function linkifyArtifacts(text) {
49
+ let html = escapeHtml(text);
50
+ // 占位符保护:先提取已识别的片段,避免后续正则把已插入的 <span> 标签二次包裹
51
+ const tokens = [];
52
+ const protect = (s) => { const k = '\u0000TOK' + tokens.length + '\u0000'; tokens.push(s); return k; };
53
+ // 1) URL:排除结尾标点与 HTML 实体
54
+ html = html.replace(/(https?:\/\/[^\s<>"'()]+)/g, (m) => protect('<span class="artifact" data-kind="url" data-path="' + m + '">' + m + '</span>'));
55
+ // 2) Windows 绝对路径(支持正/反斜杠、中文、空格,排除结尾标点)
56
+ html = html.replace(/([A-Za-z]:[\\\/][^\s<>"'()]+?)(?=[\s<>"',。;:、))]|$)/g, (m) => protect('<span class="artifact" data-kind="file" data-path="' + m + '">' + m + '</span>'));
57
+ // 3) Unix 风格绝对路径(至少两级目录,避免误匹配 "2023/2024"、"a/b" 等相对写法)
58
+ html = html.replace(/(\/(?:[A-Za-z0-9_\-.]+\/){1,}[A-Za-z0-9_\-.]*)/g, (m) => protect('<span class="artifact" data-kind="file" data-path="' + m + '">' + m + '</span>'));
59
+ tokens.forEach((s, i) => { html = html.split('\u0000TOK' + i + '\u0000').join(s); });
60
+ return html;
61
+ }
62
+
63
+ function formatSize(n) {
64
+ if (!Number.isFinite(n)) return '';
65
+ if (n < 1024) return n + ' B';
66
+ if (n < 1024 * 1024) return (n / 1024).toFixed(1) + ' KB';
67
+ return (n / 1024 / 1024).toFixed(2) + ' MB';
68
+ }
69
+
70
+ function estimateDataUrlSize(dataUrl) {
71
+ // base64 长度 × 0.75 估算字节
72
+ const b64 = (dataUrl || '').split(',')[1] || '';
73
+ return Math.round(b64.length * 0.75);
74
+ }
75
+
76
+ function formatToolArgs(args) {
77
+ if (!args || typeof args !== 'object') return '';
78
+ const keys = Object.keys(args);
79
+ if (!keys.length) return '';
80
+ const rows = keys.map(function (k) {
81
+ let v = args[k];
82
+ if (v == null) v = '';
83
+ else if (typeof v === 'object') v = JSON.stringify(v);
84
+ return '<div><span style="color:var(--ink-2,#6b7280);">' + escapeHtml(k) + ':</span> ' + escapeHtml(String(v)) + '</div>';
85
+ });
86
+ return '<div class="tc-args">' + rows.join('') + '</div>';
87
+ }
88
+
89
+ function renderMarkdown(text) {
90
+ let html = escapeHtml(text == null ? '' : text);
91
+ const codeBlocks = [];
92
+ html = html.replace(/```(\w*)\n?([\s\S]*?)```/g, function (_, lang, code) {
93
+ const idx = codeBlocks.length;
94
+ codeBlocks.push('<pre style="background:var(--bg,#f5f6fa);padding:10px;border-radius:8px;overflow-x:auto;font-size:12px;margin:6px 0;white-space:pre-wrap;word-break:break-word;"><code>' + code + '</code></pre>');
95
+ return '\x00CB' + idx + '\x00';
96
+ });
97
+ html = html.replace(/`([^`]+)`/g, '<code style="background:var(--bg,#f5f6fa);padding:1px 5px;border-radius:4px;font-size:12px;">$1</code>');
98
+ html = html.replace(/\*\*([^*]+)\*\*/g, '<b>$1</b>');
99
+ html = html.replace(/^### (.*)$/gm, '<div style="font-weight:700;margin:8px 0 4px;">$1</div>');
100
+ html = html.replace(/^## (.*)$/gm, '<div style="font-weight:700;font-size:15px;margin:10px 0 4px;">$1</div>');
101
+ html = html.replace(/^# (.*)$/gm, '<div style="font-weight:700;font-size:16px;margin:10px 0 4px;">$1</div>');
102
+ html = html.replace(/^[-*] (.*)$/gm, '<div style="padding-left:14px;">• $1</div>');
103
+ html = html.replace(/^(\d+)\. (.*)$/gm, '<div style="padding-left:20px;">$1. $2</div>');
104
+ html = html.replace(/(https?:\/\/[^\s<>"'()]+)/g, '<a href="$1" style="color:var(--brand,#4f6ef7);text-decoration:underline;" target="_blank">$1</a>');
105
+ html = html.replace(/\n/g, '<br>');
106
+ html = html.replace(/\x00CB(\d+)\x00/g, function (_, idx) { return codeBlocks[parseInt(idx)]; });
107
+ return html;
108
+ }
109
+
110
+ // 纯文本渲染:只转义HTML、换行和链接,不转标题/列表/加粗/代码块等格式
111
+ // 用于对话流展示,让输出像普通人聊天一样清爽
112
+ function renderPlainText(text) {
113
+ let html = escapeHtml(stripMarkdown(text == null ? '' : text));
114
+ html = html.replace(/(https?:\/\/[^\s<>"'()]+)/g, '<a href="$1" style="color:var(--brand,#4f6ef7);text-decoration:underline;" target="_blank">$1</a>');
115
+ html = html.replace(/\n/g, '<br>');
116
+ return html;
117
+ }
118
+
119
+ // 把 Markdown 格式符号全部去掉,只保留纯文本内容
120
+ function stripMarkdown(text) {
121
+ let s = String(text);
122
+ // 去掉代码块 ```...``` 里的标记,保留内容
123
+ s = s.replace(/```[\w]*\n?([\s\S]*?)```/g, '$1');
124
+ // 去掉行内代码 `code` 的反引号,保留内容
125
+ s = s.replace(/`([^`]+)`/g, '$1');
126
+ // 去掉加粗 **text** 和 __text__
127
+ s = s.replace(/\*\*([^*]+)\*\*/g, '$1');
128
+ s = s.replace(/__([^_]+)__/g, '$1');
129
+ // 去掉斜体 *text* 和 _text_(注意不要和列表冲突)
130
+ s = s.replace(/\*([^*\n]+)\*/g, '$1');
131
+ s = s.replace(/_([^_\n]+)_/g, '$1');
132
+ // 去掉标题 # ## ### 等,保留标题文字
133
+ s = s.replace(/^#{1,6}\s+/gm, '');
134
+ // 去掉无序列表符号 * - + (行首)
135
+ s = s.replace(/^[\s]*[-*+]\s+/gm, '');
136
+ // 去掉有序列表符号 1. 2. 等(行首)
137
+ s = s.replace(/^[\s]*\d+\.\s+/gm, '');
138
+ // 去掉引用符号 > (行首)
139
+ s = s.replace(/^[\s]*>\s?/gm, '');
140
+ // 去掉链接 [text](url) 只保留 text
141
+ s = s.replace(/\[([^\]]+)\]\([^)]+\)/g, '$1');
142
+ // 去掉图片 ![alt](url) 只保留 alt
143
+ s = s.replace(/!\[([^\]]*)\]\([^)]+\)/g, '$1');
144
+ // 去掉分割线 --- *** ___
145
+ s = s.replace(/^[-*_]{3,}\s*$/gm, '');
146
+ // 去掉行号引用 L123、ln 456、第789行这种
147
+ s = s.replace(/\b[Ll][nN]?\s*\d+(-\d+)?/g, '');
148
+ s = s.replace(/第\d+行/g, '');
149
+ // 去掉多余的空行(连续3个以上换行变成2个)
150
+ s = s.replace(/\n{3,}/g, '\n\n');
151
+ return s.trim();
152
+ }
153
+
154
+ function statusBadge(s) { return '<span class="badge ' + s + '">' + s + '</span>'; }
155
+
156
+ function closeModal(id) { document.getElementById(id).classList.remove('show'); }
157
+
158
+ function openModal(id) { document.getElementById(id).classList.add('show'); }
159
+
160
+ function toast(msg) {
161
+ const el = document.getElementById('toast');
162
+ el.textContent = msg; el.classList.add('show');
163
+ clearTimeout(el._t); el._t = setTimeout(() => el.classList.remove('show'), 2200);
164
+ }
165
+
166
+ function fmtTime(iso) { try { return new Date(iso).toLocaleString(); } catch { return iso || ''; } }
167
+
168
+ function escapeHtml(s) { return String(s ?? '').replace(/[&<>"']/g, (c) => ({ '&': '&amp;', '<': '&lt;', '>': '&gt;', '"': '&quot;', "'": '&#39;' }[c])); }
169
+
170
+ function applyI18nToEl(el) {
171
+ const key = el.getAttribute('data-i18n');
172
+ if (!key) return;
173
+ const dict = I18N[currentLang] || I18N.zh;
174
+ const tag = el.tagName;
175
+
176
+ // 1) 输入类控件:只处理 placeholder,用 ph.<id> 专用键;缺失则保留中文原文
177
+ if (tag === 'INPUT' || tag === 'TEXTAREA') {
178
+ if (el._i18nPhZh === undefined) el._i18nPhZh = el.getAttribute('placeholder') || '';
179
+ const phKey = 'ph.' + (el.id || '');
180
+ if (dict[phKey] != null) el.placeholder = dict[phKey];
181
+ else el.placeholder = el._i18nPhZh;
182
+ return;
183
+ }
184
+
185
+ // 2) <select>:只翻 title,内容交给 renderModelSelect 等渲染函数管理
186
+ if (tag === 'SELECT') {
187
+ if (el._i18nTitleZh === undefined) el._i18nTitleZh = el.getAttribute('title') || '';
188
+ const tiKey = 'title.' + (el.id || '');
189
+ if (dict[tiKey] != null) el.title = dict[tiKey];
190
+ else el.title = el._i18nTitleZh;
191
+ return;
192
+ }
193
+
194
+ // 3) 含元素子节点:保留子元素,只替换 title 与直接文本节点
195
+ if (el.firstElementChild) {
196
+ if (el.hasAttribute('title')) el.title = t(key);
197
+ let done = false;
198
+ el.childNodes.forEach((node) => {
199
+ if (node.nodeType === 3 && node.nodeValue.trim()) {
200
+ node.nodeValue = done ? '' : t(key);
201
+ done = true;
202
+ }
203
+ });
204
+ return;
205
+ }
206
+
207
+ // 4) 纯文本元素:直接覆盖
208
+ el.textContent = t(key);
209
+ }
210
+
211
+ function t(key) {
212
+ const dict = I18N[currentLang] || I18N.zh;
213
+ return dict[key] || key;
214
+ }
@@ -1,59 +1,59 @@
1
- {
2
- "name": "飞虹 Code",
3
- "short_name": "飞虹Code",
4
- "description": "终端 AI 编程智能体,对标 Muse Code / Cursor",
5
- "start_url": "/",
6
- "display": "standalone",
7
- "background_color": "#1a1a2e",
8
- "theme_color": "#6366f1",
9
- "orientation": "any",
10
- "scope": "/",
11
- "lang": "zh-CN",
12
- "dir": "ltr",
13
- "categories": ["developer-tools", "productivity", "utilities"],
14
- "icons": [
15
- {
16
- "src": "/icons/icon-192.png",
17
- "sizes": "192x192",
18
- "type": "image/png",
19
- "purpose": "any maskable"
20
- },
21
- {
22
- "src": "/icons/icon-512.png",
23
- "sizes": "512x512",
24
- "type": "image/png",
25
- "purpose": "any maskable"
26
- }
27
- ],
28
- "shortcuts": [
29
- {
30
- "name": "新建任务",
31
- "short_name": "新任务",
32
- "description": "创建新的 AI 编程任务",
33
- "url": "/?action=new-task",
34
- "icons": [{ "src": "/icons/icon-192.png", "sizes": "192x192" }]
35
- },
36
- {
37
- "name": "代码补全",
38
- "short_name": "补全",
39
- "description": "快速代码补全",
40
- "url": "/?action=completion",
41
- "icons": [{ "src": "/icons/icon-192.png", "sizes": "192x192" }]
42
- },
43
- {
44
- "name": "代码审查",
45
- "short_name": "审查",
46
- "description": "AI 代码审查",
47
- "url": "/?action=review",
48
- "icons": [{ "src": "/icons/icon-192.png", "sizes": "192x192" }]
49
- }
50
- ],
51
- "prefer_related_applications": false,
52
- "features": [
53
- "Cross Platform",
54
- "AI Code Completion",
55
- "Multi-agent Collaboration",
56
- "Voice Programming",
57
- "Knowledge Library"
58
- ]
59
- }
1
+ {
2
+ "name": "飞虹 Code",
3
+ "short_name": "飞虹Code",
4
+ "description": "终端 AI 编程智能体,对标 Muse Code / Cursor",
5
+ "start_url": "/",
6
+ "display": "standalone",
7
+ "background_color": "#1a1a2e",
8
+ "theme_color": "#6366f1",
9
+ "orientation": "any",
10
+ "scope": "/",
11
+ "lang": "zh-CN",
12
+ "dir": "ltr",
13
+ "categories": ["developer-tools", "productivity", "utilities"],
14
+ "icons": [
15
+ {
16
+ "src": "/icons/icon-192.png",
17
+ "sizes": "192x192",
18
+ "type": "image/png",
19
+ "purpose": "any maskable"
20
+ },
21
+ {
22
+ "src": "/icons/icon-512.png",
23
+ "sizes": "512x512",
24
+ "type": "image/png",
25
+ "purpose": "any maskable"
26
+ }
27
+ ],
28
+ "shortcuts": [
29
+ {
30
+ "name": "新建任务",
31
+ "short_name": "新任务",
32
+ "description": "创建新的 AI 编程任务",
33
+ "url": "/?action=new-task",
34
+ "icons": [{ "src": "/icons/icon-192.png", "sizes": "192x192" }]
35
+ },
36
+ {
37
+ "name": "代码补全",
38
+ "short_name": "补全",
39
+ "description": "快速代码补全",
40
+ "url": "/?action=completion",
41
+ "icons": [{ "src": "/icons/icon-192.png", "sizes": "192x192" }]
42
+ },
43
+ {
44
+ "name": "代码审查",
45
+ "short_name": "审查",
46
+ "description": "AI 代码审查",
47
+ "url": "/?action=review",
48
+ "icons": [{ "src": "/icons/icon-192.png", "sizes": "192x192" }]
49
+ }
50
+ ],
51
+ "prefer_related_applications": false,
52
+ "features": [
53
+ "Cross Platform",
54
+ "AI Code Completion",
55
+ "Multi-agent Collaboration",
56
+ "Voice Programming",
57
+ "Knowledge Library"
58
+ ]
59
+ }