@pasko70/pibo 2.0.0 → 2.2.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 (388) hide show
  1. package/dist/agent-runtime/capabilities.js +68 -0
  2. package/dist/agent-runtime/context-build.js +13 -5
  3. package/dist/agent-runtime/portable-history.js +526 -0
  4. package/dist/agent-runtime/profile-validation.js +13 -7
  5. package/dist/agent-runtime/resource-files.js +26 -10
  6. package/dist/agent-runtime/resource-service.js +216 -13
  7. package/dist/agent-runtimes/codex-native/adapter.js +38 -1
  8. package/dist/agent-runtimes/codex-native/auth.js +24 -3
  9. package/dist/agent-runtimes/codex-native/portable-history.js +73 -0
  10. package/dist/agent-runtimes/codex-native/process.js +38 -27
  11. package/dist/agent-runtimes/codex-native/resource-delivery.js +39 -16
  12. package/dist/agent-runtimes/codex-native/turn.js +68 -5
  13. package/dist/agent-runtimes/omp/adapter.js +616 -0
  14. package/dist/agent-runtimes/omp/auth.js +109 -0
  15. package/dist/agent-runtimes/omp/client.js +460 -0
  16. package/dist/agent-runtimes/omp/config.js +188 -0
  17. package/dist/agent-runtimes/omp/history.js +108 -0
  18. package/dist/agent-runtimes/omp/host-tools.js +201 -0
  19. package/dist/agent-runtimes/omp/models.js +86 -0
  20. package/dist/agent-runtimes/omp/process.js +299 -0
  21. package/dist/agent-runtimes/omp/protocol-types.js +17 -0
  22. package/dist/agent-runtimes/omp/resource-delivery.js +228 -0
  23. package/dist/agent-runtimes/omp/thread.js +141 -0
  24. package/dist/agent-runtimes/omp/turn.js +325 -0
  25. package/dist/agent-runtimes/pi/adapter.js +32 -1
  26. package/dist/agent-runtimes/pi/auth.js +34 -29
  27. package/dist/agent-runtimes/pi/credentials.js +43 -0
  28. package/dist/agent-runtimes/pi/model-catalog.js +7 -3
  29. package/dist/agent-runtimes/pi/portable-history.js +99 -0
  30. package/dist/agent-runtimes/pi/routed-session.js +1 -1
  31. package/dist/agent-runtimes/pi/runtime.js +31 -15
  32. package/dist/apps/chat/agent-profiles.js +1 -0
  33. package/dist/apps/chat/agent-store.js +20 -7
  34. package/dist/apps/chat/chat-files.js +19 -6
  35. package/dist/apps/chat/chat-request-normalizers.js +13 -0
  36. package/dist/apps/chat/web-app.js +55 -6
  37. package/dist/apps/chat-ui/assets/{apl-14BqhLYK.js → apl-gfMMiTNf.js} +1 -1
  38. package/dist/apps/chat-ui/assets/asciiarmor-C_eisQCp.js +1 -0
  39. package/dist/apps/{context-files-ui/assets/asn1-Bg4FbdCg.js → chat-ui/assets/asn1-DCl_8MCW.js} +1 -1
  40. package/dist/apps/{context-files-ui/assets/asterisk-B2MO-X4d.js → chat-ui/assets/asterisk-BEn0Cwpx.js} +1 -1
  41. package/dist/apps/chat-ui/assets/clike-D_6L3tnO.js +1 -0
  42. package/dist/apps/chat-ui/assets/cmake-84nbDH0I.js +1 -0
  43. package/dist/apps/chat-ui/assets/cobol-DHLQUbN7.js +1 -0
  44. package/dist/apps/chat-ui/assets/coffeescript-De_zI4J0.js +1 -0
  45. package/dist/apps/chat-ui/assets/commonlisp-DgAKBe0r.js +1 -0
  46. package/dist/apps/chat-ui/assets/crystal-Bsdphhtm.js +1 -0
  47. package/dist/apps/chat-ui/assets/css-CnaYoQib.js +1 -0
  48. package/dist/apps/chat-ui/assets/{d-TPqSVaHM.js → d-DWkQyNnU.js} +1 -1
  49. package/dist/apps/{context-files-ui/assets/dist-DxEGebCR.js → chat-ui/assets/dist-BB8loWTa.js} +1 -1
  50. package/dist/apps/chat-ui/assets/dist-BJ-TIk3N.js +1 -0
  51. package/dist/apps/chat-ui/assets/dist-CBPDkWd4.js +1 -0
  52. package/dist/apps/chat-ui/assets/dist-CHInEWhr.js +1 -0
  53. package/dist/apps/chat-ui/assets/dist-CqM4On9D.js +13 -0
  54. package/dist/apps/chat-ui/assets/dist-CswnpKik.js +1 -0
  55. package/dist/apps/{context-files-ui/assets/dist-B7gXtTZC.js → chat-ui/assets/dist-CwS16H7k.js} +1 -1
  56. package/dist/apps/chat-ui/assets/dist-DHvUPfrF.js +1 -0
  57. package/dist/apps/chat-ui/assets/dist-DLJCGrGQ.js +1 -0
  58. package/dist/apps/chat-ui/assets/{dist-DLMjd26T.js → dist-DMiglryg.js} +1 -1
  59. package/dist/apps/chat-ui/assets/dist-DTeLDijr.js +9 -0
  60. package/dist/apps/chat-ui/assets/{dist-DKoyMSNr.js → dist-DpF08Yd7.js} +1 -1
  61. package/dist/apps/chat-ui/assets/dist-LCx98fA_.js +11 -0
  62. package/dist/apps/chat-ui/assets/{dist-DotDq_kD.js → dist-RKTRnzGb.js} +1 -1
  63. package/dist/apps/chat-ui/assets/dist-S3zJGntM.js +1 -0
  64. package/dist/apps/{context-files-ui/assets/dist-BkUONE3N.js → chat-ui/assets/dist-XVYGiB-c.js} +1 -1
  65. package/dist/apps/chat-ui/assets/dist-eddbbGyw.js +1 -0
  66. package/dist/apps/chat-ui/assets/dist-fPhZsAUX.js +1 -0
  67. package/dist/apps/chat-ui/assets/dist-mpRGeo_R.js +2 -0
  68. package/dist/apps/chat-ui/assets/{dist-sZgJkWZb.js → dist-nU3BVpFi.js} +1 -1
  69. package/dist/apps/chat-ui/assets/{dockerfile-CJb2sekW.js → dockerfile-DJkHQgkl.js} +1 -1
  70. package/dist/apps/chat-ui/assets/{dylan-08Azy1NK.js → dylan-BCDoL_-p.js} +1 -1
  71. package/dist/apps/chat-ui/assets/{ecl-dhxjHL8y.js → ecl-BVIeWmwY.js} +1 -1
  72. package/dist/apps/{context-files-ui/assets/erlang-BD5LkVkR.js → chat-ui/assets/erlang-BV0c4Hdn.js} +1 -1
  73. package/dist/apps/chat-ui/assets/{factor-B2EMQZkP.js → factor-LKH5gN8L.js} +1 -1
  74. package/dist/apps/chat-ui/assets/groovy-CUpZ7dEl.js +1 -0
  75. package/dist/apps/chat-ui/assets/{haxe-BJVKtprM.js → haxe-DjVOVvNP.js} +1 -1
  76. package/dist/apps/chat-ui/assets/index-CQuka3bs.js +226 -0
  77. package/dist/apps/chat-ui/assets/index-DUXboQnI.css +1 -0
  78. package/dist/apps/chat-ui/assets/javascript-DoL9Wb-Q.js +1 -0
  79. package/dist/apps/chat-ui/assets/{lua-BxuTHaF7.js → lua-CiA1ziua.js} +1 -1
  80. package/dist/apps/chat-ui/assets/{mumps-Ds_ZaumL.js → mumps-BSzj6Xyz.js} +1 -1
  81. package/dist/apps/{context-files-ui/assets/nsis-DOo3SJmd.js → chat-ui/assets/nsis-CfSuhXs5.js} +1 -1
  82. package/dist/apps/chat-ui/assets/{ntriples-DLHGTvHs.js → ntriples-B9h1VB_g.js} +1 -1
  83. package/dist/apps/chat-ui/assets/perl-BkSkiI9m.js +1 -0
  84. package/dist/apps/chat-ui/assets/{powershell-B4IPkVxR.js → powershell-BcIto6Sf.js} +1 -1
  85. package/dist/apps/{context-files-ui/assets/pug-QU72BPAa.js → chat-ui/assets/pug-Gsm0M45u.js} +1 -1
  86. package/dist/apps/chat-ui/assets/puppet-BZyAS7I4.js +1 -0
  87. package/dist/apps/chat-ui/assets/python-B_1Jd8HM.js +1 -0
  88. package/dist/apps/chat-ui/assets/r-CxDmU1I4.js +1 -0
  89. package/dist/apps/chat-ui/assets/ruby-BjXV7-Qa.js +1 -0
  90. package/dist/apps/chat-ui/assets/scheme-D9qYN0V5.js +1 -0
  91. package/dist/apps/chat-ui/assets/{shell-BjiMLAaM.js → shell-DwuoZtxw.js} +1 -1
  92. package/dist/apps/chat-ui/assets/{simple-mode-DnMbQuKW.js → simple-mode-DXiLM1-G.js} +1 -1
  93. package/dist/apps/chat-ui/assets/sql-DuQMFDvy.js +1 -0
  94. package/dist/apps/chat-ui/assets/{stex-BCRT8IJ3.js → stex-DNzd62Q_.js} +1 -1
  95. package/dist/apps/chat-ui/assets/{stylus-CARoeVE9.js → stylus-BOVgKnng.js} +1 -1
  96. package/dist/apps/chat-ui/assets/textile-C4jVoHG1.js +1 -0
  97. package/dist/apps/chat-ui/assets/tiki-AK6FwT8q.js +1 -0
  98. package/dist/apps/chat-ui/assets/toml-BPTmHmyx.js +1 -0
  99. package/dist/apps/chat-ui/assets/{ttcn-GvRgs2AT.js → ttcn-PPSTk1ow.js} +1 -1
  100. package/dist/apps/chat-ui/assets/{ttcn-cfg-CGCXz7Vo.js → ttcn-cfg-2b4Gb5sE.js} +1 -1
  101. package/dist/apps/chat-ui/assets/turtle-Cx3rYX2g.js +1 -0
  102. package/dist/apps/chat-ui/assets/{verilog-DVCHmufx.js → verilog-7LoJAqYT.js} +1 -1
  103. package/dist/apps/chat-ui/assets/vhdl-kS471soi.js +1 -0
  104. package/dist/apps/{context-files-ui/assets/xquery-5f0hn7cg.js → chat-ui/assets/xquery-BKJx4mf9.js} +1 -1
  105. package/dist/apps/chat-ui/assets/z80-Co3PbHdE.js +1 -0
  106. package/dist/apps/chat-ui/index.html +5 -3
  107. package/dist/apps/chat-vscode-web/assets/index-CF1-9PKU.css +2 -0
  108. package/dist/apps/chat-vscode-web/assets/index-Dp1TzeRL.js +41 -0
  109. package/dist/apps/chat-vscode-web/index.html +2 -2
  110. package/dist/apps/context-files-ui/assets/{apl-14BqhLYK.js → apl-gfMMiTNf.js} +1 -1
  111. package/dist/apps/context-files-ui/assets/asciiarmor-C_eisQCp.js +1 -0
  112. package/dist/apps/{chat-ui/assets/asn1-Bg4FbdCg.js → context-files-ui/assets/asn1-DCl_8MCW.js} +1 -1
  113. package/dist/apps/{chat-ui/assets/asterisk-B2MO-X4d.js → context-files-ui/assets/asterisk-BEn0Cwpx.js} +1 -1
  114. package/dist/apps/context-files-ui/assets/clike-D_6L3tnO.js +1 -0
  115. package/dist/apps/context-files-ui/assets/cmake-84nbDH0I.js +1 -0
  116. package/dist/apps/context-files-ui/assets/cobol-DHLQUbN7.js +1 -0
  117. package/dist/apps/context-files-ui/assets/coffeescript-De_zI4J0.js +1 -0
  118. package/dist/apps/context-files-ui/assets/commonlisp-DgAKBe0r.js +1 -0
  119. package/dist/apps/context-files-ui/assets/crystal-Bsdphhtm.js +1 -0
  120. package/dist/apps/context-files-ui/assets/css-CnaYoQib.js +1 -0
  121. package/dist/apps/context-files-ui/assets/{d-TPqSVaHM.js → d-DWkQyNnU.js} +1 -1
  122. package/dist/apps/{chat-ui/assets/dist-C6LPDFXU.js → context-files-ui/assets/dist-BAqbgxUS.js} +1 -1
  123. package/dist/apps/context-files-ui/assets/dist-BJ-TIk3N.js +1 -0
  124. package/dist/apps/context-files-ui/assets/dist-BcauuFwf.js +1 -0
  125. package/dist/apps/context-files-ui/assets/dist-BecMXs79.js +1 -0
  126. package/dist/apps/context-files-ui/assets/{dist-C-Jm45P4.js → dist-Ci2NSlf1.js} +1 -1
  127. package/dist/apps/context-files-ui/assets/dist-CqM4On9D.js +13 -0
  128. package/dist/apps/context-files-ui/assets/dist-CswnpKik.js +1 -0
  129. package/dist/apps/{chat-ui/assets/dist-I26VB0QO.js → context-files-ui/assets/dist-D-xpsbZI.js} +1 -1
  130. package/dist/apps/context-files-ui/assets/dist-DHvUPfrF.js +1 -0
  131. package/dist/apps/context-files-ui/assets/dist-DLJCGrGQ.js +1 -0
  132. package/dist/apps/context-files-ui/assets/{dist-DLMjd26T.js → dist-DMiglryg.js} +1 -1
  133. package/dist/apps/context-files-ui/assets/dist-DTeLDijr.js +9 -0
  134. package/dist/apps/context-files-ui/assets/{dist-DKoyMSNr.js → dist-DpF08Yd7.js} +1 -1
  135. package/dist/apps/context-files-ui/assets/dist-LCx98fA_.js +11 -0
  136. package/dist/apps/context-files-ui/assets/{dist-DotDq_kD.js → dist-RKTRnzGb.js} +1 -1
  137. package/dist/apps/context-files-ui/assets/dist-S3zJGntM.js +1 -0
  138. package/dist/apps/{chat-ui/assets/dist-BkUONE3N.js → context-files-ui/assets/dist-XVYGiB-c.js} +1 -1
  139. package/dist/apps/context-files-ui/assets/dist-eddbbGyw.js +1 -0
  140. package/dist/apps/context-files-ui/assets/dist-fPhZsAUX.js +1 -0
  141. package/dist/apps/context-files-ui/assets/dist-mpRGeo_R.js +2 -0
  142. package/dist/apps/context-files-ui/assets/{dockerfile-CJb2sekW.js → dockerfile-DJkHQgkl.js} +1 -1
  143. package/dist/apps/context-files-ui/assets/{dylan-08Azy1NK.js → dylan-BCDoL_-p.js} +1 -1
  144. package/dist/apps/context-files-ui/assets/{ecl-dhxjHL8y.js → ecl-BVIeWmwY.js} +1 -1
  145. package/dist/apps/{chat-ui/assets/erlang-BD5LkVkR.js → context-files-ui/assets/erlang-BV0c4Hdn.js} +1 -1
  146. package/dist/apps/context-files-ui/assets/{factor-B2EMQZkP.js → factor-LKH5gN8L.js} +1 -1
  147. package/dist/apps/context-files-ui/assets/groovy-CUpZ7dEl.js +1 -0
  148. package/dist/apps/context-files-ui/assets/{haxe-BJVKtprM.js → haxe-DjVOVvNP.js} +1 -1
  149. package/dist/apps/context-files-ui/assets/index-CkWXlBNn.js +191 -0
  150. package/dist/apps/context-files-ui/assets/{index-Cs4XQITe.css → index-D8TsUizd.css} +1 -1
  151. package/dist/apps/context-files-ui/assets/javascript-DoL9Wb-Q.js +1 -0
  152. package/dist/apps/context-files-ui/assets/{lua-BxuTHaF7.js → lua-CiA1ziua.js} +1 -1
  153. package/dist/apps/context-files-ui/assets/{mumps-Ds_ZaumL.js → mumps-BSzj6Xyz.js} +1 -1
  154. package/dist/apps/{chat-ui/assets/nsis-DOo3SJmd.js → context-files-ui/assets/nsis-CfSuhXs5.js} +1 -1
  155. package/dist/apps/context-files-ui/assets/{ntriples-DLHGTvHs.js → ntriples-B9h1VB_g.js} +1 -1
  156. package/dist/apps/context-files-ui/assets/perl-BkSkiI9m.js +1 -0
  157. package/dist/apps/context-files-ui/assets/{powershell-B4IPkVxR.js → powershell-BcIto6Sf.js} +1 -1
  158. package/dist/apps/{chat-ui/assets/pug-QU72BPAa.js → context-files-ui/assets/pug-Gsm0M45u.js} +1 -1
  159. package/dist/apps/context-files-ui/assets/puppet-BZyAS7I4.js +1 -0
  160. package/dist/apps/context-files-ui/assets/python-B_1Jd8HM.js +1 -0
  161. package/dist/apps/context-files-ui/assets/r-CxDmU1I4.js +1 -0
  162. package/dist/apps/context-files-ui/assets/ruby-BjXV7-Qa.js +1 -0
  163. package/dist/apps/context-files-ui/assets/scheme-D9qYN0V5.js +1 -0
  164. package/dist/apps/context-files-ui/assets/{shell-BjiMLAaM.js → shell-DwuoZtxw.js} +1 -1
  165. package/dist/apps/context-files-ui/assets/{simple-mode-DnMbQuKW.js → simple-mode-DXiLM1-G.js} +1 -1
  166. package/dist/apps/context-files-ui/assets/sql-DuQMFDvy.js +1 -0
  167. package/dist/apps/context-files-ui/assets/{stex-BCRT8IJ3.js → stex-DNzd62Q_.js} +1 -1
  168. package/dist/apps/context-files-ui/assets/{stylus-CARoeVE9.js → stylus-BOVgKnng.js} +1 -1
  169. package/dist/apps/context-files-ui/assets/textile-C4jVoHG1.js +1 -0
  170. package/dist/apps/context-files-ui/assets/tiki-AK6FwT8q.js +1 -0
  171. package/dist/apps/context-files-ui/assets/toml-BPTmHmyx.js +1 -0
  172. package/dist/apps/context-files-ui/assets/{ttcn-GvRgs2AT.js → ttcn-PPSTk1ow.js} +1 -1
  173. package/dist/apps/context-files-ui/assets/{ttcn-cfg-CGCXz7Vo.js → ttcn-cfg-2b4Gb5sE.js} +1 -1
  174. package/dist/apps/context-files-ui/assets/turtle-Cx3rYX2g.js +1 -0
  175. package/dist/apps/context-files-ui/assets/{verilog-DVCHmufx.js → verilog-7LoJAqYT.js} +1 -1
  176. package/dist/apps/context-files-ui/assets/vhdl-kS471soi.js +1 -0
  177. package/dist/apps/{chat-ui/assets/xquery-5f0hn7cg.js → context-files-ui/assets/xquery-BKJx4mf9.js} +1 -1
  178. package/dist/apps/context-files-ui/assets/z80-Co3PbHdE.js +1 -0
  179. package/dist/apps/context-files-ui/index.html +5 -3
  180. package/dist/apps/vscode-artifacts/latest.vsix +0 -0
  181. package/dist/apps/vscode-artifacts/pibo-vscode-ext-2.2.0.vsix +0 -0
  182. package/dist/auth/better-auth.js +223 -30
  183. package/dist/auth/cli.js +10 -1
  184. package/dist/auth/machine-keys.js +8 -4
  185. package/dist/auth/openai-codex-usage.js +4 -4
  186. package/dist/cli-session/fakeSessionSource.js +2 -2
  187. package/dist/cli-session/localSessionSource.js +2 -2
  188. package/dist/cli.js +3 -1
  189. package/dist/config/config.js +9 -4
  190. package/dist/core/compaction-prompt.js +3 -1
  191. package/dist/core/context-build.js +1 -0
  192. package/dist/core/pibo-home.js +24 -1
  193. package/dist/core/private-path.js +146 -0
  194. package/dist/core/profiles.js +8 -0
  195. package/dist/core/sensitive-data-redaction.js +36 -0
  196. package/dist/core/session-model.js +1 -0
  197. package/dist/core/session-router.js +219 -29
  198. package/dist/data/pibo-store.js +5 -1
  199. package/dist/gateway/server.js +9 -0
  200. package/dist/index.js +1 -1
  201. package/dist/plugins/builtin.js +4 -2
  202. package/dist/plugins/context-files.js +11 -0
  203. package/dist/plugins/omp.js +57 -0
  204. package/dist/plugins/registry.js +1 -0
  205. package/dist/providers/openai-gpt56.js +0 -11
  206. package/dist/reliability/store.js +5 -1
  207. package/dist/resources/lifecycle.js +13 -3
  208. package/dist/runs/resource-isolation.js +159 -8
  209. package/dist/runs/tools.js +44 -1
  210. package/dist/sessions/pibo-data-store.js +3 -0
  211. package/dist/tools/codex-browser-node-repl.js +4 -2
  212. package/dist/tools/codex-browser.js +1 -1
  213. package/dist/tools/codex-image-generation.js +4 -4
  214. package/dist/tools/runtime/node-backend.js +4 -1
  215. package/dist/tools/runtime/python-backend.js +4 -1
  216. package/dist/web-annotations/api.js +22 -2
  217. package/npm-shrinkwrap.json +16707 -0
  218. package/package.json +19 -14
  219. package/dist/apps/chat-ui/assets/asciiarmor-WLvjqI7d.js +0 -1
  220. package/dist/apps/chat-ui/assets/clike-CjmcUpt6.js +0 -1
  221. package/dist/apps/chat-ui/assets/cmake-i2VDNaRq.js +0 -1
  222. package/dist/apps/chat-ui/assets/cobol-BwO6DF08.js +0 -1
  223. package/dist/apps/chat-ui/assets/coffeescript-BtivDvRz.js +0 -1
  224. package/dist/apps/chat-ui/assets/commonlisp-DFkEQdLP.js +0 -1
  225. package/dist/apps/chat-ui/assets/crystal-CU0NkcVL.js +0 -1
  226. package/dist/apps/chat-ui/assets/css-CbMZAQ1W.js +0 -1
  227. package/dist/apps/chat-ui/assets/dist-9v2ZXT6V.js +0 -11
  228. package/dist/apps/chat-ui/assets/dist-B1LVAytl.js +0 -9
  229. package/dist/apps/chat-ui/assets/dist-B5PTVnox.js +0 -1
  230. package/dist/apps/chat-ui/assets/dist-B5ZAfwf5.js +0 -1
  231. package/dist/apps/chat-ui/assets/dist-D1KyNDg5.js +0 -13
  232. package/dist/apps/chat-ui/assets/dist-DVtXxfHc.js +0 -1
  233. package/dist/apps/chat-ui/assets/dist-DW4Qrfbd.js +0 -2
  234. package/dist/apps/chat-ui/assets/dist-DmbsHdMC.js +0 -1
  235. package/dist/apps/chat-ui/assets/dist-DyvwuSFO.js +0 -1
  236. package/dist/apps/chat-ui/assets/dist-QQuDy4KA.js +0 -1
  237. package/dist/apps/chat-ui/assets/dist-RtHbJRPV.js +0 -1
  238. package/dist/apps/chat-ui/assets/groovy-Cmduloe1.js +0 -1
  239. package/dist/apps/chat-ui/assets/index-BPbNvcZe.css +0 -1
  240. package/dist/apps/chat-ui/assets/index-CIOf2uL2.js +0 -237
  241. package/dist/apps/chat-ui/assets/javascript-C5pDVaoP.js +0 -1
  242. package/dist/apps/chat-ui/assets/perl-D6YJObi_.js +0 -1
  243. package/dist/apps/chat-ui/assets/puppet-B_0GFuyD.js +0 -1
  244. package/dist/apps/chat-ui/assets/python-Cs7sNzy_.js +0 -1
  245. package/dist/apps/chat-ui/assets/r-CN5s4f3o.js +0 -1
  246. package/dist/apps/chat-ui/assets/ruby-BVPradRk.js +0 -1
  247. package/dist/apps/chat-ui/assets/scheme-CvNgHAnh.js +0 -1
  248. package/dist/apps/chat-ui/assets/sql-DYI2GwJR.js +0 -1
  249. package/dist/apps/chat-ui/assets/textile-Yg_UWn-t.js +0 -1
  250. package/dist/apps/chat-ui/assets/tiki-CC_ic8g0.js +0 -1
  251. package/dist/apps/chat-ui/assets/toml-B7gGzVkJ.js +0 -1
  252. package/dist/apps/chat-ui/assets/turtle-CwIpz2yy.js +0 -1
  253. package/dist/apps/chat-ui/assets/vhdl-BGDk4f1d.js +0 -1
  254. package/dist/apps/chat-ui/assets/z80-B7Dfb4UO.js +0 -1
  255. package/dist/apps/chat-vscode-web/assets/index-1ivRyjFs.js +0 -41
  256. package/dist/apps/chat-vscode-web/assets/index-Dupu1DzQ.css +0 -2
  257. package/dist/apps/context-files-ui/assets/asciiarmor-WLvjqI7d.js +0 -1
  258. package/dist/apps/context-files-ui/assets/clike-CjmcUpt6.js +0 -1
  259. package/dist/apps/context-files-ui/assets/cmake-i2VDNaRq.js +0 -1
  260. package/dist/apps/context-files-ui/assets/cobol-BwO6DF08.js +0 -1
  261. package/dist/apps/context-files-ui/assets/coffeescript-BtivDvRz.js +0 -1
  262. package/dist/apps/context-files-ui/assets/commonlisp-DFkEQdLP.js +0 -1
  263. package/dist/apps/context-files-ui/assets/crystal-CU0NkcVL.js +0 -1
  264. package/dist/apps/context-files-ui/assets/css-CbMZAQ1W.js +0 -1
  265. package/dist/apps/context-files-ui/assets/dist-B5PTVnox.js +0 -1
  266. package/dist/apps/context-files-ui/assets/dist-B5ZAfwf5.js +0 -1
  267. package/dist/apps/context-files-ui/assets/dist-BD262Ouw.js +0 -1
  268. package/dist/apps/context-files-ui/assets/dist-BKuGdcnX.js +0 -9
  269. package/dist/apps/context-files-ui/assets/dist-CHdx1Jri.js +0 -1
  270. package/dist/apps/context-files-ui/assets/dist-CULMH-fB.js +0 -11
  271. package/dist/apps/context-files-ui/assets/dist-Cjq6RWEt.js +0 -1
  272. package/dist/apps/context-files-ui/assets/dist-CntqFySz.js +0 -1
  273. package/dist/apps/context-files-ui/assets/dist-D1KyNDg5.js +0 -13
  274. package/dist/apps/context-files-ui/assets/dist-QQuDy4KA.js +0 -1
  275. package/dist/apps/context-files-ui/assets/dist-kPuQud7t.js +0 -2
  276. package/dist/apps/context-files-ui/assets/groovy-Cmduloe1.js +0 -1
  277. package/dist/apps/context-files-ui/assets/index-DZWsbuvg.js +0 -202
  278. package/dist/apps/context-files-ui/assets/javascript-C5pDVaoP.js +0 -1
  279. package/dist/apps/context-files-ui/assets/perl-D6YJObi_.js +0 -1
  280. package/dist/apps/context-files-ui/assets/puppet-B_0GFuyD.js +0 -1
  281. package/dist/apps/context-files-ui/assets/python-Cs7sNzy_.js +0 -1
  282. package/dist/apps/context-files-ui/assets/r-CN5s4f3o.js +0 -1
  283. package/dist/apps/context-files-ui/assets/ruby-BVPradRk.js +0 -1
  284. package/dist/apps/context-files-ui/assets/scheme-CvNgHAnh.js +0 -1
  285. package/dist/apps/context-files-ui/assets/sql-DYI2GwJR.js +0 -1
  286. package/dist/apps/context-files-ui/assets/textile-Yg_UWn-t.js +0 -1
  287. package/dist/apps/context-files-ui/assets/tiki-CC_ic8g0.js +0 -1
  288. package/dist/apps/context-files-ui/assets/toml-B7gGzVkJ.js +0 -1
  289. package/dist/apps/context-files-ui/assets/turtle-CwIpz2yy.js +0 -1
  290. package/dist/apps/context-files-ui/assets/vhdl-BGDk4f1d.js +0 -1
  291. package/dist/apps/context-files-ui/assets/z80-B7Dfb4UO.js +0 -1
  292. package/dist/apps/vscode-artifacts/pibo-vscode-ext-2.0.0.vsix +0 -0
  293. /package/dist/apps/chat-ui/assets/{brainfuck-CV9kufud.js → brainfuck-D5EjA2JK.js} +0 -0
  294. /package/dist/apps/chat-ui/assets/{clojure-De3QGfx6.js → clojure-BflJGmDX.js} +0 -0
  295. /package/dist/apps/chat-ui/assets/{cypher-Dke5QOzv.js → cypher-p9eYesGn.js} +0 -0
  296. /package/dist/apps/chat-ui/assets/{diff-B365LSoZ.js → diff-ChtP43wD.js} +0 -0
  297. /package/dist/apps/chat-ui/assets/{dtd-CBMymJ7O.js → dtd-DTF72YNO.js} +0 -0
  298. /package/dist/apps/chat-ui/assets/{ebnf-Dkum_1J8.js → ebnf-D4c0_ac3.js} +0 -0
  299. /package/dist/apps/chat-ui/assets/{eiffel-C446m6dI.js → eiffel-BEjRio4Q.js} +0 -0
  300. /package/dist/apps/chat-ui/assets/{elm-po1E9de0.js → elm-Cshzl8qu.js} +0 -0
  301. /package/dist/apps/chat-ui/assets/{fcl-DkEOamHd.js → fcl-ClOhbFR7.js} +0 -0
  302. /package/dist/apps/chat-ui/assets/{forth-dCg2_HVB.js → forth-Cezjo90N.js} +0 -0
  303. /package/dist/apps/chat-ui/assets/{fortran-3ZpXLFh1.js → fortran-Bt6PBEDR.js} +0 -0
  304. /package/dist/apps/chat-ui/assets/{gas-DMmxLZRI.js → gas-BHEdbvp9.js} +0 -0
  305. /package/dist/apps/chat-ui/assets/{gherkin-DUSFg2R6.js → gherkin-oBAE_ms0.js} +0 -0
  306. /package/dist/apps/chat-ui/assets/{haskell-Cyr255R9.js → haskell-BRsoo5mP.js} +0 -0
  307. /package/dist/apps/chat-ui/assets/{http-DszHFpc-.js → http-CLVgA2GD.js} +0 -0
  308. /package/dist/apps/chat-ui/assets/{idl-Cati9Nrv.js → idl-BUZw3wgd.js} +0 -0
  309. /package/dist/apps/chat-ui/assets/{julia-DlqY1cTU.js → julia-CQfgDRfP.js} +0 -0
  310. /package/dist/apps/chat-ui/assets/{livescript-C6p8-2W1.js → livescript-BXxG0Yva.js} +0 -0
  311. /package/dist/apps/chat-ui/assets/{mathematica-nDHZUMJT.js → mathematica-u8YMmbU0.js} +0 -0
  312. /package/dist/apps/chat-ui/assets/{mbox-DAaR0Hcz.js → mbox-BEMVcqjs.js} +0 -0
  313. /package/dist/apps/chat-ui/assets/{mirc-CCA0FRfl.js → mirc-C9zpzAZU.js} +0 -0
  314. /package/dist/apps/chat-ui/assets/{mllike-Cw3Iccsb.js → mllike-B45xgp2S.js} +0 -0
  315. /package/dist/apps/chat-ui/assets/{modelica-Czx80fNR.js → modelica-CqHI_q-D.js} +0 -0
  316. /package/dist/apps/chat-ui/assets/{mscgen-BmfuTbzG.js → mscgen-qgSLujhx.js} +0 -0
  317. /package/dist/apps/chat-ui/assets/{nginx-D9M2PQ4U.js → nginx-BMaDbqW3.js} +0 -0
  318. /package/dist/apps/chat-ui/assets/{octave-8jj96JiC.js → octave-D2Q8cUp1.js} +0 -0
  319. /package/dist/apps/chat-ui/assets/{oz-BmMq7iC4.js → oz-BwTct_5T.js} +0 -0
  320. /package/dist/apps/chat-ui/assets/{pascal-BgMr6XpT.js → pascal-Dp_KdFgX.js} +0 -0
  321. /package/dist/apps/chat-ui/assets/{pig-nx7uchs8.js → pig-AF4Hwhju.js} +0 -0
  322. /package/dist/apps/chat-ui/assets/{properties-CoavQdLC.js → properties-C357ku5U.js} +0 -0
  323. /package/dist/apps/chat-ui/assets/{protobuf-D5EWhcmc.js → protobuf-D1ij_kNL.js} +0 -0
  324. /package/dist/apps/chat-ui/assets/{q-BIB9pPtI.js → q-B9NhS7L_.js} +0 -0
  325. /package/dist/apps/chat-ui/assets/{rpm-Ct_Ck8mQ.js → rpm-gpDK5sbt.js} +0 -0
  326. /package/dist/apps/chat-ui/assets/{sas-DN4j74IF.js → sas-C2OyD2Y6.js} +0 -0
  327. /package/dist/apps/chat-ui/assets/{sieve-C2U1O5Z4.js → sieve-BAxa3IjF.js} +0 -0
  328. /package/dist/apps/chat-ui/assets/{smalltalk-DkYwYufV.js → smalltalk-BLp5-jwC.js} +0 -0
  329. /package/dist/apps/chat-ui/assets/{solr-BopnSD-v.js → solr-BBopId9w.js} +0 -0
  330. /package/dist/apps/chat-ui/assets/{sparql-Cpg3YQfd.js → sparql-Dz-mlCAC.js} +0 -0
  331. /package/dist/apps/chat-ui/assets/{spreadsheet-kRxtVt9J.js → spreadsheet-CTIncYxj.js} +0 -0
  332. /package/dist/apps/chat-ui/assets/{swift-DKNaLAK6.js → swift-DKB6_1j6.js} +0 -0
  333. /package/dist/apps/chat-ui/assets/{tcl-CQyXkgMH.js → tcl-BGfruO1u.js} +0 -0
  334. /package/dist/apps/chat-ui/assets/{tiddlywiki-dqVbkfX4.js → tiddlywiki-VlUiK86J.js} +0 -0
  335. /package/dist/apps/chat-ui/assets/{troff-Bq3z6oAu.js → troff-C2dAgh7P.js} +0 -0
  336. /package/dist/apps/chat-ui/assets/{vb-BmcHUM2C.js → vb-BthdM_4N.js} +0 -0
  337. /package/dist/apps/chat-ui/assets/{vbscript-Cs9dylre.js → vbscript-D9f6rSsU.js} +0 -0
  338. /package/dist/apps/chat-ui/assets/{velocity-CBWU0VCy.js → velocity-CqftRsjg.js} +0 -0
  339. /package/dist/apps/chat-ui/assets/{webidl-egXQEWlC.js → webidl-D5jiJvOU.js} +0 -0
  340. /package/dist/apps/chat-ui/assets/{yacas-DNs9XkmQ.js → yacas-CXXgtw0p.js} +0 -0
  341. /package/dist/apps/context-files-ui/assets/{brainfuck-CV9kufud.js → brainfuck-D5EjA2JK.js} +0 -0
  342. /package/dist/apps/context-files-ui/assets/{clojure-De3QGfx6.js → clojure-BflJGmDX.js} +0 -0
  343. /package/dist/apps/context-files-ui/assets/{cypher-Dke5QOzv.js → cypher-p9eYesGn.js} +0 -0
  344. /package/dist/apps/context-files-ui/assets/{diff-B365LSoZ.js → diff-ChtP43wD.js} +0 -0
  345. /package/dist/apps/context-files-ui/assets/{dtd-CBMymJ7O.js → dtd-DTF72YNO.js} +0 -0
  346. /package/dist/apps/context-files-ui/assets/{ebnf-Dkum_1J8.js → ebnf-D4c0_ac3.js} +0 -0
  347. /package/dist/apps/context-files-ui/assets/{eiffel-C446m6dI.js → eiffel-BEjRio4Q.js} +0 -0
  348. /package/dist/apps/context-files-ui/assets/{elm-po1E9de0.js → elm-Cshzl8qu.js} +0 -0
  349. /package/dist/apps/context-files-ui/assets/{fcl-DkEOamHd.js → fcl-ClOhbFR7.js} +0 -0
  350. /package/dist/apps/context-files-ui/assets/{forth-dCg2_HVB.js → forth-Cezjo90N.js} +0 -0
  351. /package/dist/apps/context-files-ui/assets/{fortran-3ZpXLFh1.js → fortran-Bt6PBEDR.js} +0 -0
  352. /package/dist/apps/context-files-ui/assets/{gas-DMmxLZRI.js → gas-BHEdbvp9.js} +0 -0
  353. /package/dist/apps/context-files-ui/assets/{gherkin-DUSFg2R6.js → gherkin-oBAE_ms0.js} +0 -0
  354. /package/dist/apps/context-files-ui/assets/{haskell-Cyr255R9.js → haskell-BRsoo5mP.js} +0 -0
  355. /package/dist/apps/context-files-ui/assets/{http-DszHFpc-.js → http-CLVgA2GD.js} +0 -0
  356. /package/dist/apps/context-files-ui/assets/{idl-Cati9Nrv.js → idl-BUZw3wgd.js} +0 -0
  357. /package/dist/apps/context-files-ui/assets/{julia-DlqY1cTU.js → julia-CQfgDRfP.js} +0 -0
  358. /package/dist/apps/context-files-ui/assets/{livescript-C6p8-2W1.js → livescript-BXxG0Yva.js} +0 -0
  359. /package/dist/apps/context-files-ui/assets/{mathematica-nDHZUMJT.js → mathematica-u8YMmbU0.js} +0 -0
  360. /package/dist/apps/context-files-ui/assets/{mbox-DAaR0Hcz.js → mbox-BEMVcqjs.js} +0 -0
  361. /package/dist/apps/context-files-ui/assets/{mirc-CCA0FRfl.js → mirc-C9zpzAZU.js} +0 -0
  362. /package/dist/apps/context-files-ui/assets/{mllike-Cw3Iccsb.js → mllike-B45xgp2S.js} +0 -0
  363. /package/dist/apps/context-files-ui/assets/{modelica-Czx80fNR.js → modelica-CqHI_q-D.js} +0 -0
  364. /package/dist/apps/context-files-ui/assets/{mscgen-BmfuTbzG.js → mscgen-qgSLujhx.js} +0 -0
  365. /package/dist/apps/context-files-ui/assets/{nginx-D9M2PQ4U.js → nginx-BMaDbqW3.js} +0 -0
  366. /package/dist/apps/context-files-ui/assets/{octave-8jj96JiC.js → octave-D2Q8cUp1.js} +0 -0
  367. /package/dist/apps/context-files-ui/assets/{oz-BmMq7iC4.js → oz-BwTct_5T.js} +0 -0
  368. /package/dist/apps/context-files-ui/assets/{pascal-BgMr6XpT.js → pascal-Dp_KdFgX.js} +0 -0
  369. /package/dist/apps/context-files-ui/assets/{pig-nx7uchs8.js → pig-AF4Hwhju.js} +0 -0
  370. /package/dist/apps/context-files-ui/assets/{properties-CoavQdLC.js → properties-C357ku5U.js} +0 -0
  371. /package/dist/apps/context-files-ui/assets/{protobuf-D5EWhcmc.js → protobuf-D1ij_kNL.js} +0 -0
  372. /package/dist/apps/context-files-ui/assets/{q-BIB9pPtI.js → q-B9NhS7L_.js} +0 -0
  373. /package/dist/apps/context-files-ui/assets/{rpm-Ct_Ck8mQ.js → rpm-gpDK5sbt.js} +0 -0
  374. /package/dist/apps/context-files-ui/assets/{sas-DN4j74IF.js → sas-C2OyD2Y6.js} +0 -0
  375. /package/dist/apps/context-files-ui/assets/{sieve-C2U1O5Z4.js → sieve-BAxa3IjF.js} +0 -0
  376. /package/dist/apps/context-files-ui/assets/{smalltalk-DkYwYufV.js → smalltalk-BLp5-jwC.js} +0 -0
  377. /package/dist/apps/context-files-ui/assets/{solr-BopnSD-v.js → solr-BBopId9w.js} +0 -0
  378. /package/dist/apps/context-files-ui/assets/{sparql-Cpg3YQfd.js → sparql-Dz-mlCAC.js} +0 -0
  379. /package/dist/apps/context-files-ui/assets/{spreadsheet-kRxtVt9J.js → spreadsheet-CTIncYxj.js} +0 -0
  380. /package/dist/apps/context-files-ui/assets/{swift-DKNaLAK6.js → swift-DKB6_1j6.js} +0 -0
  381. /package/dist/apps/context-files-ui/assets/{tcl-CQyXkgMH.js → tcl-BGfruO1u.js} +0 -0
  382. /package/dist/apps/context-files-ui/assets/{tiddlywiki-dqVbkfX4.js → tiddlywiki-VlUiK86J.js} +0 -0
  383. /package/dist/apps/context-files-ui/assets/{troff-Bq3z6oAu.js → troff-C2dAgh7P.js} +0 -0
  384. /package/dist/apps/context-files-ui/assets/{vb-BmcHUM2C.js → vb-BthdM_4N.js} +0 -0
  385. /package/dist/apps/context-files-ui/assets/{vbscript-Cs9dylre.js → vbscript-D9f6rSsU.js} +0 -0
  386. /package/dist/apps/context-files-ui/assets/{velocity-CBWU0VCy.js → velocity-CqftRsjg.js} +0 -0
  387. /package/dist/apps/context-files-ui/assets/{webidl-egXQEWlC.js → webidl-D5jiJvOU.js} +0 -0
  388. /package/dist/apps/context-files-ui/assets/{yacas-DNs9XkmQ.js → yacas-CXXgtw0p.js} +0 -0
