@cc-monitoring/proxy-core 0.3.1 → 0.4.0

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 (388) hide show
  1. package/dist/cli/__tests__/commands.test.js +1 -1
  2. package/dist/cli/commands/exec.js +31 -42
  3. package/dist/docs/404.html +2 -2
  4. package/dist/docs/assets/{app.B9A39uFv.js → app.DtYNT5zS.js} +1 -1
  5. package/dist/docs/assets/chunks/@localSearchIndexroot.C4sjikMO.js +1 -0
  6. package/dist/docs/assets/chunks/{VPLocalSearchBox.DdhC696L.js → VPLocalSearchBox.DpXF9ZAI.js} +1 -1
  7. package/dist/docs/assets/chunks/{theme.CfB2tOFi.js → theme.TS_gUyc7.js} +2 -2
  8. package/dist/docs/assets/{proxy-cli_data-hooks.md.w9Oe1OD3.js → proxy-cli_data-hooks.md.Bz8CVbxO.js} +1 -1
  9. package/dist/docs/assets/{proxy-core_ui-routes.md.Dyqkeoiv.js → proxy-core_ui-routes.md.B21t1p7R.js} +1 -1
  10. package/dist/docs/hashmap.json +1 -1
  11. package/dist/docs/index.html +3 -3
  12. package/dist/docs/overview.html +3 -3
  13. package/dist/docs/packages-utils.html +3 -3
  14. package/dist/docs/proxy-admin/env-and-build.html +3 -3
  15. package/dist/docs/proxy-admin/index.html +3 -3
  16. package/dist/docs/proxy-admin/layout-and-menu.html +3 -3
  17. package/dist/docs/proxy-admin/pages.html +3 -3
  18. package/dist/docs/proxy-admin/routing-and-auth.html +3 -3
  19. package/dist/docs/proxy-admin/services-and-mock.html +3 -3
  20. package/dist/docs/proxy-cli/api-layer.html +3 -3
  21. package/dist/docs/proxy-cli/app-shell.html +3 -3
  22. package/dist/docs/proxy-cli/components-common.html +3 -3
  23. package/dist/docs/proxy-cli/components-config.html +3 -3
  24. package/dist/docs/proxy-cli/components-requests.html +3 -3
  25. package/dist/docs/proxy-cli/components-stats.html +3 -3
  26. package/dist/docs/proxy-cli/components-status.html +3 -3
  27. package/dist/docs/proxy-cli/data-hooks.html +5 -5
  28. package/dist/docs/proxy-cli/index.html +3 -3
  29. package/dist/docs/proxy-cli/utils-and-i18n.html +3 -3
  30. package/dist/docs/proxy-core/chat-api.html +3 -3
  31. package/dist/docs/proxy-core/cli.html +3 -3
  32. package/dist/docs/proxy-core/config.html +3 -3
  33. package/dist/docs/proxy-core/data-layer.html +3 -3
  34. package/dist/docs/proxy-core/entry.html +3 -3
  35. package/dist/docs/proxy-core/index.html +3 -3
  36. package/dist/docs/proxy-core/pm2.html +3 -3
  37. package/dist/docs/proxy-core/providers.html +3 -3
  38. package/dist/docs/proxy-core/proxy.html +3 -3
  39. package/dist/docs/proxy-core/stats.html +3 -3
  40. package/dist/docs/proxy-core/tool.html +3 -3
  41. package/dist/docs/proxy-core/ui-routes.html +5 -5
  42. package/dist/docs/proxy-core/utilities.html +3 -3
  43. package/dist/docs/quickstart.html +3 -3
  44. package/dist/docs/request-flow.html +3 -3
  45. package/dist/logger/index.d.ts +0 -3
  46. package/dist/logger/index.js +0 -1
  47. package/dist/mcp-server/tools.js +8 -9
  48. package/dist/server/__tests__/providers-route.test.js +1 -0
  49. package/dist/server/auth.d.ts +0 -1
  50. package/dist/server/auth.js +1 -1
  51. package/dist/server/chat-route.js +48 -162
  52. package/dist/server/data-push.d.ts +0 -1
  53. package/dist/server/data-push.js +0 -7
  54. package/dist/server/proxy.js +128 -224
  55. package/dist/server/ui-route.js +76 -59
  56. package/dist/tools/index.d.ts +1 -1
  57. package/dist/tools/index.js +1 -1
  58. package/dist/tools/registry.d.ts +0 -4
  59. package/dist/tools/registry.js +0 -8
  60. package/dist/types/config.d.ts +0 -13
  61. package/dist/types/pm2.d.ts +1 -2
  62. package/dist/ui/assets/{1c-DAu68mP4.js → 1c-CCx-FOtz.js} +1 -1
  63. package/dist/ui/assets/{abnf-Cu8RHCHK.js → abnf-Bwbi42Z8.js} +1 -1
  64. package/dist/ui/assets/{abnfDiagram-VRR7QNED-BUBToPXF.js → abnfDiagram-VRR7QNED-Dm1-8q0E.js} +1 -1
  65. package/dist/ui/assets/{accesslog-BG-34XOy.js → accesslog-DCytz_-m.js} +1 -1
  66. package/dist/ui/assets/{actionscript-iw0HHMGM.js → actionscript-3udf15oh.js} +1 -1
  67. package/dist/ui/assets/{ada-qRqj6VGQ.js → ada-M5Xa74xG.js} +1 -1
  68. package/dist/ui/assets/{angelscript-BeaXyx_P.js → angelscript-qlrFxfW-.js} +1 -1
  69. package/dist/ui/assets/{apache-CU8d-z9X.js → apache-B-sF-DQH.js} +1 -1
  70. package/dist/ui/assets/{applescript-d1Wxkqz1.js → applescript-4FdcBnbI.js} +1 -1
  71. package/dist/ui/assets/{arc-BMsPIm3j.js → arc-BB3K1enp.js} +1 -1
  72. package/dist/ui/assets/{arcade-CtbgrWTM.js → arcade-B_yqWaaG.js} +1 -1
  73. package/dist/ui/assets/{architectureDiagram-ZJ3FMSHR-CVjC5TrS.js → architectureDiagram-ZJ3FMSHR-B39vkY8V.js} +1 -1
  74. package/dist/ui/assets/{arduino-Bc9L39Hr.js → arduino-yAcBoTWU.js} +1 -1
  75. package/dist/ui/assets/{armasm-DuWmpjWR.js → armasm-wIcY84bI.js} +1 -1
  76. package/dist/ui/assets/{asciidoc-CDIhFTnx.js → asciidoc-Bxnu28-Z.js} +1 -1
  77. package/dist/ui/assets/{aspectj-SYj-57Es.js → aspectj-B2cKJA_O.js} +1 -1
  78. package/dist/ui/assets/{autohotkey-hBi5dq37.js → autohotkey-B_rMWTtE.js} +1 -1
  79. package/dist/ui/assets/{autoit-BSawXzhg.js → autoit-DwcuvMwv.js} +1 -1
  80. package/dist/ui/assets/{avrasm-CwYom8Np.js → avrasm-heGX1PXK.js} +1 -1
  81. package/dist/ui/assets/{awk-BvBRfGo2.js → awk-BiqCQAEf.js} +1 -1
  82. package/dist/ui/assets/{axapta-CqUavA8k.js → axapta-Cv8M-Ih6.js} +1 -1
  83. package/dist/ui/assets/{bash-BS_ZnmEu.js → bash-Divgn3JV.js} +1 -1
  84. package/dist/ui/assets/{basic-xbP4IXrN.js → basic-B9dnAP55.js} +1 -1
  85. package/dist/ui/assets/{blockDiagram-677ZJIJ3-CmpI3f5p.js → blockDiagram-677ZJIJ3-DQ1mf7A_.js} +1 -1
  86. package/dist/ui/assets/{bnf-BECwu6uW.js → bnf-kIL5mSsP.js} +1 -1
  87. package/dist/ui/assets/{brainfuck-QQgu4j4N.js → brainfuck-DqB7xDjH.js} +1 -1
  88. package/dist/ui/assets/{coq-IDMIFfem.js → c-HmsCM6sx.js} +1 -1
  89. package/dist/ui/assets/{c-like-DYrFOtXy.js → c-like-De5MhE7G.js} +1 -1
  90. package/dist/ui/assets/{c4Diagram-LMCZKHZV-B6Hgngz9.js → c4Diagram-LMCZKHZV-DQxtYsAx.js} +1 -1
  91. package/dist/ui/assets/{cal-CNMrJ6v5.js → cal-mYdfz9en.js} +1 -1
  92. package/dist/ui/assets/{capnproto-DYCKl6oY.js → capnproto-D04CRlOt.js} +1 -1
  93. package/dist/ui/assets/{ceylon-mb8tRPl0.js → ceylon-pi9lFCja.js} +1 -1
  94. package/dist/ui/assets/channel-ChTtxQDg.js +1 -0
  95. package/dist/ui/assets/{chunk-2Q5K7J3B-LxvQ-G67.js → chunk-2Q5K7J3B-BDD1nPt8.js} +1 -1
  96. package/dist/ui/assets/{chunk-32BRIVSS-DxzKK6Aw.js → chunk-32BRIVSS-DgeQFBb5.js} +1 -1
  97. package/dist/ui/assets/{chunk-5VM5RSS4-CZEoYJ2W.js → chunk-5VM5RSS4-C7Xf2SnI.js} +1 -1
  98. package/dist/ui/assets/{chunk-EX3LRPZG-DS2PytrN.js → chunk-EX3LRPZG-B_3p1HEv.js} +1 -1
  99. package/dist/ui/assets/{chunk-JWPE2WC7-UX0Sr1Ie.js → chunk-JWPE2WC7-Dvs7u8eY.js} +1 -1
  100. package/dist/ui/assets/{chunk-MOJQB5TN-YbJgT9t4.js → chunk-MOJQB5TN-By21wDCN.js} +1 -1
  101. package/dist/ui/assets/{chunk-RYQCIY6F-DS2VH_U9.js → chunk-RYQCIY6F-6NC700r1.js} +1 -1
  102. package/dist/ui/assets/{chunk-V7JOEXUC-CZr0pkI1.js → chunk-V7JOEXUC-vEUqZ3rh.js} +1 -1
  103. package/dist/ui/assets/{chunk-VR4S4FIN-50opPAD3.js → chunk-VR4S4FIN-6tX2dNN9.js} +1 -1
  104. package/dist/ui/assets/{chunk-XXDRQBXY-DAAX9l7U.js → chunk-XXDRQBXY-qDb2jxAR.js} +1 -1
  105. package/dist/ui/assets/classDiagram-OUVF2IWQ-Ccbvamlu.js +1 -0
  106. package/dist/ui/assets/classDiagram-v2-EOCWNBFH-Ccbvamlu.js +1 -0
  107. package/dist/ui/assets/{clean-C4X7dSkh.js → clean-CLCsDUl1.js} +1 -1
  108. package/dist/ui/assets/{clojure-DSg9gUa7.js → clojure-dVi5Xifj.js} +1 -1
  109. package/dist/ui/assets/{clojure-repl-CagRYx7h.js → clojure-repl-BO_FpFmF.js} +1 -1
  110. package/dist/ui/assets/{cmake-CFdBn53c.js → cmake-CP5aJbyK.js} +1 -1
  111. package/dist/ui/assets/{coffeescript-CJZtMOPx.js → coffeescript-ZEfu_9pF.js} +1 -1
  112. package/dist/ui/assets/{c-BRJEPYra.js → coq-6aKUn3zn.js} +1 -1
  113. package/dist/ui/assets/{cos-Bx2VJuzG.js → cos-BohCnRN2.js} +1 -1
  114. package/dist/ui/assets/{cose-bilkent-JH36ORCC-zWRLsZpZ.js → cose-bilkent-JH36ORCC-DyXCbbro.js} +1 -1
  115. package/dist/ui/assets/{cpp-CsG6DlC4.js → cpp-FOgPWPEt.js} +1 -1
  116. package/dist/ui/assets/{crmsh-DTy9MnmJ.js → crmsh-B0OYb-Oe.js} +1 -1
  117. package/dist/ui/assets/{crystal-BwgrLrZ1.js → crystal-CuWb_dXm.js} +1 -1
  118. package/dist/ui/assets/{csharp-B2VeTPAF.js → csharp-BbcqM09j.js} +1 -1
  119. package/dist/ui/assets/{csp-CTpydNhH.js → csp-rgHnTaDq.js} +1 -1
  120. package/dist/ui/assets/{css-B0mMUbpY.js → css-C-ibh7ZG.js} +1 -1
  121. package/dist/ui/assets/{cynefin-VYW2F7L2-BmjQEj6q.js → cynefin-VYW2F7L2-CkuBhgC4.js} +1 -1
  122. package/dist/ui/assets/{cynefinDiagram-TSTJHNR4-Dr0Zrke0.js → cynefinDiagram-TSTJHNR4-eycFyDao.js} +1 -1
  123. package/dist/ui/assets/{d-DjuDZnbI.js → d-C0gXxJ0O.js} +1 -1
  124. package/dist/ui/assets/{dagre-VKFMJZFB-xoTPT2Uu.js → dagre-VKFMJZFB-DzqX9e49.js} +1 -1
  125. package/dist/ui/assets/{dart-xR3GU9TJ.js → dart-C-fTpuUV.js} +1 -1
  126. package/dist/ui/assets/{delphi-bJas5QnG.js → delphi-Chm0B9xv.js} +1 -1
  127. package/dist/ui/assets/{diagram-FQU43EPY-rL_IU7gU.js → diagram-FQU43EPY-BEgCqfg1.js} +1 -1
  128. package/dist/ui/assets/{diagram-G47NLZAW-EcDiCVGj.js → diagram-G47NLZAW-Cw11Vs2v.js} +1 -1
  129. package/dist/ui/assets/{diagram-NH7WQ7WH-CGGXOjev.js → diagram-NH7WQ7WH-DSG_UWpP.js} +1 -1
  130. package/dist/ui/assets/{diagram-OA4YK3LP-DnE7hDjD.js → diagram-OA4YK3LP-CJz-WOaJ.js} +1 -1
  131. package/dist/ui/assets/{diagram-WEI45ONY-CTJH5eD8.js → diagram-WEI45ONY-CBXjBCvc.js} +1 -1
  132. package/dist/ui/assets/{diff-doJFF3fv.js → diff-C-vyuMSL.js} +1 -1
  133. package/dist/ui/assets/{django-D3b-owa_.js → django-CJK7lReT.js} +1 -1
  134. package/dist/ui/assets/{dns-C42KYV-Z.js → dns-D02SHjSy.js} +1 -1
  135. package/dist/ui/assets/{dockerfile-9KUINc2j.js → dockerfile-trKL1Bqu.js} +1 -1
  136. package/dist/ui/assets/{dos-CxnlJ6qp.js → dos-C52dy-sK.js} +1 -1
  137. package/dist/ui/assets/{dsconfig-6CMMCwmY.js → dsconfig-MzHgzVrt.js} +1 -1
  138. package/dist/ui/assets/{dts-D78rdUIB.js → dts-B137dHyX.js} +1 -1
  139. package/dist/ui/assets/{dust-Dv1uTfJU.js → dust-BcbM0r5C.js} +1 -1
  140. package/dist/ui/assets/{ebnf-BGbG1cFK.js → ebnf-DkbpI7bK.js} +1 -1
  141. package/dist/ui/assets/{ebnfDiagram-CCIWWBDH-z2VgRSUV.js → ebnfDiagram-CCIWWBDH-aI5uQ7w1.js} +1 -1
  142. package/dist/ui/assets/{elixir-ZgAQVY1J.js → elixir-BOtDuqQy.js} +1 -1
  143. package/dist/ui/assets/{elm-CudiFuNu.js → elm-DS8Tyyu-.js} +1 -1
  144. package/dist/ui/assets/{erDiagram-Q63AITRT-X1TODuRv.js → erDiagram-Q63AITRT-2vCbd4Mm.js} +1 -1
  145. package/dist/ui/assets/{erb-Bz_NZh6W.js → erb-CSXECRbn.js} +1 -1
  146. package/dist/ui/assets/{erlang-DNuj1nb2.js → erlang-BMxlgKPJ.js} +1 -1
  147. package/dist/ui/assets/{erlang-repl-SP1Gan9W.js → erlang-repl-DPzlolPg.js} +1 -1
  148. package/dist/ui/assets/{excel-0K77uECF.js → excel-CW2Uxed3.js} +1 -1
  149. package/dist/ui/assets/{fix-CalJq7JD.js → fix-UW84SlCs.js} +1 -1
  150. package/dist/ui/assets/{flix-BlIs11_w.js → flix-4UGiPULd.js} +1 -1
  151. package/dist/ui/assets/{flowDiagram-23GEKE2U-DA2dnmc0.js → flowDiagram-23GEKE2U-R5PbCbZI.js} +1 -1
  152. package/dist/ui/assets/{fortran-ZCobXY2R.js → fortran-nhHsngdu.js} +1 -1
  153. package/dist/ui/assets/{fsharp-Be8rwUtc.js → fsharp-CDyZ1ST5.js} +1 -1
  154. package/dist/ui/assets/{gams-DUat8frQ.js → gams-DHzkkUie.js} +1 -1
  155. package/dist/ui/assets/{ganttDiagram-NO4QXBWP-DdFwaIGZ.js → ganttDiagram-NO4QXBWP-CGcq4Ie_.js} +1 -1
  156. package/dist/ui/assets/{gauss-BB4U88dy.js → gauss-DdhFGyBv.js} +1 -1
  157. package/dist/ui/assets/{gcode-DzeUZuZg.js → gcode-ImHh8OLA.js} +1 -1
  158. package/dist/ui/assets/{gherkin-B_8vW_BO.js → gherkin-CTWAW-XR.js} +1 -1
  159. package/dist/ui/assets/{gitGraphDiagram-IHSO6WYX-B-Dn8x6I.js → gitGraphDiagram-IHSO6WYX-8nM2Z9lD.js} +1 -1
  160. package/dist/ui/assets/{glsl-DGHGjPC1.js → glsl-0_W_27G2.js} +1 -1
  161. package/dist/ui/assets/{gml-BYEku8Yh.js → gml-BoDggu2z.js} +1 -1
  162. package/dist/ui/assets/{go-D8aSgQMc.js → go-DYfFygwl.js} +1 -1
  163. package/dist/ui/assets/{golo-CDjCU_jh.js → golo-Mlq-TCg9.js} +1 -1
  164. package/dist/ui/assets/{gradle-BeUw7tl_.js → gradle-BALAinEB.js} +1 -1
  165. package/dist/ui/assets/{groovy-5iCQOtR3.js → groovy-Dht--dWU.js} +1 -1
  166. package/dist/ui/assets/{haml-BEdL8FJi.js → haml-DpMrxg0d.js} +1 -1
  167. package/dist/ui/assets/{handlebars-BuYQNzoK.js → handlebars-DqHzujNj.js} +1 -1
  168. package/dist/ui/assets/{haskell-I4FCBcW0.js → haskell-DZSchhkY.js} +1 -1
  169. package/dist/ui/assets/{haxe-yigyKfFr.js → haxe-C0zBRjdy.js} +1 -1
  170. package/dist/ui/assets/{hsp-ZUk4j7d1.js → hsp-D_PwbSv2.js} +1 -1
  171. package/dist/ui/assets/{htmlbars-QYP3lT3u.js → htmlbars-DxAFMG8u.js} +1 -1
  172. package/dist/ui/assets/{http-BJpD1O71.js → http-DvTRF0Do.js} +1 -1
  173. package/dist/ui/assets/{hy-CIJ1bP6S.js → hy-lVO-kNyp.js} +1 -1
  174. package/dist/ui/assets/{index-BDXWttnT.js → index-BbMRVVGt.js} +3 -3
  175. package/dist/ui/assets/{index-COAgrx1J.js → index-Ci23SMK2.js} +242 -242
  176. package/dist/ui/assets/index-DlsVXaHT.css +10 -0
  177. package/dist/ui/assets/{infoDiagram-FWYZ7A6U-fTg9eLNt.js → infoDiagram-FWYZ7A6U-C7WYDlvc.js} +1 -1
  178. package/dist/ui/assets/{inform7-DAsu-lC2.js → inform7-B8Tf2n8v.js} +1 -1
  179. package/dist/ui/assets/{ini-Bhz-zHCg.js → ini-DSoYMaLF.js} +1 -1
  180. package/dist/ui/assets/{irpf90-BunhbwBl.js → irpf90-RCPdkB14.js} +1 -1
  181. package/dist/ui/assets/{isbl-q9L6hOhP.js → isbl-C2p75PPj.js} +1 -1
  182. package/dist/ui/assets/{ishikawaDiagram-FXEZZL3T-B8G0sdgd.js → ishikawaDiagram-FXEZZL3T-Cm6jsPlc.js} +1 -1
  183. package/dist/ui/assets/{java-Iks5Pkau.js → java-DeY4Yuia.js} +1 -1
  184. package/dist/ui/assets/{javascript-C4vltXPw.js → javascript-3uX1CO-H.js} +1 -1
  185. package/dist/ui/assets/{jboss-cli-BQBvd2X2.js → jboss-cli-DgnD8mEc.js} +1 -1
  186. package/dist/ui/assets/{journeyDiagram-5HDEW3XC-Crbzgrum.js → journeyDiagram-5HDEW3XC-DEGV1uA5.js} +1 -1
  187. package/dist/ui/assets/{json-DXK0_jUK.js → json-BV2PmJJp.js} +1 -1
  188. package/dist/ui/assets/{julia-CCYoBiYK.js → julia-B-m8kQm7.js} +1 -1
  189. package/dist/ui/assets/{julia-repl-y8v2Oorl.js → julia-repl-C51atU2X.js} +1 -1
  190. package/dist/ui/assets/{kanban-definition-HUTT4EX6-C8sCOsBX.js → kanban-definition-HUTT4EX6-BJ4k5iTX.js} +1 -1
  191. package/dist/ui/assets/{kotlin-Bnjk7_fw.js → kotlin-CYBziIgl.js} +1 -1
  192. package/dist/ui/assets/{lasso-B-al6x63.js → lasso-Dw2SBMDW.js} +1 -1
  193. package/dist/ui/assets/{latex-BUmqlb9r.js → latex-Dpd35yke.js} +1 -1
  194. package/dist/ui/assets/{ldif-D42RWj6Q.js → ldif-Ce9EZU__.js} +1 -1
  195. package/dist/ui/assets/{leaf-CrH4BZ0m.js → leaf-CpkZzQtC.js} +1 -1
  196. package/dist/ui/assets/{less-upmRlQQW.js → less-Uzo7M0FD.js} +1 -1
  197. package/dist/ui/assets/{lisp-DHYS22SA.js → lisp-DWXDlJYm.js} +1 -1
  198. package/dist/ui/assets/{livecodeserver-CeQNmFP3.js → livecodeserver-uEyPEgVJ.js} +1 -1
  199. package/dist/ui/assets/{livescript-PJWpY1JI.js → livescript-BQ5f07oK.js} +1 -1
  200. package/dist/ui/assets/{llvm-BKtKWwCt.js → llvm-BAvP-skE.js} +1 -1
  201. package/dist/ui/assets/{lsl-RWRLRjk7.js → lsl-DhbiIKu6.js} +1 -1
  202. package/dist/ui/assets/{lua-BFUDiPGm.js → lua-COxeUeLx.js} +1 -1
  203. package/dist/ui/assets/{makefile-CUDyOz5D.js → makefile-DhDx-IgL.js} +1 -1
  204. package/dist/ui/assets/{markdown-zZCLypc6.js → markdown-DX5_kSxq.js} +1 -1
  205. package/dist/ui/assets/{mathematica-BHbxKxnq.js → mathematica-D351ZddB.js} +1 -1
  206. package/dist/ui/assets/{matlab-DlGtg--p.js → matlab-CELqIiwF.js} +1 -1
  207. package/dist/ui/assets/{maxima-BBBeS3Ra.js → maxima-B_YljrMm.js} +1 -1
  208. package/dist/ui/assets/{mel-nh8j7W_6.js → mel-DltsbNS8.js} +1 -1
  209. package/dist/ui/assets/{mercury-DyyD-pqr.js → mercury-axX-5Vjj.js} +1 -1
  210. package/dist/ui/assets/{mindmap-definition-LN4V7U3C-CJlhDHqM.js → mindmap-definition-LN4V7U3C-Bl1EJo6p.js} +1 -1
  211. package/dist/ui/assets/{mipsasm-hiEhRRiq.js → mipsasm-BxmerVwX.js} +1 -1
  212. package/dist/ui/assets/{mizar-BZa3iAAL.js → mizar-XNHfbpL2.js} +1 -1
  213. package/dist/ui/assets/{mojolicious-BCIm2V_y.js → mojolicious-BR0U_7zk.js} +1 -1
  214. package/dist/ui/assets/{monkey-zmK-7N8b.js → monkey-lLuu9_f-.js} +1 -1
  215. package/dist/ui/assets/{moonscript-BsS_Mn3D.js → moonscript-DoaZ3DRQ.js} +1 -1
  216. package/dist/ui/assets/{n1ql-D7xVgDP0.js → n1ql-C6TId6Iu.js} +1 -1
  217. package/dist/ui/assets/{nginx-ct2q4dtd.js → nginx-BezSG-JT.js} +1 -1
  218. package/dist/ui/assets/{nim-RO0UOmW3.js → nim-Bb0rfXie.js} +1 -1
  219. package/dist/ui/assets/{nix-BcRJxPKH.js → nix-o3sJ5-54.js} +1 -1
  220. package/dist/ui/assets/{node-repl-DgIefwxW.js → node-repl-Sv5hhcTf.js} +1 -1
  221. package/dist/ui/assets/{nsis-DqHs9QhB.js → nsis-B45BJFhF.js} +1 -1
  222. package/dist/ui/assets/{objectivec-BBcWqc7Y.js → objectivec-CzS6zVgh.js} +1 -1
  223. package/dist/ui/assets/{ocaml-BExfw7D6.js → ocaml-Bqux7PyP.js} +1 -1
  224. package/dist/ui/assets/{openscad-CHPRELQb.js → openscad-4Wf6mF84.js} +1 -1
  225. package/dist/ui/assets/{oxygene-DpS9uMJW.js → oxygene-Fvwqgkkt.js} +1 -1
  226. package/dist/ui/assets/{parser3-CjJ_QdBp.js → parser3-zEfzT5wv.js} +1 -1
  227. package/dist/ui/assets/{pegDiagram-2B236MQR-GM70woGy.js → pegDiagram-2B236MQR-Dd4rIztM.js} +1 -1
  228. package/dist/ui/assets/{perl-BSNM2Kt8.js → perl-CsS1Gs6o.js} +1 -1
  229. package/dist/ui/assets/{pf-Z-hKf_88.js → pf-BNH1jO0R.js} +1 -1
  230. package/dist/ui/assets/{pgsql-DDgznxBg.js → pgsql-DqPigHrq.js} +1 -1
  231. package/dist/ui/assets/{php-BzAhxF-l.js → php-CdOl9bRs.js} +1 -1
  232. package/dist/ui/assets/{php-template-DkgcKHRc.js → php-template-DPfirJg2.js} +1 -1
  233. package/dist/ui/assets/{pieDiagram-ENE6RG2P-Bst7mPyz.js → pieDiagram-ENE6RG2P-DGaJNf4S.js} +1 -1
  234. package/dist/ui/assets/{plaintext-BYEppD0R.js → plaintext-EHbgBKzw.js} +1 -1
  235. package/dist/ui/assets/{pony-BT_kQd1K.js → pony-DmJajtp2.js} +1 -1
  236. package/dist/ui/assets/{powershell-BfRsuSsf.js → powershell-DfGzdWR6.js} +1 -1
  237. package/dist/ui/assets/{processing-DpzWe5Iu.js → processing-BT0ETgPG.js} +1 -1
  238. package/dist/ui/assets/{profile-BCOhS5cM.js → profile-B3I-x5Lt.js} +1 -1
  239. package/dist/ui/assets/{prolog-OxaCCaW8.js → prolog-B_4QJIvI.js} +1 -1
  240. package/dist/ui/assets/{properties-DMFlA2Ca.js → properties-BFVI8weS.js} +1 -1
  241. package/dist/ui/assets/{protobuf-CRDFkXvZ.js → protobuf-PaF39oZZ.js} +1 -1
  242. package/dist/ui/assets/{puppet-DnrVyLzx.js → puppet-BDC6Q8VF.js} +1 -1
  243. package/dist/ui/assets/{purebasic-Dht4Hniv.js → purebasic-B2ejrOZK.js} +1 -1
  244. package/dist/ui/assets/{python-B0aMirWu.js → python-BOxtIk9H.js} +1 -1
  245. package/dist/ui/assets/{python-repl-BlYDBGa7.js → python-repl-BslBh_Mx.js} +1 -1
  246. package/dist/ui/assets/{q-DzrtW9kT.js → q-BPe8WLGW.js} +1 -1
  247. package/dist/ui/assets/{qml-DnfQsR3i.js → qml-BazRR6fz.js} +1 -1
  248. package/dist/ui/assets/{quadrantDiagram-ABIIQ3AL-DNRYurBT.js → quadrantDiagram-ABIIQ3AL-BQ7aPkHk.js} +1 -1
  249. package/dist/ui/assets/{r-DGI_ZuTD.js → r-C09pGNJC.js} +1 -1
  250. package/dist/ui/assets/{railroadDiagram-RFXS5EU6-CmbC3Vz4.js → railroadDiagram-RFXS5EU6-sCO9VGvE.js} +1 -1
  251. package/dist/ui/assets/{reasonml-3SohMgh2.js → reasonml-S7dzwVL9.js} +1 -1
  252. package/dist/ui/assets/{requirementDiagram-TGXJPOKE-8CxrXHco.js → requirementDiagram-TGXJPOKE-CfT5aVZg.js} +1 -1
  253. package/dist/ui/assets/{rib-DfRSd4Qa.js → rib-fM2EwQd4.js} +1 -1
  254. package/dist/ui/assets/{roboconf-CQczGdGW.js → roboconf-D7AaeyrW.js} +1 -1
  255. package/dist/ui/assets/{routeros-DCka-T2i.js → routeros-c6Q7mKuq.js} +1 -1
  256. package/dist/ui/assets/{rsl-Dr8MOwMo.js → rsl-sCpEQBxh.js} +1 -1
  257. package/dist/ui/assets/{ruby-C2zFSkh_.js → ruby-lcKhz2w9.js} +1 -1
  258. package/dist/ui/assets/{ruleslanguage-C97YsgQq.js → ruleslanguage-BW4ATOuX.js} +1 -1
  259. package/dist/ui/assets/{rust-H3h8kd9A.js → rust-BbpU-0VY.js} +1 -1
  260. package/dist/ui/assets/{sankeyDiagram-HTMAVEWB-DBXLWjEq.js → sankeyDiagram-HTMAVEWB-CaweCpvN.js} +1 -1
  261. package/dist/ui/assets/{sas-04z0Xu8P.js → sas-BPt5R0dx.js} +1 -1
  262. package/dist/ui/assets/{scala-DyB9Aoiv.js → scala-DxW_vqXs.js} +1 -1
  263. package/dist/ui/assets/{scheme-DBj6nxUi.js → scheme-T2Q_jWzT.js} +1 -1
  264. package/dist/ui/assets/{scilab-Btj7AD9s.js → scilab-DMORg9lV.js} +1 -1
  265. package/dist/ui/assets/{scss-BXZJyXt7.js → scss-t0VsosqT.js} +1 -1
  266. package/dist/ui/assets/{sequenceDiagram-DBY2YBRQ-DXIkBFKC.js → sequenceDiagram-DBY2YBRQ-o-H_R4zb.js} +1 -1
  267. package/dist/ui/assets/{shell-BsreQR1Z.js → shell-CnCDa1s9.js} +1 -1
  268. package/dist/ui/assets/{sizeCapture-X5ZJPWSS-ocS9jxAQ.js → sizeCapture-X5ZJPWSS-BNLkHGDS.js} +1 -1
  269. package/dist/ui/assets/{smali-D9wQw9zm.js → smali-_n-BxJyG.js} +1 -1
  270. package/dist/ui/assets/{smalltalk-Dku6G_H3.js → smalltalk-B90PXJwK.js} +1 -1
  271. package/dist/ui/assets/{sml-BknyU6ya.js → sml-fuY7bj-n.js} +1 -1
  272. package/dist/ui/assets/{sqf-DRYMaOg8.js → sqf-COpwkyuo.js} +1 -1
  273. package/dist/ui/assets/{sql-Cw3Ax4KA.js → sql-CXIT0j-x.js} +1 -1
  274. package/dist/ui/assets/{sql_more-vWdslLE0.js → sql_more-C1Oxq4rx.js} +1 -1
  275. package/dist/ui/assets/{stan-8XH5bDS6.js → stan-BZEpaHeC.js} +1 -1
  276. package/dist/ui/assets/{stata-4e77wgfe.js → stata-CkBwaiZM.js} +1 -1
  277. package/dist/ui/assets/{stateDiagram-2N3HPSRC-RMmL9jMG.js → stateDiagram-2N3HPSRC-BkdnNF7I.js} +1 -1
  278. package/dist/ui/assets/stateDiagram-v2-6OUMAXLB-0JnZ1VSQ.js +1 -0
  279. package/dist/ui/assets/{step21-ByIeDMY3.js → step21-fs9N_U3O.js} +1 -1
  280. package/dist/ui/assets/{stylus-ZAhJyWsw.js → stylus-Bs_9cvKZ.js} +1 -1
  281. package/dist/ui/assets/{subunit-pPW2UGkj.js → subunit-DvgcOCqJ.js} +1 -1
  282. package/dist/ui/assets/{swift-CX3BB5az.js → swift-BE4ONsur.js} +1 -1
  283. package/dist/ui/assets/{swimlanes-5IMT3BWC-C2zAuJ56.js → swimlanes-5IMT3BWC-uqTAc7o7.js} +2 -2
  284. package/dist/ui/assets/swimlanesDiagram-G3AALYLV-DQRIIEmi.js +8 -0
  285. package/dist/ui/assets/{taggerscript-BHcjbWIC.js → taggerscript-BhmPJ64C.js} +1 -1
  286. package/dist/ui/assets/{tap-BOl1lBlS.js → tap-DkueIVKV.js} +1 -1
  287. package/dist/ui/assets/{tcl-DZjeOBDh.js → tcl-DyXOOkFi.js} +1 -1
  288. package/dist/ui/assets/{thrift-BxboWg4x.js → thrift-Dhgbk56T.js} +1 -1
  289. package/dist/ui/assets/{timeline-definition-FHXFAJF6-BOxsxyq_.js → timeline-definition-FHXFAJF6-DBAk9Ouc.js} +1 -1
  290. package/dist/ui/assets/{tp-BNM6ql3J.js → tp-BsXyrRGH.js} +1 -1
  291. package/dist/ui/assets/{twig-Dj9ZiXD4.js → twig-J0HqIuHw.js} +1 -1
  292. package/dist/ui/assets/{typescript-7MEJlu_6.js → typescript-Dkwvul39.js} +1 -1
  293. package/dist/ui/assets/{vala-DNqOAgHJ.js → vala-CRGnf8aY.js} +1 -1
  294. package/dist/ui/assets/{vbnet-T0mNKVc_.js → vbnet-BtJAUe3z.js} +1 -1
  295. package/dist/ui/assets/{vbscript-CeuwVMAI.js → vbscript-RgFFNuM3.js} +1 -1
  296. package/dist/ui/assets/{vbscript-html-BbJSt2w6.js → vbscript-html-DO32Io9Y.js} +1 -1
  297. package/dist/ui/assets/{vennDiagram-L72KCM5P-BX9mWeiT.js → vennDiagram-L72KCM5P-BJi6y0hh.js} +1 -1
  298. package/dist/ui/assets/{verilog-DYuhYfkX.js → verilog-C4h6MLcI.js} +1 -1
  299. package/dist/ui/assets/{vhdl-Cf9aT-t7.js → vhdl-DOafePyU.js} +1 -1
  300. package/dist/ui/assets/{vim-DciP44K1.js → vim-BAdTA9TY.js} +1 -1
  301. package/dist/ui/assets/{wardleyDiagram-EHGQE667-CDj2rOzu.js → wardleyDiagram-EHGQE667-C7c_4IJ6.js} +1 -1
  302. package/dist/ui/assets/{x86asm-E-AN_LXO.js → x86asm-BCL6__QH.js} +1 -1
  303. package/dist/ui/assets/{xl-CxYLJelN.js → xl-qIzE4HOe.js} +1 -1
  304. package/dist/ui/assets/{xml-yz1SRLuU.js → xml-DE2sJXYU.js} +1 -1
  305. package/dist/ui/assets/{xquery-BLzBF3tV.js → xquery-CQ35t92y.js} +1 -1
  306. package/dist/ui/assets/{xychartDiagram-FW5EYKEG-Czapk9-Z.js → xychartDiagram-FW5EYKEG-D2ILn0jL.js} +1 -1
  307. package/dist/ui/assets/{yaml-Cv4Y7iN_.js → yaml-5KaAvG5C.js} +1 -1
  308. package/dist/ui/assets/{zephir-KRcdQfEX.js → zephir-CbR3Ryfq.js} +1 -1
  309. package/dist/ui/index.html +2 -2
  310. package/dist/utils/__tests__/abort-signals.test.js +67 -0
  311. package/dist/utils/__tests__/inject-loop.test.js +1 -53
  312. package/dist/utils/__tests__/learn-tasks-db.test.js +82 -0
  313. package/dist/utils/__tests__/openai-converter.test.js +25 -0
  314. package/dist/utils/__tests__/pi-crawl-tools.test.js +15 -4
  315. package/dist/utils/__tests__/pi-dedup-reconcile.test.js +11 -9
  316. package/dist/utils/__tests__/pi-events.test.js +172 -0
  317. package/dist/utils/__tests__/pi-learn-orchestrator.test.js +216 -6
  318. package/dist/utils/__tests__/pi-runtime-json.test.js +38 -3
  319. package/dist/utils/__tests__/providers-db.test.js +40 -2
  320. package/dist/utils/__tests__/request-writer.test.js +271 -39
  321. package/dist/utils/__tests__/sse-protocol.test.d.ts +1 -0
  322. package/dist/utils/__tests__/sse-protocol.test.js +115 -0
  323. package/dist/utils/__tests__/vault.test.d.ts +1 -0
  324. package/dist/utils/__tests__/{knowledge-store.test.js → vault.test.js} +16 -16
  325. package/dist/utils/abort-signals.d.ts +13 -0
  326. package/dist/utils/abort-signals.js +33 -0
  327. package/dist/utils/db.d.ts +1 -0
  328. package/dist/utils/db.js +24 -0
  329. package/dist/utils/esm-dirname.d.ts +0 -15
  330. package/dist/utils/esm-dirname.js +0 -4
  331. package/dist/utils/inject-loop.d.ts +0 -27
  332. package/dist/utils/inject-loop.js +2 -56
  333. package/dist/utils/learn-tasks-db.d.ts +15 -0
  334. package/dist/utils/learn-tasks-db.js +35 -0
  335. package/dist/utils/openai-converter.js +88 -78
  336. package/dist/utils/pi-browser-tools.d.ts +0 -2
  337. package/dist/utils/pi-browser-tools.js +0 -174
  338. package/dist/utils/pi-crawl-tools.d.ts +2 -1
  339. package/dist/utils/pi-crawl-tools.js +16 -11
  340. package/dist/utils/pi-dedup.d.ts +8 -30
  341. package/dist/utils/pi-dedup.js +32 -67
  342. package/dist/utils/pi-events.d.ts +65 -0
  343. package/dist/utils/pi-events.js +98 -0
  344. package/dist/utils/pi-learn-orchestrator.d.ts +6 -5
  345. package/dist/utils/pi-learn-orchestrator.js +71 -106
  346. package/dist/utils/pi-runtime.d.ts +5 -6
  347. package/dist/utils/pi-runtime.js +38 -42
  348. package/dist/utils/pi-sandbox-ops.d.ts +0 -36
  349. package/dist/utils/pi-sandbox-ops.js +5 -190
  350. package/dist/utils/providers-db.d.ts +3 -0
  351. package/dist/utils/providers-db.js +21 -7
  352. package/dist/utils/request-writer.d.ts +59 -30
  353. package/dist/utils/request-writer.js +178 -58
  354. package/dist/utils/sse-protocol.d.ts +34 -0
  355. package/dist/utils/sse-protocol.js +121 -0
  356. package/dist/utils/sse-stream-processor.d.ts +4 -9
  357. package/dist/utils/sse-stream-processor.js +13 -104
  358. package/dist/utils/sse-writer.d.ts +1 -1
  359. package/dist/utils/sse-writer.js +3 -2
  360. package/dist/utils/stats-aggregator.js +3 -0
  361. package/dist/utils/tool-injector.js +7 -0
  362. package/dist/utils/vault.d.ts +111 -0
  363. package/dist/utils/vault.js +434 -0
  364. package/package.json +1 -1
  365. package/dist/docs/assets/chunks/@localSearchIndexroot.B6Qfxe6W.js +0 -1
  366. package/dist/types/api.d.ts +0 -20
  367. package/dist/types/index.d.ts +0 -4
  368. package/dist/types/index.js +0 -4
  369. package/dist/types/log.d.ts +0 -13
  370. package/dist/ui/assets/channel-Bc4Td8eZ.js +0 -1
  371. package/dist/ui/assets/classDiagram-OUVF2IWQ-BicxhZFq.js +0 -1
  372. package/dist/ui/assets/classDiagram-v2-EOCWNBFH-BicxhZFq.js +0 -1
  373. package/dist/ui/assets/index-C0fxlU9d.css +0 -10
  374. package/dist/ui/assets/stateDiagram-v2-6OUMAXLB-QvaEO5U6.js +0 -1
  375. package/dist/ui/assets/swimlanesDiagram-G3AALYLV-DPgCOY0D.js +0 -8
  376. package/dist/utils/__tests__/sse-accumulator.test.js +0 -83
  377. package/dist/utils/knowledge-store.d.ts +0 -51
  378. package/dist/utils/knowledge-store.js +0 -241
  379. package/dist/utils/migrate-files-to-db.d.ts +0 -1
  380. package/dist/utils/migrate-files-to-db.js +0 -138
  381. package/dist/utils/sse-accumulator.d.ts +0 -9
  382. package/dist/utils/sse-accumulator.js +0 -59
  383. /package/dist/docs/assets/{proxy-cli_data-hooks.md.w9Oe1OD3.lean.js → proxy-cli_data-hooks.md.Bz8CVbxO.lean.js} +0 -0
  384. /package/dist/docs/assets/{proxy-core_ui-routes.md.Dyqkeoiv.lean.js → proxy-core_ui-routes.md.B21t1p7R.lean.js} +0 -0
  385. /package/dist/{types/api.js → utils/__tests__/abort-signals.test.d.ts} +0 -0
  386. /package/dist/{types/log.js → utils/__tests__/learn-tasks-db.test.d.ts} +0 -0
  387. /package/dist/utils/__tests__/{knowledge-store.test.d.ts → openai-converter.test.d.ts} +0 -0
  388. /package/dist/utils/__tests__/{sse-accumulator.test.d.ts → pi-events.test.d.ts} +0 -0
