@pasko70/pibo 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.codex/skills/pi-agent-harness/SKILL.md +319 -0
- package/.codex/skills/pi-agent-harness/agents/openai.yaml +4 -0
- package/README.md +318 -0
- package/context/codex-base-prompt.md +144 -0
- package/context/pibo-compaction-prompt.md +100 -0
- package/context/pibo-system-prompt.md +17 -0
- package/dist/apps/chat/agent-profiles.js +26 -0
- package/dist/apps/chat/agent-store.js +336 -0
- package/dist/apps/chat/event-log.js +307 -0
- package/dist/apps/chat/read-model.js +218 -0
- package/dist/apps/chat/rooms.js +321 -0
- package/dist/apps/chat/session-metadata.js +14 -0
- package/dist/apps/chat/stream.js +122 -0
- package/dist/apps/chat/trace.js +1182 -0
- package/dist/apps/chat/web-app.js +2569 -0
- package/dist/apps/chat-ui/assets/apl-BxEMbctQ.js +1 -0
- package/dist/apps/chat-ui/assets/asciiarmor-eFjeGRuZ.js +1 -0
- package/dist/apps/chat-ui/assets/asn1-Cfx-0pt9.js +1 -0
- package/dist/apps/chat-ui/assets/asterisk-B5BHTsBr.js +1 -0
- package/dist/apps/chat-ui/assets/brainfuck-CAA2xofr.js +1 -0
- package/dist/apps/chat-ui/assets/clike-BoDCOLzN.js +1 -0
- package/dist/apps/chat-ui/assets/clojure-kVFSWX0o.js +1 -0
- package/dist/apps/chat-ui/assets/cmake-BUPAhezI.js +1 -0
- package/dist/apps/chat-ui/assets/cobol-BfgHZgup.js +1 -0
- package/dist/apps/chat-ui/assets/coffeescript-G1Pe_1AZ.js +1 -0
- package/dist/apps/chat-ui/assets/commonlisp-B3N0CjHn.js +1 -0
- package/dist/apps/chat-ui/assets/crystal-C15ndaGM.js +1 -0
- package/dist/apps/chat-ui/assets/css-BqOeyZOV.js +1 -0
- package/dist/apps/chat-ui/assets/cypher-KjIKv-wW.js +1 -0
- package/dist/apps/chat-ui/assets/d-BlT5AEC-.js +1 -0
- package/dist/apps/chat-ui/assets/diff-oF98tbqj.js +1 -0
- package/dist/apps/chat-ui/assets/dist--55mTWk3.js +1 -0
- package/dist/apps/chat-ui/assets/dist-B5rcjVCj.js +1 -0
- package/dist/apps/chat-ui/assets/dist-BPv5MdlL.js +1 -0
- package/dist/apps/chat-ui/assets/dist-BZ39rB1W.js +1 -0
- package/dist/apps/chat-ui/assets/dist-BsedZGJo.js +1 -0
- package/dist/apps/chat-ui/assets/dist-BvO6SpaM.js +9 -0
- package/dist/apps/chat-ui/assets/dist-C5YJOwhH.js +1 -0
- package/dist/apps/chat-ui/assets/dist-C5oXtFSP.js +1 -0
- package/dist/apps/chat-ui/assets/dist-CG_gRSwv.js +23 -0
- package/dist/apps/chat-ui/assets/dist-CKM5j-iy.js +1 -0
- package/dist/apps/chat-ui/assets/dist-CUp9us2q.js +1 -0
- package/dist/apps/chat-ui/assets/dist-CZ9T4Cly.js +1 -0
- package/dist/apps/chat-ui/assets/dist-D4HhiFWB.js +6 -0
- package/dist/apps/chat-ui/assets/dist-DHE-yBLH.js +1 -0
- package/dist/apps/chat-ui/assets/dist-DSKQpPaz.js +1 -0
- package/dist/apps/chat-ui/assets/dist-L1B-KWZO.js +1 -0
- package/dist/apps/chat-ui/assets/dist-SVPsM5Oi.js +13 -0
- package/dist/apps/chat-ui/assets/dist-Zqt9kNG9.js +1 -0
- package/dist/apps/chat-ui/assets/dist-_DPv0-QF.js +1 -0
- package/dist/apps/chat-ui/assets/dist-_oM7g0eh.js +11 -0
- package/dist/apps/chat-ui/assets/dist-laadbMWg.js +1 -0
- package/dist/apps/chat-ui/assets/dist-nFui3f-r.js +2 -0
- package/dist/apps/chat-ui/assets/dist-tGfufz3b.js +1 -0
- package/dist/apps/chat-ui/assets/dockerfile-CUaqzcqp.js +1 -0
- package/dist/apps/chat-ui/assets/dtd-VCA9yr61.js +1 -0
- package/dist/apps/chat-ui/assets/dylan-O-V5Dw5W.js +1 -0
- package/dist/apps/chat-ui/assets/ebnf-SPmdBkvT.js +1 -0
- package/dist/apps/chat-ui/assets/ecl-ChfCttfI.js +1 -0
- package/dist/apps/chat-ui/assets/eiffel-cB9EbjeN.js +1 -0
- package/dist/apps/chat-ui/assets/elm-BTiVflBU.js +1 -0
- package/dist/apps/chat-ui/assets/erlang-egf0TXFm.js +1 -0
- package/dist/apps/chat-ui/assets/factor-C2tAxNob.js +1 -0
- package/dist/apps/chat-ui/assets/fcl-BiCjh1tj.js +1 -0
- package/dist/apps/chat-ui/assets/forth-C4kDGW6u.js +1 -0
- package/dist/apps/chat-ui/assets/fortran-DzkLaPnd.js +1 -0
- package/dist/apps/chat-ui/assets/gas-DMOxskQF.js +1 -0
- package/dist/apps/chat-ui/assets/gherkin-BPxBpp-k.js +1 -0
- package/dist/apps/chat-ui/assets/groovy-CkEnc0ZY.js +1 -0
- package/dist/apps/chat-ui/assets/haskell-Dadpo9-w.js +1 -0
- package/dist/apps/chat-ui/assets/haxe-CDNZL9MW.js +1 -0
- package/dist/apps/chat-ui/assets/http-jy9Zxxt3.js +1 -0
- package/dist/apps/chat-ui/assets/idl-CGSB6iiy.js +1 -0
- package/dist/apps/chat-ui/assets/index-BdcqTugD.js +151 -0
- package/dist/apps/chat-ui/assets/index-Dk-opWl3.css +1 -0
- package/dist/apps/chat-ui/assets/javascript-DSlzRUd8.js +1 -0
- package/dist/apps/chat-ui/assets/julia-DTiF9v6R.js +1 -0
- package/dist/apps/chat-ui/assets/livescript-Ci8Xxna6.js +1 -0
- package/dist/apps/chat-ui/assets/lua-eVxIrt9t.js +1 -0
- package/dist/apps/chat-ui/assets/mathematica-Da3grj36.js +1 -0
- package/dist/apps/chat-ui/assets/mbox-BWBMSafM.js +1 -0
- package/dist/apps/chat-ui/assets/mirc-CtHu9S1B.js +1 -0
- package/dist/apps/chat-ui/assets/mllike-wTFlPWXS.js +1 -0
- package/dist/apps/chat-ui/assets/modelica-cKbQ0UXu.js +1 -0
- package/dist/apps/chat-ui/assets/mscgen-C5pXQCMK.js +1 -0
- package/dist/apps/chat-ui/assets/mumps-CKBHkOQq.js +1 -0
- package/dist/apps/chat-ui/assets/nginx-B00AiQel.js +1 -0
- package/dist/apps/chat-ui/assets/nsis-SMDwKltR.js +1 -0
- package/dist/apps/chat-ui/assets/ntriples-B_36EBV0.js +1 -0
- package/dist/apps/chat-ui/assets/octave-BXPjzAif.js +1 -0
- package/dist/apps/chat-ui/assets/oz-Dedpat1M.js +1 -0
- package/dist/apps/chat-ui/assets/pascal-CMcUg72K.js +1 -0
- package/dist/apps/chat-ui/assets/perl-DoVTbnzt.js +1 -0
- package/dist/apps/chat-ui/assets/pig-CULXT1YV.js +1 -0
- package/dist/apps/chat-ui/assets/powershell-Cv5Uhf6b.js +1 -0
- package/dist/apps/chat-ui/assets/properties-CQ1C2P-M.js +1 -0
- package/dist/apps/chat-ui/assets/protobuf-SRlvzrl6.js +1 -0
- package/dist/apps/chat-ui/assets/pug-Bo3wfL-f.js +1 -0
- package/dist/apps/chat-ui/assets/puppet-ClSqCGj6.js +1 -0
- package/dist/apps/chat-ui/assets/python-C2_X1GpX.js +1 -0
- package/dist/apps/chat-ui/assets/q-B_6Gdyzl.js +1 -0
- package/dist/apps/chat-ui/assets/r-BD07NGED.js +1 -0
- package/dist/apps/chat-ui/assets/rolldown-runtime-S-ySWqyJ.js +1 -0
- package/dist/apps/chat-ui/assets/rpm-CRu5Z2Jl.js +1 -0
- package/dist/apps/chat-ui/assets/ruby-dZPnOz8h.js +1 -0
- package/dist/apps/chat-ui/assets/sas-S2t8_sDI.js +1 -0
- package/dist/apps/chat-ui/assets/scheme-WcyFWLW2.js +1 -0
- package/dist/apps/chat-ui/assets/shell-DUelnYSh.js +1 -0
- package/dist/apps/chat-ui/assets/sieve-jDjlVhNh.js +1 -0
- package/dist/apps/chat-ui/assets/simple-mode-CL04yRVp.js +1 -0
- package/dist/apps/chat-ui/assets/smalltalk-ddWDYy10.js +1 -0
- package/dist/apps/chat-ui/assets/solr-C7rQhLuW.js +1 -0
- package/dist/apps/chat-ui/assets/sparql--fPCCgVd.js +1 -0
- package/dist/apps/chat-ui/assets/spreadsheet-DjthqD5G.js +1 -0
- package/dist/apps/chat-ui/assets/sql-D_dieYbr.js +1 -0
- package/dist/apps/chat-ui/assets/stex-rHcFYcA0.js +1 -0
- package/dist/apps/chat-ui/assets/stylus-DxF70RNr.js +1 -0
- package/dist/apps/chat-ui/assets/swift-T0hDoOb-.js +1 -0
- package/dist/apps/chat-ui/assets/tcl-Dlzy1mPk.js +1 -0
- package/dist/apps/chat-ui/assets/textile-Dy5rFZe5.js +1 -0
- package/dist/apps/chat-ui/assets/tiddlywiki-DQP1OymS.js +1 -0
- package/dist/apps/chat-ui/assets/tiki-0vOj3DB2.js +1 -0
- package/dist/apps/chat-ui/assets/toml-DEltN0lI.js +1 -0
- package/dist/apps/chat-ui/assets/troff-CRbBpEqY.js +1 -0
- package/dist/apps/chat-ui/assets/ttcn-M5q1nLKg.js +1 -0
- package/dist/apps/chat-ui/assets/ttcn-cfg-Rmw9NWq9.js +1 -0
- package/dist/apps/chat-ui/assets/turtle-BCDWhJK0.js +1 -0
- package/dist/apps/chat-ui/assets/vb-QQ7LGlOz.js +1 -0
- package/dist/apps/chat-ui/assets/vbscript-BiSEdUzz.js +1 -0
- package/dist/apps/chat-ui/assets/velocity-CzMg5_6w.js +1 -0
- package/dist/apps/chat-ui/assets/verilog-BJOO83gk.js +1 -0
- package/dist/apps/chat-ui/assets/vhdl-ed4zAZAA.js +1 -0
- package/dist/apps/chat-ui/assets/webidl-Ddy6hbV6.js +1 -0
- package/dist/apps/chat-ui/assets/xquery-Bw1zwhh6.js +1 -0
- package/dist/apps/chat-ui/assets/yacas-DZdTXy3s.js +1 -0
- package/dist/apps/chat-ui/assets/z80-DMG02_YV.js +1 -0
- package/dist/apps/chat-ui/index.html +15 -0
- package/dist/apps/context-files-ui/assets/apl-14BqhLYK.js +1 -0
- package/dist/apps/context-files-ui/assets/asciiarmor-WLvjqI7d.js +1 -0
- package/dist/apps/context-files-ui/assets/asn1-Bg4FbdCg.js +1 -0
- package/dist/apps/context-files-ui/assets/asterisk-B2MO-X4d.js +1 -0
- package/dist/apps/context-files-ui/assets/brainfuck-CV9kufud.js +1 -0
- package/dist/apps/context-files-ui/assets/clike-CjmcUpt6.js +1 -0
- package/dist/apps/context-files-ui/assets/clojure-De3QGfx6.js +1 -0
- package/dist/apps/context-files-ui/assets/cmake-i2VDNaRq.js +1 -0
- package/dist/apps/context-files-ui/assets/cobol-BwO6DF08.js +1 -0
- package/dist/apps/context-files-ui/assets/coffeescript-BtivDvRz.js +1 -0
- package/dist/apps/context-files-ui/assets/commonlisp-DFkEQdLP.js +1 -0
- package/dist/apps/context-files-ui/assets/crystal-CU0NkcVL.js +1 -0
- package/dist/apps/context-files-ui/assets/css-CbMZAQ1W.js +1 -0
- package/dist/apps/context-files-ui/assets/cypher-Dke5QOzv.js +1 -0
- package/dist/apps/context-files-ui/assets/d-TPqSVaHM.js +1 -0
- package/dist/apps/context-files-ui/assets/diff-B365LSoZ.js +1 -0
- package/dist/apps/context-files-ui/assets/dist-B5PTVnox.js +1 -0
- package/dist/apps/context-files-ui/assets/dist-B5ZAfwf5.js +1 -0
- package/dist/apps/context-files-ui/assets/dist-BJW3917N.js +11 -0
- package/dist/apps/context-files-ui/assets/dist-BkUONE3N.js +1 -0
- package/dist/apps/context-files-ui/assets/dist-CKQF1zEu.js +1 -0
- package/dist/apps/context-files-ui/assets/dist-CwbH_3RN.js +1 -0
- package/dist/apps/context-files-ui/assets/dist-CxRLRmMx.js +2 -0
- package/dist/apps/context-files-ui/assets/dist-D1KyNDg5.js +13 -0
- package/dist/apps/context-files-ui/assets/dist-DFi2YGux.js +1 -0
- package/dist/apps/context-files-ui/assets/dist-DKoyMSNr.js +1 -0
- package/dist/apps/context-files-ui/assets/dist-DLMjd26T.js +1 -0
- package/dist/apps/context-files-ui/assets/dist-DQXzt2Ng.js +1 -0
- package/dist/apps/context-files-ui/assets/dist-DotDq_kD.js +1 -0
- package/dist/apps/context-files-ui/assets/dist-DyfSeBMu.js +1 -0
- package/dist/apps/context-files-ui/assets/dist-MyZgX9K2.js +9 -0
- package/dist/apps/context-files-ui/assets/dist-QQuDy4KA.js +1 -0
- package/dist/apps/context-files-ui/assets/dist-YwR9dpb-.js +1 -0
- package/dist/apps/context-files-ui/assets/dist-dTBsFYAl.js +1 -0
- package/dist/apps/context-files-ui/assets/dockerfile-CJb2sekW.js +1 -0
- package/dist/apps/context-files-ui/assets/dtd-CBMymJ7O.js +1 -0
- package/dist/apps/context-files-ui/assets/dylan-08Azy1NK.js +1 -0
- package/dist/apps/context-files-ui/assets/ebnf-Dkum_1J8.js +1 -0
- package/dist/apps/context-files-ui/assets/ecl-dhxjHL8y.js +1 -0
- package/dist/apps/context-files-ui/assets/eiffel-C446m6dI.js +1 -0
- package/dist/apps/context-files-ui/assets/elm-po1E9de0.js +1 -0
- package/dist/apps/context-files-ui/assets/erlang-BD5LkVkR.js +1 -0
- package/dist/apps/context-files-ui/assets/factor-B2EMQZkP.js +1 -0
- package/dist/apps/context-files-ui/assets/fcl-DkEOamHd.js +1 -0
- package/dist/apps/context-files-ui/assets/forth-dCg2_HVB.js +1 -0
- package/dist/apps/context-files-ui/assets/fortran-3ZpXLFh1.js +1 -0
- package/dist/apps/context-files-ui/assets/gas-DMmxLZRI.js +1 -0
- package/dist/apps/context-files-ui/assets/gherkin-DUSFg2R6.js +1 -0
- package/dist/apps/context-files-ui/assets/groovy-Cmduloe1.js +1 -0
- package/dist/apps/context-files-ui/assets/haskell-Cyr255R9.js +1 -0
- package/dist/apps/context-files-ui/assets/haxe-BJVKtprM.js +1 -0
- package/dist/apps/context-files-ui/assets/http-DszHFpc-.js +1 -0
- package/dist/apps/context-files-ui/assets/idl-Cati9Nrv.js +1 -0
- package/dist/apps/context-files-ui/assets/index-BwRDoHMC.css +1 -0
- package/dist/apps/context-files-ui/assets/index-GwvjXytt.js +202 -0
- package/dist/apps/context-files-ui/assets/javascript-C5pDVaoP.js +1 -0
- package/dist/apps/context-files-ui/assets/julia-DlqY1cTU.js +1 -0
- package/dist/apps/context-files-ui/assets/livescript-C6p8-2W1.js +1 -0
- package/dist/apps/context-files-ui/assets/lua-BxuTHaF7.js +1 -0
- package/dist/apps/context-files-ui/assets/mathematica-nDHZUMJT.js +1 -0
- package/dist/apps/context-files-ui/assets/mbox-DAaR0Hcz.js +1 -0
- package/dist/apps/context-files-ui/assets/mirc-CCA0FRfl.js +1 -0
- package/dist/apps/context-files-ui/assets/mllike-Cw3Iccsb.js +1 -0
- package/dist/apps/context-files-ui/assets/modelica-Czx80fNR.js +1 -0
- package/dist/apps/context-files-ui/assets/mscgen-BmfuTbzG.js +1 -0
- package/dist/apps/context-files-ui/assets/mumps-Ds_ZaumL.js +1 -0
- package/dist/apps/context-files-ui/assets/nginx-D9M2PQ4U.js +1 -0
- package/dist/apps/context-files-ui/assets/nsis-DOo3SJmd.js +1 -0
- package/dist/apps/context-files-ui/assets/ntriples-DLHGTvHs.js +1 -0
- package/dist/apps/context-files-ui/assets/octave-8jj96JiC.js +1 -0
- package/dist/apps/context-files-ui/assets/oz-BmMq7iC4.js +1 -0
- package/dist/apps/context-files-ui/assets/pascal-BgMr6XpT.js +1 -0
- package/dist/apps/context-files-ui/assets/perl-D6YJObi_.js +1 -0
- package/dist/apps/context-files-ui/assets/pig-nx7uchs8.js +1 -0
- package/dist/apps/context-files-ui/assets/powershell-B4IPkVxR.js +1 -0
- package/dist/apps/context-files-ui/assets/properties-CoavQdLC.js +1 -0
- package/dist/apps/context-files-ui/assets/protobuf-D5EWhcmc.js +1 -0
- package/dist/apps/context-files-ui/assets/pug-QU72BPAa.js +1 -0
- package/dist/apps/context-files-ui/assets/puppet-B_0GFuyD.js +1 -0
- package/dist/apps/context-files-ui/assets/python-Cs7sNzy_.js +1 -0
- package/dist/apps/context-files-ui/assets/q-BIB9pPtI.js +1 -0
- package/dist/apps/context-files-ui/assets/r-CN5s4f3o.js +1 -0
- package/dist/apps/context-files-ui/assets/rpm-Ct_Ck8mQ.js +1 -0
- package/dist/apps/context-files-ui/assets/ruby-BVPradRk.js +1 -0
- package/dist/apps/context-files-ui/assets/sas-DN4j74IF.js +1 -0
- package/dist/apps/context-files-ui/assets/scheme-CvNgHAnh.js +1 -0
- package/dist/apps/context-files-ui/assets/shell-BjiMLAaM.js +1 -0
- package/dist/apps/context-files-ui/assets/sieve-C2U1O5Z4.js +1 -0
- package/dist/apps/context-files-ui/assets/simple-mode-DnMbQuKW.js +1 -0
- package/dist/apps/context-files-ui/assets/smalltalk-DkYwYufV.js +1 -0
- package/dist/apps/context-files-ui/assets/solr-BopnSD-v.js +1 -0
- package/dist/apps/context-files-ui/assets/sparql-Cpg3YQfd.js +1 -0
- package/dist/apps/context-files-ui/assets/spreadsheet-kRxtVt9J.js +1 -0
- package/dist/apps/context-files-ui/assets/sql-DYI2GwJR.js +1 -0
- package/dist/apps/context-files-ui/assets/stex-BCRT8IJ3.js +1 -0
- package/dist/apps/context-files-ui/assets/stylus-CARoeVE9.js +1 -0
- package/dist/apps/context-files-ui/assets/swift-DKNaLAK6.js +1 -0
- package/dist/apps/context-files-ui/assets/tcl-CQyXkgMH.js +1 -0
- package/dist/apps/context-files-ui/assets/textile-Yg_UWn-t.js +1 -0
- package/dist/apps/context-files-ui/assets/tiddlywiki-dqVbkfX4.js +1 -0
- package/dist/apps/context-files-ui/assets/tiki-CC_ic8g0.js +1 -0
- package/dist/apps/context-files-ui/assets/toml-B7gGzVkJ.js +1 -0
- package/dist/apps/context-files-ui/assets/troff-Bq3z6oAu.js +1 -0
- package/dist/apps/context-files-ui/assets/ttcn-GvRgs2AT.js +1 -0
- package/dist/apps/context-files-ui/assets/ttcn-cfg-CGCXz7Vo.js +1 -0
- package/dist/apps/context-files-ui/assets/turtle-CwIpz2yy.js +1 -0
- package/dist/apps/context-files-ui/assets/vb-BmcHUM2C.js +1 -0
- package/dist/apps/context-files-ui/assets/vbscript-Cs9dylre.js +1 -0
- package/dist/apps/context-files-ui/assets/velocity-CBWU0VCy.js +1 -0
- package/dist/apps/context-files-ui/assets/verilog-DVCHmufx.js +1 -0
- package/dist/apps/context-files-ui/assets/vhdl-BGDk4f1d.js +1 -0
- package/dist/apps/context-files-ui/assets/webidl-egXQEWlC.js +1 -0
- package/dist/apps/context-files-ui/assets/xquery-5f0hn7cg.js +1 -0
- package/dist/apps/context-files-ui/assets/yacas-DNs9XkmQ.js +1 -0
- package/dist/apps/context-files-ui/assets/z80-B7Dfb4UO.js +1 -0
- package/dist/apps/context-files-ui/index.html +14 -0
- package/dist/auth/better-auth.js +129 -0
- package/dist/auth/types.js +14 -0
- package/dist/bin/pibo.js +3 -0
- package/dist/channels/types.js +1 -0
- package/dist/cli-errors.js +18 -0
- package/dist/cli.js +264 -0
- package/dist/config/config.js +167 -0
- package/dist/core/base-prompt.js +104 -0
- package/dist/core/codex-compat.js +44 -0
- package/dist/core/compaction-prompt.js +258 -0
- package/dist/core/events.js +1 -0
- package/dist/core/profiles.js +138 -0
- package/dist/core/routed-session.js +538 -0
- package/dist/core/runtime.js +323 -0
- package/dist/core/session-router.js +437 -0
- package/dist/core/system-prompt-template.js +56 -0
- package/dist/core/thinking.js +9 -0
- package/dist/core/workspace.js +5 -0
- package/dist/debug/events.js +92 -0
- package/dist/debug/index.js +631 -0
- package/dist/debug/session.js +200 -0
- package/dist/debug/sql.js +238 -0
- package/dist/debug/stores.js +49 -0
- package/dist/debug/trace.js +245 -0
- package/dist/env.js +32 -0
- package/dist/gateway/client.js +200 -0
- package/dist/gateway/protocol.js +46 -0
- package/dist/gateway/request.js +146 -0
- package/dist/gateway/server.js +221 -0
- package/dist/gateway/tool.js +69 -0
- package/dist/gateway/web.js +80 -0
- package/dist/index.js +23 -0
- package/dist/local/client.js +77 -0
- package/dist/local/extension.js +548 -0
- package/dist/local/tui.js +25 -0
- package/dist/mcp/agent-context.js +123 -0
- package/dist/mcp/client.js +332 -0
- package/dist/mcp/commands/call.js +146 -0
- package/dist/mcp/commands/grep.js +145 -0
- package/dist/mcp/commands/info.js +71 -0
- package/dist/mcp/commands/list.js +94 -0
- package/dist/mcp/config-command.js +217 -0
- package/dist/mcp/config.js +440 -0
- package/dist/mcp/daemon-client.js +266 -0
- package/dist/mcp/daemon.js +327 -0
- package/dist/mcp/errors.js +287 -0
- package/dist/mcp/index.js +431 -0
- package/dist/mcp/output.js +171 -0
- package/dist/mcp/python-runtime.js +131 -0
- package/dist/mcp/registry.js +116 -0
- package/dist/mcp/version.js +5 -0
- package/dist/pi-packages/cli.js +92 -0
- package/dist/pi-packages/installer.js +70 -0
- package/dist/pi-packages/metadata.js +231 -0
- package/dist/pi-packages/runtime.js +61 -0
- package/dist/pi-packages/store.js +175 -0
- package/dist/pi-packages/types.js +1 -0
- package/dist/plugins/better-auth.js +11 -0
- package/dist/plugins/builtin.js +249 -0
- package/dist/plugins/chat-web.js +11 -0
- package/dist/plugins/codex-compat.js +72 -0
- package/dist/plugins/context-files-store.js +354 -0
- package/dist/plugins/context-files.js +999 -0
- package/dist/plugins/core-tools.js +94 -0
- package/dist/plugins/example.js +67 -0
- package/dist/plugins/registry.js +368 -0
- package/dist/plugins/remote-agent.js +9 -0
- package/dist/plugins/types.js +1 -0
- package/dist/plugins/web.js +11 -0
- package/dist/reliability/store.js +759 -0
- package/dist/remote/channel.js +176 -0
- package/dist/remote/client.js +92 -0
- package/dist/remote/examples/tui-controller.js +263 -0
- package/dist/remote/protocol.js +55 -0
- package/dist/remote/session-client.js +189 -0
- package/dist/runs/registry.js +323 -0
- package/dist/runs/tools.js +185 -0
- package/dist/sessions/bindings.js +41 -0
- package/dist/sessions/sqlite-store.js +154 -0
- package/dist/sessions/store.js +125 -0
- package/dist/shared/trace-order.js +83 -0
- package/dist/subagents/tool.js +63 -0
- package/dist/tools/browser-use-cdp.js +207 -0
- package/dist/tools/browser-use-leases.js +338 -0
- package/dist/tools/browser-use-wrapper.js +338 -0
- package/dist/tools/codex-compat.js +85 -0
- package/dist/tools/desktop-env.js +90 -0
- package/dist/tools/guides.js +276 -0
- package/dist/tools/index.js +366 -0
- package/dist/tools/python-runtime.js +154 -0
- package/dist/tools/registry.js +107 -0
- package/dist/tools/web-search.js +137 -0
- package/dist/web/auth.js +10 -0
- package/dist/web/channel.js +151 -0
- package/dist/web/http.js +110 -0
- package/dist/web/types.js +1 -0
- package/package.json +74 -0
- package/src/mcp/LICENSE.mcp-cli +21 -0
|
@@ -0,0 +1,431 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP-CLI - A lightweight CLI for interacting with MCP servers
|
|
3
|
+
*
|
|
4
|
+
* Commands:
|
|
5
|
+
* mcp-cli List all servers and tools
|
|
6
|
+
* mcp-cli info <server> Show server details
|
|
7
|
+
* mcp-cli info <server> <tool> Show tool schema
|
|
8
|
+
* mcp-cli grep <pattern> Search tools by glob pattern
|
|
9
|
+
* mcp-cli call <server> <tool> Call tool (reads JSON from stdin if no args)
|
|
10
|
+
* mcp-cli call <server> <tool> {} Call tool with JSON args
|
|
11
|
+
*/
|
|
12
|
+
import { readFileSync } from 'node:fs';
|
|
13
|
+
import { configCommand } from './config-command.js';
|
|
14
|
+
import { ensureConfigExists, } from './config.js';
|
|
15
|
+
import { ErrorCode, ambiguousCommandError, formatCliError, missingArgumentError, tooManyArgumentsError, unknownOptionError, unknownSubcommandError, } from './errors.js';
|
|
16
|
+
import { registryCommand } from './registry.js';
|
|
17
|
+
import { VERSION } from './version.js';
|
|
18
|
+
/**
|
|
19
|
+
* Known subcommands
|
|
20
|
+
*/
|
|
21
|
+
const SUBCOMMANDS = ['info', 'grep', 'call', 'config', 'registry'];
|
|
22
|
+
/**
|
|
23
|
+
* Check if a string looks like a subcommand (not a server name)
|
|
24
|
+
*/
|
|
25
|
+
function isKnownSubcommand(arg) {
|
|
26
|
+
return SUBCOMMANDS.includes(arg);
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Check if a string looks like it could be an unknown subcommand
|
|
30
|
+
* (common aliases that users might try)
|
|
31
|
+
*/
|
|
32
|
+
function isPossibleSubcommand(arg) {
|
|
33
|
+
const aliases = [
|
|
34
|
+
'run',
|
|
35
|
+
'execute',
|
|
36
|
+
'exec',
|
|
37
|
+
'invoke',
|
|
38
|
+
'list',
|
|
39
|
+
'ls',
|
|
40
|
+
'get',
|
|
41
|
+
'show',
|
|
42
|
+
'describe',
|
|
43
|
+
'search',
|
|
44
|
+
'find',
|
|
45
|
+
'query',
|
|
46
|
+
];
|
|
47
|
+
return aliases.includes(arg.toLowerCase());
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Parse server/tool from either "server/tool" or "server tool" format
|
|
51
|
+
*/
|
|
52
|
+
function parseServerTool(args) {
|
|
53
|
+
if (args.length === 0) {
|
|
54
|
+
return { server: '' };
|
|
55
|
+
}
|
|
56
|
+
const first = args[0];
|
|
57
|
+
// Check for slash format: server/tool
|
|
58
|
+
if (first.includes('/')) {
|
|
59
|
+
const slashIndex = first.indexOf('/');
|
|
60
|
+
return {
|
|
61
|
+
server: first.substring(0, slashIndex),
|
|
62
|
+
tool: first.substring(slashIndex + 1) || undefined,
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
// Space format: server tool
|
|
66
|
+
return {
|
|
67
|
+
server: first,
|
|
68
|
+
tool: args[1],
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Parse command line arguments
|
|
73
|
+
*/
|
|
74
|
+
function parseArgs(args) {
|
|
75
|
+
const result = {
|
|
76
|
+
command: 'info',
|
|
77
|
+
withDescriptions: false,
|
|
78
|
+
registryRunSetup: true,
|
|
79
|
+
};
|
|
80
|
+
const positional = [];
|
|
81
|
+
for (let i = 0; i < args.length; i++) {
|
|
82
|
+
const arg = args[i];
|
|
83
|
+
switch (arg) {
|
|
84
|
+
case '-h':
|
|
85
|
+
case '--help':
|
|
86
|
+
result.command = 'help';
|
|
87
|
+
return result;
|
|
88
|
+
case '-v':
|
|
89
|
+
case '--version':
|
|
90
|
+
result.command = 'version';
|
|
91
|
+
return result;
|
|
92
|
+
case '-d':
|
|
93
|
+
case '--with-descriptions':
|
|
94
|
+
result.withDescriptions = true;
|
|
95
|
+
break;
|
|
96
|
+
case '-c':
|
|
97
|
+
case '--config':
|
|
98
|
+
result.configPath = args[++i];
|
|
99
|
+
if (!result.configPath) {
|
|
100
|
+
console.error(formatCliError(missingArgumentError('-c/--config', 'path')));
|
|
101
|
+
process.exit(ErrorCode.CLIENT_ERROR);
|
|
102
|
+
}
|
|
103
|
+
break;
|
|
104
|
+
case '--no-setup':
|
|
105
|
+
case '--skip-setup':
|
|
106
|
+
result.registryRunSetup = false;
|
|
107
|
+
break;
|
|
108
|
+
default:
|
|
109
|
+
// Single '-' is allowed (stdin indicator), but other dash-prefixed args are options
|
|
110
|
+
if (arg.startsWith('-') && arg !== '-') {
|
|
111
|
+
console.error(formatCliError(unknownOptionError(arg)));
|
|
112
|
+
process.exit(ErrorCode.CLIENT_ERROR);
|
|
113
|
+
}
|
|
114
|
+
positional.push(arg);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
// No positional args = list all servers
|
|
118
|
+
if (positional.length === 0) {
|
|
119
|
+
result.command = 'list';
|
|
120
|
+
return result;
|
|
121
|
+
}
|
|
122
|
+
const firstArg = positional[0];
|
|
123
|
+
// =========================================================================
|
|
124
|
+
// Explicit subcommand routing
|
|
125
|
+
// =========================================================================
|
|
126
|
+
if (firstArg === 'info') {
|
|
127
|
+
result.command = 'info';
|
|
128
|
+
const remaining = positional.slice(1);
|
|
129
|
+
const { server, tool } = parseServerTool(remaining);
|
|
130
|
+
// info requires a server argument - show available servers in error
|
|
131
|
+
if (!server) {
|
|
132
|
+
// Try to load config synchronously to show available servers
|
|
133
|
+
let availableServers = [];
|
|
134
|
+
const configPaths = [
|
|
135
|
+
result.configPath,
|
|
136
|
+
process.env.MCP_CONFIG_PATH,
|
|
137
|
+
'./mcp_servers.json',
|
|
138
|
+
`${process.env.HOME}/.mcp_servers.json`,
|
|
139
|
+
`${process.env.HOME}/.config/mcp/mcp_servers.json`,
|
|
140
|
+
].filter(Boolean);
|
|
141
|
+
for (const cfgPath of configPaths) {
|
|
142
|
+
try {
|
|
143
|
+
const content = readFileSync(cfgPath, 'utf-8');
|
|
144
|
+
const config = JSON.parse(content);
|
|
145
|
+
if (config.mcpServers) {
|
|
146
|
+
availableServers = Object.keys(config.mcpServers);
|
|
147
|
+
break;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
catch {
|
|
151
|
+
// Try next path
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
const serverList = availableServers.length > 0
|
|
155
|
+
? availableServers.join(', ')
|
|
156
|
+
: '(none found)';
|
|
157
|
+
console.error('Error [MISSING_ARGUMENT]: Missing required argument for info: server');
|
|
158
|
+
console.error(` Available servers: ${serverList}`);
|
|
159
|
+
console.error(` Suggestion: Use 'pibo mcp info <server>' to see server details, or just 'pibo mcp' to list all`);
|
|
160
|
+
process.exit(ErrorCode.CLIENT_ERROR);
|
|
161
|
+
}
|
|
162
|
+
result.server = server;
|
|
163
|
+
result.tool = tool;
|
|
164
|
+
return result;
|
|
165
|
+
}
|
|
166
|
+
if (firstArg === 'config') {
|
|
167
|
+
const action = positional[1] ?? 'help';
|
|
168
|
+
result.command = 'config';
|
|
169
|
+
switch (action) {
|
|
170
|
+
case 'help':
|
|
171
|
+
case 'schema':
|
|
172
|
+
case 'paths':
|
|
173
|
+
case 'init':
|
|
174
|
+
case 'path':
|
|
175
|
+
case 'show':
|
|
176
|
+
result.configAction = action;
|
|
177
|
+
return result;
|
|
178
|
+
case 'add':
|
|
179
|
+
result.configAction = 'add';
|
|
180
|
+
result.configName = positional[2];
|
|
181
|
+
result.configJson = positional.slice(3).join(' ') || undefined;
|
|
182
|
+
return result;
|
|
183
|
+
case 'remove':
|
|
184
|
+
case 'rm':
|
|
185
|
+
result.configAction = 'remove';
|
|
186
|
+
result.configName = positional[2];
|
|
187
|
+
return result;
|
|
188
|
+
case 'describe':
|
|
189
|
+
result.configAction = 'describe';
|
|
190
|
+
result.configName = positional[2];
|
|
191
|
+
result.configJson = positional.slice(3).join(' ') || undefined;
|
|
192
|
+
return result;
|
|
193
|
+
default:
|
|
194
|
+
console.error(formatCliError(unknownSubcommandError(`config ${action}`)));
|
|
195
|
+
process.exit(ErrorCode.CLIENT_ERROR);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
if (firstArg === 'registry') {
|
|
199
|
+
const action = positional[1] ?? 'help';
|
|
200
|
+
result.command = 'registry';
|
|
201
|
+
switch (action) {
|
|
202
|
+
case 'help':
|
|
203
|
+
case 'list':
|
|
204
|
+
result.registryAction = action;
|
|
205
|
+
return result;
|
|
206
|
+
case 'show':
|
|
207
|
+
case 'install':
|
|
208
|
+
case 'doctor':
|
|
209
|
+
case 'remove':
|
|
210
|
+
case 'rm':
|
|
211
|
+
result.registryAction = action === 'rm' ? 'remove' : action;
|
|
212
|
+
result.registryName = positional[2];
|
|
213
|
+
return result;
|
|
214
|
+
default:
|
|
215
|
+
console.error(formatCliError(unknownSubcommandError(`registry ${action}`)));
|
|
216
|
+
process.exit(ErrorCode.CLIENT_ERROR);
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
if (firstArg === 'grep') {
|
|
220
|
+
result.command = 'grep';
|
|
221
|
+
result.pattern = positional[1];
|
|
222
|
+
if (!result.pattern) {
|
|
223
|
+
console.error(formatCliError(missingArgumentError('grep', 'pattern')));
|
|
224
|
+
process.exit(ErrorCode.CLIENT_ERROR);
|
|
225
|
+
}
|
|
226
|
+
if (positional.length > 2) {
|
|
227
|
+
console.error(formatCliError(tooManyArgumentsError('grep', positional.length - 1, 1)));
|
|
228
|
+
process.exit(ErrorCode.CLIENT_ERROR);
|
|
229
|
+
}
|
|
230
|
+
return result;
|
|
231
|
+
}
|
|
232
|
+
if (firstArg === 'call') {
|
|
233
|
+
result.command = 'call';
|
|
234
|
+
const remaining = positional.slice(1);
|
|
235
|
+
if (remaining.length === 0) {
|
|
236
|
+
console.error(formatCliError(missingArgumentError('call', 'server and tool')));
|
|
237
|
+
process.exit(ErrorCode.CLIENT_ERROR);
|
|
238
|
+
}
|
|
239
|
+
// Parse server/tool from remaining args
|
|
240
|
+
const { server, tool } = parseServerTool(remaining);
|
|
241
|
+
result.server = server;
|
|
242
|
+
if (!tool) {
|
|
243
|
+
// Check if it was slash format without tool
|
|
244
|
+
if (remaining[0].includes('/') && !remaining[0].split('/')[1]) {
|
|
245
|
+
console.error(formatCliError(missingArgumentError('call', 'tool')));
|
|
246
|
+
process.exit(ErrorCode.CLIENT_ERROR);
|
|
247
|
+
}
|
|
248
|
+
// Space format with only server
|
|
249
|
+
if (remaining.length < 2) {
|
|
250
|
+
console.error(formatCliError(missingArgumentError('call', 'tool')));
|
|
251
|
+
process.exit(ErrorCode.CLIENT_ERROR);
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
result.tool = tool;
|
|
255
|
+
// Determine where args start
|
|
256
|
+
let argsStartIndex;
|
|
257
|
+
if (remaining[0].includes('/')) {
|
|
258
|
+
// slash format: call server/tool '{}' → args at index 1
|
|
259
|
+
argsStartIndex = 1;
|
|
260
|
+
}
|
|
261
|
+
else {
|
|
262
|
+
// space format: call server tool '{}' → args at index 2
|
|
263
|
+
argsStartIndex = 2;
|
|
264
|
+
}
|
|
265
|
+
// Collect remaining args as JSON (support '-' for stdin)
|
|
266
|
+
const jsonArgs = remaining.slice(argsStartIndex);
|
|
267
|
+
if (jsonArgs.length > 0) {
|
|
268
|
+
const argsValue = jsonArgs.join(' ');
|
|
269
|
+
result.args = argsValue === '-' ? undefined : argsValue;
|
|
270
|
+
}
|
|
271
|
+
return result;
|
|
272
|
+
}
|
|
273
|
+
// =========================================================================
|
|
274
|
+
// Check for unknown subcommand (common aliases)
|
|
275
|
+
// =========================================================================
|
|
276
|
+
if (isPossibleSubcommand(firstArg)) {
|
|
277
|
+
console.error(formatCliError(unknownSubcommandError(firstArg)));
|
|
278
|
+
process.exit(ErrorCode.CLIENT_ERROR);
|
|
279
|
+
}
|
|
280
|
+
// =========================================================================
|
|
281
|
+
// Slash format without subcommand → error (require explicit subcommand)
|
|
282
|
+
// =========================================================================
|
|
283
|
+
if (firstArg.includes('/')) {
|
|
284
|
+
const parts = firstArg.split('/');
|
|
285
|
+
const serverName = parts[0];
|
|
286
|
+
const toolName = parts[1] || '';
|
|
287
|
+
const hasArgs = positional.length > 1;
|
|
288
|
+
console.error(formatCliError(ambiguousCommandError(serverName, toolName, hasArgs)));
|
|
289
|
+
process.exit(ErrorCode.CLIENT_ERROR);
|
|
290
|
+
}
|
|
291
|
+
// =========================================================================
|
|
292
|
+
// Ambiguous command detection: server tool without subcommand
|
|
293
|
+
// =========================================================================
|
|
294
|
+
if (positional.length >= 2) {
|
|
295
|
+
const serverName = positional[0];
|
|
296
|
+
const possibleTool = positional[1];
|
|
297
|
+
// Check if second arg looks like a tool name (not JSON)
|
|
298
|
+
const looksLikeJson = possibleTool.startsWith('{') || possibleTool.startsWith('[');
|
|
299
|
+
const looksLikeToolName = /^[a-zA-Z_][a-zA-Z0-9_-]*$/.test(possibleTool);
|
|
300
|
+
if (!looksLikeJson && looksLikeToolName) {
|
|
301
|
+
const hasArgs = positional.length > 2;
|
|
302
|
+
console.error(formatCliError(ambiguousCommandError(serverName, possibleTool, hasArgs)));
|
|
303
|
+
process.exit(ErrorCode.CLIENT_ERROR);
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
// =========================================================================
|
|
307
|
+
// Default: single server name → info
|
|
308
|
+
// =========================================================================
|
|
309
|
+
result.command = 'info';
|
|
310
|
+
result.server = firstArg;
|
|
311
|
+
return result;
|
|
312
|
+
}
|
|
313
|
+
/**
|
|
314
|
+
* Print help message
|
|
315
|
+
*/
|
|
316
|
+
function printHelp() {
|
|
317
|
+
console.log(`
|
|
318
|
+
pibo mcp (mcp-cli v${VERSION}) - A lightweight CLI for MCP servers
|
|
319
|
+
|
|
320
|
+
Commands:
|
|
321
|
+
pibo mcp List configured servers and tools
|
|
322
|
+
pibo mcp info <server> Show server tools
|
|
323
|
+
pibo mcp info <server> <tool> Show one tool schema
|
|
324
|
+
pibo mcp grep <pattern> Search tool names
|
|
325
|
+
pibo mcp call <server> <tool> [json] Call one tool
|
|
326
|
+
pibo mcp config Discover config commands
|
|
327
|
+
pibo mcp registry Discover curated server presets
|
|
328
|
+
|
|
329
|
+
Options:
|
|
330
|
+
-v, --version Show version number
|
|
331
|
+
-d, --with-descriptions Include tool descriptions
|
|
332
|
+
-c, --config <path> Path to mcp_servers.json config file
|
|
333
|
+
--no-setup Skip registry setup commands during install
|
|
334
|
+
|
|
335
|
+
Next:
|
|
336
|
+
pibo mcp config help
|
|
337
|
+
pibo mcp registry help
|
|
338
|
+
`);
|
|
339
|
+
}
|
|
340
|
+
/**
|
|
341
|
+
* Build target string from server and tool
|
|
342
|
+
*/
|
|
343
|
+
function buildTarget(server, tool) {
|
|
344
|
+
if (!server)
|
|
345
|
+
return '';
|
|
346
|
+
if (!tool)
|
|
347
|
+
return server;
|
|
348
|
+
return `${server}/${tool}`;
|
|
349
|
+
}
|
|
350
|
+
/**
|
|
351
|
+
* Main entry point
|
|
352
|
+
*/
|
|
353
|
+
export async function runMcpCli(argv = process.argv) {
|
|
354
|
+
try {
|
|
355
|
+
const args = parseArgs(argv.slice(2));
|
|
356
|
+
switch (args.command) {
|
|
357
|
+
case 'help':
|
|
358
|
+
printHelp();
|
|
359
|
+
break;
|
|
360
|
+
case 'version':
|
|
361
|
+
console.log(`pibo mcp (mcp-cli v${VERSION})`);
|
|
362
|
+
break;
|
|
363
|
+
case 'list':
|
|
364
|
+
await ensureConfigExists(args.configPath);
|
|
365
|
+
{
|
|
366
|
+
const { listCommand } = await import('./commands/list.js');
|
|
367
|
+
await listCommand({
|
|
368
|
+
withDescriptions: args.withDescriptions,
|
|
369
|
+
configPath: args.configPath,
|
|
370
|
+
});
|
|
371
|
+
}
|
|
372
|
+
break;
|
|
373
|
+
case 'info':
|
|
374
|
+
await ensureConfigExists(args.configPath);
|
|
375
|
+
{
|
|
376
|
+
const { infoCommand } = await import('./commands/info.js');
|
|
377
|
+
// info always has a server (validated in parseArgs)
|
|
378
|
+
await infoCommand({
|
|
379
|
+
target: buildTarget(args.server, args.tool),
|
|
380
|
+
withDescriptions: args.withDescriptions,
|
|
381
|
+
configPath: args.configPath,
|
|
382
|
+
});
|
|
383
|
+
}
|
|
384
|
+
break;
|
|
385
|
+
case 'grep':
|
|
386
|
+
await ensureConfigExists(args.configPath);
|
|
387
|
+
{
|
|
388
|
+
const { grepCommand } = await import('./commands/grep.js');
|
|
389
|
+
await grepCommand({
|
|
390
|
+
pattern: args.pattern ?? '',
|
|
391
|
+
withDescriptions: args.withDescriptions,
|
|
392
|
+
configPath: args.configPath,
|
|
393
|
+
});
|
|
394
|
+
}
|
|
395
|
+
break;
|
|
396
|
+
case 'call':
|
|
397
|
+
await ensureConfigExists(args.configPath);
|
|
398
|
+
{
|
|
399
|
+
const { callCommand } = await import('./commands/call.js');
|
|
400
|
+
await callCommand({
|
|
401
|
+
target: buildTarget(args.server, args.tool),
|
|
402
|
+
args: args.args,
|
|
403
|
+
configPath: args.configPath,
|
|
404
|
+
});
|
|
405
|
+
}
|
|
406
|
+
break;
|
|
407
|
+
case 'config':
|
|
408
|
+
await configCommand({
|
|
409
|
+
action: args.configAction ?? 'help',
|
|
410
|
+
name: args.configName,
|
|
411
|
+
serverJson: args.configJson,
|
|
412
|
+
description: args.configJson,
|
|
413
|
+
configPath: args.configPath,
|
|
414
|
+
});
|
|
415
|
+
break;
|
|
416
|
+
case 'registry':
|
|
417
|
+
await registryCommand({
|
|
418
|
+
action: args.registryAction ?? 'help',
|
|
419
|
+
name: args.registryName,
|
|
420
|
+
configPath: args.configPath,
|
|
421
|
+
runSetup: args.registryRunSetup,
|
|
422
|
+
});
|
|
423
|
+
break;
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
catch (error) {
|
|
427
|
+
console.error(error.message);
|
|
428
|
+
process.exitCode = ErrorCode.CLIENT_ERROR;
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
export { VERSION as MCP_CLI_VERSION } from './version.js';
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Output formatting utilities
|
|
3
|
+
*/
|
|
4
|
+
import { isHttpServer } from './config.js';
|
|
5
|
+
// ANSI color codes
|
|
6
|
+
const colors = {
|
|
7
|
+
reset: '\x1b[0m',
|
|
8
|
+
bold: '\x1b[1m',
|
|
9
|
+
dim: '\x1b[2m',
|
|
10
|
+
cyan: '\x1b[36m',
|
|
11
|
+
green: '\x1b[32m',
|
|
12
|
+
yellow: '\x1b[33m',
|
|
13
|
+
blue: '\x1b[34m',
|
|
14
|
+
magenta: '\x1b[35m',
|
|
15
|
+
};
|
|
16
|
+
/**
|
|
17
|
+
* Check if output should be colorized
|
|
18
|
+
*/
|
|
19
|
+
function shouldColorize() {
|
|
20
|
+
return process.stdout.isTTY && !process.env.NO_COLOR;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Apply color if terminal supports it
|
|
24
|
+
*/
|
|
25
|
+
function color(text, colorCode) {
|
|
26
|
+
if (!shouldColorize())
|
|
27
|
+
return text;
|
|
28
|
+
return `${colorCode}${text}${colors.reset}`;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Format server list for display
|
|
32
|
+
*/
|
|
33
|
+
export function formatServerList(servers, withDescriptions) {
|
|
34
|
+
const lines = [];
|
|
35
|
+
for (const server of servers) {
|
|
36
|
+
lines.push(color(server.name, colors.bold + colors.cyan));
|
|
37
|
+
// Show instructions if available (first line only in list view, or all if short)
|
|
38
|
+
if (server.instructions) {
|
|
39
|
+
const instructionLines = server.instructions.split('\n');
|
|
40
|
+
const firstLine = instructionLines[0].slice(0, 100);
|
|
41
|
+
const suffix = instructionLines.length > 1 || instructionLines[0].length > 100
|
|
42
|
+
? '...'
|
|
43
|
+
: '';
|
|
44
|
+
lines.push(` ${color(`Instructions: ${firstLine}${suffix}`, colors.dim)}`);
|
|
45
|
+
}
|
|
46
|
+
for (const tool of server.tools) {
|
|
47
|
+
if (withDescriptions && tool.description) {
|
|
48
|
+
lines.push(` • ${tool.name} - ${color(tool.description, colors.dim)}`);
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
lines.push(` • ${tool.name}`);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
lines.push(''); // Empty line between servers
|
|
55
|
+
}
|
|
56
|
+
return lines.join('\n').trimEnd();
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Format search results
|
|
60
|
+
*/
|
|
61
|
+
export function formatSearchResults(results, withDescriptions) {
|
|
62
|
+
const lines = [];
|
|
63
|
+
for (const result of results) {
|
|
64
|
+
const server = color(result.server, colors.cyan);
|
|
65
|
+
const tool = color(result.tool.name, colors.green);
|
|
66
|
+
// Always show description if available (grep is for discovery)
|
|
67
|
+
if (result.tool.description) {
|
|
68
|
+
lines.push(`${server} ${tool} ${color(result.tool.description, colors.dim)}`);
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
lines.push(`${server} ${tool}`);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
return lines.join('\n');
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Format server details
|
|
78
|
+
*/
|
|
79
|
+
export function formatServerDetails(serverName, config, tools, withDescriptions = false, instructions) {
|
|
80
|
+
const lines = [];
|
|
81
|
+
lines.push(`${color('Server:', colors.bold)} ${color(serverName, colors.cyan)}`);
|
|
82
|
+
if (isHttpServer(config)) {
|
|
83
|
+
lines.push(`${color('Transport:', colors.bold)} HTTP`);
|
|
84
|
+
lines.push(`${color('URL:', colors.bold)} ${config.url}`);
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
lines.push(`${color('Transport:', colors.bold)} stdio`);
|
|
88
|
+
lines.push(`${color('Command:', colors.bold)} ${config.command} ${(config.args || []).join(' ')}`);
|
|
89
|
+
}
|
|
90
|
+
if (instructions) {
|
|
91
|
+
lines.push('');
|
|
92
|
+
lines.push(`${color('Instructions:', colors.bold)}`);
|
|
93
|
+
// Indent multi-line instructions
|
|
94
|
+
const indentedInstructions = instructions
|
|
95
|
+
.split('\n')
|
|
96
|
+
.map((line) => ` ${line}`)
|
|
97
|
+
.join('\n');
|
|
98
|
+
lines.push(indentedInstructions);
|
|
99
|
+
}
|
|
100
|
+
lines.push('');
|
|
101
|
+
lines.push(`${color(`Tools (${tools.length}):`, colors.bold)}`);
|
|
102
|
+
for (const tool of tools) {
|
|
103
|
+
lines.push(` ${color(tool.name, colors.green)}`);
|
|
104
|
+
if (withDescriptions && tool.description) {
|
|
105
|
+
lines.push(` ${color(tool.description, colors.dim)}`);
|
|
106
|
+
}
|
|
107
|
+
// Show parameters from schema
|
|
108
|
+
const schema = tool.inputSchema;
|
|
109
|
+
if (schema.properties) {
|
|
110
|
+
lines.push(` ${color('Parameters:', colors.yellow)}`);
|
|
111
|
+
for (const [name, prop] of Object.entries(schema.properties)) {
|
|
112
|
+
const required = schema.required?.includes(name)
|
|
113
|
+
? 'required'
|
|
114
|
+
: 'optional';
|
|
115
|
+
const type = prop.type || 'any';
|
|
116
|
+
const desc = withDescriptions && prop.description ? ` - ${prop.description}` : '';
|
|
117
|
+
lines.push(` • ${name} (${type}, ${required})${desc}`);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
lines.push('');
|
|
121
|
+
}
|
|
122
|
+
return lines.join('\n').trimEnd();
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Format tool schema
|
|
126
|
+
*/
|
|
127
|
+
export function formatToolSchema(serverName, tool) {
|
|
128
|
+
const lines = [];
|
|
129
|
+
lines.push(`${color('Tool:', colors.bold)} ${color(tool.name, colors.green)}`);
|
|
130
|
+
lines.push(`${color('Server:', colors.bold)} ${color(serverName, colors.cyan)}`);
|
|
131
|
+
lines.push('');
|
|
132
|
+
if (tool.description) {
|
|
133
|
+
lines.push(`${color('Description:', colors.bold)}`);
|
|
134
|
+
lines.push(` ${tool.description}`);
|
|
135
|
+
lines.push('');
|
|
136
|
+
}
|
|
137
|
+
lines.push(`${color('Input Schema:', colors.bold)}`);
|
|
138
|
+
lines.push(JSON.stringify(tool.inputSchema, null, 2));
|
|
139
|
+
return lines.join('\n');
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Format tool call result
|
|
143
|
+
*/
|
|
144
|
+
export function formatToolResult(result) {
|
|
145
|
+
if (typeof result === 'object' && result !== null) {
|
|
146
|
+
const r = result;
|
|
147
|
+
// Handle MCP tool result format
|
|
148
|
+
if (r.content && Array.isArray(r.content)) {
|
|
149
|
+
const textParts = r.content
|
|
150
|
+
.filter((c) => c.type === 'text' && c.text)
|
|
151
|
+
.map((c) => c.text);
|
|
152
|
+
if (textParts.length > 0) {
|
|
153
|
+
return textParts.join('\n');
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
// Fallback to JSON
|
|
158
|
+
return JSON.stringify(result, null, 2);
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Format as JSON
|
|
162
|
+
*/
|
|
163
|
+
export function formatJson(data) {
|
|
164
|
+
return JSON.stringify(data, null, 2);
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Format error message
|
|
168
|
+
*/
|
|
169
|
+
export function formatError(message) {
|
|
170
|
+
return color(`Error: ${message}`, '\x1b[31m'); // Red
|
|
171
|
+
}
|