@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.
- package/dist/cli/commands/doc.d.ts +4 -0
- package/dist/cli/commands/doc.js +31 -0
- package/dist/cli/index.js +7 -0
- package/dist/parsers/docx-loader.d.ts +5 -0
- package/dist/parsers/docx-loader.js +15 -0
- package/dist/parsers/index.d.ts +3 -0
- package/dist/parsers/index.js +10 -0
- package/dist/parsers/md-loader.d.ts +5 -0
- package/dist/parsers/md-loader.js +13 -0
- package/dist/parsers/registry.d.ts +8 -0
- package/dist/parsers/registry.js +32 -0
- package/dist/parsers/types.d.ts +4 -0
- package/dist/parsers/types.js +1 -0
- package/dist/parsers/xlsx-loader.d.ts +5 -0
- package/dist/parsers/xlsx-loader.js +34 -0
- package/dist/server/__tests__/providers-route.test.js +4 -3
- package/dist/server/__tests__/proxy.test.js +11 -1
- package/dist/server/claude-settings-route.d.ts +2 -0
- package/dist/server/claude-settings-route.js +76 -0
- package/dist/server/data-push.d.ts +2 -0
- package/dist/server/data-push.js +7 -0
- package/dist/server/docs-route.d.ts +2 -0
- package/dist/server/docs-route.js +63 -0
- package/dist/server/index.js +2 -0
- package/dist/server/proxy.d.ts +2 -1
- package/dist/server/proxy.js +245 -38
- package/dist/server/ui-route.js +120 -46
- package/dist/ui/assets/{1c-BKfNxcqO.js → 1c-KmWe8RWs.js} +1 -1
- package/dist/ui/assets/{abnf-kurmJZQ_.js → abnf-BKQ6qIuo.js} +1 -1
- package/dist/ui/assets/{abnfDiagram-VRR7QNED-ByeCIWIR.js → abnfDiagram-VRR7QNED-CkRuDPu1.js} +1 -1
- package/dist/ui/assets/{accesslog-D64BZ_De.js → accesslog-DD9H5Ktc.js} +1 -1
- package/dist/ui/assets/{actionscript-pDK74uly.js → actionscript-CAjf2Qtd.js} +1 -1
- package/dist/ui/assets/{ada-DRb-_v9Q.js → ada-BXkXW16O.js} +1 -1
- package/dist/ui/assets/{angelscript-CZNb0D_x.js → angelscript-BxT7o0Up.js} +1 -1
- package/dist/ui/assets/{apache-DXxCmfqn.js → apache-C5z_tmVm.js} +1 -1
- package/dist/ui/assets/{applescript-SH5nkFFY.js → applescript-DdIxl8rr.js} +1 -1
- package/dist/ui/assets/{arc-MeodV3jp.js → arc-hSdFaqKn.js} +1 -1
- package/dist/ui/assets/{arcade-BBDVvGqJ.js → arcade-D5m0roat.js} +1 -1
- package/dist/ui/assets/{architectureDiagram-ZJ3FMSHR-BemxtZtq.js → architectureDiagram-ZJ3FMSHR-DOSHSqzf.js} +1 -1
- package/dist/ui/assets/{arduino-BzSPoel-.js → arduino-FDap8kq-.js} +1 -1
- package/dist/ui/assets/{armasm-bxTyTYQU.js → armasm-Kzp-Jr1v.js} +1 -1
- package/dist/ui/assets/{asciidoc-CTwbDxt_.js → asciidoc-DbGMW3EE.js} +1 -1
- package/dist/ui/assets/{aspectj-CG5ykwLW.js → aspectj-CVYMmBCO.js} +1 -1
- package/dist/ui/assets/{autohotkey-C5JGxVuA.js → autohotkey-9PmBGTPd.js} +1 -1
- package/dist/ui/assets/{autoit-y4Yl0UCW.js → autoit-B4F86jgh.js} +1 -1
- package/dist/ui/assets/{avrasm-bGE35O5G.js → avrasm-CSzv2eHX.js} +1 -1
- package/dist/ui/assets/{awk-EaW3U0nk.js → awk-CjsvYvZE.js} +1 -1
- package/dist/ui/assets/{axapta-DR4gLXP2.js → axapta-BVgMoNRY.js} +1 -1
- package/dist/ui/assets/{bash-ce3pZrbv.js → bash-IeBjW3pt.js} +1 -1
- package/dist/ui/assets/{basic-BUjgcgEE.js → basic-BTFJfmV1.js} +1 -1
- package/dist/ui/assets/{blockDiagram-677ZJIJ3-_o8CsocQ.js → blockDiagram-677ZJIJ3-DLw3Bbhf.js} +1 -1
- package/dist/ui/assets/{bnf-CweJzP3u.js → bnf-rCkeRYk0.js} +1 -1
- package/dist/ui/assets/{brainfuck-CdSx1voD.js → brainfuck-DBHuB3uZ.js} +1 -1
- package/dist/ui/assets/{coq-BZ36Oykn.js → c-C95V0zHL.js} +1 -1
- package/dist/ui/assets/{c-like-CEkf_5bN.js → c-like-CK1xGeX_.js} +1 -1
- package/dist/ui/assets/{c4Diagram-LMCZKHZV-DOkmzOL2.js → c4Diagram-LMCZKHZV-cqY51yJw.js} +1 -1
- package/dist/ui/assets/{cal-n5KEHShP.js → cal-BxGPpEZK.js} +1 -1
- package/dist/ui/assets/{capnproto-DBqs0rUq.js → capnproto-Bo2fgXF9.js} +1 -1
- package/dist/ui/assets/{ceylon-Bqm782As.js → ceylon-C4Bb4pNB.js} +1 -1
- package/dist/ui/assets/channel-D9Y4iN1l.js +1 -0
- package/dist/ui/assets/{chunk-2Q5K7J3B-DW9ak6HE.js → chunk-2Q5K7J3B-CGTiTBmo.js} +1 -1
- package/dist/ui/assets/{chunk-32BRIVSS-BrSieCRZ.js → chunk-32BRIVSS-DWagYBp9.js} +1 -1
- package/dist/ui/assets/{chunk-5VM5RSS4-DfQ4qP83.js → chunk-5VM5RSS4-BzSBMKJX.js} +1 -1
- package/dist/ui/assets/{chunk-EX3LRPZG-Ct5q5MD9.js → chunk-EX3LRPZG-4-aKwCgZ.js} +1 -1
- package/dist/ui/assets/{chunk-JWPE2WC7-CmPr6d57.js → chunk-JWPE2WC7-CPC_cBN0.js} +1 -1
- package/dist/ui/assets/{chunk-MOJQB5TN-TVmHnDCp.js → chunk-MOJQB5TN-DrDE4H9w.js} +1 -1
- package/dist/ui/assets/{chunk-RYQCIY6F-CJid4ifN.js → chunk-RYQCIY6F-DkdXe_kU.js} +1 -1
- package/dist/ui/assets/{chunk-V7JOEXUC-DpPBugpJ.js → chunk-V7JOEXUC-Da6EWcQt.js} +1 -1
- package/dist/ui/assets/{chunk-VR4S4FIN-ChvE2cdM.js → chunk-VR4S4FIN-nP6dstD5.js} +1 -1
- package/dist/ui/assets/{chunk-XXDRQBXY-CQkAaDcz.js → chunk-XXDRQBXY-Bi_rRAPA.js} +1 -1
- package/dist/ui/assets/classDiagram-OUVF2IWQ-C4UVH6RI.js +1 -0
- package/dist/ui/assets/classDiagram-v2-EOCWNBFH-C4UVH6RI.js +1 -0
- package/dist/ui/assets/{clean-C6pxrVpV.js → clean-cc1m9AxK.js} +1 -1
- package/dist/ui/assets/{clojure-DBFV_cQs.js → clojure-DX5V8QA8.js} +1 -1
- package/dist/ui/assets/{clojure-repl-gAHGPM6b.js → clojure-repl-FzjnVNWQ.js} +1 -1
- package/dist/ui/assets/{cmake-kWW8kCUc.js → cmake-COZZyrKs.js} +1 -1
- package/dist/ui/assets/{coffeescript-6GnANHV0.js → coffeescript-DBsnOmC4.js} +1 -1
- package/dist/ui/assets/{c-CRHUjHXY.js → coq-TwFFolHa.js} +1 -1
- package/dist/ui/assets/{cos-7hQ1utRX.js → cos-Dm5g-IQT.js} +1 -1
- package/dist/ui/assets/{cose-bilkent-JH36ORCC-C3eaOw98.js → cose-bilkent-JH36ORCC-B3-weOQF.js} +1 -1
- package/dist/ui/assets/{cpp-3tqV0Eg4.js → cpp-_RZxQjg7.js} +1 -1
- package/dist/ui/assets/{crmsh-BCWSxGj_.js → crmsh-DGPJ11Gt.js} +1 -1
- package/dist/ui/assets/{crystal-DWYK1_zJ.js → crystal-BOMSPGge.js} +1 -1
- package/dist/ui/assets/{csharp-4MXdBrfn.js → csharp-DZXiHH72.js} +1 -1
- package/dist/ui/assets/{csp-B6w1ig4q.js → csp-DDSIMUoU.js} +1 -1
- package/dist/ui/assets/{css-DF73D19j.js → css-Bjye-ZWr.js} +1 -1
- package/dist/ui/assets/{cynefin-VYW2F7L2-CBT889Q1.js → cynefin-VYW2F7L2-Cj5c4L3y.js} +1 -1
- package/dist/ui/assets/{cynefinDiagram-TSTJHNR4-CTpbDnI7.js → cynefinDiagram-TSTJHNR4-BYsfTeNX.js} +1 -1
- package/dist/ui/assets/{d-DzYDcQHZ.js → d-22pfurOx.js} +1 -1
- package/dist/ui/assets/{dagre-VKFMJZFB-WWoYj0oQ.js → dagre-VKFMJZFB-DiEob-by.js} +1 -1
- package/dist/ui/assets/{dart-D3jB16SU.js → dart-Doiu8cDW.js} +1 -1
- package/dist/ui/assets/{delphi-CZl4UAcT.js → delphi-CQ7epp84.js} +1 -1
- package/dist/ui/assets/{diagram-FQU43EPY-3wQZQkQz.js → diagram-FQU43EPY-BOPbQcL4.js} +1 -1
- package/dist/ui/assets/{diagram-G47NLZAW-Ca-cA51I.js → diagram-G47NLZAW-C1UWDJTx.js} +1 -1
- package/dist/ui/assets/{diagram-NH7WQ7WH-YisQNOg5.js → diagram-NH7WQ7WH-CYsBqW3J.js} +1 -1
- package/dist/ui/assets/{diagram-OA4YK3LP-0EJamcdw.js → diagram-OA4YK3LP-Dnag0x_3.js} +1 -1
- package/dist/ui/assets/{diagram-WEI45ONY-C49BDAKI.js → diagram-WEI45ONY-Bo4CsDoj.js} +1 -1
- package/dist/ui/assets/{diff-_OXjiwKq.js → diff-Cs6VQQZt.js} +1 -1
- package/dist/ui/assets/{django-MC7gw7Ba.js → django-Bo3okOrw.js} +1 -1
- package/dist/ui/assets/{dns-D3uYm_NR.js → dns-BpG60eIX.js} +1 -1
- package/dist/ui/assets/{dockerfile-CbxCn4X2.js → dockerfile-BWyH8SlV.js} +1 -1
- package/dist/ui/assets/{dos-D7MpkWlZ.js → dos-DWlNbaB9.js} +1 -1
- package/dist/ui/assets/{dsconfig-DejdiVkX.js → dsconfig-D_8y8YrJ.js} +1 -1
- package/dist/ui/assets/{dts-CMTiAYoj.js → dts-Cz4SyMYR.js} +1 -1
- package/dist/ui/assets/{dust-DrNExIio.js → dust-Cu4qLkeH.js} +1 -1
- package/dist/ui/assets/{ebnf-CQl_HyGP.js → ebnf-CTVHui3r.js} +1 -1
- package/dist/ui/assets/{ebnfDiagram-CCIWWBDH-Cpbm8Saa.js → ebnfDiagram-CCIWWBDH-epcXQLEj.js} +1 -1
- package/dist/ui/assets/{elixir-DjKAXtge.js → elixir-MAlwXhfU.js} +1 -1
- package/dist/ui/assets/{elm-DbFMwRfr.js → elm-Bdmwbvef.js} +1 -1
- package/dist/ui/assets/{erDiagram-Q63AITRT-CjiUln3_.js → erDiagram-Q63AITRT-Bb60TqAM.js} +1 -1
- package/dist/ui/assets/{erb-CmcM27bT.js → erb-Ce9TpP4g.js} +1 -1
- package/dist/ui/assets/{erlang-Se5g1C-_.js → erlang-CN2GEiqk.js} +1 -1
- package/dist/ui/assets/{erlang-repl-BYXNE8Rp.js → erlang-repl-D8K4O_cp.js} +1 -1
- package/dist/ui/assets/{excel-C0rpMYUp.js → excel-eVZU1r0f.js} +1 -1
- package/dist/ui/assets/{fix-MKKAkUZt.js → fix-BzKerEv0.js} +1 -1
- package/dist/ui/assets/{flix-P1JtxtSk.js → flix-B9CE3skV.js} +1 -1
- package/dist/ui/assets/{flowDiagram-23GEKE2U-BHmxHBjF.js → flowDiagram-23GEKE2U-DzMLZIyt.js} +1 -1
- package/dist/ui/assets/{fortran-yDT4QtkM.js → fortran-B4__3vos.js} +1 -1
- package/dist/ui/assets/{fsharp-P9pwJwTA.js → fsharp-BJ3-ARHz.js} +1 -1
- package/dist/ui/assets/{gams-B5t8fTmX.js → gams-Cu43oSYT.js} +1 -1
- package/dist/ui/assets/{ganttDiagram-NO4QXBWP-CLZshSdd.js → ganttDiagram-NO4QXBWP-D_aAoMRP.js} +1 -1
- package/dist/ui/assets/{gauss-BnurLk3c.js → gauss-T8vk_TpE.js} +1 -1
- package/dist/ui/assets/{gcode-ChY-gRbf.js → gcode-9j3BicpZ.js} +1 -1
- package/dist/ui/assets/{gherkin-Dvnrp8BP.js → gherkin-Dyh5KFG-.js} +1 -1
- package/dist/ui/assets/{gitGraphDiagram-IHSO6WYX-BRB4at2D.js → gitGraphDiagram-IHSO6WYX-CMxCHC-Z.js} +1 -1
- package/dist/ui/assets/{glsl-DcovBIzp.js → glsl-DWWjN4ts.js} +1 -1
- package/dist/ui/assets/{gml-S6feXRA_.js → gml-BcYE-D5A.js} +1 -1
- package/dist/ui/assets/{go-B81WXVYZ.js → go-DUnUzOEI.js} +1 -1
- package/dist/ui/assets/{golo-DKL2IdWk.js → golo-BDoc1QQL.js} +1 -1
- package/dist/ui/assets/{gradle-T97Z3PII.js → gradle-B_WRa_bT.js} +1 -1
- package/dist/ui/assets/{groovy-BXX6Iv9v.js → groovy-CgjqFq1e.js} +1 -1
- package/dist/ui/assets/{haml-D8q-wDTz.js → haml-DCqcg7Ti.js} +1 -1
- package/dist/ui/assets/{handlebars-DDdkLhQc.js → handlebars-DSDUQrnw.js} +1 -1
- package/dist/ui/assets/{haskell-DfxSCvE8.js → haskell-DPVnctVi.js} +1 -1
- package/dist/ui/assets/{haxe-CYmtAuGy.js → haxe-BuCGXBa4.js} +1 -1
- package/dist/ui/assets/{hsp-B6vrbmnn.js → hsp-BTKpS_u0.js} +1 -1
- package/dist/ui/assets/{htmlbars-D2C_JXNB.js → htmlbars-Cql3Jvy2.js} +1 -1
- package/dist/ui/assets/{http-CF4dzBBt.js → http-BB8I9jUh.js} +1 -1
- package/dist/ui/assets/{hy-Bo3ftzPr.js → hy-DG7xkZNz.js} +1 -1
- package/dist/ui/assets/index-CK_lJsTu.css +10 -0
- package/dist/ui/assets/{index-BLxwrLko.js → index-CfTIGTiY.js} +319 -297
- package/dist/ui/assets/{index-CMOhE8Fu.js → index-DqIiCkSD.js} +3 -3
- package/dist/ui/assets/{infoDiagram-FWYZ7A6U-CsP_vXYo.js → infoDiagram-FWYZ7A6U-DIzEV-BJ.js} +1 -1
- package/dist/ui/assets/{inform7-DW_1PfgW.js → inform7-BWNpVEkA.js} +1 -1
- package/dist/ui/assets/{ini-DFoyjgSu.js → ini-BMw_C8EP.js} +1 -1
- package/dist/ui/assets/{irpf90-C-6-eyAC.js → irpf90-Cy42ibFZ.js} +1 -1
- package/dist/ui/assets/{isbl-4gc8Swo4.js → isbl-CjFSc0hz.js} +1 -1
- package/dist/ui/assets/{ishikawaDiagram-FXEZZL3T-D6bH6CQh.js → ishikawaDiagram-FXEZZL3T-BZcxp5am.js} +1 -1
- package/dist/ui/assets/{java-bb2y4EiS.js → java-BDxe9dp1.js} +1 -1
- package/dist/ui/assets/{javascript-BAtDHP3W.js → javascript-CgLkkj7h.js} +1 -1
- package/dist/ui/assets/{jboss-cli-qZg2Imzs.js → jboss-cli-C8biclrb.js} +1 -1
- package/dist/ui/assets/{journeyDiagram-5HDEW3XC-DxDCxUCo.js → journeyDiagram-5HDEW3XC-BbJu6m6Q.js} +1 -1
- package/dist/ui/assets/{json-CNupTqez.js → json-BjJKhmM6.js} +1 -1
- package/dist/ui/assets/{julia-DK5AbWFh.js → julia-DvKEpg-R.js} +1 -1
- package/dist/ui/assets/{julia-repl-CY2KMHbB.js → julia-repl-BDJWZxkU.js} +1 -1
- package/dist/ui/assets/{kanban-definition-HUTT4EX6-Dt5KtIgo.js → kanban-definition-HUTT4EX6-DeIVPlbv.js} +1 -1
- package/dist/ui/assets/{kotlin-D9FIaw0d.js → kotlin-DCoXcnEb.js} +1 -1
- package/dist/ui/assets/{lasso-DFGV2pQw.js → lasso-C7m0QmV2.js} +1 -1
- package/dist/ui/assets/{latex-B4vw8fyc.js → latex-SHnTG9Eq.js} +1 -1
- package/dist/ui/assets/{ldif-Dm2FIlTD.js → ldif-_6hUnKPV.js} +1 -1
- package/dist/ui/assets/{leaf-BfPV5rQV.js → leaf-Co9qxlaF.js} +1 -1
- package/dist/ui/assets/{less-DlD-uNfa.js → less-CJRDPwNA.js} +1 -1
- package/dist/ui/assets/{lisp-fwHwKhac.js → lisp-JEHGYbiW.js} +1 -1
- package/dist/ui/assets/{livecodeserver-2Iqy9OJM.js → livecodeserver-BSYaUj4k.js} +1 -1
- package/dist/ui/assets/{livescript-CsVjBiYy.js → livescript-WQMCQeuz.js} +1 -1
- package/dist/ui/assets/{llvm-Dr1LxL0C.js → llvm-DnAHqj5I.js} +1 -1
- package/dist/ui/assets/{lsl-C19lQilh.js → lsl--k-ghYia.js} +1 -1
- package/dist/ui/assets/{lua-Bt6lk_UK.js → lua-CXb23hbC.js} +1 -1
- package/dist/ui/assets/{makefile-BjpMOWNL.js → makefile-CM7o86yn.js} +1 -1
- package/dist/ui/assets/{markdown-BCvk5Luj.js → markdown-HB3HvChQ.js} +1 -1
- package/dist/ui/assets/{mathematica-CMAvLFmv.js → mathematica-9NTuf22N.js} +1 -1
- package/dist/ui/assets/{matlab-Dp9rgor5.js → matlab-CWv-ik4r.js} +1 -1
- package/dist/ui/assets/{maxima-UUgZl2h3.js → maxima-CqYiKCrw.js} +1 -1
- package/dist/ui/assets/{mel-DU6cwelq.js → mel-BbsRpUm5.js} +1 -1
- package/dist/ui/assets/{mercury-DXd4_3jU.js → mercury-Cz2j4HhU.js} +1 -1
- package/dist/ui/assets/{mindmap-definition-LN4V7U3C-BThZR1du.js → mindmap-definition-LN4V7U3C-WyJS8oye.js} +1 -1
- package/dist/ui/assets/{mipsasm-CMNMWNFn.js → mipsasm-BqWSRbQV.js} +1 -1
- package/dist/ui/assets/{mizar-B6c3dauU.js → mizar-JLBfQ6vt.js} +1 -1
- package/dist/ui/assets/{mojolicious-Cprwk6o_.js → mojolicious-D0LbMmyk.js} +1 -1
- package/dist/ui/assets/{monkey-BaAReGcY.js → monkey-DAGL6-JN.js} +1 -1
- package/dist/ui/assets/{moonscript-gS515C7R.js → moonscript-DzbwNSKy.js} +1 -1
- package/dist/ui/assets/{n1ql-Z_4MPbYI.js → n1ql-dkgKq6Yv.js} +1 -1
- package/dist/ui/assets/{nginx-Dc_6EmJn.js → nginx-AUoaDPV4.js} +1 -1
- package/dist/ui/assets/{nim-DtjvH3ft.js → nim-CdqYmVrl.js} +1 -1
- package/dist/ui/assets/{nix-Bu2r_I9_.js → nix-CxmVjwwo.js} +1 -1
- package/dist/ui/assets/{node-repl-8HGWlvcp.js → node-repl-B1Z3zUAh.js} +1 -1
- package/dist/ui/assets/{nsis-9FG-YMvD.js → nsis-CTAuPWhe.js} +1 -1
- package/dist/ui/assets/{objectivec-CX1QmJoj.js → objectivec-CvbKeAPz.js} +1 -1
- package/dist/ui/assets/{ocaml-4qT3O786.js → ocaml-DCiyXKOH.js} +1 -1
- package/dist/ui/assets/{openscad-CvJzggqO.js → openscad-CPGUwmeR.js} +1 -1
- package/dist/ui/assets/{oxygene-BwtAuPgg.js → oxygene-CI_bD1Gw.js} +1 -1
- package/dist/ui/assets/{parser3-DKnhj506.js → parser3-C91CVs85.js} +1 -1
- package/dist/ui/assets/{pegDiagram-2B236MQR-ZVgEXVAh.js → pegDiagram-2B236MQR-yF8AW7GR.js} +1 -1
- package/dist/ui/assets/{perl-BApvz3gE.js → perl-ChxfKl-n.js} +1 -1
- package/dist/ui/assets/{pf--Fg5j93h.js → pf-CKCHkzIA.js} +1 -1
- package/dist/ui/assets/{pgsql-DOapqed0.js → pgsql-BwOP20uH.js} +1 -1
- package/dist/ui/assets/{php-DIm5UjQ3.js → php-B7Rs2tM5.js} +1 -1
- package/dist/ui/assets/{php-template-DTFQ-Xzw.js → php-template-Cx-Fh4AR.js} +1 -1
- package/dist/ui/assets/{pieDiagram-ENE6RG2P-viaSeTd2.js → pieDiagram-ENE6RG2P-BS4hnGNX.js} +1 -1
- package/dist/ui/assets/{plaintext-NRztTbl1.js → plaintext-U7qkdtgS.js} +1 -1
- package/dist/ui/assets/{pony-BfL7O-OQ.js → pony-_fGYgePh.js} +1 -1
- package/dist/ui/assets/{powershell-CLt45Qf4.js → powershell-CFBTcUce.js} +1 -1
- package/dist/ui/assets/{processing-afiHf7ow.js → processing-BWHneU0K.js} +1 -1
- package/dist/ui/assets/{profile-Ch1BVwxN.js → profile-BJ-HxhzS.js} +1 -1
- package/dist/ui/assets/{prolog-Tf3A0bWy.js → prolog-ChHo7n6L.js} +1 -1
- package/dist/ui/assets/{properties-8SdgBqK7.js → properties-e_DOYclC.js} +1 -1
- package/dist/ui/assets/{protobuf-DPDrI7Qg.js → protobuf-5aGSIv7w.js} +1 -1
- package/dist/ui/assets/{puppet-CXofbQOs.js → puppet-D2vQatzX.js} +1 -1
- package/dist/ui/assets/{purebasic-eUJ8DEfM.js → purebasic-n6krfaeF.js} +1 -1
- package/dist/ui/assets/{python-C98zkBPD.js → python-CbIo0XxP.js} +1 -1
- package/dist/ui/assets/{python-repl-Xul3ztGs.js → python-repl-BpIq9kyr.js} +1 -1
- package/dist/ui/assets/{q-BkAM-a7C.js → q-jntnvcCx.js} +1 -1
- package/dist/ui/assets/{qml-BsEaix_u.js → qml-BafQlZNV.js} +1 -1
- package/dist/ui/assets/{quadrantDiagram-ABIIQ3AL-Bvz1yyu9.js → quadrantDiagram-ABIIQ3AL-C3Th8mUJ.js} +1 -1
- package/dist/ui/assets/{r-ItUdMzSw.js → r-CHgvQFLK.js} +1 -1
- package/dist/ui/assets/{railroadDiagram-RFXS5EU6-DdFuoPrk.js → railroadDiagram-RFXS5EU6-CMQkbGJl.js} +1 -1
- package/dist/ui/assets/{reasonml-BDbdIYs9.js → reasonml-DNwlPD_T.js} +1 -1
- package/dist/ui/assets/{requirementDiagram-TGXJPOKE-B8hcvLSP.js → requirementDiagram-TGXJPOKE-B70_oR7v.js} +1 -1
- package/dist/ui/assets/{rib-zIraQ_mX.js → rib-CX4e9JSF.js} +1 -1
- package/dist/ui/assets/{roboconf-CzoIRml1.js → roboconf-ee4qsPGf.js} +1 -1
- package/dist/ui/assets/{routeros-B3UgD0yV.js → routeros-BJSwvu2L.js} +1 -1
- package/dist/ui/assets/{rsl-wAwFfXwD.js → rsl-BiKdMl_F.js} +1 -1
- package/dist/ui/assets/{ruby-D3Thdpv8.js → ruby-CAXTU5LY.js} +1 -1
- package/dist/ui/assets/{ruleslanguage-CPWvLcMl.js → ruleslanguage-C1kgDGXM.js} +1 -1
- package/dist/ui/assets/{rust-DOnpus5t.js → rust-DyEf_GXL.js} +1 -1
- package/dist/ui/assets/{sankeyDiagram-HTMAVEWB-CH-sCFAi.js → sankeyDiagram-HTMAVEWB-CvUfseMg.js} +1 -1
- package/dist/ui/assets/{sas-B2858_1j.js → sas-Q1rlUxPH.js} +1 -1
- package/dist/ui/assets/{scala-Cveq3ftT.js → scala-Dg6KNmge.js} +1 -1
- package/dist/ui/assets/{scheme-DcdF6kjo.js → scheme-D9iooUxI.js} +1 -1
- package/dist/ui/assets/{scilab-Dycxtkgn.js → scilab-CztEJXJY.js} +1 -1
- package/dist/ui/assets/{scss-DFUrItbr.js → scss-BMh-JkdE.js} +1 -1
- package/dist/ui/assets/{sequenceDiagram-DBY2YBRQ-B6WOhYgY.js → sequenceDiagram-DBY2YBRQ-DB0c9kf4.js} +1 -1
- package/dist/ui/assets/{shell-CdK6mfw0.js → shell-DWo6z0MG.js} +1 -1
- package/dist/ui/assets/{sizeCapture-X5ZJPWSS-DEtOtMCB.js → sizeCapture-X5ZJPWSS-BcQlgjfD.js} +1 -1
- package/dist/ui/assets/{smali-BWrgi9Uw.js → smali-Cijeb6pL.js} +1 -1
- package/dist/ui/assets/{smalltalk-D7rVc6SF.js → smalltalk-D0lvqa_d.js} +1 -1
- package/dist/ui/assets/{sml-BwZXpnKa.js → sml-B-vqWZ3b.js} +1 -1
- package/dist/ui/assets/{sqf-GLi5DNBX.js → sqf-BJ-1Q583.js} +1 -1
- package/dist/ui/assets/{sql-B3C8FGL3.js → sql-CMGLxEYV.js} +1 -1
- package/dist/ui/assets/{sql_more-DnUCbJeD.js → sql_more-gsRmbNCH.js} +1 -1
- package/dist/ui/assets/{stan-Sm9c5Vis.js → stan-D1AlTSpf.js} +1 -1
- package/dist/ui/assets/{stata-pulikDkU.js → stata-DnEYviI0.js} +1 -1
- package/dist/ui/assets/{stateDiagram-2N3HPSRC-ncOw7g4V.js → stateDiagram-2N3HPSRC-BSRgVsHO.js} +1 -1
- package/dist/ui/assets/stateDiagram-v2-6OUMAXLB-BLdfpGJO.js +1 -0
- package/dist/ui/assets/{step21-pX15wqtK.js → step21-DbQV9sMo.js} +1 -1
- package/dist/ui/assets/{stylus-fOumlpdp.js → stylus-Cyc7vdUc.js} +1 -1
- package/dist/ui/assets/{subunit-uu3Ov4HX.js → subunit-16ipyMie.js} +1 -1
- package/dist/ui/assets/{swift-CmLDJWUd.js → swift-DTNnw4qS.js} +1 -1
- package/dist/ui/assets/{swimlanes-5IMT3BWC-DqgXf_9D.js → swimlanes-5IMT3BWC-DgOdcc4_.js} +2 -2
- package/dist/ui/assets/swimlanesDiagram-G3AALYLV-DRVnkg3M.js +8 -0
- package/dist/ui/assets/{taggerscript-CazB9nt4.js → taggerscript-DM6pvUWE.js} +1 -1
- package/dist/ui/assets/{tap-DojnLl9r.js → tap-Ch-uyKZq.js} +1 -1
- package/dist/ui/assets/{tcl-CMSHuPY4.js → tcl-D0T_V5dA.js} +1 -1
- package/dist/ui/assets/{thrift-D9T_iaQS.js → thrift-D9xJjYw4.js} +1 -1
- package/dist/ui/assets/{timeline-definition-FHXFAJF6--1I0coei.js → timeline-definition-FHXFAJF6-BBeDMHxb.js} +1 -1
- package/dist/ui/assets/{tp-tKwomxNq.js → tp-kUrCGo9X.js} +1 -1
- package/dist/ui/assets/{twig-CEsN-ViC.js → twig-Cgub6rxA.js} +1 -1
- package/dist/ui/assets/{typescript-BwkWaYfc.js → typescript-BxNP9Ap9.js} +1 -1
- package/dist/ui/assets/{vala-BFkwjsLY.js → vala-DF9ZZagU.js} +1 -1
- package/dist/ui/assets/{vbnet-BoJ1NvBH.js → vbnet-Cf46ypDg.js} +1 -1
- package/dist/ui/assets/{vbscript-D8XSgQnu.js → vbscript-DNs-QKLH.js} +1 -1
- package/dist/ui/assets/{vbscript-html-hn6cBiCZ.js → vbscript-html-DyS6I5L1.js} +1 -1
- package/dist/ui/assets/{vennDiagram-L72KCM5P--d_scOj_.js → vennDiagram-L72KCM5P-8WpWycE-.js} +1 -1
- package/dist/ui/assets/{verilog-CHsNT9Cy.js → verilog-CF5wC4X-.js} +1 -1
- package/dist/ui/assets/{vhdl-BHAdjshQ.js → vhdl-Dm0jpDMn.js} +1 -1
- package/dist/ui/assets/{vim-CXGYjr0E.js → vim-nyO2DRAx.js} +1 -1
- package/dist/ui/assets/{wardleyDiagram-EHGQE667-C1OlFa5w.js → wardleyDiagram-EHGQE667-UeIOK-jv.js} +1 -1
- package/dist/ui/assets/{x86asm-BMtTtbdc.js → x86asm-BNw2-6GG.js} +1 -1
- package/dist/ui/assets/{xl-2RPeIz-_.js → xl-D-YHxr6V.js} +1 -1
- package/dist/ui/assets/{xml-BdgFaqW_.js → xml-BijAlrow.js} +1 -1
- package/dist/ui/assets/{xquery-C-Nme7tR.js → xquery-z0wxWBKz.js} +1 -1
- package/dist/ui/assets/{xychartDiagram-FW5EYKEG-BzM0JoN5.js → xychartDiagram-FW5EYKEG-BNzHLweN.js} +1 -1
- package/dist/ui/assets/{yaml-CVfovUzE.js → yaml-n5TIQArR.js} +1 -1
- package/dist/ui/assets/{zephir-BLoFpefb.js → zephir-DrGhH8jG.js} +1 -1
- package/dist/ui/index.html +2 -2
- package/dist/utils/__tests__/providers-db.test.js +2 -1
- package/dist/utils/db.d.ts +2 -0
- package/dist/utils/db.js +32 -0
- package/dist/utils/openai-converter.d.ts +99 -0
- package/dist/utils/openai-converter.js +293 -0
- package/dist/utils/providers-db.d.ts +2 -0
- package/dist/utils/providers-db.js +19 -7
- package/dist/utils/request-writer.d.ts +16 -0
- package/dist/utils/request-writer.js +123 -9
- package/dist/utils/stats-aggregator.js +2 -0
- package/dist/utils/status-history.js +3 -3
- package/dist/utils/version.d.ts +5 -0
- package/dist/utils/version.js +7 -0
- package/package.json +7 -4
- package/dist/ui/assets/channel-ouobCd00.js +0 -1
- package/dist/ui/assets/classDiagram-OUVF2IWQ-BLjfj6C1.js +0 -1
- package/dist/ui/assets/classDiagram-v2-EOCWNBFH-BLjfj6C1.js +0 -1
- package/dist/ui/assets/index-bwex7GGt.css +0 -10
- package/dist/ui/assets/stateDiagram-v2-6OUMAXLB-D1kUHFw1.js +0 -1
- package/dist/ui/assets/swimlanesDiagram-G3AALYLV-C-113Xl1.js +0 -8
|
@@ -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,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,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,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 @@
|
|
|
1
|
+
export {};
|
|
@@ -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
|
|
43
|
-
api_key TEXT
|
|
44
|
-
model TEXT
|
|
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,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;
|
package/dist/server/data-push.js
CHANGED
|
@@ -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,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
|
+
}
|
package/dist/server/index.js
CHANGED
|
@@ -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() {
|
package/dist/server/proxy.d.ts
CHANGED
|
@@ -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;
|
|
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
|
/**
|