@cc-monitoring/proxy-core 0.4.0 → 0.4.1
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/__tests__/commands.test.js +19 -0
- package/dist/cli/commands/repair.d.ts +1 -0
- package/dist/cli/commands/repair.js +15 -0
- package/dist/cli/index.js +30 -0
- package/dist/docs/404.html +1 -1
- package/dist/docs/assets/{app.DtYNT5zS.js → app.g7N9jkzn.js} +1 -1
- package/dist/docs/assets/chunks/{@localSearchIndexroot.C4sjikMO.js → @localSearchIndexroot.IHxQqfJH.js} +1 -1
- package/dist/docs/assets/chunks/{VPLocalSearchBox.DpXF9ZAI.js → VPLocalSearchBox.BHwI475_.js} +1 -1
- package/dist/docs/assets/chunks/{theme.TS_gUyc7.js → theme.FhAJSNDh.js} +2 -2
- package/dist/docs/index.html +2 -2
- package/dist/docs/overview.html +2 -2
- package/dist/docs/packages-utils.html +2 -2
- package/dist/docs/proxy-admin/env-and-build.html +2 -2
- package/dist/docs/proxy-admin/index.html +2 -2
- package/dist/docs/proxy-admin/layout-and-menu.html +2 -2
- package/dist/docs/proxy-admin/pages.html +2 -2
- package/dist/docs/proxy-admin/routing-and-auth.html +2 -2
- package/dist/docs/proxy-admin/services-and-mock.html +2 -2
- package/dist/docs/proxy-cli/api-layer.html +2 -2
- package/dist/docs/proxy-cli/app-shell.html +2 -2
- package/dist/docs/proxy-cli/components-common.html +2 -2
- package/dist/docs/proxy-cli/components-config.html +2 -2
- package/dist/docs/proxy-cli/components-requests.html +2 -2
- package/dist/docs/proxy-cli/components-stats.html +2 -2
- package/dist/docs/proxy-cli/components-status.html +2 -2
- package/dist/docs/proxy-cli/data-hooks.html +2 -2
- package/dist/docs/proxy-cli/index.html +2 -2
- package/dist/docs/proxy-cli/utils-and-i18n.html +2 -2
- package/dist/docs/proxy-core/chat-api.html +2 -2
- package/dist/docs/proxy-core/cli.html +2 -2
- package/dist/docs/proxy-core/config.html +2 -2
- package/dist/docs/proxy-core/data-layer.html +2 -2
- package/dist/docs/proxy-core/entry.html +2 -2
- package/dist/docs/proxy-core/index.html +2 -2
- package/dist/docs/proxy-core/pm2.html +2 -2
- package/dist/docs/proxy-core/providers.html +2 -2
- package/dist/docs/proxy-core/proxy.html +2 -2
- package/dist/docs/proxy-core/stats.html +2 -2
- package/dist/docs/proxy-core/tool.html +2 -2
- package/dist/docs/proxy-core/ui-routes.html +2 -2
- package/dist/docs/proxy-core/utilities.html +2 -2
- package/dist/docs/quickstart.html +2 -2
- package/dist/docs/request-flow.html +2 -2
- package/dist/server/__tests__/data-push.test.js +44 -0
- package/dist/server/__tests__/proxy.test.js +281 -2
- package/dist/server/__tests__/server.test.js +15 -10
- package/dist/server/__tests__/ui-route.test.js +43 -0
- package/dist/server/data-push.d.ts +2 -0
- package/dist/server/data-push.js +22 -0
- package/dist/server/index.js +4 -3
- package/dist/server/proxy.js +81 -21
- package/dist/server/ui-route.js +8 -1
- package/dist/ui/assets/{1c-CCx-FOtz.js → 1c-CaPSZBmB.js} +1 -1
- package/dist/ui/assets/{abnf-Bwbi42Z8.js → abnf-DBDOsmne.js} +1 -1
- package/dist/ui/assets/{abnfDiagram-VRR7QNED-Dm1-8q0E.js → abnfDiagram-VRR7QNED-D8zK__Mj.js} +1 -1
- package/dist/ui/assets/{accesslog-DCytz_-m.js → accesslog-BOLs2Kig.js} +1 -1
- package/dist/ui/assets/{actionscript-3udf15oh.js → actionscript-BZYKhS1B.js} +1 -1
- package/dist/ui/assets/{ada-M5Xa74xG.js → ada-DyacnMpg.js} +1 -1
- package/dist/ui/assets/{angelscript-qlrFxfW-.js → angelscript-CAN6j0H3.js} +1 -1
- package/dist/ui/assets/{apache-B-sF-DQH.js → apache-BE4vouiQ.js} +1 -1
- package/dist/ui/assets/{applescript-4FdcBnbI.js → applescript-CS88I1yz.js} +1 -1
- package/dist/ui/assets/{arc-BB3K1enp.js → arc-CTMmdrSV.js} +1 -1
- package/dist/ui/assets/{arcade-B_yqWaaG.js → arcade-B0f0f5SD.js} +1 -1
- package/dist/ui/assets/{architectureDiagram-ZJ3FMSHR-B39vkY8V.js → architectureDiagram-ZJ3FMSHR-Dtvpnopp.js} +1 -1
- package/dist/ui/assets/{arduino-yAcBoTWU.js → arduino-Bhm-OSb2.js} +1 -1
- package/dist/ui/assets/{armasm-wIcY84bI.js → armasm-CEy-mDHc.js} +1 -1
- package/dist/ui/assets/{asciidoc-Bxnu28-Z.js → asciidoc-CrZqQBTj.js} +1 -1
- package/dist/ui/assets/{aspectj-B2cKJA_O.js → aspectj-B4IlFyyJ.js} +1 -1
- package/dist/ui/assets/{autohotkey-B_rMWTtE.js → autohotkey-Cihy-FjA.js} +1 -1
- package/dist/ui/assets/{autoit-DwcuvMwv.js → autoit-Dis_JVJq.js} +1 -1
- package/dist/ui/assets/{avrasm-heGX1PXK.js → avrasm-CVhMycHj.js} +1 -1
- package/dist/ui/assets/{awk-BiqCQAEf.js → awk-BCViwLf5.js} +1 -1
- package/dist/ui/assets/{axapta-Cv8M-Ih6.js → axapta-pWB4JVB_.js} +1 -1
- package/dist/ui/assets/{bash-Divgn3JV.js → bash-B6Giryub.js} +1 -1
- package/dist/ui/assets/{basic-B9dnAP55.js → basic-DcrjcHB0.js} +1 -1
- package/dist/ui/assets/{blockDiagram-677ZJIJ3-DQ1mf7A_.js → blockDiagram-677ZJIJ3-DfhtgI1r.js} +1 -1
- package/dist/ui/assets/{bnf-kIL5mSsP.js → bnf-cpKU0967.js} +1 -1
- package/dist/ui/assets/{brainfuck-DqB7xDjH.js → brainfuck-CFFdk4cM.js} +1 -1
- package/dist/ui/assets/{coq-6aKUn3zn.js → c-CW6KPMeI.js} +1 -1
- package/dist/ui/assets/{c-like-De5MhE7G.js → c-like-CWn59vrg.js} +1 -1
- package/dist/ui/assets/{c4Diagram-LMCZKHZV-DQxtYsAx.js → c4Diagram-LMCZKHZV-D1Oh6k37.js} +1 -1
- package/dist/ui/assets/{cal-mYdfz9en.js → cal-8i26_L39.js} +1 -1
- package/dist/ui/assets/{capnproto-D04CRlOt.js → capnproto-CviwnFBf.js} +1 -1
- package/dist/ui/assets/{ceylon-pi9lFCja.js → ceylon-CQyc4rWs.js} +1 -1
- package/dist/ui/assets/channel-Da2MvpNG.js +1 -0
- package/dist/ui/assets/{chunk-2Q5K7J3B-BDD1nPt8.js → chunk-2Q5K7J3B-oswPBwIn.js} +1 -1
- package/dist/ui/assets/{chunk-32BRIVSS-DgeQFBb5.js → chunk-32BRIVSS-B5pU_9b9.js} +1 -1
- package/dist/ui/assets/{chunk-5VM5RSS4-C7Xf2SnI.js → chunk-5VM5RSS4-gvtfMc4w.js} +1 -1
- package/dist/ui/assets/{chunk-EX3LRPZG-B_3p1HEv.js → chunk-EX3LRPZG-BkBaDMy4.js} +1 -1
- package/dist/ui/assets/{chunk-JWPE2WC7-Dvs7u8eY.js → chunk-JWPE2WC7-Ch-C75ar.js} +1 -1
- package/dist/ui/assets/{chunk-MOJQB5TN-By21wDCN.js → chunk-MOJQB5TN-BfYhj1jN.js} +1 -1
- package/dist/ui/assets/{chunk-RYQCIY6F-6NC700r1.js → chunk-RYQCIY6F-D8izfruP.js} +1 -1
- package/dist/ui/assets/{chunk-V7JOEXUC-vEUqZ3rh.js → chunk-V7JOEXUC-CbzHnW90.js} +1 -1
- package/dist/ui/assets/{chunk-VR4S4FIN-6tX2dNN9.js → chunk-VR4S4FIN-Dr4M5qZA.js} +1 -1
- package/dist/ui/assets/{chunk-XXDRQBXY-qDb2jxAR.js → chunk-XXDRQBXY-QE-R8dRe.js} +1 -1
- package/dist/ui/assets/classDiagram-OUVF2IWQ-mHUiWjcC.js +1 -0
- package/dist/ui/assets/classDiagram-v2-EOCWNBFH-mHUiWjcC.js +1 -0
- package/dist/ui/assets/{clean-CLCsDUl1.js → clean-DZeAtQ7H.js} +1 -1
- package/dist/ui/assets/{clojure-dVi5Xifj.js → clojure-U4ebZ7NQ.js} +1 -1
- package/dist/ui/assets/{clojure-repl-BO_FpFmF.js → clojure-repl-B4QSIzUI.js} +1 -1
- package/dist/ui/assets/{cmake-CP5aJbyK.js → cmake-UHexZySb.js} +1 -1
- package/dist/ui/assets/{coffeescript-ZEfu_9pF.js → coffeescript-Dg56H9Mr.js} +1 -1
- package/dist/ui/assets/{c-HmsCM6sx.js → coq-C1g3mm0X.js} +1 -1
- package/dist/ui/assets/{cos-BohCnRN2.js → cos-BL4DdyGh.js} +1 -1
- package/dist/ui/assets/{cose-bilkent-JH36ORCC-DyXCbbro.js → cose-bilkent-JH36ORCC-BHQslHP3.js} +1 -1
- package/dist/ui/assets/{cpp-FOgPWPEt.js → cpp-keZI-XAd.js} +1 -1
- package/dist/ui/assets/{crmsh-B0OYb-Oe.js → crmsh-DdXYVeeA.js} +1 -1
- package/dist/ui/assets/{crystal-CuWb_dXm.js → crystal-C4AN0m0I.js} +1 -1
- package/dist/ui/assets/{csharp-BbcqM09j.js → csharp-COUyKsNR.js} +1 -1
- package/dist/ui/assets/{csp-rgHnTaDq.js → csp-DBc-rgSJ.js} +1 -1
- package/dist/ui/assets/{css-C-ibh7ZG.js → css-B8m6O_Pw.js} +1 -1
- package/dist/ui/assets/{cynefin-VYW2F7L2-CkuBhgC4.js → cynefin-VYW2F7L2-B3L-WcKn.js} +1 -1
- package/dist/ui/assets/{cynefinDiagram-TSTJHNR4-eycFyDao.js → cynefinDiagram-TSTJHNR4-fzaM4qcZ.js} +1 -1
- package/dist/ui/assets/{d-C0gXxJ0O.js → d-dgQN4Rko.js} +1 -1
- package/dist/ui/assets/{dagre-VKFMJZFB-DzqX9e49.js → dagre-VKFMJZFB-DJHj16mR.js} +1 -1
- package/dist/ui/assets/{dart-C-fTpuUV.js → dart-D2Y7LOq-.js} +1 -1
- package/dist/ui/assets/{delphi-Chm0B9xv.js → delphi-DaGcSk5A.js} +1 -1
- package/dist/ui/assets/{diagram-FQU43EPY-BEgCqfg1.js → diagram-FQU43EPY-iZEZ1f-R.js} +1 -1
- package/dist/ui/assets/{diagram-G47NLZAW-Cw11Vs2v.js → diagram-G47NLZAW-rkQb3r-C.js} +1 -1
- package/dist/ui/assets/{diagram-NH7WQ7WH-DSG_UWpP.js → diagram-NH7WQ7WH-B4Fy72tP.js} +1 -1
- package/dist/ui/assets/{diagram-OA4YK3LP-CJz-WOaJ.js → diagram-OA4YK3LP-BndmuIBq.js} +1 -1
- package/dist/ui/assets/{diagram-WEI45ONY-CBXjBCvc.js → diagram-WEI45ONY-CwlAiqOe.js} +1 -1
- package/dist/ui/assets/{diff-C-vyuMSL.js → diff-prcRV1Y3.js} +1 -1
- package/dist/ui/assets/{django-CJK7lReT.js → django-B1zIoGSx.js} +1 -1
- package/dist/ui/assets/{dns-D02SHjSy.js → dns-ZxI_aTwc.js} +1 -1
- package/dist/ui/assets/{dockerfile-trKL1Bqu.js → dockerfile-Dp_fT6E-.js} +1 -1
- package/dist/ui/assets/{dos-C52dy-sK.js → dos-Cuu5c8vv.js} +1 -1
- package/dist/ui/assets/{dsconfig-MzHgzVrt.js → dsconfig-DcGTOhbS.js} +1 -1
- package/dist/ui/assets/{dts-B137dHyX.js → dts-DCF8VaRk.js} +1 -1
- package/dist/ui/assets/{dust-BcbM0r5C.js → dust-DeCmZWMK.js} +1 -1
- package/dist/ui/assets/{ebnf-DkbpI7bK.js → ebnf-BHQQcuF_.js} +1 -1
- package/dist/ui/assets/{ebnfDiagram-CCIWWBDH-aI5uQ7w1.js → ebnfDiagram-CCIWWBDH-DJ_RuhTm.js} +1 -1
- package/dist/ui/assets/{elixir-BOtDuqQy.js → elixir-BHmweJ4d.js} +1 -1
- package/dist/ui/assets/{elm-DS8Tyyu-.js → elm-v76Hd2B3.js} +1 -1
- package/dist/ui/assets/{erDiagram-Q63AITRT-2vCbd4Mm.js → erDiagram-Q63AITRT-DVZkY5RZ.js} +1 -1
- package/dist/ui/assets/{erb-CSXECRbn.js → erb-xvWF5bfx.js} +1 -1
- package/dist/ui/assets/{erlang-BMxlgKPJ.js → erlang-CKBMURym.js} +1 -1
- package/dist/ui/assets/{erlang-repl-DPzlolPg.js → erlang-repl-BjcfXt3Z.js} +1 -1
- package/dist/ui/assets/{excel-CW2Uxed3.js → excel-Cdrtxhml.js} +1 -1
- package/dist/ui/assets/{fix-UW84SlCs.js → fix-CB-So5So.js} +1 -1
- package/dist/ui/assets/{flix-4UGiPULd.js → flix-VM9AOrq6.js} +1 -1
- package/dist/ui/assets/{flowDiagram-23GEKE2U-R5PbCbZI.js → flowDiagram-23GEKE2U-vyGW67Xm.js} +1 -1
- package/dist/ui/assets/{fortran-nhHsngdu.js → fortran-CcwJVO8H.js} +1 -1
- package/dist/ui/assets/{fsharp-CDyZ1ST5.js → fsharp-DiATpw1u.js} +1 -1
- package/dist/ui/assets/{gams-DHzkkUie.js → gams-Csg9YNPz.js} +1 -1
- package/dist/ui/assets/{ganttDiagram-NO4QXBWP-CGcq4Ie_.js → ganttDiagram-NO4QXBWP-C2TRbwLw.js} +1 -1
- package/dist/ui/assets/{gauss-DdhFGyBv.js → gauss-Bc4TC8Wh.js} +1 -1
- package/dist/ui/assets/{gcode-ImHh8OLA.js → gcode-Rig_2OoA.js} +1 -1
- package/dist/ui/assets/{gherkin-CTWAW-XR.js → gherkin-ByBU06QB.js} +1 -1
- package/dist/ui/assets/{gitGraphDiagram-IHSO6WYX-8nM2Z9lD.js → gitGraphDiagram-IHSO6WYX-CEiqfFIF.js} +1 -1
- package/dist/ui/assets/{glsl-0_W_27G2.js → glsl-C8D6y2Tn.js} +1 -1
- package/dist/ui/assets/{gml-BoDggu2z.js → gml-PHpGPHbT.js} +1 -1
- package/dist/ui/assets/{go-DYfFygwl.js → go-BL_o_3ez.js} +1 -1
- package/dist/ui/assets/{golo-Mlq-TCg9.js → golo-CWQ6dTUz.js} +1 -1
- package/dist/ui/assets/{gradle-BALAinEB.js → gradle-Y_I2KN2z.js} +1 -1
- package/dist/ui/assets/{groovy-Dht--dWU.js → groovy-JnIv8p2l.js} +1 -1
- package/dist/ui/assets/{haml-DpMrxg0d.js → haml-B8W_h6mZ.js} +1 -1
- package/dist/ui/assets/{handlebars-DqHzujNj.js → handlebars-DVm8mJuD.js} +1 -1
- package/dist/ui/assets/{haskell-DZSchhkY.js → haskell-DlDi2Ty7.js} +1 -1
- package/dist/ui/assets/{haxe-C0zBRjdy.js → haxe-CftFNVE-.js} +1 -1
- package/dist/ui/assets/{hsp-D_PwbSv2.js → hsp-C67xnq9C.js} +1 -1
- package/dist/ui/assets/{htmlbars-DxAFMG8u.js → htmlbars-CmJCm67U.js} +1 -1
- package/dist/ui/assets/{http-DvTRF0Do.js → http-b-FPEcHP.js} +1 -1
- package/dist/ui/assets/{hy-lVO-kNyp.js → hy-BWD3ncpN.js} +1 -1
- package/dist/ui/assets/{index-Ci23SMK2.js → index-C7s1zgJb.js} +21 -21
- package/dist/ui/assets/{index-BbMRVVGt.js → index-D2UBwfSG.js} +3 -3
- package/dist/ui/assets/{infoDiagram-FWYZ7A6U-C7WYDlvc.js → infoDiagram-FWYZ7A6U-C0Px17IN.js} +1 -1
- package/dist/ui/assets/{inform7-B8Tf2n8v.js → inform7-C-OYaMO5.js} +1 -1
- package/dist/ui/assets/{ini-DSoYMaLF.js → ini-CVyYmykw.js} +1 -1
- package/dist/ui/assets/{irpf90-RCPdkB14.js → irpf90-BcpjWXIz.js} +1 -1
- package/dist/ui/assets/{isbl-C2p75PPj.js → isbl-ZraBBeEr.js} +1 -1
- package/dist/ui/assets/{ishikawaDiagram-FXEZZL3T-Cm6jsPlc.js → ishikawaDiagram-FXEZZL3T-BjmTMgpO.js} +1 -1
- package/dist/ui/assets/{java-DeY4Yuia.js → java-D_mE2DT6.js} +1 -1
- package/dist/ui/assets/{javascript-3uX1CO-H.js → javascript-akXESsox.js} +1 -1
- package/dist/ui/assets/{jboss-cli-DgnD8mEc.js → jboss-cli-CFe3gTDt.js} +1 -1
- package/dist/ui/assets/{journeyDiagram-5HDEW3XC-DEGV1uA5.js → journeyDiagram-5HDEW3XC-BpgJUvs6.js} +1 -1
- package/dist/ui/assets/{json-BV2PmJJp.js → json-sjN7AzRC.js} +1 -1
- package/dist/ui/assets/{julia-B-m8kQm7.js → julia-BJJYbUMV.js} +1 -1
- package/dist/ui/assets/{julia-repl-C51atU2X.js → julia-repl-BwruD8Ix.js} +1 -1
- package/dist/ui/assets/{kanban-definition-HUTT4EX6-BJ4k5iTX.js → kanban-definition-HUTT4EX6-DFlE9edA.js} +1 -1
- package/dist/ui/assets/{kotlin-CYBziIgl.js → kotlin-CAIQsLCF.js} +1 -1
- package/dist/ui/assets/{lasso-Dw2SBMDW.js → lasso-sU67h-5u.js} +1 -1
- package/dist/ui/assets/{latex-Dpd35yke.js → latex-CVX-jP88.js} +1 -1
- package/dist/ui/assets/{ldif-Ce9EZU__.js → ldif-DGM9xbFZ.js} +1 -1
- package/dist/ui/assets/{leaf-CpkZzQtC.js → leaf-AlB_zmwz.js} +1 -1
- package/dist/ui/assets/{less-Uzo7M0FD.js → less-CKwfEdZQ.js} +1 -1
- package/dist/ui/assets/{lisp-DWXDlJYm.js → lisp-CXYLaAPw.js} +1 -1
- package/dist/ui/assets/{livecodeserver-uEyPEgVJ.js → livecodeserver-C02fGGTS.js} +1 -1
- package/dist/ui/assets/{livescript-BQ5f07oK.js → livescript-CBMa8QF_.js} +1 -1
- package/dist/ui/assets/{llvm-BAvP-skE.js → llvm-WXTIohTC.js} +1 -1
- package/dist/ui/assets/{lsl-DhbiIKu6.js → lsl-4obd2U_I.js} +1 -1
- package/dist/ui/assets/{lua-COxeUeLx.js → lua-DTSy-TjF.js} +1 -1
- package/dist/ui/assets/{makefile-DhDx-IgL.js → makefile-Bf2UEO0i.js} +1 -1
- package/dist/ui/assets/{markdown-DX5_kSxq.js → markdown-BgoGmFfJ.js} +1 -1
- package/dist/ui/assets/{mathematica-D351ZddB.js → mathematica-CSiA8KQh.js} +1 -1
- package/dist/ui/assets/{matlab-CELqIiwF.js → matlab-DoMvLsGB.js} +1 -1
- package/dist/ui/assets/{maxima-B_YljrMm.js → maxima-BFO4dfZO.js} +1 -1
- package/dist/ui/assets/{mel-DltsbNS8.js → mel-DyBpmDxt.js} +1 -1
- package/dist/ui/assets/{mercury-axX-5Vjj.js → mercury-OL5G5uU6.js} +1 -1
- package/dist/ui/assets/{mindmap-definition-LN4V7U3C-Bl1EJo6p.js → mindmap-definition-LN4V7U3C-s-nUZuCs.js} +1 -1
- package/dist/ui/assets/{mipsasm-BxmerVwX.js → mipsasm-KQwdm39j.js} +1 -1
- package/dist/ui/assets/{mizar-XNHfbpL2.js → mizar-BqndJ30I.js} +1 -1
- package/dist/ui/assets/{mojolicious-BR0U_7zk.js → mojolicious-Bvc1uJd-.js} +1 -1
- package/dist/ui/assets/{monkey-lLuu9_f-.js → monkey-Dl_gLm7-.js} +1 -1
- package/dist/ui/assets/{moonscript-DoaZ3DRQ.js → moonscript-BL6R6eAz.js} +1 -1
- package/dist/ui/assets/{n1ql-C6TId6Iu.js → n1ql-C09iOJfQ.js} +1 -1
- package/dist/ui/assets/{nginx-BezSG-JT.js → nginx-C7W01nBr.js} +1 -1
- package/dist/ui/assets/{nim-Bb0rfXie.js → nim-Dj78szvD.js} +1 -1
- package/dist/ui/assets/{nix-o3sJ5-54.js → nix-BOtGyPmd.js} +1 -1
- package/dist/ui/assets/{node-repl-Sv5hhcTf.js → node-repl-19nZvZ4A.js} +1 -1
- package/dist/ui/assets/{nsis-B45BJFhF.js → nsis-ByCl1zIm.js} +1 -1
- package/dist/ui/assets/{objectivec-CzS6zVgh.js → objectivec-BhdaT_Jr.js} +1 -1
- package/dist/ui/assets/{ocaml-Bqux7PyP.js → ocaml-D_NXvSO7.js} +1 -1
- package/dist/ui/assets/{openscad-4Wf6mF84.js → openscad-DOhagvnA.js} +1 -1
- package/dist/ui/assets/{oxygene-Fvwqgkkt.js → oxygene-5BnkqMRH.js} +1 -1
- package/dist/ui/assets/{parser3-zEfzT5wv.js → parser3-jSWlxi8m.js} +1 -1
- package/dist/ui/assets/{pegDiagram-2B236MQR-Dd4rIztM.js → pegDiagram-2B236MQR-CideH-XT.js} +1 -1
- package/dist/ui/assets/{perl-CsS1Gs6o.js → perl-CfsqjZ4b.js} +1 -1
- package/dist/ui/assets/{pf-BNH1jO0R.js → pf-kOewxO29.js} +1 -1
- package/dist/ui/assets/{pgsql-DqPigHrq.js → pgsql-CXm2Xd-Z.js} +1 -1
- package/dist/ui/assets/{php-CdOl9bRs.js → php-CRiA_dH8.js} +1 -1
- package/dist/ui/assets/{php-template-DPfirJg2.js → php-template-ByMrxqSd.js} +1 -1
- package/dist/ui/assets/{pieDiagram-ENE6RG2P-DGaJNf4S.js → pieDiagram-ENE6RG2P-CJkCdB38.js} +1 -1
- package/dist/ui/assets/{plaintext-EHbgBKzw.js → plaintext-BJx0R6A5.js} +1 -1
- package/dist/ui/assets/{pony-DmJajtp2.js → pony-CozCHtz4.js} +1 -1
- package/dist/ui/assets/{powershell-DfGzdWR6.js → powershell-BT7gMMgn.js} +1 -1
- package/dist/ui/assets/{processing-BT0ETgPG.js → processing-FOIxn_W_.js} +1 -1
- package/dist/ui/assets/{profile-B3I-x5Lt.js → profile-BsoUuD9w.js} +1 -1
- package/dist/ui/assets/{prolog-B_4QJIvI.js → prolog-Bd3gvQ2N.js} +1 -1
- package/dist/ui/assets/{properties-BFVI8weS.js → properties-BWGFdny9.js} +1 -1
- package/dist/ui/assets/{protobuf-PaF39oZZ.js → protobuf-pQSKoOOY.js} +1 -1
- package/dist/ui/assets/{puppet-BDC6Q8VF.js → puppet-DnEN_mgS.js} +1 -1
- package/dist/ui/assets/{purebasic-B2ejrOZK.js → purebasic-BqoOGoRw.js} +1 -1
- package/dist/ui/assets/{python-BOxtIk9H.js → python-TeVYomkE.js} +1 -1
- package/dist/ui/assets/{python-repl-BslBh_Mx.js → python-repl-zqu5igFS.js} +1 -1
- package/dist/ui/assets/{q-BPe8WLGW.js → q-CZC9Dltd.js} +1 -1
- package/dist/ui/assets/{qml-BazRR6fz.js → qml-ZNInP45Q.js} +1 -1
- package/dist/ui/assets/{quadrantDiagram-ABIIQ3AL-BQ7aPkHk.js → quadrantDiagram-ABIIQ3AL-Dd7PwxsF.js} +1 -1
- package/dist/ui/assets/{r-C09pGNJC.js → r-B39DAmkC.js} +1 -1
- package/dist/ui/assets/{railroadDiagram-RFXS5EU6-sCO9VGvE.js → railroadDiagram-RFXS5EU6-DtO5PVFZ.js} +1 -1
- package/dist/ui/assets/{reasonml-S7dzwVL9.js → reasonml-B-ZWFJt_.js} +1 -1
- package/dist/ui/assets/{requirementDiagram-TGXJPOKE-CfT5aVZg.js → requirementDiagram-TGXJPOKE-DihF4OTj.js} +1 -1
- package/dist/ui/assets/{rib-fM2EwQd4.js → rib-CnGG0qMF.js} +1 -1
- package/dist/ui/assets/{roboconf-D7AaeyrW.js → roboconf-Ewtfps4u.js} +1 -1
- package/dist/ui/assets/{routeros-c6Q7mKuq.js → routeros-CPcmP1c7.js} +1 -1
- package/dist/ui/assets/{rsl-sCpEQBxh.js → rsl-NbjWFbPH.js} +1 -1
- package/dist/ui/assets/{ruby-lcKhz2w9.js → ruby-DWDdy5yE.js} +1 -1
- package/dist/ui/assets/{ruleslanguage-BW4ATOuX.js → ruleslanguage-Cv_DZe2r.js} +1 -1
- package/dist/ui/assets/{rust-BbpU-0VY.js → rust-NZnsfER5.js} +1 -1
- package/dist/ui/assets/{sankeyDiagram-HTMAVEWB-CaweCpvN.js → sankeyDiagram-HTMAVEWB-D6i-Mzte.js} +1 -1
- package/dist/ui/assets/{sas-BPt5R0dx.js → sas-C4wv0P6G.js} +1 -1
- package/dist/ui/assets/{scala-DxW_vqXs.js → scala-DUdTOIgx.js} +1 -1
- package/dist/ui/assets/{scheme-T2Q_jWzT.js → scheme-DEdFa14t.js} +1 -1
- package/dist/ui/assets/{scilab-DMORg9lV.js → scilab-xY51J2bR.js} +1 -1
- package/dist/ui/assets/{scss-t0VsosqT.js → scss-BEYp1sXc.js} +1 -1
- package/dist/ui/assets/{sequenceDiagram-DBY2YBRQ-o-H_R4zb.js → sequenceDiagram-DBY2YBRQ-njQlqy_J.js} +1 -1
- package/dist/ui/assets/{shell-CnCDa1s9.js → shell-fq6bkhOw.js} +1 -1
- package/dist/ui/assets/{sizeCapture-X5ZJPWSS-BNLkHGDS.js → sizeCapture-X5ZJPWSS-tLn70-Fb.js} +1 -1
- package/dist/ui/assets/{smali-_n-BxJyG.js → smali-CsSAuSYg.js} +1 -1
- package/dist/ui/assets/{smalltalk-B90PXJwK.js → smalltalk-DJ7zrd87.js} +1 -1
- package/dist/ui/assets/{sml-fuY7bj-n.js → sml-CnDwl0nH.js} +1 -1
- package/dist/ui/assets/{sqf-COpwkyuo.js → sqf-Cc2SX4Zy.js} +1 -1
- package/dist/ui/assets/{sql-CXIT0j-x.js → sql-DUQA_V_4.js} +1 -1
- package/dist/ui/assets/{sql_more-C1Oxq4rx.js → sql_more-BHoH-8oO.js} +1 -1
- package/dist/ui/assets/{stan-BZEpaHeC.js → stan-D-7F5jH6.js} +1 -1
- package/dist/ui/assets/{stata-CkBwaiZM.js → stata-xKD_DnDE.js} +1 -1
- package/dist/ui/assets/{stateDiagram-2N3HPSRC-BkdnNF7I.js → stateDiagram-2N3HPSRC-B4O8weor.js} +1 -1
- package/dist/ui/assets/stateDiagram-v2-6OUMAXLB-CO881_ht.js +1 -0
- package/dist/ui/assets/{step21-fs9N_U3O.js → step21-obc_kzQY.js} +1 -1
- package/dist/ui/assets/{stylus-Bs_9cvKZ.js → stylus-CkAUSRd-.js} +1 -1
- package/dist/ui/assets/{subunit-DvgcOCqJ.js → subunit-BDv8PGo1.js} +1 -1
- package/dist/ui/assets/{swift-BE4ONsur.js → swift-CHsYyW-p.js} +1 -1
- package/dist/ui/assets/{swimlanes-5IMT3BWC-uqTAc7o7.js → swimlanes-5IMT3BWC-DSr9Ty4A.js} +2 -2
- package/dist/ui/assets/swimlanesDiagram-G3AALYLV-DFMCDs8b.js +8 -0
- package/dist/ui/assets/{taggerscript-BhmPJ64C.js → taggerscript-C_2JQgO9.js} +1 -1
- package/dist/ui/assets/{tap-DkueIVKV.js → tap-Bi497Z2c.js} +1 -1
- package/dist/ui/assets/{tcl-DyXOOkFi.js → tcl-B1XMvLaD.js} +1 -1
- package/dist/ui/assets/{thrift-Dhgbk56T.js → thrift-D9X0Hmmc.js} +1 -1
- package/dist/ui/assets/{timeline-definition-FHXFAJF6-DBAk9Ouc.js → timeline-definition-FHXFAJF6-C4_gj50B.js} +1 -1
- package/dist/ui/assets/{tp-BsXyrRGH.js → tp-CJG4Odbx.js} +1 -1
- package/dist/ui/assets/{twig-J0HqIuHw.js → twig-flj72_wc.js} +1 -1
- package/dist/ui/assets/{typescript-Dkwvul39.js → typescript-CWPwVoLd.js} +1 -1
- package/dist/ui/assets/{vala-CRGnf8aY.js → vala-LuCNWNuU.js} +1 -1
- package/dist/ui/assets/{vbnet-BtJAUe3z.js → vbnet-CGUT6ss0.js} +1 -1
- package/dist/ui/assets/{vbscript-RgFFNuM3.js → vbscript-CNiUBJhn.js} +1 -1
- package/dist/ui/assets/{vbscript-html-DO32Io9Y.js → vbscript-html-CJGgjjbc.js} +1 -1
- package/dist/ui/assets/{vennDiagram-L72KCM5P-BJi6y0hh.js → vennDiagram-L72KCM5P-BxcAUnYo.js} +1 -1
- package/dist/ui/assets/{verilog-C4h6MLcI.js → verilog-C4f9ZBTK.js} +1 -1
- package/dist/ui/assets/{vhdl-DOafePyU.js → vhdl-CyDQIZve.js} +1 -1
- package/dist/ui/assets/{vim-BAdTA9TY.js → vim-XAUBqa0M.js} +1 -1
- package/dist/ui/assets/{wardleyDiagram-EHGQE667-C7c_4IJ6.js → wardleyDiagram-EHGQE667-DlwSH77q.js} +1 -1
- package/dist/ui/assets/{x86asm-BCL6__QH.js → x86asm-Cp6vHuUx.js} +1 -1
- package/dist/ui/assets/{xl-qIzE4HOe.js → xl-BHgDofIM.js} +1 -1
- package/dist/ui/assets/{xml-DE2sJXYU.js → xml-QloVn4s_.js} +1 -1
- package/dist/ui/assets/{xquery-CQ35t92y.js → xquery-spJZLmyM.js} +1 -1
- package/dist/ui/assets/{xychartDiagram-FW5EYKEG-D2ILn0jL.js → xychartDiagram-FW5EYKEG-BxGVZcnb.js} +1 -1
- package/dist/ui/assets/{yaml-5KaAvG5C.js → yaml-CUju4iq0.js} +1 -1
- package/dist/ui/assets/{zephir-CbR3Ryfq.js → zephir-ChVpmD0Y.js} +1 -1
- package/dist/ui/index.html +1 -1
- package/dist/utils/__tests__/db-maintenance.test.d.ts +1 -0
- package/dist/utils/__tests__/db-maintenance.test.js +55 -0
- package/dist/utils/__tests__/db-migration.test.js +79 -1
- package/dist/utils/__tests__/request-writer.test.js +264 -3
- package/dist/utils/__tests__/stats-aggregator.test.d.ts +1 -0
- package/dist/utils/__tests__/stats-aggregator.test.js +114 -0
- package/dist/utils/db-maintenance.d.ts +8 -0
- package/dist/utils/db-maintenance.js +18 -0
- package/dist/utils/db.d.ts +1 -0
- package/dist/utils/db.js +62 -0
- package/dist/utils/request-writer.d.ts +23 -1
- package/dist/utils/request-writer.js +200 -14
- package/dist/utils/stats-aggregator.d.ts +1 -1
- package/dist/utils/stats-aggregator.js +44 -27
- package/ecosystem.config.cjs +2 -1
- package/package.json +1 -1
- package/dist/server/middleware/__tests__/request-id.test.js +0 -28
- package/dist/server/middleware/request-id.d.ts +0 -2
- package/dist/server/middleware/request-id.js +0 -12
- package/dist/ui/assets/channel-ChTtxQDg.js +0 -1
- package/dist/ui/assets/classDiagram-OUVF2IWQ-Ccbvamlu.js +0 -1
- package/dist/ui/assets/classDiagram-v2-EOCWNBFH-Ccbvamlu.js +0 -1
- package/dist/ui/assets/stateDiagram-v2-6OUMAXLB-0JnZ1VSQ.js +0 -1
- package/dist/ui/assets/swimlanesDiagram-G3AALYLV-DQRIIEmi.js +0 -8
- /package/dist/server/{middleware/__tests__/request-id.test.d.ts → __tests__/data-push.test.d.ts} +0 -0
|
@@ -105,22 +105,27 @@ describe('createServer', () => {
|
|
|
105
105
|
expect(response).toBeDefined();
|
|
106
106
|
expect(typeof response.statusCode).toBe('number');
|
|
107
107
|
});
|
|
108
|
-
it('
|
|
108
|
+
it('uses x-request-id header value as request id when header present', async () => {
|
|
109
109
|
server = await createServer();
|
|
110
|
+
server.get('/request-id-echo', async (request) => ({ id: request.id }));
|
|
110
111
|
const response = await server.inject({
|
|
111
112
|
method: 'GET',
|
|
112
|
-
url: '/
|
|
113
|
-
headers: { 'x-request-id': '
|
|
113
|
+
url: '/request-id-echo',
|
|
114
|
+
headers: { 'x-request-id': 'my-trace-123' }
|
|
114
115
|
});
|
|
115
|
-
expect(response).
|
|
116
|
+
expect(JSON.parse(response.body).id).toBe('my-trace-123');
|
|
116
117
|
});
|
|
117
|
-
it('
|
|
118
|
+
it('generates non-default nanoid request id without header, unique per request', async () => {
|
|
118
119
|
server = await createServer();
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
120
|
+
server.get('/request-id-echo', async (request) => ({ id: request.id }));
|
|
121
|
+
const response1 = await server.inject({ method: 'GET', url: '/request-id-echo' });
|
|
122
|
+
const response2 = await server.inject({ method: 'GET', url: '/request-id-echo' });
|
|
123
|
+
const id1 = JSON.parse(response1.body).id;
|
|
124
|
+
const id2 = JSON.parse(response2.body).id;
|
|
125
|
+
expect(id1).not.toMatch(/^req-\d+$/);
|
|
126
|
+
expect(id2).not.toMatch(/^req-\d+$/);
|
|
127
|
+
expect(id1).toHaveLength(16);
|
|
128
|
+
expect(id1).not.toBe(id2);
|
|
124
129
|
});
|
|
125
130
|
it('server closes cleanly', async () => {
|
|
126
131
|
server = await createServer();
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import Fastify from 'fastify';
|
|
2
|
+
import * as statsAggregator from '@utils/stats-aggregator';
|
|
2
3
|
import { setupUiRoutes } from '../ui-route';
|
|
3
4
|
// Mock PM2 utils
|
|
4
5
|
jest.mock('@utils/pm2', () => ({
|
|
@@ -372,4 +373,46 @@ describe('setupUiRoutes', () => {
|
|
|
372
373
|
expect(body.error).toContain('Disk write failed');
|
|
373
374
|
});
|
|
374
375
|
});
|
|
376
|
+
describe('GET /ui/api/stats', () => {
|
|
377
|
+
let aggregateSpy;
|
|
378
|
+
let getStatsSpy;
|
|
379
|
+
beforeEach(() => {
|
|
380
|
+
aggregateSpy = jest.spyOn(statsAggregator, 'aggregateStats').mockImplementation(() => { });
|
|
381
|
+
getStatsSpy = jest.spyOn(statsAggregator, 'getStatsData').mockReturnValue({ hourly: {}, lastUpdated: null });
|
|
382
|
+
});
|
|
383
|
+
afterEach(() => {
|
|
384
|
+
aggregateSpy.mockRestore();
|
|
385
|
+
getStatsSpy.mockRestore();
|
|
386
|
+
});
|
|
387
|
+
it('读前触发 aggregateStats 并返回 200', async () => {
|
|
388
|
+
const response = await server.inject({ method: 'GET', url: '/ui/api/stats' });
|
|
389
|
+
expect(aggregateSpy).toHaveBeenCalledTimes(1);
|
|
390
|
+
expect(aggregateSpy).toHaveBeenCalledWith(7);
|
|
391
|
+
expect(getStatsSpy).toHaveBeenCalledTimes(1);
|
|
392
|
+
// 必须先聚合再读取
|
|
393
|
+
expect(aggregateSpy.mock.invocationCallOrder[0]).toBeLessThan(getStatsSpy.mock.invocationCallOrder[0]);
|
|
394
|
+
expect(response.statusCode).toBe(200);
|
|
395
|
+
expect(JSON.parse(response.body)).toEqual({ hourly: {}, lastUpdated: null });
|
|
396
|
+
});
|
|
397
|
+
it('聚合失败只记录不阻断读取,仍返回 200', async () => {
|
|
398
|
+
aggregateSpy.mockImplementation(() => { throw new Error('agg boom'); });
|
|
399
|
+
// inject 请求的 request.log 来自 server.log.child(),替换为可观测的 mock
|
|
400
|
+
const logError = jest.fn();
|
|
401
|
+
jest.spyOn(server.log, 'child').mockReturnValue({
|
|
402
|
+
level: 'info',
|
|
403
|
+
fatal: jest.fn(),
|
|
404
|
+
error: logError,
|
|
405
|
+
warn: jest.fn(),
|
|
406
|
+
info: jest.fn(),
|
|
407
|
+
debug: jest.fn(),
|
|
408
|
+
trace: jest.fn(),
|
|
409
|
+
child: jest.fn()
|
|
410
|
+
});
|
|
411
|
+
const response = await server.inject({ method: 'GET', url: '/ui/api/stats' });
|
|
412
|
+
expect(response.statusCode).toBe(200);
|
|
413
|
+
expect(getStatsSpy).toHaveBeenCalledTimes(1);
|
|
414
|
+
// 聚合异常必须记录日志
|
|
415
|
+
expect(logError).toHaveBeenCalledTimes(1);
|
|
416
|
+
});
|
|
417
|
+
});
|
|
375
418
|
});
|
|
@@ -2,5 +2,7 @@ import { WebSocket } from 'ws';
|
|
|
2
2
|
export declare function addDataClient(ws: WebSocket): void;
|
|
3
3
|
export declare function removeDataClient(ws: WebSocket): void;
|
|
4
4
|
export declare function getDataClientCount(): number;
|
|
5
|
+
export declare function scheduleStatsNotify(delayMs?: number): void;
|
|
6
|
+
export declare function clearStatsNotify(): void;
|
|
5
7
|
export declare function pushNewRequest(summary: any, status?: 'pending' | 'completed'): void;
|
|
6
8
|
export declare function broadcastToDataClients(msg: any): void;
|
package/dist/server/data-push.js
CHANGED
|
@@ -10,6 +10,24 @@ export function removeDataClient(ws) {
|
|
|
10
10
|
export function getDataClientCount() {
|
|
11
11
|
return dataClients.size;
|
|
12
12
|
}
|
|
13
|
+
// stats notify debounce timer(模块级单个,trailing:重复调用重置延迟)
|
|
14
|
+
let statsNotifyTimer = null;
|
|
15
|
+
// 请求终态后延迟广播一次 stats notify,并发终态合并为一次
|
|
16
|
+
export function scheduleStatsNotify(delayMs = 1500) {
|
|
17
|
+
if (statsNotifyTimer)
|
|
18
|
+
clearTimeout(statsNotifyTimer);
|
|
19
|
+
statsNotifyTimer = setTimeout(() => {
|
|
20
|
+
statsNotifyTimer = null;
|
|
21
|
+
broadcast({ type: 'stats', action: 'notify' });
|
|
22
|
+
}, delayMs);
|
|
23
|
+
}
|
|
24
|
+
// 服务关闭时清理 pending 的 debounce timer
|
|
25
|
+
export function clearStatsNotify() {
|
|
26
|
+
if (statsNotifyTimer) {
|
|
27
|
+
clearTimeout(statsNotifyTimer);
|
|
28
|
+
statsNotifyTimer = null;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
13
31
|
// Broadcast helpers
|
|
14
32
|
export function pushNewRequest(summary, status = 'completed') {
|
|
15
33
|
broadcast({
|
|
@@ -17,6 +35,10 @@ export function pushNewRequest(summary, status = 'completed') {
|
|
|
17
35
|
action: status === 'pending' ? 'new' : 'update',
|
|
18
36
|
data: { ...summary, status }
|
|
19
37
|
});
|
|
38
|
+
// 终态(complete/interrupt/error)后通知前端重取 stats;pending=请求开始不触发
|
|
39
|
+
if (status !== 'pending') {
|
|
40
|
+
scheduleStatsNotify();
|
|
41
|
+
}
|
|
20
42
|
}
|
|
21
43
|
function broadcast(msg) {
|
|
22
44
|
const payload = JSON.stringify(msg);
|
package/dist/server/index.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import Fastify from 'fastify';
|
|
2
|
+
import { nanoid } from 'nanoid';
|
|
2
3
|
import { loadConfig } from '../config/index.js';
|
|
3
4
|
import { createLogger } from '../logger/index.js';
|
|
4
5
|
import { configureDbPath } from '../utils/db.js';
|
|
@@ -6,7 +7,6 @@ import { setupProxy } from './proxy.js';
|
|
|
6
7
|
import { setupUiRoutes } from './ui-route.js';
|
|
7
8
|
import { setupChatRoute } from './chat-route.js';
|
|
8
9
|
import { setupDocsRoutes } from './docs-route.js';
|
|
9
|
-
import { requestIdMiddleware } from './middleware/request-id.js';
|
|
10
10
|
export async function createServer() {
|
|
11
11
|
const config = await loadConfig();
|
|
12
12
|
if (config.storage?.path) {
|
|
@@ -16,9 +16,10 @@ export async function createServer() {
|
|
|
16
16
|
const fastify = Fastify({
|
|
17
17
|
logger: logger,
|
|
18
18
|
trustProxy: true,
|
|
19
|
-
requestTimeout: 310000
|
|
19
|
+
requestTimeout: 310000,
|
|
20
|
+
genReqId: () => nanoid(16),
|
|
21
|
+
requestIdHeader: 'x-request-id'
|
|
20
22
|
});
|
|
21
|
-
fastify.register(requestIdMiddleware);
|
|
22
23
|
await setupUiRoutes(fastify); // UI routes registered BEFORE proxy to avoid being proxied
|
|
23
24
|
await setupProxy(fastify, config.proxy);
|
|
24
25
|
await setupChatRoute(fastify, config.proxy); // MCP-enhanced chat endpoint
|
package/dist/server/proxy.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { Readable, finished } from 'stream';
|
|
2
2
|
import { convertClaudeToOpenAIRequest, convertOpenAIToClaudeResponse, createStreamTransformer, buildOpenAIHeaders } from '../utils/openai-converter.js';
|
|
3
3
|
import { loadConfig } from '../config/index.js';
|
|
4
|
-
import { createRequestRecorder } from '../utils/request-writer.js';
|
|
4
|
+
import { createRequestRecorder, isStreamCompleteEvents } from '../utils/request-writer.js';
|
|
5
5
|
import { cleanOldRequestsDB, interruptStaleRequestsOnStartup } from '../utils/request-writer.js';
|
|
6
|
-
import { pushNewRequest } from './data-push.js';
|
|
6
|
+
import { pushNewRequest, broadcastToDataClients, clearStatsNotify, scheduleStatsNotify } from './data-push.js';
|
|
7
7
|
import { initDatabase, closeDatabase, getDatabase } from '../utils/db.js';
|
|
8
8
|
import { recoverCrashedTasks } from '../utils/learn-tasks-db.js';
|
|
9
9
|
import { getActiveProvider } from '../utils/providers-db.js';
|
|
@@ -170,10 +170,11 @@ export function getErrorMessage(error) {
|
|
|
170
170
|
}
|
|
171
171
|
// SSE 流空闲看门狗:超过该时长无上游数据则销毁流,避免挂死产生僵尸行
|
|
172
172
|
const STREAM_IDLE_TIMEOUT_MS = 120000;
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
173
|
+
// 测试 seam:CCM_STREAM_IDLE_TIMEOUT_MS 覆盖超时(仅在 attach 时读一次)
|
|
174
|
+
function getIdleTimeoutMs() {
|
|
175
|
+
const envValue = Number(process.env.CCM_STREAM_IDLE_TIMEOUT_MS);
|
|
176
|
+
return Number.isFinite(envValue) && envValue > 0 ? envValue : STREAM_IDLE_TIMEOUT_MS;
|
|
177
|
+
}
|
|
177
178
|
function attachIdleWatchdog(nodeStream) {
|
|
178
179
|
let timer = null;
|
|
179
180
|
const clearTimer = () => {
|
|
@@ -188,13 +189,21 @@ function attachIdleWatchdog(nodeStream) {
|
|
|
188
189
|
if (!nodeStream.destroyed) {
|
|
189
190
|
nodeStream.destroy(new Error('upstream idle timeout'));
|
|
190
191
|
}
|
|
191
|
-
},
|
|
192
|
+
}, getIdleTimeoutMs());
|
|
192
193
|
};
|
|
193
194
|
nodeStream.on('data', resetTimer);
|
|
194
195
|
nodeStream.on('end', clearTimer);
|
|
195
196
|
nodeStream.on('close', clearTimer);
|
|
196
197
|
nodeStream.on('error', clearTimer);
|
|
197
198
|
resetTimer();
|
|
199
|
+
return {
|
|
200
|
+
finish() {
|
|
201
|
+
clearTimer();
|
|
202
|
+
if (!nodeStream.destroyed) {
|
|
203
|
+
nodeStream.destroy();
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
};
|
|
198
207
|
}
|
|
199
208
|
export async function setupProxy(fastify, proxyConfig) {
|
|
200
209
|
// Load full config to get storage.maxDays
|
|
@@ -207,11 +216,24 @@ export async function setupProxy(fastify, proxyConfig) {
|
|
|
207
216
|
if (recoveredTasks > 0) {
|
|
208
217
|
console.log(`Recovered ${recoveredTasks} crashed learn task(s) from previous run`);
|
|
209
218
|
}
|
|
210
|
-
// 回收上次进程遗留的僵尸 SSE
|
|
211
|
-
const
|
|
212
|
-
if (
|
|
213
|
-
console.log(`
|
|
219
|
+
// 回收上次进程遗留的僵尸 SSE 请求行(流中断/挂死未回调):逐行分流
|
|
220
|
+
const { completed: completedAtStartup, interrupted: interruptedAtStartup } = interruptStaleRequestsOnStartup();
|
|
221
|
+
if (completedAtStartup > 0 || interruptedAtStartup > 0) {
|
|
222
|
+
console.log(`Recovered ${completedAtStartup} completed / ${interruptedAtStartup} interrupted stale request(s)`);
|
|
214
223
|
}
|
|
224
|
+
// 收割周期化:每 60s 扫 >2min 仍 pending 的行
|
|
225
|
+
const staleReaperTimer = setInterval(() => {
|
|
226
|
+
try {
|
|
227
|
+
const { completed, interrupted } = interruptStaleRequestsOnStartup(2 * 60000);
|
|
228
|
+
// 收割到终态行时通知前端重取 stats(trailing 合并)
|
|
229
|
+
if (completed + interrupted > 0) {
|
|
230
|
+
scheduleStatsNotify();
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
catch (err) {
|
|
234
|
+
console.error('Stale request reaping failed:', err);
|
|
235
|
+
}
|
|
236
|
+
}, 60000);
|
|
215
237
|
// Initialize MCP connections (after DB is ready)
|
|
216
238
|
try {
|
|
217
239
|
await mcpManager.init();
|
|
@@ -224,7 +246,8 @@ export async function setupProxy(fastify, proxyConfig) {
|
|
|
224
246
|
// Start stats aggregation timer (every 5 minutes)
|
|
225
247
|
const statsTimer = setInterval(() => {
|
|
226
248
|
try {
|
|
227
|
-
aggregateStats();
|
|
249
|
+
aggregateStats(maxDays);
|
|
250
|
+
broadcastToDataClients({ type: 'stats', action: 'notify' });
|
|
228
251
|
}
|
|
229
252
|
catch (err) {
|
|
230
253
|
console.error('Stats aggregation failed:', err);
|
|
@@ -241,7 +264,8 @@ export async function setupProxy(fastify, proxyConfig) {
|
|
|
241
264
|
}, 1800000); // 30 minutes
|
|
242
265
|
// Initial aggregation on startup
|
|
243
266
|
try {
|
|
244
|
-
aggregateStats();
|
|
267
|
+
aggregateStats(maxDays);
|
|
268
|
+
broadcastToDataClients({ type: 'stats', action: 'notify' });
|
|
245
269
|
}
|
|
246
270
|
catch (err) {
|
|
247
271
|
console.error('Initial stats aggregation failed:', err);
|
|
@@ -257,6 +281,8 @@ export async function setupProxy(fastify, proxyConfig) {
|
|
|
257
281
|
fastify.addHook('onClose', async () => {
|
|
258
282
|
clearInterval(statsTimer);
|
|
259
283
|
clearInterval(cleanupTimer);
|
|
284
|
+
clearInterval(staleReaperTimer);
|
|
285
|
+
clearStatsNotify();
|
|
260
286
|
await mcpManager.close();
|
|
261
287
|
closeDatabase();
|
|
262
288
|
});
|
|
@@ -379,17 +405,30 @@ export async function setupProxy(fastify, proxyConfig) {
|
|
|
379
405
|
if (!nodeStream.destroyed)
|
|
380
406
|
nodeStream.destroy(new Error('client disconnected'));
|
|
381
407
|
});
|
|
382
|
-
attachIdleWatchdog(nodeStream);
|
|
408
|
+
const watchdog = attachIdleWatchdog(nodeStream);
|
|
383
409
|
const transformStream = createStreamTransformer(forwardedModel || originalModel);
|
|
384
|
-
//
|
|
385
|
-
|
|
410
|
+
// 流是否已逻辑终止(finish_reason / [DONE]);err 分支据此改走 complete
|
|
411
|
+
let logicallyEnded = false;
|
|
412
|
+
// 旁路解码器:只做事件入库,不介入转发管道;[DONE] 走 onDone 触发逻辑终止
|
|
413
|
+
const tapDecoder = createEventDecoder((e) => {
|
|
414
|
+
rec.appendEvent(e);
|
|
415
|
+
if (!logicallyEnded && isStreamCompleteEvents([e])) {
|
|
416
|
+
logicallyEnded = true;
|
|
417
|
+
watchdog.finish();
|
|
418
|
+
}
|
|
419
|
+
}, () => {
|
|
420
|
+
if (!logicallyEnded) {
|
|
421
|
+
logicallyEnded = true;
|
|
422
|
+
watchdog.finish();
|
|
423
|
+
}
|
|
424
|
+
});
|
|
386
425
|
nodeStream.on('data', (chunk) => {
|
|
387
426
|
tapDecoder.write(chunk);
|
|
388
427
|
});
|
|
389
428
|
// Use finished() for reliable stream completion detection
|
|
390
429
|
finished(nodeStream, async (err) => {
|
|
391
430
|
tapDecoder.end();
|
|
392
|
-
if (err) {
|
|
431
|
+
if (err && !logicallyEnded) {
|
|
393
432
|
request.log.error(`openai stream error: ${err.message}`);
|
|
394
433
|
rec.interrupt({ statusCode: response.status, error: `stream interrupted: ${err.message}` });
|
|
395
434
|
return;
|
|
@@ -407,6 +446,10 @@ export async function setupProxy(fastify, proxyConfig) {
|
|
|
407
446
|
catch (dbErr) {
|
|
408
447
|
request.log.error(`openai stream save failed: ${dbErr.message}`);
|
|
409
448
|
}
|
|
449
|
+
// pipe 在无 'end' 的 destroy 后不会收尾 dest,手动结束客户端连接
|
|
450
|
+
if (reply.raw.writableEnded === false && !reply.raw.destroyed) {
|
|
451
|
+
reply.raw.end();
|
|
452
|
+
}
|
|
410
453
|
});
|
|
411
454
|
// Pipe: OpenAI SSE → Transform → Claude SSE → Client
|
|
412
455
|
nodeStream.pipe(transformStream).pipe(reply.raw);
|
|
@@ -471,16 +514,29 @@ export async function setupProxy(fastify, proxyConfig) {
|
|
|
471
514
|
if (!nodeStream.destroyed)
|
|
472
515
|
nodeStream.destroy(new Error('client disconnected'));
|
|
473
516
|
});
|
|
474
|
-
attachIdleWatchdog(nodeStream);
|
|
475
|
-
//
|
|
476
|
-
|
|
517
|
+
const watchdog = attachIdleWatchdog(nodeStream);
|
|
518
|
+
// 流是否已逻辑终止(message_stop);err 分支据此改走 complete
|
|
519
|
+
let logicallyEnded = false;
|
|
520
|
+
// 旁路解码器:只做事件入库,不介入转发管道
|
|
521
|
+
const tapDecoder = createEventDecoder((e) => {
|
|
522
|
+
rec.appendEvent(e);
|
|
523
|
+
if (!logicallyEnded && isStreamCompleteEvents([e])) {
|
|
524
|
+
logicallyEnded = true;
|
|
525
|
+
watchdog.finish();
|
|
526
|
+
}
|
|
527
|
+
}, () => {
|
|
528
|
+
if (!logicallyEnded) {
|
|
529
|
+
logicallyEnded = true;
|
|
530
|
+
watchdog.finish();
|
|
531
|
+
}
|
|
532
|
+
});
|
|
477
533
|
nodeStream.on('data', (chunk) => {
|
|
478
534
|
tapDecoder.write(chunk);
|
|
479
535
|
});
|
|
480
536
|
// Save request data when stream completes
|
|
481
537
|
finished(nodeStream, async (err) => {
|
|
482
538
|
tapDecoder.end();
|
|
483
|
-
if (err) {
|
|
539
|
+
if (err && !logicallyEnded) {
|
|
484
540
|
request.log.error(`claude stream error: ${err.message}`);
|
|
485
541
|
rec.interrupt({ statusCode: response.status, error: `stream interrupted: ${err.message}` });
|
|
486
542
|
return;
|
|
@@ -497,6 +553,10 @@ export async function setupProxy(fastify, proxyConfig) {
|
|
|
497
553
|
catch (dbErr) {
|
|
498
554
|
request.log.error(`stream save failed: ${dbErr.message}`);
|
|
499
555
|
}
|
|
556
|
+
// pipe 在无 'end' 的 destroy 后不会收尾 dest,手动结束客户端连接
|
|
557
|
+
if (reply.raw.writableEnded === false && !reply.raw.destroyed) {
|
|
558
|
+
reply.raw.end();
|
|
559
|
+
}
|
|
500
560
|
});
|
|
501
561
|
// Pipe: Aliyun -> Claude Code
|
|
502
562
|
nodeStream.pipe(reply.raw);
|
package/dist/server/ui-route.js
CHANGED
|
@@ -12,7 +12,7 @@ import { runLearnPipeline } from '../utils/pi-learn-orchestrator.js';
|
|
|
12
12
|
import { statusHistory } from '../utils/status-history.js';
|
|
13
13
|
import { addDataClient, removeDataClient, broadcastToDataClients, getDataClientCount } from './data-push.js';
|
|
14
14
|
import { getVersionInfo } from '../utils/version.js';
|
|
15
|
-
import { getStatsData, getTodayStats } from '../utils/stats-aggregator.js';
|
|
15
|
+
import { aggregateStats, getStatsData, getTodayStats } from '../utils/stats-aggregator.js';
|
|
16
16
|
import { setupProvidersRoutes } from './providers-route.js';
|
|
17
17
|
import { setupMcpRoutes } from './mcp-route.js';
|
|
18
18
|
import { setupClaudeSettingsRoutes } from './claude-settings-route.js';
|
|
@@ -156,6 +156,13 @@ export async function setupUiRoutes(fastify) {
|
|
|
156
156
|
// REST endpoint for token aggregation stats (SQLite).
|
|
157
157
|
// Optional `since` query param: ISO UTC string, limits hourly entries returned.
|
|
158
158
|
fastify.get('/ui/api/stats', async (request, reply) => {
|
|
159
|
+
// 读前先聚合,保证快照与实时口径一致;聚合失败只记录,不阻断读取旧快照
|
|
160
|
+
try {
|
|
161
|
+
aggregateStats(config.storage?.maxDays ?? 7);
|
|
162
|
+
}
|
|
163
|
+
catch (err) {
|
|
164
|
+
request.log.error({ err }, 'Failed to aggregate stats before read');
|
|
165
|
+
}
|
|
159
166
|
try {
|
|
160
167
|
const since = request.query.since;
|
|
161
168
|
return getStatsData(since);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{aD as f}from"./index-
|
|
1
|
+
import{aD as f}from"./index-C7s1zgJb.js";import{r as s}from"./index-D2UBwfSG.js";function i(t,c){for(var o=0;o<c.length;o++){const e=c[o];if(typeof e!="string"&&!Array.isArray(e)){for(const r in e)if(r!=="default"&&!(r in t)){const a=Object.getOwnPropertyDescriptor(e,r);a&&Object.defineProperty(t,r,a.get?a:{enumerable:!0,get:()=>e[r]})}}}return Object.freeze(Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}))}var n=s();const p=f(n),_=i({__proto__:null,default:p},[n]);export{_};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{aD as s}from"./index-
|
|
1
|
+
import{aD as s}from"./index-C7s1zgJb.js";import{a as i}from"./index-D2UBwfSG.js";function c(t,n){for(var o=0;o<n.length;o++){const e=n[o];if(typeof e!="string"&&!Array.isArray(e)){for(const r in e)if(r!=="default"&&!(r in t)){const a=Object.getOwnPropertyDescriptor(e,r);a&&Object.defineProperty(t,r,a.get?a:{enumerable:!0,get:()=>e[r]})}}}return Object.freeze(Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}))}var f=i();const p=s(f),l=c({__proto__:null,default:p},[f]);export{l as a};
|
package/dist/ui/assets/{abnfDiagram-VRR7QNED-Dm1-8q0E.js → abnfDiagram-VRR7QNED-D8zK__Mj.js}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{g as p,r as u,d as a}from"./chunk-MOJQB5TN-
|
|
1
|
+
import{g as p,r as u,d as a}from"./chunk-MOJQB5TN-BfYhj1jN.js";import{p as f}from"./chunk-JWPE2WC7-Ch-C75ar.js";import{_ as n,l as o}from"./index-C7s1zgJb.js";import{M as c,b as d}from"./cynefin-VYW2F7L2-B3L-WcKn.js";var v=d().RailroadAbnf.parser.LangiumParser,l=n(e=>{const r=e.alternatives.map(g);return r.length===1?r[0]:{type:"choice",alternatives:r}},"transformAlternation"),g=n(e=>{const r=e.elements.map(y);return r.length===1?r[0]:{type:"sequence",elements:r}},"transformConcatenation"),b=n(e=>{if(e.includes("*")){const[t,s]=e.split("*"),i=t?parseInt(t,10):0,m=s?parseInt(s,10):1/0;return{min:i,max:m}}const r=parseInt(e,10);return{min:r,max:r}},"parseRepeat"),y=n(e=>{const r=A(e.primary);if(!e.repeat)return r;const{min:t,max:s}=b(e.repeat);return t===0&&s===1?{type:"optional",element:r}:{type:"repetition",element:r,min:t,max:s}},"transformElement"),A=n(e=>{switch(e.$type){case"AbnfStringLiteral":return{type:"terminal",value:e.value};case"AbnfNumVal":return{type:"terminal",value:e.value};case"AbnfRuleName":return{type:"nonterminal",name:e.name};case"AbnfGroup":return l(e.element);case"AbnfOptionalGroup":return{type:"optional",element:l(e.element)};default:throw new Error(`Unsupported ABNF primary node: ${e.$type}`)}},"transformPrimary"),P=n(e=>({name:e.name,definition:l(e.definition)}),"transformRule"),h=n(e=>{f(e,a),e.title&&a.setTitle(e.title),e.rules.map(r=>a.addRule(P(r)))},"populateDb"),R={parse:n(e=>{a.clear(),o.debug("[ABNF Parser] Starting Langium parse");const r=v.parse(e);if(r.lexerErrors.length>0||r.parserErrors.length>0)throw new c(r);const t=r.value;o.debug("[ABNF Parser] Parsed rules:",t.rules.length),h(t),o.debug("[ABNF Parser] Parse complete")},"parse"),parser:{yy:a}},w={parser:R,db:a,renderer:u,styles:p};export{w as diagram};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{aD as n}from"./index-
|
|
1
|
+
import{aD as n}from"./index-C7s1zgJb.js";import{b as f}from"./index-D2UBwfSG.js";function l(t,a){for(var o=0;o<a.length;o++){const e=a[o];if(typeof e!="string"&&!Array.isArray(e)){for(const r in e)if(r!=="default"&&!(r in t)){const s=Object.getOwnPropertyDescriptor(e,r);s&&Object.defineProperty(t,r,s.get?s:{enumerable:!0,get:()=>e[r]})}}}return Object.freeze(Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}))}var c=f();const g=n(c),u=l({__proto__:null,default:g},[c]);export{u as a};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{aD as n}from"./index-
|
|
1
|
+
import{aD as n}from"./index-C7s1zgJb.js";import{c as s}from"./index-D2UBwfSG.js";function p(r,i){for(var o=0;o<i.length;o++){const t=i[o];if(typeof t!="string"&&!Array.isArray(t)){for(const e in t)if(e!=="default"&&!(e in r)){const c=Object.getOwnPropertyDescriptor(t,e);c&&Object.defineProperty(r,e,c.get?c:{enumerable:!0,get:()=>t[e]})}}}return Object.freeze(Object.defineProperty(r,Symbol.toStringTag,{value:"Module"}))}var a=s();const f=n(a),g=p({__proto__:null,default:f},[a]);export{g as a};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{aD as s}from"./index-
|
|
1
|
+
import{aD as s}from"./index-C7s1zgJb.js";import{d as i}from"./index-D2UBwfSG.js";function c(t,n){for(var o=0;o<n.length;o++){const e=n[o];if(typeof e!="string"&&!Array.isArray(e)){for(const r in e)if(r!=="default"&&!(r in t)){const a=Object.getOwnPropertyDescriptor(e,r);a&&Object.defineProperty(t,r,a.get?a:{enumerable:!0,get:()=>e[r]})}}}return Object.freeze(Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}))}var f=i();const p=s(f),l=c({__proto__:null,default:p},[f]);export{l as a};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{aD as i}from"./index-
|
|
1
|
+
import{aD as i}from"./index-C7s1zgJb.js";import{e as c}from"./index-D2UBwfSG.js";function p(t,n){for(var o=0;o<n.length;o++){const e=n[o];if(typeof e!="string"&&!Array.isArray(e)){for(const r in e)if(r!=="default"&&!(r in t)){const a=Object.getOwnPropertyDescriptor(e,r);a&&Object.defineProperty(t,r,a.get?a:{enumerable:!0,get:()=>e[r]})}}}return Object.freeze(Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}))}var s=c();const f=i(s),u=p({__proto__:null,default:f},[s]);export{u as a};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{aD as n}from"./index-
|
|
1
|
+
import{aD as n}from"./index-C7s1zgJb.js";import{f as p}from"./index-D2UBwfSG.js";function s(t,c){for(var o=0;o<c.length;o++){const e=c[o];if(typeof e!="string"&&!Array.isArray(e)){for(const r in e)if(r!=="default"&&!(r in t)){const a=Object.getOwnPropertyDescriptor(e,r);a&&Object.defineProperty(t,r,a.get?a:{enumerable:!0,get:()=>e[r]})}}}return Object.freeze(Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}))}var f=p();const i=n(f),g=s({__proto__:null,default:i},[f]);export{g as a};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{aD as i}from"./index-
|
|
1
|
+
import{aD as i}from"./index-C7s1zgJb.js";import{g as c}from"./index-D2UBwfSG.js";function n(t,a){for(var o=0;o<a.length;o++){const e=a[o];if(typeof e!="string"&&!Array.isArray(e)){for(const r in e)if(r!=="default"&&!(r in t)){const p=Object.getOwnPropertyDescriptor(e,r);p&&Object.defineProperty(t,r,p.get?p:{enumerable:!0,get:()=>e[r]})}}}return Object.freeze(Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}))}var s=c();const f=i(s),g=n({__proto__:null,default:f},[s]);export{g as a};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{a1 as ln,a2 as an,a3 as H,a4 as q,a5 as B,a6 as un,a7 as y,a8 as tn,a9 as L,aa as _,ab as rn,ac as o,ad as on,ae as sn,af as fn}from"./index-
|
|
1
|
+
import{a1 as ln,a2 as an,a3 as H,a4 as q,a5 as B,a6 as un,a7 as y,a8 as tn,a9 as L,aa as _,ab as rn,ac as o,ad as on,ae as sn,af as fn}from"./index-C7s1zgJb.js";function cn(l){return l.innerRadius}function yn(l){return l.outerRadius}function gn(l){return l.startAngle}function dn(l){return l.endAngle}function mn(l){return l&&l.padAngle}function pn(l,h,I,D,v,A,C,a){var O=I-l,i=D-h,n=C-v,d=a-A,u=d*O-n*i;if(!(u*u<y))return u=(n*(h-A)-d*(l-v))/u,[l+u*O,h+u*i]}function W(l,h,I,D,v,A,C){var a=l-I,O=h-D,i=(C?A:-A)/L(a*a+O*O),n=i*O,d=-i*a,u=l+n,s=h+d,f=I+n,c=D+d,F=(u+f)/2,t=(s+c)/2,m=f-u,g=c-s,R=m*m+g*g,T=v-A,P=u*c-f*s,S=(g<0?-1:1)*L(on(0,T*T*R-P*P)),j=(P*g-m*S)/R,z=(-P*m-g*S)/R,w=(P*g+m*S)/R,p=(-P*m+g*S)/R,x=j-F,e=z-t,r=w-F,G=p-t;return x*x+e*e>r*r+G*G&&(j=w,z=p),{cx:j,cy:z,x01:-n,y01:-d,x11:j*(v/T-1),y11:z*(v/T-1)}}function hn(){var l=cn,h=yn,I=B(0),D=null,v=gn,A=dn,C=mn,a=null,O=ln(i);function i(){var n,d,u=+l.apply(this,arguments),s=+h.apply(this,arguments),f=v.apply(this,arguments)-un,c=A.apply(this,arguments)-un,F=rn(c-f),t=c>f;if(a||(a=n=O()),s<u&&(d=s,s=u,u=d),!(s>y))a.moveTo(0,0);else if(F>tn-y)a.moveTo(s*H(f),s*q(f)),a.arc(0,0,s,f,c,!t),u>y&&(a.moveTo(u*H(c),u*q(c)),a.arc(0,0,u,c,f,t));else{var m=f,g=c,R=f,T=c,P=F,S=F,j=C.apply(this,arguments)/2,z=j>y&&(D?+D.apply(this,arguments):L(u*u+s*s)),w=_(rn(s-u)/2,+I.apply(this,arguments)),p=w,x=w,e,r;if(z>y){var G=sn(z/u*q(j)),M=sn(z/s*q(j));(P-=G*2)>y?(G*=t?1:-1,R+=G,T-=G):(P=0,R=T=(f+c)/2),(S-=M*2)>y?(M*=t?1:-1,m+=M,g-=M):(S=0,m=g=(f+c)/2)}var J=s*H(m),K=s*q(m),N=u*H(T),Q=u*q(T);if(w>y){var U=s*H(g),V=s*q(g),X=u*H(R),Y=u*q(R),E;if(F<an)if(E=pn(J,K,X,Y,U,V,N,Q)){var Z=J-E[0],$=K-E[1],b=U-E[0],k=V-E[1],nn=1/q(fn((Z*b+$*k)/(L(Z*Z+$*$)*L(b*b+k*k)))/2),en=L(E[0]*E[0]+E[1]*E[1]);p=_(w,(u-en)/(nn-1)),x=_(w,(s-en)/(nn+1))}else p=x=0}S>y?x>y?(e=W(X,Y,J,K,s,x,t),r=W(U,V,N,Q,s,x,t),a.moveTo(e.cx+e.x01,e.cy+e.y01),x<w?a.arc(e.cx,e.cy,x,o(e.y01,e.x01),o(r.y01,r.x01),!t):(a.arc(e.cx,e.cy,x,o(e.y01,e.x01),o(e.y11,e.x11),!t),a.arc(0,0,s,o(e.cy+e.y11,e.cx+e.x11),o(r.cy+r.y11,r.cx+r.x11),!t),a.arc(r.cx,r.cy,x,o(r.y11,r.x11),o(r.y01,r.x01),!t))):(a.moveTo(J,K),a.arc(0,0,s,m,g,!t)):a.moveTo(J,K),!(u>y)||!(P>y)?a.lineTo(N,Q):p>y?(e=W(N,Q,U,V,u,-p,t),r=W(J,K,X,Y,u,-p,t),a.lineTo(e.cx+e.x01,e.cy+e.y01),p<w?a.arc(e.cx,e.cy,p,o(e.y01,e.x01),o(r.y01,r.x01),!t):(a.arc(e.cx,e.cy,p,o(e.y01,e.x01),o(e.y11,e.x11),!t),a.arc(0,0,u,o(e.cy+e.y11,e.cx+e.x11),o(r.cy+r.y11,r.cx+r.x11),t),a.arc(r.cx,r.cy,p,o(r.y11,r.x11),o(r.y01,r.x01),!t))):a.arc(0,0,u,T,R,t)}if(a.closePath(),n)return a=null,n+""||null}return i.centroid=function(){var n=(+l.apply(this,arguments)+ +h.apply(this,arguments))/2,d=(+v.apply(this,arguments)+ +A.apply(this,arguments))/2-an/2;return[H(d)*n,q(d)*n]},i.innerRadius=function(n){return arguments.length?(l=typeof n=="function"?n:B(+n),i):l},i.outerRadius=function(n){return arguments.length?(h=typeof n=="function"?n:B(+n),i):h},i.cornerRadius=function(n){return arguments.length?(I=typeof n=="function"?n:B(+n),i):I},i.padRadius=function(n){return arguments.length?(D=n==null?null:typeof n=="function"?n:B(+n),i):D},i.startAngle=function(n){return arguments.length?(v=typeof n=="function"?n:B(+n),i):v},i.endAngle=function(n){return arguments.length?(A=typeof n=="function"?n:B(+n),i):A},i.padAngle=function(n){return arguments.length?(C=typeof n=="function"?n:B(+n),i):C},i.context=function(n){return arguments.length?(a=n??null,i):a},i}export{hn as d};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{aD as f}from"./index-
|
|
1
|
+
import{aD as f}from"./index-C7s1zgJb.js";import{h as s}from"./index-D2UBwfSG.js";function i(t,c){for(var o=0;o<c.length;o++){const e=c[o];if(typeof e!="string"&&!Array.isArray(e)){for(const r in e)if(r!=="default"&&!(r in t)){const a=Object.getOwnPropertyDescriptor(e,r);a&&Object.defineProperty(t,r,a.get?a:{enumerable:!0,get:()=>e[r]})}}}return Object.freeze(Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}))}var n=s();const p=f(n),l=i({__proto__:null,default:p},[n]);export{l as a};
|