@cc-monitoring/proxy-core 0.3.0 → 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 (389) 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.Dc46Hlqp.js → app.DtYNT5zS.js} +1 -1
  5. package/dist/docs/assets/chunks/@localSearchIndexroot.C4sjikMO.js +1 -0
  6. package/dist/docs/assets/chunks/{VPLocalSearchBox.Snq5jR6J.js → VPLocalSearchBox.DpXF9ZAI.js} +1 -1
  7. package/dist/docs/assets/chunks/{theme.XLtxGM-l.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/index.js +5 -3
  48. package/dist/mcp-server/tools.js +31 -10
  49. package/dist/server/__tests__/providers-route.test.js +1 -0
  50. package/dist/server/auth.d.ts +0 -1
  51. package/dist/server/auth.js +1 -1
  52. package/dist/server/chat-route.js +48 -156
  53. package/dist/server/data-push.d.ts +0 -1
  54. package/dist/server/data-push.js +0 -7
  55. package/dist/server/proxy.js +128 -219
  56. package/dist/server/ui-route.js +76 -59
  57. package/dist/tools/index.d.ts +1 -1
  58. package/dist/tools/index.js +1 -1
  59. package/dist/tools/registry.d.ts +0 -4
  60. package/dist/tools/registry.js +0 -8
  61. package/dist/types/config.d.ts +0 -13
  62. package/dist/types/pm2.d.ts +1 -2
  63. package/dist/ui/assets/{1c-Bx3CHH-I.js → 1c-CCx-FOtz.js} +1 -1
  64. package/dist/ui/assets/{abnf-NN4-iXDM.js → abnf-Bwbi42Z8.js} +1 -1
  65. package/dist/ui/assets/{abnfDiagram-VRR7QNED-CXFZgDk7.js → abnfDiagram-VRR7QNED-Dm1-8q0E.js} +1 -1
  66. package/dist/ui/assets/{accesslog-Bq9x4vSZ.js → accesslog-DCytz_-m.js} +1 -1
  67. package/dist/ui/assets/{actionscript-CeaB6gjT.js → actionscript-3udf15oh.js} +1 -1
  68. package/dist/ui/assets/{ada-DObFDSC6.js → ada-M5Xa74xG.js} +1 -1
  69. package/dist/ui/assets/{angelscript-4pIbuWPH.js → angelscript-qlrFxfW-.js} +1 -1
  70. package/dist/ui/assets/{apache-w0LzP4me.js → apache-B-sF-DQH.js} +1 -1
  71. package/dist/ui/assets/{applescript-DXpD6Cc9.js → applescript-4FdcBnbI.js} +1 -1
  72. package/dist/ui/assets/{arc-Dtt1H4m8.js → arc-BB3K1enp.js} +1 -1
  73. package/dist/ui/assets/{arcade-D_zU9Djr.js → arcade-B_yqWaaG.js} +1 -1
  74. package/dist/ui/assets/{architectureDiagram-ZJ3FMSHR-C0E_eQDM.js → architectureDiagram-ZJ3FMSHR-B39vkY8V.js} +1 -1
  75. package/dist/ui/assets/{arduino-BnmN_xp_.js → arduino-yAcBoTWU.js} +1 -1
  76. package/dist/ui/assets/{armasm-CH_xJaHf.js → armasm-wIcY84bI.js} +1 -1
  77. package/dist/ui/assets/{asciidoc-BlvZZ-hO.js → asciidoc-Bxnu28-Z.js} +1 -1
  78. package/dist/ui/assets/{aspectj-DP5DdFKQ.js → aspectj-B2cKJA_O.js} +1 -1
  79. package/dist/ui/assets/{autohotkey-Cy7dy_B1.js → autohotkey-B_rMWTtE.js} +1 -1
  80. package/dist/ui/assets/{autoit-BmQwjQdM.js → autoit-DwcuvMwv.js} +1 -1
  81. package/dist/ui/assets/{avrasm-fcPy4w1X.js → avrasm-heGX1PXK.js} +1 -1
  82. package/dist/ui/assets/{awk-AlcwGSdk.js → awk-BiqCQAEf.js} +1 -1
  83. package/dist/ui/assets/{axapta-NyMN6Mvz.js → axapta-Cv8M-Ih6.js} +1 -1
  84. package/dist/ui/assets/{bash-Bn3yyTUs.js → bash-Divgn3JV.js} +1 -1
  85. package/dist/ui/assets/{basic-gp9eOjjv.js → basic-B9dnAP55.js} +1 -1
  86. package/dist/ui/assets/{blockDiagram-677ZJIJ3-BHAadGGo.js → blockDiagram-677ZJIJ3-DQ1mf7A_.js} +1 -1
  87. package/dist/ui/assets/{bnf-DRAiK-_J.js → bnf-kIL5mSsP.js} +1 -1
  88. package/dist/ui/assets/{brainfuck-IYgPavhh.js → brainfuck-DqB7xDjH.js} +1 -1
  89. package/dist/ui/assets/{coq-BYVsAo31.js → c-HmsCM6sx.js} +1 -1
  90. package/dist/ui/assets/{c-like-B7T39dtK.js → c-like-De5MhE7G.js} +1 -1
  91. package/dist/ui/assets/{c4Diagram-LMCZKHZV-4cXT8R9f.js → c4Diagram-LMCZKHZV-DQxtYsAx.js} +1 -1
  92. package/dist/ui/assets/{cal-DmXm_WLX.js → cal-mYdfz9en.js} +1 -1
  93. package/dist/ui/assets/{capnproto-Cb-rKd-Z.js → capnproto-D04CRlOt.js} +1 -1
  94. package/dist/ui/assets/{ceylon-Bn2aNwEq.js → ceylon-pi9lFCja.js} +1 -1
  95. package/dist/ui/assets/channel-ChTtxQDg.js +1 -0
  96. package/dist/ui/assets/{chunk-2Q5K7J3B-B3N_AddF.js → chunk-2Q5K7J3B-BDD1nPt8.js} +1 -1
  97. package/dist/ui/assets/{chunk-32BRIVSS-CW7iU3gE.js → chunk-32BRIVSS-DgeQFBb5.js} +1 -1
  98. package/dist/ui/assets/{chunk-5VM5RSS4-M8Ep3dJD.js → chunk-5VM5RSS4-C7Xf2SnI.js} +1 -1
  99. package/dist/ui/assets/{chunk-EX3LRPZG-t2hCXH-v.js → chunk-EX3LRPZG-B_3p1HEv.js} +1 -1
  100. package/dist/ui/assets/{chunk-JWPE2WC7-rQK8maXo.js → chunk-JWPE2WC7-Dvs7u8eY.js} +1 -1
  101. package/dist/ui/assets/{chunk-MOJQB5TN-BpU7vp3L.js → chunk-MOJQB5TN-By21wDCN.js} +1 -1
  102. package/dist/ui/assets/{chunk-RYQCIY6F-CJVNOulR.js → chunk-RYQCIY6F-6NC700r1.js} +1 -1
  103. package/dist/ui/assets/{chunk-V7JOEXUC-B--maww3.js → chunk-V7JOEXUC-vEUqZ3rh.js} +1 -1
  104. package/dist/ui/assets/{chunk-VR4S4FIN-QJ5u9nSh.js → chunk-VR4S4FIN-6tX2dNN9.js} +1 -1
  105. package/dist/ui/assets/{chunk-XXDRQBXY-BcM9JOXa.js → chunk-XXDRQBXY-qDb2jxAR.js} +1 -1
  106. package/dist/ui/assets/classDiagram-OUVF2IWQ-Ccbvamlu.js +1 -0
  107. package/dist/ui/assets/classDiagram-v2-EOCWNBFH-Ccbvamlu.js +1 -0
  108. package/dist/ui/assets/{clean-BCfhFoON.js → clean-CLCsDUl1.js} +1 -1
  109. package/dist/ui/assets/{clojure-DtnBj8eB.js → clojure-dVi5Xifj.js} +1 -1
  110. package/dist/ui/assets/{clojure-repl-D8X-urCW.js → clojure-repl-BO_FpFmF.js} +1 -1
  111. package/dist/ui/assets/{cmake-BH2RXBgt.js → cmake-CP5aJbyK.js} +1 -1
  112. package/dist/ui/assets/{coffeescript-CuoLiQ_d.js → coffeescript-ZEfu_9pF.js} +1 -1
  113. package/dist/ui/assets/{c-Dht0EgwX.js → coq-6aKUn3zn.js} +1 -1
  114. package/dist/ui/assets/{cos-t-cDfrf6.js → cos-BohCnRN2.js} +1 -1
  115. package/dist/ui/assets/{cose-bilkent-JH36ORCC-CYip_9u7.js → cose-bilkent-JH36ORCC-DyXCbbro.js} +1 -1
  116. package/dist/ui/assets/{cpp-Cgv0dQ7g.js → cpp-FOgPWPEt.js} +1 -1
  117. package/dist/ui/assets/{crmsh-7pr1Pq_e.js → crmsh-B0OYb-Oe.js} +1 -1
  118. package/dist/ui/assets/{crystal-BHZFifeV.js → crystal-CuWb_dXm.js} +1 -1
  119. package/dist/ui/assets/{csharp-CVMfBRGF.js → csharp-BbcqM09j.js} +1 -1
  120. package/dist/ui/assets/{csp-NEBRDuZY.js → csp-rgHnTaDq.js} +1 -1
  121. package/dist/ui/assets/{css-B0fbMkoQ.js → css-C-ibh7ZG.js} +1 -1
  122. package/dist/ui/assets/{cynefin-VYW2F7L2-CycR2u2l.js → cynefin-VYW2F7L2-CkuBhgC4.js} +1 -1
  123. package/dist/ui/assets/{cynefinDiagram-TSTJHNR4-CvXYb5em.js → cynefinDiagram-TSTJHNR4-eycFyDao.js} +1 -1
  124. package/dist/ui/assets/{d-AzA6F7Ab.js → d-C0gXxJ0O.js} +1 -1
  125. package/dist/ui/assets/{dagre-VKFMJZFB-6NuSYMRG.js → dagre-VKFMJZFB-DzqX9e49.js} +1 -1
  126. package/dist/ui/assets/{dart-D0VXSwKi.js → dart-C-fTpuUV.js} +1 -1
  127. package/dist/ui/assets/{delphi-B-bkLmCx.js → delphi-Chm0B9xv.js} +1 -1
  128. package/dist/ui/assets/{diagram-FQU43EPY-CNNW_5O7.js → diagram-FQU43EPY-BEgCqfg1.js} +1 -1
  129. package/dist/ui/assets/{diagram-G47NLZAW-C60bRph-.js → diagram-G47NLZAW-Cw11Vs2v.js} +1 -1
  130. package/dist/ui/assets/{diagram-NH7WQ7WH-CwERNWac.js → diagram-NH7WQ7WH-DSG_UWpP.js} +1 -1
  131. package/dist/ui/assets/{diagram-OA4YK3LP-9XSTmf1Z.js → diagram-OA4YK3LP-CJz-WOaJ.js} +1 -1
  132. package/dist/ui/assets/{diagram-WEI45ONY-h8K41_YA.js → diagram-WEI45ONY-CBXjBCvc.js} +1 -1
  133. package/dist/ui/assets/{diff-Ch9RlEn8.js → diff-C-vyuMSL.js} +1 -1
  134. package/dist/ui/assets/{django-C00rhzcB.js → django-CJK7lReT.js} +1 -1
  135. package/dist/ui/assets/{dns-C5MKVde0.js → dns-D02SHjSy.js} +1 -1
  136. package/dist/ui/assets/{dockerfile-BpRaVDMB.js → dockerfile-trKL1Bqu.js} +1 -1
  137. package/dist/ui/assets/{dos-CjQOJ_vn.js → dos-C52dy-sK.js} +1 -1
  138. package/dist/ui/assets/{dsconfig-3zd3UkyN.js → dsconfig-MzHgzVrt.js} +1 -1
  139. package/dist/ui/assets/{dts-Bb6PtK5T.js → dts-B137dHyX.js} +1 -1
  140. package/dist/ui/assets/{dust-BEJKezIa.js → dust-BcbM0r5C.js} +1 -1
  141. package/dist/ui/assets/{ebnf-5-TvfsoC.js → ebnf-DkbpI7bK.js} +1 -1
  142. package/dist/ui/assets/{ebnfDiagram-CCIWWBDH-CRmIjeas.js → ebnfDiagram-CCIWWBDH-aI5uQ7w1.js} +1 -1
  143. package/dist/ui/assets/{elixir-B6gSEyen.js → elixir-BOtDuqQy.js} +1 -1
  144. package/dist/ui/assets/{elm-rR0aqyyf.js → elm-DS8Tyyu-.js} +1 -1
  145. package/dist/ui/assets/{erDiagram-Q63AITRT-DS3jYOq8.js → erDiagram-Q63AITRT-2vCbd4Mm.js} +1 -1
  146. package/dist/ui/assets/{erb-DUu22Jxg.js → erb-CSXECRbn.js} +1 -1
  147. package/dist/ui/assets/{erlang-C0m-R-6W.js → erlang-BMxlgKPJ.js} +1 -1
  148. package/dist/ui/assets/{erlang-repl-B7O2MhlI.js → erlang-repl-DPzlolPg.js} +1 -1
  149. package/dist/ui/assets/{excel-CIqnqFs1.js → excel-CW2Uxed3.js} +1 -1
  150. package/dist/ui/assets/{fix-Ds9tcTzQ.js → fix-UW84SlCs.js} +1 -1
  151. package/dist/ui/assets/{flix-ByzuevTB.js → flix-4UGiPULd.js} +1 -1
  152. package/dist/ui/assets/{flowDiagram-23GEKE2U-B9F3S_Hl.js → flowDiagram-23GEKE2U-R5PbCbZI.js} +1 -1
  153. package/dist/ui/assets/{fortran-DieSVGx5.js → fortran-nhHsngdu.js} +1 -1
  154. package/dist/ui/assets/{fsharp-DGP8m6H3.js → fsharp-CDyZ1ST5.js} +1 -1
  155. package/dist/ui/assets/{gams-BiLGBohb.js → gams-DHzkkUie.js} +1 -1
  156. package/dist/ui/assets/{ganttDiagram-NO4QXBWP-CHiCWnJt.js → ganttDiagram-NO4QXBWP-CGcq4Ie_.js} +1 -1
  157. package/dist/ui/assets/{gauss-Btl1fjJ0.js → gauss-DdhFGyBv.js} +1 -1
  158. package/dist/ui/assets/{gcode-DWl2YoL_.js → gcode-ImHh8OLA.js} +1 -1
  159. package/dist/ui/assets/{gherkin-D42ESIJ2.js → gherkin-CTWAW-XR.js} +1 -1
  160. package/dist/ui/assets/{gitGraphDiagram-IHSO6WYX-0pEKZnJg.js → gitGraphDiagram-IHSO6WYX-8nM2Z9lD.js} +1 -1
  161. package/dist/ui/assets/{glsl-Dx1QhGIM.js → glsl-0_W_27G2.js} +1 -1
  162. package/dist/ui/assets/{gml-f0noEVTB.js → gml-BoDggu2z.js} +1 -1
  163. package/dist/ui/assets/{go-DXT6c-0g.js → go-DYfFygwl.js} +1 -1
  164. package/dist/ui/assets/{golo-D3NuJxTg.js → golo-Mlq-TCg9.js} +1 -1
  165. package/dist/ui/assets/{gradle-CUsTLc_e.js → gradle-BALAinEB.js} +1 -1
  166. package/dist/ui/assets/{groovy-BIkOcIpQ.js → groovy-Dht--dWU.js} +1 -1
  167. package/dist/ui/assets/{haml-C5jI7YVN.js → haml-DpMrxg0d.js} +1 -1
  168. package/dist/ui/assets/{handlebars-UOvbWwDx.js → handlebars-DqHzujNj.js} +1 -1
  169. package/dist/ui/assets/{haskell-DuO_Av2n.js → haskell-DZSchhkY.js} +1 -1
  170. package/dist/ui/assets/{haxe-C0Cg5Hjh.js → haxe-C0zBRjdy.js} +1 -1
  171. package/dist/ui/assets/{hsp-CTDajZig.js → hsp-D_PwbSv2.js} +1 -1
  172. package/dist/ui/assets/{htmlbars-_ITuCkOs.js → htmlbars-DxAFMG8u.js} +1 -1
  173. package/dist/ui/assets/{http-Dr26PHfb.js → http-DvTRF0Do.js} +1 -1
  174. package/dist/ui/assets/{hy-B-ThgV4T.js → hy-lVO-kNyp.js} +1 -1
  175. package/dist/ui/assets/{index-CpQr158p.js → index-BbMRVVGt.js} +3 -3
  176. package/dist/ui/assets/{index-CwcnuNUs.js → index-Ci23SMK2.js} +242 -242
  177. package/dist/ui/assets/index-DlsVXaHT.css +10 -0
  178. package/dist/ui/assets/{infoDiagram-FWYZ7A6U-ClKPOdlx.js → infoDiagram-FWYZ7A6U-C7WYDlvc.js} +1 -1
  179. package/dist/ui/assets/{inform7-D7JYYkX9.js → inform7-B8Tf2n8v.js} +1 -1
  180. package/dist/ui/assets/{ini-BZwCkFAf.js → ini-DSoYMaLF.js} +1 -1
  181. package/dist/ui/assets/{irpf90-omMve0rd.js → irpf90-RCPdkB14.js} +1 -1
  182. package/dist/ui/assets/{isbl-C4xosfum.js → isbl-C2p75PPj.js} +1 -1
  183. package/dist/ui/assets/{ishikawaDiagram-FXEZZL3T-PtbNBMgh.js → ishikawaDiagram-FXEZZL3T-Cm6jsPlc.js} +1 -1
  184. package/dist/ui/assets/{java-CWjWDe7Q.js → java-DeY4Yuia.js} +1 -1
  185. package/dist/ui/assets/{javascript-C3dxrGuA.js → javascript-3uX1CO-H.js} +1 -1
  186. package/dist/ui/assets/{jboss-cli-CJE7m0Y-.js → jboss-cli-DgnD8mEc.js} +1 -1
  187. package/dist/ui/assets/{journeyDiagram-5HDEW3XC-DgK9V4yg.js → journeyDiagram-5HDEW3XC-DEGV1uA5.js} +1 -1
  188. package/dist/ui/assets/{json-DFUiNV7v.js → json-BV2PmJJp.js} +1 -1
  189. package/dist/ui/assets/{julia-CUTHpx8X.js → julia-B-m8kQm7.js} +1 -1
  190. package/dist/ui/assets/{julia-repl-_ZaQqdrz.js → julia-repl-C51atU2X.js} +1 -1
  191. package/dist/ui/assets/{kanban-definition-HUTT4EX6-BFrDfKdv.js → kanban-definition-HUTT4EX6-BJ4k5iTX.js} +1 -1
  192. package/dist/ui/assets/{kotlin-CrYjQYp8.js → kotlin-CYBziIgl.js} +1 -1
  193. package/dist/ui/assets/{lasso-CAiVg9m2.js → lasso-Dw2SBMDW.js} +1 -1
  194. package/dist/ui/assets/{latex-BkxnXIrT.js → latex-Dpd35yke.js} +1 -1
  195. package/dist/ui/assets/{ldif-CBOqxiN7.js → ldif-Ce9EZU__.js} +1 -1
  196. package/dist/ui/assets/{leaf-CbBZyOGH.js → leaf-CpkZzQtC.js} +1 -1
  197. package/dist/ui/assets/{less-Ca6uLPP0.js → less-Uzo7M0FD.js} +1 -1
  198. package/dist/ui/assets/{lisp-0Cm7_Bzv.js → lisp-DWXDlJYm.js} +1 -1
  199. package/dist/ui/assets/{livecodeserver-B7ka0vFT.js → livecodeserver-uEyPEgVJ.js} +1 -1
  200. package/dist/ui/assets/{livescript-CGmWmcLd.js → livescript-BQ5f07oK.js} +1 -1
  201. package/dist/ui/assets/{llvm-DCVMvkrH.js → llvm-BAvP-skE.js} +1 -1
  202. package/dist/ui/assets/{lsl-PVrTScpn.js → lsl-DhbiIKu6.js} +1 -1
  203. package/dist/ui/assets/{lua-BTo3z2Ux.js → lua-COxeUeLx.js} +1 -1
  204. package/dist/ui/assets/{makefile-DJGh9r9C.js → makefile-DhDx-IgL.js} +1 -1
  205. package/dist/ui/assets/{markdown-BOloL-q7.js → markdown-DX5_kSxq.js} +1 -1
  206. package/dist/ui/assets/{mathematica-CtMMQM2V.js → mathematica-D351ZddB.js} +1 -1
  207. package/dist/ui/assets/{matlab-Bfg_AWdR.js → matlab-CELqIiwF.js} +1 -1
  208. package/dist/ui/assets/{maxima-B2cdS7BY.js → maxima-B_YljrMm.js} +1 -1
  209. package/dist/ui/assets/{mel-BvfPvpYI.js → mel-DltsbNS8.js} +1 -1
  210. package/dist/ui/assets/{mercury-B6KgNIai.js → mercury-axX-5Vjj.js} +1 -1
  211. package/dist/ui/assets/{mindmap-definition-LN4V7U3C-BkeXo5If.js → mindmap-definition-LN4V7U3C-Bl1EJo6p.js} +1 -1
  212. package/dist/ui/assets/{mipsasm-Csras-cD.js → mipsasm-BxmerVwX.js} +1 -1
  213. package/dist/ui/assets/{mizar-C3WDI1-X.js → mizar-XNHfbpL2.js} +1 -1
  214. package/dist/ui/assets/{mojolicious-MnD2Whic.js → mojolicious-BR0U_7zk.js} +1 -1
  215. package/dist/ui/assets/{monkey-DLvUPYTI.js → monkey-lLuu9_f-.js} +1 -1
  216. package/dist/ui/assets/{moonscript-B0XEb3R3.js → moonscript-DoaZ3DRQ.js} +1 -1
  217. package/dist/ui/assets/{n1ql-BMRF54sY.js → n1ql-C6TId6Iu.js} +1 -1
  218. package/dist/ui/assets/{nginx-DqUyeHb8.js → nginx-BezSG-JT.js} +1 -1
  219. package/dist/ui/assets/{nim-3xwg8mOL.js → nim-Bb0rfXie.js} +1 -1
  220. package/dist/ui/assets/{nix-ByTkLdcH.js → nix-o3sJ5-54.js} +1 -1
  221. package/dist/ui/assets/{node-repl-sGSuIUFG.js → node-repl-Sv5hhcTf.js} +1 -1
  222. package/dist/ui/assets/{nsis-Dng5mFSM.js → nsis-B45BJFhF.js} +1 -1
  223. package/dist/ui/assets/{objectivec-DSQ8vb7n.js → objectivec-CzS6zVgh.js} +1 -1
  224. package/dist/ui/assets/{ocaml-BHOhEgRu.js → ocaml-Bqux7PyP.js} +1 -1
  225. package/dist/ui/assets/{openscad-DcUxQ-FQ.js → openscad-4Wf6mF84.js} +1 -1
  226. package/dist/ui/assets/{oxygene-DNlmqhsR.js → oxygene-Fvwqgkkt.js} +1 -1
  227. package/dist/ui/assets/{parser3-DIR98Q6n.js → parser3-zEfzT5wv.js} +1 -1
  228. package/dist/ui/assets/{pegDiagram-2B236MQR-BrXp_1_9.js → pegDiagram-2B236MQR-Dd4rIztM.js} +1 -1
  229. package/dist/ui/assets/{perl-16cY7fyu.js → perl-CsS1Gs6o.js} +1 -1
  230. package/dist/ui/assets/{pf-KrAq2BW7.js → pf-BNH1jO0R.js} +1 -1
  231. package/dist/ui/assets/{pgsql-BV1Z2bjp.js → pgsql-DqPigHrq.js} +1 -1
  232. package/dist/ui/assets/{php-FGjYSZqs.js → php-CdOl9bRs.js} +1 -1
  233. package/dist/ui/assets/{php-template-B1OW86WT.js → php-template-DPfirJg2.js} +1 -1
  234. package/dist/ui/assets/{pieDiagram-ENE6RG2P-Bh0bhWSa.js → pieDiagram-ENE6RG2P-DGaJNf4S.js} +1 -1
  235. package/dist/ui/assets/{plaintext-Cvn_UgSv.js → plaintext-EHbgBKzw.js} +1 -1
  236. package/dist/ui/assets/{pony-CRWnA3MR.js → pony-DmJajtp2.js} +1 -1
  237. package/dist/ui/assets/{powershell-Cwn155MZ.js → powershell-DfGzdWR6.js} +1 -1
  238. package/dist/ui/assets/{processing-BS6-1lrQ.js → processing-BT0ETgPG.js} +1 -1
  239. package/dist/ui/assets/{profile-C45OLQrv.js → profile-B3I-x5Lt.js} +1 -1
  240. package/dist/ui/assets/{prolog-C5YafSzY.js → prolog-B_4QJIvI.js} +1 -1
  241. package/dist/ui/assets/{properties-BULd-Zhg.js → properties-BFVI8weS.js} +1 -1
  242. package/dist/ui/assets/{protobuf-Qf1IuG5l.js → protobuf-PaF39oZZ.js} +1 -1
  243. package/dist/ui/assets/{puppet-93XdQvnn.js → puppet-BDC6Q8VF.js} +1 -1
  244. package/dist/ui/assets/{purebasic-DlYNScQP.js → purebasic-B2ejrOZK.js} +1 -1
  245. package/dist/ui/assets/{python-D-Do6-F0.js → python-BOxtIk9H.js} +1 -1
  246. package/dist/ui/assets/{python-repl-DGutP04w.js → python-repl-BslBh_Mx.js} +1 -1
  247. package/dist/ui/assets/{q-lmgfrySy.js → q-BPe8WLGW.js} +1 -1
  248. package/dist/ui/assets/{qml-BbjX_mSU.js → qml-BazRR6fz.js} +1 -1
  249. package/dist/ui/assets/{quadrantDiagram-ABIIQ3AL-B891FOO8.js → quadrantDiagram-ABIIQ3AL-BQ7aPkHk.js} +1 -1
  250. package/dist/ui/assets/{r--x8NzO9N.js → r-C09pGNJC.js} +1 -1
  251. package/dist/ui/assets/{railroadDiagram-RFXS5EU6-R3O-GKNe.js → railroadDiagram-RFXS5EU6-sCO9VGvE.js} +1 -1
  252. package/dist/ui/assets/{reasonml-DwHsAflh.js → reasonml-S7dzwVL9.js} +1 -1
  253. package/dist/ui/assets/{requirementDiagram-TGXJPOKE-D4l_xEXt.js → requirementDiagram-TGXJPOKE-CfT5aVZg.js} +1 -1
  254. package/dist/ui/assets/{rib-DMJNtDwV.js → rib-fM2EwQd4.js} +1 -1
  255. package/dist/ui/assets/{roboconf-BNNGTvHr.js → roboconf-D7AaeyrW.js} +1 -1
  256. package/dist/ui/assets/{routeros-BF7SVruD.js → routeros-c6Q7mKuq.js} +1 -1
  257. package/dist/ui/assets/{rsl-1EHeIZqp.js → rsl-sCpEQBxh.js} +1 -1
  258. package/dist/ui/assets/{ruby-B-v_BYYp.js → ruby-lcKhz2w9.js} +1 -1
  259. package/dist/ui/assets/{ruleslanguage-GFeEMSdK.js → ruleslanguage-BW4ATOuX.js} +1 -1
  260. package/dist/ui/assets/{rust-ApqGtMhh.js → rust-BbpU-0VY.js} +1 -1
  261. package/dist/ui/assets/{sankeyDiagram-HTMAVEWB-Dc-2lhBq.js → sankeyDiagram-HTMAVEWB-CaweCpvN.js} +1 -1
  262. package/dist/ui/assets/{sas-YkxX6N9_.js → sas-BPt5R0dx.js} +1 -1
  263. package/dist/ui/assets/{scala-BpHi86GZ.js → scala-DxW_vqXs.js} +1 -1
  264. package/dist/ui/assets/{scheme-D889qY8Y.js → scheme-T2Q_jWzT.js} +1 -1
  265. package/dist/ui/assets/{scilab-C3l-bcRx.js → scilab-DMORg9lV.js} +1 -1
  266. package/dist/ui/assets/{scss-D0iGASxm.js → scss-t0VsosqT.js} +1 -1
  267. package/dist/ui/assets/{sequenceDiagram-DBY2YBRQ-DvppgciC.js → sequenceDiagram-DBY2YBRQ-o-H_R4zb.js} +1 -1
  268. package/dist/ui/assets/{shell-PUnaEPCO.js → shell-CnCDa1s9.js} +1 -1
  269. package/dist/ui/assets/{sizeCapture-X5ZJPWSS-DhvIbxXs.js → sizeCapture-X5ZJPWSS-BNLkHGDS.js} +1 -1
  270. package/dist/ui/assets/{smali-Du_dF9hl.js → smali-_n-BxJyG.js} +1 -1
  271. package/dist/ui/assets/{smalltalk-CSr2Gc1v.js → smalltalk-B90PXJwK.js} +1 -1
  272. package/dist/ui/assets/{sml-D3zkvzP2.js → sml-fuY7bj-n.js} +1 -1
  273. package/dist/ui/assets/{sqf-BZQ34qEZ.js → sqf-COpwkyuo.js} +1 -1
  274. package/dist/ui/assets/{sql-BFKScMsf.js → sql-CXIT0j-x.js} +1 -1
  275. package/dist/ui/assets/{sql_more-C2Lc_Qqq.js → sql_more-C1Oxq4rx.js} +1 -1
  276. package/dist/ui/assets/{stan-CzY8VdxU.js → stan-BZEpaHeC.js} +1 -1
  277. package/dist/ui/assets/{stata-9GxyhPpV.js → stata-CkBwaiZM.js} +1 -1
  278. package/dist/ui/assets/{stateDiagram-2N3HPSRC-CM63y6f0.js → stateDiagram-2N3HPSRC-BkdnNF7I.js} +1 -1
  279. package/dist/ui/assets/stateDiagram-v2-6OUMAXLB-0JnZ1VSQ.js +1 -0
  280. package/dist/ui/assets/{step21-BpK_Zw3v.js → step21-fs9N_U3O.js} +1 -1
  281. package/dist/ui/assets/{stylus-DQ4k28M4.js → stylus-Bs_9cvKZ.js} +1 -1
  282. package/dist/ui/assets/{subunit-C6ciOPNF.js → subunit-DvgcOCqJ.js} +1 -1
  283. package/dist/ui/assets/{swift-CJfqqSbT.js → swift-BE4ONsur.js} +1 -1
  284. package/dist/ui/assets/{swimlanes-5IMT3BWC-DS6_HNF7.js → swimlanes-5IMT3BWC-uqTAc7o7.js} +2 -2
  285. package/dist/ui/assets/swimlanesDiagram-G3AALYLV-DQRIIEmi.js +8 -0
  286. package/dist/ui/assets/{taggerscript-VouMmJ_v.js → taggerscript-BhmPJ64C.js} +1 -1
  287. package/dist/ui/assets/{tap-wXCy18ot.js → tap-DkueIVKV.js} +1 -1
  288. package/dist/ui/assets/{tcl-ewDOmCFX.js → tcl-DyXOOkFi.js} +1 -1
  289. package/dist/ui/assets/{thrift-BfFA03rE.js → thrift-Dhgbk56T.js} +1 -1
  290. package/dist/ui/assets/{timeline-definition-FHXFAJF6-Dz2m6S6x.js → timeline-definition-FHXFAJF6-DBAk9Ouc.js} +1 -1
  291. package/dist/ui/assets/{tp-HGBcpNf9.js → tp-BsXyrRGH.js} +1 -1
  292. package/dist/ui/assets/{twig-nrQZ0pw8.js → twig-J0HqIuHw.js} +1 -1
  293. package/dist/ui/assets/{typescript-B7tNYFEQ.js → typescript-Dkwvul39.js} +1 -1
  294. package/dist/ui/assets/{vala-BIjQtoo6.js → vala-CRGnf8aY.js} +1 -1
  295. package/dist/ui/assets/{vbnet-Bbspccm6.js → vbnet-BtJAUe3z.js} +1 -1
  296. package/dist/ui/assets/{vbscript-C45_QgOy.js → vbscript-RgFFNuM3.js} +1 -1
  297. package/dist/ui/assets/{vbscript-html-DlF2QBc7.js → vbscript-html-DO32Io9Y.js} +1 -1
  298. package/dist/ui/assets/{vennDiagram-L72KCM5P-BPEphYtX.js → vennDiagram-L72KCM5P-BJi6y0hh.js} +1 -1
  299. package/dist/ui/assets/{verilog-BSitd8W0.js → verilog-C4h6MLcI.js} +1 -1
  300. package/dist/ui/assets/{vhdl-C1bbeiC4.js → vhdl-DOafePyU.js} +1 -1
  301. package/dist/ui/assets/{vim-DchwbT8X.js → vim-BAdTA9TY.js} +1 -1
  302. package/dist/ui/assets/{wardleyDiagram-EHGQE667-BttTCoBT.js → wardleyDiagram-EHGQE667-C7c_4IJ6.js} +1 -1
  303. package/dist/ui/assets/{x86asm-vARxMUvn.js → x86asm-BCL6__QH.js} +1 -1
  304. package/dist/ui/assets/{xl-dx63vvXo.js → xl-qIzE4HOe.js} +1 -1
  305. package/dist/ui/assets/{xml-BUnj27wL.js → xml-DE2sJXYU.js} +1 -1
  306. package/dist/ui/assets/{xquery-T7gpnf0e.js → xquery-CQ35t92y.js} +1 -1
  307. package/dist/ui/assets/{xychartDiagram-FW5EYKEG-BfrNhdrG.js → xychartDiagram-FW5EYKEG-D2ILn0jL.js} +1 -1
  308. package/dist/ui/assets/{yaml-xRgQKzeL.js → yaml-5KaAvG5C.js} +1 -1
  309. package/dist/ui/assets/{zephir-Yu6l5qJj.js → zephir-CbR3Ryfq.js} +1 -1
  310. package/dist/ui/index.html +2 -2
  311. package/dist/utils/__tests__/abort-signals.test.js +67 -0
  312. package/dist/utils/__tests__/inject-loop.test.js +1 -53
  313. package/dist/utils/__tests__/learn-tasks-db.test.js +82 -0
  314. package/dist/utils/__tests__/openai-converter.test.js +25 -0
  315. package/dist/utils/__tests__/pi-crawl-tools.test.js +15 -4
  316. package/dist/utils/__tests__/pi-dedup-reconcile.test.js +11 -9
  317. package/dist/utils/__tests__/pi-events.test.js +172 -0
  318. package/dist/utils/__tests__/pi-learn-orchestrator.test.js +216 -6
  319. package/dist/utils/__tests__/pi-runtime-json.test.js +38 -3
  320. package/dist/utils/__tests__/providers-db.test.js +40 -2
  321. package/dist/utils/__tests__/request-writer.test.js +271 -39
  322. package/dist/utils/__tests__/sse-protocol.test.d.ts +1 -0
  323. package/dist/utils/__tests__/sse-protocol.test.js +115 -0
  324. package/dist/utils/__tests__/vault.test.d.ts +1 -0
  325. package/dist/utils/__tests__/{knowledge-store.test.js → vault.test.js} +16 -16
  326. package/dist/utils/abort-signals.d.ts +13 -0
  327. package/dist/utils/abort-signals.js +33 -0
  328. package/dist/utils/db.d.ts +2 -0
  329. package/dist/utils/db.js +42 -0
  330. package/dist/utils/esm-dirname.d.ts +0 -15
  331. package/dist/utils/esm-dirname.js +0 -4
  332. package/dist/utils/inject-loop.d.ts +0 -27
  333. package/dist/utils/inject-loop.js +2 -56
  334. package/dist/utils/learn-tasks-db.d.ts +15 -0
  335. package/dist/utils/learn-tasks-db.js +35 -0
  336. package/dist/utils/openai-converter.js +88 -78
  337. package/dist/utils/pi-browser-tools.d.ts +0 -2
  338. package/dist/utils/pi-browser-tools.js +0 -174
  339. package/dist/utils/pi-crawl-tools.d.ts +2 -1
  340. package/dist/utils/pi-crawl-tools.js +16 -11
  341. package/dist/utils/pi-dedup.d.ts +8 -30
  342. package/dist/utils/pi-dedup.js +32 -67
  343. package/dist/utils/pi-events.d.ts +65 -0
  344. package/dist/utils/pi-events.js +98 -0
  345. package/dist/utils/pi-learn-orchestrator.d.ts +6 -5
  346. package/dist/utils/pi-learn-orchestrator.js +71 -106
  347. package/dist/utils/pi-runtime.d.ts +5 -6
  348. package/dist/utils/pi-runtime.js +38 -42
  349. package/dist/utils/pi-sandbox-ops.d.ts +0 -36
  350. package/dist/utils/pi-sandbox-ops.js +5 -190
  351. package/dist/utils/providers-db.d.ts +3 -0
  352. package/dist/utils/providers-db.js +21 -7
  353. package/dist/utils/request-writer.d.ts +60 -30
  354. package/dist/utils/request-writer.js +182 -61
  355. package/dist/utils/sse-protocol.d.ts +34 -0
  356. package/dist/utils/sse-protocol.js +121 -0
  357. package/dist/utils/sse-stream-processor.d.ts +4 -9
  358. package/dist/utils/sse-stream-processor.js +13 -104
  359. package/dist/utils/sse-writer.d.ts +1 -1
  360. package/dist/utils/sse-writer.js +3 -2
  361. package/dist/utils/stats-aggregator.js +3 -0
  362. package/dist/utils/tool-injector.js +7 -0
  363. package/dist/utils/vault.d.ts +111 -0
  364. package/dist/utils/vault.js +434 -0
  365. package/package.json +1 -1
  366. package/dist/docs/assets/chunks/@localSearchIndexroot.BN6hB8Jr.js +0 -1
  367. package/dist/types/api.d.ts +0 -20
  368. package/dist/types/index.d.ts +0 -4
  369. package/dist/types/index.js +0 -4
  370. package/dist/types/log.d.ts +0 -13
  371. package/dist/ui/assets/channel-BgAIihW-.js +0 -1
  372. package/dist/ui/assets/classDiagram-OUVF2IWQ-0fsnUoNI.js +0 -1
  373. package/dist/ui/assets/classDiagram-v2-EOCWNBFH-0fsnUoNI.js +0 -1
  374. package/dist/ui/assets/index-C0fxlU9d.css +0 -10
  375. package/dist/ui/assets/stateDiagram-v2-6OUMAXLB-OA9dcuA9.js +0 -1
  376. package/dist/ui/assets/swimlanesDiagram-G3AALYLV-BLEnJU_R.js +0 -8
  377. package/dist/utils/__tests__/sse-accumulator.test.js +0 -83
  378. package/dist/utils/knowledge-store.d.ts +0 -44
  379. package/dist/utils/knowledge-store.js +0 -193
  380. package/dist/utils/migrate-files-to-db.d.ts +0 -1
  381. package/dist/utils/migrate-files-to-db.js +0 -138
  382. package/dist/utils/sse-accumulator.d.ts +0 -9
  383. package/dist/utils/sse-accumulator.js +0 -59
  384. /package/dist/docs/assets/{proxy-cli_data-hooks.md.w9Oe1OD3.lean.js → proxy-cli_data-hooks.md.Bz8CVbxO.lean.js} +0 -0
  385. /package/dist/docs/assets/{proxy-core_ui-routes.md.Dyqkeoiv.lean.js → proxy-core_ui-routes.md.B21t1p7R.lean.js} +0 -0
  386. /package/dist/{types/api.js → utils/__tests__/abort-signals.test.d.ts} +0 -0
  387. /package/dist/{types/log.js → utils/__tests__/learn-tasks-db.test.d.ts} +0 -0
  388. /package/dist/utils/__tests__/{knowledge-store.test.d.ts → openai-converter.test.d.ts} +0 -0
  389. /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,11 +2,13 @@ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
2
2
  import { ListToolsRequestSchema } from '@modelcontextprotocol/sdk/types.js';
3
3
  import { getProjectVersion } from '../utils/version.js';
4
4
  import { MCP_TOOLS, registerMcpTools } from './tools.js';
5
- const MCP_INSTRUCTIONS = `This server provides a hybrid knowledge base plus cc-monitoring proxy observability tools.
5
+ const MCP_INSTRUCTIONS = `This server provides a project knowledge base and cc-monitoring proxy observability tools.
6
6
 
7
- BEFORE answering domain/project-specific questions, proactively search the knowledge base: call \`list_topics\` to discover topics, then \`get_topic\` to inspect chunks, then \`read_chunk\` to read chunk bodies (one chunk per call). If the topic is unknown, use \`search_chunks\` first. Do not wait for the user to explicitly ask.
7
+ KNOWLEDGE BASE: it is the authoritative source for this project, and your own knowledge may be outdated. Before answering any question that could relate to the project or its domain, call \`query_knowledge\` with the key terms — it searches and returns matching chunk bodies in one call. Do not rely on your own knowledge first, and do not wait for the user to explicitly ask. Skip this only for purely general questions (language syntax, standard algorithms, chitchat) with no plausible connection to a project topic.
8
8
 
9
- Observability tools (\`get_status\`, \`list_requests\`, \`get_token_stats\`, \`get_logs\`) are for inspecting the proxy itself: request history, token usage, log tail. Use them only when the user asks about the proxy/monitoring state.`;
9
+ If query_knowledge returns nothing or the result is insufficient, browse with \`list_topics\` → \`get_topic\` → \`read_chunk\` (one chunk per call). Do not call \`list_topics\` again when its result is already present in this conversation.
10
+
11
+ OBSERVABILITY tools (\`get_status\`, \`list_requests\`, \`get_token_stats\`, \`get_logs\`) inspect the proxy itself — request history, token usage, logs. Use them only when the user asks about the proxy or monitoring state.`;
10
12
  export function createMcpServer(config) {
11
13
  const server = new Server({ name: 'cc-monitoring', version: getProjectVersion() }, {
12
14
  capabilities: { tools: {} },
@@ -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
  }
@@ -135,9 +134,22 @@ export const MCP_TOOLS = [
135
134
  additionalProperties: false,
136
135
  },
137
136
  },
137
+ {
138
+ name: 'query_knowledge',
139
+ description: 'Search the knowledge base and return matching chunk bodies in one call. This is the primary tool for answering project/domain questions.',
140
+ inputSchema: {
141
+ type: 'object',
142
+ properties: {
143
+ query: { type: 'string', description: 'Search keywords' },
144
+ limit: { type: 'number', description: 'Max chunks to return (default 3, max 5).' },
145
+ },
146
+ required: ['query'],
147
+ additionalProperties: false,
148
+ },
149
+ },
138
150
  {
139
151
  name: 'list_topics',
140
- description: 'List all knowledge topics with one-line summary. Call this first to discover what topics exist.',
152
+ description: 'List all knowledge topics with one-line summary. Use this to browse topics when keyword search does not answer the question.',
141
153
  inputSchema: { type: 'object', properties: {}, additionalProperties: false },
142
154
  },
143
155
  {
@@ -152,7 +164,7 @@ export const MCP_TOOLS = [
152
164
  },
153
165
  {
154
166
  name: 'search_chunks',
155
- description: 'Keyword search across all chunks. Returns matching chunk list (no body). Use when topic is unknown.',
167
+ description: 'Keyword search across all chunks, returning a matching chunk list without bodies. Prefer query_knowledge, which returns bodies directly; use this only when you need chunk lists without bodies.',
156
168
  inputSchema: {
157
169
  type: 'object',
158
170
  properties: { query: { type: 'string', description: 'Search keyword' } },
@@ -179,10 +191,10 @@ const HANDLERS = {
179
191
  list_requests: handleListRequests,
180
192
  get_token_stats: handleGetTokenStats,
181
193
  get_logs: handleGetLogs,
182
- list_topics: async () => ok(JSON.stringify(await knowledgeStore.listTopics(), null, 2)),
194
+ list_topics: async () => ok(JSON.stringify(await vault.listTopics(), null, 2)),
183
195
  get_topic: async (args) => {
184
196
  try {
185
- return ok(JSON.stringify(await knowledgeStore.getTopic(args.topic), null, 2));
197
+ return ok(JSON.stringify(await vault.getTopic(args.topic), null, 2));
186
198
  }
187
199
  catch (e) {
188
200
  const msg = e instanceof Error ? e.message : String(e);
@@ -192,10 +204,19 @@ const HANDLERS = {
192
204
  return err(e);
193
205
  }
194
206
  },
195
- search_chunks: async (args) => ok(JSON.stringify(await knowledgeStore.searchChunks(args.query ?? ''), null, 2)),
207
+ query_knowledge: async (args) => {
208
+ const hits = await vault.queryKnowledge(args.query ?? '', args.limit);
209
+ if (hits.length === 0) {
210
+ return ok('No knowledge chunks matched. Call list_topics to browse available topics, or refine your query.');
211
+ }
212
+ return ok(JSON.stringify({
213
+ hits: hits.map(h => ({ topic: h.topic, chunkId: h.chunkId, title: h.title, body: h.body })),
214
+ }, null, 2));
215
+ },
216
+ search_chunks: async (args) => ok(JSON.stringify(await vault.searchChunks(args.query ?? ''), null, 2)),
196
217
  read_chunk: async (args) => {
197
218
  try {
198
- const body = await knowledgeStore.readChunk(args.topic, args.chunk_id);
219
+ const body = await vault.readChunk(args.topic, args.chunk_id);
199
220
  return ok(body);
200
221
  }
201
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,28 +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
- baseUrl: resolved.baseUrl
107
- }, 'pending');
93
+ await rec.pending();
108
94
  // Mock interception (PoC)
109
95
  if (shouldMock(request.body)) {
110
96
  reply.hijack();
@@ -125,14 +111,11 @@ export async function setupChatRoute(fastify, proxyConfig) {
125
111
  method: 'POST',
126
112
  headers: forwardHeaders,
127
113
  body: JSON.stringify(request.body),
128
- signal: AbortSignal.timeout(300000)
114
+ signal: createTimeoutSignal(300000, clientSignal)
129
115
  });
130
116
  request.log.info(`[chat] response status: ${response.status}`);
131
117
  // Extract cloud request ID
132
118
  const cloudRequestId = response.headers.get('x-request-id') || request.id;
133
- requestData.requestId = cloudRequestId;
134
- requestData.response.statusCode = response.status;
135
- requestData.response.headers = Object.fromEntries(response.headers);
136
119
  // Check response type
137
120
  const contentType = response.headers.get('content-type') || '';
138
121
  const isSSE = contentType.includes('text/event-stream');
@@ -143,10 +126,10 @@ export async function setupChatRoute(fastify, proxyConfig) {
143
126
  let jsonBody;
144
127
  try {
145
128
  jsonBody = JSON.parse(responseBody);
146
- requestData.response.events.push(jsonBody);
129
+ rec.appendEvent(jsonBody);
147
130
  }
148
131
  catch {
149
- requestData.response.events.push({ raw: responseBody });
132
+ rec.appendEvent({ raw: responseBody });
150
133
  }
151
134
  // JSON inject loop: if MCP tools injected and response has tool_use
152
135
  if (injected && jsonBody && jsonBody.stop_reason === 'tool_use') {
@@ -162,7 +145,7 @@ export async function setupChatRoute(fastify, proxyConfig) {
162
145
  method: 'POST',
163
146
  headers: forwardHeaders,
164
147
  body: JSON.stringify(b),
165
- signal: AbortSignal.timeout(300000)
148
+ signal: createTimeoutSignal(300000, clientSignal)
166
149
  });
167
150
  const loopResponseBody = await r.text();
168
151
  let loopJson;
@@ -171,98 +154,42 @@ export async function setupChatRoute(fastify, proxyConfig) {
171
154
  }
172
155
  catch { /* ignore */ }
173
156
  // Record each loop iteration as a separate request
174
- if (loopJson) {
175
- const loopRequestId = r.headers.get('x-request-id') || `loop_${request.id}_${Date.now()}`;
176
- const loopData = {
177
- requestId: loopRequestId,
178
- sessionId,
179
- timestamp: new Date().toISOString(),
180
- apiKey,
181
- proxyApiKey,
182
- baseUrl: resolved.baseUrl,
183
- model: forwardedModel,
184
- machineId,
185
- request: { method: 'POST', path: '/api/chat', headers: forwardHeaders, body: b },
186
- response: {
187
- statusCode: r.status,
188
- headers: Object.fromEntries(r.headers),
189
- events: [loopJson],
190
- completedAt: new Date().toISOString()
191
- }
192
- };
193
- await saveRequestDB(sessionId, loopRequestId, loopData);
194
- const loopUsage = extractTokenUsage(loopData.response.events);
195
- pushNewRequest({
196
- requestId: loopRequestId,
197
- sessionId,
198
- compositeId: `${sessionId}:${loopRequestId}`,
199
- method: 'POST',
200
- path: '/api/chat',
201
- 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: {
202
168
  statusCode: r.status,
203
- responseTime: 0,
204
- model: forwardedModel,
205
- machineId,
206
- baseUrl: resolved.baseUrl,
207
- usage: loopUsage
208
- }, 'completed');
209
- }
169
+ headers: Object.fromEntries(r.headers),
170
+ events: loopJson ? [loopJson] : []
171
+ }
172
+ });
210
173
  return loopJson || JSON.parse(loopResponseBody);
211
174
  }
212
175
  });
213
176
  request.log.info(`[chat] json loop done: ${loopResult.iterations} iter (${cloudRequestId})`);
214
- requestData.response.completedAt = new Date().toISOString();
215
- // Remove pending row if cloudRequestId differs from request.id
216
- if (cloudRequestId !== request.id) {
217
- const db = getDatabase();
218
- db.prepare('DELETE FROM requests WHERE request_id = ? AND session_id = ?').run(request.id, sessionId);
219
- }
220
- await saveRequestDB(sessionId, cloudRequestId, requestData);
221
- const usage = extractTokenUsage(requestData.response.events);
222
- pushNewRequest({
223
- requestId: cloudRequestId,
224
- sessionId,
225
- compositeId: `${sessionId}:${cloudRequestId}`,
226
- method: request.method,
227
- path: request.url,
228
- timestamp: requestData.timestamp,
177
+ await rec.complete({
178
+ cloudRequestId: cloudRequestId !== request.id ? cloudRequestId : undefined,
229
179
  statusCode: response.status,
230
- responseTime: Date.now() - startTime,
231
- model: forwardedModel,
232
- machineId,
233
- baseUrl: resolved.baseUrl,
234
- usage,
235
- pendingId: cloudRequestId !== request.id ? `${sessionId}:${request.id}` : undefined
236
- }, 'completed');
180
+ headers: Object.fromEntries(response.headers)
181
+ });
237
182
  const finalBody = { ...loopResult.finalBody, _sessionId: sessionId };
238
183
  reply.code(200).header('x-chat-session-id', sessionId).send(JSON.stringify(finalBody));
239
184
  return;
240
185
  }
241
186
  }
