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