@cc-monitoring/proxy-core 0.1.8 → 0.1.9

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 (375) hide show
  1. package/dist/cli/commands/mcp.d.ts +1 -0
  2. package/dist/cli/commands/mcp.js +5 -0
  3. package/dist/cli/index.js +12 -0
  4. package/dist/docs/404.html +1 -1
  5. package/dist/docs/assets/{app.CLpmq4Gv.js → app.Dc5qjt2Z.js} +1 -1
  6. package/dist/docs/assets/chunks/{VPLocalSearchBox.C43HQ5tU.js → VPLocalSearchBox.DNn4HwDn.js} +1 -1
  7. package/dist/docs/assets/chunks/{abnfDiagram-VRR7QNED.RG1C5NpS.js → abnfDiagram-VRR7QNED.CO3oJlfv.js} +1 -1
  8. package/dist/docs/assets/chunks/{arc.C9NMazfV.js → arc.D6Q1WZEU.js} +1 -1
  9. package/dist/docs/assets/chunks/{architectureDiagram-ZJ3FMSHR.u2IZtOa6.js → architectureDiagram-ZJ3FMSHR.vHAxAkhu.js} +1 -1
  10. package/dist/docs/assets/chunks/{blockDiagram-677ZJIJ3.DdHVir7t.js → blockDiagram-677ZJIJ3.C0el4zil.js} +1 -1
  11. package/dist/docs/assets/chunks/{c4Diagram-LMCZKHZV.gSbgoaJo.js → c4Diagram-LMCZKHZV.WD7qpLTf.js} +1 -1
  12. package/dist/docs/assets/chunks/channel.nWTiHmYA.js +1 -0
  13. package/dist/docs/assets/chunks/{chunk-2Q5K7J3B.HRSdtksv.js → chunk-2Q5K7J3B.Bgt7N_Co.js} +1 -1
  14. package/dist/docs/assets/chunks/{chunk-32BRIVSS.BYzKapof.js → chunk-32BRIVSS.CbP8heQ0.js} +1 -1
  15. package/dist/docs/assets/chunks/{chunk-5VM5RSS4.c3oeF0uS.js → chunk-5VM5RSS4.Dlc2iAaG.js} +1 -1
  16. package/dist/docs/assets/chunks/{chunk-EX3LRPZG.Cz5AKl7t.js → chunk-EX3LRPZG.Cr0sQbRc.js} +1 -1
  17. package/dist/docs/assets/chunks/{chunk-JWPE2WC7.DtJxsA7-.js → chunk-JWPE2WC7.B52h3S9L.js} +1 -1
  18. package/dist/docs/assets/chunks/{chunk-MOJQB5TN.h5kO0Dtu.js → chunk-MOJQB5TN.CphhXnWQ.js} +1 -1
  19. package/dist/docs/assets/chunks/{chunk-RYQCIY6F.Ch_NfMTR.js → chunk-RYQCIY6F.CZafA9pg.js} +1 -1
  20. package/dist/docs/assets/chunks/{chunk-V7JOEXUC.CHrHyPoW.js → chunk-V7JOEXUC.DMlMAq_a.js} +1 -1
  21. package/dist/docs/assets/chunks/{chunk-VR4S4FIN.DG8DIrH3.js → chunk-VR4S4FIN.DA1An2TL.js} +1 -1
  22. package/dist/docs/assets/chunks/{chunk-XXDRQBXY.CSXBN12Y.js → chunk-XXDRQBXY.Dwra-T5p.js} +1 -1
  23. package/dist/docs/assets/chunks/classDiagram-OUVF2IWQ.RsrQkeM_.js +1 -0
  24. package/dist/docs/assets/chunks/classDiagram-v2-EOCWNBFH.RsrQkeM_.js +1 -0
  25. package/dist/docs/assets/chunks/{cose-bilkent-JH36ORCC.BeFuOTgi.js → cose-bilkent-JH36ORCC.Ddhn5b9l.js} +1 -1
  26. package/dist/docs/assets/chunks/{cynefinDiagram-TSTJHNR4.BrJcHEEe.js → cynefinDiagram-TSTJHNR4.BlUCFIAV.js} +1 -1
  27. package/dist/docs/assets/chunks/{dagre-VKFMJZFB.D4vaA23X.js → dagre-VKFMJZFB.erCsZJb8.js} +1 -1
  28. package/dist/docs/assets/chunks/{diagram-FQU43EPY.uwRFLKRx.js → diagram-FQU43EPY.B0zbjZsr.js} +1 -1
  29. package/dist/docs/assets/chunks/{diagram-G47NLZAW.Byfc9d0H.js → diagram-G47NLZAW.B4S_wuz1.js} +1 -1
  30. package/dist/docs/assets/chunks/{diagram-NH7WQ7WH.CxjBEGZX.js → diagram-NH7WQ7WH.BRv6nOgk.js} +1 -1
  31. package/dist/docs/assets/chunks/{diagram-OA4YK3LP.CU1jGXMi.js → diagram-OA4YK3LP.DBS8iZPq.js} +1 -1
  32. package/dist/docs/assets/chunks/{diagram-WEI45ONY.yXgVkURA.js → diagram-WEI45ONY.CDZlR-fM.js} +1 -1
  33. package/dist/docs/assets/chunks/{ebnfDiagram-CCIWWBDH.UucqGQ_d.js → ebnfDiagram-CCIWWBDH.z_nUDDWm.js} +1 -1
  34. package/dist/docs/assets/chunks/{erDiagram-Q63AITRT.C6qmOrvh.js → erDiagram-Q63AITRT.BOAH1mBM.js} +1 -1
  35. package/dist/docs/assets/chunks/{flowDiagram-23GEKE2U.BZLu-WUl.js → flowDiagram-23GEKE2U.cnCU0na-.js} +1 -1
  36. package/dist/docs/assets/chunks/{ganttDiagram-NO4QXBWP.DUzsw4Yr.js → ganttDiagram-NO4QXBWP.CzSToCFq.js} +1 -1
  37. package/dist/docs/assets/chunks/{gitGraphDiagram-IHSO6WYX.BqLfYTI7.js → gitGraphDiagram-IHSO6WYX.WUBTiDD1.js} +1 -1
  38. package/dist/docs/assets/chunks/{infoDiagram-FWYZ7A6U.CiKWveW9.js → infoDiagram-FWYZ7A6U.Bz5y9qpB.js} +1 -1
  39. package/dist/docs/assets/chunks/{ishikawaDiagram-FXEZZL3T.jerUXEXA.js → ishikawaDiagram-FXEZZL3T.DX9mwIpB.js} +1 -1
  40. package/dist/docs/assets/chunks/{journeyDiagram-5HDEW3XC.Cqzvo6I_.js → journeyDiagram-5HDEW3XC.BclISEWC.js} +1 -1
  41. package/dist/docs/assets/chunks/{kanban-definition-HUTT4EX6.BzJ4OPe5.js → kanban-definition-HUTT4EX6.CMwsG4gj.js} +1 -1
  42. package/dist/docs/assets/chunks/{linear.hFjgYGMN.js → linear.zokB3L6J.js} +1 -1
  43. package/dist/docs/assets/chunks/{mermaid-client.D3gEaJ5e.js → mermaid-client.DIhzjS3B.js} +2 -2
  44. package/dist/docs/assets/chunks/{mermaid.core.CEHdFh45.js → mermaid.core.CJEoCnVo.js} +102 -98
  45. package/dist/docs/assets/chunks/{mindmap-definition-LN4V7U3C.ChC5FJW6.js → mindmap-definition-LN4V7U3C.DeNvpAwd.js} +1 -1
  46. package/dist/docs/assets/chunks/{pegDiagram-2B236MQR.ClnjsRYs.js → pegDiagram-2B236MQR.D5O5vyDS.js} +1 -1
  47. package/dist/docs/assets/chunks/{pieDiagram-ENE6RG2P.Bb0MqerK.js → pieDiagram-ENE6RG2P.CDpZrox4.js} +1 -1
  48. package/dist/docs/assets/chunks/{quadrantDiagram-ABIIQ3AL.Do6HK_yb.js → quadrantDiagram-ABIIQ3AL.Bz0dhK1l.js} +1 -1
  49. package/dist/docs/assets/chunks/{railroadDiagram-RFXS5EU6.D35m6hQn.js → railroadDiagram-RFXS5EU6.C2h0Mxo5.js} +1 -1
  50. package/dist/docs/assets/chunks/{requirementDiagram-TGXJPOKE.DMtjRYUg.js → requirementDiagram-TGXJPOKE.YLD-NuJw.js} +1 -1
  51. package/dist/docs/assets/chunks/{sankeyDiagram-HTMAVEWB.dfXDu62B.js → sankeyDiagram-HTMAVEWB.R2uEIhmV.js} +1 -1
  52. package/dist/docs/assets/chunks/{sequenceDiagram-DBY2YBRQ.CLZ0rZTY.js → sequenceDiagram-DBY2YBRQ.D6E2oY7U.js} +1 -1
  53. package/dist/docs/assets/chunks/{sizeCapture-X5ZJPWSS.DWvGYLUT.js → sizeCapture-X5ZJPWSS.C65Lzwwi.js} +1 -1
  54. package/dist/docs/assets/chunks/{stateDiagram-2N3HPSRC.DY8sDkI0.js → stateDiagram-2N3HPSRC.Cqc4HEHT.js} +1 -1
  55. package/dist/docs/assets/chunks/stateDiagram-v2-6OUMAXLB.D8rYKDmp.js +1 -0
  56. package/dist/docs/assets/chunks/{swimlanes-5IMT3BWC.Dy9SffeT.js → swimlanes-5IMT3BWC.dfhQuNQg.js} +2 -2
  57. package/dist/docs/assets/chunks/swimlanesDiagram-G3AALYLV.CdD0ADbF.js +8 -0
  58. package/dist/docs/assets/chunks/{theme.CSw9Whd5.js → theme.DCDU4HCI.js} +2 -2
  59. package/dist/docs/assets/chunks/{timeline-definition-FHXFAJF6.CH6uzgIu.js → timeline-definition-FHXFAJF6.SOgdni8I.js} +1 -1
  60. package/dist/docs/assets/chunks/{vennDiagram-L72KCM5P.7EBCJmyP.js → vennDiagram-L72KCM5P.BvlXlHJf.js} +1 -1
  61. package/dist/docs/assets/chunks/{wardleyDiagram-EHGQE667.DPHAQssL.js → wardleyDiagram-EHGQE667.t3t8sFvo.js} +1 -1
  62. package/dist/docs/assets/chunks/{xychartDiagram-FW5EYKEG.aKgxZVbK.js → xychartDiagram-FW5EYKEG.DDT1UX32.js} +1 -1
  63. package/dist/docs/index.html +2 -2
  64. package/dist/docs/overview.html +2 -2
  65. package/dist/docs/packages-utils.html +2 -2
  66. package/dist/docs/proxy-admin/env-and-build.html +2 -2
  67. package/dist/docs/proxy-admin/index.html +2 -2
  68. package/dist/docs/proxy-admin/layout-and-menu.html +2 -2
  69. package/dist/docs/proxy-admin/pages.html +2 -2
  70. package/dist/docs/proxy-admin/routing-and-auth.html +2 -2
  71. package/dist/docs/proxy-admin/services-and-mock.html +2 -2
  72. package/dist/docs/proxy-cli/api-layer.html +2 -2
  73. package/dist/docs/proxy-cli/app-shell.html +2 -2
  74. package/dist/docs/proxy-cli/components-common.html +2 -2
  75. package/dist/docs/proxy-cli/components-config.html +2 -2
  76. package/dist/docs/proxy-cli/components-requests.html +2 -2
  77. package/dist/docs/proxy-cli/components-stats.html +2 -2
  78. package/dist/docs/proxy-cli/components-status.html +2 -2
  79. package/dist/docs/proxy-cli/data-hooks.html +2 -2
  80. package/dist/docs/proxy-cli/index.html +2 -2
  81. package/dist/docs/proxy-cli/utils-and-i18n.html +2 -2
  82. package/dist/docs/proxy-core/chat-api.html +2 -2
  83. package/dist/docs/proxy-core/cli.html +2 -2
  84. package/dist/docs/proxy-core/config.html +2 -2
  85. package/dist/docs/proxy-core/data-layer.html +2 -2
  86. package/dist/docs/proxy-core/entry.html +2 -2
  87. package/dist/docs/proxy-core/index.html +2 -2
  88. package/dist/docs/proxy-core/pm2.html +2 -2
  89. package/dist/docs/proxy-core/providers.html +2 -2
  90. package/dist/docs/proxy-core/proxy.html +2 -2
  91. package/dist/docs/proxy-core/stats.html +2 -2
  92. package/dist/docs/proxy-core/tool.html +2 -2
  93. package/dist/docs/proxy-core/ui-routes.html +2 -2
  94. package/dist/docs/proxy-core/utilities.html +2 -2
  95. package/dist/docs/quickstart.html +2 -2
  96. package/dist/docs/request-flow.html +2 -2
  97. package/dist/mcp-server/index.d.ts +3 -0
  98. package/dist/mcp-server/index.js +16 -0
  99. package/dist/mcp-server/run.d.ts +1 -0
  100. package/dist/mcp-server/run.js +14 -0
  101. package/dist/mcp-server/tools.d.ts +11 -0
  102. package/dist/mcp-server/tools.js +219 -0
  103. package/dist/server/docs-route.js +42 -13
  104. package/dist/server/index.js +3 -2
  105. package/dist/server/ui-route.js +161 -103
  106. package/dist/ui/assets/{1c-DPsrzNHI.js → 1c-CK-kMhtR.js} +1 -1
  107. package/dist/ui/assets/{abnf-DNkBIQRO.js → abnf-1lQ1Uzrr.js} +1 -1
  108. package/dist/ui/assets/{abnfDiagram-VRR7QNED-BqvHvzR8.js → abnfDiagram-VRR7QNED-BqMOdnuh.js} +1 -1
  109. package/dist/ui/assets/{accesslog-D5NxQ43Q.js → accesslog-BGadK9Fx.js} +1 -1
  110. package/dist/ui/assets/{actionscript-DLr-LB2m.js → actionscript-4t1vDHvB.js} +1 -1
  111. package/dist/ui/assets/{ada-BRSz3tHX.js → ada-CTSY_kbf.js} +1 -1
  112. package/dist/ui/assets/{angelscript-DMtEGgIa.js → angelscript-BX_1_lW7.js} +1 -1
  113. package/dist/ui/assets/{apache-C4gn4cSd.js → apache-DeUUxSLd.js} +1 -1
  114. package/dist/ui/assets/{applescript-DoodcTwg.js → applescript-BUfqUe12.js} +1 -1
  115. package/dist/ui/assets/{arc-HmnzaGf9.js → arc-D-xOtktL.js} +1 -1
  116. package/dist/ui/assets/{arcade-RJZZSHSl.js → arcade-BlZbrfiI.js} +1 -1
  117. package/dist/ui/assets/{architectureDiagram-ZJ3FMSHR-BUfDpSIw.js → architectureDiagram-ZJ3FMSHR-KN5x3Oxc.js} +1 -1
  118. package/dist/ui/assets/{arduino-n6Dpx6Ig.js → arduino-CmMMxhu0.js} +1 -1
  119. package/dist/ui/assets/{armasm-DzCVITGB.js → armasm-If0W0ZTH.js} +1 -1
  120. package/dist/ui/assets/{asciidoc-CaqMsApq.js → asciidoc-DD6e-k3f.js} +1 -1
  121. package/dist/ui/assets/{aspectj-B0kIcV0v.js → aspectj-MxQxriHk.js} +1 -1
  122. package/dist/ui/assets/{autohotkey-xUEXewap.js → autohotkey-Ahz4SejW.js} +1 -1
  123. package/dist/ui/assets/{autoit-D3OfN2VX.js → autoit-DwDj3imC.js} +1 -1
  124. package/dist/ui/assets/{avrasm-Cbf0F4Kf.js → avrasm-97KvbVpn.js} +1 -1
  125. package/dist/ui/assets/{awk-Cc0rWEwe.js → awk-Bo_-wZyZ.js} +1 -1
  126. package/dist/ui/assets/{axapta-BKEeoUEe.js → axapta-DR_HV06c.js} +1 -1
  127. package/dist/ui/assets/{bash-D6JH6L3m.js → bash-dxvpXEou.js} +1 -1
  128. package/dist/ui/assets/{basic-ka6JXc9C.js → basic-Dw-3a82q.js} +1 -1
  129. package/dist/ui/assets/{blockDiagram-677ZJIJ3-BHXRSjnM.js → blockDiagram-677ZJIJ3-CMXz5JvW.js} +1 -1
  130. package/dist/ui/assets/{bnf-Bxclk5tZ.js → bnf-5ey_2QkR.js} +1 -1
  131. package/dist/ui/assets/{brainfuck--s_Fd8b9.js → brainfuck-CbRmZUzR.js} +1 -1
  132. package/dist/ui/assets/{coq-CVLui3m8.js → c-DUcxiMx7.js} +1 -1
  133. package/dist/ui/assets/{c-like-CNkOkbqh.js → c-like-D9kw6QEo.js} +1 -1
  134. package/dist/ui/assets/{c4Diagram-LMCZKHZV-Bp1uSrW8.js → c4Diagram-LMCZKHZV-DU4C988i.js} +1 -1
  135. package/dist/ui/assets/{cal-LVlIOy9W.js → cal-BXDKT54m.js} +1 -1
  136. package/dist/ui/assets/{capnproto-r9DiQ1H8.js → capnproto-DXByvzkB.js} +1 -1
  137. package/dist/ui/assets/{ceylon-CTNzyZJX.js → ceylon-CNMAc9bK.js} +1 -1
  138. package/dist/ui/assets/channel-limbQkil.js +1 -0
  139. package/dist/ui/assets/{chunk-2Q5K7J3B-nnLVtUW3.js → chunk-2Q5K7J3B-Cm-SVU-u.js} +1 -1
  140. package/dist/ui/assets/{chunk-32BRIVSS-BDNS6igp.js → chunk-32BRIVSS-oz0KK3YS.js} +1 -1
  141. package/dist/ui/assets/{chunk-5VM5RSS4-D713xBhI.js → chunk-5VM5RSS4-CbHdtlYp.js} +1 -1
  142. package/dist/ui/assets/{chunk-EX3LRPZG-DExsU6Rd.js → chunk-EX3LRPZG-DhhuYakR.js} +1 -1
  143. package/dist/ui/assets/{chunk-JWPE2WC7-DcpW5RnW.js → chunk-JWPE2WC7-CYkjHxPj.js} +1 -1
  144. package/dist/ui/assets/{chunk-MOJQB5TN-BQiSZNTn.js → chunk-MOJQB5TN-gO40CNAh.js} +1 -1
  145. package/dist/ui/assets/{chunk-RYQCIY6F-DfblgZPd.js → chunk-RYQCIY6F-CKedXT_Q.js} +1 -1
  146. package/dist/ui/assets/{chunk-V7JOEXUC-np--VgmN.js → chunk-V7JOEXUC-C_6jfVpf.js} +1 -1
  147. package/dist/ui/assets/{chunk-VR4S4FIN-BG0IhjO6.js → chunk-VR4S4FIN-C8NVa2Dp.js} +1 -1
  148. package/dist/ui/assets/{chunk-XXDRQBXY-DHuoh-RB.js → chunk-XXDRQBXY-DCaDk-GY.js} +1 -1
  149. package/dist/ui/assets/classDiagram-OUVF2IWQ--Q3UeFsZ.js +1 -0
  150. package/dist/ui/assets/classDiagram-v2-EOCWNBFH--Q3UeFsZ.js +1 -0
  151. package/dist/ui/assets/{clean-CtVj0-EB.js → clean-Cno2Iol9.js} +1 -1
  152. package/dist/ui/assets/{clojure-CZwle60-.js → clojure-CJo86K2y.js} +1 -1
  153. package/dist/ui/assets/{clojure-repl-DJXWH00I.js → clojure-repl-BDUy3x0z.js} +1 -1
  154. package/dist/ui/assets/{cmake-Boxf0e7r.js → cmake-C3lBpnMa.js} +1 -1
  155. package/dist/ui/assets/{coffeescript-h85ZW4Gm.js → coffeescript-D6Gc1Iic.js} +1 -1
  156. package/dist/ui/assets/{c-BsgdDna0.js → coq-DK5Qpymm.js} +1 -1
  157. package/dist/ui/assets/{cos-CL0igafw.js → cos-C9vhICZi.js} +1 -1
  158. package/dist/ui/assets/{cose-bilkent-JH36ORCC-CnXyotYB.js → cose-bilkent-JH36ORCC-BsX7zIIX.js} +1 -1
  159. package/dist/ui/assets/{cpp-vite1NvJ.js → cpp-B2THrLw2.js} +1 -1
  160. package/dist/ui/assets/{crmsh-DqT9g0Iq.js → crmsh-Cidhwnbv.js} +1 -1
  161. package/dist/ui/assets/{crystal-Oans-K8G.js → crystal-D4UzipzS.js} +1 -1
  162. package/dist/ui/assets/{csharp-sCaDAzIB.js → csharp-sHzRBXom.js} +1 -1
  163. package/dist/ui/assets/{csp-rMcp93pK.js → csp-RR_2otDZ.js} +1 -1
  164. package/dist/ui/assets/{css-BwDLHi_h.js → css-CwufTY20.js} +1 -1
  165. package/dist/ui/assets/{cynefin-VYW2F7L2-D8Bmecdd.js → cynefin-VYW2F7L2-BdPPij9L.js} +1 -1
  166. package/dist/ui/assets/{cynefinDiagram-TSTJHNR4-BT2YFmPZ.js → cynefinDiagram-TSTJHNR4-Y8HasE5a.js} +1 -1
  167. package/dist/ui/assets/{d-BFgZm0RV.js → d-DeXSSL8w.js} +1 -1
  168. package/dist/ui/assets/{dagre-VKFMJZFB-BeJU73ex.js → dagre-VKFMJZFB-B_nm4MgH.js} +1 -1
  169. package/dist/ui/assets/{dart-rIo85iL3.js → dart-DhBp0MgA.js} +1 -1
  170. package/dist/ui/assets/{delphi-Bi2Rfp1o.js → delphi-B5k-wYBj.js} +1 -1
  171. package/dist/ui/assets/{diagram-FQU43EPY-CHQiS5Fr.js → diagram-FQU43EPY-CgBlXe2t.js} +1 -1
  172. package/dist/ui/assets/{diagram-G47NLZAW-EVerd4V8.js → diagram-G47NLZAW-BebzwVx5.js} +1 -1
  173. package/dist/ui/assets/{diagram-NH7WQ7WH-DMP0VOAs.js → diagram-NH7WQ7WH-DzWivpuq.js} +1 -1
  174. package/dist/ui/assets/{diagram-OA4YK3LP-CAur5jK9.js → diagram-OA4YK3LP-Cb_lMSnX.js} +1 -1
  175. package/dist/ui/assets/{diagram-WEI45ONY-DvmKkPH7.js → diagram-WEI45ONY-C_Y9GQ0N.js} +1 -1
  176. package/dist/ui/assets/{diff-CZZCIG00.js → diff-COhluegM.js} +1 -1
  177. package/dist/ui/assets/{django-D88PKHy-.js → django-C7XlHtBx.js} +1 -1
  178. package/dist/ui/assets/{dns-DX4hzjUh.js → dns-wjwUM-Uq.js} +1 -1
  179. package/dist/ui/assets/{dockerfile-1lgzEXn1.js → dockerfile-Bc-WqdkT.js} +1 -1
  180. package/dist/ui/assets/{dos-CwrC1ROy.js → dos-mEp9A4Hm.js} +1 -1
  181. package/dist/ui/assets/{dsconfig-tvVdBv4w.js → dsconfig-Dgs83FGD.js} +1 -1
  182. package/dist/ui/assets/{dts-DTgQkdRs.js → dts-C3Ds2O26.js} +1 -1
  183. package/dist/ui/assets/{dust-BbLlyCpf.js → dust-CyQO5OHb.js} +1 -1
  184. package/dist/ui/assets/{ebnf-D6Dc4oRr.js → ebnf-CNogRDO4.js} +1 -1
  185. package/dist/ui/assets/{ebnfDiagram-CCIWWBDH-Kvilk1RF.js → ebnfDiagram-CCIWWBDH-ZlE-AFZT.js} +1 -1
  186. package/dist/ui/assets/{elixir-CnMolQVs.js → elixir-3SLljiDu.js} +1 -1
  187. package/dist/ui/assets/{elm-BQ7VQFn7.js → elm-BPBZeCUB.js} +1 -1
  188. package/dist/ui/assets/{erDiagram-Q63AITRT-C-S9oHZd.js → erDiagram-Q63AITRT-CXuGvWcB.js} +1 -1
  189. package/dist/ui/assets/{erb-B_1g6fXE.js → erb-DqbIyjtE.js} +1 -1
  190. package/dist/ui/assets/{erlang-repl-Cy6Z3TdH.js → erlang-repl-e_6K45XY.js} +1 -1
  191. package/dist/ui/assets/{erlang-3b3ITXJu.js → erlang-y0z0xXo_.js} +1 -1
  192. package/dist/ui/assets/{excel-DtkATto8.js → excel-RwNCmSYM.js} +1 -1
  193. package/dist/ui/assets/{fix-DsEG7TDI.js → fix-DNXnlXQP.js} +1 -1
  194. package/dist/ui/assets/{flix-CQ-rKwGO.js → flix-rdcWVVc-.js} +1 -1
  195. package/dist/ui/assets/{flowDiagram-23GEKE2U-EbHDNMCC.js → flowDiagram-23GEKE2U-BuKpfhyd.js} +1 -1
  196. package/dist/ui/assets/{fortran-AqzaRCEt.js → fortran-CjB2gctQ.js} +1 -1
  197. package/dist/ui/assets/{fsharp-CCzWGasu.js → fsharp-DPGDnrod.js} +1 -1
  198. package/dist/ui/assets/{gams-Bqa6CB_r.js → gams-d97ChOge.js} +1 -1
  199. package/dist/ui/assets/{ganttDiagram-NO4QXBWP-B6jvc6O7.js → ganttDiagram-NO4QXBWP-CThfmoNX.js} +1 -1
  200. package/dist/ui/assets/{gauss-D4Utubeh.js → gauss-Ckbq9pov.js} +1 -1
  201. package/dist/ui/assets/{gcode-By3KwWjb.js → gcode-C8rxWIBi.js} +1 -1
  202. package/dist/ui/assets/{gherkin-PXOPjT7Y.js → gherkin-Cb88ENJ2.js} +1 -1
  203. package/dist/ui/assets/{gitGraphDiagram-IHSO6WYX-C5l6rHvK.js → gitGraphDiagram-IHSO6WYX-Ch4mA1xX.js} +1 -1
  204. package/dist/ui/assets/{glsl-KmmyBk93.js → glsl-D75QPnvr.js} +1 -1
  205. package/dist/ui/assets/{gml-C1Qw_Nrt.js → gml-BYM-XcrL.js} +1 -1
  206. package/dist/ui/assets/{go-DaBQtdp1.js → go-C0q3a0K-.js} +1 -1
  207. package/dist/ui/assets/{golo-D7PDzNpb.js → golo-BN-kAS6i.js} +1 -1
  208. package/dist/ui/assets/{gradle-nXueCYH-.js → gradle-CsmhRGnx.js} +1 -1
  209. package/dist/ui/assets/{groovy-DFDsQDhl.js → groovy-CVvlYgLe.js} +1 -1
  210. package/dist/ui/assets/{haml-B_zxHzy_.js → haml-BZ1z9lT4.js} +1 -1
  211. package/dist/ui/assets/{handlebars-BdMY-8KA.js → handlebars-ByoXIUsU.js} +1 -1
  212. package/dist/ui/assets/{haskell-CftsIPps.js → haskell-bKtVloMo.js} +1 -1
  213. package/dist/ui/assets/{haxe-BFZb0OIE.js → haxe-7YhuN0qz.js} +1 -1
  214. package/dist/ui/assets/{hsp-EPTuqwtZ.js → hsp-Bgvcm6F3.js} +1 -1
  215. package/dist/ui/assets/{htmlbars-B7ZSC-iN.js → htmlbars-BpuFL8Dv.js} +1 -1
  216. package/dist/ui/assets/{http-BxSd_aa1.js → http-BdkFJc_6.js} +1 -1
  217. package/dist/ui/assets/{hy-D-rBN9MQ.js → hy-fLVT9AqM.js} +1 -1
  218. package/dist/ui/assets/{index-Dlp8uGHu.js → index-DfWIGcNl.js} +3 -3
  219. package/dist/ui/assets/index-DpS8gUTx.css +10 -0
  220. package/dist/ui/assets/{index-DSGZBcd1.js → index-Dsue7VlR.js} +302 -352
  221. package/dist/ui/assets/{infoDiagram-FWYZ7A6U-BOF_kBqe.js → infoDiagram-FWYZ7A6U-DBgU6pXz.js} +1 -1
  222. package/dist/ui/assets/{inform7-OjpbRXZf.js → inform7-CiZzJ9ba.js} +1 -1
  223. package/dist/ui/assets/{ini-Dc-QApXQ.js → ini-Cnt_l57a.js} +1 -1
  224. package/dist/ui/assets/{irpf90-C4OfYiST.js → irpf90-tpOLGqpx.js} +1 -1
  225. package/dist/ui/assets/{isbl-9km6K6Sf.js → isbl-CP9CH5cc.js} +1 -1
  226. package/dist/ui/assets/{ishikawaDiagram-FXEZZL3T-BvKSD8LY.js → ishikawaDiagram-FXEZZL3T-Cq-UEF7t.js} +1 -1
  227. package/dist/ui/assets/{java-C2mOf3QX.js → java-kyhtR5gA.js} +1 -1
  228. package/dist/ui/assets/{javascript-_i0Q5MkQ.js → javascript-Dt9hxK6y.js} +1 -1
  229. package/dist/ui/assets/{jboss-cli-BS5ipQOv.js → jboss-cli-BJZewHIt.js} +1 -1
  230. package/dist/ui/assets/{journeyDiagram-5HDEW3XC-yKdSl63P.js → journeyDiagram-5HDEW3XC-iLTD7hUv.js} +1 -1
  231. package/dist/ui/assets/{json-Dci0MO4x.js → json-B784rDGN.js} +1 -1
  232. package/dist/ui/assets/{julia-bEqo4nlV.js → julia-BBZWRf_K.js} +1 -1
  233. package/dist/ui/assets/{julia-repl-Co6hf47q.js → julia-repl-ChQ_anXf.js} +1 -1
  234. package/dist/ui/assets/{kanban-definition-HUTT4EX6-B7BbZCd6.js → kanban-definition-HUTT4EX6-DnmU4pyp.js} +1 -1
  235. package/dist/ui/assets/{kotlin-krx8WewB.js → kotlin-Ca3cQqj9.js} +1 -1
  236. package/dist/ui/assets/{lasso-d3ZTv9Tj.js → lasso-68xMTGCI.js} +1 -1
  237. package/dist/ui/assets/{latex-BNWbHYxK.js → latex-BJAvHrS-.js} +1 -1
  238. package/dist/ui/assets/{ldif-Bs8eb63L.js → ldif-BozIkxE8.js} +1 -1
  239. package/dist/ui/assets/{leaf-BTbRDVWB.js → leaf-DeAYBX7h.js} +1 -1
  240. package/dist/ui/assets/{less-DH5cqJTD.js → less-Bc0jcew8.js} +1 -1
  241. package/dist/ui/assets/{lisp-CBUvBYtR.js → lisp-ffZdTilE.js} +1 -1
  242. package/dist/ui/assets/{livecodeserver-CkM7-E4a.js → livecodeserver-DKyXE2lg.js} +1 -1
  243. package/dist/ui/assets/{livescript-DomXyXUO.js → livescript-CeVSdP5j.js} +1 -1
  244. package/dist/ui/assets/{llvm-e_-ff59-.js → llvm-CA19rs9e.js} +1 -1
  245. package/dist/ui/assets/{lsl-BNDsGOmv.js → lsl-De1V90GL.js} +1 -1
  246. package/dist/ui/assets/{lua-_ZmkXwc_.js → lua-Ckc_sOAg.js} +1 -1
  247. package/dist/ui/assets/{makefile-BhG7cThe.js → makefile-BlkvlESW.js} +1 -1
  248. package/dist/ui/assets/{markdown-ClW2SRy6.js → markdown-BsHfdULh.js} +1 -1
  249. package/dist/ui/assets/{mathematica-kqoCR611.js → mathematica-BdVzKfdF.js} +1 -1
  250. package/dist/ui/assets/{matlab-DqawyK3q.js → matlab-BE1b3EYS.js} +1 -1
  251. package/dist/ui/assets/{maxima-B0qzCXe1.js → maxima-C7hoTDGn.js} +1 -1
  252. package/dist/ui/assets/{mel-BZaSas3B.js → mel-DNZ4AX0h.js} +1 -1
  253. package/dist/ui/assets/{mercury-ByD0wyJH.js → mercury-DnbIrIOF.js} +1 -1
  254. package/dist/ui/assets/{mindmap-definition-LN4V7U3C-Ce6QsaH5.js → mindmap-definition-LN4V7U3C-Df0J4YS6.js} +1 -1
  255. package/dist/ui/assets/{mipsasm-B08lqZSo.js → mipsasm-vRzAjdOa.js} +1 -1
  256. package/dist/ui/assets/{mizar-7iaUqWPq.js → mizar-_COCUpjs.js} +1 -1
  257. package/dist/ui/assets/{mojolicious-CbH-d8Wh.js → mojolicious-BXSqEUhN.js} +1 -1
  258. package/dist/ui/assets/{monkey-D5z6-hFH.js → monkey-DdaFErmE.js} +1 -1
  259. package/dist/ui/assets/{moonscript-DuLd7pdm.js → moonscript-ylkEnmhz.js} +1 -1
  260. package/dist/ui/assets/{n1ql-EbVfQMfD.js → n1ql-CmU80AjO.js} +1 -1
  261. package/dist/ui/assets/{nginx-D-4AxpHP.js → nginx-Xq7ZP4_a.js} +1 -1
  262. package/dist/ui/assets/{nim-wPHQEX5v.js → nim-9UGxbeVX.js} +1 -1
  263. package/dist/ui/assets/{nix-6SVkxAXi.js → nix-DF4g-5JC.js} +1 -1
  264. package/dist/ui/assets/{node-repl-CaFKEOyj.js → node-repl-Cuy9El0l.js} +1 -1
  265. package/dist/ui/assets/{nsis-BmqbwVv_.js → nsis-O_u_AJ8R.js} +1 -1
  266. package/dist/ui/assets/{objectivec-BX0R-sI2.js → objectivec-CGRDK5jQ.js} +1 -1
  267. package/dist/ui/assets/{ocaml-CyfdrIqo.js → ocaml-CbQcAD-R.js} +1 -1
  268. package/dist/ui/assets/{openscad-B5qfaF1E.js → openscad-DT2CMIqE.js} +1 -1
  269. package/dist/ui/assets/{oxygene-CmlCgXLr.js → oxygene-B9Ei-fnj.js} +1 -1
  270. package/dist/ui/assets/{parser3-DdpPyZkn.js → parser3-CuVObcEZ.js} +1 -1
  271. package/dist/ui/assets/{pegDiagram-2B236MQR-ByyVqaXh.js → pegDiagram-2B236MQR-k8i-gID4.js} +1 -1
  272. package/dist/ui/assets/{perl-D3qc2wEe.js → perl-dVGJ8bE1.js} +1 -1
  273. package/dist/ui/assets/{pf-Bv3zza37.js → pf-X2PQAhR-.js} +1 -1
  274. package/dist/ui/assets/{pgsql-BZIppw1a.js → pgsql-DVzCzD92.js} +1 -1
  275. package/dist/ui/assets/{php-D1ScecZC.js → php-DocTOgNe.js} +1 -1
  276. package/dist/ui/assets/{php-template-sEqzzKWJ.js → php-template-dP8srdEx.js} +1 -1
  277. package/dist/ui/assets/{pieDiagram-ENE6RG2P-T1OgWN3l.js → pieDiagram-ENE6RG2P-C76s3Fdz.js} +1 -1
  278. package/dist/ui/assets/{plaintext-DO7Jy_T2.js → plaintext-vjpxtrpz.js} +1 -1
  279. package/dist/ui/assets/{pony-CTXTp2Tb.js → pony-z-bq7AaS.js} +1 -1
  280. package/dist/ui/assets/{powershell-C9lzZsbj.js → powershell-DW0_Tsne.js} +1 -1
  281. package/dist/ui/assets/{processing-hzJAP_Li.js → processing-bDmnj3oy.js} +1 -1
  282. package/dist/ui/assets/{profile-bFiAkh7e.js → profile-DJ-L-V1f.js} +1 -1
  283. package/dist/ui/assets/{prolog-CE0trHSn.js → prolog-InNU9tFQ.js} +1 -1
  284. package/dist/ui/assets/{properties-MeANnTVc.js → properties-EkF7cZTJ.js} +1 -1
  285. package/dist/ui/assets/{protobuf-S-rp7SK0.js → protobuf-BBRUbDYu.js} +1 -1
  286. package/dist/ui/assets/{puppet-B5YT8Ct1.js → puppet-fnCmZBIC.js} +1 -1
  287. package/dist/ui/assets/{purebasic-DO-5HeDl.js → purebasic-CgWDuH3f.js} +1 -1
  288. package/dist/ui/assets/{python-DVGTQbwU.js → python-CYT42SmK.js} +1 -1
  289. package/dist/ui/assets/{python-repl-CQ4VlKLC.js → python-repl-Wc3MvYdm.js} +1 -1
  290. package/dist/ui/assets/{q-nS96imov.js → q-C0agAWLY.js} +1 -1
  291. package/dist/ui/assets/{qml-BkzkCgUU.js → qml-BiFendDb.js} +1 -1
  292. package/dist/ui/assets/{quadrantDiagram-ABIIQ3AL-BkaCzlXD.js → quadrantDiagram-ABIIQ3AL-B0fDeX13.js} +1 -1
  293. package/dist/ui/assets/{r-y4Q5t85r.js → r-CcAL_gsb.js} +1 -1
  294. package/dist/ui/assets/{railroadDiagram-RFXS5EU6-C1lbwk19.js → railroadDiagram-RFXS5EU6-DOciFfD8.js} +1 -1
  295. package/dist/ui/assets/{reasonml-Bzhzc5Ao.js → reasonml-DnTQ-jkN.js} +1 -1
  296. package/dist/ui/assets/{requirementDiagram-TGXJPOKE-C8Rw6N2I.js → requirementDiagram-TGXJPOKE-BhpERBEw.js} +1 -1
  297. package/dist/ui/assets/{rib-BP3Y9dW3.js → rib-DRQBJUku.js} +1 -1
  298. package/dist/ui/assets/{roboconf-87QE7cIh.js → roboconf-Dt4hxDSc.js} +1 -1
  299. package/dist/ui/assets/{routeros-BV3nt8wW.js → routeros-DrysyAvp.js} +1 -1
  300. package/dist/ui/assets/{rsl-DfQf4CW_.js → rsl-BhobC4bl.js} +1 -1
  301. package/dist/ui/assets/{ruby-DQxFKbgX.js → ruby-B0gNTjSn.js} +1 -1
  302. package/dist/ui/assets/{ruleslanguage-B8oCm_aw.js → ruleslanguage-BJHWtkQf.js} +1 -1
  303. package/dist/ui/assets/{rust-DzZgPf9W.js → rust-bxFjTZl9.js} +1 -1
  304. package/dist/ui/assets/{sankeyDiagram-HTMAVEWB-Dxiuo8Hz.js → sankeyDiagram-HTMAVEWB-BJGvRvK8.js} +1 -1
  305. package/dist/ui/assets/{sas-CFh-Rsrv.js → sas-C1h9GlCk.js} +1 -1
  306. package/dist/ui/assets/{scala-3UDyJBiS.js → scala-GaqOsYzZ.js} +1 -1
  307. package/dist/ui/assets/{scheme-KaUTge9W.js → scheme-BgOgLp78.js} +1 -1
  308. package/dist/ui/assets/{scilab-CLSBZzuh.js → scilab-Dn2TX-KQ.js} +1 -1
  309. package/dist/ui/assets/{scss-DaEkfHWX.js → scss-CCOm-PWq.js} +1 -1
  310. package/dist/ui/assets/{sequenceDiagram-DBY2YBRQ-Cv__zR2v.js → sequenceDiagram-DBY2YBRQ-69vZi4Ut.js} +1 -1
  311. package/dist/ui/assets/{shell-B0d4cZTk.js → shell-C3U6YWrg.js} +1 -1
  312. package/dist/ui/assets/{sizeCapture-X5ZJPWSS-C4nD-ShQ.js → sizeCapture-X5ZJPWSS-D27KIrz7.js} +1 -1
  313. package/dist/ui/assets/{smali-CLhfky4R.js → smali-CvsTVdr_.js} +1 -1
  314. package/dist/ui/assets/{smalltalk-B4aaTMO5.js → smalltalk-kAQkohW_.js} +1 -1
  315. package/dist/ui/assets/{sml-x4CTxWEZ.js → sml-ve8o4sD9.js} +1 -1
  316. package/dist/ui/assets/{sqf-G_0vdVVs.js → sqf-BEX8EUHQ.js} +1 -1
  317. package/dist/ui/assets/{sql-C--WH0Fo.js → sql-BnvvIWzM.js} +1 -1
  318. package/dist/ui/assets/{sql_more-B4LrzCtd.js → sql_more-BiYWeUQi.js} +1 -1
  319. package/dist/ui/assets/{stan-CACDFOA0.js → stan-CL8TzbqV.js} +1 -1
  320. package/dist/ui/assets/{stata-BP9M7sZt.js → stata-9Ttgn33g.js} +1 -1
  321. package/dist/ui/assets/{stateDiagram-2N3HPSRC-z3-31Cr2.js → stateDiagram-2N3HPSRC-DUQdHUod.js} +1 -1
  322. package/dist/ui/assets/stateDiagram-v2-6OUMAXLB-DahROKNQ.js +1 -0
  323. package/dist/ui/assets/{step21-MAOu4dNb.js → step21-LuiZBROI.js} +1 -1
  324. package/dist/ui/assets/{stylus-CpuP3pvE.js → stylus-DMxCDGKP.js} +1 -1
  325. package/dist/ui/assets/{subunit-NWzuqFhT.js → subunit-BqTiWQgg.js} +1 -1
  326. package/dist/ui/assets/{swift-DuFKNmKv.js → swift-Vgcl7epB.js} +1 -1
  327. package/dist/ui/assets/{swimlanes-5IMT3BWC-E463-rXd.js → swimlanes-5IMT3BWC-BYUDE9bR.js} +2 -2
  328. package/dist/ui/assets/swimlanesDiagram-G3AALYLV-B5Lf8M0k.js +8 -0
  329. package/dist/ui/assets/{taggerscript-BDnv2jvg.js → taggerscript-CQct0uSB.js} +1 -1
  330. package/dist/ui/assets/{tap-aB2cLXdf.js → tap-C3D-iaMR.js} +1 -1
  331. package/dist/ui/assets/{tcl-7WepIaIa.js → tcl-pAGWRV8F.js} +1 -1
  332. package/dist/ui/assets/{thrift-BLh6pdjc.js → thrift-BMf3WY_-.js} +1 -1
  333. package/dist/ui/assets/{timeline-definition-FHXFAJF6-FA_RNhFQ.js → timeline-definition-FHXFAJF6-CUxhbtkg.js} +1 -1
  334. package/dist/ui/assets/{tp-D1rt5u_j.js → tp-CWlQ8HXb.js} +1 -1
  335. package/dist/ui/assets/{twig-DgfeYg4W.js → twig-D49EnTd7.js} +1 -1
  336. package/dist/ui/assets/{typescript-oU560Q8V.js → typescript-O1NhTsg4.js} +1 -1
  337. package/dist/ui/assets/{vala-DlXsaz2B.js → vala-ChgJAi6T.js} +1 -1
  338. package/dist/ui/assets/{vbnet-BjpxjeMZ.js → vbnet-DoMTvpOU.js} +1 -1
  339. package/dist/ui/assets/{vbscript-DfNdtdO3.js → vbscript-COqQ-XLI.js} +1 -1
  340. package/dist/ui/assets/{vbscript-html-D09WPsgK.js → vbscript-html-C6hlND5y.js} +1 -1
  341. package/dist/ui/assets/{vennDiagram-L72KCM5P-zaCDWwTs.js → vennDiagram-L72KCM5P-zdR45Fxo.js} +1 -1
  342. package/dist/ui/assets/{verilog-B9vENtLK.js → verilog-D_vJtQo2.js} +1 -1
  343. package/dist/ui/assets/{vhdl-CJLTZOu1.js → vhdl-P1OS5AdC.js} +1 -1
  344. package/dist/ui/assets/{vim-FuPhupu9.js → vim-Dta1cE1i.js} +1 -1
  345. package/dist/ui/assets/{wardleyDiagram-EHGQE667-BS8ApwmV.js → wardleyDiagram-EHGQE667-DGVhZURT.js} +1 -1
  346. package/dist/ui/assets/{x86asm-kX_Cp6wB.js → x86asm-0uxjBhIR.js} +1 -1
  347. package/dist/ui/assets/{xl-MuHNmLUj.js → xl-A4qrusE8.js} +1 -1
  348. package/dist/ui/assets/{xml-Mbn2z12n.js → xml-BWIS8Du3.js} +1 -1
  349. package/dist/ui/assets/{xquery-Dy4lt-m-.js → xquery-DteVIK7u.js} +1 -1
  350. package/dist/ui/assets/{xychartDiagram-FW5EYKEG-DoNZtZus.js → xychartDiagram-FW5EYKEG-Bi0bMVkV.js} +1 -1
  351. package/dist/ui/assets/{yaml-CxxAisfE.js → yaml-Sfd5lnBk.js} +1 -1
  352. package/dist/ui/assets/{zephir-WWG8qyld.js → zephir-DN0VT2-6.js} +1 -1
  353. package/dist/ui/index.html +2 -2
  354. package/dist/utils/__tests__/knowledge-store.test.d.ts +1 -0
  355. package/dist/utils/__tests__/knowledge-store.test.js +53 -0
  356. package/dist/utils/knowledge-store.d.ts +29 -0
  357. package/dist/utils/knowledge-store.js +144 -0
  358. package/dist/utils/pi-browser-tools.d.ts +10 -0
  359. package/dist/utils/pi-browser-tools.js +246 -0
  360. package/dist/utils/pi-runtime.d.ts +8 -0
  361. package/dist/utils/pi-runtime.js +236 -0
  362. package/dist/utils/pi-sandbox-ops.d.ts +40 -0
  363. package/dist/utils/pi-sandbox-ops.js +205 -0
  364. package/package.json +4 -2
  365. package/dist/docs/assets/chunks/channel.Cc6zpfFP.js +0 -1
  366. package/dist/docs/assets/chunks/classDiagram-OUVF2IWQ.DV5B4KLJ.js +0 -1
  367. package/dist/docs/assets/chunks/classDiagram-v2-EOCWNBFH.DV5B4KLJ.js +0 -1
  368. package/dist/docs/assets/chunks/stateDiagram-v2-6OUMAXLB.B9v-Vq5L.js +0 -1
  369. package/dist/docs/assets/chunks/swimlanesDiagram-G3AALYLV.Kb9LnCTH.js +0 -8
  370. package/dist/ui/assets/channel-_rFUXR2i.js +0 -1
  371. package/dist/ui/assets/classDiagram-OUVF2IWQ-DqgbMzM1.js +0 -1
  372. package/dist/ui/assets/classDiagram-v2-EOCWNBFH-DqgbMzM1.js +0 -1
  373. package/dist/ui/assets/index-CWFn1h-J.css +0 -10
  374. package/dist/ui/assets/stateDiagram-v2-6OUMAXLB-BKIXFHzO.js +0 -1
  375. package/dist/ui/assets/swimlanesDiagram-G3AALYLV-CkQvBOYs.js +0 -8
