@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
@@ -37,6 +37,7 @@ export class InitialSessionContext {
37
37
  builtinTools;
38
38
  builtinToolNames;
39
39
  autoContextFiles;
40
+ nativeSubagents;
40
41
  toolPackages;
41
42
  constructor(options) {
42
43
  this.profileName = options.profileName;
@@ -62,6 +63,7 @@ export class InitialSessionContext {
62
63
  this.builtinTools = options.builtinTools ?? "default";
63
64
  this.builtinToolNames = [...(options.builtinToolNames ?? DEFAULT_BUILTIN_TOOL_NAMES)];
64
65
  this.autoContextFiles = options.autoContextFiles ?? true;
66
+ this.nativeSubagents = options.nativeSubagents;
65
67
  this.toolPackages = { ...(options.toolPackages ?? {}) };
66
68
  }
67
69
  }
@@ -89,6 +91,7 @@ export class InitialSessionContextBuilder {
89
91
  builtinTools = "default";
90
92
  builtinToolNames = [...DEFAULT_BUILTIN_TOOL_NAMES];
91
93
  autoContextFiles = true;
94
+ nativeSubagents;
92
95
  toolPackages = {};
93
96
  constructor(profileName) {
94
97
  this.profileName = profileName;
@@ -154,6 +157,10 @@ export class InitialSessionContextBuilder {
154
157
  this.autoContextFiles = enabled;
155
158
  return this;
156
159
  }
160
+ withNativeSubagents(enabled) {
161
+ this.nativeSubagents = enabled;
162
+ return this;
163
+ }
157
164
  withToolPackages(packages) {
158
165
  this.toolPackages = { ...packages };
159
166
  return this;
@@ -231,6 +238,7 @@ export class InitialSessionContextBuilder {
231
238
  builtinTools: this.builtinTools,
232
239
  builtinToolNames: this.builtinToolNames,
233
240
  autoContextFiles: this.autoContextFiles,
241
+ nativeSubagents: this.nativeSubagents,
234
242
  toolPackages: this.toolPackages,
235
243
  });
236
244
  }
@@ -0,0 +1,36 @@
1
+ const SENSITIVE_KEY_PATTERN = /(?:authorization|cookie|credential|access[_-]?token|refresh[_-]?token|id[_-]?token|api[_-]?key|bearer|oauth|token|secret|password|passwd)/i;
2
+ const SENSITIVE_TEXT_PATTERNS = [
3
+ [/\bBearer\s+\S+/gi, "Bearer [redacted]"],
4
+ [/\b(?:sk|pk|rk|ghp|gho|ghu|ghs|ghr|github_pat|pibo|xoxb|xoxp|xoxa|xoxr)[-_][A-Za-z0-9_-]{8,}\b/g, "[redacted]"],
5
+ [/\beyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\b/g, "[redacted]"],
6
+ [/\b(access[_-]?token|refresh[_-]?token|id[_-]?token|api[_-]?key|authorization|cookie|credential|oauth|token|secret|password|passwd)\b(\s*["']?\s*[:=]\s*["']?)([^\s"'&,;}]+)/gi, "$1$2[redacted]"],
7
+ ];
8
+ export function redactSensitiveText(value) {
9
+ let selected = value;
10
+ for (const [pattern, replacement] of SENSITIVE_TEXT_PATTERNS)
11
+ selected = selected.replace(pattern, replacement);
12
+ return selected;
13
+ }
14
+ export function redactSensitiveValue(value, key, depth = 0) {
15
+ if (key && SENSITIVE_KEY_PATTERN.test(key))
16
+ return "[redacted]";
17
+ if (depth > 32)
18
+ return "[maximum depth reached]";
19
+ if (value === null || value === undefined || typeof value === "boolean")
20
+ return value;
21
+ if (typeof value === "string")
22
+ return redactSensitiveText(value);
23
+ if (typeof value === "number")
24
+ return Number.isFinite(value) ? value : String(value);
25
+ if (Array.isArray(value))
26
+ return value.map((entry) => redactSensitiveValue(entry, undefined, depth + 1));
27
+ if (typeof value === "object") {
28
+ const result = {};
29
+ for (const [entryKey, entryValue] of Object.entries(value)) {
30
+ if (entryValue !== undefined)
31
+ result[entryKey] = redactSensitiveValue(entryValue, entryKey, depth + 1);
32
+ }
33
+ return result;
34
+ }
35
+ return String(value);
36
+ }
@@ -31,6 +31,7 @@ function profileWithSessionIds(profile, piSessionId, parentPiSessionId) {
31
31
  builtinTools: profile.builtinTools,
32
32
  builtinToolNames: profile.builtinToolNames,
33
33
  autoContextFiles: profile.autoContextFiles,
34
+ nativeSubagents: profile.nativeSubagents,
34
35
  toolPackages: profile.toolPackages,
35
36
  });
