@cc-monitoring/proxy-core 0.4.0 → 0.4.2
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.vxoC6jUT.js} +1 -1
- package/dist/docs/assets/chunks/@localSearchIndexroot.lKm6N3Ik.js +1 -0
- package/dist/docs/assets/chunks/{VPLocalSearchBox.DpXF9ZAI.js → VPLocalSearchBox.DrfGpz86.js} +1 -1
- package/dist/docs/assets/chunks/{theme.TS_gUyc7.js → theme.CCmzbSn9.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 +365 -2
- package/dist/server/__tests__/server.test.js +15 -10
- package/dist/server/__tests__/ui-route.test.js +43 -0
- package/dist/server/chat-route.js +3 -3
- 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 +127 -23
- package/dist/server/ui-route.js +8 -1
- package/dist/ui/assets/{1c-CCx-FOtz.js → 1c-BdWVxVKv.js} +1 -1
- package/dist/ui/assets/{abnf-Bwbi42Z8.js → abnf-hHBtR6kN.js} +1 -1
- package/dist/ui/assets/{abnfDiagram-VRR7QNED-Dm1-8q0E.js → abnfDiagram-VRR7QNED-B0E8zzLB.js} +1 -1
- package/dist/ui/assets/{accesslog-DCytz_-m.js → accesslog-BZmvPz-q.js} +1 -1
- package/dist/ui/assets/{actionscript-3udf15oh.js → actionscript-XtUFCVQF.js} +1 -1
- package/dist/ui/assets/{ada-M5Xa74xG.js → ada-DDsWH3P3.js} +1 -1
- package/dist/ui/assets/{angelscript-qlrFxfW-.js → angelscript-CGLPsuae.js} +1 -1
- package/dist/ui/assets/{apache-B-sF-DQH.js → apache-eGe6GEfx.js} +1 -1
- package/dist/ui/assets/{applescript-4FdcBnbI.js → applescript-Ch2Hdkz_.js} +1 -1
- package/dist/ui/assets/{arc-BB3K1enp.js → arc-Bi_rJJly.js} +1 -1
- package/dist/ui/assets/{arcade-B_yqWaaG.js → arcade-BAeq_5jU.js} +1 -1
- package/dist/ui/assets/{architectureDiagram-ZJ3FMSHR-B39vkY8V.js → architectureDiagram-ZJ3FMSHR-D3rUGwDS.js} +1 -1
- package/dist/ui/assets/{arduino-yAcBoTWU.js → arduino-DJR8nayp.js} +1 -1
- package/dist/ui/assets/{armasm-wIcY84bI.js → armasm-DqDD_ZDN.js} +1 -1
- package/dist/ui/assets/{asciidoc-Bxnu28-Z.js → asciidoc-CgBdhmR5.js} +1 -1
- package/dist/ui/assets/{aspectj-B2cKJA_O.js → aspectj-Dbm_6mY0.js} +1 -1
- package/dist/ui/assets/{autohotkey-B_rMWTtE.js → autohotkey-BkbluSS8.js} +1 -1
- package/dist/ui/assets/{autoit-DwcuvMwv.js → autoit-qUepyZBT.js} +1 -1
- package/dist/ui/assets/{avrasm-heGX1PXK.js → avrasm-2snPxE5L.js} +1 -1
- package/dist/ui/assets/{awk-BiqCQAEf.js → awk-oPcQTdJK.js} +1 -1
- package/dist/ui/assets/{axapta-Cv8M-Ih6.js → axapta-CCu7hfQ-.js} +1 -1
- package/dist/ui/assets/{bash-Divgn3JV.js → bash-CmWN3rPR.js} +1 -1
- package/dist/ui/assets/{basic-B9dnAP55.js → basic-Dg8KcxuC.js} +1 -1
- package/dist/ui/assets/{blockDiagram-677ZJIJ3-DQ1mf7A_.js → blockDiagram-677ZJIJ3-Dusa5zr8.js} +1 -1
- package/dist/ui/assets/{bnf-kIL5mSsP.js → bnf-Zmfygl9A.js} +1 -1
- package/dist/ui/assets/{brainfuck-DqB7xDjH.js → brainfuck-K4-sBD6i.js} +1 -1
- package/dist/ui/assets/{coq-6aKUn3zn.js → c-BGtacyfP.js} +1 -1
- package/dist/ui/assets/{c-like-De5MhE7G.js → c-like-FRDCqB2X.js} +1 -1
- package/dist/ui/assets/{c4Diagram-LMCZKHZV-DQxtYsAx.js → c4Diagram-LMCZKHZV-C4Vo5RAI.js} +1 -1
- package/dist/ui/assets/{cal-mYdfz9en.js → cal-BibfnL8Q.js} +1 -1
- package/dist/ui/assets/{capnproto-D04CRlOt.js → capnproto-D4sJA0ax.js} +1 -1
- package/dist/ui/assets/{ceylon-pi9lFCja.js → ceylon-DuI5ot57.js} +1 -1
- package/dist/ui/assets/channel-CviGbONW.js +1 -0
- package/dist/ui/assets/{chunk-2Q5K7J3B-BDD1nPt8.js → chunk-2Q5K7J3B-C0UTs_LW.js} +1 -1
- package/dist/ui/assets/{chunk-32BRIVSS-DgeQFBb5.js → chunk-32BRIVSS-BMqPhehD.js} +1 -1
- package/dist/ui/assets/{chunk-5VM5RSS4-C7Xf2SnI.js → chunk-5VM5RSS4-CKN4Vw1w.js} +1 -1
- package/dist/ui/assets/{chunk-EX3LRPZG-B_3p1HEv.js → chunk-EX3LRPZG-BYHH22fs.js} +1 -1
- package/dist/ui/assets/{chunk-JWPE2WC7-Dvs7u8eY.js → chunk-JWPE2WC7-b55Vo5mo.js} +1 -1
- package/dist/ui/assets/{chunk-MOJQB5TN-By21wDCN.js → chunk-MOJQB5TN-CvtnHxi4.js} +1 -1
- package/dist/ui/assets/{chunk-RYQCIY6F-6NC700r1.js → chunk-RYQCIY6F-Bi9_eYfb.js} +1 -1
- package/dist/ui/assets/{chunk-V7JOEXUC-vEUqZ3rh.js → chunk-V7JOEXUC-C3ujZT8O.js} +1 -1
- package/dist/ui/assets/{chunk-VR4S4FIN-6tX2dNN9.js → chunk-VR4S4FIN-D4pfDh-j.js} +1 -1
- package/dist/ui/assets/{chunk-XXDRQBXY-qDb2jxAR.js → chunk-XXDRQBXY-DQAjg3aO.js} +1 -1
- package/dist/ui/assets/classDiagram-OUVF2IWQ-BlFcpmEd.js +1 -0
- package/dist/ui/assets/classDiagram-v2-EOCWNBFH-BlFcpmEd.js +1 -0
- package/dist/ui/assets/{clean-CLCsDUl1.js → clean-BVmfQBBV.js} +1 -1
- package/dist/ui/assets/{clojure-dVi5Xifj.js → clojure-BN3C1fnU.js} +1 -1
- package/dist/ui/assets/{clojure-repl-BO_FpFmF.js → clojure-repl-C7Gg0UPF.js} +1 -1
- package/dist/ui/assets/{cmake-CP5aJbyK.js → cmake-CTQFRyul.js} +1 -1
- package/dist/ui/assets/{coffeescript-ZEfu_9pF.js → coffeescript-DGWU3k3W.js} +1 -1
- package/dist/ui/assets/{c-HmsCM6sx.js → coq-Bv9CXGly.js} +1 -1
- package/dist/ui/assets/{cos-BohCnRN2.js → cos-JXNeNyLn.js} +1 -1
- package/dist/ui/assets/{cose-bilkent-JH36ORCC-DyXCbbro.js → cose-bilkent-JH36ORCC-B2e-rPVN.js} +1 -1
- package/dist/ui/assets/{cpp-FOgPWPEt.js → cpp-DVS4QZP-.js} +1 -1
- package/dist/ui/assets/{crmsh-B0OYb-Oe.js → crmsh-CFD7lrxk.js} +1 -1
- package/dist/ui/assets/{crystal-CuWb_dXm.js → crystal-D7vS7dho.js} +1 -1
- package/dist/ui/assets/{csharp-BbcqM09j.js → csharp-BgeVxKaT.js} +1 -1
- package/dist/ui/assets/{csp-rgHnTaDq.js → csp-CmAkjXvi.js} +1 -1
- package/dist/ui/assets/{css-C-ibh7ZG.js → css-DtEkZRCq.js} +1 -1
- package/dist/ui/assets/{cynefin-VYW2F7L2-CkuBhgC4.js → cynefin-VYW2F7L2-bhneX2QQ.js} +1 -1
- package/dist/ui/assets/{cynefinDiagram-TSTJHNR4-eycFyDao.js → cynefinDiagram-TSTJHNR4-BvtRhsVM.js} +1 -1
- package/dist/ui/assets/{d-C0gXxJ0O.js → d-ov1MlWJx.js} +1 -1
- package/dist/ui/assets/{dagre-VKFMJZFB-DzqX9e49.js → dagre-VKFMJZFB-nxN1qAKi.js} +1 -1
- package/dist/ui/assets/{dart-C-fTpuUV.js → dart-DX6s604e.js} +1 -1
- package/dist/ui/assets/{delphi-Chm0B9xv.js → delphi-D0oU57Jt.js} +1 -1
- package/dist/ui/assets/{diagram-FQU43EPY-BEgCqfg1.js → diagram-FQU43EPY-CWkdysy2.js} +1 -1
- package/dist/ui/assets/{diagram-G47NLZAW-Cw11Vs2v.js → diagram-G47NLZAW-L7jPJ-r1.js} +1 -1
- package/dist/ui/assets/{diagram-NH7WQ7WH-DSG_UWpP.js → diagram-NH7WQ7WH-fhOp1mr9.js} +1 -1
- package/dist/ui/assets/{diagram-OA4YK3LP-CJz-WOaJ.js → diagram-OA4YK3LP-B7UMZ-5d.js} +1 -1
- package/dist/ui/assets/{diagram-WEI45ONY-CBXjBCvc.js → diagram-WEI45ONY-B-toJrZu.js} +1 -1
- package/dist/ui/assets/{diff-C-vyuMSL.js → diff-CAzYRr8i.js} +1 -1
- package/dist/ui/assets/{django-CJK7lReT.js → django-DPFPMDLP.js} +1 -1
- package/dist/ui/assets/{dns-D02SHjSy.js → dns-kf25JjIl.js} +1 -1
- package/dist/ui/assets/{dockerfile-trKL1Bqu.js → dockerfile-GP7x-Ptc.js} +1 -1
- package/dist/ui/assets/{dos-C52dy-sK.js → dos-DlXSYH18.js} +1 -1
- package/dist/ui/assets/{dsconfig-MzHgzVrt.js → dsconfig-DrXWPwZN.js} +1 -1
- package/dist/ui/assets/{dts-B137dHyX.js → dts-B9QdwGCS.js} +1 -1
- package/dist/ui/assets/{dust-BcbM0r5C.js → dust-CdplAbVJ.js} +1 -1
- package/dist/ui/assets/{ebnf-DkbpI7bK.js → ebnf-BdCAaKiH.js} +1 -1
- package/dist/ui/assets/{ebnfDiagram-CCIWWBDH-aI5uQ7w1.js → ebnfDiagram-CCIWWBDH-l1kXQDgJ.js} +1 -1
- package/dist/ui/assets/{elixir-BOtDuqQy.js → elixir-WekcTu8c.js} +1 -1
- package/dist/ui/assets/{elm-DS8Tyyu-.js → elm-DKbQ6Ryz.js} +1 -1
- package/dist/ui/assets/{erDiagram-Q63AITRT-2vCbd4Mm.js → erDiagram-Q63AITRT-CCeU8uXM.js} +1 -1
- package/dist/ui/assets/{erb-CSXECRbn.js → erb-DvQ2S9Q6.js} +1 -1
- package/dist/ui/assets/{erlang-BMxlgKPJ.js → erlang-C4cAvWW8.js} +1 -1
- package/dist/ui/assets/{erlang-repl-DPzlolPg.js → erlang-repl-BMKmccqv.js} +1 -1
- package/dist/ui/assets/{excel-CW2Uxed3.js → excel-Cz9AeP71.js} +1 -1
- package/dist/ui/assets/{fix-UW84SlCs.js → fix-BFQxvtLz.js} +1 -1
- package/dist/ui/assets/{flix-4UGiPULd.js → flix-D3TgVgHZ.js} +1 -1
- package/dist/ui/assets/{flowDiagram-23GEKE2U-R5PbCbZI.js → flowDiagram-23GEKE2U-CWYmXYgW.js} +1 -1
- package/dist/ui/assets/{fortran-nhHsngdu.js → fortran-CWmklLY8.js} +1 -1
- package/dist/ui/assets/{fsharp-CDyZ1ST5.js → fsharp-V2Eau__H.js} +1 -1
- package/dist/ui/assets/{gams-DHzkkUie.js → gams-KwiGZby9.js} +1 -1
- package/dist/ui/assets/{ganttDiagram-NO4QXBWP-CGcq4Ie_.js → ganttDiagram-NO4QXBWP-Bw1obkG5.js} +1 -1
- package/dist/ui/assets/{gauss-DdhFGyBv.js → gauss-CRI2FQhz.js} +1 -1
- package/dist/ui/assets/{gcode-ImHh8OLA.js → gcode-Bh0f80Zp.js} +1 -1
- package/dist/ui/assets/{gherkin-CTWAW-XR.js → gherkin-DEjcfzYc.js} +1 -1
- package/dist/ui/assets/{gitGraphDiagram-IHSO6WYX-8nM2Z9lD.js → gitGraphDiagram-IHSO6WYX-OfPpsImd.js} +1 -1
- package/dist/ui/assets/{glsl-0_W_27G2.js → glsl-BrYpeP6h.js} +1 -1
- package/dist/ui/assets/{gml-BoDggu2z.js → gml-m818HPGO.js} +1 -1
- package/dist/ui/assets/{go-DYfFygwl.js → go-BX431CyL.js} +1 -1
- package/dist/ui/assets/{golo-Mlq-TCg9.js → golo-D4m-zAId.js} +1 -1
- package/dist/ui/assets/{gradle-BALAinEB.js → gradle-Cq6wabEA.js} +1 -1
- package/dist/ui/assets/{groovy-Dht--dWU.js → groovy-TjcpUbQS.js} +1 -1
- package/dist/ui/assets/{haml-DpMrxg0d.js → haml-DrCR34E5.js} +1 -1
- package/dist/ui/assets/{handlebars-DqHzujNj.js → handlebars-CVS3O2t9.js} +1 -1
- package/dist/ui/assets/{haskell-DZSchhkY.js → haskell-B8q0nv1_.js} +1 -1
- package/dist/ui/assets/{haxe-C0zBRjdy.js → haxe-DXPsSA4C.js} +1 -1
- package/dist/ui/assets/{hsp-D_PwbSv2.js → hsp-CzpLpdV9.js} +1 -1
- package/dist/ui/assets/{htmlbars-DxAFMG8u.js → htmlbars-Cs_-HclQ.js} +1 -1
- package/dist/ui/assets/{http-DvTRF0Do.js → http-CHD9pG0v.js} +1 -1
- package/dist/ui/assets/{hy-lVO-kNyp.js → hy-B-a7tYC4.js} +1 -1
- package/dist/ui/assets/{index-Ci23SMK2.js → index-CJEzcYeX.js} +21 -21
- package/dist/ui/assets/{index-BbMRVVGt.js → index-DBPwq3d-.js} +3 -3
- package/dist/ui/assets/{infoDiagram-FWYZ7A6U-C7WYDlvc.js → infoDiagram-FWYZ7A6U-DNrZutb1.js} +1 -1
- package/dist/ui/assets/{inform7-B8Tf2n8v.js → inform7-47bZAprM.js} +1 -1
- package/dist/ui/assets/{ini-DSoYMaLF.js → ini-D00zSJOc.js} +1 -1
- package/dist/ui/assets/{irpf90-RCPdkB14.js → irpf90-Cb5adfDu.js} +1 -1
- package/dist/ui/assets/{isbl-C2p75PPj.js → isbl-NcFXKDCH.js} +1 -1
- package/dist/ui/assets/{ishikawaDiagram-FXEZZL3T-Cm6jsPlc.js → ishikawaDiagram-FXEZZL3T-DodxL_A3.js} +1 -1
- package/dist/ui/assets/{java-DeY4Yuia.js → java-DdNdnIDI.js} +1 -1
- package/dist/ui/assets/{javascript-3uX1CO-H.js → javascript-CauBsBfA.js} +1 -1
- package/dist/ui/assets/{jboss-cli-DgnD8mEc.js → jboss-cli-Ce_9aKRs.js} +1 -1
- package/dist/ui/assets/{journeyDiagram-5HDEW3XC-DEGV1uA5.js → journeyDiagram-5HDEW3XC-CaegxpYw.js} +1 -1
- package/dist/ui/assets/{json-BV2PmJJp.js → json-BKT_pfo1.js} +1 -1
- package/dist/ui/assets/{julia-B-m8kQm7.js → julia-bWGt_b_o.js} +1 -1
- package/dist/ui/assets/{julia-repl-C51atU2X.js → julia-repl-D-rjMsRC.js} +1 -1
- package/dist/ui/assets/{kanban-definition-HUTT4EX6-BJ4k5iTX.js → kanban-definition-HUTT4EX6-DocIVGMy.js} +1 -1
- package/dist/ui/assets/{kotlin-CYBziIgl.js → kotlin-CW5ChHJw.js} +1 -1
- package/dist/ui/assets/{lasso-Dw2SBMDW.js → lasso-1z4Xsh4l.js} +1 -1
- package/dist/ui/assets/{latex-Dpd35yke.js → latex-DRw0gvLT.js} +1 -1
- package/dist/ui/assets/{ldif-Ce9EZU__.js → ldif-CC6n1ZWZ.js} +1 -1
- package/dist/ui/assets/{leaf-CpkZzQtC.js → leaf-DtycGYP2.js} +1 -1
- package/dist/ui/assets/{less-Uzo7M0FD.js → less-DHfDdpLT.js} +1 -1
- package/dist/ui/assets/{lisp-DWXDlJYm.js → lisp-F7y5QBiG.js} +1 -1
- package/dist/ui/assets/{livecodeserver-uEyPEgVJ.js → livecodeserver-B4rL97ZE.js} +1 -1
- package/dist/ui/assets/{livescript-BQ5f07oK.js → livescript-C1A66vR3.js} +1 -1
- package/dist/ui/assets/{llvm-BAvP-skE.js → llvm-DrJc4jDQ.js} +1 -1
- package/dist/ui/assets/{lsl-DhbiIKu6.js → lsl-ByygfQlb.js} +1 -1
- package/dist/ui/assets/{lua-COxeUeLx.js → lua-C93sHZoB.js} +1 -1
- package/dist/ui/assets/{makefile-DhDx-IgL.js → makefile-CymUCipv.js} +1 -1
- package/dist/ui/assets/{markdown-DX5_kSxq.js → markdown-BLwVli7a.js} +1 -1
- package/dist/ui/assets/{mathematica-D351ZddB.js → mathematica-DMmVw4oA.js} +1 -1
- package/dist/ui/assets/{matlab-CELqIiwF.js → matlab-DJPyR0-0.js} +1 -1
- package/dist/ui/assets/{maxima-B_YljrMm.js → maxima-B_5tEBD-.js} +1 -1
- package/dist/ui/assets/{mel-DltsbNS8.js → mel-B5AJmhET.js} +1 -1
- package/dist/ui/assets/{mercury-axX-5Vjj.js → mercury-DDm_HlP5.js} +1 -1
- package/dist/ui/assets/{mindmap-definition-LN4V7U3C-Bl1EJo6p.js → mindmap-definition-LN4V7U3C-Ck5xDFhg.js} +1 -1
- package/dist/ui/assets/{mipsasm-BxmerVwX.js → mipsasm-BBf0KZxo.js} +1 -1
- package/dist/ui/assets/{mizar-XNHfbpL2.js → mizar-BvkTEip4.js} +1 -1
- package/dist/ui/assets/{mojolicious-BR0U_7zk.js → mojolicious-t81pYOLs.js} +1 -1
- package/dist/ui/assets/{monkey-lLuu9_f-.js → monkey-B5URMcLy.js} +1 -1
- package/dist/ui/assets/{moonscript-DoaZ3DRQ.js → moonscript-Bbi3L3V5.js} +1 -1
- package/dist/ui/assets/{n1ql-C6TId6Iu.js → n1ql-DE8gguiN.js} +1 -1
- package/dist/ui/assets/{nginx-BezSG-JT.js → nginx-ytmzvrnA.js} +1 -1
- package/dist/ui/assets/{nim-Bb0rfXie.js → nim-28PFAP2a.js} +1 -1
- package/dist/ui/assets/{nix-o3sJ5-54.js → nix-DPGZqLl2.js} +1 -1
- package/dist/ui/assets/{node-repl-Sv5hhcTf.js → node-repl-77Ag73Mp.js} +1 -1
- package/dist/ui/assets/{nsis-B45BJFhF.js → nsis-Bd-Jh2mn.js} +1 -1
- package/dist/ui/assets/{objectivec-CzS6zVgh.js → objectivec-Dut0JGtJ.js} +1 -1
- package/dist/ui/assets/{ocaml-Bqux7PyP.js → ocaml-B8NbbL7d.js} +1 -1
- package/dist/ui/assets/{openscad-4Wf6mF84.js → openscad-3haKn8_6.js} +1 -1
- package/dist/ui/assets/{oxygene-Fvwqgkkt.js → oxygene-CzZcXgOW.js} +1 -1
- package/dist/ui/assets/{parser3-zEfzT5wv.js → parser3-B9_LTx13.js} +1 -1
- package/dist/ui/assets/{pegDiagram-2B236MQR-Dd4rIztM.js → pegDiagram-2B236MQR-CnkbIPdt.js} +1 -1
- package/dist/ui/assets/{perl-CsS1Gs6o.js → perl-CJHWWgIf.js} +1 -1
- package/dist/ui/assets/{pf-BNH1jO0R.js → pf-BpbQ2FKx.js} +1 -1
- package/dist/ui/assets/{pgsql-DqPigHrq.js → pgsql-DNFfp1qF.js} +1 -1
- package/dist/ui/assets/{php-CdOl9bRs.js → php-BHGIfWOP.js} +1 -1
- package/dist/ui/assets/{php-template-DPfirJg2.js → php-template-CajBP9Ht.js} +1 -1
- package/dist/ui/assets/{pieDiagram-ENE6RG2P-DGaJNf4S.js → pieDiagram-ENE6RG2P-BOBkdC1f.js} +1 -1
- package/dist/ui/assets/{plaintext-EHbgBKzw.js → plaintext-CdRaKh_-.js} +1 -1
- package/dist/ui/assets/{pony-DmJajtp2.js → pony-BTFZduq1.js} +1 -1
- package/dist/ui/assets/{powershell-DfGzdWR6.js → powershell-gWcxiMpD.js} +1 -1
- package/dist/ui/assets/{processing-BT0ETgPG.js → processing-DbryYP4B.js} +1 -1
- package/dist/ui/assets/{profile-B3I-x5Lt.js → profile-CHL6RTDR.js} +1 -1
- package/dist/ui/assets/{prolog-B_4QJIvI.js → prolog-CAz3V1M6.js} +1 -1
- package/dist/ui/assets/{properties-BFVI8weS.js → properties-BLvgyNqZ.js} +1 -1
- package/dist/ui/assets/{protobuf-PaF39oZZ.js → protobuf-C-bEtiAJ.js} +1 -1
- package/dist/ui/assets/{puppet-BDC6Q8VF.js → puppet-67xqXQgg.js} +1 -1
- package/dist/ui/assets/{purebasic-B2ejrOZK.js → purebasic-DAwxmhyv.js} +1 -1
- package/dist/ui/assets/{python-repl-BslBh_Mx.js → python-repl-BJmGMIGi.js} +1 -1
- package/dist/ui/assets/{python-BOxtIk9H.js → python-z-wrDm9i.js} +1 -1
- package/dist/ui/assets/{q-BPe8WLGW.js → q-CDMPAvF9.js} +1 -1
- package/dist/ui/assets/{qml-BazRR6fz.js → qml-CbE9R2YT.js} +1 -1
- package/dist/ui/assets/{quadrantDiagram-ABIIQ3AL-BQ7aPkHk.js → quadrantDiagram-ABIIQ3AL-BHAhzSkD.js} +1 -1
- package/dist/ui/assets/{r-C09pGNJC.js → r-B1k7RrWh.js} +1 -1
- package/dist/ui/assets/{railroadDiagram-RFXS5EU6-sCO9VGvE.js → railroadDiagram-RFXS5EU6-CsQep5fB.js} +1 -1
- package/dist/ui/assets/{reasonml-S7dzwVL9.js → reasonml-CghNJ9wO.js} +1 -1
- package/dist/ui/assets/{requirementDiagram-TGXJPOKE-CfT5aVZg.js → requirementDiagram-TGXJPOKE-BTTRG_C-.js} +1 -1
- package/dist/ui/assets/{rib-fM2EwQd4.js → rib-BzZqpngB.js} +1 -1
- package/dist/ui/assets/{roboconf-D7AaeyrW.js → roboconf-Bn6vqIcm.js} +1 -1
- package/dist/ui/assets/{routeros-c6Q7mKuq.js → routeros-CWiIB6Sc.js} +1 -1
- package/dist/ui/assets/{rsl-sCpEQBxh.js → rsl-8XzLd-ex.js} +1 -1
- package/dist/ui/assets/{ruby-lcKhz2w9.js → ruby-CMsox328.js} +1 -1
- package/dist/ui/assets/{ruleslanguage-BW4ATOuX.js → ruleslanguage-sJ93c6T4.js} +1 -1
- package/dist/ui/assets/{rust-BbpU-0VY.js → rust-q4W6ksGp.js} +1 -1
- package/dist/ui/assets/{sankeyDiagram-HTMAVEWB-CaweCpvN.js → sankeyDiagram-HTMAVEWB-_xUP3uiO.js} +1 -1
- package/dist/ui/assets/{sas-BPt5R0dx.js → sas-JzGZkjB8.js} +1 -1
- package/dist/ui/assets/{scala-DxW_vqXs.js → scala-BBRUB1bT.js} +1 -1
- package/dist/ui/assets/{scheme-T2Q_jWzT.js → scheme-gFzNu8q5.js} +1 -1
- package/dist/ui/assets/{scilab-DMORg9lV.js → scilab-0XjfEPk4.js} +1 -1
- package/dist/ui/assets/{scss-t0VsosqT.js → scss-CuET4vU_.js} +1 -1
- package/dist/ui/assets/{sequenceDiagram-DBY2YBRQ-o-H_R4zb.js → sequenceDiagram-DBY2YBRQ-DYM-Lf_t.js} +1 -1
- package/dist/ui/assets/{shell-CnCDa1s9.js → shell-DozhgmQz.js} +1 -1
- package/dist/ui/assets/{sizeCapture-X5ZJPWSS-BNLkHGDS.js → sizeCapture-X5ZJPWSS-enn2ctEl.js} +1 -1
- package/dist/ui/assets/{smali-_n-BxJyG.js → smali-DCS5Fxk1.js} +1 -1
- package/dist/ui/assets/{smalltalk-B90PXJwK.js → smalltalk-BHQ0G1rO.js} +1 -1
- package/dist/ui/assets/{sml-fuY7bj-n.js → sml-Bj9p_O7l.js} +1 -1
- package/dist/ui/assets/{sqf-COpwkyuo.js → sqf-VjHINPVc.js} +1 -1
- package/dist/ui/assets/{sql-CXIT0j-x.js → sql-DNYdjhOa.js} +1 -1
- package/dist/ui/assets/{sql_more-C1Oxq4rx.js → sql_more-DF9pwFii.js} +1 -1
- package/dist/ui/assets/{stan-BZEpaHeC.js → stan-DQ7LiXhT.js} +1 -1
- package/dist/ui/assets/{stata-CkBwaiZM.js → stata-4eQacDMD.js} +1 -1
- package/dist/ui/assets/{stateDiagram-2N3HPSRC-BkdnNF7I.js → stateDiagram-2N3HPSRC-CX-Qz4n7.js} +1 -1
- package/dist/ui/assets/stateDiagram-v2-6OUMAXLB-Ch54U9zs.js +1 -0
- package/dist/ui/assets/{step21-fs9N_U3O.js → step21-BgYnjmFD.js} +1 -1
- package/dist/ui/assets/{stylus-Bs_9cvKZ.js → stylus-ZZ5CxZ05.js} +1 -1
- package/dist/ui/assets/{subunit-DvgcOCqJ.js → subunit-Ci5aUEE2.js} +1 -1
- package/dist/ui/assets/{swift-BE4ONsur.js → swift-DQJ4QPRG.js} +1 -1
- package/dist/ui/assets/{swimlanes-5IMT3BWC-uqTAc7o7.js → swimlanes-5IMT3BWC-vO-7dG2V.js} +2 -2
- package/dist/ui/assets/swimlanesDiagram-G3AALYLV-DxwJcNf4.js +8 -0
- package/dist/ui/assets/{taggerscript-BhmPJ64C.js → taggerscript-DM07ScL_.js} +1 -1
- package/dist/ui/assets/{tap-DkueIVKV.js → tap-C6aPKgww.js} +1 -1
- package/dist/ui/assets/{tcl-DyXOOkFi.js → tcl-DjtvddtN.js} +1 -1
- package/dist/ui/assets/{thrift-Dhgbk56T.js → thrift-BoJuHfsC.js} +1 -1
- package/dist/ui/assets/{timeline-definition-FHXFAJF6-DBAk9Ouc.js → timeline-definition-FHXFAJF6-Cn7z-Bqh.js} +1 -1
- package/dist/ui/assets/{tp-BsXyrRGH.js → tp-7mrfAfpj.js} +1 -1
- package/dist/ui/assets/{twig-J0HqIuHw.js → twig-DOOUfGqf.js} +1 -1
- package/dist/ui/assets/{typescript-Dkwvul39.js → typescript-BbC9hUFK.js} +1 -1
- package/dist/ui/assets/{vala-CRGnf8aY.js → vala-XjKwsdD0.js} +1 -1
- package/dist/ui/assets/{vbnet-BtJAUe3z.js → vbnet-Da3MfWx9.js} +1 -1
- package/dist/ui/assets/{vbscript-RgFFNuM3.js → vbscript-DT_81k7v.js} +1 -1
- package/dist/ui/assets/{vbscript-html-DO32Io9Y.js → vbscript-html-DUFh3J5N.js} +1 -1
- package/dist/ui/assets/{vennDiagram-L72KCM5P-BJi6y0hh.js → vennDiagram-L72KCM5P-BnjZCady.js} +1 -1
- package/dist/ui/assets/{verilog-C4h6MLcI.js → verilog-D5Okzav9.js} +1 -1
- package/dist/ui/assets/{vhdl-DOafePyU.js → vhdl-_hcd5jXC.js} +1 -1
- package/dist/ui/assets/{vim-BAdTA9TY.js → vim-BuKTsAic.js} +1 -1
- package/dist/ui/assets/{wardleyDiagram-EHGQE667-C7c_4IJ6.js → wardleyDiagram-EHGQE667-Bgp49v0-.js} +1 -1
- package/dist/ui/assets/{x86asm-BCL6__QH.js → x86asm-DWOIgEnP.js} +1 -1
- package/dist/ui/assets/{xl-qIzE4HOe.js → xl-D6TFf1q5.js} +1 -1
- package/dist/ui/assets/{xml-DE2sJXYU.js → xml-_5JZFtHD.js} +1 -1
- package/dist/ui/assets/{xquery-CQ35t92y.js → xquery-BC0pvaic.js} +1 -1
- package/dist/ui/assets/{xychartDiagram-FW5EYKEG-D2ILn0jL.js → xychartDiagram-FW5EYKEG-DmyzmXyI.js} +1 -1
- package/dist/ui/assets/{yaml-5KaAvG5C.js → yaml-CLzRjl8_.js} +1 -1
- package/dist/ui/assets/{zephir-CbR3Ryfq.js → zephir-nZ6mLYuU.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/docs/assets/chunks/@localSearchIndexroot.C4sjikMO.js +0 -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
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
|
});
|
|
@@ -330,7 +356,7 @@ export async function setupProxy(fastify, proxyConfig) {
|
|
|
330
356
|
});
|
|
331
357
|
request.log.info(`response status: ${response.status}`);
|
|
332
358
|
// Extract cloud request ID
|
|
333
|
-
const cloudRequestId = response.headers.get('x-request-id') || request.id;
|
|
359
|
+
const cloudRequestId = response.headers.get('x-request-id') || response.headers.get('request-id') || request.id;
|
|
334
360
|
// Check response type
|
|
335
361
|
const contentType = response.headers.get('content-type') || '';
|
|
336
362
|
const isSSE = contentType.includes('text/event-stream');
|
|
@@ -364,6 +390,16 @@ export async function setupProxy(fastify, proxyConfig) {
|
|
|
364
390
|
reply.code(response.status).headers({ 'Content-Type': 'application/json' }).send(claudeResponseBody);
|
|
365
391
|
return;
|
|
366
392
|
}
|
|
393
|
+
// JSON 响应但无 body(204/网关空响应):落终态并回空响应
|
|
394
|
+
if (isJSON && !isSSE) {
|
|
395
|
+
await rec.complete({
|
|
396
|
+
cloudRequestId: cloudRequestId !== request.id ? cloudRequestId : undefined,
|
|
397
|
+
statusCode: response.status,
|
|
398
|
+
headers: Object.fromEntries(response.headers)
|
|
399
|
+
});
|
|
400
|
+
reply.code(response.status).headers(Object.fromEntries(response.headers)).send('');
|
|
401
|
+
return;
|
|
402
|
+
}
|
|
367
403
|
// Handle SSE streaming response
|
|
368
404
|
// 上游响应头已到达:回写真实 status_code(状态仍 pending,保留 spinner)
|
|
369
405
|
rec.headers({ statusCode: response.status, headers: Object.fromEntries(response.headers) });
|
|
@@ -379,17 +415,30 @@ export async function setupProxy(fastify, proxyConfig) {
|
|
|
379
415
|
if (!nodeStream.destroyed)
|
|
380
416
|
nodeStream.destroy(new Error('client disconnected'));
|
|
381
417
|
});
|
|
382
|
-
attachIdleWatchdog(nodeStream);
|
|
418
|
+
const watchdog = attachIdleWatchdog(nodeStream);
|
|
383
419
|
const transformStream = createStreamTransformer(forwardedModel || originalModel);
|
|
384
|
-
//
|
|
385
|
-
|
|
420
|
+
// 流是否已逻辑终止(finish_reason / [DONE]);err 分支据此改走 complete
|
|
421
|
+
let logicallyEnded = false;
|
|
422
|
+
// 旁路解码器:只做事件入库,不介入转发管道;[DONE] 走 onDone 触发逻辑终止
|
|
423
|
+
const tapDecoder = createEventDecoder((e) => {
|
|
424
|
+
rec.appendEvent(e);
|
|
425
|
+
if (!logicallyEnded && isStreamCompleteEvents([e])) {
|
|
426
|
+
logicallyEnded = true;
|
|
427
|
+
watchdog.finish();
|
|
428
|
+
}
|
|
429
|
+
}, () => {
|
|
430
|
+
if (!logicallyEnded) {
|
|
431
|
+
logicallyEnded = true;
|
|
432
|
+
watchdog.finish();
|
|
433
|
+
}
|
|
434
|
+
});
|
|
386
435
|
nodeStream.on('data', (chunk) => {
|
|
387
436
|
tapDecoder.write(chunk);
|
|
388
437
|
});
|
|
389
438
|
// Use finished() for reliable stream completion detection
|
|
390
439
|
finished(nodeStream, async (err) => {
|
|
391
440
|
tapDecoder.end();
|
|
392
|
-
if (err) {
|
|
441
|
+
if (err && !logicallyEnded) {
|
|
393
442
|
request.log.error(`openai stream error: ${err.message}`);
|
|
394
443
|
rec.interrupt({ statusCode: response.status, error: `stream interrupted: ${err.message}` });
|
|
395
444
|
return;
|
|
@@ -407,10 +456,25 @@ export async function setupProxy(fastify, proxyConfig) {
|
|
|
407
456
|
catch (dbErr) {
|
|
408
457
|
request.log.error(`openai stream save failed: ${dbErr.message}`);
|
|
409
458
|
}
|
|
459
|
+
// pipe 在无 'end' 的 destroy 后不会收尾 dest,手动结束客户端连接
|
|
460
|
+
if (reply.raw.writableEnded === false && !reply.raw.destroyed) {
|
|
461
|
+
reply.raw.end();
|
|
462
|
+
}
|
|
410
463
|
});
|
|
411
464
|
// Pipe: OpenAI SSE → Transform → Claude SSE → Client
|
|
412
465
|
nodeStream.pipe(transformStream).pipe(reply.raw);
|
|
413
466
|
}
|
|
467
|
+
else {
|
|
468
|
+
// 无 body 的响应:落终态并收尾客户端连接
|
|
469
|
+
await rec.complete({
|
|
470
|
+
cloudRequestId: cloudRequestId !== request.id ? cloudRequestId : undefined,
|
|
471
|
+
statusCode: response.status,
|
|
472
|
+
headers: Object.fromEntries(response.headers)
|
|
473
|
+
});
|
|
474
|
+
if (reply.raw.writableEnded === false && !reply.raw.destroyed) {
|
|
475
|
+
reply.raw.end();
|
|
476
|
+
}
|
|
477
|
+
}
|
|
414
478
|
return;
|
|
415
479
|
}
|
|
416
480
|
// --- Claude Mode (existing direct forwarding) ---
|
|
@@ -427,7 +491,7 @@ export async function setupProxy(fastify, proxyConfig) {
|
|
|
427
491
|
});
|
|
428
492
|
request.log.info(`response status: ${response.status}`);
|
|
429
493
|
// Extract cloud request ID from response header
|
|
430
|
-
const cloudRequestId = response.headers.get('x-request-id') || request.id;
|
|
494
|
+
const cloudRequestId = response.headers.get('x-request-id') || response.headers.get('request-id') || request.id;
|
|
431
495
|
// Check response type: SSE stream or JSON
|
|
432
496
|
const contentType = response.headers.get('content-type') || '';
|
|
433
497
|
const isSSE = contentType.includes('text/event-stream');
|
|
@@ -455,6 +519,18 @@ export async function setupProxy(fastify, proxyConfig) {
|
|
|
455
519
|
reply.send(responseBody);
|
|
456
520
|
return;
|
|
457
521
|
}
|
|
522
|
+
// JSON 响应但无 body(204/网关空响应):落终态并回空响应
|
|
523
|
+
if (isJSON && !isSSE) {
|
|
524
|
+
await rec.complete({
|
|
525
|
+
cloudRequestId: cloudRequestId !== request.id ? cloudRequestId : undefined,
|
|
526
|
+
statusCode: response.status,
|
|
527
|
+
headers: Object.fromEntries(response.headers)
|
|
528
|
+
});
|
|
529
|
+
reply.code(response.status);
|
|
530
|
+
reply.headers(Object.fromEntries(response.headers));
|
|
531
|
+
reply.send('');
|
|
532
|
+
return;
|
|
533
|
+
}
|
|
458
534
|
// Hijack reply to take full control of SSE stream
|
|
459
535
|
// 上游响应头已到达:回写真实 status_code(状态仍 pending,保留 spinner)
|
|
460
536
|
rec.headers({ statusCode: response.status, headers: Object.fromEntries(response.headers) });
|
|
@@ -471,16 +547,29 @@ export async function setupProxy(fastify, proxyConfig) {
|
|
|
471
547
|
if (!nodeStream.destroyed)
|
|
472
548
|
nodeStream.destroy(new Error('client disconnected'));
|
|
473
549
|
});
|
|
474
|
-
attachIdleWatchdog(nodeStream);
|
|
475
|
-
//
|
|
476
|
-
|
|
550
|
+
const watchdog = attachIdleWatchdog(nodeStream);
|
|
551
|
+
// 流是否已逻辑终止(message_stop);err 分支据此改走 complete
|
|
552
|
+
let logicallyEnded = false;
|
|
553
|
+
// 旁路解码器:只做事件入库,不介入转发管道
|
|
554
|
+
const tapDecoder = createEventDecoder((e) => {
|
|
555
|
+
rec.appendEvent(e);
|
|
556
|
+
if (!logicallyEnded && isStreamCompleteEvents([e])) {
|
|
557
|
+
logicallyEnded = true;
|
|
558
|
+
watchdog.finish();
|
|
559
|
+
}
|
|
560
|
+
}, () => {
|
|
561
|
+
if (!logicallyEnded) {
|
|
562
|
+
logicallyEnded = true;
|
|
563
|
+
watchdog.finish();
|
|
564
|
+
}
|
|
565
|
+
});
|
|
477
566
|
nodeStream.on('data', (chunk) => {
|
|
478
567
|
tapDecoder.write(chunk);
|
|
479
568
|
});
|
|
480
569
|
// Save request data when stream completes
|
|
481
570
|
finished(nodeStream, async (err) => {
|
|
482
571
|
tapDecoder.end();
|
|
483
|
-
if (err) {
|
|
572
|
+
if (err && !logicallyEnded) {
|
|
484
573
|
request.log.error(`claude stream error: ${err.message}`);
|
|
485
574
|
rec.interrupt({ statusCode: response.status, error: `stream interrupted: ${err.message}` });
|
|
486
575
|
return;
|
|
@@ -497,10 +586,25 @@ export async function setupProxy(fastify, proxyConfig) {
|
|
|
497
586
|
catch (dbErr) {
|
|
498
587
|
request.log.error(`stream save failed: ${dbErr.message}`);
|
|
499
588
|
}
|
|
589
|
+
// pipe 在无 'end' 的 destroy 后不会收尾 dest,手动结束客户端连接
|
|
590
|
+
if (reply.raw.writableEnded === false && !reply.raw.destroyed) {
|
|
591
|
+
reply.raw.end();
|
|
592
|
+
}
|
|
500
593
|
});
|
|
501
594
|
// Pipe: Aliyun -> Claude Code
|
|
502
595
|
nodeStream.pipe(reply.raw);
|
|
503
596
|
}
|
|
597
|
+
else {
|
|
598
|
+
// 无 body 的响应:落终态并收尾客户端连接
|
|
599
|
+
await rec.complete({
|
|
600
|
+
cloudRequestId: cloudRequestId !== request.id ? cloudRequestId : undefined,
|
|
601
|
+
statusCode: response.status,
|
|
602
|
+
headers: Object.fromEntries(response.headers)
|
|
603
|
+
});
|
|
604
|
+
if (reply.raw.writableEnded === false && !reply.raw.destroyed) {
|
|
605
|
+
reply.raw.end();
|
|
606
|
+
}
|
|
607
|
+
}
|
|
504
608
|
}
|
|
505
609
|
catch (err) {
|
|
506
610
|
const error = err;
|
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-CJEzcYeX.js";import{r as s}from"./index-DBPwq3d-.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-CJEzcYeX.js";import{a as i}from"./index-DBPwq3d-.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-B0E8zzLB.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-CvtnHxi4.js";import{p as f}from"./chunk-JWPE2WC7-b55Vo5mo.js";import{_ as n,l as o}from"./index-CJEzcYeX.js";import{M as c,b as d}from"./cynefin-VYW2F7L2-bhneX2QQ.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-CJEzcYeX.js";import{b as f}from"./index-DBPwq3d-.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-CJEzcYeX.js";import{c as s}from"./index-DBPwq3d-.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-CJEzcYeX.js";import{d as i}from"./index-DBPwq3d-.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-CJEzcYeX.js";import{e as c}from"./index-DBPwq3d-.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-CJEzcYeX.js";import{f as p}from"./index-DBPwq3d-.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-CJEzcYeX.js";import{g as c}from"./index-DBPwq3d-.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-CJEzcYeX.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-CJEzcYeX.js";import{h as s}from"./index-DBPwq3d-.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};
|