@@ -0,0 +1,14 @@
1
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
2
+ import { loadConfig } from '../config/index.js';
3
+ import { configureDbPath, initDatabase } from '../utils/db.js';
4
+ import { createMcpServer } from './index.js';
5
+ export async function runMcpServer() {
6
+ const config = await loadConfig();
7
+ if (config.storage?.path) {
8
+ configureDbPath(config.storage.path);
9
+ }
10
+ initDatabase();
11
+ const server = createMcpServer(config);
12
+ const transport = new StdioServerTransport();
13
+ await server.connect(transport);
14
+ }
@@ -0,0 +1,11 @@
1
+ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
2
+ import type { AppConfig } from '../config/schema.js';
3
+ export interface McpToolContext {
4
+ config: AppConfig;
5
+ }
6
+ export declare const MCP_TOOLS: {
7
+ name: string;
8
+ description: string;
9
+ inputSchema: Record<string, unknown>;
10
+ }[];
11
+ export declare function registerMcpTools(server: Server, ctx: McpToolContext): void;
@@ -0,0 +1,219 @@
1
+ import fs from 'fs';
2
+ import { CallToolRequestSchema } from '@modelcontextprotocol/sdk/types.js';
3
+ import { getDatabase } from '../utils/db.js';
4
+ import { listRequestDB } from '../utils/request-writer.js';
5
+ import { listProviders } from '../utils/providers-db.js';
6
+ import { knowledgeStore } from '../utils/knowledge-store.js';
7
+ function ok(text) {
8
+ return { content: [{ type: 'text', text }] };
9
+ }
10
+ function err(e) {
11
+ const msg = e instanceof Error ? e.message : String(e);
12
+ return { content: [{ type: 'text', text: `error: ${msg}` }] };
13
+ }
14
+ // --- Tool implementations ---
15
+ async function handleGetStatus(_args, ctx) {
16
+ const db = getDatabase();
17
+ const lastRow = db.prepare('SELECT MAX(timestamp) AS ts FROM requests').get();
18
+ const countRow = db.prepare('SELECT COUNT(*) AS n FROM requests').get();
19
+ let defaultProvider = null;
20
+ try {
21
+ const providers = listProviders(db);
22
+ const def = providers.find(p => p.default);
23
+ if (def) {
24
+ defaultProvider = { name: def.name, model: def.model, base_url: def.base_url };
25
+ }
26
+ }
27
+ catch {
28
+ // providers table may not exist on a fresh DB
29
+ }
30
+ return ok(JSON.stringify({
31
+ server: `${ctx.config.server.host}:${ctx.config.server.port}`,
32
+ proxyTarget: ctx.config.proxy.target,
33
+ defaultProvider,
34
+ lastRequestTimestamp: lastRow.ts,
35
+ requestCount: countRow.n,
36
+ }, null, 2));
37
+ }
38
+ async function handleListRequests(args) {
39
+ const limit = typeof args?.limit === 'number' && args.limit > 0 ? Math.min(args.limit, 200) : 20;
40
+ const before = typeof args?.before === 'string' ? args.before : undefined;
41
+ const { requests, hasMore } = await listRequestDB(limit, before);
42
+ const slim = requests.map(r => ({
43
+ requestId: r.requestId,
44
+ timestamp: r.timestamp,
45
+ path: r.path,
46
+ statusCode: r.statusCode,
47
+ responseTime: r.responseTime,
48
+ model: r.model,
49
+ usage: r.usage,
50
+ }));
51
+ return ok(JSON.stringify({ requests: slim, hasMore }, null, 2));
52
+ }
53
+ async function handleGetTokenStats(args) {
54
+ const hours = typeof args?.since_hours === 'number' && args.since_hours > 0 ? args.since_hours : 24;
55
+ const db = getDatabase();
56
+ const where = "timestamp >= datetime('now', ?)";
57
+ const param = `-${hours} hours`;
58
+ const totals = db.prepare(`
59
+ SELECT
60
+ COUNT(*) AS count,
61
+ COALESCE(SUM(input_tokens), 0) AS input_tokens,
62
+ COALESCE(SUM(output_tokens), 0) AS output_tokens,
63
+ COALESCE(SUM(cache_read_tokens), 0) AS cache_read_tokens,
64
+ COALESCE(SUM(cache_creation_tokens), 0) AS cache_creation_tokens
65
+ FROM requests
66
+ WHERE ${where}
67
+ `).get(param);
68
+ const byModel = db.prepare(`
69
+ SELECT COALESCE(model, '(null)') AS model, COUNT(*) AS count
70
+ FROM requests
71
+ WHERE ${where}
72
+ GROUP BY model
73
+ ORDER BY count DESC
74
+ `).all(param);
75
+ return ok(JSON.stringify({
76
+ sinceHours: hours,
77
+ ...totals,
78
+ byModel,
79
+ }, null, 2));
80
+ }
81
+ async function handleGetLogs(args, ctx) {
82
+ const lines = typeof args?.lines === 'number' && args.lines > 0 ? Math.min(args.lines, 500) : 50;
83
+ const file = ctx.config.logging?.file;
84
+ if (!file)
85
+ return ok('(no logging.file configured)');
86
+ if (!fs.existsSync(file))
87
+ return ok(`(log file not found: ${file})`);
88
+ const content = fs.readFileSync(file, 'utf-8');
89
+ const all = content.split('\n');
90
+ const tail = all.slice(-lines).join('\n');
91
+ return ok(tail);
92
+ }
93
+ // --- Tool registry: list metadata + dispatch ---
94
+ export const MCP_TOOLS = [
95
+ {
96
+ name: 'get_status',
97
+ description: 'Get cc-monitoring status: server/proxy config, default provider, latest request timestamp, total request count.',
98
+ inputSchema: {
99
+ type: 'object',
100
+ properties: {},
101
+ additionalProperties: false,
102
+ },
103
+ },
104
+ {
105
+ name: 'list_requests',
106
+ description: 'List recent proxy requests (summary view).',
107
+ inputSchema: {
108
+ type: 'object',
109
+ properties: {
110
+ limit: { type: 'number', description: 'Max requests to return (default 20, max 200).' },
111
+ before: { type: 'string', description: 'ISO timestamp cursor: return requests older than this.' },
112
+ },
113
+ additionalProperties: false,
114
+ },
115
+ },
116
+ {
117
+ name: 'get_token_stats',
118
+ description: 'Aggregate token usage for requests in the last N hours (sums + per-model counts).',
119
+ inputSchema: {
120
+ type: 'object',
121
+ properties: {
122
+ since_hours: { type: 'number', description: 'Lookback window in hours (default 24).' },
123
+ },
124
+ additionalProperties: false,
125
+ },
126
+ },
127
+ {
128
+ name: 'get_logs',
129
+ description: 'Return the last N lines of the cc-monitoring log file.',
130
+ inputSchema: {
131
+ type: 'object',
132
+ properties: {
133
+ lines: { type: 'number', description: 'Number of trailing lines (default 50, max 500).' },
134
+ },
135
+ additionalProperties: false,
136
+ },
137
+ },
138
+ {
139
+ name: 'list_topics',
140
+ description: 'List all knowledge topics with one-line summary. Call this first to discover what topics exist.',
141
+ inputSchema: { type: 'object', properties: {}, additionalProperties: false },
142
+ },
143
+ {
144
+ name: 'get_topic',
145
+ description: 'Get a topic metadata and its chunk list (descriptions only, no body). Call this to see which chunks exist in a topic before reading one.',
146
+ inputSchema: {
147
+ type: 'object',
148
+ properties: { topic: { type: 'string', description: 'Topic slug, e.g. react-hooks' } },
149
+ required: ['topic'],
150
+ additionalProperties: false,
151
+ },
152
+ },
153
+ {
154
+ name: 'search_chunks',
155
+ description: 'Keyword search across all chunks. Returns matching chunk list (no body). Use when topic is unknown.',
156
+ inputSchema: {
157
+ type: 'object',
158
+ properties: { query: { type: 'string', description: 'Search keyword' } },
159
+ required: ['query'],
160
+ additionalProperties: false,
161
+ },
162
+ },
163
+ {
164
+ name: 'read_chunk',
165
+ description: 'Read a single knowledge chunk body by topic and chunk id. ONLY one chunk per call. To discover chunk ids, call get_topic first.',
166
+ inputSchema: {
167
+ type: 'object',
168
+ properties: {
169
+ topic: { type: 'string', description: 'Topic slug' },
170
+ chunk_id: { type: 'string', description: 'Chunk id, e.g. chunk-001' },
171
+ },
172
+ required: ['topic', 'chunk_id'],
173
+ additionalProperties: false,
174
+ },
175
+ },
176
+ ];
177
+ const HANDLERS = {
178
+ get_status: handleGetStatus,
179
+ list_requests: handleListRequests,
180
+ get_token_stats: handleGetTokenStats,
181
+ get_logs: handleGetLogs,
182
+ list_topics: async () => ok(JSON.stringify(await knowledgeStore.listTopics(), null, 2)),
183
+ get_topic: async (args) => {
184
+ try {
185
+ return ok(JSON.stringify(await knowledgeStore.getTopic(args.topic), null, 2));
186
+ }
187
+ catch (e) {
188
+ const msg = e instanceof Error ? e.message : String(e);
189
+ if (msg.includes('ENOENT')) {
190
+ return ok(JSON.stringify({ error: `topic "${args.topic}" not found. Call list_topics to see available topics.` }, null, 2));
191
+ }
192
+ return err(e);
193
+ }
194
+ },
195
+ search_chunks: async (args) => ok(JSON.stringify(await knowledgeStore.searchChunks(args.query ?? ''), null, 2)),
196
+ read_chunk: async (args) => {
197
+ try {
198
+ const body = await knowledgeStore.readChunk(args.topic, args.chunk_id);
199
+ return ok(body);
200
+ }
201
+ catch (e) {
202
+ return err(e);
203
+ }
204
+ },
205
+ };
206
+ export function registerMcpTools(server, ctx) {
207
+ server.setRequestHandler(CallToolRequestSchema, async (req) => {
208
+ const name = req.params.name;
209
+ const handler = HANDLERS[name];
210
+ try {
211
+ if (!handler)
212
+ return { content: [{ type: 'text', text: `unknown tool: ${name}` }] };
213
+ return await handler(req.params.arguments ?? {}, ctx);
214
+ }
215
+ catch (e) {
216
+ return err(e);
217
+ }
218
+ });
219
+ }
@@ -1,9 +1,8 @@
1
1
  import multipart from '@fastify/multipart';