242
187
  // Normal JSON passthrough
243
- requestData.response.completedAt = new Date().toISOString();
244
- // Remove pending row if cloudRequestId differs from request.id
245
- if (cloudRequestId !== request.id) {
246
- const db = getDatabase();
247
- db.prepare('DELETE FROM requests WHERE request_id = ? AND session_id = ?').run(request.id, sessionId);
248
- }
249
- await saveRequestDB(sessionId, cloudRequestId, requestData);
250
- const usage = extractTokenUsage(requestData.response.events);
251
- pushNewRequest({
252
- requestId: cloudRequestId,
253
- sessionId,
254
- compositeId: `${sessionId}:${cloudRequestId}`,
255
- method: request.method,
256
- path: request.url,
257
- timestamp: requestData.timestamp,
188
+ await rec.complete({
189
+ cloudRequestId: cloudRequestId !== request.id ? cloudRequestId : undefined,
258
190
  statusCode: response.status,
259
- responseTime: Date.now() - startTime,
260
- model: forwardedModel,
261
- machineId,
262
- baseUrl: resolved.baseUrl,
263
- usage,
264
- pendingId: cloudRequestId !== request.id ? `${sessionId}:${request.id}` : undefined
265
- }, 'completed');
191
+ headers: Object.fromEntries(response.headers)
192
+ });
266
193
  // Inject session ID into response for passthrough
