@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,94 @@
1
+ import { spawn } from "node:child_process";
2
+ import { Type } from "@mariozechner/pi-ai";
3
+ import { defineTool } from "@mariozechner/pi-coding-agent";
4
+ const DEFAULT_MAX_OUTPUT_CHARS = 20000;
5
+ function truncate(value, maxChars) {
6
+ if (value.length <= maxChars)
7
+ return value;
8
+ return `${value.slice(0, maxChars)}\n[truncated ${value.length - maxChars} chars]`;
9
+ }
10
+ const piboExecTool = defineTool({
11
+ name: "pibo_exec",
12
+ label: "Pibo Exec",
13
+ description: "Run a shell command on this machine with full agent privileges.",
14
+ promptSnippet: "Run a shell command on this machine. Use directly for short commands, or wrap with pibo_run_start for long-running commands.",
15
+ parameters: Type.Object({
16
+ command: Type.String({ description: "Shell command to run through bash -lc" }),
17
+ cwd: Type.Optional(Type.String({ description: "Working directory. Defaults to the pibo runtime cwd." })),
18
+ timeoutMs: Type.Optional(Type.Number({ description: "Optional timeout in milliseconds. Omit for no timeout." })),
19
+ maxOutputChars: Type.Optional(Type.Number({ description: "Maximum stdout/stderr chars returned per stream" })),
20
+ }),
21
+ async execute(_toolCallId, params, signal, _onUpdate, ctx) {
22
+ const cwd = params.cwd ?? ctx.cwd;
23
+ const maxOutputChars = Math.max(0, params.maxOutputChars ?? DEFAULT_MAX_OUTPUT_CHARS);
24
+ const result = await new Promise((resolve, reject) => {
25
+ const child = spawn("bash", ["-lc", params.command], {
26
+ cwd,
27
+ env: process.env,
28
+ stdio: ["ignore", "pipe", "pipe"],
29
+ });
30
+ let stdout = "";
31
+ let stderr = "";
32
+ let timedOut = false;
33
+ const timeout = params.timeoutMs && params.timeoutMs > 0
34
+ ? setTimeout(() => {
35
+ timedOut = true;
36
+ child.kill("SIGTERM");
37
+ }, params.timeoutMs)
38
+ : undefined;
39
+ const abort = () => {
40
+ timedOut = false;
41
+ child.kill("SIGTERM");
42
+ };
43
+ signal?.addEventListener("abort", abort, { once: true });
44
+ child.stdout?.on("data", (chunk) => {
45
+ stdout += String(chunk);
46
+ });
47
+ child.stderr?.on("data", (chunk) => {
48
+ stderr += String(chunk);
49
+ });
50
+ child.once("error", (error) => {
51
+ if (timeout)
52
+ clearTimeout(timeout);
53
+ signal?.removeEventListener("abort", abort);
54
+ reject(error);
55
+ });
56
+ child.once("close", (exitCode, exitSignal) => {
57
+ if (timeout)
58
+ clearTimeout(timeout);
59
+ signal?.removeEventListener("abort", abort);
60
+ resolve({
61
+ command: params.command,
62
+ cwd,
63
+ exitCode,
64
+ signal: exitSignal,
65
+ stdout: truncate(stdout, maxOutputChars),
66
+ stderr: truncate(stderr, maxOutputChars),
67
+ timedOut,
68
+ });
69
+ });
70
+ });
71
+ const text = [
72
+ `exitCode: ${result.exitCode}`,
73
+ result.signal ? `signal: ${result.signal}` : undefined,
74
+ result.timedOut ? "timedOut: true" : undefined,
75
+ result.stdout ? `stdout:\n${result.stdout}` : undefined,
76
+ result.stderr ? `stderr:\n${result.stderr}` : undefined,
77
+ ].filter(Boolean).join("\n\n");
78
+ return {
79
+ content: [{ type: "text", text }],
80
+ details: result,
81
+ isError: result.exitCode !== 0,
82
+ };
83
+ },
84
+ });
85
+ export function createPiboCoreToolProfiles() {
86
+ return [createToolProfile(piboExecTool)];
87
+ }
88
+ function createToolProfile(definition) {
89
+ return {
90
+ name: definition.name,
91
+ description: definition.description,
92
+ definition,
93
+ };
94
+ }
@@ -0,0 +1,67 @@
1
+ import { Type } from "@mariozechner/pi-ai";
2
+ import { defineTool } from "@mariozechner/pi-coding-agent";
3
+ import { InitialSessionContextBuilder } from "../core/profiles.js";
4
+ import { definePiboPlugin } from "./registry.js";
5
+ const EXAMPLE_SKILL = "pibo-example-plugin";
6
+ const EXAMPLE_TOOL = "pibo_example_plugin_note";
7
+ const piboExamplePluginTool = defineTool({
8
+ name: EXAMPLE_TOOL,
9
+ label: "Pibo Example Plugin Note",
10
+ description: "Return a short note from the minimal pibo example plugin.",
11
+ promptSnippet: "Use this tool to verify that a pibo plugin can add a custom tool.",
12
+ parameters: Type.Object({
13
+ note: Type.String({ description: "Short note to return from the example plugin tool" }),
14
+ }),
15
+ async execute(_toolCallId, params) {
16
+ return {
17
+ content: [{ type: "text", text: `Example plugin note: ${params.note}` }],
18
+ details: {
19
+ plugin: "pibo.example",
20
+ note: params.note,
21
+ },
22
+ };
23
+ },
24
+ });
25
+ export const piboExamplePlugin = definePiboPlugin({
26
+ id: "pibo.example",
27
+ name: "Pibo Example Plugin",
28
+ register(api) {
29
+ let stopExampleChannel;
30
+ api.registerSkill({
31
+ name: EXAMPLE_SKILL,
32
+ path: "examples/skills/pibo-example-plugin/SKILL.md",
33
+ });
34
+ api.registerTool(createToolProfile(piboExamplePluginTool));
35
+ api.registerProfile({
36
+ name: "pibo-example-plugin",
37
+ aliases: ["example-plugin"],
38
+ description: "Minimal profile that demonstrates plugin-provided skills and tools.",
39
+ create(context) {
40
+ return new InitialSessionContextBuilder("pibo-example-plugin")
41
+ .addSkill(context.getSkill(EXAMPLE_SKILL))
42
+ .addTool(context.getTool(EXAMPLE_TOOL))
43
+ .createSession();
44
+ },
45
+ });
46
+ api.registerChannel({
47
+ name: "pibo-example-channel",
48
+ kind: "custom",
49
+ description: "Minimal no-op channel that demonstrates plugin channel registration.",
50
+ auth: { mode: "trusted-local" },
51
+ start(context) {
52
+ stopExampleChannel = context.subscribe(() => { });
53
+ },
54
+ stop() {
55
+ stopExampleChannel?.();
56
+ stopExampleChannel = undefined;
57
+ },
58
+ });
59
+ },
60
+ });
61
+ function createToolProfile(definition) {
62
+ return {
63
+ name: definition.name,
64
+ description: definition.description,
65
+ definition,
66
+ };
67
+ }
@@ -0,0 +1,368 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { listInstalledCliToolAgentContexts } from "../tools/registry.js";
3
+ import { listPiPackages } from "../pi-packages/store.js";
4
+ function getWebAppRoutes(app) {
5
+ return [
6
+ { label: "mountPath", prefix: app.mountPath },
7
+ { label: "apiPrefix", prefix: app.apiPrefix },
8
+ ];
9
+ }
10
+ function validateWebRoute(appName, label, prefix) {
11
+ if (!prefix.startsWith("/")) {
12
+ throw new Error(`Web app "${appName}" ${label} must start with "/"`);
13
+ }
14
+ if (prefix.length > 1 && prefix.endsWith("/")) {
15
+ throw new Error(`Web app "${appName}" ${label} must not end with "/"`);
16
+ }
17
+ }
18
+ function webRoutesOverlap(left, right) {
19
+ return left === right || left === "/" || right === "/" || left.startsWith(`${right}/`) || right.startsWith(`${left}/`);
20
+ }
21
+ export class PiboPluginRegistry {
22
+ tools = new Map();
23
+ subagents = new Map();
24
+ skills = new Map();
25
+ contextFiles = new Map();
26
+ profiles = new Map();
27
+ profileAliases = new Map();
28
+ gatewayActions = new Map();
29
+ gatewaySlashCommands = new Map();
30
+ channels = new Map();
31
+ authService;
32
+ webApps = new Map();
33
+ eventListeners = new Set();
34
+ productEventListeners = new Set();
35
+ pluginIds = new Set();
36
+ pluginNames = new Map();
37
+ eventErrors = [];
38
+ static create(options = {}) {
39
+ const registry = new PiboPluginRegistry();
40
+ for (const plugin of options.plugins ?? []) {
41
+ registry.registerPlugin(plugin);
42
+ }
43
+ return registry;
44
+ }
45
+ registerPlugin(plugin) {
46
+ if (this.pluginIds.has(plugin.id)) {
47
+ throw new Error(`Plugin "${plugin.id}" is already registered`);
48
+ }
49
+ this.pluginIds.add(plugin.id);
50
+ this.pluginNames.set(plugin.id, plugin.name ?? plugin.id);
51
+ plugin.register(this.createApi(plugin.id));
52
+ }
53
+ registerTool(tool) {
54
+ this.addUnique(this.tools, tool.name, tool, "tool");
55
+ }
56
+ registerTools(tools) {
57
+ for (const tool of tools) {
58
+ this.registerTool(tool);
59
+ }
60
+ }
61
+ registerSubagent(subagent) {
62
+ this.addUnique(this.subagents, subagent.name, subagent, "subagent");
63
+ }
64
+ registerSubagents(subagents) {
65
+ for (const subagent of subagents) {
66
+ this.registerSubagent(subagent);
67
+ }
68
+ }
69
+ registerSkill(skill) {
70
+ this.addUnique(this.skills, skill.name, skill, "skill");
71
+ }
72
+ registerContextFile(contextFile) {
73
+ this.addUnique(this.contextFiles, contextFileKey(contextFile), contextFile, "context file");
74
+ }
75
+ upsertContextFile(contextFile) {
76
+ this.contextFiles.set(contextFileKey(contextFile), contextFile);
77
+ }
78
+ removeContextFile(key) {
79
+ this.contextFiles.delete(key);
80
+ }
81
+ registerProfile(profile) {
82
+ this.addUnique(this.profiles, profile.name, profile, "profile");
83
+ this.registerProfileAliases(profile);
84
+ }
85
+ upsertProfile(profile) {
86
+ this.profiles.set(profile.name, profile);
87
+ for (const [alias, profileName] of this.profileAliases.entries()) {
88
+ if (profileName === profile.name)
89
+ this.profileAliases.delete(alias);
90
+ }
91
+ this.registerProfileAliases(profile);
92
+ }
93
+ removeProfile(name) {
94
+ const resolvedName = this.profileAliases.get(name) ?? name;
95
+ if (!this.profiles.delete(resolvedName))
96
+ return;
97
+ for (const [alias, profileName] of this.profileAliases.entries()) {
98
+ if (profileName === resolvedName)
99
+ this.profileAliases.delete(alias);
100
+ }
101
+ }
102
+ registerGatewayAction(action) {
103
+ const slashCommands = this.getGatewaySlashCommandsToRegister(action);
104
+ this.addUnique(this.gatewayActions, action.name, action, "gateway action");
105
+ for (const slashCommand of slashCommands) {
106
+ this.gatewaySlashCommands.set(slashCommand, action.name);
107
+ }
108
+ }
109
+ registerChannel(channel) {
110
+ this.addUnique(this.channels, channel.name, channel, "channel");
111
+ }
112
+ registerAuthService(service) {
113
+ if (this.authService) {
114
+ throw new Error(`Auth service "${this.authService.name}" is already registered`);
115
+ }
116
+ this.authService = service;
117
+ }
118
+ registerWebApp(app) {
119
+ if (this.webApps.has(app.name)) {
120
+ throw new Error(`Duplicate web app "${app.name}"`);
121
+ }
122
+ this.validateWebAppRoutes(app);
123
+ this.webApps.set(app.name, app);
124
+ }
125
+ onEvent(listener) {
126
+ this.eventListeners.add(listener);
127
+ }
128
+ onProductEvent(listener) {
129
+ this.productEventListeners.add(listener);
130
+ return () => {
131
+ this.productEventListeners.delete(listener);
132
+ };
133
+ }
134
+ createProfile(name) {
135
+ const resolvedName = this.resolveProfileName(name);
136
+ const profile = this.profiles.get(resolvedName);
137
+ if (!profile)
138
+ throw new Error(`Unknown profile "${name}"`);
139
+ return profile.create(this.createProfileBuildContext());
140
+ }
141
+ getProfileNames() {
142
+ return [...this.profiles.keys()];
143
+ }
144
+ getProfileInfos() {
145
+ const context = this.createProfileBuildContext();
146
+ return [...this.profiles.values()].map((profile) => {
147
+ const sessionContext = profile.create(context);
148
+ return {
149
+ name: profile.name,
150
+ description: profile.description,
151
+ aliases: [...(profile.aliases ?? [])],
152
+ nativeTools: sessionContext.tools.filter((tool) => tool.enabled !== false).map((tool) => tool.name),
153
+ skills: sessionContext.skills.filter((skill) => skill.enabled !== false).map((skill) => skill.name),
154
+ contextFiles: sessionContext.contextFiles.filter((contextFile) => contextFile.enabled !== false).map(contextFileKey),
155
+ subagents: sessionContext.subagents.filter((subagent) => subagent.enabled !== false),
156
+ mcpServers: [...sessionContext.mcpServers],
157
+ piPackages: sessionContext.piPackages.filter((pkg) => pkg.enabled !== false).map((pkg) => pkg.id),
158
+ builtinTools: sessionContext.builtinTools,
159
+ builtinToolNames: [...sessionContext.builtinToolNames],
160
+ autoContextFiles: sessionContext.autoContextFiles,
161
+ runControl: sessionContext.toolPackages.runControl === true,
162
+ };
163
+ });
164
+ }
165
+ getCapabilityCatalog() {
166
+ return {
167
+ nativeTools: [...this.tools.values()].map((tool) => ({
168
+ name: tool.name,
169
+ description: tool.description,
170
+ yieldable: tool.yieldable !== false,
171
+ hasDefinition: tool.definition !== undefined,
172
+ pluginId: tool.pluginId,
173
+ pluginName: tool.pluginId ? this.pluginNames.get(tool.pluginId) : undefined,
174
+ ...(tool.providerTool ? { providerTool: tool.providerTool } : {}),
175
+ })),
176
+ skills: [...this.skills.values()].map((skill) => ({
177
+ name: skill.name,
178
+ path: skill.path,
179
+ })),
180
+ subagents: [...this.subagents.values()].map((subagent) => ({
181
+ name: subagent.name,
182
+ description: subagent.description,
183
+ targetProfile: subagent.targetProfile,
184
+ timeoutMs: subagent.timeoutMs,
185
+ maxDepth: subagent.maxDepth,
186
+ })),
187
+ contextFiles: [...this.contextFiles.entries()].map(([key, contextFile]) => ({
188
+ key,
189
+ label: contextFile.label,
190
+ path: contextFile.path,
191
+ scope: contextFile.scope ?? "global",
192
+ source: contextFile.source ?? "plugin",
193
+ pluginId: contextFile.pluginId,
194
+ pluginName: contextFile.pluginId ? this.pluginNames.get(contextFile.pluginId) : undefined,
195
+ agentProfileName: contextFile.agentProfileName,
196
+ })),
197
+ packages: [
198
+ {
199
+ name: "pibo-run-control",
200
+ description: "Expose pibo_run_* tools as one package for yielded native tools and subagents.",
201
+ toolNames: [
202
+ "pibo_run_start",
203
+ "pibo_run_list",
204
+ "pibo_run_status",
205
+ "pibo_run_wait",
206
+ "pibo_run_read",
207
+ "pibo_run_cancel",
208
+ "pibo_run_ack",
209
+ ],
210
+ },
211
+ ],
212
+ piboTools: listInstalledCliToolAgentContexts(),
213
+ mcpServers: [],
214
+ piPackages: listPiPackages(),
215
+ };
216
+ }
217
+ resolveProfileName(name) {
218
+ const resolvedName = this.profileAliases.get(name) ?? name;
219
+ if (!this.profiles.has(resolvedName)) {
220
+ throw new Error(`Unknown profile "${name}". Available profiles: ${this.getProfileNames().join(", ")}`);
221
+ }
222
+ return resolvedName;
223
+ }
224
+ getGatewayAction(name) {
225
+ return this.gatewayActions.get(name);
226
+ }
227
+ getGatewayActionInfos() {
228
+ return [...this.gatewayActions.values()]
229
+ .filter((action) => action.hidden !== true)
230
+ .map((action) => ({
231
+ name: action.name,
232
+ description: action.description,
233
+ slashCommands: [...(action.slashCommands ?? [])],
234
+ }));
235
+ }
236
+ getChannels() {
237
+ return [...this.channels.values()];
238
+ }
239
+ getAuthService() {
240
+ return this.authService;
241
+ }
242
+ getWebApps() {
243
+ return [...this.webApps.values()];
244
+ }
245
+ getEventErrors() {
246
+ return [...this.eventErrors];
247
+ }
248
+ notifyEvent(event) {
249
+ for (const listener of this.eventListeners) {
250
+ try {
251
+ listener(event);
252
+ }
253
+ catch (error) {
254
+ this.eventErrors.push(error instanceof Error ? error.message : String(error));
255
+ }
256
+ }
257
+ }
258
+ emitProductEvent(input) {
259
+ const event = {
260
+ ...input,
261
+ id: input.id ?? randomUUID(),
262
+ createdAt: input.createdAt ?? new Date().toISOString(),
263
+ };
264
+ for (const listener of this.productEventListeners) {
265
+ try {
266
+ listener(event);
267
+ }
268
+ catch (error) {
269
+ this.eventErrors.push(error instanceof Error ? error.message : String(error));
270
+ }
271
+ }
272
+ return event;
273
+ }
274
+ createApi(pluginId) {
275
+ const withPluginToolContext = (tool) => ({ ...tool, pluginId: tool.pluginId ?? pluginId });
276
+ const withPluginContext = (contextFile) => (contextFile.source === "managed" ? contextFile : { ...contextFile, pluginId: contextFile.pluginId ?? pluginId });
277
+ return {
278
+ registerTool: (tool) => this.registerTool(withPluginToolContext(tool)),
279
+ registerTools: (tools) => this.registerTools(tools.map(withPluginToolContext)),
280
+ registerSubagent: (subagent) => this.registerSubagent(subagent),
281
+ registerSubagents: (subagents) => this.registerSubagents(subagents),
282
+ registerSkill: (skill) => this.registerSkill(skill),
283
+ registerContextFile: (contextFile) => this.registerContextFile(withPluginContext(contextFile)),
284
+ upsertContextFile: (contextFile) => this.upsertContextFile(withPluginContext(contextFile)),
285
+ removeContextFile: (key) => this.removeContextFile(key),
286
+ registerProfile: (profile) => this.registerProfile(profile),
287
+ registerGatewayAction: (action) => this.registerGatewayAction(action),
288
+ registerChannel: (channel) => this.registerChannel(channel),
289
+ registerAuthService: (service) => this.registerAuthService(service),
290
+ registerWebApp: (app) => this.registerWebApp(app),
291
+ onEvent: (listener) => this.onEvent(listener),
292
+ emitProductEvent: (event) => this.emitProductEvent(event),
293
+ onProductEvent: (listener) => this.onProductEvent(listener),
294
+ };
295
+ }
296
+ createProfileBuildContext() {
297
+ return {
298
+ getTool: (name) => this.getRequired(this.tools, name, "tool"),
299
+ getTools: (names) => names.map((name) => this.getRequired(this.tools, name, "tool")),
300
+ getSkill: (name) => this.getRequired(this.skills, name, "skill"),
301
+ getContextFile: (key) => this.getRequired(this.contextFiles, key, "context file"),
302
+ getSubagent: (name) => this.getRequired(this.subagents, name, "subagent"),
303
+ getSubagents: (names) => names.map((name) => this.getRequired(this.subagents, name, "subagent")),
304
+ };
305
+ }
306
+ getRequired(map, key, label) {
307
+ const value = map.get(key);
308
+ if (!value) {
309
+ throw new Error(`Unknown ${label} "${key}"`);
310
+ }
311
+ return value;
312
+ }
313
+ registerProfileAliases(profile) {
314
+ for (const alias of profile.aliases ?? []) {
315
+ const existingAliasProfile = this.profileAliases.get(alias);
316
+ if (this.profiles.has(alias) || (existingAliasProfile && existingAliasProfile !== profile.name)) {
317
+ throw new Error(`Profile alias "${alias}" is already registered`);
318
+ }
319
+ this.profileAliases.set(alias, profile.name);
320
+ }
321
+ }
322
+ addUnique(map, key, value, label) {
323
+ if (map.has(key)) {
324
+ throw new Error(`Duplicate ${label} "${key}"`);
325
+ }
326
+ map.set(key, value);
327
+ }
328
+ validateWebAppRoutes(app) {
329
+ const routes = getWebAppRoutes(app);
330
+ for (const route of routes) {
331
+ validateWebRoute(app.name, route.label, route.prefix);
332
+ }
333
+ for (const existing of this.webApps.values()) {
334
+ for (const route of routes) {
335
+ for (const existingRoute of getWebAppRoutes(existing)) {
336
+ if (webRoutesOverlap(route.prefix, existingRoute.prefix)) {
337
+ throw new Error(`Web app route "${route.prefix}" for "${app.name}" overlaps ${existingRoute.label} "${existingRoute.prefix}" from web app "${existing.name}"`);
338
+ }
339
+ }
340
+ }
341
+ }
342
+ }
343
+ getGatewaySlashCommandsToRegister(action) {
344
+ if (action.hidden === true)
345
+ return [];
346
+ const slashCommands = [];
347
+ for (const slashCommand of action.slashCommands ?? []) {
348
+ if (!slashCommand || slashCommand.startsWith("/") || /\s/.test(slashCommand)) {
349
+ throw new Error(`Invalid slash command "${slashCommand}" for gateway action "${action.name}"`);
350
+ }
351
+ const existingAction = this.gatewaySlashCommands.get(slashCommand);
352
+ if (existingAction) {
353
+ throw new Error(`Duplicate slash command "${slashCommand}" for gateway actions "${existingAction}" and "${action.name}"`);
354
+ }
355
+ if (slashCommands.includes(slashCommand)) {
356
+ throw new Error(`Duplicate slash command "${slashCommand}" for gateway action "${action.name}"`);
357
+ }
358
+ slashCommands.push(slashCommand);
359
+ }
360
+ return slashCommands;
361
+ }
362
+ }
363
+ function contextFileKey(contextFile) {
364
+ return contextFile.key ?? contextFile.label ?? contextFile.path;
365
+ }
366
+ export function definePiboPlugin(plugin) {
367
+ return plugin;
368
+ }
@@ -0,0 +1,9 @@
1
+ import { createRemoteAgentChannel } from "../remote/channel.js";
2
+ import { definePiboPlugin } from "./registry.js";
3
+ export const piboRemoteAgentPlugin = definePiboPlugin({
4
+ id: "pibo.remote-agent",
5
+ name: "Pibo Remote Agent",
6
+ register(api) {
7
+ api.registerChannel(createRemoteAgentChannel());
8
+ },
9
+ });
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,11 @@
1
+ import { createWebHostChannel } from "../web/channel.js";
2
+ import { definePiboPlugin } from "./registry.js";
3
+ export function createPiboWebHostPlugin(options = {}) {
4
+ return definePiboPlugin({
5
+ id: "pibo.web-host",
6
+ name: "Pibo Web Host",
7
+ register(api) {
8
+ api.registerChannel(createWebHostChannel(options));
9
+ },
10
+ });
11
+ }