@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.
Files changed (326) 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.vxoC6jUT.js} +1 -1
  7. package/dist/docs/assets/chunks/@localSearchIndexroot.lKm6N3Ik.js +1 -0
  8. package/dist/docs/assets/chunks/{VPLocalSearchBox.DpXF9ZAI.js → VPLocalSearchBox.DrfGpz86.js} +1 -1
  9. package/dist/docs/assets/chunks/{theme.TS_gUyc7.js → theme.CCmzbSn9.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 +365 -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/chat-route.js +3 -3
  49. package/dist/server/data-push.d.ts +2 -0
  50. package/dist/server/data-push.js +22 -0
  51. package/dist/server/index.js +4 -3
  52. package/dist/server/proxy.js +127 -23
  53. package/dist/server/ui-route.js +8 -1
  54. package/dist/ui/assets/{1c-CCx-FOtz.js → 1c-BdWVxVKv.js} +1 -1
  55. package/dist/ui/assets/{abnf-Bwbi42Z8.js → abnf-hHBtR6kN.js} +1 -1
  56. package/dist/ui/assets/{abnfDiagram-VRR7QNED-Dm1-8q0E.js → abnfDiagram-VRR7QNED-B0E8zzLB.js} +1 -1
  57. package/dist/ui/assets/{accesslog-DCytz_-m.js → accesslog-BZmvPz-q.js} +1 -1
  58. package/dist/ui/assets/{actionscript-3udf15oh.js → actionscript-XtUFCVQF.js} +1 -1
  59. package/dist/ui/assets/{ada-M5Xa74xG.js → ada-DDsWH3P3.js} +1 -1
  60. package/dist/ui/assets/{angelscript-qlrFxfW-.js → angelscript-CGLPsuae.js} +1 -1
  61. package/dist/ui/assets/{apache-B-sF-DQH.js → apache-eGe6GEfx.js} +1 -1
  62. package/dist/ui/assets/{applescript-4FdcBnbI.js → applescript-Ch2Hdkz_.js} +1 -1
  63. package/dist/ui/assets/{arc-BB3K1enp.js → arc-Bi_rJJly.js} +1 -1
  64. package/dist/ui/assets/{arcade-B_yqWaaG.js → arcade-BAeq_5jU.js} +1 -1
  65. package/dist/ui/assets/{architectureDiagram-ZJ3FMSHR-B39vkY8V.js → architectureDiagram-ZJ3FMSHR-D3rUGwDS.js} +1 -1
  66. package/dist/ui/assets/{arduino-yAcBoTWU.js → arduino-DJR8nayp.js} +1 -1
  67. package/dist/ui/assets/{armasm-wIcY84bI.js → armasm-DqDD_ZDN.js} +1 -1
  68. package/dist/ui/assets/{asciidoc-Bxnu28-Z.js → asciidoc-CgBdhmR5.js} +1 -1
  69. package/dist/ui/assets/{aspectj-B2cKJA_O.js → aspectj-Dbm_6mY0.js} +1 -1
  70. package/dist/ui/assets/{autohotkey-B_rMWTtE.js → autohotkey-BkbluSS8.js} +1 -1
  71. package/dist/ui/assets/{autoit-DwcuvMwv.js → autoit-qUepyZBT.js} +1 -1
  72. package/dist/ui/assets/{avrasm-heGX1PXK.js → avrasm-2snPxE5L.js} +1 -1
  73. package/dist/ui/assets/{awk-BiqCQAEf.js → awk-oPcQTdJK.js} +1 -1
  74. package/dist/ui/assets/{axapta-Cv8M-Ih6.js → axapta-CCu7hfQ-.js} +1 -1
  75. package/dist/ui/assets/{bash-Divgn3JV.js → bash-CmWN3rPR.js} +1 -1
  76. package/dist/ui/assets/{basic-B9dnAP55.js → basic-Dg8KcxuC.js} +1 -1
  77. package/dist/ui/assets/{blockDiagram-677ZJIJ3-DQ1mf7A_.js → blockDiagram-677ZJIJ3-Dusa5zr8.js} +1 -1
  78. package/dist/ui/assets/{bnf-kIL5mSsP.js → bnf-Zmfygl9A.js} +1 -1
  79. package/dist/ui/assets/{brainfuck-DqB7xDjH.js → brainfuck-K4-sBD6i.js} +1 -1
  80. package/dist/ui/assets/{coq-6aKUn3zn.js → c-BGtacyfP.js} +1 -1
  81. package/dist/ui/assets/{c-like-De5MhE7G.js → c-like-FRDCqB2X.js} +1 -1
  82. package/dist/ui/assets/{c4Diagram-LMCZKHZV-DQxtYsAx.js → c4Diagram-LMCZKHZV-C4Vo5RAI.js} +1 -1
  83. package/dist/ui/assets/{cal-mYdfz9en.js → cal-BibfnL8Q.js} +1 -1
  84. package/dist/ui/assets/{capnproto-D04CRlOt.js → capnproto-D4sJA0ax.js} +1 -1
  85. package/dist/ui/assets/{ceylon-pi9lFCja.js → ceylon-DuI5ot57.js} +1 -1
  86. package/dist/ui/assets/channel-CviGbONW.js +1 -0
  87. package/dist/ui/assets/{chunk-2Q5K7J3B-BDD1nPt8.js → chunk-2Q5K7J3B-C0UTs_LW.js} +1 -1
  88. package/dist/ui/assets/{chunk-32BRIVSS-DgeQFBb5.js → chunk-32BRIVSS-BMqPhehD.js} +1 -1
  89. package/dist/ui/assets/{chunk-5VM5RSS4-C7Xf2SnI.js → chunk-5VM5RSS4-CKN4Vw1w.js} +1 -1
  90. package/dist/ui/assets/{chunk-EX3LRPZG-B_3p1HEv.js → chunk-EX3LRPZG-BYHH22fs.js} +1 -1
  91. package/dist/ui/assets/{chunk-JWPE2WC7-Dvs7u8eY.js → chunk-JWPE2WC7-b55Vo5mo.js} +1 -1
  92. package/dist/ui/assets/{chunk-MOJQB5TN-By21wDCN.js → chunk-MOJQB5TN-CvtnHxi4.js} +1 -1
  93. package/dist/ui/assets/{chunk-RYQCIY6F-6NC700r1.js → chunk-RYQCIY6F-Bi9_eYfb.js} +1 -1
  94. package/dist/ui/assets/{chunk-V7JOEXUC-vEUqZ3rh.js → chunk-V7JOEXUC-C3ujZT8O.js} +1 -1
  95. package/dist/ui/assets/{chunk-VR4S4FIN-6tX2dNN9.js → chunk-VR4S4FIN-D4pfDh-j.js} +1 -1
  96. package/dist/ui/assets/{chunk-XXDRQBXY-qDb2jxAR.js → chunk-XXDRQBXY-DQAjg3aO.js} +1 -1
  97. package/dist/ui/assets/classDiagram-OUVF2IWQ-BlFcpmEd.js +1 -0
  98. package/dist/ui/assets/classDiagram-v2-EOCWNBFH-BlFcpmEd.js +1 -0
  99. package/dist/ui/assets/{clean-CLCsDUl1.js → clean-BVmfQBBV.js} +1 -1
  100. package/dist/ui/assets/{clojure-dVi5Xifj.js → clojure-BN3C1fnU.js} +1 -1
  101. package/dist/ui/assets/{clojure-repl-BO_FpFmF.js → clojure-repl-C7Gg0UPF.js} +1 -1
  102. package/dist/ui/assets/{cmake-CP5aJbyK.js → cmake-CTQFRyul.js} +1 -1
  103. package/dist/ui/assets/{coffeescript-ZEfu_9pF.js → coffeescript-DGWU3k3W.js} +1 -1
  104. package/dist/ui/assets/{c-HmsCM6sx.js → coq-Bv9CXGly.js} +1 -1
  105. package/dist/ui/assets/{cos-BohCnRN2.js → cos-JXNeNyLn.js} +1 -1
  106. package/dist/ui/assets/{cose-bilkent-JH36ORCC-DyXCbbro.js → cose-bilkent-JH36ORCC-B2e-rPVN.js} +1 -1
  107. package/dist/ui/assets/{cpp-FOgPWPEt.js → cpp-DVS4QZP-.js} +1 -1
  108. package/dist/ui/assets/{crmsh-B0OYb-Oe.js → crmsh-CFD7lrxk.js} +1 -1
  109. package/dist/ui/assets/{crystal-CuWb_dXm.js → crystal-D7vS7dho.js} +1 -1
  110. package/dist/ui/assets/{csharp-BbcqM09j.js → csharp-BgeVxKaT.js} +1 -1
  111. package/dist/ui/assets/{csp-rgHnTaDq.js → csp-CmAkjXvi.js} +1 -1
  112. package/dist/ui/assets/{css-C-ibh7ZG.js → css-DtEkZRCq.js} +1 -1
  113. package/dist/ui/assets/{cynefin-VYW2F7L2-CkuBhgC4.js → cynefin-VYW2F7L2-bhneX2QQ.js} +1 -1
  114. package/dist/ui/assets/{cynefinDiagram-TSTJHNR4-eycFyDao.js → cynefinDiagram-TSTJHNR4-BvtRhsVM.js} +1 -1
  115. package/dist/ui/assets/{d-C0gXxJ0O.js → d-ov1MlWJx.js} +1 -1
  116. package/dist/ui/assets/{dagre-VKFMJZFB-DzqX9e49.js → dagre-VKFMJZFB-nxN1qAKi.js} +1 -1
  117. package/dist/ui/assets/{dart-C-fTpuUV.js → dart-DX6s604e.js} +1 -1
  118. package/dist/ui/assets/{delphi-Chm0B9xv.js → delphi-D0oU57Jt.js} +1 -1
  119. package/dist/ui/assets/{diagram-FQU43EPY-BEgCqfg1.js → diagram-FQU43EPY-CWkdysy2.js} +1 -1
  120. package/dist/ui/assets/{diagram-G47NLZAW-Cw11Vs2v.js → diagram-G47NLZAW-L7jPJ-r1.js} +1 -1
  121. package/dist/ui/assets/{diagram-NH7WQ7WH-DSG_UWpP.js → diagram-NH7WQ7WH-fhOp1mr9.js} +1 -1
  122. package/dist/ui/assets/{diagram-OA4YK3LP-CJz-WOaJ.js → diagram-OA4YK3LP-B7UMZ-5d.js} +1 -1
  123. package/dist/ui/assets/{diagram-WEI45ONY-CBXjBCvc.js → diagram-WEI45ONY-B-toJrZu.js} +1 -1
  124. package/dist/ui/assets/{diff-C-vyuMSL.js → diff-CAzYRr8i.js} +1 -1
  125. package/dist/ui/assets/{django-CJK7lReT.js → django-DPFPMDLP.js} +1 -1
  126. package/dist/ui/assets/{dns-D02SHjSy.js → dns-kf25JjIl.js} +1 -1
  127. package/dist/ui/assets/{dockerfile-trKL1Bqu.js → dockerfile-GP7x-Ptc.js} +1 -1
  128. package/dist/ui/assets/{dos-C52dy-sK.js → dos-DlXSYH18.js} +1 -1
  129. package/dist/ui/assets/{dsconfig-MzHgzVrt.js → dsconfig-DrXWPwZN.js} +1 -1
  130. package/dist/ui/assets/{dts-B137dHyX.js → dts-B9QdwGCS.js} +1 -1
  131. package/dist/ui/assets/{dust-BcbM0r5C.js → dust-CdplAbVJ.js} +1 -1
  132. package/dist/ui/assets/{ebnf-DkbpI7bK.js → ebnf-BdCAaKiH.js} +1 -1
  133. package/dist/ui/assets/{ebnfDiagram-CCIWWBDH-aI5uQ7w1.js → ebnfDiagram-CCIWWBDH-l1kXQDgJ.js} +1 -1
  134. package/dist/ui/assets/{elixir-BOtDuqQy.js → elixir-WekcTu8c.js} +1 -1
  135. package/dist/ui/assets/{elm-DS8Tyyu-.js → elm-DKbQ6Ryz.js} +1 -1
  136. package/dist/ui/assets/{erDiagram-Q63AITRT-2vCbd4Mm.js → erDiagram-Q63AITRT-CCeU8uXM.js} +1 -1
  137. package/dist/ui/assets/{erb-CSXECRbn.js → erb-DvQ2S9Q6.js} +1 -1
  138. package/dist/ui/assets/{erlang-BMxlgKPJ.js → erlang-C4cAvWW8.js} +1 -1
  139. package/dist/ui/assets/{erlang-repl-DPzlolPg.js → erlang-repl-BMKmccqv.js} +1 -1
  140. package/dist/ui/assets/{excel-CW2Uxed3.js → excel-Cz9AeP71.js} +1 -1
  141. package/dist/ui/assets/{fix-UW84SlCs.js → fix-BFQxvtLz.js} +1 -1
  142. package/dist/ui/assets/{flix-4UGiPULd.js → flix-D3TgVgHZ.js} +1 -1
  143. package/dist/ui/assets/{flowDiagram-23GEKE2U-R5PbCbZI.js → flowDiagram-23GEKE2U-CWYmXYgW.js} +1 -1
  144. package/dist/ui/assets/{fortran-nhHsngdu.js → fortran-CWmklLY8.js} +1 -1
  145. package/dist/ui/assets/{fsharp-CDyZ1ST5.js → fsharp-V2Eau__H.js} +1 -1
  146. package/dist/ui/assets/{gams-DHzkkUie.js → gams-KwiGZby9.js} +1 -1
  147. package/dist/ui/assets/{ganttDiagram-NO4QXBWP-CGcq4Ie_.js → ganttDiagram-NO4QXBWP-Bw1obkG5.js} +1 -1
  148. package/dist/ui/assets/{gauss-DdhFGyBv.js → gauss-CRI2FQhz.js} +1 -1
  149. package/dist/ui/assets/{gcode-ImHh8OLA.js → gcode-Bh0f80Zp.js} +1 -1
  150. package/dist/ui/assets/{gherkin-CTWAW-XR.js → gherkin-DEjcfzYc.js} +1 -1
  151. package/dist/ui/assets/{gitGraphDiagram-IHSO6WYX-8nM2Z9lD.js → gitGraphDiagram-IHSO6WYX-OfPpsImd.js} +1 -1
  152. package/dist/ui/assets/{glsl-0_W_27G2.js → glsl-BrYpeP6h.js} +1 -1
  153. package/dist/ui/assets/{gml-BoDggu2z.js → gml-m818HPGO.js} +1 -1
  154. package/dist/ui/assets/{go-DYfFygwl.js → go-BX431CyL.js} +1 -1
  155. package/dist/ui/assets/{golo-Mlq-TCg9.js → golo-D4m-zAId.js} +1 -1
  156. package/dist/ui/assets/{gradle-BALAinEB.js → gradle-Cq6wabEA.js} +1 -1
  157. package/dist/ui/assets/{groovy-Dht--dWU.js → groovy-TjcpUbQS.js} +1 -1
  158. package/dist/ui/assets/{haml-DpMrxg0d.js → haml-DrCR34E5.js} +1 -1
  159. package/dist/ui/assets/{handlebars-DqHzujNj.js → handlebars-CVS3O2t9.js} +1 -1
  160. package/dist/ui/assets/{haskell-DZSchhkY.js → haskell-B8q0nv1_.js} +1 -1
  161. package/dist/ui/assets/{haxe-C0zBRjdy.js → haxe-DXPsSA4C.js} +1 -1
  162. package/dist/ui/assets/{hsp-D_PwbSv2.js → hsp-CzpLpdV9.js} +1 -1
  163. package/dist/ui/assets/{htmlbars-DxAFMG8u.js → htmlbars-Cs_-HclQ.js} +1 -1
  164. package/dist/ui/assets/{http-DvTRF0Do.js → http-CHD9pG0v.js} +1 -1
  165. package/dist/ui/assets/{hy-lVO-kNyp.js → hy-B-a7tYC4.js} +1 -1
  166. package/dist/ui/assets/{index-Ci23SMK2.js → index-CJEzcYeX.js} +21 -21
  167. package/dist/ui/assets/{index-BbMRVVGt.js → index-DBPwq3d-.js} +3 -3
  168. package/dist/ui/assets/{infoDiagram-FWYZ7A6U-C7WYDlvc.js → infoDiagram-FWYZ7A6U-DNrZutb1.js} +1 -1
  169. package/dist/ui/assets/{inform7-B8Tf2n8v.js → inform7-47bZAprM.js} +1 -1
  170. package/dist/ui/assets/{ini-DSoYMaLF.js → ini-D00zSJOc.js} +1 -1
  171. package/dist/ui/assets/{irpf90-RCPdkB14.js → irpf90-Cb5adfDu.js} +1 -1
  172. package/dist/ui/assets/{isbl-C2p75PPj.js → isbl-NcFXKDCH.js} +1 -1
  173. package/dist/ui/assets/{ishikawaDiagram-FXEZZL3T-Cm6jsPlc.js → ishikawaDiagram-FXEZZL3T-DodxL_A3.js} +1 -1
  174. package/dist/ui/assets/{java-DeY4Yuia.js → java-DdNdnIDI.js} +1 -1
  175. package/dist/ui/assets/{javascript-3uX1CO-H.js → javascript-CauBsBfA.js} +1 -1
  176. package/dist/ui/assets/{jboss-cli-DgnD8mEc.js → jboss-cli-Ce_9aKRs.js} +1 -1
  177. package/dist/ui/assets/{journeyDiagram-5HDEW3XC-DEGV1uA5.js → journeyDiagram-5HDEW3XC-CaegxpYw.js} +1 -1
  178. package/dist/ui/assets/{json-BV2PmJJp.js → json-BKT_pfo1.js} +1 -1
  179. package/dist/ui/assets/{julia-B-m8kQm7.js → julia-bWGt_b_o.js} +1 -1
  180. package/dist/ui/assets/{julia-repl-C51atU2X.js → julia-repl-D-rjMsRC.js} +1 -1
  181. package/dist/ui/assets/{kanban-definition-HUTT4EX6-BJ4k5iTX.js → kanban-definition-HUTT4EX6-DocIVGMy.js} +1 -1
  182. package/dist/ui/assets/{kotlin-CYBziIgl.js → kotlin-CW5ChHJw.js} +1 -1
  183. package/dist/ui/assets/{lasso-Dw2SBMDW.js → lasso-1z4Xsh4l.js} +1 -1
  184. package/dist/ui/assets/{latex-Dpd35yke.js → latex-DRw0gvLT.js} +1 -1
  185. package/dist/ui/assets/{ldif-Ce9EZU__.js → ldif-CC6n1ZWZ.js} +1 -1
  186. package/dist/ui/assets/{leaf-CpkZzQtC.js → leaf-DtycGYP2.js} +1 -1
  187. package/dist/ui/assets/{less-Uzo7M0FD.js → less-DHfDdpLT.js} +1 -1
  188. package/dist/ui/assets/{lisp-DWXDlJYm.js → lisp-F7y5QBiG.js} +1 -1
  189. package/dist/ui/assets/{livecodeserver-uEyPEgVJ.js → livecodeserver-B4rL97ZE.js} +1 -1
  190. package/dist/ui/assets/{livescript-BQ5f07oK.js → livescript-C1A66vR3.js} +1 -1
  191. package/dist/ui/assets/{llvm-BAvP-skE.js → llvm-DrJc4jDQ.js} +1 -1
  192. package/dist/ui/assets/{lsl-DhbiIKu6.js → lsl-ByygfQlb.js} +1 -1
  193. package/dist/ui/assets/{lua-COxeUeLx.js → lua-C93sHZoB.js} +1 -1
  194. package/dist/ui/assets/{makefile-DhDx-IgL.js → makefile-CymUCipv.js} +1 -1
  195. package/dist/ui/assets/{markdown-DX5_kSxq.js → markdown-BLwVli7a.js} +1 -1
  196. package/dist/ui/assets/{mathematica-D351ZddB.js → mathematica-DMmVw4oA.js} +1 -1
  197. package/dist/ui/assets/{matlab-CELqIiwF.js → matlab-DJPyR0-0.js} +1 -1
  198. package/dist/ui/assets/{maxima-B_YljrMm.js → maxima-B_5tEBD-.js} +1 -1
  199. package/dist/ui/assets/{mel-DltsbNS8.js → mel-B5AJmhET.js} +1 -1
  200. package/dist/ui/assets/{mercury-axX-5Vjj.js → mercury-DDm_HlP5.js} +1 -1
  201. package/dist/ui/assets/{mindmap-definition-LN4V7U3C-Bl1EJo6p.js → mindmap-definition-LN4V7U3C-Ck5xDFhg.js} +1 -1
  202. package/dist/ui/assets/{mipsasm-BxmerVwX.js → mipsasm-BBf0KZxo.js} +1 -1
  203. package/dist/ui/assets/{mizar-XNHfbpL2.js → mizar-BvkTEip4.js} +1 -1
  204. package/dist/ui/assets/{mojolicious-BR0U_7zk.js → mojolicious-t81pYOLs.js} +1 -1
  205. package/dist/ui/assets/{monkey-lLuu9_f-.js → monkey-B5URMcLy.js} +1 -1
  206. package/dist/ui/assets/{moonscript-DoaZ3DRQ.js → moonscript-Bbi3L3V5.js} +1 -1
  207. package/dist/ui/assets/{n1ql-C6TId6Iu.js → n1ql-DE8gguiN.js} +1 -1
  208. package/dist/ui/assets/{nginx-BezSG-JT.js → nginx-ytmzvrnA.js} +1 -1
  209. package/dist/ui/assets/{nim-Bb0rfXie.js → nim-28PFAP2a.js} +1 -1
  210. package/dist/ui/assets/{nix-o3sJ5-54.js → nix-DPGZqLl2.js} +1 -1
  211. package/dist/ui/assets/{node-repl-Sv5hhcTf.js → node-repl-77Ag73Mp.js} +1 -1
  212. package/dist/ui/assets/{nsis-B45BJFhF.js → nsis-Bd-Jh2mn.js} +1 -1
  213. package/dist/ui/assets/{objectivec-CzS6zVgh.js → objectivec-Dut0JGtJ.js} +1 -1
  214. package/dist/ui/assets/{ocaml-Bqux7PyP.js → ocaml-B8NbbL7d.js} +1 -1
  215. package/dist/ui/assets/{openscad-4Wf6mF84.js → openscad-3haKn8_6.js} +1 -1
  216. package/dist/ui/assets/{oxygene-Fvwqgkkt.js → oxygene-CzZcXgOW.js} +1 -1
  217. package/dist/ui/assets/{parser3-zEfzT5wv.js → parser3-B9_LTx13.js} +1 -1
  218. package/dist/ui/assets/{pegDiagram-2B236MQR-Dd4rIztM.js → pegDiagram-2B236MQR-CnkbIPdt.js} +1 -1
  219. package/dist/ui/assets/{perl-CsS1Gs6o.js → perl-CJHWWgIf.js} +1 -1
  220. package/dist/ui/assets/{pf-BNH1jO0R.js → pf-BpbQ2FKx.js} +1 -1
  221. package/dist/ui/assets/{pgsql-DqPigHrq.js → pgsql-DNFfp1qF.js} +1 -1
  222. package/dist/ui/assets/{php-CdOl9bRs.js → php-BHGIfWOP.js} +1 -1
  223. package/dist/ui/assets/{php-template-DPfirJg2.js → php-template-CajBP9Ht.js} +1 -1
  224. package/dist/ui/assets/{pieDiagram-ENE6RG2P-DGaJNf4S.js → pieDiagram-ENE6RG2P-BOBkdC1f.js} +1 -1
  225. package/dist/ui/assets/{plaintext-EHbgBKzw.js → plaintext-CdRaKh_-.js} +1 -1
  226. package/dist/ui/assets/{pony-DmJajtp2.js → pony-BTFZduq1.js} +1 -1
  227. package/dist/ui/assets/{powershell-DfGzdWR6.js → powershell-gWcxiMpD.js} +1 -1
  228. package/dist/ui/assets/{processing-BT0ETgPG.js → processing-DbryYP4B.js} +1 -1
  229. package/dist/ui/assets/{profile-B3I-x5Lt.js → profile-CHL6RTDR.js} +1 -1
  230. package/dist/ui/assets/{prolog-B_4QJIvI.js → prolog-CAz3V1M6.js} +1 -1
  231. package/dist/ui/assets/{properties-BFVI8weS.js → properties-BLvgyNqZ.js} +1 -1
  232. package/dist/ui/assets/{protobuf-PaF39oZZ.js → protobuf-C-bEtiAJ.js} +1 -1
  233. package/dist/ui/assets/{puppet-BDC6Q8VF.js → puppet-67xqXQgg.js} +1 -1
  234. package/dist/ui/assets/{purebasic-B2ejrOZK.js → purebasic-DAwxmhyv.js} +1 -1
  235. package/dist/ui/assets/{python-repl-BslBh_Mx.js → python-repl-BJmGMIGi.js} +1 -1
  236. package/dist/ui/assets/{python-BOxtIk9H.js → python-z-wrDm9i.js} +1 -1
  237. package/dist/ui/assets/{q-BPe8WLGW.js → q-CDMPAvF9.js} +1 -1
  238. package/dist/ui/assets/{qml-BazRR6fz.js → qml-CbE9R2YT.js} +1 -1
  239. package/dist/ui/assets/{quadrantDiagram-ABIIQ3AL-BQ7aPkHk.js → quadrantDiagram-ABIIQ3AL-BHAhzSkD.js} +1 -1
  240. package/dist/ui/assets/{r-C09pGNJC.js → r-B1k7RrWh.js} +1 -1
  241. package/dist/ui/assets/{railroadDiagram-RFXS5EU6-sCO9VGvE.js → railroadDiagram-RFXS5EU6-CsQep5fB.js} +1 -1
  242. package/dist/ui/assets/{reasonml-S7dzwVL9.js → reasonml-CghNJ9wO.js} +1 -1
  243. package/dist/ui/assets/{requirementDiagram-TGXJPOKE-CfT5aVZg.js → requirementDiagram-TGXJPOKE-BTTRG_C-.js} +1 -1
  244. package/dist/ui/assets/{rib-fM2EwQd4.js → rib-BzZqpngB.js} +1 -1
  245. package/dist/ui/assets/{roboconf-D7AaeyrW.js → roboconf-Bn6vqIcm.js} +1 -1
  246. package/dist/ui/assets/{routeros-c6Q7mKuq.js → routeros-CWiIB6Sc.js} +1 -1
  247. package/dist/ui/assets/{rsl-sCpEQBxh.js → rsl-8XzLd-ex.js} +1 -1
  248. package/dist/ui/assets/{ruby-lcKhz2w9.js → ruby-CMsox328.js} +1 -1
  249. package/dist/ui/assets/{ruleslanguage-BW4ATOuX.js → ruleslanguage-sJ93c6T4.js} +1 -1
  250. package/dist/ui/assets/{rust-BbpU-0VY.js → rust-q4W6ksGp.js} +1 -1
  251. package/dist/ui/assets/{sankeyDiagram-HTMAVEWB-CaweCpvN.js → sankeyDiagram-HTMAVEWB-_xUP3uiO.js} +1 -1
  252. package/dist/ui/assets/{sas-BPt5R0dx.js → sas-JzGZkjB8.js} +1 -1
  253. package/dist/ui/assets/{scala-DxW_vqXs.js → scala-BBRUB1bT.js} +1 -1
  254. package/dist/ui/assets/{scheme-T2Q_jWzT.js → scheme-gFzNu8q5.js} +1 -1
  255. package/dist/ui/assets/{scilab-DMORg9lV.js → scilab-0XjfEPk4.js} +1 -1
  256. package/dist/ui/assets/{scss-t0VsosqT.js → scss-CuET4vU_.js} +1 -1
  257. package/dist/ui/assets/{sequenceDiagram-DBY2YBRQ-o-H_R4zb.js → sequenceDiagram-DBY2YBRQ-DYM-Lf_t.js} +1 -1
  258. package/dist/ui/assets/{shell-CnCDa1s9.js → shell-DozhgmQz.js} +1 -1
  259. package/dist/ui/assets/{sizeCapture-X5ZJPWSS-BNLkHGDS.js → sizeCapture-X5ZJPWSS-enn2ctEl.js} +1 -1
  260. package/dist/ui/assets/{smali-_n-BxJyG.js → smali-DCS5Fxk1.js} +1 -1
  261. package/dist/ui/assets/{smalltalk-B90PXJwK.js → smalltalk-BHQ0G1rO.js} +1 -1
  262. package/dist/ui/assets/{sml-fuY7bj-n.js → sml-Bj9p_O7l.js} +1 -1
  263. package/dist/ui/assets/{sqf-COpwkyuo.js → sqf-VjHINPVc.js} +1 -1
  264. package/dist/ui/assets/{sql-CXIT0j-x.js → sql-DNYdjhOa.js} +1 -1
  265. package/dist/ui/assets/{sql_more-C1Oxq4rx.js → sql_more-DF9pwFii.js} +1 -1
  266. package/dist/ui/assets/{stan-BZEpaHeC.js → stan-DQ7LiXhT.js} +1 -1
  267. package/dist/ui/assets/{stata-CkBwaiZM.js → stata-4eQacDMD.js} +1 -1
  268. package/dist/ui/assets/{stateDiagram-2N3HPSRC-BkdnNF7I.js → stateDiagram-2N3HPSRC-CX-Qz4n7.js} +1 -1
  269. package/dist/ui/assets/stateDiagram-v2-6OUMAXLB-Ch54U9zs.js +1 -0
  270. package/dist/ui/assets/{step21-fs9N_U3O.js → step21-BgYnjmFD.js} +1 -1
  271. package/dist/ui/assets/{stylus-Bs_9cvKZ.js → stylus-ZZ5CxZ05.js} +1 -1
  272. package/dist/ui/assets/{subunit-DvgcOCqJ.js → subunit-Ci5aUEE2.js} +1 -1
  273. package/dist/ui/assets/{swift-BE4ONsur.js → swift-DQJ4QPRG.js} +1 -1
  274. package/dist/ui/assets/{swimlanes-5IMT3BWC-uqTAc7o7.js → swimlanes-5IMT3BWC-vO-7dG2V.js} +2 -2
  275. package/dist/ui/assets/swimlanesDiagram-G3AALYLV-DxwJcNf4.js +8 -0
  276. package/dist/ui/assets/{taggerscript-BhmPJ64C.js → taggerscript-DM07ScL_.js} +1 -1
  277. package/dist/ui/assets/{tap-DkueIVKV.js → tap-C6aPKgww.js} +1 -1
  278. package/dist/ui/assets/{tcl-DyXOOkFi.js → tcl-DjtvddtN.js} +1 -1
  279. package/dist/ui/assets/{thrift-Dhgbk56T.js → thrift-BoJuHfsC.js} +1 -1
  280. package/dist/ui/assets/{timeline-definition-FHXFAJF6-DBAk9Ouc.js → timeline-definition-FHXFAJF6-Cn7z-Bqh.js} +1 -1
  281. package/dist/ui/assets/{tp-BsXyrRGH.js → tp-7mrfAfpj.js} +1 -1
  282. package/dist/ui/assets/{twig-J0HqIuHw.js → twig-DOOUfGqf.js} +1 -1
  283. package/dist/ui/assets/{typescript-Dkwvul39.js → typescript-BbC9hUFK.js} +1 -1
  284. package/dist/ui/assets/{vala-CRGnf8aY.js → vala-XjKwsdD0.js} +1 -1
  285. package/dist/ui/assets/{vbnet-BtJAUe3z.js → vbnet-Da3MfWx9.js} +1 -1
  286. package/dist/ui/assets/{vbscript-RgFFNuM3.js → vbscript-DT_81k7v.js} +1 -1
  287. package/dist/ui/assets/{vbscript-html-DO32Io9Y.js → vbscript-html-DUFh3J5N.js} +1 -1
  288. package/dist/ui/assets/{vennDiagram-L72KCM5P-BJi6y0hh.js → vennDiagram-L72KCM5P-BnjZCady.js} +1 -1
  289. package/dist/ui/assets/{verilog-C4h6MLcI.js → verilog-D5Okzav9.js} +1 -1
  290. package/dist/ui/assets/{vhdl-DOafePyU.js → vhdl-_hcd5jXC.js} +1 -1
  291. package/dist/ui/assets/{vim-BAdTA9TY.js → vim-BuKTsAic.js} +1 -1
  292. package/dist/ui/assets/{wardleyDiagram-EHGQE667-C7c_4IJ6.js → wardleyDiagram-EHGQE667-Bgp49v0-.js} +1 -1
  293. package/dist/ui/assets/{x86asm-BCL6__QH.js → x86asm-DWOIgEnP.js} +1 -1
  294. package/dist/ui/assets/{xl-qIzE4HOe.js → xl-D6TFf1q5.js} +1 -1
  295. package/dist/ui/assets/{xml-DE2sJXYU.js → xml-_5JZFtHD.js} +1 -1
  296. package/dist/ui/assets/{xquery-CQ35t92y.js → xquery-BC0pvaic.js} +1 -1
  297. package/dist/ui/assets/{xychartDiagram-FW5EYKEG-D2ILn0jL.js → xychartDiagram-FW5EYKEG-DmyzmXyI.js} +1 -1
  298. package/dist/ui/assets/{yaml-5KaAvG5C.js → yaml-CLzRjl8_.js} +1 -1
  299. package/dist/ui/assets/{zephir-CbR3Ryfq.js → zephir-nZ6mLYuU.js} +1 -1
  300. package/dist/ui/index.html +1 -1
  301. package/dist/utils/__tests__/db-maintenance.test.d.ts +1 -0
  302. package/dist/utils/__tests__/db-maintenance.test.js +55 -0
  303. package/dist/utils/__tests__/db-migration.test.js +79 -1
  304. package/dist/utils/__tests__/request-writer.test.js +264 -3
  305. package/dist/utils/__tests__/stats-aggregator.test.d.ts +1 -0
  306. package/dist/utils/__tests__/stats-aggregator.test.js +114 -0
  307. package/dist/utils/db-maintenance.d.ts +8 -0
  308. package/dist/utils/db-maintenance.js +18 -0
  309. package/dist/utils/db.d.ts +1 -0
  310. package/dist/utils/db.js +62 -0
  311. package/dist/utils/request-writer.d.ts +23 -1
  312. package/dist/utils/request-writer.js +200 -14
  313. package/dist/utils/stats-aggregator.d.ts +1 -1
  314. package/dist/utils/stats-aggregator.js +44 -27
  315. package/ecosystem.config.cjs +2 -1
  316. package/package.json +1 -1
  317. package/dist/docs/assets/chunks/@localSearchIndexroot.C4sjikMO.js +0 -1
  318. package/dist/server/middleware/__tests__/request-id.test.js +0 -28
  319. package/dist/server/middleware/request-id.d.ts +0 -2
  320. package/dist/server/middleware/request-id.js +0 -12
  321. package/dist/ui/assets/channel-ChTtxQDg.js +0 -1
  322. package/dist/ui/assets/classDiagram-OUVF2IWQ-Ccbvamlu.js +0 -1
  323. package/dist/ui/assets/classDiagram-v2-EOCWNBFH-Ccbvamlu.js +0 -1
  324. package/dist/ui/assets/stateDiagram-v2-6OUMAXLB-0JnZ1VSQ.js +0 -1
  325. package/dist/ui/assets/swimlanesDiagram-G3AALYLV-DQRIIEmi.js +0 -8
  326. /package/dist/server/{middleware/__tests__/request-id.test.d.ts → __tests__/data-push.test.d.ts} +0 -0
@@ -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
  });
@@ -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
- // 旁路解码器:只做事件入库,不介入转发管道;[DONE] 走 onDone 留空,天然不入库
385
- const tapDecoder = createEventDecoder((e) => rec.appendEvent(e));
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
- // 旁路解码器:只做事件入库,不介入转发管道;[DONE] 走 onDone 留空,天然不入库
476
- const tapDecoder = createEventDecoder((e) => rec.appendEvent(e));
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;
@@ -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-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-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-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};
@@ -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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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};