267
194
  try {
268
195
  const passthroughBody = JSON.parse(responseBody);
@@ -290,31 +217,13 @@ export async function setupChatRoute(fastify, proxyConfig) {
290
217
  });
291
218
  nodeStream.on('end', async () => {
292
219
  processor.flushLeftover();
293
- // 保存原始请求到 DB
294
- requestData.response.events = processor.events;
295
- requestData.response.completedAt = new Date().toISOString();
296
- // Remove pending row if cloudRequestId differs from request.id
297
- if (cloudRequestId !== request.id) {
298
- const db = getDatabase();
299
- db.prepare('DELETE FROM requests WHERE request_id = ? AND session_id = ?').run(request.id, sessionId);
300
- }
301
- await saveRequestDB(sessionId, cloudRequestId, requestData);
302
- const usage = extractTokenUsage(requestData.response.events);
303
- pushNewRequest({
304
- requestId: cloudRequestId,
305
- sessionId,
306
- compositeId: `${sessionId}:${cloudRequestId}`,
307
- method: request.method,
308
- path: request.url,
309
- 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,
310
224
  statusCode: response.status,
311
- responseTime: Date.now() - startTime,
312
- model: forwardedModel,
313
- machineId,
314
- baseUrl: resolved.baseUrl,
315
- usage,
316
- pendingId: cloudRequestId !== request.id ? `${sessionId}:${request.id}` : undefined
317
- }, 'completed');
225
+ headers: Object.fromEntries(response.headers)
226
+ });
318
227
  request.log.info(`[chat] stream completed: ${cloudRequestId} ${response.status} (${Date.now() - startTime}ms, ${processor.events.length} events)`);
