@pasko70/pibo 2.1.1 → 2.2.1

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 (376) 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 +31 -11
  25. package/dist/apps/chat/chat-files.js +19 -6
  26. package/dist/apps/chat/chat-request-normalizers.js +19 -0
  27. package/dist/apps/chat/trace.js +5 -0
  28. package/dist/apps/chat/web-app.js +55 -6
  29. package/dist/apps/chat-ui/assets/{apl-14BqhLYK.js → apl-gfMMiTNf.js} +1 -1
  30. package/dist/apps/chat-ui/assets/asciiarmor-C_eisQCp.js +1 -0
  31. package/dist/apps/{context-files-ui/assets/asn1-Bg4FbdCg.js → chat-ui/assets/asn1-DCl_8MCW.js} +1 -1
  32. package/dist/apps/{context-files-ui/assets/asterisk-B2MO-X4d.js → chat-ui/assets/asterisk-BEn0Cwpx.js} +1 -1
  33. package/dist/apps/chat-ui/assets/clike-D_6L3tnO.js +1 -0
  34. package/dist/apps/chat-ui/assets/cmake-84nbDH0I.js +1 -0
  35. package/dist/apps/chat-ui/assets/cobol-DHLQUbN7.js +1 -0
  36. package/dist/apps/chat-ui/assets/coffeescript-De_zI4J0.js +1 -0
  37. package/dist/apps/chat-ui/assets/commonlisp-DgAKBe0r.js +1 -0
  38. package/dist/apps/chat-ui/assets/crystal-Bsdphhtm.js +1 -0
  39. package/dist/apps/chat-ui/assets/css-CnaYoQib.js +1 -0
  40. package/dist/apps/chat-ui/assets/{d-TPqSVaHM.js → d-DWkQyNnU.js} +1 -1
  41. package/dist/apps/{context-files-ui/assets/dist-B7gXtTZC.js → chat-ui/assets/dist-B7DmqUNk.js} +1 -1
  42. package/dist/apps/chat-ui/assets/dist-BJ-TIk3N.js +1 -0
  43. package/dist/apps/chat-ui/assets/dist-BxYxDl5K.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-DxEGebCR.js → chat-ui/assets/dist-CvYwol1J.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-Dx7GMMHU.js +1 -0
  53. package/dist/apps/chat-ui/assets/dist-LCx98fA_.js +11 -0
  54. package/dist/apps/chat-ui/assets/{dist-DotDq_kD.js → dist-RKTRnzGb.js} +1 -1
  55. package/dist/apps/chat-ui/assets/dist-S3zJGntM.js +1 -0
  56. package/dist/apps/chat-ui/assets/{dist-sZgJkWZb.js → dist-SF43opz6.js} +1 -1
  57. package/dist/apps/{context-files-ui/assets/dist-BkUONE3N.js → chat-ui/assets/dist-XVYGiB-c.js} +1 -1
  58. package/dist/apps/chat-ui/assets/dist-eddbbGyw.js +1 -0
  59. package/dist/apps/chat-ui/assets/dist-fPhZsAUX.js +1 -0
  60. package/dist/apps/chat-ui/assets/dist-mpRGeo_R.js +2 -0
  61. package/dist/apps/chat-ui/assets/{dockerfile-CJb2sekW.js → dockerfile-DJkHQgkl.js} +1 -1
  62. package/dist/apps/chat-ui/assets/{dylan-08Azy1NK.js → dylan-BCDoL_-p.js} +1 -1
  63. package/dist/apps/chat-ui/assets/{ecl-dhxjHL8y.js → ecl-BVIeWmwY.js} +1 -1
  64. package/dist/apps/{context-files-ui/assets/erlang-BD5LkVkR.js → chat-ui/assets/erlang-BV0c4Hdn.js} +1 -1
  65. package/dist/apps/chat-ui/assets/{factor-B2EMQZkP.js → factor-LKH5gN8L.js} +1 -1
  66. package/dist/apps/chat-ui/assets/groovy-CUpZ7dEl.js +1 -0
  67. package/dist/apps/chat-ui/assets/{haxe-BJVKtprM.js → haxe-DjVOVvNP.js} +1 -1
  68. package/dist/apps/chat-ui/assets/index-2qGRr2cm.js +226 -0
  69. package/dist/apps/chat-ui/assets/index-QkfBrh9Q.css +1 -0
  70. package/dist/apps/chat-ui/assets/javascript-DoL9Wb-Q.js +1 -0
  71. package/dist/apps/chat-ui/assets/{lua-BxuTHaF7.js → lua-CiA1ziua.js} +1 -1
  72. package/dist/apps/chat-ui/assets/{mumps-Ds_ZaumL.js → mumps-BSzj6Xyz.js} +1 -1
  73. package/dist/apps/{context-files-ui/assets/nsis-DOo3SJmd.js → chat-ui/assets/nsis-CfSuhXs5.js} +1 -1
  74. package/dist/apps/chat-ui/assets/{ntriples-DLHGTvHs.js → ntriples-B9h1VB_g.js} +1 -1
  75. package/dist/apps/chat-ui/assets/perl-BkSkiI9m.js +1 -0
  76. package/dist/apps/chat-ui/assets/{powershell-B4IPkVxR.js → powershell-BcIto6Sf.js} +1 -1
  77. package/dist/apps/{context-files-ui/assets/pug-QU72BPAa.js → chat-ui/assets/pug-Gsm0M45u.js} +1 -1
  78. package/dist/apps/chat-ui/assets/puppet-BZyAS7I4.js +1 -0
  79. package/dist/apps/chat-ui/assets/python-B_1Jd8HM.js +1 -0
  80. package/dist/apps/chat-ui/assets/r-CxDmU1I4.js +1 -0
  81. package/dist/apps/chat-ui/assets/ruby-BjXV7-Qa.js +1 -0
  82. package/dist/apps/chat-ui/assets/scheme-D9qYN0V5.js +1 -0
  83. package/dist/apps/chat-ui/assets/{shell-BjiMLAaM.js → shell-DwuoZtxw.js} +1 -1
  84. package/dist/apps/chat-ui/assets/{simple-mode-DnMbQuKW.js → simple-mode-DXiLM1-G.js} +1 -1
  85. package/dist/apps/chat-ui/assets/sql-DuQMFDvy.js +1 -0
  86. package/dist/apps/chat-ui/assets/{stex-BCRT8IJ3.js → stex-DNzd62Q_.js} +1 -1
  87. package/dist/apps/chat-ui/assets/{stylus-CARoeVE9.js → stylus-BOVgKnng.js} +1 -1
  88. package/dist/apps/chat-ui/assets/textile-C4jVoHG1.js +1 -0
  89. package/dist/apps/chat-ui/assets/tiki-AK6FwT8q.js +1 -0
  90. package/dist/apps/chat-ui/assets/toml-BPTmHmyx.js +1 -0
  91. package/dist/apps/chat-ui/assets/{ttcn-GvRgs2AT.js → ttcn-PPSTk1ow.js} +1 -1
  92. package/dist/apps/chat-ui/assets/{ttcn-cfg-CGCXz7Vo.js → ttcn-cfg-2b4Gb5sE.js} +1 -1
  93. package/dist/apps/chat-ui/assets/turtle-Cx3rYX2g.js +1 -0
  94. package/dist/apps/chat-ui/assets/{verilog-DVCHmufx.js → verilog-7LoJAqYT.js} +1 -1
  95. package/dist/apps/chat-ui/assets/vhdl-kS471soi.js +1 -0
  96. package/dist/apps/{context-files-ui/assets/xquery-5f0hn7cg.js → chat-ui/assets/xquery-BKJx4mf9.js} +1 -1
  97. package/dist/apps/chat-ui/assets/z80-Co3PbHdE.js +1 -0
  98. package/dist/apps/chat-ui/index.html +5 -3
  99. package/dist/apps/chat-vscode-web/assets/index-C0sMILFt.js +41 -0
  100. package/dist/apps/chat-vscode-web/assets/index-CF1-9PKU.css +2 -0
  101. package/dist/apps/chat-vscode-web/index.html +2 -2
  102. package/dist/apps/context-files-ui/assets/{apl-14BqhLYK.js → apl-gfMMiTNf.js} +1 -1
  103. package/dist/apps/context-files-ui/assets/asciiarmor-C_eisQCp.js +1 -0
  104. package/dist/apps/{chat-ui/assets/asn1-Bg4FbdCg.js → context-files-ui/assets/asn1-DCl_8MCW.js} +1 -1
  105. package/dist/apps/{chat-ui/assets/asterisk-B2MO-X4d.js → context-files-ui/assets/asterisk-BEn0Cwpx.js} +1 -1
  106. package/dist/apps/context-files-ui/assets/clike-D_6L3tnO.js +1 -0
  107. package/dist/apps/context-files-ui/assets/cmake-84nbDH0I.js +1 -0
  108. package/dist/apps/context-files-ui/assets/cobol-DHLQUbN7.js +1 -0
  109. package/dist/apps/context-files-ui/assets/coffeescript-De_zI4J0.js +1 -0
  110. package/dist/apps/context-files-ui/assets/commonlisp-DgAKBe0r.js +1 -0
  111. package/dist/apps/context-files-ui/assets/crystal-Bsdphhtm.js +1 -0
  112. package/dist/apps/context-files-ui/assets/css-CnaYoQib.js +1 -0
  113. package/dist/apps/context-files-ui/assets/{d-TPqSVaHM.js → d-DWkQyNnU.js} +1 -1
  114. package/dist/apps/{chat-ui/assets/dist-C6LPDFXU.js → context-files-ui/assets/dist-BAqbgxUS.js} +1 -1
  115. package/dist/apps/context-files-ui/assets/dist-BJ-TIk3N.js +1 -0
  116. package/dist/apps/context-files-ui/assets/dist-BcauuFwf.js +1 -0
  117. package/dist/apps/context-files-ui/assets/dist-BecMXs79.js +1 -0
  118. package/dist/apps/context-files-ui/assets/{dist-C-Jm45P4.js → dist-Ci2NSlf1.js} +1 -1
  119. package/dist/apps/context-files-ui/assets/dist-CqM4On9D.js +13 -0
  120. package/dist/apps/context-files-ui/assets/dist-CswnpKik.js +1 -0
  121. package/dist/apps/{chat-ui/assets/dist-I26VB0QO.js → context-files-ui/assets/dist-D-xpsbZI.js} +1 -1
  122. package/dist/apps/context-files-ui/assets/dist-DHvUPfrF.js +1 -0
  123. package/dist/apps/context-files-ui/assets/dist-DLJCGrGQ.js +1 -0
  124. package/dist/apps/context-files-ui/assets/{dist-DLMjd26T.js → dist-DMiglryg.js} +1 -1
  125. package/dist/apps/context-files-ui/assets/dist-DTeLDijr.js +9 -0
  126. package/dist/apps/context-files-ui/assets/{dist-DKoyMSNr.js → dist-DpF08Yd7.js} +1 -1
  127. package/dist/apps/context-files-ui/assets/dist-LCx98fA_.js +11 -0
  128. package/dist/apps/context-files-ui/assets/{dist-DotDq_kD.js → dist-RKTRnzGb.js} +1 -1
  129. package/dist/apps/context-files-ui/assets/dist-S3zJGntM.js +1 -0
  130. package/dist/apps/{chat-ui/assets/dist-BkUONE3N.js → context-files-ui/assets/dist-XVYGiB-c.js} +1 -1
  131. package/dist/apps/context-files-ui/assets/dist-eddbbGyw.js +1 -0
  132. package/dist/apps/context-files-ui/assets/dist-fPhZsAUX.js +1 -0
  133. package/dist/apps/context-files-ui/assets/dist-mpRGeo_R.js +2 -0
  134. package/dist/apps/context-files-ui/assets/{dockerfile-CJb2sekW.js → dockerfile-DJkHQgkl.js} +1 -1
  135. package/dist/apps/context-files-ui/assets/{dylan-08Azy1NK.js → dylan-BCDoL_-p.js} +1 -1
  136. package/dist/apps/context-files-ui/assets/{ecl-dhxjHL8y.js → ecl-BVIeWmwY.js} +1 -1
  137. package/dist/apps/{chat-ui/assets/erlang-BD5LkVkR.js → context-files-ui/assets/erlang-BV0c4Hdn.js} +1 -1
  138. package/dist/apps/context-files-ui/assets/{factor-B2EMQZkP.js → factor-LKH5gN8L.js} +1 -1
  139. package/dist/apps/context-files-ui/assets/groovy-CUpZ7dEl.js +1 -0
  140. package/dist/apps/context-files-ui/assets/{haxe-BJVKtprM.js → haxe-DjVOVvNP.js} +1 -1
  141. package/dist/apps/context-files-ui/assets/index-CkWXlBNn.js +191 -0
  142. package/dist/apps/context-files-ui/assets/{index-Cs4XQITe.css → index-D8TsUizd.css} +1 -1
  143. package/dist/apps/context-files-ui/assets/javascript-DoL9Wb-Q.js +1 -0
  144. package/dist/apps/context-files-ui/assets/{lua-BxuTHaF7.js → lua-CiA1ziua.js} +1 -1
  145. package/dist/apps/context-files-ui/assets/{mumps-Ds_ZaumL.js → mumps-BSzj6Xyz.js} +1 -1
  146. package/dist/apps/{chat-ui/assets/nsis-DOo3SJmd.js → context-files-ui/assets/nsis-CfSuhXs5.js} +1 -1
  147. package/dist/apps/context-files-ui/assets/{ntriples-DLHGTvHs.js → ntriples-B9h1VB_g.js} +1 -1
  148. package/dist/apps/context-files-ui/assets/perl-BkSkiI9m.js +1 -0
  149. package/dist/apps/context-files-ui/assets/{powershell-B4IPkVxR.js → powershell-BcIto6Sf.js} +1 -1
  150. package/dist/apps/{chat-ui/assets/pug-QU72BPAa.js → context-files-ui/assets/pug-Gsm0M45u.js} +1 -1
  151. package/dist/apps/context-files-ui/assets/puppet-BZyAS7I4.js +1 -0
  152. package/dist/apps/context-files-ui/assets/python-B_1Jd8HM.js +1 -0
  153. package/dist/apps/context-files-ui/assets/r-CxDmU1I4.js +1 -0
  154. package/dist/apps/context-files-ui/assets/ruby-BjXV7-Qa.js +1 -0
  155. package/dist/apps/context-files-ui/assets/scheme-D9qYN0V5.js +1 -0
  156. package/dist/apps/context-files-ui/assets/{shell-BjiMLAaM.js → shell-DwuoZtxw.js} +1 -1
  157. package/dist/apps/context-files-ui/assets/{simple-mode-DnMbQuKW.js → simple-mode-DXiLM1-G.js} +1 -1
  158. package/dist/apps/context-files-ui/assets/sql-DuQMFDvy.js +1 -0
  159. package/dist/apps/context-files-ui/assets/{stex-BCRT8IJ3.js → stex-DNzd62Q_.js} +1 -1
  160. package/dist/apps/context-files-ui/assets/{stylus-CARoeVE9.js → stylus-BOVgKnng.js} +1 -1
  161. package/dist/apps/context-files-ui/assets/textile-C4jVoHG1.js +1 -0
  162. package/dist/apps/context-files-ui/assets/tiki-AK6FwT8q.js +1 -0
  163. package/dist/apps/context-files-ui/assets/toml-BPTmHmyx.js +1 -0
  164. package/dist/apps/context-files-ui/assets/{ttcn-GvRgs2AT.js → ttcn-PPSTk1ow.js} +1 -1
  165. package/dist/apps/context-files-ui/assets/{ttcn-cfg-CGCXz7Vo.js → ttcn-cfg-2b4Gb5sE.js} +1 -1
  166. package/dist/apps/context-files-ui/assets/turtle-Cx3rYX2g.js +1 -0
  167. package/dist/apps/context-files-ui/assets/{verilog-DVCHmufx.js → verilog-7LoJAqYT.js} +1 -1
  168. package/dist/apps/context-files-ui/assets/vhdl-kS471soi.js +1 -0
  169. package/dist/apps/{chat-ui/assets/xquery-5f0hn7cg.js → context-files-ui/assets/xquery-BKJx4mf9.js} +1 -1
  170. package/dist/apps/context-files-ui/assets/z80-Co3PbHdE.js +1 -0
  171. package/dist/apps/context-files-ui/index.html +5 -3
  172. package/dist/apps/vscode-artifacts/latest.vsix +0 -0
  173. package/dist/apps/vscode-artifacts/pibo-vscode-ext-2.2.1.vsix +0 -0
  174. package/dist/auth/better-auth.js +223 -30
  175. package/dist/auth/cli.js +10 -1
  176. package/dist/auth/machine-keys.js +8 -4
  177. package/dist/auth/openai-codex-usage.js +4 -4
  178. package/dist/cli-session/fakeSessionSource.js +2 -2
  179. package/dist/cli-session/localSessionSource.js +2 -2
  180. package/dist/cli.js +3 -1
  181. package/dist/config/config.js +9 -4
  182. package/dist/core/compaction-prompt.js +3 -1
  183. package/dist/core/context-build.js +1 -0
  184. package/dist/core/pibo-home.js +24 -1
  185. package/dist/core/private-path.js +146 -0
  186. package/dist/core/profiles.js +17 -3
  187. package/dist/core/sensitive-data-redaction.js +36 -0
  188. package/dist/core/session-model.js +1 -0
  189. package/dist/core/session-router.js +226 -30
  190. package/dist/data/pibo-store.js +5 -1
  191. package/dist/gateway/server.js +9 -0
  192. package/dist/plugins/context-files.js +11 -0
  193. package/dist/plugins/registry.js +3 -0
  194. package/dist/providers/openai-gpt56.js +0 -11
  195. package/dist/reliability/store.js +5 -1
  196. package/dist/resources/lifecycle.js +13 -3
  197. package/dist/runs/resource-isolation.js +159 -8
  198. package/dist/runs/tools.js +44 -1
  199. package/dist/sessions/pibo-data-store.js +3 -0
  200. package/dist/tools/codex-browser-node-repl.js +4 -2
  201. package/dist/tools/codex-browser.js +1 -1
  202. package/dist/tools/codex-image-generation.js +4 -4
  203. package/dist/tools/runtime/node-backend.js +4 -1
  204. package/dist/tools/runtime/python-backend.js +4 -1
  205. package/dist/web-annotations/api.js +22 -2
  206. package/npm-shrinkwrap.json +16707 -0
  207. package/package.json +19 -14
  208. package/dist/apps/chat-ui/assets/asciiarmor-WLvjqI7d.js +0 -1
  209. package/dist/apps/chat-ui/assets/clike-CjmcUpt6.js +0 -1
  210. package/dist/apps/chat-ui/assets/cmake-i2VDNaRq.js +0 -1
  211. package/dist/apps/chat-ui/assets/cobol-BwO6DF08.js +0 -1
  212. package/dist/apps/chat-ui/assets/coffeescript-BtivDvRz.js +0 -1
  213. package/dist/apps/chat-ui/assets/commonlisp-DFkEQdLP.js +0 -1
  214. package/dist/apps/chat-ui/assets/crystal-CU0NkcVL.js +0 -1
  215. package/dist/apps/chat-ui/assets/css-CbMZAQ1W.js +0 -1
  216. package/dist/apps/chat-ui/assets/dist-9v2ZXT6V.js +0 -11
  217. package/dist/apps/chat-ui/assets/dist-B1LVAytl.js +0 -9
  218. package/dist/apps/chat-ui/assets/dist-B5PTVnox.js +0 -1
  219. package/dist/apps/chat-ui/assets/dist-B5ZAfwf5.js +0 -1
  220. package/dist/apps/chat-ui/assets/dist-D1KyNDg5.js +0 -13
  221. package/dist/apps/chat-ui/assets/dist-DVtXxfHc.js +0 -1
  222. package/dist/apps/chat-ui/assets/dist-DW4Qrfbd.js +0 -2
  223. package/dist/apps/chat-ui/assets/dist-DmbsHdMC.js +0 -1
  224. package/dist/apps/chat-ui/assets/dist-DyvwuSFO.js +0 -1
  225. package/dist/apps/chat-ui/assets/dist-QQuDy4KA.js +0 -1
  226. package/dist/apps/chat-ui/assets/dist-RtHbJRPV.js +0 -1
  227. package/dist/apps/chat-ui/assets/groovy-Cmduloe1.js +0 -1
  228. package/dist/apps/chat-ui/assets/index-BPbNvcZe.css +0 -1
  229. package/dist/apps/chat-ui/assets/index-CIOf2uL2.js +0 -237
  230. package/dist/apps/chat-ui/assets/javascript-C5pDVaoP.js +0 -1
  231. package/dist/apps/chat-ui/assets/perl-D6YJObi_.js +0 -1
  232. package/dist/apps/chat-ui/assets/puppet-B_0GFuyD.js +0 -1
  233. package/dist/apps/chat-ui/assets/python-Cs7sNzy_.js +0 -1
  234. package/dist/apps/chat-ui/assets/r-CN5s4f3o.js +0 -1
  235. package/dist/apps/chat-ui/assets/ruby-BVPradRk.js +0 -1
  236. package/dist/apps/chat-ui/assets/scheme-CvNgHAnh.js +0 -1
  237. package/dist/apps/chat-ui/assets/sql-DYI2GwJR.js +0 -1
  238. package/dist/apps/chat-ui/assets/textile-Yg_UWn-t.js +0 -1
  239. package/dist/apps/chat-ui/assets/tiki-CC_ic8g0.js +0 -1
  240. package/dist/apps/chat-ui/assets/toml-B7gGzVkJ.js +0 -1
  241. package/dist/apps/chat-ui/assets/turtle-CwIpz2yy.js +0 -1
  242. package/dist/apps/chat-ui/assets/vhdl-BGDk4f1d.js +0 -1
  243. package/dist/apps/chat-ui/assets/z80-B7Dfb4UO.js +0 -1
  244. package/dist/apps/chat-vscode-web/assets/index-1ivRyjFs.js +0 -41
  245. package/dist/apps/chat-vscode-web/assets/index-Dupu1DzQ.css +0 -2
  246. package/dist/apps/context-files-ui/assets/asciiarmor-WLvjqI7d.js +0 -1
  247. package/dist/apps/context-files-ui/assets/clike-CjmcUpt6.js +0 -1
  248. package/dist/apps/context-files-ui/assets/cmake-i2VDNaRq.js +0 -1
  249. package/dist/apps/context-files-ui/assets/cobol-BwO6DF08.js +0 -1
  250. package/dist/apps/context-files-ui/assets/coffeescript-BtivDvRz.js +0 -1
  251. package/dist/apps/context-files-ui/assets/commonlisp-DFkEQdLP.js +0 -1
  252. package/dist/apps/context-files-ui/assets/crystal-CU0NkcVL.js +0 -1
  253. package/dist/apps/context-files-ui/assets/css-CbMZAQ1W.js +0 -1
  254. package/dist/apps/context-files-ui/assets/dist-B5PTVnox.js +0 -1
  255. package/dist/apps/context-files-ui/assets/dist-B5ZAfwf5.js +0 -1
  256. package/dist/apps/context-files-ui/assets/dist-BD262Ouw.js +0 -1
  257. package/dist/apps/context-files-ui/assets/dist-BKuGdcnX.js +0 -9
  258. package/dist/apps/context-files-ui/assets/dist-CHdx1Jri.js +0 -1
  259. package/dist/apps/context-files-ui/assets/dist-CULMH-fB.js +0 -11
  260. package/dist/apps/context-files-ui/assets/dist-Cjq6RWEt.js +0 -1
  261. package/dist/apps/context-files-ui/assets/dist-CntqFySz.js +0 -1
  262. package/dist/apps/context-files-ui/assets/dist-D1KyNDg5.js +0 -13
  263. package/dist/apps/context-files-ui/assets/dist-QQuDy4KA.js +0 -1
  264. package/dist/apps/context-files-ui/assets/dist-kPuQud7t.js +0 -2
  265. package/dist/apps/context-files-ui/assets/groovy-Cmduloe1.js +0 -1
  266. package/dist/apps/context-files-ui/assets/index-DZWsbuvg.js +0 -202
  267. package/dist/apps/context-files-ui/assets/javascript-C5pDVaoP.js +0 -1
  268. package/dist/apps/context-files-ui/assets/perl-D6YJObi_.js +0 -1
  269. package/dist/apps/context-files-ui/assets/puppet-B_0GFuyD.js +0 -1
  270. package/dist/apps/context-files-ui/assets/python-Cs7sNzy_.js +0 -1
  271. package/dist/apps/context-files-ui/assets/r-CN5s4f3o.js +0 -1
  272. package/dist/apps/context-files-ui/assets/ruby-BVPradRk.js +0 -1
  273. package/dist/apps/context-files-ui/assets/scheme-CvNgHAnh.js +0 -1
  274. package/dist/apps/context-files-ui/assets/sql-DYI2GwJR.js +0 -1
  275. package/dist/apps/context-files-ui/assets/textile-Yg_UWn-t.js +0 -1
  276. package/dist/apps/context-files-ui/assets/tiki-CC_ic8g0.js +0 -1
  277. package/dist/apps/context-files-ui/assets/toml-B7gGzVkJ.js +0 -1
  278. package/dist/apps/context-files-ui/assets/turtle-CwIpz2yy.js +0 -1
  279. package/dist/apps/context-files-ui/assets/vhdl-BGDk4f1d.js +0 -1
  280. package/dist/apps/context-files-ui/assets/z80-B7Dfb4UO.js +0 -1
  281. /package/dist/apps/chat-ui/assets/{brainfuck-CV9kufud.js → brainfuck-D5EjA2JK.js} +0 -0
  282. /package/dist/apps/chat-ui/assets/{clojure-De3QGfx6.js → clojure-BflJGmDX.js} +0 -0
  283. /package/dist/apps/chat-ui/assets/{cypher-Dke5QOzv.js → cypher-p9eYesGn.js} +0 -0
  284. /package/dist/apps/chat-ui/assets/{diff-B365LSoZ.js → diff-ChtP43wD.js} +0 -0
  285. /package/dist/apps/chat-ui/assets/{dtd-CBMymJ7O.js → dtd-DTF72YNO.js} +0 -0
  286. /package/dist/apps/chat-ui/assets/{ebnf-Dkum_1J8.js → ebnf-D4c0_ac3.js} +0 -0
  287. /package/dist/apps/chat-ui/assets/{eiffel-C446m6dI.js → eiffel-BEjRio4Q.js} +0 -0
  288. /package/dist/apps/chat-ui/assets/{elm-po1E9de0.js → elm-Cshzl8qu.js} +0 -0
  289. /package/dist/apps/chat-ui/assets/{fcl-DkEOamHd.js → fcl-ClOhbFR7.js} +0 -0
  290. /package/dist/apps/chat-ui/assets/{forth-dCg2_HVB.js → forth-Cezjo90N.js} +0 -0
  291. /package/dist/apps/chat-ui/assets/{fortran-3ZpXLFh1.js → fortran-Bt6PBEDR.js} +0 -0
  292. /package/dist/apps/chat-ui/assets/{gas-DMmxLZRI.js → gas-BHEdbvp9.js} +0 -0
  293. /package/dist/apps/chat-ui/assets/{gherkin-DUSFg2R6.js → gherkin-oBAE_ms0.js} +0 -0
  294. /package/dist/apps/chat-ui/assets/{haskell-Cyr255R9.js → haskell-BRsoo5mP.js} +0 -0
  295. /package/dist/apps/chat-ui/assets/{http-DszHFpc-.js → http-CLVgA2GD.js} +0 -0
  296. /package/dist/apps/chat-ui/assets/{idl-Cati9Nrv.js → idl-BUZw3wgd.js} +0 -0
  297. /package/dist/apps/chat-ui/assets/{julia-DlqY1cTU.js → julia-CQfgDRfP.js} +0 -0
  298. /package/dist/apps/chat-ui/assets/{livescript-C6p8-2W1.js → livescript-BXxG0Yva.js} +0 -0
  299. /package/dist/apps/chat-ui/assets/{mathematica-nDHZUMJT.js → mathematica-u8YMmbU0.js} +0 -0
  300. /package/dist/apps/chat-ui/assets/{mbox-DAaR0Hcz.js → mbox-BEMVcqjs.js} +0 -0
  301. /package/dist/apps/chat-ui/assets/{mirc-CCA0FRfl.js → mirc-C9zpzAZU.js} +0 -0
  302. /package/dist/apps/chat-ui/assets/{mllike-Cw3Iccsb.js → mllike-B45xgp2S.js} +0 -0
  303. /package/dist/apps/chat-ui/assets/{modelica-Czx80fNR.js → modelica-CqHI_q-D.js} +0 -0
  304. /package/dist/apps/chat-ui/assets/{mscgen-BmfuTbzG.js → mscgen-qgSLujhx.js} +0 -0
  305. /package/dist/apps/chat-ui/assets/{nginx-D9M2PQ4U.js → nginx-BMaDbqW3.js} +0 -0
  306. /package/dist/apps/chat-ui/assets/{octave-8jj96JiC.js → octave-D2Q8cUp1.js} +0 -0
  307. /package/dist/apps/chat-ui/assets/{oz-BmMq7iC4.js → oz-BwTct_5T.js} +0 -0
  308. /package/dist/apps/chat-ui/assets/{pascal-BgMr6XpT.js → pascal-Dp_KdFgX.js} +0 -0
  309. /package/dist/apps/chat-ui/assets/{pig-nx7uchs8.js → pig-AF4Hwhju.js} +0 -0
  310. /package/dist/apps/chat-ui/assets/{properties-CoavQdLC.js → properties-C357ku5U.js} +0 -0
  311. /package/dist/apps/chat-ui/assets/{protobuf-D5EWhcmc.js → protobuf-D1ij_kNL.js} +0 -0
  312. /package/dist/apps/chat-ui/assets/{q-BIB9pPtI.js → q-B9NhS7L_.js} +0 -0
  313. /package/dist/apps/chat-ui/assets/{rpm-Ct_Ck8mQ.js → rpm-gpDK5sbt.js} +0 -0
  314. /package/dist/apps/chat-ui/assets/{sas-DN4j74IF.js → sas-C2OyD2Y6.js} +0 -0
  315. /package/dist/apps/chat-ui/assets/{sieve-C2U1O5Z4.js → sieve-BAxa3IjF.js} +0 -0
  316. /package/dist/apps/chat-ui/assets/{smalltalk-DkYwYufV.js → smalltalk-BLp5-jwC.js} +0 -0
  317. /package/dist/apps/chat-ui/assets/{solr-BopnSD-v.js → solr-BBopId9w.js} +0 -0
  318. /package/dist/apps/chat-ui/assets/{sparql-Cpg3YQfd.js → sparql-Dz-mlCAC.js} +0 -0
  319. /package/dist/apps/chat-ui/assets/{spreadsheet-kRxtVt9J.js → spreadsheet-CTIncYxj.js} +0 -0
  320. /package/dist/apps/chat-ui/assets/{swift-DKNaLAK6.js → swift-DKB6_1j6.js} +0 -0
  321. /package/dist/apps/chat-ui/assets/{tcl-CQyXkgMH.js → tcl-BGfruO1u.js} +0 -0
  322. /package/dist/apps/chat-ui/assets/{tiddlywiki-dqVbkfX4.js → tiddlywiki-VlUiK86J.js} +0 -0
  323. /package/dist/apps/chat-ui/assets/{troff-Bq3z6oAu.js → troff-C2dAgh7P.js} +0 -0
  324. /package/dist/apps/chat-ui/assets/{vb-BmcHUM2C.js → vb-BthdM_4N.js} +0 -0
  325. /package/dist/apps/chat-ui/assets/{vbscript-Cs9dylre.js → vbscript-D9f6rSsU.js} +0 -0
  326. /package/dist/apps/chat-ui/assets/{velocity-CBWU0VCy.js → velocity-CqftRsjg.js} +0 -0
  327. /package/dist/apps/chat-ui/assets/{webidl-egXQEWlC.js → webidl-D5jiJvOU.js} +0 -0
  328. /package/dist/apps/chat-ui/assets/{yacas-DNs9XkmQ.js → yacas-CXXgtw0p.js} +0 -0
  329. /package/dist/apps/context-files-ui/assets/{brainfuck-CV9kufud.js → brainfuck-D5EjA2JK.js} +0 -0
  330. /package/dist/apps/context-files-ui/assets/{clojure-De3QGfx6.js → clojure-BflJGmDX.js} +0 -0
  331. /package/dist/apps/context-files-ui/assets/{cypher-Dke5QOzv.js → cypher-p9eYesGn.js} +0 -0
  332. /package/dist/apps/context-files-ui/assets/{diff-B365LSoZ.js → diff-ChtP43wD.js} +0 -0
  333. /package/dist/apps/context-files-ui/assets/{dtd-CBMymJ7O.js → dtd-DTF72YNO.js} +0 -0
  334. /package/dist/apps/context-files-ui/assets/{ebnf-Dkum_1J8.js → ebnf-D4c0_ac3.js} +0 -0
  335. /package/dist/apps/context-files-ui/assets/{eiffel-C446m6dI.js → eiffel-BEjRio4Q.js} +0 -0
  336. /package/dist/apps/context-files-ui/assets/{elm-po1E9de0.js → elm-Cshzl8qu.js} +0 -0
  337. /package/dist/apps/context-files-ui/assets/{fcl-DkEOamHd.js → fcl-ClOhbFR7.js} +0 -0
  338. /package/dist/apps/context-files-ui/assets/{forth-dCg2_HVB.js → forth-Cezjo90N.js} +0 -0
  339. /package/dist/apps/context-files-ui/assets/{fortran-3ZpXLFh1.js → fortran-Bt6PBEDR.js} +0 -0
  340. /package/dist/apps/context-files-ui/assets/{gas-DMmxLZRI.js → gas-BHEdbvp9.js} +0 -0
  341. /package/dist/apps/context-files-ui/assets/{gherkin-DUSFg2R6.js → gherkin-oBAE_ms0.js} +0 -0
  342. /package/dist/apps/context-files-ui/assets/{haskell-Cyr255R9.js → haskell-BRsoo5mP.js} +0 -0
  343. /package/dist/apps/context-files-ui/assets/{http-DszHFpc-.js → http-CLVgA2GD.js} +0 -0
  344. /package/dist/apps/context-files-ui/assets/{idl-Cati9Nrv.js → idl-BUZw3wgd.js} +0 -0
  345. /package/dist/apps/context-files-ui/assets/{julia-DlqY1cTU.js → julia-CQfgDRfP.js} +0 -0
  346. /package/dist/apps/context-files-ui/assets/{livescript-C6p8-2W1.js → livescript-BXxG0Yva.js} +0 -0
  347. /package/dist/apps/context-files-ui/assets/{mathematica-nDHZUMJT.js → mathematica-u8YMmbU0.js} +0 -0
  348. /package/dist/apps/context-files-ui/assets/{mbox-DAaR0Hcz.js → mbox-BEMVcqjs.js} +0 -0
  349. /package/dist/apps/context-files-ui/assets/{mirc-CCA0FRfl.js → mirc-C9zpzAZU.js} +0 -0
  350. /package/dist/apps/context-files-ui/assets/{mllike-Cw3Iccsb.js → mllike-B45xgp2S.js} +0 -0
  351. /package/dist/apps/context-files-ui/assets/{modelica-Czx80fNR.js → modelica-CqHI_q-D.js} +0 -0
  352. /package/dist/apps/context-files-ui/assets/{mscgen-BmfuTbzG.js → mscgen-qgSLujhx.js} +0 -0
  353. /package/dist/apps/context-files-ui/assets/{nginx-D9M2PQ4U.js → nginx-BMaDbqW3.js} +0 -0
  354. /package/dist/apps/context-files-ui/assets/{octave-8jj96JiC.js → octave-D2Q8cUp1.js} +0 -0
  355. /package/dist/apps/context-files-ui/assets/{oz-BmMq7iC4.js → oz-BwTct_5T.js} +0 -0
  356. /package/dist/apps/context-files-ui/assets/{pascal-BgMr6XpT.js → pascal-Dp_KdFgX.js} +0 -0
  357. /package/dist/apps/context-files-ui/assets/{pig-nx7uchs8.js → pig-AF4Hwhju.js} +0 -0
  358. /package/dist/apps/context-files-ui/assets/{properties-CoavQdLC.js → properties-C357ku5U.js} +0 -0
  359. /package/dist/apps/context-files-ui/assets/{protobuf-D5EWhcmc.js → protobuf-D1ij_kNL.js} +0 -0
  360. /package/dist/apps/context-files-ui/assets/{q-BIB9pPtI.js → q-B9NhS7L_.js} +0 -0
  361. /package/dist/apps/context-files-ui/assets/{rpm-Ct_Ck8mQ.js → rpm-gpDK5sbt.js} +0 -0
  362. /package/dist/apps/context-files-ui/assets/{sas-DN4j74IF.js → sas-C2OyD2Y6.js} +0 -0
  363. /package/dist/apps/context-files-ui/assets/{sieve-C2U1O5Z4.js → sieve-BAxa3IjF.js} +0 -0
  364. /package/dist/apps/context-files-ui/assets/{smalltalk-DkYwYufV.js → smalltalk-BLp5-jwC.js} +0 -0
  365. /package/dist/apps/context-files-ui/assets/{solr-BopnSD-v.js → solr-BBopId9w.js} +0 -0
  366. /package/dist/apps/context-files-ui/assets/{sparql-Cpg3YQfd.js → sparql-Dz-mlCAC.js} +0 -0
  367. /package/dist/apps/context-files-ui/assets/{spreadsheet-kRxtVt9J.js → spreadsheet-CTIncYxj.js} +0 -0
  368. /package/dist/apps/context-files-ui/assets/{swift-DKNaLAK6.js → swift-DKB6_1j6.js} +0 -0
  369. /package/dist/apps/context-files-ui/assets/{tcl-CQyXkgMH.js → tcl-BGfruO1u.js} +0 -0
  370. /package/dist/apps/context-files-ui/assets/{tiddlywiki-dqVbkfX4.js → tiddlywiki-VlUiK86J.js} +0 -0
  371. /package/dist/apps/context-files-ui/assets/{troff-Bq3z6oAu.js → troff-C2dAgh7P.js} +0 -0
  372. /package/dist/apps/context-files-ui/assets/{vb-BmcHUM2C.js → vb-BthdM_4N.js} +0 -0
  373. /package/dist/apps/context-files-ui/assets/{vbscript-Cs9dylre.js → vbscript-D9f6rSsU.js} +0 -0
  374. /package/dist/apps/context-files-ui/assets/{velocity-CBWU0VCy.js → velocity-CqftRsjg.js} +0 -0
  375. /package/dist/apps/context-files-ui/assets/{webidl-egXQEWlC.js → webidl-D5jiJvOU.js} +0 -0
  376. /package/dist/apps/context-files-ui/assets/{yacas-DNs9XkmQ.js → yacas-CXXgtw0p.js} +0 -0