36
37
  }
@@ -27,6 +27,7 @@ import { AsyncTelemetryWriter } from "../data/telemetry-writer.js";
27
27
  import { createPiboToolPayloadWriter } from "../tools/payload-writer.js";
28
28
  import { PiboPortableToolService, } from "../tools/session-service.js";
29
29
  import { PiboRuntimeResourceService, } from "../agent-runtime/resource-service.js";
30
+ import { PORTABLE_HISTORY_HANDOFF_METADATA_KEY, PORTABLE_HISTORY_LAST_IMPORT_METADATA_KEY, PiboDataPortableHistoryProvider, createPortableHistoryHandoffMetadata, readPortableHistoryHandoffMetadata, withoutPortableHistoryHandoffMetadata, withPortableHistoryHandoffMetadata, } from "../agent-runtime/portable-history.js";
30
31
  const DEFAULT_SUBAGENT_REPLY_TIMEOUT_MS = 10 * 60 * 1000;
31
32
  const DEFAULT_SUBAGENT_MAX_DEPTH = 3;
32
33
  const MAX_SUBAGENT_THREAD_KEY_BYTES = 512;
@@ -68,15 +69,16 @@ function subagentAbortError() {
68
69
  return error;
69
70
  }
70
71
  function profileForSession(baseProfile, runtimeInstanceId, nativeSessionId, parentNativeSessionId, subagentDepth) {
72
+ const usesProfileRuntime = baseProfile.runtimeInstanceId === runtimeInstanceId;
71
73
  const options = {
72
74
  profileName: baseProfile.profileName,
73
75
  runtimeInstanceId,
74
- runtimeOptions: baseProfile.runtimeOptions,
76
+ runtimeOptions: usesProfileRuntime ? baseProfile.runtimeOptions : {},
75
77
  sessionId: nativeSessionId,
76
78
  parentSessionId: parentNativeSessionId,
77
- model: baseProfile.model,
78
- mainModel: baseProfile.mainModel,
79
- subagentModel: baseProfile.subagentModel,
79
+ model: usesProfileRuntime ? baseProfile.model : undefined,
80
+ mainModel: usesProfileRuntime ? baseProfile.mainModel : undefined,
81
+ subagentModel: usesProfileRuntime ? baseProfile.subagentModel : undefined,
80
82
  thinkingLevel: baseProfile.thinkingLevel,
81
83
  mainThinkingLevel: baseProfile.mainThinkingLevel,
82
84
  subagentThinkingLevel: baseProfile.subagentThinkingLevel,
@@ -92,6 +94,7 @@ function profileForSession(baseProfile, runtimeInstanceId, nativeSessionId, pare
92
94
  builtinTools: baseProfile.builtinTools,
93
95
  builtinToolNames: baseProfile.builtinToolNames,
94
96
  autoContextFiles: baseProfile.autoContextFiles,
97
+ nativeSubagents: usesProfileRuntime ? baseProfile.nativeSubagents : undefined,
95
98
  toolPackages: baseProfile.toolPackages,
96
99
  };
97
100
  return new InitialSessionContext(options);
@@ -179,6 +182,18 @@ function runtimeBindingsEqual(left, right) {
179
182
  && JSON.stringify(left.locator ?? null) === JSON.stringify(right.locator ?? null)
180
183
  && JSON.stringify(left.metadata ?? {}) === JSON.stringify(right.metadata ?? {});
181
184
  }
185
+ function withPersistedPortableHistoryAuditMetadata(persisted, live) {
186
+ const metadata = { ...(live.metadata ?? {}) };
187
+ for (const key of [PORTABLE_HISTORY_HANDOFF_METADATA_KEY, PORTABLE_HISTORY_LAST_IMPORT_METADATA_KEY]) {
188
+ if (Object.prototype.hasOwnProperty.call(persisted.metadata ?? {}, key)) {
189
+ metadata[key] = structuredClone(persisted.metadata[key]);
190
+ }
191
+ else {
192
+ delete metadata[key];
193
+ }
194
+ }
195
+ return { ...live, metadata };
196
+ }
182
197
  class PiboSessionDisposalTimeoutError extends Error {
183
198
  piboSessionId;
184
199
  timeoutMs;
@@ -195,6 +210,10 @@ function telemetryStoreFromSessionStore(store) {
195
210
  function payloadStoreFromSessionStore(store) {
196
211
  return store.getPayloadStore?.();
197
212
  }
213
+ function portableHistoryProviderFromSessionStore(store) {
214
+ const dataStore = store.getDataStore?.();
215
+ return dataStore ? new PiboDataPortableHistoryProvider(dataStore) : undefined;
216
+ }
198
217
  function providerEventTelemetryModeFromEnv(env = process.env) {
199
218
  const value = env.PIBO_TELEMETRY_PROVIDER_EVENTS?.trim().toLowerCase();
200
219
  return value === "1" || value === "true" || value === "detailed" ? "detailed" : "aggregate";
@@ -211,11 +230,13 @@ export class PiboSessionRouter {
211
230
  portableToolService;
212
231
  portableToolSessions = new Map();
213
232
  runtimeResourceService;
233
+ portableHistoryProvider;
214
234
  runtimeResourceSessions = new Map();
215
235
  runtimeAuthFingerprints = new Map();
216
236
  activeSubagentChildren = new Map();
217
237
  scheduledRunReminders = new Map();
218
238
  runReminderGenerations = new Map();
239
+ runCancellationHandlers = new Map();
219
240
  quiescingSessions = new Set();
220
241
  disposingSessions = new Map();
221
242
  idleSessionTimers = new Map();
@@ -266,6 +287,7 @@ export class PiboSessionRouter {
266
287
  ...(payloadStore ? { payloadWriter: createPiboToolPayloadWriter(payloadStore) } : {}),
267
288
  });
268
289
  this.runtimeResourceService = options.runtimeResourceService ?? new PiboRuntimeResourceService();
290
+ this.portableHistoryProvider = options.portableHistoryProvider ?? portableHistoryProviderFromSessionStore(this.sessionStore);
269
291
  this.runRegistry = new PiboRunRegistry({ store: this.reliabilityStore });
270
292
  this.runRegistry.subscribe((event) => this.projectRunRegistryEvent(event));
271
293
  const recoveredRuntimeState = options.recoverInterruptedRuntimeState
@@ -334,6 +356,9 @@ export class PiboSessionRouter {
334
356
  if (teardownAction)
335
357
  this.beginSessionQuiescence(teardownIds);
336
358
  try {
359
+ if (!teardownAction && this.quiescingSessions.has(event.piboSessionId)) {
360
+ throw new Error(`Pibo session "${event.piboSessionId}" is quiescing.`);
361
+ }
337
362
  if (event.type === "message") {
338
363
  return event.delivery === "steer"
339
364
  ? await session.steerMessage(event)
@@ -428,6 +453,12 @@ export class PiboSessionRouter {
428
453
  if (options?.includeRuns) {
429
454
  const runs = this.runRegistry.cancelControllerRuns(id);
430
455
  cancelledRuns.push(...runs.map((run) => run.runId));
456
+ try {
457
+ await this.invokeRunCancellationHandlers(runs);
458
+ }
459
+ catch (error) {
460
+ failures.push(error);
461
+ }
431
462
  }
432
463
  }
433
464
  try {
@@ -477,16 +508,18 @@ export class PiboSessionRouter {
477
508
  if (existingDisposals.length > 0)
478
509
  await Promise.all(existingDisposals);
479
510
  this.beginSessionQuiescence(ids);
480
- if (options.cancelRuns) {
481
- for (const id of ids)
482
- this.runRegistry.cancelControllerRuns(id);
483
- }
484
511
  let releaseStart;
485
512
  const startGate = new Promise((resolve) => {
486
513
  releaseStart = resolve;
487
514
  });
488
515
  const operation = (async () => {
489
516
  await startGate;
517
+ const runCancellationResults = options.cancelRuns
518
+ ? await Promise.allSettled(ids.map(async (id) => {
519
+ const runs = this.runRegistry.cancelControllerRuns(id);
520
+ await this.invokeRunCancellationHandlers(runs);
521
+ }))
522
+ : [];
490
523
  const pending = ids.map((id) => this.pendingSessions.get(id)).filter((value) => Boolean(value));
491
524
  if (pending.length > 0)
492
525
  await Promise.allSettled(pending);
@@ -494,7 +527,7 @@ export class PiboSessionRouter {
494
527
  const session = this.sessions.get(id);
495
528
  return session ? [{ id, session }] : [];
496
529
  });
497
- const failures = [];
530
+ const failures = runCancellationResults.flatMap((result) => result.status === "rejected" ? [result.reason] : []);
498
531
  const closeResults = await Promise.allSettled(ids.map((id) => this.runtimeRegistry.closeControllerSessions(id, { force: true })));
499
532
  for (const result of closeResults) {
500
533
  if (result.status === "rejected")
@@ -550,6 +583,7 @@ export class PiboSessionRouter {
550
583
  if (options?.includeRuns) {
551
584
  const runs = this.runRegistry.cancelControllerRuns(session.id);
552
585
  cancelledRuns.push(...runs.map((r) => r.runId));
586
+ await this.invokeRunCancellationHandlers(runs);
553
587
  }
554
588
  const nested = await this.killChildSessions(session.id, options);
555
589
  killed.push(...nested.killed);
@@ -606,6 +640,20 @@ export class PiboSessionRouter {
606
640
  return session ? structuredClone(this.resolveSessionRuntimeBinding(session)) : undefined;
607
641
  }
608
642
  async rebindSessionRuntime(piboSessionId, input) {
643
+ if (this.quiescingSessions.has(piboSessionId)) {
644
+ throw new Error(`Pibo session "${piboSessionId}" is already quiescing.`);
645
+ }
646
+ this.quiescingSessions.add(piboSessionId);
647
+ this.clearIdleSessionTimer(piboSessionId);
648
+ try {
649
+ return await this.rebindSessionRuntimeQuiesced(piboSessionId, input);
650
+ }
651
+ finally {
652
+ this.quiescingSessions.delete(piboSessionId);
653
+ this.scheduleIdleSessionEvictionIfIdle(piboSessionId);
654
+ }
655
+ }
656
+ async rebindSessionRuntimeQuiesced(piboSessionId, input) {
609
657
  const session = this.sessionStore.get(piboSessionId);
610
658
  if (!session)
611
659
  throw new Error(`Unknown Pibo session "${piboSessionId}".`);
@@ -618,38 +666,94 @@ export class PiboSessionRouter {
618
666
  if (liveStatus && (liveStatus.processing || liveStatus.streaming || liveStatus.queuedMessages > 0)) {
619
667
  throw new Error("A runtime binding can only be repaired or rebound while the session is idle.");
620
668
  }
669
+ const registry = this.resolveAgentRuntimeRegistry(input.runtimeInstanceId);
670
+ const adapter = registry.requireAgentRuntimeAdapter(input.runtimeInstanceId);
671
+ const switchingRuntime = current.runtimeInstanceId !== input.runtimeInstanceId
672
+ || current.adapterId !== adapter.descriptor.id;
673
+ const startsNewNativeSession = switchingRuntime || input.startFresh === true;
674
+ const portableHistoryProvider = this.portableHistoryProvider;
675
+ if (startsNewNativeSession && (input.nativeSessionId || input.state === "bound" || input.locator)) {
676
+ throw new Error("Runtime switches create a new native session; nativeSessionId, bound state, and locator are not accepted.");
677
+ }
678
+ if (switchingRuntime && input.startFresh !== true) {
679
+ if (!adapter.descriptor.capabilities.historyImport) {
680
+ throw new Error(`Runtime instance "${input.runtimeInstanceId}" cannot import portable history. Retry with startFresh: true to discard prior context explicitly.`);
681
+ }
682
+ if (!portableHistoryProvider) {
683
+ throw new Error("Portable Pibo history is unavailable for this session store. Retry with startFresh: true to discard prior context explicitly.");
684
+ }
685
+ }
686
+ const workspace = session.workspace ?? this.options.cwd ?? getDefaultPiboWorkspace();
687
+ const baseProfile = createPiboProfileFromRegistryOrDefault(this.pluginRegistry, session.profile);
688
+ const targetProfile = profileForSession(baseProfile, input.runtimeInstanceId, startsNewNativeSession ? undefined : input.nativeSessionId, undefined, this.getSubagentDepth(session.id));
689
+ const targetDiagnostics = await adapter.diagnose();
690
+ const unavailableTarget = targetDiagnostics.find((diagnostic) => diagnostic.severity === "error");
691
+ if (unavailableTarget) {
692
+ throw new Error(`Runtime target preflight failed: ${unavailableTarget.message}`);
693
+ }
694
+ const profileDiagnostics = [
695
+ ...validateAgentRuntimeProfileCapabilities(targetProfile, adapter.descriptor.capabilities),
696
+ ...adapter.validateProfile({ profile: targetProfile, workspace }),
697
+ ];
698
+ const invalidProfile = profileDiagnostics.find((diagnostic) => diagnostic.severity === "error");
699
+ if (invalidProfile)
700
+ throw new Error(`Runtime profile validation failed: ${invalidProfile.message}`);
701
+ let handoffMetadata;
702
+ if (switchingRuntime && input.startFresh !== true) {
703
+ handoffMetadata = createPortableHistoryHandoffMetadata({
704
+ mode: "import",
705
+ sourceBinding: current,
706
+ targetBinding: {
707
+ runtimeInstanceId: input.runtimeInstanceId,
708
+ adapterId: adapter.descriptor.id,
709
+ },
710
+ checkpoint: portableHistoryProvider.createCheckpoint(piboSessionId),
711
+ });
712
+ }
713
+ else if (input.startFresh === true) {
714
+ handoffMetadata = createPortableHistoryHandoffMetadata({
715
+ mode: "fresh",
716
+ sourceBinding: current,
717
+ targetBinding: {
718
+ runtimeInstanceId: input.runtimeInstanceId,
719
+ adapterId: adapter.descriptor.id,
720
+ },
721
+ });
722
+ }
621
723
  if (this.sessions.has(piboSessionId) || this.pendingSessions.has(piboSessionId)) {
622
724
  await this.resetCachedSession(piboSessionId, "runtime binding rebind");
623
725
  }
624
- const registry = this.resolveAgentRuntimeRegistry(input.runtimeInstanceId);
625
- const adapter = registry.requireAgentRuntimeAdapter(input.runtimeInstanceId);
626
- const requestedState = input.state ?? (input.nativeSessionId ? "bound" : "unbound");
726
+ const requestedState = startsNewNativeSession
727
+ ? "unbound"
728
+ : input.state ?? (input.nativeSessionId ? "bound" : "unbound");
627
729
  let next = {
628
730
  piboSessionId,
629
731
  runtimeInstanceId: input.runtimeInstanceId,
630
732
  adapterId: adapter.descriptor.id,
631
- nativeSessionId: input.nativeSessionId,
733
+ nativeSessionId: startsNewNativeSession ? undefined : input.nativeSessionId,
632
734
  state: requestedState,
633
735
  protocol: adapter.descriptor.protocol?.name,
634
736
  protocolVersion: current.runtimeInstanceId === input.runtimeInstanceId ? current.protocolVersion : undefined,
635
- locator: input.locator,
636
- metadata: {},
737
+ locator: startsNewNativeSession ? undefined : input.locator,
738
+ metadata: handoffMetadata
739
+ ? withPortableHistoryHandoffMetadata({}, handoffMetadata)
740
+ : {},
637
741
  };
638
742
  if (next.state === "bound" && adapter.resolveBinding) {
639
- next = await adapter.resolveBinding({
640
- binding: next,
641
- workspace: session.workspace ?? this.options.cwd ?? getDefaultPiboWorkspace(),
642
- });
743
+ next = await adapter.resolveBinding({ binding: next, workspace });
643
744
  }
644
745
  const mode = (current.state === "missing" || current.state === "error")
645
746
  && current.runtimeInstanceId === next.runtimeInstanceId
646
747
  && current.adapterId === next.adapterId
748
+ && input.startFresh !== true
647
749
  ? "repair"
648
750
  : "rebind";
649
751
  const persisted = this.persistSessionRuntimeBinding(session, next, {
650
752
  expectedRevision: input.expectedRevision,
651
753
  mode,
652
754
  });
755
+ if (switchingRuntime)
756
+ this.sessionStore.update(piboSessionId, { activeModel: null });
653
757
  return structuredClone(persisted);
654
758
  }
655
759
  getSessionRuntimeStatus(piboSessionId) {
@@ -799,7 +903,8 @@ export class PiboSessionRouter {
799
903
  for (const timer of this.idleSessionTimers.values())
800
904
  clearTimeout(timer);
801
905
  this.idleSessionTimers.clear();
802
- this.runRegistry.cancelAll("Pibo session router was disposed.");
906
+ const cancelledRuns = this.runRegistry.cancelAll("Pibo session router was disposed.");
907
+ const runCancellationResult = await Promise.allSettled([this.invokeRunCancellationHandlers(cancelledRuns)]);
803
908
  this.scheduledRunReminders.clear();
804
909
  const closeResult = await Promise.allSettled([this.runtimeRegistry.closeAll({ force: true })]);
805
910
  const disposeResults = await Promise.allSettled(sessions.map(([id, session]) => this.disposeRoutedSession(id, session, "router disposed")));
@@ -809,6 +914,7 @@ export class PiboSessionRouter {
809
914
  this.signalRegistry.project({ type: "session_disposed", piboSessionId: id, reason: "router disposed" });
810
915
  }
811
916
  const failures = [
917
+ ...runCancellationResult.filter((result) => result.status === "rejected").map((result) => result.reason),
812
918
  ...closeResult.filter((result) => result.status === "rejected").map((result) => result.reason),
813
919
  ...disposeResults.filter((result) => result.status === "rejected").map((result) => result.reason),
814
920
  ];
@@ -820,14 +926,20 @@ export class PiboSessionRouter {
820
926
  this.pluginRegistry.disposeAgentRuntimeAuth(),
821
927
  ...(this.compatibilityRuntimeRegistry ? [this.compatibilityRuntimeRegistry.disposeAgentRuntimeAuth()] : []),
822
928
  ]);
929
+ const ownedPluginRegistries = this.options.pluginRegistry === undefined
930
+ ? [this.pluginRegistry]
931
+ : this.compatibilityRuntimeRegistry ? [this.compatibilityRuntimeRegistry] : [];
932
+ const webAppDisposals = await Promise.allSettled(ownedPluginRegistries.flatMap((registry) => registry.getWebApps().map((app) => app.dispose?.())));
823
933
  await this.portableToolService.dispose();
824
934
  await this.runtimeResourceService.dispose();
825
935
  this.runtimeResourceSessions.clear();
826
936
  this.activeSubagentChildren.clear();
827
937
  await this.telemetryWriter?.dispose();
828
- const authFailures = authDisposals.flatMap((result) => result.status === "rejected" ? [result.reason] : []);
829
- if (authFailures.length > 0)
830
- throw new AggregateError(authFailures, "Failed to dispose runtime authentication controllers.");
938
+ const lifecycleFailures = [...authDisposals, ...webAppDisposals]
939
+ .flatMap((result) => result.status === "rejected" ? [result.reason] : []);
940
+ if (lifecycleFailures.length > 0) {
941
+ throw new AggregateError(lifecycleFailures, "Failed to dispose runtime authentication controllers or web apps.");
942
+ }
831
943
  }
832
944
  }
833
945
  clearIdleSessionTimer(piboSessionId) {
@@ -915,9 +1027,23 @@ export class PiboSessionRouter {
915
1027
  ? parentBinding.nativeSessionId
916
1028
  : undefined;
917
1029
  const modelDefaults = this.resolveModelDefaults();
918
- const activeModel = this.ensureSessionActiveModel(piboSession, profile, parentModelScopeId, modelDefaults);
919
1030
  const initialThinkingLevel = resolvePiboSessionInitialThinkingLevel(piboSession);
920
1031
  const sessionProfile = profileForSession(profile, binding.runtimeInstanceId, binding.nativeSessionId, runtimeParentNativeSessionId, this.getSubagentDepth(piboSession.id));
1032
+ const persistedHistoryHandoff = readPortableHistoryHandoffMetadata(binding.metadata);
1033
+ if (binding.metadata?.[PORTABLE_HISTORY_HANDOFF_METADATA_KEY] !== undefined && !persistedHistoryHandoff) {
1034
+ throw new Error("The pending portable history handoff metadata is invalid; refusing to start a contextless target runtime.");
1035
+ }
1036
+ if (persistedHistoryHandoff
1037
+ && (persistedHistoryHandoff.targetRuntimeInstanceId !== binding.runtimeInstanceId
1038
+ || persistedHistoryHandoff.targetAdapterId !== binding.adapterId)) {
1039
+ throw new Error("The pending portable history handoff targets a different runtime binding; refusing to import it.");
1040
+ }
1041
+ const changesRuntimeModelNamespace = Boolean(persistedHistoryHandoff
1042
+ && (persistedHistoryHandoff.sourceRuntimeInstanceId !== binding.runtimeInstanceId
1043
+ || persistedHistoryHandoff.sourceAdapterId !== binding.adapterId));
1044
+ const activeModel = changesRuntimeModelNamespace
1045
+ ? undefined
1046
+ : this.ensureSessionActiveModel(piboSession, sessionProfile, parentModelScopeId, modelDefaults);
921
1047
  const userSettings = loadPiboUserSettings();
922
1048
  const telemetryExtension = this.telemetryStore
923
1049
  ? createPiboProviderTelemetryExtension({ store: this.telemetryStore, writer: this.telemetryWriter, session: piboSession, model: activeModel })
@@ -948,6 +1074,29 @@ export class PiboSessionRouter {
948
1074
  if (invalidProfile) {
949
1075
  throw new Error(`Runtime profile validation failed: ${invalidProfile.message}`);
950
1076
  }
1077
+ let historyHandoff;
1078
+ if (persistedHistoryHandoff?.mode === "import") {
1079
+ if (!runtimeAdapter.descriptor.capabilities.historyImport) {
1080
+ throw new Error(`Runtime instance "${binding.runtimeInstanceId}" no longer supports portable history import.`);
1081
+ }
1082
+ if (!this.portableHistoryProvider || !persistedHistoryHandoff.checkpoint) {
1083
+ throw new Error("Portable Pibo history is unavailable for the pending runtime switch.");
1084
+ }
1085
+ historyHandoff = {
1086
+ mode: "import",
1087
+ history: this.portableHistoryProvider.read({
1088
+ piboSession,
1089
+ sourceBinding: {
1090
+ runtimeInstanceId: persistedHistoryHandoff.sourceRuntimeInstanceId,
1091
+ adapterId: persistedHistoryHandoff.sourceAdapterId,
1092
+ },
1093
+ checkpoint: persistedHistoryHandoff.checkpoint,
1094
+ }),
1095
+ };
1096
+ }
1097
+ else if (persistedHistoryHandoff?.mode === "fresh") {
1098
+ historyHandoff = { mode: "fresh" };
1099
+ }
951
1100
  const initialFastMode = resolvePiboSessionInitialFastMode(piboSession) ?? selectRequestedFastMode(sessionProfile, modelDefaults) ?? false;
952
1101
  const subagentRunner = this.createSubagentRunner(piboSession.id);
953
1102
  const runToolController = this.createRunToolController(piboSession.id);
@@ -995,11 +1144,16 @@ export class PiboSessionRouter {
995
1144
  let runtimeSession;
996
1145
  try {
997
1146
  runtimeSession = await runtimeRegistry.openAgentRuntimeSession(binding.runtimeInstanceId, {
998
- piboSession: { ...piboSession, runtimeBinding: binding },
1147
+ piboSession: {
1148
+ ...piboSession,
1149
+ ...(changesRuntimeModelNamespace ? { activeModel: undefined } : {}),
1150
+ runtimeBinding: binding,
1151
+ },
999
1152
  profile: sessionProfile,
1000
1153
  binding,
1001
1154
  workspace,
1002
1155
  activeModel,
1156
+ historyHandoff,
1003
1157
  productContext: {
1004
1158
  piboSessionId: piboSession.id,
1005
1159
  piboRoomId: piboRoomIdFromMetadata(piboSession.metadata),
@@ -1049,10 +1203,25 @@ export class PiboSessionRouter {
1049
1203
  throw error;
1050
1204
  }
1051
1205
  try {
1052
- const openedBinding = runtimeSession.getBinding();
1206
+ let openedBinding = runtimeSession.getBinding();
1053
1207
  if (openedBinding.runtimeInstanceId !== binding.runtimeInstanceId || openedBinding.adapterId !== binding.adapterId) {
1054
1208
  throw new AgentRuntimeUnavailableError(binding.runtimeInstanceId, `Runtime instance "${binding.runtimeInstanceId}" opened an inconsistent binding for Pibo session "${piboSession.id}".`);
1055
1209
  }
1210
+ if (persistedHistoryHandoff) {
1211
+ openedBinding = {
1212
+ ...openedBinding,
1213
+ metadata: withoutPortableHistoryHandoffMetadata({
1214
+ metadata: openedBinding.metadata,
1215
+ handoff: persistedHistoryHandoff,
1216
+ history: historyHandoff?.mode === "import" ? historyHandoff.history : undefined,
1217
+ }),
1218
+ };
1219
+ }
1220
+ if (changesRuntimeModelNamespace) {
1221
+ this.sessionStore.update(piboSession.id, {
1222
+ activeModel: runtimeSession.getStatus().activeModel ?? null,
1223
+ });
1224
+ }
1056
1225
  if (!runtimeBindingsEqual(binding, openedBinding)) {
1057
1226
  binding = this.persistSessionRuntimeBinding(piboSession, openedBinding, {
1058
1227
  expectedRevision: binding.revision,
@@ -1183,7 +1352,8 @@ export class PiboSessionRouter {
1183
1352
  if (!session)
1184
1353
  return;
1185
1354
  try {
1186
- this.persistSessionRuntimeBinding(session, runtimeSession.getBinding());
1355
+ const persisted = this.resolveSessionRuntimeBinding(session);
1356
+ this.persistSessionRuntimeBinding(session, withPersistedPortableHistoryAuditMetadata(persisted, runtimeSession.getBinding()));
1187
1357
  }
1188
1358
  catch (error) {
1189
1359
  const message = error instanceof Error ? error.message : String(error);
@@ -1445,9 +1615,21 @@ export class PiboSessionRouter {
1445
1615
  },
1446
1616
  };
1447
1617
  }
1618
+ async invokeRunCancellationHandlers(runs) {
1619
+ const results = await Promise.allSettled(runs.map(async (run) => {
1620
+ const cancel = this.runCancellationHandlers.get(run.runId);
1621
+ if (!cancel)
1622
+ return;
1623
+ this.runCancellationHandlers.delete(run.runId);
1624
+ await cancel();
1625
+ }));
1626
+ const failures = results.flatMap((result) => result.status === "rejected" ? [result.reason] : []);
1627
+ if (failures.length > 0)
1628
+ throw new AggregateError(failures, "Failed to terminate cancelled yielded runs.");
1629
+ }
1448
1630
  createRunToolController(parentPiboSessionId) {
1449
1631
  return {
1450
- startToolRun: ({ toolName, params, completionPolicy, retryable, maxAttempts, timeoutMs, serviceWarning, resources, execute }) => {
1632
+ startToolRun: ({ toolName, params, completionPolicy, retryable, maxAttempts, timeoutMs, serviceWarning, resources, execute, cancel }) => {
1451
1633
  const admission = this.gatewayWorkAdmission.reserve(`yielded run ${toolName}`);
1452
1634
  if (resources)
1453
1635
  resources.admission = admission.admission;
@@ -1470,6 +1652,8 @@ export class PiboSessionRouter {
1470
1652
  admission.release();
1471
1653
  throw error;
1472
1654
  }
1655
+ if (cancel)
1656
+ this.runCancellationHandlers.set(run.runId, cancel);
1473
1657
  void (async () => {
1474
1658
  try {
1475
1659
  const result = await execute();
@@ -1492,6 +1676,7 @@ export class PiboSessionRouter {
1492
1676
  this.handleTerminalRunReminder(parentPiboSessionId, terminalRun.runId, reminderGeneration);
1493
1677
  }
1494
1678
  finally {
1679
+ this.runCancellationHandlers.delete(run.runId);
1495
1680
  admission.release();
1496
1681
  }
1497
1682
  })();
@@ -1508,7 +1693,12 @@ export class PiboSessionRouter {
1508
1693
  },
1509
1694
  cancelRun: async (runId) => {
1510
1695
  const cancelled = this.runRegistry.cancel(parentPiboSessionId, runId);
1511
- this.refreshQueuedRunReminders(parentPiboSessionId);
1696
+ try {
1697
+ await this.invokeRunCancellationHandlers([cancelled]);
1698
+ }
1699
+ finally {
1700
+ this.refreshQueuedRunReminders(parentPiboSessionId);
1701
+ }
1512
1702
  return cancelled;
1513
1703
  },
1514
1704
  ackRun: (runId) => {
@@ -1,7 +1,8 @@
1
1
  import { mkdirSync } from "node:fs";
2
2
  import { dirname, resolve } from "node:path";
3
3
  import { DatabaseSync } from "node:sqlite";
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 { PiboEventLogStore } from "./event-log.js";
6
7
  import { MessageStore } from "./message-store.js";
7
8
  import { NavigationStore } from "./navigation-store.js";
@@ -22,9 +23,12 @@ export class PiboDataStore {
22
23
  telemetry;
23
24
  constructor(path = piboHomePath("pibo.sqlite"), options = {}) {
24
25
  this.path = path === ":memory:" ? path : resolve(path);
26
+ const insidePiboHome = ensurePrivatePiboHomeForPath(this.path);
25
27
  if (this.path !== ":memory:")
26
28
  mkdirSync(dirname(this.path), { recursive: true });
27
29
  this.db = new DatabaseSync(this.path);
30
+ if (insidePiboHome)
31
+ protectPrivateFileSync(this.path);
28
32
  this.db.exec("PRAGMA busy_timeout = 5000");
29
33
  this.db.exec("PRAGMA foreign_keys = ON");
30
34
  if (this.path !== ":memory:")
@@ -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
  };