@cc-monitoring/proxy-core 0.1.5 → 0.1.7

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 (445) hide show
  1. package/dist/docs/404.html +22 -0
  2. package/dist/docs/assets/app.BxFOH0P1.js +1 -0
  3. package/dist/docs/assets/chunks/@localSearchIndexroot.Cuu7C9vz.js +1 -0
  4. package/dist/docs/assets/chunks/VPLocalSearchBox.CYDhNgXW.js +9 -0
  5. package/dist/docs/assets/chunks/abnfDiagram-VRR7QNED.RG1C5NpS.js +1 -0
  6. package/dist/docs/assets/chunks/arc.C9NMazfV.js +1 -0
  7. package/dist/docs/assets/chunks/architectureDiagram-ZJ3FMSHR.u2IZtOa6.js +36 -0
  8. package/dist/docs/assets/chunks/blockDiagram-677ZJIJ3.DdHVir7t.js +132 -0
  9. package/dist/docs/assets/chunks/c4Diagram-LMCZKHZV.gSbgoaJo.js +10 -0
  10. package/dist/docs/assets/chunks/channel.Cc6zpfFP.js +1 -0
  11. package/dist/docs/assets/chunks/chunk-2Q5K7J3B.HRSdtksv.js +1 -0
  12. package/dist/docs/assets/chunks/chunk-32BRIVSS.BYzKapof.js +1 -0
  13. package/dist/docs/assets/chunks/chunk-5VM5RSS4.c3oeF0uS.js +15 -0
  14. package/dist/docs/assets/chunks/chunk-EX3LRPZG.Cz5AKl7t.js +231 -0
  15. package/dist/docs/assets/chunks/chunk-JWPE2WC7.DtJxsA7-.js +1 -0
  16. package/dist/docs/assets/chunks/chunk-MOJQB5TN.h5kO0Dtu.js +88 -0
  17. package/dist/docs/assets/chunks/chunk-RYQCIY6F.Ch_NfMTR.js +1 -0
  18. package/dist/docs/assets/chunks/chunk-V7JOEXUC.CHrHyPoW.js +206 -0
  19. package/dist/docs/assets/chunks/chunk-VR4S4FIN.DG8DIrH3.js +1 -0
  20. package/dist/docs/assets/chunks/chunk-XXDRQBXY.CSXBN12Y.js +1 -0
  21. package/dist/docs/assets/chunks/classDiagram-OUVF2IWQ.DV5B4KLJ.js +1 -0
  22. package/dist/docs/assets/chunks/classDiagram-v2-EOCWNBFH.DV5B4KLJ.js +1 -0
  23. package/dist/docs/assets/chunks/cose-bilkent-JH36ORCC.BeFuOTgi.js +1 -0
  24. package/dist/docs/assets/chunks/cynefin-VYW2F7L2.DaXIfh7Y.js +178 -0
  25. package/dist/docs/assets/chunks/cynefinDiagram-TSTJHNR4.BrJcHEEe.js +62 -0
  26. package/dist/docs/assets/chunks/cytoscape.esm.CUqq0XTU.js +331 -0
  27. package/dist/docs/assets/chunks/dagre-VKFMJZFB.D4vaA23X.js +4 -0
  28. package/dist/docs/assets/chunks/defaultLocale.DX6XiGOO.js +1 -0
  29. package/dist/docs/assets/chunks/diagram-FQU43EPY.uwRFLKRx.js +3 -0
  30. package/dist/docs/assets/chunks/diagram-G47NLZAW.Byfc9d0H.js +24 -0
  31. package/dist/docs/assets/chunks/diagram-NH7WQ7WH.CxjBEGZX.js +24 -0
  32. package/dist/docs/assets/chunks/diagram-OA4YK3LP.CU1jGXMi.js +30 -0
  33. package/dist/docs/assets/chunks/diagram-WEI45ONY.yXgVkURA.js +41 -0
  34. package/dist/docs/assets/chunks/ebnfDiagram-CCIWWBDH.UucqGQ_d.js +1 -0
  35. package/dist/docs/assets/chunks/erDiagram-Q63AITRT.C6qmOrvh.js +85 -0
  36. package/dist/docs/assets/chunks/flowDiagram-23GEKE2U.BZLu-WUl.js +156 -0
  37. package/dist/docs/assets/chunks/framework.D_Xv2a7c.js +19 -0
  38. package/dist/docs/assets/chunks/ganttDiagram-NO4QXBWP.DUzsw4Yr.js +292 -0
  39. package/dist/docs/assets/chunks/gitGraphDiagram-IHSO6WYX.BqLfYTI7.js +106 -0
  40. package/dist/docs/assets/chunks/graph.C2PyVmSI.js +1 -0
  41. package/dist/docs/assets/chunks/infoDiagram-FWYZ7A6U.CiKWveW9.js +2 -0
  42. package/dist/docs/assets/chunks/init.Gi6I4Gst.js +1 -0
  43. package/dist/docs/assets/chunks/ishikawaDiagram-FXEZZL3T.jerUXEXA.js +70 -0
  44. package/dist/docs/assets/chunks/journeyDiagram-5HDEW3XC.Cqzvo6I_.js +139 -0
  45. package/dist/docs/assets/chunks/kanban-definition-HUTT4EX6.BzJ4OPe5.js +89 -0
  46. package/dist/docs/assets/chunks/katex.C5jXJg4s.js +257 -0
  47. package/dist/docs/assets/chunks/layout.BG3qr61M.js +1 -0
  48. package/dist/docs/assets/chunks/linear.hFjgYGMN.js +1 -0
  49. package/dist/docs/assets/chunks/map.DwDi8XlU.js +1 -0
  50. package/dist/docs/assets/chunks/mermaid-client.D3gEaJ5e.js +2 -0
  51. package/dist/docs/assets/chunks/mermaid.core.CEHdFh45.js +314 -0
  52. package/dist/docs/assets/chunks/mindmap-definition-LN4V7U3C.ChC5FJW6.js +96 -0
  53. package/dist/docs/assets/chunks/ordinal.BYWQX77i.js +1 -0
  54. package/dist/docs/assets/chunks/pegDiagram-2B236MQR.ClnjsRYs.js +1 -0
  55. package/dist/docs/assets/chunks/pieDiagram-ENE6RG2P.Bb0MqerK.js +39 -0
  56. package/dist/docs/assets/chunks/quadrantDiagram-ABIIQ3AL.Do6HK_yb.js +7 -0
  57. package/dist/docs/assets/chunks/railroadDiagram-RFXS5EU6.D35m6hQn.js +1 -0
  58. package/dist/docs/assets/chunks/requirementDiagram-TGXJPOKE.DMtjRYUg.js +84 -0
  59. package/dist/docs/assets/chunks/sankeyDiagram-HTMAVEWB.dfXDu62B.js +40 -0
  60. package/dist/docs/assets/chunks/sequenceDiagram-DBY2YBRQ.CLZ0rZTY.js +162 -0
  61. package/dist/docs/assets/chunks/sizeCapture-X5ZJPWSS.DWvGYLUT.js +1 -0
  62. package/dist/docs/assets/chunks/stateDiagram-2N3HPSRC.DY8sDkI0.js +1 -0
  63. package/dist/docs/assets/chunks/stateDiagram-v2-6OUMAXLB.B9v-Vq5L.js +1 -0
  64. package/dist/docs/assets/chunks/swimlanes-5IMT3BWC.Dy9SffeT.js +2 -0
  65. package/dist/docs/assets/chunks/swimlanesDiagram-G3AALYLV.Kb9LnCTH.js +8 -0
  66. package/dist/docs/assets/chunks/theme.BLEczZWC.js +2 -0
  67. package/dist/docs/assets/chunks/timeline-definition-FHXFAJF6.CH6uzgIu.js +120 -0
  68. package/dist/docs/assets/chunks/vennDiagram-L72KCM5P.7EBCJmyP.js +34 -0
  69. package/dist/docs/assets/chunks/wardleyDiagram-EHGQE667.DPHAQssL.js +78 -0
  70. package/dist/docs/assets/chunks/xychartDiagram-FW5EYKEG.aKgxZVbK.js +7 -0
  71. package/dist/docs/assets/index.md.p9floL_p.js +1 -0
  72. package/dist/docs/assets/index.md.p9floL_p.lean.js +1 -0
  73. package/dist/docs/assets/inter-italic-cyrillic-ext.r48I6akx.woff2 +0 -0
  74. package/dist/docs/assets/inter-italic-cyrillic.By2_1cv3.woff2 +0 -0
  75. package/dist/docs/assets/inter-italic-greek-ext.1u6EdAuj.woff2 +0 -0
  76. package/dist/docs/assets/inter-italic-greek.DJ8dCoTZ.woff2 +0 -0
  77. package/dist/docs/assets/inter-italic-latin-ext.CN1xVJS-.woff2 +0 -0
  78. package/dist/docs/assets/inter-italic-latin.C2AdPX0b.woff2 +0 -0
  79. package/dist/docs/assets/inter-italic-vietnamese.BSbpV94h.woff2 +0 -0
  80. package/dist/docs/assets/inter-roman-cyrillic-ext.BBPuwvHQ.woff2 +0 -0
  81. package/dist/docs/assets/inter-roman-cyrillic.C5lxZ8CY.woff2 +0 -0
  82. package/dist/docs/assets/inter-roman-greek-ext.CqjqNYQ-.woff2 +0 -0
  83. package/dist/docs/assets/inter-roman-greek.BBVDIX6e.woff2 +0 -0
  84. package/dist/docs/assets/inter-roman-latin-ext.4ZJIpNVo.woff2 +0 -0
  85. package/dist/docs/assets/inter-roman-latin.Di8DUHzh.woff2 +0 -0
  86. package/dist/docs/assets/inter-roman-vietnamese.BjW4sHH5.woff2 +0 -0
  87. package/dist/docs/assets/overview.md.BKVdLT3o.js +70 -0
  88. package/dist/docs/assets/overview.md.BKVdLT3o.lean.js +1 -0
  89. package/dist/docs/assets/packages-utils.md.CvgYp5Ll.js +31 -0
  90. package/dist/docs/assets/packages-utils.md.CvgYp5Ll.lean.js +1 -0
  91. package/dist/docs/assets/proxy-admin_env-and-build.md.xkeQNYS3.js +40 -0
  92. package/dist/docs/assets/proxy-admin_env-and-build.md.xkeQNYS3.lean.js +1 -0
  93. package/dist/docs/assets/proxy-admin_index.md.DBLI0n0G.js +38 -0
  94. package/dist/docs/assets/proxy-admin_index.md.DBLI0n0G.lean.js +1 -0
  95. package/dist/docs/assets/proxy-admin_layout-and-menu.md.BKGcu49p.js +48 -0
  96. package/dist/docs/assets/proxy-admin_layout-and-menu.md.BKGcu49p.lean.js +1 -0
  97. package/dist/docs/assets/proxy-admin_pages.md.m_fGvvOH.js +51 -0
  98. package/dist/docs/assets/proxy-admin_pages.md.m_fGvvOH.lean.js +1 -0
  99. package/dist/docs/assets/proxy-admin_routing-and-auth.md.DZsdFese.js +106 -0
  100. package/dist/docs/assets/proxy-admin_routing-and-auth.md.DZsdFese.lean.js +1 -0
  101. package/dist/docs/assets/proxy-admin_services-and-mock.md.sdNPcf25.js +66 -0
  102. package/dist/docs/assets/proxy-admin_services-and-mock.md.sdNPcf25.lean.js +1 -0
  103. package/dist/docs/assets/proxy-cli_api-layer.md.GfdbtEUx.js +1 -0
  104. package/dist/docs/assets/proxy-cli_api-layer.md.GfdbtEUx.lean.js +1 -0
  105. package/dist/docs/assets/proxy-cli_app-shell.md.Do18CYhW.js +83 -0
  106. package/dist/docs/assets/proxy-cli_app-shell.md.Do18CYhW.lean.js +1 -0
  107. package/dist/docs/assets/proxy-cli_components-common.md.Dd6Yazvz.js +23 -0
  108. package/dist/docs/assets/proxy-cli_components-common.md.Dd6Yazvz.lean.js +1 -0
  109. package/dist/docs/assets/proxy-cli_components-config.md.B81Y3ta2.js +46 -0
  110. package/dist/docs/assets/proxy-cli_components-config.md.B81Y3ta2.lean.js +1 -0
  111. package/dist/docs/assets/proxy-cli_components-requests.md.vN8IrwL_.js +84 -0
  112. package/dist/docs/assets/proxy-cli_components-requests.md.vN8IrwL_.lean.js +1 -0
  113. package/dist/docs/assets/proxy-cli_components-stats.md.B90esaNa.js +14 -0
  114. package/dist/docs/assets/proxy-cli_components-stats.md.B90esaNa.lean.js +1 -0
  115. package/dist/docs/assets/proxy-cli_components-status.md.C5lAzS2c.js +42 -0
  116. package/dist/docs/assets/proxy-cli_components-status.md.C5lAzS2c.lean.js +1 -0
  117. package/dist/docs/assets/proxy-cli_data-hooks.md.w9Oe1OD3.js +87 -0
  118. package/dist/docs/assets/proxy-cli_data-hooks.md.w9Oe1OD3.lean.js +1 -0
  119. package/dist/docs/assets/proxy-cli_index.md.BA6g8QD-.js +34 -0
  120. package/dist/docs/assets/proxy-cli_index.md.BA6g8QD-.lean.js +1 -0
  121. package/dist/docs/assets/proxy-cli_utils-and-i18n.md.Ch_e-g_o.js +34 -0
  122. package/dist/docs/assets/proxy-cli_utils-and-i18n.md.Ch_e-g_o.lean.js +1 -0
  123. package/dist/docs/assets/proxy-core_chat-api.md.DHihiBxR.js +152 -0
  124. package/dist/docs/assets/proxy-core_chat-api.md.DHihiBxR.lean.js +1 -0
  125. package/dist/docs/assets/proxy-core_cli.md.DCFYX4Bd.js +37 -0
  126. package/dist/docs/assets/proxy-core_cli.md.DCFYX4Bd.lean.js +1 -0
  127. package/dist/docs/assets/proxy-core_config.md.BXSOyxYE.js +83 -0
  128. package/dist/docs/assets/proxy-core_config.md.BXSOyxYE.lean.js +1 -0
  129. package/dist/docs/assets/proxy-core_data-layer.md.Cdomb3Gz.js +85 -0
  130. package/dist/docs/assets/proxy-core_data-layer.md.Cdomb3Gz.lean.js +1 -0
  131. package/dist/docs/assets/proxy-core_entry.md.BZmIcCUM.js +90 -0
  132. package/dist/docs/assets/proxy-core_entry.md.BZmIcCUM.lean.js +1 -0
  133. package/dist/docs/assets/proxy-core_index.md.BM6VV5Qe.js +55 -0
  134. package/dist/docs/assets/proxy-core_index.md.BM6VV5Qe.lean.js +1 -0
  135. package/dist/docs/assets/proxy-core_pm2.md.DUhWEtgn.js +79 -0
  136. package/dist/docs/assets/proxy-core_pm2.md.DUhWEtgn.lean.js +1 -0
  137. package/dist/docs/assets/proxy-core_providers.md.CbDZ6b_7.js +1 -0
  138. package/dist/docs/assets/proxy-core_providers.md.CbDZ6b_7.lean.js +1 -0
  139. package/dist/docs/assets/proxy-core_proxy.md.CzQYmX6X.js +46 -0
  140. package/dist/docs/assets/proxy-core_proxy.md.CzQYmX6X.lean.js +1 -0
  141. package/dist/docs/assets/proxy-core_stats.md.BsM6wuK_.js +42 -0
  142. package/dist/docs/assets/proxy-core_stats.md.BsM6wuK_.lean.js +1 -0
  143. package/dist/docs/assets/proxy-core_tool.md.B6Le1nQr.js +100 -0
  144. package/dist/docs/assets/proxy-core_tool.md.B6Le1nQr.lean.js +1 -0
  145. package/dist/docs/assets/proxy-core_ui-routes.md.Dyqkeoiv.js +27 -0
  146. package/dist/docs/assets/proxy-core_ui-routes.md.Dyqkeoiv.lean.js +1 -0
  147. package/dist/docs/assets/proxy-core_utilities.md.C18pjnkz.js +63 -0
  148. package/dist/docs/assets/proxy-core_utilities.md.C18pjnkz.lean.js +1 -0
  149. package/dist/docs/assets/quickstart.md.Cy_FmXIY.js +38 -0
  150. package/dist/docs/assets/quickstart.md.Cy_FmXIY.lean.js +1 -0
  151. package/dist/docs/assets/request-flow.md.C1fyxdPE.js +146 -0
  152. package/dist/docs/assets/request-flow.md.C1fyxdPE.lean.js +1 -0
  153. package/dist/docs/assets/style.DU_kNMWy.css +1 -0
  154. package/dist/docs/hashmap.json +1 -0
  155. package/dist/docs/index.html +25 -0
  156. package/dist/docs/overview.html +94 -0
  157. package/dist/docs/packages-utils.html +55 -0
  158. package/dist/docs/proxy-admin/env-and-build.html +64 -0
  159. package/dist/docs/proxy-admin/index.html +62 -0
  160. package/dist/docs/proxy-admin/layout-and-menu.html +72 -0
  161. package/dist/docs/proxy-admin/pages.html +75 -0
  162. package/dist/docs/proxy-admin/routing-and-auth.html +130 -0
  163. package/dist/docs/proxy-admin/services-and-mock.html +90 -0
  164. package/dist/docs/proxy-cli/api-layer.html +38 -0
  165. package/dist/docs/proxy-cli/app-shell.html +107 -0
  166. package/dist/docs/proxy-cli/components-common.html +47 -0
  167. package/dist/docs/proxy-cli/components-config.html +70 -0
  168. package/dist/docs/proxy-cli/components-requests.html +108 -0
  169. package/dist/docs/proxy-cli/components-stats.html +38 -0
  170. package/dist/docs/proxy-cli/components-status.html +66 -0
  171. package/dist/docs/proxy-cli/data-hooks.html +111 -0
  172. package/dist/docs/proxy-cli/index.html +58 -0
  173. package/dist/docs/proxy-cli/utils-and-i18n.html +58 -0
  174. package/dist/docs/proxy-core/chat-api.html +176 -0
  175. package/dist/docs/proxy-core/cli.html +61 -0
  176. package/dist/docs/proxy-core/config.html +107 -0
  177. package/dist/docs/proxy-core/data-layer.html +109 -0
  178. package/dist/docs/proxy-core/entry.html +114 -0
  179. package/dist/docs/proxy-core/index.html +79 -0
  180. package/dist/docs/proxy-core/pm2.html +103 -0
  181. package/dist/docs/proxy-core/providers.html +39 -0
  182. package/dist/docs/proxy-core/proxy.html +70 -0
  183. package/dist/docs/proxy-core/stats.html +66 -0
  184. package/dist/docs/proxy-core/tool.html +124 -0
  185. package/dist/docs/proxy-core/ui-routes.html +51 -0
  186. package/dist/docs/proxy-core/utilities.html +87 -0
  187. package/dist/docs/quickstart.html +62 -0
  188. package/dist/docs/request-flow.html +170 -0
  189. package/dist/docs/vp-icons.css +0 -0
  190. package/dist/server/proxy.js +2 -1
  191. package/dist/ui/assets/{1c-KmWe8RWs.js → 1c-DPsrzNHI.js} +1 -1
  192. package/dist/ui/assets/{abnf-BKQ6qIuo.js → abnf-DNkBIQRO.js} +1 -1
  193. package/dist/ui/assets/{abnfDiagram-VRR7QNED-CkRuDPu1.js → abnfDiagram-VRR7QNED-BqvHvzR8.js} +1 -1
  194. package/dist/ui/assets/{accesslog-DD9H5Ktc.js → accesslog-D5NxQ43Q.js} +1 -1
  195. package/dist/ui/assets/{actionscript-CAjf2Qtd.js → actionscript-DLr-LB2m.js} +1 -1
  196. package/dist/ui/assets/{ada-BXkXW16O.js → ada-BRSz3tHX.js} +1 -1
  197. package/dist/ui/assets/{angelscript-BxT7o0Up.js → angelscript-DMtEGgIa.js} +1 -1
  198. package/dist/ui/assets/{apache-C5z_tmVm.js → apache-C4gn4cSd.js} +1 -1
  199. package/dist/ui/assets/{applescript-DdIxl8rr.js → applescript-DoodcTwg.js} +1 -1
  200. package/dist/ui/assets/{arc-hSdFaqKn.js → arc-HmnzaGf9.js} +1 -1
  201. package/dist/ui/assets/{arcade-D5m0roat.js → arcade-RJZZSHSl.js} +1 -1
  202. package/dist/ui/assets/{architectureDiagram-ZJ3FMSHR-DOSHSqzf.js → architectureDiagram-ZJ3FMSHR-BUfDpSIw.js} +1 -1
  203. package/dist/ui/assets/{arduino-FDap8kq-.js → arduino-n6Dpx6Ig.js} +1 -1
  204. package/dist/ui/assets/{armasm-Kzp-Jr1v.js → armasm-DzCVITGB.js} +1 -1
  205. package/dist/ui/assets/{asciidoc-DbGMW3EE.js → asciidoc-CaqMsApq.js} +1 -1
  206. package/dist/ui/assets/{aspectj-CVYMmBCO.js → aspectj-B0kIcV0v.js} +1 -1
  207. package/dist/ui/assets/{autohotkey-9PmBGTPd.js → autohotkey-xUEXewap.js} +1 -1
  208. package/dist/ui/assets/{autoit-B4F86jgh.js → autoit-D3OfN2VX.js} +1 -1
  209. package/dist/ui/assets/{avrasm-CSzv2eHX.js → avrasm-Cbf0F4Kf.js} +1 -1
  210. package/dist/ui/assets/{awk-CjsvYvZE.js → awk-Cc0rWEwe.js} +1 -1
  211. package/dist/ui/assets/{axapta-BVgMoNRY.js → axapta-BKEeoUEe.js} +1 -1
  212. package/dist/ui/assets/{bash-IeBjW3pt.js → bash-D6JH6L3m.js} +1 -1
  213. package/dist/ui/assets/{basic-BTFJfmV1.js → basic-ka6JXc9C.js} +1 -1
  214. package/dist/ui/assets/{blockDiagram-677ZJIJ3-DLw3Bbhf.js → blockDiagram-677ZJIJ3-BHXRSjnM.js} +1 -1
  215. package/dist/ui/assets/{bnf-rCkeRYk0.js → bnf-Bxclk5tZ.js} +1 -1
  216. package/dist/ui/assets/{brainfuck-DBHuB3uZ.js → brainfuck--s_Fd8b9.js} +1 -1
  217. package/dist/ui/assets/{coq-TwFFolHa.js → c-BsgdDna0.js} +1 -1
  218. package/dist/ui/assets/{c-like-CK1xGeX_.js → c-like-CNkOkbqh.js} +1 -1
  219. package/dist/ui/assets/{c4Diagram-LMCZKHZV-cqY51yJw.js → c4Diagram-LMCZKHZV-Bp1uSrW8.js} +1 -1
  220. package/dist/ui/assets/{cal-BxGPpEZK.js → cal-LVlIOy9W.js} +1 -1
  221. package/dist/ui/assets/{capnproto-Bo2fgXF9.js → capnproto-r9DiQ1H8.js} +1 -1
  222. package/dist/ui/assets/{ceylon-C4Bb4pNB.js → ceylon-CTNzyZJX.js} +1 -1
  223. package/dist/ui/assets/channel-_rFUXR2i.js +1 -0
  224. package/dist/ui/assets/{chunk-2Q5K7J3B-CGTiTBmo.js → chunk-2Q5K7J3B-nnLVtUW3.js} +1 -1
  225. package/dist/ui/assets/{chunk-32BRIVSS-DWagYBp9.js → chunk-32BRIVSS-BDNS6igp.js} +1 -1
  226. package/dist/ui/assets/{chunk-5VM5RSS4-BzSBMKJX.js → chunk-5VM5RSS4-D713xBhI.js} +1 -1
  227. package/dist/ui/assets/{chunk-EX3LRPZG-4-aKwCgZ.js → chunk-EX3LRPZG-DExsU6Rd.js} +1 -1
  228. package/dist/ui/assets/{chunk-JWPE2WC7-CPC_cBN0.js → chunk-JWPE2WC7-DcpW5RnW.js} +1 -1
  229. package/dist/ui/assets/{chunk-MOJQB5TN-DrDE4H9w.js → chunk-MOJQB5TN-BQiSZNTn.js} +1 -1
  230. package/dist/ui/assets/{chunk-RYQCIY6F-DkdXe_kU.js → chunk-RYQCIY6F-DfblgZPd.js} +1 -1
  231. package/dist/ui/assets/{chunk-V7JOEXUC-Da6EWcQt.js → chunk-V7JOEXUC-np--VgmN.js} +1 -1
  232. package/dist/ui/assets/{chunk-VR4S4FIN-nP6dstD5.js → chunk-VR4S4FIN-BG0IhjO6.js} +1 -1
  233. package/dist/ui/assets/{chunk-XXDRQBXY-Bi_rRAPA.js → chunk-XXDRQBXY-DHuoh-RB.js} +1 -1
  234. package/dist/ui/assets/classDiagram-OUVF2IWQ-DqgbMzM1.js +1 -0
  235. package/dist/ui/assets/classDiagram-v2-EOCWNBFH-DqgbMzM1.js +1 -0
  236. package/dist/ui/assets/{clean-cc1m9AxK.js → clean-CtVj0-EB.js} +1 -1
  237. package/dist/ui/assets/{clojure-DX5V8QA8.js → clojure-CZwle60-.js} +1 -1
  238. package/dist/ui/assets/{clojure-repl-FzjnVNWQ.js → clojure-repl-DJXWH00I.js} +1 -1
  239. package/dist/ui/assets/{cmake-COZZyrKs.js → cmake-Boxf0e7r.js} +1 -1
  240. package/dist/ui/assets/{coffeescript-DBsnOmC4.js → coffeescript-h85ZW4Gm.js} +1 -1
  241. package/dist/ui/assets/{c-C95V0zHL.js → coq-CVLui3m8.js} +1 -1
  242. package/dist/ui/assets/{cos-Dm5g-IQT.js → cos-CL0igafw.js} +1 -1
  243. package/dist/ui/assets/{cose-bilkent-JH36ORCC-B3-weOQF.js → cose-bilkent-JH36ORCC-CnXyotYB.js} +1 -1
  244. package/dist/ui/assets/{cpp-_RZxQjg7.js → cpp-vite1NvJ.js} +1 -1
  245. package/dist/ui/assets/{crmsh-DGPJ11Gt.js → crmsh-DqT9g0Iq.js} +1 -1
  246. package/dist/ui/assets/{crystal-BOMSPGge.js → crystal-Oans-K8G.js} +1 -1
  247. package/dist/ui/assets/{csharp-DZXiHH72.js → csharp-sCaDAzIB.js} +1 -1
  248. package/dist/ui/assets/{csp-DDSIMUoU.js → csp-rMcp93pK.js} +1 -1
  249. package/dist/ui/assets/{css-Bjye-ZWr.js → css-BwDLHi_h.js} +1 -1
  250. package/dist/ui/assets/{cynefin-VYW2F7L2-Cj5c4L3y.js → cynefin-VYW2F7L2-D8Bmecdd.js} +1 -1
  251. package/dist/ui/assets/{cynefinDiagram-TSTJHNR4-BYsfTeNX.js → cynefinDiagram-TSTJHNR4-BT2YFmPZ.js} +1 -1
  252. package/dist/ui/assets/{d-22pfurOx.js → d-BFgZm0RV.js} +1 -1
  253. package/dist/ui/assets/{dagre-VKFMJZFB-DiEob-by.js → dagre-VKFMJZFB-BeJU73ex.js} +1 -1
  254. package/dist/ui/assets/{dart-Doiu8cDW.js → dart-rIo85iL3.js} +1 -1
  255. package/dist/ui/assets/{delphi-CQ7epp84.js → delphi-Bi2Rfp1o.js} +1 -1
  256. package/dist/ui/assets/{diagram-FQU43EPY-BOPbQcL4.js → diagram-FQU43EPY-CHQiS5Fr.js} +1 -1
  257. package/dist/ui/assets/{diagram-G47NLZAW-C1UWDJTx.js → diagram-G47NLZAW-EVerd4V8.js} +1 -1
  258. package/dist/ui/assets/{diagram-NH7WQ7WH-CYsBqW3J.js → diagram-NH7WQ7WH-DMP0VOAs.js} +1 -1
  259. package/dist/ui/assets/{diagram-OA4YK3LP-Dnag0x_3.js → diagram-OA4YK3LP-CAur5jK9.js} +1 -1
  260. package/dist/ui/assets/{diagram-WEI45ONY-Bo4CsDoj.js → diagram-WEI45ONY-DvmKkPH7.js} +1 -1
  261. package/dist/ui/assets/{diff-Cs6VQQZt.js → diff-CZZCIG00.js} +1 -1
  262. package/dist/ui/assets/{django-Bo3okOrw.js → django-D88PKHy-.js} +1 -1
  263. package/dist/ui/assets/{dns-BpG60eIX.js → dns-DX4hzjUh.js} +1 -1
  264. package/dist/ui/assets/{dockerfile-BWyH8SlV.js → dockerfile-1lgzEXn1.js} +1 -1
  265. package/dist/ui/assets/{dos-DWlNbaB9.js → dos-CwrC1ROy.js} +1 -1
  266. package/dist/ui/assets/{dsconfig-D_8y8YrJ.js → dsconfig-tvVdBv4w.js} +1 -1
  267. package/dist/ui/assets/{dts-Cz4SyMYR.js → dts-DTgQkdRs.js} +1 -1
  268. package/dist/ui/assets/{dust-Cu4qLkeH.js → dust-BbLlyCpf.js} +1 -1
  269. package/dist/ui/assets/{ebnf-CTVHui3r.js → ebnf-D6Dc4oRr.js} +1 -1
  270. package/dist/ui/assets/{ebnfDiagram-CCIWWBDH-epcXQLEj.js → ebnfDiagram-CCIWWBDH-Kvilk1RF.js} +1 -1
  271. package/dist/ui/assets/{elixir-MAlwXhfU.js → elixir-CnMolQVs.js} +1 -1
  272. package/dist/ui/assets/{elm-Bdmwbvef.js → elm-BQ7VQFn7.js} +1 -1
  273. package/dist/ui/assets/{erDiagram-Q63AITRT-Bb60TqAM.js → erDiagram-Q63AITRT-C-S9oHZd.js} +1 -1
  274. package/dist/ui/assets/{erb-Ce9TpP4g.js → erb-B_1g6fXE.js} +1 -1
  275. package/dist/ui/assets/{erlang-CN2GEiqk.js → erlang-3b3ITXJu.js} +1 -1
  276. package/dist/ui/assets/{erlang-repl-D8K4O_cp.js → erlang-repl-Cy6Z3TdH.js} +1 -1
  277. package/dist/ui/assets/{excel-eVZU1r0f.js → excel-DtkATto8.js} +1 -1
  278. package/dist/ui/assets/{fix-BzKerEv0.js → fix-DsEG7TDI.js} +1 -1
  279. package/dist/ui/assets/{flix-B9CE3skV.js → flix-CQ-rKwGO.js} +1 -1
  280. package/dist/ui/assets/{flowDiagram-23GEKE2U-DzMLZIyt.js → flowDiagram-23GEKE2U-EbHDNMCC.js} +1 -1
  281. package/dist/ui/assets/{fortran-B4__3vos.js → fortran-AqzaRCEt.js} +1 -1
  282. package/dist/ui/assets/{fsharp-BJ3-ARHz.js → fsharp-CCzWGasu.js} +1 -1
  283. package/dist/ui/assets/{gams-Cu43oSYT.js → gams-Bqa6CB_r.js} +1 -1
  284. package/dist/ui/assets/{ganttDiagram-NO4QXBWP-D_aAoMRP.js → ganttDiagram-NO4QXBWP-B6jvc6O7.js} +1 -1
  285. package/dist/ui/assets/{gauss-T8vk_TpE.js → gauss-D4Utubeh.js} +1 -1
  286. package/dist/ui/assets/{gcode-9j3BicpZ.js → gcode-By3KwWjb.js} +1 -1
  287. package/dist/ui/assets/{gherkin-Dyh5KFG-.js → gherkin-PXOPjT7Y.js} +1 -1
  288. package/dist/ui/assets/{gitGraphDiagram-IHSO6WYX-CMxCHC-Z.js → gitGraphDiagram-IHSO6WYX-C5l6rHvK.js} +1 -1
  289. package/dist/ui/assets/{glsl-DWWjN4ts.js → glsl-KmmyBk93.js} +1 -1
  290. package/dist/ui/assets/{gml-BcYE-D5A.js → gml-C1Qw_Nrt.js} +1 -1
  291. package/dist/ui/assets/{go-DUnUzOEI.js → go-DaBQtdp1.js} +1 -1
  292. package/dist/ui/assets/{golo-BDoc1QQL.js → golo-D7PDzNpb.js} +1 -1
  293. package/dist/ui/assets/{gradle-B_WRa_bT.js → gradle-nXueCYH-.js} +1 -1
  294. package/dist/ui/assets/{groovy-CgjqFq1e.js → groovy-DFDsQDhl.js} +1 -1
  295. package/dist/ui/assets/{haml-DCqcg7Ti.js → haml-B_zxHzy_.js} +1 -1
  296. package/dist/ui/assets/{handlebars-DSDUQrnw.js → handlebars-BdMY-8KA.js} +1 -1
  297. package/dist/ui/assets/{haskell-DPVnctVi.js → haskell-CftsIPps.js} +1 -1
  298. package/dist/ui/assets/{haxe-BuCGXBa4.js → haxe-BFZb0OIE.js} +1 -1
  299. package/dist/ui/assets/{hsp-BTKpS_u0.js → hsp-EPTuqwtZ.js} +1 -1
  300. package/dist/ui/assets/{htmlbars-Cql3Jvy2.js → htmlbars-B7ZSC-iN.js} +1 -1
  301. package/dist/ui/assets/{http-BB8I9jUh.js → http-BxSd_aa1.js} +1 -1
  302. package/dist/ui/assets/{hy-DG7xkZNz.js → hy-D-rBN9MQ.js} +1 -1
  303. package/dist/ui/assets/index-CWFn1h-J.css +10 -0
  304. package/dist/ui/assets/{index-CfTIGTiY.js → index-DSGZBcd1.js} +166 -171
  305. package/dist/ui/assets/{index-DqIiCkSD.js → index-Dlp8uGHu.js} +3 -3
  306. package/dist/ui/assets/{infoDiagram-FWYZ7A6U-DIzEV-BJ.js → infoDiagram-FWYZ7A6U-BOF_kBqe.js} +1 -1
  307. package/dist/ui/assets/{inform7-BWNpVEkA.js → inform7-OjpbRXZf.js} +1 -1
  308. package/dist/ui/assets/{ini-BMw_C8EP.js → ini-Dc-QApXQ.js} +1 -1
  309. package/dist/ui/assets/{irpf90-Cy42ibFZ.js → irpf90-C4OfYiST.js} +1 -1
  310. package/dist/ui/assets/{isbl-CjFSc0hz.js → isbl-9km6K6Sf.js} +1 -1
  311. package/dist/ui/assets/{ishikawaDiagram-FXEZZL3T-BZcxp5am.js → ishikawaDiagram-FXEZZL3T-BvKSD8LY.js} +1 -1
  312. package/dist/ui/assets/{java-BDxe9dp1.js → java-C2mOf3QX.js} +1 -1
  313. package/dist/ui/assets/{javascript-CgLkkj7h.js → javascript-_i0Q5MkQ.js} +1 -1
  314. package/dist/ui/assets/{jboss-cli-C8biclrb.js → jboss-cli-BS5ipQOv.js} +1 -1
  315. package/dist/ui/assets/{journeyDiagram-5HDEW3XC-BbJu6m6Q.js → journeyDiagram-5HDEW3XC-yKdSl63P.js} +1 -1
  316. package/dist/ui/assets/{json-BjJKhmM6.js → json-Dci0MO4x.js} +1 -1
  317. package/dist/ui/assets/{julia-DvKEpg-R.js → julia-bEqo4nlV.js} +1 -1
  318. package/dist/ui/assets/{julia-repl-BDJWZxkU.js → julia-repl-Co6hf47q.js} +1 -1
  319. package/dist/ui/assets/{kanban-definition-HUTT4EX6-DeIVPlbv.js → kanban-definition-HUTT4EX6-B7BbZCd6.js} +1 -1
  320. package/dist/ui/assets/{kotlin-DCoXcnEb.js → kotlin-krx8WewB.js} +1 -1
  321. package/dist/ui/assets/{lasso-C7m0QmV2.js → lasso-d3ZTv9Tj.js} +1 -1
  322. package/dist/ui/assets/{latex-SHnTG9Eq.js → latex-BNWbHYxK.js} +1 -1
  323. package/dist/ui/assets/{ldif-_6hUnKPV.js → ldif-Bs8eb63L.js} +1 -1
  324. package/dist/ui/assets/{leaf-Co9qxlaF.js → leaf-BTbRDVWB.js} +1 -1
  325. package/dist/ui/assets/{less-CJRDPwNA.js → less-DH5cqJTD.js} +1 -1
  326. package/dist/ui/assets/{lisp-JEHGYbiW.js → lisp-CBUvBYtR.js} +1 -1
  327. package/dist/ui/assets/{livecodeserver-BSYaUj4k.js → livecodeserver-CkM7-E4a.js} +1 -1
  328. package/dist/ui/assets/{livescript-WQMCQeuz.js → livescript-DomXyXUO.js} +1 -1
  329. package/dist/ui/assets/{llvm-DnAHqj5I.js → llvm-e_-ff59-.js} +1 -1
  330. package/dist/ui/assets/{lsl--k-ghYia.js → lsl-BNDsGOmv.js} +1 -1
  331. package/dist/ui/assets/{lua-CXb23hbC.js → lua-_ZmkXwc_.js} +1 -1
  332. package/dist/ui/assets/{makefile-CM7o86yn.js → makefile-BhG7cThe.js} +1 -1
  333. package/dist/ui/assets/{markdown-HB3HvChQ.js → markdown-ClW2SRy6.js} +1 -1
  334. package/dist/ui/assets/{mathematica-9NTuf22N.js → mathematica-kqoCR611.js} +1 -1
  335. package/dist/ui/assets/{matlab-CWv-ik4r.js → matlab-DqawyK3q.js} +1 -1
  336. package/dist/ui/assets/{maxima-CqYiKCrw.js → maxima-B0qzCXe1.js} +1 -1
  337. package/dist/ui/assets/{mel-BbsRpUm5.js → mel-BZaSas3B.js} +1 -1
  338. package/dist/ui/assets/{mercury-Cz2j4HhU.js → mercury-ByD0wyJH.js} +1 -1
  339. package/dist/ui/assets/{mindmap-definition-LN4V7U3C-WyJS8oye.js → mindmap-definition-LN4V7U3C-Ce6QsaH5.js} +1 -1
  340. package/dist/ui/assets/{mipsasm-BqWSRbQV.js → mipsasm-B08lqZSo.js} +1 -1
  341. package/dist/ui/assets/{mizar-JLBfQ6vt.js → mizar-7iaUqWPq.js} +1 -1
  342. package/dist/ui/assets/{mojolicious-D0LbMmyk.js → mojolicious-CbH-d8Wh.js} +1 -1
  343. package/dist/ui/assets/{monkey-DAGL6-JN.js → monkey-D5z6-hFH.js} +1 -1
  344. package/dist/ui/assets/{moonscript-DzbwNSKy.js → moonscript-DuLd7pdm.js} +1 -1
  345. package/dist/ui/assets/{n1ql-dkgKq6Yv.js → n1ql-EbVfQMfD.js} +1 -1
  346. package/dist/ui/assets/{nginx-AUoaDPV4.js → nginx-D-4AxpHP.js} +1 -1
  347. package/dist/ui/assets/{nim-CdqYmVrl.js → nim-wPHQEX5v.js} +1 -1
  348. package/dist/ui/assets/{nix-CxmVjwwo.js → nix-6SVkxAXi.js} +1 -1
  349. package/dist/ui/assets/{node-repl-B1Z3zUAh.js → node-repl-CaFKEOyj.js} +1 -1
  350. package/dist/ui/assets/{nsis-CTAuPWhe.js → nsis-BmqbwVv_.js} +1 -1
  351. package/dist/ui/assets/{objectivec-CvbKeAPz.js → objectivec-BX0R-sI2.js} +1 -1
  352. package/dist/ui/assets/{ocaml-DCiyXKOH.js → ocaml-CyfdrIqo.js} +1 -1
  353. package/dist/ui/assets/{openscad-CPGUwmeR.js → openscad-B5qfaF1E.js} +1 -1
  354. package/dist/ui/assets/{oxygene-CI_bD1Gw.js → oxygene-CmlCgXLr.js} +1 -1
  355. package/dist/ui/assets/{parser3-C91CVs85.js → parser3-DdpPyZkn.js} +1 -1
  356. package/dist/ui/assets/{pegDiagram-2B236MQR-yF8AW7GR.js → pegDiagram-2B236MQR-ByyVqaXh.js} +1 -1
  357. package/dist/ui/assets/{perl-ChxfKl-n.js → perl-D3qc2wEe.js} +1 -1
  358. package/dist/ui/assets/{pf-CKCHkzIA.js → pf-Bv3zza37.js} +1 -1
  359. package/dist/ui/assets/{pgsql-BwOP20uH.js → pgsql-BZIppw1a.js} +1 -1
  360. package/dist/ui/assets/{php-B7Rs2tM5.js → php-D1ScecZC.js} +1 -1
  361. package/dist/ui/assets/{php-template-Cx-Fh4AR.js → php-template-sEqzzKWJ.js} +1 -1
  362. package/dist/ui/assets/{pieDiagram-ENE6RG2P-BS4hnGNX.js → pieDiagram-ENE6RG2P-T1OgWN3l.js} +1 -1
  363. package/dist/ui/assets/{plaintext-U7qkdtgS.js → plaintext-DO7Jy_T2.js} +1 -1
  364. package/dist/ui/assets/{pony-_fGYgePh.js → pony-CTXTp2Tb.js} +1 -1
  365. package/dist/ui/assets/{powershell-CFBTcUce.js → powershell-C9lzZsbj.js} +1 -1
  366. package/dist/ui/assets/{processing-BWHneU0K.js → processing-hzJAP_Li.js} +1 -1
  367. package/dist/ui/assets/{profile-BJ-HxhzS.js → profile-bFiAkh7e.js} +1 -1
  368. package/dist/ui/assets/{prolog-ChHo7n6L.js → prolog-CE0trHSn.js} +1 -1
  369. package/dist/ui/assets/{properties-e_DOYclC.js → properties-MeANnTVc.js} +1 -1
  370. package/dist/ui/assets/{protobuf-5aGSIv7w.js → protobuf-S-rp7SK0.js} +1 -1
  371. package/dist/ui/assets/{puppet-D2vQatzX.js → puppet-B5YT8Ct1.js} +1 -1
  372. package/dist/ui/assets/{purebasic-n6krfaeF.js → purebasic-DO-5HeDl.js} +1 -1
  373. package/dist/ui/assets/{python-CbIo0XxP.js → python-DVGTQbwU.js} +1 -1
  374. package/dist/ui/assets/{python-repl-BpIq9kyr.js → python-repl-CQ4VlKLC.js} +1 -1
  375. package/dist/ui/assets/{q-jntnvcCx.js → q-nS96imov.js} +1 -1
  376. package/dist/ui/assets/{qml-BafQlZNV.js → qml-BkzkCgUU.js} +1 -1
  377. package/dist/ui/assets/{quadrantDiagram-ABIIQ3AL-C3Th8mUJ.js → quadrantDiagram-ABIIQ3AL-BkaCzlXD.js} +1 -1
  378. package/dist/ui/assets/{r-CHgvQFLK.js → r-y4Q5t85r.js} +1 -1
  379. package/dist/ui/assets/{railroadDiagram-RFXS5EU6-CMQkbGJl.js → railroadDiagram-RFXS5EU6-C1lbwk19.js} +1 -1
  380. package/dist/ui/assets/{reasonml-DNwlPD_T.js → reasonml-Bzhzc5Ao.js} +1 -1
  381. package/dist/ui/assets/{requirementDiagram-TGXJPOKE-B70_oR7v.js → requirementDiagram-TGXJPOKE-C8Rw6N2I.js} +1 -1
  382. package/dist/ui/assets/{rib-CX4e9JSF.js → rib-BP3Y9dW3.js} +1 -1
  383. package/dist/ui/assets/{roboconf-ee4qsPGf.js → roboconf-87QE7cIh.js} +1 -1
  384. package/dist/ui/assets/{routeros-BJSwvu2L.js → routeros-BV3nt8wW.js} +1 -1
  385. package/dist/ui/assets/{rsl-BiKdMl_F.js → rsl-DfQf4CW_.js} +1 -1
  386. package/dist/ui/assets/{ruby-CAXTU5LY.js → ruby-DQxFKbgX.js} +1 -1
  387. package/dist/ui/assets/{ruleslanguage-C1kgDGXM.js → ruleslanguage-B8oCm_aw.js} +1 -1
  388. package/dist/ui/assets/{rust-DyEf_GXL.js → rust-DzZgPf9W.js} +1 -1
  389. package/dist/ui/assets/{sankeyDiagram-HTMAVEWB-CvUfseMg.js → sankeyDiagram-HTMAVEWB-Dxiuo8Hz.js} +1 -1
  390. package/dist/ui/assets/{sas-Q1rlUxPH.js → sas-CFh-Rsrv.js} +1 -1
  391. package/dist/ui/assets/{scala-Dg6KNmge.js → scala-3UDyJBiS.js} +1 -1
  392. package/dist/ui/assets/{scheme-D9iooUxI.js → scheme-KaUTge9W.js} +1 -1
  393. package/dist/ui/assets/{scilab-CztEJXJY.js → scilab-CLSBZzuh.js} +1 -1
  394. package/dist/ui/assets/{scss-BMh-JkdE.js → scss-DaEkfHWX.js} +1 -1
  395. package/dist/ui/assets/{sequenceDiagram-DBY2YBRQ-DB0c9kf4.js → sequenceDiagram-DBY2YBRQ-Cv__zR2v.js} +1 -1
  396. package/dist/ui/assets/{shell-DWo6z0MG.js → shell-B0d4cZTk.js} +1 -1
  397. package/dist/ui/assets/{sizeCapture-X5ZJPWSS-BcQlgjfD.js → sizeCapture-X5ZJPWSS-C4nD-ShQ.js} +1 -1
  398. package/dist/ui/assets/{smali-Cijeb6pL.js → smali-CLhfky4R.js} +1 -1
  399. package/dist/ui/assets/{smalltalk-D0lvqa_d.js → smalltalk-B4aaTMO5.js} +1 -1
  400. package/dist/ui/assets/{sml-B-vqWZ3b.js → sml-x4CTxWEZ.js} +1 -1
  401. package/dist/ui/assets/{sqf-BJ-1Q583.js → sqf-G_0vdVVs.js} +1 -1
  402. package/dist/ui/assets/{sql-CMGLxEYV.js → sql-C--WH0Fo.js} +1 -1
  403. package/dist/ui/assets/{sql_more-gsRmbNCH.js → sql_more-B4LrzCtd.js} +1 -1
  404. package/dist/ui/assets/{stan-D1AlTSpf.js → stan-CACDFOA0.js} +1 -1
  405. package/dist/ui/assets/{stata-DnEYviI0.js → stata-BP9M7sZt.js} +1 -1
  406. package/dist/ui/assets/{stateDiagram-2N3HPSRC-BSRgVsHO.js → stateDiagram-2N3HPSRC-z3-31Cr2.js} +1 -1
  407. package/dist/ui/assets/stateDiagram-v2-6OUMAXLB-BKIXFHzO.js +1 -0
  408. package/dist/ui/assets/{step21-DbQV9sMo.js → step21-MAOu4dNb.js} +1 -1
  409. package/dist/ui/assets/{stylus-Cyc7vdUc.js → stylus-CpuP3pvE.js} +1 -1
  410. package/dist/ui/assets/{subunit-16ipyMie.js → subunit-NWzuqFhT.js} +1 -1
  411. package/dist/ui/assets/{swift-DTNnw4qS.js → swift-DuFKNmKv.js} +1 -1
  412. package/dist/ui/assets/{swimlanes-5IMT3BWC-DgOdcc4_.js → swimlanes-5IMT3BWC-E463-rXd.js} +2 -2
  413. package/dist/ui/assets/swimlanesDiagram-G3AALYLV-CkQvBOYs.js +8 -0
  414. package/dist/ui/assets/{taggerscript-DM6pvUWE.js → taggerscript-BDnv2jvg.js} +1 -1
  415. package/dist/ui/assets/{tap-Ch-uyKZq.js → tap-aB2cLXdf.js} +1 -1
  416. package/dist/ui/assets/{tcl-D0T_V5dA.js → tcl-7WepIaIa.js} +1 -1
  417. package/dist/ui/assets/{thrift-D9xJjYw4.js → thrift-BLh6pdjc.js} +1 -1
  418. package/dist/ui/assets/{timeline-definition-FHXFAJF6-BBeDMHxb.js → timeline-definition-FHXFAJF6-FA_RNhFQ.js} +1 -1
  419. package/dist/ui/assets/{tp-kUrCGo9X.js → tp-D1rt5u_j.js} +1 -1
  420. package/dist/ui/assets/{twig-Cgub6rxA.js → twig-DgfeYg4W.js} +1 -1
  421. package/dist/ui/assets/{typescript-BxNP9Ap9.js → typescript-oU560Q8V.js} +1 -1
  422. package/dist/ui/assets/{vala-DF9ZZagU.js → vala-DlXsaz2B.js} +1 -1
  423. package/dist/ui/assets/{vbnet-Cf46ypDg.js → vbnet-BjpxjeMZ.js} +1 -1
  424. package/dist/ui/assets/{vbscript-DNs-QKLH.js → vbscript-DfNdtdO3.js} +1 -1
  425. package/dist/ui/assets/{vbscript-html-DyS6I5L1.js → vbscript-html-D09WPsgK.js} +1 -1
  426. package/dist/ui/assets/{vennDiagram-L72KCM5P-8WpWycE-.js → vennDiagram-L72KCM5P-zaCDWwTs.js} +1 -1
  427. package/dist/ui/assets/{verilog-CF5wC4X-.js → verilog-B9vENtLK.js} +1 -1
  428. package/dist/ui/assets/{vhdl-Dm0jpDMn.js → vhdl-CJLTZOu1.js} +1 -1
  429. package/dist/ui/assets/{vim-nyO2DRAx.js → vim-FuPhupu9.js} +1 -1
  430. package/dist/ui/assets/{wardleyDiagram-EHGQE667-UeIOK-jv.js → wardleyDiagram-EHGQE667-BS8ApwmV.js} +1 -1
  431. package/dist/ui/assets/{x86asm-BNw2-6GG.js → x86asm-kX_Cp6wB.js} +1 -1
  432. package/dist/ui/assets/{xl-D-YHxr6V.js → xl-MuHNmLUj.js} +1 -1
  433. package/dist/ui/assets/{xml-BijAlrow.js → xml-Mbn2z12n.js} +1 -1
  434. package/dist/ui/assets/{xquery-z0wxWBKz.js → xquery-Dy4lt-m-.js} +1 -1
  435. package/dist/ui/assets/{xychartDiagram-FW5EYKEG-BNzHLweN.js → xychartDiagram-FW5EYKEG-DoNZtZus.js} +1 -1
  436. package/dist/ui/assets/{yaml-n5TIQArR.js → yaml-CxxAisfE.js} +1 -1
  437. package/dist/ui/assets/{zephir-DrGhH8jG.js → zephir-WWG8qyld.js} +1 -1
  438. package/dist/ui/index.html +2 -2
  439. package/package.json +2 -2
  440. package/dist/ui/assets/channel-D9Y4iN1l.js +0 -1
  441. package/dist/ui/assets/classDiagram-OUVF2IWQ-C4UVH6RI.js +0 -1
  442. package/dist/ui/assets/classDiagram-v2-EOCWNBFH-C4UVH6RI.js +0 -1
  443. package/dist/ui/assets/index-CK_lJsTu.css +0 -10
  444. package/dist/ui/assets/stateDiagram-v2-6OUMAXLB-BLdfpGJO.js +0 -1
  445. package/dist/ui/assets/swimlanesDiagram-G3AALYLV-DRVnkg3M.js +0 -8
