@cc-monitoring/proxy-core 0.1.5-alpha.1 → 0.1.5

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 (295) hide show
  1. package/dist/cli/commands/doc.d.ts +4 -0
  2. package/dist/cli/commands/doc.js +31 -0
  3. package/dist/cli/index.js +7 -0
  4. package/dist/parsers/docx-loader.d.ts +5 -0
  5. package/dist/parsers/docx-loader.js +15 -0
  6. package/dist/parsers/index.d.ts +3 -0
  7. package/dist/parsers/index.js +10 -0
  8. package/dist/parsers/md-loader.d.ts +5 -0
  9. package/dist/parsers/md-loader.js +13 -0
  10. package/dist/parsers/registry.d.ts +8 -0
  11. package/dist/parsers/registry.js +32 -0
  12. package/dist/parsers/types.d.ts +4 -0
  13. package/dist/parsers/types.js +1 -0
  14. package/dist/parsers/xlsx-loader.d.ts +5 -0
  15. package/dist/parsers/xlsx-loader.js +34 -0
  16. package/dist/server/__tests__/providers-route.test.js +4 -3
  17. package/dist/server/__tests__/proxy.test.js +11 -1
  18. package/dist/server/claude-settings-route.d.ts +2 -0
  19. package/dist/server/claude-settings-route.js +76 -0
  20. package/dist/server/data-push.d.ts +2 -0
  21. package/dist/server/data-push.js +7 -0
  22. package/dist/server/docs-route.d.ts +2 -0
  23. package/dist/server/docs-route.js +63 -0
  24. package/dist/server/index.js +2 -0
  25. package/dist/server/proxy.d.ts +2 -1
  26. package/dist/server/proxy.js +245 -38
  27. package/dist/server/ui-route.js +120 -46
  28. package/dist/ui/assets/{1c-BKfNxcqO.js → 1c-KmWe8RWs.js} +1 -1
  29. package/dist/ui/assets/{abnf-kurmJZQ_.js → abnf-BKQ6qIuo.js} +1 -1
  30. package/dist/ui/assets/{abnfDiagram-VRR7QNED-ByeCIWIR.js → abnfDiagram-VRR7QNED-CkRuDPu1.js} +1 -1
  31. package/dist/ui/assets/{accesslog-D64BZ_De.js → accesslog-DD9H5Ktc.js} +1 -1
  32. package/dist/ui/assets/{actionscript-pDK74uly.js → actionscript-CAjf2Qtd.js} +1 -1
  33. package/dist/ui/assets/{ada-DRb-_v9Q.js → ada-BXkXW16O.js} +1 -1
  34. package/dist/ui/assets/{angelscript-CZNb0D_x.js → angelscript-BxT7o0Up.js} +1 -1
  35. package/dist/ui/assets/{apache-DXxCmfqn.js → apache-C5z_tmVm.js} +1 -1
  36. package/dist/ui/assets/{applescript-SH5nkFFY.js → applescript-DdIxl8rr.js} +1 -1
  37. package/dist/ui/assets/{arc-MeodV3jp.js → arc-hSdFaqKn.js} +1 -1
  38. package/dist/ui/assets/{arcade-BBDVvGqJ.js → arcade-D5m0roat.js} +1 -1
  39. package/dist/ui/assets/{architectureDiagram-ZJ3FMSHR-BemxtZtq.js → architectureDiagram-ZJ3FMSHR-DOSHSqzf.js} +1 -1
  40. package/dist/ui/assets/{arduino-BzSPoel-.js → arduino-FDap8kq-.js} +1 -1
  41. package/dist/ui/assets/{armasm-bxTyTYQU.js → armasm-Kzp-Jr1v.js} +1 -1
  42. package/dist/ui/assets/{asciidoc-CTwbDxt_.js → asciidoc-DbGMW3EE.js} +1 -1
  43. package/dist/ui/assets/{aspectj-CG5ykwLW.js → aspectj-CVYMmBCO.js} +1 -1
  44. package/dist/ui/assets/{autohotkey-C5JGxVuA.js → autohotkey-9PmBGTPd.js} +1 -1
  45. package/dist/ui/assets/{autoit-y4Yl0UCW.js → autoit-B4F86jgh.js} +1 -1
  46. package/dist/ui/assets/{avrasm-bGE35O5G.js → avrasm-CSzv2eHX.js} +1 -1
  47. package/dist/ui/assets/{awk-EaW3U0nk.js → awk-CjsvYvZE.js} +1 -1
  48. package/dist/ui/assets/{axapta-DR4gLXP2.js → axapta-BVgMoNRY.js} +1 -1
  49. package/dist/ui/assets/{bash-ce3pZrbv.js → bash-IeBjW3pt.js} +1 -1
  50. package/dist/ui/assets/{basic-BUjgcgEE.js → basic-BTFJfmV1.js} +1 -1
  51. package/dist/ui/assets/{blockDiagram-677ZJIJ3-_o8CsocQ.js → blockDiagram-677ZJIJ3-DLw3Bbhf.js} +1 -1
  52. package/dist/ui/assets/{bnf-CweJzP3u.js → bnf-rCkeRYk0.js} +1 -1
  53. package/dist/ui/assets/{brainfuck-CdSx1voD.js → brainfuck-DBHuB3uZ.js} +1 -1
  54. package/dist/ui/assets/{coq-BZ36Oykn.js → c-C95V0zHL.js} +1 -1
  55. package/dist/ui/assets/{c-like-CEkf_5bN.js → c-like-CK1xGeX_.js} +1 -1
  56. package/dist/ui/assets/{c4Diagram-LMCZKHZV-DOkmzOL2.js → c4Diagram-LMCZKHZV-cqY51yJw.js} +1 -1
  57. package/dist/ui/assets/{cal-n5KEHShP.js → cal-BxGPpEZK.js} +1 -1
  58. package/dist/ui/assets/{capnproto-DBqs0rUq.js → capnproto-Bo2fgXF9.js} +1 -1
  59. package/dist/ui/assets/{ceylon-Bqm782As.js → ceylon-C4Bb4pNB.js} +1 -1
  60. package/dist/ui/assets/channel-D9Y4iN1l.js +1 -0
  61. package/dist/ui/assets/{chunk-2Q5K7J3B-DW9ak6HE.js → chunk-2Q5K7J3B-CGTiTBmo.js} +1 -1
  62. package/dist/ui/assets/{chunk-32BRIVSS-BrSieCRZ.js → chunk-32BRIVSS-DWagYBp9.js} +1 -1
  63. package/dist/ui/assets/{chunk-5VM5RSS4-DfQ4qP83.js → chunk-5VM5RSS4-BzSBMKJX.js} +1 -1
  64. package/dist/ui/assets/{chunk-EX3LRPZG-Ct5q5MD9.js → chunk-EX3LRPZG-4-aKwCgZ.js} +1 -1
  65. package/dist/ui/assets/{chunk-JWPE2WC7-CmPr6d57.js → chunk-JWPE2WC7-CPC_cBN0.js} +1 -1
  66. package/dist/ui/assets/{chunk-MOJQB5TN-TVmHnDCp.js → chunk-MOJQB5TN-DrDE4H9w.js} +1 -1
  67. package/dist/ui/assets/{chunk-RYQCIY6F-CJid4ifN.js → chunk-RYQCIY6F-DkdXe_kU.js} +1 -1
  68. package/dist/ui/assets/{chunk-V7JOEXUC-DpPBugpJ.js → chunk-V7JOEXUC-Da6EWcQt.js} +1 -1
  69. package/dist/ui/assets/{chunk-VR4S4FIN-ChvE2cdM.js → chunk-VR4S4FIN-nP6dstD5.js} +1 -1
  70. package/dist/ui/assets/{chunk-XXDRQBXY-CQkAaDcz.js → chunk-XXDRQBXY-Bi_rRAPA.js} +1 -1
  71. package/dist/ui/assets/classDiagram-OUVF2IWQ-C4UVH6RI.js +1 -0
  72. package/dist/ui/assets/classDiagram-v2-EOCWNBFH-C4UVH6RI.js +1 -0
  73. package/dist/ui/assets/{clean-C6pxrVpV.js → clean-cc1m9AxK.js} +1 -1
  74. package/dist/ui/assets/{clojure-DBFV_cQs.js → clojure-DX5V8QA8.js} +1 -1
  75. package/dist/ui/assets/{clojure-repl-gAHGPM6b.js → clojure-repl-FzjnVNWQ.js} +1 -1
  76. package/dist/ui/assets/{cmake-kWW8kCUc.js → cmake-COZZyrKs.js} +1 -1
  77. package/dist/ui/assets/{coffeescript-6GnANHV0.js → coffeescript-DBsnOmC4.js} +1 -1
  78. package/dist/ui/assets/{c-CRHUjHXY.js → coq-TwFFolHa.js} +1 -1
  79. package/dist/ui/assets/{cos-7hQ1utRX.js → cos-Dm5g-IQT.js} +1 -1
  80. package/dist/ui/assets/{cose-bilkent-JH36ORCC-C3eaOw98.js → cose-bilkent-JH36ORCC-B3-weOQF.js} +1 -1
  81. package/dist/ui/assets/{cpp-3tqV0Eg4.js → cpp-_RZxQjg7.js} +1 -1
  82. package/dist/ui/assets/{crmsh-BCWSxGj_.js → crmsh-DGPJ11Gt.js} +1 -1
  83. package/dist/ui/assets/{crystal-DWYK1_zJ.js → crystal-BOMSPGge.js} +1 -1
  84. package/dist/ui/assets/{csharp-4MXdBrfn.js → csharp-DZXiHH72.js} +1 -1
  85. package/dist/ui/assets/{csp-B6w1ig4q.js → csp-DDSIMUoU.js} +1 -1
  86. package/dist/ui/assets/{css-DF73D19j.js → css-Bjye-ZWr.js} +1 -1
  87. package/dist/ui/assets/{cynefin-VYW2F7L2-CBT889Q1.js → cynefin-VYW2F7L2-Cj5c4L3y.js} +1 -1
  88. package/dist/ui/assets/{cynefinDiagram-TSTJHNR4-CTpbDnI7.js → cynefinDiagram-TSTJHNR4-BYsfTeNX.js} +1 -1
  89. package/dist/ui/assets/{d-DzYDcQHZ.js → d-22pfurOx.js} +1 -1
  90. package/dist/ui/assets/{dagre-VKFMJZFB-WWoYj0oQ.js → dagre-VKFMJZFB-DiEob-by.js} +1 -1
  91. package/dist/ui/assets/{dart-D3jB16SU.js → dart-Doiu8cDW.js} +1 -1
  92. package/dist/ui/assets/{delphi-CZl4UAcT.js → delphi-CQ7epp84.js} +1 -1
  93. package/dist/ui/assets/{diagram-FQU43EPY-3wQZQkQz.js → diagram-FQU43EPY-BOPbQcL4.js} +1 -1
  94. package/dist/ui/assets/{diagram-G47NLZAW-Ca-cA51I.js → diagram-G47NLZAW-C1UWDJTx.js} +1 -1
  95. package/dist/ui/assets/{diagram-NH7WQ7WH-YisQNOg5.js → diagram-NH7WQ7WH-CYsBqW3J.js} +1 -1
  96. package/dist/ui/assets/{diagram-OA4YK3LP-0EJamcdw.js → diagram-OA4YK3LP-Dnag0x_3.js} +1 -1
  97. package/dist/ui/assets/{diagram-WEI45ONY-C49BDAKI.js → diagram-WEI45ONY-Bo4CsDoj.js} +1 -1
  98. package/dist/ui/assets/{diff-_OXjiwKq.js → diff-Cs6VQQZt.js} +1 -1
  99. package/dist/ui/assets/{django-MC7gw7Ba.js → django-Bo3okOrw.js} +1 -1
  100. package/dist/ui/assets/{dns-D3uYm_NR.js → dns-BpG60eIX.js} +1 -1
  101. package/dist/ui/assets/{dockerfile-CbxCn4X2.js → dockerfile-BWyH8SlV.js} +1 -1
  102. package/dist/ui/assets/{dos-D7MpkWlZ.js → dos-DWlNbaB9.js} +1 -1
  103. package/dist/ui/assets/{dsconfig-DejdiVkX.js → dsconfig-D_8y8YrJ.js} +1 -1
  104. package/dist/ui/assets/{dts-CMTiAYoj.js → dts-Cz4SyMYR.js} +1 -1
  105. package/dist/ui/assets/{dust-DrNExIio.js → dust-Cu4qLkeH.js} +1 -1
  106. package/dist/ui/assets/{ebnf-CQl_HyGP.js → ebnf-CTVHui3r.js} +1 -1
  107. package/dist/ui/assets/{ebnfDiagram-CCIWWBDH-Cpbm8Saa.js → ebnfDiagram-CCIWWBDH-epcXQLEj.js} +1 -1
  108. package/dist/ui/assets/{elixir-DjKAXtge.js → elixir-MAlwXhfU.js} +1 -1
  109. package/dist/ui/assets/{elm-DbFMwRfr.js → elm-Bdmwbvef.js} +1 -1
  110. package/dist/ui/assets/{erDiagram-Q63AITRT-CjiUln3_.js → erDiagram-Q63AITRT-Bb60TqAM.js} +1 -1
  111. package/dist/ui/assets/{erb-CmcM27bT.js → erb-Ce9TpP4g.js} +1 -1
  112. package/dist/ui/assets/{erlang-Se5g1C-_.js → erlang-CN2GEiqk.js} +1 -1
  113. package/dist/ui/assets/{erlang-repl-BYXNE8Rp.js → erlang-repl-D8K4O_cp.js} +1 -1
  114. package/dist/ui/assets/{excel-C0rpMYUp.js → excel-eVZU1r0f.js} +1 -1
  115. package/dist/ui/assets/{fix-MKKAkUZt.js → fix-BzKerEv0.js} +1 -1
  116. package/dist/ui/assets/{flix-P1JtxtSk.js → flix-B9CE3skV.js} +1 -1
  117. package/dist/ui/assets/{flowDiagram-23GEKE2U-BHmxHBjF.js → flowDiagram-23GEKE2U-DzMLZIyt.js} +1 -1
  118. package/dist/ui/assets/{fortran-yDT4QtkM.js → fortran-B4__3vos.js} +1 -1
  119. package/dist/ui/assets/{fsharp-P9pwJwTA.js → fsharp-BJ3-ARHz.js} +1 -1
  120. package/dist/ui/assets/{gams-B5t8fTmX.js → gams-Cu43oSYT.js} +1 -1
  121. package/dist/ui/assets/{ganttDiagram-NO4QXBWP-CLZshSdd.js → ganttDiagram-NO4QXBWP-D_aAoMRP.js} +1 -1
  122. package/dist/ui/assets/{gauss-BnurLk3c.js → gauss-T8vk_TpE.js} +1 -1
  123. package/dist/ui/assets/{gcode-ChY-gRbf.js → gcode-9j3BicpZ.js} +1 -1
  124. package/dist/ui/assets/{gherkin-Dvnrp8BP.js → gherkin-Dyh5KFG-.js} +1 -1
  125. package/dist/ui/assets/{gitGraphDiagram-IHSO6WYX-BRB4at2D.js → gitGraphDiagram-IHSO6WYX-CMxCHC-Z.js} +1 -1
  126. package/dist/ui/assets/{glsl-DcovBIzp.js → glsl-DWWjN4ts.js} +1 -1
  127. package/dist/ui/assets/{gml-S6feXRA_.js → gml-BcYE-D5A.js} +1 -1
  128. package/dist/ui/assets/{go-B81WXVYZ.js → go-DUnUzOEI.js} +1 -1
  129. package/dist/ui/assets/{golo-DKL2IdWk.js → golo-BDoc1QQL.js} +1 -1
  130. package/dist/ui/assets/{gradle-T97Z3PII.js → gradle-B_WRa_bT.js} +1 -1
  131. package/dist/ui/assets/{groovy-BXX6Iv9v.js → groovy-CgjqFq1e.js} +1 -1
  132. package/dist/ui/assets/{haml-D8q-wDTz.js → haml-DCqcg7Ti.js} +1 -1
  133. package/dist/ui/assets/{handlebars-DDdkLhQc.js → handlebars-DSDUQrnw.js} +1 -1
  134. package/dist/ui/assets/{haskell-DfxSCvE8.js → haskell-DPVnctVi.js} +1 -1
  135. package/dist/ui/assets/{haxe-CYmtAuGy.js → haxe-BuCGXBa4.js} +1 -1
  136. package/dist/ui/assets/{hsp-B6vrbmnn.js → hsp-BTKpS_u0.js} +1 -1
  137. package/dist/ui/assets/{htmlbars-D2C_JXNB.js → htmlbars-Cql3Jvy2.js} +1 -1
  138. package/dist/ui/assets/{http-CF4dzBBt.js → http-BB8I9jUh.js} +1 -1
  139. package/dist/ui/assets/{hy-Bo3ftzPr.js → hy-DG7xkZNz.js} +1 -1
  140. package/dist/ui/assets/index-CK_lJsTu.css +10 -0
  141. package/dist/ui/assets/{index-BLxwrLko.js → index-CfTIGTiY.js} +319 -297
  142. package/dist/ui/assets/{index-CMOhE8Fu.js → index-DqIiCkSD.js} +3 -3
  143. package/dist/ui/assets/{infoDiagram-FWYZ7A6U-CsP_vXYo.js → infoDiagram-FWYZ7A6U-DIzEV-BJ.js} +1 -1
  144. package/dist/ui/assets/{inform7-DW_1PfgW.js → inform7-BWNpVEkA.js} +1 -1
  145. package/dist/ui/assets/{ini-DFoyjgSu.js → ini-BMw_C8EP.js} +1 -1
  146. package/dist/ui/assets/{irpf90-C-6-eyAC.js → irpf90-Cy42ibFZ.js} +1 -1
  147. package/dist/ui/assets/{isbl-4gc8Swo4.js → isbl-CjFSc0hz.js} +1 -1
  148. package/dist/ui/assets/{ishikawaDiagram-FXEZZL3T-D6bH6CQh.js → ishikawaDiagram-FXEZZL3T-BZcxp5am.js} +1 -1
  149. package/dist/ui/assets/{java-bb2y4EiS.js → java-BDxe9dp1.js} +1 -1
  150. package/dist/ui/assets/{javascript-BAtDHP3W.js → javascript-CgLkkj7h.js} +1 -1
  151. package/dist/ui/assets/{jboss-cli-qZg2Imzs.js → jboss-cli-C8biclrb.js} +1 -1
  152. package/dist/ui/assets/{journeyDiagram-5HDEW3XC-DxDCxUCo.js → journeyDiagram-5HDEW3XC-BbJu6m6Q.js} +1 -1
  153. package/dist/ui/assets/{json-CNupTqez.js → json-BjJKhmM6.js} +1 -1
  154. package/dist/ui/assets/{julia-DK5AbWFh.js → julia-DvKEpg-R.js} +1 -1
  155. package/dist/ui/assets/{julia-repl-CY2KMHbB.js → julia-repl-BDJWZxkU.js} +1 -1
  156. package/dist/ui/assets/{kanban-definition-HUTT4EX6-Dt5KtIgo.js → kanban-definition-HUTT4EX6-DeIVPlbv.js} +1 -1
  157. package/dist/ui/assets/{kotlin-D9FIaw0d.js → kotlin-DCoXcnEb.js} +1 -1
  158. package/dist/ui/assets/{lasso-DFGV2pQw.js → lasso-C7m0QmV2.js} +1 -1
  159. package/dist/ui/assets/{latex-B4vw8fyc.js → latex-SHnTG9Eq.js} +1 -1
  160. package/dist/ui/assets/{ldif-Dm2FIlTD.js → ldif-_6hUnKPV.js} +1 -1
  161. package/dist/ui/assets/{leaf-BfPV5rQV.js → leaf-Co9qxlaF.js} +1 -1
  162. package/dist/ui/assets/{less-DlD-uNfa.js → less-CJRDPwNA.js} +1 -1
  163. package/dist/ui/assets/{lisp-fwHwKhac.js → lisp-JEHGYbiW.js} +1 -1
  164. package/dist/ui/assets/{livecodeserver-2Iqy9OJM.js → livecodeserver-BSYaUj4k.js} +1 -1
  165. package/dist/ui/assets/{livescript-CsVjBiYy.js → livescript-WQMCQeuz.js} +1 -1
  166. package/dist/ui/assets/{llvm-Dr1LxL0C.js → llvm-DnAHqj5I.js} +1 -1
  167. package/dist/ui/assets/{lsl-C19lQilh.js → lsl--k-ghYia.js} +1 -1
  168. package/dist/ui/assets/{lua-Bt6lk_UK.js → lua-CXb23hbC.js} +1 -1
  169. package/dist/ui/assets/{makefile-BjpMOWNL.js → makefile-CM7o86yn.js} +1 -1
  170. package/dist/ui/assets/{markdown-BCvk5Luj.js → markdown-HB3HvChQ.js} +1 -1
  171. package/dist/ui/assets/{mathematica-CMAvLFmv.js → mathematica-9NTuf22N.js} +1 -1
  172. package/dist/ui/assets/{matlab-Dp9rgor5.js → matlab-CWv-ik4r.js} +1 -1
  173. package/dist/ui/assets/{maxima-UUgZl2h3.js → maxima-CqYiKCrw.js} +1 -1
  174. package/dist/ui/assets/{mel-DU6cwelq.js → mel-BbsRpUm5.js} +1 -1
  175. package/dist/ui/assets/{mercury-DXd4_3jU.js → mercury-Cz2j4HhU.js} +1 -1
  176. package/dist/ui/assets/{mindmap-definition-LN4V7U3C-BThZR1du.js → mindmap-definition-LN4V7U3C-WyJS8oye.js} +1 -1
  177. package/dist/ui/assets/{mipsasm-CMNMWNFn.js → mipsasm-BqWSRbQV.js} +1 -1
  178. package/dist/ui/assets/{mizar-B6c3dauU.js → mizar-JLBfQ6vt.js} +1 -1
  179. package/dist/ui/assets/{mojolicious-Cprwk6o_.js → mojolicious-D0LbMmyk.js} +1 -1
  180. package/dist/ui/assets/{monkey-BaAReGcY.js → monkey-DAGL6-JN.js} +1 -1
  181. package/dist/ui/assets/{moonscript-gS515C7R.js → moonscript-DzbwNSKy.js} +1 -1
  182. package/dist/ui/assets/{n1ql-Z_4MPbYI.js → n1ql-dkgKq6Yv.js} +1 -1
  183. package/dist/ui/assets/{nginx-Dc_6EmJn.js → nginx-AUoaDPV4.js} +1 -1
  184. package/dist/ui/assets/{nim-DtjvH3ft.js → nim-CdqYmVrl.js} +1 -1
  185. package/dist/ui/assets/{nix-Bu2r_I9_.js → nix-CxmVjwwo.js} +1 -1
  186. package/dist/ui/assets/{node-repl-8HGWlvcp.js → node-repl-B1Z3zUAh.js} +1 -1
  187. package/dist/ui/assets/{nsis-9FG-YMvD.js → nsis-CTAuPWhe.js} +1 -1
  188. package/dist/ui/assets/{objectivec-CX1QmJoj.js → objectivec-CvbKeAPz.js} +1 -1
  189. package/dist/ui/assets/{ocaml-4qT3O786.js → ocaml-DCiyXKOH.js} +1 -1
  190. package/dist/ui/assets/{openscad-CvJzggqO.js → openscad-CPGUwmeR.js} +1 -1
  191. package/dist/ui/assets/{oxygene-BwtAuPgg.js → oxygene-CI_bD1Gw.js} +1 -1
  192. package/dist/ui/assets/{parser3-DKnhj506.js → parser3-C91CVs85.js} +1 -1
  193. package/dist/ui/assets/{pegDiagram-2B236MQR-ZVgEXVAh.js → pegDiagram-2B236MQR-yF8AW7GR.js} +1 -1
  194. package/dist/ui/assets/{perl-BApvz3gE.js → perl-ChxfKl-n.js} +1 -1
  195. package/dist/ui/assets/{pf--Fg5j93h.js → pf-CKCHkzIA.js} +1 -1
  196. package/dist/ui/assets/{pgsql-DOapqed0.js → pgsql-BwOP20uH.js} +1 -1
  197. package/dist/ui/assets/{php-DIm5UjQ3.js → php-B7Rs2tM5.js} +1 -1
  198. package/dist/ui/assets/{php-template-DTFQ-Xzw.js → php-template-Cx-Fh4AR.js} +1 -1
  199. package/dist/ui/assets/{pieDiagram-ENE6RG2P-viaSeTd2.js → pieDiagram-ENE6RG2P-BS4hnGNX.js} +1 -1
  200. package/dist/ui/assets/{plaintext-NRztTbl1.js → plaintext-U7qkdtgS.js} +1 -1
  201. package/dist/ui/assets/{pony-BfL7O-OQ.js → pony-_fGYgePh.js} +1 -1
  202. package/dist/ui/assets/{powershell-CLt45Qf4.js → powershell-CFBTcUce.js} +1 -1
  203. package/dist/ui/assets/{processing-afiHf7ow.js → processing-BWHneU0K.js} +1 -1
  204. package/dist/ui/assets/{profile-Ch1BVwxN.js → profile-BJ-HxhzS.js} +1 -1
  205. package/dist/ui/assets/{prolog-Tf3A0bWy.js → prolog-ChHo7n6L.js} +1 -1
  206. package/dist/ui/assets/{properties-8SdgBqK7.js → properties-e_DOYclC.js} +1 -1
  207. package/dist/ui/assets/{protobuf-DPDrI7Qg.js → protobuf-5aGSIv7w.js} +1 -1
  208. package/dist/ui/assets/{puppet-CXofbQOs.js → puppet-D2vQatzX.js} +1 -1
  209. package/dist/ui/assets/{purebasic-eUJ8DEfM.js → purebasic-n6krfaeF.js} +1 -1
  210. package/dist/ui/assets/{python-C98zkBPD.js → python-CbIo0XxP.js} +1 -1
  211. package/dist/ui/assets/{python-repl-Xul3ztGs.js → python-repl-BpIq9kyr.js} +1 -1
  212. package/dist/ui/assets/{q-BkAM-a7C.js → q-jntnvcCx.js} +1 -1
  213. package/dist/ui/assets/{qml-BsEaix_u.js → qml-BafQlZNV.js} +1 -1
  214. package/dist/ui/assets/{quadrantDiagram-ABIIQ3AL-Bvz1yyu9.js → quadrantDiagram-ABIIQ3AL-C3Th8mUJ.js} +1 -1
  215. package/dist/ui/assets/{r-ItUdMzSw.js → r-CHgvQFLK.js} +1 -1
  216. package/dist/ui/assets/{railroadDiagram-RFXS5EU6-DdFuoPrk.js → railroadDiagram-RFXS5EU6-CMQkbGJl.js} +1 -1
  217. package/dist/ui/assets/{reasonml-BDbdIYs9.js → reasonml-DNwlPD_T.js} +1 -1
  218. package/dist/ui/assets/{requirementDiagram-TGXJPOKE-B8hcvLSP.js → requirementDiagram-TGXJPOKE-B70_oR7v.js} +1 -1
  219. package/dist/ui/assets/{rib-zIraQ_mX.js → rib-CX4e9JSF.js} +1 -1
  220. package/dist/ui/assets/{roboconf-CzoIRml1.js → roboconf-ee4qsPGf.js} +1 -1
  221. package/dist/ui/assets/{routeros-B3UgD0yV.js → routeros-BJSwvu2L.js} +1 -1
  222. package/dist/ui/assets/{rsl-wAwFfXwD.js → rsl-BiKdMl_F.js} +1 -1
  223. package/dist/ui/assets/{ruby-D3Thdpv8.js → ruby-CAXTU5LY.js} +1 -1
  224. package/dist/ui/assets/{ruleslanguage-CPWvLcMl.js → ruleslanguage-C1kgDGXM.js} +1 -1
  225. package/dist/ui/assets/{rust-DOnpus5t.js → rust-DyEf_GXL.js} +1 -1
  226. package/dist/ui/assets/{sankeyDiagram-HTMAVEWB-CH-sCFAi.js → sankeyDiagram-HTMAVEWB-CvUfseMg.js} +1 -1
  227. package/dist/ui/assets/{sas-B2858_1j.js → sas-Q1rlUxPH.js} +1 -1
  228. package/dist/ui/assets/{scala-Cveq3ftT.js → scala-Dg6KNmge.js} +1 -1
  229. package/dist/ui/assets/{scheme-DcdF6kjo.js → scheme-D9iooUxI.js} +1 -1
  230. package/dist/ui/assets/{scilab-Dycxtkgn.js → scilab-CztEJXJY.js} +1 -1
  231. package/dist/ui/assets/{scss-DFUrItbr.js → scss-BMh-JkdE.js} +1 -1
  232. package/dist/ui/assets/{sequenceDiagram-DBY2YBRQ-B6WOhYgY.js → sequenceDiagram-DBY2YBRQ-DB0c9kf4.js} +1 -1
  233. package/dist/ui/assets/{shell-CdK6mfw0.js → shell-DWo6z0MG.js} +1 -1
  234. package/dist/ui/assets/{sizeCapture-X5ZJPWSS-DEtOtMCB.js → sizeCapture-X5ZJPWSS-BcQlgjfD.js} +1 -1
  235. package/dist/ui/assets/{smali-BWrgi9Uw.js → smali-Cijeb6pL.js} +1 -1
  236. package/dist/ui/assets/{smalltalk-D7rVc6SF.js → smalltalk-D0lvqa_d.js} +1 -1
  237. package/dist/ui/assets/{sml-BwZXpnKa.js → sml-B-vqWZ3b.js} +1 -1
  238. package/dist/ui/assets/{sqf-GLi5DNBX.js → sqf-BJ-1Q583.js} +1 -1
  239. package/dist/ui/assets/{sql-B3C8FGL3.js → sql-CMGLxEYV.js} +1 -1
  240. package/dist/ui/assets/{sql_more-DnUCbJeD.js → sql_more-gsRmbNCH.js} +1 -1
  241. package/dist/ui/assets/{stan-Sm9c5Vis.js → stan-D1AlTSpf.js} +1 -1
  242. package/dist/ui/assets/{stata-pulikDkU.js → stata-DnEYviI0.js} +1 -1
  243. package/dist/ui/assets/{stateDiagram-2N3HPSRC-ncOw7g4V.js → stateDiagram-2N3HPSRC-BSRgVsHO.js} +1 -1
  244. package/dist/ui/assets/stateDiagram-v2-6OUMAXLB-BLdfpGJO.js +1 -0
  245. package/dist/ui/assets/{step21-pX15wqtK.js → step21-DbQV9sMo.js} +1 -1
  246. package/dist/ui/assets/{stylus-fOumlpdp.js → stylus-Cyc7vdUc.js} +1 -1
  247. package/dist/ui/assets/{subunit-uu3Ov4HX.js → subunit-16ipyMie.js} +1 -1
  248. package/dist/ui/assets/{swift-CmLDJWUd.js → swift-DTNnw4qS.js} +1 -1
  249. package/dist/ui/assets/{swimlanes-5IMT3BWC-DqgXf_9D.js → swimlanes-5IMT3BWC-DgOdcc4_.js} +2 -2
  250. package/dist/ui/assets/swimlanesDiagram-G3AALYLV-DRVnkg3M.js +8 -0
  251. package/dist/ui/assets/{taggerscript-CazB9nt4.js → taggerscript-DM6pvUWE.js} +1 -1
  252. package/dist/ui/assets/{tap-DojnLl9r.js → tap-Ch-uyKZq.js} +1 -1
  253. package/dist/ui/assets/{tcl-CMSHuPY4.js → tcl-D0T_V5dA.js} +1 -1
  254. package/dist/ui/assets/{thrift-D9T_iaQS.js → thrift-D9xJjYw4.js} +1 -1
  255. package/dist/ui/assets/{timeline-definition-FHXFAJF6--1I0coei.js → timeline-definition-FHXFAJF6-BBeDMHxb.js} +1 -1
  256. package/dist/ui/assets/{tp-tKwomxNq.js → tp-kUrCGo9X.js} +1 -1
  257. package/dist/ui/assets/{twig-CEsN-ViC.js → twig-Cgub6rxA.js} +1 -1
  258. package/dist/ui/assets/{typescript-BwkWaYfc.js → typescript-BxNP9Ap9.js} +1 -1
  259. package/dist/ui/assets/{vala-BFkwjsLY.js → vala-DF9ZZagU.js} +1 -1
  260. package/dist/ui/assets/{vbnet-BoJ1NvBH.js → vbnet-Cf46ypDg.js} +1 -1
  261. package/dist/ui/assets/{vbscript-D8XSgQnu.js → vbscript-DNs-QKLH.js} +1 -1
  262. package/dist/ui/assets/{vbscript-html-hn6cBiCZ.js → vbscript-html-DyS6I5L1.js} +1 -1
  263. package/dist/ui/assets/{vennDiagram-L72KCM5P--d_scOj_.js → vennDiagram-L72KCM5P-8WpWycE-.js} +1 -1
  264. package/dist/ui/assets/{verilog-CHsNT9Cy.js → verilog-CF5wC4X-.js} +1 -1
  265. package/dist/ui/assets/{vhdl-BHAdjshQ.js → vhdl-Dm0jpDMn.js} +1 -1
  266. package/dist/ui/assets/{vim-CXGYjr0E.js → vim-nyO2DRAx.js} +1 -1
  267. package/dist/ui/assets/{wardleyDiagram-EHGQE667-C1OlFa5w.js → wardleyDiagram-EHGQE667-UeIOK-jv.js} +1 -1
  268. package/dist/ui/assets/{x86asm-BMtTtbdc.js → x86asm-BNw2-6GG.js} +1 -1
  269. package/dist/ui/assets/{xl-2RPeIz-_.js → xl-D-YHxr6V.js} +1 -1
  270. package/dist/ui/assets/{xml-BdgFaqW_.js → xml-BijAlrow.js} +1 -1
  271. package/dist/ui/assets/{xquery-C-Nme7tR.js → xquery-z0wxWBKz.js} +1 -1
  272. package/dist/ui/assets/{xychartDiagram-FW5EYKEG-BzM0JoN5.js → xychartDiagram-FW5EYKEG-BNzHLweN.js} +1 -1
  273. package/dist/ui/assets/{yaml-CVfovUzE.js → yaml-n5TIQArR.js} +1 -1
  274. package/dist/ui/assets/{zephir-BLoFpefb.js → zephir-DrGhH8jG.js} +1 -1
  275. package/dist/ui/index.html +2 -2
  276. package/dist/utils/__tests__/providers-db.test.js +2 -1
  277. package/dist/utils/db.d.ts +2 -0
  278. package/dist/utils/db.js +32 -0
  279. package/dist/utils/openai-converter.d.ts +99 -0
  280. package/dist/utils/openai-converter.js +293 -0
  281. package/dist/utils/providers-db.d.ts +2 -0
  282. package/dist/utils/providers-db.js +19 -7
  283. package/dist/utils/request-writer.d.ts +16 -0
  284. package/dist/utils/request-writer.js +123 -9
  285. package/dist/utils/stats-aggregator.js +2 -0
  286. package/dist/utils/status-history.js +3 -3
  287. package/dist/utils/version.d.ts +5 -0
  288. package/dist/utils/version.js +7 -0
  289. package/package.json +7 -4
  290. package/dist/ui/assets/channel-ouobCd00.js +0 -1
  291. package/dist/ui/assets/classDiagram-OUVF2IWQ-BLjfj6C1.js +0 -1
  292. package/dist/ui/assets/classDiagram-v2-EOCWNBFH-BLjfj6C1.js +0 -1
  293. package/dist/ui/assets/index-bwex7GGt.css +0 -10
  294. package/dist/ui/assets/stateDiagram-v2-6OUMAXLB-D1kUHFw1.js +0 -1
  295. package/dist/ui/assets/swimlanesDiagram-G3AALYLV-C-113Xl1.js +0 -8
