@pasko70/pibo 2.1.1 → 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 (375) 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 +43 -8
  14. package/dist/agent-runtimes/omp/process.js +26 -10
  15. package/dist/agent-runtimes/omp/resource-delivery.js +150 -84
  16. package/dist/agent-runtimes/pi/adapter.js +32 -1
  17. package/dist/agent-runtimes/pi/auth.js +34 -29
  18. package/dist/agent-runtimes/pi/credentials.js +43 -0
  19. package/dist/agent-runtimes/pi/model-catalog.js +7 -3
  20. package/dist/agent-runtimes/pi/portable-history.js +99 -0
  21. package/dist/agent-runtimes/pi/routed-session.js +1 -1
  22. package/dist/agent-runtimes/pi/runtime.js +31 -15
  23. package/dist/apps/chat/agent-profiles.js +1 -0
  24. package/dist/apps/chat/agent-store.js +20 -7
  25. package/dist/apps/chat/chat-files.js +19 -6
  26. package/dist/apps/chat/chat-request-normalizers.js +13 -0
  27. package/dist/apps/chat/web-app.js +55 -6
  28. package/dist/apps/chat-ui/assets/{apl-14BqhLYK.js → apl-gfMMiTNf.js} +1 -1
  29. package/dist/apps/chat-ui/assets/asciiarmor-C_eisQCp.js +1 -0
  30. package/dist/apps/{context-files-ui/assets/asn1-Bg4FbdCg.js → chat-ui/assets/asn1-DCl_8MCW.js} +1 -1
  31. package/dist/apps/{context-files-ui/assets/asterisk-B2MO-X4d.js → chat-ui/assets/asterisk-BEn0Cwpx.js} +1 -1
  32. package/dist/apps/chat-ui/assets/clike-D_6L3tnO.js +1 -0
  33. package/dist/apps/chat-ui/assets/cmake-84nbDH0I.js +1 -0
  34. package/dist/apps/chat-ui/assets/cobol-DHLQUbN7.js +1 -0
  35. package/dist/apps/chat-ui/assets/coffeescript-De_zI4J0.js +1 -0
  36. package/dist/apps/chat-ui/assets/commonlisp-DgAKBe0r.js +1 -0
  37. package/dist/apps/chat-ui/assets/crystal-Bsdphhtm.js +1 -0
  38. package/dist/apps/chat-ui/assets/css-CnaYoQib.js +1 -0
  39. package/dist/apps/chat-ui/assets/{d-TPqSVaHM.js → d-DWkQyNnU.js} +1 -1
  40. package/dist/apps/{context-files-ui/assets/dist-DxEGebCR.js → chat-ui/assets/dist-BB8loWTa.js} +1 -1
  41. package/dist/apps/chat-ui/assets/dist-BJ-TIk3N.js +1 -0
  42. package/dist/apps/chat-ui/assets/dist-CBPDkWd4.js +1 -0
  43. package/dist/apps/chat-ui/assets/dist-CHInEWhr.js +1 -0
  44. package/dist/apps/chat-ui/assets/dist-CqM4On9D.js +13 -0
  45. package/dist/apps/chat-ui/assets/dist-CswnpKik.js +1 -0
  46. package/dist/apps/{context-files-ui/assets/dist-B7gXtTZC.js → chat-ui/assets/dist-CwS16H7k.js} +1 -1
  47. package/dist/apps/chat-ui/assets/dist-DHvUPfrF.js +1 -0
  48. package/dist/apps/chat-ui/assets/dist-DLJCGrGQ.js +1 -0
  49. package/dist/apps/chat-ui/assets/{dist-DLMjd26T.js → dist-DMiglryg.js} +1 -1
  50. package/dist/apps/chat-ui/assets/dist-DTeLDijr.js +9 -0
  51. package/dist/apps/chat-ui/assets/{dist-DKoyMSNr.js → dist-DpF08Yd7.js} +1 -1
  52. package/dist/apps/chat-ui/assets/dist-LCx98fA_.js +11 -0
  53. package/dist/apps/chat-ui/assets/{dist-DotDq_kD.js → dist-RKTRnzGb.js} +1 -1
  54. package/dist/apps/chat-ui/assets/dist-S3zJGntM.js +1 -0
  55. package/dist/apps/{context-files-ui/assets/dist-BkUONE3N.js → chat-ui/assets/dist-XVYGiB-c.js} +1 -1
  56. package/dist/apps/chat-ui/assets/dist-eddbbGyw.js +1 -0
  57. package/dist/apps/chat-ui/assets/dist-fPhZsAUX.js +1 -0
  58. package/dist/apps/chat-ui/assets/dist-mpRGeo_R.js +2 -0
  59. package/dist/apps/chat-ui/assets/{dist-sZgJkWZb.js → dist-nU3BVpFi.js} +1 -1
  60. package/dist/apps/chat-ui/assets/{dockerfile-CJb2sekW.js → dockerfile-DJkHQgkl.js} +1 -1
  61. package/dist/apps/chat-ui/assets/{dylan-08Azy1NK.js → dylan-BCDoL_-p.js} +1 -1
  62. package/dist/apps/chat-ui/assets/{ecl-dhxjHL8y.js → ecl-BVIeWmwY.js} +1 -1
  63. package/dist/apps/{context-files-ui/assets/erlang-BD5LkVkR.js → chat-ui/assets/erlang-BV0c4Hdn.js} +1 -1
  64. package/dist/apps/chat-ui/assets/{factor-B2EMQZkP.js → factor-LKH5gN8L.js} +1 -1
  65. package/dist/apps/chat-ui/assets/groovy-CUpZ7dEl.js +1 -0
  66. package/dist/apps/chat-ui/assets/{haxe-BJVKtprM.js → haxe-DjVOVvNP.js} +1 -1
  67. package/dist/apps/chat-ui/assets/index-CQuka3bs.js +226 -0
  68. package/dist/apps/chat-ui/assets/index-DUXboQnI.css +1 -0
  69. package/dist/apps/chat-ui/assets/javascript-DoL9Wb-Q.js +1 -0
  70. package/dist/apps/chat-ui/assets/{lua-BxuTHaF7.js → lua-CiA1ziua.js} +1 -1
  71. package/dist/apps/chat-ui/assets/{mumps-Ds_ZaumL.js → mumps-BSzj6Xyz.js} +1 -1
  72. package/dist/apps/{context-files-ui/assets/nsis-DOo3SJmd.js → chat-ui/assets/nsis-CfSuhXs5.js} +1 -1
  73. package/dist/apps/chat-ui/assets/{ntriples-DLHGTvHs.js → ntriples-B9h1VB_g.js} +1 -1
  74. package/dist/apps/chat-ui/assets/perl-BkSkiI9m.js +1 -0
  75. package/dist/apps/chat-ui/assets/{powershell-B4IPkVxR.js → powershell-BcIto6Sf.js} +1 -1
  76. package/dist/apps/{context-files-ui/assets/pug-QU72BPAa.js → chat-ui/assets/pug-Gsm0M45u.js} +1 -1
  77. package/dist/apps/chat-ui/assets/puppet-BZyAS7I4.js +1 -0
  78. package/dist/apps/chat-ui/assets/python-B_1Jd8HM.js +1 -0
  79. package/dist/apps/chat-ui/assets/r-CxDmU1I4.js +1 -0
  80. package/dist/apps/chat-ui/assets/ruby-BjXV7-Qa.js +1 -0
  81. package/dist/apps/chat-ui/assets/scheme-D9qYN0V5.js +1 -0
  82. package/dist/apps/chat-ui/assets/{shell-BjiMLAaM.js → shell-DwuoZtxw.js} +1 -1
  83. package/dist/apps/chat-ui/assets/{simple-mode-DnMbQuKW.js → simple-mode-DXiLM1-G.js} +1 -1
  84. package/dist/apps/chat-ui/assets/sql-DuQMFDvy.js +1 -0
  85. package/dist/apps/chat-ui/assets/{stex-BCRT8IJ3.js → stex-DNzd62Q_.js} +1 -1
  86. package/dist/apps/chat-ui/assets/{stylus-CARoeVE9.js → stylus-BOVgKnng.js} +1 -1
  87. package/dist/apps/chat-ui/assets/textile-C4jVoHG1.js +1 -0
  88. package/dist/apps/chat-ui/assets/tiki-AK6FwT8q.js +1 -0
  89. package/dist/apps/chat-ui/assets/toml-BPTmHmyx.js +1 -0
  90. package/dist/apps/chat-ui/assets/{ttcn-GvRgs2AT.js → ttcn-PPSTk1ow.js} +1 -1
  91. package/dist/apps/chat-ui/assets/{ttcn-cfg-CGCXz7Vo.js → ttcn-cfg-2b4Gb5sE.js} +1 -1
  92. package/dist/apps/chat-ui/assets/turtle-Cx3rYX2g.js +1 -0
  93. package/dist/apps/chat-ui/assets/{verilog-DVCHmufx.js → verilog-7LoJAqYT.js} +1 -1
  94. package/dist/apps/chat-ui/assets/vhdl-kS471soi.js +1 -0
  95. package/dist/apps/{context-files-ui/assets/xquery-5f0hn7cg.js → chat-ui/assets/xquery-BKJx4mf9.js} +1 -1
  96. package/dist/apps/chat-ui/assets/z80-Co3PbHdE.js +1 -0
  97. package/dist/apps/chat-ui/index.html +5 -3
  98. package/dist/apps/chat-vscode-web/assets/index-CF1-9PKU.css +2 -0
  99. package/dist/apps/chat-vscode-web/assets/index-Dp1TzeRL.js +41 -0
  100. package/dist/apps/chat-vscode-web/index.html +2 -2
  101. package/dist/apps/context-files-ui/assets/{apl-14BqhLYK.js → apl-gfMMiTNf.js} +1 -1
  102. package/dist/apps/context-files-ui/assets/asciiarmor-C_eisQCp.js +1 -0
  103. package/dist/apps/{chat-ui/assets/asn1-Bg4FbdCg.js → context-files-ui/assets/asn1-DCl_8MCW.js} +1 -1
  104. package/dist/apps/{chat-ui/assets/asterisk-B2MO-X4d.js → context-files-ui/assets/asterisk-BEn0Cwpx.js} +1 -1
  105. package/dist/apps/context-files-ui/assets/clike-D_6L3tnO.js +1 -0
  106. package/dist/apps/context-files-ui/assets/cmake-84nbDH0I.js +1 -0
  107. package/dist/apps/context-files-ui/assets/cobol-DHLQUbN7.js +1 -0
  108. package/dist/apps/context-files-ui/assets/coffeescript-De_zI4J0.js +1 -0
  109. package/dist/apps/context-files-ui/assets/commonlisp-DgAKBe0r.js +1 -0
  110. package/dist/apps/context-files-ui/assets/crystal-Bsdphhtm.js +1 -0
  111. package/dist/apps/context-files-ui/assets/css-CnaYoQib.js +1 -0
  112. package/dist/apps/context-files-ui/assets/{d-TPqSVaHM.js → d-DWkQyNnU.js} +1 -1
  113. package/dist/apps/{chat-ui/assets/dist-C6LPDFXU.js → context-files-ui/assets/dist-BAqbgxUS.js} +1 -1
  114. package/dist/apps/context-files-ui/assets/dist-BJ-TIk3N.js +1 -0
  115. package/dist/apps/context-files-ui/assets/dist-BcauuFwf.js +1 -0
  116. package/dist/apps/context-files-ui/assets/dist-BecMXs79.js +1 -0
  117. package/dist/apps/context-files-ui/assets/{dist-C-Jm45P4.js → dist-Ci2NSlf1.js} +1 -1
  118. package/dist/apps/context-files-ui/assets/dist-CqM4On9D.js +13 -0
  119. package/dist/apps/context-files-ui/assets/dist-CswnpKik.js +1 -0
  120. package/dist/apps/{chat-ui/assets/dist-I26VB0QO.js → context-files-ui/assets/dist-D-xpsbZI.js} +1 -1
  121. package/dist/apps/context-files-ui/assets/dist-DHvUPfrF.js +1 -0
  122. package/dist/apps/context-files-ui/assets/dist-DLJCGrGQ.js +1 -0
  123. package/dist/apps/context-files-ui/assets/{dist-DLMjd26T.js → dist-DMiglryg.js} +1 -1
  124. package/dist/apps/context-files-ui/assets/dist-DTeLDijr.js +9 -0
  125. package/dist/apps/context-files-ui/assets/{dist-DKoyMSNr.js → dist-DpF08Yd7.js} +1 -1
  126. package/dist/apps/context-files-ui/assets/dist-LCx98fA_.js +11 -0
  127. package/dist/apps/context-files-ui/assets/{dist-DotDq_kD.js → dist-RKTRnzGb.js} +1 -1
  128. package/dist/apps/context-files-ui/assets/dist-S3zJGntM.js +1 -0
  129. package/dist/apps/{chat-ui/assets/dist-BkUONE3N.js → context-files-ui/assets/dist-XVYGiB-c.js} +1 -1
  130. package/dist/apps/context-files-ui/assets/dist-eddbbGyw.js +1 -0
  131. package/dist/apps/context-files-ui/assets/dist-fPhZsAUX.js +1 -0
  132. package/dist/apps/context-files-ui/assets/dist-mpRGeo_R.js +2 -0
  133. package/dist/apps/context-files-ui/assets/{dockerfile-CJb2sekW.js → dockerfile-DJkHQgkl.js} +1 -1
  134. package/dist/apps/context-files-ui/assets/{dylan-08Azy1NK.js → dylan-BCDoL_-p.js} +1 -1
  135. package/dist/apps/context-files-ui/assets/{ecl-dhxjHL8y.js → ecl-BVIeWmwY.js} +1 -1
  136. package/dist/apps/{chat-ui/assets/erlang-BD5LkVkR.js → context-files-ui/assets/erlang-BV0c4Hdn.js} +1 -1
  137. package/dist/apps/context-files-ui/assets/{factor-B2EMQZkP.js → factor-LKH5gN8L.js} +1 -1
  138. package/dist/apps/context-files-ui/assets/groovy-CUpZ7dEl.js +1 -0
  139. package/dist/apps/context-files-ui/assets/{haxe-BJVKtprM.js → haxe-DjVOVvNP.js} +1 -1
  140. package/dist/apps/context-files-ui/assets/index-CkWXlBNn.js +191 -0
  141. package/dist/apps/context-files-ui/assets/{index-Cs4XQITe.css → index-D8TsUizd.css} +1 -1
  142. package/dist/apps/context-files-ui/assets/javascript-DoL9Wb-Q.js +1 -0
  143. package/dist/apps/context-files-ui/assets/{lua-BxuTHaF7.js → lua-CiA1ziua.js} +1 -1
  144. package/dist/apps/context-files-ui/assets/{mumps-Ds_ZaumL.js → mumps-BSzj6Xyz.js} +1 -1
  145. package/dist/apps/{chat-ui/assets/nsis-DOo3SJmd.js → context-files-ui/assets/nsis-CfSuhXs5.js} +1 -1
  146. package/dist/apps/context-files-ui/assets/{ntriples-DLHGTvHs.js → ntriples-B9h1VB_g.js} +1 -1
  147. package/dist/apps/context-files-ui/assets/perl-BkSkiI9m.js +1 -0
  148. package/dist/apps/context-files-ui/assets/{powershell-B4IPkVxR.js → powershell-BcIto6Sf.js} +1 -1
  149. package/dist/apps/{chat-ui/assets/pug-QU72BPAa.js → context-files-ui/assets/pug-Gsm0M45u.js} +1 -1
  150. package/dist/apps/context-files-ui/assets/puppet-BZyAS7I4.js +1 -0
  151. package/dist/apps/context-files-ui/assets/python-B_1Jd8HM.js +1 -0
  152. package/dist/apps/context-files-ui/assets/r-CxDmU1I4.js +1 -0
  153. package/dist/apps/context-files-ui/assets/ruby-BjXV7-Qa.js +1 -0
  154. package/dist/apps/context-files-ui/assets/scheme-D9qYN0V5.js +1 -0
  155. package/dist/apps/context-files-ui/assets/{shell-BjiMLAaM.js → shell-DwuoZtxw.js} +1 -1
  156. package/dist/apps/context-files-ui/assets/{simple-mode-DnMbQuKW.js → simple-mode-DXiLM1-G.js} +1 -1
  157. package/dist/apps/context-files-ui/assets/sql-DuQMFDvy.js +1 -0
  158. package/dist/apps/context-files-ui/assets/{stex-BCRT8IJ3.js → stex-DNzd62Q_.js} +1 -1
  159. package/dist/apps/context-files-ui/assets/{stylus-CARoeVE9.js → stylus-BOVgKnng.js} +1 -1
  160. package/dist/apps/context-files-ui/assets/textile-C4jVoHG1.js +1 -0
  161. package/dist/apps/context-files-ui/assets/tiki-AK6FwT8q.js +1 -0
  162. package/dist/apps/context-files-ui/assets/toml-BPTmHmyx.js +1 -0
  163. package/dist/apps/context-files-ui/assets/{ttcn-GvRgs2AT.js → ttcn-PPSTk1ow.js} +1 -1
  164. package/dist/apps/context-files-ui/assets/{ttcn-cfg-CGCXz7Vo.js → ttcn-cfg-2b4Gb5sE.js} +1 -1
  165. package/dist/apps/context-files-ui/assets/turtle-Cx3rYX2g.js +1 -0
  166. package/dist/apps/context-files-ui/assets/{verilog-DVCHmufx.js → verilog-7LoJAqYT.js} +1 -1
  167. package/dist/apps/context-files-ui/assets/vhdl-kS471soi.js +1 -0
  168. package/dist/apps/{chat-ui/assets/xquery-5f0hn7cg.js → context-files-ui/assets/xquery-BKJx4mf9.js} +1 -1
  169. package/dist/apps/context-files-ui/assets/z80-Co3PbHdE.js +1 -0
  170. package/dist/apps/context-files-ui/index.html +5 -3
  171. package/dist/apps/vscode-artifacts/latest.vsix +0 -0
  172. package/dist/apps/vscode-artifacts/pibo-vscode-ext-2.2.0.vsix +0 -0
  173. package/dist/auth/better-auth.js +223 -30
  174. package/dist/auth/cli.js +10 -1
  175. package/dist/auth/machine-keys.js +8 -4
  176. package/dist/auth/openai-codex-usage.js +4 -4
  177. package/dist/cli-session/fakeSessionSource.js +2 -2
  178. package/dist/cli-session/localSessionSource.js +2 -2
  179. package/dist/cli.js +3 -1
  180. package/dist/config/config.js +9 -4
  181. package/dist/core/compaction-prompt.js +3 -1
  182. package/dist/core/context-build.js +1 -0
  183. package/dist/core/pibo-home.js +24 -1
  184. package/dist/core/private-path.js +146 -0
  185. package/dist/core/profiles.js +8 -0
  186. package/dist/core/sensitive-data-redaction.js +36 -0
  187. package/dist/core/session-model.js +1 -0
  188. package/dist/core/session-router.js +219 -29
  189. package/dist/data/pibo-store.js +5 -1
  190. package/dist/gateway/server.js +9 -0
  191. package/dist/plugins/context-files.js +11 -0
  192. package/dist/plugins/registry.js +1 -0
  193. package/dist/providers/openai-gpt56.js +0 -11
  194. package/dist/reliability/store.js +5 -1
  195. package/dist/resources/lifecycle.js +13 -3
  196. package/dist/runs/resource-isolation.js +159 -8
  197. package/dist/runs/tools.js +44 -1
  198. package/dist/sessions/pibo-data-store.js +3 -0
  199. package/dist/tools/codex-browser-node-repl.js +4 -2
  200. package/dist/tools/codex-browser.js +1 -1
  201. package/dist/tools/codex-image-generation.js +4 -4
  202. package/dist/tools/runtime/node-backend.js +4 -1
  203. package/dist/tools/runtime/python-backend.js +4 -1
  204. package/dist/web-annotations/api.js +22 -2
  205. package/npm-shrinkwrap.json +16707 -0
  206. package/package.json +19 -14
  207. package/dist/apps/chat-ui/assets/asciiarmor-WLvjqI7d.js +0 -1
  208. package/dist/apps/chat-ui/assets/clike-CjmcUpt6.js +0 -1
  209. package/dist/apps/chat-ui/assets/cmake-i2VDNaRq.js +0 -1
  210. package/dist/apps/chat-ui/assets/cobol-BwO6DF08.js +0 -1
  211. package/dist/apps/chat-ui/assets/coffeescript-BtivDvRz.js +0 -1
  212. package/dist/apps/chat-ui/assets/commonlisp-DFkEQdLP.js +0 -1
  213. package/dist/apps/chat-ui/assets/crystal-CU0NkcVL.js +0 -1
  214. package/dist/apps/chat-ui/assets/css-CbMZAQ1W.js +0 -1
  215. package/dist/apps/chat-ui/assets/dist-9v2ZXT6V.js +0 -11
  216. package/dist/apps/chat-ui/assets/dist-B1LVAytl.js +0 -9
  217. package/dist/apps/chat-ui/assets/dist-B5PTVnox.js +0 -1
  218. package/dist/apps/chat-ui/assets/dist-B5ZAfwf5.js +0 -1
  219. package/dist/apps/chat-ui/assets/dist-D1KyNDg5.js +0 -13
  220. package/dist/apps/chat-ui/assets/dist-DVtXxfHc.js +0 -1
  221. package/dist/apps/chat-ui/assets/dist-DW4Qrfbd.js +0 -2
  222. package/dist/apps/chat-ui/assets/dist-DmbsHdMC.js +0 -1
  223. package/dist/apps/chat-ui/assets/dist-DyvwuSFO.js +0 -1
  224. package/dist/apps/chat-ui/assets/dist-QQuDy4KA.js +0 -1
  225. package/dist/apps/chat-ui/assets/dist-RtHbJRPV.js +0 -1
  226. package/dist/apps/chat-ui/assets/groovy-Cmduloe1.js +0 -1
  227. package/dist/apps/chat-ui/assets/index-BPbNvcZe.css +0 -1
  228. package/dist/apps/chat-ui/assets/index-CIOf2uL2.js +0 -237
  229. package/dist/apps/chat-ui/assets/javascript-C5pDVaoP.js +0 -1
  230. package/dist/apps/chat-ui/assets/perl-D6YJObi_.js +0 -1
  231. package/dist/apps/chat-ui/assets/puppet-B_0GFuyD.js +0 -1
  232. package/dist/apps/chat-ui/assets/python-Cs7sNzy_.js +0 -1
  233. package/dist/apps/chat-ui/assets/r-CN5s4f3o.js +0 -1
  234. package/dist/apps/chat-ui/assets/ruby-BVPradRk.js +0 -1
  235. package/dist/apps/chat-ui/assets/scheme-CvNgHAnh.js +0 -1
  236. package/dist/apps/chat-ui/assets/sql-DYI2GwJR.js +0 -1
  237. package/dist/apps/chat-ui/assets/textile-Yg_UWn-t.js +0 -1
  238. package/dist/apps/chat-ui/assets/tiki-CC_ic8g0.js +0 -1
  239. package/dist/apps/chat-ui/assets/toml-B7gGzVkJ.js +0 -1
  240. package/dist/apps/chat-ui/assets/turtle-CwIpz2yy.js +0 -1
  241. package/dist/apps/chat-ui/assets/vhdl-BGDk4f1d.js +0 -1
  242. package/dist/apps/chat-ui/assets/z80-B7Dfb4UO.js +0 -1
  243. package/dist/apps/chat-vscode-web/assets/index-1ivRyjFs.js +0 -41
  244. package/dist/apps/chat-vscode-web/assets/index-Dupu1DzQ.css +0 -2
  245. package/dist/apps/context-files-ui/assets/asciiarmor-WLvjqI7d.js +0 -1
  246. package/dist/apps/context-files-ui/assets/clike-CjmcUpt6.js +0 -1
  247. package/dist/apps/context-files-ui/assets/cmake-i2VDNaRq.js +0 -1
  248. package/dist/apps/context-files-ui/assets/cobol-BwO6DF08.js +0 -1
  249. package/dist/apps/context-files-ui/assets/coffeescript-BtivDvRz.js +0 -1
  250. package/dist/apps/context-files-ui/assets/commonlisp-DFkEQdLP.js +0 -1
  251. package/dist/apps/context-files-ui/assets/crystal-CU0NkcVL.js +0 -1
  252. package/dist/apps/context-files-ui/assets/css-CbMZAQ1W.js +0 -1
  253. package/dist/apps/context-files-ui/assets/dist-B5PTVnox.js +0 -1
  254. package/dist/apps/context-files-ui/assets/dist-B5ZAfwf5.js +0 -1
  255. package/dist/apps/context-files-ui/assets/dist-BD262Ouw.js +0 -1
  256. package/dist/apps/context-files-ui/assets/dist-BKuGdcnX.js +0 -9
  257. package/dist/apps/context-files-ui/assets/dist-CHdx1Jri.js +0 -1
  258. package/dist/apps/context-files-ui/assets/dist-CULMH-fB.js +0 -11
  259. package/dist/apps/context-files-ui/assets/dist-Cjq6RWEt.js +0 -1
  260. package/dist/apps/context-files-ui/assets/dist-CntqFySz.js +0 -1
  261. package/dist/apps/context-files-ui/assets/dist-D1KyNDg5.js +0 -13
  262. package/dist/apps/context-files-ui/assets/dist-QQuDy4KA.js +0 -1
  263. package/dist/apps/context-files-ui/assets/dist-kPuQud7t.js +0 -2
  264. package/dist/apps/context-files-ui/assets/groovy-Cmduloe1.js +0 -1
  265. package/dist/apps/context-files-ui/assets/index-DZWsbuvg.js +0 -202
  266. package/dist/apps/context-files-ui/assets/javascript-C5pDVaoP.js +0 -1
  267. package/dist/apps/context-files-ui/assets/perl-D6YJObi_.js +0 -1
  268. package/dist/apps/context-files-ui/assets/puppet-B_0GFuyD.js +0 -1
  269. package/dist/apps/context-files-ui/assets/python-Cs7sNzy_.js +0 -1
  270. package/dist/apps/context-files-ui/assets/r-CN5s4f3o.js +0 -1
  271. package/dist/apps/context-files-ui/assets/ruby-BVPradRk.js +0 -1
  272. package/dist/apps/context-files-ui/assets/scheme-CvNgHAnh.js +0 -1
  273. package/dist/apps/context-files-ui/assets/sql-DYI2GwJR.js +0 -1
  274. package/dist/apps/context-files-ui/assets/textile-Yg_UWn-t.js +0 -1
  275. package/dist/apps/context-files-ui/assets/tiki-CC_ic8g0.js +0 -1
  276. package/dist/apps/context-files-ui/assets/toml-B7gGzVkJ.js +0 -1
  277. package/dist/apps/context-files-ui/assets/turtle-CwIpz2yy.js +0 -1
  278. package/dist/apps/context-files-ui/assets/vhdl-BGDk4f1d.js +0 -1
  279. package/dist/apps/context-files-ui/assets/z80-B7Dfb4UO.js +0 -1
  280. /package/dist/apps/chat-ui/assets/{brainfuck-CV9kufud.js → brainfuck-D5EjA2JK.js} +0 -0
  281. /package/dist/apps/chat-ui/assets/{clojure-De3QGfx6.js → clojure-BflJGmDX.js} +0 -0
  282. /package/dist/apps/chat-ui/assets/{cypher-Dke5QOzv.js → cypher-p9eYesGn.js} +0 -0
  283. /package/dist/apps/chat-ui/assets/{diff-B365LSoZ.js → diff-ChtP43wD.js} +0 -0
  284. /package/dist/apps/chat-ui/assets/{dtd-CBMymJ7O.js → dtd-DTF72YNO.js} +0 -0
  285. /package/dist/apps/chat-ui/assets/{ebnf-Dkum_1J8.js → ebnf-D4c0_ac3.js} +0 -0
  286. /package/dist/apps/chat-ui/assets/{eiffel-C446m6dI.js → eiffel-BEjRio4Q.js} +0 -0
  287. /package/dist/apps/chat-ui/assets/{elm-po1E9de0.js → elm-Cshzl8qu.js} +0 -0
  288. /package/dist/apps/chat-ui/assets/{fcl-DkEOamHd.js → fcl-ClOhbFR7.js} +0 -0
  289. /package/dist/apps/chat-ui/assets/{forth-dCg2_HVB.js → forth-Cezjo90N.js} +0 -0
  290. /package/dist/apps/chat-ui/assets/{fortran-3ZpXLFh1.js → fortran-Bt6PBEDR.js} +0 -0
  291. /package/dist/apps/chat-ui/assets/{gas-DMmxLZRI.js → gas-BHEdbvp9.js} +0 -0
  292. /package/dist/apps/chat-ui/assets/{gherkin-DUSFg2R6.js → gherkin-oBAE_ms0.js} +0 -0
  293. /package/dist/apps/chat-ui/assets/{haskell-Cyr255R9.js → haskell-BRsoo5mP.js} +0 -0
  294. /package/dist/apps/chat-ui/assets/{http-DszHFpc-.js → http-CLVgA2GD.js} +0 -0
  295. /package/dist/apps/chat-ui/assets/{idl-Cati9Nrv.js → idl-BUZw3wgd.js} +0 -0
  296. /package/dist/apps/chat-ui/assets/{julia-DlqY1cTU.js → julia-CQfgDRfP.js} +0 -0
  297. /package/dist/apps/chat-ui/assets/{livescript-C6p8-2W1.js → livescript-BXxG0Yva.js} +0 -0
  298. /package/dist/apps/chat-ui/assets/{mathematica-nDHZUMJT.js → mathematica-u8YMmbU0.js} +0 -0
  299. /package/dist/apps/chat-ui/assets/{mbox-DAaR0Hcz.js → mbox-BEMVcqjs.js} +0 -0
  300. /package/dist/apps/chat-ui/assets/{mirc-CCA0FRfl.js → mirc-C9zpzAZU.js} +0 -0
  301. /package/dist/apps/chat-ui/assets/{mllike-Cw3Iccsb.js → mllike-B45xgp2S.js} +0 -0
  302. /package/dist/apps/chat-ui/assets/{modelica-Czx80fNR.js → modelica-CqHI_q-D.js} +0 -0
  303. /package/dist/apps/chat-ui/assets/{mscgen-BmfuTbzG.js → mscgen-qgSLujhx.js} +0 -0
  304. /package/dist/apps/chat-ui/assets/{nginx-D9M2PQ4U.js → nginx-BMaDbqW3.js} +0 -0
  305. /package/dist/apps/chat-ui/assets/{octave-8jj96JiC.js → octave-D2Q8cUp1.js} +0 -0
  306. /package/dist/apps/chat-ui/assets/{oz-BmMq7iC4.js → oz-BwTct_5T.js} +0 -0
  307. /package/dist/apps/chat-ui/assets/{pascal-BgMr6XpT.js → pascal-Dp_KdFgX.js} +0 -0
  308. /package/dist/apps/chat-ui/assets/{pig-nx7uchs8.js → pig-AF4Hwhju.js} +0 -0
  309. /package/dist/apps/chat-ui/assets/{properties-CoavQdLC.js → properties-C357ku5U.js} +0 -0
  310. /package/dist/apps/chat-ui/assets/{protobuf-D5EWhcmc.js → protobuf-D1ij_kNL.js} +0 -0
  311. /package/dist/apps/chat-ui/assets/{q-BIB9pPtI.js → q-B9NhS7L_.js} +0 -0
  312. /package/dist/apps/chat-ui/assets/{rpm-Ct_Ck8mQ.js → rpm-gpDK5sbt.js} +0 -0
  313. /package/dist/apps/chat-ui/assets/{sas-DN4j74IF.js → sas-C2OyD2Y6.js} +0 -0
  314. /package/dist/apps/chat-ui/assets/{sieve-C2U1O5Z4.js → sieve-BAxa3IjF.js} +0 -0
  315. /package/dist/apps/chat-ui/assets/{smalltalk-DkYwYufV.js → smalltalk-BLp5-jwC.js} +0 -0
  316. /package/dist/apps/chat-ui/assets/{solr-BopnSD-v.js → solr-BBopId9w.js} +0 -0
  317. /package/dist/apps/chat-ui/assets/{sparql-Cpg3YQfd.js → sparql-Dz-mlCAC.js} +0 -0
  318. /package/dist/apps/chat-ui/assets/{spreadsheet-kRxtVt9J.js → spreadsheet-CTIncYxj.js} +0 -0
  319. /package/dist/apps/chat-ui/assets/{swift-DKNaLAK6.js → swift-DKB6_1j6.js} +0 -0
  320. /package/dist/apps/chat-ui/assets/{tcl-CQyXkgMH.js → tcl-BGfruO1u.js} +0 -0
  321. /package/dist/apps/chat-ui/assets/{tiddlywiki-dqVbkfX4.js → tiddlywiki-VlUiK86J.js} +0 -0
  322. /package/dist/apps/chat-ui/assets/{troff-Bq3z6oAu.js → troff-C2dAgh7P.js} +0 -0
  323. /package/dist/apps/chat-ui/assets/{vb-BmcHUM2C.js → vb-BthdM_4N.js} +0 -0
  324. /package/dist/apps/chat-ui/assets/{vbscript-Cs9dylre.js → vbscript-D9f6rSsU.js} +0 -0
  325. /package/dist/apps/chat-ui/assets/{velocity-CBWU0VCy.js → velocity-CqftRsjg.js} +0 -0
  326. /package/dist/apps/chat-ui/assets/{webidl-egXQEWlC.js → webidl-D5jiJvOU.js} +0 -0
  327. /package/dist/apps/chat-ui/assets/{yacas-DNs9XkmQ.js → yacas-CXXgtw0p.js} +0 -0
  328. /package/dist/apps/context-files-ui/assets/{brainfuck-CV9kufud.js → brainfuck-D5EjA2JK.js} +0 -0
  329. /package/dist/apps/context-files-ui/assets/{clojure-De3QGfx6.js → clojure-BflJGmDX.js} +0 -0
  330. /package/dist/apps/context-files-ui/assets/{cypher-Dke5QOzv.js → cypher-p9eYesGn.js} +0 -0
  331. /package/dist/apps/context-files-ui/assets/{diff-B365LSoZ.js → diff-ChtP43wD.js} +0 -0
  332. /package/dist/apps/context-files-ui/assets/{dtd-CBMymJ7O.js → dtd-DTF72YNO.js} +0 -0
  333. /package/dist/apps/context-files-ui/assets/{ebnf-Dkum_1J8.js → ebnf-D4c0_ac3.js} +0 -0
  334. /package/dist/apps/context-files-ui/assets/{eiffel-C446m6dI.js → eiffel-BEjRio4Q.js} +0 -0
  335. /package/dist/apps/context-files-ui/assets/{elm-po1E9de0.js → elm-Cshzl8qu.js} +0 -0
  336. /package/dist/apps/context-files-ui/assets/{fcl-DkEOamHd.js → fcl-ClOhbFR7.js} +0 -0
  337. /package/dist/apps/context-files-ui/assets/{forth-dCg2_HVB.js → forth-Cezjo90N.js} +0 -0
  338. /package/dist/apps/context-files-ui/assets/{fortran-3ZpXLFh1.js → fortran-Bt6PBEDR.js} +0 -0
  339. /package/dist/apps/context-files-ui/assets/{gas-DMmxLZRI.js → gas-BHEdbvp9.js} +0 -0
  340. /package/dist/apps/context-files-ui/assets/{gherkin-DUSFg2R6.js → gherkin-oBAE_ms0.js} +0 -0
  341. /package/dist/apps/context-files-ui/assets/{haskell-Cyr255R9.js → haskell-BRsoo5mP.js} +0 -0
  342. /package/dist/apps/context-files-ui/assets/{http-DszHFpc-.js → http-CLVgA2GD.js} +0 -0
  343. /package/dist/apps/context-files-ui/assets/{idl-Cati9Nrv.js → idl-BUZw3wgd.js} +0 -0
  344. /package/dist/apps/context-files-ui/assets/{julia-DlqY1cTU.js → julia-CQfgDRfP.js} +0 -0
  345. /package/dist/apps/context-files-ui/assets/{livescript-C6p8-2W1.js → livescript-BXxG0Yva.js} +0 -0
  346. /package/dist/apps/context-files-ui/assets/{mathematica-nDHZUMJT.js → mathematica-u8YMmbU0.js} +0 -0
  347. /package/dist/apps/context-files-ui/assets/{mbox-DAaR0Hcz.js → mbox-BEMVcqjs.js} +0 -0
  348. /package/dist/apps/context-files-ui/assets/{mirc-CCA0FRfl.js → mirc-C9zpzAZU.js} +0 -0
  349. /package/dist/apps/context-files-ui/assets/{mllike-Cw3Iccsb.js → mllike-B45xgp2S.js} +0 -0
  350. /package/dist/apps/context-files-ui/assets/{modelica-Czx80fNR.js → modelica-CqHI_q-D.js} +0 -0
  351. /package/dist/apps/context-files-ui/assets/{mscgen-BmfuTbzG.js → mscgen-qgSLujhx.js} +0 -0
  352. /package/dist/apps/context-files-ui/assets/{nginx-D9M2PQ4U.js → nginx-BMaDbqW3.js} +0 -0
  353. /package/dist/apps/context-files-ui/assets/{octave-8jj96JiC.js → octave-D2Q8cUp1.js} +0 -0
  354. /package/dist/apps/context-files-ui/assets/{oz-BmMq7iC4.js → oz-BwTct_5T.js} +0 -0
  355. /package/dist/apps/context-files-ui/assets/{pascal-BgMr6XpT.js → pascal-Dp_KdFgX.js} +0 -0
  356. /package/dist/apps/context-files-ui/assets/{pig-nx7uchs8.js → pig-AF4Hwhju.js} +0 -0
  357. /package/dist/apps/context-files-ui/assets/{properties-CoavQdLC.js → properties-C357ku5U.js} +0 -0
  358. /package/dist/apps/context-files-ui/assets/{protobuf-D5EWhcmc.js → protobuf-D1ij_kNL.js} +0 -0
  359. /package/dist/apps/context-files-ui/assets/{q-BIB9pPtI.js → q-B9NhS7L_.js} +0 -0
  360. /package/dist/apps/context-files-ui/assets/{rpm-Ct_Ck8mQ.js → rpm-gpDK5sbt.js} +0 -0
  361. /package/dist/apps/context-files-ui/assets/{sas-DN4j74IF.js → sas-C2OyD2Y6.js} +0 -0
  362. /package/dist/apps/context-files-ui/assets/{sieve-C2U1O5Z4.js → sieve-BAxa3IjF.js} +0 -0
  363. /package/dist/apps/context-files-ui/assets/{smalltalk-DkYwYufV.js → smalltalk-BLp5-jwC.js} +0 -0
  364. /package/dist/apps/context-files-ui/assets/{solr-BopnSD-v.js → solr-BBopId9w.js} +0 -0
  365. /package/dist/apps/context-files-ui/assets/{sparql-Cpg3YQfd.js → sparql-Dz-mlCAC.js} +0 -0
  366. /package/dist/apps/context-files-ui/assets/{spreadsheet-kRxtVt9J.js → spreadsheet-CTIncYxj.js} +0 -0
  367. /package/dist/apps/context-files-ui/assets/{swift-DKNaLAK6.js → swift-DKB6_1j6.js} +0 -0
  368. /package/dist/apps/context-files-ui/assets/{tcl-CQyXkgMH.js → tcl-BGfruO1u.js} +0 -0
  369. /package/dist/apps/context-files-ui/assets/{tiddlywiki-dqVbkfX4.js → tiddlywiki-VlUiK86J.js} +0 -0
  370. /package/dist/apps/context-files-ui/assets/{troff-Bq3z6oAu.js → troff-C2dAgh7P.js} +0 -0
  371. /package/dist/apps/context-files-ui/assets/{vb-BmcHUM2C.js → vb-BthdM_4N.js} +0 -0
  372. /package/dist/apps/context-files-ui/assets/{vbscript-Cs9dylre.js → vbscript-D9f6rSsU.js} +0 -0
  373. /package/dist/apps/context-files-ui/assets/{velocity-CBWU0VCy.js → velocity-CqftRsjg.js} +0 -0
  374. /package/dist/apps/context-files-ui/assets/{webidl-egXQEWlC.js → webidl-D5jiJvOU.js} +0 -0
  375. /package/dist/apps/context-files-ui/assets/{yacas-DNs9XkmQ.js → yacas-CXXgtw0p.js} +0 -0