@@ -0,0 +1,70 @@
1
+ import{_ as a,o as t,c as i,a2 as e}from"./chunks/framework.D_Xv2a7c.js";const k=JSON.parse('{"title":"00. 项目总览","description":"","frontmatter":{},"headers":[],"relativePath":"overview.md","filePath":"overview.md"}'),n={name:"overview.md"};function o(l,s,p,d,r,c){return t(),i("div",null,[...s[0]||(s[0]=[e(`<h1 id="_00-项目总览" tabindex="-1">00. 项目总览 <a class="header-anchor" href="#_00-项目总览" aria-label="Permalink to &quot;00. 项目总览&quot;">​</a></h1><h2 id="本文档覆盖的源文件" tabindex="-1">本文档覆盖的源文件 <a class="header-anchor" href="#本文档覆盖的源文件" aria-label="Permalink to &quot;本文档覆盖的源文件&quot;">​</a></h2><ul><li><code>README.md</code></li><li><code>package.json</code></li><li><code>pnpm-workspace.yaml</code></li><li><code>tsconfig.base.json</code></li><li><code>apps/proxy-core/package.json</code></li><li><code>apps/proxy-cli/package.json</code></li><li><code>apps/proxy-admin/package.json</code></li><li><code>packages/utils/package.json</code></li></ul><h2 id="项目定位" tabindex="-1">项目定位 <a class="header-anchor" href="#项目定位" aria-label="Permalink to &quot;项目定位&quot;">​</a></h2><p><code>cc-monitoring</code> 是「Claude Code 代理 + 监控系统」,同时解决两个问题:</p><ol><li><strong>网络接入</strong>:国内开发者无法直连 Anthropic API,需要一个可控的中转层</li><li><strong>可观测</strong>:所有 Claude Code 请求/响应可以被记录、检索、对比、统计</li></ol><p>它不是单一进程,而是一套 monorepo:<strong>一个 Fastify 代理服务</strong>(proxy-core)+ <strong>两套 Web 面板</strong>(proxy-cli / proxy-admin)+ <strong>公共工具包</strong>(packages/utils)。用户改一个 API endpoint 即可用上代理,同时获得请求历史、日志流、Token 统计、多供应商切换、系统管理等能力。</p><h2 id="monorepo-结构" tabindex="-1">Monorepo 结构 <a class="header-anchor" href="#monorepo-结构" aria-label="Permalink to &quot;Monorepo 结构&quot;">​</a></h2><div class="language- vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>cc-monitoring/</span></span>
2
+ <span class="line"><span>├── apps/</span></span>
3
+ <span class="line"><span>│ ├── proxy-core/ # Fastify + PM2 + Commander CLI + SQLite(后端)</span></span>
4
+ <span class="line"><span>│ ├── proxy-cli/ # React 面板:状态/日志/请求/配置/供应商(Vite 打包,proxy-core 静态托管)</span></span>
5
+ <span class="line"><span>│ └── proxy-admin/ # React 后台:用户/供应商/日志/系统(独立 Vite 项目,目前 Mock 数据)</span></span>
6
+ <span class="line"><span>├── packages/</span></span>
7
+ <span class="line"><span>│ └── utils/ # 通用工具函数(@cc/utils)</span></span>
8
+ <span class="line"><span>├── docs/ # 本目录</span></span>
9
+ <span class="line"><span>├── pnpm-workspace.yaml # workspace 定义(apps/* + packages/*)</span></span>
10
+ <span class="line"><span>├── tsconfig.base.json # 共享 TS 配置</span></span>
11
+ <span class="line"><span>└── package.json # 根 script + 便捷 CLI 别名</span></span></code></pre></div><p><code>pnpm-workspace.yaml</code> 声明两个通配符:</p><div class="language-yaml vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">yaml</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">packages</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">:</span></span>
12
+ <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> - </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;apps/*&#39;</span></span>
13
+ <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> - </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;packages/*&#39;</span></span>
14
+ <span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">allowBuilds</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">:</span></span>
15
+ <span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> better-sqlite3</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">true</span></span>
16
+ <span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> esbuild</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">true</span></span>
17
+ <span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> msw</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">true</span></span></code></pre></div><p><code>allowBuilds</code> 是 pnpm 8+ 的安全策略:仅允许列出的三个原生依赖执行安装脚本(<code>better-sqlite3</code> 编译 SQLite,<code>esbuild</code> 下载二进制,<code>msw</code> 生成 service worker)。</p><h2 id="应用依赖图" tabindex="-1">应用依赖图 <a class="header-anchor" href="#应用依赖图" aria-label="Permalink to &quot;应用依赖图&quot;">​</a></h2><div class="language-mermaid vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">mermaid</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">graph LR</span></span>
18
+ <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> subgraph external[&quot;外部&quot;]</span></span>
19
+ <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> CC[&quot;Claude Code Client&quot;]</span></span>
20
+ <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> UP[&quot;上游 AI API&lt;br/&gt;(Anthropic/阿里云/火山)&quot;]</span></span>
21
+ <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> MCPS[&quot;MCP Server&lt;br/&gt;(stdio/sse/streamable-http)&quot;]</span></span>
22
+ <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> end</span></span>
23
+ <span class="line"></span>
24
+ <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> subgraph mono[&quot;cc-monitoring (Monorepo)&quot;]</span></span>
25
+ <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> subgraph core[&quot;apps/proxy-core&quot;]</span></span>
26
+ <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> PROXY[&quot;Fastify Proxy&lt;br/&gt;/v1/*&lt;br/&gt;纯代理&quot;]</span></span>
27
+ <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> CHAT[&quot;/api/chat&lt;br/&gt;MCP-enhanced&quot;]</span></span>
28
+ <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> MCP[&quot;McpManager&lt;br/&gt;mcp-manager + mcp-db&quot;]</span></span>
29
+ <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> TOOLS[&quot;tools/registry&lt;br/&gt;+ mcp-bridge&quot;]</span></span>
30
+ <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> UI_API[&quot;UI API&lt;br/&gt;/ui/api/*&quot;]</span></span>
31
+ <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> WS[&quot;WebSocket&lt;br/&gt;logs / data&quot;]</span></span>
32
+ <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> STATIC[&quot;Static /ui/**&lt;br/&gt;(mount proxy-cli/dist)&quot;]</span></span>
33
+ <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> DB[(&quot;SQLite&lt;br/&gt;requests / stats / providers / mcp_servers&quot;)]</span></span>
34
+ <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> PM2[&quot;PM2 daemon&lt;br/&gt;ecosystem.config.cjs&quot;]</span></span>
35
+ <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> end</span></span>
36
+ <span class="line"></span>
37
+ <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> subgraph cli[&quot;apps/proxy-cli&quot;]</span></span>
38
+ <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> CLI_UI[&quot;React 面板&lt;br/&gt;(打包后由 proxy-core 托管)&quot;]</span></span>
39
+ <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> end</span></span>
40
+ <span class="line"></span>
41
+ <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> subgraph admin[&quot;apps/proxy-admin&quot;]</span></span>
42
+ <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> ADMIN_UI[&quot;React 后台&lt;br/&gt;(独立部署,vite-plugin-mock)&quot;]</span></span>
43
+ <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> end</span></span>
44
+ <span class="line"></span>
45
+ <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> UTILS[&quot;packages/utils&lt;br/&gt;@cc/utils&quot;]</span></span>
46
+ <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> end</span></span>
47
+ <span class="line"></span>
48
+ <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> CC --&gt;|&quot;POST /v1/*&quot;| PROXY</span></span>
49
+ <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> CC --&gt;|&quot;POST /api/chat&quot;| CHAT</span></span>
50
+ <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> PROXY --&gt;|&quot;fetch&quot;| UP</span></span>
51
+ <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> CHAT --&gt;|&quot;fetch&quot;| UP</span></span>
52
+ <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> UP -.-&gt;|&quot;SSE stream&quot;| PROXY</span></span>
53
+ <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> UP -.-&gt;|&quot;SSE stream&quot;| CHAT</span></span>
54
+ <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> PROXY --&gt;|&quot;pipe&quot;| CC</span></span>
55
+ <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> CHAT --&gt;|&quot;pipe + inject loop&quot;| CC</span></span>
56
+ <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> MCP --&gt;|&quot;connect&quot;| MCPS</span></span>
57
+ <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> MCP --&gt; TOOLS</span></span>
58
+ <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> TOOLS --&gt;|&quot;inject tools&quot;| CHAT</span></span>
59
+ <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> PROXY --&gt; DB</span></span>
60
+ <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> CHAT --&gt; DB</span></span>
61
+ <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> UI_API --&gt; DB</span></span>
62
+ <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> MCP --&gt; DB</span></span>
63
+ <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> WS --&gt; DB</span></span>
64
+ <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> CLI_UI --&gt;|&quot;REST + WS&quot;| UI_API</span></span>
65
+ <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> CLI_UI --&gt; WS</span></span>
66
+ <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> STATIC --&gt; CLI_UI</span></span>
67
+ <span class="line"></span>
68
+ <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> ADMIN_UI -.-&gt;|&quot;未接入 (Mock 数据)&quot;| UI_API</span></span>
69
+ <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> ADMIN_UI --&gt; UTILS</span></span>
70
+ <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> PM2 --&gt; PROXY</span></span></code></pre></div><p>关键连线说明:</p><ul><li><code>proxy-core</code> 承载三条业务路径:<code>/v1/*</code>(纯代理)、<code>/api/chat</code>(MCP 增强代理)、<code>/ui/*</code>(UI 后端 + WebSocket)</li><li><code>McpManager</code> 管理外部 MCP server 连接(stdio/sse/streamable-http),发现的 tool 通过 <code>mcp-bridge</code> 转为 <code>InjectableTool</code> 注册到 <code>tools/registry</code></li><li><code>/api/chat</code> 注入 MCP tools 到请求体,命中后在后端本地执行 inject loop(流式转发续接到同一 SSE 连接)</li><li><code>proxy-cli</code> 构建产物 <code>dist/</code> 被 proxy-core 用 <code>@fastify/static</code> 挂在 <code>/ui/</code> 路径下(生产模式)</li><li><code>proxy-admin</code> 目前仍在使用 <code>vite-plugin-mock</code> 提供假数据,<strong>尚未接入 proxy-core</strong>,是独立的前端项目</li><li><code>packages/utils</code> 目前仅被 <code>proxy-admin</code> 通过 <code>workspace:^1.0.0</code> 引用</li></ul><h2 id="技术栈速查" tabindex="-1">技术栈速查 <a class="header-anchor" href="#技术栈速查" aria-label="Permalink to &quot;技术栈速查&quot;">​</a></h2><table tabindex="0"><thead><tr><th>层</th><th>技术</th></tr></thead><tbody><tr><td>包管理</td><td>pnpm 8+(workspace)</td></tr><tr><td>语言</td><td>TypeScript 5 严格模式</td></tr><tr><td>Node</td><td>18+,全局 <code>&quot;type&quot;: &quot;module&quot;</code>(ESM)</td></tr><tr><td>后端框架</td><td>Fastify 4</td></tr><tr><td>后端进程管理</td><td>PM2 5(fork 模式,ESM 兼容)</td></tr><tr><td>数据库</td><td>better-sqlite3(同步 API + WAL)</td></tr><tr><td>MCP SDK</td><td>@modelcontextprotocol/sdk(stdio/sse/streamable-http client)</td></tr><tr><td>配置校验</td><td>Zod</td></tr><tr><td>日志</td><td>Pino + file-stream-rotator</td></tr><tr><td>WebSocket</td><td>原生 <code>ws</code>(不走 <code>@fastify/websocket</code>,参见 <a href="./proxy-core/ui-routes.html">ui-routes.md</a>)</td></tr><tr><td>前端框架</td><td>React 18</td></tr><tr><td>前端构建</td><td>Vite 5</td></tr><tr><td>proxy-cli 组件</td><td>原生 + Tailwind 4 + Recharts + Shiki + <code>@pierre/diffs</code></td></tr><tr><td>proxy-admin 组件</td><td>Ant Design 5 + axios</td></tr><tr><td>proxy-cli i18n</td><td>i18next(zh/en 6 命名空间)</td></tr><tr><td>proxy-admin mock</td><td>vite-plugin-mock + mockjs</td></tr><tr><td>测试</td><td>Jest(proxy-core) + Vitest(前端)</td></tr></tbody></table><h2 id="三个应用的分工" tabindex="-1">三个应用的分工 <a class="header-anchor" href="#三个应用的分工" aria-label="Permalink to &quot;三个应用的分工&quot;">​</a></h2><table tabindex="0"><thead><tr><th>维度</th><th>proxy-core</th><th>proxy-cli</th><th>proxy-admin</th></tr></thead><tbody><tr><td>角色</td><td>后端 + 数据源 + MCP 管理</td><td>面向单机用户的仪表板</td><td>面向管理员的运营后台</td></tr><tr><td>部署</td><td>PM2 守护</td><td>由 proxy-core 静态托管</td><td>独立 Vite 项目</td></tr><tr><td>数据</td><td>SQLite 真实</td><td>从 proxy-core 拉真实数据</td><td>目前 Mock 数据</td></tr><tr><td>UI 库</td><td>无</td><td>原生 + Tailwind</td><td>Ant Design 5</td></tr><tr><td>端口(开发)</td><td>9527(默认)</td><td>由 Vite 代理到 core(硬编码 3000)</td><td>3000(默认,与 proxy-cli 反代目标撞车)</td></tr><tr><td>主要用户操作</td><td>CLI(<code>pnpm cli</code>)</td><td>看请求/日志/状态、编辑配置、切供应商、管理 MCP server</td><td>管理用户/供应商/系统设置(规划中)</td></tr></tbody></table><h2 id="数据流一览-详见-request-flow-md" tabindex="-1">数据流一览(详见 <a href="./request-flow.html">request-flow.md</a>) <a class="header-anchor" href="#数据流一览-详见-request-flow-md" aria-label="Permalink to &quot;数据流一览(详见 [request-flow.md](./request-flow))&quot;">​</a></h2><ol><li><strong>业务请求(纯代理)</strong>:Claude Code → <code>/v1/*</code> → proxy-core → 上游 → SSE 回流 → 客户端;同一次调用被写入 SQLite <code>requests</code> 表</li><li><strong>业务请求(MCP 增强)</strong>:Claude Code → <code>/api/chat</code> → proxy-core(MCP tool 注入 + session resume + streaming inject loop)→ 上游 → SSE 回流 + loop 续接 → 客户端;每次 loop 迭代独立 DB 记录</li><li><strong>UI 只读</strong>:proxy-cli 首次挂载走 REST(<code>/ui/api/status</code>、<code>/ui/api/requests</code> 等),随后订阅 <code>/ui/api/ws</code> 拿增量推送</li><li><strong>日志流</strong>:proxy-cli 订阅 <code>/ui/api/logs/stream</code>,proxy-core 用 <code>fs.watch</code> 增量读取 Pino 日志文件</li><li><strong>配置修改</strong>:proxy-cli 通过 <code>POST /ui/api/config</code> 保存(可选 Bearer 认证),必要时后端延迟 <code>pm2 reload</code></li><li><strong>供应商切换</strong>:proxy-cli 用 <code>POST /ui/api/providers</code> 全量写 SQLite <code>providers</code> 表;下一次业务请求命中 <code>resolveProxyTarget</code> 立即生效</li></ol><h2 id="关键设计决策" tabindex="-1">关键设计决策 <a class="header-anchor" href="#关键设计决策" aria-label="Permalink to &quot;关键设计决策&quot;">​</a></h2><ul><li><strong>应用层转发而非透明代理</strong>:Fastify 先解析 body,再 fetch 上游,SSE 用 <code>Readable.fromWeb().pipe(reply.raw)</code> 转发。原因见 <a href="./proxy-core/proxy.html">proxy.md</a></li><li><strong>双路径设计</strong>:<code>/v1/*</code> 纯代理(零修改,透明转发),<code>/api/chat</code> MCP 增强代理(tool 注入 + session resume + streaming inject loop)。详见 <a href="./proxy-core/chat-api.html">chat-api.md</a></li><li><strong>数据目录锚定 <code>~/.cc-monitoring</code></strong>:让全局 npm 安装、PM2 守护、CLI 一次性运行共用同一份 config 与数据,源于 <code>apps/proxy-core/src/utils/paths.ts</code></li><li><strong>ESM + PM2 桥接</strong>:全局 <code>type: module</code> 会让 <code>.js</code> 变 ESM,PM2 是 CJS 包,故用 <code>createRequire(import.meta.url)</code> 加载 pm2,ecosystem 用 <code>.cjs</code> 扩展名</li><li><strong>供应商部分覆盖 + tier model</strong>:<code>resolveProxyTarget</code> 允许 provider 只填 <code>base_url</code>、只填 <code>api_key</code>、只填 <code>model</code> / <code>haiku_model</code> / <code>sonnet_model</code> / <code>opus_model</code> 中的任意组合,未填字段回退到 config.json。<code>getProxyModel</code> 按 tier 映射替换请求 model,详见 <a href="./proxy-core/providers.html">providers.md</a></li><li><strong>stats 双通道</strong>:预聚合表 <code>stats</code>(每 5 分钟刷新,兼顾 24h / 30d)+ 今日实时 <code>getTodayStats(since)</code>(按客户端本地零点查 <code>requests</code> 表),详见 <a href="./proxy-core/stats.html">stats.md</a></li><li><strong>MCP tool 动态注入</strong>:<code>/api/chat</code> 用 <code>injectMcpTools</code> 仅注入 MCP 动态 tool(不含 probe/curl),<code>/v1/*</code> 不注入。详见 <a href="./proxy-core/tool.html">tool.md</a></li><li><strong>MCP server 管理与发现</strong>:<code>McpManager</code> 管理 stdio/sse/streamable-http 连接,发现 tool 后通过 <code>mcp-bridge</code> 转为 <code>InjectableTool</code> 注册,30s 健康检查 + 断连指数退避重连</li></ul><h2 id="相关文档" tabindex="-1">相关文档 <a class="header-anchor" href="#相关文档" aria-label="Permalink to &quot;相关文档&quot;">​</a></h2><ul><li>想马上跑起来 → <a href="./quickstart.html">quickstart.md</a></li><li>想理解一次请求的完整旅程 → <a href="./request-flow.html">request-flow.md</a></li><li>想深入后端 → <a href="./proxy-core/">proxy-core</a></li><li>想改前端面板 → <a href="./proxy-cli/">proxy-cli</a></li><li>想改管理后台 → <a href="./proxy-admin/">proxy-admin</a></li></ul>`,26)])])}const E=a(n,[["render",o]]);export{k as __pageData,E as default};
@@ -0,0 +1 @@
1
+ import{_ as a,o as t,c as i,a2 as e}from"./chunks/framework.D_Xv2a7c.js";const k=JSON.parse('{"title":"00. 项目总览","description":"","frontmatter":{},"headers":[],"relativePath":"overview.md","filePath":"overview.md"}'),n={name:"overview.md"};function o(l,s,p,d,r,c){return t(),i("div",null,[...s[0]||(s[0]=[e("",26)])])}const E=a(n,[["render",o]]);export{k as __pageData,E as default};
@@ -0,0 +1,31 @@
1
+ import{_ as i,o as a,c as t,a2 as n}from"./chunks/framework.D_Xv2a7c.js";const g=JSON.parse('{"title":"packages/utils","description":"","frontmatter":{},"headers":[],"relativePath":"packages-utils.md","filePath":"packages-utils.md"}'),h={name:"packages-utils.md"};function l(k,s,p,e,r,d){return a(),t("div",null,[...s[0]||(s[0]=[n(`<h1 id="packages-utils" tabindex="-1">packages/utils <a class="header-anchor" href="#packages-utils" aria-label="Permalink to &quot;packages/utils&quot;">​</a></h1><h2 id="本文档覆盖的源文件" tabindex="-1">本文档覆盖的源文件 <a class="header-anchor" href="#本文档覆盖的源文件" aria-label="Permalink to &quot;本文档覆盖的源文件&quot;">​</a></h2><ul><li><code>packages/utils/src/index.ts</code></li><li><code>packages/utils/package.json</code></li><li><code>packages/utils/tsconfig.json</code></li></ul><h2 id="模块角色" tabindex="-1">模块角色 <a class="header-anchor" href="#模块角色" aria-label="Permalink to &quot;模块角色&quot;">​</a></h2><p>跨应用共享工具包,包名 <code>@cc/utils</code>,workspace 依赖形式:</p><div class="language-json vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">json</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;@cc/utils&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;workspace:^1.0.0&quot;</span></span></code></pre></div><p>pnpm-workspace.yaml 的 <code>packages/*</code> 通配符自动纳入。</p><p><strong>当前实现</strong>:仅有两个示例函数,属于<strong>骨架状态</strong>:</p><h2 id="现有导出" tabindex="-1">现有导出 <a class="header-anchor" href="#现有导出" aria-label="Permalink to &quot;现有导出&quot;">​</a></h2><p><code>packages/utils/src/index.ts</code>:</p><h3 id="formatdate-date-format" tabindex="-1"><code>formatDate(date, format?)</code> <a class="header-anchor" href="#formatdate-date-format" aria-label="Permalink to &quot;\`formatDate(date, format?)\`&quot;">​</a></h3><div class="language-ts vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">ts</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">export</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> const</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> formatDate</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> (</span></span>
2
+ <span class="line"><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;"> date</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> Date</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> |</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> string</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> |</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> number</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
3
+ <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> format </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &#39;YYYY-MM-DD HH:mm:ss&#39;</span></span>
4
+ <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">)</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">:</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> string</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =&gt;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> {</span></span>
5
+ <span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> d</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> new</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> Date</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(date)</span></span>
6
+ <span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> year</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> d.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">getFullYear</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">()</span></span>
7
+ <span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> month</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> String</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(d.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">getMonth</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">() </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">+</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> 1</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">).</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">padStart</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">2</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;0&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">)</span></span>
8
+ <span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> day</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> String</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(d.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">getDate</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">()).</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">padStart</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">2</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;0&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">)</span></span>
9
+ <span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // ... hour / minute / second</span></span>
10
+ <span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> return</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> format</span></span>
11
+ <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> .</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">replace</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;YYYY&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">String</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(year))</span></span>
12
+ <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> .</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">replace</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;MM&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, month)</span></span>
13
+ <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> .</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">replace</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;DD&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, day)</span></span>
14
+ <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> .</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">replace</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;HH&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, hour)</span></span>
15
+ <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> .</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">replace</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;mm&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, minute)</span></span>
16
+ <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> .</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">replace</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;ss&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, second)</span></span>
17
+ <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span></code></pre></div><ul><li>简单 token 替换(不支持转义、不支持其他格式)</li><li>与 proxy-cli 的 <code>utils/format-time.ts</code> 功能重叠——<strong>目前 proxy-cli 不用它</strong>,各自实现</li><li>与 proxy-admin 也无实际引用</li></ul><h3 id="debounce-func-wait" tabindex="-1"><code>debounce(func, wait)</code> <a class="header-anchor" href="#debounce-func-wait" aria-label="Permalink to &quot;\`debounce(func, wait)\`&quot;">​</a></h3><div class="language-ts vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">ts</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">export</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> const</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> debounce</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> &lt;</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">T</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> extends</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> (</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">...</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;">args</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">:</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> any</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">[]) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=&gt;</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> any</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">&gt;(</span></span>
18
+ <span class="line"><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;"> func</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> T</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
19
+ <span class="line"><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;"> wait</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">:</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> number</span></span>
20
+ <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">): ((</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">...</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;">args</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> Parameters</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">&lt;</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">T</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">&gt;) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=&gt;</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> void</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=&gt;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> {</span></span>
21
+ <span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> let</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> timeout</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> NodeJS</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">Timeout</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> |</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> null</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> null</span></span>
22
+ <span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> return</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> (</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">...</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;">args</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> Parameters</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">&lt;</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">T</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">&gt;) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=&gt;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> {</span></span>
23
+ <span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> (timeout) </span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">clearTimeout</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(timeout)</span></span>
24
+ <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> timeout </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> setTimeout</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(() </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=&gt;</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> func</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">...</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">args), wait)</span></span>
25
+ <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
26
+ <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span></code></pre></div><ul><li>标准防抖</li><li>泛型约束 <code>T extends (...args) =&gt; any</code> 保留参数类型</li><li><code>NodeJS.Timeout</code>:类型来自 <code>@types/node</code>,但函数在浏览器/Node 都能跑</li></ul><h2 id="引用情况" tabindex="-1">引用情况 <a class="header-anchor" href="#引用情况" aria-label="Permalink to &quot;引用情况&quot;">​</a></h2><ul><li><code>apps/proxy-admin/package.json</code> 依赖 <code>@cc/utils</code>,但代码中<strong>未 import</strong></li><li><code>apps/proxy-core</code> 和 <code>apps/proxy-cli</code> <strong>不依赖</strong></li></ul><p>即:包被声明但未被消费。</p><h2 id="定位规划" tabindex="-1">定位规划 <a class="header-anchor" href="#定位规划" aria-label="Permalink to &quot;定位规划&quot;">​</a></h2><p><code>CLAUDE.md</code> 明确写了:</p><blockquote><p>公共工具函数:跨项目复用的放到 <code>packages/utils</code>,项目内复用的放到对应项目的 <code>src/utils</code></p></blockquote><p>所以未来的候选:</p><ul><li><strong>跨端时间格式化</strong>(当前 proxy-cli 和 formatDate 重叠)</li><li><strong>数字格式化</strong>(compact number 等)</li><li><strong>通用类型工具</strong>(<code>Nullable&lt;T&gt;</code>、<code>Optional&lt;T, K&gt;</code> 等)</li><li><strong>API 响应通用类型</strong>(<code>ApiResponse&lt;T&gt;</code> 目前只在 proxy-admin 定义)</li><li><strong>通用 fetch 封装</strong>(重试、超时、错误规范化)</li></ul><h2 id="package-json" tabindex="-1">package.json <a class="header-anchor" href="#package-json" aria-label="Permalink to &quot;package.json&quot;">​</a></h2><p><code>packages/utils/package.json</code>:</p><div class="language-json vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">json</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">{</span></span>
27
+ <span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> &quot;name&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;@cc/utils&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
28
+ <span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> &quot;version&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;1.0.0&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
29
+ <span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> &quot;type&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;module&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
30
+ <span class="line"><span style="--shiki-light:#B31D28;--shiki-light-font-style:italic;--shiki-dark:#FDAEB7;--shiki-dark-font-style:italic;"> ...</span></span>
31
+ <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span></code></pre></div><p>标准 ESM 包声明。</p><h2 id="相关" tabindex="-1">相关 <a class="header-anchor" href="#相关" aria-label="Permalink to &quot;相关&quot;">​</a></h2><ul><li>proxy-cli 的类似工具(各自实现) → <a href="./proxy-cli/utils-and-i18n.html">utils-and-i18n.md</a></li><li>proxy-admin 的 utils(localStorage 封装) → <a href="./proxy-admin/services-and-mock.html#工具函数-utilsindexts">services-and-mock.md</a></li></ul>`,30)])])}const o=i(h,[["render",l]]);export{g as __pageData,o as default};
@@ -0,0 +1 @@
1
+ import{_ as i,o as a,c as t,a2 as n}from"./chunks/framework.D_Xv2a7c.js";const g=JSON.parse('{"title":"packages/utils","description":"","frontmatter":{},"headers":[],"relativePath":"packages-utils.md","filePath":"packages-utils.md"}'),h={name:"packages-utils.md"};function l(k,s,p,e,r,d){return a(),t("div",null,[...s[0]||(s[0]=[n("",30)])])}const o=i(h,[["render",l]]);export{g as __pageData,o as default};
@@ -0,0 +1,40 @@
1
+ import{_ as i,o as a,c as e,a2 as n}from"./chunks/framework.D_Xv2a7c.js";const k=JSON.parse('{"title":"proxy-admin / 环境与构建","description":"","frontmatter":{},"headers":[],"relativePath":"proxy-admin/env-and-build.md","filePath":"proxy-admin/env-and-build.md"}'),t={name:"proxy-admin/env-and-build.md"};function l(o,s,p,d,h,c){return a(),e("div",null,[...s[0]||(s[0]=[n(`<h1 id="proxy-admin-环境与构建" tabindex="-1">proxy-admin / 环境与构建 <a class="header-anchor" href="#proxy-admin-环境与构建" aria-label="Permalink to &quot;proxy-admin / 环境与构建&quot;">​</a></h1><h2 id="本文档覆盖的源文件" tabindex="-1">本文档覆盖的源文件 <a class="header-anchor" href="#本文档覆盖的源文件" aria-label="Permalink to &quot;本文档覆盖的源文件&quot;">​</a></h2><ul><li><code>apps/proxy-admin/vite.config.ts</code></li><li><code>apps/proxy-admin/tsconfig.json</code> / <code>tsconfig.node.json</code></li><li><code>apps/proxy-admin/tailwind.config.js</code></li><li><code>apps/proxy-admin/postcss.config.js</code></li><li><code>apps/proxy-admin/src/vite-env.d.ts</code></li><li><code>apps/proxy-admin/package.json</code></li></ul><h2 id="vite-配置" tabindex="-1">Vite 配置 <a class="header-anchor" href="#vite-配置" aria-label="Permalink to &quot;Vite 配置&quot;">​</a></h2><p><code>apps/proxy-admin/vite.config.ts</code>:</p><div class="language-ts vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">ts</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">export</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> default</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> defineConfig</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">({</span></span>
2
+ <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> plugins: [</span></span>
3
+ <span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> react</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(),</span></span>
4
+ <span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> viteMockServe</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">({</span></span>
5
+ <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> mockPath: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;src/mock&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
6
+ <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> enable: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">true</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// 开发时启用 mock</span></span>
7
+ <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> logger: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">true</span></span>
8
+ <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> })</span></span>
9
+ <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> ],</span></span>
10
+ <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> resolve: {</span></span>
11
+ <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> alias: { </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;@&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">resolve</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(__dirname, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;src&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">) }</span></span>
12
+ <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> },</span></span>
13
+ <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> server: {</span></span>
14
+ <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> port: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">3000</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
15
+ <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> proxy: {</span></span>
16
+ <span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &#39;/api&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: {</span></span>
17
+ <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> target: process.env.</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">VITE_API_PROXY_TARGET</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> ||</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &#39;http://localhost:8080&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
18
+ <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> changeOrigin: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">true</span></span>
19
+ <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
20
+ <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
21
+ <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
22
+ <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">})</span></span></code></pre></div><h3 id="三个关键配置" tabindex="-1">三个关键配置 <a class="header-anchor" href="#三个关键配置" aria-label="Permalink to &quot;三个关键配置&quot;">​</a></h3><ul><li><strong><code>viteMockServe</code></strong>:<code>vite-plugin-mock</code>,从 <code>src/mock/**</code> 加载 <code>MockMethod[]</code> 数组。<code>logger: true</code> 让 mock 请求打印到 dev 控制台</li><li><strong>别名 <code>@</code></strong>:<code>@/components/*</code> 等价于 <code>src/components/*</code>——但代码里未见使用(组件都用相对路径 import)</li><li><strong>dev proxy</strong>:<code>/api/*</code> 反代到 <code>VITE_API_PROXY_TARGET</code>(默认 <code>http://localhost:8080</code>)——<strong>注意 mock 优先级高于 proxy</strong>:<code>vite-plugin-mock</code> 在中间件链前面,命中就走 mock;未命中才走 proxy</li></ul><h3 id="端口冲突" tabindex="-1">端口冲突 <a class="header-anchor" href="#端口冲突" aria-label="Permalink to &quot;端口冲突&quot;">​</a></h3><ul><li>proxy-admin 默认 port 3000</li><li>proxy-cli 老版本 dev proxy 目标也是 3000(<code>apps/proxy-cli/vite.config.ts:15</code>)</li><li><strong>两者同时开发时必须改端口</strong>(proxy-admin 一方)</li></ul><h2 id="环境变量" tabindex="-1">环境变量 <a class="header-anchor" href="#环境变量" aria-label="Permalink to &quot;环境变量&quot;">​</a></h2><h3 id="类型声明" tabindex="-1">类型声明 <a class="header-anchor" href="#类型声明" aria-label="Permalink to &quot;类型声明&quot;">​</a></h3><p><code>apps/proxy-admin/src/vite-env.d.ts</code>:</p><div class="language-ts vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">ts</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">/// &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">reference</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> types</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;vite/client&quot;</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> /&gt;</span></span>
23
+ <span class="line"></span>
24
+ <span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">interface</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> ImportMetaEnv</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> {</span></span>
25
+ <span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> readonly</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;"> VITE_API_PREFIX</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">:</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> string</span></span>
26
+ <span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> readonly</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;"> VITE_API_PROXY_TARGET</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">:</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> string</span></span>
27
+ <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span>
28
+ <span class="line"></span>
29
+ <span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">interface</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> ImportMeta</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> { </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">readonly</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;"> env</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> ImportMetaEnv</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span></code></pre></div><p>Vite 约定:以 <code>VITE_</code> 开头的环境变量才会注入到客户端代码。</p><h3 id="变量说明" tabindex="-1">变量说明 <a class="header-anchor" href="#变量说明" aria-label="Permalink to &quot;变量说明&quot;">​</a></h3><table tabindex="0"><thead><tr><th>变量</th><th>默认值</th><th>作用</th></tr></thead><tbody><tr><td><code>VITE_API_PREFIX</code></td><td><code>/api</code></td><td>axios 实例 baseURL(<code>request.ts:6</code>)</td></tr><tr><td><code>VITE_API_PROXY_TARGET</code></td><td><code>http://localhost:8080</code></td><td>Vite dev proxy 转发目标(vite.config.ts:24)</td></tr></tbody></table><h3 id="文件约定" tabindex="-1">文件约定 <a class="header-anchor" href="#文件约定" aria-label="Permalink to &quot;文件约定&quot;">​</a></h3><ul><li><code>.env</code>:全项目公共变量(进 git)</li><li><code>.env.local</code>:本地开发变量(不进 git,从 <code>.env.local.example</code> 复制)</li><li><code>.env.development</code> / <code>.env.production</code>:模式特定</li></ul><p>(当前仓库未见实际 <code>.env*</code> 文件,需按需创建。)</p><h2 id="tailwind-配置" tabindex="-1">Tailwind 配置 <a class="header-anchor" href="#tailwind-配置" aria-label="Permalink to &quot;Tailwind 配置&quot;">​</a></h2><p><code>apps/proxy-admin/tailwind.config.js</code>:</p><div class="language-js vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">js</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">export</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> default</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> {</span></span>
30
+ <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> content: [</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;./index.html&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;./src/**/*.{js,ts,jsx,tsx}&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">],</span></span>
31
+ <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> theme: { extend: {} },</span></span>
32
+ <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> plugins: [],</span></span>
33
+ <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> corePlugins: {</span></span>
34
+ <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> preflight: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">false</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // 禁用 preflight,避免与 Ant Design 冲突</span></span>
35
+ <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
36
+ <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span></code></pre></div><p><strong>关键决策</strong>:<code>preflight: false</code>。Tailwind 的 preflight 会 reset 默认样式(<code>ul</code>、<code>h1</code>、<code>button</code> 等),与 Ant Design 的组件样式冲突(例如 <code>button</code> 默认样式被清零 → antd Button 依赖的伪类失效)。禁用后由 antd 自己的 base styles 接管。</p><h2 id="postcss-配置" tabindex="-1">PostCSS 配置 <a class="header-anchor" href="#postcss-配置" aria-label="Permalink to &quot;PostCSS 配置&quot;">​</a></h2><p><code>apps/proxy-admin/postcss.config.js</code>(未详读):Tailwind 3 + Autoprefixer 组合,标准配置。</p><h2 id="typescript-配置" tabindex="-1">TypeScript 配置 <a class="header-anchor" href="#typescript-配置" aria-label="Permalink to &quot;TypeScript 配置&quot;">​</a></h2><p><code>apps/proxy-admin/tsconfig.json</code>(未详读,但结构大致):</p><ul><li><code>extends: &#39;../../tsconfig.base.json&#39;</code></li><li><code>include: [&quot;src&quot;, &quot;vite.config.ts&quot;]</code> 或类似</li><li><code>references: [{ path: &quot;./tsconfig.node.json&quot; }]</code>(Vite 项目常见拆分)</li></ul><p><code>tsconfig.node.json</code> 用于 <code>vite.config.ts</code> 自身的类型检查(Node 环境,<code>allowSyntheticDefaultImports</code> 等)。</p><h2 id="依赖清单" tabindex="-1">依赖清单 <a class="header-anchor" href="#依赖清单" aria-label="Permalink to &quot;依赖清单&quot;">​</a></h2><p><code>apps/proxy-admin/package.json</code>:</p><h3 id="dependencies" tabindex="-1">dependencies <a class="header-anchor" href="#dependencies" aria-label="Permalink to &quot;dependencies&quot;">​</a></h3><ul><li><code>react</code> / <code>react-dom</code> ^18.2</li><li><code>react-router-dom</code> ^6.20</li><li><code>antd</code> ^5.12</li><li><code>axios</code> ^1.6</li><li><code>@ant-design/icons</code> ^5.2</li><li><code>@cc/utils</code> <code>workspace:^1.0.0</code></li></ul><h3 id="devdependencies" tabindex="-1">devDependencies <a class="header-anchor" href="#devdependencies" aria-label="Permalink to &quot;devDependencies&quot;">​</a></h3><ul><li><code>@types/react</code> / <code>@types/react-dom</code></li><li><code>@vitejs/plugin-react</code> ^4.2</li><li><code>autoprefixer</code> ^10.4</li><li><code>mockjs</code> ^1.1</li><li><code>postcss</code> ^8.4</li><li><code>tailwindcss</code> ^3.3</li><li><code>typescript</code> ^5.3</li><li><code>vite</code> ^5.0</li><li><code>vite-plugin-mock</code> ^3.0</li></ul><p><strong>说明</strong>:</p><ul><li>Tailwind 版本是 <strong>3</strong>(proxy-cli 用的是 <strong>4</strong>)—— 两个应用主动选择不同版本</li><li><strong><code>@cc/utils</code></strong>:workspace 引用;当前实际未导入使用(<code>packages/utils</code> 只有 formatDate/debounce 示例函数)</li></ul><h2 id="构建脚本" tabindex="-1">构建脚本 <a class="header-anchor" href="#构建脚本" aria-label="Permalink to &quot;构建脚本&quot;">​</a></h2><p><code>package.json</code> scripts:</p><div class="language-json vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">json</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">{</span></span>
37
+ <span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> &quot;dev&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;vite&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
38
+ <span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> &quot;build&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;tsc &amp;&amp; vite build&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
39
+ <span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> &quot;preview&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;vite preview&quot;</span></span>
40
+ <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span></code></pre></div><ul><li><strong><code>build</code></strong>:先 <code>tsc</code>(严格类型检查,无产物;<code>noEmit</code> 由 tsconfig 控制),再 <code>vite build</code></li><li><strong><code>preview</code></strong>:本地预览 build 产物</li></ul><h2 id="未来接入-proxy-core-的步骤" tabindex="-1">未来接入 proxy-core 的步骤 <a class="header-anchor" href="#未来接入-proxy-core-的步骤" aria-label="Permalink to &quot;未来接入 proxy-core 的步骤&quot;">​</a></h2><p>(重复自 <a href="./services-and-mock.html#后端联调思路未来">services-and-mock.md</a>)</p><ol><li><code>.env.local</code> 写 <code>VITE_API_PROXY_TARGET=http://localhost:9527</code></li><li><code>.env</code> 或 <code>.env.production</code> 写 <code>VITE_API_PREFIX=/ui/api</code>(与 proxy-core 一致)</li><li><code>viteMockServe.enable = false</code>(或按 <code>mode !== &#39;development&#39;</code> 条件禁用)</li><li>后端补齐管理域端点(用户 / 供应商全局 / 系统设置)</li><li>实现真实登录 → 拿到 token → proxy-core 校验 <code>Bearer &lt;token&gt;</code> 对应 <code>config.auth.token</code></li></ol><h2 id="相关" tabindex="-1">相关 <a class="header-anchor" href="#相关" aria-label="Permalink to &quot;相关&quot;">​</a></h2><ul><li>服务层 → <a href="./services-and-mock.html">services-and-mock.md</a></li><li>认证 → <a href="./routing-and-auth.html">routing-and-auth.md</a></li></ul>`,47)])])}const E=i(t,[["render",l]]);export{k as __pageData,E as default};
@@ -0,0 +1 @@
1
+ import{_ as i,o as a,c as e,a2 as n}from"./chunks/framework.D_Xv2a7c.js";const k=JSON.parse('{"title":"proxy-admin / 环境与构建","description":"","frontmatter":{},"headers":[],"relativePath":"proxy-admin/env-and-build.md","filePath":"proxy-admin/env-and-build.md"}'),t={name:"proxy-admin/env-and-build.md"};function l(o,s,p,d,h,c){return a(),e("div",null,[...s[0]||(s[0]=[n("",47)])])}const E=i(t,[["render",l]]);export{k as __pageData,E as default};
@@ -0,0 +1,38 @@
1
+ import{_ as s,o as n,c as t,a2 as e}from"./chunks/framework.D_Xv2a7c.js";const h=JSON.parse('{"title":"proxy-admin","description":"","frontmatter":{},"headers":[],"relativePath":"proxy-admin/index.md","filePath":"proxy-admin/index.md"}'),p={name:"proxy-admin/index.md"};function o(i,a,l,r,d,c){return n(),t("div",null,[...a[0]||(a[0]=[e(`<h1 id="proxy-admin" tabindex="-1">proxy-admin <a class="header-anchor" href="#proxy-admin" aria-label="Permalink to &quot;proxy-admin&quot;">​</a></h1><h2 id="本文档覆盖的源文件" tabindex="-1">本文档覆盖的源文件 <a class="header-anchor" href="#本文档覆盖的源文件" aria-label="Permalink to &quot;本文档覆盖的源文件&quot;">​</a></h2><ul><li><code>apps/proxy-admin/package.json</code></li><li><code>apps/proxy-admin/vite.config.ts</code></li><li><code>apps/proxy-admin/tsconfig.json</code> / <code>tsconfig.node.json</code></li><li><code>apps/proxy-admin/tailwind.config.js</code></li><li><code>apps/proxy-admin/postcss.config.js</code></li><li><code>apps/proxy-admin/src/**/*.{ts,tsx}</code></li></ul><h2 id="模块角色" tabindex="-1">模块角色 <a class="header-anchor" href="#模块角色" aria-label="Permalink to &quot;模块角色&quot;">​</a></h2><p><code>proxy-admin</code> 是<strong>面向管理员的 SaaS 后台</strong>(规划形态)。目标包括:用户管理、权限控制(RBAC)、全局请求监控、系统级配置、供应商全局管理。</p><p><strong>当前实现状态</strong>:脚手架 + Mock 数据阶段。全部接口走 <code>vite-plugin-mock</code> 生成的假数据,<strong>尚未接入 proxy-core</strong>。</p><p>三个页面已有基本 CRUD 骨架(Login / User / Supplier / SystemSettings),两个页面是 TODO 占位(Dashboard 静态数字、LogManagement <code>&lt;Empty&gt;</code> 组件)。</p><h2 id="与-proxy-cli-的分工" tabindex="-1">与 proxy-cli 的分工 <a class="header-anchor" href="#与-proxy-cli-的分工" aria-label="Permalink to &quot;与 proxy-cli 的分工&quot;">​</a></h2><table tabindex="0"><thead><tr><th>维度</th><th>proxy-cli</th><th>proxy-admin</th></tr></thead><tbody><tr><td>用户</td><td>单机开发者</td><td>运营/管理员</td></tr><tr><td>数据来源</td><td>proxy-core 真实数据</td><td>目前 Mock</td></tr><tr><td>UI 库</td><td>原生 + Tailwind + Recharts</td><td>Ant Design 5 + Tailwind</td></tr><tr><td>部署</td><td>由 proxy-core 静态托管</td><td>独立 Vite 项目</td></tr><tr><td>路由</td><td>无(单页)</td><td>React Router v6</td></tr><tr><td>认证</td><td>Bearer Token(可选)</td><td>localStorage token + 路由守卫</td></tr><tr><td>API 层</td><td>原生 fetch</td><td>axios 实例 + 拦截器</td></tr><tr><td>特有功能</td><td>请求历史、Compare、Provider 表格</td><td>用户管理、RBAC、系统设置</td></tr></tbody></table><p><strong>目前 proxy-admin 与 proxy-core 无实际集成</strong>——<code>.env</code> 默认 <code>VITE_API_PROXY_TARGET=http://localhost:8080</code>,端口都对不上 proxy-core 的 9527/3000。所有 API 都是 mock 路径 <code>/api/*</code>(后端也不存在)。</p><h2 id="目录布局" tabindex="-1">目录布局 <a class="header-anchor" href="#目录布局" aria-label="Permalink to &quot;目录布局&quot;">​</a></h2><div class="language- vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>apps/proxy-admin/</span></span>
2
+ <span class="line"><span>├── package.json # antd, axios, react-router-dom, vite-plugin-mock, mockjs</span></span>
3
+ <span class="line"><span>├── vite.config.ts # port 3000, viteMockServe mockPath &#39;src/mock&#39;</span></span>
4
+ <span class="line"><span>├── tsconfig.json / tsconfig.node.json</span></span>
5
+ <span class="line"><span>├── tailwind.config.js # preflight: false (与 antd 冲突)</span></span>
6
+ <span class="line"><span>├── postcss.config.js</span></span>
7
+ <span class="line"><span>└── src/</span></span>
8
+ <span class="line"><span> ├── main.tsx # AuthProvider + antd ConfigProvider(zhCN) + Router</span></span>
9
+ <span class="line"><span> ├── App.tsx # 只包 &lt;Router /&gt;</span></span>
10
+ <span class="line"><span> ├── vite-env.d.ts # VITE_API_PREFIX / VITE_API_PROXY_TARGET</span></span>
11
+ <span class="line"><span> ├── router/</span></span>
12
+ <span class="line"><span> │ ├── index.tsx # createBrowserRouter 定义路由</span></span>
13
+ <span class="line"><span> │ └── guard.ts # authLoader / publicLoader</span></span>
14
+ <span class="line"><span> ├── contexts/</span></span>
15
+ <span class="line"><span> │ └── AuthContext.tsx # useReducer 管理 token/user</span></span>
16
+ <span class="line"><span> ├── layouts/</span></span>
17
+ <span class="line"><span> │ └── MainLayout.tsx # Sider + Header + Content + Dropdown</span></span>
18
+ <span class="line"><span> ├── pages/</span></span>
19
+ <span class="line"><span> │ ├── Login.tsx # 玻璃拟态登录页</span></span>
20
+ <span class="line"><span> │ ├── Dashboard.tsx # 静态卡片 + TODO 占位</span></span>
21
+ <span class="line"><span> │ ├── UserManagement.tsx</span></span>
22
+ <span class="line"><span> │ ├── SupplierManagement.tsx</span></span>
23
+ <span class="line"><span> │ ├── LogManagement.tsx # 空</span></span>
24
+ <span class="line"><span> │ └── SystemSettings.tsx</span></span>
25
+ <span class="line"><span> ├── services/</span></span>
26
+ <span class="line"><span> │ ├── request.ts # axios 实例 + 请求/响应拦截</span></span>
27
+ <span class="line"><span> │ └── api.ts # 所有接口 + 类型</span></span>
28
+ <span class="line"><span> ├── mock/</span></span>
29
+ <span class="line"><span> │ ├── index.ts # 合并三个 mock 模块</span></span>
30
+ <span class="line"><span> │ ├── user.ts # login/logout/user list</span></span>
31
+ <span class="line"><span> │ ├── supplier.ts # supplier list/create</span></span>
32
+ <span class="line"><span> │ └── system.ts # system settings</span></span>
33
+ <span class="line"><span> ├── types/</span></span>
34
+ <span class="line"><span> │ └── auth.ts # UserInfo / AuthState / LoginParams / AuthContextType</span></span>
35
+ <span class="line"><span> ├── utils/</span></span>
36
+ <span class="line"><span> │ └── index.ts # getLocalStorage / setLocalStorage</span></span>
37
+ <span class="line"><span> └── styles/</span></span>
38
+ <span class="line"><span> └── global.css # (存在但未读取)</span></span></code></pre></div><h2 id="技术栈" tabindex="-1">技术栈 <a class="header-anchor" href="#技术栈" aria-label="Permalink to &quot;技术栈&quot;">​</a></h2><ul><li><strong>React 18</strong> + <strong>TypeScript 5</strong></li><li><strong>Vite 5</strong>(<code>vite-plugin-mock</code> + <code>mockjs</code>)</li><li><strong>React Router v6</strong>(<code>createBrowserRouter</code> + loader 守卫)</li><li><strong>Ant Design 5</strong> + <strong>@ant-design/icons</strong>(全 antd 组件)</li><li><strong>axios 1.6</strong>(拦截器统一 401 处理)</li><li><strong>Tailwind 3</strong>(<code>preflight: false</code> 与 antd 兼容)</li><li><strong>@cc/utils</strong>(workspace)</li></ul><h2 id="阅读顺序" tabindex="-1">阅读顺序 <a class="header-anchor" href="#阅读顺序" aria-label="Permalink to &quot;阅读顺序&quot;">​</a></h2><ul><li><a href="./routing-and-auth.html">routing-and-auth.md</a> — 路由 + 守卫 + AuthContext</li><li><a href="./layout-and-menu.html">layout-and-menu.md</a> — MainLayout 结构</li><li><a href="./pages.html">pages.md</a> — 6 个页面</li><li><a href="./services-and-mock.html">services-and-mock.md</a> — axios 拦截 + mock 数据</li><li><a href="./env-and-build.html">env-and-build.md</a> — 环境变量 + Vite 构建</li></ul>`,16)])])}const u=s(p,[["render",o]]);export{h as __pageData,u as default};
@@ -0,0 +1 @@
1
+ import{_ as s,o as n,c as t,a2 as e}from"./chunks/framework.D_Xv2a7c.js";const h=JSON.parse('{"title":"proxy-admin","description":"","frontmatter":{},"headers":[],"relativePath":"proxy-admin/index.md","filePath":"proxy-admin/index.md"}'),p={name:"proxy-admin/index.md"};function o(i,a,l,r,d,c){return n(),t("div",null,[...a[0]||(a[0]=[e("",16)])])}const u=s(p,[["render",o]]);export{h as __pageData,u as default};
@@ -0,0 +1,48 @@
1
+ import{_ as i,o as a,c as n,a2 as t}from"./chunks/framework.D_Xv2a7c.js";const g=JSON.parse('{"title":"proxy-admin / 布局与菜单","description":"","frontmatter":{},"headers":[],"relativePath":"proxy-admin/layout-and-menu.md","filePath":"proxy-admin/layout-and-menu.md"}'),h={name:"proxy-admin/layout-and-menu.md"};function l(k,s,p,e,E,d){return a(),n("div",null,[...s[0]||(s[0]=[t(`<h1 id="proxy-admin-布局与菜单" tabindex="-1">proxy-admin / 布局与菜单 <a class="header-anchor" href="#proxy-admin-布局与菜单" aria-label="Permalink to &quot;proxy-admin / 布局与菜单&quot;">​</a></h1><h2 id="本文档覆盖的源文件" tabindex="-1">本文档覆盖的源文件 <a class="header-anchor" href="#本文档覆盖的源文件" aria-label="Permalink to &quot;本文档覆盖的源文件&quot;">​</a></h2><ul><li><code>apps/proxy-admin/src/layouts/MainLayout.tsx</code></li></ul><h2 id="结构" tabindex="-1">结构 <a class="header-anchor" href="#结构" aria-label="Permalink to &quot;结构&quot;">​</a></h2><div class="language- vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>┌────────────────────────────────────────────────┐</span></span>
2
+ <span class="line"><span>│ Sider 200px │ Header 64px │</span></span>
3
+ <span class="line"><span>│ ┌────────────┐ ├────────────────────────────┤</span></span>
4
+ <span class="line"><span>│ │ Proxy Admin│ │ Content (padding 6, bg-gray-50)</span></span>
5
+ <span class="line"><span>│ ├────────────┤ │</span></span>
6
+ <span class="line"><span>│ │ 📊 看板 │ │ &lt;Outlet /&gt;</span></span>
7
+ <span class="line"><span>│ │ 👤 用户管理 │ │ (页面内容渲染在这)</span></span>
8
+ <span class="line"><span>│ │ 🏬 供应商 │ │</span></span>
9
+ <span class="line"><span>│ │ 📄 日志 │ │</span></span>
10
+ <span class="line"><span>│ │ ⚙️ 系统设置 │ │</span></span>
11
+ <span class="line"><span>│ └────────────┘ │</span></span>
12
+ <span class="line"><span>└────────────────────┴─────────────────────────────┘</span></span></code></pre></div><h2 id="三个区" tabindex="-1">三个区 <a class="header-anchor" href="#三个区" aria-label="Permalink to &quot;三个区&quot;">​</a></h2><h3 id="sider-左侧" tabindex="-1">Sider(左侧) <a class="header-anchor" href="#sider-左侧" aria-label="Permalink to &quot;Sider(左侧)&quot;">​</a></h3><div class="language-tsx vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">tsx</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">&lt;</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">Sider</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> width</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">{</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">200</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">} </span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">className</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;bg-white shadow-md&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">&gt;</span></span>
13
+ <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">div</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> className</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;h-16 flex items-center justify-center text-xl font-bold text-blue-600 border-b&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">&gt;</span></span>
14
+ <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> Proxy Admin</span></span>
15
+ <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> &lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">div</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">&gt;</span></span>
16
+ <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> &lt;</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">Menu</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> mode</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;inline&quot;</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> selectedKeys</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">{[location.pathname]} </span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">items</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">{menuItems} /&gt;</span></span>
17
+ <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">&lt;/</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">Sider</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">&gt;</span></span></code></pre></div><ul><li><strong>Logo 区 64px 高</strong>:与 Header 高度对齐</li><li><strong>Menu</strong>:Ant Design <code>Menu</code> inline 模式,<code>selectedKeys</code> 用 <code>location.pathname</code> 自动高亮当前路由</li><li><strong>无 preflight 冲突</strong>:<code>tailwind.config.js</code> 设 <code>preflight: false</code>,让 antd 自己的基础样式生效</li></ul><h3 id="菜单项" tabindex="-1">菜单项 <a class="header-anchor" href="#菜单项" aria-label="Permalink to &quot;菜单项&quot;">​</a></h3><div class="language-ts vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">ts</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> menuItems</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> [</span></span>
18
+ <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> { key: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;/dashboard&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, icon: &lt;</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">DashboardOutlined</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> /&gt;, label: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;看板&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">onClick</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: () </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=&gt;</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> navigate</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;/dashboard&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">) },</span></span>
19
+ <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> { key: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;/user&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, icon: &lt;</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">UserOutlined</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> /&gt;, label: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;用户管理&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">onClick</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: () </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=&gt;</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> navigate</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;/user&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">) },</span></span>
20
+ <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> { key: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;/supplier&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, icon: &lt;</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">ShopOutlined</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> /&gt;, label: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;供应商管理&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">onClick</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: () </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=&gt;</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> navigate</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;/supplier&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">) },</span></span>
21
+ <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> { key: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;/log&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, icon: &lt;</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">FileTextOutlined</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> /&gt;, label: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;日志管理&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">onClick</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: () </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=&gt;</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> navigate</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;/log&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">) },</span></span>
22
+ <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> { key: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;/system&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, icon: &lt;</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">SettingOutlined</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> /&gt;, label: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;系统设置&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">onClick</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: () </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=&gt;</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> navigate</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;/system&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">) }</span></span>
23
+ <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">]</span></span></code></pre></div><ul><li><strong>key 与 path 一致</strong>:<code>selectedKeys={[location.pathname]}</code> 高亮成立的前提</li><li><strong>onClick navigate</strong>:不用 antd Menu <code>onSelect</code>——直接绑 onClick 更直观</li><li><strong>五项</strong>:与 router 定义的五个子路由一一对应;<code>/</code>(根)不在菜单里但视觉上等同 <code>/dashboard</code></li></ul><h3 id="header-顶部" tabindex="-1">Header(顶部) <a class="header-anchor" href="#header-顶部" aria-label="Permalink to &quot;Header(顶部)&quot;">​</a></h3><div class="language-tsx vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">tsx</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">&lt;</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">Header</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> className</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;bg-white shadow-sm px-6 flex justify-between items-center&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">&gt;</span></span>
24
+ <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">div</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">&gt;&lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">div</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">&gt;</span></span>
25
+ <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">div</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> className</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;flex items-center&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">&gt;</span></span>
26
+ <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> &lt;</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">Dropdown</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> menu</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">{{ items: userMenuItems }} </span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">placement</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;bottomRight&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">&gt;</span></span>
27
+ <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> &lt;</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">Space</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> className</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;cursor-pointer&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">&gt;</span></span>
28
+ <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> &lt;</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">Avatar</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> src</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">{user?.avatar} </span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">size</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;small&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> /&gt;</span></span>
29
+ <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">span</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> className</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;text-sm&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">&gt;{user?.nickname}&lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">span</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">&gt;</span></span>
30
+ <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> &lt;/</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">Space</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">&gt;</span></span>
31
+ <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> &lt;/</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">Dropdown</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">&gt;</span></span>
32
+ <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> &lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">div</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">&gt;</span></span>
33
+ <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">&lt;/</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">Header</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">&gt;</span></span></code></pre></div><ul><li>左侧空 div 占位(未来放面包屑)</li><li>右侧头像 + 昵称 → 下拉菜单</li><li>下拉菜单当前只有「退出登录」(<code>userMenuItems</code>)</li></ul><h3 id="content-内容区" tabindex="-1">Content(内容区) <a class="header-anchor" href="#content-内容区" aria-label="Permalink to &quot;Content(内容区)&quot;">​</a></h3><div class="language-tsx vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">tsx</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">&lt;</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">Content</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> className</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;p-6 bg-gray-50 min-h-[calc(100vh-64px)]&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">&gt;</span></span>
34
+ <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> &lt;</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">Outlet</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> /&gt;</span></span>
35
+ <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">&lt;/</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">Content</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">&gt;</span></span></code></pre></div><ul><li><code>Outlet</code> 渲染子路由的 element(六个页面之一)</li><li><code>min-h-[calc(100vh-64px)]</code>:至少填满视口减 Header 高度,避免短内容页面底部有空白</li></ul><h2 id="退出登录-handlelogout" tabindex="-1">退出登录 <code>handleLogout</code> <a class="header-anchor" href="#退出登录-handlelogout" aria-label="Permalink to &quot;退出登录 \`handleLogout\`&quot;">​</a></h2><div class="language-ts vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">ts</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">const</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> handleLogout</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> async</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> () </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=&gt;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> {</span></span>
36
+ <span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> try</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> {</span></span>
37
+ <span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> await</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> logoutApi</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">()</span></span>
38
+ <span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> logout</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">()</span></span>
39
+ <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> message.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">success</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;退出成功&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">)</span></span>
40
+ <span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> navigate</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;/login&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">)</span></span>
41
+ <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> } </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">catch</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> (error) {</span></span>
42
+ <span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // 401 已被 axios 拦截处理,这里兜底调 logout + navigate</span></span>
43
+ <span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> logout</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">()</span></span>
44
+ <span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> navigate</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;/login&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">)</span></span>
45
+ <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
46
+ <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span></code></pre></div><ul><li>先调后端登出 API(mock 里直接返回成功)</li><li>无论成败都执行 <code>AuthContext.logout()</code> + <code>navigate(&#39;/login&#39;)</code></li><li>axios 拦截器已经在 401 时 <code>window.location.href = &#39;/login&#39;</code>,这里的兜底覆盖非 401 错误</li></ul><h2 id="依赖注入" tabindex="-1">依赖注入 <a class="header-anchor" href="#依赖注入" aria-label="Permalink to &quot;依赖注入&quot;">​</a></h2><div class="language-ts vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">ts</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">const</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> { </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">user</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">logout</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> } </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> useAuth</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">()</span></span>
47
+ <span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> navigate</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> useNavigate</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">()</span></span>
48
+ <span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> location</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> useLocation</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">()</span></span></code></pre></div><p>三个 hook:认证状态、路由导航、当前路径。用 <code>useAuth</code> 而非 loader 返回值是因为要用 <code>logout</code> 方法。</p><h2 id="相关" tabindex="-1">相关 <a class="header-anchor" href="#相关" aria-label="Permalink to &quot;相关&quot;">​</a></h2><ul><li>路由与守卫 → <a href="./routing-and-auth.html">routing-and-auth.md</a></li><li>各页面细节 → <a href="./pages.html">pages.md</a></li></ul>`,26)])])}const o=i(h,[["render",l]]);export{g as __pageData,o as default};
@@ -0,0 +1 @@
1
+ import{_ as i,o as a,c as n,a2 as t}from"./chunks/framework.D_Xv2a7c.js";const g=JSON.parse('{"title":"proxy-admin / 布局与菜单","description":"","frontmatter":{},"headers":[],"relativePath":"proxy-admin/layout-and-menu.md","filePath":"proxy-admin/layout-and-menu.md"}'),h={name:"proxy-admin/layout-and-menu.md"};function l(k,s,p,e,E,d){return a(),n("div",null,[...s[0]||(s[0]=[t("",26)])])}const o=i(h,[["render",l]]);export{g as __pageData,o as default};