@@ -0,0 +1,188 @@
1
+ import { piboHomePath } from "../../core/pibo-home.js";
2
+ const MAX_TIMEOUT_MS = 10 * 60 * 1_000;
3
+ const MAX_AUTH_LOGIN_TIMEOUT_MS = 30 * 60 * 1_000;
4
+ const ENVIRONMENT_KEY_PATTERN = /^[A-Za-z_][A-Za-z0-9_]*$/;
5
+ const RESERVED_ENVIRONMENT_KEYS = new Set([
6
+ "PI_CODING_AGENT_DIR",
7
+ "PI_CONFIG_DIR",
8
+ "OMP_PROFILE",
9
+ "PI_PROFILE",
10
+ "HOME",
11
+ "USERPROFILE",
12
+ "XDG_CACHE_HOME",
13
+ "XDG_CONFIG_HOME",
14
+ "XDG_DATA_HOME",
15
+ "XDG_STATE_HOME",
16
+ "TMP",
17
+ "TEMP",
18
+ "TMPDIR",
19
+ "NODE_OPTIONS",
20
+ "LD_PRELOAD",
21
+ "BASH_ENV",
22
+ "ENV",
23
+ "PYTHONHOME",
24
+ "PYTHONPATH",
25
+ "RUBYOPT",
26
+ "PERL5OPT",
27
+ "JAVA_TOOL_OPTIONS",
28
+ "_JAVA_OPTIONS",
29
+ ]);
30
+ export const DEFAULT_OMP_ENVIRONMENT_ALLOWLIST = [
31
+ "PATH",
32
+ "PATHEXT",
33
+ "SystemRoot",
34
+ "WINDIR",
35
+ "COMSPEC",
36
+ "LANG",
37
+ "LC_ALL",
38
+ "LC_CTYPE",
39
+ "TZ",
40
+ "HTTP_PROXY",
41
+ "HTTPS_PROXY",
42
+ "NO_PROXY",
43
+ "ALL_PROXY",
44
+ "SSL_CERT_FILE",
45
+ "SSL_CERT_DIR",
46
+ ];
47
+ /**
48
+ * Pibo does not know the real key names OMP's model catalog reads (it supports
49
+ * many providers and custom `models.yml` baseUrl/apiKey pairs). We allow an
50
+ * operator to add the specific provider keys (e.g. `OPENAI_API_KEY`,
51
+ * `ANTHROPIC_API_KEY`, `GEMINI_API_KEY`, `DEEPSEEK_API_KEY`) plus any custom
52
+ * keys via the config `apiKeyEnv` allowlist. These names are validated at parse
53
+ * time so a typo fails fast.
54
+ */
55
+ export const DEFAULT_OMP_API_KEY_ENVIRONMENT_KEYS = [
56
+ "OPENAI_API_KEY",
57
+ "ANTHROPIC_API_KEY",
58
+ "GEMINI_API_KEY",
59
+ "DEEPSEEK_API_KEY",
60
+ "OPENROUTER_API_KEY",
61
+ "GROQ_API_KEY",
62
+ "MISTRAL_API_KEY",
63
+ "COHERE_API_KEY",
64
+ "PERPLEXITY_API_KEY",
65
+ "XAI_API_KEY",
66
+ "OMP_DEFAULT_API_KEY",
67
+ ];
68
+ export const OMP_RUNTIME_CONFIG_SCHEMA = {
69
+ type: "object",
70
+ additionalProperties: false,
71
+ properties: {
72
+ bunExecutable: { type: "string", minLength: 1, default: "bun" },
73
+ ompEntry: { type: "string", minLength: 1 },
74
+ homeRoot: { type: "string", minLength: 1 },
75
+ environmentAllowlist: {
76
+ type: "array",
77
+ items: { type: "string", pattern: ENVIRONMENT_KEY_PATTERN.source },
78
+ uniqueItems: true,
79
+ },
80
+ apiKeyEnvironment: {
81
+ type: "array",
82
+ items: { type: "string", pattern: ENVIRONMENT_KEY_PATTERN.source },
83
+ uniqueItems: true,
84
+ },
85
+ defaultProvider: { type: "string", minLength: 1 },
86
+ defaultModel: { type: "string", minLength: 1 },
87
+ diagnosticTimeoutMs: { type: "integer", minimum: 1, maximum: MAX_TIMEOUT_MS, default: 5_000 },
88
+ startupTimeoutMs: { type: "integer", minimum: 1, maximum: MAX_TIMEOUT_MS, default: 15_000 },
89
+ requestTimeoutMs: { type: "integer", minimum: 1, maximum: MAX_TIMEOUT_MS, default: 180_000 },
90
+ authLoginTimeoutMs: { type: "integer", minimum: 1, maximum: MAX_AUTH_LOGIN_TIMEOUT_MS, default: 15 * 60 * 1_000 },
91
+ shutdownTimeoutMs: { type: "integer", minimum: 1, maximum: MAX_TIMEOUT_MS, default: 2_000 },
92
+ killTimeoutMs: { type: "integer", minimum: 1, maximum: MAX_TIMEOUT_MS, default: 500 },
93
+ },
94
+ };
95
+ export function defaultOmpRuntimeConfig() {
96
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
97
+ const cfg = {};
98
+ return {
99
+ bunExecutable: "bun",
100
+ ompEntry: "", // operator must supply the OMP install path
101
+ homeRoot: piboHomePath("agent-runtimes", "omp"),
102
+ environmentAllowlist: [...DEFAULT_OMP_ENVIRONMENT_ALLOWLIST],
103
+ apiKeyEnvironment: [...DEFAULT_OMP_API_KEY_ENVIRONMENT_KEYS],
104
+ diagnosticTimeoutMs: 5_000,
105
+ startupTimeoutMs: 15_000,
106
+ requestTimeoutMs: 180_000,
107
+ authLoginTimeoutMs: 15 * 60 * 1_000,
108
+ shutdownTimeoutMs: 2_000,
109
+ killTimeoutMs: 500,
110
+ };
111
+ }
112
+ function timeout(value, fallback, label, maximum = MAX_TIMEOUT_MS) {
113
+ const selected = value ?? fallback;
114
+ if (!Number.isSafeInteger(selected) || Number(selected) <= 0 || Number(selected) > maximum) {
115
+ throw new Error(`${label} must be a positive integer no greater than ${maximum}`);
116
+ }
117
+ return Number(selected);
118
+ }
119
+ function stringAllowlist(value, fallback, label, reject) {
120
+ const selected = value ?? fallback;
121
+ if (!Array.isArray(selected))
122
+ throw new Error(`${label} must be an array of environment variable names`);
123
+ const result = [];
124
+ const seen = new Set();
125
+ for (const entry of selected) {
126
+ if (typeof entry !== "string" || !ENVIRONMENT_KEY_PATTERN.test(entry)) {
127
+ throw new Error(`${label} entries must be valid environment variable names`);
128
+ }
129
+ const canonical = entry.toUpperCase();
130
+ if (reject?.has(canonical) || canonical.startsWith("DYLD_")) {
131
+ throw new Error(`${label} may not include reserved key "${entry}"`);
132
+ }
133
+ if (seen.has(canonical))
134
+ throw new Error(`${label} contains duplicate key "${entry}"`);
135
+ seen.add(canonical);
136
+ result.push(entry);
137
+ }
138
+ return result;
139
+ }
140
+ function nonEmptyString(value, fallback, label) {
141
+ const selected = value ?? fallback;
142
+ if (typeof selected !== "string" || selected.trim().length === 0) {
143
+ throw new Error(`${label} must be a non-empty string`);
144
+ }
145
+ return selected.trim();
146
+ }
147
+ /**
148
+ * Resolve the OMP CLI entry. An empty value means "not yet configured" (the
149
+ * operator supplies it via runtime-instance config); diagnose() surfaces that.
150
+ * A non-empty value MUST be an absolute path — resolving it against the session
151
+ * workspace would silently target the wrong executable.
152
+ */
153
+ function absolutePathOrEmpty(value, label) {
154
+ if (typeof value !== "string" || value.trim().length === 0) {
155
+ return "";
156
+ }
157
+ const candidate = value.trim();
158
+ if (!(candidate.startsWith("/") || /^[a-zA-Z]:[\\/]/.test(candidate))) {
159
+ throw new Error(label + " must be an absolute path to the OMP CLI entry; got \"" + candidate + "\"");
160
+ }
161
+ return candidate;
162
+ }
163
+ export function parseOmpRuntimeConfig(value) {
164
+ const record = value ?? {};
165
+ const provider = optionalString(record.defaultProvider);
166
+ const model = optionalString(record.defaultModel);
167
+ const config = {
168
+ bunExecutable: nonEmptyString(record.bunExecutable, "bun", "bunExecutable"),
169
+ ompEntry: absolutePathOrEmpty(record.ompEntry, "ompEntry"),
170
+ homeRoot: nonEmptyString(record.homeRoot, piboHomePath("agent-runtimes", "omp"), "homeRoot"),
171
+ environmentAllowlist: stringAllowlist(record.environmentAllowlist, DEFAULT_OMP_ENVIRONMENT_ALLOWLIST, "environmentAllowlist", RESERVED_ENVIRONMENT_KEYS),
172
+ apiKeyEnvironment: stringAllowlist(record.apiKeyEnvironment, DEFAULT_OMP_API_KEY_ENVIRONMENT_KEYS, "apiKeyEnvironment", RESERVED_ENVIRONMENT_KEYS),
173
+ diagnosticTimeoutMs: timeout(record.diagnosticTimeoutMs, 5_000, "diagnosticTimeoutMs"),
174
+ startupTimeoutMs: timeout(record.startupTimeoutMs, 15_000, "startupTimeoutMs"),
175
+ requestTimeoutMs: timeout(record.requestTimeoutMs, 180_000, "requestTimeoutMs"),
176
+ authLoginTimeoutMs: timeout(record.authLoginTimeoutMs, 15 * 60 * 1_000, "authLoginTimeoutMs", MAX_AUTH_LOGIN_TIMEOUT_MS),
177
+ shutdownTimeoutMs: timeout(record.shutdownTimeoutMs, 2_000, "shutdownTimeoutMs"),
178
+ killTimeoutMs: timeout(record.killTimeoutMs, 500, "killTimeoutMs"),
179
+ };
180
+ if (provider !== undefined)
181
+ config.defaultProvider = provider;
182
+ if (model !== undefined)
183
+ config.defaultModel = model;
184
+ return config;
185
+ }
186
+ function optionalString(value) {
187
+ return typeof value === "string" && value.trim().length > 0 ? value.trim() : undefined;
188
+ }
@@ -0,0 +1,108 @@
1
+ import { OMP_ADAPTER_ID } from "./thread.js";
2
+ import { OMP_ADAPTER_VERSION } from "./thread.js";
3
+ function isRecord(value) {
4
+ return Boolean(value) && typeof value === "object" && !Array.isArray(value);
5
+ }
6
+ export function inspectOmpHistory(input, runtimeInstanceId) {
7
+ const binding = input.binding;
8
+ return {
9
+ runtimeInstanceId,
10
+ adapterId: OMP_ADAPTER_ID,
11
+ bindingState: binding.state,
12
+ available: binding.state === "bound" && Boolean(binding.nativeSessionId),
13
+ ...(binding.locator ? { locator: binding.locator } : {}),
14
+ version: OMP_ADAPTER_VERSION,
15
+ diagnostics: [],
16
+ };
17
+ }
18
+ function messageEntryRole(message) {
19
+ if (isRecord(message)) {
20
+ if (typeof message.role === "string") {
21
+ const role = message.role;
22
+ if (role === "user" || role === "assistant" || role === "tool" || role === "system")
23
+ return role;
24
+ }
25
+ }
26
+ return "system";
27
+ }
28
+ function messageText(message) {
29
+ if (typeof message === "string")
30
+ return message;
31
+ if (!isRecord(message))
32
+ return "";
33
+ if (typeof message.text === "string")
34
+ return message.text;
35
+ if (typeof message.content === "string")
36
+ return message.content;
37
+ if (Array.isArray(message.content)) {
38
+ const parts = [];
39
+ for (const part of message.content) {
40
+ if (isRecord(part) && typeof part.text === "string")
41
+ parts.push(part.text);
42
+ }
43
+ return parts.join("\n");
44
+ }
45
+ return "";
46
+ }
47
+ function toHistoryEntry(message, sequence, binding) {
48
+ const role = messageEntryRole(message);
49
+ const content = messageText(message);
50
+ return {
51
+ id: `${binding.nativeSessionId ?? "omp"}-${sequence}`,
52
+ type: "message",
53
+ source: "native",
54
+ createdAt: isRecord(message) && typeof message.timestamp === "string"
55
+ ? message.timestamp
56
+ : new Date().toISOString(),
57
+ sequence,
58
+ role,
59
+ content: content || "[empty message]",
60
+ };
61
+ }
62
+ export async function readOmpHistory(client, input, runtimeInstanceId, binding) {
63
+ try {
64
+ const result = await client.request({
65
+ type: "get_messages_page",
66
+ ...(input.cursor ? { cursor: input.cursor } : {}),
67
+ ...(input.limit ? { limit: input.limit } : {}),
68
+ }, "get_messages_page");
69
+ const data = result["data"];
70
+ if (!isRecord(data) || !Array.isArray(data.messages)) {
71
+ return emptyPage(runtimeInstanceId);
72
+ }
73
+ const entries = [];
74
+ let sequence = 0;
75
+ for (const message of data.messages) {
76
+ entries.push(toHistoryEntry(message, sequence++, binding));
77
+ }
78
+ return {
79
+ runtimeInstanceId,
80
+ adapterId: OMP_ADAPTER_ID,
81
+ source: "native",
82
+ entries,
83
+ ...(typeof data.nextCursor === "string" ? { nextCursor: data.nextCursor } : {}),
84
+ hasMore: typeof data.nextCursor === "string" && data.nextCursor.length > 0,
85
+ };
86
+ }
87
+ catch {
88
+ return emptyPage(runtimeInstanceId);
89
+ }
90
+ }
91
+ function emptyPage(runtimeInstanceId) {
92
+ return {
93
+ runtimeInstanceId,
94
+ adapterId: OMP_ADAPTER_ID,
95
+ source: "native",
96
+ entries: [],
97
+ hasMore: false,
98
+ };
99
+ }
100
+ export function emptyOmpHistoryPage(runtimeInstanceId) {
101
+ return {
102
+ runtimeInstanceId,
103
+ adapterId: OMP_ADAPTER_ID,
104
+ source: "native",
105
+ entries: [],
106
+ hasMore: false,
107
+ };
108
+ }
@@ -0,0 +1,201 @@
1
+ const DEFAULT_MAX_TOOL_CALL_TIMEOUT_MS = 5 * 60_000;
2
+ // Test hook: lets unit tests exercise the abort-on-timeout path quickly.
3
+ function maxToolCallTimeoutMs() {
4
+ if (typeof process !== "undefined" && process.env?.PIBO_OMP_TOOL_TIMEOUT_MS) {
5
+ const parsed = Number(process.env.PIBO_OMP_TOOL_TIMEOUT_MS);
6
+ if (Number.isFinite(parsed) && parsed > 0)
7
+ return parsed;
8
+ }
9
+ return DEFAULT_MAX_TOOL_CALL_TIMEOUT_MS;
10
+ }
11
+ const MAX_RESULT_BYTES = 8 * 1024 * 1024;
12
+ function isRecord(value) {
13
+ return Boolean(value) && typeof value === "object" && !Array.isArray(value);
14
+ }
15
+ function stringValue(value) {
16
+ return typeof value === "string" ? value : JSON.stringify(value ?? "");
17
+ }
18
+ /** Resolve the input-schema JSON Schema from a Pibo tool definition. */
19
+ function toolInputSchema(definition) {
20
+ if (isRecord(definition.inputSchema)) {
21
+ return definition.inputSchema;
22
+ }
23
+ if (isRecord(definition.parameters)) {
24
+ return definition.parameters;
25
+ }
26
+ return { type: "object", properties: {} };
27
+ }
28
+ /** Flatten a Pibo tool result's content parts into host-tool text content. */
29
+ function flattenToolResult(result) {
30
+ const parts = [];
31
+ for (const item of result.content ?? []) {
32
+ if (item.type === "text") {
33
+ parts.push(item.text);
34
+ }
35
+ else if (item.type === "image") {
36
+ parts.push("[image content]");
37
+ }
38
+ else if ("text" in item) {
39
+ parts.push(String(item.text ?? ""));
40
+ }
41
+ else {
42
+ parts.push(JSON.stringify(item));
43
+ }
44
+ }
45
+ const content = parts.join("\n");
46
+ return result.isError ? { content, isError: true } : { content };
47
+ }
48
+ /**
49
+ * Bridges Pibo's portable tool session over OMP's host-tool RPC protocol.
50
+ *
51
+ * - `install` sends Pibo's tool definitions via `set_host_tools` so OMP mounts
52
+ * them directly (matching by name).
53
+ * - `handleFrame` processes `host_tool_call` / `host_tool_cancel` frames from
54
+ * OMP, executes the underlying Pibo tool (same contract the Pi direct
55
+ * compiler uses), and replies with `host_tool_result`.
56
+ *
57
+ * OMP preserves its native tools and base prompt; Pibo adds only its own
58
+ * portable tools, and only Pibo-hosted tools are governed by Pibo.
59
+ */
60
+ export class OmpHostToolBridge {
61
+ client;
62
+ portableTools;
63
+ executionContext;
64
+ emitWarning;
65
+ tools = new Map();
66
+ activeCalls = new Map();
67
+ dispossed = false;
68
+ constructor(client, portableTools, executionContext, emitWarning) {
69
+ this.client = client;
70
+ this.portableTools = portableTools;
71
+ this.executionContext = executionContext;
72
+ this.emitWarning = emitWarning;
73
+ }
74
+ get installedNames() {
75
+ return [...this.tools.keys()];
76
+ }
77
+ /** Send the current Pibo portable tool definitions to OMP via set_host_tools. */
78
+ async install() {
79
+ if (!this.portableTools || this.dispossed) {
80
+ await this.client.request({ type: "set_host_tools", tools: [] }, "set_host_tools");
81
+ return [];
82
+ }
83
+ const definitions = this.portableTools.createDefinitions();
84
+ this.tools.clear();
85
+ const wire = [];
86
+ for (const def of definitions) {
87
+ if (typeof def.name !== "string" || def.name.length === 0 || def.portable === false)
88
+ continue;
89
+ this.tools.set(def.name, def);
90
+ wire.push({
91
+ name: def.name,
92
+ description: typeof def.description === "string" ? def.description : "",
93
+ inputSchema: toolInputSchema(def),
94
+ });
95
+ }
96
+ const result = await this.client.request({ type: "set_host_tools", tools: wire }, "set_host_tools");
97
+ const data = result["data"];
98
+ const toolNames = isRecord(data) && Array.isArray(data.toolNames)
99
+ ? data.toolNames.filter((n) => typeof n === "string")
100
+ : [];
101
+ return toolNames;
102
+ }
103
+ /**
104
+ * Handle a host tool frame from OMP. Returns true when the frame was a host
105
+ * tool call/cancel (consumed); false otherwise.
106
+ */
107
+ handleFrame(frame) {
108
+ if (!isRecord(frame))
109
+ return false;
110
+ if (frame.type === "host_tool_call") {
111
+ void this.handleToolCall(frame);
112
+ return true;
113
+ }
114
+ if (frame.type === "host_tool_cancel") {
115
+ void this.handleToolCancel(frame);
116
+ return true;
117
+ }
118
+ return false;
119
+ }
120
+ async handleToolCall(frame) {
121
+ const toolName = typeof frame.toolName === "string" ? frame.toolName : "unknown";
122
+ const toolCallId = stringValue(frame.toolCallId);
123
+ const definition = this.tools.get(toolName);
124
+ if (!definition) {
125
+ await this.client
126
+ .sendSideChannel({ type: "host_tool_result", toolCallId, result: { content: `error: unknown host tool "${toolName}"`, isError: true } }, "host_tool_result")
127
+ .catch(() => { });
128
+ return;
129
+ }
130
+ const controller = new AbortController();
131
+ this.activeCalls.set(toolCallId, controller);
132
+ let timeoutHandle;
133
+ // Forward incremental Pibo tool progress as host_tool_update when the tool
134
+ // callback provides it.
135
+ const onUpdate = definition.portable === false ? undefined : (update) => {
136
+ void this.client
137
+ .sendSideChannel({ type: "host_tool_update", toolCallId, partialResult: update }, "host_tool_update")
138
+ .catch(() => { });
139
+ };
140
+ try {
141
+ const prepared = definition.prepareInput ? definition.prepareInput(frame.arguments) : frame.arguments;
142
+ const result = await Promise.race([
143
+ definition.execute(toolCallId, prepared, controller.signal, onUpdate, this.executionContext),
144
+ new Promise((_, reject) => {
145
+ timeoutHandle = setTimeout(() => {
146
+ // Abort the underlying Pibo tool so timeout doesn't leak a
147
+ // still-running background execution.
148
+ controller.abort();
149
+ reject(new Error(`OMP host tool "${toolName}" timed out.`));
150
+ }, maxToolCallTimeoutMs());
151
+ }),
152
+ ]);
153
+ clearTimeout(timeoutHandle);
154
+ const wire = this.sanitize(flattenToolResult(result));
155
+ await this.client.sendSideChannel({ type: "host_tool_result", toolCallId, result: wire }, "host_tool_result");
156
+ }
157
+ catch (error) {
158
+ const message = error instanceof Error ? error.message : String(error);
159
+ this.emitWarning(`OMP host tool "${toolName}" failed: ${message}`);
160
+ try {
161
+ await this.client.sendSideChannel({ type: "host_tool_result", toolCallId, result: { content: `error: ${message}`, isError: true } }, "host_tool_result");
162
+ }
163
+ catch {
164
+ // best-effort; the client may already be closing
165
+ }
166
+ }
167
+ finally {
168
+ if (timeoutHandle)
169
+ clearTimeout(timeoutHandle);
170
+ this.activeCalls.delete(toolCallId);
171
+ }
172
+ }
173
+ async handleToolCancel(frame) {
174
+ const toolCallId = stringValue(frame.toolCallId);
175
+ const active = this.activeCalls.get(toolCallId);
176
+ if (active)
177
+ active.abort();
178
+ this.activeCalls.delete(toolCallId);
179
+ }
180
+ sanitize(result) {
181
+ const serialized = JSON.stringify(result.content ?? "");
182
+ if (Buffer.byteLength(serialized, "utf8") > MAX_RESULT_BYTES) {
183
+ return { content: "[result truncated by Pibo]", isError: result.isError };
184
+ }
185
+ return result;
186
+ }
187
+ /** Cancel all in-flight host tool calls (used on abort/dispose). */
188
+ async cancelAll() {
189
+ for (const controller of this.activeCalls.values())
190
+ controller.abort();
191
+ this.activeCalls.clear();
192
+ }
193
+ dispose() {
194
+ if (this.dispossed)
195
+ return;
196
+ this.dispossed = true;
197
+ for (const controller of this.activeCalls.values())
198
+ controller.abort();
199
+ this.activeCalls.clear();
200
+ }
201
+ }
@@ -0,0 +1,86 @@
1
+ /** OMP thinking levels (from ai/types.ts ThinkingLevel). */
2
+ export const OMP_REASONING_VALUES = ["none", "low", "medium", "high"];
3
+ export const OMP_MODEL_PROVIDER_ID = "omp";
4
+ export const OMP_MODEL_OPTIONS_SCHEMA = {
5
+ type: "object",
6
+ additionalProperties: false,
7
+ properties: {
8
+ provider: { type: "string" },
9
+ modelId: { type: "string" },
10
+ thinkingLevel: { type: "string", enum: [...OMP_REASONING_VALUES] },
11
+ },
12
+ };
13
+ function isRecord(value) {
14
+ return Boolean(value) && typeof value === "object" && !Array.isArray(value);
15
+ }
16
+ export function toAgentRuntimeModelCatalog(runtimeInstanceId, models) {
17
+ return {
18
+ runtimeInstanceId,
19
+ models: models.map(toAgentRuntimeModelInfo),
20
+ };
21
+ }
22
+ export function toAgentRuntimeModelInfo(model) {
23
+ return {
24
+ id: model.id,
25
+ provider: model.provider ?? OMP_MODEL_PROVIDER_ID,
26
+ displayName: model.name ?? model.id,
27
+ reasoningOptions: model.reasoning || model.thinking ? [...OMP_REASONING_VALUES] : undefined,
28
+ options: {
29
+ provider: model.provider ?? OMP_MODEL_PROVIDER_ID,
30
+ modelId: model.id,
31
+ },
32
+ };
33
+ }
34
+ export async function readOmpModelCatalog(client, runtimeInstanceId) {
35
+ try {
36
+ const result = await client.request({ type: "get_available_models" }, "get_available_models");
37
+ const data = result["data"];
38
+ if (data && typeof data === "object" && !Array.isArray(data) && "models" in data) {
39
+ const models = data.models;
40
+ if (Array.isArray(models)) {
41
+ const descriptors = [];
42
+ for (const item of models) {
43
+ if (!isRecord(item))
44
+ continue;
45
+ if (typeof item.id !== "string" || item.id.length === 0)
46
+ continue;
47
+ descriptors.push({
48
+ provider: typeof item.provider === "string" ? item.provider : undefined,
49
+ id: item.id,
50
+ name: typeof item.name === "string" ? item.name : undefined,
51
+ reasoning: item.reasoning === true,
52
+ thinking: item.thinking === true,
53
+ contextWindow: typeof item.contextWindow === "number" ? item.contextWindow : undefined,
54
+ });
55
+ }
56
+ return toAgentRuntimeModelCatalog(runtimeInstanceId, descriptors);
57
+ }
58
+ }
59
+ }
60
+ catch {
61
+ // Model discovery is best-effort in fixtures; empty catalog is acceptable.
62
+ }
63
+ return { runtimeInstanceId, models: [] };
64
+ }
65
+ export async function setOmpModel(client, provider, modelId) {
66
+ const result = await client.request({ type: "set_model", provider, modelId }, "set_model");
67
+ const data = result["data"];
68
+ if (isRecord(data) && typeof data.id === "string") {
69
+ return toAgentRuntimeModelInfo({
70
+ provider: typeof data.provider === "string" ? data.provider : provider,
71
+ id: data.id,
72
+ name: typeof data.name === "string" ? data.name : undefined,
73
+ });
74
+ }
75
+ return { id: modelId, provider };
76
+ }
77
+ export async function setOmpThinkingLevel(client, level) {
78
+ await client.request({ type: "set_thinking_level", level }, "set_thinking_level");
79
+ }
80
+ export function parseOmpReasoning(level) {
81
+ if (typeof level === "string" && level.length > 0) {
82
+ const normalized = OMP_REASONING_VALUES.includes(level) ? level : "medium";
83
+ return { value: normalized, availableValues: [...OMP_REASONING_VALUES], supported: true };
84
+ }
85
+ return { availableValues: [...OMP_REASONING_VALUES], supported: true };
86
+ }