@cc-monitoring/proxy-core 0.2.0 → 0.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (302) hide show
  1. package/dist/docs/404.html +1 -1
  2. package/dist/docs/assets/{app.DD-BoCdK.js → app.Ds2Uxv4L.js} +1 -1
  3. package/dist/docs/assets/chunks/@localSearchIndexroot.BwFhuAyr.js +1 -0
  4. package/dist/docs/assets/chunks/{VPLocalSearchBox.q7jFlGS4.js → VPLocalSearchBox.D7iOFhKw.js} +1 -1
  5. package/dist/docs/assets/chunks/{theme.BPPiYYJS.js → theme.BkZlTt1N.js} +2 -2
  6. package/dist/docs/index.html +2 -2
  7. package/dist/docs/overview.html +2 -2
  8. package/dist/docs/packages-utils.html +2 -2
  9. package/dist/docs/proxy-admin/env-and-build.html +2 -2
  10. package/dist/docs/proxy-admin/index.html +2 -2
  11. package/dist/docs/proxy-admin/layout-and-menu.html +2 -2
  12. package/dist/docs/proxy-admin/pages.html +2 -2
  13. package/dist/docs/proxy-admin/routing-and-auth.html +2 -2
  14. package/dist/docs/proxy-admin/services-and-mock.html +2 -2
  15. package/dist/docs/proxy-cli/api-layer.html +2 -2
  16. package/dist/docs/proxy-cli/app-shell.html +2 -2
  17. package/dist/docs/proxy-cli/components-common.html +2 -2
  18. package/dist/docs/proxy-cli/components-config.html +2 -2
  19. package/dist/docs/proxy-cli/components-requests.html +2 -2
  20. package/dist/docs/proxy-cli/components-stats.html +2 -2
  21. package/dist/docs/proxy-cli/components-status.html +2 -2
  22. package/dist/docs/proxy-cli/data-hooks.html +2 -2
  23. package/dist/docs/proxy-cli/index.html +2 -2
  24. package/dist/docs/proxy-cli/utils-and-i18n.html +2 -2
  25. package/dist/docs/proxy-core/chat-api.html +2 -2
  26. package/dist/docs/proxy-core/cli.html +2 -2
  27. package/dist/docs/proxy-core/config.html +2 -2
  28. package/dist/docs/proxy-core/data-layer.html +2 -2
  29. package/dist/docs/proxy-core/entry.html +2 -2
  30. package/dist/docs/proxy-core/index.html +2 -2
  31. package/dist/docs/proxy-core/pm2.html +2 -2
  32. package/dist/docs/proxy-core/providers.html +2 -2
  33. package/dist/docs/proxy-core/proxy.html +2 -2
  34. package/dist/docs/proxy-core/stats.html +2 -2
  35. package/dist/docs/proxy-core/tool.html +2 -2
  36. package/dist/docs/proxy-core/ui-routes.html +2 -2
  37. package/dist/docs/proxy-core/utilities.html +2 -2
  38. package/dist/docs/quickstart.html +2 -2
  39. package/dist/docs/request-flow.html +2 -2
  40. package/dist/mcp-server/index.js +9 -1
  41. package/dist/server/docs-route.js +2 -50
  42. package/dist/server/ui-route.js +18 -1
  43. package/dist/ui/assets/{1c-CK-kMhtR.js → 1c-C7KZRvh6.js} +1 -1
  44. package/dist/ui/assets/{abnf-1lQ1Uzrr.js → abnf-rbH4BYgb.js} +1 -1
  45. package/dist/ui/assets/{abnfDiagram-VRR7QNED-BqMOdnuh.js → abnfDiagram-VRR7QNED-CsrlZpVI.js} +1 -1
  46. package/dist/ui/assets/{accesslog-BGadK9Fx.js → accesslog-wfx95i3E.js} +1 -1
  47. package/dist/ui/assets/{actionscript-4t1vDHvB.js → actionscript-BuxOQp2d.js} +1 -1
  48. package/dist/ui/assets/{ada-CTSY_kbf.js → ada-DehwW43k.js} +1 -1
  49. package/dist/ui/assets/{angelscript-BX_1_lW7.js → angelscript-7gUy6Szo.js} +1 -1
  50. package/dist/ui/assets/{apache-DeUUxSLd.js → apache-DiOm0xtk.js} +1 -1
  51. package/dist/ui/assets/{applescript-BUfqUe12.js → applescript-S2nImy_n.js} +1 -1
  52. package/dist/ui/assets/{arc-D-xOtktL.js → arc-z1ZaQVy6.js} +1 -1
  53. package/dist/ui/assets/{arcade-BlZbrfiI.js → arcade-L8f7yWXC.js} +1 -1
  54. package/dist/ui/assets/{architectureDiagram-ZJ3FMSHR-KN5x3Oxc.js → architectureDiagram-ZJ3FMSHR-DT32VHeA.js} +1 -1
  55. package/dist/ui/assets/{arduino-CmMMxhu0.js → arduino-D1nseRl0.js} +1 -1
  56. package/dist/ui/assets/{armasm-If0W0ZTH.js → armasm-DEAwmgFt.js} +1 -1
  57. package/dist/ui/assets/{asciidoc-DD6e-k3f.js → asciidoc-ChomWxo-.js} +1 -1
  58. package/dist/ui/assets/{aspectj-MxQxriHk.js → aspectj-BcME-nXH.js} +1 -1
  59. package/dist/ui/assets/{autohotkey-Ahz4SejW.js → autohotkey-Dqoy8CWy.js} +1 -1
  60. package/dist/ui/assets/{autoit-DwDj3imC.js → autoit-DUmEmEI6.js} +1 -1
  61. package/dist/ui/assets/{avrasm-97KvbVpn.js → avrasm-B4CJIKtz.js} +1 -1
  62. package/dist/ui/assets/{awk-Bo_-wZyZ.js → awk-B6lV4WP7.js} +1 -1
  63. package/dist/ui/assets/{axapta-DR_HV06c.js → axapta-waVtTHBQ.js} +1 -1
  64. package/dist/ui/assets/{bash-dxvpXEou.js → bash-ClPMFOBq.js} +1 -1
  65. package/dist/ui/assets/{basic-Dw-3a82q.js → basic-Cz7me10H.js} +1 -1
  66. package/dist/ui/assets/{blockDiagram-677ZJIJ3-CMXz5JvW.js → blockDiagram-677ZJIJ3-B27Rw2hP.js} +1 -1
  67. package/dist/ui/assets/{bnf-5ey_2QkR.js → bnf-CjGNwAqq.js} +1 -1
  68. package/dist/ui/assets/{brainfuck-CbRmZUzR.js → brainfuck-CElobNvg.js} +1 -1
  69. package/dist/ui/assets/{coq-DK5Qpymm.js → c-Nl_NBAVi.js} +1 -1
  70. package/dist/ui/assets/{c-like-D9kw6QEo.js → c-like-D2GuWIZ_.js} +1 -1
  71. package/dist/ui/assets/{c4Diagram-LMCZKHZV-DU4C988i.js → c4Diagram-LMCZKHZV-CSlrdDty.js} +1 -1
  72. package/dist/ui/assets/{cal-BXDKT54m.js → cal-BCRzq2sw.js} +1 -1
  73. package/dist/ui/assets/{capnproto-DXByvzkB.js → capnproto-B99yx9xO.js} +1 -1
  74. package/dist/ui/assets/{ceylon-CNMAc9bK.js → ceylon-U_Jt92FS.js} +1 -1
  75. package/dist/ui/assets/channel-BTNstqrR.js +1 -0
  76. package/dist/ui/assets/{chunk-2Q5K7J3B-Cm-SVU-u.js → chunk-2Q5K7J3B-BaNBaSzk.js} +1 -1
  77. package/dist/ui/assets/{chunk-32BRIVSS-oz0KK3YS.js → chunk-32BRIVSS-C0nNm0HI.js} +1 -1
  78. package/dist/ui/assets/{chunk-5VM5RSS4-CbHdtlYp.js → chunk-5VM5RSS4-jU6Zpw3b.js} +1 -1
  79. package/dist/ui/assets/{chunk-EX3LRPZG-DhhuYakR.js → chunk-EX3LRPZG-OXn_ntaE.js} +1 -1
  80. package/dist/ui/assets/{chunk-JWPE2WC7-CYkjHxPj.js → chunk-JWPE2WC7-_mz_TEbK.js} +1 -1
  81. package/dist/ui/assets/{chunk-MOJQB5TN-gO40CNAh.js → chunk-MOJQB5TN-DDc6cTc4.js} +1 -1
  82. package/dist/ui/assets/{chunk-RYQCIY6F-CKedXT_Q.js → chunk-RYQCIY6F-BQGpYEj2.js} +1 -1
  83. package/dist/ui/assets/{chunk-V7JOEXUC-C_6jfVpf.js → chunk-V7JOEXUC-DcO6-4IE.js} +1 -1
  84. package/dist/ui/assets/{chunk-VR4S4FIN-C8NVa2Dp.js → chunk-VR4S4FIN-B_TVu9q6.js} +1 -1
  85. package/dist/ui/assets/{chunk-XXDRQBXY-DCaDk-GY.js → chunk-XXDRQBXY-B6NyPvzj.js} +1 -1
  86. package/dist/ui/assets/classDiagram-OUVF2IWQ-DEEnAFj7.js +1 -0
  87. package/dist/ui/assets/classDiagram-v2-EOCWNBFH-DEEnAFj7.js +1 -0
  88. package/dist/ui/assets/{clean-Cno2Iol9.js → clean-BNABeqNs.js} +1 -1
  89. package/dist/ui/assets/{clojure-repl-BDUy3x0z.js → clojure-repl-12Je9P3M.js} +1 -1
  90. package/dist/ui/assets/{clojure-CJo86K2y.js → clojure-ycs5E59I.js} +1 -1
  91. package/dist/ui/assets/{cmake-C3lBpnMa.js → cmake-DmGk_v86.js} +1 -1
  92. package/dist/ui/assets/{coffeescript-D6Gc1Iic.js → coffeescript-B1EFylGU.js} +1 -1
  93. package/dist/ui/assets/{c-DUcxiMx7.js → coq-DHEZl785.js} +1 -1
  94. package/dist/ui/assets/{cos-C9vhICZi.js → cos-ClTPEnh8.js} +1 -1
  95. package/dist/ui/assets/{cose-bilkent-JH36ORCC-BsX7zIIX.js → cose-bilkent-JH36ORCC-CruFl-Br.js} +1 -1
  96. package/dist/ui/assets/{cpp-B2THrLw2.js → cpp-CuI3hcw2.js} +1 -1
  97. package/dist/ui/assets/{crmsh-Cidhwnbv.js → crmsh-BBCigZ9H.js} +1 -1
  98. package/dist/ui/assets/{crystal-D4UzipzS.js → crystal-WqP1T2aP.js} +1 -1
  99. package/dist/ui/assets/{csharp-sHzRBXom.js → csharp-DX3AsWFr.js} +1 -1
  100. package/dist/ui/assets/{csp-RR_2otDZ.js → csp-TwswWkBb.js} +1 -1
  101. package/dist/ui/assets/{css-CwufTY20.js → css-gwfIC6qG.js} +1 -1
  102. package/dist/ui/assets/{cynefin-VYW2F7L2-BdPPij9L.js → cynefin-VYW2F7L2-Dk2bpbUZ.js} +1 -1
  103. package/dist/ui/assets/{cynefinDiagram-TSTJHNR4-Y8HasE5a.js → cynefinDiagram-TSTJHNR4-D0cyq-BR.js} +1 -1
  104. package/dist/ui/assets/{d-DeXSSL8w.js → d-dQjHiE7p.js} +1 -1
  105. package/dist/ui/assets/{dagre-VKFMJZFB-B_nm4MgH.js → dagre-VKFMJZFB-C-LrlEPD.js} +1 -1
  106. package/dist/ui/assets/{dart-DhBp0MgA.js → dart-yF24zq-M.js} +1 -1
  107. package/dist/ui/assets/{delphi-B5k-wYBj.js → delphi-BoiD3RGE.js} +1 -1
  108. package/dist/ui/assets/{diagram-FQU43EPY-CgBlXe2t.js → diagram-FQU43EPY-BWEIklCL.js} +1 -1
  109. package/dist/ui/assets/{diagram-G47NLZAW-BebzwVx5.js → diagram-G47NLZAW-0wUTN3Un.js} +1 -1
  110. package/dist/ui/assets/{diagram-NH7WQ7WH-DzWivpuq.js → diagram-NH7WQ7WH-DBRO9o2w.js} +1 -1
  111. package/dist/ui/assets/{diagram-OA4YK3LP-Cb_lMSnX.js → diagram-OA4YK3LP-ezdq3ga2.js} +1 -1
  112. package/dist/ui/assets/{diagram-WEI45ONY-C_Y9GQ0N.js → diagram-WEI45ONY-etUIUVG6.js} +1 -1
  113. package/dist/ui/assets/{diff-COhluegM.js → diff-d3MWGLkm.js} +1 -1
  114. package/dist/ui/assets/{django-C7XlHtBx.js → django-B3WbiOe4.js} +1 -1
  115. package/dist/ui/assets/{dns-wjwUM-Uq.js → dns-NCrqim6V.js} +1 -1
  116. package/dist/ui/assets/{dockerfile-Bc-WqdkT.js → dockerfile-CJ13MF6I.js} +1 -1
  117. package/dist/ui/assets/{dos-mEp9A4Hm.js → dos-Db7mY7hS.js} +1 -1
  118. package/dist/ui/assets/{dsconfig-Dgs83FGD.js → dsconfig-CgWMXu7p.js} +1 -1
  119. package/dist/ui/assets/{dts-C3Ds2O26.js → dts-pg7x_twV.js} +1 -1
  120. package/dist/ui/assets/{dust-CyQO5OHb.js → dust-C4AV7EjX.js} +1 -1
  121. package/dist/ui/assets/{ebnf-CNogRDO4.js → ebnf-C6W2hGVW.js} +1 -1
  122. package/dist/ui/assets/{ebnfDiagram-CCIWWBDH-ZlE-AFZT.js → ebnfDiagram-CCIWWBDH-4ylTuIqX.js} +1 -1
  123. package/dist/ui/assets/{elixir-3SLljiDu.js → elixir-CVB0pKqP.js} +1 -1
  124. package/dist/ui/assets/{elm-BPBZeCUB.js → elm--paTSGXv.js} +1 -1
  125. package/dist/ui/assets/{erDiagram-Q63AITRT-CXuGvWcB.js → erDiagram-Q63AITRT-BRiGNkzo.js} +1 -1
  126. package/dist/ui/assets/{erb-DqbIyjtE.js → erb-BG7KEhq6.js} +1 -1
  127. package/dist/ui/assets/{erlang-y0z0xXo_.js → erlang-CYx4313K.js} +1 -1
  128. package/dist/ui/assets/{erlang-repl-e_6K45XY.js → erlang-repl-B1eR2_h4.js} +1 -1
  129. package/dist/ui/assets/{excel-RwNCmSYM.js → excel-Bo5gFhmE.js} +1 -1
  130. package/dist/ui/assets/{fix-DNXnlXQP.js → fix-DyCMTt3D.js} +1 -1
  131. package/dist/ui/assets/{flix-rdcWVVc-.js → flix-C3soTHxZ.js} +1 -1
  132. package/dist/ui/assets/{flowDiagram-23GEKE2U-BuKpfhyd.js → flowDiagram-23GEKE2U-DnRu-msA.js} +1 -1
  133. package/dist/ui/assets/{fortran-CjB2gctQ.js → fortran-BAZ3TbMZ.js} +1 -1
  134. package/dist/ui/assets/{fsharp-DPGDnrod.js → fsharp-CbXyiiTK.js} +1 -1
  135. package/dist/ui/assets/{gams-d97ChOge.js → gams-KyiDoPo0.js} +1 -1
  136. package/dist/ui/assets/{ganttDiagram-NO4QXBWP-CThfmoNX.js → ganttDiagram-NO4QXBWP-Dv28Wx1X.js} +1 -1
  137. package/dist/ui/assets/{gauss-Ckbq9pov.js → gauss-B30tuE0E.js} +1 -1
  138. package/dist/ui/assets/{gcode-C8rxWIBi.js → gcode-CcXQsQ65.js} +1 -1
  139. package/dist/ui/assets/{gherkin-Cb88ENJ2.js → gherkin-DASYHsIF.js} +1 -1
  140. package/dist/ui/assets/{gitGraphDiagram-IHSO6WYX-Ch4mA1xX.js → gitGraphDiagram-IHSO6WYX-BJtz0wJv.js} +1 -1
  141. package/dist/ui/assets/{glsl-D75QPnvr.js → glsl-DsT445zJ.js} +1 -1
  142. package/dist/ui/assets/{gml-BYM-XcrL.js → gml-DI6qhLW8.js} +1 -1
  143. package/dist/ui/assets/{go-C0q3a0K-.js → go-CozWfkZh.js} +1 -1
  144. package/dist/ui/assets/{golo-BN-kAS6i.js → golo-B0Q1mPx2.js} +1 -1
  145. package/dist/ui/assets/{gradle-CsmhRGnx.js → gradle-BXIM-MF0.js} +1 -1
  146. package/dist/ui/assets/{groovy-CVvlYgLe.js → groovy-B5kuMJx3.js} +1 -1
  147. package/dist/ui/assets/{haml-BZ1z9lT4.js → haml-B33XkhhN.js} +1 -1
  148. package/dist/ui/assets/{handlebars-ByoXIUsU.js → handlebars-CTKK0IeI.js} +1 -1
  149. package/dist/ui/assets/{haskell-bKtVloMo.js → haskell-QC_Q0V7u.js} +1 -1
  150. package/dist/ui/assets/{haxe-7YhuN0qz.js → haxe-yu-BgqN3.js} +1 -1
  151. package/dist/ui/assets/{hsp-Bgvcm6F3.js → hsp-B3PG_u1G.js} +1 -1
  152. package/dist/ui/assets/{htmlbars-BpuFL8Dv.js → htmlbars-D0njKLFp.js} +1 -1
  153. package/dist/ui/assets/{http-BdkFJc_6.js → http-Uyrnk7HS.js} +1 -1
  154. package/dist/ui/assets/{hy-fLVT9AqM.js → hy-BlM3DnRp.js} +1 -1
  155. package/dist/ui/assets/{index-Dsue7VlR.js → index-NRrk4g4A.js} +282 -282
  156. package/dist/ui/assets/{index-DfWIGcNl.js → index-OZSlpEc0.js} +3 -3
  157. package/dist/ui/assets/{index-DpS8gUTx.css → index-WPLwx8h5.css} +1 -1
  158. package/dist/ui/assets/{infoDiagram-FWYZ7A6U-DBgU6pXz.js → infoDiagram-FWYZ7A6U-DmQUKgjT.js} +1 -1
  159. package/dist/ui/assets/{inform7-CiZzJ9ba.js → inform7-CD6URK1q.js} +1 -1
  160. package/dist/ui/assets/{ini-Cnt_l57a.js → ini-Bbj8w5ZO.js} +1 -1
  161. package/dist/ui/assets/{irpf90-tpOLGqpx.js → irpf90-BFmWsqzg.js} +1 -1
  162. package/dist/ui/assets/{isbl-CP9CH5cc.js → isbl-CjYXfO56.js} +1 -1
  163. package/dist/ui/assets/{ishikawaDiagram-FXEZZL3T-Cq-UEF7t.js → ishikawaDiagram-FXEZZL3T-O7SLJb62.js} +1 -1
  164. package/dist/ui/assets/{java-kyhtR5gA.js → java-BZnlVMI-.js} +1 -1
  165. package/dist/ui/assets/{javascript-Dt9hxK6y.js → javascript-Dma1Dwxh.js} +1 -1
  166. package/dist/ui/assets/{jboss-cli-BJZewHIt.js → jboss-cli-CEhyxkPd.js} +1 -1
  167. package/dist/ui/assets/{journeyDiagram-5HDEW3XC-iLTD7hUv.js → journeyDiagram-5HDEW3XC-MpkkQY0B.js} +1 -1
  168. package/dist/ui/assets/{json-B784rDGN.js → json-H5mfZ7Pi.js} +1 -1
  169. package/dist/ui/assets/{julia-BBZWRf_K.js → julia-1nG6sJ0r.js} +1 -1
  170. package/dist/ui/assets/{julia-repl-ChQ_anXf.js → julia-repl-CntcEG_W.js} +1 -1
  171. package/dist/ui/assets/{kanban-definition-HUTT4EX6-DnmU4pyp.js → kanban-definition-HUTT4EX6-Db3VE7EX.js} +1 -1
  172. package/dist/ui/assets/{kotlin-Ca3cQqj9.js → kotlin-CPhttT28.js} +1 -1
  173. package/dist/ui/assets/{lasso-68xMTGCI.js → lasso-wS7HnKYr.js} +1 -1
  174. package/dist/ui/assets/{latex-BJAvHrS-.js → latex-CgljIIKP.js} +1 -1
  175. package/dist/ui/assets/{ldif-BozIkxE8.js → ldif-C-TvljGO.js} +1 -1
  176. package/dist/ui/assets/{leaf-DeAYBX7h.js → leaf-BwLmF5QE.js} +1 -1
  177. package/dist/ui/assets/{less-Bc0jcew8.js → less-F0U3RAHy.js} +1 -1
  178. package/dist/ui/assets/{lisp-ffZdTilE.js → lisp-DyC1zr7v.js} +1 -1
  179. package/dist/ui/assets/{livecodeserver-DKyXE2lg.js → livecodeserver-BiriPZPr.js} +1 -1
  180. package/dist/ui/assets/{livescript-CeVSdP5j.js → livescript-DGM8pJWq.js} +1 -1
  181. package/dist/ui/assets/{llvm-CA19rs9e.js → llvm-CtkKHWXn.js} +1 -1
  182. package/dist/ui/assets/{lsl-De1V90GL.js → lsl-Cjhhnjis.js} +1 -1
  183. package/dist/ui/assets/{lua-Ckc_sOAg.js → lua-DLOv5eaM.js} +1 -1
  184. package/dist/ui/assets/{makefile-BlkvlESW.js → makefile-B4dtBkQe.js} +1 -1
  185. package/dist/ui/assets/{markdown-BsHfdULh.js → markdown-ePkodRQ8.js} +1 -1
  186. package/dist/ui/assets/{mathematica-BdVzKfdF.js → mathematica-CQQE1ZQG.js} +1 -1
  187. package/dist/ui/assets/{matlab-BE1b3EYS.js → matlab-Cs5-JNnJ.js} +1 -1
  188. package/dist/ui/assets/{maxima-C7hoTDGn.js → maxima-QE9z-w99.js} +1 -1
  189. package/dist/ui/assets/{mel-DNZ4AX0h.js → mel-BURbyN_f.js} +1 -1
  190. package/dist/ui/assets/{mercury-DnbIrIOF.js → mercury-BitxBHU_.js} +1 -1
  191. package/dist/ui/assets/{mindmap-definition-LN4V7U3C-Df0J4YS6.js → mindmap-definition-LN4V7U3C-Bw4ydjz9.js} +1 -1
  192. package/dist/ui/assets/{mipsasm-vRzAjdOa.js → mipsasm-BlgfMbba.js} +1 -1
  193. package/dist/ui/assets/{mizar-_COCUpjs.js → mizar-GVN5xqbG.js} +1 -1
  194. package/dist/ui/assets/{mojolicious-BXSqEUhN.js → mojolicious-BIe0_SWG.js} +1 -1
  195. package/dist/ui/assets/{monkey-DdaFErmE.js → monkey-Sk3HOegY.js} +1 -1
  196. package/dist/ui/assets/{moonscript-ylkEnmhz.js → moonscript-CKzK_qTZ.js} +1 -1
  197. package/dist/ui/assets/{n1ql-CmU80AjO.js → n1ql-CvydJYtK.js} +1 -1
  198. package/dist/ui/assets/{nginx-Xq7ZP4_a.js → nginx-BtJg8II3.js} +1 -1
  199. package/dist/ui/assets/{nim-9UGxbeVX.js → nim-D8i-ABzP.js} +1 -1
  200. package/dist/ui/assets/{nix-DF4g-5JC.js → nix-B9yyBUw5.js} +1 -1
  201. package/dist/ui/assets/{node-repl-Cuy9El0l.js → node-repl-B4XEsNMv.js} +1 -1
  202. package/dist/ui/assets/{nsis-O_u_AJ8R.js → nsis-ChyN_1fJ.js} +1 -1
  203. package/dist/ui/assets/{objectivec-CGRDK5jQ.js → objectivec-DnetjEAi.js} +1 -1
  204. package/dist/ui/assets/{ocaml-CbQcAD-R.js → ocaml-BrcMYDF8.js} +1 -1
  205. package/dist/ui/assets/{openscad-DT2CMIqE.js → openscad-DsR3_5rd.js} +1 -1
  206. package/dist/ui/assets/{oxygene-B9Ei-fnj.js → oxygene-CJcqHbSp.js} +1 -1
  207. package/dist/ui/assets/{parser3-CuVObcEZ.js → parser3-rLPmuX0l.js} +1 -1
  208. package/dist/ui/assets/{pegDiagram-2B236MQR-k8i-gID4.js → pegDiagram-2B236MQR-B45-e_3g.js} +1 -1
  209. package/dist/ui/assets/{perl-dVGJ8bE1.js → perl-D1P4EjI7.js} +1 -1
  210. package/dist/ui/assets/{pf-X2PQAhR-.js → pf-Cw-eylMK.js} +1 -1
  211. package/dist/ui/assets/{pgsql-DVzCzD92.js → pgsql-CgP7PN1J.js} +1 -1
  212. package/dist/ui/assets/{php-DocTOgNe.js → php-DI1wNKqt.js} +1 -1
  213. package/dist/ui/assets/{php-template-dP8srdEx.js → php-template-B0K4ynh6.js} +1 -1
  214. package/dist/ui/assets/{pieDiagram-ENE6RG2P-C76s3Fdz.js → pieDiagram-ENE6RG2P-CNnGOE0h.js} +1 -1
  215. package/dist/ui/assets/{plaintext-vjpxtrpz.js → plaintext-BEk_4pPM.js} +1 -1
  216. package/dist/ui/assets/{pony-z-bq7AaS.js → pony-F76a7Unf.js} +1 -1
  217. package/dist/ui/assets/{powershell-DW0_Tsne.js → powershell-Drv4DLdv.js} +1 -1
  218. package/dist/ui/assets/{processing-bDmnj3oy.js → processing-CNka_lTw.js} +1 -1
  219. package/dist/ui/assets/{profile-DJ-L-V1f.js → profile-awY_Eplf.js} +1 -1
  220. package/dist/ui/assets/{prolog-InNU9tFQ.js → prolog-C5qzaqI4.js} +1 -1
  221. package/dist/ui/assets/{properties-EkF7cZTJ.js → properties-D5qt9E1z.js} +1 -1
  222. package/dist/ui/assets/{protobuf-BBRUbDYu.js → protobuf-Bi8ASQx6.js} +1 -1
  223. package/dist/ui/assets/{puppet-fnCmZBIC.js → puppet-DRmUQ-KT.js} +1 -1
  224. package/dist/ui/assets/{purebasic-CgWDuH3f.js → purebasic-CoXKqxfT.js} +1 -1
  225. package/dist/ui/assets/{python-CYT42SmK.js → python-W0cqezvd.js} +1 -1
  226. package/dist/ui/assets/{python-repl-Wc3MvYdm.js → python-repl-CxrHJNSQ.js} +1 -1
  227. package/dist/ui/assets/{q-C0agAWLY.js → q-Ckg0nbZC.js} +1 -1
  228. package/dist/ui/assets/{qml-BiFendDb.js → qml-Dxe5R2xD.js} +1 -1
  229. package/dist/ui/assets/{quadrantDiagram-ABIIQ3AL-B0fDeX13.js → quadrantDiagram-ABIIQ3AL-CNwsTWzK.js} +1 -1
  230. package/dist/ui/assets/{r-CcAL_gsb.js → r-Cz_ed3iA.js} +1 -1
  231. package/dist/ui/assets/{railroadDiagram-RFXS5EU6-DOciFfD8.js → railroadDiagram-RFXS5EU6-BNZ8bh79.js} +1 -1
  232. package/dist/ui/assets/{reasonml-DnTQ-jkN.js → reasonml-D4d-OlE3.js} +1 -1
  233. package/dist/ui/assets/{requirementDiagram-TGXJPOKE-BhpERBEw.js → requirementDiagram-TGXJPOKE-C2CgrWHx.js} +1 -1
  234. package/dist/ui/assets/{rib-DRQBJUku.js → rib-DxeIIMvO.js} +1 -1
  235. package/dist/ui/assets/{roboconf-Dt4hxDSc.js → roboconf-nIWJYVLh.js} +1 -1
  236. package/dist/ui/assets/{routeros-DrysyAvp.js → routeros-BjUh3h-m.js} +1 -1
  237. package/dist/ui/assets/{rsl-BhobC4bl.js → rsl-oNTr7uJS.js} +1 -1
  238. package/dist/ui/assets/{ruby-B0gNTjSn.js → ruby-BtH0edki.js} +1 -1
  239. package/dist/ui/assets/{ruleslanguage-BJHWtkQf.js → ruleslanguage-uj_5EYxA.js} +1 -1
  240. package/dist/ui/assets/{rust-bxFjTZl9.js → rust-DbdkZ_sq.js} +1 -1
  241. package/dist/ui/assets/{sankeyDiagram-HTMAVEWB-BJGvRvK8.js → sankeyDiagram-HTMAVEWB-16qZ8WVd.js} +1 -1
  242. package/dist/ui/assets/{sas-C1h9GlCk.js → sas-qD47QRwD.js} +1 -1
  243. package/dist/ui/assets/{scala-GaqOsYzZ.js → scala-CwuOkN9e.js} +1 -1
  244. package/dist/ui/assets/{scheme-BgOgLp78.js → scheme-DdIlarQo.js} +1 -1
  245. package/dist/ui/assets/{scilab-Dn2TX-KQ.js → scilab-Bx8vbirN.js} +1 -1
  246. package/dist/ui/assets/{scss-CCOm-PWq.js → scss-CUPdZpVN.js} +1 -1
  247. package/dist/ui/assets/{sequenceDiagram-DBY2YBRQ-69vZi4Ut.js → sequenceDiagram-DBY2YBRQ-BdEfz6xT.js} +1 -1
  248. package/dist/ui/assets/{shell-C3U6YWrg.js → shell-BajESx14.js} +1 -1
  249. package/dist/ui/assets/{sizeCapture-X5ZJPWSS-D27KIrz7.js → sizeCapture-X5ZJPWSS-aVvYdwOp.js} +1 -1
  250. package/dist/ui/assets/{smali-CvsTVdr_.js → smali-3askOdPh.js} +1 -1
  251. package/dist/ui/assets/{smalltalk-kAQkohW_.js → smalltalk-BxL_ZFXR.js} +1 -1
  252. package/dist/ui/assets/{sml-ve8o4sD9.js → sml-CdbQXx5B.js} +1 -1
  253. package/dist/ui/assets/{sqf-BEX8EUHQ.js → sqf-CofNG_K6.js} +1 -1
  254. package/dist/ui/assets/{sql-BnvvIWzM.js → sql-C41Co4Cj.js} +1 -1
  255. package/dist/ui/assets/{sql_more-BiYWeUQi.js → sql_more-XpCEwTjD.js} +1 -1
  256. package/dist/ui/assets/{stan-CL8TzbqV.js → stan-BEGVpGor.js} +1 -1
  257. package/dist/ui/assets/{stata-9Ttgn33g.js → stata-892sgSff.js} +1 -1
  258. package/dist/ui/assets/{stateDiagram-2N3HPSRC-DUQdHUod.js → stateDiagram-2N3HPSRC-DAPoOWtx.js} +1 -1
  259. package/dist/ui/assets/stateDiagram-v2-6OUMAXLB-BljEUN9T.js +1 -0
  260. package/dist/ui/assets/{step21-LuiZBROI.js → step21-2ZAu8khe.js} +1 -1
  261. package/dist/ui/assets/{stylus-DMxCDGKP.js → stylus-D814tFaD.js} +1 -1
  262. package/dist/ui/assets/{subunit-BqTiWQgg.js → subunit-DEpZ85KD.js} +1 -1
  263. package/dist/ui/assets/{swift-Vgcl7epB.js → swift-ClEw79Mw.js} +1 -1
  264. package/dist/ui/assets/{swimlanes-5IMT3BWC-BYUDE9bR.js → swimlanes-5IMT3BWC-DFGRjclX.js} +2 -2
  265. package/dist/ui/assets/swimlanesDiagram-G3AALYLV-BTfd8GBV.js +8 -0
  266. package/dist/ui/assets/{taggerscript-CQct0uSB.js → taggerscript-ukufG6Ek.js} +1 -1
  267. package/dist/ui/assets/{tap-C3D-iaMR.js → tap-CTp3nMDX.js} +1 -1
  268. package/dist/ui/assets/{tcl-pAGWRV8F.js → tcl-t5Zp339F.js} +1 -1
  269. package/dist/ui/assets/{thrift-BMf3WY_-.js → thrift-DdarrdrF.js} +1 -1
  270. package/dist/ui/assets/{timeline-definition-FHXFAJF6-CUxhbtkg.js → timeline-definition-FHXFAJF6-BS-C26Qb.js} +1 -1
  271. package/dist/ui/assets/{tp-CWlQ8HXb.js → tp-CtojFa_d.js} +1 -1
  272. package/dist/ui/assets/{twig-D49EnTd7.js → twig-BPsxcesM.js} +1 -1
  273. package/dist/ui/assets/{typescript-O1NhTsg4.js → typescript-6kEdCx2Q.js} +1 -1
  274. package/dist/ui/assets/{vala-ChgJAi6T.js → vala-D1DlBeT3.js} +1 -1
  275. package/dist/ui/assets/{vbnet-DoMTvpOU.js → vbnet-Bn6rfnXu.js} +1 -1
  276. package/dist/ui/assets/{vbscript-COqQ-XLI.js → vbscript-TF83cChH.js} +1 -1
  277. package/dist/ui/assets/{vbscript-html-C6hlND5y.js → vbscript-html-CAkjMpQ-.js} +1 -1
  278. package/dist/ui/assets/{vennDiagram-L72KCM5P-zdR45Fxo.js → vennDiagram-L72KCM5P-Bt9uXi7H.js} +1 -1
  279. package/dist/ui/assets/{verilog-D_vJtQo2.js → verilog-DloD_4TS.js} +1 -1
  280. package/dist/ui/assets/{vhdl-P1OS5AdC.js → vhdl-DCUu0H1k.js} +1 -1
  281. package/dist/ui/assets/{vim-Dta1cE1i.js → vim-C1KMXofx.js} +1 -1
  282. package/dist/ui/assets/{wardleyDiagram-EHGQE667-DGVhZURT.js → wardleyDiagram-EHGQE667-CRJZVMiO.js} +1 -1
  283. package/dist/ui/assets/{x86asm-0uxjBhIR.js → x86asm-DLhmDcw-.js} +1 -1
  284. package/dist/ui/assets/{xl-A4qrusE8.js → xl-D-Q0_1ob.js} +1 -1
  285. package/dist/ui/assets/{xml-BWIS8Du3.js → xml-DT0X-CDl.js} +1 -1
  286. package/dist/ui/assets/{xquery-DteVIK7u.js → xquery-D5QCuduM.js} +1 -1
  287. package/dist/ui/assets/{xychartDiagram-FW5EYKEG-Bi0bMVkV.js → xychartDiagram-FW5EYKEG-CLh0FXSc.js} +1 -1
  288. package/dist/ui/assets/{yaml-Sfd5lnBk.js → yaml-cRNpmbtO.js} +1 -1
  289. package/dist/ui/assets/{zephir-DN0VT2-6.js → zephir-Bgo4Omj1.js} +1 -1
  290. package/dist/ui/index.html +2 -2
  291. package/dist/utils/__tests__/knowledge-store.test.js +61 -6
  292. package/dist/utils/knowledge-store.d.ts +13 -0
  293. package/dist/utils/knowledge-store.js +86 -63
  294. package/dist/utils/pi-runtime.js +80 -11
  295. package/dist/utils/pi-sandbox-ops.js +11 -0
  296. package/package.json +1 -1
  297. package/dist/docs/assets/chunks/@localSearchIndexroot.B3GYFkD9.js +0 -1
  298. package/dist/ui/assets/channel-limbQkil.js +0 -1
  299. package/dist/ui/assets/classDiagram-OUVF2IWQ--Q3UeFsZ.js +0 -1
  300. package/dist/ui/assets/classDiagram-v2-EOCWNBFH--Q3UeFsZ.js +0 -1
  301. package/dist/ui/assets/stateDiagram-v2-6OUMAXLB-DahROKNQ.js +0 -1
  302. package/dist/ui/assets/swimlanesDiagram-G3AALYLV-B5Lf8M0k.js +0 -8
