@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.
- package/dist/cli/commands/mcp.d.ts +1 -0
- package/dist/cli/commands/mcp.js +5 -0
- package/dist/cli/index.js +12 -0
- package/dist/docs/404.html +1 -1
- package/dist/docs/assets/{app.CLpmq4Gv.js → app.Dc5qjt2Z.js} +1 -1
- package/dist/docs/assets/chunks/{VPLocalSearchBox.C43HQ5tU.js → VPLocalSearchBox.DNn4HwDn.js} +1 -1
- package/dist/docs/assets/chunks/{abnfDiagram-VRR7QNED.RG1C5NpS.js → abnfDiagram-VRR7QNED.CO3oJlfv.js} +1 -1
- package/dist/docs/assets/chunks/{arc.C9NMazfV.js → arc.D6Q1WZEU.js} +1 -1
- package/dist/docs/assets/chunks/{architectureDiagram-ZJ3FMSHR.u2IZtOa6.js → architectureDiagram-ZJ3FMSHR.vHAxAkhu.js} +1 -1
- package/dist/docs/assets/chunks/{blockDiagram-677ZJIJ3.DdHVir7t.js → blockDiagram-677ZJIJ3.C0el4zil.js} +1 -1
- package/dist/docs/assets/chunks/{c4Diagram-LMCZKHZV.gSbgoaJo.js → c4Diagram-LMCZKHZV.WD7qpLTf.js} +1 -1
- package/dist/docs/assets/chunks/channel.nWTiHmYA.js +1 -0
- package/dist/docs/assets/chunks/{chunk-2Q5K7J3B.HRSdtksv.js → chunk-2Q5K7J3B.Bgt7N_Co.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-32BRIVSS.BYzKapof.js → chunk-32BRIVSS.CbP8heQ0.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-5VM5RSS4.c3oeF0uS.js → chunk-5VM5RSS4.Dlc2iAaG.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-EX3LRPZG.Cz5AKl7t.js → chunk-EX3LRPZG.Cr0sQbRc.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-JWPE2WC7.DtJxsA7-.js → chunk-JWPE2WC7.B52h3S9L.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-MOJQB5TN.h5kO0Dtu.js → chunk-MOJQB5TN.CphhXnWQ.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-RYQCIY6F.Ch_NfMTR.js → chunk-RYQCIY6F.CZafA9pg.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-V7JOEXUC.CHrHyPoW.js → chunk-V7JOEXUC.DMlMAq_a.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-VR4S4FIN.DG8DIrH3.js → chunk-VR4S4FIN.DA1An2TL.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-XXDRQBXY.CSXBN12Y.js → chunk-XXDRQBXY.Dwra-T5p.js} +1 -1
- package/dist/docs/assets/chunks/classDiagram-OUVF2IWQ.RsrQkeM_.js +1 -0
- package/dist/docs/assets/chunks/classDiagram-v2-EOCWNBFH.RsrQkeM_.js +1 -0
- package/dist/docs/assets/chunks/{cose-bilkent-JH36ORCC.BeFuOTgi.js → cose-bilkent-JH36ORCC.Ddhn5b9l.js} +1 -1
- package/dist/docs/assets/chunks/{cynefinDiagram-TSTJHNR4.BrJcHEEe.js → cynefinDiagram-TSTJHNR4.BlUCFIAV.js} +1 -1
- package/dist/docs/assets/chunks/{dagre-VKFMJZFB.D4vaA23X.js → dagre-VKFMJZFB.erCsZJb8.js} +1 -1
- package/dist/docs/assets/chunks/{diagram-FQU43EPY.uwRFLKRx.js → diagram-FQU43EPY.B0zbjZsr.js} +1 -1
- package/dist/docs/assets/chunks/{diagram-G47NLZAW.Byfc9d0H.js → diagram-G47NLZAW.B4S_wuz1.js} +1 -1
- package/dist/docs/assets/chunks/{diagram-NH7WQ7WH.CxjBEGZX.js → diagram-NH7WQ7WH.BRv6nOgk.js} +1 -1
- package/dist/docs/assets/chunks/{diagram-OA4YK3LP.CU1jGXMi.js → diagram-OA4YK3LP.DBS8iZPq.js} +1 -1
- package/dist/docs/assets/chunks/{diagram-WEI45ONY.yXgVkURA.js → diagram-WEI45ONY.CDZlR-fM.js} +1 -1
- package/dist/docs/assets/chunks/{ebnfDiagram-CCIWWBDH.UucqGQ_d.js → ebnfDiagram-CCIWWBDH.z_nUDDWm.js} +1 -1
- package/dist/docs/assets/chunks/{erDiagram-Q63AITRT.C6qmOrvh.js → erDiagram-Q63AITRT.BOAH1mBM.js} +1 -1
- package/dist/docs/assets/chunks/{flowDiagram-23GEKE2U.BZLu-WUl.js → flowDiagram-23GEKE2U.cnCU0na-.js} +1 -1
- package/dist/docs/assets/chunks/{ganttDiagram-NO4QXBWP.DUzsw4Yr.js → ganttDiagram-NO4QXBWP.CzSToCFq.js} +1 -1
- package/dist/docs/assets/chunks/{gitGraphDiagram-IHSO6WYX.BqLfYTI7.js → gitGraphDiagram-IHSO6WYX.WUBTiDD1.js} +1 -1
- package/dist/docs/assets/chunks/{infoDiagram-FWYZ7A6U.CiKWveW9.js → infoDiagram-FWYZ7A6U.Bz5y9qpB.js} +1 -1
- package/dist/docs/assets/chunks/{ishikawaDiagram-FXEZZL3T.jerUXEXA.js → ishikawaDiagram-FXEZZL3T.DX9mwIpB.js} +1 -1
- package/dist/docs/assets/chunks/{journeyDiagram-5HDEW3XC.Cqzvo6I_.js → journeyDiagram-5HDEW3XC.BclISEWC.js} +1 -1
- package/dist/docs/assets/chunks/{kanban-definition-HUTT4EX6.BzJ4OPe5.js → kanban-definition-HUTT4EX6.CMwsG4gj.js} +1 -1
- package/dist/docs/assets/chunks/{linear.hFjgYGMN.js → linear.zokB3L6J.js} +1 -1
- package/dist/docs/assets/chunks/{mermaid-client.D3gEaJ5e.js → mermaid-client.DIhzjS3B.js} +2 -2
- package/dist/docs/assets/chunks/{mermaid.core.CEHdFh45.js → mermaid.core.CJEoCnVo.js} +102 -98
- package/dist/docs/assets/chunks/{mindmap-definition-LN4V7U3C.ChC5FJW6.js → mindmap-definition-LN4V7U3C.DeNvpAwd.js} +1 -1
- package/dist/docs/assets/chunks/{pegDiagram-2B236MQR.ClnjsRYs.js → pegDiagram-2B236MQR.D5O5vyDS.js} +1 -1
- package/dist/docs/assets/chunks/{pieDiagram-ENE6RG2P.Bb0MqerK.js → pieDiagram-ENE6RG2P.CDpZrox4.js} +1 -1
- package/dist/docs/assets/chunks/{quadrantDiagram-ABIIQ3AL.Do6HK_yb.js → quadrantDiagram-ABIIQ3AL.Bz0dhK1l.js} +1 -1
- package/dist/docs/assets/chunks/{railroadDiagram-RFXS5EU6.D35m6hQn.js → railroadDiagram-RFXS5EU6.C2h0Mxo5.js} +1 -1
- package/dist/docs/assets/chunks/{requirementDiagram-TGXJPOKE.DMtjRYUg.js → requirementDiagram-TGXJPOKE.YLD-NuJw.js} +1 -1
- package/dist/docs/assets/chunks/{sankeyDiagram-HTMAVEWB.dfXDu62B.js → sankeyDiagram-HTMAVEWB.R2uEIhmV.js} +1 -1
- package/dist/docs/assets/chunks/{sequenceDiagram-DBY2YBRQ.CLZ0rZTY.js → sequenceDiagram-DBY2YBRQ.D6E2oY7U.js} +1 -1
- package/dist/docs/assets/chunks/{sizeCapture-X5ZJPWSS.DWvGYLUT.js → sizeCapture-X5ZJPWSS.C65Lzwwi.js} +1 -1
- package/dist/docs/assets/chunks/{stateDiagram-2N3HPSRC.DY8sDkI0.js → stateDiagram-2N3HPSRC.Cqc4HEHT.js} +1 -1
- package/dist/docs/assets/chunks/stateDiagram-v2-6OUMAXLB.D8rYKDmp.js +1 -0
- package/dist/docs/assets/chunks/{swimlanes-5IMT3BWC.Dy9SffeT.js → swimlanes-5IMT3BWC.dfhQuNQg.js} +2 -2
- package/dist/docs/assets/chunks/swimlanesDiagram-G3AALYLV.CdD0ADbF.js +8 -0
- package/dist/docs/assets/chunks/{theme.CSw9Whd5.js → theme.DCDU4HCI.js} +2 -2
- package/dist/docs/assets/chunks/{timeline-definition-FHXFAJF6.CH6uzgIu.js → timeline-definition-FHXFAJF6.SOgdni8I.js} +1 -1
- package/dist/docs/assets/chunks/{vennDiagram-L72KCM5P.7EBCJmyP.js → vennDiagram-L72KCM5P.BvlXlHJf.js} +1 -1
- package/dist/docs/assets/chunks/{wardleyDiagram-EHGQE667.DPHAQssL.js → wardleyDiagram-EHGQE667.t3t8sFvo.js} +1 -1
- package/dist/docs/assets/chunks/{xychartDiagram-FW5EYKEG.aKgxZVbK.js → xychartDiagram-FW5EYKEG.DDT1UX32.js} +1 -1
- package/dist/docs/index.html +2 -2
- package/dist/docs/overview.html +2 -2
- package/dist/docs/packages-utils.html +2 -2
- package/dist/docs/proxy-admin/env-and-build.html +2 -2
- package/dist/docs/proxy-admin/index.html +2 -2
- package/dist/docs/proxy-admin/layout-and-menu.html +2 -2
- package/dist/docs/proxy-admin/pages.html +2 -2
- package/dist/docs/proxy-admin/routing-and-auth.html +2 -2
- package/dist/docs/proxy-admin/services-and-mock.html +2 -2
- package/dist/docs/proxy-cli/api-layer.html +2 -2
- package/dist/docs/proxy-cli/app-shell.html +2 -2
- package/dist/docs/proxy-cli/components-common.html +2 -2
- package/dist/docs/proxy-cli/components-config.html +2 -2
- package/dist/docs/proxy-cli/components-requests.html +2 -2
- package/dist/docs/proxy-cli/components-stats.html +2 -2
- package/dist/docs/proxy-cli/components-status.html +2 -2
- package/dist/docs/proxy-cli/data-hooks.html +2 -2
- package/dist/docs/proxy-cli/index.html +2 -2
- package/dist/docs/proxy-cli/utils-and-i18n.html +2 -2
- package/dist/docs/proxy-core/chat-api.html +2 -2
- package/dist/docs/proxy-core/cli.html +2 -2
- package/dist/docs/proxy-core/config.html +2 -2
- package/dist/docs/proxy-core/data-layer.html +2 -2
- package/dist/docs/proxy-core/entry.html +2 -2
- package/dist/docs/proxy-core/index.html +2 -2
- package/dist/docs/proxy-core/pm2.html +2 -2
- package/dist/docs/proxy-core/providers.html +2 -2
- package/dist/docs/proxy-core/proxy.html +2 -2
- package/dist/docs/proxy-core/stats.html +2 -2
- package/dist/docs/proxy-core/tool.html +2 -2
- package/dist/docs/proxy-core/ui-routes.html +2 -2
- package/dist/docs/proxy-core/utilities.html +2 -2
- package/dist/docs/quickstart.html +2 -2
- package/dist/docs/request-flow.html +2 -2
- package/dist/mcp-server/index.d.ts +3 -0
- package/dist/mcp-server/index.js +16 -0
- package/dist/mcp-server/run.d.ts +1 -0
- package/dist/mcp-server/run.js +14 -0
- package/dist/mcp-server/tools.d.ts +11 -0
- package/dist/mcp-server/tools.js +219 -0
- package/dist/server/docs-route.js +42 -13
- package/dist/server/index.js +3 -2
- package/dist/server/ui-route.js +161 -103
- package/dist/ui/assets/{1c-DPsrzNHI.js → 1c-CK-kMhtR.js} +1 -1
- package/dist/ui/assets/{abnf-DNkBIQRO.js → abnf-1lQ1Uzrr.js} +1 -1
- package/dist/ui/assets/{abnfDiagram-VRR7QNED-BqvHvzR8.js → abnfDiagram-VRR7QNED-BqMOdnuh.js} +1 -1
- package/dist/ui/assets/{accesslog-D5NxQ43Q.js → accesslog-BGadK9Fx.js} +1 -1
- package/dist/ui/assets/{actionscript-DLr-LB2m.js → actionscript-4t1vDHvB.js} +1 -1
- package/dist/ui/assets/{ada-BRSz3tHX.js → ada-CTSY_kbf.js} +1 -1
- package/dist/ui/assets/{angelscript-DMtEGgIa.js → angelscript-BX_1_lW7.js} +1 -1
- package/dist/ui/assets/{apache-C4gn4cSd.js → apache-DeUUxSLd.js} +1 -1
- package/dist/ui/assets/{applescript-DoodcTwg.js → applescript-BUfqUe12.js} +1 -1
- package/dist/ui/assets/{arc-HmnzaGf9.js → arc-D-xOtktL.js} +1 -1
- package/dist/ui/assets/{arcade-RJZZSHSl.js → arcade-BlZbrfiI.js} +1 -1
- package/dist/ui/assets/{architectureDiagram-ZJ3FMSHR-BUfDpSIw.js → architectureDiagram-ZJ3FMSHR-KN5x3Oxc.js} +1 -1
- package/dist/ui/assets/{arduino-n6Dpx6Ig.js → arduino-CmMMxhu0.js} +1 -1
- package/dist/ui/assets/{armasm-DzCVITGB.js → armasm-If0W0ZTH.js} +1 -1
- package/dist/ui/assets/{asciidoc-CaqMsApq.js → asciidoc-DD6e-k3f.js} +1 -1
- package/dist/ui/assets/{aspectj-B0kIcV0v.js → aspectj-MxQxriHk.js} +1 -1
- package/dist/ui/assets/{autohotkey-xUEXewap.js → autohotkey-Ahz4SejW.js} +1 -1
- package/dist/ui/assets/{autoit-D3OfN2VX.js → autoit-DwDj3imC.js} +1 -1
- package/dist/ui/assets/{avrasm-Cbf0F4Kf.js → avrasm-97KvbVpn.js} +1 -1
- package/dist/ui/assets/{awk-Cc0rWEwe.js → awk-Bo_-wZyZ.js} +1 -1
- package/dist/ui/assets/{axapta-BKEeoUEe.js → axapta-DR_HV06c.js} +1 -1
- package/dist/ui/assets/{bash-D6JH6L3m.js → bash-dxvpXEou.js} +1 -1
- package/dist/ui/assets/{basic-ka6JXc9C.js → basic-Dw-3a82q.js} +1 -1
- package/dist/ui/assets/{blockDiagram-677ZJIJ3-BHXRSjnM.js → blockDiagram-677ZJIJ3-CMXz5JvW.js} +1 -1
- package/dist/ui/assets/{bnf-Bxclk5tZ.js → bnf-5ey_2QkR.js} +1 -1
- package/dist/ui/assets/{brainfuck--s_Fd8b9.js → brainfuck-CbRmZUzR.js} +1 -1
- package/dist/ui/assets/{coq-CVLui3m8.js → c-DUcxiMx7.js} +1 -1
- package/dist/ui/assets/{c-like-CNkOkbqh.js → c-like-D9kw6QEo.js} +1 -1
- package/dist/ui/assets/{c4Diagram-LMCZKHZV-Bp1uSrW8.js → c4Diagram-LMCZKHZV-DU4C988i.js} +1 -1
- package/dist/ui/assets/{cal-LVlIOy9W.js → cal-BXDKT54m.js} +1 -1
- package/dist/ui/assets/{capnproto-r9DiQ1H8.js → capnproto-DXByvzkB.js} +1 -1
- package/dist/ui/assets/{ceylon-CTNzyZJX.js → ceylon-CNMAc9bK.js} +1 -1
- package/dist/ui/assets/channel-limbQkil.js +1 -0
- package/dist/ui/assets/{chunk-2Q5K7J3B-nnLVtUW3.js → chunk-2Q5K7J3B-Cm-SVU-u.js} +1 -1
- package/dist/ui/assets/{chunk-32BRIVSS-BDNS6igp.js → chunk-32BRIVSS-oz0KK3YS.js} +1 -1
- package/dist/ui/assets/{chunk-5VM5RSS4-D713xBhI.js → chunk-5VM5RSS4-CbHdtlYp.js} +1 -1
- package/dist/ui/assets/{chunk-EX3LRPZG-DExsU6Rd.js → chunk-EX3LRPZG-DhhuYakR.js} +1 -1
- package/dist/ui/assets/{chunk-JWPE2WC7-DcpW5RnW.js → chunk-JWPE2WC7-CYkjHxPj.js} +1 -1
- package/dist/ui/assets/{chunk-MOJQB5TN-BQiSZNTn.js → chunk-MOJQB5TN-gO40CNAh.js} +1 -1
- package/dist/ui/assets/{chunk-RYQCIY6F-DfblgZPd.js → chunk-RYQCIY6F-CKedXT_Q.js} +1 -1
- package/dist/ui/assets/{chunk-V7JOEXUC-np--VgmN.js → chunk-V7JOEXUC-C_6jfVpf.js} +1 -1
- package/dist/ui/assets/{chunk-VR4S4FIN-BG0IhjO6.js → chunk-VR4S4FIN-C8NVa2Dp.js} +1 -1
- package/dist/ui/assets/{chunk-XXDRQBXY-DHuoh-RB.js → chunk-XXDRQBXY-DCaDk-GY.js} +1 -1
- package/dist/ui/assets/classDiagram-OUVF2IWQ--Q3UeFsZ.js +1 -0
- package/dist/ui/assets/classDiagram-v2-EOCWNBFH--Q3UeFsZ.js +1 -0
- package/dist/ui/assets/{clean-CtVj0-EB.js → clean-Cno2Iol9.js} +1 -1
- package/dist/ui/assets/{clojure-CZwle60-.js → clojure-CJo86K2y.js} +1 -1
- package/dist/ui/assets/{clojure-repl-DJXWH00I.js → clojure-repl-BDUy3x0z.js} +1 -1
- package/dist/ui/assets/{cmake-Boxf0e7r.js → cmake-C3lBpnMa.js} +1 -1
- package/dist/ui/assets/{coffeescript-h85ZW4Gm.js → coffeescript-D6Gc1Iic.js} +1 -1
- package/dist/ui/assets/{c-BsgdDna0.js → coq-DK5Qpymm.js} +1 -1
- package/dist/ui/assets/{cos-CL0igafw.js → cos-C9vhICZi.js} +1 -1
- package/dist/ui/assets/{cose-bilkent-JH36ORCC-CnXyotYB.js → cose-bilkent-JH36ORCC-BsX7zIIX.js} +1 -1
- package/dist/ui/assets/{cpp-vite1NvJ.js → cpp-B2THrLw2.js} +1 -1
- package/dist/ui/assets/{crmsh-DqT9g0Iq.js → crmsh-Cidhwnbv.js} +1 -1
- package/dist/ui/assets/{crystal-Oans-K8G.js → crystal-D4UzipzS.js} +1 -1
- package/dist/ui/assets/{csharp-sCaDAzIB.js → csharp-sHzRBXom.js} +1 -1
- package/dist/ui/assets/{csp-rMcp93pK.js → csp-RR_2otDZ.js} +1 -1
- package/dist/ui/assets/{css-BwDLHi_h.js → css-CwufTY20.js} +1 -1
- package/dist/ui/assets/{cynefin-VYW2F7L2-D8Bmecdd.js → cynefin-VYW2F7L2-BdPPij9L.js} +1 -1
- package/dist/ui/assets/{cynefinDiagram-TSTJHNR4-BT2YFmPZ.js → cynefinDiagram-TSTJHNR4-Y8HasE5a.js} +1 -1
- package/dist/ui/assets/{d-BFgZm0RV.js → d-DeXSSL8w.js} +1 -1
- package/dist/ui/assets/{dagre-VKFMJZFB-BeJU73ex.js → dagre-VKFMJZFB-B_nm4MgH.js} +1 -1
- package/dist/ui/assets/{dart-rIo85iL3.js → dart-DhBp0MgA.js} +1 -1
- package/dist/ui/assets/{delphi-Bi2Rfp1o.js → delphi-B5k-wYBj.js} +1 -1
- package/dist/ui/assets/{diagram-FQU43EPY-CHQiS5Fr.js → diagram-FQU43EPY-CgBlXe2t.js} +1 -1
- package/dist/ui/assets/{diagram-G47NLZAW-EVerd4V8.js → diagram-G47NLZAW-BebzwVx5.js} +1 -1
- package/dist/ui/assets/{diagram-NH7WQ7WH-DMP0VOAs.js → diagram-NH7WQ7WH-DzWivpuq.js} +1 -1
- package/dist/ui/assets/{diagram-OA4YK3LP-CAur5jK9.js → diagram-OA4YK3LP-Cb_lMSnX.js} +1 -1
- package/dist/ui/assets/{diagram-WEI45ONY-DvmKkPH7.js → diagram-WEI45ONY-C_Y9GQ0N.js} +1 -1
- package/dist/ui/assets/{diff-CZZCIG00.js → diff-COhluegM.js} +1 -1
- package/dist/ui/assets/{django-D88PKHy-.js → django-C7XlHtBx.js} +1 -1
- package/dist/ui/assets/{dns-DX4hzjUh.js → dns-wjwUM-Uq.js} +1 -1
- package/dist/ui/assets/{dockerfile-1lgzEXn1.js → dockerfile-Bc-WqdkT.js} +1 -1
- package/dist/ui/assets/{dos-CwrC1ROy.js → dos-mEp9A4Hm.js} +1 -1
- package/dist/ui/assets/{dsconfig-tvVdBv4w.js → dsconfig-Dgs83FGD.js} +1 -1
- package/dist/ui/assets/{dts-DTgQkdRs.js → dts-C3Ds2O26.js} +1 -1
- package/dist/ui/assets/{dust-BbLlyCpf.js → dust-CyQO5OHb.js} +1 -1
- package/dist/ui/assets/{ebnf-D6Dc4oRr.js → ebnf-CNogRDO4.js} +1 -1
- package/dist/ui/assets/{ebnfDiagram-CCIWWBDH-Kvilk1RF.js → ebnfDiagram-CCIWWBDH-ZlE-AFZT.js} +1 -1
- package/dist/ui/assets/{elixir-CnMolQVs.js → elixir-3SLljiDu.js} +1 -1
- package/dist/ui/assets/{elm-BQ7VQFn7.js → elm-BPBZeCUB.js} +1 -1
- package/dist/ui/assets/{erDiagram-Q63AITRT-C-S9oHZd.js → erDiagram-Q63AITRT-CXuGvWcB.js} +1 -1
- package/dist/ui/assets/{erb-B_1g6fXE.js → erb-DqbIyjtE.js} +1 -1
- package/dist/ui/assets/{erlang-repl-Cy6Z3TdH.js → erlang-repl-e_6K45XY.js} +1 -1
- package/dist/ui/assets/{erlang-3b3ITXJu.js → erlang-y0z0xXo_.js} +1 -1
- package/dist/ui/assets/{excel-DtkATto8.js → excel-RwNCmSYM.js} +1 -1
- package/dist/ui/assets/{fix-DsEG7TDI.js → fix-DNXnlXQP.js} +1 -1
- package/dist/ui/assets/{flix-CQ-rKwGO.js → flix-rdcWVVc-.js} +1 -1
- package/dist/ui/assets/{flowDiagram-23GEKE2U-EbHDNMCC.js → flowDiagram-23GEKE2U-BuKpfhyd.js} +1 -1
- package/dist/ui/assets/{fortran-AqzaRCEt.js → fortran-CjB2gctQ.js} +1 -1
- package/dist/ui/assets/{fsharp-CCzWGasu.js → fsharp-DPGDnrod.js} +1 -1
- package/dist/ui/assets/{gams-Bqa6CB_r.js → gams-d97ChOge.js} +1 -1
- package/dist/ui/assets/{ganttDiagram-NO4QXBWP-B6jvc6O7.js → ganttDiagram-NO4QXBWP-CThfmoNX.js} +1 -1
- package/dist/ui/assets/{gauss-D4Utubeh.js → gauss-Ckbq9pov.js} +1 -1
- package/dist/ui/assets/{gcode-By3KwWjb.js → gcode-C8rxWIBi.js} +1 -1
- package/dist/ui/assets/{gherkin-PXOPjT7Y.js → gherkin-Cb88ENJ2.js} +1 -1
- package/dist/ui/assets/{gitGraphDiagram-IHSO6WYX-C5l6rHvK.js → gitGraphDiagram-IHSO6WYX-Ch4mA1xX.js} +1 -1
- package/dist/ui/assets/{glsl-KmmyBk93.js → glsl-D75QPnvr.js} +1 -1
- package/dist/ui/assets/{gml-C1Qw_Nrt.js → gml-BYM-XcrL.js} +1 -1
- package/dist/ui/assets/{go-DaBQtdp1.js → go-C0q3a0K-.js} +1 -1
- package/dist/ui/assets/{golo-D7PDzNpb.js → golo-BN-kAS6i.js} +1 -1
- package/dist/ui/assets/{gradle-nXueCYH-.js → gradle-CsmhRGnx.js} +1 -1
- package/dist/ui/assets/{groovy-DFDsQDhl.js → groovy-CVvlYgLe.js} +1 -1
- package/dist/ui/assets/{haml-B_zxHzy_.js → haml-BZ1z9lT4.js} +1 -1
- package/dist/ui/assets/{handlebars-BdMY-8KA.js → handlebars-ByoXIUsU.js} +1 -1
- package/dist/ui/assets/{haskell-CftsIPps.js → haskell-bKtVloMo.js} +1 -1
- package/dist/ui/assets/{haxe-BFZb0OIE.js → haxe-7YhuN0qz.js} +1 -1
- package/dist/ui/assets/{hsp-EPTuqwtZ.js → hsp-Bgvcm6F3.js} +1 -1
- package/dist/ui/assets/{htmlbars-B7ZSC-iN.js → htmlbars-BpuFL8Dv.js} +1 -1
- package/dist/ui/assets/{http-BxSd_aa1.js → http-BdkFJc_6.js} +1 -1
- package/dist/ui/assets/{hy-D-rBN9MQ.js → hy-fLVT9AqM.js} +1 -1
- package/dist/ui/assets/{index-Dlp8uGHu.js → index-DfWIGcNl.js} +3 -3
- package/dist/ui/assets/index-DpS8gUTx.css +10 -0
- package/dist/ui/assets/{index-DSGZBcd1.js → index-Dsue7VlR.js} +302 -352
- package/dist/ui/assets/{infoDiagram-FWYZ7A6U-BOF_kBqe.js → infoDiagram-FWYZ7A6U-DBgU6pXz.js} +1 -1
- package/dist/ui/assets/{inform7-OjpbRXZf.js → inform7-CiZzJ9ba.js} +1 -1
- package/dist/ui/assets/{ini-Dc-QApXQ.js → ini-Cnt_l57a.js} +1 -1
- package/dist/ui/assets/{irpf90-C4OfYiST.js → irpf90-tpOLGqpx.js} +1 -1
- package/dist/ui/assets/{isbl-9km6K6Sf.js → isbl-CP9CH5cc.js} +1 -1
- package/dist/ui/assets/{ishikawaDiagram-FXEZZL3T-BvKSD8LY.js → ishikawaDiagram-FXEZZL3T-Cq-UEF7t.js} +1 -1
- package/dist/ui/assets/{java-C2mOf3QX.js → java-kyhtR5gA.js} +1 -1
- package/dist/ui/assets/{javascript-_i0Q5MkQ.js → javascript-Dt9hxK6y.js} +1 -1
- package/dist/ui/assets/{jboss-cli-BS5ipQOv.js → jboss-cli-BJZewHIt.js} +1 -1
- package/dist/ui/assets/{journeyDiagram-5HDEW3XC-yKdSl63P.js → journeyDiagram-5HDEW3XC-iLTD7hUv.js} +1 -1
- package/dist/ui/assets/{json-Dci0MO4x.js → json-B784rDGN.js} +1 -1
- package/dist/ui/assets/{julia-bEqo4nlV.js → julia-BBZWRf_K.js} +1 -1
- package/dist/ui/assets/{julia-repl-Co6hf47q.js → julia-repl-ChQ_anXf.js} +1 -1
- package/dist/ui/assets/{kanban-definition-HUTT4EX6-B7BbZCd6.js → kanban-definition-HUTT4EX6-DnmU4pyp.js} +1 -1
- package/dist/ui/assets/{kotlin-krx8WewB.js → kotlin-Ca3cQqj9.js} +1 -1
- package/dist/ui/assets/{lasso-d3ZTv9Tj.js → lasso-68xMTGCI.js} +1 -1
- package/dist/ui/assets/{latex-BNWbHYxK.js → latex-BJAvHrS-.js} +1 -1
- package/dist/ui/assets/{ldif-Bs8eb63L.js → ldif-BozIkxE8.js} +1 -1
- package/dist/ui/assets/{leaf-BTbRDVWB.js → leaf-DeAYBX7h.js} +1 -1
- package/dist/ui/assets/{less-DH5cqJTD.js → less-Bc0jcew8.js} +1 -1
- package/dist/ui/assets/{lisp-CBUvBYtR.js → lisp-ffZdTilE.js} +1 -1
- package/dist/ui/assets/{livecodeserver-CkM7-E4a.js → livecodeserver-DKyXE2lg.js} +1 -1
- package/dist/ui/assets/{livescript-DomXyXUO.js → livescript-CeVSdP5j.js} +1 -1
- package/dist/ui/assets/{llvm-e_-ff59-.js → llvm-CA19rs9e.js} +1 -1
- package/dist/ui/assets/{lsl-BNDsGOmv.js → lsl-De1V90GL.js} +1 -1
- package/dist/ui/assets/{lua-_ZmkXwc_.js → lua-Ckc_sOAg.js} +1 -1
- package/dist/ui/assets/{makefile-BhG7cThe.js → makefile-BlkvlESW.js} +1 -1
- package/dist/ui/assets/{markdown-ClW2SRy6.js → markdown-BsHfdULh.js} +1 -1
- package/dist/ui/assets/{mathematica-kqoCR611.js → mathematica-BdVzKfdF.js} +1 -1
- package/dist/ui/assets/{matlab-DqawyK3q.js → matlab-BE1b3EYS.js} +1 -1
- package/dist/ui/assets/{maxima-B0qzCXe1.js → maxima-C7hoTDGn.js} +1 -1
- package/dist/ui/assets/{mel-BZaSas3B.js → mel-DNZ4AX0h.js} +1 -1
- package/dist/ui/assets/{mercury-ByD0wyJH.js → mercury-DnbIrIOF.js} +1 -1
- package/dist/ui/assets/{mindmap-definition-LN4V7U3C-Ce6QsaH5.js → mindmap-definition-LN4V7U3C-Df0J4YS6.js} +1 -1
- package/dist/ui/assets/{mipsasm-B08lqZSo.js → mipsasm-vRzAjdOa.js} +1 -1
- package/dist/ui/assets/{mizar-7iaUqWPq.js → mizar-_COCUpjs.js} +1 -1
- package/dist/ui/assets/{mojolicious-CbH-d8Wh.js → mojolicious-BXSqEUhN.js} +1 -1
- package/dist/ui/assets/{monkey-D5z6-hFH.js → monkey-DdaFErmE.js} +1 -1
- package/dist/ui/assets/{moonscript-DuLd7pdm.js → moonscript-ylkEnmhz.js} +1 -1
- package/dist/ui/assets/{n1ql-EbVfQMfD.js → n1ql-CmU80AjO.js} +1 -1
- package/dist/ui/assets/{nginx-D-4AxpHP.js → nginx-Xq7ZP4_a.js} +1 -1
- package/dist/ui/assets/{nim-wPHQEX5v.js → nim-9UGxbeVX.js} +1 -1
- package/dist/ui/assets/{nix-6SVkxAXi.js → nix-DF4g-5JC.js} +1 -1
- package/dist/ui/assets/{node-repl-CaFKEOyj.js → node-repl-Cuy9El0l.js} +1 -1
- package/dist/ui/assets/{nsis-BmqbwVv_.js → nsis-O_u_AJ8R.js} +1 -1
- package/dist/ui/assets/{objectivec-BX0R-sI2.js → objectivec-CGRDK5jQ.js} +1 -1
- package/dist/ui/assets/{ocaml-CyfdrIqo.js → ocaml-CbQcAD-R.js} +1 -1
- package/dist/ui/assets/{openscad-B5qfaF1E.js → openscad-DT2CMIqE.js} +1 -1
- package/dist/ui/assets/{oxygene-CmlCgXLr.js → oxygene-B9Ei-fnj.js} +1 -1
- package/dist/ui/assets/{parser3-DdpPyZkn.js → parser3-CuVObcEZ.js} +1 -1
- package/dist/ui/assets/{pegDiagram-2B236MQR-ByyVqaXh.js → pegDiagram-2B236MQR-k8i-gID4.js} +1 -1
- package/dist/ui/assets/{perl-D3qc2wEe.js → perl-dVGJ8bE1.js} +1 -1
- package/dist/ui/assets/{pf-Bv3zza37.js → pf-X2PQAhR-.js} +1 -1
- package/dist/ui/assets/{pgsql-BZIppw1a.js → pgsql-DVzCzD92.js} +1 -1
- package/dist/ui/assets/{php-D1ScecZC.js → php-DocTOgNe.js} +1 -1
- package/dist/ui/assets/{php-template-sEqzzKWJ.js → php-template-dP8srdEx.js} +1 -1
- package/dist/ui/assets/{pieDiagram-ENE6RG2P-T1OgWN3l.js → pieDiagram-ENE6RG2P-C76s3Fdz.js} +1 -1
- package/dist/ui/assets/{plaintext-DO7Jy_T2.js → plaintext-vjpxtrpz.js} +1 -1
- package/dist/ui/assets/{pony-CTXTp2Tb.js → pony-z-bq7AaS.js} +1 -1
- package/dist/ui/assets/{powershell-C9lzZsbj.js → powershell-DW0_Tsne.js} +1 -1
- package/dist/ui/assets/{processing-hzJAP_Li.js → processing-bDmnj3oy.js} +1 -1
- package/dist/ui/assets/{profile-bFiAkh7e.js → profile-DJ-L-V1f.js} +1 -1
- package/dist/ui/assets/{prolog-CE0trHSn.js → prolog-InNU9tFQ.js} +1 -1
- package/dist/ui/assets/{properties-MeANnTVc.js → properties-EkF7cZTJ.js} +1 -1
- package/dist/ui/assets/{protobuf-S-rp7SK0.js → protobuf-BBRUbDYu.js} +1 -1
- package/dist/ui/assets/{puppet-B5YT8Ct1.js → puppet-fnCmZBIC.js} +1 -1
- package/dist/ui/assets/{purebasic-DO-5HeDl.js → purebasic-CgWDuH3f.js} +1 -1
- package/dist/ui/assets/{python-DVGTQbwU.js → python-CYT42SmK.js} +1 -1
- package/dist/ui/assets/{python-repl-CQ4VlKLC.js → python-repl-Wc3MvYdm.js} +1 -1
- package/dist/ui/assets/{q-nS96imov.js → q-C0agAWLY.js} +1 -1
- package/dist/ui/assets/{qml-BkzkCgUU.js → qml-BiFendDb.js} +1 -1
- package/dist/ui/assets/{quadrantDiagram-ABIIQ3AL-BkaCzlXD.js → quadrantDiagram-ABIIQ3AL-B0fDeX13.js} +1 -1
- package/dist/ui/assets/{r-y4Q5t85r.js → r-CcAL_gsb.js} +1 -1
- package/dist/ui/assets/{railroadDiagram-RFXS5EU6-C1lbwk19.js → railroadDiagram-RFXS5EU6-DOciFfD8.js} +1 -1
- package/dist/ui/assets/{reasonml-Bzhzc5Ao.js → reasonml-DnTQ-jkN.js} +1 -1
- package/dist/ui/assets/{requirementDiagram-TGXJPOKE-C8Rw6N2I.js → requirementDiagram-TGXJPOKE-BhpERBEw.js} +1 -1
- package/dist/ui/assets/{rib-BP3Y9dW3.js → rib-DRQBJUku.js} +1 -1
- package/dist/ui/assets/{roboconf-87QE7cIh.js → roboconf-Dt4hxDSc.js} +1 -1
- package/dist/ui/assets/{routeros-BV3nt8wW.js → routeros-DrysyAvp.js} +1 -1
- package/dist/ui/assets/{rsl-DfQf4CW_.js → rsl-BhobC4bl.js} +1 -1
- package/dist/ui/assets/{ruby-DQxFKbgX.js → ruby-B0gNTjSn.js} +1 -1
- package/dist/ui/assets/{ruleslanguage-B8oCm_aw.js → ruleslanguage-BJHWtkQf.js} +1 -1
- package/dist/ui/assets/{rust-DzZgPf9W.js → rust-bxFjTZl9.js} +1 -1
- package/dist/ui/assets/{sankeyDiagram-HTMAVEWB-Dxiuo8Hz.js → sankeyDiagram-HTMAVEWB-BJGvRvK8.js} +1 -1
- package/dist/ui/assets/{sas-CFh-Rsrv.js → sas-C1h9GlCk.js} +1 -1
- package/dist/ui/assets/{scala-3UDyJBiS.js → scala-GaqOsYzZ.js} +1 -1
- package/dist/ui/assets/{scheme-KaUTge9W.js → scheme-BgOgLp78.js} +1 -1
- package/dist/ui/assets/{scilab-CLSBZzuh.js → scilab-Dn2TX-KQ.js} +1 -1
- package/dist/ui/assets/{scss-DaEkfHWX.js → scss-CCOm-PWq.js} +1 -1
- package/dist/ui/assets/{sequenceDiagram-DBY2YBRQ-Cv__zR2v.js → sequenceDiagram-DBY2YBRQ-69vZi4Ut.js} +1 -1
- package/dist/ui/assets/{shell-B0d4cZTk.js → shell-C3U6YWrg.js} +1 -1
- package/dist/ui/assets/{sizeCapture-X5ZJPWSS-C4nD-ShQ.js → sizeCapture-X5ZJPWSS-D27KIrz7.js} +1 -1
- package/dist/ui/assets/{smali-CLhfky4R.js → smali-CvsTVdr_.js} +1 -1
- package/dist/ui/assets/{smalltalk-B4aaTMO5.js → smalltalk-kAQkohW_.js} +1 -1
- package/dist/ui/assets/{sml-x4CTxWEZ.js → sml-ve8o4sD9.js} +1 -1
- package/dist/ui/assets/{sqf-G_0vdVVs.js → sqf-BEX8EUHQ.js} +1 -1
- package/dist/ui/assets/{sql-C--WH0Fo.js → sql-BnvvIWzM.js} +1 -1
- package/dist/ui/assets/{sql_more-B4LrzCtd.js → sql_more-BiYWeUQi.js} +1 -1
- package/dist/ui/assets/{stan-CACDFOA0.js → stan-CL8TzbqV.js} +1 -1
- package/dist/ui/assets/{stata-BP9M7sZt.js → stata-9Ttgn33g.js} +1 -1
- package/dist/ui/assets/{stateDiagram-2N3HPSRC-z3-31Cr2.js → stateDiagram-2N3HPSRC-DUQdHUod.js} +1 -1
- package/dist/ui/assets/stateDiagram-v2-6OUMAXLB-DahROKNQ.js +1 -0
- package/dist/ui/assets/{step21-MAOu4dNb.js → step21-LuiZBROI.js} +1 -1
- package/dist/ui/assets/{stylus-CpuP3pvE.js → stylus-DMxCDGKP.js} +1 -1
- package/dist/ui/assets/{subunit-NWzuqFhT.js → subunit-BqTiWQgg.js} +1 -1
- package/dist/ui/assets/{swift-DuFKNmKv.js → swift-Vgcl7epB.js} +1 -1
- package/dist/ui/assets/{swimlanes-5IMT3BWC-E463-rXd.js → swimlanes-5IMT3BWC-BYUDE9bR.js} +2 -2
- package/dist/ui/assets/swimlanesDiagram-G3AALYLV-B5Lf8M0k.js +8 -0
- package/dist/ui/assets/{taggerscript-BDnv2jvg.js → taggerscript-CQct0uSB.js} +1 -1
- package/dist/ui/assets/{tap-aB2cLXdf.js → tap-C3D-iaMR.js} +1 -1
- package/dist/ui/assets/{tcl-7WepIaIa.js → tcl-pAGWRV8F.js} +1 -1
- package/dist/ui/assets/{thrift-BLh6pdjc.js → thrift-BMf3WY_-.js} +1 -1
- package/dist/ui/assets/{timeline-definition-FHXFAJF6-FA_RNhFQ.js → timeline-definition-FHXFAJF6-CUxhbtkg.js} +1 -1
- package/dist/ui/assets/{tp-D1rt5u_j.js → tp-CWlQ8HXb.js} +1 -1
- package/dist/ui/assets/{twig-DgfeYg4W.js → twig-D49EnTd7.js} +1 -1
- package/dist/ui/assets/{typescript-oU560Q8V.js → typescript-O1NhTsg4.js} +1 -1
- package/dist/ui/assets/{vala-DlXsaz2B.js → vala-ChgJAi6T.js} +1 -1
- package/dist/ui/assets/{vbnet-BjpxjeMZ.js → vbnet-DoMTvpOU.js} +1 -1
- package/dist/ui/assets/{vbscript-DfNdtdO3.js → vbscript-COqQ-XLI.js} +1 -1
- package/dist/ui/assets/{vbscript-html-D09WPsgK.js → vbscript-html-C6hlND5y.js} +1 -1
- package/dist/ui/assets/{vennDiagram-L72KCM5P-zaCDWwTs.js → vennDiagram-L72KCM5P-zdR45Fxo.js} +1 -1
- package/dist/ui/assets/{verilog-B9vENtLK.js → verilog-D_vJtQo2.js} +1 -1
- package/dist/ui/assets/{vhdl-CJLTZOu1.js → vhdl-P1OS5AdC.js} +1 -1
- package/dist/ui/assets/{vim-FuPhupu9.js → vim-Dta1cE1i.js} +1 -1
- package/dist/ui/assets/{wardleyDiagram-EHGQE667-BS8ApwmV.js → wardleyDiagram-EHGQE667-DGVhZURT.js} +1 -1
- package/dist/ui/assets/{x86asm-kX_Cp6wB.js → x86asm-0uxjBhIR.js} +1 -1
- package/dist/ui/assets/{xl-MuHNmLUj.js → xl-A4qrusE8.js} +1 -1
- package/dist/ui/assets/{xml-Mbn2z12n.js → xml-BWIS8Du3.js} +1 -1
- package/dist/ui/assets/{xquery-Dy4lt-m-.js → xquery-DteVIK7u.js} +1 -1
- package/dist/ui/assets/{xychartDiagram-FW5EYKEG-DoNZtZus.js → xychartDiagram-FW5EYKEG-Bi0bMVkV.js} +1 -1
- package/dist/ui/assets/{yaml-CxxAisfE.js → yaml-Sfd5lnBk.js} +1 -1
- package/dist/ui/assets/{zephir-WWG8qyld.js → zephir-DN0VT2-6.js} +1 -1
- package/dist/ui/index.html +2 -2
- package/dist/utils/__tests__/knowledge-store.test.d.ts +1 -0
- package/dist/utils/__tests__/knowledge-store.test.js +53 -0
- package/dist/utils/knowledge-store.d.ts +29 -0
- package/dist/utils/knowledge-store.js +144 -0
- package/dist/utils/pi-browser-tools.d.ts +10 -0
- package/dist/utils/pi-browser-tools.js +246 -0
- package/dist/utils/pi-runtime.d.ts +8 -0
- package/dist/utils/pi-runtime.js +236 -0
- package/dist/utils/pi-sandbox-ops.d.ts +40 -0
- package/dist/utils/pi-sandbox-ops.js +205 -0
- package/package.json +4 -2
- package/dist/docs/assets/chunks/channel.Cc6zpfFP.js +0 -1
- package/dist/docs/assets/chunks/classDiagram-OUVF2IWQ.DV5B4KLJ.js +0 -1
- package/dist/docs/assets/chunks/classDiagram-v2-EOCWNBFH.DV5B4KLJ.js +0 -1
- package/dist/docs/assets/chunks/stateDiagram-v2-6OUMAXLB.B9v-Vq5L.js +0 -1
- package/dist/docs/assets/chunks/swimlanesDiagram-G3AALYLV.Kb9LnCTH.js +0 -8
- package/dist/ui/assets/channel-_rFUXR2i.js +0 -1
- package/dist/ui/assets/classDiagram-OUVF2IWQ-DqgbMzM1.js +0 -1
- package/dist/ui/assets/classDiagram-v2-EOCWNBFH-DqgbMzM1.js +0 -1
- package/dist/ui/assets/index-CWFn1h-J.css +0 -10
- package/dist/ui/assets/stateDiagram-v2-6OUMAXLB-BKIXFHzO.js +0 -1
- 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 {
|
|
6
|
-
|
|
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
|
-
//
|
|
45
|
-
|
|
46
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
87
|
+
error: err?.message || 'Failed to distill document into knowledge base'
|
|
59
88
|
});
|
|
60
89
|
}
|
|
61
|
-
return { success: true, path: `docs
|
|
90
|
+
return { success: true, path: `docs/` };
|
|
62
91
|
});
|
|
63
92
|
}
|
package/dist/server/index.js
CHANGED
|
@@ -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
|
-
|
|
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';
|
package/dist/server/ui-route.js
CHANGED
|
@@ -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
|
|
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
|
-
//
|
|
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 {
|
|
234
|
-
|
|
235
|
-
|
|
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:
|
|
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
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
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('
|
|
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
|
-
|
|
298
|
-
|
|
356
|
+
const TIMEOUT = 5 * 60 * 1000;
|
|
357
|
+
const timeoutId = setTimeout(() => {
|
|
299
358
|
if (!res.destroyed) {
|
|
300
|
-
sendSSE('
|
|
301
|
-
res.end();
|
|
359
|
+
sendSSE('error', JSON.stringify({ message: 'Execution timeout (5 minutes)' }));
|
|
302
360
|
}
|
|
303
|
-
|
|
304
|
-
|
|
361
|
+
session.abort().catch(() => { });
|
|
362
|
+
finish(1);
|
|
363
|
+
}, TIMEOUT);
|
|
305
364
|
res.on('close', () => {
|
|
306
365
|
clearTimeout(timeoutId);
|
|
307
|
-
|
|
308
|
-
|
|
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
|
|
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
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
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
|
-
|
|
364
|
-
|
|
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-
|
|
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{_};
|