319
228
  // 检测注入的 MCP tool_use → 发 proxy_status 信号 + 跑 streaming inject loop
320
229
  if (processor.hasInjectedToolUse()) {
@@ -330,7 +239,7 @@ export async function setupChatRoute(fastify, proxyConfig) {
330
239
  method: 'POST',
331
240
  headers: forwardHeaders,
332
241
  body: JSON.stringify(b),
333
- signal: AbortSignal.timeout(300000)
242
+ signal: createTimeoutSignal(300000, clientSignal)
334
243
  });
335
244
  const loopRequestId = r.headers.get('x-request-id') || `loop_${request.id}_${Date.now()}`;
336
245
  return { response: r, requestId: loopRequestId };
@@ -353,9 +262,9 @@ export async function setupChatRoute(fastify, proxyConfig) {
353
262
  },
354
263
  sessionId,
355
264
  saveIterationDB: async (loopRequestId, loopProcessor, loopStatusCode, loopBody) => {
356
- const loopData = {
357
- requestId: loopRequestId,
265
+ await recordIteration({
358
266
  sessionId,
267
+ localRequestId: loopRequestId,
359
268
  timestamp: new Date().toISOString(),
360
269
  apiKey,
361
270
  proxyApiKey,
@@ -365,26 +274,9 @@ export async function setupChatRoute(fastify, proxyConfig) {
365
274
  request: { method: 'POST', path: '/api/chat', headers: forwardHeaders, body: loopBody },
366
275
  response: {
367
276
  statusCode: loopStatusCode,
368
- events: loopProcessor.events,
369
- completedAt: new Date().toISOString()
277
+ events: loopProcessor.events
370
278
  }
371
- };
372
- await saveRequestDB(sessionId, loopRequestId, loopData);
373
- const loopUsage = extractTokenUsage(loopProcessor.events);
374
- pushNewRequest({
375
- requestId: loopRequestId,
376
- sessionId,
377
- compositeId: `${sessionId}:${loopRequestId}`,
378
- method: 'POST',
379
- path: '/api/chat',
380
- timestamp: loopData.timestamp,
381
- statusCode: loopStatusCode,
382
- responseTime: 0,
383
- model: forwardedModel,
384
- machineId,
385
- baseUrl: resolved.baseUrl,
386
- usage: loopUsage
387
- }, 'completed');
279
+ });
388
280
  },
389
281
  raw: reply.raw
390
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) {