@@ -14,84 +14,107 @@ function assertChunkId(chunkId) {
14
14
  throw new Error(`invalid chunk id: ${chunkId} (expect chunk-NNN)`);
15
15
  }
16
16
  }
17
- /** 解析 "- <slug>: <摘要>" 行(自然 markdown 列表) */
18
- function parseRootIndex(text) {
19
- const out = [];
20
- const re = /^- ([a-z0-9][a-z0-9-]*):\s*(.+?)\s*$/m;
21
- for (const line of text.split('\n')) {
22
- const m = line.match(re);
23
- if (m)
24
- out.push({ slug: m[1], title: m[1], summary: m[2].trim() });
25
- }
26
- return out;
27
- }
28
- /** 解析主题 INDEX.md 的 "## 元数据" 区块:`- 名称: xxx` / `- 标签: a, b, c` */
29
- function parseTopicMeta(text) {
30
- let title = '';
31
- let tags = [];
32
- const nameRe = /^- 名称:\s*(.+?)\s*$/m;
33
- const tagsRe = /^- 标签:\s*(.+?)\s*$/m;
34
- const nameM = text.match(nameRe);
35
- if (nameM)
36
- title = nameM[1].trim();
37
- const tagsM = text.match(tagsRe);
38
- if (tagsM) {
39
- tags = tagsM[1].split(',').map(s => s.trim()).filter(Boolean);
40
- }
41
- return { title, tags };
42
- }
43
- /** 解析片段清单行 "- chunk-NNN: <标题> — <描述>" 或 "- chunk-NNN: <描述>" */
44
- function parseChunkList(text) {
45
- const out = [];
46
- const re = /^- (chunk-\d{3}):\s*(.+?)\s*$/m;
47
- for (const line of text.split('\n')) {
48
- const m = line.match(re);
49
- if (!m)
50
- continue;
51
- const rest = m[2].trim();
52
- const dashIdx = rest.indexOf(' — ');
53
- let title;
54
- let summary;
55
- if (dashIdx >= 0) {
56
- title = rest.slice(0, dashIdx).trim();
57
- summary = rest.slice(dashIdx + 3).trim();
58
- }
59
- else {
60
- title = rest;
61
- summary = rest;
62
- }
63
- out.push({ id: m[1], title, summary });
64
- }
65
- return out;
66
- }
67
17
  /** 从 chunk 正文首行 `# xxx` 提取 title(用于 searchChunks) */
