@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,327 @@
1
+ /**
2
+ * MCP-CLI Daemon - Background worker that maintains persistent MCP connections
3
+ *
4
+ * This is spawned as a detached process and manages a Unix socket for IPC.
5
+ * It maintains the MCP server connection and forwards requests from CLI invocations.
6
+ */
7
+ import { existsSync, mkdirSync, readFileSync, unlinkSync, writeFileSync, } from 'node:fs';
8
+ import { createServer } from 'node:net';
9
+ import { dirname } from 'node:path';
10
+ import { callTool, connectToServer, listTools, } from './client.js';
11
+ import { debug, getConfigHash, getDaemonTimeoutMs, getPidPath, getSocketDir, getSocketPath, } from './config.js';
12
+ // ============================================================================
13
+ // PID File Management
14
+ // ============================================================================
15
+ /**
16
+ * Write PID file with config hash for stale detection
17
+ */
18
+ export function writePidFile(serverName, configHash) {
19
+ const pidPath = getPidPath(serverName);
20
+ const dir = dirname(pidPath);
21
+ if (!existsSync(dir)) {
22
+ mkdirSync(dir, { recursive: true, mode: 0o700 });
23
+ }
24
+ const content = {
25
+ pid: process.pid,
26
+ configHash,
27
+ startedAt: new Date().toISOString(),
28
+ };
29
+ writeFileSync(pidPath, JSON.stringify(content), { mode: 0o600 });
30
+ }
31
+ /**
32
+ * Read PID file content
33
+ */
34
+ export function readPidFile(serverName) {
35
+ const pidPath = getPidPath(serverName);
36
+ if (!existsSync(pidPath)) {
37
+ return null;
38
+ }
39
+ try {
40
+ const content = readFileSync(pidPath, 'utf-8');
41
+ return JSON.parse(content);
42
+ }
43
+ catch {
44
+ return null;
45
+ }
46
+ }
47
+ /**
48
+ * Remove PID file
49
+ */
50
+ export function removePidFile(serverName) {
51
+ const pidPath = getPidPath(serverName);
52
+ try {
53
+ if (existsSync(pidPath)) {
54
+ unlinkSync(pidPath);
55
+ }
56
+ }
57
+ catch {
58
+ // Ignore errors during cleanup
59
+ }
60
+ }
61
+ /**
62
+ * Remove socket file
63
+ */
64
+ export function removeSocketFile(serverName) {
65
+ const socketPath = getSocketPath(serverName);
66
+ try {
67
+ if (existsSync(socketPath)) {
68
+ unlinkSync(socketPath);
69
+ }
70
+ }
71
+ catch {
72
+ // Ignore errors during cleanup
73
+ }
74
+ }
75
+ /**
76
+ * Check if a process is running
77
+ */
78
+ export function isProcessRunning(pid) {
79
+ try {
80
+ process.kill(pid, 0);
81
+ return true;
82
+ }
83
+ catch {
84
+ return false;
85
+ }
86
+ }
87
+ /**
88
+ * Kill a process by PID
89
+ */
90
+ export function killProcess(pid) {
91
+ try {
92
+ process.kill(pid, 'SIGTERM');
93
+ return true;
94
+ }
95
+ catch {
96
+ return false;
97
+ }
98
+ }
99
+ // ============================================================================
100
+ // Daemon Worker
101
+ // ============================================================================
102
+ /**
103
+ * Main daemon entry point - run as detached background process
104
+ */
105
+ export async function runDaemon(serverName, config) {
106
+ const socketPath = getSocketPath(serverName);
107
+ const configHash = getConfigHash(config);
108
+ const timeoutMs = getDaemonTimeoutMs();
109
+ let idleTimer = null;
110
+ let mcpClient = null;
111
+ let server = null;
112
+ const activeConnections = new Set();
113
+ // Cleanup function
114
+ const cleanup = async () => {
115
+ debug(`[daemon:${serverName}] Shutting down...`);
116
+ if (idleTimer) {
117
+ clearTimeout(idleTimer);
118
+ idleTimer = null;
119
+ }
120
+ // Close all active socket connections
121
+ for (const conn of activeConnections) {
122
+ try {
123
+ conn.end();
124
+ }
125
+ catch {
126
+ // Ignore
127
+ }
128
+ }
129
+ activeConnections.clear();
130
+ // Close MCP connection
131
+ if (mcpClient) {
132
+ try {
133
+ await mcpClient.close();
134
+ }
135
+ catch {
136
+ // Ignore
137
+ }
138
+ mcpClient = null;
139
+ }
140
+ // Close socket server
141
+ if (server) {
142
+ try {
143
+ server.close();
144
+ }
145
+ catch {
146
+ // Ignore
147
+ }
148
+ server = null;
149
+ }
150
+ // Clean up files
151
+ removeSocketFile(serverName);
152
+ removePidFile(serverName);
153
+ debug(`[daemon:${serverName}] Cleanup complete`);
154
+ };
155
+ // Reset idle timer
156
+ const resetIdleTimer = () => {
157
+ if (idleTimer) {
158
+ clearTimeout(idleTimer);
159
+ }
160
+ idleTimer = setTimeout(async () => {
161
+ debug(`[daemon:${serverName}] Idle timeout reached, shutting down`);
162
+ await cleanup();
163
+ process.exit(0);
164
+ }, timeoutMs);
165
+ };
166
+ // Handle signals
167
+ process.on('SIGTERM', async () => {
168
+ await cleanup();
169
+ process.exit(0);
170
+ });
171
+ process.on('SIGINT', async () => {
172
+ await cleanup();
173
+ process.exit(0);
174
+ });
175
+ // Ensure socket dir exists
176
+ const socketDir = getSocketDir();
177
+ if (!existsSync(socketDir)) {
178
+ mkdirSync(socketDir, { recursive: true, mode: 0o700 });
179
+ }
180
+ // Remove stale socket if exists
181
+ removeSocketFile(serverName);
182
+ // Write PID file
183
+ writePidFile(serverName, configHash);
184
+ // Connect to MCP server
185
+ try {
186
+ debug(`[daemon:${serverName}] Connecting to MCP server...`);
187
+ mcpClient = await connectToServer(serverName, config);
188
+ debug(`[daemon:${serverName}] Connected to MCP server`);
189
+ }
190
+ catch (error) {
191
+ console.error(`[daemon:${serverName}] Failed to connect:`, error.message);
192
+ await cleanup();
193
+ process.exit(1);
194
+ }
195
+ // Handle incoming request
196
+ const handleRequest = async (data) => {
197
+ resetIdleTimer();
198
+ let request;
199
+ try {
200
+ request = JSON.parse(data.toString());
201
+ }
202
+ catch {
203
+ return {
204
+ id: 'unknown',
205
+ success: false,
206
+ error: { code: 'INVALID_REQUEST', message: 'Invalid JSON' },
207
+ };
208
+ }
209
+ debug(`[daemon:${serverName}] Request: ${request.type} (${request.id})`);
210
+ if (!mcpClient) {
211
+ return {
212
+ id: request.id,
213
+ success: false,
214
+ error: { code: 'NOT_CONNECTED', message: 'MCP client not connected' },
215
+ };
216
+ }
217
+ try {
218
+ switch (request.type) {
219
+ case 'ping':
220
+ return { id: request.id, success: true, data: 'pong' };
221
+ case 'listTools': {
222
+ const tools = await listTools(mcpClient.client);
223
+ return { id: request.id, success: true, data: tools };
224
+ }
225
+ case 'callTool': {
226
+ if (!request.toolName) {
227
+ return {
228
+ id: request.id,
229
+ success: false,
230
+ error: { code: 'MISSING_TOOL', message: 'toolName required' },
231
+ };
232
+ }
233
+ const result = await callTool(mcpClient.client, request.toolName, request.args ?? {});
234
+ return { id: request.id, success: true, data: result };
235
+ }
236
+ case 'getInstructions': {
237
+ const instructions = mcpClient.client.getInstructions();
238
+ return { id: request.id, success: true, data: instructions };
239
+ }
240
+ case 'close':
241
+ // Graceful shutdown requested
242
+ setTimeout(async () => {
243
+ await cleanup();
244
+ process.exit(0);
245
+ }, 100);
246
+ return { id: request.id, success: true, data: 'closing' };
247
+ default:
248
+ return {
249
+ id: request.id,
250
+ success: false,
251
+ error: {
252
+ code: 'UNKNOWN_TYPE',
253
+ message: `Unknown request type: ${request.type}`,
254
+ },
255
+ };
256
+ }
257
+ }
258
+ catch (error) {
259
+ const err = error;
260
+ return {
261
+ id: request.id,
262
+ success: false,
263
+ error: { code: 'EXECUTION_ERROR', message: err.message },
264
+ };
265
+ }
266
+ };
267
+ // Start Unix socket server
268
+ try {
269
+ server = createServer((socket) => {
270
+ activeConnections.add(socket);
271
+ debug(`[daemon:${serverName}] Client connected`);
272
+ socket.on('data', async (data) => {
273
+ const response = await handleRequest(Buffer.isBuffer(data) ? data : Buffer.from(data));
274
+ socket.write(`${JSON.stringify(response)}\n`);
275
+ });
276
+ socket.on('close', () => {
277
+ activeConnections.delete(socket);
278
+ debug(`[daemon:${serverName}] Client disconnected`);
279
+ });
280
+ socket.on('error', (error) => {
281
+ debug(`[daemon:${serverName}] Socket error: ${error.message}`);
282
+ activeConnections.delete(socket);
283
+ });
284
+ });
285
+ await new Promise((resolve, reject) => {
286
+ server?.once('error', reject);
287
+ server?.listen(socketPath, () => {
288
+ server?.off('error', reject);
289
+ resolve();
290
+ });
291
+ });
292
+ debug(`[daemon:${serverName}] Listening on ${socketPath}`);
293
+ // Start idle timer
294
+ resetIdleTimer();
295
+ // Signal readiness by writing to stdout (parent will read this)
296
+ console.log('DAEMON_READY');
297
+ }
298
+ catch (error) {
299
+ console.error(`[daemon:${serverName}] Failed to start socket server:`, error.message);
300
+ await cleanup();
301
+ process.exit(1);
302
+ }
303
+ }
304
+ // ============================================================================
305
+ // Entry point when run directly
306
+ // ============================================================================
307
+ // Check if running as daemon process
308
+ if (process.argv[2] === '--daemon') {
309
+ const serverName = process.argv[3];
310
+ const configJson = process.argv[4];
311
+ if (!serverName || !configJson) {
312
+ console.error('Usage: daemon.ts --daemon <serverName> <configJson>');
313
+ process.exit(1);
314
+ }
315
+ let config;
316
+ try {
317
+ config = JSON.parse(configJson);
318
+ }
319
+ catch {
320
+ console.error('Invalid config JSON');
321
+ process.exit(1);
322
+ }
323
+ runDaemon(serverName, config).catch((error) => {
324
+ console.error('Daemon failed:', error);
325
+ process.exit(1);
326
+ });
327
+ }
@@ -0,0 +1,287 @@
1
+ /**
2
+ * Enhanced error handling with actionable messages for LLM recovery
3
+ *
4
+ * Each error includes:
5
+ * - What went wrong (error type)
6
+ * - Why it failed (details)
7
+ * - How to fix it (recovery suggestions)
8
+ */
9
+ import { ErrorCode } from '../cli-errors.js';
10
+ export { ErrorCode, formatCliError } from '../cli-errors.js';
11
+ // ============================================================================
12
+ // Config Errors
13
+ // ============================================================================
14
+ export function configNotFoundError(path) {
15
+ return {
16
+ code: ErrorCode.CLIENT_ERROR,
17
+ type: 'CONFIG_NOT_FOUND',
18
+ message: `Config file not found: ${path}`,
19
+ suggestion: `Create mcp_servers.json with: { "mcpServers": { "server-name": { "command": "..." } } }`,
20
+ };
21
+ }
22
+ export function configSearchError() {
23
+ return {
24
+ code: ErrorCode.CLIENT_ERROR,
25
+ type: 'CONFIG_NOT_FOUND',
26
+ message: 'No mcp_servers.json found in search paths',
27
+ details: 'Searched: ./mcp_servers.json, ~/.mcp_servers.json, ~/.config/mcp/mcp_servers.json',
28
+ suggestion: 'Create mcp_servers.json in current directory or use -c/--config to specify path',
29
+ };
30
+ }
31
+ export function configInvalidJsonError(path, parseError) {
32
+ return {
33
+ code: ErrorCode.CLIENT_ERROR,
34
+ type: 'CONFIG_INVALID_JSON',
35
+ message: `Invalid JSON in config file: ${path}`,
36
+ details: parseError,
37
+ suggestion: 'Check for syntax errors: missing commas, unquoted keys, trailing commas',
38
+ };
39
+ }
40
+ export function configMissingFieldError(path) {
41
+ return {
42
+ code: ErrorCode.CLIENT_ERROR,
43
+ type: 'CONFIG_MISSING_FIELD',
44
+ message: `Config file missing required "mcpServers" object`,
45
+ details: `File: ${path}`,
46
+ suggestion: 'Config must have structure: { "mcpServers": { ... } }',
47
+ };
48
+ }
49
+ // ============================================================================
50
+ // Server Errors
51
+ // ============================================================================
52
+ export function serverNotFoundError(serverName, available) {
53
+ const availableList = available.length > 0 ? available.join(', ') : '(none)';
54
+ return {
55
+ code: ErrorCode.CLIENT_ERROR,
56
+ type: 'SERVER_NOT_FOUND',
57
+ message: `Server "${serverName}" not found in config`,
58
+ details: `Available servers: ${availableList}`,
59
+ suggestion: available.length > 0
60
+ ? `Use one of: ${available.map((s) => `pibo mcp info ${s}`).join(', ')}`
61
+ : `Add server to mcp_servers.json: { "mcpServers": { "${serverName}": { ... } } }`,
62
+ };
63
+ }
64
+ export function serverConnectionError(serverName, cause) {
65
+ // Detect common error patterns
66
+ let suggestion = 'Check server configuration and ensure the server process can start';
67
+ if (cause.includes('ENOENT') || cause.includes('not found')) {
68
+ suggestion =
69
+ 'Command not found. Install the MCP server: npx -y @modelcontextprotocol/server-<name>';
70
+ }
71
+ else if (cause.includes('ECONNREFUSED')) {
72
+ suggestion =
73
+ 'Server refused connection. Check if the server is running and URL is correct';
74
+ }
75
+ else if (cause.includes('ETIMEDOUT') || cause.includes('timeout')) {
76
+ suggestion =
77
+ 'Connection timed out. Check network connectivity and server availability';
78
+ }
79
+ else if (cause.includes('401') || cause.includes('Unauthorized')) {
80
+ suggestion = 'Authentication required. Add Authorization header to config';
81
+ }
82
+ else if (cause.includes('403') || cause.includes('Forbidden')) {
83
+ suggestion = 'Access forbidden. Check credentials and permissions';
84
+ }
85
+ return {
86
+ code: ErrorCode.NETWORK_ERROR,
87
+ type: 'SERVER_CONNECTION_FAILED',
88
+ message: `Failed to connect to server "${serverName}"`,
89
+ details: cause,
90
+ suggestion,
91
+ };
92
+ }
93
+ // ============================================================================
94
+ // Tool Errors
95
+ // ============================================================================
96
+ export function toolNotFoundError(toolName, serverName, availableTools) {
97
+ const toolList = availableTools?.slice(0, 5).join(', ') || '';
98
+ const moreCount = availableTools && availableTools.length > 5
99
+ ? ` (+${availableTools.length - 5} more)`
100
+ : '';
101
+ return {
102
+ code: ErrorCode.CLIENT_ERROR,
103
+ type: 'TOOL_NOT_FOUND',
104
+ message: `Tool "${toolName}" not found in server "${serverName}"`,
105
+ details: availableTools
106
+ ? `Available tools: ${toolList}${moreCount}`
107
+ : undefined,
108
+ suggestion: `Run 'pibo mcp info ${serverName}' to see all available tools`,
109
+ };
110
+ }
111
+ export function toolExecutionError(toolName, serverName, cause) {
112
+ let suggestion = 'Check tool arguments match the expected schema';
113
+ // Detect common MCP error patterns
114
+ if (cause.includes('validation') || cause.includes('invalid_type')) {
115
+ suggestion = `Run 'pibo mcp info ${serverName} ${toolName}' to see the input schema, then fix arguments`;
116
+ }
117
+ else if (cause.includes('required')) {
118
+ suggestion = `Missing required argument. Run 'pibo mcp info ${serverName} ${toolName}' to see required fields`;
119
+ }
120
+ else if (cause.includes('permission') || cause.includes('denied')) {
121
+ suggestion = 'Permission denied. Check file/resource permissions';
122
+ }
123
+ else if (cause.includes('not found') || cause.includes('ENOENT')) {
124
+ suggestion = 'Resource not found. Verify the path or identifier exists';
125
+ }
126
+ return {
127
+ code: ErrorCode.SERVER_ERROR,
128
+ type: 'TOOL_EXECUTION_FAILED',
129
+ message: `Tool "${toolName}" execution failed`,
130
+ details: cause,
131
+ suggestion,
132
+ };
133
+ }
134
+ export function toolDisabledError(toolName, serverName) {
135
+ return {
136
+ code: ErrorCode.CLIENT_ERROR,
137
+ type: 'TOOL_DISABLED',
138
+ message: `Tool "${toolName}" is disabled by configuration`,
139
+ details: `Server "${serverName}" has allowedTools/disabledTools filtering configured`,
140
+ suggestion: `Check your mcp_servers.json config. Remove "${toolName}" from disabledTools or add it to allowedTools.`,
141
+ };
142
+ }
143
+ // ============================================================================
144
+ // Argument Errors
145
+ // ============================================================================
146
+ export function invalidTargetError(target) {
147
+ return {
148
+ code: ErrorCode.CLIENT_ERROR,
149
+ type: 'INVALID_TARGET',
150
+ message: `Invalid target format: "${target}"`,
151
+ details: 'Expected format: server/tool',
152
+ suggestion: `Use 'pibo mcp call <server> <tool> <json>', e.g. 'pibo mcp call github search_repos \'{"query":"mcp"}\''`,
153
+ };
154
+ }
155
+ export function invalidJsonArgsError(input, parseError) {
156
+ // Truncate long input
157
+ const truncated = input.length > 100 ? `${input.substring(0, 100)}...` : input;
158
+ return {
159
+ code: ErrorCode.CLIENT_ERROR,
160
+ type: 'INVALID_JSON_ARGUMENTS',
161
+ message: 'Invalid JSON in tool arguments',
162
+ details: parseError ? `Parse error: ${parseError}` : `Input: ${truncated}`,
163
+ suggestion: `Use valid JSON: '{"path": "./file.txt"}'. Run 'pibo mcp info <server> <tool>' for the schema.`,
164
+ };
165
+ }
166
+ export function unknownOptionError(option) {
167
+ // Provide context-aware suggestions for common mistakes
168
+ let suggestion;
169
+ const optionLower = option.toLowerCase().replace(/^-+/, '');
170
+ if (['server', 's'].includes(optionLower)) {
171
+ suggestion = `Server is a positional argument. Use 'pibo mcp info <server>'`;
172
+ }
173
+ else if (['tool', 't'].includes(optionLower)) {
174
+ suggestion = `Tool is a positional argument. Use 'pibo mcp call <server> <tool>'`;
175
+ }
176
+ else if (['args', 'arguments', 'a', 'input'].includes(optionLower)) {
177
+ suggestion = `Pass JSON directly: 'pibo mcp call <server> <tool> '{\"key\": \"value\"}''`;
178
+ }
179
+ else if (['pattern', 'p', 'search', 'query'].includes(optionLower)) {
180
+ suggestion = `Use 'pibo mcp grep \"*pattern*\"'`;
181
+ }
182
+ else if (['call', 'run', 'exec'].includes(optionLower)) {
183
+ suggestion = `Use 'call' as a subcommand, not option: 'pibo mcp call <server> <tool>'`;
184
+ }
185
+ else if (['info', 'list', 'get'].includes(optionLower)) {
186
+ suggestion = `Use 'info' as a subcommand, not option: 'pibo mcp info <server>'`;
187
+ }
188
+ else {
189
+ suggestion =
190
+ 'Valid options: -c/--config, -j/--json, -d/--with-descriptions, -r/--raw';
191
+ }
192
+ return {
193
+ code: ErrorCode.CLIENT_ERROR,
194
+ type: 'UNKNOWN_OPTION',
195
+ message: `Unknown option: ${option}`,
196
+ suggestion,
197
+ };
198
+ }
199
+ export function missingArgumentError(command, argument) {
200
+ // Provide command-specific format examples
201
+ let suggestion;
202
+ switch (command) {
203
+ case 'call':
204
+ if (argument.includes('server')) {
205
+ suggestion = `Use 'pibo mcp call <server> <tool> '{\"key\": \"value\"}''`;
206
+ }
207
+ else {
208
+ suggestion = `Use 'pibo mcp call <server> <tool> '{\"key\": \"value\"}''`;
209
+ }
210
+ break;
211
+ case 'grep':
212
+ suggestion = `Use 'pibo mcp grep \"*pattern*\"'`;
213
+ break;
214
+ case '-c/--config':
215
+ suggestion = `Use 'pibo mcp -c /path/to/mcp_servers.json'`;
216
+ break;
217
+ default:
218
+ suggestion = `Run 'pibo mcp --help' for available commands`;
219
+ }
220
+ return {
221
+ code: ErrorCode.CLIENT_ERROR,
222
+ type: 'MISSING_ARGUMENT',
223
+ message: `Missing required argument for ${command}: ${argument}`,
224
+ suggestion,
225
+ };
226
+ }
227
+ // ============================================================================
228
+ // Subcommand Errors
229
+ // ============================================================================
230
+ /**
231
+ * Error when user provides ambiguous command like "pibo mcp server tool"
232
+ */
233
+ export function ambiguousCommandError(serverName, toolName, hasArgs) {
234
+ const cmd = hasArgs
235
+ ? `pibo mcp call ${serverName} ${toolName} '<json>'`
236
+ : `pibo mcp call ${serverName} ${toolName}`;
237
+ return {
238
+ code: ErrorCode.CLIENT_ERROR,
239
+ type: 'AMBIGUOUS_COMMAND',
240
+ message: 'Ambiguous command: did you mean to call a tool or view info?',
241
+ details: `Received: pibo mcp ${serverName} ${toolName}${hasArgs ? ' ...' : ''}`,
242
+ suggestion: `Use '${cmd}' to execute, or 'pibo mcp info ${serverName} ${toolName}' to view schema`,
243
+ };
244
+ }
245
+ /**
246
+ * Error when user uses unknown subcommand with smart suggestions
247
+ */
248
+ export function unknownSubcommandError(subcommand) {
249
+ // Map common aliases to correct subcommands
250
+ const suggestions = {
251
+ run: 'call',
252
+ execute: 'call',
253
+ exec: 'call',
254
+ invoke: 'call',
255
+ list: 'info',
256
+ ls: 'info',
257
+ get: 'info',
258
+ show: 'info',
259
+ describe: 'info',
260
+ search: 'grep',
261
+ find: 'grep',
262
+ query: 'grep',
263
+ };
264
+ const suggested = suggestions[subcommand.toLowerCase()];
265
+ const validCommands = 'info, grep, call, config';
266
+ return {
267
+ code: ErrorCode.CLIENT_ERROR,
268
+ type: 'UNKNOWN_SUBCOMMAND',
269
+ message: `Unknown subcommand: "${subcommand}"`,
270
+ details: `Valid subcommands: ${validCommands}`,
271
+ suggestion: suggested
272
+ ? `Did you mean 'pibo mcp ${suggested}'?`
273
+ : `Use 'pibo mcp --help' to see available commands`,
274
+ };
275
+ }
276
+ /**
277
+ * Error when too many positional arguments provided
278
+ */
279
+ export function tooManyArgumentsError(command, received, max) {
280
+ return {
281
+ code: ErrorCode.CLIENT_ERROR,
282
+ type: 'TOO_MANY_ARGUMENTS',
283
+ message: `Too many arguments for ${command}`,
284
+ details: `Received ${received} arguments, maximum is ${max}`,
285
+ suggestion: `Run 'pibo mcp --help' for correct usage`,
286
+ };
287
+ }