@cc-monitoring/proxy-core 0.1.4 → 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/README.md +11 -35
- 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/config/index.js +2 -1
- package/dist/config/schema.d.ts +48 -0
- package/dist/config/schema.js +11 -1
- 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/chat-route.d.ts +3 -0
- package/dist/server/chat-route.js +401 -0
- 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 +3 -1
- package/dist/server/data-push.js +10 -3
- package/dist/server/docs-route.d.ts +2 -0
- package/dist/server/docs-route.js +63 -0
- package/dist/server/index.js +4 -0
- package/dist/server/mcp-route.d.ts +2 -0
- package/dist/server/mcp-route.js +161 -0
- package/dist/server/proxy.d.ts +4 -1
- package/dist/server/proxy.js +289 -128
- package/dist/server/ui-route.js +123 -46
- package/dist/tools/mcp-bridge.d.ts +13 -0
- package/dist/tools/mcp-bridge.js +36 -0
- package/dist/tools/registry.js +10 -4
- package/dist/ui/assets/{1c-CgVqmGt6.js → 1c-KmWe8RWs.js} +1 -1
- package/dist/ui/assets/{abnf-JPM4b6fj.js → abnf-BKQ6qIuo.js} +1 -1
- package/dist/ui/assets/{abnfDiagram-VRR7QNED-DJkd8PHl.js → abnfDiagram-VRR7QNED-CkRuDPu1.js} +1 -1
- package/dist/ui/assets/{accesslog-CLIMhXWi.js → accesslog-DD9H5Ktc.js} +1 -1
- package/dist/ui/assets/{actionscript-DqniQGld.js → actionscript-CAjf2Qtd.js} +1 -1
- package/dist/ui/assets/{ada-2BFfY7fF.js → ada-BXkXW16O.js} +1 -1
- package/dist/ui/assets/{angelscript-C47qRqcs.js → angelscript-BxT7o0Up.js} +1 -1
- package/dist/ui/assets/{apache-DP-LC5-h.js → apache-C5z_tmVm.js} +1 -1
- package/dist/ui/assets/{applescript-BB0gk3HQ.js → applescript-DdIxl8rr.js} +1 -1
- package/dist/ui/assets/{arc-D8wRCC4D.js → arc-hSdFaqKn.js} +1 -1
- package/dist/ui/assets/{arcade-1R6g1VPm.js → arcade-D5m0roat.js} +1 -1
- package/dist/ui/assets/{architectureDiagram-ZJ3FMSHR-CbHhHV9v.js → architectureDiagram-ZJ3FMSHR-DOSHSqzf.js} +1 -1
- package/dist/ui/assets/{arduino-B8YryK0R.js → arduino-FDap8kq-.js} +1 -1
- package/dist/ui/assets/{armasm-CYdj7mzR.js → armasm-Kzp-Jr1v.js} +1 -1
- package/dist/ui/assets/{asciidoc-bZ11zz6i.js → asciidoc-DbGMW3EE.js} +1 -1
- package/dist/ui/assets/{aspectj-D5WPU-RQ.js → aspectj-CVYMmBCO.js} +1 -1
- package/dist/ui/assets/{autohotkey-70tZvCLL.js → autohotkey-9PmBGTPd.js} +1 -1
- package/dist/ui/assets/{autoit-CX2GaaHP.js → autoit-B4F86jgh.js} +1 -1
- package/dist/ui/assets/{avrasm-C154El0d.js → avrasm-CSzv2eHX.js} +1 -1
- package/dist/ui/assets/{awk-DdXKOeux.js → awk-CjsvYvZE.js} +1 -1
- package/dist/ui/assets/{axapta-CwLwkXST.js → axapta-BVgMoNRY.js} +1 -1
- package/dist/ui/assets/{bash-Uu61S1nB.js → bash-IeBjW3pt.js} +1 -1
- package/dist/ui/assets/{basic-CeiAWoiF.js → basic-BTFJfmV1.js} +1 -1
- package/dist/ui/assets/{blockDiagram-677ZJIJ3-DcvhphUd.js → blockDiagram-677ZJIJ3-DLw3Bbhf.js} +1 -1
- package/dist/ui/assets/{bnf-B5KF61QW.js → bnf-rCkeRYk0.js} +1 -1
- package/dist/ui/assets/{brainfuck-CP0Y7_VW.js → brainfuck-DBHuB3uZ.js} +1 -1
- package/dist/ui/assets/{coq-D-WTlq_d.js → c-C95V0zHL.js} +1 -1
- package/dist/ui/assets/{c-like-DXr53gS6.js → c-like-CK1xGeX_.js} +1 -1
- package/dist/ui/assets/{c4Diagram-LMCZKHZV-Cn017lmJ.js → c4Diagram-LMCZKHZV-cqY51yJw.js} +1 -1
- package/dist/ui/assets/{cal-7ld1j-Wh.js → cal-BxGPpEZK.js} +1 -1
- package/dist/ui/assets/{capnproto-DrddNBCZ.js → capnproto-Bo2fgXF9.js} +1 -1
- package/dist/ui/assets/{ceylon-XPuE6IIL.js → ceylon-C4Bb4pNB.js} +1 -1
- package/dist/ui/assets/channel-D9Y4iN1l.js +1 -0
- package/dist/ui/assets/{chunk-2Q5K7J3B-BoX3IESS.js → chunk-2Q5K7J3B-CGTiTBmo.js} +1 -1
- package/dist/ui/assets/{chunk-32BRIVSS-C300ACzq.js → chunk-32BRIVSS-DWagYBp9.js} +1 -1
- package/dist/ui/assets/{chunk-5VM5RSS4-MtSkFsde.js → chunk-5VM5RSS4-BzSBMKJX.js} +1 -1
- package/dist/ui/assets/{chunk-EX3LRPZG-CEeHrGNV.js → chunk-EX3LRPZG-4-aKwCgZ.js} +1 -1
- package/dist/ui/assets/{chunk-JWPE2WC7-DTRgpK0R.js → chunk-JWPE2WC7-CPC_cBN0.js} +1 -1
- package/dist/ui/assets/{chunk-MOJQB5TN-DiOl0HJx.js → chunk-MOJQB5TN-DrDE4H9w.js} +1 -1
- package/dist/ui/assets/{chunk-RYQCIY6F-CVC3opqY.js → chunk-RYQCIY6F-DkdXe_kU.js} +1 -1
- package/dist/ui/assets/{chunk-V7JOEXUC-yQYlqQCC.js → chunk-V7JOEXUC-Da6EWcQt.js} +1 -1
- package/dist/ui/assets/{chunk-VR4S4FIN-iAA8ZgkK.js → chunk-VR4S4FIN-nP6dstD5.js} +1 -1
- package/dist/ui/assets/{chunk-XXDRQBXY-B303eieF.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-MfHaW_uS.js → clean-cc1m9AxK.js} +1 -1
- package/dist/ui/assets/{clojure-9L8TfiWA.js → clojure-DX5V8QA8.js} +1 -1
- package/dist/ui/assets/{clojure-repl-CjsH9sxr.js → clojure-repl-FzjnVNWQ.js} +1 -1
- package/dist/ui/assets/{cmake-D0D1Q30G.js → cmake-COZZyrKs.js} +1 -1
- package/dist/ui/assets/{coffeescript-BI4jWZnB.js → coffeescript-DBsnOmC4.js} +1 -1
- package/dist/ui/assets/{c-BgqCrSpv.js → coq-TwFFolHa.js} +1 -1
- package/dist/ui/assets/{cos-DHax5LIJ.js → cos-Dm5g-IQT.js} +1 -1
- package/dist/ui/assets/{cose-bilkent-JH36ORCC-BzrKmTAZ.js → cose-bilkent-JH36ORCC-B3-weOQF.js} +1 -1
- package/dist/ui/assets/{cpp-M4aMPUas.js → cpp-_RZxQjg7.js} +1 -1
- package/dist/ui/assets/{crmsh-DAAczfR0.js → crmsh-DGPJ11Gt.js} +1 -1
- package/dist/ui/assets/{crystal-7g2CpWm4.js → crystal-BOMSPGge.js} +1 -1
- package/dist/ui/assets/{csharp-DW5GdKKf.js → csharp-DZXiHH72.js} +1 -1
- package/dist/ui/assets/{csp-Bq74fG7-.js → csp-DDSIMUoU.js} +1 -1
- package/dist/ui/assets/{css-DHyeLXff.js → css-Bjye-ZWr.js} +1 -1
- package/dist/ui/assets/{cynefin-VYW2F7L2-DwV1t9iV.js → cynefin-VYW2F7L2-Cj5c4L3y.js} +1 -1
- package/dist/ui/assets/{cynefinDiagram-TSTJHNR4-kBCFRYPz.js → cynefinDiagram-TSTJHNR4-BYsfTeNX.js} +1 -1
- package/dist/ui/assets/{d-yey2lm3v.js → d-22pfurOx.js} +1 -1
- package/dist/ui/assets/{dagre-VKFMJZFB-CErVJ1s0.js → dagre-VKFMJZFB-DiEob-by.js} +1 -1
- package/dist/ui/assets/{dart-BadDxflP.js → dart-Doiu8cDW.js} +1 -1
- package/dist/ui/assets/{delphi-CqzVqtDp.js → delphi-CQ7epp84.js} +1 -1
- package/dist/ui/assets/{diagram-FQU43EPY-C7zAW2DU.js → diagram-FQU43EPY-BOPbQcL4.js} +1 -1
- package/dist/ui/assets/{diagram-G47NLZAW-CbUb6BZI.js → diagram-G47NLZAW-C1UWDJTx.js} +1 -1
- package/dist/ui/assets/{diagram-NH7WQ7WH-C5mgi3dn.js → diagram-NH7WQ7WH-CYsBqW3J.js} +1 -1
- package/dist/ui/assets/{diagram-OA4YK3LP-Cok2YNfS.js → diagram-OA4YK3LP-Dnag0x_3.js} +1 -1
- package/dist/ui/assets/{diagram-WEI45ONY-BODuP2EB.js → diagram-WEI45ONY-Bo4CsDoj.js} +1 -1
- package/dist/ui/assets/{diff-EVigJ-h2.js → diff-Cs6VQQZt.js} +1 -1
- package/dist/ui/assets/{django-BH2EEal6.js → django-Bo3okOrw.js} +1 -1
- package/dist/ui/assets/{dns-BSc8VTm8.js → dns-BpG60eIX.js} +1 -1
- package/dist/ui/assets/{dockerfile-Br_pZjru.js → dockerfile-BWyH8SlV.js} +1 -1
- package/dist/ui/assets/{dos-Bx3ludet.js → dos-DWlNbaB9.js} +1 -1
- package/dist/ui/assets/{dsconfig-DSI-ePne.js → dsconfig-D_8y8YrJ.js} +1 -1
- package/dist/ui/assets/{dts-ClCuE1Xq.js → dts-Cz4SyMYR.js} +1 -1
- package/dist/ui/assets/{dust-CC9Z8iuW.js → dust-Cu4qLkeH.js} +1 -1
- package/dist/ui/assets/{ebnf-DI0w_fbi.js → ebnf-CTVHui3r.js} +1 -1
- package/dist/ui/assets/{ebnfDiagram-CCIWWBDH-CgsnO8Qm.js → ebnfDiagram-CCIWWBDH-epcXQLEj.js} +1 -1
- package/dist/ui/assets/{elixir-hdzZik8p.js → elixir-MAlwXhfU.js} +1 -1
- package/dist/ui/assets/{elm-DJAgqt5I.js → elm-Bdmwbvef.js} +1 -1
- package/dist/ui/assets/{erDiagram-Q63AITRT-K4zJcEKd.js → erDiagram-Q63AITRT-Bb60TqAM.js} +1 -1
- package/dist/ui/assets/{erb-Cq4OQqkl.js → erb-Ce9TpP4g.js} +1 -1
- package/dist/ui/assets/{erlang-CHoXLODu.js → erlang-CN2GEiqk.js} +1 -1
- package/dist/ui/assets/{erlang-repl-Brp70Zip.js → erlang-repl-D8K4O_cp.js} +1 -1
- package/dist/ui/assets/{excel-DjS-QR9P.js → excel-eVZU1r0f.js} +1 -1
- package/dist/ui/assets/{fix-BsO9Oq6H.js → fix-BzKerEv0.js} +1 -1
- package/dist/ui/assets/{flix-2A7CKozm.js → flix-B9CE3skV.js} +1 -1
- package/dist/ui/assets/{flowDiagram-23GEKE2U-Ck4tfxWX.js → flowDiagram-23GEKE2U-DzMLZIyt.js} +1 -1
- package/dist/ui/assets/{fortran-BQu3wORI.js → fortran-B4__3vos.js} +1 -1
- package/dist/ui/assets/{fsharp-D439S6PZ.js → fsharp-BJ3-ARHz.js} +1 -1
- package/dist/ui/assets/{gams-CPRxKfRH.js → gams-Cu43oSYT.js} +1 -1
- package/dist/ui/assets/{ganttDiagram-NO4QXBWP-QTPyXXxa.js → ganttDiagram-NO4QXBWP-D_aAoMRP.js} +1 -1
- package/dist/ui/assets/{gauss-GJFW9Vod.js → gauss-T8vk_TpE.js} +1 -1
- package/dist/ui/assets/{gcode-CF6woDAl.js → gcode-9j3BicpZ.js} +1 -1
- package/dist/ui/assets/{gherkin-Co-YjHfW.js → gherkin-Dyh5KFG-.js} +1 -1
- package/dist/ui/assets/{gitGraphDiagram-IHSO6WYX-Do9VfPHL.js → gitGraphDiagram-IHSO6WYX-CMxCHC-Z.js} +1 -1
- package/dist/ui/assets/{glsl-D3lldBTJ.js → glsl-DWWjN4ts.js} +1 -1
- package/dist/ui/assets/{gml-DyoCibnw.js → gml-BcYE-D5A.js} +1 -1
- package/dist/ui/assets/{go-BNeAS1jC.js → go-DUnUzOEI.js} +1 -1
- package/dist/ui/assets/{golo-BuXecWAH.js → golo-BDoc1QQL.js} +1 -1
- package/dist/ui/assets/{gradle-BP7ToLe9.js → gradle-B_WRa_bT.js} +1 -1
- package/dist/ui/assets/{groovy-GqWVT09g.js → groovy-CgjqFq1e.js} +1 -1
- package/dist/ui/assets/{haml-SLbvCHsC.js → haml-DCqcg7Ti.js} +1 -1
- package/dist/ui/assets/{handlebars-BnaCJTc5.js → handlebars-DSDUQrnw.js} +1 -1
- package/dist/ui/assets/{haskell-CrX9ftWp.js → haskell-DPVnctVi.js} +1 -1
- package/dist/ui/assets/{haxe-DNoaIxsE.js → haxe-BuCGXBa4.js} +1 -1
- package/dist/ui/assets/{hsp-CLjy3djj.js → hsp-BTKpS_u0.js} +1 -1
- package/dist/ui/assets/{htmlbars-w96Kz5NL.js → htmlbars-Cql3Jvy2.js} +1 -1
- package/dist/ui/assets/{http-VIMXIxM8.js → http-BB8I9jUh.js} +1 -1
- package/dist/ui/assets/{hy-_qE83_aW.js → hy-DG7xkZNz.js} +1 -1
- package/dist/ui/assets/index-CK_lJsTu.css +10 -0
- package/dist/ui/assets/index-CfTIGTiY.js +2677 -0
- package/dist/ui/assets/{index-DpcPfZl3.js → index-DqIiCkSD.js} +3 -3
- package/dist/ui/assets/{infoDiagram-FWYZ7A6U-D9O7SZ2X.js → infoDiagram-FWYZ7A6U-DIzEV-BJ.js} +1 -1
- package/dist/ui/assets/{inform7-CnyW73C1.js → inform7-BWNpVEkA.js} +1 -1
- package/dist/ui/assets/{ini-GFMFAjln.js → ini-BMw_C8EP.js} +1 -1
- package/dist/ui/assets/{irpf90-BPmSYATn.js → irpf90-Cy42ibFZ.js} +1 -1
- package/dist/ui/assets/{isbl-BnStGiBQ.js → isbl-CjFSc0hz.js} +1 -1
- package/dist/ui/assets/{ishikawaDiagram-FXEZZL3T-DgcUDM9X.js → ishikawaDiagram-FXEZZL3T-BZcxp5am.js} +1 -1
- package/dist/ui/assets/{java-CVORcFd8.js → java-BDxe9dp1.js} +1 -1
- package/dist/ui/assets/{javascript-B2pFzODm.js → javascript-CgLkkj7h.js} +1 -1
- package/dist/ui/assets/{jboss-cli-B9cQeKvZ.js → jboss-cli-C8biclrb.js} +1 -1
- package/dist/ui/assets/{journeyDiagram-5HDEW3XC-Bivjw4h7.js → journeyDiagram-5HDEW3XC-BbJu6m6Q.js} +1 -1
- package/dist/ui/assets/{json-BJof8L10.js → json-BjJKhmM6.js} +1 -1
- package/dist/ui/assets/{julia-D_dGrCpZ.js → julia-DvKEpg-R.js} +1 -1
- package/dist/ui/assets/{julia-repl-Dsw0K1B1.js → julia-repl-BDJWZxkU.js} +1 -1
- package/dist/ui/assets/{kanban-definition-HUTT4EX6-Dg7NbKta.js → kanban-definition-HUTT4EX6-DeIVPlbv.js} +1 -1
- package/dist/ui/assets/{kotlin-8oetHRtX.js → kotlin-DCoXcnEb.js} +1 -1
- package/dist/ui/assets/{lasso-e37r_NX1.js → lasso-C7m0QmV2.js} +1 -1
- package/dist/ui/assets/{latex-DAmwzl3n.js → latex-SHnTG9Eq.js} +1 -1
- package/dist/ui/assets/{ldif-CD0mgmt4.js → ldif-_6hUnKPV.js} +1 -1
- package/dist/ui/assets/{leaf-GfPKlp7a.js → leaf-Co9qxlaF.js} +1 -1
- package/dist/ui/assets/{less-PndaZJ6n.js → less-CJRDPwNA.js} +1 -1
- package/dist/ui/assets/{lisp-CNaspu3A.js → lisp-JEHGYbiW.js} +1 -1
- package/dist/ui/assets/{livecodeserver-DEKsXiP3.js → livecodeserver-BSYaUj4k.js} +1 -1
- package/dist/ui/assets/{livescript-DM7jasJn.js → livescript-WQMCQeuz.js} +1 -1
- package/dist/ui/assets/{llvm-D_29j9MV.js → llvm-DnAHqj5I.js} +1 -1
- package/dist/ui/assets/{lsl-DY0WRYhg.js → lsl--k-ghYia.js} +1 -1
- package/dist/ui/assets/{lua-DZ_v4xaE.js → lua-CXb23hbC.js} +1 -1
- package/dist/ui/assets/{makefile-VOjcUGXf.js → makefile-CM7o86yn.js} +1 -1
- package/dist/ui/assets/{markdown-yUEmZWvu.js → markdown-HB3HvChQ.js} +1 -1
- package/dist/ui/assets/{mathematica-BLXYGKkd.js → mathematica-9NTuf22N.js} +1 -1
- package/dist/ui/assets/{matlab-B7SkIpvh.js → matlab-CWv-ik4r.js} +1 -1
- package/dist/ui/assets/{maxima-C7Fw8Vyt.js → maxima-CqYiKCrw.js} +1 -1
- package/dist/ui/assets/{mel-C_Znst2Y.js → mel-BbsRpUm5.js} +1 -1
- package/dist/ui/assets/{mercury-DjUnQNsq.js → mercury-Cz2j4HhU.js} +1 -1
- package/dist/ui/assets/{mindmap-definition-LN4V7U3C-Dp6mEy6L.js → mindmap-definition-LN4V7U3C-WyJS8oye.js} +1 -1
- package/dist/ui/assets/{mipsasm-DaGHhR8c.js → mipsasm-BqWSRbQV.js} +1 -1
- package/dist/ui/assets/{mizar-CZnct-_Z.js → mizar-JLBfQ6vt.js} +1 -1
- package/dist/ui/assets/{mojolicious-BdWFK35j.js → mojolicious-D0LbMmyk.js} +1 -1
- package/dist/ui/assets/{monkey-ta_jgafo.js → monkey-DAGL6-JN.js} +1 -1
- package/dist/ui/assets/{moonscript-B9qovjV6.js → moonscript-DzbwNSKy.js} +1 -1
- package/dist/ui/assets/{n1ql-BciXbxiw.js → n1ql-dkgKq6Yv.js} +1 -1
- package/dist/ui/assets/{nginx-DRCZYbxj.js → nginx-AUoaDPV4.js} +1 -1
- package/dist/ui/assets/{nim-DTMCxPJt.js → nim-CdqYmVrl.js} +1 -1
- package/dist/ui/assets/{nix-D39yZxF9.js → nix-CxmVjwwo.js} +1 -1
- package/dist/ui/assets/{node-repl-vAEXdnYM.js → node-repl-B1Z3zUAh.js} +1 -1
- package/dist/ui/assets/{nsis-CCMP8mq3.js → nsis-CTAuPWhe.js} +1 -1
- package/dist/ui/assets/{objectivec-CZx4kSLP.js → objectivec-CvbKeAPz.js} +1 -1
- package/dist/ui/assets/{ocaml-DBnEo9uR.js → ocaml-DCiyXKOH.js} +1 -1
- package/dist/ui/assets/{openscad-BKc7u4Bl.js → openscad-CPGUwmeR.js} +1 -1
- package/dist/ui/assets/{oxygene-M_Z4lQ6l.js → oxygene-CI_bD1Gw.js} +1 -1
- package/dist/ui/assets/{parser3-DS9UKiKD.js → parser3-C91CVs85.js} +1 -1
- package/dist/ui/assets/{pegDiagram-2B236MQR-BBEXn76M.js → pegDiagram-2B236MQR-yF8AW7GR.js} +1 -1
- package/dist/ui/assets/{perl-D6iEALGE.js → perl-ChxfKl-n.js} +1 -1
- package/dist/ui/assets/{pf-JQL0ClGi.js → pf-CKCHkzIA.js} +1 -1
- package/dist/ui/assets/{pgsql-DEmCURBr.js → pgsql-BwOP20uH.js} +1 -1
- package/dist/ui/assets/{php-DVm-0PY5.js → php-B7Rs2tM5.js} +1 -1
- package/dist/ui/assets/{php-template-DfWbDpnE.js → php-template-Cx-Fh4AR.js} +1 -1
- package/dist/ui/assets/{pieDiagram-ENE6RG2P-D5PZFiDj.js → pieDiagram-ENE6RG2P-BS4hnGNX.js} +1 -1
- package/dist/ui/assets/{plaintext-BahVkGlu.js → plaintext-U7qkdtgS.js} +1 -1
- package/dist/ui/assets/{pony-wVig0caC.js → pony-_fGYgePh.js} +1 -1
- package/dist/ui/assets/{powershell-COjMBUit.js → powershell-CFBTcUce.js} +1 -1
- package/dist/ui/assets/{processing-DnUzvFZx.js → processing-BWHneU0K.js} +1 -1
- package/dist/ui/assets/{profile-mDlbwJeL.js → profile-BJ-HxhzS.js} +1 -1
- package/dist/ui/assets/{prolog-x2hG6DnA.js → prolog-ChHo7n6L.js} +1 -1
- package/dist/ui/assets/{properties-DzZyyivC.js → properties-e_DOYclC.js} +1 -1
- package/dist/ui/assets/{protobuf-a5NwbYD5.js → protobuf-5aGSIv7w.js} +1 -1
- package/dist/ui/assets/{puppet-CCWyPVuC.js → puppet-D2vQatzX.js} +1 -1
- package/dist/ui/assets/{purebasic-CXNdqtD4.js → purebasic-n6krfaeF.js} +1 -1
- package/dist/ui/assets/{python-iSR9YlDJ.js → python-CbIo0XxP.js} +1 -1
- package/dist/ui/assets/{python-repl-CCmKzWru.js → python-repl-BpIq9kyr.js} +1 -1
- package/dist/ui/assets/{q-B30ZmDuD.js → q-jntnvcCx.js} +1 -1
- package/dist/ui/assets/{qml-BGdPdB4X.js → qml-BafQlZNV.js} +1 -1
- package/dist/ui/assets/{quadrantDiagram-ABIIQ3AL-BBF1rAvI.js → quadrantDiagram-ABIIQ3AL-C3Th8mUJ.js} +1 -1
- package/dist/ui/assets/{r-B8ASdWL1.js → r-CHgvQFLK.js} +1 -1
- package/dist/ui/assets/{railroadDiagram-RFXS5EU6-DQFUXGVD.js → railroadDiagram-RFXS5EU6-CMQkbGJl.js} +1 -1
- package/dist/ui/assets/{reasonml-Dw4Bi5B5.js → reasonml-DNwlPD_T.js} +1 -1
- package/dist/ui/assets/{requirementDiagram-TGXJPOKE-DCgrs7-P.js → requirementDiagram-TGXJPOKE-B70_oR7v.js} +1 -1
- package/dist/ui/assets/{rib-CgUGGGZ9.js → rib-CX4e9JSF.js} +1 -1
- package/dist/ui/assets/{roboconf-CCZNQvSP.js → roboconf-ee4qsPGf.js} +1 -1
- package/dist/ui/assets/{routeros-DVT5M6iV.js → routeros-BJSwvu2L.js} +1 -1
- package/dist/ui/assets/{rsl-BY-LhdKq.js → rsl-BiKdMl_F.js} +1 -1
- package/dist/ui/assets/{ruby-CZW4dclw.js → ruby-CAXTU5LY.js} +1 -1
- package/dist/ui/assets/{ruleslanguage-CZdjv1of.js → ruleslanguage-C1kgDGXM.js} +1 -1
- package/dist/ui/assets/{rust-D5Xa_mSD.js → rust-DyEf_GXL.js} +1 -1
- package/dist/ui/assets/{sankeyDiagram-HTMAVEWB-BXeEgUB7.js → sankeyDiagram-HTMAVEWB-CvUfseMg.js} +1 -1
- package/dist/ui/assets/{sas-B_UJ-HCZ.js → sas-Q1rlUxPH.js} +1 -1
- package/dist/ui/assets/{scala-B8wSdZik.js → scala-Dg6KNmge.js} +1 -1
- package/dist/ui/assets/{scheme-DD7U81eh.js → scheme-D9iooUxI.js} +1 -1
- package/dist/ui/assets/{scilab-aJGpbkKs.js → scilab-CztEJXJY.js} +1 -1
- package/dist/ui/assets/{scss-BBqyvWYh.js → scss-BMh-JkdE.js} +1 -1
- package/dist/ui/assets/{sequenceDiagram-DBY2YBRQ-CnDTZN18.js → sequenceDiagram-DBY2YBRQ-DB0c9kf4.js} +1 -1
- package/dist/ui/assets/{shell-CR23jqfz.js → shell-DWo6z0MG.js} +1 -1
- package/dist/ui/assets/{sizeCapture-X5ZJPWSS-joZ477RB.js → sizeCapture-X5ZJPWSS-BcQlgjfD.js} +1 -1
- package/dist/ui/assets/{smali-ZmLyRCrQ.js → smali-Cijeb6pL.js} +1 -1
- package/dist/ui/assets/{smalltalk-CnADYfPr.js → smalltalk-D0lvqa_d.js} +1 -1
- package/dist/ui/assets/{sml-zj1KD04_.js → sml-B-vqWZ3b.js} +1 -1
- package/dist/ui/assets/{sqf-DCCaZ3e3.js → sqf-BJ-1Q583.js} +1 -1
- package/dist/ui/assets/{sql-CHGw2SCR.js → sql-CMGLxEYV.js} +1 -1
- package/dist/ui/assets/{sql_more-DsnvjMwh.js → sql_more-gsRmbNCH.js} +1 -1
- package/dist/ui/assets/{stan-ChxdV8f9.js → stan-D1AlTSpf.js} +1 -1
- package/dist/ui/assets/{stata-CgFw45qg.js → stata-DnEYviI0.js} +1 -1
- package/dist/ui/assets/{stateDiagram-2N3HPSRC-CzLIdKbt.js → stateDiagram-2N3HPSRC-BSRgVsHO.js} +1 -1
- package/dist/ui/assets/stateDiagram-v2-6OUMAXLB-BLdfpGJO.js +1 -0
- package/dist/ui/assets/{step21-DaraQMOk.js → step21-DbQV9sMo.js} +1 -1
- package/dist/ui/assets/{stylus-BZpiJEzN.js → stylus-Cyc7vdUc.js} +1 -1
- package/dist/ui/assets/{subunit-B6Gp0n7h.js → subunit-16ipyMie.js} +1 -1
- package/dist/ui/assets/{swift-DQzoz60p.js → swift-DTNnw4qS.js} +1 -1
- package/dist/ui/assets/{swimlanes-5IMT3BWC-DOMOhwX0.js → swimlanes-5IMT3BWC-DgOdcc4_.js} +2 -2
- package/dist/ui/assets/swimlanesDiagram-G3AALYLV-DRVnkg3M.js +8 -0
- package/dist/ui/assets/{taggerscript-BMLkfiab.js → taggerscript-DM6pvUWE.js} +1 -1
- package/dist/ui/assets/{tap-PUNWTFgu.js → tap-Ch-uyKZq.js} +1 -1
- package/dist/ui/assets/{tcl-BODH5qJa.js → tcl-D0T_V5dA.js} +1 -1
- package/dist/ui/assets/{thrift-BQ-W_YlC.js → thrift-D9xJjYw4.js} +1 -1
- package/dist/ui/assets/{timeline-definition-FHXFAJF6-DQBDeTzH.js → timeline-definition-FHXFAJF6-BBeDMHxb.js} +1 -1
- package/dist/ui/assets/{tp-Dt3WwOGF.js → tp-kUrCGo9X.js} +1 -1
- package/dist/ui/assets/{twig-44RQtw7Z.js → twig-Cgub6rxA.js} +1 -1
- package/dist/ui/assets/{typescript-BsouHXHR.js → typescript-BxNP9Ap9.js} +1 -1
- package/dist/ui/assets/{vala-DqJj6fPT.js → vala-DF9ZZagU.js} +1 -1
- package/dist/ui/assets/{vbnet-CuqWYg5r.js → vbnet-Cf46ypDg.js} +1 -1
- package/dist/ui/assets/{vbscript-w20MQMYP.js → vbscript-DNs-QKLH.js} +1 -1
- package/dist/ui/assets/{vbscript-html-BP0D0WEV.js → vbscript-html-DyS6I5L1.js} +1 -1
- package/dist/ui/assets/{vennDiagram-L72KCM5P-DwNnj3Kc.js → vennDiagram-L72KCM5P-8WpWycE-.js} +1 -1
- package/dist/ui/assets/{verilog-DIpBpJAe.js → verilog-CF5wC4X-.js} +1 -1
- package/dist/ui/assets/{vhdl-D5nCxDbL.js → vhdl-Dm0jpDMn.js} +1 -1
- package/dist/ui/assets/{vim-CPfbBM_x.js → vim-nyO2DRAx.js} +1 -1
- package/dist/ui/assets/{wardleyDiagram-EHGQE667-WxVQHmM7.js → wardleyDiagram-EHGQE667-UeIOK-jv.js} +1 -1
- package/dist/ui/assets/{x86asm-D_t4Z_eq.js → x86asm-BNw2-6GG.js} +1 -1
- package/dist/ui/assets/{xl-DQf5IG_W.js → xl-D-YHxr6V.js} +1 -1
- package/dist/ui/assets/{xml-D-Bn0NMR.js → xml-BijAlrow.js} +1 -1
- package/dist/ui/assets/{xquery-DqushYX1.js → xquery-z0wxWBKz.js} +1 -1
- package/dist/ui/assets/{xychartDiagram-FW5EYKEG-B6D8mgs8.js → xychartDiagram-FW5EYKEG-BNzHLweN.js} +1 -1
- package/dist/ui/assets/{yaml-B2GFZenc.js → yaml-n5TIQArR.js} +1 -1
- package/dist/ui/assets/{zephir-SiNGockR.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/__tests__/tool-injector.test.js +32 -35
- package/dist/utils/db.d.ts +3 -0
- package/dist/utils/db.js +54 -0
- package/dist/utils/inject-loop.d.ts +52 -1
- package/dist/utils/inject-loop.js +70 -2
- package/dist/utils/mcp-db.d.ts +35 -0
- package/dist/utils/mcp-db.js +79 -0
- package/dist/utils/mcp-manager.d.ts +36 -0
- package/dist/utils/mcp-manager.js +215 -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 +20 -0
- package/dist/utils/request-writer.js +184 -4
- package/dist/utils/sse-stream-processor.d.ts +27 -0
- package/dist/utils/sse-stream-processor.js +144 -0
- package/dist/utils/stats-aggregator.js +2 -0
- package/dist/utils/status-history.js +3 -3
- package/dist/utils/tool-injector.d.ts +6 -9
- package/dist/utils/tool-injector.js +13 -14
- package/dist/utils/version.d.ts +6 -0
- package/dist/utils/version.js +11 -1
- package/package.json +14 -12
- package/dist/ui/assets/channel-C5JlZ38H.js +0 -1
- package/dist/ui/assets/classDiagram-OUVF2IWQ-j5FVBKaD.js +0 -1
- package/dist/ui/assets/classDiagram-v2-EOCWNBFH-j5FVBKaD.js +0 -1
- package/dist/ui/assets/index-Baqd6LlK.js +0 -2625
- package/dist/ui/assets/index-fHtNI_e8.css +0 -1
- package/dist/ui/assets/stateDiagram-v2-6OUMAXLB-Bg4GAkB5.js +0 -1
- package/dist/ui/assets/swimlanesDiagram-G3AALYLV-99wEK8yq.js +0 -8
package/README.md
CHANGED
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
# @cc-monitoring/proxy-core
|
|
2
2
|
|
|
3
|
-
Claude Code
|
|
4
|
-
|
|
5
|
-
一站式解决国内网络访问 Claude Code 的问题,同时提供请求日志、Token 统计、供应商切换、SSE 流式抓包等运维能力。
|
|
3
|
+
Claude Code 代理工具 + Token 消耗监控面板。一行命令启动代理,实时追踪每次请求的模型、Token 用量和响应状态。
|
|
6
4
|
|
|
7
5
|
[](https://www.npmjs.com/package/@cc-monitoring/proxy-core)
|
|
8
6
|
[](https://opensource.org/licenses/Apache-2.0)
|
|
@@ -27,7 +25,7 @@ ccm start
|
|
|
27
25
|
ccm ui
|
|
28
26
|
|
|
29
27
|
# 3. 把 Claude Code 的 ANTHROPIC_BASE_URL 指向本地代理
|
|
30
|
-
export ANTHROPIC_BASE_URL=http://localhost:
|
|
28
|
+
export ANTHROPIC_BASE_URL=http://localhost:9527
|
|
31
29
|
```
|
|
32
30
|
|
|
33
31
|
首次运行会在 `~/.cc-monitoring/` 生成配置文件和数据库:
|
|
@@ -67,20 +65,21 @@ ccm config set proxy.target https://xxx # 修改上游地址
|
|
|
67
65
|
|
|
68
66
|
```json
|
|
69
67
|
{
|
|
70
|
-
"server": { "port":
|
|
68
|
+
"server": { "port": 9527, "host": "localhost" },
|
|
71
69
|
"proxy": {
|
|
72
|
-
"target": "https://
|
|
73
|
-
"changeOrigin": true
|
|
74
|
-
"rewritePrefix": ""
|
|
70
|
+
"target": "https://ark.cn-beijing.volces.com/api/coding",
|
|
71
|
+
"changeOrigin": true
|
|
75
72
|
},
|
|
76
|
-
"logging": { "level": "info", "file": "logs/proxy.log" },
|
|
77
|
-
"
|
|
73
|
+
"logging": { "level": "info", "file": "logs/proxy.log", "maxSize": "10m", "interval": "1d", "compress": true },
|
|
74
|
+
"storage": { "type": "sqlite", "path": "logs/proxy.db", "maxDays": 7 }
|
|
78
75
|
}
|
|
79
76
|
```
|
|
80
77
|
|
|
78
|
+
> `logs/` 路径相对于 config 所在目录解析,实际存 `~/.cc-monitoring/logs/` 下。
|
|
79
|
+
|
|
81
80
|
| 字段 | 类型 | 说明 |
|
|
82
81
|
|------|------|------|
|
|
83
|
-
| `server.port` | number (1-65535) | 监听端口,默认
|
|
82
|
+
| `server.port` | number (1-65535) | 监听端口,默认 9527 |
|
|
84
83
|
| `server.host` | string | 监听主机 |
|
|
85
84
|
| `proxy.target` | URL | 上游 AI 供应商 API |
|
|
86
85
|
| `proxy.changeOrigin` | boolean | 是否重写 Origin 头 |
|
|
@@ -92,7 +91,7 @@ ccm config set proxy.target https://xxx # 修改上游地址
|
|
|
92
91
|
|
|
93
92
|
## Web 管理面板
|
|
94
93
|
|
|
95
|
-
`ccm ui` 或访问 `http://localhost:
|
|
94
|
+
`ccm ui` 或访问 `http://localhost:9527/ui`:
|
|
96
95
|
|
|
97
96
|
- **状态监控**:CPU / 内存 / 运行时间 / 重启次数(5s 刷新)
|
|
98
97
|
- **实时日志**:WebSocket 推流、级别过滤、关键字搜索
|
|
@@ -100,29 +99,6 @@ ccm config set proxy.target https://xxx # 修改上游地址
|
|
|
100
99
|
- **配置编辑**:可视化改 `config.json`,Zod 实时校验
|
|
101
100
|
- **供应商管理**:多供应商配置,一键切换 baseUrl / apiKey / model
|
|
102
101
|
|
|
103
|
-
## 架构要点
|
|
104
|
-
|
|
105
|
-
**应用层转发**(Controller + Fetch + SSE Pipe),非透明代理:
|
|
106
|
-
|
|
107
|
-
```
|
|
108
|
-
Claude Code
|
|
109
|
-
↓ POST /v1/messages
|
|
110
|
-
Fastify(解析 body)
|
|
111
|
-
↓ saveRequest(记录完整 payload)
|
|
112
|
-
fetch → 上游 API
|
|
113
|
-
↓ Web ReadableStream
|
|
114
|
-
reply.hijack() + Readable.fromWeb().pipe(reply.raw)
|
|
115
|
-
↓ 原样 SSE 转发
|
|
116
|
-
Claude Code
|
|
117
|
-
```
|
|
118
|
-
|
|
119
|
-
为什么不用透明代理:`@fastify/http-proxy` 内部消费 request stream,无法同时完成「记录 body + 转发 SSE + 未来鉴权/统计」。HTTP stream 只能消费一次。
|
|
120
|
-
|
|
121
|
-
**关键处理**:
|
|
122
|
-
- Web Stream → Node Stream:`Readable.fromWeb(response.body)`
|
|
123
|
-
- 头处理:删 `host`(阿里云 404)、`content-length`(长度变化),保留 `anthropic-version` / `x-api-key` / `accept: text/event-stream`
|
|
124
|
-
- SSE 记录:`nodeStream.on('end')` 落盘完整 events 数组
|
|
125
|
-
|
|
126
102
|
## 环境变量
|
|
127
103
|
|
|
128
104
|
| 变量 | 说明 |
|
|
@@ -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')
|
package/dist/config/index.js
CHANGED
package/dist/config/schema.d.ts
CHANGED
|
@@ -65,6 +65,34 @@ export declare const AppConfigSchema: z.ZodObject<{
|
|
|
65
65
|
}, {
|
|
66
66
|
token: string;
|
|
67
67
|
}>>;
|
|
68
|
+
mcpServers: z.ZodDefault<z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
69
|
+
name: z.ZodString;
|
|
70
|
+
transport_type: z.ZodEnum<["stdio", "sse", "streamable-http"]>;
|
|
71
|
+
command: z.ZodOptional<z.ZodString>;
|
|
72
|
+
args: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
73
|
+
env: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
|
|
74
|
+
url: z.ZodOptional<z.ZodString>;
|
|
75
|
+
headers: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
|
|
76
|
+
enabled: z.ZodDefault<z.ZodBoolean>;
|
|
77
|
+
}, "strip", z.ZodTypeAny, {
|
|
78
|
+
name: string;
|
|
79
|
+
transport_type: "stdio" | "sse" | "streamable-http";
|
|
80
|
+
enabled: boolean;
|
|
81
|
+
command?: string | undefined;
|
|
82
|
+
args?: string[] | undefined;
|
|
83
|
+
env?: Record<string, string> | undefined;
|
|
84
|
+
url?: string | undefined;
|
|
85
|
+
headers?: Record<string, string> | undefined;
|
|
86
|
+
}, {
|
|
87
|
+
name: string;
|
|
88
|
+
transport_type: "stdio" | "sse" | "streamable-http";
|
|
89
|
+
command?: string | undefined;
|
|
90
|
+
args?: string[] | undefined;
|
|
91
|
+
env?: Record<string, string> | undefined;
|
|
92
|
+
url?: string | undefined;
|
|
93
|
+
headers?: Record<string, string> | undefined;
|
|
94
|
+
enabled?: boolean | undefined;
|
|
95
|
+
}>, "many">>>;
|
|
68
96
|
}, "strip", z.ZodTypeAny, {
|
|
69
97
|
server: {
|
|
70
98
|
port: number;
|
|
@@ -88,6 +116,16 @@ export declare const AppConfigSchema: z.ZodObject<{
|
|
|
88
116
|
type: "sqlite";
|
|
89
117
|
maxDays: number;
|
|
90
118
|
};
|
|
119
|
+
mcpServers: {
|
|
120
|
+
name: string;
|
|
121
|
+
transport_type: "stdio" | "sse" | "streamable-http";
|
|
122
|
+
enabled: boolean;
|
|
123
|
+
command?: string | undefined;
|
|
124
|
+
args?: string[] | undefined;
|
|
125
|
+
env?: Record<string, string> | undefined;
|
|
126
|
+
url?: string | undefined;
|
|
127
|
+
headers?: Record<string, string> | undefined;
|
|
128
|
+
}[];
|
|
91
129
|
auth?: {
|
|
92
130
|
token: string;
|
|
93
131
|
} | undefined;
|
|
@@ -117,6 +155,16 @@ export declare const AppConfigSchema: z.ZodObject<{
|
|
|
117
155
|
auth?: {
|
|
118
156
|
token: string;
|
|
119
157
|
} | undefined;
|
|
158
|
+
mcpServers?: {
|
|
159
|
+
name: string;
|
|
160
|
+
transport_type: "stdio" | "sse" | "streamable-http";
|
|
161
|
+
command?: string | undefined;
|
|
162
|
+
args?: string[] | undefined;
|
|
163
|
+
env?: Record<string, string> | undefined;
|
|
164
|
+
url?: string | undefined;
|
|
165
|
+
headers?: Record<string, string> | undefined;
|
|
166
|
+
enabled?: boolean | undefined;
|
|
167
|
+
}[] | undefined;
|
|
120
168
|
}>;
|
|
121
169
|
export type AppConfig = z.infer<typeof AppConfigSchema>;
|
|
122
170
|
export declare function validateConfig(config: unknown): ValidationResult;
|
package/dist/config/schema.js
CHANGED
|
@@ -24,7 +24,17 @@ export const AppConfigSchema = z.object({
|
|
|
24
24
|
}).optional().default({ type: 'sqlite', path: 'logs/proxy.db', maxDays: 7 }),
|
|
25
25
|
auth: z.object({
|
|
26
26
|
token: z.string().min(1)
|
|
27
|
-
}).optional()
|
|
27
|
+
}).optional(),
|
|
28
|
+
mcpServers: z.array(z.object({
|
|
29
|
+
name: z.string().min(1),
|
|
30
|
+
transport_type: z.enum(['stdio', 'sse', 'streamable-http']),
|
|
31
|
+
command: z.string().optional(),
|
|
32
|
+
args: z.array(z.string()).optional(),
|
|
33
|
+
env: z.record(z.string()).optional(),
|
|
34
|
+
url: z.string().optional(),
|
|
35
|
+
headers: z.record(z.string()).optional(),
|
|
36
|
+
enabled: z.boolean().default(true)
|
|
37
|
+
})).optional().default([])
|
|
28
38
|
});
|
|
29
39
|
export function validateConfig(config) {
|
|
30
40
|
const result = AppConfigSchema.safeParse(config);
|
|
@@ -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
|
});
|