@cc-monitoring/proxy-core 0.3.1 → 0.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (409) hide show
  1. package/dist/cli/__tests__/commands.test.js +20 -1
  2. package/dist/cli/commands/exec.js +31 -42
  3. package/dist/cli/commands/repair.d.ts +1 -0
  4. package/dist/cli/commands/repair.js +15 -0
  5. package/dist/cli/index.js +30 -0
  6. package/dist/docs/404.html +2 -2
  7. package/dist/docs/assets/{app.B9A39uFv.js → app.g7N9jkzn.js} +1 -1
  8. package/dist/docs/assets/chunks/@localSearchIndexroot.IHxQqfJH.js +1 -0
  9. package/dist/docs/assets/chunks/{VPLocalSearchBox.DdhC696L.js → VPLocalSearchBox.BHwI475_.js} +1 -1
  10. package/dist/docs/assets/chunks/{theme.CfB2tOFi.js → theme.FhAJSNDh.js} +2 -2
  11. package/dist/docs/assets/{proxy-cli_data-hooks.md.w9Oe1OD3.js → proxy-cli_data-hooks.md.Bz8CVbxO.js} +1 -1
  12. package/dist/docs/assets/{proxy-core_ui-routes.md.Dyqkeoiv.js → proxy-core_ui-routes.md.B21t1p7R.js} +1 -1
  13. package/dist/docs/hashmap.json +1 -1
  14. package/dist/docs/index.html +3 -3
  15. package/dist/docs/overview.html +3 -3
  16. package/dist/docs/packages-utils.html +3 -3
  17. package/dist/docs/proxy-admin/env-and-build.html +3 -3
  18. package/dist/docs/proxy-admin/index.html +3 -3
  19. package/dist/docs/proxy-admin/layout-and-menu.html +3 -3
  20. package/dist/docs/proxy-admin/pages.html +3 -3
  21. package/dist/docs/proxy-admin/routing-and-auth.html +3 -3
  22. package/dist/docs/proxy-admin/services-and-mock.html +3 -3
  23. package/dist/docs/proxy-cli/api-layer.html +3 -3
  24. package/dist/docs/proxy-cli/app-shell.html +3 -3
  25. package/dist/docs/proxy-cli/components-common.html +3 -3
  26. package/dist/docs/proxy-cli/components-config.html +3 -3
  27. package/dist/docs/proxy-cli/components-requests.html +3 -3
  28. package/dist/docs/proxy-cli/components-stats.html +3 -3
  29. package/dist/docs/proxy-cli/components-status.html +3 -3
  30. package/dist/docs/proxy-cli/data-hooks.html +5 -5
  31. package/dist/docs/proxy-cli/index.html +3 -3
  32. package/dist/docs/proxy-cli/utils-and-i18n.html +3 -3
  33. package/dist/docs/proxy-core/chat-api.html +3 -3
  34. package/dist/docs/proxy-core/cli.html +3 -3
  35. package/dist/docs/proxy-core/config.html +3 -3
  36. package/dist/docs/proxy-core/data-layer.html +3 -3
  37. package/dist/docs/proxy-core/entry.html +3 -3
  38. package/dist/docs/proxy-core/index.html +3 -3
  39. package/dist/docs/proxy-core/pm2.html +3 -3
  40. package/dist/docs/proxy-core/providers.html +3 -3
  41. package/dist/docs/proxy-core/proxy.html +3 -3
  42. package/dist/docs/proxy-core/stats.html +3 -3
  43. package/dist/docs/proxy-core/tool.html +3 -3
  44. package/dist/docs/proxy-core/ui-routes.html +5 -5
  45. package/dist/docs/proxy-core/utilities.html +3 -3
  46. package/dist/docs/quickstart.html +3 -3
  47. package/dist/docs/request-flow.html +3 -3
  48. package/dist/logger/index.d.ts +0 -3
  49. package/dist/logger/index.js +0 -1
  50. package/dist/mcp-server/tools.js +8 -9
  51. package/dist/server/__tests__/data-push.test.js +44 -0
  52. package/dist/server/__tests__/providers-route.test.js +1 -0
  53. package/dist/server/__tests__/proxy.test.js +281 -2
  54. package/dist/server/__tests__/server.test.js +15 -10
  55. package/dist/server/__tests__/ui-route.test.js +43 -0
  56. package/dist/server/auth.d.ts +0 -1
  57. package/dist/server/auth.js +1 -1
  58. package/dist/server/chat-route.js +48 -162
  59. package/dist/server/data-push.d.ts +2 -1
  60. package/dist/server/data-push.js +22 -7
  61. package/dist/server/index.js +4 -3
  62. package/dist/server/proxy.js +193 -229
  63. package/dist/server/ui-route.js +84 -60
  64. package/dist/tools/index.d.ts +1 -1
  65. package/dist/tools/index.js +1 -1
  66. package/dist/tools/registry.d.ts +0 -4
  67. package/dist/tools/registry.js +0 -8
  68. package/dist/types/config.d.ts +0 -13
  69. package/dist/types/pm2.d.ts +1 -2
  70. package/dist/ui/assets/{1c-DAu68mP4.js → 1c-CaPSZBmB.js} +1 -1
  71. package/dist/ui/assets/{abnf-Cu8RHCHK.js → abnf-DBDOsmne.js} +1 -1
  72. package/dist/ui/assets/{abnfDiagram-VRR7QNED-BUBToPXF.js → abnfDiagram-VRR7QNED-D8zK__Mj.js} +1 -1
  73. package/dist/ui/assets/{accesslog-BG-34XOy.js → accesslog-BOLs2Kig.js} +1 -1
  74. package/dist/ui/assets/{actionscript-iw0HHMGM.js → actionscript-BZYKhS1B.js} +1 -1
  75. package/dist/ui/assets/{ada-qRqj6VGQ.js → ada-DyacnMpg.js} +1 -1
  76. package/dist/ui/assets/{angelscript-BeaXyx_P.js → angelscript-CAN6j0H3.js} +1 -1
  77. package/dist/ui/assets/{apache-CU8d-z9X.js → apache-BE4vouiQ.js} +1 -1
  78. package/dist/ui/assets/{applescript-d1Wxkqz1.js → applescript-CS88I1yz.js} +1 -1
  79. package/dist/ui/assets/{arc-BMsPIm3j.js → arc-CTMmdrSV.js} +1 -1
  80. package/dist/ui/assets/{arcade-CtbgrWTM.js → arcade-B0f0f5SD.js} +1 -1
  81. package/dist/ui/assets/{architectureDiagram-ZJ3FMSHR-CVjC5TrS.js → architectureDiagram-ZJ3FMSHR-Dtvpnopp.js} +1 -1
  82. package/dist/ui/assets/{arduino-Bc9L39Hr.js → arduino-Bhm-OSb2.js} +1 -1
  83. package/dist/ui/assets/{armasm-DuWmpjWR.js → armasm-CEy-mDHc.js} +1 -1
  84. package/dist/ui/assets/{asciidoc-CDIhFTnx.js → asciidoc-CrZqQBTj.js} +1 -1
  85. package/dist/ui/assets/{aspectj-SYj-57Es.js → aspectj-B4IlFyyJ.js} +1 -1
  86. package/dist/ui/assets/{autohotkey-hBi5dq37.js → autohotkey-Cihy-FjA.js} +1 -1
  87. package/dist/ui/assets/{autoit-BSawXzhg.js → autoit-Dis_JVJq.js} +1 -1
  88. package/dist/ui/assets/{avrasm-CwYom8Np.js → avrasm-CVhMycHj.js} +1 -1
  89. package/dist/ui/assets/{awk-BvBRfGo2.js → awk-BCViwLf5.js} +1 -1
  90. package/dist/ui/assets/{axapta-CqUavA8k.js → axapta-pWB4JVB_.js} +1 -1
  91. package/dist/ui/assets/{bash-BS_ZnmEu.js → bash-B6Giryub.js} +1 -1
  92. package/dist/ui/assets/{basic-xbP4IXrN.js → basic-DcrjcHB0.js} +1 -1
  93. package/dist/ui/assets/{blockDiagram-677ZJIJ3-CmpI3f5p.js → blockDiagram-677ZJIJ3-DfhtgI1r.js} +1 -1
  94. package/dist/ui/assets/{bnf-BECwu6uW.js → bnf-cpKU0967.js} +1 -1
  95. package/dist/ui/assets/{brainfuck-QQgu4j4N.js → brainfuck-CFFdk4cM.js} +1 -1
  96. package/dist/ui/assets/{coq-IDMIFfem.js → c-CW6KPMeI.js} +1 -1
  97. package/dist/ui/assets/{c-like-DYrFOtXy.js → c-like-CWn59vrg.js} +1 -1
  98. package/dist/ui/assets/{c4Diagram-LMCZKHZV-B6Hgngz9.js → c4Diagram-LMCZKHZV-D1Oh6k37.js} +1 -1
  99. package/dist/ui/assets/{cal-CNMrJ6v5.js → cal-8i26_L39.js} +1 -1
  100. package/dist/ui/assets/{capnproto-DYCKl6oY.js → capnproto-CviwnFBf.js} +1 -1
  101. package/dist/ui/assets/{ceylon-mb8tRPl0.js → ceylon-CQyc4rWs.js} +1 -1
  102. package/dist/ui/assets/channel-Da2MvpNG.js +1 -0
  103. package/dist/ui/assets/{chunk-2Q5K7J3B-LxvQ-G67.js → chunk-2Q5K7J3B-oswPBwIn.js} +1 -1
  104. package/dist/ui/assets/{chunk-32BRIVSS-DxzKK6Aw.js → chunk-32BRIVSS-B5pU_9b9.js} +1 -1
  105. package/dist/ui/assets/{chunk-5VM5RSS4-CZEoYJ2W.js → chunk-5VM5RSS4-gvtfMc4w.js} +1 -1
  106. package/dist/ui/assets/{chunk-EX3LRPZG-DS2PytrN.js → chunk-EX3LRPZG-BkBaDMy4.js} +1 -1
  107. package/dist/ui/assets/{chunk-JWPE2WC7-UX0Sr1Ie.js → chunk-JWPE2WC7-Ch-C75ar.js} +1 -1
  108. package/dist/ui/assets/{chunk-MOJQB5TN-YbJgT9t4.js → chunk-MOJQB5TN-BfYhj1jN.js} +1 -1
  109. package/dist/ui/assets/{chunk-RYQCIY6F-DS2VH_U9.js → chunk-RYQCIY6F-D8izfruP.js} +1 -1
  110. package/dist/ui/assets/{chunk-V7JOEXUC-CZr0pkI1.js → chunk-V7JOEXUC-CbzHnW90.js} +1 -1
  111. package/dist/ui/assets/{chunk-VR4S4FIN-50opPAD3.js → chunk-VR4S4FIN-Dr4M5qZA.js} +1 -1
  112. package/dist/ui/assets/{chunk-XXDRQBXY-DAAX9l7U.js → chunk-XXDRQBXY-QE-R8dRe.js} +1 -1
  113. package/dist/ui/assets/classDiagram-OUVF2IWQ-mHUiWjcC.js +1 -0
  114. package/dist/ui/assets/classDiagram-v2-EOCWNBFH-mHUiWjcC.js +1 -0
  115. package/dist/ui/assets/{clean-C4X7dSkh.js → clean-DZeAtQ7H.js} +1 -1
  116. package/dist/ui/assets/{clojure-DSg9gUa7.js → clojure-U4ebZ7NQ.js} +1 -1
  117. package/dist/ui/assets/{clojure-repl-CagRYx7h.js → clojure-repl-B4QSIzUI.js} +1 -1
  118. package/dist/ui/assets/{cmake-CFdBn53c.js → cmake-UHexZySb.js} +1 -1
  119. package/dist/ui/assets/{coffeescript-CJZtMOPx.js → coffeescript-Dg56H9Mr.js} +1 -1
  120. package/dist/ui/assets/{c-BRJEPYra.js → coq-C1g3mm0X.js} +1 -1
  121. package/dist/ui/assets/{cos-Bx2VJuzG.js → cos-BL4DdyGh.js} +1 -1
  122. package/dist/ui/assets/{cose-bilkent-JH36ORCC-zWRLsZpZ.js → cose-bilkent-JH36ORCC-BHQslHP3.js} +1 -1
  123. package/dist/ui/assets/{cpp-CsG6DlC4.js → cpp-keZI-XAd.js} +1 -1
  124. package/dist/ui/assets/{crmsh-DTy9MnmJ.js → crmsh-DdXYVeeA.js} +1 -1
  125. package/dist/ui/assets/{crystal-BwgrLrZ1.js → crystal-C4AN0m0I.js} +1 -1
  126. package/dist/ui/assets/{csharp-B2VeTPAF.js → csharp-COUyKsNR.js} +1 -1
  127. package/dist/ui/assets/{csp-CTpydNhH.js → csp-DBc-rgSJ.js} +1 -1
  128. package/dist/ui/assets/{css-B0mMUbpY.js → css-B8m6O_Pw.js} +1 -1
  129. package/dist/ui/assets/{cynefin-VYW2F7L2-BmjQEj6q.js → cynefin-VYW2F7L2-B3L-WcKn.js} +1 -1
  130. package/dist/ui/assets/{cynefinDiagram-TSTJHNR4-Dr0Zrke0.js → cynefinDiagram-TSTJHNR4-fzaM4qcZ.js} +1 -1
  131. package/dist/ui/assets/{d-DjuDZnbI.js → d-dgQN4Rko.js} +1 -1
  132. package/dist/ui/assets/{dagre-VKFMJZFB-xoTPT2Uu.js → dagre-VKFMJZFB-DJHj16mR.js} +1 -1
  133. package/dist/ui/assets/{dart-xR3GU9TJ.js → dart-D2Y7LOq-.js} +1 -1
  134. package/dist/ui/assets/{delphi-bJas5QnG.js → delphi-DaGcSk5A.js} +1 -1
  135. package/dist/ui/assets/{diagram-FQU43EPY-rL_IU7gU.js → diagram-FQU43EPY-iZEZ1f-R.js} +1 -1
  136. package/dist/ui/assets/{diagram-G47NLZAW-EcDiCVGj.js → diagram-G47NLZAW-rkQb3r-C.js} +1 -1
  137. package/dist/ui/assets/{diagram-NH7WQ7WH-CGGXOjev.js → diagram-NH7WQ7WH-B4Fy72tP.js} +1 -1
  138. package/dist/ui/assets/{diagram-OA4YK3LP-DnE7hDjD.js → diagram-OA4YK3LP-BndmuIBq.js} +1 -1
  139. package/dist/ui/assets/{diagram-WEI45ONY-CTJH5eD8.js → diagram-WEI45ONY-CwlAiqOe.js} +1 -1
  140. package/dist/ui/assets/{diff-doJFF3fv.js → diff-prcRV1Y3.js} +1 -1
  141. package/dist/ui/assets/{django-D3b-owa_.js → django-B1zIoGSx.js} +1 -1
  142. package/dist/ui/assets/{dns-C42KYV-Z.js → dns-ZxI_aTwc.js} +1 -1
  143. package/dist/ui/assets/{dockerfile-9KUINc2j.js → dockerfile-Dp_fT6E-.js} +1 -1
  144. package/dist/ui/assets/{dos-CxnlJ6qp.js → dos-Cuu5c8vv.js} +1 -1
  145. package/dist/ui/assets/{dsconfig-6CMMCwmY.js → dsconfig-DcGTOhbS.js} +1 -1
  146. package/dist/ui/assets/{dts-D78rdUIB.js → dts-DCF8VaRk.js} +1 -1
  147. package/dist/ui/assets/{dust-Dv1uTfJU.js → dust-DeCmZWMK.js} +1 -1
  148. package/dist/ui/assets/{ebnf-BGbG1cFK.js → ebnf-BHQQcuF_.js} +1 -1
  149. package/dist/ui/assets/{ebnfDiagram-CCIWWBDH-z2VgRSUV.js → ebnfDiagram-CCIWWBDH-DJ_RuhTm.js} +1 -1
  150. package/dist/ui/assets/{elixir-ZgAQVY1J.js → elixir-BHmweJ4d.js} +1 -1
  151. package/dist/ui/assets/{elm-CudiFuNu.js → elm-v76Hd2B3.js} +1 -1
  152. package/dist/ui/assets/{erDiagram-Q63AITRT-X1TODuRv.js → erDiagram-Q63AITRT-DVZkY5RZ.js} +1 -1
  153. package/dist/ui/assets/{erb-Bz_NZh6W.js → erb-xvWF5bfx.js} +1 -1
  154. package/dist/ui/assets/{erlang-DNuj1nb2.js → erlang-CKBMURym.js} +1 -1
  155. package/dist/ui/assets/{erlang-repl-SP1Gan9W.js → erlang-repl-BjcfXt3Z.js} +1 -1
  156. package/dist/ui/assets/{excel-0K77uECF.js → excel-Cdrtxhml.js} +1 -1
  157. package/dist/ui/assets/{fix-CalJq7JD.js → fix-CB-So5So.js} +1 -1
  158. package/dist/ui/assets/{flix-BlIs11_w.js → flix-VM9AOrq6.js} +1 -1
  159. package/dist/ui/assets/{flowDiagram-23GEKE2U-DA2dnmc0.js → flowDiagram-23GEKE2U-vyGW67Xm.js} +1 -1
  160. package/dist/ui/assets/{fortran-ZCobXY2R.js → fortran-CcwJVO8H.js} +1 -1
  161. package/dist/ui/assets/{fsharp-Be8rwUtc.js → fsharp-DiATpw1u.js} +1 -1
  162. package/dist/ui/assets/{gams-DUat8frQ.js → gams-Csg9YNPz.js} +1 -1
  163. package/dist/ui/assets/{ganttDiagram-NO4QXBWP-DdFwaIGZ.js → ganttDiagram-NO4QXBWP-C2TRbwLw.js} +1 -1
  164. package/dist/ui/assets/{gauss-BB4U88dy.js → gauss-Bc4TC8Wh.js} +1 -1
  165. package/dist/ui/assets/{gcode-DzeUZuZg.js → gcode-Rig_2OoA.js} +1 -1
  166. package/dist/ui/assets/{gherkin-B_8vW_BO.js → gherkin-ByBU06QB.js} +1 -1
  167. package/dist/ui/assets/{gitGraphDiagram-IHSO6WYX-B-Dn8x6I.js → gitGraphDiagram-IHSO6WYX-CEiqfFIF.js} +1 -1
  168. package/dist/ui/assets/{glsl-DGHGjPC1.js → glsl-C8D6y2Tn.js} +1 -1
  169. package/dist/ui/assets/{gml-BYEku8Yh.js → gml-PHpGPHbT.js} +1 -1
  170. package/dist/ui/assets/{go-D8aSgQMc.js → go-BL_o_3ez.js} +1 -1
  171. package/dist/ui/assets/{golo-CDjCU_jh.js → golo-CWQ6dTUz.js} +1 -1
  172. package/dist/ui/assets/{gradle-BeUw7tl_.js → gradle-Y_I2KN2z.js} +1 -1
  173. package/dist/ui/assets/{groovy-5iCQOtR3.js → groovy-JnIv8p2l.js} +1 -1
  174. package/dist/ui/assets/{haml-BEdL8FJi.js → haml-B8W_h6mZ.js} +1 -1
  175. package/dist/ui/assets/{handlebars-BuYQNzoK.js → handlebars-DVm8mJuD.js} +1 -1
  176. package/dist/ui/assets/{haskell-I4FCBcW0.js → haskell-DlDi2Ty7.js} +1 -1
  177. package/dist/ui/assets/{haxe-yigyKfFr.js → haxe-CftFNVE-.js} +1 -1
  178. package/dist/ui/assets/{hsp-ZUk4j7d1.js → hsp-C67xnq9C.js} +1 -1
  179. package/dist/ui/assets/{htmlbars-QYP3lT3u.js → htmlbars-CmJCm67U.js} +1 -1
  180. package/dist/ui/assets/{http-BJpD1O71.js → http-b-FPEcHP.js} +1 -1
  181. package/dist/ui/assets/{hy-CIJ1bP6S.js → hy-BWD3ncpN.js} +1 -1
  182. package/dist/ui/assets/{index-COAgrx1J.js → index-C7s1zgJb.js} +242 -242
  183. package/dist/ui/assets/{index-BDXWttnT.js → index-D2UBwfSG.js} +3 -3
  184. package/dist/ui/assets/index-DlsVXaHT.css +10 -0
  185. package/dist/ui/assets/{infoDiagram-FWYZ7A6U-fTg9eLNt.js → infoDiagram-FWYZ7A6U-C0Px17IN.js} +1 -1
  186. package/dist/ui/assets/{inform7-DAsu-lC2.js → inform7-C-OYaMO5.js} +1 -1
  187. package/dist/ui/assets/{ini-Bhz-zHCg.js → ini-CVyYmykw.js} +1 -1
  188. package/dist/ui/assets/{irpf90-BunhbwBl.js → irpf90-BcpjWXIz.js} +1 -1
  189. package/dist/ui/assets/{isbl-q9L6hOhP.js → isbl-ZraBBeEr.js} +1 -1
  190. package/dist/ui/assets/{ishikawaDiagram-FXEZZL3T-B8G0sdgd.js → ishikawaDiagram-FXEZZL3T-BjmTMgpO.js} +1 -1
  191. package/dist/ui/assets/{java-Iks5Pkau.js → java-D_mE2DT6.js} +1 -1
  192. package/dist/ui/assets/{javascript-C4vltXPw.js → javascript-akXESsox.js} +1 -1
  193. package/dist/ui/assets/{jboss-cli-BQBvd2X2.js → jboss-cli-CFe3gTDt.js} +1 -1
  194. package/dist/ui/assets/{journeyDiagram-5HDEW3XC-Crbzgrum.js → journeyDiagram-5HDEW3XC-BpgJUvs6.js} +1 -1
  195. package/dist/ui/assets/{json-DXK0_jUK.js → json-sjN7AzRC.js} +1 -1
  196. package/dist/ui/assets/{julia-CCYoBiYK.js → julia-BJJYbUMV.js} +1 -1
  197. package/dist/ui/assets/{julia-repl-y8v2Oorl.js → julia-repl-BwruD8Ix.js} +1 -1
  198. package/dist/ui/assets/{kanban-definition-HUTT4EX6-C8sCOsBX.js → kanban-definition-HUTT4EX6-DFlE9edA.js} +1 -1
  199. package/dist/ui/assets/{kotlin-Bnjk7_fw.js → kotlin-CAIQsLCF.js} +1 -1
  200. package/dist/ui/assets/{lasso-B-al6x63.js → lasso-sU67h-5u.js} +1 -1
  201. package/dist/ui/assets/{latex-BUmqlb9r.js → latex-CVX-jP88.js} +1 -1
  202. package/dist/ui/assets/{ldif-D42RWj6Q.js → ldif-DGM9xbFZ.js} +1 -1
  203. package/dist/ui/assets/{leaf-CrH4BZ0m.js → leaf-AlB_zmwz.js} +1 -1
  204. package/dist/ui/assets/{less-upmRlQQW.js → less-CKwfEdZQ.js} +1 -1
  205. package/dist/ui/assets/{lisp-DHYS22SA.js → lisp-CXYLaAPw.js} +1 -1
  206. package/dist/ui/assets/{livecodeserver-CeQNmFP3.js → livecodeserver-C02fGGTS.js} +1 -1
  207. package/dist/ui/assets/{livescript-PJWpY1JI.js → livescript-CBMa8QF_.js} +1 -1
  208. package/dist/ui/assets/{llvm-BKtKWwCt.js → llvm-WXTIohTC.js} +1 -1
  209. package/dist/ui/assets/{lsl-RWRLRjk7.js → lsl-4obd2U_I.js} +1 -1
  210. package/dist/ui/assets/{lua-BFUDiPGm.js → lua-DTSy-TjF.js} +1 -1
  211. package/dist/ui/assets/{makefile-CUDyOz5D.js → makefile-Bf2UEO0i.js} +1 -1
  212. package/dist/ui/assets/{markdown-zZCLypc6.js → markdown-BgoGmFfJ.js} +1 -1
  213. package/dist/ui/assets/{mathematica-BHbxKxnq.js → mathematica-CSiA8KQh.js} +1 -1
  214. package/dist/ui/assets/{matlab-DlGtg--p.js → matlab-DoMvLsGB.js} +1 -1
  215. package/dist/ui/assets/{maxima-BBBeS3Ra.js → maxima-BFO4dfZO.js} +1 -1
  216. package/dist/ui/assets/{mel-nh8j7W_6.js → mel-DyBpmDxt.js} +1 -1
  217. package/dist/ui/assets/{mercury-DyyD-pqr.js → mercury-OL5G5uU6.js} +1 -1
  218. package/dist/ui/assets/{mindmap-definition-LN4V7U3C-CJlhDHqM.js → mindmap-definition-LN4V7U3C-s-nUZuCs.js} +1 -1
  219. package/dist/ui/assets/{mipsasm-hiEhRRiq.js → mipsasm-KQwdm39j.js} +1 -1
  220. package/dist/ui/assets/{mizar-BZa3iAAL.js → mizar-BqndJ30I.js} +1 -1
  221. package/dist/ui/assets/{mojolicious-BCIm2V_y.js → mojolicious-Bvc1uJd-.js} +1 -1
  222. package/dist/ui/assets/{monkey-zmK-7N8b.js → monkey-Dl_gLm7-.js} +1 -1
  223. package/dist/ui/assets/{moonscript-BsS_Mn3D.js → moonscript-BL6R6eAz.js} +1 -1
  224. package/dist/ui/assets/{n1ql-D7xVgDP0.js → n1ql-C09iOJfQ.js} +1 -1
  225. package/dist/ui/assets/{nginx-ct2q4dtd.js → nginx-C7W01nBr.js} +1 -1
  226. package/dist/ui/assets/{nim-RO0UOmW3.js → nim-Dj78szvD.js} +1 -1
  227. package/dist/ui/assets/{nix-BcRJxPKH.js → nix-BOtGyPmd.js} +1 -1
  228. package/dist/ui/assets/{node-repl-DgIefwxW.js → node-repl-19nZvZ4A.js} +1 -1
  229. package/dist/ui/assets/{nsis-DqHs9QhB.js → nsis-ByCl1zIm.js} +1 -1
  230. package/dist/ui/assets/{objectivec-BBcWqc7Y.js → objectivec-BhdaT_Jr.js} +1 -1
  231. package/dist/ui/assets/{ocaml-BExfw7D6.js → ocaml-D_NXvSO7.js} +1 -1
  232. package/dist/ui/assets/{openscad-CHPRELQb.js → openscad-DOhagvnA.js} +1 -1
  233. package/dist/ui/assets/{oxygene-DpS9uMJW.js → oxygene-5BnkqMRH.js} +1 -1
  234. package/dist/ui/assets/{parser3-CjJ_QdBp.js → parser3-jSWlxi8m.js} +1 -1
  235. package/dist/ui/assets/{pegDiagram-2B236MQR-GM70woGy.js → pegDiagram-2B236MQR-CideH-XT.js} +1 -1
  236. package/dist/ui/assets/{perl-BSNM2Kt8.js → perl-CfsqjZ4b.js} +1 -1
  237. package/dist/ui/assets/{pf-Z-hKf_88.js → pf-kOewxO29.js} +1 -1
  238. package/dist/ui/assets/{pgsql-DDgznxBg.js → pgsql-CXm2Xd-Z.js} +1 -1
  239. package/dist/ui/assets/{php-BzAhxF-l.js → php-CRiA_dH8.js} +1 -1
  240. package/dist/ui/assets/{php-template-DkgcKHRc.js → php-template-ByMrxqSd.js} +1 -1
  241. package/dist/ui/assets/{pieDiagram-ENE6RG2P-Bst7mPyz.js → pieDiagram-ENE6RG2P-CJkCdB38.js} +1 -1
  242. package/dist/ui/assets/{plaintext-BYEppD0R.js → plaintext-BJx0R6A5.js} +1 -1
  243. package/dist/ui/assets/{pony-BT_kQd1K.js → pony-CozCHtz4.js} +1 -1
  244. package/dist/ui/assets/{powershell-BfRsuSsf.js → powershell-BT7gMMgn.js} +1 -1
  245. package/dist/ui/assets/{processing-DpzWe5Iu.js → processing-FOIxn_W_.js} +1 -1
  246. package/dist/ui/assets/{profile-BCOhS5cM.js → profile-BsoUuD9w.js} +1 -1
  247. package/dist/ui/assets/{prolog-OxaCCaW8.js → prolog-Bd3gvQ2N.js} +1 -1
  248. package/dist/ui/assets/{properties-DMFlA2Ca.js → properties-BWGFdny9.js} +1 -1
  249. package/dist/ui/assets/{protobuf-CRDFkXvZ.js → protobuf-pQSKoOOY.js} +1 -1
  250. package/dist/ui/assets/{puppet-DnrVyLzx.js → puppet-DnEN_mgS.js} +1 -1
  251. package/dist/ui/assets/{purebasic-Dht4Hniv.js → purebasic-BqoOGoRw.js} +1 -1
  252. package/dist/ui/assets/{python-B0aMirWu.js → python-TeVYomkE.js} +1 -1
  253. package/dist/ui/assets/{python-repl-BlYDBGa7.js → python-repl-zqu5igFS.js} +1 -1
  254. package/dist/ui/assets/{q-DzrtW9kT.js → q-CZC9Dltd.js} +1 -1
  255. package/dist/ui/assets/{qml-DnfQsR3i.js → qml-ZNInP45Q.js} +1 -1
  256. package/dist/ui/assets/{quadrantDiagram-ABIIQ3AL-DNRYurBT.js → quadrantDiagram-ABIIQ3AL-Dd7PwxsF.js} +1 -1
  257. package/dist/ui/assets/{r-DGI_ZuTD.js → r-B39DAmkC.js} +1 -1
  258. package/dist/ui/assets/{railroadDiagram-RFXS5EU6-CmbC3Vz4.js → railroadDiagram-RFXS5EU6-DtO5PVFZ.js} +1 -1
  259. package/dist/ui/assets/{reasonml-3SohMgh2.js → reasonml-B-ZWFJt_.js} +1 -1
  260. package/dist/ui/assets/{requirementDiagram-TGXJPOKE-8CxrXHco.js → requirementDiagram-TGXJPOKE-DihF4OTj.js} +1 -1
  261. package/dist/ui/assets/{rib-DfRSd4Qa.js → rib-CnGG0qMF.js} +1 -1
  262. package/dist/ui/assets/{roboconf-CQczGdGW.js → roboconf-Ewtfps4u.js} +1 -1
  263. package/dist/ui/assets/{routeros-DCka-T2i.js → routeros-CPcmP1c7.js} +1 -1
  264. package/dist/ui/assets/{rsl-Dr8MOwMo.js → rsl-NbjWFbPH.js} +1 -1
  265. package/dist/ui/assets/{ruby-C2zFSkh_.js → ruby-DWDdy5yE.js} +1 -1
  266. package/dist/ui/assets/{ruleslanguage-C97YsgQq.js → ruleslanguage-Cv_DZe2r.js} +1 -1
  267. package/dist/ui/assets/{rust-H3h8kd9A.js → rust-NZnsfER5.js} +1 -1
  268. package/dist/ui/assets/{sankeyDiagram-HTMAVEWB-DBXLWjEq.js → sankeyDiagram-HTMAVEWB-D6i-Mzte.js} +1 -1
  269. package/dist/ui/assets/{sas-04z0Xu8P.js → sas-C4wv0P6G.js} +1 -1
  270. package/dist/ui/assets/{scala-DyB9Aoiv.js → scala-DUdTOIgx.js} +1 -1
  271. package/dist/ui/assets/{scheme-DBj6nxUi.js → scheme-DEdFa14t.js} +1 -1
  272. package/dist/ui/assets/{scilab-Btj7AD9s.js → scilab-xY51J2bR.js} +1 -1
  273. package/dist/ui/assets/{scss-BXZJyXt7.js → scss-BEYp1sXc.js} +1 -1
  274. package/dist/ui/assets/{sequenceDiagram-DBY2YBRQ-DXIkBFKC.js → sequenceDiagram-DBY2YBRQ-njQlqy_J.js} +1 -1
  275. package/dist/ui/assets/{shell-BsreQR1Z.js → shell-fq6bkhOw.js} +1 -1
  276. package/dist/ui/assets/{sizeCapture-X5ZJPWSS-ocS9jxAQ.js → sizeCapture-X5ZJPWSS-tLn70-Fb.js} +1 -1
  277. package/dist/ui/assets/{smali-D9wQw9zm.js → smali-CsSAuSYg.js} +1 -1
  278. package/dist/ui/assets/{smalltalk-Dku6G_H3.js → smalltalk-DJ7zrd87.js} +1 -1
  279. package/dist/ui/assets/{sml-BknyU6ya.js → sml-CnDwl0nH.js} +1 -1
  280. package/dist/ui/assets/{sqf-DRYMaOg8.js → sqf-Cc2SX4Zy.js} +1 -1
  281. package/dist/ui/assets/{sql-Cw3Ax4KA.js → sql-DUQA_V_4.js} +1 -1
  282. package/dist/ui/assets/{sql_more-vWdslLE0.js → sql_more-BHoH-8oO.js} +1 -1
  283. package/dist/ui/assets/{stan-8XH5bDS6.js → stan-D-7F5jH6.js} +1 -1
  284. package/dist/ui/assets/{stata-4e77wgfe.js → stata-xKD_DnDE.js} +1 -1
  285. package/dist/ui/assets/{stateDiagram-2N3HPSRC-RMmL9jMG.js → stateDiagram-2N3HPSRC-B4O8weor.js} +1 -1
  286. package/dist/ui/assets/stateDiagram-v2-6OUMAXLB-CO881_ht.js +1 -0
  287. package/dist/ui/assets/{step21-ByIeDMY3.js → step21-obc_kzQY.js} +1 -1
  288. package/dist/ui/assets/{stylus-ZAhJyWsw.js → stylus-CkAUSRd-.js} +1 -1
  289. package/dist/ui/assets/{subunit-pPW2UGkj.js → subunit-BDv8PGo1.js} +1 -1
  290. package/dist/ui/assets/{swift-CX3BB5az.js → swift-CHsYyW-p.js} +1 -1
  291. package/dist/ui/assets/{swimlanes-5IMT3BWC-C2zAuJ56.js → swimlanes-5IMT3BWC-DSr9Ty4A.js} +2 -2
  292. package/dist/ui/assets/swimlanesDiagram-G3AALYLV-DFMCDs8b.js +8 -0
  293. package/dist/ui/assets/{taggerscript-BHcjbWIC.js → taggerscript-C_2JQgO9.js} +1 -1
  294. package/dist/ui/assets/{tap-BOl1lBlS.js → tap-Bi497Z2c.js} +1 -1
  295. package/dist/ui/assets/{tcl-DZjeOBDh.js → tcl-B1XMvLaD.js} +1 -1
  296. package/dist/ui/assets/{thrift-BxboWg4x.js → thrift-D9X0Hmmc.js} +1 -1
  297. package/dist/ui/assets/{timeline-definition-FHXFAJF6-BOxsxyq_.js → timeline-definition-FHXFAJF6-C4_gj50B.js} +1 -1
  298. package/dist/ui/assets/{tp-BNM6ql3J.js → tp-CJG4Odbx.js} +1 -1
  299. package/dist/ui/assets/{twig-Dj9ZiXD4.js → twig-flj72_wc.js} +1 -1
  300. package/dist/ui/assets/{typescript-7MEJlu_6.js → typescript-CWPwVoLd.js} +1 -1
  301. package/dist/ui/assets/{vala-DNqOAgHJ.js → vala-LuCNWNuU.js} +1 -1
  302. package/dist/ui/assets/{vbnet-T0mNKVc_.js → vbnet-CGUT6ss0.js} +1 -1
  303. package/dist/ui/assets/{vbscript-CeuwVMAI.js → vbscript-CNiUBJhn.js} +1 -1
  304. package/dist/ui/assets/{vbscript-html-BbJSt2w6.js → vbscript-html-CJGgjjbc.js} +1 -1
  305. package/dist/ui/assets/{vennDiagram-L72KCM5P-BX9mWeiT.js → vennDiagram-L72KCM5P-BxcAUnYo.js} +1 -1
  306. package/dist/ui/assets/{verilog-DYuhYfkX.js → verilog-C4f9ZBTK.js} +1 -1
  307. package/dist/ui/assets/{vhdl-Cf9aT-t7.js → vhdl-CyDQIZve.js} +1 -1
  308. package/dist/ui/assets/{vim-DciP44K1.js → vim-XAUBqa0M.js} +1 -1
  309. package/dist/ui/assets/{wardleyDiagram-EHGQE667-CDj2rOzu.js → wardleyDiagram-EHGQE667-DlwSH77q.js} +1 -1
  310. package/dist/ui/assets/{x86asm-E-AN_LXO.js → x86asm-Cp6vHuUx.js} +1 -1
  311. package/dist/ui/assets/{xl-CxYLJelN.js → xl-BHgDofIM.js} +1 -1
  312. package/dist/ui/assets/{xml-yz1SRLuU.js → xml-QloVn4s_.js} +1 -1
  313. package/dist/ui/assets/{xquery-BLzBF3tV.js → xquery-spJZLmyM.js} +1 -1
  314. package/dist/ui/assets/{xychartDiagram-FW5EYKEG-Czapk9-Z.js → xychartDiagram-FW5EYKEG-BxGVZcnb.js} +1 -1
  315. package/dist/ui/assets/{yaml-Cv4Y7iN_.js → yaml-CUju4iq0.js} +1 -1
  316. package/dist/ui/assets/{zephir-KRcdQfEX.js → zephir-ChVpmD0Y.js} +1 -1
  317. package/dist/ui/index.html +2 -2
  318. package/dist/utils/__tests__/abort-signals.test.js +67 -0
  319. package/dist/utils/__tests__/db-maintenance.test.js +55 -0
  320. package/dist/utils/__tests__/db-migration.test.js +79 -1
  321. package/dist/utils/__tests__/inject-loop.test.js +1 -53
  322. package/dist/utils/__tests__/learn-tasks-db.test.js +82 -0
  323. package/dist/utils/__tests__/openai-converter.test.js +25 -0
  324. package/dist/utils/__tests__/pi-crawl-tools.test.js +15 -4
  325. package/dist/utils/__tests__/pi-dedup-reconcile.test.js +11 -9
  326. package/dist/utils/__tests__/pi-events.test.d.ts +1 -0
  327. package/dist/utils/__tests__/pi-events.test.js +172 -0
  328. package/dist/utils/__tests__/pi-learn-orchestrator.test.js +216 -6
  329. package/dist/utils/__tests__/pi-runtime-json.test.js +38 -3
  330. package/dist/utils/__tests__/providers-db.test.js +40 -2
  331. package/dist/utils/__tests__/request-writer.test.js +532 -39
  332. package/dist/utils/__tests__/sse-protocol.test.d.ts +1 -0
  333. package/dist/utils/__tests__/sse-protocol.test.js +115 -0
  334. package/dist/utils/__tests__/stats-aggregator.test.d.ts +1 -0
  335. package/dist/utils/__tests__/stats-aggregator.test.js +114 -0
  336. package/dist/utils/__tests__/vault.test.d.ts +1 -0
  337. package/dist/utils/__tests__/{knowledge-store.test.js → vault.test.js} +16 -16
  338. package/dist/utils/abort-signals.d.ts +13 -0
  339. package/dist/utils/abort-signals.js +33 -0
  340. package/dist/utils/db-maintenance.d.ts +8 -0
  341. package/dist/utils/db-maintenance.js +18 -0
  342. package/dist/utils/db.d.ts +2 -0
  343. package/dist/utils/db.js +86 -0
  344. package/dist/utils/esm-dirname.d.ts +0 -15
  345. package/dist/utils/esm-dirname.js +0 -4
  346. package/dist/utils/inject-loop.d.ts +0 -27
  347. package/dist/utils/inject-loop.js +2 -56
  348. package/dist/utils/learn-tasks-db.d.ts +15 -0
  349. package/dist/utils/learn-tasks-db.js +35 -0
  350. package/dist/utils/openai-converter.js +88 -78
  351. package/dist/utils/pi-browser-tools.d.ts +0 -2
  352. package/dist/utils/pi-browser-tools.js +0 -174
  353. package/dist/utils/pi-crawl-tools.d.ts +2 -1
  354. package/dist/utils/pi-crawl-tools.js +16 -11
  355. package/dist/utils/pi-dedup.d.ts +8 -30
  356. package/dist/utils/pi-dedup.js +32 -67
  357. package/dist/utils/pi-events.d.ts +65 -0
  358. package/dist/utils/pi-events.js +98 -0
  359. package/dist/utils/pi-learn-orchestrator.d.ts +6 -5
  360. package/dist/utils/pi-learn-orchestrator.js +71 -106
  361. package/dist/utils/pi-runtime.d.ts +5 -6
  362. package/dist/utils/pi-runtime.js +38 -42
  363. package/dist/utils/pi-sandbox-ops.d.ts +0 -36
  364. package/dist/utils/pi-sandbox-ops.js +5 -190
  365. package/dist/utils/providers-db.d.ts +3 -0
  366. package/dist/utils/providers-db.js +21 -7
  367. package/dist/utils/request-writer.d.ts +77 -26
  368. package/dist/utils/request-writer.js +362 -56
  369. package/dist/utils/sse-protocol.d.ts +34 -0
  370. package/dist/utils/sse-protocol.js +121 -0
  371. package/dist/utils/sse-stream-processor.d.ts +4 -9
  372. package/dist/utils/sse-stream-processor.js +13 -104
  373. package/dist/utils/sse-writer.d.ts +1 -1
  374. package/dist/utils/sse-writer.js +3 -2
  375. package/dist/utils/stats-aggregator.d.ts +1 -1
  376. package/dist/utils/stats-aggregator.js +44 -24
  377. package/dist/utils/tool-injector.js +7 -0
  378. package/dist/utils/vault.d.ts +111 -0
  379. package/dist/utils/vault.js +434 -0
  380. package/ecosystem.config.cjs +2 -1
  381. package/package.json +1 -1
  382. package/dist/docs/assets/chunks/@localSearchIndexroot.B6Qfxe6W.js +0 -1
  383. package/dist/server/middleware/__tests__/request-id.test.js +0 -28
  384. package/dist/server/middleware/request-id.d.ts +0 -2
  385. package/dist/server/middleware/request-id.js +0 -12
  386. package/dist/types/api.d.ts +0 -20
  387. package/dist/types/index.d.ts +0 -4
  388. package/dist/types/index.js +0 -4
  389. package/dist/types/log.d.ts +0 -13
  390. package/dist/ui/assets/channel-Bc4Td8eZ.js +0 -1
  391. package/dist/ui/assets/classDiagram-OUVF2IWQ-BicxhZFq.js +0 -1
  392. package/dist/ui/assets/classDiagram-v2-EOCWNBFH-BicxhZFq.js +0 -1
  393. package/dist/ui/assets/index-C0fxlU9d.css +0 -10
  394. package/dist/ui/assets/stateDiagram-v2-6OUMAXLB-QvaEO5U6.js +0 -1
  395. package/dist/ui/assets/swimlanesDiagram-G3AALYLV-DPgCOY0D.js +0 -8
  396. package/dist/utils/__tests__/sse-accumulator.test.js +0 -83
  397. package/dist/utils/knowledge-store.d.ts +0 -51
  398. package/dist/utils/knowledge-store.js +0 -241
  399. package/dist/utils/migrate-files-to-db.d.ts +0 -1
  400. package/dist/utils/migrate-files-to-db.js +0 -138
  401. package/dist/utils/sse-accumulator.d.ts +0 -9
  402. package/dist/utils/sse-accumulator.js +0 -59
  403. /package/dist/docs/assets/{proxy-cli_data-hooks.md.w9Oe1OD3.lean.js → proxy-cli_data-hooks.md.Bz8CVbxO.lean.js} +0 -0
  404. /package/dist/docs/assets/{proxy-core_ui-routes.md.Dyqkeoiv.lean.js → proxy-core_ui-routes.md.B21t1p7R.lean.js} +0 -0
  405. /package/dist/server/{middleware/__tests__/request-id.test.d.ts → __tests__/data-push.test.d.ts} +0 -0
  406. /package/dist/{types/api.js → utils/__tests__/abort-signals.test.d.ts} +0 -0
  407. /package/dist/{types/log.js → utils/__tests__/db-maintenance.test.d.ts} +0 -0
  408. /package/dist/utils/__tests__/{knowledge-store.test.d.ts → learn-tasks-db.test.d.ts} +0 -0
  409. /package/dist/utils/__tests__/{sse-accumulator.test.d.ts → openai-converter.test.d.ts} +0 -0
