@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,109 @@
1
+ import { AgentRuntimeAuthError } from "../../agent-runtime/errors.js";
2
+ function isRecord(value) {
3
+ return Boolean(value) && typeof value === "object" && !Array.isArray(value);
4
+ }
5
+ export const OMP_AUTH_METHODS = [
6
+ { id: "api_key", completion: "immediate" },
7
+ ];
8
+ /**
9
+ * OMP auth status/surface.
10
+ *
11
+ * V1 truthfulness: OMP's RPC exposes `get_login_providers`/`login`. We declare
12
+ * `api_key` (immediate, env / models.yml configured keys) as the supported
13
+ * method. OAuth / device-code browser-step methods are surfaced only when the
14
+ * `open_url` extension_ui_request bridge is wired; until then they are not
15
+ * advertised.
16
+ */
17
+ export class OmpAuthController {
18
+ client;
19
+ flowCounter = 0;
20
+ constructor(client) {
21
+ this.client = client;
22
+ }
23
+ async getStatus() {
24
+ try {
25
+ const result = await this.client.request({ type: "get_login_providers" }, "get_login_providers");
26
+ const data = result["data"];
27
+ if (!isRecord(data) || !Array.isArray(data.providers)) {
28
+ return [unknownOmpStatus()];
29
+ }
30
+ const statuses = [];
31
+ for (const provider of data.providers) {
32
+ if (!isRecord(provider) || typeof provider.id !== "string")
33
+ continue;
34
+ const authenticated = provider.authenticated === true;
35
+ const available = provider.available === true;
36
+ statuses.push({
37
+ id: provider.id,
38
+ displayName: typeof provider.name === "string" ? provider.name : provider.id,
39
+ state: ompAuthState(authenticated, available),
40
+ configured: authenticated,
41
+ methods: OMP_AUTH_METHODS,
42
+ details: { accountType: authenticated ? "unknown" : "api_key" },
43
+ });
44
+ }
45
+ return statuses.length > 0 ? statuses : [unknownOmpStatus()];
46
+ }
47
+ catch {
48
+ return [unknownOmpStatus()];
49
+ }
50
+ }
51
+ async start(input) {
52
+ if (input.method === "api_key") {
53
+ // API-key auth is configured via provider config (env / models.yml);
54
+ // report as connected when a provider is selected.
55
+ return {
56
+ providerId: input.providerId,
57
+ state: "connected",
58
+ configured: true,
59
+ details: { accountType: "api_key" },
60
+ };
61
+ }
62
+ // OAuth/device-code: the browser step is surfaced via an open_url
63
+ // extension_ui_request only when the bridge is wired. Until then, report
64
+ // as unsupported rather than inventing support (truthful capability).
65
+ throw new AgentRuntimeAuthError("orp_auth_unsupported", `OMP OAuth/device-code authentication (${input.method}) is not wired in the OMP adapter; use an API key.`);
66
+ }
67
+ async complete(input) {
68
+ throw new AgentRuntimeAuthError("orp_auth_unsupported", "OMP API-key auth completes via provider configuration, not an RPC completion step.");
69
+ }
70
+ async cancel(input) {
71
+ return { providerId: input.providerId, state: "disconnected", configured: false, message: "Login canceled." };
72
+ }
73
+ async logout(input) {
74
+ // OMP persists credentials in its own store; Pibo reports the action
75
+ // without deleting user-global OMP state.
76
+ return { providerId: input.providerId, state: "disconnected", configured: false };
77
+ }
78
+ async dispose() {
79
+ // no owned resources
80
+ }
81
+ }
82
+ function ompAuthState(authenticated, available) {
83
+ if (authenticated)
84
+ return "connected";
85
+ if (!available)
86
+ return "unsupported";
87
+ return "disconnected";
88
+ }
89
+ function unknownOmpStatus() {
90
+ return {
91
+ id: "orp",
92
+ displayName: "OMP providers",
93
+ state: "unsupported",
94
+ configured: false,
95
+ methods: OMP_AUTH_METHODS,
96
+ details: { accountType: "api_key" },
97
+ };
98
+ }
99
+ /** Product-safe fallback status when the engine is unavailable. */
100
+ export function unknownOmpStatusForAdapter() {
101
+ return {
102
+ id: "orp",
103
+ displayName: "OMP providers",
104
+ state: "unsupported",
105
+ configured: false,
106
+ methods: OMP_AUTH_METHODS,
107
+ details: { accountType: "api_key" },
108
+ };
109
+ }
@@ -0,0 +1,460 @@
1
+ import { spawn } from "node:child_process";
2
+ import { randomUUID } from "node:crypto";
3
+ import { OMP_RPC_CHUNK_PAYLOAD_BYTES, OMP_RPC_MAX_FRAME_BYTES, OMP_RPC_PROTOCOL_VERSION, } from "./protocol-types.js";
4
+ const DEFAULT_STARTUP_TIMEOUT_MS = 15_000;
5
+ const DEFAULT_REQUEST_TIMEOUT_MS = 180_000;
6
+ const DEFAULT_SHUTDOWN_TIMEOUT_MS = 2_000;
7
+ const DEFAULT_MAX_MESSAGE_BYTES = 8 * 1024 * 1024;
8
+ const DEFAULT_MAX_PENDING_REQUESTS = 128;
9
+ const DEFAULT_MAX_STDERR_BYTES = 256 * 1024;
10
+ export class OmpRpcClientError extends Error {
11
+ code;
12
+ constructor(code, message, options = {}) {
13
+ super(message, options);
14
+ this.code = code;
15
+ this.name = "OmpRpcClientError";
16
+ }
17
+ }
18
+ export class OmpRpcResponseError extends Error {
19
+ command;
20
+ error;
21
+ errorCode;
22
+ constructor(command, error, errorCode, options = {}) {
23
+ super(`OMP RPC command "${command}" failed: ${error}`, options);
24
+ this.command = command;
25
+ this.error = error;
26
+ this.errorCode = errorCode;
27
+ this.name = "OmpRpcResponseError";
28
+ }
29
+ }
30
+ function deferred() {
31
+ const d = {};
32
+ d.promise = new Promise((resolve, reject) => {
33
+ d.resolve = resolve;
34
+ d.reject = reject;
35
+ });
36
+ return d;
37
+ }
38
+ function isOmpRpcSideChannel(frame) {
39
+ const type = frame.type;
40
+ return type === "host_tool_result"
41
+ || type === "host_tool_update"
42
+ || type === "host_uri_result"
43
+ || type === "extension_ui_response";
44
+ }
45
+ function isRecord(value) {
46
+ return Boolean(value) && typeof value === "object" && !Array.isArray(value);
47
+ }
48
+ function parseReadyFrame(value) {
49
+ if (!isRecord(value) || value.type !== "ready") {
50
+ throw new OmpRpcClientError("protocol_error", "OMP child did not emit a ready frame on startup.");
51
+ }
52
+ return value;
53
+ }
54
+ export class OmpRpcClient {
55
+ options;
56
+ child;
57
+ stdoutBuffer = Buffer.alloc(0);
58
+ state = "starting";
59
+ protocolVersion = 1;
60
+ pending = new Map();
61
+ chunks = new Map();
62
+ frameListeners = new Set();
63
+ sideChannelListeners = new Set();
64
+ diagnosticListeners = new Set();
65
+ stderrBytes = 0;
66
+ startupTimeoutMs;
67
+ requestTimeoutMs;
68
+ shutdownTimeoutMs;
69
+ maxMessageBytes;
70
+ maxPendingRequests;
71
+ maxStderrBytes;
72
+ constructor(options = {}) {
73
+ this.options = options;
74
+ this.startupTimeoutMs = options.startupTimeoutMs ?? DEFAULT_STARTUP_TIMEOUT_MS;
75
+ this.requestTimeoutMs = options.requestTimeoutMs ?? DEFAULT_REQUEST_TIMEOUT_MS;
76
+ this.shutdownTimeoutMs = options.shutdownTimeoutMs ?? DEFAULT_SHUTDOWN_TIMEOUT_MS;
77
+ this.maxMessageBytes = options.maxMessageBytes ?? DEFAULT_MAX_MESSAGE_BYTES;
78
+ this.maxPendingRequests = options.maxPendingRequests ?? DEFAULT_MAX_PENDING_REQUESTS;
79
+ this.maxStderrBytes = options.maxStderrBytes ?? DEFAULT_MAX_STDERR_BYTES;
80
+ }
81
+ get snapshot() {
82
+ return {
83
+ state: this.state,
84
+ ready: this.state === "ready",
85
+ pendingRequests: this.pending.size,
86
+ protocolVersion: this.protocolVersion,
87
+ };
88
+ }
89
+ get process() {
90
+ return this.child;
91
+ }
92
+ get connected() {
93
+ return this.state === "ready";
94
+ }
95
+ subscribeFrames(listener) {
96
+ this.frameListeners.add(listener);
97
+ return () => this.frameListeners.delete(listener);
98
+ }
99
+ subscribeSideChannels(listener) {
100
+ this.sideChannelListeners.add(listener);
101
+ return () => this.sideChannelListeners.delete(listener);
102
+ }
103
+ subscribeDiagnostics(listener) {
104
+ this.diagnosticListeners.add(listener);
105
+ return () => this.diagnosticListeners.delete(listener);
106
+ }
107
+ /**
108
+ * Redact likely credential material before surfacing a diagnostic, so OMP
109
+ * stderr (which may echo prompts or provider keys) cannot leak secrets.
110
+ */
111
+ static redactDiagnostic(message) {
112
+ return message
113
+ .replace(/\b(?:sk|rk|pk|ghp|github_pat)[-_][A-Za-z0-9._~+/-]{8,}\b/g, "[redacted]")
114
+ .replace(/\bBearer\s+\S+/gi, "Bearer [redacted]")
115
+ .replace(/\b(?:api[_-]?key|secret|token|password)\b(?=[:=]\s*)\s*[^\s,;]+/gi, "$1 [redacted]");
116
+ }
117
+ emitDiagnostic(message) {
118
+ for (const listener of this.diagnosticListeners)
119
+ listener(OmpRpcClient.redactDiagnostic(message));
120
+ }
121
+ /**
122
+ * Spawn the OMP child in `--mode rpc` and wait for the `ready` frame, then
123
+ * negotiate protocol v2 (confirms frame encoder upgrade for large frames).
124
+ */
125
+ async connect(command, options) {
126
+ if (this.state === "ready")
127
+ return;
128
+ const ready = deferred();
129
+ let child;
130
+ try {
131
+ child = spawn(command[0], command.slice(1), {
132
+ cwd: options.cwd,
133
+ env: options.env,
134
+ stdio: ["pipe", "pipe", "pipe"],
135
+ });
136
+ }
137
+ catch (error) {
138
+ this.state = "failed";
139
+ throw new OmpRpcClientError("spawn_failed", `Failed to spawn OMP child: ${String(error)}`, { cause: error });
140
+ }
141
+ this.child = child;
142
+ let startupTimer;
143
+ child.stderr.on("data", (chunk) => {
144
+ this.stderrBytes += chunk.length;
145
+ if (this.stderrBytes <= this.maxStderrBytes) {
146
+ this.emitDiagnostic(chunk.toString("utf8"));
147
+ }
148
+ });
149
+ child.once("error", (error) => {
150
+ const code = error.code === "ENOENT" ? "spawn_failed" : "process_exited";
151
+ this.state = "failed";
152
+ ready.reject(new OmpRpcClientError(code, `OMP child process error: ${error.message}`, { cause: error }));
153
+ });
154
+ child.once("close", (code, signal) => {
155
+ this.state = "closed";
156
+ this.rejectAll(new OmpRpcClientError("process_exited", `OMP child process exited (code=${String(code)}, signal=${String(signal)})`));
157
+ ready.reject(new OmpRpcClientError("process_exited", "OMP child process exited before becoming ready."));
158
+ });
159
+ child.stdout.on("data", (chunk) => this.onStdoutData(Buffer.from(chunk)));
160
+ // Wait for ready frame.
161
+ const unsubscribe = this.subscribeFrames((frame) => {
162
+ if (frame.type === "ready") {
163
+ unsubscribe();
164
+ ready.resolve(frame);
165
+ }
166
+ });
167
+ startupTimer = setTimeout(() => {
168
+ ready.reject(new OmpRpcClientError("timeout", "Timed out waiting for the OMP ready frame."));
169
+ }, this.startupTimeoutMs);
170
+ this.state = "initializing";
171
+ let startup;
172
+ try {
173
+ startup = await ready.promise;
174
+ }
175
+ catch (error) {
176
+ this.state = "failed";
177
+ this.closeProcess();
178
+ throw error;
179
+ }
180
+ finally {
181
+ if (startupTimer)
182
+ clearTimeout(startupTimer);
183
+ }
184
+ // Mark ready before negotiation so the client can send the handshake.
185
+ this.state = "ready";
186
+ this.protocolVersion = startup.protocolVersion;
187
+ try {
188
+ await this.request({ type: "negotiate_protocol", protocolVersion: OMP_RPC_PROTOCOL_VERSION }, "negotiate_protocol");
189
+ this.protocolVersion = OMP_RPC_PROTOCOL_VERSION;
190
+ }
191
+ catch (error) {
192
+ this.state = "failed";
193
+ this.closeProcess();
194
+ throw new OmpRpcClientError("protocol_error", `OMP protocol negotiation failed: ${String(error)}`, { cause: error });
195
+ }
196
+ }
197
+ onStdoutData(chunk) {
198
+ this.stdoutBuffer = Buffer.concat([this.stdoutBuffer, chunk]);
199
+ let newlineIndex;
200
+ while ((newlineIndex = this.stdoutBuffer.indexOf(0x0a)) !== -1) {
201
+ const line = this.stdoutBuffer.subarray(0, newlineIndex).toString("utf8").trim();
202
+ this.stdoutBuffer = this.stdoutBuffer.subarray(newlineIndex + 1);
203
+ if (line.length === 0)
204
+ continue;
205
+ this.handleLine(line);
206
+ }
207
+ }
208
+ handleLine(line) {
209
+ let parsed;
210
+ try {
211
+ parsed = JSON.parse(line);
212
+ }
213
+ catch {
214
+ this.emitDiagnostic(`OMP emitted a malformed JSON line on stdout (ignored).`);
215
+ return;
216
+ }
217
+ if (!isRecord(parsed)) {
218
+ this.emitDiagnostic(`OMP emitted a non-object JSON line on stdout (ignored).`);
219
+ return;
220
+ }
221
+ // Reassemble oversized chunked frames first.
222
+ if (parsed.type === "rpc_chunk") {
223
+ const reassembled = this.consumeChunk(parsed);
224
+ if (reassembled === undefined)
225
+ return; // waiting for more chunks
226
+ try {
227
+ parsed = JSON.parse(reassembled);
228
+ }
229
+ catch {
230
+ this.emitDiagnostic(`OMP chunk reassembly produced invalid JSON (ignored).`);
231
+ return;
232
+ }
233
+ }
234
+ const frame = parsed;
235
+ for (const listener of this.frameListeners)
236
+ listener(frame);
237
+ if (isOmpRpcSideChannel(frame)) {
238
+ const sideChannel = frame;
239
+ for (const listener of this.sideChannelListeners)
240
+ listener(sideChannel);
241
+ }
242
+ if (this.isResponse(frame)) {
243
+ this.resolveResponse(frame);
244
+ }
245
+ }
246
+ isSideChannel(frame) {
247
+ const type = frame.type;
248
+ return (type === "host_tool_result" ||
249
+ type === "host_tool_update" ||
250
+ type === "host_uri_result" ||
251
+ type === "extension_ui_response");
252
+ }
253
+ isResponse(frame) {
254
+ return frame.type === "response";
255
+ }
256
+ consumeChunk(frame) {
257
+ // Validate frame bounds first so an out-of-range index can never create a
258
+ // sparse array that Buffer.concat later turns into an uncaught TypeError.
259
+ if (!Number.isSafeInteger(frame.index) || frame.index < 0 || frame.index >= frame.count) {
260
+ this.chunks.delete(frame.chunkId);
261
+ this.emitDiagnostic(`OMP chunk frame has an invalid index ${frame.index} (dropped).`);
262
+ return undefined;
263
+ }
264
+ let decoded;
265
+ try {
266
+ decoded = Buffer.from(frame.data, "base64");
267
+ // Reject invalid base64 (empty/garbage) before it becomes a hole.
268
+ if (frame.data.length === 0 && frame.byteLength > 0) {
269
+ this.chunks.delete(frame.chunkId);
270
+ this.emitDiagnostic(`OMP chunk frame carries empty base64 payload (dropped).`);
271
+ return undefined;
272
+ }
273
+ }
274
+ catch {
275
+ this.chunks.delete(frame.chunkId);
276
+ this.emitDiagnostic(`OMP chunk frame base64 decode failed (dropped).`);
277
+ return undefined;
278
+ }
279
+ const existing = this.chunks.get(frame.chunkId);
280
+ if (existing) {
281
+ if (existing.count !== frame.count || existing.byteLength !== frame.byteLength) {
282
+ this.chunks.delete(frame.chunkId);
283
+ this.emitDiagnostic(`OMP chunk frame metadata mismatch (dropped).`);
284
+ return undefined;
285
+ }
286
+ // Must be the next in-order chunk; reject duplicates/holes/out-of-order.
287
+ if (frame.index !== existing.parts.length) {
288
+ this.chunks.delete(frame.chunkId);
289
+ this.emitDiagnostic(`OMP chunk frame arrived out of order (expected index ${existing.parts.length}, got ${frame.index}); dropped.`);
290
+ return undefined;
291
+ }
292
+ existing.parts.push(decoded);
293
+ }
294
+ else {
295
+ if (frame.index !== 0) {
296
+ this.emitDiagnostic(`OMP chunk frame sequence did not start at index 0 (dropped).`);
297
+ return undefined;
298
+ }
299
+ this.chunks.set(frame.chunkId, { count: frame.count, byteLength: frame.byteLength, parts: [decoded] });
300
+ }
301
+ const acc = this.chunks.get(frame.chunkId);
302
+ if (acc.parts.length < acc.count)
303
+ return undefined;
304
+ this.chunks.delete(frame.chunkId);
305
+ const full = Buffer.concat(acc.parts);
306
+ if (full.length !== acc.byteLength) {
307
+ this.emitDiagnostic(`OMP chunk reassembly length mismatch (dropped).`);
308
+ return undefined;
309
+ }
310
+ return full.toString("utf8");
311
+ }
312
+ resolveResponse(response) {
313
+ const id = response.id;
314
+ if (id === undefined) {
315
+ // Responses without an id that still carry command info are protocol
316
+ // telemetry; emit as diagnostic rather than dropping silently.
317
+ this.emitDiagnostic(`OMP response without an id (command=${response.command}).`);
318
+ return;
319
+ }
320
+ const entry = this.pending.get(id);
321
+ if (!entry)
322
+ return; // late/superseded response
323
+ this.pending.delete(id);
324
+ clearTimeout(entry.timer);
325
+ entry.resolve(response);
326
+ }
327
+ rejectAll(error) {
328
+ for (const [id, entry] of Array.from(this.pending.entries())) {
329
+ this.pending.delete(id);
330
+ clearTimeout(entry.timer);
331
+ entry.reject(error);
332
+ }
333
+ }
334
+ /**
335
+ * Send a command and await its correlated response. Always matches on `id`
336
+ * (never queue order) — OMP dispatches `bash` concurrently and side-channel
337
+ * frames overtake the serial queue.
338
+ */
339
+ async request(command, label) {
340
+ if (this.state !== "ready") {
341
+ throw new OmpRpcClientError("closed", `Cannot send OMP command "${label}": client is not ready.`);
342
+ }
343
+ if (this.pending.size >= this.maxPendingRequests) {
344
+ throw new OmpRpcClientError("pending_limit", "Too many pending OMP RPC requests.");
345
+ }
346
+ const id = (command.id ?? randomUUID());
347
+ const withId = { ...command, id };
348
+ let serialized;
349
+ try {
350
+ serialized = JSON.stringify(withId);
351
+ }
352
+ catch (error) {
353
+ throw new OmpRpcClientError("serialization_error", `Failed to serialize OMP command "${label}": ${String(error)}`);
354
+ }
355
+ if (Buffer.byteLength(serialized, "utf8") > this.maxMessageBytes) {
356
+ throw new OmpRpcClientError("message_too_large", `OMP command "${label}" exceeds the message size limit.`);
357
+ }
358
+ const response = deferred();
359
+ const timer = setTimeout(() => {
360
+ this.pending.delete(id);
361
+ response.reject(new OmpRpcClientError("timeout", `OMP command "${label}" timed out.`));
362
+ }, this.requestTimeoutMs);
363
+ this.pending.set(id, {
364
+ command: command.type,
365
+ resolve: response.resolve,
366
+ reject: response.reject,
367
+ timer,
368
+ });
369
+ try {
370
+ await this.writeLine(serialized);
371
+ }
372
+ catch (error) {
373
+ this.pending.delete(id);
374
+ clearTimeout(timer);
375
+ response.reject(error);
376
+ }
377
+ const result = await response.promise;
378
+ if (result["success"] === false) {
379
+ const err = result;
380
+ throw new OmpRpcResponseError(label, err.error ?? "unknown error", err.code);
381
+ }
382
+ return result;
383
+ }
384
+ async writeLine(line) {
385
+ return await new Promise((resolveWrite, rejectWrite) => {
386
+ if (!this.child || this.child.stdin.destroyed) {
387
+ rejectWrite(new OmpRpcClientError("write_failed", "OMP child stdin is closed."));
388
+ return;
389
+ }
390
+ this.child.stdin.write(`${line}\n`, (error) => {
391
+ if (error)
392
+ rejectWrite(new OmpRpcClientError("write_failed", `Failed to write to OMP child: ${error.message}`, { cause: error }));
393
+ else
394
+ resolveWrite();
395
+ });
396
+ });
397
+ }
398
+ get stderr() {
399
+ return []; // diagnostics already streamed via listeners; retained for symmetry
400
+ }
401
+ /**
402
+ * Send a fire-and-forget side-channel frame to OMP (host_tool_result,
403
+ * host_tool_update, host_uri_result, extension_ui_response). These overtake
404
+ * the serial command queue and do not receive a correlated `response`.
405
+ */
406
+ async sendSideChannel(frame, label) {
407
+ if (this.state !== "ready") {
408
+ throw new OmpRpcClientError("closed", `Cannot send OMP side-channel frame "${label}": client is not ready.`);
409
+ }
410
+ let serialized;
411
+ try {
412
+ serialized = JSON.stringify(frame);
413
+ }
414
+ catch (error) {
415
+ throw new OmpRpcClientError("serialization_error", `Failed to serialize OMP frame "${label}": ${String(error)}`);
416
+ }
417
+ if (Buffer.byteLength(serialized, "utf8") > this.maxMessageBytes) {
418
+ throw new OmpRpcClientError("message_too_large", `OMP frame "${label}" exceeds the message size limit.`);
419
+ }
420
+ await this.writeLine(serialized);
421
+ }
422
+ async close() {
423
+ if (this.state === "ready") {
424
+ this.state = "closing";
425
+ }
426
+ this.closeProcess();
427
+ }
428
+ closeProcess() {
429
+ if (this.child && !this.child.killed) {
430
+ try {
431
+ this.child.kill("SIGTERM");
432
+ }
433
+ catch {
434
+ // ignore
435
+ }
436
+ const child = this.child;
437
+ // Ensure the child is reaped even on platforms where SIGTERM is
438
+ // ignored (freeing any cwd lock for temp cleanup).
439
+ const timer = setTimeout(() => {
440
+ if (child && !child.killed) {
441
+ try {
442
+ child.kill("SIGKILL");
443
+ }
444
+ catch {
445
+ // ignore
446
+ }
447
+ }
448
+ }, this.shutdownTimeoutMs);
449
+ timer.unref();
450
+ }
451
+ this.state = "closed";
452
+ this.rejectAll(new OmpRpcClientError("aborted", "OMP client closed."));
453
+ }
454
+ dispose() {
455
+ this.closeProcess();
456
+ }
457
+ }
458
+ /** Convenience for oversized-frames logic parity; retained as a documented limit. */
459
+ export const OMP_MAX_CHUNK_PAYLOAD_BYTES = OMP_RPC_CHUNK_PAYLOAD_BYTES;
460
+ export const OMP_DEFAULT_MAX_FRAME_BYTES = OMP_RPC_MAX_FRAME_BYTES;