2
- import fs from 'fs';
3
2
  import path from 'path';
4
3
  import { registry } from '../parsers/index.js';
5
- import { dataDir } from '../utils/paths.js';
6
- const docsDir = path.join(dataDir, 'docs');
4
+ import { loadConfig } from '../config/index.js';
5
+ import { createPiSession } from '../utils/pi-runtime.js';
7
6
  export async function setupDocsRoutes(fastify) {
8
7
  await fastify.register(multipart, { limits: { fileSize: 10 * 1024 * 1024 } });
9
8
  fastify.post('/ui/api/docs/upload', async (request, reply) => {
@@ -41,23 +40,53 @@ export async function setupDocsRoutes(fastify) {
41
40
  error: err.message || 'File parsing failed'
42
41
  });
43
42
  }
44
- // 确保 docs 目录存在
45
- if (!fs.existsSync(docsDir)) {
46
- fs.mkdirSync(docsDir, { recursive: true });
43
+ // 不直接落盘根目录,而是交给 pi learn agent 切块入库
44
+ let config;
45
+ try {
46
+ config = await loadConfig();
47
+ }
48
+ catch (err) {
49
+ request.log.error({ err }, 'Failed to load config');
50
+ return reply.code(500).send({
51
+ success: false,
52
+ error: err?.message || 'Failed to load config'
53
+ });
54
+ }
55
+ const port = config.server.port;
56
+ const prompt = `以下是上传文档《${filename}》的完整内容。请按知识库规范处理:
57
+ 1. 调 list_topics 查重,决定新建主题还是复用现有
58
+ 2. 把文档内容按结构切成 300-500 字 chunks,写入 <主题>/chunks/chunk-NNN.md
59
+ 3. 更新该主题 INDEX.md(片段清单 + 元数据)
60
+ 4. 若新建主题,更新根 INDEX.md 的主题行
61
+
62
+ 文档内容:
63
+ ${mdContent}`;
64
+ let session;
65
+ try {
66
+ session = await createPiSession({ port, mode: 'learn' });
67
+ }
68
+ catch (err) {
69
+ request.log.error({ err }, 'Failed to create pi learn session');
70
+ return reply.code(500).send({
71
+ success: false,
72
+ error: err?.message || 'Failed to initialize pi runtime'
73
+ });
47
74
  }
48
- // 写入 md 文件
49
- const mdFilename = filename.slice(0, dotIndex) + '.md';
50
- const mdPath = path.join(docsDir, mdFilename);
51
75
  try {
52
- fs.writeFileSync(mdPath, mdContent, 'utf-8');
76
+ await Promise.race([
77
+ session.prompt(prompt),
78
+ new Promise((_, rej) => setTimeout(() => rej(new Error('Execution timeout (5 minutes)')), 5 * 60 * 1000)),
79
+ ]);
80
+ await session.waitForIdle();
53
81
  }
54
82
  catch (err) {
55
- request.log.error({ err, mdPath }, 'Failed to write md file');
83
+ await session.abort().catch(() => { });
84
+ request.log.error({ err, filename }, 'pi learn distill failed');
56
85
  return reply.code(500).send({
57
86
  success: false,
58
- error: 'Failed to save file'
87
+ error: err?.message || 'Failed to distill document into knowledge base'
59
88
  });
60
89
  }
61
- return { success: true, path: `docs/${mdFilename}` };
90
+ return { success: true, path: `docs/` };
62
91
  });