@@ -0,0 +1,4 @@
1
+ export interface DocOptions {
2
+ build?: boolean;
3
+ }
4
+ export declare function docCommand(options: DocOptions): Promise<void>;
@@ -0,0 +1,31 @@
1
+ import { execSync } from 'child_process';
2
+ import fs from 'fs';
3
+ import path from 'path';
4
+ import { loadConfig } from '../../config/index.js';
5
+ import { getProcessStatus } from '../../utils/pm2.js';
6
+ import { getCallerDirname } from '../../utils/esm-dirname.js';
7
+ const commandsDirname = getCallerDirname('../cli/commands');
8
+ export async function docCommand(options) {
9
+ const status = await getProcessStatus('cc-monitoring');
10
+ if (!status || status.status !== 'online') {
11
+ console.error('Server not running. Use "ccm start" first.');
12
+ return;
13
+ }
14
+ // 发布产物:dist/docs;本地开发:monorepo 的 proxy-docs/dist
15
+ const bundledDocs = path.join(commandsDirname, '../../docs');
16
+ const monorepoDocs = path.join(commandsDirname, '../../../../proxy-docs/dist');
17
+ const docsExists = fs.existsSync(bundledDocs) || fs.existsSync(monorepoDocs);
18
+ const needsBuild = options.build || !docsExists;
19
+ if (needsBuild) {
20
+ console.log('Building docs...');
21
+ execSync('pnpm --filter @cc-monitoring/docs build', {
22
+ stdio: 'inherit',
23
+ cwd: path.join(commandsDirname, '../../../..')
24
+ });
25
+ }
26
+ const config = await loadConfig();
27
+ const url = `http://${config.server.host}:${config.server.port}/docs/`;
28
+ console.log(`Opening docs: ${url}`);
29
+ const open = (await import('open')).default;
30
+ await open(url);
31
+ }
package/dist/cli/index.js CHANGED
@@ -111,6 +111,13 @@ program.command('ui')
111
111
  const { uiCommand } = await import('./commands/ui.js');