@@ -129,6 +129,7 @@ export class PiboGatewayServer {
129
129
  options;
130
130
  pluginRegistry;
131
131
  compatibilityRuntimeRegistry;
132
+ ownsPluginRegistry;
132
133
  runtimeInstanceId;
133
134
  sessionStore;
134
135
  ownsSessionStore = false;
@@ -142,6 +143,7 @@ export class PiboGatewayServer {
142
143
  resourceReaper;
143
144
  constructor(options = {}) {
144
145
  this.options = options;
146
+ this.ownsPluginRegistry = options.pluginRegistry === undefined;
145
147
  this.pluginRegistry = options.pluginRegistry ?? createDefaultPiboPluginRegistry();
146
148
  this.compatibilityRuntimeRegistry = options.pluginRegistry ? createDefaultPiboPluginRegistry() : undefined;
147
149
  this.runtimeInstanceId = options.runtimeInstanceId ?? `gateway:${process.pid}:${randomUUID()}`;
@@ -200,6 +202,13 @@ export class PiboGatewayServer {
200
202
  }
201
203
  await this.router?.disposeAll();
202
204
  this.router = undefined;
205
+ const ownedPluginRegistries = this.ownsPluginRegistry
206
+ ? [this.pluginRegistry]
207
+ : this.compatibilityRuntimeRegistry ? [this.compatibilityRuntimeRegistry] : [];
208
+ for (const registry of ownedPluginRegistries) {
209
+ for (const app of registry.getWebApps())
210
+ await app.dispose?.();
211
+ }
203
212
  if (this.ownsSessionStore) {
204
213
  this.sessionStore?.close?.();
205
214
  }
@@ -339,6 +339,7 @@ class ContextFileService {
339
339
  snapshots = new Map();
340
340
  pollTimer;
341
341
  pollFailureReported = false;
342
+ disposed = false;
342
343
  constructor(paths, api) {
343
344
  this.paths = paths;
344
345
  this.api = api;
@@ -589,6 +590,13 @@ class ContextFileService {
589
590
  }, POLL_INTERVAL_MS);
590
591
  this.pollTimer.unref?.();
591
592
  }
593
+ dispose() {
594
+ if (this.disposed)
595
+ return;
596
+ this.disposed = true;
597
+ this.stopWatcher();
598
+ this.store.close();
599
+ }
592
600
  stopWatcher() {
593
601
  if (!this.pollTimer)
594
602
  return;
@@ -915,6 +923,9 @@ function createContextFilesWebApp(service) {
915
923
  name: CONTEXT_FILES_APP_NAME,
916
924
  mountPath: CONTEXT_FILES_MOUNT_PATH,
917
925
  apiPrefix: CONTEXT_FILES_API_PREFIX,
926
+ dispose() {
927
+ service.dispose();
928
+ },
918
929
  async handleRequest(request, context) {
919
930
  const url = new URL(request.url);
920
931
  const asset = builtAsset(url.pathname);
@@ -265,6 +265,7 @@ export class PiboPluginRegistry {
265
265
  builtinTools: sessionContext.builtinTools,
266
266
  builtinToolNames: [...sessionContext.builtinToolNames],
267
267
  autoContextFiles: sessionContext.autoContextFiles,
268
+ nativeSubagents: sessionContext.nativeSubagents,
268
269
  runControl: sessionContext.toolPackages.runControl === true,
269
270
  goalControl: sessionContext.toolPackages.goalControl !== false,
270
271
  };
@@ -295,6 +296,8 @@ export class PiboPluginRegistry {
295
296
  description: subagent.description,
296
297
  targetProfile: subagent.targetProfile,
297
298
  timeoutMs: subagent.timeoutMs,
299
+ model: subagent.model ? { ...subagent.model } : undefined,
300
+ thinkingLevel: subagent.thinkingLevel,
298
301
  maxDepth: subagent.maxDepth,
299
302
  })),
300
303
  contextFiles: [...this.contextFiles.entries()].map(([key, contextFile]) => ({
@@ -1,5 +1,4 @@
1
1
  import { getModels } from "@earendil-works/pi-ai/compat";
2
- import { getOAuthProvider } from "@earendil-works/pi-ai/oauth";
3
2
  export const OPENAI_PROVIDER_ID = "openai";
4
3
  export const OPENAI_RESPONSES_API = "openai-responses";
5
4
  export const OPENAI_BASE_URL = "https://api.openai.com/v1";
@@ -74,12 +73,9 @@ export function registerOpenAiGpt56Models(modelRegistry, options = {}) {
74
73
  const baseOpenAiCodexModels = options.baseOpenAiCodexModels ?? getBuiltInOpenAiCodexModels();
75
74
  const openAiCodexModels = buildOpenAiCodexGpt56Models(baseOpenAiCodexModels);
76
75
  const openAiCodexAdded = countMissingGpt56Models(baseOpenAiCodexModels, OPENAI_CODEX_PROVIDER_ID);
77
- const openAiCodexOAuth = getOpenAiCodexOAuthConfig();
78
76
  modelRegistry.registerProvider(OPENAI_CODEX_PROVIDER_ID, {
79
- name: openAiCodexOAuth.name,
80
77
  baseUrl: OPENAI_CODEX_BASE_URL,
81
78
  api: OPENAI_CODEX_RESPONSES_API,
82
- oauth: openAiCodexOAuth,
83
79
  models: openAiCodexModels,
84
80
  });
85
81
  return {
@@ -144,10 +140,3 @@ function openAiGpt56ModelToRegistryModel(model, options) {
144
140
  maxTokens: GPT_56_MAX_TOKENS,
145
141
  };
146
142
  }
147
- function getOpenAiCodexOAuthConfig() {
148
- const provider = getOAuthProvider(OPENAI_CODEX_PROVIDER_ID);
149
- if (!provider)
150
- throw new Error("OpenAI Codex OAuth provider is unavailable.");
151
- const { id: _id, ...oauth } = provider;
152
- return oauth;
153
- }
@@ -1,7 +1,8 @@
1
1
  import { randomUUID } from "node:crypto";
2
2
  import { mkdirSync } from "node:fs";
3
3
  import { dirname, resolve } from "node:path";
4
- import { piboHomePath } from "../core/pibo-home.js";
4
+ import { ensurePrivatePiboHomeForPath, piboHomePath } from "../core/pibo-home.js";
5
+ import { protectPrivateFileSync } from "../core/private-path.js";
5
6
  import { sqliteTableColumns } from "../data/sqlite-schema.js";
6
7
  import { DatabaseSync } from "node:sqlite";
7
8
  function now() {
@@ -43,9 +44,12 @@ export class PiboReliabilityStore {
43
44
  getEventByTopicIdempotencyKeyStatement;
44
45
  constructor(path = piboHomePath("pibo-events.sqlite")) {
45
46
  const resolvedPath = path === ":memory:" ? path : resolve(path);
47
+ const insidePiboHome = ensurePrivatePiboHomeForPath(resolvedPath);
46
48
  if (resolvedPath !== ":memory:")
47
49
  mkdirSync(dirname(resolvedPath), { recursive: true });
48
50
  this.db = new DatabaseSync(resolvedPath);
51
+ if (insidePiboHome)
52
+ protectPrivateFileSync(resolvedPath);
49
53
  this.db.exec("PRAGMA busy_timeout = 5000");
50
54
  this.db.exec("PRAGMA foreign_keys = ON");
51
55
  if (resolvedPath !== ":memory:")
@@ -1,7 +1,7 @@
1
1
  import { execFile } from "node:child_process";
2
2
  import { existsSync } from "node:fs";
3
3
  import { readdir, readFile, rm } from "node:fs/promises";
4
- import { dirname, isAbsolute, join, resolve } from "node:path";
4
+ import { dirname, isAbsolute, join, relative, resolve } from "node:path";
5
5
  import { promisify } from "node:util";
6
6
  import { applyComputeWorkerReapPlan, buildComputeWorkerReapPlan, planReapWorkers, } from "../compute/docker.js";
7
7
  import { defaultBrowserPoolRoot, defaultBrowserUseHome, getComputeResourceHealth, parseProcessList, } from "../compute/resource-health.js";
@@ -67,7 +67,7 @@ export async function planResourceReap(options = {}) {
67
67
  exemptBrowserUserDataDirs: [],
68
68
  }),
69
69
  ]);
70
- const unmanagedBrowsers = buildUnmanagedBrowserPlanItems(health.browserProcesses.unassignedMainProcessDetails, resolved.unmanagedBrowserGraceMinutes, new Set(resolved.exemptBrowserPids), new Set(resolved.exemptBrowserUserDataDirs));
70
+ const unmanagedBrowsers = buildUnmanagedBrowserPlanItems(health.browserProcesses.unassignedMainProcessDetails, resolved.unmanagedBrowserGraceMinutes, new Set(resolved.exemptBrowserPids), new Set(resolved.exemptBrowserUserDataDirs), resolved.browserUseHome);
71
71
  return buildResourceReapPlan({ now, options: resolved, records, staleFiles, unmanagedBrowsers, compute });
72
72
  }
73
73
  export function buildResourceReapPlan(input) {
@@ -134,7 +134,7 @@ function resolveReapOptions(options) {
134
134
  exemptBrowserUserDataDirs: normalizeBrowserUserDataDirs(options.exemptBrowserUserDataDirs ?? readExemptBrowserUserDataDirs()),
135
135
  };
136
136
  }
137
- export function buildUnmanagedBrowserPlanItems(processes, graceMinutes, exemptPids = new Set(), exemptUserDataDirs = new Set()) {
137
+ export function buildUnmanagedBrowserPlanItems(processes, graceMinutes, exemptPids, exemptUserDataDirs, browserUseHome) {
138
138
  const graceSeconds = graceMinutes * 60;
139
139
  return processes.map((process) => {
140
140
  let action = "terminate";
@@ -151,6 +151,10 @@ export function buildUnmanagedBrowserPlanItems(processes, graceMinutes, exemptPi
151
151
  action = "skip";
152
152
  reason = "explicitly exempted browser user-data-dir";
153
153
  }
154
+ else if (!browserUserDataDirIsWithinHome(process.userDataDir, browserUseHome)) {
155
+ action = "skip";
156
+ reason = "browser user-data-dir is outside this Pibo browser-use home";
157
+ }
154
158
  else if (process.elapsedSeconds !== undefined && process.elapsedSeconds < graceSeconds) {
155
159
  action = "skip";
156
160
  reason = `process age ${process.elapsedSeconds}s is within ${graceSeconds}s grace period`;
@@ -235,6 +239,12 @@ function browserUserDataDirIsExempt(userDataDir, exemptions) {
235
239
  return false;
236
240
  return exemptions.has(resolve(userDataDir));
237
241
  }
242
+ function browserUserDataDirIsWithinHome(userDataDir, browserUseHome) {
243
+ if (!userDataDir || !isAbsolute(userDataDir) || !isAbsolute(browserUseHome))
244
+ return false;
245
+ const pathFromHome = relative(resolve(browserUseHome), resolve(userDataDir));
246
+ return pathFromHome === "" || (!pathFromHome.startsWith("..") && !isAbsolute(pathFromHome));
247
+ }
238
248
  function buildBrowserReapPlanItem(record, now, idleTimeoutMinutes) {
239
249
  const { state } = record;
240
250
  let action = "skip";
@@ -1,6 +1,8 @@
1
1
  import { randomUUID } from "node:crypto";
2
2
  import { execFile } from "node:child_process";
3
3
  import { existsSync, readFileSync, unlinkSync } from "node:fs";
4
+ import { tmpdir } from "node:os";
5
+ import { join } from "node:path";
4
6
  import { promisify } from "node:util";
5
7
  const execFileAsync = promisify(execFile);
6
8
  export class PiboRunResourceLimitError extends Error {
@@ -12,7 +14,7 @@ export class PiboRunResourceLimitError extends Error {
12
14
  }
13
15
  }
14
16
  const DEFAULT_POLICY = Object.freeze({
15
- mode: "systemd",
17
+ mode: process.platform === "win32" ? "windows-process-tree" : "systemd",
16
18
  memoryHighBytes: 1280 * 1024 * 1024,
17
19
  memoryMaxBytes: 1792 * 1024 * 1024,
18
20
  tasksMax: 128,
@@ -76,23 +78,44 @@ export function parseLinuxPressure(input) {
76
78
  export function prepareYieldedRunExecution(toolName, params, options = {}) {
77
79
  const policy = resolveYieldedRunResourcePolicy(options.env);
78
80
  const command = bashCommand(params);
79
- const shouldIsolate = policy.mode === "systemd" && toolName === "bash" && command !== undefined;
80
- const unitName = shouldIsolate ? options.unitName ?? yieldedRunUnitName() : undefined;
81
+ const shouldUseSystemd = policy.mode === "systemd" && toolName === "bash" && command !== undefined;
82
+ const shouldUseWindowsProcessTree = policy.mode === "windows-process-tree" && toolName === "bash" && command !== undefined;
83
+ const unitName = shouldUseSystemd ? options.unitName ?? yieldedRunUnitName() : undefined;
81
84
  const metricsPath = unitName ? `/tmp/${unitName}.metrics` : undefined;
85
+ const windowsPidPath = shouldUseWindowsProcessTree
86
+ ? join(tmpdir(), `pibo-yielded-${randomUUID()}.winpid`)
87
+ : undefined;
82
88
  const resources = {
83
- isolationMode: shouldIsolate ? "systemd" : "off",
89
+ isolationMode: shouldUseSystemd ? "systemd" : shouldUseWindowsProcessTree ? "windows-process-tree" : "off",
84
90
  ...(unitName ? { unitName } : {}),
85
91
  policy,
86
92
  admission: collectYieldedRunHostResourceSnapshot({ now: options.now }),
87
93
  };
88
- const preparedParams = shouldIsolate
94
+ const preparedParams = shouldUseSystemd
89
95
  ? { ...params, command: systemdRunCommand(command, unitName, policy, metricsPath) }
90
- : params;
96
+ : shouldUseWindowsProcessTree && windowsPidPath
97
+ ? { ...params, command: windowsProcessTreeCommand(command, windowsPidPath) }
98
+ : params;
91
99
  return {
92
100
  params: preparedParams,
93
101
  resources,
102
+ async cancel() {
103
+ if (shouldUseSystemd && unitName)
104
+ await terminateSystemdUnit(unitName);
105
+ if (shouldUseWindowsProcessTree && windowsPidPath)
106
+ await terminateWindowsProcessTree(windowsPidPath);
107
+ },
94
108
  async execute(operation) {
95
- if (!shouldIsolate || !unitName)
109
+ if (shouldUseWindowsProcessTree && windowsPidPath) {
110
+ resources.startedAt = new Date().toISOString();
111
+ try {
112
+ return await operation();
113
+ }
114
+ finally {
115
+ unlinkOptional(windowsPidPath);
116
+ }
117
+ }
118
+ if (!shouldUseSystemd || !unitName)
96
119
  return await operation();
97
120
  if (process.platform !== "linux" || !existsSync("/run/systemd/system")) {
98
121
  resources.limitReason = "systemd isolation is unavailable on this host";
@@ -122,6 +145,130 @@ export function prepareYieldedRunExecution(toolName, params, options = {}) {
122
145
  },
123
146
  };
124
147
  }
148
+ export function windowsProcessTreeCommand(command, pidPath) {
149
+ const portablePidPath = pidPath.replaceAll("\\", "/");
150
+ return [
151
+ "__pibo_win_pid=\"$(ps -W | awk -v p=$$ 'NR > 1 && $1 == p { print $4; exit }')\"",
152
+ "if [ -z \"$__pibo_win_pid\" ]; then printf '%s\\n' 'Pibo could not identify the Windows Bash process.' >&2; exit 125; fi",
153
+ `printf '%s %s' "$$" "$__pibo_win_pid" > ${bashSingleQuote(portablePidPath)}`,
154
+ "unset __pibo_win_pid",
155
+ command,
156
+ ].join("\n");
157
+ }
158
+ async function terminateWindowsProcessTree(pidPath) {
159
+ const identity = await waitForWindowsProcessIdentity(pidPath);
160
+ if (!identity)
161
+ return;
162
+ try {
163
+ const rows = await listWindowsProcessTree(identity.msysPid);
164
+ for (const row of rows) {
165
+ try {
166
+ process.kill(row.windowsPid, "SIGKILL");
167
+ }
168
+ catch {
169
+ // The process may have exited between the snapshot and termination.
170
+ }
171
+ }
172
+ for (let attempt = 0; attempt < 100 && processIsAlive(identity.windowsPid); attempt += 1) {
173
+ await new Promise((resolveWait) => setTimeout(resolveWait, 25));
174
+ }
175
+ if (processIsAlive(identity.windowsPid)) {
176
+ throw new Error(`Windows yielded-run process tree rooted at PID ${identity.windowsPid} is still active after termination.`);
177
+ }
178
+ }
179
+ finally {
180
+ unlinkOptional(pidPath);
181
+ }
182
+ }
183
+ async function waitForWindowsProcessIdentity(pidPath) {
184
+ for (let attempt = 0; attempt < 80; attempt += 1) {
185
+ try {
186
+ const match = readFileSync(pidPath, "utf8").trim().match(/^([1-9]\d*)\s+([1-9]\d*)$/);
187
+ if (match)
188
+ return { msysPid: Number(match[1]), windowsPid: Number(match[2]) };
189
+ }
190
+ catch {
191
+ // The Bash wrapper may still be starting.
192
+ }
193
+ await new Promise((resolveWait) => setTimeout(resolveWait, 25));
194
+ }
195
+ return undefined;
196
+ }
197
+ async function listWindowsProcessTree(rootMsysPid) {
198
+ const { stdout } = await execFileAsync(windowsBashExecutable(), ["-lc", "ps -W"], {
199
+ encoding: "utf8",
200
+ timeout: 5_000,
201
+ windowsHide: true,
202
+ });
203
+ const rows = stdout.split(/\r?\n/).flatMap((line) => {
204
+ const fields = line.trim().split(/\s+/);
205
+ if (fields.length < 4 || !fields.slice(0, 4).every((field) => /^\d+$/.test(field)))
206
+ return [];
207
+ return [{
208
+ msysPid: Number(fields[0]),
209
+ parentMsysPid: Number(fields[1]),
210
+ processGroupId: Number(fields[2]),
211
+ windowsPid: Number(fields[3]),
212
+ }];
213
+ });
214
+ const selected = new Set([rootMsysPid]);
215
+ for (let changed = true; changed;) {
216
+ changed = false;
217
+ for (const row of rows) {
218
+ if (selected.has(row.msysPid))
219
+ continue;
220
+ if (row.processGroupId === rootMsysPid || selected.has(row.parentMsysPid)) {
221
+ selected.add(row.msysPid);
222
+ changed = true;
223
+ }
224
+ }
225
+ }
226
+ return rows
227
+ .filter((row) => selected.has(row.msysPid) && row.windowsPid > 0)
228
+ .sort((left, right) => processTreeDepth(right, rows) - processTreeDepth(left, rows));
229
+ }
230
+ function processTreeDepth(row, rows) {
231
+ const byPid = new Map(rows.map((candidate) => [candidate.msysPid, candidate]));
232
+ let depth = 0;
233
+ let current = row;
234
+ const seen = new Set();
235
+ while (!seen.has(current.msysPid)) {
236
+ seen.add(current.msysPid);
237
+ const parent = byPid.get(current.parentMsysPid);
238
+ if (!parent)
239
+ break;
240
+ depth += 1;
241
+ current = parent;
242
+ }
243
+ return depth;
244
+ }
245
+ function windowsBashExecutable() {
246
+ const candidates = [
247
+ process.env.ProgramFiles ? join(process.env.ProgramFiles, "Git", "bin", "bash.exe") : undefined,
248
+ process.env["ProgramFiles(x86)"] ? join(process.env["ProgramFiles(x86)"], "Git", "bin", "bash.exe") : undefined,
249
+ ].filter((candidate) => Boolean(candidate));
250
+ return candidates.find((candidate) => existsSync(candidate)) ?? "bash.exe";
251
+ }
252
+ function processIsAlive(pid) {
253
+ try {
254
+ process.kill(pid, 0);
255
+ return true;
256
+ }
257
+ catch {
258
+ return false;
259
+ }
260
+ }
261
+ function unlinkOptional(path) {
262
+ try {
263
+ unlinkSync(path);
264
+ }
265
+ catch {
266
+ // Best-effort transient process metadata cleanup.
267
+ }
268
+ }
269
+ function bashSingleQuote(value) {
270
+ return `'${value.replaceAll("'", `'"'"'`)}'`;
271
+ }
125
272
  export function systemdRunCommand(command, unitName, policy, metricsPath = `/tmp/${unitName}.metrics`) {
126
273
  const captureScript = [
127
274
  '/bin/bash -c "$1"',
@@ -415,9 +562,13 @@ function finiteNumber(value) {
415
562
  }
416
563
  function parseIsolationMode(value, fallback) {
417
564
  const normalized = value?.trim().toLowerCase();
565
+ if (normalized === "off" || normalized === "0" || normalized === "false")
566
+ return "off";
567
+ if (process.platform === "win32")
568
+ return "windows-process-tree";
418
569
  if (!normalized)
419
570
  return fallback;
420
- return normalized === "off" || normalized === "0" || normalized === "false" ? "off" : "systemd";
571
+ return "systemd";
421
572
  }
422
573
  function parsePositiveInteger(value, fallback) {
423
574
  const parsed = Number(value);
@@ -27,6 +27,22 @@ function requireTool(tools, name) {
27
27
  }
28
28
  return tool;
29
29
  }
30
+ async function waitForRunCancellationSettlement(settled, timeoutMs = 15_000) {
31
+ let timer;
32
+ try {
33
+ await Promise.race([
34
+ settled,
35
+ new Promise((_resolve, reject) => {
36
+ timer = setTimeout(() => reject(new Error(`Yielded run did not settle within ${timeoutMs}ms after cancellation.`)), timeoutMs);
37
+ timer.unref?.();
38
+ }),
39
+ ]);
40
+ }
41
+ finally {
42
+ if (timer)
43
+ clearTimeout(timer);
44
+ }
45
+ }
30
46
  export function createRunToolDefinitions(yieldableTools, controller) {
31
47
  const toolNames = yieldableTools.map((tool) => tool.name);
32
48
  return [
@@ -49,6 +65,13 @@ export function createRunToolDefinitions(yieldableTools, controller) {
49
65
  const timeoutMs = resolveRunTimeoutMs(tool.name, params.arguments);
50
66
  const serviceWarning = foregroundServiceWarning(tool.name, params.arguments, timeoutMs);
51
67
  const prepared = prepareYieldedRunExecution(tool.name, params.arguments);
68
+ const runAbortController = new AbortController();
69
+ const runSignal = signal ? AbortSignal.any([signal, runAbortController.signal]) : runAbortController.signal;
70
+ let executionStarted = false;
71
+ let resolveExecutionSettled;
72
+ const executionSettled = new Promise((resolve) => {
73
+ resolveExecutionSettled = resolve;
74
+ });
52
75
  let observedOutput = false;
53
76
  const run = controller.startToolRun({
54
77
  toolName: tool.name,
@@ -57,9 +80,26 @@ export function createRunToolDefinitions(yieldableTools, controller) {
57
80
  timeoutMs,
58
81
  serviceWarning,
59
82
  resources: prepared.resources,
83
+ async cancel() {
84
+ let processCancellationError;
85
+ try {
86
+ await prepared.cancel();
87
+ }
88
+ catch (error) {
89
+ processCancellationError = error;
90
+ }
91
+ finally {
92
+ runAbortController.abort(new Error("Yielded run was cancelled."));
93
+ }
94
+ if (processCancellationError)
95
+ throw processCancellationError;
96
+ if (executionStarted)
97
+ await waitForRunCancellationSettlement(executionSettled);
98
+ },
60
99
  async execute() {
100
+ executionStarted = true;
61
101
  try {
62
- const result = await prepared.execute(() => tool.execute(toolCallId, prepared.params, signal, (update) => {
102
+ const result = await prepared.execute(() => tool.execute(toolCallId, prepared.params, runSignal, (update) => {
63
103
  observedOutput ||= hasMeaningfulTimeoutOutput(update);
64
104
  onUpdate?.(update);
65
105
  }, ctx));
@@ -79,6 +119,9 @@ export function createRunToolDefinitions(yieldableTools, controller) {
79
119
  throw new PiboRunExecutionTimeoutError(error instanceof Error ? error.message : String(error), observedOutput ? "lifetime" : "startup");
80
120
  throw error;
81
121
  }
122
+ finally {
123
+ resolveExecutionSettled?.();
124
+ }
82
125
  },
83
126
  });
84
127
  const prefix = serviceWarning ? `Started yielded run ${run.runId}.\nWarning: ${serviceWarning}` : `Started yielded run ${run.runId}.`;
@@ -174,6 +174,9 @@ export class PiboDataSessionStore {
174
174
  return this.getRuntimeBinding(id);
175
175
  });
176
176
  }
177
+ getDataStore() {
178
+ return this.dataStore;
179
+ }
177
180
  getTelemetryStore() {
178
181
  return this.dataStore.telemetry;
179
182
  }
@@ -115,12 +115,14 @@ export class CodexBrowserNodeRepl {
115
115
  return { status: "failed", reset: false, error: errorSummary(error) };
116
116
  }
117
117
  }
118
- dispose() {
118
+ async dispose() {
119
119
  if (!this.isAlive())
120
120
  return;
121
121
  this.alive = false;
122
- this.child.kill("SIGTERM");
123
122
  this.rejectAll(new Error("node_repl worker was disposed"));
123
+ const closed = new Promise((resolve) => this.child.once("close", () => resolve()));
124
+ this.child.kill("SIGTERM");
125
+ await closed;
124
126
  }
125
127
  waitReady(timeoutMs) {
126
128
  return new Promise((resolve, reject) => {
@@ -124,7 +124,7 @@ export class CodexBrowserSessionController {
124
124
  return this.nodeRepl.reset();
125
125
  }
126
126
  async dispose() {
127
- this.nodeRepl?.dispose();
127
+ await this.nodeRepl?.dispose();
128
128
  this.nodeRepl = undefined;
129
129
  if (!this.browserLeaseUsed)
130
130
  return;
@@ -1,8 +1,8 @@
1
1
  import { mkdir, readFile, writeFile } from "node:fs/promises";
2
2
  import { platform, release, arch } from "node:os";
3
3
  import { dirname, extname, isAbsolute, join, resolve } from "node:path";
4
- import { AuthStorage } from "@earendil-works/pi-coding-agent";
5
4
  import { Type } from "typebox";
5
+ import { readPiCredential, resolvePiProviderAuth, } from "../agent-runtimes/pi/credentials.js";
6
6
  import { definePiboTool } from "./contract.js";
7
7
  import { getPiboHome } from "../core/pibo-home.js";
8
8
  const OPENAI_CODEX_PROVIDER = "openai-codex";
@@ -47,12 +47,12 @@ function getOpenAiAccountId(accessToken, storedAccountId) {
47
47
  return typeof accountId === "string" && accountId.trim().length > 0 ? accountId : undefined;
48
48
  }
49
49
  async function getCodexImageAuth() {
50
- const authStorage = AuthStorage.create();
51
- const credential = authStorage.get(OPENAI_CODEX_PROVIDER);
50
+ const credential = await readPiCredential(OPENAI_CODEX_PROVIDER);
52
51
  if (credential?.type !== "oauth") {
53
52
  throw new Error("codex_image_generation requires ChatGPT/Codex OAuth login for provider openai-codex. Use the existing OpenAI Codex login flow; API keys are not supported for this tool.");
54
53
  }
55
- const accessToken = await authStorage.getApiKey(OPENAI_CODEX_PROVIDER, { includeFallback: false });
54
+ const resolvedAuth = await resolvePiProviderAuth(OPENAI_CODEX_PROVIDER);
55
+ const accessToken = resolvedAuth?.auth.apiKey;
56
56
  if (!accessToken) {
57
57
  throw new Error("codex_image_generation could not load a ChatGPT/Codex OAuth access token for provider openai-codex. Please log in again with the OpenAI Codex login flow.");
58
58
  }
@@ -67,7 +67,7 @@ export class NodeRuntimeBackend {
67
67
  }
68
68
  static async start(baseCwd, input) {
69
69
  const target = input.target ?? {};
70
- const backend = new NodeRuntimeBackend(resolveCwd(baseCwd, target.cwd), target.executable ?? "node", target.args ?? [], target.env);
70
+ const backend = new NodeRuntimeBackend(resolveCwd(baseCwd, target.cwd), target.executable ?? process.execPath, target.args ?? [], target.env);
71
71
  await backend.waitReady(input.timeoutMs ?? 10000);
72
72
  return backend;
73
73
  }
@@ -146,8 +146,10 @@ export class NodeRuntimeBackend {
146
146
  async close(force = false) {
147
147
  if (!this.isAlive())
148
148
  return;
149
+ const closed = new Promise((resolve) => this.child.once("close", () => resolve()));
149
150
  if (force) {
150
151
  this.child.kill("SIGKILL");
152
+ await closed;
151
153
  return;
152
154
  }
153
155
  try {
@@ -156,6 +158,7 @@ export class NodeRuntimeBackend {
156
158
  catch {
157
159
  this.child.kill("SIGTERM");
158
160
  }
161
+ await closed;
159
162
  }
160
163
  waitReady(timeoutMs) {
161
164
  return new Promise((resolveWait, rejectWait) => {
@@ -67,7 +67,7 @@ export class PythonRuntimeBackend {
67
67
  }
68
68
  static async start(baseCwd, input) {
69
69
  const target = input.target ?? {};
70
- const backend = new PythonRuntimeBackend(resolveCwd(baseCwd, target.cwd), target.executable ?? "python3", target.args ?? [], target.env);
70
+ const backend = new PythonRuntimeBackend(resolveCwd(baseCwd, target.cwd), target.executable ?? (process.platform === "win32" ? "python" : "python3"), target.args ?? [], target.env);
71
71
  await backend.waitReady(input.timeoutMs ?? 10000);
72
72
  return backend;
73
73
  }
@@ -145,8 +145,10 @@ export class PythonRuntimeBackend {
145
145
  async close(force = false) {
146
146
  if (!this.isAlive())
147
147
  return;
148
+ const closed = new Promise((resolve) => this.child.once("close", () => resolve()));
148
149
  if (force) {
149
150
  this.child.kill("SIGKILL");
151
+ await closed;
150
152
  return;
151
153
  }
152
154
  try {
@@ -155,6 +157,7 @@ export class PythonRuntimeBackend {
155
157
  catch {
156
158
  this.child.kill("SIGTERM");
157
159
  }
160
+ await closed;
158
161
  }
159
162
  waitReady(timeoutMs) {
160
163
  return new Promise((resolveWait, rejectWait) => {
@@ -8,10 +8,21 @@ import { assertWebAnnotationStatusTransition, normalizeWebAnnotationLimit, norma
8
8
  export const WEB_ANNOTATIONS_API_PREFIX = "/api/web-annotations";
9
9
  export const WEB_ANNOTATIONS_APP_MOUNT = "/apps/web-annotations";
10
10
  let defaultStore;
11
- function getDefaultStore() {
11
+ let defaultStoreUsers = 0;
12
+ function acquireDefaultStore() {
12
13
  defaultStore ??= createDefaultWebAnnotationStore();
14
+ defaultStoreUsers += 1;
13
15
  return defaultStore;
14
16
  }
17
+ function releaseDefaultStore(store) {
18
+ if (defaultStore !== store)
19
+ return;
20
+ defaultStoreUsers = Math.max(0, defaultStoreUsers - 1);
21
+ if (defaultStoreUsers > 0)
22
+ return;
23
+ store.close();
24
+ defaultStore = undefined;
25
+ }
15
26
  function createSameOriginBinding(store, request, context, body) {
16
27
  const bindingToken = randomBytes(24).toString("base64url");
17
28
  const binding = store.createBinding({
@@ -32,12 +43,21 @@ function createSameOriginBinding(store, request, context, body) {
32
43
  };
33
44
  }
34
45
  export function createWebAnnotationsWebApp(options = {}) {
35
- const store = options.store ?? getDefaultStore();
46
+ const usesDefaultStore = options.store === undefined;
47
+ const store = options.store ?? acquireDefaultStore();
36
48
  const baseService = options.cdpService ?? createWebAnnotationCdpService({ store });
49
+ let disposed = false;
37
50
  return {
38
51
  name: "web-annotations",
39
52
  mountPath: WEB_ANNOTATIONS_APP_MOUNT,
40
53
  apiPrefix: WEB_ANNOTATIONS_API_PREFIX,
54
+ dispose() {
55
+ if (disposed)
56
+ return;
57
+ disposed = true;
58
+ if (usesDefaultStore)
59
+ releaseDefaultStore(store);
60
+ },
41
61
  async handleRequest(request, context) {
42
62
  const url = new URL(request.url);
43
63
  if (url.pathname === `${WEB_ANNOTATIONS_APP_MOUNT}/overlay.js` && request.method === "GET") {