63
92
  }
@@ -2,7 +2,6 @@ import Fastify from 'fastify';
2
2
  import { loadConfig } from '../config/index.js';
3
3
  import { createLogger } from '../logger/index.js';
4
4
  import { configureDbPath } from '../utils/db.js';
5
- import { getCurrentModuleUrl } from '../utils/esm-dirname.js';
6
5
  import { setupProxy } from './proxy.js';
7
6
  import { setupUiRoutes } from './ui-route.js';
8
7
  import { setupChatRoute } from './chat-route.js';
@@ -39,7 +38,9 @@ export async function startServer() {
39
38
  // PM2 compatibility: PM2 fork mode sets process.argv[1] to ProcessContainerFork.js wrapper,
40
39
  // not the user script. Check PM2-specific env vars instead.
41
40
  const _isPm2 = process.env.pm_id !== undefined || process.env.NODE_APP_INSTANCE !== undefined;
42
- const _currentModuleUrl = getCurrentModuleUrl();
41
+ // 直接用本模块的 import.meta.url;getCurrentModuleUrl() 返回的是 util 模块自身的 URL,
42
+ // 不能用来判断"本文件是否被直接执行"(否则 guard 永远 false,dev 模式从不启动 server)
43
+ const _currentModuleUrl = import.meta.url;
43
44
  // For PM2: always start if PM2 env detected and this module is the configured script
44
45
  // For direct execution: check if this module is the main module
45
46
  import path from 'path';
@@ -1,14 +1,13 @@
1
1
  import staticPlugin from '@fastify/static';
2
2
  import path from 'path';
3
3
  import fs from 'fs';
4
- import { spawn } from 'child_process';
5
4
  import { WebSocketServer, WebSocket } from 'ws';
6
- import { randomUUID } from 'node:crypto';
7
5
  import { loadConfig, saveConfig } from '../config/index.js';
8
6
  import { getProcessStatus, startProcess, stopProcess, reloadProcess } from '../utils/pm2.js';
9
7
  import { getCallerDirname } from '../utils/esm-dirname.js';
10
8
  import { getConfigPath, getDisplayPath } from '../utils/paths.js';
11
- import { loadRequestDB, listRequestDB, sessionIdExists } from '../utils/request-writer.js';
9
+ import { loadRequestDB, listRequestDB } from '../utils/request-writer.js';
10
+ import { createPiSession } from '../utils/pi-runtime.js';
12
11
  import { statusHistory } from '../utils/status-history.js';
13
12
  import { addDataClient, removeDataClient, broadcastToDataClients, getDataClientCount } from './data-push.js';
14
13
  import { getVersionInfo } from '../utils/version.js';
@@ -222,7 +221,9 @@ export async function setupUiRoutes(fastify) {
222
221
  });