@@ -0,0 +1,121 @@
1
+ /**
2
+ * SSE 帧协议:字节流 ↔ SSE 帧 的唯一知识收敛点。
3
+ *
4
+ * - SSE 帧(frame):字节流按 SSE 规范切分出的单位,由若干字段行
5
+ * (event: / data: / id: / 注释 / 空行分发)组成。
6
+ * - SSE 事件(event):SSE 帧的 data 字段解析出的 JSON 消息。
7
+ *
8
+ * 解析遵循 HTML spec 的 event stream 语义:残帧缓冲、LF/CRLF/CR 行尾、
9
+ * 空行分发、字段行去掉恰好一个可选空格。
10
+ */
11
+ /** 创建 SSE 帧解码器:每分发一个完整 SSE 帧回调一次 */
12
+ export function createSSEDecoder(onFrame) {
13
+ // 残帧缓冲:跨 chunk 的不完整行
14
+ let leftover = '';
15
+ let event;
16
+ let data = [];
17
+ let id;
18
+ /** 分发当前帧:至少含一个 data 行才回调;分发后重置字段状态 */
19
+ function dispatch() {
20
+ if (data.length > 0) {
21
+ onFrame({ event, data, id });
22
+ }
23
+ event = undefined;
24
+ id = undefined;
25
+ data = [];
26
+ }
27
+ /** 处理一个完整行 */
28
+ function handleLine(line) {
29
+ // 空行 = 一帧分发
30
+ if (line === '') {
31
+ dispatch();
32
+ return;
33
+ }
34
+ // 以冒号开头的行是注释,忽略
35
+ if (line.startsWith(':'))
36
+ return;
37
+ let field;
38
+ let value;
39
+ const colon = line.indexOf(':');
40
+ if (colon === -1) {
41
+ field = line;
42
+ value = '';
43
+ }
44
+ else {
45
+ field = line.slice(0, colon);
46
+ value = line.slice(colon + 1);
47
+ // 去掉字段值行首恰好一个可选空格
48
+ if (value.startsWith(' '))
49
+ value = value.slice(1);
50
+ }
51
+ if (field === 'event') {
52
+ event = value;
53
+ }
54
+ else if (field === 'data') {
55
+ // 多行 data 逐行保留,消费时用 \n join
56
+ data.push(value);
57
+ }
58
+ else if (field === 'id') {
59
+ id = value;
60
+ }
61
+ }
62
+ /** 消费文本中所有完整行,末段保留为残帧 */
63
+ function feed(text) {
64
+ // CRLF 与单独 CR 统一为 LF
65
+ const normalized = text.replace(/\r\n?/g, '\n');
66
+ const lines = normalized.split('\n');
67
+ leftover = lines.pop() || '';
68
+ for (const line of lines)
69
+ handleLine(line);
70
+ }
71
+ return {
72
+ write(chunk) {
73
+ const chunkText = typeof chunk === 'string' ? chunk : chunk.toString('utf-8');
74
+ feed(leftover + chunkText);
75
+ },
76
+ end() {
77
+ // 先按残帧缓冲补一次切行
78
+ if (leftover !== '') {
79
+ const normalized = leftover.replace(/\r\n?/g, '\n');
80
+ leftover = '';
81
+ for (const line of normalized.split('\n'))
82
+ handleLine(line);
83
+ }
84
+ // 再对缓冲中尚未分发的非空帧做一次分发(末尾无空行也能输出最后一帧)
85
+ if (data.length > 0)
86
+ dispatch();
87
+ // 清空状态
88
+ leftover = '';
89
+ event = undefined;
90
+ id = undefined;
91
+ data = [];
92
+ }
93
+ };
94
+ }
95
+ /**
96
+ * 编码单个 SSE 帧。data 为已序列化好的字符串(调用方负责 JSON.stringify)。
97
+ * 有 event:`event: <event>\ndata: <data>\n\n`;无 event:`data: <data>\n\n`。
98
+ */
99
+ export function encodeSSEFrame(args) {
100
+ const prefix = args.event !== undefined ? `event: ${args.event}\n` : '';
101
+ return `${prefix}data: ${args.data}\n\n`;
102
+ }
103
+ /**
104
+ * 创建 SSE 事件解码器:帧 data 用 \n join 后,[DONE] 触发 onDone,
105
+ * 其余尝试 JSON.parse 成功后触发 onEvent,解析失败静默跳过。
106
+ */
107
+ export function createEventDecoder(onEvent, onDone) {
108
+ return createSSEDecoder((frame) => {
109
+ const text = frame.data.join('\n');
110
+ if (text.trim() === '[DONE]') {
111
+ onDone?.();
112
+ return;
113
+ }
114
+ try {
115
+ onEvent(JSON.parse(text));
116
+ }
117
+ catch {
118
+ // 非 JSON data 静默跳过
119
+ }
120
+ });
121
+ }
@@ -4,23 +4,18 @@ import { type ParsedUpstream } from './inject-loop.js';
4
4
  * SSE 增量流式处理器:边转发原始 chunk 到客户端,边增量解析事件累积状态。