@@ -1,11 +1,8 @@
1
1
  import pino from 'pino';
2
2
  import type { LogConfig } from '../types/config.js';
3
- declare const LEVEL_MAP: Record<string, number>;
4
- declare const NUM_TO_LEVEL: Record<number, string>;
5
3
  export declare function createLogger(config: LogConfig): pino.Logger;
6
4
  export declare function readLogs(filePath: string, options: {
7
5
  limit?: number;
8
6
  level?: string;
9
7
  grep?: string;
10
8
  }): Promise<string[]>;
11
- export { LEVEL_MAP, NUM_TO_LEVEL };
@@ -116,4 +116,3 @@ export async function readLogs(filePath, options) {
116
116
  }
117
117
  return filtered;
118
118
  }
119
- export { LEVEL_MAP, NUM_TO_LEVEL };
@@ -2,8 +2,8 @@ import fs from 'fs';
2
2
  import { CallToolRequestSchema } from '@modelcontextprotocol/sdk/types.js';
3
3
  import { getDatabase } from '../utils/db.js';
4
4
  import { listRequestDB } from '../utils/request-writer.js';
5
- import { listProviders } from '../utils/providers-db.js';
6
- import { knowledgeStore } from '../utils/knowledge-store.js';
5
+ import { getActiveProvider } from '../utils/providers-db.js';
6
+ import { vault } from '../utils/vault.js';
7
7
  function ok(text) {
8
8
  return { content: [{ type: 'text', text }] };
9
9
  }
