@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.
Files changed (324) hide show
  1. package/dist/cli/__tests__/commands.test.js +19 -0
  2. package/dist/cli/commands/repair.d.ts +1 -0
  3. package/dist/cli/commands/repair.js +15 -0
  4. package/dist/cli/index.js +30 -0
  5. package/dist/docs/404.html +1 -1
  6. package/dist/docs/assets/{app.DtYNT5zS.js → app.g7N9jkzn.js} +1 -1
  7. package/dist/docs/assets/chunks/{@localSearchIndexroot.C4sjikMO.js → @localSearchIndexroot.IHxQqfJH.js} +1 -1
  8. package/dist/docs/assets/chunks/{VPLocalSearchBox.DpXF9ZAI.js → VPLocalSearchBox.BHwI475_.js} +1 -1
  9. package/dist/docs/assets/chunks/{theme.TS_gUyc7.js → theme.FhAJSNDh.js} +2 -2
  10. package/dist/docs/index.html +2 -2
  11. package/dist/docs/overview.html +2 -2
  12. package/dist/docs/packages-utils.html +2 -2
  13. package/dist/docs/proxy-admin/env-and-build.html +2 -2
  14. package/dist/docs/proxy-admin/index.html +2 -2
  15. package/dist/docs/proxy-admin/layout-and-menu.html +2 -2
  16. package/dist/docs/proxy-admin/pages.html +2 -2
  17. package/dist/docs/proxy-admin/routing-and-auth.html +2 -2
  18. package/dist/docs/proxy-admin/services-and-mock.html +2 -2
  19. package/dist/docs/proxy-cli/api-layer.html +2 -2
  20. package/dist/docs/proxy-cli/app-shell.html +2 -2
  21. package/dist/docs/proxy-cli/components-common.html +2 -2
  22. package/dist/docs/proxy-cli/components-config.html +2 -2
  23. package/dist/docs/proxy-cli/components-requests.html +2 -2
  24. package/dist/docs/proxy-cli/components-stats.html +2 -2
  25. package/dist/docs/proxy-cli/components-status.html +2 -2
  26. package/dist/docs/proxy-cli/data-hooks.html +2 -2
  27. package/dist/docs/proxy-cli/index.html +2 -2
  28. package/dist/docs/proxy-cli/utils-and-i18n.html +2 -2
  29. package/dist/docs/proxy-core/chat-api.html +2 -2
  30. package/dist/docs/proxy-core/cli.html +2 -2
  31. package/dist/docs/proxy-core/config.html +2 -2
  32. package/dist/docs/proxy-core/data-layer.html +2 -2
  33. package/dist/docs/proxy-core/entry.html +2 -2
  34. package/dist/docs/proxy-core/index.html +2 -2
  35. package/dist/docs/proxy-core/pm2.html +2 -2
  36. package/dist/docs/proxy-core/providers.html +2 -2
  37. package/dist/docs/proxy-core/proxy.html +2 -2
  38. package/dist/docs/proxy-core/stats.html +2 -2
  39. package/dist/docs/proxy-core/tool.html +2 -2
  40. package/dist/docs/proxy-core/ui-routes.html +2 -2
  41. package/dist/docs/proxy-core/utilities.html +2 -2
  42. package/dist/docs/quickstart.html +2 -2
  43. package/dist/docs/request-flow.html +2 -2
  44. package/dist/server/__tests__/data-push.test.js +44 -0
  45. package/dist/server/__tests__/proxy.test.js +281 -2
  46. package/dist/server/__tests__/server.test.js +15 -10
  47. package/dist/server/__tests__/ui-route.test.js +43 -0
  48. package/dist/server/data-push.d.ts +2 -0
  49. package/dist/server/data-push.js +22 -0
  50. package/dist/server/index.js +4 -3
  51. package/dist/server/proxy.js +81 -21
  52. package/dist/server/ui-route.js +8 -1
  53. package/dist/ui/assets/{1c-CCx-FOtz.js → 1c-CaPSZBmB.js} +1 -1
  54. package/dist/ui/assets/{abnf-Bwbi42Z8.js → abnf-DBDOsmne.js} +1 -1
  55. package/dist/ui/assets/{abnfDiagram-VRR7QNED-Dm1-8q0E.js → abnfDiagram-VRR7QNED-D8zK__Mj.js} +1 -1
  56. package/dist/ui/assets/{accesslog-DCytz_-m.js → accesslog-BOLs2Kig.js} +1 -1
  57. package/dist/ui/assets/{actionscript-3udf15oh.js → actionscript-BZYKhS1B.js} +1 -1
  58. package/dist/ui/assets/{ada-M5Xa74xG.js → ada-DyacnMpg.js} +1 -1
  59. package/dist/ui/assets/{angelscript-qlrFxfW-.js → angelscript-CAN6j0H3.js} +1 -1
  60. package/dist/ui/assets/{apache-B-sF-DQH.js → apache-BE4vouiQ.js} +1 -1
  61. package/dist/ui/assets/{applescript-4FdcBnbI.js → applescript-CS88I1yz.js} +1 -1
  62. package/dist/ui/assets/{arc-BB3K1enp.js → arc-CTMmdrSV.js} +1 -1
  63. package/dist/ui/assets/{arcade-B_yqWaaG.js → arcade-B0f0f5SD.js} +1 -1
  64. package/dist/ui/assets/{architectureDiagram-ZJ3FMSHR-B39vkY8V.js → architectureDiagram-ZJ3FMSHR-Dtvpnopp.js} +1 -1
  65. package/dist/ui/assets/{arduino-yAcBoTWU.js → arduino-Bhm-OSb2.js} +1 -1
  66. package/dist/ui/assets/{armasm-wIcY84bI.js → armasm-CEy-mDHc.js} +1 -1
  67. package/dist/ui/assets/{asciidoc-Bxnu28-Z.js → asciidoc-CrZqQBTj.js} +1 -1
  68. package/dist/ui/assets/{aspectj-B2cKJA_O.js → aspectj-B4IlFyyJ.js} +1 -1
  69. package/dist/ui/assets/{autohotkey-B_rMWTtE.js → autohotkey-Cihy-FjA.js} +1 -1
  70. package/dist/ui/assets/{autoit-DwcuvMwv.js → autoit-Dis_JVJq.js} +1 -1
  71. package/dist/ui/assets/{avrasm-heGX1PXK.js → avrasm-CVhMycHj.js} +1 -1
  72. package/dist/ui/assets/{awk-BiqCQAEf.js → awk-BCViwLf5.js} +1 -1
  73. package/dist/ui/assets/{axapta-Cv8M-Ih6.js → axapta-pWB4JVB_.js} +1 -1
  74. package/dist/ui/assets/{bash-Divgn3JV.js → bash-B6Giryub.js} +1 -1
  75. package/dist/ui/assets/{basic-B9dnAP55.js → basic-DcrjcHB0.js} +1 -1
  76. package/dist/ui/assets/{blockDiagram-677ZJIJ3-DQ1mf7A_.js → blockDiagram-677ZJIJ3-DfhtgI1r.js} +1 -1
  77. package/dist/ui/assets/{bnf-kIL5mSsP.js → bnf-cpKU0967.js} +1 -1
  78. package/dist/ui/assets/{brainfuck-DqB7xDjH.js → brainfuck-CFFdk4cM.js} +1 -1
  79. package/dist/ui/assets/{coq-6aKUn3zn.js → c-CW6KPMeI.js} +1 -1
  80. package/dist/ui/assets/{c-like-De5MhE7G.js → c-like-CWn59vrg.js} +1 -1
  81. package/dist/ui/assets/{c4Diagram-LMCZKHZV-DQxtYsAx.js → c4Diagram-LMCZKHZV-D1Oh6k37.js} +1 -1
  82. package/dist/ui/assets/{cal-mYdfz9en.js → cal-8i26_L39.js} +1 -1
  83. package/dist/ui/assets/{capnproto-D04CRlOt.js → capnproto-CviwnFBf.js} +1 -1
  84. package/dist/ui/assets/{ceylon-pi9lFCja.js → ceylon-CQyc4rWs.js} +1 -1
  85. package/dist/ui/assets/channel-Da2MvpNG.js +1 -0
  86. package/dist/ui/assets/{chunk-2Q5K7J3B-BDD1nPt8.js → chunk-2Q5K7J3B-oswPBwIn.js} +1 -1
  87. package/dist/ui/assets/{chunk-32BRIVSS-DgeQFBb5.js → chunk-32BRIVSS-B5pU_9b9.js} +1 -1
  88. package/dist/ui/assets/{chunk-5VM5RSS4-C7Xf2SnI.js → chunk-5VM5RSS4-gvtfMc4w.js} +1 -1
  89. package/dist/ui/assets/{chunk-EX3LRPZG-B_3p1HEv.js → chunk-EX3LRPZG-BkBaDMy4.js} +1 -1
  90. package/dist/ui/assets/{chunk-JWPE2WC7-Dvs7u8eY.js → chunk-JWPE2WC7-Ch-C75ar.js} +1 -1
  91. package/dist/ui/assets/{chunk-MOJQB5TN-By21wDCN.js → chunk-MOJQB5TN-BfYhj1jN.js} +1 -1
  92. package/dist/ui/assets/{chunk-RYQCIY6F-6NC700r1.js → chunk-RYQCIY6F-D8izfruP.js} +1 -1
  93. package/dist/ui/assets/{chunk-V7JOEXUC-vEUqZ3rh.js → chunk-V7JOEXUC-CbzHnW90.js} +1 -1
  94. package/dist/ui/assets/{chunk-VR4S4FIN-6tX2dNN9.js → chunk-VR4S4FIN-Dr4M5qZA.js} +1 -1
  95. package/dist/ui/assets/{chunk-XXDRQBXY-qDb2jxAR.js → chunk-XXDRQBXY-QE-R8dRe.js} +1 -1
  96. package/dist/ui/assets/classDiagram-OUVF2IWQ-mHUiWjcC.js +1 -0
  97. package/dist/ui/assets/classDiagram-v2-EOCWNBFH-mHUiWjcC.js +1 -0
  98. package/dist/ui/assets/{clean-CLCsDUl1.js → clean-DZeAtQ7H.js} +1 -1
  99. package/dist/ui/assets/{clojure-dVi5Xifj.js → clojure-U4ebZ7NQ.js} +1 -1
  100. package/dist/ui/assets/{clojure-repl-BO_FpFmF.js → clojure-repl-B4QSIzUI.js} +1 -1
  101. package/dist/ui/assets/{cmake-CP5aJbyK.js → cmake-UHexZySb.js} +1 -1
  102. package/dist/ui/assets/{coffeescript-ZEfu_9pF.js → coffeescript-Dg56H9Mr.js} +1 -1
  103. package/dist/ui/assets/{c-HmsCM6sx.js → coq-C1g3mm0X.js} +1 -1
  104. package/dist/ui/assets/{cos-BohCnRN2.js → cos-BL4DdyGh.js} +1 -1
  105. package/dist/ui/assets/{cose-bilkent-JH36ORCC-DyXCbbro.js → cose-bilkent-JH36ORCC-BHQslHP3.js} +1 -1
  106. package/dist/ui/assets/{cpp-FOgPWPEt.js → cpp-keZI-XAd.js} +1 -1
  107. package/dist/ui/assets/{crmsh-B0OYb-Oe.js → crmsh-DdXYVeeA.js} +1 -1
  108. package/dist/ui/assets/{crystal-CuWb_dXm.js → crystal-C4AN0m0I.js} +1 -1
  109. package/dist/ui/assets/{csharp-BbcqM09j.js → csharp-COUyKsNR.js} +1 -1
  110. package/dist/ui/assets/{csp-rgHnTaDq.js → csp-DBc-rgSJ.js} +1 -1
  111. package/dist/ui/assets/{css-C-ibh7ZG.js → css-B8m6O_Pw.js} +1 -1
  112. package/dist/ui/assets/{cynefin-VYW2F7L2-CkuBhgC4.js → cynefin-VYW2F7L2-B3L-WcKn.js} +1 -1
  113. package/dist/ui/assets/{cynefinDiagram-TSTJHNR4-eycFyDao.js → cynefinDiagram-TSTJHNR4-fzaM4qcZ.js} +1 -1
  114. package/dist/ui/assets/{d-C0gXxJ0O.js → d-dgQN4Rko.js} +1 -1
  115. package/dist/ui/assets/{dagre-VKFMJZFB-DzqX9e49.js → dagre-VKFMJZFB-DJHj16mR.js} +1 -1
  116. package/dist/ui/assets/{dart-C-fTpuUV.js → dart-D2Y7LOq-.js} +1 -1
  117. package/dist/ui/assets/{delphi-Chm0B9xv.js → delphi-DaGcSk5A.js} +1 -1
  118. package/dist/ui/assets/{diagram-FQU43EPY-BEgCqfg1.js → diagram-FQU43EPY-iZEZ1f-R.js} +1 -1
  119. package/dist/ui/assets/{diagram-G47NLZAW-Cw11Vs2v.js → diagram-G47NLZAW-rkQb3r-C.js} +1 -1
  120. package/dist/ui/assets/{diagram-NH7WQ7WH-DSG_UWpP.js → diagram-NH7WQ7WH-B4Fy72tP.js} +1 -1
  121. package/dist/ui/assets/{diagram-OA4YK3LP-CJz-WOaJ.js → diagram-OA4YK3LP-BndmuIBq.js} +1 -1
  122. package/dist/ui/assets/{diagram-WEI45ONY-CBXjBCvc.js → diagram-WEI45ONY-CwlAiqOe.js} +1 -1
  123. package/dist/ui/assets/{diff-C-vyuMSL.js → diff-prcRV1Y3.js} +1 -1
  124. package/dist/ui/assets/{django-CJK7lReT.js → django-B1zIoGSx.js} +1 -1
  125. package/dist/ui/assets/{dns-D02SHjSy.js → dns-ZxI_aTwc.js} +1 -1
  126. package/dist/ui/assets/{dockerfile-trKL1Bqu.js → dockerfile-Dp_fT6E-.js} +1 -1
  127. package/dist/ui/assets/{dos-C52dy-sK.js → dos-Cuu5c8vv.js} +1 -1
  128. package/dist/ui/assets/{dsconfig-MzHgzVrt.js → dsconfig-DcGTOhbS.js} +1 -1
  129. package/dist/ui/assets/{dts-B137dHyX.js → dts-DCF8VaRk.js} +1 -1
  130. package/dist/ui/assets/{dust-BcbM0r5C.js → dust-DeCmZWMK.js} +1 -1
  131. package/dist/ui/assets/{ebnf-DkbpI7bK.js → ebnf-BHQQcuF_.js} +1 -1
  132. package/dist/ui/assets/{ebnfDiagram-CCIWWBDH-aI5uQ7w1.js → ebnfDiagram-CCIWWBDH-DJ_RuhTm.js} +1 -1
  133. package/dist/ui/assets/{elixir-BOtDuqQy.js → elixir-BHmweJ4d.js} +1 -1
  134. package/dist/ui/assets/{elm-DS8Tyyu-.js → elm-v76Hd2B3.js} +1 -1
  135. package/dist/ui/assets/{erDiagram-Q63AITRT-2vCbd4Mm.js → erDiagram-Q63AITRT-DVZkY5RZ.js} +1 -1
  136. package/dist/ui/assets/{erb-CSXECRbn.js → erb-xvWF5bfx.js} +1 -1
  137. package/dist/ui/assets/{erlang-BMxlgKPJ.js → erlang-CKBMURym.js} +1 -1
  138. package/dist/ui/assets/{erlang-repl-DPzlolPg.js → erlang-repl-BjcfXt3Z.js} +1 -1
  139. package/dist/ui/assets/{excel-CW2Uxed3.js → excel-Cdrtxhml.js} +1 -1
  140. package/dist/ui/assets/{fix-UW84SlCs.js → fix-CB-So5So.js} +1 -1
  141. package/dist/ui/assets/{flix-4UGiPULd.js → flix-VM9AOrq6.js} +1 -1
  142. package/dist/ui/assets/{flowDiagram-23GEKE2U-R5PbCbZI.js → flowDiagram-23GEKE2U-vyGW67Xm.js} +1 -1
  143. package/dist/ui/assets/{fortran-nhHsngdu.js → fortran-CcwJVO8H.js} +1 -1
  144. package/dist/ui/assets/{fsharp-CDyZ1ST5.js → fsharp-DiATpw1u.js} +1 -1
  145. package/dist/ui/assets/{gams-DHzkkUie.js → gams-Csg9YNPz.js} +1 -1
  146. package/dist/ui/assets/{ganttDiagram-NO4QXBWP-CGcq4Ie_.js → ganttDiagram-NO4QXBWP-C2TRbwLw.js} +1 -1
  147. package/dist/ui/assets/{gauss-DdhFGyBv.js → gauss-Bc4TC8Wh.js} +1 -1
  148. package/dist/ui/assets/{gcode-ImHh8OLA.js → gcode-Rig_2OoA.js} +1 -1
  149. package/dist/ui/assets/{gherkin-CTWAW-XR.js → gherkin-ByBU06QB.js} +1 -1
  150. package/dist/ui/assets/{gitGraphDiagram-IHSO6WYX-8nM2Z9lD.js → gitGraphDiagram-IHSO6WYX-CEiqfFIF.js} +1 -1
  151. package/dist/ui/assets/{glsl-0_W_27G2.js → glsl-C8D6y2Tn.js} +1 -1
  152. package/dist/ui/assets/{gml-BoDggu2z.js → gml-PHpGPHbT.js} +1 -1
  153. package/dist/ui/assets/{go-DYfFygwl.js → go-BL_o_3ez.js} +1 -1
  154. package/dist/ui/assets/{golo-Mlq-TCg9.js → golo-CWQ6dTUz.js} +1 -1
  155. package/dist/ui/assets/{gradle-BALAinEB.js → gradle-Y_I2KN2z.js} +1 -1
  156. package/dist/ui/assets/{groovy-Dht--dWU.js → groovy-JnIv8p2l.js} +1 -1
  157. package/dist/ui/assets/{haml-DpMrxg0d.js → haml-B8W_h6mZ.js} +1 -1
  158. package/dist/ui/assets/{handlebars-DqHzujNj.js → handlebars-DVm8mJuD.js} +1 -1
  159. package/dist/ui/assets/{haskell-DZSchhkY.js → haskell-DlDi2Ty7.js} +1 -1
  160. package/dist/ui/assets/{haxe-C0zBRjdy.js → haxe-CftFNVE-.js} +1 -1
  161. package/dist/ui/assets/{hsp-D_PwbSv2.js → hsp-C67xnq9C.js} +1 -1
  162. package/dist/ui/assets/{htmlbars-DxAFMG8u.js → htmlbars-CmJCm67U.js} +1 -1
  163. package/dist/ui/assets/{http-DvTRF0Do.js → http-b-FPEcHP.js} +1 -1
  164. package/dist/ui/assets/{hy-lVO-kNyp.js → hy-BWD3ncpN.js} +1 -1
  165. package/dist/ui/assets/{index-Ci23SMK2.js → index-C7s1zgJb.js} +21 -21
  166. package/dist/ui/assets/{index-BbMRVVGt.js → index-D2UBwfSG.js} +3 -3
  167. package/dist/ui/assets/{infoDiagram-FWYZ7A6U-C7WYDlvc.js → infoDiagram-FWYZ7A6U-C0Px17IN.js} +1 -1
  168. package/dist/ui/assets/{inform7-B8Tf2n8v.js → inform7-C-OYaMO5.js} +1 -1
  169. package/dist/ui/assets/{ini-DSoYMaLF.js → ini-CVyYmykw.js} +1 -1
  170. package/dist/ui/assets/{irpf90-RCPdkB14.js → irpf90-BcpjWXIz.js} +1 -1
  171. package/dist/ui/assets/{isbl-C2p75PPj.js → isbl-ZraBBeEr.js} +1 -1
  172. package/dist/ui/assets/{ishikawaDiagram-FXEZZL3T-Cm6jsPlc.js → ishikawaDiagram-FXEZZL3T-BjmTMgpO.js} +1 -1
  173. package/dist/ui/assets/{java-DeY4Yuia.js → java-D_mE2DT6.js} +1 -1
  174. package/dist/ui/assets/{javascript-3uX1CO-H.js → javascript-akXESsox.js} +1 -1
  175. package/dist/ui/assets/{jboss-cli-DgnD8mEc.js → jboss-cli-CFe3gTDt.js} +1 -1
  176. package/dist/ui/assets/{journeyDiagram-5HDEW3XC-DEGV1uA5.js → journeyDiagram-5HDEW3XC-BpgJUvs6.js} +1 -1
  177. package/dist/ui/assets/{json-BV2PmJJp.js → json-sjN7AzRC.js} +1 -1
  178. package/dist/ui/assets/{julia-B-m8kQm7.js → julia-BJJYbUMV.js} +1 -1
  179. package/dist/ui/assets/{julia-repl-C51atU2X.js → julia-repl-BwruD8Ix.js} +1 -1
  180. package/dist/ui/assets/{kanban-definition-HUTT4EX6-BJ4k5iTX.js → kanban-definition-HUTT4EX6-DFlE9edA.js} +1 -1
  181. package/dist/ui/assets/{kotlin-CYBziIgl.js → kotlin-CAIQsLCF.js} +1 -1
  182. package/dist/ui/assets/{lasso-Dw2SBMDW.js → lasso-sU67h-5u.js} +1 -1
  183. package/dist/ui/assets/{latex-Dpd35yke.js → latex-CVX-jP88.js} +1 -1
  184. package/dist/ui/assets/{ldif-Ce9EZU__.js → ldif-DGM9xbFZ.js} +1 -1
  185. package/dist/ui/assets/{leaf-CpkZzQtC.js → leaf-AlB_zmwz.js} +1 -1
  186. package/dist/ui/assets/{less-Uzo7M0FD.js → less-CKwfEdZQ.js} +1 -1
  187. package/dist/ui/assets/{lisp-DWXDlJYm.js → lisp-CXYLaAPw.js} +1 -1
  188. package/dist/ui/assets/{livecodeserver-uEyPEgVJ.js → livecodeserver-C02fGGTS.js} +1 -1
  189. package/dist/ui/assets/{livescript-BQ5f07oK.js → livescript-CBMa8QF_.js} +1 -1
  190. package/dist/ui/assets/{llvm-BAvP-skE.js → llvm-WXTIohTC.js} +1 -1
  191. package/dist/ui/assets/{lsl-DhbiIKu6.js → lsl-4obd2U_I.js} +1 -1
  192. package/dist/ui/assets/{lua-COxeUeLx.js → lua-DTSy-TjF.js} +1 -1
  193. package/dist/ui/assets/{makefile-DhDx-IgL.js → makefile-Bf2UEO0i.js} +1 -1
  194. package/dist/ui/assets/{markdown-DX5_kSxq.js → markdown-BgoGmFfJ.js} +1 -1
  195. package/dist/ui/assets/{mathematica-D351ZddB.js → mathematica-CSiA8KQh.js} +1 -1
  196. package/dist/ui/assets/{matlab-CELqIiwF.js → matlab-DoMvLsGB.js} +1 -1
  197. package/dist/ui/assets/{maxima-B_YljrMm.js → maxima-BFO4dfZO.js} +1 -1
  198. package/dist/ui/assets/{mel-DltsbNS8.js → mel-DyBpmDxt.js} +1 -1
  199. package/dist/ui/assets/{mercury-axX-5Vjj.js → mercury-OL5G5uU6.js} +1 -1
  200. package/dist/ui/assets/{mindmap-definition-LN4V7U3C-Bl1EJo6p.js → mindmap-definition-LN4V7U3C-s-nUZuCs.js} +1 -1
  201. package/dist/ui/assets/{mipsasm-BxmerVwX.js → mipsasm-KQwdm39j.js} +1 -1
  202. package/dist/ui/assets/{mizar-XNHfbpL2.js → mizar-BqndJ30I.js} +1 -1
  203. package/dist/ui/assets/{mojolicious-BR0U_7zk.js → mojolicious-Bvc1uJd-.js} +1 -1
  204. package/dist/ui/assets/{monkey-lLuu9_f-.js → monkey-Dl_gLm7-.js} +1 -1
  205. package/dist/ui/assets/{moonscript-DoaZ3DRQ.js → moonscript-BL6R6eAz.js} +1 -1
  206. package/dist/ui/assets/{n1ql-C6TId6Iu.js → n1ql-C09iOJfQ.js} +1 -1
  207. package/dist/ui/assets/{nginx-BezSG-JT.js → nginx-C7W01nBr.js} +1 -1
  208. package/dist/ui/assets/{nim-Bb0rfXie.js → nim-Dj78szvD.js} +1 -1
  209. package/dist/ui/assets/{nix-o3sJ5-54.js → nix-BOtGyPmd.js} +1 -1
  210. package/dist/ui/assets/{node-repl-Sv5hhcTf.js → node-repl-19nZvZ4A.js} +1 -1
  211. package/dist/ui/assets/{nsis-B45BJFhF.js → nsis-ByCl1zIm.js} +1 -1
  212. package/dist/ui/assets/{objectivec-CzS6zVgh.js → objectivec-BhdaT_Jr.js} +1 -1
  213. package/dist/ui/assets/{ocaml-Bqux7PyP.js → ocaml-D_NXvSO7.js} +1 -1
  214. package/dist/ui/assets/{openscad-4Wf6mF84.js → openscad-DOhagvnA.js} +1 -1
  215. package/dist/ui/assets/{oxygene-Fvwqgkkt.js → oxygene-5BnkqMRH.js} +1 -1
  216. package/dist/ui/assets/{parser3-zEfzT5wv.js → parser3-jSWlxi8m.js} +1 -1
  217. package/dist/ui/assets/{pegDiagram-2B236MQR-Dd4rIztM.js → pegDiagram-2B236MQR-CideH-XT.js} +1 -1
  218. package/dist/ui/assets/{perl-CsS1Gs6o.js → perl-CfsqjZ4b.js} +1 -1
  219. package/dist/ui/assets/{pf-BNH1jO0R.js → pf-kOewxO29.js} +1 -1
  220. package/dist/ui/assets/{pgsql-DqPigHrq.js → pgsql-CXm2Xd-Z.js} +1 -1
  221. package/dist/ui/assets/{php-CdOl9bRs.js → php-CRiA_dH8.js} +1 -1
  222. package/dist/ui/assets/{php-template-DPfirJg2.js → php-template-ByMrxqSd.js} +1 -1
  223. package/dist/ui/assets/{pieDiagram-ENE6RG2P-DGaJNf4S.js → pieDiagram-ENE6RG2P-CJkCdB38.js} +1 -1
  224. package/dist/ui/assets/{plaintext-EHbgBKzw.js → plaintext-BJx0R6A5.js} +1 -1
  225. package/dist/ui/assets/{pony-DmJajtp2.js → pony-CozCHtz4.js} +1 -1
  226. package/dist/ui/assets/{powershell-DfGzdWR6.js → powershell-BT7gMMgn.js} +1 -1
  227. package/dist/ui/assets/{processing-BT0ETgPG.js → processing-FOIxn_W_.js} +1 -1
  228. package/dist/ui/assets/{profile-B3I-x5Lt.js → profile-BsoUuD9w.js} +1 -1
  229. package/dist/ui/assets/{prolog-B_4QJIvI.js → prolog-Bd3gvQ2N.js} +1 -1
  230. package/dist/ui/assets/{properties-BFVI8weS.js → properties-BWGFdny9.js} +1 -1
  231. package/dist/ui/assets/{protobuf-PaF39oZZ.js → protobuf-pQSKoOOY.js} +1 -1
  232. package/dist/ui/assets/{puppet-BDC6Q8VF.js → puppet-DnEN_mgS.js} +1 -1
  233. package/dist/ui/assets/{purebasic-B2ejrOZK.js → purebasic-BqoOGoRw.js} +1 -1
  234. package/dist/ui/assets/{python-BOxtIk9H.js → python-TeVYomkE.js} +1 -1
  235. package/dist/ui/assets/{python-repl-BslBh_Mx.js → python-repl-zqu5igFS.js} +1 -1
  236. package/dist/ui/assets/{q-BPe8WLGW.js → q-CZC9Dltd.js} +1 -1
  237. package/dist/ui/assets/{qml-BazRR6fz.js → qml-ZNInP45Q.js} +1 -1
  238. package/dist/ui/assets/{quadrantDiagram-ABIIQ3AL-BQ7aPkHk.js → quadrantDiagram-ABIIQ3AL-Dd7PwxsF.js} +1 -1
  239. package/dist/ui/assets/{r-C09pGNJC.js → r-B39DAmkC.js} +1 -1
  240. package/dist/ui/assets/{railroadDiagram-RFXS5EU6-sCO9VGvE.js → railroadDiagram-RFXS5EU6-DtO5PVFZ.js} +1 -1
  241. package/dist/ui/assets/{reasonml-S7dzwVL9.js → reasonml-B-ZWFJt_.js} +1 -1
  242. package/dist/ui/assets/{requirementDiagram-TGXJPOKE-CfT5aVZg.js → requirementDiagram-TGXJPOKE-DihF4OTj.js} +1 -1
  243. package/dist/ui/assets/{rib-fM2EwQd4.js → rib-CnGG0qMF.js} +1 -1
  244. package/dist/ui/assets/{roboconf-D7AaeyrW.js → roboconf-Ewtfps4u.js} +1 -1
  245. package/dist/ui/assets/{routeros-c6Q7mKuq.js → routeros-CPcmP1c7.js} +1 -1
  246. package/dist/ui/assets/{rsl-sCpEQBxh.js → rsl-NbjWFbPH.js} +1 -1
  247. package/dist/ui/assets/{ruby-lcKhz2w9.js → ruby-DWDdy5yE.js} +1 -1
  248. package/dist/ui/assets/{ruleslanguage-BW4ATOuX.js → ruleslanguage-Cv_DZe2r.js} +1 -1
  249. package/dist/ui/assets/{rust-BbpU-0VY.js → rust-NZnsfER5.js} +1 -1
  250. package/dist/ui/assets/{sankeyDiagram-HTMAVEWB-CaweCpvN.js → sankeyDiagram-HTMAVEWB-D6i-Mzte.js} +1 -1
  251. package/dist/ui/assets/{sas-BPt5R0dx.js → sas-C4wv0P6G.js} +1 -1
  252. package/dist/ui/assets/{scala-DxW_vqXs.js → scala-DUdTOIgx.js} +1 -1
  253. package/dist/ui/assets/{scheme-T2Q_jWzT.js → scheme-DEdFa14t.js} +1 -1
  254. package/dist/ui/assets/{scilab-DMORg9lV.js → scilab-xY51J2bR.js} +1 -1
  255. package/dist/ui/assets/{scss-t0VsosqT.js → scss-BEYp1sXc.js} +1 -1
  256. package/dist/ui/assets/{sequenceDiagram-DBY2YBRQ-o-H_R4zb.js → sequenceDiagram-DBY2YBRQ-njQlqy_J.js} +1 -1
  257. package/dist/ui/assets/{shell-CnCDa1s9.js → shell-fq6bkhOw.js} +1 -1
  258. package/dist/ui/assets/{sizeCapture-X5ZJPWSS-BNLkHGDS.js → sizeCapture-X5ZJPWSS-tLn70-Fb.js} +1 -1
  259. package/dist/ui/assets/{smali-_n-BxJyG.js → smali-CsSAuSYg.js} +1 -1
  260. package/dist/ui/assets/{smalltalk-B90PXJwK.js → smalltalk-DJ7zrd87.js} +1 -1
  261. package/dist/ui/assets/{sml-fuY7bj-n.js → sml-CnDwl0nH.js} +1 -1
  262. package/dist/ui/assets/{sqf-COpwkyuo.js → sqf-Cc2SX4Zy.js} +1 -1
  263. package/dist/ui/assets/{sql-CXIT0j-x.js → sql-DUQA_V_4.js} +1 -1
  264. package/dist/ui/assets/{sql_more-C1Oxq4rx.js → sql_more-BHoH-8oO.js} +1 -1
  265. package/dist/ui/assets/{stan-BZEpaHeC.js → stan-D-7F5jH6.js} +1 -1
  266. package/dist/ui/assets/{stata-CkBwaiZM.js → stata-xKD_DnDE.js} +1 -1
  267. package/dist/ui/assets/{stateDiagram-2N3HPSRC-BkdnNF7I.js → stateDiagram-2N3HPSRC-B4O8weor.js} +1 -1
  268. package/dist/ui/assets/stateDiagram-v2-6OUMAXLB-CO881_ht.js +1 -0
  269. package/dist/ui/assets/{step21-fs9N_U3O.js → step21-obc_kzQY.js} +1 -1
  270. package/dist/ui/assets/{stylus-Bs_9cvKZ.js → stylus-CkAUSRd-.js} +1 -1
  271. package/dist/ui/assets/{subunit-DvgcOCqJ.js → subunit-BDv8PGo1.js} +1 -1
  272. package/dist/ui/assets/{swift-BE4ONsur.js → swift-CHsYyW-p.js} +1 -1
  273. package/dist/ui/assets/{swimlanes-5IMT3BWC-uqTAc7o7.js → swimlanes-5IMT3BWC-DSr9Ty4A.js} +2 -2
  274. package/dist/ui/assets/swimlanesDiagram-G3AALYLV-DFMCDs8b.js +8 -0
  275. package/dist/ui/assets/{taggerscript-BhmPJ64C.js → taggerscript-C_2JQgO9.js} +1 -1
  276. package/dist/ui/assets/{tap-DkueIVKV.js → tap-Bi497Z2c.js} +1 -1
  277. package/dist/ui/assets/{tcl-DyXOOkFi.js → tcl-B1XMvLaD.js} +1 -1
  278. package/dist/ui/assets/{thrift-Dhgbk56T.js → thrift-D9X0Hmmc.js} +1 -1
  279. package/dist/ui/assets/{timeline-definition-FHXFAJF6-DBAk9Ouc.js → timeline-definition-FHXFAJF6-C4_gj50B.js} +1 -1
  280. package/dist/ui/assets/{tp-BsXyrRGH.js → tp-CJG4Odbx.js} +1 -1
  281. package/dist/ui/assets/{twig-J0HqIuHw.js → twig-flj72_wc.js} +1 -1
  282. package/dist/ui/assets/{typescript-Dkwvul39.js → typescript-CWPwVoLd.js} +1 -1
  283. package/dist/ui/assets/{vala-CRGnf8aY.js → vala-LuCNWNuU.js} +1 -1
  284. package/dist/ui/assets/{vbnet-BtJAUe3z.js → vbnet-CGUT6ss0.js} +1 -1
  285. package/dist/ui/assets/{vbscript-RgFFNuM3.js → vbscript-CNiUBJhn.js} +1 -1
  286. package/dist/ui/assets/{vbscript-html-DO32Io9Y.js → vbscript-html-CJGgjjbc.js} +1 -1
  287. package/dist/ui/assets/{vennDiagram-L72KCM5P-BJi6y0hh.js → vennDiagram-L72KCM5P-BxcAUnYo.js} +1 -1
  288. package/dist/ui/assets/{verilog-C4h6MLcI.js → verilog-C4f9ZBTK.js} +1 -1
  289. package/dist/ui/assets/{vhdl-DOafePyU.js → vhdl-CyDQIZve.js} +1 -1
  290. package/dist/ui/assets/{vim-BAdTA9TY.js → vim-XAUBqa0M.js} +1 -1
  291. package/dist/ui/assets/{wardleyDiagram-EHGQE667-C7c_4IJ6.js → wardleyDiagram-EHGQE667-DlwSH77q.js} +1 -1
  292. package/dist/ui/assets/{x86asm-BCL6__QH.js → x86asm-Cp6vHuUx.js} +1 -1
  293. package/dist/ui/assets/{xl-qIzE4HOe.js → xl-BHgDofIM.js} +1 -1
  294. package/dist/ui/assets/{xml-DE2sJXYU.js → xml-QloVn4s_.js} +1 -1
  295. package/dist/ui/assets/{xquery-CQ35t92y.js → xquery-spJZLmyM.js} +1 -1
  296. package/dist/ui/assets/{xychartDiagram-FW5EYKEG-D2ILn0jL.js → xychartDiagram-FW5EYKEG-BxGVZcnb.js} +1 -1
  297. package/dist/ui/assets/{yaml-5KaAvG5C.js → yaml-CUju4iq0.js} +1 -1
  298. package/dist/ui/assets/{zephir-CbR3Ryfq.js → zephir-ChVpmD0Y.js} +1 -1
  299. package/dist/ui/index.html +1 -1
  300. package/dist/utils/__tests__/db-maintenance.test.d.ts +1 -0
  301. package/dist/utils/__tests__/db-maintenance.test.js +55 -0
  302. package/dist/utils/__tests__/db-migration.test.js +79 -1
  303. package/dist/utils/__tests__/request-writer.test.js +264 -3
  304. package/dist/utils/__tests__/stats-aggregator.test.d.ts +1 -0
  305. package/dist/utils/__tests__/stats-aggregator.test.js +114 -0
  306. package/dist/utils/db-maintenance.d.ts +8 -0
  307. package/dist/utils/db-maintenance.js +18 -0
  308. package/dist/utils/db.d.ts +1 -0
  309. package/dist/utils/db.js +62 -0
  310. package/dist/utils/request-writer.d.ts +23 -1
  311. package/dist/utils/request-writer.js +200 -14
  312. package/dist/utils/stats-aggregator.d.ts +1 -1
  313. package/dist/utils/stats-aggregator.js +44 -27
  314. package/ecosystem.config.cjs +2 -1
  315. package/package.json +1 -1
  316. package/dist/server/middleware/__tests__/request-id.test.js +0 -28
  317. package/dist/server/middleware/request-id.d.ts +0 -2
  318. package/dist/server/middleware/request-id.js +0 -12
  319. package/dist/ui/assets/channel-ChTtxQDg.js +0 -1
  320. package/dist/ui/assets/classDiagram-OUVF2IWQ-Ccbvamlu.js +0 -1
  321. package/dist/ui/assets/classDiagram-v2-EOCWNBFH-Ccbvamlu.js +0 -1
  322. package/dist/ui/assets/stateDiagram-v2-6OUMAXLB-0JnZ1VSQ.js +0 -1
  323. package/dist/ui/assets/swimlanesDiagram-G3AALYLV-DQRIIEmi.js +0 -8
  324. /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('propagates request ID from x-request-id header', async () => {
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: '/test',
113
- headers: { 'x-request-id': 'custom-id-123' }
113
+ url: '/request-id-echo',
114
+ headers: { 'x-request-id': 'my-trace-123' }
114
115
  });
