@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.
Files changed (351) hide show
  1. package/.codex/skills/pi-agent-harness/SKILL.md +319 -0
  2. package/.codex/skills/pi-agent-harness/agents/openai.yaml +4 -0
  3. package/README.md +318 -0
  4. package/context/codex-base-prompt.md +144 -0
  5. package/context/pibo-compaction-prompt.md +100 -0
  6. package/context/pibo-system-prompt.md +17 -0
  7. package/dist/apps/chat/agent-profiles.js +26 -0
  8. package/dist/apps/chat/agent-store.js +336 -0
  9. package/dist/apps/chat/event-log.js +307 -0
  10. package/dist/apps/chat/read-model.js +218 -0
  11. package/dist/apps/chat/rooms.js +321 -0
  12. package/dist/apps/chat/session-metadata.js +14 -0
  13. package/dist/apps/chat/stream.js +122 -0
  14. package/dist/apps/chat/trace.js +1182 -0
  15. package/dist/apps/chat/web-app.js +2569 -0
  16. package/dist/apps/chat-ui/assets/apl-BxEMbctQ.js +1 -0
  17. package/dist/apps/chat-ui/assets/asciiarmor-eFjeGRuZ.js +1 -0
  18. package/dist/apps/chat-ui/assets/asn1-Cfx-0pt9.js +1 -0
  19. package/dist/apps/chat-ui/assets/asterisk-B5BHTsBr.js +1 -0
  20. package/dist/apps/chat-ui/assets/brainfuck-CAA2xofr.js +1 -0
  21. package/dist/apps/chat-ui/assets/clike-BoDCOLzN.js +1 -0
  22. package/dist/apps/chat-ui/assets/clojure-kVFSWX0o.js +1 -0
  23. package/dist/apps/chat-ui/assets/cmake-BUPAhezI.js +1 -0
  24. package/dist/apps/chat-ui/assets/cobol-BfgHZgup.js +1 -0
  25. package/dist/apps/chat-ui/assets/coffeescript-G1Pe_1AZ.js +1 -0
  26. package/dist/apps/chat-ui/assets/commonlisp-B3N0CjHn.js +1 -0
  27. package/dist/apps/chat-ui/assets/crystal-C15ndaGM.js +1 -0
  28. package/dist/apps/chat-ui/assets/css-BqOeyZOV.js +1 -0
  29. package/dist/apps/chat-ui/assets/cypher-KjIKv-wW.js +1 -0
  30. package/dist/apps/chat-ui/assets/d-BlT5AEC-.js +1 -0
  31. package/dist/apps/chat-ui/assets/diff-oF98tbqj.js +1 -0
  32. package/dist/apps/chat-ui/assets/dist--55mTWk3.js +1 -0
  33. package/dist/apps/chat-ui/assets/dist-B5rcjVCj.js +1 -0
  34. package/dist/apps/chat-ui/assets/dist-BPv5MdlL.js +1 -0
  35. package/dist/apps/chat-ui/assets/dist-BZ39rB1W.js +1 -0
  36. package/dist/apps/chat-ui/assets/dist-BsedZGJo.js +1 -0
  37. package/dist/apps/chat-ui/assets/dist-BvO6SpaM.js +9 -0
  38. package/dist/apps/chat-ui/assets/dist-C5YJOwhH.js +1 -0
  39. package/dist/apps/chat-ui/assets/dist-C5oXtFSP.js +1 -0
  40. package/dist/apps/chat-ui/assets/dist-CG_gRSwv.js +23 -0
  41. package/dist/apps/chat-ui/assets/dist-CKM5j-iy.js +1 -0
  42. package/dist/apps/chat-ui/assets/dist-CUp9us2q.js +1 -0
  43. package/dist/apps/chat-ui/assets/dist-CZ9T4Cly.js +1 -0
  44. package/dist/apps/chat-ui/assets/dist-D4HhiFWB.js +6 -0
  45. package/dist/apps/chat-ui/assets/dist-DHE-yBLH.js +1 -0
  46. package/dist/apps/chat-ui/assets/dist-DSKQpPaz.js +1 -0
  47. package/dist/apps/chat-ui/assets/dist-L1B-KWZO.js +1 -0
  48. package/dist/apps/chat-ui/assets/dist-SVPsM5Oi.js +13 -0
  49. package/dist/apps/chat-ui/assets/dist-Zqt9kNG9.js +1 -0
  50. package/dist/apps/chat-ui/assets/dist-_DPv0-QF.js +1 -0
  51. package/dist/apps/chat-ui/assets/dist-_oM7g0eh.js +11 -0
  52. package/dist/apps/chat-ui/assets/dist-laadbMWg.js +1 -0
  53. package/dist/apps/chat-ui/assets/dist-nFui3f-r.js +2 -0
  54. package/dist/apps/chat-ui/assets/dist-tGfufz3b.js +1 -0
  55. package/dist/apps/chat-ui/assets/dockerfile-CUaqzcqp.js +1 -0
  56. package/dist/apps/chat-ui/assets/dtd-VCA9yr61.js +1 -0
  57. package/dist/apps/chat-ui/assets/dylan-O-V5Dw5W.js +1 -0
  58. package/dist/apps/chat-ui/assets/ebnf-SPmdBkvT.js +1 -0
  59. package/dist/apps/chat-ui/assets/ecl-ChfCttfI.js +1 -0
  60. package/dist/apps/chat-ui/assets/eiffel-cB9EbjeN.js +1 -0
  61. package/dist/apps/chat-ui/assets/elm-BTiVflBU.js +1 -0
  62. package/dist/apps/chat-ui/assets/erlang-egf0TXFm.js +1 -0
  63. package/dist/apps/chat-ui/assets/factor-C2tAxNob.js +1 -0
  64. package/dist/apps/chat-ui/assets/fcl-BiCjh1tj.js +1 -0
  65. package/dist/apps/chat-ui/assets/forth-C4kDGW6u.js +1 -0
  66. package/dist/apps/chat-ui/assets/fortran-DzkLaPnd.js +1 -0
  67. package/dist/apps/chat-ui/assets/gas-DMOxskQF.js +1 -0
  68. package/dist/apps/chat-ui/assets/gherkin-BPxBpp-k.js +1 -0
  69. package/dist/apps/chat-ui/assets/groovy-CkEnc0ZY.js +1 -0
  70. package/dist/apps/chat-ui/assets/haskell-Dadpo9-w.js +1 -0
  71. package/dist/apps/chat-ui/assets/haxe-CDNZL9MW.js +1 -0
  72. package/dist/apps/chat-ui/assets/http-jy9Zxxt3.js +1 -0
  73. package/dist/apps/chat-ui/assets/idl-CGSB6iiy.js +1 -0
  74. package/dist/apps/chat-ui/assets/index-BdcqTugD.js +151 -0
  75. package/dist/apps/chat-ui/assets/index-Dk-opWl3.css +1 -0
  76. package/dist/apps/chat-ui/assets/javascript-DSlzRUd8.js +1 -0
  77. package/dist/apps/chat-ui/assets/julia-DTiF9v6R.js +1 -0
  78. package/dist/apps/chat-ui/assets/livescript-Ci8Xxna6.js +1 -0
  79. package/dist/apps/chat-ui/assets/lua-eVxIrt9t.js +1 -0
  80. package/dist/apps/chat-ui/assets/mathematica-Da3grj36.js +1 -0
  81. package/dist/apps/chat-ui/assets/mbox-BWBMSafM.js +1 -0
  82. package/dist/apps/chat-ui/assets/mirc-CtHu9S1B.js +1 -0
  83. package/dist/apps/chat-ui/assets/mllike-wTFlPWXS.js +1 -0
  84. package/dist/apps/chat-ui/assets/modelica-cKbQ0UXu.js +1 -0
  85. package/dist/apps/chat-ui/assets/mscgen-C5pXQCMK.js +1 -0
  86. package/dist/apps/chat-ui/assets/mumps-CKBHkOQq.js +1 -0
  87. package/dist/apps/chat-ui/assets/nginx-B00AiQel.js +1 -0
  88. package/dist/apps/chat-ui/assets/nsis-SMDwKltR.js +1 -0
  89. package/dist/apps/chat-ui/assets/ntriples-B_36EBV0.js +1 -0
  90. package/dist/apps/chat-ui/assets/octave-BXPjzAif.js +1 -0
  91. package/dist/apps/chat-ui/assets/oz-Dedpat1M.js +1 -0
  92. package/dist/apps/chat-ui/assets/pascal-CMcUg72K.js +1 -0
  93. package/dist/apps/chat-ui/assets/perl-DoVTbnzt.js +1 -0
  94. package/dist/apps/chat-ui/assets/pig-CULXT1YV.js +1 -0
  95. package/dist/apps/chat-ui/assets/powershell-Cv5Uhf6b.js +1 -0
  96. package/dist/apps/chat-ui/assets/properties-CQ1C2P-M.js +1 -0
  97. package/dist/apps/chat-ui/assets/protobuf-SRlvzrl6.js +1 -0
  98. package/dist/apps/chat-ui/assets/pug-Bo3wfL-f.js +1 -0
  99. package/dist/apps/chat-ui/assets/puppet-ClSqCGj6.js +1 -0
  100. package/dist/apps/chat-ui/assets/python-C2_X1GpX.js +1 -0
  101. package/dist/apps/chat-ui/assets/q-B_6Gdyzl.js +1 -0
  102. package/dist/apps/chat-ui/assets/r-BD07NGED.js +1 -0
  103. package/dist/apps/chat-ui/assets/rolldown-runtime-S-ySWqyJ.js +1 -0
  104. package/dist/apps/chat-ui/assets/rpm-CRu5Z2Jl.js +1 -0
  105. package/dist/apps/chat-ui/assets/ruby-dZPnOz8h.js +1 -0
  106. package/dist/apps/chat-ui/assets/sas-S2t8_sDI.js +1 -0
  107. package/dist/apps/chat-ui/assets/scheme-WcyFWLW2.js +1 -0
  108. package/dist/apps/chat-ui/assets/shell-DUelnYSh.js +1 -0
  109. package/dist/apps/chat-ui/assets/sieve-jDjlVhNh.js +1 -0
  110. package/dist/apps/chat-ui/assets/simple-mode-CL04yRVp.js +1 -0
  111. package/dist/apps/chat-ui/assets/smalltalk-ddWDYy10.js +1 -0
  112. package/dist/apps/chat-ui/assets/solr-C7rQhLuW.js +1 -0
  113. package/dist/apps/chat-ui/assets/sparql--fPCCgVd.js +1 -0
  114. package/dist/apps/chat-ui/assets/spreadsheet-DjthqD5G.js +1 -0
  115. package/dist/apps/chat-ui/assets/sql-D_dieYbr.js +1 -0
  116. package/dist/apps/chat-ui/assets/stex-rHcFYcA0.js +1 -0
  117. package/dist/apps/chat-ui/assets/stylus-DxF70RNr.js +1 -0
  118. package/dist/apps/chat-ui/assets/swift-T0hDoOb-.js +1 -0
  119. package/dist/apps/chat-ui/assets/tcl-Dlzy1mPk.js +1 -0
  120. package/dist/apps/chat-ui/assets/textile-Dy5rFZe5.js +1 -0
  121. package/dist/apps/chat-ui/assets/tiddlywiki-DQP1OymS.js +1 -0
  122. package/dist/apps/chat-ui/assets/tiki-0vOj3DB2.js +1 -0
  123. package/dist/apps/chat-ui/assets/toml-DEltN0lI.js +1 -0
  124. package/dist/apps/chat-ui/assets/troff-CRbBpEqY.js +1 -0
  125. package/dist/apps/chat-ui/assets/ttcn-M5q1nLKg.js +1 -0
  126. package/dist/apps/chat-ui/assets/ttcn-cfg-Rmw9NWq9.js +1 -0
  127. package/dist/apps/chat-ui/assets/turtle-BCDWhJK0.js +1 -0
  128. package/dist/apps/chat-ui/assets/vb-QQ7LGlOz.js +1 -0
  129. package/dist/apps/chat-ui/assets/vbscript-BiSEdUzz.js +1 -0
  130. package/dist/apps/chat-ui/assets/velocity-CzMg5_6w.js +1 -0
  131. package/dist/apps/chat-ui/assets/verilog-BJOO83gk.js +1 -0
  132. package/dist/apps/chat-ui/assets/vhdl-ed4zAZAA.js +1 -0
  133. package/dist/apps/chat-ui/assets/webidl-Ddy6hbV6.js +1 -0
  134. package/dist/apps/chat-ui/assets/xquery-Bw1zwhh6.js +1 -0
  135. package/dist/apps/chat-ui/assets/yacas-DZdTXy3s.js +1 -0
  136. package/dist/apps/chat-ui/assets/z80-DMG02_YV.js +1 -0
  137. package/dist/apps/chat-ui/index.html +15 -0
  138. package/dist/apps/context-files-ui/assets/apl-14BqhLYK.js +1 -0
  139. package/dist/apps/context-files-ui/assets/asciiarmor-WLvjqI7d.js +1 -0
  140. package/dist/apps/context-files-ui/assets/asn1-Bg4FbdCg.js +1 -0
  141. package/dist/apps/context-files-ui/assets/asterisk-B2MO-X4d.js +1 -0
  142. package/dist/apps/context-files-ui/assets/brainfuck-CV9kufud.js +1 -0
  143. package/dist/apps/context-files-ui/assets/clike-CjmcUpt6.js +1 -0
  144. package/dist/apps/context-files-ui/assets/clojure-De3QGfx6.js +1 -0
  145. package/dist/apps/context-files-ui/assets/cmake-i2VDNaRq.js +1 -0
  146. package/dist/apps/context-files-ui/assets/cobol-BwO6DF08.js +1 -0
  147. package/dist/apps/context-files-ui/assets/coffeescript-BtivDvRz.js +1 -0
  148. package/dist/apps/context-files-ui/assets/commonlisp-DFkEQdLP.js +1 -0
  149. package/dist/apps/context-files-ui/assets/crystal-CU0NkcVL.js +1 -0
  150. package/dist/apps/context-files-ui/assets/css-CbMZAQ1W.js +1 -0
  151. package/dist/apps/context-files-ui/assets/cypher-Dke5QOzv.js +1 -0
  152. package/dist/apps/context-files-ui/assets/d-TPqSVaHM.js +1 -0
  153. package/dist/apps/context-files-ui/assets/diff-B365LSoZ.js +1 -0
  154. package/dist/apps/context-files-ui/assets/dist-B5PTVnox.js +1 -0
  155. package/dist/apps/context-files-ui/assets/dist-B5ZAfwf5.js +1 -0
  156. package/dist/apps/context-files-ui/assets/dist-BJW3917N.js +11 -0
  157. package/dist/apps/context-files-ui/assets/dist-BkUONE3N.js +1 -0
  158. package/dist/apps/context-files-ui/assets/dist-CKQF1zEu.js +1 -0
  159. package/dist/apps/context-files-ui/assets/dist-CwbH_3RN.js +1 -0
  160. package/dist/apps/context-files-ui/assets/dist-CxRLRmMx.js +2 -0
  161. package/dist/apps/context-files-ui/assets/dist-D1KyNDg5.js +13 -0
  162. package/dist/apps/context-files-ui/assets/dist-DFi2YGux.js +1 -0
  163. package/dist/apps/context-files-ui/assets/dist-DKoyMSNr.js +1 -0
  164. package/dist/apps/context-files-ui/assets/dist-DLMjd26T.js +1 -0
  165. package/dist/apps/context-files-ui/assets/dist-DQXzt2Ng.js +1 -0
  166. package/dist/apps/context-files-ui/assets/dist-DotDq_kD.js +1 -0
  167. package/dist/apps/context-files-ui/assets/dist-DyfSeBMu.js +1 -0
  168. package/dist/apps/context-files-ui/assets/dist-MyZgX9K2.js +9 -0
  169. package/dist/apps/context-files-ui/assets/dist-QQuDy4KA.js +1 -0
  170. package/dist/apps/context-files-ui/assets/dist-YwR9dpb-.js +1 -0
  171. package/dist/apps/context-files-ui/assets/dist-dTBsFYAl.js +1 -0
  172. package/dist/apps/context-files-ui/assets/dockerfile-CJb2sekW.js +1 -0
  173. package/dist/apps/context-files-ui/assets/dtd-CBMymJ7O.js +1 -0
  174. package/dist/apps/context-files-ui/assets/dylan-08Azy1NK.js +1 -0
  175. package/dist/apps/context-files-ui/assets/ebnf-Dkum_1J8.js +1 -0
  176. package/dist/apps/context-files-ui/assets/ecl-dhxjHL8y.js +1 -0
  177. package/dist/apps/context-files-ui/assets/eiffel-C446m6dI.js +1 -0
  178. package/dist/apps/context-files-ui/assets/elm-po1E9de0.js +1 -0
  179. package/dist/apps/context-files-ui/assets/erlang-BD5LkVkR.js +1 -0
  180. package/dist/apps/context-files-ui/assets/factor-B2EMQZkP.js +1 -0
  181. package/dist/apps/context-files-ui/assets/fcl-DkEOamHd.js +1 -0
  182. package/dist/apps/context-files-ui/assets/forth-dCg2_HVB.js +1 -0
  183. package/dist/apps/context-files-ui/assets/fortran-3ZpXLFh1.js +1 -0
  184. package/dist/apps/context-files-ui/assets/gas-DMmxLZRI.js +1 -0
  185. package/dist/apps/context-files-ui/assets/gherkin-DUSFg2R6.js +1 -0
  186. package/dist/apps/context-files-ui/assets/groovy-Cmduloe1.js +1 -0
  187. package/dist/apps/context-files-ui/assets/haskell-Cyr255R9.js +1 -0
  188. package/dist/apps/context-files-ui/assets/haxe-BJVKtprM.js +1 -0
  189. package/dist/apps/context-files-ui/assets/http-DszHFpc-.js +1 -0
  190. package/dist/apps/context-files-ui/assets/idl-Cati9Nrv.js +1 -0
  191. package/dist/apps/context-files-ui/assets/index-BwRDoHMC.css +1 -0
  192. package/dist/apps/context-files-ui/assets/index-GwvjXytt.js +202 -0
  193. package/dist/apps/context-files-ui/assets/javascript-C5pDVaoP.js +1 -0
  194. package/dist/apps/context-files-ui/assets/julia-DlqY1cTU.js +1 -0
  195. package/dist/apps/context-files-ui/assets/livescript-C6p8-2W1.js +1 -0
  196. package/dist/apps/context-files-ui/assets/lua-BxuTHaF7.js +1 -0
  197. package/dist/apps/context-files-ui/assets/mathematica-nDHZUMJT.js +1 -0
  198. package/dist/apps/context-files-ui/assets/mbox-DAaR0Hcz.js +1 -0
  199. package/dist/apps/context-files-ui/assets/mirc-CCA0FRfl.js +1 -0
  200. package/dist/apps/context-files-ui/assets/mllike-Cw3Iccsb.js +1 -0
  201. package/dist/apps/context-files-ui/assets/modelica-Czx80fNR.js +1 -0
  202. package/dist/apps/context-files-ui/assets/mscgen-BmfuTbzG.js +1 -0
  203. package/dist/apps/context-files-ui/assets/mumps-Ds_ZaumL.js +1 -0
  204. package/dist/apps/context-files-ui/assets/nginx-D9M2PQ4U.js +1 -0
  205. package/dist/apps/context-files-ui/assets/nsis-DOo3SJmd.js +1 -0
  206. package/dist/apps/context-files-ui/assets/ntriples-DLHGTvHs.js +1 -0
  207. package/dist/apps/context-files-ui/assets/octave-8jj96JiC.js +1 -0
  208. package/dist/apps/context-files-ui/assets/oz-BmMq7iC4.js +1 -0
  209. package/dist/apps/context-files-ui/assets/pascal-BgMr6XpT.js +1 -0
  210. package/dist/apps/context-files-ui/assets/perl-D6YJObi_.js +1 -0
  211. package/dist/apps/context-files-ui/assets/pig-nx7uchs8.js +1 -0
  212. package/dist/apps/context-files-ui/assets/powershell-B4IPkVxR.js +1 -0
  213. package/dist/apps/context-files-ui/assets/properties-CoavQdLC.js +1 -0
  214. package/dist/apps/context-files-ui/assets/protobuf-D5EWhcmc.js +1 -0
  215. package/dist/apps/context-files-ui/assets/pug-QU72BPAa.js +1 -0
  216. package/dist/apps/context-files-ui/assets/puppet-B_0GFuyD.js +1 -0
  217. package/dist/apps/context-files-ui/assets/python-Cs7sNzy_.js +1 -0
  218. package/dist/apps/context-files-ui/assets/q-BIB9pPtI.js +1 -0
  219. package/dist/apps/context-files-ui/assets/r-CN5s4f3o.js +1 -0
  220. package/dist/apps/context-files-ui/assets/rpm-Ct_Ck8mQ.js +1 -0
  221. package/dist/apps/context-files-ui/assets/ruby-BVPradRk.js +1 -0
  222. package/dist/apps/context-files-ui/assets/sas-DN4j74IF.js +1 -0
  223. package/dist/apps/context-files-ui/assets/scheme-CvNgHAnh.js +1 -0
  224. package/dist/apps/context-files-ui/assets/shell-BjiMLAaM.js +1 -0
  225. package/dist/apps/context-files-ui/assets/sieve-C2U1O5Z4.js +1 -0
  226. package/dist/apps/context-files-ui/assets/simple-mode-DnMbQuKW.js +1 -0
  227. package/dist/apps/context-files-ui/assets/smalltalk-DkYwYufV.js +1 -0
  228. package/dist/apps/context-files-ui/assets/solr-BopnSD-v.js +1 -0
  229. package/dist/apps/context-files-ui/assets/sparql-Cpg3YQfd.js +1 -0
  230. package/dist/apps/context-files-ui/assets/spreadsheet-kRxtVt9J.js +1 -0
  231. package/dist/apps/context-files-ui/assets/sql-DYI2GwJR.js +1 -0
  232. package/dist/apps/context-files-ui/assets/stex-BCRT8IJ3.js +1 -0
  233. package/dist/apps/context-files-ui/assets/stylus-CARoeVE9.js +1 -0
  234. package/dist/apps/context-files-ui/assets/swift-DKNaLAK6.js +1 -0
  235. package/dist/apps/context-files-ui/assets/tcl-CQyXkgMH.js +1 -0
  236. package/dist/apps/context-files-ui/assets/textile-Yg_UWn-t.js +1 -0
  237. package/dist/apps/context-files-ui/assets/tiddlywiki-dqVbkfX4.js +1 -0
  238. package/dist/apps/context-files-ui/assets/tiki-CC_ic8g0.js +1 -0
  239. package/dist/apps/context-files-ui/assets/toml-B7gGzVkJ.js +1 -0
  240. package/dist/apps/context-files-ui/assets/troff-Bq3z6oAu.js +1 -0
  241. package/dist/apps/context-files-ui/assets/ttcn-GvRgs2AT.js +1 -0
  242. package/dist/apps/context-files-ui/assets/ttcn-cfg-CGCXz7Vo.js +1 -0
  243. package/dist/apps/context-files-ui/assets/turtle-CwIpz2yy.js +1 -0
  244. package/dist/apps/context-files-ui/assets/vb-BmcHUM2C.js +1 -0
  245. package/dist/apps/context-files-ui/assets/vbscript-Cs9dylre.js +1 -0
  246. package/dist/apps/context-files-ui/assets/velocity-CBWU0VCy.js +1 -0
  247. package/dist/apps/context-files-ui/assets/verilog-DVCHmufx.js +1 -0
  248. package/dist/apps/context-files-ui/assets/vhdl-BGDk4f1d.js +1 -0
  249. package/dist/apps/context-files-ui/assets/webidl-egXQEWlC.js +1 -0
  250. package/dist/apps/context-files-ui/assets/xquery-5f0hn7cg.js +1 -0
  251. package/dist/apps/context-files-ui/assets/yacas-DNs9XkmQ.js +1 -0
  252. package/dist/apps/context-files-ui/assets/z80-B7Dfb4UO.js +1 -0
  253. package/dist/apps/context-files-ui/index.html +14 -0
  254. package/dist/auth/better-auth.js +129 -0
  255. package/dist/auth/types.js +14 -0
  256. package/dist/bin/pibo.js +3 -0
  257. package/dist/channels/types.js +1 -0
  258. package/dist/cli-errors.js +18 -0
  259. package/dist/cli.js +264 -0
  260. package/dist/config/config.js +167 -0
  261. package/dist/core/base-prompt.js +104 -0
  262. package/dist/core/codex-compat.js +44 -0
  263. package/dist/core/compaction-prompt.js +258 -0
  264. package/dist/core/events.js +1 -0
  265. package/dist/core/profiles.js +138 -0
  266. package/dist/core/routed-session.js +538 -0
  267. package/dist/core/runtime.js +323 -0
  268. package/dist/core/session-router.js +437 -0
  269. package/dist/core/system-prompt-template.js +56 -0
  270. package/dist/core/thinking.js +9 -0
  271. package/dist/core/workspace.js +5 -0
  272. package/dist/debug/events.js +92 -0
  273. package/dist/debug/index.js +631 -0
  274. package/dist/debug/session.js +200 -0
  275. package/dist/debug/sql.js +238 -0
  276. package/dist/debug/stores.js +49 -0
  277. package/dist/debug/trace.js +245 -0
  278. package/dist/env.js +32 -0
  279. package/dist/gateway/client.js +200 -0
  280. package/dist/gateway/protocol.js +46 -0
  281. package/dist/gateway/request.js +146 -0
  282. package/dist/gateway/server.js +221 -0
  283. package/dist/gateway/tool.js +69 -0
  284. package/dist/gateway/web.js +80 -0
  285. package/dist/index.js +23 -0
  286. package/dist/local/client.js +77 -0
  287. package/dist/local/extension.js +548 -0
  288. package/dist/local/tui.js +25 -0
  289. package/dist/mcp/agent-context.js +123 -0
  290. package/dist/mcp/client.js +332 -0
  291. package/dist/mcp/commands/call.js +146 -0
  292. package/dist/mcp/commands/grep.js +145 -0
  293. package/dist/mcp/commands/info.js +71 -0
  294. package/dist/mcp/commands/list.js +94 -0
  295. package/dist/mcp/config-command.js +217 -0
  296. package/dist/mcp/config.js +440 -0
  297. package/dist/mcp/daemon-client.js +266 -0
  298. package/dist/mcp/daemon.js +327 -0
  299. package/dist/mcp/errors.js +287 -0
  300. package/dist/mcp/index.js +431 -0
  301. package/dist/mcp/output.js +171 -0
  302. package/dist/mcp/python-runtime.js +131 -0
  303. package/dist/mcp/registry.js +116 -0
  304. package/dist/mcp/version.js +5 -0
  305. package/dist/pi-packages/cli.js +92 -0
  306. package/dist/pi-packages/installer.js +70 -0
  307. package/dist/pi-packages/metadata.js +231 -0
  308. package/dist/pi-packages/runtime.js +61 -0
  309. package/dist/pi-packages/store.js +175 -0
  310. package/dist/pi-packages/types.js +1 -0
  311. package/dist/plugins/better-auth.js +11 -0
  312. package/dist/plugins/builtin.js +249 -0
  313. package/dist/plugins/chat-web.js +11 -0
  314. package/dist/plugins/codex-compat.js +72 -0
  315. package/dist/plugins/context-files-store.js +354 -0
  316. package/dist/plugins/context-files.js +999 -0
  317. package/dist/plugins/core-tools.js +94 -0
  318. package/dist/plugins/example.js +67 -0
  319. package/dist/plugins/registry.js +368 -0
  320. package/dist/plugins/remote-agent.js +9 -0
  321. package/dist/plugins/types.js +1 -0
  322. package/dist/plugins/web.js +11 -0
  323. package/dist/reliability/store.js +759 -0
  324. package/dist/remote/channel.js +176 -0
  325. package/dist/remote/client.js +92 -0
  326. package/dist/remote/examples/tui-controller.js +263 -0
  327. package/dist/remote/protocol.js +55 -0
  328. package/dist/remote/session-client.js +189 -0
  329. package/dist/runs/registry.js +323 -0
  330. package/dist/runs/tools.js +185 -0
  331. package/dist/sessions/bindings.js +41 -0
  332. package/dist/sessions/sqlite-store.js +154 -0
  333. package/dist/sessions/store.js +125 -0
  334. package/dist/shared/trace-order.js +83 -0
  335. package/dist/subagents/tool.js +63 -0
  336. package/dist/tools/browser-use-cdp.js +207 -0
  337. package/dist/tools/browser-use-leases.js +338 -0
  338. package/dist/tools/browser-use-wrapper.js +338 -0
  339. package/dist/tools/codex-compat.js +85 -0
  340. package/dist/tools/desktop-env.js +90 -0
  341. package/dist/tools/guides.js +276 -0
  342. package/dist/tools/index.js +366 -0
  343. package/dist/tools/python-runtime.js +154 -0
  344. package/dist/tools/registry.js +107 -0
  345. package/dist/tools/web-search.js +137 -0
  346. package/dist/web/auth.js +10 -0
  347. package/dist/web/channel.js +151 -0
  348. package/dist/web/http.js +110 -0
  349. package/dist/web/types.js +1 -0
  350. package/package.json +74 -0
  351. 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
+ }