@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,5 +1,4 @@
1
1
  import { spawn } from 'node:child_process';
2
- import { Type } from 'typebox';
3
2
  /**
4
3
  * 统一封装 ego-browser CLI:spawn 子进程 + 写入 Node 脚本 stdin,返回 cliLog 文本。
5
4
  * 每次调用独立进程,靠 useOrCreateTaskSpace 在同一 task space 复用 tab。
@@ -80,176 +79,3 @@ export function stripCliBanners(text) {
80
79
  .filter((line) => !line.startsWith('[ego-browser:notice]'))
81
80
  .join('\n');
82
81
  }
83
- // ---------- 工具实现辅助 ----------
84
- /** 把字符串参数安全注入脚本:JSON.stringify 自动处理引号 / 反斜杠 / 换行 */
85
- const jsLit = (v) => JSON.stringify(v);
86
- /** 构造 pi AgentToolResult(content + details 字段) */
87
- const ok = (text) => ({
88
- content: [{ type: 'text', text }],
89
- details: undefined,
90
- });
91
- const navigateSchema = Type.Object({
92
- url: Type.String({ description: '目标 URL,必须是 http(s) 完整地址' }),
93
- wait: Type.Optional(Type.Boolean({ description: '是否等待页面加载完成,默认 true' })),
94
- });
95
- const snapshotSchema = Type.Object({
96
- scope: Type.Optional(Type.String({
97
- description: "snapshotText 的 scope:'full_page'(默认)或 'only_within_viewport'",
98
- })),
99
- });
100
- const screenshotSchema = Type.Object({});
101
- const clickSchema = Type.Object({
102
- target: Type.String({
103
- description: "点击目标:@N / CSS / 'xpath=...' / 'loc=...',或 [x,y] 视口坐标数组",
104
- }),
105
- label: Type.Optional(Type.String({ description: '可选 3-6 字动作描述,用于高亮' })),
106
- });
107
- const typeSchema = Type.Object({
108
- target: Type.String({ description: '输入框定位:@N / CSS / xpath=... / loc=...' }),
109
- text: Type.String({ description: '要填入的文本内容' }),
110
- submit: Type.Optional(Type.Boolean({ description: 'true 则填完后按 Enter,默认 false' })),
111
- });
112
- const scrollSchema = Type.Object({
113
- direction: Type.String({
114
- enum: ['down', 'up', 'bottom'],
115
- description: "滚动方向:'down' / 'up' / 'bottom'(滚到底并触发懒加载)",
116
- }),
117
- amount: Type.Optional(Type.Number({ description: 'down/up 时的滚动像素量,默认 900' })),
118
- });
119
- const evaluateSchema = Type.Object({
120
- expression: Type.String({
121
- description: '页面内 JS 字符串。复杂逻辑用 IIFE:(() => { ... })()',
122
- }),
123
- });
124
- const fetchSchema = Type.Object({
125
- url: Type.String({ description: '要抓取的 URL' }),
126
- });
127
- const pressKeySchema = Type.Object({
128
- key: Type.String({ description: "CDP 键名,如 'Enter' / 'Escape' / 'ArrowDown'" }),
129
- });
130
- export const browserTools = [
131
- {
132
- name: 'browser_navigate',
133
- label: 'browser_navigate',
134
- description: '在 ego-browser 的 knowledge-learn task space 中打开或复用 tab 到给定 URL。wait=true(默认)会等页面加载,timeout 20s。',
135
- parameters: navigateSchema,
136
- async execute(_id, params, signal) {
137
- const url = jsLit(params.url);
138
- const wait = params.wait ?? true;
139
- const body = `
140
- await openOrReuseTab(${url}, { wait: ${wait}, timeout: 20 })
141
- const info = await pageInfo()
142
- cliLog(JSON.stringify(info))
143
- `;
144
- return ok(await runEgoBrowser(body, { signal }));
145
- },
146
- },
147
- {
148
- name: 'browser_snapshot',
149
- label: 'browser_snapshot',
150
- description: '获取当前页面的可访问性语义树(含 @N / loc= 引用),是后续 click/fillInput 定位元素的依据。默认 scope=full_page 覆盖整页。',
151
- parameters: snapshotSchema,
152
- async execute(_id, params, signal) {
153
- const scope = params.scope ?? 'full_page';
154
- const body = `cliLog(await snapshotText({ scope: ${jsLit(scope)} }))`;
155
- return ok(await runEgoBrowser(body, { signal }));
156
- },
157
- },
158
- {
159
- name: 'browser_screenshot',
160
- label: 'browser_screenshot',
161
- description: '对当前页面视口截图。返回 ego 输出的图片说明 / 路径文本。',
162
- parameters: screenshotSchema,
163
- async execute(_id, _params, signal) {
164
- return ok(await runEgoBrowser('cliLog(await captureScreenshot())', { signal }));
165
- },
166
- },
167
- {
168
- name: 'browser_click',
169
- label: 'browser_click',
170
- description: '点击元素。target 支持 @N(来自最近一次 snapshotText)、CSS 选择器、xpath=...、loc=...(推荐长期稳定引用)。label 是 3-6 字动作描述,会触发高亮动画。',
171
- parameters: clickSchema,
172
- async execute(_id, params, signal) {
173
- const target = jsLit(params.target);
174
- const label = params.label ? `, { label: ${jsLit(params.label)} }` : '';
175
- const body = `await click(${target}${label})\ncliLog('clicked: ${params.target}')`;
176
- return ok(await runEgoBrowser(body, { signal }));
177
- },
178
- },
179
- {
180
- name: 'browser_type',
181
- label: 'browser_type',
182
- description: '向输入框填充文本。target 同 browser_click(@N / CSS / xpath / loc)。submit=true 时填完后按 Enter(常用于搜索框)。',
183
- parameters: typeSchema,
184
- async execute(_id, params, signal) {
185
- const target = jsLit(params.target);
186
- const text = jsLit(params.text);
187
- const submitBlock = params.submit ? `\nawait pressKey('Enter')` : '';
188
- const body = `
189
- await fillInput(${target}, ${text})${submitBlock}
190
- cliLog('filled: ${params.target}')
191
- `;
192
- return ok(await runEgoBrowser(body, { signal }));
193
- },
194
- },
195
- {
196
- name: 'browser_scroll',
197
- label: 'browser_scroll',
198
- description: '滚动页面。direction=down/up 按 amount 像素滚动;direction=bottom 自动滚到底并尝试触发懒加载(最多 20 步)。',
199
- parameters: scrollSchema,
200
- async execute(_id, params, signal) {
201
- let body;
202
- if (params.direction === 'bottom') {
203
- body = `
204
- await scrollToBottomUntil(
205
- async () => false,
206
- { step: 900, wait: 1, maxSteps: 20 }
207
- )
208
- cliLog('scrolled to bottom')
209
- `;
210
- }
211
- else {
212
- const amount = params.amount ?? 900;
213
- const signed = params.direction === 'down' ? amount : -amount;
214
- body = `
215
- await scrollBy(${signed})
216
- cliLog('scrolled ${params.direction} ${amount}px')
217
- `;
218
- }
219
- return ok(await runEgoBrowser(body, { signal }));
220
- },
221
- },
222
- {
223
- name: 'browser_evaluate',
224
- label: 'browser_evaluate',
225
- description: '在页面上下文执行 JS 字符串(等价于 Runtime.evaluate),返回序列化结果。多步逻辑请包成 IIFE:(() => { ... })()。不要把它当 Puppeteer page.evaluate(fn, ...args) 用。',
226
- parameters: evaluateSchema,
227
- async execute(_id, params, signal) {
228
- const expr = jsLit(params.expression);
229
- const body = `cliLog(JSON.stringify(await js(${expr})))`;
230
- return ok(await runEgoBrowser(body, { signal }));
231
- },
232
- },
233
- {
234
- name: 'browser_fetch',
235
- label: 'browser_fetch',
236
- description: '在当前浏览器页面上下文发起 fetch(复用登录态 / Cookie),返回响应正文文本。适合抓取需要鉴权的页面 JSON 或 HTML。',
237
- parameters: fetchSchema,
238
- async execute(_id, params, signal) {
239
- const url = jsLit(params.url);
240
- const body = `cliLog(await browserFetch(${url}))`;
241
- return ok(await runEgoBrowser(body, { signal }));
242
- },
243
- },
244
- {
245
- name: 'browser_press_key',
246
- label: 'browser_press_key',
247
- description: '在当前焦点元素按下键盘按键。key 用 CDP 键名,如 "Enter" / "Escape" / "Tab" / "ArrowDown" / "Control+A"。',
248
- parameters: pressKeySchema,
249
- async execute(_id, params, signal) {
250
- const key = jsLit(params.key);
251
- const body = `await pressKey(${key})\ncliLog('pressed: ${params.key}')`;
252
- return ok(await runEgoBrowser(body, { signal }));
253
- },
254
- },
255
- ];
@@ -25,6 +25,7 @@ export declare class CrawlGuard {
25
25
  private readonly maxPages;
26
26
  private readonly maxDepth;
27
27
  private readonly navigate;
28
+ private readonly vault;
28
29
  private entry;
29
30
  private readonly seen;
30
31
  private readonly depthByUrl;
@@ -58,5 +59,5 @@ export declare class CrawlGuard {
58
59
  */
59
60
  close(): Promise<void>;
60
61
  }
61
- export declare function createCrawlTools(guard: CrawlGuard): ToolDefinition[];
62
+ export declare function createCrawlTools(guard: CrawlGuard, signal: AbortSignal): ToolDefinition[];
62
63
  export {};
@@ -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;