68
18
  function parseChunkTitle(text) {
69
19
  const m = text.match(/^#\s+(.+?)\s*$/m);
70
20
  return m ? m[1].trim() : '';
71
21
  }
22
+ /** 读 JSON 文件,不存在或解析失败时返回 fallback */
23
+ async function readJsonOr(file, fallback) {
24
+ try {
25
+ const text = await fs.readFile(file, 'utf8');
26
+ return JSON.parse(text);
27
+ }
28
+ catch {
29
+ return fallback;
30
+ }
31
+ }
72
32
  export function createKnowledgeStore(root) {
73
33
  async function listTopics() {
74
- const indexPath = path.join(root, 'INDEX.md');
34
+ const indexPath = path.join(root, 'index.json');
35
+ const parsed = await readJsonOr(indexPath, { topics: [] });
36
+ return Array.isArray(parsed.topics) ? parsed.topics : [];
37
+ }
38
+ async function getTopic(topic) {
39
+ assertTopic(topic);
40
+ const indexPath = path.join(root, topic, 'index.json');
41
+ let meta;
75
42
  try {
76
43
  const text = await fs.readFile(indexPath, 'utf8');
77
- return parseRootIndex(text);
44
+ meta = JSON.parse(text);
78
45
  }
79
- catch {
80
- return [];
46
+ catch (e) {
47
+ if (e && e.code === 'ENOENT') {
48
+ throw new Error(`topic not found: ${topic}`);
49
+ }
50
+ throw new Error(`topic index corrupt: ${topic}, fix or delete ${topic}/index.json`);
81
51
  }
82
- }
83
- async function getTopic(topic) {
84
- assertTopic(topic);
85
- const indexPath = path.join(root, topic, 'INDEX.md');
86
- const text = await fs.readFile(indexPath, 'utf8');
87
- const meta = parseTopicMeta(text);
88
52
  return {
89
53
  title: meta.title || topic,
90
- tags: meta.tags,
54
+ tags: Array.isArray(meta.tags) ? meta.tags : [],
91
55
  sources: [],
92
- chunks: parseChunkList(text),
56
+ chunks: Array.isArray(meta.chunks) ? meta.chunks : [],
93
57
  };
94
58
  }
59
+ async function upsertTopic(input) {
60
+ assertTopic(input.slug);
61
+ const { slug, title, summary, tags } = input;
62
+ // 1. 更新根 index.json
63
+ const rootPath = path.join(root, 'index.json');
64
+ const rootIdx = await readJsonOr(rootPath, { topics: [] });
65
+ if (!Array.isArray(rootIdx.topics))
66
+ rootIdx.topics = [];
67
+ const existingRoot = rootIdx.topics.find(t => t.slug === slug);
68
+ if (existingRoot) {
69
+ existingRoot.title = title;
70
+ existingRoot.summary = summary;
71
+ existingRoot.tags = tags;
72
+ }
73
+ else {
74
+ rootIdx.topics.push({ slug, title, summary, tags });
75
+ }
76
+ await fs.writeFile(rootPath, JSON.stringify(rootIdx, null, 2), 'utf8');
77
+ // 2. 更新主题 index.json(不动 chunks 数组)
78
+ const topicDir = path.join(root, slug);
79
+ const topicPath = path.join(topicDir, 'index.json');
80
+ const topicIdx = await readJsonOr(topicPath, { slug, title, summary, tags, chunks: [] });
81
+ topicIdx.slug = slug;
82
+ topicIdx.title = title;
83
+ topicIdx.summary = summary;
84
+ topicIdx.tags = tags;
85
+ if (!Array.isArray(topicIdx.chunks))
86
+ topicIdx.chunks = [];
87
+ await fs.mkdir(topicDir, { recursive: true });
88
+ await fs.writeFile(topicPath, JSON.stringify(topicIdx, null, 2), 'utf8');
89
+ }
90
+ async function upsertChunkRef(input) {
91
+ assertTopic(input.topic);
92
+ assertChunkId(input.chunkId);
93
+ const { topic, chunkId, title, summary } = input;
94
+ const topicPath = path.join(root, topic, 'index.json');
95
+ let topicIdx;
96
+ try {
97
+ const text = await fs.readFile(topicPath, 'utf8');
98
+ topicIdx = JSON.parse(text);
99
+ }
100
+ catch (e) {
101
+ if (e && e.code === 'ENOENT') {
102
+ throw new Error(`topic not found: ${topic}, call add_topic first`);
103
+ }
104
+ throw e;
105
+ }
106
+ if (!Array.isArray(topicIdx.chunks))
107
+ topicIdx.chunks = [];
108
+ const existing = topicIdx.chunks.find(c => c.id === chunkId);
109
+ if (existing) {
110
+ existing.title = title;
111
+ existing.summary = summary;
112
+ }
113
+ else {
114
+ topicIdx.chunks.push({ id: chunkId, title, summary });
115
+ }
116
+ await fs.writeFile(topicPath, JSON.stringify(topicIdx, null, 2), 'utf8');
117
+ }
95
118
  async function searchChunks(query) {
96
119
  if (!query.trim())
97
120
  return [];
@@ -138,7 +161,7 @@ export function createKnowledgeStore(root) {
138
161
  }
139
162
  return fs.readFile(resolved, 'utf8');
140
163
  }
141
- return { listTopics, getTopic, searchChunks, readChunk };
164
+ return { listTopics, getTopic, searchChunks, readChunk, upsertTopic, upsertChunkRef };
142
165
  }
143
166
  // 默认单例:绑生产 docsDir
144
167
  export const knowledgeStore = createKnowledgeStore(docsDir);
@@ -61,13 +61,13 @@ async function getRuntime(port) {
61
61
  }
62
62
  // 默认 system prompt 兜底(system.md 不存在时使用)
63
63
  const DEFAULT_SYSTEM_PROMPT = `You are a knowledge management AI operating inside a sandbox.
64
- Your knowledge directory (~/.cc-monitoring/docs) stores structured knowledge.
64
+ Your knowledge directory (~/.cc-monitoring/docs) stores a **dictionary**: concise, distilled entries a future reader can look up. You do NOT copy source text — you digest it.
65
65
 
66
66
  STRUCTURE:
67
67
  - Each topic is a subfolder: docs/<topic-slug>/
68
- - Each topic has INDEX.md (metadata + chunk list, NO body)
69
- - Bodies live in docs/<topic-slug>/chunks/chunk-NNN.md (300-500 words each)
70
- - Root INDEX.md lists all topics with one-line summaries
68
+ - Each topic has docs/<slug>/index.json (metadata + chunk list, NO body)
69
+ - Bodies live in docs/<topic-slug>/chunks/chunk-NNN.md
70
+ - Root docs/index.json lists all topics as JSON
71
71
 
72
72
  CHAT MODE (answer questions):
73
73
  1. Call list_topics to see available topics
@@ -77,13 +77,37 @@ CHAT MODE (answer questions):
77
77
  5. Prefer answering from knowledge base chunks when relevant content exists; cite which chunks you used
78
78
  6. If no relevant chunk exists, answer from your general knowledge; if you truly don't know, say so
79
79
 
80
- LEARN MODE (distill web pages into knowledge):
80
+ LEARN MODE (distill material into a dictionary — NOT a copy of the source):
81
+ 0. First READ all input material end-to-end. Do NOT start writing chunk-by-chunk as you read. Before writing, internally outline the distinct concepts you extracted. Only then begin.
81
82
  1. Call list_topics first to check for existing similar topics — reuse, don't duplicate
82
- 2. Use browser tools to read web pages
83
- 3. Distill into 300-500 word chunks, one point per chunk
84
- 4. Write chunks to docs/<topic-slug>/chunks/chunk-NNN.md (include source URL + quote)
85
- 5. Update docs/<topic-slug>/INDEX.md chunk list + metadata
86
- 6. Update root INDEX.md topic line if new topic
83
+ 2. Use browser tools to read web pages if the input is a URL
84
+ 3. For each concept, produce a dictionary entry. An entry is a STAND-ALONE, retrievable note — the future reader has NO access to the source document. It must make sense alone.
85
+ 4. Write each chunk as markdown with this structure (write in the source document's language):
86
+
87
+ \`\`\`
88
+ # <term or concept name>
89
+
90
+ - 定义 / Definition: <one sentence, in your own words>
91
+ - 是什么 / What it is: <2-4 bullets, the core idea>
92
+ - 不是什么 / What it is NOT: <common confusions, if any>
93
+ - 关键点 / Key points: <3-6 bullets, the load-bearing facts>
94
+ - 适用场景 / When to use: <where this applies>
95
+ - 误区 / Pitfalls: <common mistakes, edge cases>
96
+ - 来源 / Source: <url>
97
+ \`\`\`
98
+
99
+ 5. RULES — these are hard constraints:
100
+ - NO large quotes. A short quote (≤2 sentences) is allowed ONLY as evidence under a bullet you already wrote in your own words.
101
+ - Every bullet must be YOU re-expressing the idea. If you find yourself copying sentences, stop and rephrase.
102
+ - One concept per chunk. Do not bundle unrelated ideas into one entry.
103
+ - If the material is thin on a concept, write what exists; do NOT invent content to fill sections. Omit empty sections.
104
+ 6. Write chunks to docs/<topic-slug>/chunks/chunk-NNN.md (number sequentially from 001)
105
+ 7. Call add_topic(slug, title, summary, tags) to register/update the topic in the index
106
+ 8. Call add_chunk(topic, chunk_id, title, summary) for each chunk you wrote
107
+ 9. Do NOT write or edit index.json files directly — use add_topic/add_chunk tools
108
+
109
+ FINISHING:
110
+ - After all chunks are written, output a plain summary: the topic created/updated, and the list of chunk titles. Do NOT ask the user what to deepen next. The learning task is complete.
87
111
  `;
88
112
  /** 从 ~/.cc-monitoring/pi/system.md 读取自定义 system prompt,不存在则用兜底文本 */
89
113
  function loadSystemPrompt() {
@@ -159,6 +183,51 @@ function buildKnowledgeTools() {
159
183
  }
160
184
  },
161
185
  },
186
+ {
187
+ name: 'add_topic',
188
+ label: 'add_topic',
189
+ description: '注册或更新一个知识主题(原子读改写 index.json)。LLM 不要直接写 index.json 文件。',
190
+ parameters: Type.Object({
191
+ slug: Type.String({ description: '主题 slug,小写连字符,如 react-hooks' }),
192
+ title: Type.String(),
193
+ summary: Type.String(),
194
+ tags: Type.Array(Type.String()),
195
+ }),
196
+ async execute(_id, params) {
197
+ try {
198
+ await knowledgeStore.upsertTopic(params);
199
+ return ok('topic added');
200
+ }
201
+ catch (e) {
202
+ return err(e);
203
+ }
204
+ },
205
+ },
206
+ {
207
+ name: 'add_chunk',
208
+ label: 'add_chunk',
209
+ description: '登记或更新一个 chunk 在主题索引中的引用(原子读改写)。写完 chunk-NNN.md 正文后调用。',
210
+ parameters: Type.Object({
211
+ topic: Type.String(),
212
+ chunk_id: Type.String({ description: '如 chunk-001' }),
213
+ title: Type.String(),
214
+ summary: Type.String(),
215
+ }),
216
+ async execute(_id, params) {
217
+ try {
218
+ await knowledgeStore.upsertChunkRef({
219
+ topic: params.topic,
220
+ chunkId: params.chunk_id,
221
+ title: params.title,
222
+ summary: params.summary,
223
+ });
224
+ return ok('chunk ref added');
225
+ }
226
+ catch (e) {
227
+ return err(e);
228
+ }
229
+ },
230
+ },
162
231
  ];