@@ -18,8 +18,7 @@ async function handleGetStatus(_args, ctx) {
18
18
  const countRow = db.prepare('SELECT COUNT(*) AS n FROM requests').get();
19
19
  let defaultProvider = null;
20
20
  try {
21
- const providers = listProviders(db);
22
- const def = providers.find(p => p.default);
21
+ const def = getActiveProvider(db);
23
22
  if (def) {
24
23
  defaultProvider = { name: def.name, model: def.model, base_url: def.base_url };
25
24
  }
@@ -192,10 +191,10 @@ const HANDLERS = {
192
191
  list_requests: handleListRequests,
193
192
  get_token_stats: handleGetTokenStats,
194
193
  get_logs: handleGetLogs,
195
- list_topics: async () => ok(JSON.stringify(await knowledgeStore.listTopics(), null, 2)),
194
+ list_topics: async () => ok(JSON.stringify(await vault.listTopics(), null, 2)),
196
195
  get_topic: async (args) => {
197
196
  try {
198
- return ok(JSON.stringify(await knowledgeStore.getTopic(args.topic), null, 2));
197
+ return ok(JSON.stringify(await vault.getTopic(args.topic), null, 2));
199
198
  }
200
199
  catch (e) {
201
200
  const msg = e instanceof Error ? e.message : String(e);
@@ -206,7 +205,7 @@ const HANDLERS = {
206
205
  }
207
206
  },
208
207
  query_knowledge: async (args) => {
209
- const hits = await knowledgeStore.queryKnowledge(args.query ?? '', args.limit);
208
+ const hits = await vault.queryKnowledge(args.query ?? '', args.limit);
210
209
  if (hits.length === 0) {
211
210
  return ok('No knowledge chunks matched. Call list_topics to browse available topics, or refine your query.');
212
211
  }
@@ -214,10 +213,10 @@ const HANDLERS = {
214
213
  hits: hits.map(h => ({ topic: h.topic, chunkId: h.chunkId, title: h.title, body: h.body })),
215
214
  }, null, 2));
216
215
  },
217
- search_chunks: async (args) => ok(JSON.stringify(await knowledgeStore.searchChunks(args.query ?? ''), null, 2)),
216
+ search_chunks: async (args) => ok(JSON.stringify(await vault.searchChunks(args.query ?? ''), null, 2)),
218
217
  read_chunk: async (args) => {
219
218
  try {
220
- const body = await knowledgeStore.readChunk(args.topic, args.chunk_id);
219
+ const body = await vault.readChunk(args.topic, args.chunk_id);
221
220
  return ok(body);
222
221
  }
223
222
  catch (e) {
@@ -49,6 +49,7 @@ jest.mock('@utils/db', () => {
49
49
  provider TEXT NOT NULL,
50
50
  is_default INTEGER NOT NULL DEFAULT 0,
51
51
  is_openai_compatible INTEGER NOT NULL DEFAULT 0,
52
+ auth_style TEXT NOT NULL DEFAULT 'bearer',
52
53
  created_at TEXT DEFAULT CURRENT_TIMESTAMP,
53
54
  updated_at TEXT DEFAULT CURRENT_TIMESTAMP
54
55
  )
@@ -1,2 +1 @@
1
- export declare const AUTH_TOKEN_ENV = "UI_AUTH_TOKEN";
2
1
  export declare function checkAuth(request: any, config: any): boolean;
@@ -1,4 +1,4 @@
1
- export const AUTH_TOKEN_ENV = 'UI_AUTH_TOKEN';
1
+ const AUTH_TOKEN_ENV = 'UI_AUTH_TOKEN';
2
2
  export function checkAuth(request, config) {
3
3
  // If no auth token configured, allow all (dev mode)
4
4
  const token = config?.auth?.token || process.env[AUTH_TOKEN_ENV];
@@ -1,10 +1,9 @@
1
1
  import { Readable } from 'stream';
2
2
  import { randomUUID } from 'node:crypto';
3
3
  import { loadConfig } from '../config/index.js';
4
- import { saveRequestDB, extractTokenUsage, loadSessionHistory } from '../utils/request-writer.js';
4
+ import { createRequestRecorder, recordIteration, loadSessionHistory } from '../utils/request-writer.js';
5
5
  import { cleanOldRequestsDB } from '../utils/request-writer.js';
6
- import { pushNewRequest } from './data-push.js';
7
- import { initDatabase, getDatabase } from '../utils/db.js';
6
+ import { initDatabase } from '../utils/db.js';
8
7
  import { resolveProxyTarget, getProxyModel, filterForwardHeaders, extractSafeHeaders } from './proxy.js';
9
8
  import { injectMcpTools } from '../utils/tool-injector.js';
10
9
  import { findInjectedCall, runJsonInjectLoop, runStreamingInjectLoop } from '../utils/inject-loop.js';
@@ -12,6 +11,7 @@ import { findEnabledTool } from '../tools/index.js';
12
11
  import { writeSSEEvent, writeTextAsSSE, shouldMock } from '../utils/sse-writer.js';
13
12
  import { SSEStreamProcessor } from '../utils/sse-stream-processor.js';
14
13
  import { getMachineIdSync, preloadMachineId } from '../utils/machine-id.js';
14
+ import { createClientAbortSignal, createTimeoutSignal } from '../utils/abort-signals.js';
15
15
  export async function setupChatRoute(fastify, proxyConfig) {
16
16
  const fullConfig = await loadConfig();
17
17
  const maxDays = fullConfig.storage?.maxDays ?? 7;
@@ -20,6 +20,8 @@ export async function setupChatRoute(fastify, proxyConfig) {
20
20
  fastify.post('/api/chat', async (request, reply) => {
21
21
  const startTime = Date.now();
22
22
  const resolved = resolveProxyTarget(proxyConfig);
23
+ // 下游客户端中止:建一次,主 fetch 与 inject 循环内 fetch 全部复用同一 signal
24
+ const clientSignal = createClientAbortSignal(request.raw);
23
25
  // Generate or reuse session ID
24
26
  const providedSessionId = request.headers['x-chat-session-id'];
25
27
  const sessionId = providedSessionId || randomUUID();
@@ -57,7 +59,7 @@ export async function setupChatRoute(fastify, proxyConfig) {
57
59
  request.log.info(`[chat] MCP tools injected: ${injectedNames.join(',')} (${request.id})`);
58
60
  }
59
61
  // Filter and forward headers
60
- const forwardHeaders = filterForwardHeaders(extractSafeHeaders(request.headers), resolved.apiKey);
62
+ const forwardHeaders = filterForwardHeaders(extractSafeHeaders(request.headers), resolved.apiKey, resolved.auth_style);
61
63
  forwardHeaders['x-chat-session-id'] = sessionId;
62
64
  // Extract API keys for recording
63
65
  const authHeader = request.headers['authorization'];
@@ -69,9 +71,9 @@ export async function setupChatRoute(fastify, proxyConfig) {
69
71
  (forwardedAuthHeader?.startsWith('Bearer ') ? forwardedAuthHeader.slice(7) : undefined);
70
72
  // Build request data
71
73
  const machineId = getMachineIdSync() ?? undefined;
72
- const requestData = {
73
- requestId: request.id,
74
+ const meta = {
74
75
  sessionId,
76
+ localRequestId: request.id,
75
77
  timestamp: new Date().toISOString(),
76
78
  apiKey,
77
79
  proxyApiKey,
@@ -83,29 +85,12 @@ export async function setupChatRoute(fastify, proxyConfig) {
83
85
  path: request.url,
84
86
  headers: forwardHeaders,
85
87
  body: request.body
86
- },
87
- response: {
88
- statusCode: 0,
89
- events: []
90
88
  }
91
89
  };
90
+ const rec = createRequestRecorder(meta);
92
91
  await cleanOldRequestsDB(maxDays);
93
92
  // Save initial record + push pending status to frontend
94
- await saveRequestDB(sessionId, request.id, requestData);
95
- pushNewRequest({
96
- requestId: request.id,
97
- sessionId,
98
- compositeId: `${sessionId}:${request.id}`,
99
- method: request.method,
100
- path: request.url,
101
- timestamp: requestData.timestamp,
102
- statusCode: 0,
103
- responseTime: 0,
104
- model: forwardedModel,
105
- machineId,
106
- userAgent: request.headers['user-agent'],
107
- baseUrl: resolved.baseUrl
108
- }, 'pending');
93
+ await rec.pending();
109
94
  // Mock interception (PoC)
110
95
  if (shouldMock(request.body)) {
111
96
  reply.hijack();
@@ -126,14 +111,11 @@ export async function setupChatRoute(fastify, proxyConfig) {
126
111
  method: 'POST',
127
112
  headers: forwardHeaders,
128
113
  body: JSON.stringify(request.body),
129
- signal: AbortSignal.timeout(300000)
114
+ signal: createTimeoutSignal(300000, clientSignal)
130
115
  });
131
116
  request.log.info(`[chat] response status: ${response.status}`);
132
117
  // Extract cloud request ID
133
118
  const cloudRequestId = response.headers.get('x-request-id') || request.id;
134
- requestData.requestId = cloudRequestId;
135
- requestData.response.statusCode = response.status;
136
- requestData.response.headers = Object.fromEntries(response.headers);
137
119
  // Check response type
138
120
  const contentType = response.headers.get('content-type') || '';
139
121
  const isSSE = contentType.includes('text/event-stream');
@@ -144,10 +126,10 @@ export async function setupChatRoute(fastify, proxyConfig) {
144
126
  let jsonBody;
145
127
  try {
146
128
  jsonBody = JSON.parse(responseBody);
147
- requestData.response.events.push(jsonBody);
129
+ rec.appendEvent(jsonBody);
148
130
  }
149
131
  catch {
150
- requestData.response.events.push({ raw: responseBody });
132
+ rec.appendEvent({ raw: responseBody });
151
133
  }
152
134
  // JSON inject loop: if MCP tools injected and response has tool_use
153
135
  if (injected && jsonBody && jsonBody.stop_reason === 'tool_use') {
@@ -163,7 +145,7 @@ export async function setupChatRoute(fastify, proxyConfig) {
163
145
  method: 'POST',
164
146
  headers: forwardHeaders,
165
147
  body: JSON.stringify(b),
166
- signal: AbortSignal.timeout(300000)
148
+ signal: createTimeoutSignal(300000, clientSignal)
167
149
  });
168
150
  const loopResponseBody = await r.text();
169
151
  let loopJson;
@@ -172,101 +154,42 @@ export async function setupChatRoute(fastify, proxyConfig) {
172
154
  }
173
155
  catch { /* ignore */ }
174
156
  // Record each loop iteration as a separate request
175
- if (loopJson) {
176
- const loopRequestId = r.headers.get('x-request-id') || `loop_${request.id}_${Date.now()}`;
177
- const loopData = {
178
- requestId: loopRequestId,
179
- sessionId,
180
- timestamp: new Date().toISOString(),
181
- apiKey,
182
- proxyApiKey,
183
- baseUrl: resolved.baseUrl,
184
- model: forwardedModel,
185
- machineId,
186
- request: { method: 'POST', path: '/api/chat', headers: forwardHeaders, body: b },
187
- response: {
188
- statusCode: r.status,
189
- headers: Object.fromEntries(r.headers),
190
- events: [loopJson],
191
- completedAt: new Date().toISOString()
192
- }
193
- };
194
- await saveRequestDB(sessionId, loopRequestId, loopData);
195
- const loopUsage = extractTokenUsage(loopData.response.events);
196
- pushNewRequest({
197
- requestId: loopRequestId,
198
- sessionId,
199
- compositeId: `${sessionId}:${loopRequestId}`,
200
- method: 'POST',
201
- path: '/api/chat',
202
- timestamp: loopData.timestamp,
157
+ await recordIteration({
158
+ sessionId,
159
+ localRequestId: r.headers.get('x-request-id') || `loop_${request.id}_${Date.now()}`,
160
+ timestamp: new Date().toISOString(),
161
+ apiKey,
162
+ proxyApiKey,
163
+ baseUrl: resolved.baseUrl,
164
+ model: forwardedModel,
165
+ machineId,
166
+ request: { method: 'POST', path: '/api/chat', headers: forwardHeaders, body: b },
167
+ response: {
203
168
  statusCode: r.status,
204
- responseTime: 0,
205
- model: forwardedModel,
206
- machineId,
207
- userAgent: request.headers['user-agent'],
208
- baseUrl: resolved.baseUrl,
209
- usage: loopUsage
210
- }, 'completed');
211
- }
169
+ headers: Object.fromEntries(r.headers),
170
+ events: loopJson ? [loopJson] : []
171
+ }
172
+ });
212
173
  return loopJson || JSON.parse(loopResponseBody);
213
174
  }
214
175
  });
215
176
  request.log.info(`[chat] json loop done: ${loopResult.iterations} iter (${cloudRequestId})`);
216
- requestData.response.completedAt = new Date().toISOString();
217
- // Remove pending row if cloudRequestId differs from request.id
218
- if (cloudRequestId !== request.id) {
219
- const db = getDatabase();
220
- db.prepare('DELETE FROM requests WHERE request_id = ? AND session_id = ?').run(request.id, sessionId);
221
- }
222
- await saveRequestDB(sessionId, cloudRequestId, requestData);
223
- const usage = extractTokenUsage(requestData.response.events);
224
- pushNewRequest({
225
- requestId: cloudRequestId,
226
- sessionId,
227
- compositeId: `${sessionId}:${cloudRequestId}`,
228
- method: request.method,
229
- path: request.url,
230
- timestamp: requestData.timestamp,
177
+ await rec.complete({
178
+ cloudRequestId: cloudRequestId !== request.id ? cloudRequestId : undefined,
231
179
  statusCode: response.status,
232
- responseTime: Date.now() - startTime,
233
- model: forwardedModel,
234
- machineId,
235
- userAgent: request.headers['user-agent'],
236
- baseUrl: resolved.baseUrl,
237
- usage,
238
- pendingId: cloudRequestId !== request.id ? `${sessionId}:${request.id}` : undefined
239
- }, 'completed');
180
+ headers: Object.fromEntries(response.headers)
181
+ });
240
182
  const finalBody = { ...loopResult.finalBody, _sessionId: sessionId };
241
183
  reply.code(200).header('x-chat-session-id', sessionId).send(JSON.stringify(finalBody));
242
184
  return;
243
185
  }
244
186
  }
245
187
  // Normal JSON passthrough
246
- requestData.response.completedAt = new Date().toISOString();
247
- // Remove pending row if cloudRequestId differs from request.id
248
- if (cloudRequestId !== request.id) {
249
- const db = getDatabase();
250
- db.prepare('DELETE FROM requests WHERE request_id = ? AND session_id = ?').run(request.id, sessionId);
251
- }
252
- await saveRequestDB(sessionId, cloudRequestId, requestData);
253
- const usage = extractTokenUsage(requestData.response.events);
254
- pushNewRequest({
255
- requestId: cloudRequestId,
256
- sessionId,
257
- compositeId: `${sessionId}:${cloudRequestId}`,
258
- method: request.method,
259
- path: request.url,
260
- timestamp: requestData.timestamp,
188
+ await rec.complete({
189
+ cloudRequestId: cloudRequestId !== request.id ? cloudRequestId : undefined,
261
190
  statusCode: response.status,
262
- responseTime: Date.now() - startTime,
263
- model: forwardedModel,
264
- machineId,
265
- userAgent: request.headers['user-agent'],
266
- baseUrl: resolved.baseUrl,
267
- usage,
268
- pendingId: cloudRequestId !== request.id ? `${sessionId}:${request.id}` : undefined
269
- }, 'completed');
191
+ headers: Object.fromEntries(response.headers)
192
+ });
270
193
  // Inject session ID into response for passthrough
271
194
  try {
272
195
  const passthroughBody = JSON.parse(responseBody);
@@ -294,32 +217,13 @@ export async function setupChatRoute(fastify, proxyConfig) {
294
217
  });
295
218
  nodeStream.on('end', async () => {
296
219
  processor.flushLeftover();
297
- // 保存原始请求到 DB
298
- requestData.response.events = processor.events;
299
- requestData.response.completedAt = new Date().toISOString();
300
- // Remove pending row if cloudRequestId differs from request.id
301
- if (cloudRequestId !== request.id) {
302
- const db = getDatabase();
303
- db.prepare('DELETE FROM requests WHERE request_id = ? AND session_id = ?').run(request.id, sessionId);
304
- }
305
- await saveRequestDB(sessionId, cloudRequestId, requestData);
306
- const usage = extractTokenUsage(requestData.response.events);
307
- pushNewRequest({
308
- requestId: cloudRequestId,
309
- sessionId,
310
- compositeId: `${sessionId}:${cloudRequestId}`,
311
- method: request.method,
312
- path: request.url,
313
- timestamp: requestData.timestamp,
220
+ for (const ev of processor.events)
221
+ rec.appendEvent(ev);
222
+ await rec.complete({
223
+ cloudRequestId: cloudRequestId !== request.id ? cloudRequestId : undefined,
314
224
  statusCode: response.status,
315
- responseTime: Date.now() - startTime,
316
- model: forwardedModel,
317
- machineId,
318
- userAgent: request.headers['user-agent'],
319
- baseUrl: resolved.baseUrl,
320
- usage,
321
- pendingId: cloudRequestId !== request.id ? `${sessionId}:${request.id}` : undefined
322
- }, 'completed');
225
+ headers: Object.fromEntries(response.headers)
226
+ });
323
227
  request.log.info(`[chat] stream completed: ${cloudRequestId} ${response.status} (${Date.now() - startTime}ms, ${processor.events.length} events)`);
324
228
  // 检测注入的 MCP tool_use → 发 proxy_status 信号 + 跑 streaming inject loop
325
229
  if (processor.hasInjectedToolUse()) {
@@ -335,7 +239,7 @@ export async function setupChatRoute(fastify, proxyConfig) {
335
239
  method: 'POST',
336
240
  headers: forwardHeaders,
337
241
  body: JSON.stringify(b),
338
- signal: AbortSignal.timeout(300000)
242
+ signal: createTimeoutSignal(300000, clientSignal)
339
243
  });
340
244
  const loopRequestId = r.headers.get('x-request-id') || `loop_${request.id}_${Date.now()}`;
341
245
  return { response: r, requestId: loopRequestId };
@@ -358,9 +262,9 @@ export async function setupChatRoute(fastify, proxyConfig) {
358
262
  },
359
263
  sessionId,
360
264
  saveIterationDB: async (loopRequestId, loopProcessor, loopStatusCode, loopBody) => {
361
- const loopData = {
362
- requestId: loopRequestId,
265
+ await recordIteration({
363
266
  sessionId,
267
+ localRequestId: loopRequestId,
364
268
  timestamp: new Date().toISOString(),
365
269
  apiKey,
366
270
  proxyApiKey,
@@ -370,27 +274,9 @@ export async function setupChatRoute(fastify, proxyConfig) {
370
274
  request: { method: 'POST', path: '/api/chat', headers: forwardHeaders, body: loopBody },
371
275
  response: {
372
276
  statusCode: loopStatusCode,
373
- events: loopProcessor.events,
374
- completedAt: new Date().toISOString()
277
+ events: loopProcessor.events
375
278
  }
376
- };
377
- await saveRequestDB(sessionId, loopRequestId, loopData);
378
- const loopUsage = extractTokenUsage(loopProcessor.events);
379
- pushNewRequest({
380
- requestId: loopRequestId,
381
- sessionId,
382
- compositeId: `${sessionId}:${loopRequestId}`,
383
- method: 'POST',
384
- path: '/api/chat',
385
- timestamp: loopData.timestamp,
386
- statusCode: loopStatusCode,
387
- responseTime: 0,
388
- model: forwardedModel,
389
- machineId,
390
- userAgent: request.headers['user-agent'],
391
- baseUrl: resolved.baseUrl,
392
- usage: loopUsage
393
- }, 'completed');
279
+ });
394
280
  },
395
281
  raw: reply.raw
396
282
  });
@@ -3,5 +3,4 @@ export declare function addDataClient(ws: WebSocket): void;
3
3
  export declare function removeDataClient(ws: WebSocket): void;
4
4
  export declare function getDataClientCount(): number;
5
5
  export declare function pushNewRequest(summary: any, status?: 'pending' | 'completed'): void;
6
- export declare function pushStatsNotify(): void;
7
6
  export declare function broadcastToDataClients(msg: any): void;
@@ -18,13 +18,6 @@ export function pushNewRequest(summary, status = 'completed') {
18
18
  data: { ...summary, status }
19
19
  });
20
20
  }
21
- export function pushStatsNotify() {
22
- broadcast({
23
- type: 'stats',
24
- action: 'notify',
25
- data: { reason: 'file_updated' }
26
- });
27
- }
28
21
  function broadcast(msg) {
29
22
  const payload = JSON.stringify(msg);
30
23
  for (const ws of dataClients) {