@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
@@ -3,11 +3,10 @@
3
3
  // saveSource 落盘到 <slug>/sources/source-NNN.md
4
4
  // - createCrawlTools:挂给 pi session 的 4 个工具(crawl_open/crawl_visit/
5
5
  // save_source/crawl_finish),错误以文本返回,LLM 可读可恢复
6
- import fs from 'node:fs';
7
- import path from 'node:path';
8
6
  import { Type } from 'typebox';
9
7
  import { runEgoBrowser } from './pi-browser-tools.js';
10
8
  import { CRAWL_MAX_PAGES, CRAWL_MAX_DEPTH, isSameSite, normalizeCandidate } from './web-crawler.js';
9
+ import { createVault } from './vault.js';
11
10
  /** 单页浏览器脚本:task space 取 tab → goto → networkidle 缓冲 → 稳定性轮询 → 提取标题/正文/链接 */
12
11
  function buildCrawlScript(url) {
13
12
  return `const pages = await task.pages()
@@ -65,6 +64,12 @@ export class CrawlGuard {
65
64
  writable: true,
66
65
  value: void 0
67
66
  });
67
+ Object.defineProperty(this, "vault", {
68
+ enumerable: true,
69
+ configurable: true,
70
+ writable: true,
71
+ value: void 0
72
+ });
68
73
  Object.defineProperty(this, "entry", {
69
74
  enumerable: true,
70
75
  configurable: true,
@@ -108,6 +113,7 @@ export class CrawlGuard {
108
113
  writable: true,
109
114
  value: 0
110
115
  });
116
+ this.vault = createVault(opts.docsDir);
111
117
  this.maxPages = opts.maxPages ?? CRAWL_MAX_PAGES;
112
118
  this.maxDepth = opts.maxDepth ?? CRAWL_MAX_DEPTH;
113
119
  this.navigate = opts.navigate ?? ((url, signal) => this.defaultNavigate(url, signal));
@@ -208,10 +214,7 @@ export class CrawlGuard {
208
214
  // 对齐旧 crawlSite:trim 后为空的页面判失败,不产生空原料
209
215
  if (page.text.trim() === '')
210
216
  throw new Error(`save_source reject empty page: ${key}`);
211
- const sourcesDir = path.join(this.opts.docsDir, this.opts.slug, 'sources');
212
- fs.mkdirSync(sourcesDir, { recursive: true });
213
- const name = `source-${String(this._savedCount + 1).padStart(3, '0')}.md`;
214
- fs.writeFileSync(path.join(sourcesDir, name), `Source: ${key}\n\n${page.text}`, 'utf8');
217
+ this.vault.writeSourceFile(this.opts.slug, this._savedCount, key, page.text);
215
218
  this.savedUrls.add(key);
216
219
  this._savedCount += 1;
217
220
  return { savedCount: this._savedCount, reused: false };
@@ -234,16 +237,18 @@ const ok = (text) => ({
234
237
  details: undefined,
235
238
  });
236
239
  const errAsText = (e) => ok(`error: ${e instanceof Error ? e.message : String(e)}`);
237
- export function createCrawlTools(guard) {
240
+ export function createCrawlTools(guard, signal) {
241
+ // SDK 传入 tool signal 时用它(session 中止时随之中止);否则用外部 pipeline signal
242
+ const pickSignal = (toolSignal) => toolSignal ?? signal;
238
243
  return [
239
244
  {
240
245
  name: 'crawl_open',
241
246
  label: 'crawl_open',
242
247
  description: '打开本次任务的入口 URL,返回标题、正文与同站链接。抓取第一步调用。',
243
248
  parameters: Type.Object({}),
244
- async execute(_id, _params, signal) {
249
+ async execute(_id, _params, toolSignal) {
245
250
  try {
246
- return ok(JSON.stringify(await guard.open(signal)));
251
+ return ok(JSON.stringify(await guard.open(pickSignal(toolSignal))));
247
252
  }
248
253
  catch (e) {
249
254
  return errAsText(e);
@@ -255,9 +260,9 @@ export function createCrawlTools(guard) {
255
260
  label: 'crawl_visit',
256
261
  description: '访问入口同站的子页面(必须是 crawl_open/上一次 crawl_visit 返回链接中的 http(s) 页面)。',
257
262
  parameters: Type.Object({ url: Type.String({ description: '要访问的同站完整 URL' }) }),
258
- async execute(_id, params, signal) {
263
+ async execute(_id, params, toolSignal) {
259
264
  try {
260
- return ok(JSON.stringify(await guard.visit(params.url, signal)));
265
+ return ok(JSON.stringify(await guard.visit(params.url, pickSignal(toolSignal))));
261
266
  }
262
267
  catch (e) {
263
268
  return errAsText(e);
@@ -1,33 +1,9 @@
1
- export interface TopicSummary {
2
- slug: string;
3
- title: string;
4
- summary: string;
5
- tags: string[];
6
- }
7
- export declare function normalizeText(s: string): string;
1
+ import { type TopicSummary, type TopicIndex, type OutlineItem, type ChunkRef } from './vault.js';
8
2
  export declare function findCandidates(cand: {
9
3
  title: string;
10
4
  tags: string[];
11
5
  }, topics: TopicSummary[]): TopicSummary[];
12
- export interface OutlineItem {
13
- id: string;
14
- title: string;
15
- oneLine: string;
16
- }
17
- export interface ChunkRefLike {
18
- id: string;
19
- title: string;
20
- summary: string;
21
- tags: string[];
22
- }
23
- export interface TopicIndexLike {
24
- slug: string;
25
- title: string;
26
- summary: string;
27
- tags: string[];
28
- chunks: ChunkRefLike[];
29
- }
30
- export interface ReconcileResult {
6
+ interface ReconcileResult {
31
7
  match: boolean;
32
8
  targetSlug?: string;
33
9
  confidence?: number;
@@ -35,9 +11,8 @@ export interface ReconcileResult {
35
11
  mergedSummary?: string;
36
12
  itemsToAdd?: OutlineItem[];
37
13
  }
38
- export declare const LLM_FULL_SCAN_MAX = 20;
39
14
  export declare function readAllTopics(docsDir: string): Promise<TopicSummary[]>;
40
- export declare function readTopicDetail(docsDir: string, slug: string): Promise<TopicIndexLike | null>;
15
+ export declare function readTopicDetail(docsDir: string, slug: string): Promise<TopicIndex | null>;
41
16
  export declare function reconcileTopics(opts: {
42
17
  port: number;
43
18
  docsDir: string;
@@ -48,15 +23,18 @@ export declare function reconcileTopics(opts: {
48
23
  items?: OutlineItem[];
49
24
  };
50
25
  targets?: Array<TopicSummary & {
51
- chunks?: ChunkRefLike[];
26
+ chunks?: ChunkRef[];
52
27
  }>;
53
28
  wantItems: boolean;
29
+ signal: AbortSignal;
54
30
  }): Promise<ReconcileResult>;
55
31
  export declare function mergeTopics(docsDir: string, srcSlug: string, dstSlug: string): number;
56
- export declare function readSidecarDetail(docsDir: string, slug: string): Promise<TopicIndexLike | null>;
32
+ export declare function readSidecarDetail(docsDir: string, slug: string): Promise<TopicIndex | null>;
57
33
  export declare function mintSlug(opts: {
58
34
  port: number;
59
35
  title: string;
60
36
  existing: string[];
37
+ signal: AbortSignal;
61
38
  }): Promise<string>;
62
39
  export declare function assertNoOldDirs(docsDir: string): void;
40
+ export {};
@@ -1,14 +1,11 @@
1
- // learn 主题去重:纯字符串确定性预筛(不调 LLM、无 IO)
2
- import { readFile } from 'fs/promises';
3
- import fs from 'node:fs';
4
- import path from 'path';
1
+ // learn 主题去重:纯字符串确定性预筛(不调 LLM)+ LLM 兜底裁定 + 物理迁移。
2
+ // 文件读写、路径、类型统一经 vault(接收 docsDir,按需 createVault,刻意不导入单例)。
5
3
  import { runJsonPrompt } from './pi-runtime.js';
6
4
  import { slugFromLabel } from './web-crawler.js';
7
- // 合法 slug:小写字母数字开头,仅含小写字母数字与连字符
8
- const SLUG_RE = /^[a-z0-9][a-z0-9-]*$/;
5
+ import { createVault, isValidSlug } from './vault.js';
9
6
  // 归一化:小写;非字母数字字符(含 -、_、! 等标点)统一替换为空格;trim 并压缩连续空白
10
7
  // 标点替换为空格而非删除,使 state-management 与 State Management 归一后一致
11
- export function normalizeText(s) {
8
+ function normalizeText(s) {
12
9
  return s.toLowerCase().replace(/[^\p{L}\p{N}]+/gu, ' ').trim();
13
10
  }
14
11
  // 命中信号强度:归一 title 相等(0) > 任一归一 tag 相等(1) > title 互为子串(2)
@@ -39,33 +36,20 @@ export function findCandidates(cand, topics) {
39
36
  return [...hits.values()].sort((a, b) => a.rank - b.rank).map(h => h.topic);
40
37
  }
41
38
  // 预筛无命中时允许全量送 LLM 的目标上限;超过则安全放弃
42
- export const LLM_FULL_SCAN_MAX = 20;
39
+ const LLM_FULL_SCAN_MAX = 20;
43
40
  // 读全部 topic 摘要;index.json 缺失/损坏等任何异常一律返回 []
44
41
  export async function readAllTopics(docsDir) {
45
- try {
46
- const raw = await readFile(path.join(docsDir, 'index.json'), 'utf8');
47
- const data = JSON.parse(raw);
48
- return Array.isArray(data.topics) ? data.topics : [];
49
- }
50
- catch {
51
- return [];
52
- }
42
+ return createVault(docsDir).listTopics();
53
43
  }
54
44
  // 读单个 topic 详情;缺失/异常返回 null
55
45
  export async function readTopicDetail(docsDir, slug) {
56
- try {
57
- const raw = await readFile(path.join(docsDir, slug, 'index.json'), 'utf8');
58
- return JSON.parse(raw);
59
- }
60
- catch {
61
- return null;
62
- }
46
+ return createVault(docsDir).readTopicIndex(slug);
63
47
  }
64
48
  // LLM 兜底:在确定性预筛无法排除重复时,请模型裁定候选是否应并入某已有 topic。
65
49
  // 任何失败(IO、坏 JSON、超限)均安全降级为 { match: false }
66
50
  export async function reconcileTopics(opts) {
67
- const targets = opts.targets
68
- ?? (await readAllTopics(opts.docsDir)).filter(t => t.slug !== opts.candidate.slug);
51
+ const vault = createVault(opts.docsDir);
52
+ const targets = opts.targets ?? (await vault.listTopics()).filter(t => t.slug !== opts.candidate.slug);
69
53
  // 先走确定性预筛;无命中且目标数在上限内才全量送 LLM,超限直接放弃
70
54
  const hits = findCandidates({ title: opts.candidate.title, tags: opts.candidate.tags }, targets);
71
55
  let chosen;
@@ -93,7 +77,7 @@ export async function reconcileTopics(opts) {
93
77
  ].join('\n');
94
78
  const prompt = `新主题:\n${JSON.stringify(opts.candidate)}\n\n候选已有主题:\n${JSON.stringify(chosen)}`;
95
79
  try {
96
- const result = await runJsonPrompt({ port: opts.port, instructions, prompt });
80
+ const result = await runJsonPrompt({ port: opts.port, instructions, prompt, signal: opts.signal });
97
81
  // 正载荷必须完整,且 targetSlug 必须在实际提供的 chosen 之中,否则安全降级
98
82
  // (同时挡住候选自身 slug 回显、../ 路径穿越及任何未提供的目标)
99
83
  const chosenSlugs = chosen.map(t => t.slug);
@@ -115,15 +99,6 @@ export async function reconcileTopics(opts) {
115
99
  function pad3(n) {
116
100
  return String(n).padStart(3, '0');
117
101
  }
118
- // 列出 dir 下的 .md 文件名(排序);目录缺失视为空
119
- function listMd(dir) {
120
- try {
121
- return fs.readdirSync(dir).filter(f => f.endsWith('.md')).sort();
122
- }
123
- catch {
124
- return [];
125
- }
126
- }
127
102
  // 将 src 主题物理并入 dst:sources 续号拷贝、chunks 按 dst 现有数偏移重编号,
128
103
  // 同步更新 dst index 与根 index,最后删除整个 src 目录。返回迁移后 dst 的 chunk 总数。
129
104
  // srcSlug 可能是 x.old 旁挂目录(含点,路径直接拼接)。
@@ -131,57 +106,49 @@ export function mergeTopics(docsDir, srcSlug, dstSlug) {
131
106
  // 防护自合并:LLM 可能回显候选自身 slug;自合并会重复 refs、移除自身根注册并删目录(数据丢失)
132
107
  if (srcSlug === dstSlug)
133
108
  throw new Error('mergeTopics: src 与 dst 相同');
134
- const srcDir = path.join(docsDir, srcSlug);
135
- const dstDir = path.join(docsDir, dstSlug);
136
- // dst index 必须存在,缺失直接抛错;src index 同样读取(路径直接拼,支持 x.old)
137
- const dstIndex = JSON.parse(fs.readFileSync(path.join(dstDir, 'index.json'), 'utf8'));
138
- const srcIndex = JSON.parse(fs.readFileSync(path.join(srcDir, 'index.json'), 'utf8'));
109
+ const vault = createVault(docsDir);
110
+ // dst index 必须存在,缺失直接抛错;src index 同样读取(entry 直接拼,支持 x.old)
111
+ const dstIndex = vault.readEntryIndexSync(dstSlug);
112
+ const srcIndex = vault.readEntryIndexSync(srcSlug);
139
113
  // sources:按 dst 现有数量续号,逐个读→写 dst→删 src 原件(copy→unlink,避免跨设备 rename 失败)
140
- const srcSources = listMd(path.join(srcDir, 'sources'));
141
- const s0 = listMd(path.join(dstDir, 'sources')).length;
142
- fs.mkdirSync(path.join(dstDir, 'sources'), { recursive: true });
114
+ const srcSources = vault.listEntryMd(srcSlug, 'sources');
115
+ const s0 = vault.listEntryMd(dstSlug, 'sources').length;
116
+ vault.mkdirEntrySubdir(dstSlug, 'sources');
143
117
  srcSources.forEach((file, i) => {
144
- const body = fs.readFileSync(path.join(srcDir, 'sources', file));
145
- fs.writeFileSync(path.join(dstDir, 'sources', `source-${pad3(s0 + i + 1)}.md`), body);
146
- fs.unlinkSync(path.join(srcDir, 'sources', file));
118
+ const body = vault.readEntryFile(srcSlug, 'sources', file);
119
+ vault.writeEntryFile(dstSlug, 'sources', `source-${pad3(s0 + i + 1)}.md`, body);
120
+ vault.unlinkEntryFile(srcSlug, 'sources', file);
147
121
  });
148
122
  // chunks:src refs 按 id 排序,按 dst 现有 chunk 数偏移重编号;正文逐字拷贝不改
149
123
  const srcRefs = [...srcIndex.chunks].sort((a, b) => a.id.localeCompare(b.id));
150
124
  const k = dstIndex.chunks.length;
151
- fs.mkdirSync(path.join(dstDir, 'chunks'), { recursive: true });
125
+ vault.mkdirEntrySubdir(dstSlug, 'chunks');
152
126
  srcRefs.forEach((ref, i) => {
153
127
  const newId = `chunk-${pad3(k + i + 1)}`;
154
- const body = fs.readFileSync(path.join(srcDir, 'chunks', `${ref.id}.md`));
155
- fs.writeFileSync(path.join(dstDir, 'chunks', `${newId}.md`), body);
156
- fs.unlinkSync(path.join(srcDir, 'chunks', `${ref.id}.md`));
128
+ const body = vault.readEntryFile(srcSlug, 'chunks', `${ref.id}.md`);
129
+ vault.writeEntryFile(dstSlug, 'chunks', `${newId}.md`, body);
130
+ vault.unlinkEntryFile(srcSlug, 'chunks', `${ref.id}.md`);
157
131
  dstIndex.chunks.push({ ...ref, id: newId });
158
132
  });
159
133
  // 根 index:移除 slug===srcSlug 的条目(srcSlug 为 x.old 时不命中即 no-op)
160
134
  try {
161
- const rootPath = path.join(docsDir, 'index.json');
162
- const root = JSON.parse(fs.readFileSync(rootPath, 'utf8'));
135
+ const root = vault.readRootIndexSync();
163
136
  if (Array.isArray(root.topics)) {
164
137
  root.topics = root.topics.filter(t => t.slug !== srcSlug);
165
- fs.writeFileSync(rootPath, JSON.stringify(root, null, 2));
138
+ vault.writeRootIndexSync(root);
166
139
  }
167
140
  }
168
141
  catch {
169
142
  // 根 index 缺失/损坏:无条目可移除,跳过
170
143
  }
171
144
  // 删除整个 src 目录,写回 dst index
172
- fs.rmSync(srcDir, { recursive: true, force: true });
173
- fs.writeFileSync(path.join(dstDir, 'index.json'), JSON.stringify(dstIndex, null, 2));
145
+ vault.removeEntry(srcSlug);
146
+ vault.writeEntryIndexSync(dstSlug, dstIndex);
174
147
  return dstIndex.chunks.length;
175
148
  }
176
149
  // 读旁挂目录 <slug>.old 的 index.json;缺失/坏 → null
177
150
  export async function readSidecarDetail(docsDir, slug) {
178
- try {
179
- const raw = await readFile(path.join(docsDir, `${slug}.old`, 'index.json'), 'utf8');
180
- return JSON.parse(raw);
181
- }
182
- catch {
183
- return null;
184
- }
151
+ return createVault(docsDir).readSidecarIndex(slug);
185
152
  }
186
153
  // 据 title 让 LLM 铸一个小写连字符 slug。失败/非法/已占 → 降级 slugFromLabel(title),
187
154
  // 仍被占则追加 -2/-3…。返回保证合法且不落在 existing 内的 slug(除非编号也耗尽,实践不会)。
@@ -191,8 +158,9 @@ export async function mintSlug(opts) {
191
158
  port: opts.port,
192
159
  instructions: 'Return ONLY JSON {"slug":"<lowercase-hyphen-slug>"} derived faithfully from the title.',
193
160
  prompt: `Title: ${opts.title}`,
161
+ signal: opts.signal,
194
162
  });
195
- if (typeof result.slug === 'string' && SLUG_RE.test(result.slug) && !opts.existing.includes(result.slug)) {
163
+ if (typeof result.slug === 'string' && isValidSlug(result.slug) && !opts.existing.includes(result.slug)) {
196
164
  return result.slug;
197
165
  }
198
166
  }
@@ -211,8 +179,5 @@ export async function mintSlug(opts) {
211
179
  // 阻断:docsDir 下存在任何 .old 旁挂目录时抛错,要求人工先处理。
212
180
  // docsDir 本身缺失时直接让 readdirSync 抛错(调用方本就应在已初始化的库上学习)。
213
181
  export function assertNoOldDirs(docsDir) {
214
- const oldDir = fs.readdirSync(docsDir).find(name => name.endsWith('.old'));
215
- if (oldDir) {
216
- throw new Error(`检测到未清理的旁挂目录 ${oldDir},请手工处理后再学习`);
217
- }
182
+ createVault(docsDir).assertNoOldSidecars();
218
183
  }
@@ -0,0 +1,65 @@
1
+ /** 会话领域事件:与 SSE data 帧 payload 同形(type 字符串固定) */
2
+ export type PiSessionEvent = {
3
+ type: 'round_start';
4
+ roundIndex: number;
5
+ } | {
6
+ type: 'round_end';
7
+ roundIndex: number;
8
+ } | {
9
+ type: 'text_delta';
10
+ content: string;
11
+ } | {
12
+ type: 'thinking_delta';
13
+ content: string;
14
+ } | {
15
+ type: 'tool_start';
16
+ toolCallId: string;
17
+ toolName: string;
18
+ args: unknown;
19
+ } | {
20
+ type: 'tool_end';
21
+ toolCallId: string;
22
+ toolName: string;
23
+ isError: boolean;
24
+ durationMs: number;
25
+ result: string;
26
+ };
27
+ /**
28
+ * 是否 assistant 消息边界(message_start / message_end 分支内调用)。
29
+ * message_start 对 user / assistant / toolResult 三种消息都会触发,
30
+ * 只有 assistant 对应一次 LLM 回复轮次。
31
+ */
32
+ export declare function isAssistantMessage(ev: any): boolean;
33
+ /**
34
+ * 从 message_update 事件解包 assistant 流 delta:
35
+ * ae.type 为 text_delta / thinking_delta 且 delta 为 string 时返回,否则 null。
36
+ */
37
+ export declare function extractAssistantDelta(ev: any): {
38
+ kind: 'text' | 'thinking';
39
+ delta: string;
40
+ } | null;
41
+ /**
42
+ * 提取工具结果文本:result.content 为数组时,各项 type === 'text' 取 text
43
+ * (非 text 项以空串占位),以 '\n' 拼接;否则 ''。
44
+ */
45
+ export declare function extractToolResultText(result: any): string;
46
+ export interface PiEventWriter {
47
+ /** 喂入一条 pi SDK 原始事件;映射/回调异常不外泄 */
48
+ write(rawEvent: unknown): void;
49
+ }
50
+ export interface PiEventEmitterOptions {
51
+ /** 初始轮次计数(复用 session 时传入上次累计值),默认 0 */
52
+ initialIndex?: number;
53
+ /** 计数递增时回调,供调用方持久化到 session */
54
+ onIndexChange?: (roundIndex: number) => void;
55
+ }
56
+ /**
57
+ * 有状态映射器:内部维护 1-based 轮次计数(assistant message_start 先自增再发
58
+ * round_start,message_end 带当前值),把原始事件映射为 PiSessionEvent 交给 emit。
59
+ * agent_end 等终态事件不在这里处理(由调用方自行监听)。
60
+ *
61
+ * 跨连接复用语义:同一 pi session 可能被多个 SSE 连接先后复用(多次追问),
62
+ * 调用方应通过 initialIndex 传入上次累计的轮次、并在 onIndexChange 中持久化新值,
63
+ * 否则每个连接的 roundIndex 都会从 1 重来,导致前端按 roundIndex 去重时串轮。
64
+ */
65
+ export declare function createPiEventEmitter(emit: (ev: PiSessionEvent) => void, options?: PiEventEmitterOptions): PiEventWriter;
@@ -0,0 +1,98 @@
1
+ // pi-events: pi SDK 原始事件 → 会话领域事件的映射原语。
2
+ // learn orchestrator / chat SSE / runJsonPrompt 三处订阅共用同一套映射规则。
3
+ //
4
+ // "轮次" = 一次 assistant 交互(assistant message_start → message_end),
5
+ // 轮次索引 1-based。
6
+ /**
7
+ * 是否 assistant 消息边界(message_start / message_end 分支内调用)。
8
+ * message_start 对 user / assistant / toolResult 三种消息都会触发,
9
+ * 只有 assistant 对应一次 LLM 回复轮次。
10
+ */
11
+ export function isAssistantMessage(ev) {
12
+ return ev?.message?.role === 'assistant';
13
+ }
14
+ /**
15
+ * 从 message_update 事件解包 assistant 流 delta:
16
+ * ae.type 为 text_delta / thinking_delta 且 delta 为 string 时返回,否则 null。
17
+ */
18
+ export function extractAssistantDelta(ev) {
19
+ if (ev?.type !== 'message_update')
20
+ return null;
21
+ const ae = ev.assistantMessageEvent;
22
+ if ((ae?.type === 'text_delta' || ae?.type === 'thinking_delta') && typeof ae.delta === 'string') {
23
+ return { kind: ae.type === 'text_delta' ? 'text' : 'thinking', delta: ae.delta };
24
+ }
25
+ return null;
26
+ }
27
+ /**
28
+ * 提取工具结果文本:result.content 为数组时,各项 type === 'text' 取 text
29
+ * (非 text 项以空串占位),以 '\n' 拼接;否则 ''。
30
+ */
31
+ export function extractToolResultText(result) {
32
+ if (!Array.isArray(result?.content))
33
+ return '';
34
+ return result.content
35
+ .map((c) => (c?.type === 'text' ? c.text : ''))
36
+ .join('\n');
37
+ }
38
+ /**
39
+ * 有状态映射器:内部维护 1-based 轮次计数(assistant message_start 先自增再发
40
+ * round_start,message_end 带当前值),把原始事件映射为 PiSessionEvent 交给 emit。
41
+ * agent_end 等终态事件不在这里处理(由调用方自行监听)。
42
+ *
43
+ * 跨连接复用语义:同一 pi session 可能被多个 SSE 连接先后复用(多次追问),
44
+ * 调用方应通过 initialIndex 传入上次累计的轮次、并在 onIndexChange 中持久化新值,
45
+ * 否则每个连接的 roundIndex 都会从 1 重来,导致前端按 roundIndex 去重时串轮。
46
+ */
47
+ export function createPiEventEmitter(emit, options) {
48
+ let roundIndex = options?.initialIndex ?? 0;
49
+ return {
50
+ write(rawEvent) {
51
+ try {
52
+ const ev = rawEvent;
53
+ if (ev.type === 'message_start') {
54
+ if (isAssistantMessage(ev)) {
55
+ roundIndex += 1;
56
+ options?.onIndexChange?.(roundIndex);
57
+ emit({ type: 'round_start', roundIndex });
58
+ }
59
+ }
60
+ else if (ev.type === 'message_end') {
61
+ if (isAssistantMessage(ev)) {
62
+ emit({ type: 'round_end', roundIndex });
63
+ }
64
+ }
65
+ else if (ev.type === 'message_update') {
66
+ const d = extractAssistantDelta(ev);
67
+ if (d) {
68
+ emit(d.kind === 'text'
69
+ ? { type: 'text_delta', content: d.delta }
70
+ : { type: 'thinking_delta', content: d.delta });
71
+ }
72
+ }
73
+ else if (ev.type === 'tool_execution_start') {
74
+ emit({
75
+ type: 'tool_start',
76
+ toolCallId: ev.toolCallId,
77
+ toolName: ev.toolName,
78
+ args: ev.args,
79
+ });
80
+ }
81
+ else if (ev.type === 'tool_execution_end') {
82
+ emit({
83
+ type: 'tool_end',
84
+ toolCallId: ev.toolCallId,
85
+ toolName: ev.toolName,
86
+ isError: !!ev.isError,
87
+ durationMs: ev.durationMs ?? 0,
88
+ result: extractToolResultText(ev.result),
89
+ });
90
+ }
91
+ // 其他事件(agent_end / 未知类型)忽略
92
+ }
93
+ catch {
94
+ // 映射或 emit 抛错不影响 SDK 事件分发(参照 orchestrator 既有约定)
95
+ }
96
+ },
97
+ };
98
+ }
@@ -1,8 +1,5 @@
1
- export interface OutlineItem {
2
- id: string;
3
- title: string;
4
- oneLine: string;
5
- }
1
+ import type { OutlineItem } from './vault.js';
2
+ export type { OutlineItem };
6
3
  export interface LearnPipelineEvents {
7
4
  stageStart(stage: 'outline' | 'refine' | 'tag', totalItems?: number): void;
8
5
  stageItemStart(index: number, total: number, title: string): void;
@@ -34,8 +31,12 @@ export interface RunLearnPipelineOptions {
34
31
  label?: string;
35
32
  port: number;
36
33
  events: LearnPipelineEvents;
34
+ /** 外部取消信号:客户端断开(关窗)时 abort,流水线各阶段随之中止 */
35
+ signal: AbortSignal;
37
36
  /** 注入式 docsDir(测试用);默认 ~/.cc-monitoring/docs */
38
37
  docsDir?: string;
38
+ /** slug 算出后、任何文件改动前同步调用(落 running 行用);抛错直接传播 */
39
+ onStart?: (slug: string) => void;
39
40
  }
40
41
  export declare function runLearnPipeline(opts: RunLearnPipelineOptions): Promise<{
41
42
  slug: string;