@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.
- package/dist/agent-runtime/capabilities.js +68 -0
- package/dist/agent-runtime/context-build.js +13 -5
- package/dist/agent-runtime/portable-history.js +526 -0
- package/dist/agent-runtime/profile-validation.js +13 -7
- package/dist/agent-runtime/resource-files.js +26 -10
- package/dist/agent-runtime/resource-service.js +216 -13
- package/dist/agent-runtimes/codex-native/adapter.js +38 -1
- package/dist/agent-runtimes/codex-native/auth.js +24 -3
- package/dist/agent-runtimes/codex-native/portable-history.js +73 -0
- package/dist/agent-runtimes/codex-native/process.js +38 -27
- package/dist/agent-runtimes/codex-native/resource-delivery.js +39 -16
- package/dist/agent-runtimes/codex-native/turn.js +68 -5
- package/dist/agent-runtimes/omp/adapter.js +43 -8
- package/dist/agent-runtimes/omp/process.js +26 -10
- package/dist/agent-runtimes/omp/resource-delivery.js +150 -84
- package/dist/agent-runtimes/pi/adapter.js +32 -1
- package/dist/agent-runtimes/pi/auth.js +34 -29
- package/dist/agent-runtimes/pi/credentials.js +43 -0
- package/dist/agent-runtimes/pi/model-catalog.js +7 -3
- package/dist/agent-runtimes/pi/portable-history.js +99 -0
- package/dist/agent-runtimes/pi/routed-session.js +1 -1
- package/dist/agent-runtimes/pi/runtime.js +31 -15
- package/dist/apps/chat/agent-profiles.js +1 -0
- package/dist/apps/chat/agent-store.js +20 -7
- package/dist/apps/chat/chat-files.js +19 -6
- package/dist/apps/chat/chat-request-normalizers.js +13 -0
- package/dist/apps/chat/web-app.js +55 -6
- package/dist/apps/chat-ui/assets/{apl-14BqhLYK.js → apl-gfMMiTNf.js} +1 -1
- package/dist/apps/chat-ui/assets/asciiarmor-C_eisQCp.js +1 -0
- package/dist/apps/{context-files-ui/assets/asn1-Bg4FbdCg.js → chat-ui/assets/asn1-DCl_8MCW.js} +1 -1
- package/dist/apps/{context-files-ui/assets/asterisk-B2MO-X4d.js → chat-ui/assets/asterisk-BEn0Cwpx.js} +1 -1
- package/dist/apps/chat-ui/assets/clike-D_6L3tnO.js +1 -0
- package/dist/apps/chat-ui/assets/cmake-84nbDH0I.js +1 -0
- package/dist/apps/chat-ui/assets/cobol-DHLQUbN7.js +1 -0
- package/dist/apps/chat-ui/assets/coffeescript-De_zI4J0.js +1 -0
- package/dist/apps/chat-ui/assets/commonlisp-DgAKBe0r.js +1 -0
- package/dist/apps/chat-ui/assets/crystal-Bsdphhtm.js +1 -0
- package/dist/apps/chat-ui/assets/css-CnaYoQib.js +1 -0
- package/dist/apps/chat-ui/assets/{d-TPqSVaHM.js → d-DWkQyNnU.js} +1 -1
- package/dist/apps/{context-files-ui/assets/dist-DxEGebCR.js → chat-ui/assets/dist-BB8loWTa.js} +1 -1
- package/dist/apps/chat-ui/assets/dist-BJ-TIk3N.js +1 -0
- package/dist/apps/chat-ui/assets/dist-CBPDkWd4.js +1 -0
- package/dist/apps/chat-ui/assets/dist-CHInEWhr.js +1 -0
- package/dist/apps/chat-ui/assets/dist-CqM4On9D.js +13 -0
- package/dist/apps/chat-ui/assets/dist-CswnpKik.js +1 -0
- package/dist/apps/{context-files-ui/assets/dist-B7gXtTZC.js → chat-ui/assets/dist-CwS16H7k.js} +1 -1
- package/dist/apps/chat-ui/assets/dist-DHvUPfrF.js +1 -0
- package/dist/apps/chat-ui/assets/dist-DLJCGrGQ.js +1 -0
- package/dist/apps/chat-ui/assets/{dist-DLMjd26T.js → dist-DMiglryg.js} +1 -1
- package/dist/apps/chat-ui/assets/dist-DTeLDijr.js +9 -0
- package/dist/apps/chat-ui/assets/{dist-DKoyMSNr.js → dist-DpF08Yd7.js} +1 -1
- package/dist/apps/chat-ui/assets/dist-LCx98fA_.js +11 -0
- package/dist/apps/chat-ui/assets/{dist-DotDq_kD.js → dist-RKTRnzGb.js} +1 -1
- package/dist/apps/chat-ui/assets/dist-S3zJGntM.js +1 -0
- package/dist/apps/{context-files-ui/assets/dist-BkUONE3N.js → chat-ui/assets/dist-XVYGiB-c.js} +1 -1
- package/dist/apps/chat-ui/assets/dist-eddbbGyw.js +1 -0
- package/dist/apps/chat-ui/assets/dist-fPhZsAUX.js +1 -0
- package/dist/apps/chat-ui/assets/dist-mpRGeo_R.js +2 -0
- package/dist/apps/chat-ui/assets/{dist-sZgJkWZb.js → dist-nU3BVpFi.js} +1 -1
- package/dist/apps/chat-ui/assets/{dockerfile-CJb2sekW.js → dockerfile-DJkHQgkl.js} +1 -1
- package/dist/apps/chat-ui/assets/{dylan-08Azy1NK.js → dylan-BCDoL_-p.js} +1 -1
- package/dist/apps/chat-ui/assets/{ecl-dhxjHL8y.js → ecl-BVIeWmwY.js} +1 -1
- package/dist/apps/{context-files-ui/assets/erlang-BD5LkVkR.js → chat-ui/assets/erlang-BV0c4Hdn.js} +1 -1
- package/dist/apps/chat-ui/assets/{factor-B2EMQZkP.js → factor-LKH5gN8L.js} +1 -1
- package/dist/apps/chat-ui/assets/groovy-CUpZ7dEl.js +1 -0
- package/dist/apps/chat-ui/assets/{haxe-BJVKtprM.js → haxe-DjVOVvNP.js} +1 -1
- package/dist/apps/chat-ui/assets/index-CQuka3bs.js +226 -0
- package/dist/apps/chat-ui/assets/index-DUXboQnI.css +1 -0
- package/dist/apps/chat-ui/assets/javascript-DoL9Wb-Q.js +1 -0
- package/dist/apps/chat-ui/assets/{lua-BxuTHaF7.js → lua-CiA1ziua.js} +1 -1
- package/dist/apps/chat-ui/assets/{mumps-Ds_ZaumL.js → mumps-BSzj6Xyz.js} +1 -1
- package/dist/apps/{context-files-ui/assets/nsis-DOo3SJmd.js → chat-ui/assets/nsis-CfSuhXs5.js} +1 -1
- package/dist/apps/chat-ui/assets/{ntriples-DLHGTvHs.js → ntriples-B9h1VB_g.js} +1 -1
- package/dist/apps/chat-ui/assets/perl-BkSkiI9m.js +1 -0
- package/dist/apps/chat-ui/assets/{powershell-B4IPkVxR.js → powershell-BcIto6Sf.js} +1 -1
- package/dist/apps/{context-files-ui/assets/pug-QU72BPAa.js → chat-ui/assets/pug-Gsm0M45u.js} +1 -1
- package/dist/apps/chat-ui/assets/puppet-BZyAS7I4.js +1 -0
- package/dist/apps/chat-ui/assets/python-B_1Jd8HM.js +1 -0
- package/dist/apps/chat-ui/assets/r-CxDmU1I4.js +1 -0
- package/dist/apps/chat-ui/assets/ruby-BjXV7-Qa.js +1 -0
- package/dist/apps/chat-ui/assets/scheme-D9qYN0V5.js +1 -0
- package/dist/apps/chat-ui/assets/{shell-BjiMLAaM.js → shell-DwuoZtxw.js} +1 -1
- package/dist/apps/chat-ui/assets/{simple-mode-DnMbQuKW.js → simple-mode-DXiLM1-G.js} +1 -1
- package/dist/apps/chat-ui/assets/sql-DuQMFDvy.js +1 -0
- package/dist/apps/chat-ui/assets/{stex-BCRT8IJ3.js → stex-DNzd62Q_.js} +1 -1
- package/dist/apps/chat-ui/assets/{stylus-CARoeVE9.js → stylus-BOVgKnng.js} +1 -1
- package/dist/apps/chat-ui/assets/textile-C4jVoHG1.js +1 -0
- package/dist/apps/chat-ui/assets/tiki-AK6FwT8q.js +1 -0
- package/dist/apps/chat-ui/assets/toml-BPTmHmyx.js +1 -0
- package/dist/apps/chat-ui/assets/{ttcn-GvRgs2AT.js → ttcn-PPSTk1ow.js} +1 -1
- package/dist/apps/chat-ui/assets/{ttcn-cfg-CGCXz7Vo.js → ttcn-cfg-2b4Gb5sE.js} +1 -1
- package/dist/apps/chat-ui/assets/turtle-Cx3rYX2g.js +1 -0
- package/dist/apps/chat-ui/assets/{verilog-DVCHmufx.js → verilog-7LoJAqYT.js} +1 -1
- package/dist/apps/chat-ui/assets/vhdl-kS471soi.js +1 -0
- package/dist/apps/{context-files-ui/assets/xquery-5f0hn7cg.js → chat-ui/assets/xquery-BKJx4mf9.js} +1 -1
- package/dist/apps/chat-ui/assets/z80-Co3PbHdE.js +1 -0
- package/dist/apps/chat-ui/index.html +5 -3
- package/dist/apps/chat-vscode-web/assets/index-CF1-9PKU.css +2 -0
- package/dist/apps/chat-vscode-web/assets/index-Dp1TzeRL.js +41 -0
- package/dist/apps/chat-vscode-web/index.html +2 -2
- package/dist/apps/context-files-ui/assets/{apl-14BqhLYK.js → apl-gfMMiTNf.js} +1 -1
- package/dist/apps/context-files-ui/assets/asciiarmor-C_eisQCp.js +1 -0
- package/dist/apps/{chat-ui/assets/asn1-Bg4FbdCg.js → context-files-ui/assets/asn1-DCl_8MCW.js} +1 -1
- package/dist/apps/{chat-ui/assets/asterisk-B2MO-X4d.js → context-files-ui/assets/asterisk-BEn0Cwpx.js} +1 -1
- package/dist/apps/context-files-ui/assets/clike-D_6L3tnO.js +1 -0
- package/dist/apps/context-files-ui/assets/cmake-84nbDH0I.js +1 -0
- package/dist/apps/context-files-ui/assets/cobol-DHLQUbN7.js +1 -0
- package/dist/apps/context-files-ui/assets/coffeescript-De_zI4J0.js +1 -0
- package/dist/apps/context-files-ui/assets/commonlisp-DgAKBe0r.js +1 -0
- package/dist/apps/context-files-ui/assets/crystal-Bsdphhtm.js +1 -0
- package/dist/apps/context-files-ui/assets/css-CnaYoQib.js +1 -0
- package/dist/apps/context-files-ui/assets/{d-TPqSVaHM.js → d-DWkQyNnU.js} +1 -1
- package/dist/apps/{chat-ui/assets/dist-C6LPDFXU.js → context-files-ui/assets/dist-BAqbgxUS.js} +1 -1
- package/dist/apps/context-files-ui/assets/dist-BJ-TIk3N.js +1 -0
- package/dist/apps/context-files-ui/assets/dist-BcauuFwf.js +1 -0
- package/dist/apps/context-files-ui/assets/dist-BecMXs79.js +1 -0
- package/dist/apps/context-files-ui/assets/{dist-C-Jm45P4.js → dist-Ci2NSlf1.js} +1 -1
- package/dist/apps/context-files-ui/assets/dist-CqM4On9D.js +13 -0
- package/dist/apps/context-files-ui/assets/dist-CswnpKik.js +1 -0
- package/dist/apps/{chat-ui/assets/dist-I26VB0QO.js → context-files-ui/assets/dist-D-xpsbZI.js} +1 -1
- package/dist/apps/context-files-ui/assets/dist-DHvUPfrF.js +1 -0
- package/dist/apps/context-files-ui/assets/dist-DLJCGrGQ.js +1 -0
- package/dist/apps/context-files-ui/assets/{dist-DLMjd26T.js → dist-DMiglryg.js} +1 -1
- package/dist/apps/context-files-ui/assets/dist-DTeLDijr.js +9 -0
- package/dist/apps/context-files-ui/assets/{dist-DKoyMSNr.js → dist-DpF08Yd7.js} +1 -1
- package/dist/apps/context-files-ui/assets/dist-LCx98fA_.js +11 -0
- package/dist/apps/context-files-ui/assets/{dist-DotDq_kD.js → dist-RKTRnzGb.js} +1 -1
- package/dist/apps/context-files-ui/assets/dist-S3zJGntM.js +1 -0
- package/dist/apps/{chat-ui/assets/dist-BkUONE3N.js → context-files-ui/assets/dist-XVYGiB-c.js} +1 -1
- package/dist/apps/context-files-ui/assets/dist-eddbbGyw.js +1 -0
- package/dist/apps/context-files-ui/assets/dist-fPhZsAUX.js +1 -0
- package/dist/apps/context-files-ui/assets/dist-mpRGeo_R.js +2 -0
- package/dist/apps/context-files-ui/assets/{dockerfile-CJb2sekW.js → dockerfile-DJkHQgkl.js} +1 -1
- package/dist/apps/context-files-ui/assets/{dylan-08Azy1NK.js → dylan-BCDoL_-p.js} +1 -1
- package/dist/apps/context-files-ui/assets/{ecl-dhxjHL8y.js → ecl-BVIeWmwY.js} +1 -1
- package/dist/apps/{chat-ui/assets/erlang-BD5LkVkR.js → context-files-ui/assets/erlang-BV0c4Hdn.js} +1 -1
- package/dist/apps/context-files-ui/assets/{factor-B2EMQZkP.js → factor-LKH5gN8L.js} +1 -1
- package/dist/apps/context-files-ui/assets/groovy-CUpZ7dEl.js +1 -0
- package/dist/apps/context-files-ui/assets/{haxe-BJVKtprM.js → haxe-DjVOVvNP.js} +1 -1
- package/dist/apps/context-files-ui/assets/index-CkWXlBNn.js +191 -0
- package/dist/apps/context-files-ui/assets/{index-Cs4XQITe.css → index-D8TsUizd.css} +1 -1
- package/dist/apps/context-files-ui/assets/javascript-DoL9Wb-Q.js +1 -0
- package/dist/apps/context-files-ui/assets/{lua-BxuTHaF7.js → lua-CiA1ziua.js} +1 -1
- package/dist/apps/context-files-ui/assets/{mumps-Ds_ZaumL.js → mumps-BSzj6Xyz.js} +1 -1
- package/dist/apps/{chat-ui/assets/nsis-DOo3SJmd.js → context-files-ui/assets/nsis-CfSuhXs5.js} +1 -1
- package/dist/apps/context-files-ui/assets/{ntriples-DLHGTvHs.js → ntriples-B9h1VB_g.js} +1 -1
- package/dist/apps/context-files-ui/assets/perl-BkSkiI9m.js +1 -0
- package/dist/apps/context-files-ui/assets/{powershell-B4IPkVxR.js → powershell-BcIto6Sf.js} +1 -1
- package/dist/apps/{chat-ui/assets/pug-QU72BPAa.js → context-files-ui/assets/pug-Gsm0M45u.js} +1 -1
- package/dist/apps/context-files-ui/assets/puppet-BZyAS7I4.js +1 -0
- package/dist/apps/context-files-ui/assets/python-B_1Jd8HM.js +1 -0
- package/dist/apps/context-files-ui/assets/r-CxDmU1I4.js +1 -0
- package/dist/apps/context-files-ui/assets/ruby-BjXV7-Qa.js +1 -0
- package/dist/apps/context-files-ui/assets/scheme-D9qYN0V5.js +1 -0
- package/dist/apps/context-files-ui/assets/{shell-BjiMLAaM.js → shell-DwuoZtxw.js} +1 -1
- package/dist/apps/context-files-ui/assets/{simple-mode-DnMbQuKW.js → simple-mode-DXiLM1-G.js} +1 -1
- package/dist/apps/context-files-ui/assets/sql-DuQMFDvy.js +1 -0
- package/dist/apps/context-files-ui/assets/{stex-BCRT8IJ3.js → stex-DNzd62Q_.js} +1 -1
- package/dist/apps/context-files-ui/assets/{stylus-CARoeVE9.js → stylus-BOVgKnng.js} +1 -1
- package/dist/apps/context-files-ui/assets/textile-C4jVoHG1.js +1 -0
- package/dist/apps/context-files-ui/assets/tiki-AK6FwT8q.js +1 -0
- package/dist/apps/context-files-ui/assets/toml-BPTmHmyx.js +1 -0
- package/dist/apps/context-files-ui/assets/{ttcn-GvRgs2AT.js → ttcn-PPSTk1ow.js} +1 -1
- package/dist/apps/context-files-ui/assets/{ttcn-cfg-CGCXz7Vo.js → ttcn-cfg-2b4Gb5sE.js} +1 -1
- package/dist/apps/context-files-ui/assets/turtle-Cx3rYX2g.js +1 -0
- package/dist/apps/context-files-ui/assets/{verilog-DVCHmufx.js → verilog-7LoJAqYT.js} +1 -1
- package/dist/apps/context-files-ui/assets/vhdl-kS471soi.js +1 -0
- package/dist/apps/{chat-ui/assets/xquery-5f0hn7cg.js → context-files-ui/assets/xquery-BKJx4mf9.js} +1 -1
- package/dist/apps/context-files-ui/assets/z80-Co3PbHdE.js +1 -0
- package/dist/apps/context-files-ui/index.html +5 -3
- package/dist/apps/vscode-artifacts/latest.vsix +0 -0
- package/dist/apps/vscode-artifacts/pibo-vscode-ext-2.2.0.vsix +0 -0
- package/dist/auth/better-auth.js +223 -30
- package/dist/auth/cli.js +10 -1
- package/dist/auth/machine-keys.js +8 -4
- package/dist/auth/openai-codex-usage.js +4 -4
- package/dist/cli-session/fakeSessionSource.js +2 -2
- package/dist/cli-session/localSessionSource.js +2 -2
- package/dist/cli.js +3 -1
- package/dist/config/config.js +9 -4
- package/dist/core/compaction-prompt.js +3 -1
- package/dist/core/context-build.js +1 -0
- package/dist/core/pibo-home.js +24 -1
- package/dist/core/private-path.js +146 -0
- package/dist/core/profiles.js +8 -0
- package/dist/core/sensitive-data-redaction.js +36 -0
- package/dist/core/session-model.js +1 -0
- package/dist/core/session-router.js +219 -29
- package/dist/data/pibo-store.js +5 -1
- package/dist/gateway/server.js +9 -0
- package/dist/plugins/context-files.js +11 -0
- package/dist/plugins/registry.js +1 -0
- package/dist/providers/openai-gpt56.js +0 -11
- package/dist/reliability/store.js +5 -1
- package/dist/resources/lifecycle.js +13 -3
- package/dist/runs/resource-isolation.js +159 -8
- package/dist/runs/tools.js +44 -1
- package/dist/sessions/pibo-data-store.js +3 -0
- package/dist/tools/codex-browser-node-repl.js +4 -2
- package/dist/tools/codex-browser.js +1 -1
- package/dist/tools/codex-image-generation.js +4 -4
- package/dist/tools/runtime/node-backend.js +4 -1
- package/dist/tools/runtime/python-backend.js +4 -1
- package/dist/web-annotations/api.js +22 -2
- package/npm-shrinkwrap.json +16707 -0
- package/package.json +19 -14
- package/dist/apps/chat-ui/assets/asciiarmor-WLvjqI7d.js +0 -1
- package/dist/apps/chat-ui/assets/clike-CjmcUpt6.js +0 -1
- package/dist/apps/chat-ui/assets/cmake-i2VDNaRq.js +0 -1
- package/dist/apps/chat-ui/assets/cobol-BwO6DF08.js +0 -1
- package/dist/apps/chat-ui/assets/coffeescript-BtivDvRz.js +0 -1
- package/dist/apps/chat-ui/assets/commonlisp-DFkEQdLP.js +0 -1
- package/dist/apps/chat-ui/assets/crystal-CU0NkcVL.js +0 -1
- package/dist/apps/chat-ui/assets/css-CbMZAQ1W.js +0 -1
- package/dist/apps/chat-ui/assets/dist-9v2ZXT6V.js +0 -11
- package/dist/apps/chat-ui/assets/dist-B1LVAytl.js +0 -9
- package/dist/apps/chat-ui/assets/dist-B5PTVnox.js +0 -1
- package/dist/apps/chat-ui/assets/dist-B5ZAfwf5.js +0 -1
- package/dist/apps/chat-ui/assets/dist-D1KyNDg5.js +0 -13
- package/dist/apps/chat-ui/assets/dist-DVtXxfHc.js +0 -1
- package/dist/apps/chat-ui/assets/dist-DW4Qrfbd.js +0 -2
- package/dist/apps/chat-ui/assets/dist-DmbsHdMC.js +0 -1
- package/dist/apps/chat-ui/assets/dist-DyvwuSFO.js +0 -1
- package/dist/apps/chat-ui/assets/dist-QQuDy4KA.js +0 -1
- package/dist/apps/chat-ui/assets/dist-RtHbJRPV.js +0 -1
- package/dist/apps/chat-ui/assets/groovy-Cmduloe1.js +0 -1
- package/dist/apps/chat-ui/assets/index-BPbNvcZe.css +0 -1
- package/dist/apps/chat-ui/assets/index-CIOf2uL2.js +0 -237
- package/dist/apps/chat-ui/assets/javascript-C5pDVaoP.js +0 -1
- package/dist/apps/chat-ui/assets/perl-D6YJObi_.js +0 -1
- package/dist/apps/chat-ui/assets/puppet-B_0GFuyD.js +0 -1
- package/dist/apps/chat-ui/assets/python-Cs7sNzy_.js +0 -1
- package/dist/apps/chat-ui/assets/r-CN5s4f3o.js +0 -1
- package/dist/apps/chat-ui/assets/ruby-BVPradRk.js +0 -1
- package/dist/apps/chat-ui/assets/scheme-CvNgHAnh.js +0 -1
- package/dist/apps/chat-ui/assets/sql-DYI2GwJR.js +0 -1
- package/dist/apps/chat-ui/assets/textile-Yg_UWn-t.js +0 -1
- package/dist/apps/chat-ui/assets/tiki-CC_ic8g0.js +0 -1
- package/dist/apps/chat-ui/assets/toml-B7gGzVkJ.js +0 -1
- package/dist/apps/chat-ui/assets/turtle-CwIpz2yy.js +0 -1
- package/dist/apps/chat-ui/assets/vhdl-BGDk4f1d.js +0 -1
- package/dist/apps/chat-ui/assets/z80-B7Dfb4UO.js +0 -1
- package/dist/apps/chat-vscode-web/assets/index-1ivRyjFs.js +0 -41
- package/dist/apps/chat-vscode-web/assets/index-Dupu1DzQ.css +0 -2
- package/dist/apps/context-files-ui/assets/asciiarmor-WLvjqI7d.js +0 -1
- package/dist/apps/context-files-ui/assets/clike-CjmcUpt6.js +0 -1
- package/dist/apps/context-files-ui/assets/cmake-i2VDNaRq.js +0 -1
- package/dist/apps/context-files-ui/assets/cobol-BwO6DF08.js +0 -1
- package/dist/apps/context-files-ui/assets/coffeescript-BtivDvRz.js +0 -1
- package/dist/apps/context-files-ui/assets/commonlisp-DFkEQdLP.js +0 -1
- package/dist/apps/context-files-ui/assets/crystal-CU0NkcVL.js +0 -1
- package/dist/apps/context-files-ui/assets/css-CbMZAQ1W.js +0 -1
- package/dist/apps/context-files-ui/assets/dist-B5PTVnox.js +0 -1
- package/dist/apps/context-files-ui/assets/dist-B5ZAfwf5.js +0 -1
- package/dist/apps/context-files-ui/assets/dist-BD262Ouw.js +0 -1
- package/dist/apps/context-files-ui/assets/dist-BKuGdcnX.js +0 -9
- package/dist/apps/context-files-ui/assets/dist-CHdx1Jri.js +0 -1
- package/dist/apps/context-files-ui/assets/dist-CULMH-fB.js +0 -11
- package/dist/apps/context-files-ui/assets/dist-Cjq6RWEt.js +0 -1
- package/dist/apps/context-files-ui/assets/dist-CntqFySz.js +0 -1
- package/dist/apps/context-files-ui/assets/dist-D1KyNDg5.js +0 -13
- package/dist/apps/context-files-ui/assets/dist-QQuDy4KA.js +0 -1
- package/dist/apps/context-files-ui/assets/dist-kPuQud7t.js +0 -2
- package/dist/apps/context-files-ui/assets/groovy-Cmduloe1.js +0 -1
- package/dist/apps/context-files-ui/assets/index-DZWsbuvg.js +0 -202
- package/dist/apps/context-files-ui/assets/javascript-C5pDVaoP.js +0 -1
- package/dist/apps/context-files-ui/assets/perl-D6YJObi_.js +0 -1
- package/dist/apps/context-files-ui/assets/puppet-B_0GFuyD.js +0 -1
- package/dist/apps/context-files-ui/assets/python-Cs7sNzy_.js +0 -1
- package/dist/apps/context-files-ui/assets/r-CN5s4f3o.js +0 -1
- package/dist/apps/context-files-ui/assets/ruby-BVPradRk.js +0 -1
- package/dist/apps/context-files-ui/assets/scheme-CvNgHAnh.js +0 -1
- package/dist/apps/context-files-ui/assets/sql-DYI2GwJR.js +0 -1
- package/dist/apps/context-files-ui/assets/textile-Yg_UWn-t.js +0 -1
- package/dist/apps/context-files-ui/assets/tiki-CC_ic8g0.js +0 -1
- package/dist/apps/context-files-ui/assets/toml-B7gGzVkJ.js +0 -1
- package/dist/apps/context-files-ui/assets/turtle-CwIpz2yy.js +0 -1
- package/dist/apps/context-files-ui/assets/vhdl-BGDk4f1d.js +0 -1
- package/dist/apps/context-files-ui/assets/z80-B7Dfb4UO.js +0 -1
- /package/dist/apps/chat-ui/assets/{brainfuck-CV9kufud.js → brainfuck-D5EjA2JK.js} +0 -0
- /package/dist/apps/chat-ui/assets/{clojure-De3QGfx6.js → clojure-BflJGmDX.js} +0 -0
- /package/dist/apps/chat-ui/assets/{cypher-Dke5QOzv.js → cypher-p9eYesGn.js} +0 -0
- /package/dist/apps/chat-ui/assets/{diff-B365LSoZ.js → diff-ChtP43wD.js} +0 -0
- /package/dist/apps/chat-ui/assets/{dtd-CBMymJ7O.js → dtd-DTF72YNO.js} +0 -0
- /package/dist/apps/chat-ui/assets/{ebnf-Dkum_1J8.js → ebnf-D4c0_ac3.js} +0 -0
- /package/dist/apps/chat-ui/assets/{eiffel-C446m6dI.js → eiffel-BEjRio4Q.js} +0 -0
- /package/dist/apps/chat-ui/assets/{elm-po1E9de0.js → elm-Cshzl8qu.js} +0 -0
- /package/dist/apps/chat-ui/assets/{fcl-DkEOamHd.js → fcl-ClOhbFR7.js} +0 -0
- /package/dist/apps/chat-ui/assets/{forth-dCg2_HVB.js → forth-Cezjo90N.js} +0 -0
- /package/dist/apps/chat-ui/assets/{fortran-3ZpXLFh1.js → fortran-Bt6PBEDR.js} +0 -0
- /package/dist/apps/chat-ui/assets/{gas-DMmxLZRI.js → gas-BHEdbvp9.js} +0 -0
- /package/dist/apps/chat-ui/assets/{gherkin-DUSFg2R6.js → gherkin-oBAE_ms0.js} +0 -0
- /package/dist/apps/chat-ui/assets/{haskell-Cyr255R9.js → haskell-BRsoo5mP.js} +0 -0
- /package/dist/apps/chat-ui/assets/{http-DszHFpc-.js → http-CLVgA2GD.js} +0 -0
- /package/dist/apps/chat-ui/assets/{idl-Cati9Nrv.js → idl-BUZw3wgd.js} +0 -0
- /package/dist/apps/chat-ui/assets/{julia-DlqY1cTU.js → julia-CQfgDRfP.js} +0 -0
- /package/dist/apps/chat-ui/assets/{livescript-C6p8-2W1.js → livescript-BXxG0Yva.js} +0 -0
- /package/dist/apps/chat-ui/assets/{mathematica-nDHZUMJT.js → mathematica-u8YMmbU0.js} +0 -0
- /package/dist/apps/chat-ui/assets/{mbox-DAaR0Hcz.js → mbox-BEMVcqjs.js} +0 -0
- /package/dist/apps/chat-ui/assets/{mirc-CCA0FRfl.js → mirc-C9zpzAZU.js} +0 -0
- /package/dist/apps/chat-ui/assets/{mllike-Cw3Iccsb.js → mllike-B45xgp2S.js} +0 -0
- /package/dist/apps/chat-ui/assets/{modelica-Czx80fNR.js → modelica-CqHI_q-D.js} +0 -0
- /package/dist/apps/chat-ui/assets/{mscgen-BmfuTbzG.js → mscgen-qgSLujhx.js} +0 -0
- /package/dist/apps/chat-ui/assets/{nginx-D9M2PQ4U.js → nginx-BMaDbqW3.js} +0 -0
- /package/dist/apps/chat-ui/assets/{octave-8jj96JiC.js → octave-D2Q8cUp1.js} +0 -0
- /package/dist/apps/chat-ui/assets/{oz-BmMq7iC4.js → oz-BwTct_5T.js} +0 -0
- /package/dist/apps/chat-ui/assets/{pascal-BgMr6XpT.js → pascal-Dp_KdFgX.js} +0 -0
- /package/dist/apps/chat-ui/assets/{pig-nx7uchs8.js → pig-AF4Hwhju.js} +0 -0
- /package/dist/apps/chat-ui/assets/{properties-CoavQdLC.js → properties-C357ku5U.js} +0 -0
- /package/dist/apps/chat-ui/assets/{protobuf-D5EWhcmc.js → protobuf-D1ij_kNL.js} +0 -0
- /package/dist/apps/chat-ui/assets/{q-BIB9pPtI.js → q-B9NhS7L_.js} +0 -0
- /package/dist/apps/chat-ui/assets/{rpm-Ct_Ck8mQ.js → rpm-gpDK5sbt.js} +0 -0
- /package/dist/apps/chat-ui/assets/{sas-DN4j74IF.js → sas-C2OyD2Y6.js} +0 -0
- /package/dist/apps/chat-ui/assets/{sieve-C2U1O5Z4.js → sieve-BAxa3IjF.js} +0 -0
- /package/dist/apps/chat-ui/assets/{smalltalk-DkYwYufV.js → smalltalk-BLp5-jwC.js} +0 -0
- /package/dist/apps/chat-ui/assets/{solr-BopnSD-v.js → solr-BBopId9w.js} +0 -0
- /package/dist/apps/chat-ui/assets/{sparql-Cpg3YQfd.js → sparql-Dz-mlCAC.js} +0 -0
- /package/dist/apps/chat-ui/assets/{spreadsheet-kRxtVt9J.js → spreadsheet-CTIncYxj.js} +0 -0
- /package/dist/apps/chat-ui/assets/{swift-DKNaLAK6.js → swift-DKB6_1j6.js} +0 -0
- /package/dist/apps/chat-ui/assets/{tcl-CQyXkgMH.js → tcl-BGfruO1u.js} +0 -0
- /package/dist/apps/chat-ui/assets/{tiddlywiki-dqVbkfX4.js → tiddlywiki-VlUiK86J.js} +0 -0
- /package/dist/apps/chat-ui/assets/{troff-Bq3z6oAu.js → troff-C2dAgh7P.js} +0 -0
- /package/dist/apps/chat-ui/assets/{vb-BmcHUM2C.js → vb-BthdM_4N.js} +0 -0
- /package/dist/apps/chat-ui/assets/{vbscript-Cs9dylre.js → vbscript-D9f6rSsU.js} +0 -0
- /package/dist/apps/chat-ui/assets/{velocity-CBWU0VCy.js → velocity-CqftRsjg.js} +0 -0
- /package/dist/apps/chat-ui/assets/{webidl-egXQEWlC.js → webidl-D5jiJvOU.js} +0 -0
- /package/dist/apps/chat-ui/assets/{yacas-DNs9XkmQ.js → yacas-CXXgtw0p.js} +0 -0
- /package/dist/apps/context-files-ui/assets/{brainfuck-CV9kufud.js → brainfuck-D5EjA2JK.js} +0 -0
- /package/dist/apps/context-files-ui/assets/{clojure-De3QGfx6.js → clojure-BflJGmDX.js} +0 -0
- /package/dist/apps/context-files-ui/assets/{cypher-Dke5QOzv.js → cypher-p9eYesGn.js} +0 -0
- /package/dist/apps/context-files-ui/assets/{diff-B365LSoZ.js → diff-ChtP43wD.js} +0 -0
- /package/dist/apps/context-files-ui/assets/{dtd-CBMymJ7O.js → dtd-DTF72YNO.js} +0 -0
- /package/dist/apps/context-files-ui/assets/{ebnf-Dkum_1J8.js → ebnf-D4c0_ac3.js} +0 -0
- /package/dist/apps/context-files-ui/assets/{eiffel-C446m6dI.js → eiffel-BEjRio4Q.js} +0 -0
- /package/dist/apps/context-files-ui/assets/{elm-po1E9de0.js → elm-Cshzl8qu.js} +0 -0
- /package/dist/apps/context-files-ui/assets/{fcl-DkEOamHd.js → fcl-ClOhbFR7.js} +0 -0
- /package/dist/apps/context-files-ui/assets/{forth-dCg2_HVB.js → forth-Cezjo90N.js} +0 -0
- /package/dist/apps/context-files-ui/assets/{fortran-3ZpXLFh1.js → fortran-Bt6PBEDR.js} +0 -0
- /package/dist/apps/context-files-ui/assets/{gas-DMmxLZRI.js → gas-BHEdbvp9.js} +0 -0
- /package/dist/apps/context-files-ui/assets/{gherkin-DUSFg2R6.js → gherkin-oBAE_ms0.js} +0 -0
- /package/dist/apps/context-files-ui/assets/{haskell-Cyr255R9.js → haskell-BRsoo5mP.js} +0 -0
- /package/dist/apps/context-files-ui/assets/{http-DszHFpc-.js → http-CLVgA2GD.js} +0 -0
- /package/dist/apps/context-files-ui/assets/{idl-Cati9Nrv.js → idl-BUZw3wgd.js} +0 -0
- /package/dist/apps/context-files-ui/assets/{julia-DlqY1cTU.js → julia-CQfgDRfP.js} +0 -0
- /package/dist/apps/context-files-ui/assets/{livescript-C6p8-2W1.js → livescript-BXxG0Yva.js} +0 -0
- /package/dist/apps/context-files-ui/assets/{mathematica-nDHZUMJT.js → mathematica-u8YMmbU0.js} +0 -0
- /package/dist/apps/context-files-ui/assets/{mbox-DAaR0Hcz.js → mbox-BEMVcqjs.js} +0 -0
- /package/dist/apps/context-files-ui/assets/{mirc-CCA0FRfl.js → mirc-C9zpzAZU.js} +0 -0
- /package/dist/apps/context-files-ui/assets/{mllike-Cw3Iccsb.js → mllike-B45xgp2S.js} +0 -0
- /package/dist/apps/context-files-ui/assets/{modelica-Czx80fNR.js → modelica-CqHI_q-D.js} +0 -0
- /package/dist/apps/context-files-ui/assets/{mscgen-BmfuTbzG.js → mscgen-qgSLujhx.js} +0 -0
- /package/dist/apps/context-files-ui/assets/{nginx-D9M2PQ4U.js → nginx-BMaDbqW3.js} +0 -0
- /package/dist/apps/context-files-ui/assets/{octave-8jj96JiC.js → octave-D2Q8cUp1.js} +0 -0
- /package/dist/apps/context-files-ui/assets/{oz-BmMq7iC4.js → oz-BwTct_5T.js} +0 -0
- /package/dist/apps/context-files-ui/assets/{pascal-BgMr6XpT.js → pascal-Dp_KdFgX.js} +0 -0
- /package/dist/apps/context-files-ui/assets/{pig-nx7uchs8.js → pig-AF4Hwhju.js} +0 -0
- /package/dist/apps/context-files-ui/assets/{properties-CoavQdLC.js → properties-C357ku5U.js} +0 -0
- /package/dist/apps/context-files-ui/assets/{protobuf-D5EWhcmc.js → protobuf-D1ij_kNL.js} +0 -0
- /package/dist/apps/context-files-ui/assets/{q-BIB9pPtI.js → q-B9NhS7L_.js} +0 -0
- /package/dist/apps/context-files-ui/assets/{rpm-Ct_Ck8mQ.js → rpm-gpDK5sbt.js} +0 -0
- /package/dist/apps/context-files-ui/assets/{sas-DN4j74IF.js → sas-C2OyD2Y6.js} +0 -0
- /package/dist/apps/context-files-ui/assets/{sieve-C2U1O5Z4.js → sieve-BAxa3IjF.js} +0 -0
- /package/dist/apps/context-files-ui/assets/{smalltalk-DkYwYufV.js → smalltalk-BLp5-jwC.js} +0 -0
- /package/dist/apps/context-files-ui/assets/{solr-BopnSD-v.js → solr-BBopId9w.js} +0 -0
- /package/dist/apps/context-files-ui/assets/{sparql-Cpg3YQfd.js → sparql-Dz-mlCAC.js} +0 -0
- /package/dist/apps/context-files-ui/assets/{spreadsheet-kRxtVt9J.js → spreadsheet-CTIncYxj.js} +0 -0
- /package/dist/apps/context-files-ui/assets/{swift-DKNaLAK6.js → swift-DKB6_1j6.js} +0 -0
- /package/dist/apps/context-files-ui/assets/{tcl-CQyXkgMH.js → tcl-BGfruO1u.js} +0 -0
- /package/dist/apps/context-files-ui/assets/{tiddlywiki-dqVbkfX4.js → tiddlywiki-VlUiK86J.js} +0 -0
- /package/dist/apps/context-files-ui/assets/{troff-Bq3z6oAu.js → troff-C2dAgh7P.js} +0 -0
- /package/dist/apps/context-files-ui/assets/{vb-BmcHUM2C.js → vb-BthdM_4N.js} +0 -0
- /package/dist/apps/context-files-ui/assets/{vbscript-Cs9dylre.js → vbscript-D9f6rSsU.js} +0 -0
- /package/dist/apps/context-files-ui/assets/{velocity-CBWU0VCy.js → velocity-CqftRsjg.js} +0 -0
- /package/dist/apps/context-files-ui/assets/{webidl-egXQEWlC.js → webidl-D5jiJvOU.js} +0 -0
- /package/dist/apps/context-files-ui/assets/{yacas-DNs9XkmQ.js → yacas-CXXgtw0p.js} +0 -0
package/dist/core/profiles.js
CHANGED
|
@@ -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
|
|
625
|
-
|
|
626
|
-
|
|
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
|
|
829
|
-
|
|
830
|
-
|
|
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: {
|
|
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
|
-
|
|
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.
|
|
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
|
-
|
|
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) => {
|
package/dist/data/pibo-store.js
CHANGED
|
@@ -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:")
|
package/dist/gateway/server.js
CHANGED
|
@@ -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);
|
package/dist/plugins/registry.js
CHANGED
|
@@ -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
|
};
|