115
- expect(response).toBeDefined();
116
+ expect(JSON.parse(response.body).id).toBe('my-trace-123');
116
117
  });
117
- it('handles request without x-request-id header', async () => {
118
+ it('generates non-default nanoid request id without header, unique per request', async () => {
118
119
  server = await createServer();
119
- const response = await server.inject({
120
- method: 'GET',
121
- url: '/test'
122
- });
123
- expect(response).toBeDefined();
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;
@@ -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);
@@ -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
@@ -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
- * 给上游 nodeStream 挂空闲看门狗:data 到达重置定时器;
175
- * end/close/error 清理定时器;超时且流未销毁时以 idle timeout 销毁。
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
- }, STREAM_IDLE_TIMEOUT_MS);
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 interruptedRequests = interruptStaleRequestsOnStartup();
212
- if (interruptedRequests > 0) {
213
- console.log(`Interrupted ${interruptedRequests} stale request(s) from previous run`);
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
- // 旁路解码器:只做事件入库,不介入转发管道;[DONE] 走 onDone 留空,天然不入库
385
- const tapDecoder = createEventDecoder((e) => rec.appendEvent(e));
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
- // 旁路解码器:只做事件入库,不介入转发管道;[DONE] 走 onDone 留空,天然不入库
476
- const tapDecoder = createEventDecoder((e) => rec.appendEvent(e));
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);
@@ -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-Ci23SMK2.js";import{r as s}from"./index-BbMRVVGt.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
+ 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-Ci23SMK2.js";import{a as i}from"./index-BbMRVVGt.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
+ 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};
@@ -1 +1 @@
1
- import{g as p,r as u,d as a}from"./chunk-MOJQB5TN-By21wDCN.js";import{p as f}from"./chunk-JWPE2WC7-Dvs7u8eY.js";import{_ as n,l as o}from"./index-Ci23SMK2.js";import{M as c,b as d}from"./cynefin-VYW2F7L2-CkuBhgC4.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
+ 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-Ci23SMK2.js";import{b as f}from"./index-BbMRVVGt.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
+ 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-Ci23SMK2.js";import{c as s}from"./index-BbMRVVGt.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
+ 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-Ci23SMK2.js";import{d as i}from"./index-BbMRVVGt.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
+ 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-Ci23SMK2.js";import{e as c}from"./index-BbMRVVGt.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
+ 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-Ci23SMK2.js";import{f as p}from"./index-BbMRVVGt.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
+ 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-Ci23SMK2.js";import{g as c}from"./index-BbMRVVGt.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
+ 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-Ci23SMK2.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
+ 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-Ci23SMK2.js";import{h as s}from"./index-BbMRVVGt.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};
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};