@@ -1,7 +1,8 @@
1
1
  import { spawn } from "node:child_process";
2
2
  import { createHash, randomUUID } from "node:crypto";
3
- import { chmod, lstat, mkdir, realpath, rm, rmdir, writeFile, } from "node:fs/promises";
4
- import { isAbsolute, join, relative, resolve, sep } from "node:path";
3
+ import { lstat, mkdir, realpath, rm, rmdir, writeFile, } from "node:fs/promises";
4
+ import { extname, isAbsolute, join, relative, resolve, sep } from "node:path";
5
+ import { protectPrivatePathsSync } from "../../core/private-path.js";
5
6
  import { CodexAppServerClient } from "./client.js";
6
7
  import { CODEX_APP_SERVER_PROTOCOL_NAME, CODEX_APP_SERVER_SUPPORTED_RANGE, CODEX_APP_SERVER_VERSION, } from "./protocol-version.js";
7
8
  const MAX_VERSION_OUTPUT_BYTES = 64 * 1024;
@@ -59,12 +60,13 @@ function isInside(root, candidate) {
59
60
  const child = relative(root, candidate);
60
61
  return child === "" || (!child.startsWith(`..${sep}`) && child !== ".." && !isAbsolute(child));
61
62
  }
62
- async function ensurePrivateDirectory(path) {
63
- await mkdir(path, { recursive: true, mode: PRIVATE_DIRECTORY_MODE });
64
- const metadata = await lstat(path);
65
- if (metadata.isSymbolicLink() || !metadata.isDirectory())
66
- throw new Error("runtime path is not a private directory");
67
- await chmod(path, PRIVATE_DIRECTORY_MODE);
63
+ async function ensurePrivateDirectories(paths) {
64
+ for (const path of paths) {
65
+ await mkdir(path, { recursive: true, mode: PRIVATE_DIRECTORY_MODE });
66
+ const metadata = await lstat(path);
67
+ if (metadata.isSymbolicLink() || !metadata.isDirectory())
68
+ throw new Error("runtime path is not a private directory");
69
+ }
68
70
  }
69
71
  async function ensurePrivateConfig(path) {
70
72
  try {
@@ -77,12 +79,17 @@ async function ensurePrivateConfig(path) {
77
79
  const metadata = await lstat(path);
78
80
  if (metadata.isSymbolicLink() || !metadata.isFile())
79
81
  throw new Error("runtime config is not a private regular file");
80
- await chmod(path, PRIVATE_FILE_MODE);
81
82
  }
82
83
  function nodeErrorCode(error) {
83
84
  const code = error?.code;
84
85
  return typeof code === "string" && /^[A-Z0-9_]+$/.test(code) ? code : undefined;
85
86
  }
87
+ function codexExecutableInvocation(executable, args) {
88
+ if (process.platform === "win32" && isAbsolute(executable) && [".js", ".cjs", ".mjs"].includes(extname(executable).toLowerCase())) {
89
+ return { command: process.execPath, args: [executable, ...args] };
90
+ }
91
+ return { command: executable, args: [...args] };
92
+ }
86
93
  export async function prepareCodexNativeInstancePaths(config, runtimeInstanceId) {
87
94
  if (!runtimeInstanceId.trim())
88
95
  throw new CodexNativeProcessError("home_unavailable", "Codex runtime instance id is required.");
@@ -92,8 +99,7 @@ export async function prepareCodexNativeInstancePaths(config, runtimeInstanceId)
92
99
  const root = join(canonicalHomeRoot, safeSegment(runtimeInstanceId));
93
100
  const codexHome = join(root, "codex-home");
94
101
  const sessions = join(root, "sessions");
95
- for (const path of [root, codexHome, sessions])
96
- await ensurePrivateDirectory(path);
102
+ await ensurePrivateDirectories([canonicalHomeRoot, root, codexHome, sessions]);
97
103
  const canonicalRoot = await realpath(root);
98
104
  for (const path of [codexHome, sessions]) {
99
105
  const canonical = await realpath(path);
@@ -102,6 +108,10 @@ export async function prepareCodexNativeInstancePaths(config, runtimeInstanceId)
102
108
  }
103
109
  const configFile = join(codexHome, "config.toml");
104
110
  await ensurePrivateConfig(configFile);
111
+ protectPrivatePathsSync([
112
+ ...([canonicalHomeRoot, root, codexHome, sessions].map((path) => ({ path, kind: "directory" }))),
113
+ { path: configFile, kind: "file" },
114
+ ]);
105
115
  return { root: canonicalRoot, codexHome: await realpath(codexHome), configFile, sessions: await realpath(sessions) };
106
116
  }
107
117
  catch {
@@ -117,17 +127,16 @@ export async function prepareCodexNativeSessionPaths(input) {
117
127
  const generationRoot = join(sessionRoot, safeSegment(input.sessionGeneration));
118
128
  let sessionDirectoryReady = false;
119
129
  try {
120
- await ensurePrivateDirectory(sessionRoot);
121
- sessionDirectoryReady = true;
122
130
  const processHome = join(generationRoot, "home");
123
131
  const temp = join(generationRoot, "tmp");
124
132
  const xdgCache = join(processHome, ".cache");
125
133
  const xdgConfig = join(processHome, ".config");
126
134
  const xdgData = join(processHome, ".local", "share");
127
135
  const xdgState = join(processHome, ".local", "state");
128
- for (const path of [generationRoot, processHome, temp, xdgCache, xdgConfig, xdgData, xdgState]) {
129
- await ensurePrivateDirectory(path);
130
- }
136
+ const privateDirectories = [sessionRoot, generationRoot, processHome, temp, xdgCache, xdgConfig, xdgData, xdgState];
137
+ await ensurePrivateDirectories(privateDirectories);
138
+ protectPrivatePathsSync(privateDirectories.map((path) => ({ path, kind: "directory" })));
139
+ sessionDirectoryReady = true;
131
140
  const canonicalGenerationRoot = await realpath(generationRoot);
132
141
  if (!isInside(instance.sessions, canonicalGenerationRoot))
133
142
  throw new Error("runtime generation escaped its session root");
@@ -209,7 +218,8 @@ async function probeCodexVersion(config, environment) {
209
218
  return await new Promise((resolveProbe) => {
210
219
  let child;
211
220
  try {
212
- child = spawn(config.executable, ["--version"], { env: environment, stdio: ["ignore", "pipe", "pipe"] });
221
+ const invocation = codexExecutableInvocation(config.executable, ["--version"]);
222
+ child = spawn(invocation.command, invocation.args, { env: environment, stdio: ["ignore", "pipe", "pipe"] });
213
223
  }
214
224
  catch (error) {
215
225
  resolveProbe({ status: "failed", errorCode: nodeErrorCode(error) });
@@ -413,18 +423,19 @@ export async function startCodexNativeAppServer(input) {
413
423
  let client;
414
424
  try {
415
425
  const capabilities = { experimentalApi: false };
426
+ const invocation = codexExecutableInvocation(input.config.executable, [
427
+ "app-server",
428
+ "--stdio",
429
+ "--strict-config",
430
+ "-c",
431
+ `tools.experimental_request_user_input.enabled=${input.config.experimentalUserInput}`,
432
+ "-c",
433
+ `features.default_mode_request_user_input=${input.config.experimentalUserInput}`,
434
+ ]);
416
435
  client = await CodexAppServerClient.start({
417
- command: input.config.executable,
436
+ command: invocation.command,
418
437
  fileCreationMask: 0o077,
419
- args: [
420
- "app-server",
421
- "--stdio",
422
- "--strict-config",
423
- "-c",
424
- `tools.experimental_request_user_input.enabled=${input.config.experimentalUserInput}`,
425
- "-c",
426
- `features.default_mode_request_user_input=${input.config.experimentalUserInput}`,
427
- ],
438
+ args: invocation.args,
428
439
  cwd: resolve(input.workspace),
429
440
  env: buildCodexNativeProcessEnvironment({
430
441
  config: input.config,
@@ -56,7 +56,9 @@ function optionalStringArray(value, label, maxItems = 512, maxLength = 256) {
56
56
  function buildDeveloperInstructions(resources) {
57
57
  if (!resources)
58
58
  return undefined;
59
- const contributions = resources.getContextContributions().filter((contribution) => contribution.id !== ENABLED_MCP_CONTEXT_ID && contribution.content?.trim());
59
+ const contributions = resources.getContextContributions().filter((contribution) => contribution.id !== ENABLED_MCP_CONTEXT_ID
60
+ && !contribution.nativeDiscovered
61
+ && contribution.content?.trim());
60
62
  if (contributions.length === 0)
61
63
  return undefined;
62
64
  if (contributions.length > MAX_CONTEXT_CONTRIBUTIONS) {
@@ -252,18 +254,18 @@ export class CodexNativeResourceDelivery {
252
254
  threadConfig;
253
255
  developerInstructions;
254
256
  skillRoots;
255
- skillPaths;
257
+ selectedSkills;
256
258
  expectedMcpServers;
257
259
  portableTools;
258
260
  mcpAccess;
259
261
  credentialIssuedAtMs;
260
262
  credentialExpiresAtMs;
261
- constructor(environment, threadConfig, developerInstructions, skillRoots, skillPaths, expectedMcpServers, portableTools, mcpAccess, credentialIssuedAtMs, credentialExpiresAtMs) {
263
+ constructor(environment, threadConfig, developerInstructions, skillRoots, selectedSkills, expectedMcpServers, portableTools, mcpAccess, credentialIssuedAtMs, credentialExpiresAtMs) {
262
264
  this.environment = environment;
263
265
  this.threadConfig = threadConfig;
264
266
  this.developerInstructions = developerInstructions;
265
267
  this.skillRoots = skillRoots;
266
- this.skillPaths = skillPaths;
268
+ this.selectedSkills = selectedSkills;
267
269
  this.expectedMcpServers = expectedMcpServers;
268
270
  this.portableTools = portableTools;
269
271
  this.mcpAccess = mcpAccess;
@@ -318,17 +320,26 @@ export class CodexNativeResourceDelivery {
318
320
  };
319
321
  expectedMcpServers.push({ name: serverName, toolNames: [...mcpAccess.allowedToolNames] });
320
322
  }
321
- const skillPaths = input.resources
322
- ? await Promise.all(input.resources.getSkillPaths("materialized").map(async (path) => await realpath(path)))
323
+ const selectedSkills = input.resources
324
+ ? await Promise.all(input.resources.getInspection().skills.flatMap((skill) => {
325
+ const path = skill.materializedPath;
326
+ return path ? [{ name: skill.name, path }] : [];
327
+ }).map(async (skill) => ({ ...skill, path: await realpath(skill.path) })))
323
328
  : [];
324
329
  const materializedSkillsRoot = input.resources?.getInspection().paths?.skills;
325
- const skillRoots = skillPaths.length > 0 && materializedSkillsRoot
330
+ const skillRoots = selectedSkills.length > 0 && materializedSkillsRoot
326
331
  ? [await realpath(materializedSkillsRoot)]
327
332
  : [];
328
- const threadConfig = Object.keys(codexMcpServers).length > 0
329
- ? { mcp_servers: asJsonValue(codexMcpServers) }
330
- : undefined;
331
- return new CodexNativeResourceDelivery(resourceEnvironment, threadConfig, buildDeveloperInstructions(input.resources), skillRoots, skillPaths, expectedMcpServers, input.portableTools, mcpAccess, credentialIssuedAtMs, credentialExpiresAtMs);
333
+ const threadConfig = {};
334
+ if (Object.keys(codexMcpServers).length > 0)
335
+ threadConfig.mcp_servers = asJsonValue(codexMcpServers);
336
+ if (input.nativeSubagentsEnabled !== undefined) {
337
+ threadConfig.features = input.nativeSubagentsEnabled
338
+ ? { multi_agent: true, multi_agent_v2: true }
339
+ : { multi_agent: false, multi_agent_v2: false };
340
+ threadConfig.agents = { enabled: input.nativeSubagentsEnabled };
341
+ }
342
+ return new CodexNativeResourceDelivery(resourceEnvironment, Object.keys(threadConfig).length > 0 ? threadConfig : undefined, buildDeveloperInstructions(input.resources), skillRoots, selectedSkills, expectedMcpServers, input.portableTools, mcpAccess, credentialIssuedAtMs, credentialExpiresAtMs);
332
343
  }
333
344
  catch (error) {
334
345
  if (mcpAccess && input.portableTools)
@@ -382,20 +393,32 @@ export class CodexNativeResourceDelivery {
382
393
  throw new Error("Codex could not load the selected Pibo skills.");
383
394
  }
384
395
  const loadedPaths = new Set();
396
+ const loadedSkills = new Map();
385
397
  for (const entry of response.data) {
386
398
  if (!isRecord(entry) || !Array.isArray(entry.skills) || !Array.isArray(entry.errors)) {
387
399
  throw new Error("Codex skills/list returned an invalid entry.");
388
400
  }
389
401
  for (const skill of entry.skills) {
390
- if (!isRecord(skill) || typeof skill.path !== "string" || typeof skill.enabled !== "boolean") {
402
+ if (!isRecord(skill) || typeof skill.name !== "string" || typeof skill.path !== "string" || typeof skill.enabled !== "boolean") {
391
403
  throw new Error("Codex skills/list returned an invalid skill.");
392
404
  }
393
- if (skill.enabled)
394
- loadedPaths.add(await realpath(skill.path).catch(() => skill.path));
405
+ if (skill.enabled) {
406
+ const path = await realpath(skill.path).catch(() => skill.path);
407
+ loadedPaths.add(path);
408
+ const sameNamePaths = loadedSkills.get(skill.name) ?? new Set();
409
+ sameNamePaths.add(path);
410
+ loadedSkills.set(skill.name, sameNamePaths);
411
+ }
395
412
  }
396
413
  }
397
- if (this.skillPaths.some((path) => !loadedPaths.has(path))) {
398
- throw new Error("Codex did not load every selected Pibo skill.");
414
+ for (const skill of this.selectedSkills) {
415
+ const sameNamePaths = loadedSkills.get(skill.name) ?? new Set();
416
+ const conflictingPath = [...sameNamePaths].find((path) => path !== skill.path);
417
+ if (conflictingPath) {
418
+ throw new Error(`Selected Pibo skill "${skill.name}" conflicts with a native Codex skill; explicit Pibo-skill precedence cannot be guaranteed.`);
419
+ }
420
+ if (!loadedPaths.has(skill.path))
421
+ throw new Error(`Codex did not load selected Pibo skill "${skill.name}".`);
399
422
  }
400
423
  }
401
424
  async verifyThread(client, threadId) {
@@ -217,11 +217,12 @@ function toolFailed(item) {
217
217
  return false;
218
218
  return ["declined", "failed", "error"].includes(item.status.toLowerCase());
219
219
  }
220
- function newPendingTurn() {
220
+ function newPendingTurn(kind = "turn") {
221
221
  const completion = deferred();
222
222
  const turnIdReady = deferred();
223
223
  void completion.promise.catch(() => { });
224
224
  return {
225
+ kind,
225
226
  completion,
226
227
  turnIdReady,
227
228
  turnIdReadySettled: false,
@@ -238,6 +239,8 @@ function newPendingTurn() {
238
239
  reasoningSummaryParts: new Map(),
239
240
  reasoningContentParts: new Map(),
240
241
  completedReasoningItems: new Set(),
242
+ compactionStarted: false,
243
+ compactionEnded: false,
241
244
  startedTools: new Map(),
242
245
  completedTools: new Set(),
243
246
  };
@@ -311,6 +314,36 @@ export class CodexNativeTurnController {
311
314
  throw error;
312
315
  }
313
316
  }
317
+ async compact() {
318
+ if (this.disposed)
319
+ throw new Error("Codex native turn controller is disposed.");
320
+ if (this.pending)
321
+ throw new Error("Codex native session already has an active turn.");
322
+ const pending = newPendingTurn("compaction");
323
+ this.pending = pending;
324
+ this.ensureCompactionStarted(pending);
325
+ try {
326
+ await this.client.request("thread/compact/start", { threadId: this.threads.thread.id });
327
+ await pending.completion.promise;
328
+ }
329
+ catch (error) {
330
+ if (!pending.terminal && this.pending === pending) {
331
+ const normalized = error instanceof Error ? error : new Error("Codex compaction could not be completed.");
332
+ if (pending.started || pending.turnId) {
333
+ this.failActiveTurn(pending, normalized, runtimeSessionErrorDetails(safeDiagnosticText(normalized.message)));
334
+ }
335
+ else {
336
+ this.finishCompaction(pending, {
337
+ aborted: false,
338
+ errorMessage: safeDiagnosticText(normalized.message),
339
+ });
340
+ this.pending = undefined;
341
+ this.resolveTurnId(pending, undefined);
342
+ }
343
+ }
344
+ throw error;
345
+ }
346
+ }
314
347
  async steer(text, clientUserMessageId) {
315
348
  const pending = this.pending;
316
349
  if (!pending || pending.terminal)
@@ -350,6 +383,12 @@ export class CodexNativeTurnController {
350
383
  const pending = this.pending;
351
384
  this.pending = undefined;
352
385
  if (pending && !pending.terminal) {
386
+ if ((pending.kind === "compaction" || pending.compactionStarted) && !pending.compactionEnded) {
387
+ this.finishCompaction(pending, {
388
+ aborted: true,
389
+ errorMessage: "Codex native compaction was interrupted because the session was disposed.",
390
+ });
391
+ }
353
392
  pending.terminal = true;
354
393
  this.resolveTurnId(pending, undefined);
355
394
  pending.completion.reject(new CodexAppServerClientError("closed", "Codex native turn controller was disposed"));
@@ -636,7 +675,7 @@ export class CodexNativeTurnController {
636
675
  if (item.type === "reasoning")
637
676
  this.ensureReasoningStarted(pending, item.id);
638
677
  else if (item.type === "contextCompaction") {
639
- this.emit({ type: "compaction_start", reason: "codex_context_compaction" });
678
+ this.ensureCompactionStarted(pending);
640
679
  }
641
680
  else {
642
681
  this.ensureToolStarted(pending, item);
@@ -672,9 +711,7 @@ export class CodexNativeTurnController {
672
711
  return;
673
712
  }
674
713
  if (item.type === "contextCompaction") {
675
- this.emit({
676
- type: "compaction_end",
677
- reason: "codex_context_compaction",
714
+ this.finishCompaction(pending, {
678
715
  result: redactCodexNativeValue(item),
679
716
  aborted: false,
680
717
  });
@@ -692,6 +729,25 @@ export class CodexNativeTurnController {
692
729
  isError: toolFailed(item),
693
730
  });
694
731
  }
732
+ ensureCompactionStarted(pending) {
733
+ if (pending.compactionStarted)
734
+ return;
735
+ pending.compactionStarted = true;
736
+ this.emit({ type: "compaction_start", reason: "codex_context_compaction" });
737
+ }
738
+ finishCompaction(pending, input) {
739
+ this.ensureCompactionStarted(pending);
740
+ if (pending.compactionEnded)
741
+ return;
742
+ pending.compactionEnded = true;
743
+ this.emit({
744
+ type: "compaction_end",
745
+ reason: "codex_context_compaction",
746
+ ...(input.result !== undefined ? { result: input.result } : {}),
747
+ aborted: input.aborted,
748
+ ...(input.errorMessage ? { errorMessage: input.errorMessage } : {}),
749
+ });
750
+ }
695
751
  assistantIndex(pending, itemId) {
696
752
  const existing = pending.assistantIndices.get(itemId);
697
753
  if (existing !== undefined)
@@ -781,6 +837,13 @@ export class CodexNativeTurnController {
781
837
  pending.completion.resolve(persistedTurn);
782
838
  }
783
839
  finishIncompleteItems(pending, status) {
840
+ if ((pending.kind === "compaction" || pending.compactionStarted) && !pending.compactionEnded) {
841
+ this.finishCompaction(pending, {
842
+ aborted: status === "interrupted",
843
+ ...(status === "failed" ? { errorMessage: "Codex compaction ended before item/completed." } : {}),
844
+ result: { status },
845
+ });
846
+ }
784
847
  for (const [itemId, text] of pending.assistantBuffers) {
785
848
  if (pending.completedAssistantItems.has(itemId) || !text)
786
849
  continue;
@@ -7,7 +7,7 @@ import { defaultOmpRuntimeConfig, OMP_RUNTIME_CONFIG_SCHEMA, parseOmpRuntimeConf
7
7
  import { OmpHostToolBridge } from "./host-tools.js";
8
8
  import { emptyOmpHistoryPage, inspectOmpHistory, readOmpHistory } from "./history.js";
9
9
  import { OMP_MODEL_OPTIONS_SCHEMA, OMP_MODEL_PROVIDER_ID, OMP_REASONING_VALUES, parseOmpReasoning, readOmpModelCatalog, setOmpModel, } from "./models.js";
10
- import { buildOmpProcessEnvironment, diagnoseOmpRuntime, disposeOmpSessionPaths, prepareOmpSessionPaths, resolveOmpCommand, } from "./process.js";
10
+ import { buildOmpProcessEnvironment, diagnoseOmpRuntime, disposeOmpSessionPaths, prepareOmpSessionPaths, resetOmpNativeSession, resolveOmpCommand, } from "./process.js";
11
11
  import { OmpResourceDelivery } from "./resource-delivery.js";
12
12
  import { OMP_ADAPTER_ID, OMP_ADAPTER_VERSION, OmpThreadController, readOmpAvailableCommands } from "./thread.js";
13
13
  import { OmpRpcTurnController } from "./turn.js";
@@ -56,10 +56,39 @@ function ompCapabilities() {
56
56
  statusInspection: false,
57
57
  },
58
58
  skills: { support: "materialized", modes: ["omp-custom-directories"] },
59
- context: {
60
- support: "unsupported",
61
- reason: "OMP loads project context via its own AGENTS.md/rules discovery in the session cwd; Pibo has no injection seam and does not mutate the user's workspace.",
59
+ context: { support: "materialized", modes: ["native-project-discovery", "omp-append-system-prompt"] },
60
+ contextDiscovery: {
61
+ supported: true,
62
+ configurable: false,
63
+ enabledByDefault: true,
64
+ strategy: "omp-project",
65
+ knownFileNames: ["AGENTS.md"],
66
+ knownUserRelativePaths: [
67
+ ".claude/CLAUDE.md",
68
+ ".codex/AGENTS.md",
69
+ ".gemini/GEMINI.md",
70
+ ".config/opencode/AGENTS.md",
71
+ ".copilot/copilot-instructions.md",
72
+ ],
73
+ knownCwdRelativePaths: [
74
+ ".claude/CLAUDE.md",
75
+ ".gemini/GEMINI.md",
76
+ ".github/copilot-instructions.md",
77
+ ],
78
+ knownRelativePaths: [
79
+ ".omp/AGENTS.md",
80
+ ],
81
+ knownAncestorRelativePaths: [
82
+ ".agent/AGENTS.md",
83
+ ".agents/AGENTS.md",
84
+ ],
85
+ },
86
+ nativeSubagents: {
87
+ supported: true,
88
+ configurable: true,
89
+ enabledByDefault: true,
62
90
  },
91
+ historyImport: true,
63
92
  auth: {
64
93
  status: true,
65
94
  methods: OMP_AUTH_METHODS,
@@ -382,15 +411,21 @@ export class OmpAgentRuntimeAdapter {
382
411
  piboSessionId: input.piboSession.id,
383
412
  sessionGeneration: randomUUID(),
384
413
  });
385
- // Materialize BEFORE spawn (MUST-FIX #3): OMP reads config.yml at startup.
386
- const resourceDelivery = new OmpResourceDelivery(this.parsed, paths, input.services?.resources);
387
- await resourceDelivery.prepare();
414
+ if (binding.state === "unbound")
415
+ await resetOmpNativeSession(paths);
416
+ if (input.historyHandoff?.mode === "import" && binding.state === "bound") {
417
+ throw new Error("OMP portable history import requires a new native session.");
418
+ }
419
+ // Materialize BEFORE spawn: OMP reads config.yml and append-system-prompt at startup.
420
+ const resourceDelivery = new OmpResourceDelivery(this.parsed, paths, input.services?.resources, input.historyHandoff, input.profile.nativeSubagents ?? this.descriptor.capabilities.nativeSubagents.enabledByDefault);
421
+ const resourceResult = await resourceDelivery.prepare();
422
+ input.services?.resources?.recordAdapterDelivery?.(resourceResult.reports, resourceResult.diagnostics);
388
423
  const environment = buildOmpProcessEnvironment({
389
424
  paths,
390
425
  config: this.parsed,
391
426
  baseEnvironment: process.env,
392
427
  });
393
- const command = resolveOmpCommand(this.parsed, paths);
428
+ const command = resolveOmpCommand(this.parsed, paths, resourceDelivery.appendSystemPromptPath);
394
429
  const client = new OmpRpcClient({
395
430
  startupTimeoutMs: this.parsed.startupTimeoutMs,
396
431
  requestTimeoutMs: this.parsed.requestTimeoutMs,
@@ -2,6 +2,7 @@ import { spawn } from "node:child_process";
2
2
  import { randomUUID } from "node:crypto";
3
3
  import { mkdir, rm, stat, writeFile } from "node:fs/promises";
4
4
  import { dirname, join, resolve } from "node:path";
5
+ import { protectPrivateFileSync, protectPrivatePathsSync } from "../../core/private-path.js";
5
6
  import { OmpRpcClient } from "./client.js";
6
7
  const MAX_VERSION_OUTPUT_BYTES = 256 * 1024;
7
8
  const PRIVATE_DIRECTORY_MODE = 0o700;
@@ -23,17 +24,20 @@ function nodeErrorCode(error) {
23
24
  ? (error.code ?? undefined)
24
25
  : undefined;
25
26
  }
26
- async function ensurePrivateDirectory(path) {
27
- await mkdir(path, { recursive: true, mode: PRIVATE_DIRECTORY_MODE });
27
+ async function ensurePrivateDirectories(paths) {
28
+ for (const path of paths)
29
+ await mkdir(path, { recursive: true, mode: PRIVATE_DIRECTORY_MODE });
30
+ protectPrivatePathsSync(paths.map((path) => ({ path, kind: "directory" })));
28
31
  }
29
32
  async function ensurePrivateConfig(path) {
30
- await mkdir(dirname(path), { recursive: true, mode: PRIVATE_DIRECTORY_MODE });
33
+ await ensurePrivateDirectories([dirname(path)]);
31
34
  try {
32
35
  await stat(path);
33
36
  }
34
37
  catch {
35
38
  await writeFile(path, "", { mode: PRIVATE_FILE_MODE });
36
39
  }
40
+ protectPrivateFileSync(path);
37
41
  }
38
42
  export async function prepareOmpInstancePaths(config, runtimeInstanceId) {
39
43
  const root = resolve(config.homeRoot, safeSegment(runtimeInstanceId) || "orp");
@@ -68,11 +72,7 @@ export async function prepareOmpSessionPaths(input) {
68
72
  // re-attaches to the same native session files.
69
73
  sessionDir: join(sessionRoot, "omp-sessions"),
70
74
  };
71
- await ensurePrivateDirectory(instanceRoot);
72
- await ensurePrivateDirectory(paths.agentDir);
73
- await ensurePrivateDirectory(paths.skills);
74
- await ensurePrivateDirectory(paths.context);
75
- await ensurePrivateDirectory(paths.sessionDir);
75
+ await ensurePrivateDirectories([instanceRoot, paths.agentDir, paths.skills, paths.context, paths.sessionDir]);
76
76
  await ensurePrivateConfig(paths.config);
77
77
  return paths;
78
78
  }
@@ -84,6 +84,14 @@ export async function prepareOmpSessionPaths(input) {
84
84
  export async function disposeOmpSessionPaths(paths) {
85
85
  await rm(paths.root, { recursive: true, force: true });
86
86
  }
87
+ /** Ensure an unbound/start-fresh Pibo binding cannot inherit an older OMP transcript or portable handoff. */
88
+ export async function resetOmpNativeSession(paths) {
89
+ await Promise.all([
90
+ rm(paths.sessionDir, { recursive: true, force: true }),
91
+ rm(paths.context, { recursive: true, force: true }),
92
+ ]);
93
+ await ensurePrivateDirectories([paths.sessionDir, paths.context]);
94
+ }
87
95
  /**
88
96
  * Build the environment for the OMP child. The agent dir is redirected via
89
97
  * `PI_CODING_AGENT_DIR` (and `PI_CONFIG_DIR`) so all OMP user-global state is
@@ -275,9 +283,17 @@ export async function startOmpProcess(input) {
275
283
  * config-parse time (config.ompEntry), so the command is never resolved against
276
284
  * the arbitrary session workspace.
277
285
  */
278
- export function resolveOmpCommand(config, paths) {
286
+ export function resolveOmpCommand(config, paths, appendSystemPromptPath) {
279
287
  if (!config.ompEntry) {
280
288
  throw new Error("OMP CLI entry is not configured; set config.ompEntry to an absolute CLI path.");
281
289
  }
282
- return [config.bunExecutable, config.ompEntry, "--mode", "rpc", "--session-dir", paths.sessionDir];
290
+ return [
291
+ config.bunExecutable,
292
+ config.ompEntry,
293
+ "--mode",
294
+ "rpc",
295
+ "--session-dir",
296
+ paths.sessionDir,
297
+ ...(appendSystemPromptPath ? ["--append-system-prompt", appendSystemPromptPath] : []),
298
+ ];
283
299
  }