163
232
  }
164
233
  /** 按模式构建工具集(ToolDefinition 数组,用于 customTools) */
@@ -184,7 +253,7 @@ function buildToolAllowlist(mode) {
184
253
  if (mode === 'chat') {
185
254
  return base;
186
255
  }
187
- return [...base, 'write', 'edit', ...browserTools.map((t) => t.name)];
256
+ return [...base, 'add_topic', 'add_chunk', 'write', 'edit', ...browserTools.map((t) => t.name)];
188
257
  }
189
258
  export async function createPiSession(options) {
190
259
  const runtime = await getRuntime(options.port);
@@ -16,6 +16,15 @@ export function assertInside(absPath) {
16
16
  }
17
17
  return resolved;
18
18
  }
19
+ /**
20
+ * 守卫:index.json 由 add_topic/add_chunk 工具原子维护,
21
+ * 禁止 LLM 通过 write/edit 直接改写。
22
+ */
23
+ function assertNotManagedIndexJson(absPath) {
24
+ if (path.basename(absPath) === 'index.json') {
25
+ throw new Error('index.json is managed by add_topic/add_chunk tools, do not write directly');
26
+ }
27
+ }
19
28
  // 统一 access:校验可读性
20
29
  async function access(absolutePath) {
21
30
  const p = assertInside(absolutePath);
@@ -35,6 +44,7 @@ export const sandboxReadOps = {
35
44
  export const sandboxWriteOps = {
36
45
  async writeFile(absolutePath, content) {
37
46
  const p = assertInside(absolutePath);
47
+ assertNotManagedIndexJson(p);
38
48
  await fs.writeFile(p, content, 'utf8');
39
49
  },
40
50
  async mkdir(dir) {
@@ -50,6 +60,7 @@ export const sandboxEditOps = {
50
60
  },
51
61
  async writeFile(absolutePath, content) {
52
62
  const p = assertInside(absolutePath);
63
+ assertNotManagedIndexJson(p);
53
64
  await fs.writeFile(p, content, 'utf8');
54
65
  },
55
66
  access,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cc-monitoring/proxy-core",
3
- "version": "0.2.0",
3
+ "version": "0.2.2",
4
4
  "description": "Claude Code 代理工具 + Token 消耗监控面板",
5
5
  "keywords": [
6
6
  "claude-code-proxy",