5
5
  * stream end 后提供 getParsedUpstream() 和 hasInjectedToolUse() 供注入检测。
6
6
  *
7
- * 跨 chunk 行边界通过 leftover 缓冲处理(参考 SSEAccumulator)。
7
+ * 跨 chunk 残帧由内部 sse-protocol decoder 缓冲处理。
8
8
  */
9
9
  export declare class SSEStreamProcessor {
10
10
  events: any[];
11
- private contentBlocks;
12
- private stopReason;
13
- private usage;
14
- private leftover;
11
+ private decoder;
15
12
  private raw;
16
13
  constructor(raw: ServerResponse);
17
14
  /** 处理一个 chunk:转发到 reply.raw + 增量解析事件 */
18
15
  processChunk(chunk: Buffer): void;
19
- /** 处理 leftover 中残留的最后一行(stream end 后调用) */
16
+ /** 收尾残帧(stream end 后调用) */
20
17
  flushLeftover(): void;
21
- /** 增量解析单个事件,更新 contentBlocks / stopReason / usage */
22
- private processEvent;
23
- /** 从累积状态构建 ParsedUpstream */
18
+ /** 从累积事件构建 ParsedUpstream */
24
19
  getParsedUpstream(): ParsedUpstream;
25
20
  /** 检测是否有注入的 MCP tool_use */
26
21
  hasInjectedToolUse(): boolean;
@@ -1,9 +1,10 @@
1
- import { findInjectedCall } from './inject-loop.js';
1
+ import { findInjectedCall, parseUpstreamEvents } from './inject-loop.js';
2
+ import { createEventDecoder } from './sse-protocol.js';
2
3
  /**
3
4
  * SSE 增量流式处理器:边转发原始 chunk 到客户端,边增量解析事件累积状态。
4
5
  * stream end 后提供 getParsedUpstream() 和 hasInjectedToolUse() 供注入检测。
5
6
  *
6
- * 跨 chunk 行边界通过 leftover 缓冲处理(参考 SSEAccumulator)。
7
+ * 跨 chunk 残帧由内部 sse-protocol decoder 缓冲处理。
7
8
  */
8
9
  export class SSEStreamProcessor {
9
10
  constructor(raw) {
@@ -13,29 +14,11 @@ export class SSEStreamProcessor {
13
14
  writable: true,
14
15
  value: []
15
16
  });
16
- Object.defineProperty(this, "contentBlocks", {
17
+ Object.defineProperty(this, "decoder", {
17
18
  enumerable: true,
18
19
  configurable: true,
19
20
  writable: true,
20
- value: new Map()
21
- });
22
- Object.defineProperty(this, "stopReason", {
23
- enumerable: true,
24
- configurable: true,
25
- writable: true,
26
- value: ''
27
- });
28
- Object.defineProperty(this, "usage", {
29
- enumerable: true,
30
- configurable: true,
31
- writable: true,
32
- value: undefined
33
- });
34
- Object.defineProperty(this, "leftover", {
35
- enumerable: true,
36
- configurable: true,
37
- writable: true,
38
- value: ''
21
+ value: void 0
39
22
  });
40
23
  Object.defineProperty(this, "raw", {
41
24
  enumerable: true,
@@ -44,101 +27,27 @@ export class SSEStreamProcessor {
44
27
  value: void 0
45
28
  });
46
29
  this.raw = raw;
30
+ this.decoder = createEventDecoder((event) => this.events.push(event));
47
31
  }
48
32
  /** 处理一个 chunk:转发到 reply.raw + 增量解析事件 */
49
33
  processChunk(chunk) {
50
34
  // 转发原始 chunk 到客户端
51
35
  this.raw.write(chunk);
52
- const text = this.leftover + chunk.toString('utf-8');
53
- const lines = text.split('\n');
54
- // 最后一行可能不完整,保留到下次
55
- this.leftover = lines.pop() || '';
56
- for (const line of lines) {
57
- if (line.startsWith('data:')) {
58
- const d = line.slice(5).trim();
59
- if (!d || d === '[DONE]')
60
- continue;
61
- try {
62
- const event = JSON.parse(d);
63
- this.events.push(event);
64
- this.processEvent(event);
65
- }
66
- catch {
67
- // 非 JSON 行跳过
68
- }
69
- }
70
- }
36
+ this.decoder.write(chunk);
71
37
  }
72
- /** 处理 leftover 中残留的最后一行(stream end 后调用) */
38
+ /** 收尾残帧(stream end 后调用) */
73
39
  flushLeftover() {
74
- if (this.leftover.startsWith('data:')) {
75
- const d = this.leftover.slice(5).trim();
76
- if (d && d !== '[DONE]') {
77
- try {
78
- const event = JSON.parse(d);
79
- this.events.push(event);
80
- this.processEvent(event);
81
- }
82
- catch {
83
- // skip
84
- }
85
- }
86
- }
87
- this.leftover = '';
40
+ this.decoder.end();
88
41
  }
89
- /** 增量解析单个事件,更新 contentBlocks / stopReason / usage */
90
- processEvent(e) {
91
- if (e?.type === 'content_block_start') {
92
- const cb = e.content_block || {};
93
- this.contentBlocks.set(e.index, {
94
- type: cb.type,
95
- text: cb.type === 'text' ? '' : undefined,
96
- id: cb.id,
97
- name: cb.name,
98
- input: cb.type === 'tool_use' ? '' : undefined
99
- });
100
- }
101
- else if (e?.type === 'content_block_delta') {
102
- const b = this.contentBlocks.get(e.index);
103
- if (!b)
104
- return;
105
- const d = e.delta || {};
106
- if (d.type === 'text_delta')
107
- b.text = (b.text || '') + d.text;
108
- if (d.type === 'thinking_delta')
109
- b.text = (b.text || '') + d.thinking;
110
- if (d.type === 'input_json_delta')
111
- b.input = (b.input || '') + (d.partial_json || '');
112
- }
113
- else if (e?.type === 'message_delta') {
114
- this.stopReason = e.delta?.stop_reason || this.stopReason;
115
- this.usage = e.usage;
116
- }
117
- }
118
- /** 从累积状态构建 ParsedUpstream */
42
+ /** 从累积事件构建 ParsedUpstream */
119
43
  getParsedUpstream() {
120
- const ordered = Array.from(this.contentBlocks.entries())
121
- .sort((a, b) => a[0] - b[0])
122
- .map(([, b]) => {
123
- if (b.type === 'tool_use') {
124
- let input = {};
125
- try {
126
- input = b.input ? JSON.parse(b.input) : {};
127
- }
128
- catch {
129
- input = {};
130
- }
131
- return { ...b, input };
132
- }
133
- return b;
134
- });
135
- return { blocks: ordered, stopReason: this.stopReason, usage: this.usage };
44
+ return parseUpstreamEvents(this.events);
136
45
  }
137
46
  /** 检测是否有注入的 MCP tool_use */
138
47
  hasInjectedToolUse() {
139
- if (this.stopReason !== 'tool_use')
140
- return false;
141
48
  const parsed = this.getParsedUpstream();
49
+ if (parsed.stopReason !== 'tool_use')
50
+ return false;
142
51
  return !!findInjectedCall(parsed);
143
52
  }
144
53
  }
@@ -1,6 +1,6 @@
1
1
  import type { ServerResponse } from 'http';
2
2
  /**
3
- * SSE 构造器(后端)—— 与 sse-accumulator(解析器)互为逆向。
3
+ * SSE 构造器(后端)—— 与 sse-protocol(帧解析器)互为逆向。
4
4
  *
5
5
  * 用于 proxy 主动构造并回写合成 SSE 流,让 Claude Code 客户端
6
6
  * 将其识别为一次正常的模型文本回答。事件骨架遵循 Anthropic
@@ -1,5 +1,6 @@
1
+ import { encodeSSEFrame } from './sse-protocol.js';
1
2
  /**
2
- * SSE 构造器(后端)—— 与 sse-accumulator(解析器)互为逆向。
3
+ * SSE 构造器(后端)—— 与 sse-protocol(帧解析器)互为逆向。
3
4
  *
4
5
  * 用于 proxy 主动构造并回写合成 SSE 流,让 Claude Code 客户端
5
6
  * 将其识别为一次正常的模型文本回答。事件骨架遵循 Anthropic
@@ -7,7 +8,7 @@
7
8
  */
8
9
  /** 写单个 SSE 事件:`event: <type>\ndata: {json}\n\n`(Anthropic 双行格式) */
9
10
  export function writeSSEEvent(raw, event) {
10
- raw.write(`event: ${event.type}\ndata: ${JSON.stringify(event)}\n\n`);
11
+ raw.write(encodeSSEFrame({ event: event.type, data: JSON.stringify(event) }));
11
12
  }
12
13
  /**
13
14
  * 把一段文本伪装成模型的正常 text 输出,构造完整合成流写回。
@@ -16,6 +16,6 @@ export interface TodayStats {
16
16
  request_count: number;
17
17
  models: Record<string, number>;
18
18
  }
19
- export declare function aggregateStats(): void;
19
+ export declare function aggregateStats(maxDays?: number): void;
20
20
  export declare function getStatsData(since?: string): StatsData;
21
21
  export declare function getTodayStats(since: string): TodayStats;
@@ -1,26 +1,47 @@
1
1
  import { initDatabase } from './db.js';
2
+ // 共用 token 聚合列:小时聚合与今日 totals 同口径,避免列漂移
3
+ const TOKEN_AGG_COLUMNS = `
4
+ SUM(input_tokens) as input_tokens,
5
+ SUM(output_tokens) as output_tokens,
6
+ SUM(cache_read_tokens) as cache_read_tokens,
7
+ SUM(cache_creation_tokens) as cache_creation_tokens,
8
+ COUNT(*) as request_count
9
+ `;
10
+ // Build the UTC hourly key ('YYYY-MM-DD-HH') used as stats.period_key
11
+ function toHourKey(date) {
12
+ return `${date.getUTCFullYear()}-${String(date.getUTCMonth() + 1).padStart(2, '0')}-${String(date.getUTCDate()).padStart(2, '0')}-${String(date.getUTCHours()).padStart(2, '0')}`;
13
+ }
2
14
  // Aggregate stats from requests table (called periodically)
3
15
  // Only stores hourly (UTC) entries — daily aggregation is done on the frontend
4
16
  // using the user's local timezone.
5
- export function aggregateStats() {
17
+ // maxDays: hourly retention window in days. A positive integer shrinks the
18
+ // window (capped at 30); undefined / <=0 falls back to the default 30 days.
19
+ export function aggregateStats(maxDays) {
6
20
  const db = initDatabase();
7
21
  const now = new Date();
8
22
  const nowIso = now.toISOString();
9
- // 30 days of hourly data = 720 entries
10
- const hourlyCutoff = new Date(now.getTime() - 30 * 86400000).toISOString();
23
+ // windowDays days of hourly data (30 days = 720 entries)
24
+ const windowDays = Number.isInteger(maxDays) && maxDays > 0
25
+ ? Math.min(30, maxDays)
26
+ : 30;
27
+ const hourlyCutoff = new Date(now.getTime() - windowDays * 86400000).toISOString();
11
28
  // Aggregate hourly stats using SQLite's built-in strftime (UTC)
12
29
  const hourlyRows = db.prepare(`
13
30
  SELECT
14
31
  strftime('%Y-%m-%d-%H', timestamp) as hour,
15
- SUM(input_tokens) as input_tokens,
16
- SUM(output_tokens) as output_tokens,
17
- SUM(cache_read_tokens) as cache_read_tokens,
18
- SUM(cache_creation_tokens) as cache_creation_tokens,
19
- COUNT(*) as request_count
32
+ ${TOKEN_AGG_COLUMNS}
20
33
  FROM requests
21
34
  WHERE timestamp >= ?
22
35
  GROUP BY hour
23
36
  `).all(hourlyCutoff);
37
+ // Recompute the whole window atomically: drop every hourly snapshot inside
38
+ // the window first (source rows may already have been deleted by cleanup, so
39
+ // an upsert-only pass would leave stale snapshots frozen forever), then
40
+ // re-insert from the requests table.
41
+ // Cutoff key uses UTC methods to match the UTC keys stored in the DB.
42
+ // The two deletes (< key / >= key) together clear every hourly row.
43
+ const cutoffKey = toHourKey(new Date(hourlyCutoff));
44
+ const deleteWindow = db.prepare(`DELETE FROM stats WHERE period = 'hourly' AND period_key >= ?`);
24
45
  // Upsert hourly stats
25
46
  const upsertHourly = db.prepare(`
26
47
  INSERT OR REPLACE INTO stats (
@@ -28,16 +49,19 @@ export function aggregateStats() {
28
49
  cache_read_tokens, cache_creation_tokens, request_count, updated_at
29
50
  ) VALUES (?, ?, ?, ?, ?, ?, ?, ?)
30
51
  `);
31
- for (const row of hourlyRows) {
32
- upsertHourly.run('hourly', row.hour, row.input_tokens || 0, row.output_tokens || 0, row.cache_read_tokens || 0, row.cache_creation_tokens || 0, row.request_count, nowIso);
33
- }
34
- // Clean old hourly entries: compute cutoff key using UTC methods
35
- // to match the UTC keys stored in the DB
36
- const cutoffDate = new Date(hourlyCutoff);
37
- const cutoffKey = `${cutoffDate.getUTCFullYear()}-${String(cutoffDate.getUTCMonth() + 1).padStart(2, '0')}-${String(cutoffDate.getUTCDate()).padStart(2, '0')}-${String(cutoffDate.getUTCHours()).padStart(2, '0')}`;
38
- db.prepare(`DELETE FROM stats WHERE period = 'hourly' AND period_key < ?`).run(cutoffKey);
52
+ // Clean hourly entries outside the recomputation window
53
+ const deleteOldKeys = db.prepare(`DELETE FROM stats WHERE period = 'hourly' AND period_key < ?`);
39
54
  // Clean ALL daily entries (legacy data from old +8h approach)
40
- db.prepare(`DELETE FROM stats WHERE period = 'daily'`).run();
55
+ const deleteDaily = db.prepare(`DELETE FROM stats WHERE period = 'daily'`);
56
+ const recompute = db.transaction(() => {
57
+ deleteWindow.run(cutoffKey);
58
+ for (const row of hourlyRows) {
59
+ upsertHourly.run('hourly', row.hour, row.input_tokens || 0, row.output_tokens || 0, row.cache_read_tokens || 0, row.cache_creation_tokens || 0, row.request_count, nowIso);
60
+ }
61
+ deleteOldKeys.run(cutoffKey);
62
+ deleteDaily.run();
63
+ });
64
+ recompute();
41
65
  // WAL checkpoint to keep WAL file size bounded
42
66
  db.pragma('wal_checkpoint(TRUNCATE)');
43
67
  }
@@ -47,8 +71,7 @@ export function getStatsData(since) {
47
71
  let hourlyRows;
48
72
  if (since) {
49
73
  // Convert since (ISO UTC) to UTC hourly key format for filtering
50
- const sinceDate = new Date(since);
51
- const sinceKey = `${sinceDate.getUTCFullYear()}-${String(sinceDate.getUTCMonth() + 1).padStart(2, '0')}-${String(sinceDate.getUTCDate()).padStart(2, '0')}-${String(sinceDate.getUTCHours()).padStart(2, '0')}`;
74
+ const sinceKey = toHourKey(new Date(since));
52
75
  hourlyRows = db.prepare(`
53
76
  SELECT * FROM stats WHERE period = 'hourly' AND period_key >= ? ORDER BY period_key ASC
54
77
  `).all(sinceKey);
@@ -82,12 +105,9 @@ export function getStatsData(since) {
82
105
  export function getTodayStats(since) {
83
106
  const db = initDatabase();
84
107
  // Totals: SUM tokens + COUNT requests since local midnight
108
+ // 多选的 cache_creation_tokens 在返回映射时忽略
85
109
  const totalRow = db.prepare(`
86
- SELECT
87
- SUM(input_tokens) as input_tokens,
88
- SUM(output_tokens) as output_tokens,
89
- SUM(cache_read_tokens) as cache_read_tokens,
90
- COUNT(*) as request_count
110
+ SELECT ${TOKEN_AGG_COLUMNS}
91
111
  FROM requests
92
112
  WHERE timestamp >= ?
93
113
  `).get(since);
@@ -10,6 +10,13 @@ import { mcpManager } from './mcp-manager.js';
10
10
  * 无 tools 数组时自动创建,让裸请求也能使用 MCP tool。
11
11
  */
12
12
  export function injectMcpTools(body) {
13
+ // 守卫:malformed body 直接返回,避免给原始值赋值抛 TypeError。
14
+ // 判定依据:有效 chat body 至少要有 messages 数组;null/非对象,或既无 tools 也无 messages(如 {}、{tools:'nope'})均不注入。
15
+ if (body === null ||
16
+ typeof body !== 'object' ||
17
+ (!Array.isArray(body?.tools) && !Array.isArray(body?.messages))) {
18
+ return [];
19
+ }
13
20
  if (!Array.isArray(body?.tools)) {
14
21
  body.tools = [];
15
22
  }
@@ -0,0 +1,111 @@
1
+ export declare function isValidSlug(slug: string): boolean;
2
+ export interface TopicSummary {
3
+ slug: string;
4
+ title: string;
5
+ summary: string;
6
+ tags: string[];
7
+ }
8
+ export interface ChunkRef {
9
+ id: string;
10
+ title: string;
11
+ summary: string;
12
+ tags: string[];
13
+ }
14
+ export interface TopicIndex {
15
+ slug: string;
16
+ title: string;
17
+ summary: string;
18
+ tags: string[];
19
+ chunks: ChunkRef[];
20
+ }
21
+ interface TopicDetail {
22
+ title: string;
23
+ tags: string[];
24
+ sources: unknown[];
25
+ chunks: ChunkRef[];
26
+ }
27
+ interface ChunkHit {
28
+ topic: string;
29
+ chunkId: string;
30
+ title: string;
31
+ }
32
+ interface QueryHit {
33
+ topic: string;
34
+ chunkId: string;
35
+ title: string;
36
+ body: string;
37
+ }
38
+ export interface OutlineItem {
39
+ id: string;
40
+ title: string;
41
+ oneLine: string;
42
+ }
43
+ interface RootIndex {
44
+ topics: TopicSummary[];
45
+ }
46
+ export interface Vault {
47
+ /** vault 根目录(docsDir)绝对路径 */
48
+ readonly root: string;
49
+ listTopics(): Promise<TopicSummary[]>;
50
+ getTopic(topic: string): Promise<TopicDetail>;
51
+ searchChunks(query: string): Promise<ChunkHit[]>;
52
+ queryKnowledge(query: string, limit?: number): Promise<QueryHit[]>;
53
+ readChunk(topic: string, chunkId: string): Promise<string>;
54
+ upsertTopic(input: {
55
+ slug: string;
56
+ title: string;
57
+ summary: string;
58
+ tags: string[];
59
+ }): Promise<void>;
60
+ upsertChunkRef(input: {
61
+ topic: string;
62
+ chunkId: string;
63
+ title: string;
64
+ summary: string;
65
+ tags: string[];
66
+ }): Promise<void>;
67
+ readTopicIndex(slug: string): Promise<TopicIndex | null>;
68
+ readSidecarIndex(slug: string): Promise<TopicIndex | null>;
69
+ assertSlug(slug: string, field?: string): void;
70
+ /** 重建 topic 目录:rm -rf 后建 sources/ + chunks/ */
71
+ prepareTopic(slug: string): void;
72
+ /** 写 <slug>/sources/source-NNN.md(content 带 Source 头) */
73
+ writeSourceFile(slug: string, index: number, url: string, text: string): void;
74
+ /** 数 <slug>/sources 下 .md 文件;目录不存在按 0 */
75
+ countSourceFiles(slug: string): number;
76
+ /** 读 <slug>/sources 下全部 .md 正文(按文件名排序);目录缺失抛底层错误 */
77
+ readSourceBodies(slug: string): string[];
78
+ /** 写 <slug>/outline.json(校验目录已 prepare、sources 存在) */
79
+ writeOutline(slug: string, items: OutlineItem[]): void;
80
+ /** 读 <slug>/outline.json 的 items;文件不存在抛「outline 未生成」 */
81
+ readOutlineItems(slug: string): OutlineItem[];
82
+ /** 旁挂:<slug> → <slug>.old */
83
+ parkTopic(slug: string): void;
84
+ /** 还原:<slug>.old → <slug> */
85
+ restoreTopic(slug: string): void;
86
+ /** 重命名 topic 目录:<slug> → <newSlug> */
87
+ renameTopic(slug: string, newSlug: string): void;
88
+ /** 读 <entry>/index.json(entry 可为 slug 或 <slug>.old);缺失/坏抛底层错误 */
89
+ readEntryIndexSync(entry: string): TopicIndex;
90
+ /** 写 <entry>/index.json */
91
+ writeEntryIndexSync(entry: string, idx: TopicIndex): void;
92
+ readRootIndexSync(): RootIndex;
93
+ writeRootIndexSync(root: RootIndex): void;
94
+ /** 列 <entry>/<subdir> 下 .md 文件名(排序);目录缺失视为空 */
95
+ listEntryMd(entry: string, subdir: 'sources' | 'chunks'): string[];
96
+ mkdirEntrySubdir(entry: string, subdir: 'sources' | 'chunks'): void;
97
+ readEntryFile(entry: string, subdir: 'sources' | 'chunks', file: string): Buffer;
98
+ writeEntryFile(entry: string, subdir: 'sources' | 'chunks', file: string, body: Buffer): void;
99
+ unlinkEntryFile(entry: string, subdir: 'sources' | 'chunks', file: string): void;
100
+ /** 删除整个 <entry> 目录 */
101
+ removeEntry(entry: string): void;
102
+ /** docsDir 下存在任何 .old 旁挂目录时抛错 */
103
+ assertNoOldSidecars(): void;
104
+ /** 归一化路径并断言其在 docsDir 内,越界抛错 */
105
+ assertInside(absPath: string): string;
106
+ /** 目标为受管 index.json 时抛错 */
107
+ assertNotManagedIndexJson(absPath: string): void;
108
+ }
109
+ export declare function createVault(docsDir: string): Vault;
110
+ export declare const vault: Vault;
111
+ export {};