223
222
  }
224
223
  });
225
- // Exec endpoint: run claude -p <prompt>
224
+ // pi AgentSession 进程内注册表:key = sessionId(pi 自己生成)
225
+ const piSessions = new Map();
226
+ // Exec endpoint: 通过嵌入的 pi SDK 跑 prompt,保持原 SSE/JSON 契约
226
227
  fastify.post('/ui/api/exec', async (request, reply) => {
227
228
  if (!checkAuth(request, config)) {
228
229
  return reply.code(401).send({
@@ -230,140 +231,197 @@ export async function setupUiRoutes(fastify) {
230
231
  error: 'Unauthorized: missing or invalid Authorization header'
231
232
  });
232
233
  }
233
- const { tool, prompt, stream = false, sessionId } = request.body;
234
- if (tool !== 'claude') {
235
- return reply.code(400).send({
236
- success: false,
237
- error: 'Unsupported tool: only "claude" is supported'
238
- });
239
- }
234
+ const { prompt, stream = false, sessionId, mode } = request.body;
235
+ // mode 只认 'learn',其余一律按 chat 处理(默认只读问答)
236
+ const resolvedMode = mode === 'learn' ? 'learn' : 'chat';
240
237
  if (!prompt || typeof prompt !== 'string' || prompt.trim().length === 0) {
241
238
  return reply.code(400).send({
242
239
  success: false,
243
240
  error: 'prompt is required and must be a non-empty string'
244
241
  });
245
242
  }
243
+ const port = config.server.port;
244
+ // piSessions 按 `${mode}:${piSessionId}` 隔离:chat / learn 各自独立 session。
245
+ // 前端回传的 sessionId 不带 mode,先按 resolvedMode 精确查,找不到再按后缀兜底。
246
+ const sessionKey = (m, id) => `${m}:${id}`;
247
+ let existing;
248
+ if (sessionId) {
249
+ existing = piSessions.get(sessionKey(resolvedMode, sessionId));
250
+ if (!existing) {
251
+ // 兜底:mode 不一致或旧数据,按 `:${sessionId}` 后缀反查
252
+ for (const [key, s] of piSessions) {
253
+ if (key.endsWith(`:${sessionId}`)) {
254
+ existing = s;
255
+ break;
256
+ }
257
+ }
258
+ }
259
+ }
260
+ const isNewSession = !existing;
261
+ let session;
262
+ if (isNewSession) {
263
+ try {
264
+ session = await createPiSession({ port, mode: resolvedMode });
265
+ }
266
+ catch (err) {
267
+ request.log.error({ err }, 'Failed to create pi session');
268
+ return reply.code(500).send({
269
+ success: false,
270
+ error: err?.message || 'Failed to initialize pi runtime'
271
+ });
272
+ }
273
+ piSessions.set(sessionKey(resolvedMode, session.sessionId), session);
274
+ }
275
+ else {
276
+ // isNewSession 为 false 时 existing 必非 undefined(TS 窄化在循环赋值后丢失,这里显式断言)
277
+ session = existing;
278
+ }
279
+ const resolvedSessionId = session.sessionId;
280
+ // 前端透传 thinkingLevel(默认 off);若 session 支持则设置
281
+ const level = request.body.thinkingLevel ?? 'off';
282
+ if (typeof session.supportsThinking === 'function' && session.supportsThinking()) {
283
+ session.setThinkingLevel(level);
284
+ }
246
285
  if (stream) {
247
- // Streaming mode: use SSE
248
- const newSessionId = sessionId ?? randomUUID();
286
+ // Streaming mode: SSE(与前端 chat.ts 解析契约严格对齐)
249
287
  reply.hijack();
250
288
  const res = reply.raw;
251
289
  res.writeHead(200, {
252
290
  'Content-Type': 'text/event-stream',
253
291
  'Cache-Control': 'no-cache',
254
- 'Connection': 'keep-alive'
292
+ 'Connection': 'keep-alive',
293
+ // pi 真实 sessionId 通过 response header 下发;新建/复用都带,前端后续回传
294
+ 'x-claude-code-session-id': resolvedSessionId
255
295
  });
256
296
  const sendSSE = (event, data) => {
257
297
  if (res.destroyed)
258
298
  return;
259
299
  res.write(`event: ${event}\ndata: ${data}\n\n`);
260
300
  };
261
- // 新对话时发送 session event
262
- if (!sessionId) {
263
- sendSSE('session', newSessionId);
264
- }
265
- // 判断:如果 sessionId 存在于数据库,用 -r;否则用 --session-id
266
- const spawnArgs = sessionId
267
- ? (sessionIdExists(sessionId)
268
- ? ['-r', sessionId, '-p', prompt, '--allowedTools', 'Bash,Write,Edit,Read']
269
- : ['--session-id', sessionId, '-p', prompt, '--allowedTools', 'Bash,Write,Edit,Read'])
270
- : ['-p', prompt, '--allowedTools', 'Bash,Write,Edit,Read'];
271
- const child = spawn('claude', spawnArgs, {
272
- env: { ...process.env }
273
- });
274
- const TIMEOUT = 5 * 60 * 1000; // 5 minutes
275
- const timeoutId = setTimeout(() => {
276
- child.kill('SIGTERM');
277
- if (!res.destroyed) {
278
- sendSSE('error', JSON.stringify({ message: 'Execution timeout (5 minutes)' }));
279
- sendSSE('done', JSON.stringify({ code: 1 }));
280
- res.end();
281
- }
282
- }, TIMEOUT);
283
- child.stdout?.on('data', (chunk) => {
284
- sendSSE('data', JSON.stringify({ type: 'stdout', content: chunk.toString() }));
285
- });
286
- child.stderr?.on('data', (chunk) => {
287
- sendSSE('data', JSON.stringify({ type: 'stderr', content: chunk.toString() }));
288
- });
289
- child.on('error', (err) => {
301
+ let finished = false;
302
+ const finish = (code) => {
303
+ if (finished)
304
+ return;
305
+ finished = true;
290
306
  clearTimeout(timeoutId);
291
307
  if (!res.destroyed) {
292
- sendSSE('error', JSON.stringify({ message: err.message }));
293
- sendSSE('done', JSON.stringify({ code: 1 }));
308
+ sendSSE('done', JSON.stringify({ code }));
294
309
  res.end();
295
310
  }
311
+ };
312
+ const unsub = session.subscribe((ev) => {
313
+ try {
314
+ if (ev.type === 'message_update') {
315
+ // assistantMessageEvent 是底层 pi-ai 流事件;按 delta 类型结构化转发
316
+ const ae = ev.assistantMessageEvent;
317
+ if (ae?.type === 'text_delta' && typeof ae.delta === 'string') {
318
+ sendSSE('data', JSON.stringify({ type: 'text_delta', content: ae.delta }));
319
+ }
320
+ else if (ae?.type === 'thinking_delta' && typeof ae.delta === 'string') {
321
+ sendSSE('data', JSON.stringify({ type: 'thinking_delta', content: ae.delta }));
322
+ }
323
+ // thinking_start / text_start / thinking_end / text_end 不发:前端按 delta 累积
324
+ }
325
+ else if (ev.type === 'tool_execution_start') {
326
+ const e = ev;
327
+ sendSSE('data', JSON.stringify({
328
+ type: 'tool_start',
329
+ toolCallId: e.toolCallId,
330
+ toolName: e.toolName,
331
+ args: e.args,
332
+ }));
333
+ }
334
+ else if (ev.type === 'tool_execution_end') {
335
+ const e = ev;
336
+ const resultText = Array.isArray(e.result?.content)
337
+ ? e.result.content.map((c) => (c?.type === 'text' ? c.text : '')).join('\n')
338
+ : '';
339
+ sendSSE('data', JSON.stringify({
340
+ type: 'tool_end',
341
+ toolCallId: e.toolCallId,
342
+ toolName: e.toolName,
343
+ isError: !!e.isError,
344
+ durationMs: e.durationMs,
345
+ result: resultText,
346
+ }));
347
+ }
348
+ else if (ev.type === 'agent_end') {
349
+ finish(0);
350
+ }
351
+ }
352
+ catch (e) {
353
+ request.log.error({ err: e }, 'pi event mapping failed');
354
+ }
296
355
  });
297
- child.on('close', (code) => {
298
- clearTimeout(timeoutId);
356
+ const TIMEOUT = 5 * 60 * 1000;
357
+ const timeoutId = setTimeout(() => {
299
358
  if (!res.destroyed) {
300
- sendSSE('done', JSON.stringify({ code: code ?? 0 }));
301
- res.end();
359
+ sendSSE('error', JSON.stringify({ message: 'Execution timeout (5 minutes)' }));
302
360
  }
303
- });
304
- // Handle client disconnect
361
+ session.abort().catch(() => { });
362
+ finish(1);
363
+ }, TIMEOUT);
305
364
  res.on('close', () => {
306
365
  clearTimeout(timeoutId);
307
- if (!child.killed) {
308
- child.kill('SIGTERM');
309
- }
366
+ unsub();
367
+ session.abort().catch(() => { });
310
368
  });
369
+ try {
370
+ await session.prompt(prompt);
371
+ }
372
+ catch (err) {
373
+ unsub();
374
+ if (!res.destroyed) {
375
+ sendSSE('error', JSON.stringify({ message: err?.message || 'Prompt failed' }));
376
+ }
377
+ finish(1);
378
+ return;
379
+ }
380
+ // prompt 已返回;agent_end 会触发 finish。若未触发(异常路径),waitForIdle 兜底
381
+ session.waitForIdle().catch(() => { });
311
382
  }
312
383
  else {
313
- // Non-streaming mode: buffer all output
314
- const newSessionId = sessionId ?? randomUUID();
315
- // 判断:如果 sessionId 存在于数据库,用 -r;否则用 --session-id
316
- const spawnArgs = sessionId
317
- ? (sessionIdExists(sessionId)
318
- ? ['-r', sessionId, '-p', prompt, '--allowedTools', 'Bash,Write,Edit,Read']
319
- : ['--session-id', sessionId, '-p', prompt, '--allowedTools', 'Bash,Write,Edit,Read'])
320
- : ['-p', prompt, '--allowedTools', 'Bash,Write,Edit,Read'];
321
- const child = spawn('claude', spawnArgs, {
322
- env: { ...process.env }
323
- });
324
- const TIMEOUT = 5 * 60 * 1000; // 5 minutes
325
- const timeoutId = setTimeout(() => {
326
- child.kill('SIGTERM');
327
- }, TIMEOUT);
384
+ // Non-streaming mode: buffer 文本后返回 ExecResponse
328
385
  let stdout = '';
329
386
  let stderr = '';
330
- child.stdout?.on('data', (chunk) => {
331
- stdout += chunk.toString();
332
- });
333
- child.stderr?.on('data', (chunk) => {
334
- stderr += chunk.toString();
335
- });
336
- const result = await new Promise((resolve) => {
337
- child.on('error', (err) => {
338
- clearTimeout(timeoutId);
339
- resolve({
340
- success: false,
341
- error: err.message
342
- });
343
- });
344
- child.on('close', (code) => {
345
- clearTimeout(timeoutId);
346
- const output = stdout + stderr;
347
- if (code === 0) {
348
- resolve({
349
- success: true,
350
- output,
351
- sessionId: newSessionId
352
- });
353
- }
354
- else {
355
- resolve({
356
- success: false,
357
- error: output || `Process exited with code ${code}`,
358
- sessionId: newSessionId
359
- });
387
+ const unsub = session.subscribe((ev) => {
388
+ if (ev.type === 'message_update') {
389
+ const ae = ev.assistantMessageEvent;
390
+ if (ae?.type === 'text_delta' && typeof ae.delta === 'string') {
391
+ stdout += ae.delta;
360
392
  }
361
- });
393
+ }
394
+ else if (ev.type === 'tool_execution_start' ||
395
+ ev.type === 'tool_execution_update' ||
396
+ ev.type === 'tool_execution_end') {
397
+ const toolName = ev.toolName;
398
+ if (toolName)
399
+ stderr += `[tool:${toolName}]\n`;
400
+ }
362
401
  });
363
- if (!result.success) {
364
- return reply.code(500).send(result);
402
+ try {
403
+ await Promise.race([
404
+ session.prompt(prompt),
405
+ new Promise((_, rej) => setTimeout(() => rej(new Error('Execution timeout (5 minutes)')), 5 * 60 * 1000)),
406
+ ]);
407
+ await session.waitForIdle();
408
+ unsub();
409
+ return {
410
+ success: true,
411
+ output: stdout + stderr,
412
+ sessionId: resolvedSessionId,
413
+ };
414
+ }
415
+ catch (err) {
416
+ unsub();
417
+ await session.abort().catch(() => { });
418
+ return reply.code(500).send({
419
+ success: false,
420
+ error: err?.message || 'Prompt failed',
421
+ output: stdout + stderr,
422
+ sessionId: resolvedSessionId,
423
+ });
365
424
  }
366
- return result;
367
425
  }
368
426
  });
369
427
  // Handle /ui root path (redirect or serve index.html)
@@ -1 +1 @@
1
- import{aD as f}from"./index-DSGZBcd1.js";import{r as s}from"./index-Dlp8uGHu.js";function i(t,c){for(var o=0;o<c.length;o++){const e=c[o];if(typeof e!="string"&&!Array.isArray(e)){for(const r in e)if(r!=="default"&&!(r in t)){const a=Object.getOwnPropertyDescriptor(e,r);a&&Object.defineProperty(t,r,a.get?a:{enumerable:!0,get:()=>e[r]})}}}return Object.freeze(Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}))}var n=s();const p=f(n),_=i({__proto__:null,default:p},[n]);export{_};
1
+ import{aD as f}from"./index-Dsue7VlR.js";import{r as s}from"./index-DfWIGcNl.js";function i(t,c){for(var o=0;o<c.length;o++){const e=c[o];if(typeof e!="string"&&!Array.isArray(e)){for(const r in e)if(r!=="default"&&!(r in t)){const a=Object.getOwnPropertyDescriptor(e,r);a&&Object.defineProperty(t,r,a.get?a:{enumerable:!0,get:()=>e[r]})}}}return Object.freeze(Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}))}var n=s();const p=f(n),_=i({__proto__:null,default:p},[n]);export{_};