112
112
  await uiCommand(options);
113
113
  });
114
+ program.command('doc')
115
+ .description('Open architecture docs')
116
+ .option('--build', 'Force rebuild docs')
117
+ .action(async (options) => {
118
+ const { docCommand } = await import('./commands/doc.js');
119
+ await docCommand(options);
120
+ });
114
121
  program.command('clean-requests')
115
122
  .description('清理旧的请求日志(SQLite)')
116
123
  .option('--days <days>', '保留最近N天的数据', '7')
@@ -0,0 +1,5 @@
1
+ import type { ParserLoader } from './types.js';
2
+ export declare class DocxLoader implements ParserLoader {
3
+ supportedExtensions: string[];
4
+ parse(buffer: Buffer, _filename: string): Promise<string>;
5
+ }
@@ -0,0 +1,15 @@
1
+ export class DocxLoader {
2
+ constructor() {
3
+ Object.defineProperty(this, "supportedExtensions", {
4
+ enumerable: true,
5
+ configurable: true,
6
+ writable: true,
7
+ value: ['.docx']
8
+ });
9
+ }
10
+ async parse(buffer, _filename) {
11
+ const mammoth = await import('mammoth');
12
+ const result = await mammoth.extractRawText({ buffer });
13
+ return result.value;
14
+ }
15
+ }
@@ -0,0 +1,3 @@
1
+ import { ParserRegistry } from './registry.js';
2
+ declare const registry: ParserRegistry;
3
+ export { registry };
@@ -0,0 +1,10 @@
1
+ // apps/proxy-core/src/parsers/index.ts
2
+ import { ParserRegistry } from './registry.js';
3
+ import { MdLoader } from './md-loader.js';
4
+ import { DocxLoader } from './docx-loader.js';
5
+ import { XlsxLoader } from './xlsx-loader.js';
6
+ const registry = new ParserRegistry();
7
+ registry.register(new MdLoader());
8
+ registry.register(new DocxLoader());
9
+ registry.register(new XlsxLoader());
10
+ export { registry };
@@ -0,0 +1,5 @@
1
+ import type { ParserLoader } from './types.js';
2
+ export declare class MdLoader implements ParserLoader {
3
+ supportedExtensions: string[];
4
+ parse(buffer: Buffer, _filename: string): Promise<string>;
5
+ }
@@ -0,0 +1,13 @@
1
+ export class MdLoader {
2
+ constructor() {
3
+ Object.defineProperty(this, "supportedExtensions", {
4
+ enumerable: true,
5
+ configurable: true,
6
+ writable: true,
7
+ value: ['.md', '.markdown']
8
+ });
9
+ }
10
+ async parse(buffer, _filename) {
11
+ return buffer.toString('utf-8');
12
+ }
13
+ }
@@ -0,0 +1,8 @@
1
+ import type { ParserLoader } from './types.js';
2
+ export declare class ParserRegistry {
3
+ private loaders;
4
+ register(loader: ParserLoader): void;
5
+ getSupportedExtensions(): string[];
6
+ parse(buffer: Buffer, filename: string): Promise<string>;
7
+ private getExtension;
8
+ }
@@ -0,0 +1,32 @@
1
+ export class ParserRegistry {
2
+ constructor() {
3
+ Object.defineProperty(this, "loaders", {
4
+ enumerable: true,
5
+ configurable: true,
6
+ writable: true,
7
+ value: new Map()
8
+ });
9
+ }
10
+ register(loader) {
11
+ for (const ext of loader.supportedExtensions) {
12
+ this.loaders.set(ext.toLowerCase(), loader);
13
+ }
14
+ }
15
+ getSupportedExtensions() {
16
+ return Array.from(this.loaders.keys());
17
+ }
18
+ async parse(buffer, filename) {
19
+ const ext = this.getExtension(filename);
20
+ const loader = this.loaders.get(ext);
21
+ if (!loader) {
22
+ throw new Error(`Unsupported file type: "${ext}". Supported types: ${this.getSupportedExtensions().join(', ')}`);
23
+ }
24
+ return loader.parse(buffer, filename);
25
+ }
26
+ getExtension(filename) {
27
+ const dotIndex = filename.lastIndexOf('.');
28
+ if (dotIndex === -1)
29
+ throw new Error(`File has no extension: "${filename}"`);
30
+ return filename.slice(dotIndex).toLowerCase();
31
+ }
32
+ }
@@ -0,0 +1,4 @@
1
+ export interface ParserLoader {
2
+ supportedExtensions: string[];
3
+ parse(buffer: Buffer, filename: string): Promise<string>;
4
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,5 @@
1
+ import type { ParserLoader } from './types.js';
2
+ export declare class XlsxLoader implements ParserLoader {
3
+ supportedExtensions: string[];
4
+ parse(buffer: Buffer, _filename: string): Promise<string>;
5
+ }
@@ -0,0 +1,34 @@
1
+ export class XlsxLoader {
2
+ constructor() {
3
+ Object.defineProperty(this, "supportedExtensions", {
4
+ enumerable: true,
5
+ configurable: true,
6
+ writable: true,
7
+ value: ['.xlsx', '.xls']
8
+ });
9
+ }
10
+ async parse(buffer, _filename) {
11
+ const XLSX = await import('xlsx');
12
+ const workbook = XLSX.read(buffer, { type: 'buffer' });
13
+ const parts = [];
14
+ for (const sheetName of workbook.SheetNames) {
15
+ const sheet = workbook.Sheets[sheetName];
16
+ const csv = XLSX.utils.sheet_to_csv(sheet);
17
+ // 转 CSV 为 markdown table
18
+ const mdTable = csvToMarkdownTable(csv);
19
+ parts.push(`## ${sheetName}\n\n${mdTable}`);
20
+ }
21
+ return parts.join('\n\n');
22
+ }
23
+ }
24
+ function csvToMarkdownTable(csv) {
25
+ const lines = csv.split('\n').filter(line => line.length > 0);
26
+ if (lines.length === 0)
27
+ return '';
28
+ const rows = lines.map(line => line.split(','));
29
+ // Header row
30
+ const header = `| ${rows[0].join(' | ')} |`;
31
+ const separator = `| ${rows[0].map(() => '---').join(' | ')} |`;
32
+ const body = rows.slice(1).map(row => `| ${row.join(' | ')} |`).join('\n');
33
+ return [header, separator, body].join('\n');
34
+ }
@@ -39,15 +39,16 @@ jest.mock('@utils/db', () => {
39
39
  CREATE TABLE IF NOT EXISTS providers (
40
40
  id INTEGER PRIMARY KEY AUTOINCREMENT,
41
41
  name TEXT UNIQUE NOT NULL,
42
- base_url TEXT NOT NULL,
43
- api_key TEXT NOT NULL,
44
- model TEXT NOT NULL,
42
+ base_url TEXT,
43
+ api_key TEXT,
44
+ model TEXT,
45
45
  haiku_model TEXT,
46
46
  sonnet_model TEXT,
47
47
  opus_model TEXT,
48
48
  subagent_model TEXT,
49
49
  provider TEXT NOT NULL,
50
50
  is_default INTEGER NOT NULL DEFAULT 0,
51
+ is_openai_compatible INTEGER NOT NULL DEFAULT 0,
51
52
  created_at TEXT DEFAULT CURRENT_TIMESTAMP,
52
53
  updated_at TEXT DEFAULT CURRENT_TIMESTAMP
53
54
  )
@@ -66,7 +66,7 @@ describe('resolveProxyTarget', () => {
66
66
  beforeEach(() => {
67
67
  jest.clearAllMocks();
68
68
  db = new Database(':memory:');
69
- db.exec(`CREATE TABLE providers (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT UNIQUE NOT NULL, base_url TEXT, api_key TEXT, model TEXT, haiku_model TEXT, sonnet_model TEXT, opus_model TEXT, subagent_model TEXT, provider TEXT NOT NULL, is_default INTEGER NOT NULL DEFAULT 0, created_at TEXT DEFAULT CURRENT_TIMESTAMP, updated_at TEXT DEFAULT CURRENT_TIMESTAMP)`);
69
+ db.exec(`CREATE TABLE providers (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT UNIQUE NOT NULL, base_url TEXT, api_key TEXT, model TEXT, haiku_model TEXT, sonnet_model TEXT, opus_model TEXT, subagent_model TEXT, provider TEXT NOT NULL, is_default INTEGER NOT NULL DEFAULT 0, is_openai_compatible INTEGER NOT NULL DEFAULT 0, created_at TEXT DEFAULT CURRENT_TIMESTAMP, updated_at TEXT DEFAULT CURRENT_TIMESTAMP)`);
70
70
  getDatabase.mockReturnValue(db);
71
71
  });
72
72
  afterEach(() => {
@@ -92,4 +92,14 @@ describe('resolveProxyTarget', () => {
92
92
  expect(result.targetPath).toBe('/apps/anthropic');
93
93
  expect(result.apiKey).toBe('config-key');
94
94
  });
95
+ test('returns is_openai_compatible from active provider', () => {
96
+ db.prepare('INSERT INTO providers (name, base_url, api_key, model, provider, is_default, is_openai_compatible) VALUES (?, ?, ?, ?, ?, ?, ?)').run('openai-provider', 'https://api.openai.com/v1', 'openai-key', 'gpt-4', 'openai', 1, 1);
97
+ const result = resolveProxyTarget(config);
98
+ expect(result.is_openai_compatible).toBe(true);
99
+ });
100
+ test('returns is_openai_compatible as false when not set', () => {
101
+ db.prepare('INSERT INTO providers (name, base_url, api_key, model, provider, is_default, is_openai_compatible) VALUES (?, ?, ?, ?, ?, ?, ?)').run('claude-provider', 'https://provider.example.com/v1', 'provider-key', 'test-model', 'anthropic', 1, 0);
102
+ const result = resolveProxyTarget(config);
103
+ expect(result.is_openai_compatible).toBe(false);
104
+ });
95
105
  });
@@ -0,0 +1,2 @@
1
+ import { FastifyInstance } from 'fastify';
2
+ export declare function setupClaudeSettingsRoutes(fastify: FastifyInstance, config: any): Promise<void>;
@@ -0,0 +1,76 @@
1
+ import fs from 'fs';
2
+ import path from 'path';
3
+ import os from 'os';
4
+ import { isClaudeInstalled } from '../utils/version.js';
5
+ function getClaudeSettingsPath() {
6
+ return path.join(os.homedir(), '.claude', 'settings.json');
7
+ }
8
+ function buildServerAddress(config) {
9
+ const host = config.server.host === '0.0.0.0' ? 'localhost' : config.server.host;
10
+ return `http://${host}:${config.server.port}`;
11
+ }
12
+ export async function setupClaudeSettingsRoutes(fastify, config) {
13
+ fastify.post('/ui/api/claude-settings/sync', async (request, reply) => {
14
+ // 1. 检测 Claude Code 是否安装
15
+ if (!isClaudeInstalled()) {
16
+ return reply.send({
17
+ success: false,
18
+ message: '未检测到 Claude Code,请安装完以后重试'
19
+ });
20
+ }
21
+ // 2. 检测 settings.json 是否存在
22
+ const settingsPath = getClaudeSettingsPath();
23
+ if (!fs.existsSync(settingsPath)) {
24
+ return reply.send({
25
+ success: false,
26
+ message: '未检测到配置文件,请手动修改'
27
+ });
28
+ }
29
+ // 3. 读取 settings.json
30
+ let settings;
31
+ try {
32
+ const raw = fs.readFileSync(settingsPath, 'utf-8');
33
+ settings = JSON.parse(raw);
34
+ }
35
+ catch {
36
+ return reply.code(500).send({
37
+ success: false,
38
+ message: '配置文件格式错误,请手动检查'
39
+ });
40
+ }
41
+ // 4. 构建当前 ccm 服务地址
42
+ const serverAddress = buildServerAddress(config);
43
+ const currentBaseUrl = settings?.env?.ANTHROPIC_BASE_URL;
44
+ // 5. 比较
45
+ if (currentBaseUrl === serverAddress) {
46
+ return reply.send({
47
+ success: true,
48
+ message: '已使用 CCM 的配置,无需改动',
49
+ alreadyMatched: true
50
+ });
51
+ }
52
+ // 6. 备份旧值 + 设置新值
53
+ if (!settings.env) {
54
+ settings.env = {};
55
+ }
56
+ if (currentBaseUrl) {
57
+ settings.env.ANTHROPIC_BASE_URL_CCM_BACKUP = currentBaseUrl;
58
+ }
59
+ settings.env.ANTHROPIC_BASE_URL = serverAddress;
60
+ // 7. 写回 settings.json
61
+ try {
62
+ fs.writeFileSync(settingsPath, JSON.stringify(settings, null, 2), 'utf-8');
63
+ }
64
+ catch (err) {
65
+ return reply.code(500).send({
66
+ success: false,
67
+ message: `写入配置文件失败: ${err.message}`
68
+ });
69
+ }
70
+ return reply.send({
71
+ success: true,
72
+ message: '修改成功,请重启 Claude 终端生效',
73
+ alreadyMatched: false
74
+ });
75
+ });
76
+ }
@@ -1,5 +1,7 @@
1
1
  import { WebSocket } from 'ws';
2
2
  export declare function addDataClient(ws: WebSocket): void;
3
3
  export declare function removeDataClient(ws: WebSocket): void;
4
+ export declare function getDataClientCount(): number;
4
5
  export declare function pushNewRequest(summary: any, status?: 'pending' | 'completed'): void;
5
6
  export declare function pushStatsNotify(): void;
7
+ export declare function broadcastToDataClients(msg: any): void;
@@ -7,6 +7,9 @@ export function addDataClient(ws) {
7
7
  export function removeDataClient(ws) {
8
8
  dataClients.delete(ws);
9
9
  }
10
+ export function getDataClientCount() {
11
+ return dataClients.size;
12
+ }
10
13
  // Broadcast helpers
11
14
  export function pushNewRequest(summary, status = 'completed') {
12
15
  broadcast({
@@ -30,3 +33,7 @@ function broadcast(msg) {
30
33
  }
31
34
  }
32
35
  }
36
+ // Expose broadcast for global status timer (ui-route.ts)
37
+ export function broadcastToDataClients(msg) {
38
+ broadcast(msg);
39
+ }
@@ -0,0 +1,2 @@
1
+ import { FastifyInstance } from 'fastify';
2
+ export declare function setupDocsRoutes(fastify: FastifyInstance): Promise<void>;
@@ -0,0 +1,63 @@
1
+ import multipart from '@fastify/multipart';
2
+ import fs from 'fs';
3
+ import path from 'path';
4
+ import { registry } from '../parsers/index.js';
5
+ import { dataDir } from '../utils/paths.js';
6
+ const docsDir = path.join(dataDir, 'docs');
7
+ export async function setupDocsRoutes(fastify) {
8
+ await fastify.register(multipart, { limits: { fileSize: 10 * 1024 * 1024 } });
9
+ fastify.post('/ui/api/docs/upload', async (request, reply) => {
10
+ const data = await request.file();
11
+ if (!data) {
12
+ return reply.code(400).send({ success: false, error: 'No file uploaded' });
13
+ }
14
+ const filename = path.basename(data.filename);
15
+ const buffer = await data.toBuffer();
16
+ // 校验扩展名
17
+ const supported = registry.getSupportedExtensions();
18
+ const dotIndex = filename.lastIndexOf('.');
19
+ if (dotIndex === -1) {
20
+ return reply.code(400).send({
21
+ success: false,
22
+ error: `File has no extension. Supported types: ${supported.join(', ')}`
23
+ });
24
+ }
25
+ const ext = filename.slice(dotIndex).toLowerCase();
26
+ if (!supported.includes(ext)) {
27
+ return reply.code(400).send({
28
+ success: false,
29
+ error: `Unsupported file type: "${ext}". Supported types: ${supported.join(', ')}`
30
+ });
31
+ }
32
+ // 解析文件内容为 md
33
+ let mdContent;
34
+ try {
35
+ mdContent = await registry.parse(buffer, filename);
36
+ }
37
+ catch (err) {
38
+ request.log.error({ err, filename }, 'File parsing failed');
39
+ return reply.code(500).send({
40
+ success: false,
41
+ error: err.message || 'File parsing failed'
42
+ });
43
+ }
44
+ // 确保 docs 目录存在
45
+ if (!fs.existsSync(docsDir)) {
46
+ fs.mkdirSync(docsDir, { recursive: true });
47
+ }
48
+ // 写入 md 文件
49
+ const mdFilename = filename.slice(0, dotIndex) + '.md';
50
+ const mdPath = path.join(docsDir, mdFilename);
51
+ try {
52
+ fs.writeFileSync(mdPath, mdContent, 'utf-8');
53
+ }
54
+ catch (err) {
55
+ request.log.error({ err, mdPath }, 'Failed to write md file');
56
+ return reply.code(500).send({
57
+ success: false,
58
+ error: 'Failed to save file'
59
+ });
60
+ }
61
+ return { success: true, path: `docs/${mdFilename}` };
62
+ });
63
+ }
@@ -6,6 +6,7 @@ import { getCurrentModuleUrl } from '../utils/esm-dirname.js';
6
6
  import { setupProxy } from './proxy.js';
7
7
  import { setupUiRoutes } from './ui-route.js';
8
8
  import { setupChatRoute } from './chat-route.js';
9
+ import { setupDocsRoutes } from './docs-route.js';
9
10
  import { requestIdMiddleware } from './middleware/request-id.js';
10
11
  export async function createServer() {
11
12
  const config = await loadConfig();
@@ -21,6 +22,7 @@ export async function createServer() {
21
22
  await setupUiRoutes(fastify); // UI routes registered BEFORE proxy to avoid being proxied
22
23
  await setupProxy(fastify, config.proxy);
23
24
  await setupChatRoute(fastify, config.proxy); // MCP-enhanced chat endpoint
25
+ await setupDocsRoutes(fastify);
24
26
  return fastify;
25
27
  }
26
28
  export async function startServer() {
@@ -11,6 +11,7 @@ interface ResolvedTarget {
11
11
  haiku_model?: string;
12
12
  sonnet_model?: string;
13
13
  opus_model?: string;
14
+ is_openai_compatible?: boolean;
14
15
  }
15
16
  /**
16
17
  * Resolves the proxy target per request:
@@ -18,7 +19,7 @@ interface ResolvedTarget {
18
19
  * - Otherwise fall back to config.json proxy.target + proxy.apiKey
19
20
  *
20
21
  * Called per request for hot-swap support (no server restart needed on activation change).
21
- * better-sqlite3 is synchronous and ~us-level for a single-row SELECT; no caching needed.
22
+ * better-sqlite3 is synchronous and ~us-level for a single-row SELECT; cached statement avoids repeated allocation.
22
23
  */
23
24
  export declare function resolveProxyTarget(proxyConfig: ProxyConfig): ResolvedTarget;
24
25
  /**